0000 2 Опубликовано 26 июля, 2020 Всем добра! Сборка ласт PW, подскажите кому не сложно с меня + 1) нужно реализовать ACP, знаю оно есть через ctrl, MP/CP прекрасно работают, но там когда умирает персонаж банка НР юзается быстро без останки Кто может в этом разобрался или как исправить посоветуйте пожалуйста.... Выдернул скрипт из другой сборки pwsoft, там прекрасно работает! У меня выдает эти ошибки Как исправить эти ошибки ниже? 2) Есть ли в PW фишка ??? выскакивает приглашение на эвенты или на РБ видел на l2code реализован. 3) Снимается CP когда убивает моб, не критично но есть ли решение ?? ---------- 1. ERROR in \AutoCombatPotions.java (at line 107) handler.useItem(player, potions); ^^^^^^^ The method useItem(L2PlayableInstance, L2ItemInstance, boolean) in the type IIte mHandler is not applicable for the arguments (L2PcInstance, L2ItemInstance) ---------- 2. ERROR in \AutoCombatPotions.java (at line 121) handler.useItem(player, potions); ^^^^^^^ The method useItem(L2PlayableInstance, L2ItemInstance, boolean) in the type IIte mHandler is not applicable for the arguments (L2PcInstance, L2ItemInstance) ---------- 3. ERROR in \AutoCombatPotions.java (at line 135) handler.useItem(player, potions); ^^^^^^^ The method useItem(L2PlayableInstance, L2ItemInstance, boolean) in the type IIte mHandler is not applicable for the arguments (L2PcInstance, L2ItemInstance) ---------- 3 problems (3 errors) The method useItem(net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance , net.sf.l2j.gameserver.model.L2ItemInstance, boolean) in the type scripts.items .IItemHandler is not applicable for the arguments (net.sf.l2j.gameserver.model.a ctor.instance.L2PcInstance, net.sf.l2j.gameserver.model.L2ItemInstance) The method useItem(net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance , net.sf.l2j.gameserver.model.L2ItemInstance, boolean) in the type scripts.items .IItemHandler is not applicable for the arguments (net.sf.l2j.gameserver.model.a ctor.instance.L2PcInstance, net.sf.l2j.gameserver.model.L2ItemInstance) The method useItem(net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance , net.sf.l2j.gameserver.model.L2ItemInstance, boolean) in the type scripts.items .IItemHandler is not applicable for the arguments (net.sf.l2j.gameserver.model.a ctor.instance.L2PcInstance, net.sf.l2j.gameserver.model.L2ItemInstance) Failed executing script: C:\12345\server\gameserver\data\scripts\calypso\AutoCom batPotions.java. See AutoCombatPotions.java.error.log for details. ############################## Вот сам скрипт package calypso; import java.util.HashMap; import java.util.concurrent.ScheduledFuture; import java.util.logging.Logger; import net.sf.l2j.gameserver.ThreadPoolManager; import net.sf.l2j.gameserver.model.L2ItemInstance; import net.sf.l2j.gameserver.model.PcInventory; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import scripts.commands.IVoicedCommandHandler; import scripts.commands.VoicedCommandHandler; import scripts.items.IItemHandler; import scripts.items.ItemHandler; /** * * @author Calypso * */ public class AutoCombatPotions implements IVoicedCommandHandler { private final static Logger _log = Logger.getLogger(AutoCombatPotions.class.getName()); // разрешить юз банок private static boolean ALLOW_CP = true, ALLOW_HP = true, ALLOW_MP = true; // проценты для юза private static int PERCENT_CP = 90, PERCENT_HP = 90, PERCENT_MP = 90; // банки, ищутся в сумке чара, юзается первая попавшаяся private static final int[] CP_POTIONS = { 5592 }, HP_POTIONS = { 1539 }, MP_POTIONS = { 728 }; // как часто запускать поток для юза всех банок (это значение будет максимальной погрешностью) private static long RUN_DELAY = 500; // реюз каждого типа банок (нет смысла устанавливать менее RUN_DELAY) private static long CP_DELAY = 500, HP_DELAY = 15000, MP_DELAY = 1000; // только для премиумов private static boolean ONLY_PREMIUM = false; private static HashMap<Integer, ScheduledFuture<?>> runnedAcps = new HashMap<Integer, ScheduledFuture<?>>(); private static HashMap<String, Long> reuses = new HashMap<String, Long>(); @Override public String[] getVoicedCommandList() { return new String[] { "acpon", "acpoff", "acpof" }; } @Override public boolean useVoicedCommand(String command, L2PcInstance player, String target) { if (player == null) return false; if (command.toLowerCase().equals("acpon")) { if (ONLY_PREMIUM && !player.isPremium()) { player.sendMessage("Only for Premium-players!"); return false; } if (runnedAcps.containsKey(player.getObjectId())) { player.sendMessage("ACP already started!"); return false; } runnedAcps.put(player.getObjectId(), ThreadPoolManager.getInstance() .scheduleAiAtFixedRate(new PotionUseTask(player), RUN_DELAY, RUN_DELAY)); player.sendMessage("ACP success started!"); } else if (command.toLowerCase().equals("acpoff") || command.toLowerCase().equals("acpof")) { if (runnedAcps.containsKey(player.getObjectId())) { cancelTask(player.getObjectId()); player.sendMessage("ACP is stoped!"); return false; } else player.sendMessage("ACP already stoped!"); } return false; } private class PotionUseTask implements Runnable { private L2PcInstance player; private int safeObjId; public PotionUseTask(L2PcInstance player) { this.player = player; safeObjId = player.getObjectId(); } @Override public void run() { try { if (player == null) { _log.info("ACP: player is null!!! WTF? ObjID " + safeObjId); cancelTask(safeObjId); return; } if (player.isOnline() != 1) { cancelTask(safeObjId); return; } PcInventory inv = player.getInventory(); IItemHandler handler = null; L2ItemInstance potions = null; if (ALLOW_CP && checkReuse(safeObjId, "CP")) { potions = getPotionFromInv(inv, "CP"); if (potions != null) { if ((player.getCurrentCp() / player.getMaxCp()) * 100 < PERCENT_CP) { handler = ItemHandler.getInstance().getItemHandler(potions.getItemId()); if (handler != null) { handler.useItem(player, potions); setReuse(safeObjId, "CP"); } } } } if (ALLOW_HP && checkReuse(safeObjId, "HP")) { potions = getPotionFromInv(inv, "HP"); if (potions != null) { if ((player.getCurrentHp() / player.getMaxHp()) * 100 < PERCENT_HP) { handler = ItemHandler.getInstance().getItemHandler(potions.getItemId()); if (handler != null) { handler.useItem(player, potions); setReuse(safeObjId, "HP"); } } } } if (ALLOW_MP && checkReuse(safeObjId, "MP")) { potions = getPotionFromInv(inv, "MP"); if (potions != null) { if ((player.getCurrentMp() / player.getMaxMp()) * 100 < PERCENT_MP) { handler = ItemHandler.getInstance().getItemHandler(potions.getItemId()); if (handler != null) { handler.useItem(player, potions); setReuse(safeObjId, "MP"); } } } } } catch (Exception e) { runnedAcps.get(safeObjId).cancel(false); } } } private boolean checkReuse(int objId, String type) { String pair = String.valueOf(objId) + ":" + type; if(!reuses.containsKey(pair)) return true; long lastUse = reuses.get(pair); if(System.currentTimeMillis() - lastUse >= getReuseForPotion(type)) return true; return false; } private void setReuse(int objId, String type) { String pair = String.valueOf(objId) + ":" + type; reuses.put(pair, System.currentTimeMillis()); } private long getReuseForPotion(String type) { type = type.toLowerCase(); if(type.equals("cp")) return CP_DELAY; if(type.equals("hp")) return HP_DELAY; if(type.equals("mp")) return MP_DELAY; return 0; } private L2ItemInstance getPotionFromInv(PcInventory inv, String type) { L2ItemInstance result = null; int[] search = null; if (type.toLowerCase().equals("cp")) search = CP_POTIONS; if (type.toLowerCase().equals("hp")) search = HP_POTIONS; if (type.toLowerCase().equals("mp")) search = MP_POTIONS; if (search == null) _log.warning( "ACP: getPotionFromInv() == null, invalid potion type or unsetted id of potions! Type: " + type); for (int id : search) { result = inv.getItemByItemId(id); if (result != null) break; } return result; } private void cancelTask(int objId) { runnedAcps.remove(objId).cancel(false); } public static void main(String... arguments) { VoicedCommandHandler.getInstance().registerVoicedCommandHandler(new AutoCombatPotions()); _log.info("### ACP service by Calypso loaded!"); } } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
serfan1 112 Опубликовано 26 июля, 2020 Пиши в телеграм @okhunt или лс Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 27 июля, 2020 (изменено) по идее все что нужно, вот это if ((player.getCurrentHp() / player.getMaxHp()) * 100 < PERCENT_HP) заменить на это if (!player.isDead() && (player.getCurrentHp() / player.getMaxHp()) * 100 < PERCENT_HP) по аналогии можно и для CP/MP на всякий случай добавить Изменено 27 июля, 2020 пользователем Gaikotsu Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
CalypsoToolz 451 Опубликовано 27 июля, 2020 в какой то версии (новой ли старой) для метода useItem нужно 3 аргумента (игрок, итем, ctrl) , т.е. добавить false в вызов метода. Ну и скрипт хоть и мой, но древний, нуждается в оптимизации (а вообще лучше всё это через ядро сделать) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
0000 2 Опубликовано 1 августа, 2020 (изменено) Частично решил все 1) Спасибо за скрипт CalypsoToolz, сам разобрался, но плюс дал, надо добавить false. Более того нашел ядро с отдельным HP/MP/CP ! 2) Есть приглашение на эвенты EventRegPopUp = True 3) Не нашел решения ( появился вопрос 4) Реально ли добавить проф окно при 20/40/76 без npc, как понял это в ядро надо, нельзя его без ядра реализовать ? или если есть скрипт поделитесь Спойлер package scripts.commands.voicedcommandhandlers; import net.sf.l2j.Config; import net.sf.l2j.gameserver.datatables.SkillTable; import net.sf.l2j.gameserver.model.L2Skill; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.datatables.xml.CharTemplateData; import net.sf.l2j.gameserver.model.base.ClassId; import net.sf.l2j.gameserver.model.base.ClassLevel; import net.sf.l2j.gameserver.model.base.PlayerClass; import net.sf.l2j.gameserver.model.quest.Quest; import net.sf.l2j.gameserver.network.SystemMessageId; import net.sf.l2j.gameserver.network.serverpackets.ActionFailed; import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse; import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage; public class ClassMass implements IVoicedCommandHandler { private static final String[] VOICED_COMMANDS = { "classmaster","change_class"}; public boolean useVoicedCommand(String command, L2PcInstance player, String target) { if (command.equalsIgnoreCase("classmaster")) { ClassId classId = player.getClassId(); int jobLevel = 0; int level = player.getLevel(); ClassLevel lvl = PlayerClass.values()[classId.getId()].getLevel(); switch (lvl) { case First:jobLevel = 1;break; case Second:jobLevel = 2;break; case Third:jobLevel = 3;break; default:jobLevel = 4; } if (player.isGM()) showChatWindowChooseClass(player); else if (((level >= 20 && jobLevel == 1) || (level >= 40 && jobLevel == 2)) && Config.ALLOW_CLASS_MASTER) showChatWindow(player, classId.getId()); else if (level >= 76 && Config.ALLOW_CLASS_MASTER && classId.getId() < 88) { for (int i = 0; i < SECONDN_CLASS_IDS.length; i++) { if (classId.getId() == SECONDN_CLASS_IDS) { NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); StringBuilder sb = new StringBuilder(); sb.append("<html><body<table width=200>"); sb.append("<tr><td><center>" + CharTemplateData.getInstance().getClassNameById(player.getClassId().getId()) + " Class Master:</center></td></tr>"); sb.append("<tr><td><br></td></tr>"); sb.append("<tr><td><a action=\"bypass -h npc_" + getObjectId() + "_change_class " + (88 + i) + "\">Advance to " + CharTemplateData.getInstance().getClassNameById(88 + i) + "</a></td></tr>"); sb.append("<tr><td><br></td></tr>"); sb.append("</table></body></html>"); html.setHtml(sb.toString()); player.sendPacket(html); break; } } } else { NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); StringBuilder sb = new StringBuilder(); sb.append("<html><body>"); switch (jobLevel) { case 1: sb.append("Come back here when you reach level 20 to change your class.<br>"); break; case 2: sb.append("Come back here when you reach level 40 to change your class.<br>"); break; case 3: sb.append("There are no more class changes for you.<br>"); break; } for (Quest q : Quest.findAllEvents()) sb.append("Event: <a action=\"bypass -h Quest " + q.getName() + "\">" + q.getDescr() + "</a><br>"); sb.append("</body></html>"); html.setHtml(sb.toString()); player.sendPacket(html); } player.sendPacket(ActionFailed.STATIC_PACKET); } else if (command.startsWith("change_class")) { int val = Integer.parseInt(command.substring(13)); ClassId classId = player.getClassId(); int level = player.getLevel(); int jobLevel = 0; int newJobLevel = 0; ClassLevel lvlnow = PlayerClass.values()[classId.getId()].getLevel(); if (player.isGM()) { changeClass(player, val); player.rewardSkills(); if (val >= 88) player.sendPacket(SystemMessageId.THIRD_CLASS_TRANSFER); else player.sendPacket(SystemMessageId.CLASS_TRANSFER); NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); StringBuilder sb = new StringBuilder(); sb.append("<html><body>"); sb.append("You have now become a <font color=\"LEVEL\">" + CharTemplateData.getInstance().getClassNameById(player.getClassId().getId()) + "</font>."); sb.append("</body></html>"); html.setHtml(sb.toString()); player.sendPacket(html); return; } switch (lvlnow) { case First: jobLevel = 1; break; case Second: jobLevel = 2; break; case Third: jobLevel = 3; break; default: jobLevel = 4; } if (jobLevel == 4) return; // no more job changes ClassLevel lvlnext = PlayerClass.values()[val].getLevel(); switch (lvlnext) { case First: newJobLevel = 1; break; case Second: newJobLevel = 2; break; case Third: newJobLevel = 3; break; default: newJobLevel = 4; } // prevents changing between same level jobs if (newJobLevel != jobLevel + 1) return; if (level < 20 && newJobLevel > 1) return; if (level < 40 && newJobLevel > 2) return; if (level < 75 && newJobLevel > 3) return; changeClass(player, val); player.rewardSkills(); if (val >= 88) player.sendPacket(SystemMessageId.THIRD_CLASS_TRANSFER); // system sound 3rd occupation else player.sendPacket(SystemMessageId.CLASS_TRANSFER); // system sound for 1st and 2nd occupation player.broadcastPacket(new MagicSkillUse(player, player, 5103, 1, 1000, 0)); HtmlShow(player); checks(player); checkAutoEq(player,newJobLevel); } return true; } private void changeClass(L2PcInstance player, int val) { final ClassId currentClassId = player.getClassId(); if (getMinLevel(currentClassId.level()) > player.getLevel()) return; if (!validateClassId(currentClassId, val)) return; player.setClassId(val); if (player.isSubClassActive()){player.getSubClasses().get(player.getClassIndex()).setClassId(player.getActiveClass());} else { ClassId classId = ClassId.getClassIdByOrdinal(player.getActiveClass()); if (classId.getParent() != null){while (classId.level() == 0){classId = classId.getParent();}} player.setBaseClass(classId); } player.broadcastUserInfo(); } public String[] getVoicedCommandList(){return VOICED_COMMANDS;} } Изменено 1 августа, 2020 пользователем 0000 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты