Merged with released L2J-Unity files.

This commit is contained in:
mobiusdev
2016-06-12 01:34:09 +00:00
parent e003e87887
commit 635557f5da
18352 changed files with 3245113 additions and 2892959 deletions

View File

@@ -0,0 +1,883 @@
/*
* This file is part of the L2J Mobius project.
*
* This program 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.
*
* This program 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 instances.MemoryOfDisaster;
import java.util.List;
import java.util.stream.Collectors;
import com.l2jmobius.commons.util.CommonUtil;
import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.ai.CtrlIntention;
import com.l2jmobius.gameserver.enums.CategoryType;
import com.l2jmobius.gameserver.enums.ChatType;
import com.l2jmobius.gameserver.enums.Movie;
import com.l2jmobius.gameserver.model.Location;
import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.base.ClassId;
import com.l2jmobius.gameserver.model.events.EventType;
import com.l2jmobius.gameserver.model.events.ListenerRegisterType;
import com.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import com.l2jmobius.gameserver.model.events.annotations.RegisterType;
import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureAttacked;
import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureDeath;
import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureSee;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerCallToChangeClass;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLevelChanged;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogin;
import com.l2jmobius.gameserver.model.holders.SkillHolder;
import com.l2jmobius.gameserver.model.instancezone.Instance;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.network.NpcStringId;
import com.l2jmobius.gameserver.network.serverpackets.Earthquake;
import com.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import com.l2jmobius.gameserver.network.serverpackets.OnEventTrigger;
import com.l2jmobius.gameserver.network.serverpackets.ValidateLocation;
import com.l2jmobius.gameserver.network.serverpackets.awakening.ExCallToChangeClass;
import instances.AbstractInstance;
/**
* Memory Of Disaster instance zone.
* @author Sdw
*/
public final class MemoryOfDisaster extends AbstractInstance
{
// NPCs
private static final int INVISIBLE_NPC = 18919;
private static final int BRONK = 19192;
private static final int ROGIN = 19193;
private static final int TOROCCO = 19198;
private static final int TENTACLE = 19171;
private static final int TEREDOR = 19172;
private static final int SOLDIER = 19196;
private static final int SOLDIER2 = 19197;
private static final int SIEGE_GOLEM = 19189;
private static final int TEREDOR_TRANSPARENT = 18998;
private static final int SILVERA = 19194;
private static final int WIRPHY = 19195;
private static final int EARTH_WYRM_TRASKEN = 19217;
private static final int[] DWARVES =
{
19191,
19192,
19193,
19198,
19199,
19200,
19201,
19202,
19203,
19204,
19205,
19206,
19207,
19208,
19209,
19210,
19211,
19212,
19213,
19214,
19215
};
// Skills
private static final SkillHolder SIEGE_GOLEM_SKILL_1 = new SkillHolder(16022, 1);
private static final SkillHolder SIEGE_GOLEM_SKILL_2 = new SkillHolder(16024, 1);
private static final SkillHolder PULLER_SKILL = new SkillHolder(16031, 1);
private static final SkillHolder TEREDOR_TRANSPARENT_SKILL = new SkillHolder(16021, 1);
private static final SkillHolder TRASKEN_SKILL_1 = new SkillHolder(14505, 1);
// Items
private static final int TRANSPARENT_1HS = 15280;
// Locations
private static final Location BATTLE_PORT = new Location(116063, -183167, -1460, 64960);
private static final Location ROGIN_MOVE = new Location(116400, -183069, -1600);
private static final Location AWAKENING_GUIDE_MOVE_1 = new Location(115830, -182103, -1400);
private static final Location AWAKENING_GUIDE_MOVE_2 = new Location(115955, -181387, -1624);
private static final Location AWAKENING_GUIDE_MOVE_3 = new Location(116830, -180257, -1176);
private static final Location AWAKENING_GUIDE_MOVE_4 = new Location(115110, -178852, -896);
private static final Location AWAKENING_GUIDE_MOVE_5 = new Location(115095, -176978, -808);
private static final Location DWARVES_MOVE_1 = new Location(115830, -182103, -1400);
private static final Location DWARVES_MOVE_2 = new Location(115955, -181387, -1624);
private static final Location DWARVES_MOVE_3 = new Location(116830, -180257, -1176);
private static final Location GOLEM_MOVE = new Location(116608, -179205, -1176);
private static final Location PULLER_TELEPORT = new Location(115899, -181931, -1424, 0);
private static final Location WIRPHY_MOVE = new Location(116639, -179990, -1160);
private static final Location SILVERA_MOVE = new Location(116880, -179821, -1144);
private static final Location[] DWARVES_MOVE_RANDOM =
{
new Location(117147, -179248, -1120),
new Location(115110, -178852, -896),
new Location(115959, -178311, -1064)
};
private static final Location[] TEREDOR_SPAWN_LOC =
{
new Location(117100, -181088, -1272, 19956),
new Location(116925, -180420, -1200, 46585),
new Location(116656, -180461, -1240, 56363),
};
// Misc
private static final int FIRE_IN_DWARVEN_VILLAGE = 23120700;
private static final int TEMPLATE_ID = 200;
private static final NpcStringId[] SHOUT_BRONK_DEATH =
{
NpcStringId.BRONK,
NpcStringId.CHIEF,
NpcStringId.BRONK2,
NpcStringId.NO_WAY3
};
private static final NpcStringId[] SHOUT_RUN =
{
NpcStringId.FOR_BRONK,
NpcStringId.DWARVES_FOREVER,
NpcStringId.SAVE_THE_DWARVEN_VILLAGE,
NpcStringId.WHOAAAAAA,
NpcStringId.FIGHT
};
private static final NpcStringId[] SHOUT_SILVERA_DEATH =
{
NpcStringId.SILVERA,
NpcStringId.WE_CAN_T_TAKE_ANY_MORE_LOSSES,
NpcStringId.TOO_LATE3,
NpcStringId.NO_WAY4,
NpcStringId.ANOTHER_ONE_OVER_THERE
};
public MemoryOfDisaster()
{
addInstanceCreatedId(TEMPLATE_ID);
addSpawnId(INVISIBLE_NPC, TENTACLE, SOLDIER, SOLDIER2, TEREDOR, SIEGE_GOLEM, WIRPHY, SILVERA, TEREDOR_TRANSPARENT, EARTH_WYRM_TRASKEN);
addMoveFinishedId(ROGIN, SOLDIER, WIRPHY, SILVERA);
addMoveFinishedId(DWARVES);
addSpellFinishedId(SIEGE_GOLEM, INVISIBLE_NPC, TEREDOR_TRANSPARENT);
setCreatureKillId(this::onCreatureKill, BRONK, SILVERA);
setCreatureAttackedId(this::onCreatureAttacked, BRONK, TENTACLE, SOLDIER, SOLDIER2, TEREDOR, SIEGE_GOLEM, WIRPHY, SILVERA);
setCreatureSeeId(this::onCreatureSee, TENTACLE, SOLDIER, SOLDIER2, TEREDOR, INVISIBLE_NPC);
}
@Override
public String onSpawn(L2Npc npc)
{
final Instance instance = npc.getInstanceWorld();
if (isMoDInstance(instance))
{
switch (npc.getId())
{
case INVISIBLE_NPC:
{
switch (npc.getParameters().getString("type", ""))
{
case "FIGHT":
{
addSpawn(npc, npc.getParameters().getInt("npcId"), npc.getLocation(), true, instance.getId());
switch (Rnd.get(3))
{
case 0:
{
addSpawn(npc, SOLDIER, npc.getLocation(), true, instance.getId());
break;
}
case 1:
{
addSpawn(npc, SOLDIER, npc.getLocation(), true, instance.getId());
addSpawn(npc, SOLDIER2, npc.getLocation(), true, instance.getId());
break;
}
case 2:
{
addSpawn(npc, SOLDIER, npc.getLocation(), true, instance.getId());
addSpawn(npc, SOLDIER2, npc.getLocation(), true, instance.getId());
addSpawn(npc, SOLDIER2, npc.getLocation(), true, instance.getId());
break;
}
}
break;
}
case "EVENT_B":
{
getTimers().addTimer("WARNING_TIME", 180000, npc, null);
break;
}
case "EVENT_C":
{
// Rework me plz, I'm dying
final L2Npc golem = addSpawn(npc, SIEGE_GOLEM, 116881, -180742, -1248, 1843, false, 0, false, instance.getId());
golem.setIsInvul(true);
break;
}
case "REINFORCE":
{
getTimers().addTimer("REINFORCE_SPAWN", 30000, npc, null);
break;
}
default:
{
if (npc.getVariables().getString("type", "").equals("PULLER"))
{
addSkillCastDesire(npc, instance.getFirstPlayer(), PULLER_SKILL, 100000000);
}
break;
}
}
break;
}
case SOLDIER:
{
switch (npc.getVariables().getString("type", ""))
{
case "AWAKENING_GUIDE":
{
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, AWAKENING_GUIDE_MOVE_1);
npc.setIsRunning(true);
break;
}
default:
{
npc.initSeenCreatures();
break;
}
}
break;
}
case TENTACLE:
case SOLDIER2:
{
npc.initSeenCreatures();
break;
}
case TEREDOR:
{
npc.initSeenCreatures();
if (npc.isScriptValue(2))
{
addSpawn(WIRPHY, 116361, -179760, -1128, 57533, false, 0, false, instance.getId());
addSpawn(SILVERA, 116361, -179760, -1128, 57533, false, 0, false, instance.getId());
}
break;
}
case SIEGE_GOLEM:
{
npc.initSeenCreatures();
for (Location loc : TEREDOR_SPAWN_LOC)
{
final L2Npc teredor = addSpawn(TEREDOR, loc, false, 0, false, instance.getId());
addAttackDesire(teredor, npc);
teredor.setScriptValue(1);
}
break;
}
case WIRPHY:
{
npc.setIsRunning(true);
addMoveToDesire(npc, WIRPHY_MOVE, 23);
npc.getInstanceWorld().getAliveNpcs(TEREDOR).stream().filter(n -> n.isScriptValue(2)).forEach(n -> addAttackDesire(n, npc));
break;
}
case SILVERA:
{
npc.setIsRunning(true);
addMoveToDesire(npc, SILVERA_MOVE, 23);
break;
}
case TEREDOR_TRANSPARENT:
{
// TODO: Check why the first doesn't work :(
addSkillCastDesire(npc, npc, TEREDOR_TRANSPARENT_SKILL, 1000000);
npc.setTarget(npc);
npc.doCast(TEREDOR_TRANSPARENT_SKILL.getSkill());
break;
}
case EARTH_WYRM_TRASKEN:
{
npc.setLHandId(TRANSPARENT_1HS);
getTimers().addTimer("ENTER_EVENT", 5000, npc, null);
break;
}
}
}
return super.onSpawn(npc);
}
public void onCreatureSee(OnCreatureSee event)
{
final L2Character creature = event.getSeen();
final L2Npc npc = (L2Npc) event.getSeer();
final Instance world = npc.getInstanceWorld();
if (isMoDInstance(world))
{
if (creature.isNpc())
{
switch (npc.getId())
{
case SOLDIER:
case SOLDIER2:
{
if ((creature.getId() == TENTACLE) || ((creature.getId() == TEREDOR) && !((L2Npc) creature).isScriptValue(2)))
{
addAttackDesire(npc, creature);
}
break;
}
case TENTACLE:
{
if ((creature.getId() == SOLDIER) || (creature.getId() == SOLDIER2))
{
addAttackDesire(npc, creature);
}
break;
}
case TEREDOR:
{
if (!npc.isScriptValue(2))
{
if ((creature.getId() == SOLDIER) || (creature.getId() == SOLDIER2))
{
addAttackDesire(npc, creature);
}
}
break;
}
}
}
else if (creature.isPlayer())
{
switch (npc.getId())
{
case INVISIBLE_NPC:
{
if (npc.getParameters().getString("type", "").equals("EVENT_C"))
{
final L2Npc siegeGolem = npc.getInstanceWorld().getNpc(SIEGE_GOLEM);
if (siegeGolem.isScriptValue(0))
{
siegeGolem.setScriptValue(1);
siegeGolem.abortAttack();
siegeGolem.abortCast();
addSkillCastDesire(siegeGolem, siegeGolem, SIEGE_GOLEM_SKILL_1, 1000000);
world.getAliveNpcs(TEREDOR).stream().filter(n -> n.isScriptValue(1)).forEach(n -> getTimers().addTimer("TEREDOR_SUICIDE", 10000, n, null));
getTimers().addTimer("CHASING_TRAJAN_TIME", 5000, npc, null);
getTimers().addTimer("EARTHWORM_TIME", 15000, npc, null);
}
}
else if (npc.getParameters().getString("type", "").equals("EVENT_B"))
{
getTimers().cancelTimers("WARNING_TIME");
}
else if (npc.getVariables().getString("type", "").equals("PULLER"))
{
showOnScreenMsg(creature.getActingPlayer(), NpcStringId.WATCH_THE_DWARVEN_VILLAGE_LAST_STAND, ExShowScreenMessage.TOP_CENTER, 5000);
}
break;
}
}
}
}
}
@Override
public void onTimerEvent(String event, StatsSet params, L2Npc npc, L2PcInstance player)
{
switch (event)
{
case "EARTHQUAKE":
{
player.sendPacket(new Earthquake(player.getLocation(), 50, 4));
break;
}
case "END_OF_OPENING_SCENE":
{
player.teleToLocation(BATTLE_PORT);
getTimers().addTimer("SPAWN_ROGIN", 10000, null, player);
break;
}
case "SPAWN_ROGIN":
{
showOnScreenMsg(player, NpcStringId.WATCH_THE_DWARVEN_VILLAGE_LAST_STAND, ExShowScreenMessage.TOP_CENTER, 5000);
player.getInstanceWorld().spawnGroup("ROGIN").forEach(n ->
{
addMoveToDesire(n, ROGIN_MOVE, 23);
n.setIsRunning(true);
});
break;
}
case "ROGIN_TALK":
{
switch (npc.getVariables().getInt("talkId", 0))
{
case 0:
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.CHIEF_REPORTING_IN);
npc.getVariables().set("talkId", 1);
getTimers().addTimer("ROGIN_TALK", 2000, npc, null);
break;
}
case 1:
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ENEMIES_ARE_APPROACHING_FORM_THE_SOUTH);
npc.getVariables().set("talkId", 2);
getTimers().addTimer("ROGIN_TALK", 2000, npc, null);
npc.getInstanceWorld().getNpc(TOROCCO).broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ROGIN_I_M_HERE);
npc.getInstanceWorld().getNpc(BRONK).broadcastSay(ChatType.NPC_GENERAL, NpcStringId.MM_I_SEE);
// Set Bronk heading towards Rogin
break;
}
case 2:
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.THE_ELDERS_HAVEN_T_BEEN_MOVED_TO_SAFETY);
npc.getVariables().set("talkId", 3);
getTimers().addTimer("ROGIN_TALK", 2000, npc, null);
break;
}
case 3:
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.MANY_RESIDENTS_STILL_HAVEN_T_LEFT_THEIR_HOMES);
getTimers().addTimer("BRONK_TALK", 2000, npc.getInstanceWorld().getNpc(BRONK), null);
break;
}
}
break;
}
case "BRONK_TALK":
{
switch (npc.getVariables().getInt("talkId", 0))
{
case 0:
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.THANK_YOU_FOR_THE_REPORT_ROGIN);
npc.getVariables().set("talkId", 1);
getTimers().addTimer("BRONK_TALK", 2000, npc, null);
npc.setHeading(17036);
npc.broadcastPacket(new ValidateLocation(npc));
break;
}
case 1:
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.SOLDIERS_WE_RE_FIGHTING_A_BATTLE_THAT_CAN_T_BE_WON);
npc.getVariables().set("talkId", 2);
getTimers().addTimer("BRONK_TALK", 2000, npc, null);
npc.setHeading(17036);
npc.broadcastPacket(new ValidateLocation(npc));
break;
}
case 2:
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.BUT_WE_HAVE_TO_DEFEND_OUR_VILLAGE_SO_WE_RE_FIGHTING);
npc.getVariables().set("talkId", 3);
getTimers().addTimer("BRONK_TALK", 2000, npc, null);
break;
}
case 3:
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.FOR_THE_FINE_WINES_AND_TREASURES_OF_ADEN);
npc.getVariables().set("talkId", 4);
getTimers().addTimer("BRONK_TALK", 2000, npc, null);
break;
}
case 4:
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.I_M_PROUD_OF_EVERY_ONE_OF);
npc.getVariables().set("talkId", 5);
getTimers().addTimer("BRONK_TALK", 2000, npc, null);
break;
}
case 5:
{
npc.getInstanceWorld().spawnGroup("TENTACLE").forEach(n ->
{
n.getVariables().set("isLeaderKiller", true);
addAttackDesire(n, npc);
});
break;
}
}
break;
}
case "REINFORCE_SPAWN":
{
final L2Npc soldier = addSpawn(SOLDIER, npc.getLocation(), false, 0, false, npc.getInstanceId());
soldier.getVariables().set("type", "AWAKENING_GUIDE");
getTimers().addTimer("REINFORCE_SPAWN", 40000, npc, null);
break;
}
case "ATTACK_TIME":
{
final List<L2Npc> tentacles = npc.getInstanceWorld().getAliveNpcs(TENTACLE).stream().filter(n -> n.getVariables().getBoolean("isLeaderKiller", false)).collect(Collectors.toList());
addAttackDesire(npc, tentacles.get(Rnd.get(tentacles.size())));
break;
}
case "RUN_TIME":
{
npc.broadcastSay(ChatType.NPC_GENERAL, SHOUT_RUN[Rnd.get(SHOUT_RUN.length)]);
addMoveToDesire(npc, DWARVES_MOVE_1, 23);
npc.setIsRunning(true);
break;
}
case "TEREDOR_SUICIDE":
{
npc.doDie(null);
break;
}
case "WARNING_TIME":
{
final L2Npc invisibleNpc = addSpawn(INVISIBLE_NPC, 117100, -181088, -1272, 19956, false, 0, false, npc.getInstanceId());
invisibleNpc.getVariables().set("type", "PULLER");
break;
}
case "SECOND_PULL":
{
addSkillCastDesire(npc, npc.getInstanceWorld().getFirstPlayer(), PULLER_SKILL, 100000000);
getTimers().addTimer("DESPAWNER_PULLER", 3000, npc, null);
break;
}
case "DESPAWNER_PULLER":
{
npc.deleteMe();
break;
}
case "CHASING_TRAJAN_TIME":
{
final L2Npc teredor = addSpawn(npc, TEREDOR, 116016, -179503, -1040, 58208, false, 0, false, npc.getInstanceId());
teredor.setScriptValue(2);
break;
}
case "EARTHWORM_TIME":
{
addSpawn(npc, TEREDOR_TRANSPARENT, 116016, -179503, -1040, 58208, false, 0, false, npc.getInstanceId());
break;
}
case "ENTER_EVENT":
{
addSkillCastDesire(npc, npc, TRASKEN_SKILL_1, 100000000);
npc.getInstanceWorld().getFirstPlayer().sendPacket(new Earthquake(npc.getLocation(), 50, 4));
getTimers().addTimer("TRASKEN_UNEQUIP", 2000, npc, null);
break;
}
case "TRASKEN_UNEQUIP":
{
npc.setLHandId(0);
npc.broadcastInfo();
break;
}
}
}
@Override
public void onInstanceCreated(Instance instance, L2PcInstance player)
{
getTimers().addTimer("OPENING_SCENE", 500, e ->
{
instance.getPlayers().forEach(p ->
{
p.sendPacket(new OnEventTrigger(FIRE_IN_DWARVEN_VILLAGE, true));
playMovie(p, Movie.SC_AWAKENING_OPENING);
getTimers().addRepeatingTimer("EARTHQUAKE", 10000, null, p);
getTimers().addTimer("END_OF_OPENING_SCENE", 32000, null, p);
});
});
}
@Override
public void onMoveFinished(L2Npc npc)
{
if (CommonUtil.contains(DWARVES, npc.getId()))
{
if ((npc.getX() == DWARVES_MOVE_1.getX()) && (npc.getY() == DWARVES_MOVE_1.getY()))
{
addMoveToDesire(npc, DWARVES_MOVE_2, 23);
}
else if ((npc.getX() == DWARVES_MOVE_2.getX()) && (npc.getY() == DWARVES_MOVE_2.getY()))
{
addMoveToDesire(npc, DWARVES_MOVE_3, 23);
}
else if ((npc.getX() == DWARVES_MOVE_3.getX()) && (npc.getY() == DWARVES_MOVE_3.getY()))
{
addMoveToDesire(npc, DWARVES_MOVE_RANDOM[Rnd.get(DWARVES_MOVE_RANDOM.length)], 23);
}
}
switch (npc.getId())
{
case ROGIN:
{
if ((npc.getX() == ROGIN_MOVE.getX()) && (npc.getY() == ROGIN_MOVE.getY()))
{
getTimers().addTimer("ROGIN_TALK", 3000, npc, null);
}
break;
}
case SOLDIER:
{
switch (npc.getVariables().getString("type", ""))
{
case "AWAKENING_GUIDE":
{
if ((npc.getX() == AWAKENING_GUIDE_MOVE_1.getX()) && (npc.getY() == AWAKENING_GUIDE_MOVE_1.getY()))
{
addMoveToDesire(npc, AWAKENING_GUIDE_MOVE_2, 23);
}
else if ((npc.getX() == AWAKENING_GUIDE_MOVE_2.getX()) && (npc.getY() == AWAKENING_GUIDE_MOVE_2.getY()))
{
addMoveToDesire(npc, AWAKENING_GUIDE_MOVE_3, 23);
}
else if ((npc.getX() == AWAKENING_GUIDE_MOVE_3.getX()) && (npc.getY() == AWAKENING_GUIDE_MOVE_3.getY()))
{
addMoveToDesire(npc, AWAKENING_GUIDE_MOVE_4, 23);
}
else if ((npc.getX() == AWAKENING_GUIDE_MOVE_4.getX()) && (npc.getY() == AWAKENING_GUIDE_MOVE_4.getY()))
{
addMoveToDesire(npc, AWAKENING_GUIDE_MOVE_5, 23);
}
else if ((npc.getX() == AWAKENING_GUIDE_MOVE_5.getX()) && (npc.getY() == AWAKENING_GUIDE_MOVE_5.getY()))
{
getTimers().addTimer("DESPAWN_AWAKENING_GUIDE", 1000, e -> npc.deleteMe());
}
break;
}
}
break;
}
case WIRPHY:
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.HELP_ME3);
break;
}
case SILVERA:
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.I_VE_GOT_A_MONSTER_ON_MY_TAIL);
break;
}
}
}
private void onCreatureAttacked(OnCreatureAttacked event)
{
final Instance world = event.getTarget().getInstanceWorld();
if (isMoDInstance(world))
{
if (!event.getAttacker().isPlayable())
{
final L2Npc npc = (L2Npc) event.getTarget();
final L2Npc attacker = (L2Npc) event.getAttacker();
if (CommonUtil.contains(DWARVES, npc.getId()))
{
final int attackCount = npc.getVariables().getInt("attackCount", 0) + 1;
if (attackCount == 10)
{
npc.doDie(attacker);
}
else
{
npc.getVariables().set("attackCount", attackCount);
}
}
switch (npc.getId())
{
case BRONK:
{
npc.doDie(attacker);
break;
}
case SOLDIER:
case SOLDIER2:
{
final int attackCount = npc.getVariables().getInt("attackCount", 0) + 1;
if (attackCount == 10)
{
npc.doDie(attacker);
addSpawn((L2Npc) npc.getSummoner(), SOLDIER, npc.getLocation(), true, world.getId());
}
else
{
npc.getVariables().set("attackCount", attackCount);
}
break;
}
case TENTACLE:
{
final int attackCount = npc.getVariables().getInt("attackCount", 0) + 1;
final boolean isBronKiller = npc.getVariables().getBoolean("isLeaderKiller", false);
final int killCount = isBronKiller ? 5 : 20;
if (attackCount == killCount)
{
npc.doDie(attacker);
if (!isBronKiller)
{
addSpawn((L2Npc) npc.getSummoner(), npc.getId(), npc.getLocation(), true, world.getId());
}
}
else
{
npc.getVariables().set("attackCount", attackCount);
addAttackDesire(npc, attacker);
}
break;
}
case TEREDOR:
{
if (npc.isScriptValue(0))
{
final int attackCount = npc.getVariables().getInt("attackCount", 0) + 1;
if (attackCount == 20)
{
npc.doDie(attacker);
addSpawn((L2Npc) npc.getSummoner(), npc.getId(), npc.getLocation(), true, world.getId());
}
else
{
npc.getVariables().set("attackCount", attackCount);
addAttackDesire(npc, attacker);
}
}
else if (npc.isScriptValue(2))
{
final int attackCount = npc.getVariables().getInt("attackCount", 0) + 1;
if ((attackCount == 80) || (attacker.getId() == SIEGE_GOLEM))
{
npc.doDie(attacker);
}
addAttackDesire(npc, attacker);
}
break;
}
case SIEGE_GOLEM:
{
if (npc.isScriptValue(0))
{
addSkillCastDesire(npc, attacker, SIEGE_GOLEM_SKILL_2, 1000000);
}
break;
}
case WIRPHY:
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.NO_WAY2);
npc.doDie(null);
// TODO : This shit doesn't attack silvera for some reason which prevents to trigger the dwarf text
// Used some additional method such as World.getInstance().getVisibleObjects(attacker, Npc.class, n -> (n.getId() == SILVERA))
// It found the npc but didn't worked either.
addAttackDesire(attacker, world.getNpc(SILVERA));
break;
}
case SILVERA:
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.MY_GOD);
npc.doDie(null);
addAttackDesire(world.getNpc(SIEGE_GOLEM), attacker);
break;
}
}
}
}
}
private void onCreatureKill(OnCreatureDeath event)
{
final L2Npc npc = ((L2Npc) event.getTarget());
if (npc.getId() == BRONK)
{
for (L2Npc dwarf : npc.getInstanceWorld().getNpcs(DWARVES))
{
if (dwarf.getId() == ROGIN)
{
dwarf.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.CHIEF2);
}
else
{
dwarf.broadcastSay(ChatType.NPC_GENERAL, SHOUT_BRONK_DEATH[Rnd.get(SHOUT_BRONK_DEATH.length)]);
}
getTimers().addTimer("ATTACK_TIME", 1000, dwarf, null);
getTimers().addTimer("RUN_TIME", 10000, dwarf, null);
}
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.UGH_IF_I_SEE_YOU_IN_THE_SPIRIT_WORLD_FIRST_ROUND_IS_ON_ME);
}
else if (npc.getId() == SILVERA)
{
npc.getInstanceWorld().getNpcs(DWARVES).forEach(n -> n.broadcastSay(ChatType.NPC_GENERAL, SHOUT_SILVERA_DEATH[Rnd.get(SHOUT_SILVERA_DEATH.length)]));
}
}
@Override
public String onSpellFinished(L2Npc npc, L2PcInstance player, Skill skill)
{
if ((npc.getId() == SIEGE_GOLEM) && (skill.getId() == SIEGE_GOLEM_SKILL_1.getSkillId()))
{
addMoveToDesire(npc, GOLEM_MOVE, 23);
npc.setIsRunning(true);
}
else if ((npc.getId() == INVISIBLE_NPC) && npc.getVariables().getString("type", "").equals("PULLER") && (skill.getId() == PULLER_SKILL.getSkillId()) && npc.isScriptValue(0))
{
npc.teleToLocation(PULLER_TELEPORT);
getTimers().addTimer("SECOND_PULL", 2000, npc, null);
}
else if ((npc.getId() == TEREDOR_TRANSPARENT) && (skill.getId() == TEREDOR_TRANSPARENT_SKILL.getSkillId()))
{
final L2Npc invisibleNpc = addSpawn(npc, INVISIBLE_NPC, npc.getLocation(), false, npc.getInstanceId());
invisibleNpc.getVariables().set("type", "BOUNCER");
addSpawn(npc, EARTH_WYRM_TRASKEN, npc.getLocation(), false, npc.getInstanceId());
npc.deleteMe();
}
return super.onSpellFinished(npc, player, skill);
}
@RegisterEvent(EventType.ON_PLAYER_CALL_TO_CHANGE_CLASS)
@RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
public void onPlayerCallToChangeClass(OnPlayerCallToChangeClass event)
{
enterInstance(event.getActiveChar(), null, TEMPLATE_ID);
}
@RegisterEvent(EventType.ON_PLAYER_LOGIN)
@RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
public void OnPlayerLogin(OnPlayerLogin event)
{
final L2PcInstance player = event.getActiveChar();
if ((player.getLevel() > 84) && player.isInCategory(CategoryType.FOURTH_CLASS_GROUP) && !player.isSubClassActive() && (player.getClassId() != ClassId.JUDICATOR))
{
for (ClassId newClass : player.getClassId().getNextClassIds())
{
player.sendPacket(new ExCallToChangeClass(newClass.getId(), false));
showOnScreenMsg(player, NpcStringId.FREE_THE_GIANT_FROM_HIS_IMPRISONMENT_AND_AWAKEN_YOUR_TRUE_POWER, ExShowScreenMessage.TOP_CENTER, 5000);
}
}
}
@RegisterEvent(EventType.ON_PLAYER_LEVEL_CHANGED)
@RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
public void OnPlayerLevelChanged(OnPlayerLevelChanged event)
{
final L2PcInstance player = event.getActiveChar();
if ((player.getLevel() > 84) && player.isInCategory(CategoryType.FOURTH_CLASS_GROUP) && !player.isSubClassActive() && (player.getClassId() != ClassId.JUDICATOR))
{
for (ClassId newClass : player.getClassId().getNextClassIds())
{
player.sendPacket(new ExCallToChangeClass(newClass.getId(), false));
showOnScreenMsg(player, NpcStringId.FREE_THE_GIANT_FROM_HIS_IMPRISONMENT_AND_AWAKEN_YOUR_TRUE_POWER, ExShowScreenMessage.TOP_CENTER, 5000);
}
}
}
private boolean isMoDInstance(Instance instance)
{
return (instance != null) && (instance.getTemplateId() == TEMPLATE_ID);
}
public static void main(String[] args)
{
new MemoryOfDisaster();
}
}