123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- /*
- * Copyright (C) 2004-2015 L2J DataPack
- *
- * This file is part of L2J DataPack.
- *
- * L2J DataPack is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * L2J DataPack is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- package custom.events.Rabbits;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Set;
- import java.util.concurrent.ConcurrentHashMap;
- import com.l2jserver.Config;
- import com.l2jserver.gameserver.model.L2Object;
- import com.l2jserver.gameserver.model.actor.L2Npc;
- import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
- import com.l2jserver.gameserver.model.holders.SkillHolder;
- import com.l2jserver.gameserver.model.quest.Event;
- import com.l2jserver.gameserver.model.skills.Skill;
- import com.l2jserver.gameserver.util.Broadcast;
- import com.l2jserver.gameserver.util.Util;
- /**
- * Rabbits event.<br>
- * Chests are hidden at Fantasy Isle and players must use the Rabbit transformation's skills to find and open them.
- * @author Gnacik, Zoey76
- */
- public final class Rabbits extends Event
- {
- // NPCs
- private static final int NPC_MANAGER = 900101;
- private static final int CHEST = 900102;
- // Skills
- private static final SkillHolder RABBIT_MAGIC_EYE = new SkillHolder(629, 1);
- private static final SkillHolder RABBIT_TORNADO = new SkillHolder(630, 1);
- private static final SkillHolder RABBIT_TRANSFORMATION = new SkillHolder(2428, 1);
- private static final SkillHolder RAID_CURSE = new SkillHolder(4515, 1);
- // Misc
- private static final int EVENT_TIME = 10;
- private static final int TOTAL_CHEST_COUNT = 75;
- private static final int TRANSFORMATION_ID = 105;
- private final Set<L2Npc> _npcs = ConcurrentHashMap.newKeySet(TOTAL_CHEST_COUNT + 1);
- private final List<L2PcInstance> _players = new ArrayList<>();
- private boolean _isActive = false;
-
- /**
- * Drop data:<br>
- * Higher the chance harder the item.<br>
- * ItemId, chance in percent, min amount, max amount
- */
- // @formatter:off
- private static final int[][] DROPLIST =
- {
- { 1540, 80, 10, 15 }, // Quick Healing Potion
- { 1538, 60, 5, 10 }, // Blessed Scroll of Escape
- { 3936, 40, 5, 10 }, // Blessed Scroll of Ressurection
- { 6387, 25, 5, 10 }, // Blessed Scroll of Ressurection Pets
- { 22025, 15, 5, 10 }, // Powerful Healing Potion
- { 6622, 10, 1, 1 }, // Giant's Codex
- { 20034, 5, 1, 1 }, // Revita Pop
- { 20004, 1, 1, 1 }, // Energy Ginseng
- { 20004, 0, 1, 1 } // Energy Ginseng
- };
- // @formatter:on
-
- private Rabbits()
- {
- super(Rabbits.class.getSimpleName(), "custom/events");
- addFirstTalkId(NPC_MANAGER, CHEST);
- addTalkId(NPC_MANAGER);
- addStartNpc(NPC_MANAGER);
- addSkillSeeId(CHEST);
- addAttackId(CHEST);
- }
-
- @Override
- public boolean eventStart(L2PcInstance eventMaker)
- {
- // Don't start event if its active
- if (_isActive)
- {
- eventMaker.sendMessage("Event " + getName() + " is already started!");
- return false;
- }
-
- // Check starting conditions
- if (!Config.CUSTOM_NPC_DATA)
- {
- _log.info(getName() + ": Event can't be started, because custom NPCs are disabled!");
- eventMaker.sendMessage("Event " + getName() + " can't be started because custom NPCs are disabled!");
- return false;
- }
-
- // Set Event active
- _isActive = true;
-
- // Spawn Manager
- recordSpawn(_npcs, NPC_MANAGER, -59227, -56939, -2039, 64106, false, 0);
- // Spawn Chests
- for (int i = 0; i <= TOTAL_CHEST_COUNT; i++)
- {
- recordSpawn(_npcs, CHEST, getRandom(-60653, -58772), getRandom(-55830, -58146), -2030, 0, false, EVENT_TIME * 60000);
- }
-
- // Announce event start
- Broadcast.toAllOnlinePlayers("Rabbits Event: Chests spawned!");
- Broadcast.toAllOnlinePlayers("Rabbits Event: Go to Fantasy Isle and grab some rewards!");
- Broadcast.toAllOnlinePlayers("Rabbits Event: You have " + EVENT_TIME + " minuntes!");
- Broadcast.toAllOnlinePlayers("Rabbits Event: After that time all chests will disappear...");
- // Schedule event end
- startQuestTimer("END_RABBITS_EVENT", EVENT_TIME * 60000, null, eventMaker);
- return true;
- }
-
- @Override
- public boolean eventStop()
- {
- // Don't stop inactive event
- if (!_isActive)
- {
- return false;
- }
-
- // Set inactive
- _isActive = false;
-
- // Cancel timer
- cancelQuestTimers("END_RABBITS_EVENT");
-
- // Despawn NPCs
- for (L2Npc npc : _npcs)
- {
- npc.deleteMe();
- }
- _npcs.clear();
-
- for (L2PcInstance player : _players)
- {
- if (player.getTransformationId() == TRANSFORMATION_ID)
- {
- player.untransform();
- }
- }
- _players.clear();
-
- // Announce event end
- Broadcast.toAllOnlinePlayers("Rabbits Event: Event has finished.");
-
- return true;
- }
-
- @Override
- public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
- {
- String htmltext = null;
- switch (event)
- {
- case "900101-1.htm":
- {
- htmltext = "900101-1.htm";
- break;
- }
- case "transform":
- {
- if (player.isTransformed() || player.isInStance())
- {
- player.untransform();
- }
-
- RABBIT_TRANSFORMATION.getSkill().applyEffects(npc, player);
- _players.add(player);
- break;
- }
- case "END_RABBITS_EVENT":
- {
- Broadcast.toAllOnlinePlayers("Rabbits Event: Time up!");
- eventStop();
- break;
- }
- }
- return htmltext;
- }
-
- @Override
- public String onFirstTalk(L2Npc npc, L2PcInstance player)
- {
- return npc.getId() + ".htm";
- }
-
- @Override
- public String onSkillSee(L2Npc npc, L2PcInstance caster, Skill skill, L2Object[] targets, boolean isSummon)
- {
- if (skill.getId() == RABBIT_TORNADO.getSkillId())
- {
- if (!npc.isInvisible() && Util.contains(targets, npc))
- {
- dropItem(npc, caster, DROPLIST);
- npc.deleteMe();
- _npcs.remove(npc);
-
- if (_npcs.isEmpty())
- {
- Broadcast.toAllOnlinePlayers("Rabbits Event: No more chests...");
- eventStop();
- }
- }
- }
- else if (skill.getId() == RABBIT_MAGIC_EYE.getSkillId())
- {
- if (npc.isInvisible() && npc.isInsideRadius(caster, skill.getAffectRange(), false, false))
- {
- npc.setInvisible(false);
- }
- }
- return super.onSkillSee(npc, caster, skill, targets, isSummon);
- }
-
- @Override
- public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon, Skill skill)
- {
- if (_isActive && ((skill == null) || (skill.getId() != RABBIT_TORNADO.getSkillId())))
- {
- RAID_CURSE.getSkill().applyEffects(npc, attacker);
- }
- return super.onAttack(npc, attacker, damage, isSummon);
- }
-
- private static void dropItem(L2Npc npc, L2PcInstance player, int[][] droplist)
- {
- final int chance = getRandom(100);
- for (int[] drop : droplist)
- {
- if (chance > drop[1])
- {
- npc.dropItem(player, drop[0], getRandom(drop[2], drop[3]));
- return;
- }
- }
- }
-
- private static void recordSpawn(Set<L2Npc> npcs, int npcId, int x, int y, int z, int heading, boolean randomOffSet, long despawnDelay)
- {
- final L2Npc npc = addSpawn(npcId, x, y, z, heading, randomOffSet, despawnDelay);
- if (npc.getId() == CHEST)
- {
- npc.setIsImmobilized(true);
- npc.disableCoreAI(true);
- npc.setInvisible(true);
- }
- npcs.add(npc);
- }
-
- @Override
- public boolean eventBypass(L2PcInstance activeChar, String bypass)
- {
- return false;
- }
-
- public static void main(String[] args)
- {
- new Rabbits();
- }
- }
|