/*
* 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 .
*/
package custom.events.Elpies;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import com.l2jserver.Config;
import com.l2jserver.gameserver.ThreadPoolManager;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2EventMonsterInstance;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.quest.Event;
import com.l2jserver.gameserver.util.Broadcast;
public final class Elpies extends Event
{
// NPC
private static final int ELPY = 900100;
// Amount of Elpies to spawn when the event starts
private static final int ELPY_AMOUNT = 100;
// Event duration in minutes
private static final int EVENT_DURATION_MINUTES = 2;
// @formatter:off
private static final int[][] DROPLIST_CONSUMABLES =
{
// itemId, chance, min amount, max amount
{ 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
};
private static final int[][] DROPLIST_CRYSTALS =
{
{ 1458, 80, 50, 100 }, // Crystal D-Grade
{ 1459, 60, 40, 80 }, // Crystal C-Grade
{ 1460, 40, 30, 60 }, // Crystal B-Grade
{ 1461, 20, 20, 30 }, // Crystal A-Grade
{ 1462, 0, 10, 20 } // Crystal S-Grade
};
// @formatter:on
// Non-final variables
private static boolean EVENT_ACTIVE = false;
private ScheduledFuture> _eventTask = null;
private final Set _elpies = ConcurrentHashMap.newKeySet(ELPY_AMOUNT);
private Elpies()
{
super(Elpies.class.getSimpleName(), "custom/events");
addSpawnId(ELPY);
addKillId(ELPY);
}
@Override
public boolean eventBypass(L2PcInstance activeChar, String bypass)
{
return false;
}
@Override
public boolean eventStart(L2PcInstance eventMaker)
{
if (EVENT_ACTIVE)
{
return false;
}
// Check Custom Table - we use custom NPC's
if (!Config.CUSTOM_NPC_DATA)
{
_log.info(getName() + ": Event can't be started because custom NPC table is disabled!");
eventMaker.sendMessage("Event " + getName() + " can't be started because custom NPC table is disabled!");
return false;
}
EVENT_ACTIVE = true;
EventLocation[] locations = EventLocation.values();
EventLocation randomLoc = locations[getRandom(locations.length)];
long despawnDelay = EVENT_DURATION_MINUTES * 60000;
for (int i = 0; i < ELPY_AMOUNT; i++)
{
_elpies.add(addSpawn(ELPY, randomLoc.getRandomX(), randomLoc.getRandomY(), randomLoc.getZ(), 0, true, despawnDelay));
}
Broadcast.toAllOnlinePlayers("*Squeak Squeak*");
Broadcast.toAllOnlinePlayers("Elpy invasion in " + randomLoc.getName());
Broadcast.toAllOnlinePlayers("Help us exterminate them!");
Broadcast.toAllOnlinePlayers("You have " + EVENT_DURATION_MINUTES + " minutes!");
_eventTask = ThreadPoolManager.getInstance().scheduleGeneral(() ->
{
Broadcast.toAllOnlinePlayers("Time is up!");
eventStop();
}, despawnDelay);
return true;
}
@Override
public boolean eventStop()
{
if (!EVENT_ACTIVE)
{
return false;
}
EVENT_ACTIVE = false;
if (_eventTask != null)
{
_eventTask.cancel(true);
_eventTask = null;
}
for (L2Npc npc : _elpies)
{
npc.deleteMe();
}
_elpies.clear();
Broadcast.toAllOnlinePlayers("*Squeak Squeak*");
Broadcast.toAllOnlinePlayers("Elpy Event finished!");
return true;
}
@Override
public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
{
if (EVENT_ACTIVE)
{
_elpies.remove(npc);
dropItem(npc, killer, DROPLIST_CONSUMABLES);
dropItem(npc, killer, DROPLIST_CRYSTALS);
if (_elpies.isEmpty())
{
Broadcast.toAllOnlinePlayers("All elpies have been killed!");
eventStop();
}
}
return super.onKill(npc, killer, isSummon);
}
@Override
public String onSpawn(L2Npc npc)
{
((L2EventMonsterInstance) npc).eventSetDropOnGround(true);
((L2EventMonsterInstance) npc).eventSetBlockOffensiveSkills(true);
return super.onSpawn(npc);
}
private static enum EventLocation
{
ADEN("Aden", 146558, 148341, 26622, 28560, -2200),
DION("Dion", 18564, 19200, 144377, 145782, -3081),
GLUDIN("Gludin", -84040, -81420, 150257, 151175, -3125),
HV("Hunters Village", 116094, 117141, 75776, 77072, -2700),
OREN("Oren", 82048, 82940, 53240, 54126, -1490);
private final String _name;
private final int _minX;
private final int _maxX;
private final int _minY;
private final int _maxY;
private final int _z;
EventLocation(String name, int minX, int maxX, int minY, int maxY, int z)
{
_name = name;
_minX = minX;
_maxX = maxX;
_minY = minY;
_maxY = maxY;
_z = z;
}
public String getName()
{
return _name;
}
public int getRandomX()
{
return getRandom(_minX, _maxX);
}
public int getRandomY()
{
return getRandom(_minY, _maxY);
}
public int getZ()
{
return _z;
}
}
private static final void dropItem(L2Npc mob, L2PcInstance player, int[][] droplist)
{
final int chance = getRandom(100);
for (int[] drop : droplist)
{
if (chance >= drop[1])
{
mob.dropItem(player, drop[0], getRandom(drop[2], drop[3]));
break;
}
}
}
public static void main(String[] args)
{
new Elpies();
}
}