Meg 0 Опубликовано 3 августа, 2019 нпц должен давать указанный итем но что бы я не указывал он дает мне Short Sword (самая простая нг пушка) если я ставлю количество итемов 2 то дает Long Sword (тоже нг пушка) работает исправно только если выставить итем - адену (любые шмотки\другие валюты -автоматически заменяет на нг пушку) но вот что интересно, нпц - кот дающий профу (за каждую профу можно указать приз) за первую профу дает любой итем который укажешь! а за вторую и третью - заменяет на Short Sword. я так понимаю это какая то защита, но где ее искать не понятно, если есть идеи - напишите пожалуйста! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GM1 45 Опубликовано 3 августа, 2019 Могу символически за денешку исправить. если интересно, пиши в лс 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Meg 0 Опубликовано 3 августа, 2019 5 hours ago, LetsVirt said: Могу символически за денешку исправить. если интересно, пиши в лс а можешь просто подсказать в каком направлении искать? а я уже там попробую разобраться. а там уже если не получится то обращусь на платной основе. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GM1 45 Опубликовано 3 августа, 2019 10 минут назад, Meg сказал: а можешь просто подсказать в каком направлении искать? а я уже там попробую разобраться. а там уже если не получится то обращусь на платной основе. узнай id Short Sword Вбей в конфигах по поиску етот ид. Ибо у меня в сборке есть, в конфигах какой приз видавать после взятие професии. Также поищи в самом скрипте клас мастера. Если нету, ищи в ядре. Если есть исходники, или делай декомпил. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Meg 0 Опубликовано 3 августа, 2019 (изменено) к сожалению в конфигах у меня не получилось найти этот параметр по id (id Short Sword - 1 ) сейчас пробую в ядре искать но пока пусто package main.engine.events.daily.normal.types; import java.util.ArrayList; import java.util.List; import l2j.gameserver.ThreadPoolManager; import l2j.gameserver.data.ItemData; import l2j.gameserver.model.actor.L2Npc; import l2j.gameserver.model.actor.base.ClassId; import l2j.gameserver.model.actor.instance.L2PcInstance; import l2j.gameserver.model.actor.instance.enums.TeamType; import l2j.gameserver.model.holder.LocationHolder; import l2j.gameserver.model.world.L2World; import l2j.gameserver.network.external.server.NpcHtmlMessage; import l2j.gameserver.network.external.server.PlaySound; import l2j.gameserver.network.external.server.PlaySound.PlaySoundType; import l2j.gameserver.network.external.server.SystemMessage; import l2j.gameserver.network.external.server.TutorialShowQuestionMark; import main.data.ConfigData; import main.engine.events.daily.AbstractEvent; import main.holders.objects.CharacterHolder; import main.holders.objects.NpcHolder; import main.holders.objects.PlayerHolder; import main.util.Util; import main.util.UtilMessage; import main.util.UtilSpawn; import main.util.builders.html.HtmlBuilder; /** * @author fissban */ public class NpcClassMaster extends AbstractEvent { private static final int NPC = 12371; // format: // PriceItemId // PriceItemCount // ReardItemId // RewardItemCount // Usar el 0 para no definir ningun valor private static final List<ClassMasterList> ITEM_LIST = new ArrayList<>(); { // Primer cambio de clase ---------------------- var job1 = new ClassMasterList(); job1.setPriceItemId(ConfigData.CLASSMASTER_PRICE_JOB1.getRewardId()); job1.setPriceItemCount(ConfigData.CLASSMASTER_PRICE_JOB1.getRewardCount()); job1.setRewardItemId(ConfigData.CLASSMASTER_REWARD_JOB1.getRewardId()); job1.setRewardItemCount(ConfigData.CLASSMASTER_REWARD_JOB1.getRewardCount()); ITEM_LIST.add(job1); // Segundo cambio de clase ---------------------- var job2 = new ClassMasterList(); job2.setPriceItemId(ConfigData.CLASSMASTER_PRICE_JOB2.getRewardId()); job2.setPriceItemCount(ConfigData.CLASSMASTER_PRICE_JOB2.getRewardCount()); job2.setRewardItemId(ConfigData.CLASSMASTER_REWARD_JOB2.getRewardCount()); job2.setRewardItemCount(ConfigData.CLASSMASTER_REWARD_JOB2.getRewardCount()); ITEM_LIST.add(job2); // Tercer cambio de clase ----------------------- var job3 = new ClassMasterList(); job3.setPriceItemId(ConfigData.CLASSMASTER_PRICE_JOB3.getRewardId()); job3.setPriceItemCount(ConfigData.CLASSMASTER_PRICE_JOB3.getRewardCount()); job3.setRewardItemId(ConfigData.CLASSMASTER_REWARD_JOB3.getRewardCount()); job3.setRewardItemCount(ConfigData.CLASSMASTER_REWARD_JOB3.getRewardCount()); ITEM_LIST.add(job3); } // Spawns private static final List<LocationHolder> SPAWNS = new ArrayList<>(); { SPAWNS.add(new LocationHolder(11283, 15951, -4584));// ClassChange_DE SPAWNS.add(new LocationHolder(115774, -178666, -958));// ClassChange_DW SPAWNS.add(new LocationHolder(45036, 48384, -3060));// ClassChange_E SPAWNS.add(new LocationHolder(-44747, -113865, -208));// ClassChange_ORC SPAWNS.add(new LocationHolder(-84466, 243171, -3729));// ClassChange_TI } // Html private static final String HTML_PATH = "data/html/engine/events/classmaster/"; private static final List<NpcHolder> npcs = new ArrayList<>(); public NpcClassMaster() { registerEvent(ConfigData.ENABLE_ClassMaster, ConfigData.CLASSMASTER_DATE_START, ConfigData.CLASSMASTER_DATE_END); } @Override public void onModState() { switch (getState()) { case START: UtilMessage.sendAnnounceMsg("Event Class Master: Started!", L2World.getInstance().getAllPlayers()); ThreadPoolManager.schedule(() -> { SPAWNS.forEach(loc -> npcs.add(UtilSpawn.npc(NPC, loc.getX(), loc.getY(), loc.getZ(), 0, 0, 0, TeamType.NONE, 0))); }, 20000); break; case END: UtilMessage.sendAnnounceMsg("Event Class Master: End!", L2World.getInstance().getAllPlayers()); npcs.forEach(npc -> npc.getInstance().deleteMe()); break; } } @Override public void onEnterWorld(PlayerHolder ph) { UtilMessage.sendAnnounceMsg("Event Class Master: Started!", ph); } @Override public boolean onInteract(PlayerHolder ph, CharacterHolder character) { if (Util.areObjectType(L2Npc.class, character)) { var npc = (L2Npc) character.getInstance(); if (npc.getId() == NPC) { sendHtmlFile(ph, npc, HTML_PATH + "index.htm"); return true; } } return false; } @Override public void onEvent(PlayerHolder ph, CharacterHolder npc, String event) { if (((NpcHolder) npc).getId() != NPC) { return; } if (event.startsWith("1stClass")) { showHtmlMenu(ph, npc.getObjectId(), 1); } else if (event.startsWith("2ndClass")) { showHtmlMenu(ph, npc.getObjectId(), 2); } else if (event.startsWith("3rdClass")) { showHtmlMenu(ph, npc.getObjectId(), 3); } else if (event.startsWith("change_class")) { try { int val = Integer.parseInt(event.split(" ")[1]); if (checkAndChangeClass(ph.getInstance(), val)) { // Send sound ph.getInstance().sendPacket(new PlaySound(PlaySoundType.CHAR_CHANGE)); // Send html var html = new NpcHtmlMessage(npc.getObjectId()); html.setFile(HTML_PATH + "ok.htm"); html.replace("%name%", ClassId.getById(val).getName()); ph.getInstance().sendPacket(html); } } catch (Exception e) { // } } } public static final void showHtmlMenu(PlayerHolder ph, int objectId, int level) { var html = new NpcHtmlMessage(objectId); var currentClassId = ph.getInstance().getClassId(); if (currentClassId.level() >= level) { html.setFile(HTML_PATH + "nomore.htm"); } else { var minLevel = getMinLevel(currentClassId.level()); if (ph.getInstance().getLevel() >= minLevel) { var menu = new HtmlBuilder(); for (var cid : ClassId.values()) { if (validateClassId(currentClassId, cid) && (cid.level() == level)) { String className = cid.getName(); menu.append("<img src=L2UI_CH3.br_bar2_mp width=204 height=1>"); menu.append("<table width=204>"); menu.append("<tr>"); menu.append("<td><button value=\"", className, "\" action=\"bypass -h Engine NpcClassMaster change_class ", cid.getId() + "\" width=204 height=20 back=L2UI_CH3.br_party1_back2 fore=L2UI_CH3.balloon2_2></td>>"); menu.append("</tr>"); menu.append("</table>"); } } if (menu.toString().length() > 0) { menu.append("<img src=L2UI_CH3.br_bar2_mp width=204 height=1>"); html.setFile(HTML_PATH + "template.htm"); html.replace("%name%", currentClassId.getName()); html.replace("%menu%", menu.toString()); } else { html.setFile(HTML_PATH + "comebacklater.htm"); html.replace("%level%", String.valueOf(getMinLevel(level - 1))); } } else { if (minLevel < Integer.MAX_VALUE) { html.setFile(HTML_PATH + "comebacklater.htm"); html.replace("%level%", String.valueOf(minLevel)); } else { html.setFile(HTML_PATH + "nomore.htm"); } } } html.replace("%objectId%", String.valueOf(objectId)); html.replace("%req_items%", getRequiredItems(level)); ph.getInstance().sendPacket(html); } private static final void showQuestionMark(L2PcInstance player) { var classId = player.getClassId(); if (getMinLevel(classId.level()) > player.getLevel()) { return; } player.sendPacket(new TutorialShowQuestionMark(1001)); } /** * Returns minimum player level required for next class transfer * @param level - current skillId level (0 - start, 1 - first, etc) * @return */ private static final int getMinLevel(int level) { switch (level) { case 0: return 20; case 1: return 40; case 2: return 76; default: return Integer.MAX_VALUE; } } /** * Returns true if class change is possible * @param oldCID current player ClassId * @param val new class index * @return */ private static final boolean validateClassId(ClassId oldCID, int val) { try { return validateClassId(oldCID, ClassId.getById(val)); } catch (Exception e) { // possible ArrayOutOfBoundsException } return false; } /** * Returns true if class change is possible * @param oldCID current player ClassId * @param newCID new ClassId * @return true if class change is possible */ private static final boolean validateClassId(ClassId oldCID, ClassId newCID) { if ((newCID == null) || (newCID.getRace() == null)) { return false; } if (oldCID.equals(newCID.getParent())) { return true; } return false; } private static String getRequiredItems(int level) { level--; var sb = new StringBuilder(); if ((ITEM_LIST.get(level).getPriceItemId() != 0) && (ITEM_LIST.get(level).getPriceItemCount() != 0)) { var count = ITEM_LIST.get(level).getPriceItemCount(); var itemName = ItemData.getInstance().getTemplate(ITEM_LIST.get(level).getPriceItemId()).getName(); sb.append("<tr><td><img src=L2UI_CH3.mapicon_mark width=32 height=32></td>"); sb.append("<td><font color=\"LEVEL\">[" + count + "]</font></td>"); sb.append("<td>[" + itemName + "]</td>"); sb.append("<td><img src=L2UI_CH3.mapicon_mark width=32 height=32></td></tr>"); } else { sb.append("<tr><td>None</td></tr>"); } return sb.toString(); } private static final boolean checkAndChangeClass(L2PcInstance player, int val) { var currentClassId = player.getClassId(); if (getMinLevel(currentClassId.level()) > player.getLevel()) { return false; } if (!validateClassId(currentClassId, val)) { return false; } var newJobLevel = currentClassId.level(); // Weight/Inventory check if (ITEM_LIST.get(newJobLevel).getRewardItemId() != 0) { if ((player.getWeightPenalty() >= 3) || ((player.getInventoryLimit() * 0.8) <= player.getInventory().getSize())) { player.sendPacket(SystemMessage.INVENTORY_LESS_THAN_80_PERCENT); return false; } } // get all required items for class transfer var priceCount = ITEM_LIST.get(newJobLevel).getPriceItemCount(); var priceItemId = ITEM_LIST.get(newJobLevel).getPriceItemId(); if (!player.getInventory().destroyItemByItemId("ClassMaster", priceItemId, priceCount, player, true)) { player.sendPacket(SystemMessage.NOT_ENOUGH_ITEMS); return false; } // reward player with items var rewardCount = ITEM_LIST.get(newJobLevel).getRewardItemCount(); var rewardItemId = ITEM_LIST.get(newJobLevel).getRewardItemId(); player.getInventory().addItem("ClassMaster", rewardItemId, rewardCount, player, true); player.setClassId(val); if (player.isSubClassActive()) { player.getSubClasses().get(player.getClassIndex()).setClassId(player.getActiveClass()); } else { player.setBaseClass(player.getActiveClass()); } player.broadcastUserInfo(); if (((player.getClassId().level() == 1) && (player.getLevel() >= 40)) || ((player.getClassId().level() == 2) && (player.getLevel() >= 76))) { showQuestionMark(player); } return true; } public class ClassMasterList { private int priceItemId; private int priceItemCount; private int rewardItemId; private int rewardItemCount; public ClassMasterList() { // } public int getPriceItemId() { return priceItemId; } public void setPriceItemId(int priceItemId) { this.priceItemId = priceItemId; } public int getPriceItemCount() { return priceItemCount; } public void setPriceItemCount(int priceItemCount) { this.priceItemCount = priceItemCount; } public int getRewardItemId() { return rewardItemId; } public void setRewardItemId(int rewardItemId) { this.rewardItemId = rewardItemId; } public int getRewardItemCount() { return rewardItemCount; } public void setRewardItemCount(int rewardItemCount) { this.rewardItemCount = rewardItemCount; } } } в конфигах тоже вроде ничего такого Enable_ClassMaster = True # End of event ClassMasterDateStart = 24-2-2015 # Start of event ClassMasterDateEnd = 24-2-2020 # Message to start event ClassMasterMessageStart = Class Master Event: Start! # Define the items necessary to make the change of class. [itemId,ItemCount] ClassMasterPriceJob1 = 57,10000 # Define the items necessary to make the change of class. [itemId,ItemCount] ClassMasterPriceJob2 = 57,100000 # Define the items necessary to make the change of class. [itemId,ItemCount] ClassMasterPriceJob3 = 57,1000000 # Define the prize for making the change of class. [itemId,ItemCount] (0,0 to disable) ClassMasterRewardJob1 = 6622,1 # Define the prize for making the change of class. [itemId,ItemCount] (0,0 to disable) ClassMasterRewardJob2 = 6622,1 # Define the prize for making the change of class. [itemId,ItemCount] (0,0 to disable) ClassMasterRewardJob3 = 6622,1 Буду пробовать дальше.. если у кого-нибудь есть понимание этого напишите пожалуйста. За первую профу дает итем правильно а за вторую и третью подменяет любые итемы (кроме адены) на Short Sword Изменено 3 августа, 2019 пользователем Meg Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
MegaN2 6 Опубликовано 11 августа, 2019 Если это квест то логично бдет искать id награды файлах этого квеста. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты