SummonItems.java 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  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. package handlers.itemhandlers;
  16. import java.util.logging.Level;
  17. import com.l2jserver.gameserver.ThreadPoolManager;
  18. import com.l2jserver.gameserver.datatables.NpcTable;
  19. import com.l2jserver.gameserver.datatables.SummonItemsData;
  20. import com.l2jserver.gameserver.handler.IItemHandler;
  21. import com.l2jserver.gameserver.model.L2Object;
  22. import com.l2jserver.gameserver.model.L2Spawn;
  23. import com.l2jserver.gameserver.model.L2SummonItem;
  24. import com.l2jserver.gameserver.model.actor.L2Npc;
  25. import com.l2jserver.gameserver.model.actor.L2Playable;
  26. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  27. import com.l2jserver.gameserver.model.actor.instance.L2PetInstance;
  28. import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
  29. import com.l2jserver.gameserver.model.entity.TvTEvent;
  30. import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
  31. import com.l2jserver.gameserver.network.SystemMessageId;
  32. import com.l2jserver.gameserver.network.serverpackets.MagicSkillLaunched;
  33. import com.l2jserver.gameserver.network.serverpackets.MagicSkillUse;
  34. import com.l2jserver.gameserver.network.serverpackets.PetItemList;
  35. import com.l2jserver.gameserver.network.serverpackets.SetupGauge;
  36. import com.l2jserver.gameserver.util.Broadcast;
  37. /**
  38. * UnAfraid: TODO: Rewrite me :D
  39. * @author FBIagent
  40. */
  41. public class SummonItems implements IItemHandler
  42. {
  43. @Override
  44. public boolean useItem(L2Playable playable, L2ItemInstance item, boolean forceUse)
  45. {
  46. if (!playable.isPlayer())
  47. {
  48. playable.sendPacket(SystemMessageId.ITEM_NOT_FOR_PETS);
  49. return false;
  50. }
  51. if (!TvTEvent.onItemSummon(playable.getObjectId()))
  52. {
  53. return false;
  54. }
  55. final L2PcInstance activeChar = playable.getActingPlayer();
  56. if (!activeChar.getFloodProtectors().getItemPetSummon().tryPerformAction("summon items"))
  57. {
  58. return false;
  59. }
  60. if (activeChar.isSitting())
  61. {
  62. activeChar.sendPacket(SystemMessageId.CANT_MOVE_SITTING);
  63. return false;
  64. }
  65. if (activeChar.getBlockCheckerArena() != -1)
  66. {
  67. return false;
  68. }
  69. if (activeChar.inObserverMode())
  70. {
  71. return false;
  72. }
  73. if (activeChar.isInOlympiadMode())
  74. {
  75. activeChar.sendPacket(SystemMessageId.THIS_ITEM_IS_NOT_AVAILABLE_FOR_THE_OLYMPIAD_EVENT);
  76. return false;
  77. }
  78. if (activeChar.isAllSkillsDisabled() || activeChar.isCastingNow())
  79. {
  80. return false;
  81. }
  82. final L2SummonItem sitem = SummonItemsData.getInstance().getSummonItem(item.getItemId());
  83. if ((activeChar.hasSummon() || activeChar.isMounted()) && sitem.isPetSummon())
  84. {
  85. activeChar.sendPacket(SystemMessageId.YOU_ALREADY_HAVE_A_PET);
  86. return false;
  87. }
  88. if (activeChar.isAttackingNow())
  89. {
  90. activeChar.sendPacket(SystemMessageId.YOU_CANNOT_SUMMON_IN_COMBAT);
  91. return false;
  92. }
  93. final int npcId = sitem.getNpcId();
  94. if (npcId == 0)
  95. {
  96. return false;
  97. }
  98. final L2NpcTemplate npcTemplate = NpcTable.getInstance().getTemplate(npcId);
  99. if (npcTemplate == null)
  100. {
  101. return false;
  102. }
  103. activeChar.stopMove(null, false);
  104. switch (sitem.getType())
  105. {
  106. case 0: // static summons (like Christmas tree)
  107. try
  108. {
  109. if (activeChar.destroyItem("Summon", item.getObjectId(), 1, null, false))
  110. {
  111. final L2Spawn spawn = new L2Spawn(npcTemplate);
  112. spawn.setLocx(activeChar.getX());
  113. spawn.setLocy(activeChar.getY());
  114. spawn.setLocz(activeChar.getZ());
  115. spawn.setInstanceId(activeChar.getInstanceId());
  116. spawn.stopRespawn();
  117. final L2Npc npc = spawn.spawnOne(true);
  118. npc.setSummoner(activeChar);
  119. npc.setTitle(activeChar.getName());
  120. npc.setIsRunning(false); // broadcast info
  121. if (sitem.getDespawnDelay() > 0)
  122. {
  123. npc.scheduleDespawn(sitem.getDespawnDelay() * 1000L);
  124. }
  125. }
  126. }
  127. catch (Exception e)
  128. {
  129. activeChar.sendPacket(SystemMessageId.TARGET_CANT_FOUND);
  130. }
  131. break;
  132. case 1: // pet summons
  133. final L2Object oldTarget = activeChar.getTarget();
  134. activeChar.setTarget(activeChar);
  135. Broadcast.toSelfAndKnownPlayers(activeChar, new MagicSkillUse(activeChar, 2046, 1, 5000, 0));
  136. activeChar.setTarget(oldTarget);
  137. activeChar.sendPacket(new SetupGauge(0, 5000));
  138. activeChar.sendPacket(SystemMessageId.SUMMON_A_PET);
  139. activeChar.setIsCastingNow(true);
  140. ThreadPoolManager.getInstance().scheduleGeneral(new PetSummonFinalizer(activeChar, npcTemplate, item), 5000);
  141. break;
  142. case 2: // wyvern
  143. activeChar.mount(sitem.getNpcId(), item.getObjectId(), true);
  144. break;
  145. case 3: // Great Wolf
  146. activeChar.mount(sitem.getNpcId(), item.getObjectId(), false);
  147. break;
  148. }
  149. return true;
  150. }
  151. private static class PetSummonFeedWait implements Runnable
  152. {
  153. private final L2PcInstance _activeChar;
  154. private final L2PetInstance _petSummon;
  155. PetSummonFeedWait(L2PcInstance activeChar, L2PetInstance petSummon)
  156. {
  157. _activeChar = activeChar;
  158. _petSummon = petSummon;
  159. }
  160. @Override
  161. public void run()
  162. {
  163. try
  164. {
  165. if (_petSummon.getCurrentFed() <= 0)
  166. {
  167. _petSummon.unSummon(_activeChar);
  168. }
  169. else
  170. {
  171. _petSummon.startFeed();
  172. }
  173. }
  174. catch (Exception e)
  175. {
  176. _log.log(Level.SEVERE, "", e);
  177. }
  178. }
  179. }
  180. // TODO: this should be inside skill handler
  181. private static class PetSummonFinalizer implements Runnable
  182. {
  183. private final L2PcInstance _activeChar;
  184. private final L2ItemInstance _item;
  185. private final L2NpcTemplate _npcTemplate;
  186. protected PetSummonFinalizer(L2PcInstance activeChar, L2NpcTemplate npcTemplate, L2ItemInstance item)
  187. {
  188. _activeChar = activeChar;
  189. _npcTemplate = npcTemplate;
  190. _item = item;
  191. }
  192. @Override
  193. public void run()
  194. {
  195. try
  196. {
  197. _activeChar.sendPacket(new MagicSkillLaunched(_activeChar, 2046, 1));
  198. _activeChar.setIsCastingNow(false);
  199. // check for summon item validity
  200. if ((_item == null) || (_item.getOwnerId() != _activeChar.getObjectId()) || (_item.getLocation() != L2ItemInstance.ItemLocation.INVENTORY))
  201. {
  202. return;
  203. }
  204. final L2PetInstance pet = L2PetInstance.spawnPet(_npcTemplate, _activeChar, _item);
  205. if (pet == null)
  206. {
  207. return;
  208. }
  209. pet.setShowSummonAnimation(true);
  210. pet.setTitle(_activeChar.getName());
  211. if (!pet.isRespawned())
  212. {
  213. pet.setCurrentHp(pet.getMaxHp());
  214. pet.setCurrentMp(pet.getMaxMp());
  215. pet.getStat().setExp(pet.getExpForThisLevel());
  216. pet.setCurrentFed(pet.getMaxFed());
  217. }
  218. pet.setRunning();
  219. if (!pet.isRespawned())
  220. {
  221. pet.store();
  222. }
  223. _activeChar.setPet(pet);
  224. // JIV remove - done on spawn
  225. pet.spawnMe(_activeChar.getX() + 50, _activeChar.getY() + 100, _activeChar.getZ());
  226. pet.startFeed();
  227. _item.setEnchantLevel(pet.getLevel());
  228. if (pet.getCurrentFed() <= 0)
  229. {
  230. ThreadPoolManager.getInstance().scheduleGeneral(new PetSummonFeedWait(_activeChar, pet), 60000);
  231. }
  232. else
  233. {
  234. pet.startFeed();
  235. }
  236. pet.setFollowStatus(true);
  237. pet.sendPacket(new PetItemList(pet.getInventory().getItems()));
  238. pet.broadcastStatusUpdate();
  239. }
  240. catch (Exception e)
  241. {
  242. _log.log(Level.SEVERE, "", e);
  243. }
  244. }
  245. }
  246. }