Exclusive item by race

Horyon

Пляшущий с бубном
Участник
Сообщения
220
Розыгрыши
0
Решения
4
Репутация
53
Реакции
77
Баллы
273
Хроники
  1. Shadow of the Kamael
Исходники
Присутствуют
Сборка
L2jMobius Master class ch2
Hi guys...

How to make a item equipped only by aspecific race?

Ty in advance
 
Решение
За советы подобного хардкодинга и костылинга по рукам бить надо.
Кондишны для предметов и т.д. например на расу для кого сделаны? :)

Например
XML:
    <item id="9720" name="Warrior's Sword" type="Weapon">
        <!-- This sword identifies its wielder as a Warrior of Kamael. -->
        <set name="icon" val="icon.weapon_sealed_rapier_i00" />
        <set name="default_action" val="EQUIP" />
        <set name="weapon_type" val="RAPIER" />
        <set name="bodypart" val="rhand" />
        <set name="damage_range" val="0;0;40;120" />
        <set name="immediate_effect" val="true" />
        <set name="material" val="STEEL" />
        <set name="weight" val="1300" />
        <set name="price" val="5100" />
        <set name="soulshots"...
One way to do it is like pistols are allowed to be equiped only for sylphs. Check out UseItem client packet.

Java:
// Prevent equip pistols for non Sylph players.
   if (item.isWeapon() && (item.getWeaponItem().getItemType() == WeaponType.PISTOLS) && (player.getRace() != Race.SYLPH))
   {
    player.sendPacket(SystemMessageId.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM);
    return;
   }
 
За советы подобного хардкодинга и костылинга по рукам бить надо.
Кондишны для предметов и т.д. например на расу для кого сделаны? :)

Например
XML:
    <item id="9720" name="Warrior's Sword" type="Weapon">
        <!-- This sword identifies its wielder as a Warrior of Kamael. -->
        <set name="icon" val="icon.weapon_sealed_rapier_i00" />
        <set name="default_action" val="EQUIP" />
        <set name="weapon_type" val="RAPIER" />
        <set name="bodypart" val="rhand" />
        <set name="damage_range" val="0;0;40;120" />
        <set name="immediate_effect" val="true" />
        <set name="material" val="STEEL" />
        <set name="weight" val="1300" />
        <set name="price" val="5100" />
        <set name="soulshots" val="1" />
        <set name="spiritshots" val="1" />
        <set name="commissionItemType" val="RAPIER" />
        <set name="isAppearanceable" val="true" />
        <cond msgId="1518">
            <player races="KAMAEL" />
        </cond>
        <skills>
            <skill id="3426" level="1" type="ON_ENCHANT" type_value="4" /> <!-- Maximum Ability -->
        </skills>
        <stats>
            <stat type="pAtk">12</stat>
            <stat type="mAtk">10</stat>
            <stat type="rCrit">10</stat>
            <stat type="accCombat">-1.5</stat>
            <stat type="pAtkSpd">406</stat>
            <stat type="randomDamage">40</stat>
            <stat type="pAtkRange">40</stat>
        </stats>
    </item>
 
Решение
За советы подобного хардкодинга и костылинга по рукам бить надо.

Будешь каждому пистолету в игре прописывать, что его могут только сильфы носить, а каждому щиту прописывать всех кроме дк и тд? Классная идея.

Можно, конечно, скрипт написать, который сам это все сделает, но это уже отдельный вопрос

В идеале, думаю, лучше сделать, как Gaikotsu показал. Особенно если речь о небольшом числе предметов (по вопросу ТС может показаться, что вообще об 1 предмете речь идет).

А если их довольно много/нужно какую-то конкретную группу предметов ограничить (по типу оружия/слота и тд), то, имхо, проще все-таки условие подобное влепить. Ничего такого страшного в подобном быстром решении не вижу
 
Будешь каждому пистолету в игре прописывать, что его могут только сильфы носить, а каждому щиту прописывать всех кроме дк и тд? Классная идея.
Прямо как корейцы, вот это поворот:unsure:
 
Будешь каждому пистолету в игре прописывать, что его могут только сильфы носить, а каждому щиту прописывать всех кроме дк и тд? Классная идея.

Можно, конечно, скрипт написать, который сам это все сделает, но это уже отдельный вопрос

В идеале, думаю, лучше сделать, как Gaikotsu показал. Особенно если речь о небольшом числе предметов (по вопросу ТС может показаться, что вообще об 1 предмете речь идет).

А если их довольно много/нужно какую-то конкретную группу предметов ограничить (по типу оружия/слота и тд), то, имхо, проще все-таки условие подобное влепить. Ничего такого страшного в подобном быстром решении не вижу
И в чем проблема по парсеру пробить xml и им же расставить в нужные xml? Дело 10 минут будь там хоть 100 000 итемов. И xml тянется только при загрузке сервера 1 раз :)

Если тебе не понятно чем плохи глобальные проверки особенно в экипе - представь, что каждая проверка эквипа (снял ты что-то или одел пофигу) пытается отрабатывать твои строчки, и с точки зрения коддинга это называется "костыль" или гавнокод.
 
И в чем проблема по парсеру пробить xml и им же расставить в нужные xml? Дело 10 минут будь там хоть 100 000 итемов.
Я бы так и сделал, скорее всего, либо вручную (если предметов мало). Но смотря что сделать нужно.

Если тебе не понятно чем плохи глобальные проверки - представь, что каждая проверка эквипа отрабатывает твои строчки, и с точки зрения коддинга это называется "костыль" или гавнокод.
А вот здесь ты уже не совсем прав:
1. Этот кусок касается исключительно экипируемых предметов, т.е. довольно редко будет туда доходить в принципе. "Кондишны" же напротив дергаются чаще
2. Эти "мои строчки", которые из пакета мобиуса скопировал, могут выполнить ту же задачу намного проще, если уж на то пошло

Если не смотрел как у мобиуса проверка идет этих самых волшебных "кондишнов", то
Java:
public boolean checkCondition(Creature creature, WorldObject object, boolean sendMessage)
    {
        if (creature.canOverrideCond(PlayerCondOverride.ITEM_CONDITIONS) && !Config.GM_ITEM_RESTRICTION)
        {
            return true;
        }
        
        // Don't allow hero equipment and restricted items during Olympiad
        if ((isOlyRestrictedItem() || _heroItem) && (creature.isPlayer() && creature.getActingPlayer().isInOlympiadMode()))
        {
            if (isEquipable())
            {
                creature.sendPacket(SystemMessageId.THE_ITEM_CANNOT_BE_EQUIPPED_IN_THE_OLYMPIAD);
            }
            else
            {
                creature.sendPacket(SystemMessageId.THE_ITEM_CANNOT_BE_USED_IN_THE_OLYMPIAD);
            }
            return false;
        }
        
        if (_isEventRestricted && (creature.isPlayer() && (creature.getActingPlayer().isOnEvent())))
        {
            creature.sendMessage("You cannot use this item in the event.");
            return false;
        }
        
        if (!isConditionAttached())
        {
            return true;
        }
        
        final Creature target = object.isCreature() ? (Creature) object : null;
        for (Condition preCondition : _preConditions)
        {
            if (preCondition == null)
            {
                continue;
            }
            
            if (!preCondition.test(creature, target, null, null))
            {
                if (creature.isSummon())
                {
                    creature.sendPacket(SystemMessageId.THIS_PET_CANNOT_USE_THIS_ITEM);
                    return false;
                }
                
                if (sendMessage)
                {
                    final String msg = preCondition.getMessage();
                    final int msgId = preCondition.getMessageId();
                    if (msg != null)
                    {
                        creature.sendMessage(msg);
                    }
                    else if (msgId != 0)
                    {
                        final SystemMessage sm = new SystemMessage(msgId);
                        if (preCondition.isAddName())
                        {
                            sm.addItemName(_itemId);
                        }
                        creature.sendPacket(sm);
                    }
                }
                return false;
            }
        }
        return true;
    }

Поэтому если, например, стоит задача только сильфам разрешить носить пистолеты, то этот "костыль" и "гавнокод" выполнит ту же задачу значительно проще. Костылем этот кусок считаться от этого не перестанет, но с точки зрения поставленной задачи так может быть несколько лучше (значительно меньше работы серверу нужно проделать, чтобы добиться того же результата)
 
Hi guys, ty for all info.

Have a good knowledge for ppl decide how to do it, considering they needs.

For me at moment is just 6 itens i need... and each item will be equiped by his own race.

So no needs to put java mods.

The solution by Gaikotsu, work 100% fine.

Ty all <3
 
Будешь каждому пистолету в игре прописывать, что его могут только сильфы носить, а каждому щиту прописывать всех кроме дк и тд? Классная идея.

Можно, конечно, скрипт написать, который сам это все сделает, но это уже отдельный вопрос

В идеале, думаю, лучше сделать, как Gaikotsu показал. Особенно если речь о небольшом числе предметов (по вопросу ТС может показаться, что вообще об 1 предмете речь идет).

А если их довольно много/нужно какую-то конкретную группу предметов ограничить (по типу оружия/слота и тд), то, имхо, проще все-таки условие подобное влепить. Ничего такого страшного в подобном быстром решении не вижу
Нет, давайте на каждое изменение пихать какой то костыль в движок, но зато делов на 5 минут. А завтра нам понадобится надеть какой-то щит на ДК или что-то в этом роде, мы в движковое условие поставим статичное исключение по ИД, вместо изменения одного конда в датапаке.

А ведь гениально - можно же вообще от датапаков отказаться и сразу всё в if-else конструкциях лепить. Нет, ну тупые эти корейцы конечно, я не могу.
 
Нет, ну тупые эти корейцы конечно, я не могу.
А всё почему? Потому что у корейцев нет пв софта, чтобы посмотреть как правильно реализовать всё.
Что, нафиг, за вайт баф и на кой черт это делать? Это, что с кб (или от нпса, память уже подводит) бафать можно, если не ошибаюсь. Разве можно более удобно решить этот вопрос и защититься от хацкеров?
Java:
    private void cacheWhiteBuffs() {
        int[] buffs = {1068, 13348,13347,13349,13447,13448,13449, 1388, 1086, 1077, 1242, 1240, 4352, 1085, 1059, 1303, 1043, 1356, 1355, 1357, 1040, 1389, 1036, 1035, 1243, 1304, 1078, 1087,
            1006, 1009, 1007, 1002, 1252, 1253, 1309, 1251, 1308, 1391, 1310, 1390, 1362, 1413, 1363, 1003, 1005, 1008, 1260, 1004, 1250, 1261, 1249, 1282, 1364, 1365, 1414,
            267, 270, 268, 269, 265, 264, 266, 306, 304, 308, 363, 349, 364, 274, 277, 272, 273, 276, 271, 275, 311, 307, 310, 365, 1073, 4342, 1044, 4347, 4348, 1257, 1397, 1268, 4554,
            1032, 1392, 1393, 1259, 1354, 1353, 1352, 1191, 1182, 1189, 1033, 4700, 4702, 4703, 4699};

        int i = 0;
        for (int id : buffs) {
            _whiteBuffs.add(id);
        }

        _whiteBuffs.addAll(Config.C_ALLOWED_BUFFS);
    }

    public boolean isWhiteBuff(int id) {
        if (id >= 3100 && id <= 3299) {
            return false;
        }
        if (Config.F_BUFF.containsKey(id) || Config.M_BUFF.containsKey(id)) {
            return true;
        }
        if (_whiteBuffs.contains(id)) {
            return true;
        }
        if (Config.F_PROFILE_BUFFS.contains(id)) {
            return false;
        }

        return false;
    }
 
А завтра нам понадобится надеть какой-то щит на ДК или что-то в этом роде, мы в движковое условие поставим статичное исключение по ИД, вместо изменения одного конда в датапаке.
Само собой, если возникнут подобные противоречия, то тем шатким образом уже точно задачу решать не стоит. В целом согласен, что вариант очень не очень, но как есть.

Еще минус у этого костыля в пакете в том, что неподходящие предметы в инвентаре обычным образом будут отображаться (вроде, недоступные предметы красным окрашены) и об этом можно будет узнать только при попытке предмет надеть/использовать. Разумеется, можно и это накостылить, но, как и в случае с твоим примером про щит, это явный признак того, что решение хреновое
 
к слову о говнакоде, несколько вопросов к разработчикам:
1. почему не использовать yml/json вместо xml
2. зачем хардкодить отдельные проверки. Можно в variables(к примеру) хранить нужные данные и использовать условия типа
XML:
<cond msgId="1518">
    <variables name="race" operator="EQ" value="KAMAEL" />
</cond>
 
к слову о говнакоде, несколько вопросов к разработчикам:
1. почему не использовать yml/json вместо xml
2. зачем хардкодить отдельные проверки. Можно в variables(к примеру) хранить нужные данные и использовать условия типа
XML:
<cond msgId="1518">
    <variables name="race" operator="EQ" value="KAMAEL" />
</cond>
1. Кодовая база тянется из тех времен, когда json только появлялся. Чтобы оставить живыми все наработки и иметь хоть какую-то межсборочную совместимость, чтобы художественно воровать создавать, никто это не трогает
2. Вроде некоторые так и делают и дальше с рефлексией джавы, все ок ложится
 
к слову о говнакоде, несколько вопросов к разработчикам:
1. почему не использовать yml/json вместо xml
2. зачем хардкодить отдельные проверки. Можно в variables(к примеру) хранить нужные данные и использовать условия типа
1. Не знаю как для других, но лично мне в хмл удобней - он как-то более для меня читабелен чем джсон/ямл.
Хотя это опять же конечно дело привычки.
2. Ну у меня в кондишнах местами нечто похожее сделано тоже, чтобы не городить кучу однотипных классов кондишнов и можно обойтись одним общим
XML:
<cond>
    <player param="VITALITY;MORE;0" />
</cond>
 
Последнее редактирование:
к слову о говнакоде, несколько вопросов к разработчикам:
1. почему не использовать yml/json вместо xml
2. зачем хардкодить отдельные проверки. Можно в variables(к примеру) хранить нужные данные и использовать условия типа
XML:
<cond msgId="1518">
    <variables name="race" operator="EQ" value="KAMAEL" />
</cond>
1. Потому что споры типа "json лучше xml рррряяя" бессмысленны, это уровень джунов-пятиклашек.
2. Это называется "я сделяль, я написаль свой язык программирования на xml". Бесполезно, слишком абстрактно, никак не относится к предметной области. Теперь помимо жабы нужно знать ещё и язык, придуманный очередным гением.

Как-то так.
 
Назад
Сверху Снизу