Jump to content
Sign in to follow this  
FourOnTheFloor

Как сделать что б Талисманы заменяли друг друга?

Recommended Posts

Столкнулся с такой проблемой добавил на сервер Талисманы семени, но они надеваются все и дают статы всей толпой. Помогите сделать так что бы они заменяли друг друга.

Вот Скрипт Талисмана
<armor id="59105" name="Talisman of Longing">
        <set name="crystal_type" value="NONE"/>
        <set name="destroyable" value="true"/>
        <set name="dropable" value="false"/>
        <set name="icon" value="icon.etc_talisman_i01"/>
        <set name="sellable" value="false"/>
        <set name="tradeable" value="false"/>
        <set name="weight" value="150"/>
        <set name="type" value="NONE"/>
        <equip>
            <slot id="TALISMAN"/>
        </equip>
        <skills>
            <skill id="59105" level="1"/>
        </skills>
        <cond msgId="1507">
            <not>
                <player olympiad="true"/>
            </not>
        </cond>
    </armor>

Share this post


Link to post
Share on other sites

1. использовать один и тот же скилл для всех вариантов, просто разных уровней - тогда сколько бы не надел - скилл от них один фиг будет только один, максимального уровня из тех что одеты. из минусов - придется доработать листенеры equip/unequp, чтобы корректно обрабатывало ситуацию "одето несколько талисманов семени, сняли один - пассивка от них убрана".

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

3. разновидность 2-го варианта - ввести параметр "группы" для предметов и при попытке одевания талисманов проверять - не в одной ли группе надеваемый талисман и какой-то из уже одетых талисманов и соотвественно запрещать одевание при совпадении группы. Я к примеру у себя именно этот вариант использую для талисманов семени, богатства, а так же для драгоценных камней.

  • Like 1

Share this post


Link to post
Share on other sites
36 минут назад, Gaikotsu сказал:

1. использовать один и тот же скилл для всех вариантов, просто разных уровней - тогда сколько бы не надел - скилл от них один фиг будет только один, максимального уровня из тех что одеты. из минусов - придется доработать листенеры equip/unequp, чтобы корректно обрабатывало ситуацию "одето несколько талисманов семени, сняли один - пассивка от них убрана".

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

3. разновидность 2-го варианта - ввести параметр "группы" для предметов и при попытке одевания талисманов проверять - не в одной ли группе надеваемый талисман и какой-то из уже одетых талисманов и соотвественно запрещать одевание при совпадении группы. Я к примеру у себя именно этот вариант использую для талисманов семени, богатства, а так же для драгоценных камней.

А как добавить в группу и кондишн?

Share this post


Link to post
Share on other sites
пример проверки по группе 
		if (targetSlot == ItemTemplate.SLOT_TALISMAN)
		{
			int count = player.getTalismanCount();

			if (count <= 0)
				return new SystemMessage(SystemMsg.YOU_CANNOT_WEAR_S1_BECAUSE_YOU_ARE_NOT_WEARING_A_BRACELET).addItemName(itemId);

			ItemInstance deco;
			int groupId = item.getTemplate().getGroupId();

			for (int slot = Inventory.PAPERDOLL_TALISMAN_1; slot <= Inventory.PAPERDOLL_TALISMAN_6; slot++)
			{
				deco = player.getInventory().getPaperdollItem(slot);

				if (deco != null)
				{
					if (deco == item)
						return null; // талисман уже одет и количество слотов больше нуля

					// Проверяем на количество слотов и одинаковые/похожие талисманы (находящиеся в одной группе)
					if (--count <= 0 || deco.getTemplate().getGroupId() == groupId)
						return new SystemMessage(SystemMsg.YOU_CANNOT_EQUIP_S1_BECAUSE_YOU_DO_NOT_HAVE_ANY_AVAILABLE_SLOTS).addItemName(itemId);
				}
			}
		}
		else if (targetSlot == ItemTemplate.SLOT_JEWEL)
		{
			int count = player.getJewelsCount();

			if (count <= 0)
				return new SystemMessage(SystemMsg.S1_CANNOT_BE_USED_DUE_TO_UNSUITABLE_TERMS).addItemName(itemId);

			ItemInstance jewel;
			int groupId = item.getTemplate().getGroupId();

			for (int slot = Inventory.PAPERDOLL_JEWEL_1; slot <= Inventory.PAPERDOLL_JEWEL_6; slot++)
			{
				jewel = player.getInventory().getPaperdollItem(slot);

				if (jewel != null)
				{
					if (jewel == item)
						return null; // камень уже одет и количество слотов больше нуля

					// Проверяем на количество слотов и одинаковые/похожие камни (находящиеся в одной группе)
					if (--count <= 0 || jewel.getTemplate().getGroupId() == groupId)
						return SystemMsg.NO_EQUIPMENT_SLOT_AVAILABLE;
				}
			}
		}

проверка эта находится в методе checkIfCanEquip класса ItemFunctions (для овероподобных сборок)

группа предмета, если явно не задана - равна ид предмета

_groupId = set.getInteger("group_id", _itemId);

это из ItemTemplate

Hide  
Edited by Gaikotsu

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...