Перейти к содержанию
Авторизация  
saymyname

.acp как соулшоты

Рекомендуемые сообщения

Все привет, на форуме не давно, хотел бы узнать как можно реализовать acp как соулшоты, на люцероподобных сборках. Спасибо.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все привет, на форуме не давно, хотел бы узнать как можно реализовать acp как соулшоты, на люцероподобных сборках. Спасибо.

Можно взять те же файлы от сосок (автоюз) и немного отредактировать их, вставив вместо id сосок - id банок

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это делается на уровне ядра?или в датапаке?

Изменено пользователем saymyname
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это делается на уровне ядра?или в датапаке?

ядра. но можно и в дате сделать, если есть возможность внедрять скрипты. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно взять те же файлы от сосок (автоюз) и немного отредактировать их, вставив вместо id сосок - id банок

а проверки на уровни ЦП ХП И МП при этом уже не нужны?

 

давайте еще таким методом далее грузить сервер чи не пофиг то , зачем геморой ловить и писать нормальный АЦП с хандлерами и остальными проверками , чи не пох как гнеться все , один фиг сервера то не собирают крупные онлайны

 

а итог мы слышем в свою сторону текст е.....ть ты рукожоп и бла бла , ясное дело что делать от балды может каждый (и так сойдет)

 

 

Вы вроде бы не глупый человек  зачем же советуете такую муть

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на мхсе в шаре лежит скрипт для использования банок мп/хп/цп с панели как соски, запилено как я помню под л2ж, но переделать труда не составит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а проверки на уровни ЦП ХП И МП при этом уже не нужны?

 

давайте еще таким методом далее грузить сервер чи не пофиг то , зачем геморой ловить и писать нормальный АЦП с хандлерами и остальными проверками , чи не пох как гнеться все , один фиг сервера то не собирают крупные онлайны

 

а итог мы слышем в свою сторону текст е.....ть ты рукожоп и бла бла , ясное дело что делать от балды может каждый (и так сойдет)

 

 

Вы вроде бы не глупый человек  зачем же советуете такую муть

Можно взять те же файлы от сосок (автоюз) и немного отредактировать их, вставив вместо id сосок - id банок

 

Естественно не тупо менять ID предмета и всё.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно взять те же файлы от сосок (автоюз) и немного отредактировать их, вставив вместо id сосок - id банок

 

Естественно не тупо менять ID предмета и всё.

Ага, тогда уж проще взять тогл скилы, да? :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ага, тогда уж проще взять тогл скилы, да? :D

не с 0 же делаешь. тем более в шар есть. это реально проще чем писать команду .autocp. Меньше ограничений ставить придется (т.к. в тогл скилах это уже включено)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Реализация 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;
+ }
+
+ 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;
  }
 
 

 

 

Изменено пользователем Kopwnz
  • Upvote 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на тогглах как раз таки и самый простой и быстрый способ запилить нормальное ацп

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на тогглах как раз таки и самый простой и быстрый способ запилить нормальное ацп

Да, но где возможность настройки задержки и мин. кол-ва ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Реализация 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;
+ }
+
+ 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;
  }
 
 

 

 

Что такое + и - ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все привет, на форуме не давно, хотел бы узнать как можно реализовать acp как соулшоты, на люцероподобных сборках. Спасибо.

Тут есть скрипт 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, но где возможность настройки задержки и мин. кол-ва ?

не очень твой вопрос понял если честно.

 

5722846d0a4c389e76006a28c06042e5.jpg

 

на скилл-тоггл повешен хэндлер скилла, в котором чекаются все условия дял применения и собственно говоря происходит применение бутылок

а за периодичность проверок сам тоггл отвечает

 

чисто для примера покажу часть моей реализации

 

вот к примеру сами скиллы

	<skill id="90081" levels="1" name="Auto Use HP Potion">
		<set name="icon" val="icon.etc_potion_red_i00" />
		<set name="magicLevel" val="85" />
		<set name="target" val="SELF" />
		<set name="skillType" val="CONT" />
		<set name="operateType" val="OP_TOGGLE" />
		<set name="isSaveable" val="false" />
		<set name="protectType" val="DEATH;REFLECTION;SUBCLASS;CANCEL;SELF_DISPEL" />
		<for>
			<effect count="0x7fffffff" name="Handler" time="0.333" val="1" />
		</for>
	</skill>
	<skill id="90082" levels="1" name="Auto Use CP Potion">
		<set name="icon" val="icon.etc_potion_yellow_i00" />
		<set name="magicLevel" val="85" />
		<set name="target" val="SELF" />
		<set name="skillType" val="CONT" />
		<set name="operateType" val="OP_TOGGLE" />
		<set name="isSaveable" val="false" />
		<set name="protectType" val="DEATH;REFLECTION;SUBCLASS;CANCEL;SELF_DISPEL" />
		<for>
			<effect count="0x7fffffff" name="Handler" time="0.333" val="2" />
		</for>
	</skill>
	<skill id="90083" levels="1" name="Auto Use MP Potion">
		<set name="icon" val="icon.etc_potion_blue_i00" />
		<set name="magicLevel" val="85" />
		<set name="target" val="SELF" />
		<set name="skillType" val="CONT" />
		<set name="operateType" val="OP_TOGGLE" />
		<set name="isSaveable" val="false" />
		<set name="protectType" val="DEATH;REFLECTION;SUBCLASS;CANCEL;SELF_DISPEL" />
		<for>
			<effect count="0x7fffffff" name="Handler" time="0.333" val="3" />
		</for>
	</skill>
с периодичностью в 333мс дергает хэндлер скилла, где и происходят проверки и использование.

 

вот этот хэндлер

package custom.auto_use;

import handler.skills.ScriptSkillEffect;
import l2p.gameserver.config.CustomConfig;
import l2p.gameserver.model.Creature;
import l2p.gameserver.model.Effect;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.items.ItemInstance;
import l2p.gameserver.utils.ItemUtils;

/**
 * @[member='Authority'] Gaikotsu
 */
public class AutoUseSkill extends ScriptSkillEffect
{
	private static final int[] _skillIds = { AutoUse.AU_HP_POTION.getId(), AutoUse.AU_CP_POTION.getId(), AutoUse.AU_MP_POTION.getId() };

	@[member='override']
	public boolean checkCondition(Effect effect, Creature caster, Creature target)
	{
		if (!CustomConfig.AUTO_USE_ENABLED)
			return false;

		Player player = (Player) caster;

		if (player == null)
			return false;

		if (!AutoUse.isAllowed(player))
			return false;

		if (AutoUse.getPotion(player, (int) effect.calc()) == null)
		{
			player.sendPopupMessage("Активация невозможна по причине отсутствия подходящих зелий.");
			return false;
		}

		return true;
	}

	@[member='override']
	public boolean onActionTime(Effect effect, Creature caster, Creature target)
	{
		if (caster == null)
			return false;

		Player player = (Player) caster;

		if (!AutoUse.checkPlayer(player))
			return true;

		AutoUseData data = AutoUse.getData(player);

		if (data == null)
			return false;

		int type = (int) effect.calc();

		switch (type)
		{
			case AutoUse.HP_POTION:
				if (player.getCurrentHpRatio() > data.getHpRatio())
					return true;

				break;

			case AutoUse.CP_POTION:
				if (player.getCurrentCpRatio() > data.getCpRatio())
					return true;

				break;

			case AutoUse.MP_POTION:
				if (player.getCurrentMpRatio() > data.getMpRatio())
					return true;

				break;

			default:
				return false;
		}

		ItemInstance potion = AutoUse.getPotion(player, type);

		if (potion == null)
		{
			player.sendMessage("Зелья закончились. Автоиспользование отключается.");
			return false;
		}

		ItemUtils.useItem(player, potion, false, false, false);
		return true;
	}

	@[member='override']
	public int[] getSkillIds()
	{
		return _skillIds;
	}
}
класс AutoUse и другие задействованные не дам - его если что додумывайте сами, он по логике достаточно простой :)

 

ну а для настроек порога срабатывания заведена voiced-команда, в которой можно указать % при котором начинают юзаться соответсвующие бутылки + эта же команда показывает список всех разрешенных для использования банок и их количество

 

42d9185d5d6a557cc86d2b8e2ef0f50d.png21b9e57e19b44acd3dfed4682732a6e1.png

 

З.Ы. если что полный пример реализации есть на конкурирующем форуме (о котором многие знают), который я не буду указывать по причине нежелания получить предупреждение/бан.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не очень твой вопрос понял если честно.

 

5722846d0a4c389e76006a28c06042e5.jpg

 

на скилл-тоггл повешен хэндлер скилла, в котором чекаются все условия дял применения и собственно говоря происходит применение бутылок

а за периодичность проверок сам тоггл отвечает

 

чисто для примера покажу часть моей реализации

 

вот к примеру сами скиллы

	<skill id="90081" levels="1" name="Auto Use HP Potion">
		<set name="icon" val="icon.etc_potion_red_i00" />
		<set name="magicLevel" val="85" />
		<set name="target" val="SELF" />
		<set name="skillType" val="CONT" />
		<set name="operateType" val="OP_TOGGLE" />
		<set name="isSaveable" val="false" />
		<set name="protectType" val="DEATH;REFLECTION;SUBCLASS;CANCEL;SELF_DISPEL" />
		<for>
			<effect count="0x7fffffff" name="Handler" time="0.333" val="1" />
		</for>
	</skill>
	<skill id="90082" levels="1" name="Auto Use CP Potion">
		<set name="icon" val="icon.etc_potion_yellow_i00" />
		<set name="magicLevel" val="85" />
		<set name="target" val="SELF" />
		<set name="skillType" val="CONT" />
		<set name="operateType" val="OP_TOGGLE" />
		<set name="isSaveable" val="false" />
		<set name="protectType" val="DEATH;REFLECTION;SUBCLASS;CANCEL;SELF_DISPEL" />
		<for>
			<effect count="0x7fffffff" name="Handler" time="0.333" val="2" />
		</for>
	</skill>
	<skill id="90083" levels="1" name="Auto Use MP Potion">
		<set name="icon" val="icon.etc_potion_blue_i00" />
		<set name="magicLevel" val="85" />
		<set name="target" val="SELF" />
		<set name="skillType" val="CONT" />
		<set name="operateType" val="OP_TOGGLE" />
		<set name="isSaveable" val="false" />
		<set name="protectType" val="DEATH;REFLECTION;SUBCLASS;CANCEL;SELF_DISPEL" />
		<for>
			<effect count="0x7fffffff" name="Handler" time="0.333" val="3" />
		</for>
	</skill>
с периодичностью в 333мс дергает хэндлер скилла, где и происходят проверки и использование.

 

вот этот хэндлер

package custom.auto_use;

import handler.skills.ScriptSkillEffect;
import l2p.gameserver.config.CustomConfig;
import l2p.gameserver.model.Creature;
import l2p.gameserver.model.Effect;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.items.ItemInstance;
import l2p.gameserver.utils.ItemUtils;

/**
 * @[member='Authority'] Gaikotsu
 */
public class AutoUseSkill extends ScriptSkillEffect
{
	private static final int[] _skillIds = { AutoUse.AU_HP_POTION.getId(), AutoUse.AU_CP_POTION.getId(), AutoUse.AU_MP_POTION.getId() };

	@[member='override']
	public boolean checkCondition(Effect effect, Creature caster, Creature target)
	{
		if (!CustomConfig.AUTO_USE_ENABLED)
			return false;

		Player player = (Player) caster;

		if (player == null)
			return false;

		if (!AutoUse.isAllowed(player))
			return false;

		if (AutoUse.getPotion(player, (int) effect.calc()) == null)
		{
			player.sendPopupMessage("Активация невозможна по причине отсутствия подходящих зелий.");
			return false;
		}

		return true;
	}

	@[member='override']
	public boolean onActionTime(Effect effect, Creature caster, Creature target)
	{
		if (caster == null)
			return false;

		Player player = (Player) caster;

		if (!AutoUse.checkPlayer(player))
			return true;

		AutoUseData data = AutoUse.getData(player);

		if (data == null)
			return false;

		int type = (int) effect.calc();

		switch (type)
		{
			case AutoUse.HP_POTION:
				if (player.getCurrentHpRatio() > data.getHpRatio())
					return true;

				break;

			case AutoUse.CP_POTION:
				if (player.getCurrentCpRatio() > data.getCpRatio())
					return true;

				break;

			case AutoUse.MP_POTION:
				if (player.getCurrentMpRatio() > data.getMpRatio())
					return true;

				break;

			default:
				return false;
		}

		ItemInstance potion = AutoUse.getPotion(player, type);

		if (potion == null)
		{
			player.sendMessage("Зелья закончились. Автоиспользование отключается.");
			return false;
		}

		ItemUtils.useItem(player, potion, false, false, false);
		return true;
	}

	@[member='override']
	public int[] getSkillIds()
	{
		return _skillIds;
	}
}
класс AutoUse и другие задействованные не дам - его если что додумывайте сами, он по логике достаточно простой :)

 

ну а для настроек порога срабатывания заведена voiced-команда, в которой можно указать % при котором начинают юзаться соответсвующие бутылки + эта же команда показывает список всех разрешенных для использования банок и их количество

 

42d9185d5d6a557cc86d2b8e2ef0f50d.png21b9e57e19b44acd3dfed4682732a6e1.png

 

З.Ы. если что полный пример реализации есть на конкурирующем форуме (о котором многие знают), который я не буду указывать по причине нежелания получить предупреждение/бан.

 

Как раз то, о чем я спрашивал. Спасибо за ответ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...