Всем привет, столкнулся с проблемой заточки шмоток/пушек водой. (сборка 4.9) Немного подумав, на основе простой заточки сделал вот это Спойлер: StatEnchantFunction.java Код: private int getArmorAuthorizeMod(int autorizeLvl, Stat2 applyStat) { ArmorType armorType = item.getItemTemplate().getArmorType(); if (armorType == null) { log.warn("Missing item ArmorType itemId: " + item.getItemId() + " EquipmentSlot: " + item.getEquipmentSlot() + " playerObjectId: " + applyStat.getOwner().getObjectId()); return 0; } int equipmentSlot = (int) (item.getEquipmentSlot() & 0xFFFFFFFF); switch (item.getItemTemplate().getArmorType()) { case ROBE: // 4.9 check switch (equipmentSlot) { case 1 << 5: case 1 << 11: case 1 << 4: switch (stat) { case PHYSICAL_ATTACK: return 1 * autorizeLvl; case BOOST_MAGICAL_SKILL: return 4 * autorizeLvl; case PHYSICAL_DEFENSE: return autorizeLvl; case MAXHP: return 20 * autorizeLvl; case PHYSICAL_CRITICAL_RESIST: return 2 * autorizeLvl; case MAGICAL_DEFEND: return 2 * autorizeLvl; default: break; } return 0; case 1 << 12: switch (stat) { case PHYSICAL_ATTACK: return 1 * autorizeLvl; case BOOST_MAGICAL_SKILL: return 4 * autorizeLvl; case PHYSICAL_DEFENSE: return 2 * autorizeLvl; case MAXHP: return 22 * autorizeLvl; case PHYSICAL_CRITICAL_RESIST: return 3 * autorizeLvl; case MAGICAL_DEFEND: return 2 * autorizeLvl; default: break; } return 0; case 1 << 3: switch (stat) { case PHYSICAL_ATTACK: return 1 * autorizeLvl; case BOOST_MAGICAL_SKILL: return 4 * autorizeLvl; case PHYSICAL_DEFENSE: return 3 * autorizeLvl; case MAXHP: return 24 * autorizeLvl; case PHYSICAL_CRITICAL_RESIST: return 4 * autorizeLvl; case MAGICAL_DEFEND: return 3 * autorizeLvl; default: break; } return 0; } return 0; case LEATHER: // 4.9 check switch (equipmentSlot) { case 1 << 5: case 1 << 11: case 1 << 4: switch (stat) { case PHYSICAL_ATTACK: return 1 * autorizeLvl; case BOOST_MAGICAL_SKILL: return 4 * autorizeLvl; case PHYSICAL_DEFENSE: return 2 * autorizeLvl; case MAXHP: return 18 * autorizeLvl; case PHYSICAL_CRITICAL_RESIST: return 2 * autorizeLvl; case MAGICAL_DEFEND: return 2 * autorizeLvl; default: break; } return 0; case 1 << 12: switch (stat) { case PHYSICAL_ATTACK: return 1 * autorizeLvl; case BOOST_MAGICAL_SKILL: return 4 * autorizeLvl; case PHYSICAL_DEFENSE: return 3 * autorizeLvl; case MAXHP: return 20 * autorizeLvl; case PHYSICAL_CRITICAL_RESIST: return 3 * autorizeLvl; case MAGICAL_DEFEND: return 2 * autorizeLvl; default: break; } return 0; case 1 << 3: switch (stat) { case PHYSICAL_ATTACK: return 1 * autorizeLvl; case BOOST_MAGICAL_SKILL: return 4 * autorizeLvl; case PHYSICAL_DEFENSE: return 4 * autorizeLvl; case MAXHP: return 22 * autorizeLvl; case PHYSICAL_CRITICAL_RESIST: return 4 * autorizeLvl; case MAGICAL_DEFEND: return 3 * autorizeLvl; default: break; } return 0; } return 0; case CHAIN: // 4.9 check switch (equipmentSlot) { case 1 << 5: case 1 << 11: case 1 << 4: switch (stat) { case PHYSICAL_ATTACK: return 1 * autorizeLvl; case BOOST_MAGICAL_SKILL: return 4 * autorizeLvl; case PHYSICAL_DEFENSE: return 3 * autorizeLvl; case MAXHP: return 16 * autorizeLvl; case PHYSICAL_CRITICAL_RESIST: return 2 * autorizeLvl; case MAGICAL_DEFEND: return 2 * autorizeLvl; default: break; } return 0; case 1 << 12: switch (stat) { case PHYSICAL_ATTACK: return 1 * autorizeLvl; case BOOST_MAGICAL_SKILL: return 4 * autorizeLvl; case PHYSICAL_DEFENSE: return 4 * autorizeLvl; case MAXHP: return 18 * autorizeLvl; case PHYSICAL_CRITICAL_RESIST: return 3 * autorizeLvl; case MAGICAL_DEFEND: return 2 * autorizeLvl; default: break; } return 0; case 1 << 3: switch (stat) { case PHYSICAL_ATTACK: return 1 * autorizeLvl; case BOOST_MAGICAL_SKILL: return 4 * autorizeLvl; case PHYSICAL_DEFENSE: return 5 * autorizeLvl; case MAXHP: return 20 * autorizeLvl; case PHYSICAL_CRITICAL_RESIST: return 4 * autorizeLvl; case MAGICAL_DEFEND: return 3 * autorizeLvl; default: break; } return 0; } return 0; case PLATE: // 4.9 check switch (equipmentSlot) { case 1 << 5: case 1 << 11: case 1 << 4: switch (stat) { case PHYSICAL_ATTACK: return 1 * autorizeLvl; case BOOST_MAGICAL_SKILL: return 4 * autorizeLvl; case PHYSICAL_DEFENSE: return 4 * autorizeLvl; case MAXHP: return 14 * autorizeLvl; case PHYSICAL_CRITICAL_RESIST: return 2 * autorizeLvl; case MAGICAL_DEFEND: return 2 * autorizeLvl; default: break; } return 0; case 1 << 12: switch (stat) { case PHYSICAL_ATTACK: return 1 * autorizeLvl; case BOOST_MAGICAL_SKILL: return 4 * autorizeLvl; case PHYSICAL_DEFENSE: return 5 * autorizeLvl; case MAXHP: return 16 * autorizeLvl; case PHYSICAL_CRITICAL_RESIST: return 3 * autorizeLvl; case MAGICAL_DEFEND: return 2 * autorizeLvl; default: break; } return 0; case 1 << 3: switch (stat) { case PHYSICAL_ATTACK: return 1 * autorizeLvl; case BOOST_MAGICAL_SKILL: return 4 * autorizeLvl; case PHYSICAL_DEFENSE: return 6 * autorizeLvl; case MAXHP: return 18 * autorizeLvl; case PHYSICAL_CRITICAL_RESIST: return 4 * autorizeLvl; case MAGICAL_DEFEND: return 3 * autorizeLvl; default: break; } return 0; } return 0; case SHIELD: switch (stat) { case DAMAGE_REDUCE: float reduceRate = autorizeLvl > 10 ? 0.2f : autorizeLvl * 0.02f; return Math.round(reduceRate * applyStat.getBase()); case BLOCK: if (autorizeLvl > 10) { return 30 * (autorizeLvl - 10); } return 0; case MAXHP: if (autorizeLvl > 20) { return 100 * (autorizeLvl - 20); } return 0; case PHYSICAL_DEFENSE: if (autorizeLvl > 20) { return 50 * (autorizeLvl - 20); } return 0; case MAGIC_SKILL_BOOST_RESIST: if (autorizeLvl > 20) { return 20 * (autorizeLvl - 20); } return 0; default: break; } } return 0; } Спойлер: EnchantService.java Код: if (item.getItemTemplate().getCategory() == ItemCategory.JACKET) { int id = item.getItemTemplate().getAuthorizeName(); switch (id) { case 10086: modifiers.add(new StatEnchantFunction(item, StatEnum.PHYSICAL_ATTACK, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.BOOST_MAGICAL_SKILL, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.MAXHP, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PHYSICAL_DEFENSE, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PHYSICAL_CRITICAL_RESIST, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.MAGICAL_CRITICAL_RESIST, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PVP_DEFEND_RATIO, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PVP_DEFEND_RATIO_PHYSICAL, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PVP_DEFEND_RATIO_MAGICAL, 0)); break; default: break; if (item.getItemTemplate().getCategory() == ItemCategory.PANTS) { int id = item.getItemTemplate().getAuthorizeName(); switch (id) { case 10087: modifiers.add(new StatEnchantFunction(item, StatEnum.PHYSICAL_ATTACK, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.BOOST_MAGICAL_SKILL, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.MAXHP, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PHYSICAL_DEFENSE, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PHYSICAL_CRITICAL_RESIST, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.MAGICAL_CRITICAL_RESIST, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PVP_DEFEND_RATIO, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PVP_DEFEND_RATIO_PHYSICAL, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PVP_DEFEND_RATIO_MAGICAL, 0)); break; default: break; } if (item.getItemTemplate().getCategory() == ItemCategory.SHOULDERS) { int id = item.getItemTemplate().getAuthorizeName(); switch (id) { case 10088: modifiers.add(new StatEnchantFunction(item, StatEnum.PHYSICAL_ATTACK, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.BOOST_MAGICAL_SKILL, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.MAXHP, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PHYSICAL_DEFENSE, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PHYSICAL_CRITICAL_RESIST, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.MAGICAL_CRITICAL_RESIST, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PVP_DEFEND_RATIO, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PVP_DEFEND_RATIO_PHYSICAL, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PVP_DEFEND_RATIO_MAGICAL, 0)); break; default: break; } if (item.getItemTemplate().getCategory() == ItemCategory.GLOVES) { int id = item.getItemTemplate().getAuthorizeName(); switch (id) { case 10089: modifiers.add(new StatEnchantFunction(item, StatEnum.PHYSICAL_ATTACK, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.BOOST_MAGICAL_SKILL, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.MAXHP, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PHYSICAL_DEFENSE, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PHYSICAL_CRITICAL_RESIST, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.MAGICAL_CRITICAL_RESIST, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PVP_DEFEND_RATIO, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PVP_DEFEND_RATIO_PHYSICAL, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PVP_DEFEND_RATIO_MAGICAL, 0)); break; default: break; } if (item.getItemTemplate().getCategory() == ItemCategory.SHOES) { int id = item.getItemTemplate().getAuthorizeName(); switch (id) { case 10090: modifiers.add(new StatEnchantFunction(item, StatEnum.PHYSICAL_ATTACK, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.BOOST_MAGICAL_SKILL, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.MAXHP, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PHYSICAL_DEFENSE, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PHYSICAL_CRITICAL_RESIST, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.MAGICAL_CRITICAL_RESIST, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PVP_DEFEND_RATIO, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PVP_DEFEND_RATIO_PHYSICAL, 0)); modifiers.add(new StatEnchantFunction(item, StatEnum.PVP_DEFEND_RATIO_MAGICAL, 0)); break; default: break; } Все скомпилировалось удачно, но заточка все равно не засчитывается, статы отображаются в клиенте, но вот не прибавляют при заточке, т.е "на вид" все есть. На еделе статы самой шмотки в 0 заточке висят. Может кто помочь с этим? куда еще нужно что-то прописать, чтобы заработало все?
enchant_tables или enchant_templates ? в котором надо прописать? и как потом закрепить итем под эти статы, в итем тамплейтс я просто не нашел параметр который берется с этих файлов.
чтобы найти это значение в клиенте case 10086: открываешь файл client_item_authorizetable.xml и оно тут, чтобы найти у какого итема <name>lt_torso_master</name>, открываешь client_items_armor.xml или client_items_etc.xml и ищешь <authorize_name>lt_torso_master</authorize_name>, а вообще у тебя в item_template.xml это 10086 должно присвоено быть итему
Оно у меня присвоено итемам, вот один из них Спойлер: id="110301918" Код: <item_template id="110301918" name="Purified Marchutan Protector's Magic Jerkin" desc="1697041" name_desc="lt_torso_d_v_m3_q_65b" level="65" mask="36926" category="JACKET" armor_type="LEATHER" max_authorize="5" authorize_name="10086" max_stack_count="1" item_type="DEVANION" quality="MYTHIC" price="1612381" race="PC_ALL" restrict="65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65" bonus_apply="EQUIP" equipment_type="ARMOR" slot="8" max_enchant_bonus="0" m_slots="6"> <modifiers> <add name="EVASION" value="320"/> <add name="MAGIC_SKILL_BOOST_RESIST" value="214"/> <add name="MAGICAL_RESIST" value="164"/> <add name="PHYSICAL_DEFENSE" value="335"/> <add name="MAXHP" value="594" bonus="true"/> <add name="PHYSICAL_DEFENSE" value="195" bonus="true"/> <add name="MAGIC_SKILL_BOOST_RESIST" value="77" bonus="true"/> <add name="MAGICAL_RESIST" value="49" bonus="true"/> <add name="PHYSICAL_CRITICAL_RESIST" value="40" bonus="true"/> <add name="BOOST_MAGICAL_SKILL" value="125" bonus="true"/> <rate name="FLY_SPEED" value="10" bonus="true"/> <rate name="BOOST_HATE" value="-38" bonus="true"/> <add name="PHYSICAL_ATTACK" value="10" bonus="true"/> <add name="PVP_DEFEND_RATIO" value="50" bonus="true"/> </modifiers> <actions> <remodel type="1"/> </actions> </item_template> Вопрос был в том, что не так с тем кодом, который я скинул выше, или же где нужно что-то закрепить. Если это enchant_tables или enchant_templates , как правильно туда прописать?
Please login or register to view links, у тебя скорее всего не правильно считываются эти статы из самой пакетки(либо пакет не полный).
в StatEnum тоже всё добавлено ? ItemEnchantBonus, ItemEnchantTemplate. сам пакет SM_STATS_INFO вообще правильно выше было написано
знаю что сборки геров кривые, решил проверить authorize_name, открыл клиент и в файле как сказали выше <authorize_name>lt_torso_master</authorize_name> и сверил с item_template.xml. authorize_name прописан верно открыл StatEnum, проверил прописаны ли статы, они оказались прописаны тоже. SM_STATS_INFO открыл пакет, там тоже статы прописаны. Не могу разобраться с логикой ItemEnchantBonus, ItemEnchantTemplate. этих двух файлов, точнее enchant_tables и enchant_templates В файле enchant_tables есть вот такие строчки. <enchant_table id="48" type="AUTHORIZE"> Вопрос, могу ли я например создать enchant_table id="49" type="AUTHORIZE" и записать туда статы с client_item_authorizetable? Или же надо записывать в enchant_templates ? Совсем в них запутался, немного не въезжаю Можете плиз "разжевать" по простенькому, мануалов нету просто. Знаю что щас пару людей могут сказать "иди учи статику" вот я и до конца пытаюсь понять эти файлы.
вот пытаюсь реализовать заточку даэваниона и водного дракона, код составил, все компилится но не идет. Есть ли еще какие пакеты кроме stats_info которые отвечают за статы при заточке?
допер в чем была проблема, забыл создать нов параметр в StatEnchantFunction.java на подобие getEnchantAdditionModifier. Сэп всем за помощь) особенно за инфу с клиентской частью.