SummonItems.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. /*
  2. * This program is free software: you can redistribute it and/or modify it under
  3. * the terms of the GNU General Public License as published by the Free Software
  4. * Foundation, either version 3 of the License, or (at your option) any later
  5. * version.
  6. *
  7. * This program is distributed in the hope that it will be useful, but WITHOUT
  8. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10. * details.
  11. *
  12. * You should have received a copy of the GNU General Public License along with
  13. * this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. /**
  16. *
  17. * @author FBIagent
  18. *
  19. */
  20. package net.sf.l2j.gameserver.handler.itemhandlers;
  21. import net.sf.l2j.gameserver.ThreadPoolManager;
  22. import net.sf.l2j.gameserver.datatables.NpcTable;
  23. import net.sf.l2j.gameserver.datatables.SummonItemsData;
  24. import net.sf.l2j.gameserver.handler.IItemHandler;
  25. import net.sf.l2j.gameserver.idfactory.IdFactory;
  26. import net.sf.l2j.gameserver.model.L2ItemInstance;
  27. import net.sf.l2j.gameserver.model.L2Spawn;
  28. import net.sf.l2j.gameserver.model.L2SummonItem;
  29. import net.sf.l2j.gameserver.model.L2World;
  30. import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  31. import net.sf.l2j.gameserver.model.actor.instance.L2PetInstance;
  32. import net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance;
  33. import net.sf.l2j.gameserver.model.entity.TvTEvent;
  34. import net.sf.l2j.gameserver.network.SystemMessageId;
  35. import net.sf.l2j.gameserver.network.serverpackets.MagicSkillLaunched;
  36. import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse;
  37. import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
  38. import net.sf.l2j.gameserver.templates.L2NpcTemplate;
  39. import net.sf.l2j.gameserver.util.FloodProtector;
  40. public class SummonItems implements IItemHandler
  41. {
  42. /**
  43. *
  44. * @see net.sf.l2j.gameserver.handler.IItemHandler#useItem(net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance, net.sf.l2j.gameserver.model.L2ItemInstance)
  45. */
  46. public void useItem(L2PlayableInstance playable, L2ItemInstance item)
  47. {
  48. if (!(playable instanceof L2PcInstance))
  49. return;
  50. if (!TvTEvent.onItemSummon(playable.getObjectId()))
  51. return;
  52. L2PcInstance activeChar = (L2PcInstance) playable;
  53. if (!FloodProtector.getInstance().tryPerformAction(activeChar.getObjectId(), FloodProtector.PROTECTED_ITEMPETSUMMON))
  54. return;
  55. if (activeChar.isSitting())
  56. {
  57. activeChar.sendPacket(new SystemMessage(SystemMessageId.CANT_MOVE_SITTING));
  58. return;
  59. }
  60. if (activeChar.inObserverMode())
  61. return;
  62. if (activeChar.isInOlympiadMode())
  63. {
  64. activeChar.sendPacket(new SystemMessage(SystemMessageId.THIS_ITEM_IS_NOT_AVAILABLE_FOR_THE_OLYMPIAD_EVENT));
  65. return;
  66. }
  67. L2SummonItem sitem = SummonItemsData.getInstance().getSummonItem(item.getItemId());
  68. if ((activeChar.getPet() != null || activeChar.isMounted()) && sitem.isPetSummon())
  69. {
  70. activeChar.sendPacket(new SystemMessage(SystemMessageId.YOU_ALREADY_HAVE_A_PET));
  71. return;
  72. }
  73. if (activeChar.isAttackingNow())
  74. {
  75. activeChar.sendPacket(new SystemMessage(SystemMessageId.YOU_CANNOT_SUMMON_IN_COMBAT));
  76. return;
  77. }
  78. if (activeChar.isCursedWeaponEquipped() && sitem.isPetSummon())
  79. {
  80. activeChar.sendPacket(new SystemMessage(SystemMessageId.STRIDER_CANT_BE_RIDDEN_WHILE_IN_BATTLE));
  81. return;
  82. }
  83. int npcID = sitem.getNpcId();
  84. if (npcID == 0)
  85. return;
  86. L2NpcTemplate npcTemplate = NpcTable.getInstance().getTemplate(npcID);
  87. if (npcTemplate == null)
  88. return;
  89. switch (sitem.getType())
  90. {
  91. case 0: // static summons (like Christmas tree)
  92. try
  93. {
  94. L2Spawn spawn = new L2Spawn(npcTemplate);
  95. if (spawn == null)
  96. return;
  97. spawn.setId(IdFactory.getInstance().getNextId());
  98. spawn.setLocx(activeChar.getX());
  99. spawn.setLocy(activeChar.getY());
  100. spawn.setLocz(activeChar.getZ());
  101. L2World.getInstance().storeObject(spawn.spawnOne(true));
  102. activeChar.destroyItem("Summon", item.getObjectId(), 1, null, false);
  103. activeChar.sendMessage("Created " + npcTemplate.name + " at x: " + spawn.getLocx() + " y: " + spawn.getLocy() + " z: " + spawn.getLocz());
  104. }
  105. catch (Exception e)
  106. {
  107. activeChar.sendMessage("Target is not ingame.");
  108. }
  109. break;
  110. case 1: // pet summons
  111. L2PetInstance petSummon = L2PetInstance.spawnPet(npcTemplate, activeChar, item);
  112. if (petSummon == null)
  113. break;
  114. petSummon.setTitle(activeChar.getName());
  115. if (!petSummon.isRespawned())
  116. {
  117. petSummon.setCurrentHp(petSummon.getMaxHp());
  118. petSummon.setCurrentMp(petSummon.getMaxMp());
  119. petSummon.getStat().setExp(petSummon.getExpForThisLevel());
  120. petSummon.setCurrentFed(petSummon.getMaxFed());
  121. }
  122. petSummon.setRunning();
  123. if (!petSummon.isRespawned())
  124. petSummon.store();
  125. activeChar.setPet(petSummon);
  126. activeChar.sendPacket(new MagicSkillUse(activeChar, 2046, 1, 1000, 600000));
  127. activeChar.sendPacket(new SystemMessage(SystemMessageId.SUMMON_A_PET));
  128. L2World.getInstance().storeObject(petSummon);
  129. petSummon.spawnMe(activeChar.getX() + 50, activeChar.getY() + 100, activeChar.getZ());
  130. petSummon.startFeed(false);
  131. item.setEnchantLevel(petSummon.getLevel());
  132. ThreadPoolManager.getInstance().scheduleGeneral(new PetSummonFinalizer(activeChar, petSummon), 900);
  133. if (petSummon.getCurrentFed() <= 0)
  134. ThreadPoolManager.getInstance().scheduleGeneral(new PetSummonFeedWait(activeChar, petSummon), 60000);
  135. else
  136. petSummon.startFeed(false);
  137. break;
  138. case 2: // wyvern
  139. activeChar.mount(sitem.getNpcId(), item.getObjectId());
  140. break;
  141. case 3: // Great Wolf
  142. activeChar.mount(sitem.getNpcId(), item.getObjectId());
  143. break;
  144. }
  145. }
  146. static class PetSummonFeedWait implements Runnable
  147. {
  148. private L2PcInstance _activeChar;
  149. private L2PetInstance _petSummon;
  150. PetSummonFeedWait(L2PcInstance activeChar, L2PetInstance petSummon)
  151. {
  152. _activeChar = activeChar;
  153. _petSummon = petSummon;
  154. }
  155. public void run()
  156. {
  157. try
  158. {
  159. if (_petSummon.getCurrentFed() <= 0)
  160. _petSummon.unSummon(_activeChar);
  161. else
  162. _petSummon.startFeed(false);
  163. }
  164. catch (Throwable e)
  165. {
  166. }
  167. }
  168. }
  169. static class PetSummonFinalizer implements Runnable
  170. {
  171. private L2PcInstance _activeChar;
  172. private L2PetInstance _petSummon;
  173. PetSummonFinalizer(L2PcInstance activeChar, L2PetInstance petSummon)
  174. {
  175. _activeChar = activeChar;
  176. _petSummon = petSummon;
  177. }
  178. public void run()
  179. {
  180. try
  181. {
  182. _activeChar.sendPacket(new MagicSkillLaunched(_activeChar, 2046, 1));
  183. _petSummon.setFollowStatus(true);
  184. _petSummon.setShowSummonAnimation(false);
  185. }
  186. catch (Throwable e)
  187. {
  188. }
  189. }
  190. }
  191. /**
  192. *
  193. * @see net.sf.l2j.gameserver.handler.IItemHandler#getItemIds()
  194. */
  195. public int[] getItemIds()
  196. {
  197. return SummonItemsData.getInstance().itemIDs();
  198. }
  199. }