4atty 1 Опубликовано 23 сентября, 2018 Можно ли добавить .acp бесплатно на пв сборку?) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Demoncool 1110 Опубликовано 23 сентября, 2018 1000р 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
unroot 221 Опубликовано 23 сентября, 2018 5 часов назад, 4atty сказал: Можно ли добавить .acp бесплатно на пв сборку?) 3 часа назад, Demoncool сказал: 1000р Ваш ответ флуд, автором четко было написано "Бесплатно". 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
bogus 10 Опубликовано 3 марта, 2019 В 23.09.2018 в 21:43, 4atty сказал: Можно ли добавить .acp бесплатно на пв сборку?) Тоже интересует UP Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
HtmlSqlXml 11 Опубликовано 3 марта, 2019 В 01.04.2017 в 11:00, Kopwnz сказал: Реализация acp как соски ОТКРЫТЬ (Скрыть контент) Index: data/xml/items/0700-0799.xml =================================================================== --- data/xml/items/0700-0799.xml +++ data/xml/items/0700-0799.xml (working copy) @@ -329,7 +329,7 @@ <set name="price" val="2000" /> <set name="is_stackable" val="true" /> <set name="is_oly_restricted" val="true" /> - <set name="handler" val="ItemSkills" /> + <set name="handler" val="SoulShots" /> <set name="item_skill" val="2279-2" /> <set name="use_condition" val="{{uc_transmode_exclude;{tt_flying}}}" /> </item> Index: data/xml/items/1500-1599.xml =================================================================== --- data/xml/items/1500-1599.xml (revision 112) +++ data/xml/items/1500-1599.xml (working copy) @@ -265,7 +265,7 @@ <set name="reuse_delay" val="10000" /> <set name="is_stackable" val="true" /> <set name="is_oly_restricted" val="true" /> - <set name="handler" val="ItemSkills" /> + <set name="handler" val="SoulShots" /> <set name="item_skill" val="2037-1" /> <set name="use_condition" val="{{uc_transmode_exclude;{tt_flying}}}" /> <set name="shared_reuse_group" val="10" /> Index: data/xml/items/5500-5599.xml =================================================================== --- data/xml/items/5500-5599.xml +++ data/xml/items/5500-5599.xml (working copy) @@ -673,7 +673,7 @@ <set name="reuse_delay" val="500" /> <set name="is_stackable" val="true" /> <set name="is_oly_restricted" val="true" /> - <set name="handler" val="ItemSkills" /> + <set name="handler" val="SoulShots" /> <set name="item_skill" val="2166-2" /> </item> <item id="5593" type="EtcItem" name="SP Scroll: Low Grade"> Index: java/net/sf/l2j/gameserver/handler/itemhandlers/SoulShots.java =================================================================== --- java/net/sf/l2j/gameserver/handler/itemhandlers/SoulShots.java +++ java/net/sf/l2j/gameserver/handler/itemhandlers/SoulShots.java (working copy) @@ -14,18 +14,24 @@ */ package net.sf.l2j.gameserver.handler.itemhandlers; +import net.sf.l2j.gameserver.ThreadPoolManager; import net.sf.l2j.gameserver.handler.IItemHandler; import net.sf.l2j.gameserver.model.L2ItemInstance; import net.sf.l2j.gameserver.model.ShotType; import net.sf.l2j.gameserver.model.actor.L2Playable; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.network.SystemMessageId; +import net.sf.l2j.gameserver.network.serverpackets.ExAutoSoulShot; import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse; import net.sf.l2j.gameserver.templates.item.L2Weapon; import net.sf.l2j.gameserver.util.Broadcast; public class SoulShots implements IItemHandler { + private static final int MANA_POT_CD = 2, + HEALING_POT_CD = 11, // DO NOT PUT LESS THAN 10 + CP_POT_CD = 2; + private static final int[] SKILL_IDS = { 2039, @@ -47,6 +53,108 @@ final L2Weapon weaponItem = activeChar.getActiveWeaponItem(); final int itemId = item.getItemId(); + if (itemId == 728 || itemId == 1539 || itemId == 5592) + { + switch (itemId) + { + case 728: // mana potion + { + if (activeChar.isAutoPot(728)) + { + activeChar.sendPacket(new ExAutoSoulShot(728, 0)); + activeChar.sendMessage("Deactivated auto mana potions."); + activeChar.setAutoPot(728, null, false); + } + else + { + if (activeChar.getInventory().getItemByItemId(728) != null) + { + if (activeChar.getInventory().getItemByItemId(728).getCount() > 1) + { + activeChar.sendPacket(new ExAutoSoulShot(728, 1)); + activeChar.sendMessage("Activated auto mana potions."); + activeChar.setAutoPot(728, ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new AutoPot(728, activeChar), 1000, MANA_POT_CD*1000), true); + } + else + { + MagicSkillUse msu = new MagicSkillUse(activeChar, activeChar, 2279, 2, 0, 100); + activeChar.broadcastPacket(msu); + + ItemSkills is = new ItemSkills(); + is.useItem(activeChar, activeChar.getInventory().getItemByItemId(728), true); + } + } + } + + break; + } + case 1539: // greater healing potion + { + if (activeChar.isAutoPot(1539)) + { + activeChar.sendPacket(new ExAutoSoulShot(1539, 0)); + activeChar.sendMessage("Deactivated auto healing potions."); + activeChar.setAutoPot(1539, null, false); + } + else + { + if (activeChar.getInventory().getItemByItemId(1539) != null) + { + if (activeChar.getInventory().getItemByItemId(1539).getCount() > 1) + { + activeChar.sendPacket(new ExAutoSoulShot(1539, 1)); + activeChar.sendMessage("Activated auto healing potions."); + activeChar.setAutoPot(1539, ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new AutoPot(1539, activeChar), 1000, HEALING_POT_CD*1000), true); + } + else + { + MagicSkillUse msu = new MagicSkillUse(activeChar, activeChar, 2037, 1, 0, 100); + activeChar.broadcastPacket(msu); + + ItemSkills is = new ItemSkills(); + is.useItem(activeChar, activeChar.getInventory().getItemByItemId(1539), true); + } + } + } + + break; + } + case 5592: // greater cp potion + { + if (activeChar.isAutoPot(5592)) + { + activeChar.sendPacket(new ExAutoSoulShot(5592, 0)); + activeChar.sendMessage("Deactivated auto cp potions."); + activeChar.setAutoPot(5592, null, false); + } + else + { + if (activeChar.getInventory().getItemByItemId(5592) != null) + { + if (activeChar.getInventory().getItemByItemId(5592).getCount() > 1) + { + activeChar.sendPacket(new ExAutoSoulShot(5592, 1)); + activeChar.sendMessage("Activated auto cp potions."); + activeChar.setAutoPot(5592, ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new AutoPot(5592, activeChar), 1000, CP_POT_CD*1000), true); + } + else + { + MagicSkillUse msu = new MagicSkillUse(activeChar, activeChar, 2166, 2, 0, 100); + activeChar.broadcastPacket(msu); + + ItemSkills is = new ItemSkills(); + is.useItem(activeChar, activeChar.getInventory().getItemByItemId(5592), true); + } + } + } + + break; + } + } + + return; + } + // Check if soulshot can be used if (weaponInst == null || weaponItem.getSoulShotCount() == 0) { @@ -87,4 +195,76 @@ activeChar.sendPacket(SystemMessageId.ENABLED_SOULSHOT); Broadcast.toSelfAndKnownPlayersInRadiusSq(activeChar, new MagicSkillUse(activeChar, activeChar, SKILL_IDS[grade], 1, 0, 0), 360000); } + + private class AutoPot implements Runnable + { + private int id; + private L2PcInstance activeChar; + + public AutoPot(int id, L2PcInstance activeChar) + { + this.id = id; + this.activeChar = activeChar; + } + + @@override + public void run() + { + if (activeChar.getInventory().getItemByItemId(id) == null) + { + activeChar.sendPacket(new ExAutoSoulShot(id, 0)); + activeChar.setAutoPot(id, null, false); + return; + } + + switch (id) + { + case 728: + { + if (activeChar.getCurrentMp() < 0.70*activeChar.getMaxMp()) + { + MagicSkillUse msu = new MagicSkillUse(activeChar, activeChar, 2279, 2, 0, 100); + activeChar.broadcastPacket(msu); + + ItemSkills is = new ItemSkills(); + is.useItem(activeChar, activeChar.getInventory().getItemByItemId(728), true); + } + + break; + } + case 1539: + { + if (activeChar.getCurrentHp() < 0.95*activeChar.getMaxHp()) + { + MagicSkillUse msu = new MagicSkillUse(activeChar, activeChar, 2037, 1, 0, 100); + activeChar.broadcastPacket(msu); + + ItemSkills is = new ItemSkills(); + is.useItem(activeChar, activeChar.getInventory().getItemByItemId(1539), true); + } + + break; + } + case 5592: + { + if (activeChar.getCurrentCp() < 0.95*activeChar.getMaxCp()) + { + MagicSkillUse msu = new MagicSkillUse(activeChar, activeChar, 2166, 2, 0, 100); + activeChar.broadcastPacket(msu); + + ItemSkills is = new ItemSkills(); + is.useItem(activeChar, activeChar.getInventory().getItemByItemId(5592), true); + } + + break; + } + } + + if (activeChar.getInventory().getItemByItemId(id) == null) + { + activeChar.sendPacket(new ExAutoSoulShot(id, 0)); + activeChar.setAutoPot(id, null, false); + } + } + } } \ No newline at end of file Index: java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java =================================================================== --- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java +++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (working copy) @@ -251,6 +251,24 @@ */ public final class L2PcInstance extends L2Playable { + private Map<Integer, Future<?>> _autoPotTasks = new HashMap<>(); + + public boolean isAutoPot(int id) + { + return _autoPotTasks.keySet().contains(id); + } + + public void setAutoPot(int id, Future<?> task, boolean add) + { + if (add) + _autoPotTasks.put(id, task); + else + { + _autoPotTasks.get(id).cancel(true); + _autoPotTasks.remove(id); + } + } + private BuffShop buffShop = null; public void setBuffShop(BuffShop val) @@ -4321,6 +4339,22 @@ teleToLocation(184351, 20318, -3174, 0); } + if (isAutoPot(728)) + { + sendPacket(new ExAutoSoulShot(728, 0)); + setAutoPot(728, null, false); + } + if (isAutoPot(1539)) + { + sendPacket(new ExAutoSoulShot(1539, 0)); + setAutoPot(1539, null, false); + } + if (isAutoPot(5592)) + { + sendPacket(new ExAutoSoulShot(5592, 0)); + setAutoPot(5592, null, false); + } + return true; } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
HtmlSqlXml 11 Опубликовано 3 марта, 2019 (изменено) game/data/scripts/handlers/voice/ Спойлер /** * Created by L2jGroot team on 25.07.2015. */ package handlers.voice; import ru.catssoftware.gameserver.handler.IItemHandler; import ru.catssoftware.gameserver.handler.IVoicedCommandHandler; import ru.catssoftware.gameserver.handler.ItemHandler; import ru.catssoftware.gameserver.handler.VoicedCommandHandler; import ru.catssoftware.gameserver.model.L2ItemInstance; import ru.catssoftware.gameserver.model.actor.instance.L2PcInstance; import java.util.HashMap; public class Acp implements IVoicedCommandHandler { private static String[] commands = {"acpon", "acpoff"}; // *********************** ИД Банок private static int ID_HEAL_CP = 5592; private static int ID_HEAL_MP = 6036; private static int ID_HEAL_HP = 1539; // *********************** USE FULL // Включить / Выключить private static boolean ACP_ON = true; // Минимальный уровень, с которого можно использовать ACP private static int ACP_MIN_LVL = 0; // Указываеться в % уровень, с которого начинаем регенить private static int ACP_HP_LVL = 70; private static int ACP_CP_LVL = 70; private static int ACP_MP_LVL = 70; private static int ACP_MILI_SECONDS_FOR_LOOP = 1000; // Только для премиумов? private static boolean ACP_PREMIUM = false; // Что именно автоматически регеним private static boolean ACP_CP = true; private static boolean ACP_MP = true; private static boolean ACP_HP = true; private static HashMap<String, Thread> userAcpMap = new HashMap<String, Thread>(); // private volatile boolean acpUserOn = false; public static void main(String[] args) { VoicedCommandHandler.getInstance().registerVoicedCommandHandler(new Acp()); } public static Acp getInstance() { return null; } @Override public String getDescription(String command) { if (command.equals("acpon")) return "Включить автоматическое восстановление HP/CP/MP"; else if (command.equals("acpoff")) return "Выключить автоматическое восстановление HP/CP/MP"; return null; } @Override public String[] getVoicedCommandList() { return commands; } @Override public boolean useVoicedCommand(String command, L2PcInstance activeChar, String target) { // Есть ли такой вообще в мире if (activeChar == null) { return false; } if (command.equals("acpon")) { if (!ACP_ON) { activeChar.sendMessage("Функция отключена на сервере!"); return false; } else { if (userAcpMap.containsKey(activeChar.toString())) { activeChar.sendMessage("Уже включено!"); } else { activeChar.sendMessage("Acp включен!"); Thread t = new Thread(new AcpHealer(activeChar)); userAcpMap.put(activeChar.toString(), t); t.start(); return true; } } } else if (command.equals("acpoff")) { if (!userAcpMap.containsKey(activeChar.toString())) { activeChar.sendMessage("Не было включено"); } else { userAcpMap.remove(activeChar.toString()) //here we get thread and remove it from map .interrupt(); //and interrupt it activeChar.sendMessage("Отключено"); } } return false; } private class AcpHealer implements Runnable { L2PcInstance activeChar; public AcpHealer(L2PcInstance activeChar) { this.activeChar = activeChar; } @Override public void run() { try { while (true) { // Проверяем уровень if (activeChar.getLevel() >= ACP_MIN_LVL) { // Проверяем нужен ли нам премиум if (!(activeChar.getPremiumService() > 1 && ACP_PREMIUM)) { // Проверяем, есть ли у нас хотя бы одна банка чего-то L2ItemInstance cpBottle = activeChar.getInventory().getItemByItemId(ID_HEAL_CP); L2ItemInstance hpBottle = activeChar.getInventory().getItemByItemId(ID_HEAL_HP); L2ItemInstance mpBottle = activeChar.getInventory().getItemByItemId(ID_HEAL_MP); if (hpBottle != null && hpBottle.getCount() > 0) { // Проверяем наш уровень здоровья if ((activeChar.getStatus().getCurrentHp() / activeChar.getMaxHp()) * 100 < ACP_HP_LVL && ACP_HP) { IItemHandler handlerHP = ItemHandler.getInstance().getItemHandler(hpBottle.getItemId()); if (handlerHP != null) { handlerHP.useItem(activeChar, hpBottle); activeChar.sendMessage("ACP: Восстановлено HP"); } } // Проверяем наш уровень CP if (cpBottle != null && cpBottle.getCount() > 0) { if ((activeChar.getStatus().getCurrentCp() / activeChar.getMaxCp()) * 100 < ACP_CP_LVL && ACP_CP) { IItemHandler handlerCP = ItemHandler.getInstance().getItemHandler(cpBottle.getItemId()); if (handlerCP != null) { handlerCP.useItem(activeChar, cpBottle); activeChar.sendMessage("ACP: Восстановлено CP"); } } } // Проверяем наш уровень MP if (mpBottle != null && mpBottle.getCount() > 0) { if ((activeChar.getStatus().getCurrentMp() / activeChar.getMaxMp()) * 100 < ACP_MP_LVL && ACP_MP) { IItemHandler handlerMP = ItemHandler.getInstance().getItemHandler(mpBottle.getItemId()); if (handlerMP != null) { handlerMP.useItem(activeChar, mpBottle); activeChar.sendMessage("ACP: Восстановлено MP"); } } } } else { activeChar.sendMessage("У Вас нечем регениться"); return; } } else { activeChar.sendMessage("Доступно только премиум чарам!"); return; } } else { activeChar.sendMessage("Доступно только с " + ACP_MIN_LVL + " уровня!"); return; } Thread.sleep(ACP_MILI_SECONDS_FOR_LOOP); } } catch (InterruptedException e) { //nothing } catch (Exception e) { _log.warn(e.getMessage(), e); Thread.currentThread().interrupt(); } finally { userAcpMap.remove(activeChar.toString()); } } } } Изменено 3 марта, 2019 пользователем htmlslqxml Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
bogus 10 Опубликовано 3 марта, 2019 6 часов назад, htmlslqxml сказал: незнаю для какой это сборки но для ПВ врятли подойдет, по путям смотрю Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты