Перейти к содержанию
Авторизация  
dar4e

Привязка умений к определенным профам.

Рекомендуемые сообщения

Доброго времени суток, появилась мысль о создании некоего предмета, который будет давать бонусы в зависимости от класса персонажа. Увы, я никак не могу придумать способ реализации этой затеи.

Я думал, что можно как-нибудь добавить проверку на профу в сам скил, по аналогии с проверкой на оружие, но, кажись, так сделать не получится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

смотря какой итем,поройся на форуме,есть скрипт итема с различными действиями,в нем поставь switch case на профу,радуйся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

cond-ишны в статах выдаваемых скиллом в предмете спасут гиганта мысли, отца русской демократии.

 

а если надо вобще разные скиллы в зависимости от профы - хэндлер на итем повесить и делать там что душе угодно.

Изменено пользователем Gaikotsu

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

cond-ишны в статах выдаваемых скиллом в предмете спасут гиганта мысли, отца русской демократии.

 

а если надо вобще разные скиллы в зависимости от профы - хэндлер на итем повесить и делать там что душе угодно.

Большое спасибо за ваш ответ! Не могли бы вы дать пример предмета или умения, который работает по такой схеме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Большое спасибо за ваш ответ! Не могли бы вы дать пример предмета или умения, который работает по такой схеме.

<player classId="57,118"/>

 <using armor="Light"/> 

<cond msgId="113" addName="1"> 
      <player percentHP="30"/> 
    </cond>
 
используйте данные примеры.... но сравните со своей сборкой.... может немного отличаться
 
<skill id="118" levels="1" name="Magician's Movement"> 
    <set name="icon" val="icon.skill0118"/>  
    <set name="magicLevel" val="1"/>  
    <set name="target" val="TARGET_SELF"/>  
    <set name="skillType" val="BUFF"/>  
    <set name="operateType" val="OP_PASSIVE"/>  
    <for> 
      <mul order="0x30" stat="pAtkSpd" val="0.8"> 
        <using armor="None"/> 
      </mul>  
      <mul order="0x30" stat="pAtkSpd" val="0.8"> 
        <using armor="Light"/> 
      </mul>  
      <mul order="0x30" stat="pAtkSpd" val="0.8"> 
        <using armor="Heavy"/> 
      </mul> 
    </for> 
  </skill>  
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Большое спасибо за ваш ответ! Не могли бы вы дать пример предмета или умения, который работает по такой схеме.

если про cond-ишны, то таких скиллов навалом

вот к примеру

	<skill id="21366" levels="1" name="Wondrous Hunt Dye">
		<!-- When HP is 90% or above, P. Def. + 20% and Speed + 33 in the Olympiad and the Ceremony of Chaos. -->
		<!-- Для Арены Хаоса и Олимпиады: при HP>90% Физ. Защ. +20%, Скорость +33. -->
		<set name="icon" val="BranchSys3.icon1.g_premium_hena_etc_defence" />
		<set name="target" val="SELF" />
		<set name="skillType" val="BUFF" />
		<set name="operateType" val="OP_PASSIVE" />
		<for>
			<mul order="0x30" stat="pDef" val="1.2">
				<and>
					<not>
						<player percentHP="90" />
					</not>
					<or>
						<player mode="OLYMPIAD" />
						<player mode="FESTIVAL" />
					</or>
				</and>
			</mul>
			<add order="0x40" stat="runSpd" val="33">
				<and>
					<not>
						<player percentHP="90" />
					</not>
					<or>
						<player mode="OLYMPIAD" />
						<player mode="FESTIVAL" />
					</or>
				</and>
			</add>
		</for>
	</skill>

 

бонусы будут даваться только если у игрока 90+% хп и он участвует в олли/фест. бое.

по аналогии можно навешать любые поддерживаемые условия.

 

с хэндлерами принцип тоже простой.

вот пример с вариантами для разных проф. тут правда выдаются разные вещи в зависимости от профы, но по тому же принципу можно просто катовать разные скиллы.

package handler.items;

import l2p.gameserver.enums.ClassLevel;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.items.ItemInstance;
import l2p.gameserver.utils.ItemUtils;

public class FatedSupportBox extends SimpleItemHandler
{
	private static final int[] _itemIds = new int[] { 37314 };

	@Override
	protected boolean useItemImpl(Player player, ItemInstance item, boolean ctrl)
	{
		if (player.getLevel() < 40 || player.getClassId().getClassLevel() == ClassLevel.FIRST)
		{
			player.sendMessage("Доступно только для персонажей 40 и выше уровня, прошедших 1-ю смену профессии.");
			return false;
		}

		int[] list = new int[0];

		switch (player.getClassId())
		{
			case KNIGHT:
			case PALADIN:
			case DARK_AVENGER:
			case ELVEN_KNIGHT:
			case TEMPLE_KNIGHT:
			case SWORDSINGER:
			case PALUS_KNIGHT:
			case SHILLIEN_KNIGHT:
			case BLADEDANCER:
			case PHOENIX_KNIGHT:
			case HELL_KNIGHT:
			case EVAS_TEMPLAR:
			case SWORD_MUSE:
			case SHILLIEN_TEMPLAR:
			case SPECTRAL_DANCER:
				list = new int[] { 37315, 37322, 37329, 37336, 37343 };
				break;

			case WIZARD:
			case SORCERER:
			case NECROMANCER:
			case WARLOCK:
			case CLERIC:
			case BISHOP:
			case PROPHET:
			case ELVEN_WIZARD:
			case SPELLSINGER:
			case ELEMENTAL_SUMMONER:
			case ORACLE:
			case ELDER:
			case DARK_WIZARD:
			case SPELLHOWLER:
			case PHANTOM_SUMMONER:
			case SHILLIEN_ORACLE:
			case SHILLIEN_ELDER:
			case ARCHMAGE:
			case SOULTAKER:
			case ARCANA_LORD:
			case CARDINAL:
			case HIEROPHANT:
			case MYSTIC_MUSE:
			case ELEMENTAL_MASTER:
			case EVAS_SAINT:
			case STORM_SCREAMER:
			case SPECTRAL_MASTER:
			case SHILLIEN_SAINT:
				list = new int[] { 37316, 37323, 37330, 37337, 37344 };
				break;

			case WARRIOR:
			case GLADIATOR:
			case WARLORD:
			case ARTISAN:
			case WARSMITH:
			case DUELIST:
			case DREADNOUGHT:
			case MAESTRO:
				list = new int[] { 37317, 37324, 37331, 37338, 37345 };
				break;

			case ROGUE:
			case TREASURE_HUNTER:
			case HAWKEYE:
			case ELVEN_SCOUT:
			case PLAIN_WALKER:
			case SILVER_RANGER:
			case ASSASSIN:
			case ABYSS_WALKER:
			case PHANTOM_RANGER:
			case SCAVENGER:
			case BOUNTY_HUNTER:
			case SAGITTARIUS:
			case ADVENTURER:
			case WIND_RIDER:
			case MOONLIGHT_SENTINEL:
			case GHOST_HUNTER:
			case GHOST_SENTINEL:
			case FORTUNE_SEEKER:
				list = new int[] { 37318, 37325, 37332, 37339, 37346 };
				break;

			case TROOPER:
			case WARDER:
			case BERSERKER:
			case M_SOUL_BREAKER:
			case F_SOUL_BREAKER:
			case ARBALESTER:
			case DOOMBRINGER:
			case M_SOUL_HOUND:
			case F_SOUL_HOUND:
			case TRICKSTER:
			case INSPECTOR:
			case JUDICATOR:
				list = new int[] { 37319, 37326, 37333, 37340, 37347 };
				break;

			case ORC_RAIDER:
			case DESTROYER:
			case ORC_MONK:
			case TYRANT:
			case TITAN:
			case GRAND_KHAVATARI:
				list = new int[] { 37320, 37327, 37334, 37341, 37348 };
				break;

			case ORC_SHAMAN:
			case OVERLORD:
			case WARCRYER:
			case DOMINATOR:
			case DOOMCRYER:
				list = new int[] { 37321, 37328, 37335, 37342, 37349 };
				break;

			case SIGEL_KNIGHT:
			case SIGEL_PHOENIX_KNIGHT:
			case SIGEL_HELL_KNIGHT:
			case SIGEL_EVAS_TEMPLAR:
			case SIGEL_SHILLIEN_TEMPLAR:
				list = new int[] { 37350 };
				break;

			case TYRR_WARRIOR:
			case TYRR_DUELIST:
			case TYRR_DREADNOUGHT:
			case TYRR_TITAN:
			case TYRR_GRAND_KHAVATARI:
			case TYRR_MAESTRO:
			case TYRR_DOOMBRINGER:
				list = new int[] { 37351 };
				break;

			case OTHELL_ROGUE:
			case OTHELL_ADVENTURER:
			case OTHELL_WIND_RIDER:
			case OTHELL_GHOST_HUNTER:
			case OTHELL_FORTUNE_SEEKER:
				list = new int[] { 37352 };
				break;

			case YUL_ARCHER:
			case YUL_SAGITTARIUS:
			case YUL_MOONLIGHT_SENTINEL:
			case YUL_GHOST_SENTINEL:
			case YUL_TRICKSTER:
				list = new int[] { 37353 };
				break;

			case FEOH_WIZARD:
			case FEOH_ARCHMAGE:
			case FEOH_SOULTAKER:
			case FEOH_MYSTIC_MUSE:
			case FEOH_STORM_SCREAMER:
			case FEOH_SOUL_HOUND:
				list = new int[] { 37354 };
				break;

			case WYNN_SUMMONER:
			case WYNN_ARCANA_LORD:
			case WYNN_ELEMENTAL_MASTER:
			case WYNN_SPECTRAL_MASTER:
				list = new int[] { 37355 };
				break;

			case AEORE_HEALER:
			case AEORE_CARDINAL:
			case AEORE_EVAS_SAINT:
			case AEORE_SHILLIEN_SAINT:
				list = new int[] { 37356 };
				break;

			case ISS_ENCHANTER:
			case ISS_HIEROPHANT:
			case ISS_SWORD_MUSE:
			case ISS_SPECTRAL_DANCER:
			case ISS_DOMINATOR:
			case ISS_DOOMCRYER:
				list = new int[] { 37357 };
				break;

			case CLOUD_BREAKER:
			case STRATOMANCER:
				list = new int[] { 26229, 26231, 26233, 26235, 26237 };
				break;

			case MARAUDER:
			case RIPPER:
				list = new int[] { 26230, 26232, 26234, 26236, 26238 };
				break;

			case SAYHA_SEER:
				list = new int[] { 26239 };
				break;

			case EVISCERATOR:
				list = new int[] { 26240 };
				break;
		}

		if (list.length == 0)
		{
			player.sendMessage("Для вашей профессии не нашлось подходящей награды. Получите следующую профессию и попробуйте после этого снова.");
			return false;
		}

		if (!useItem(player, item, 1))
			return false;

		for (int itemId : list)
			ItemUtils.addItem(player, itemId, 1, true);

		return true;
	}

	@Override
	public int[] getItemIds()
	{
		return _itemIds;
	}
}

 

Изменено пользователем Gaikotsu
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то не получается найти условие именно для класса, хотя в ядре оно вроде есть, главная проблема - понять, как должна выглядеть строка в xml файле.

Изменено пользователем dar4e

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
678454f257aebf845a4b235496385b91.png

 

 

Тут какая-то панель редактирования кривая...

Изменено пользователем dar4e

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Судя по названиям классов с cond-ами ничего подходящего готового нет.

Допиши по аналогии с имеющимися - это не сложно.

 

Пример такого cond-а для овера.

package l2p.gameserver.stats.conditions;

import l2p.gameserver.model.Player;
import l2p.gameserver.stats.Env;

public class ConditionPlayerClassId extends Condition
{
	private final int[] _classIds;

	public ConditionPlayerClassId(String[] ids)
	{
		_classIds = new int[ids.length];

		for (int i = 0; i < ids.length; i++)
			_classIds[i] = Integer.parseInt(ids[i]);
	}

	@Override
	protected boolean testImpl(Env env)
	{
		if (!env.character.isPlayer())
			return false;

		int playerClassId = ((Player) env.character).getActiveClassId();

		for (int id : _classIds)
			if (playerClassId == id)
				return true;

		return false;
	}
}
Изменено пользователем Gaikotsu
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у меня вотаким акаром выдает 

можна зделать под каждую профу одельнно

 

// Active skill spellcraft


if (getSkillLevel(163) < 1 && (getClassId() == ClassId.mage || getClassId() == ClassId.wizard || getClassId() == ClassId.cleric || getClassId() == ClassId.sorceror || getClassId() == ClassId.necromancer || getClassId() == ClassId.warlock || getClassId() == ClassId.bishop || getClassId() == ClassId.prophet || getClassId() == ClassId.archmage || getClassId() == ClassId.soultaker || getClassId() == ClassId.arcanaLord || getClassId() == ClassId.cardinal || getClassId() == ClassId.hierophant || getClassId() == ClassId.elvenMage || getClassId() == ClassId.elvenWizard || getClassId() == ClassId.spellsinger || getClassId() == ClassId.elementalSummoner || getClassId() == ClassId.oracle || getClassId() == ClassId.elder || getClassId() == ClassId.mysticMuse || getClassId() == ClassId.elementalMaster || getClassId() == ClassId.evaSaint || getClassId() == ClassId.darkMage || getClassId() == ClassId.darkWizard || getClassId() == ClassId.spellhowler || getClassId() == ClassId.phantomSummoner || getClassId() == ClassId.shillienOracle || getClassId() == ClassId.shillienElder || getClassId() == ClassId.stormScreamer || getClassId() == ClassId.spectralMaster || getClassId() == ClassId.shillienSaint || getClassId() == ClassId.orcMage || getClassId() == ClassId.orcShaman || getClassId() == ClassId.overlord || getClassId() == ClassId.warcryer || getClassId() == ClassId.dominator || getClassId() == ClassId.doomcryer) ) {
L2Skill skill = SkillTable.getInstance().getInfo(163, 1);
addSkill(skill);
}

 

Изменено пользователем Firs

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у меня вотаким акаром выдает 

можна зделать под каждую профу одельнно

 

// Active skill spellcraft

if (getSkillLevel(163) < 1 && (getClassId() == ClassId.mage || getClassId() == ClassId.wizard || getClassId() == ClassId.cleric || getClassId() == ClassId.sorceror || getClassId() == ClassId.necromancer || getClassId() == ClassId.warlock || getClassId() == ClassId.bishop || getClassId() == ClassId.prophet || getClassId() == ClassId.archmage || getClassId() == ClassId.soultaker || getClassId() == ClassId.arcanaLord || getClassId() == ClassId.cardinal || getClassId() == ClassId.hierophant || getClassId() == ClassId.elvenMage || getClassId() == ClassId.elvenWizard || getClassId() == ClassId.spellsinger || getClassId() == ClassId.elementalSummoner || getClassId() == ClassId.oracle || getClassId() == ClassId.elder || getClassId() == ClassId.mysticMuse || getClassId() == ClassId.elementalMaster || getClassId() == ClassId.evaSaint || getClassId() == ClassId.darkMage || getClassId() == ClassId.darkWizard || getClassId() == ClassId.spellhowler || getClassId() == ClassId.phantomSummoner || getClassId() == ClassId.shillienOracle || getClassId() == ClassId.shillienElder || getClassId() == ClassId.stormScreamer || getClassId() == ClassId.spectralMaster || getClassId() == ClassId.shillienSaint || getClassId() == ClassId.orcMage || getClassId() == ClassId.orcShaman || getClassId() == ClassId.overlord || getClassId() == ClassId.warcryer || getClassId() == ClassId.dominator || getClassId() == ClassId.doomcryer) ) {

L2Skill skill = SkillTable.getInstance().getInfo(163, 1);

addSkill(skill);

}

 

перепишите и никому не показываете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у меня вотаким акаром выдает 

можна зделать под каждую профу одельнно

 

// Active skill spellcraft

if (getSkillLevel(163) < 1 && (getClassId() == ClassId.mage || getClassId() == ClassId.wizard || getClassId() == ClassId.cleric || getClassId() == ClassId.sorceror || getClassId() == ClassId.necromancer || getClassId() == ClassId.warlock || getClassId() == ClassId.bishop || getClassId() == ClassId.prophet || getClassId() == ClassId.archmage || getClassId() == ClassId.soultaker || getClassId() == ClassId.arcanaLord || getClassId() == ClassId.cardinal || getClassId() == ClassId.hierophant || getClassId() == ClassId.elvenMage || getClassId() == ClassId.elvenWizard || getClassId() == ClassId.spellsinger || getClassId() == ClassId.elementalSummoner || getClassId() == ClassId.oracle || getClassId() == ClassId.elder || getClassId() == ClassId.mysticMuse || getClassId() == ClassId.elementalMaster || getClassId() == ClassId.evaSaint || getClassId() == ClassId.darkMage || getClassId() == ClassId.darkWizard || getClassId() == ClassId.spellhowler || getClassId() == ClassId.phantomSummoner || getClassId() == ClassId.shillienOracle || getClassId() == ClassId.shillienElder || getClassId() == ClassId.stormScreamer || getClassId() == ClassId.spectralMaster || getClassId() == ClassId.shillienSaint || getClassId() == ClassId.orcMage || getClassId() == ClassId.orcShaman || getClassId() == ClassId.overlord || getClassId() == ClassId.warcryer || getClassId() == ClassId.dominator || getClassId() == ClassId.doomcryer) ) {

L2Skill skill = SkillTable.getInstance().getInfo(163, 1);

addSkill(skill);

}

 

switch (getClassId()) {
   mage:
   wizard:
   cleric:
   sorceror:
   necromancer:
   // Другие маг профы
      addSkill(SkillTable.getInstance().getInfo(/* ид маг скила */ , 1));
      break;
   fighter:
   // Другие физ профы
      addSkill(SkillTable.getInstance().getInfo(/* ид физ скила */ , 1));
      break;
   default:
      return false;
}

PS: Не говорите ему про getClassId().isMage()

Изменено пользователем xuser

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я показал пример поскольку у меня это реализовано только для магов 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я показал пример поскольку у меня это реализовано только для магов 

А где это вообще написано? :help:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

почему просто в класс юз_итем

не добавить юзабельность предмета и проверку на класс? когда 1 класс, даст 1 бафф/предмет/скил, когда другой класс, то по другому даст

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у меня вотаким акаром выдает 

можна зделать под каждую профу одельнно

 

// Active skill spellcraft

if (getSkillLevel(163) < 1 && (getClassId() == ClassId.mage || getClassId() == ClassId.wizard || getClassId() == ClassId.cleric || getClassId() == ClassId.sorceror || getClassId() == ClassId.necromancer || getClassId() == ClassId.warlock || getClassId() == ClassId.bishop || getClassId() == ClassId.prophet || getClassId() == ClassId.archmage || getClassId() == ClassId.soultaker || getClassId() == ClassId.arcanaLord || getClassId() == ClassId.cardinal || getClassId() == ClassId.hierophant || getClassId() == ClassId.elvenMage || getClassId() == ClassId.elvenWizard || getClassId() == ClassId.spellsinger || getClassId() == ClassId.elementalSummoner || getClassId() == ClassId.oracle || getClassId() == ClassId.elder || getClassId() == ClassId.mysticMuse || getClassId() == ClassId.elementalMaster || getClassId() == ClassId.evaSaint || getClassId() == ClassId.darkMage || getClassId() == ClassId.darkWizard || getClassId() == ClassId.spellhowler || getClassId() == ClassId.phantomSummoner || getClassId() == ClassId.shillienOracle || getClassId() == ClassId.shillienElder || getClassId() == ClassId.stormScreamer || getClassId() == ClassId.spectralMaster || getClassId() == ClassId.shillienSaint || getClassId() == ClassId.orcMage || getClassId() == ClassId.orcShaman || getClassId() == ClassId.overlord || getClassId() == ClassId.warcryer || getClassId() == ClassId.dominator || getClassId() == ClassId.doomcryer) ) {

L2Skill skill = SkillTable.getInstance().getInfo(163, 1);

addSkill(skill);

}

 

pre_1465913031__kill-la-kill-anime-iron-

 

 

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Получилось сделать подходящий кондишон, но только для 1 класса, ибо я не нашел, где именно в люцере 2 смотреть активный класс персонажа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...