Rabbits.java 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. /*
  2. * Copyright (C) 2004-2014 L2J DataPack
  3. *
  4. * This file is part of L2J DataPack.
  5. *
  6. * L2J DataPack is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * L2J DataPack is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. package custom.events.Rabbits;
  20. import java.util.ArrayList;
  21. import java.util.List;
  22. import java.util.concurrent.CopyOnWriteArrayList;
  23. import com.l2jserver.Config;
  24. import com.l2jserver.gameserver.model.L2Object;
  25. import com.l2jserver.gameserver.model.actor.L2Npc;
  26. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  27. import com.l2jserver.gameserver.model.holders.SkillHolder;
  28. import com.l2jserver.gameserver.model.quest.Event;
  29. import com.l2jserver.gameserver.model.skills.Skill;
  30. import com.l2jserver.gameserver.util.Broadcast;
  31. import com.l2jserver.gameserver.util.Util;
  32. /**
  33. * Rabbits event.<br>
  34. * Chests are hidden at Fantasy Isle and players must use the Rabbit transformation's skills to find and open them.
  35. * @author Gnacik, Zoey76
  36. */
  37. public final class Rabbits extends Event
  38. {
  39. // NPCs
  40. private static final int NPC_MANAGER = 900101;
  41. private static final int CHEST = 900102;
  42. // Skills
  43. private static final SkillHolder RABBIT_MAGIC_EYE = new SkillHolder(629, 1);
  44. private static final SkillHolder RABBIT_TORNADO = new SkillHolder(630, 1);
  45. private static final SkillHolder RABBIT_TRANSFORMATION = new SkillHolder(2428, 1);
  46. private static final SkillHolder RAID_CURSE = new SkillHolder(4515, 1);
  47. // Misc
  48. private static final int EVENT_TIME = 10;
  49. private static final int TOTAL_CHEST_COUNT = 75;
  50. private static final int TRANSFORMATION_ID = 105;
  51. private final List<L2Npc> _npcs = new CopyOnWriteArrayList<>();
  52. private final List<L2PcInstance> _players = new ArrayList<>();
  53. private boolean _isActive = false;
  54. /**
  55. * Drop data:<br>
  56. * Higher the chance harder the item.<br>
  57. * ItemId, chance in percent, min amount, max amount
  58. */
  59. // @formatter:off
  60. private static final int[][] DROPLIST =
  61. {
  62. { 1540, 80, 10, 15 }, // Quick Healing Potion
  63. { 1538, 60, 5, 10 }, // Blessed Scroll of Escape
  64. { 3936, 40, 5, 10 }, // Blessed Scroll of Ressurection
  65. { 6387, 25, 5, 10 }, // Blessed Scroll of Ressurection Pets
  66. { 22025, 15, 5, 10 }, // Powerful Healing Potion
  67. { 6622, 10, 1, 1 }, // Giant's Codex
  68. { 20034, 5, 1, 1 }, // Revita Pop
  69. { 20004, 1, 1, 1 }, // Energy Ginseng
  70. { 20004, 0, 1, 1 } // Energy Ginseng
  71. };
  72. // @formatter:on
  73. private Rabbits()
  74. {
  75. super(Rabbits.class.getSimpleName(), "custom/events");
  76. addFirstTalkId(NPC_MANAGER, CHEST);
  77. addTalkId(NPC_MANAGER);
  78. addStartNpc(NPC_MANAGER);
  79. addSkillSeeId(CHEST);
  80. addAttackId(CHEST);
  81. }
  82. @Override
  83. public boolean eventStart(L2PcInstance eventMaker)
  84. {
  85. // Don't start event if its active
  86. if (_isActive)
  87. {
  88. eventMaker.sendMessage("Event " + getName() + " is already started!");
  89. return false;
  90. }
  91. // Check starting conditions
  92. if (!Config.CUSTOM_NPC_DATA)
  93. {
  94. _log.info(getName() + ": Event can't be started, because custom NPCs are disabled!");
  95. eventMaker.sendMessage("Event " + getName() + " can't be started because custom NPCs are disabled!");
  96. return false;
  97. }
  98. // Set Event active
  99. _isActive = true;
  100. // Spawn Manager
  101. recordSpawn(_npcs, NPC_MANAGER, -59227, -56939, -2039, 64106, false, 0);
  102. // Spawn Chests
  103. for (int i = 0; i <= TOTAL_CHEST_COUNT; i++)
  104. {
  105. recordSpawn(_npcs, CHEST, getRandom(-60653, -58772), getRandom(-55830, -58146), -2030, 0, false, EVENT_TIME * 60000);
  106. }
  107. // Announce event start
  108. Broadcast.toAllOnlinePlayers("Rabbits Event: Chests spawned!");
  109. Broadcast.toAllOnlinePlayers("Rabbits Event: Go to Fantasy Isle and grab some rewards!");
  110. Broadcast.toAllOnlinePlayers("Rabbits Event: You have " + EVENT_TIME + " minuntes!");
  111. Broadcast.toAllOnlinePlayers("Rabbits Event: After that time all chests will disappear...");
  112. // Schedule event end
  113. startQuestTimer("END_RABBITS_EVENT", EVENT_TIME * 60000, null, eventMaker);
  114. return true;
  115. }
  116. @Override
  117. public boolean eventStop()
  118. {
  119. // Don't stop inactive event
  120. if (!_isActive)
  121. {
  122. return false;
  123. }
  124. // Set inactive
  125. _isActive = false;
  126. // Cancel timer
  127. cancelQuestTimers("END_RABBITS_EVENT");
  128. // Despawn NPCs
  129. for (L2Npc npc : _npcs)
  130. {
  131. if (npc != null)
  132. {
  133. npc.deleteMe();
  134. }
  135. }
  136. _npcs.clear();
  137. for (L2PcInstance player : _players)
  138. {
  139. if ((player != null) && (player.getTransformationId() == TRANSFORMATION_ID))
  140. {
  141. player.untransform();
  142. }
  143. }
  144. _players.clear();
  145. // Announce event end
  146. Broadcast.toAllOnlinePlayers("Rabbits Event: Event has finished.");
  147. return true;
  148. }
  149. @Override
  150. public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  151. {
  152. String htmltext = null;
  153. switch (event)
  154. {
  155. case "900101-1.htm":
  156. {
  157. htmltext = "900101-1.htm";
  158. break;
  159. }
  160. case "transform":
  161. {
  162. if (player.isTransformed() || player.isInStance())
  163. {
  164. player.untransform();
  165. }
  166. RABBIT_TRANSFORMATION.getSkill().applyEffects(npc, player);
  167. _players.add(player);
  168. break;
  169. }
  170. case "END_RABBITS_EVENT":
  171. {
  172. Broadcast.toAllOnlinePlayers("Rabbits Event: Time up!");
  173. eventStop();
  174. break;
  175. }
  176. }
  177. return htmltext;
  178. }
  179. @Override
  180. public String onFirstTalk(L2Npc npc, L2PcInstance player)
  181. {
  182. return npc.getId() + ".htm";
  183. }
  184. @Override
  185. public String onSkillSee(L2Npc npc, L2PcInstance caster, Skill skill, L2Object[] targets, boolean isSummon)
  186. {
  187. if (skill.getId() == RABBIT_TORNADO.getSkillId())
  188. {
  189. if (!npc.isInvisible() && Util.contains(targets, npc))
  190. {
  191. dropItem(npc, caster, DROPLIST);
  192. npc.deleteMe();
  193. _npcs.remove(npc);
  194. if (_npcs.size() <= 1)
  195. {
  196. Broadcast.toAllOnlinePlayers("Rabbits Event: No more chests...");
  197. eventStop();
  198. }
  199. }
  200. }
  201. else if (skill.getId() == RABBIT_MAGIC_EYE.getSkillId())
  202. {
  203. if (npc.isInvisible() && npc.isInsideRadius(caster, skill.getAffectRange(), false, false))
  204. {
  205. npc.setInvisible(false);
  206. }
  207. }
  208. return super.onSkillSee(npc, caster, skill, targets, isSummon);
  209. }
  210. @Override
  211. public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon, Skill skill)
  212. {
  213. if (_isActive && ((skill == null) || (skill.getId() != RABBIT_TORNADO.getSkillId())))
  214. {
  215. RAID_CURSE.getSkill().applyEffects(npc, attacker);
  216. }
  217. return super.onAttack(npc, attacker, damage, isSummon);
  218. }
  219. private static void dropItem(L2Npc npc, L2PcInstance player, int[][] droplist)
  220. {
  221. final int chance = getRandom(100);
  222. for (int[] drop : droplist)
  223. {
  224. if (chance > drop[1])
  225. {
  226. npc.dropItem(player, drop[0], getRandom(drop[2], drop[3]));
  227. return;
  228. }
  229. }
  230. }
  231. private static void recordSpawn(List<L2Npc> npcs, int npcId, int x, int y, int z, int heading, boolean randomOffSet, long despawnDelay)
  232. {
  233. final L2Npc npc = addSpawn(npcId, x, y, z, heading, randomOffSet, despawnDelay);
  234. if (npc.getId() == CHEST)
  235. {
  236. npc.setIsImmobilized(true);
  237. npc.disableCoreAI(true);
  238. npc.setInvisible(true);
  239. }
  240. npcs.add(npc);
  241. }
  242. @Override
  243. public boolean eventBypass(L2PcInstance activeChar, String bypass)
  244. {
  245. return false;
  246. }
  247. public static void main(String[] args)
  248. {
  249. new Rabbits();
  250. }
  251. }