SummonItems.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  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. public void useItem(L2PlayableInstance playable, L2ItemInstance item)
  43. {
  44. if (!(playable instanceof L2PcInstance))
  45. return;
  46. if (!TvTEvent.onItemSummon(playable.getObjectId()))
  47. return;
  48. L2PcInstance activeChar = (L2PcInstance)playable;
  49. if ( !FloodProtector.getInstance().tryPerformAction(activeChar.getObjectId(), FloodProtector.PROTECTED_ITEMPETSUMMON) ) return;
  50. if(activeChar.isSitting())
  51. {
  52. activeChar.sendPacket(new SystemMessage(SystemMessageId.CANT_MOVE_SITTING));
  53. return;
  54. }
  55. if (activeChar.inObserverMode())
  56. return;
  57. if (activeChar.isInOlympiadMode())
  58. {
  59. activeChar.sendPacket(new SystemMessage(SystemMessageId.THIS_ITEM_IS_NOT_AVAILABLE_FOR_THE_OLYMPIAD_EVENT));
  60. return;
  61. }
  62. L2SummonItem sitem = SummonItemsData.getInstance().getSummonItem(item.getItemId());
  63. if ((activeChar.getPet() != null || activeChar.isMounted()) && sitem.isPetSummon())
  64. {
  65. activeChar.sendPacket(new SystemMessage(SystemMessageId.YOU_ALREADY_HAVE_A_PET));
  66. return;
  67. }
  68. if (activeChar.isAttackingNow())
  69. {
  70. activeChar.sendPacket(new SystemMessage(SystemMessageId.YOU_CANNOT_SUMMON_IN_COMBAT));
  71. return;
  72. }
  73. if (activeChar.isCursedWeaponEquipped() && sitem.isPetSummon())
  74. {
  75. activeChar.sendPacket(new SystemMessage(SystemMessageId.STRIDER_CANT_BE_RIDDEN_WHILE_IN_BATTLE));
  76. return;
  77. }
  78. int npcID = sitem.getNpcId();
  79. if (npcID == 0)
  80. return;
  81. L2NpcTemplate npcTemplate = NpcTable.getInstance().getTemplate(npcID);
  82. if (npcTemplate == null)
  83. return;
  84. switch (sitem.getType())
  85. {
  86. case 0: // static summons (like Christmas tree)
  87. try
  88. {
  89. L2Spawn spawn = new L2Spawn(npcTemplate);
  90. if (spawn == null)
  91. return;
  92. spawn.setId(IdFactory.getInstance().getNextId());
  93. spawn.setLocx(activeChar.getX());
  94. spawn.setLocy(activeChar.getY());
  95. spawn.setLocz(activeChar.getZ());
  96. L2World.getInstance().storeObject(spawn.spawnOne(true));
  97. activeChar.destroyItem("Summon", item.getObjectId(), 1, null, false);
  98. activeChar.sendMessage("Created " + npcTemplate.name + " at x: " + spawn.getLocx() + " y: " + spawn.getLocy() + " z: " + spawn.getLocz());
  99. }
  100. catch (Exception e)
  101. {
  102. activeChar.sendMessage("Target is not ingame.");
  103. }
  104. break;
  105. case 1: // pet summons
  106. L2PetInstance petSummon = L2PetInstance.spawnPet(npcTemplate, activeChar, item);
  107. if (petSummon == null)
  108. break;
  109. petSummon.setTitle(activeChar.getName());
  110. if (!petSummon.isRespawned())
  111. {
  112. petSummon.setCurrentHp(petSummon.getMaxHp());
  113. petSummon.setCurrentMp(petSummon.getMaxMp());
  114. petSummon.getStat().setExp(petSummon.getExpForThisLevel());
  115. petSummon.setCurrentFed(petSummon.getMaxFed());
  116. }
  117. petSummon.setRunning();
  118. if (!petSummon.isRespawned())
  119. petSummon.store();
  120. activeChar.setPet(petSummon);
  121. activeChar.sendPacket(new MagicSkillUse(activeChar, 2046, 1, 1000, 600000));
  122. activeChar.sendPacket(new SystemMessage(SystemMessageId.SUMMON_A_PET));
  123. L2World.getInstance().storeObject(petSummon);
  124. petSummon.spawnMe(activeChar.getX()+50, activeChar.getY()+100, activeChar.getZ());
  125. petSummon.startFeed(false);
  126. item.setEnchantLevel(petSummon.getLevel());
  127. ThreadPoolManager.getInstance().scheduleGeneral(new PetSummonFinalizer(activeChar, petSummon), 900);
  128. if (petSummon.getCurrentFed() <= 0)
  129. ThreadPoolManager.getInstance().scheduleGeneral(new PetSummonFeedWait(activeChar, petSummon), 60000);
  130. else
  131. petSummon.startFeed(false);
  132. break;
  133. case 2: // wyvern
  134. activeChar.mount(sitem.getNpcId(), item.getObjectId());
  135. break;
  136. case 3: // Great Wolf
  137. activeChar.mount(sitem.getNpcId(), item.getObjectId());
  138. break;
  139. }
  140. }
  141. static class PetSummonFeedWait implements Runnable
  142. {
  143. private L2PcInstance _activeChar;
  144. private L2PetInstance _petSummon;
  145. PetSummonFeedWait(L2PcInstance activeChar, L2PetInstance petSummon)
  146. {
  147. _activeChar = activeChar;
  148. _petSummon = petSummon;
  149. }
  150. public void run()
  151. {
  152. try
  153. {
  154. if (_petSummon.getCurrentFed() <= 0 )
  155. _petSummon.unSummon(_activeChar);
  156. else
  157. _petSummon.startFeed(false);
  158. }
  159. catch (Throwable e)
  160. {
  161. }
  162. }
  163. }
  164. static class PetSummonFinalizer implements Runnable
  165. {
  166. private L2PcInstance _activeChar;
  167. private L2PetInstance _petSummon;
  168. PetSummonFinalizer(L2PcInstance activeChar, L2PetInstance petSummon)
  169. {
  170. _activeChar = activeChar;
  171. _petSummon = petSummon;
  172. }
  173. public void run()
  174. {
  175. try
  176. {
  177. _activeChar.sendPacket(new MagicSkillLaunched(_activeChar, 2046, 1));
  178. _petSummon.setFollowStatus(true);
  179. _petSummon.setShowSummonAnimation(false);
  180. }
  181. catch (Throwable e)
  182. {
  183. }
  184. }
  185. }
  186. public int[] getItemIds()
  187. {
  188. return SummonItemsData.getInstance().itemIDs();
  189. }
  190. }