Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature may not be available in some browsers.
<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"...
// 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;
}
<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>
За советы подобного хардкодинга и костылинга по рукам бить надо.
Прямо как корейцы, вот это поворотБудешь каждому пистолету в игре прописывать, что его могут только сильфы носить, а каждому щиту прописывать всех кроме дк и тд? Классная идея.
Как под спойлером написал, в идеале так и следует сделать, но зависит от задачи и желания с этим колупатьсяПрямо как корейцы, вот это поворот![]()
тупо с языка снялПрямо как корейцы, вот это поворот![]()
И в чем проблема по парсеру пробить xml и им же расставить в нужные xml? Дело 10 минут будь там хоть 100 000 итемов. И xml тянется только при загрузке сервера 1 разБудешь каждому пистолету в игре прописывать, что его могут только сильфы носить, а каждому щиту прописывать всех кроме дк и тд? Классная идея.
Можно, конечно, скрипт написать, который сам это все сделает, но это уже отдельный вопрос
В идеале, думаю, лучше сделать, как Gaikotsu показал. Особенно если речь о небольшом числе предметов (по вопросу ТС может показаться, что вообще об 1 предмете речь идет).
А если их довольно много/нужно какую-то конкретную группу предметов ограничить (по типу оружия/слота и тд), то, имхо, проще все-таки условие подобное влепить. Ничего такого страшного в подобном быстром решении не вижу
Я бы так и сделал, скорее всего, либо вручную (если предметов мало). Но смотря что сделать нужно.И в чем проблема по парсеру пробить xml и им же расставить в нужные xml? Дело 10 минут будь там хоть 100 000 итемов.
А вот здесь ты уже не совсем прав:Если тебе не понятно чем плохи глобальные проверки - представь, что каждая проверка эквипа отрабатывает твои строчки, и с точки зрения коддинга это называется "костыль" или гавнокод.
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;
}
Нет, давайте на каждое изменение пихать какой то костыль в движок, но зато делов на 5 минут. А завтра нам понадобится надеть какой-то щит на ДК или что-то в этом роде, мы в движковое условие поставим статичное исключение по ИД, вместо изменения одного конда в датапаке.Будешь каждому пистолету в игре прописывать, что его могут только сильфы носить, а каждому щиту прописывать всех кроме дк и тд? Классная идея.
Можно, конечно, скрипт написать, который сам это все сделает, но это уже отдельный вопрос
В идеале, думаю, лучше сделать, как Gaikotsu показал. Особенно если речь о небольшом числе предметов (по вопросу ТС может показаться, что вообще об 1 предмете речь идет).
А если их довольно много/нужно какую-то конкретную группу предметов ограничить (по типу оружия/слота и тд), то, имхо, проще все-таки условие подобное влепить. Ничего такого страшного в подобном быстром решении не вижу
А всё почему? Потому что у корейцев нет пв софта, чтобы посмотреть как правильно реализовать всё.Нет, ну тупые эти корейцы конечно, я не могу.
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;
}
Само собой, если возникнут подобные противоречия, то тем шатким образом уже точно задачу решать не стоит. В целом согласен, что вариант очень не очень, но как есть.А завтра нам понадобится надеть какой-то щит на ДК или что-то в этом роде, мы в движковое условие поставим статичное исключение по ИД, вместо изменения одного конда в датапаке.
<cond msgId="1518">
<variables name="race" operator="EQ" value="KAMAEL" />
</cond>
1. Кодовая база тянется из тех времен, когда json только появлялся. Чтобы оставить живыми все наработки и иметь хоть какую-то межсборочную совместимость, чтобы художественнок слову о говнакоде, несколько вопросов к разработчикам:
1. почему не использовать yml/json вместо xml
2. зачем хардкодить отдельные проверки. Можно в variables(к примеру) хранить нужные данные и использовать условия типа
XML:<cond msgId="1518"> <variables name="race" operator="EQ" value="KAMAEL" /> </cond>
1. Не знаю как для других, но лично мне в хмл удобней - он как-то более для меня читабелен чем джсон/ямл.к слову о говнакоде, несколько вопросов к разработчикам:
1. почему не использовать yml/json вместо xml
2. зачем хардкодить отдельные проверки. Можно в variables(к примеру) хранить нужные данные и использовать условия типа
<cond>
<player param="VITALITY;MORE;0" />
</cond>
1. Потому что споры типа "json лучше xml рррряяя" бессмысленны, это уровень джунов-пятиклашек.к слову о говнакоде, несколько вопросов к разработчикам:
1. почему не использовать yml/json вместо xml
2. зачем хардкодить отдельные проверки. Можно в variables(к примеру) хранить нужные данные и использовать условия типа
XML:<cond msgId="1518"> <variables name="race" operator="EQ" value="KAMAEL" /> </cond>