Orfen AI and grandboss SQL adjustments.
Contributed by nasseka.
This commit is contained in:
parent
8f163c49f8
commit
d7b9cc53de
@ -13,12 +13,12 @@ CREATE TABLE IF NOT EXISTS `grandboss_data` (
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
|
||||
|
||||
INSERT IGNORE INTO `grandboss_data` (`boss_id`,`loc_x`,`loc_y`,`loc_z`,`heading`,`currentHP`,`currentMP`) VALUES
|
||||
(29001, -21610, 181594, -5734, 0, 229898.48, 667.776), -- Queen Ant
|
||||
(29001, 93069, 8925, -3904, 0, 229898.48, 667.776), -- Queen Ant
|
||||
(29006, 17726, 108915, -6480, 0, 622493.58388, 3793.536), -- Core
|
||||
(29014, 55024, 17368, -5412, 10126, 622493.58388, 3793.536), -- Orfen
|
||||
(29014, 64418, 29467, -3792, 10126, 622493.58388, 3793.536), -- Orfen
|
||||
(29020, 116033, 17447, 10107, -25348, 4068372, 39960), -- Baium
|
||||
(29022, 52207, 217230, -3341, 0, 28531442, 12240), -- Zaken
|
||||
-- (29028, -105200, -253104, -15264, 0, 62041918, 2248572), -- Valakas
|
||||
(29068, 185708, 114298, -8221,32768, 62802301, 1998000); -- Antharas
|
||||
-- (25286, 185080, -12613, -5499, 16550, 556345880, 86847), -- Anakim
|
||||
-- (25283, 185062, -9605, -5499, 15640, 486021997, 79600), -- Lilith
|
||||
-- (25286, -6675, 18505, -5488, 16550, 556345880, 86847), -- Anakim
|
||||
-- (25283, 185059, -9610, -5488, 15640, 486021997, 79600), -- Lilith
|
||||
|
@ -16,14 +16,10 @@
|
||||
*/
|
||||
package ai.bosses.Orfen;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.gameserver.ai.CtrlIntention;
|
||||
import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
|
||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||
import org.l2jmobius.gameserver.model.Location;
|
||||
import org.l2jmobius.gameserver.model.Spawn;
|
||||
import org.l2jmobius.gameserver.model.StatSet;
|
||||
@ -35,8 +31,6 @@ import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.GrandBoss;
|
||||
import org.l2jmobius.gameserver.model.holders.SkillHolder;
|
||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||
import org.l2jmobius.gameserver.model.skill.SkillCaster;
|
||||
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
||||
import org.l2jmobius.gameserver.network.NpcStringId;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.PlaySound;
|
||||
|
||||
@ -44,17 +38,11 @@ import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Orfen's AI
|
||||
* @author Emperorc
|
||||
* @author Emperorc, NasSeKa
|
||||
*/
|
||||
public class Orfen extends AbstractNpcAI
|
||||
{
|
||||
private static final Location[] POS =
|
||||
{
|
||||
new Location(43728, 17220, -4342),
|
||||
new Location(55024, 17368, -5412),
|
||||
new Location(53504, 21248, -5486),
|
||||
new Location(53248, 24576, -5262)
|
||||
};
|
||||
private static final Location POS = new Location(64418, 29467, -3792);
|
||||
|
||||
private static final NpcStringId[] TEXT =
|
||||
{
|
||||
@ -65,33 +53,15 @@ public class Orfen extends AbstractNpcAI
|
||||
};
|
||||
|
||||
private static final int ORFEN = 29014;
|
||||
// private static final int RAIKEL = 29015;
|
||||
private static final int RAIKEL_LEOS = 29016;
|
||||
// private static final int RIBA = 29017;
|
||||
private static final int RIBA_IREN = 29018;
|
||||
|
||||
private static final byte ALIVE = 0;
|
||||
private static final byte DEAD = 1;
|
||||
|
||||
private static final SkillHolder PARALYSIS = new SkillHolder(4064, 1);
|
||||
private static final SkillHolder BLOW = new SkillHolder(4067, 4);
|
||||
private static final SkillHolder ORFEN_HEAL = new SkillHolder(4516, 1);
|
||||
|
||||
private static boolean _isTeleported;
|
||||
private static Set<Attackable> _minions = ConcurrentHashMap.newKeySet();
|
||||
private static ZoneType _zone;
|
||||
|
||||
private Orfen()
|
||||
{
|
||||
final int[] mobs =
|
||||
{
|
||||
ORFEN,
|
||||
RAIKEL_LEOS,
|
||||
RIBA_IREN
|
||||
};
|
||||
registerMobs(mobs);
|
||||
_isTeleported = false;
|
||||
_zone = ZoneManager.getInstance().getZoneById(12013);
|
||||
registerMobs(ORFEN);
|
||||
final StatSet info = GrandBossManager.getInstance().getStatSet(ORFEN);
|
||||
final int status = GrandBossManager.getInstance().getStatus(ORFEN);
|
||||
if (status == DEAD)
|
||||
@ -107,21 +77,7 @@ public class Orfen extends AbstractNpcAI
|
||||
else
|
||||
{
|
||||
// the time has already expired while the server was offline. Immediately spawn Orfen.
|
||||
final int i = getRandom(10);
|
||||
Location loc;
|
||||
if (i < 4)
|
||||
{
|
||||
loc = POS[1];
|
||||
}
|
||||
else if (i < 7)
|
||||
{
|
||||
loc = POS[2];
|
||||
}
|
||||
else
|
||||
{
|
||||
loc = POS[3];
|
||||
}
|
||||
final GrandBoss orfen = (GrandBoss) addSpawn(ORFEN, loc, false, 0);
|
||||
final GrandBoss orfen = (GrandBoss) addSpawn(ORFEN, POS, false, 0);
|
||||
GrandBossManager.getInstance().setStatus(ORFEN, ALIVE);
|
||||
spawnBoss(orfen);
|
||||
}
|
||||
@ -145,8 +101,8 @@ public class Orfen extends AbstractNpcAI
|
||||
((Attackable) npc).clearAggroList();
|
||||
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null);
|
||||
final Spawn spawn = npc.getSpawn();
|
||||
spawn.setLocation(POS[index]);
|
||||
npc.teleToLocation(POS[index], false);
|
||||
spawn.setLocation(POS);
|
||||
npc.teleToLocation(POS, false);
|
||||
}
|
||||
|
||||
public void spawnBoss(GrandBoss npc)
|
||||
@ -154,23 +110,6 @@ public class Orfen extends AbstractNpcAI
|
||||
GrandBossManager.getInstance().addBoss(npc);
|
||||
npc.broadcastPacket(new PlaySound(1, "BS01_A", 1, npc.getObjectId(), npc.getX(), npc.getY(), npc.getZ()));
|
||||
startQuestTimer("check_orfen_pos", 10000, npc, null, true);
|
||||
// Spawn minions
|
||||
final int x = npc.getX();
|
||||
final int y = npc.getY();
|
||||
Attackable mob;
|
||||
mob = (Attackable) addSpawn(RAIKEL_LEOS, x + 100, y + 100, npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
mob = (Attackable) addSpawn(RAIKEL_LEOS, x + 100, y - 100, npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
mob = (Attackable) addSpawn(RAIKEL_LEOS, x - 100, y + 100, npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
mob = (Attackable) addSpawn(RAIKEL_LEOS, x - 100, y - 100, npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
startQuestTimer("check_minion_loc", 10000, npc, null, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -178,62 +117,10 @@ public class Orfen extends AbstractNpcAI
|
||||
{
|
||||
if (event.equalsIgnoreCase("orfen_unlock"))
|
||||
{
|
||||
final int i = getRandom(10);
|
||||
Location loc;
|
||||
if (i < 4)
|
||||
{
|
||||
loc = POS[1];
|
||||
}
|
||||
else if (i < 7)
|
||||
{
|
||||
loc = POS[2];
|
||||
}
|
||||
else
|
||||
{
|
||||
loc = POS[3];
|
||||
}
|
||||
final GrandBoss orfen = (GrandBoss) addSpawn(ORFEN, loc, false, 0);
|
||||
final GrandBoss orfen = (GrandBoss) addSpawn(ORFEN, POS, false, 0);
|
||||
GrandBossManager.getInstance().setStatus(ORFEN, ALIVE);
|
||||
spawnBoss(orfen);
|
||||
}
|
||||
else if (event.equalsIgnoreCase("check_orfen_pos"))
|
||||
{
|
||||
if ((_isTeleported && (npc.getCurrentHp() > (npc.getMaxHp() * 0.95))) || (!_zone.isInsideZone(npc) && !_isTeleported))
|
||||
{
|
||||
setSpawnPoint(npc, getRandom(3) + 1);
|
||||
_isTeleported = false;
|
||||
}
|
||||
else if (_isTeleported && !_zone.isInsideZone(npc))
|
||||
{
|
||||
setSpawnPoint(npc, 0);
|
||||
}
|
||||
}
|
||||
else if (event.equalsIgnoreCase("check_minion_loc"))
|
||||
{
|
||||
for (Attackable mob : _minions)
|
||||
{
|
||||
if (!npc.isInsideRadius2D(mob, 3000))
|
||||
{
|
||||
mob.teleToLocation(npc.getLocation());
|
||||
((Attackable) npc).clearAggroList();
|
||||
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (event.equalsIgnoreCase("despawn_minions"))
|
||||
{
|
||||
for (Attackable mob : _minions)
|
||||
{
|
||||
mob.decayMe();
|
||||
}
|
||||
_minions.clear();
|
||||
}
|
||||
else if (event.equalsIgnoreCase("spawn_minion"))
|
||||
{
|
||||
final Attackable mob = (Attackable) addSpawn(RAIKEL_LEOS, npc.getX(), npc.getY(), npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
@ -254,49 +141,13 @@ public class Orfen extends AbstractNpcAI
|
||||
return super.onSkillSee(npc, caster, skill, targets, isSummon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onFactionCall(Npc npc, Npc caller, Player attacker, boolean isSummon)
|
||||
{
|
||||
if ((caller == null) || (npc == null) || npc.isCastingNow(SkillCaster::isAnyNormalType))
|
||||
{
|
||||
return super.onFactionCall(npc, caller, attacker, isSummon);
|
||||
}
|
||||
final int npcId = npc.getId();
|
||||
final int callerId = caller.getId();
|
||||
if ((npcId == RAIKEL_LEOS) && (getRandom(20) == 0))
|
||||
{
|
||||
npc.setTarget(attacker);
|
||||
npc.doCast(BLOW.getSkill());
|
||||
}
|
||||
else if (npcId == RIBA_IREN)
|
||||
{
|
||||
int chance = 1;
|
||||
if (callerId == ORFEN)
|
||||
{
|
||||
chance = 9;
|
||||
}
|
||||
if ((callerId != RIBA_IREN) && (caller.getCurrentHp() < (caller.getMaxHp() / 2.0)) && (getRandom(10) < chance))
|
||||
{
|
||||
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null);
|
||||
npc.setTarget(caller);
|
||||
npc.doCast(ORFEN_HEAL.getSkill());
|
||||
}
|
||||
}
|
||||
return super.onFactionCall(npc, caller, attacker, isSummon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon)
|
||||
{
|
||||
final int npcId = npc.getId();
|
||||
if (npcId == ORFEN)
|
||||
{
|
||||
if (!_isTeleported && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 4)))
|
||||
{
|
||||
_isTeleported = true;
|
||||
setSpawnPoint(npc, 0);
|
||||
}
|
||||
else if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0))
|
||||
if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0))
|
||||
{
|
||||
npc.broadcastSay(ChatType.NPC_GENERAL, TEXT[getRandom(3)], attacker.getName());
|
||||
attacker.teleToLocation(npc.getLocation());
|
||||
@ -304,14 +155,6 @@ public class Orfen extends AbstractNpcAI
|
||||
npc.doCast(PARALYSIS.getSkill());
|
||||
}
|
||||
}
|
||||
else if (npcId == RIBA_IREN)
|
||||
{
|
||||
if (!npc.isCastingNow(SkillCaster::isAnyNormalType) && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2.0)))
|
||||
{
|
||||
npc.setTarget(attacker);
|
||||
npc.doCast(ORFEN_HEAL.getSkill());
|
||||
}
|
||||
}
|
||||
return super.onAttack(npc, attacker, damage, isSummon);
|
||||
}
|
||||
|
||||
@ -330,15 +173,7 @@ public class Orfen extends AbstractNpcAI
|
||||
final StatSet info = GrandBossManager.getInstance().getStatSet(ORFEN);
|
||||
info.set("respawn_time", System.currentTimeMillis() + respawnTime);
|
||||
GrandBossManager.getInstance().setStatSet(ORFEN, info);
|
||||
cancelQuestTimer("check_minion_loc", npc, null);
|
||||
cancelQuestTimer("check_orfen_pos", npc, null);
|
||||
startQuestTimer("despawn_minions", 20000, null, null);
|
||||
cancelQuestTimers("spawn_minion");
|
||||
}
|
||||
else if ((GrandBossManager.getInstance().getStatus(ORFEN) == ALIVE) && (npc.getId() == RAIKEL_LEOS))
|
||||
{
|
||||
_minions.remove(npc);
|
||||
startQuestTimer("spawn_minion", 360000, npc, null);
|
||||
}
|
||||
return super.onKill(npc, killer, isSummon);
|
||||
}
|
||||
|
@ -760,9 +760,6 @@
|
||||
<param name="MoveAroundSocial" value="80" />
|
||||
<param name="MoveAroundSocial1" value="80" />
|
||||
<param name="MoveAroundSocial2" value="80" />
|
||||
<minions name="Privates">
|
||||
<npc id="29016" count="4" respawnTime="360" weightPoint="1" />
|
||||
</minions>
|
||||
</parameters>
|
||||
<race>FAIRY</race>
|
||||
<sex>FEMALE</sex>
|
||||
|
@ -13,12 +13,12 @@ CREATE TABLE IF NOT EXISTS `grandboss_data` (
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
|
||||
|
||||
INSERT IGNORE INTO `grandboss_data` (`boss_id`,`loc_x`,`loc_y`,`loc_z`,`heading`,`currentHP`,`currentMP`) VALUES
|
||||
(29001, -21610, 181594, -5734, 0, 229898.48, 667.776), -- Queen Ant
|
||||
(29001, 93069, 8925, -3904, 0, 229898.48, 667.776), -- Queen Ant
|
||||
(29006, 17726, 108915, -6480, 0, 622493.58388, 3793.536), -- Core
|
||||
(29014, 55024, 17368, -5412, 10126, 622493.58388, 3793.536), -- Orfen
|
||||
(29014, 64418, 29467, -3792, 10126, 622493.58388, 3793.536), -- Orfen
|
||||
(29020, 116033, 17447, 10107, -25348, 4068372, 39960), -- Baium
|
||||
(29022, 52207, 217230, -3341, 0, 28531442, 12240), -- Zaken
|
||||
-- (29028, -105200, -253104, -15264, 0, 62041918, 2248572), -- Valakas
|
||||
(29068, 185708, 114298, -8221,32768, 62802301, 1998000); -- Antharas
|
||||
-- (25286, 185080, -12613, -5499, 16550, 556345880, 86847), -- Anakim
|
||||
-- (25283, 185062, -9605, -5499, 15640, 486021997, 79600), -- Lilith
|
||||
-- (25286, -6675, 18505, -5488, 16550, 556345880, 86847), -- Anakim
|
||||
-- (25283, 185059, -9610, -5488, 15640, 486021997, 79600), -- Lilith
|
||||
|
@ -16,14 +16,10 @@
|
||||
*/
|
||||
package ai.bosses.Orfen;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.gameserver.ai.CtrlIntention;
|
||||
import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
|
||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||
import org.l2jmobius.gameserver.model.Location;
|
||||
import org.l2jmobius.gameserver.model.Spawn;
|
||||
import org.l2jmobius.gameserver.model.StatSet;
|
||||
@ -35,8 +31,6 @@ import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.GrandBoss;
|
||||
import org.l2jmobius.gameserver.model.holders.SkillHolder;
|
||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||
import org.l2jmobius.gameserver.model.skill.SkillCaster;
|
||||
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
||||
import org.l2jmobius.gameserver.network.NpcStringId;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.PlaySound;
|
||||
|
||||
@ -44,17 +38,11 @@ import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Orfen's AI
|
||||
* @author Emperorc
|
||||
* @author Emperorc, NasSeKa
|
||||
*/
|
||||
public class Orfen extends AbstractNpcAI
|
||||
{
|
||||
private static final Location[] POS =
|
||||
{
|
||||
new Location(43728, 17220, -4342),
|
||||
new Location(55024, 17368, -5412),
|
||||
new Location(53504, 21248, -5486),
|
||||
new Location(53248, 24576, -5262)
|
||||
};
|
||||
private static final Location POS = new Location(64418, 29467, -3792);
|
||||
|
||||
private static final NpcStringId[] TEXT =
|
||||
{
|
||||
@ -65,33 +53,15 @@ public class Orfen extends AbstractNpcAI
|
||||
};
|
||||
|
||||
private static final int ORFEN = 29014;
|
||||
// private static final int RAIKEL = 29015;
|
||||
private static final int RAIKEL_LEOS = 29016;
|
||||
// private static final int RIBA = 29017;
|
||||
private static final int RIBA_IREN = 29018;
|
||||
|
||||
private static final byte ALIVE = 0;
|
||||
private static final byte DEAD = 1;
|
||||
|
||||
private static final SkillHolder PARALYSIS = new SkillHolder(4064, 1);
|
||||
private static final SkillHolder BLOW = new SkillHolder(4067, 4);
|
||||
private static final SkillHolder ORFEN_HEAL = new SkillHolder(4516, 1);
|
||||
|
||||
private static boolean _isTeleported;
|
||||
private static Set<Attackable> _minions = ConcurrentHashMap.newKeySet();
|
||||
private static ZoneType _zone;
|
||||
|
||||
private Orfen()
|
||||
{
|
||||
final int[] mobs =
|
||||
{
|
||||
ORFEN,
|
||||
RAIKEL_LEOS,
|
||||
RIBA_IREN
|
||||
};
|
||||
registerMobs(mobs);
|
||||
_isTeleported = false;
|
||||
_zone = ZoneManager.getInstance().getZoneById(12013);
|
||||
registerMobs(ORFEN);
|
||||
final StatSet info = GrandBossManager.getInstance().getStatSet(ORFEN);
|
||||
final int status = GrandBossManager.getInstance().getStatus(ORFEN);
|
||||
if (status == DEAD)
|
||||
@ -107,21 +77,7 @@ public class Orfen extends AbstractNpcAI
|
||||
else
|
||||
{
|
||||
// the time has already expired while the server was offline. Immediately spawn Orfen.
|
||||
final int i = getRandom(10);
|
||||
Location loc;
|
||||
if (i < 4)
|
||||
{
|
||||
loc = POS[1];
|
||||
}
|
||||
else if (i < 7)
|
||||
{
|
||||
loc = POS[2];
|
||||
}
|
||||
else
|
||||
{
|
||||
loc = POS[3];
|
||||
}
|
||||
final GrandBoss orfen = (GrandBoss) addSpawn(ORFEN, loc, false, 0);
|
||||
final GrandBoss orfen = (GrandBoss) addSpawn(ORFEN, POS, false, 0);
|
||||
GrandBossManager.getInstance().setStatus(ORFEN, ALIVE);
|
||||
spawnBoss(orfen);
|
||||
}
|
||||
@ -145,8 +101,8 @@ public class Orfen extends AbstractNpcAI
|
||||
((Attackable) npc).clearAggroList();
|
||||
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null);
|
||||
final Spawn spawn = npc.getSpawn();
|
||||
spawn.setLocation(POS[index]);
|
||||
npc.teleToLocation(POS[index], false);
|
||||
spawn.setLocation(POS);
|
||||
npc.teleToLocation(POS, false);
|
||||
}
|
||||
|
||||
public void spawnBoss(GrandBoss npc)
|
||||
@ -154,23 +110,6 @@ public class Orfen extends AbstractNpcAI
|
||||
GrandBossManager.getInstance().addBoss(npc);
|
||||
npc.broadcastPacket(new PlaySound(1, "BS01_A", 1, npc.getObjectId(), npc.getX(), npc.getY(), npc.getZ()));
|
||||
startQuestTimer("check_orfen_pos", 10000, npc, null, true);
|
||||
// Spawn minions
|
||||
final int x = npc.getX();
|
||||
final int y = npc.getY();
|
||||
Attackable mob;
|
||||
mob = (Attackable) addSpawn(RAIKEL_LEOS, x + 100, y + 100, npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
mob = (Attackable) addSpawn(RAIKEL_LEOS, x + 100, y - 100, npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
mob = (Attackable) addSpawn(RAIKEL_LEOS, x - 100, y + 100, npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
mob = (Attackable) addSpawn(RAIKEL_LEOS, x - 100, y - 100, npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
startQuestTimer("check_minion_loc", 10000, npc, null, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -178,62 +117,10 @@ public class Orfen extends AbstractNpcAI
|
||||
{
|
||||
if (event.equalsIgnoreCase("orfen_unlock"))
|
||||
{
|
||||
final int i = getRandom(10);
|
||||
Location loc;
|
||||
if (i < 4)
|
||||
{
|
||||
loc = POS[1];
|
||||
}
|
||||
else if (i < 7)
|
||||
{
|
||||
loc = POS[2];
|
||||
}
|
||||
else
|
||||
{
|
||||
loc = POS[3];
|
||||
}
|
||||
final GrandBoss orfen = (GrandBoss) addSpawn(ORFEN, loc, false, 0);
|
||||
final GrandBoss orfen = (GrandBoss) addSpawn(ORFEN, POS, false, 0);
|
||||
GrandBossManager.getInstance().setStatus(ORFEN, ALIVE);
|
||||
spawnBoss(orfen);
|
||||
}
|
||||
else if (event.equalsIgnoreCase("check_orfen_pos"))
|
||||
{
|
||||
if ((_isTeleported && (npc.getCurrentHp() > (npc.getMaxHp() * 0.95))) || (!_zone.isInsideZone(npc) && !_isTeleported))
|
||||
{
|
||||
setSpawnPoint(npc, getRandom(3) + 1);
|
||||
_isTeleported = false;
|
||||
}
|
||||
else if (_isTeleported && !_zone.isInsideZone(npc))
|
||||
{
|
||||
setSpawnPoint(npc, 0);
|
||||
}
|
||||
}
|
||||
else if (event.equalsIgnoreCase("check_minion_loc"))
|
||||
{
|
||||
for (Attackable mob : _minions)
|
||||
{
|
||||
if (!npc.isInsideRadius2D(mob, 3000))
|
||||
{
|
||||
mob.teleToLocation(npc.getLocation());
|
||||
((Attackable) npc).clearAggroList();
|
||||
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (event.equalsIgnoreCase("despawn_minions"))
|
||||
{
|
||||
for (Attackable mob : _minions)
|
||||
{
|
||||
mob.decayMe();
|
||||
}
|
||||
_minions.clear();
|
||||
}
|
||||
else if (event.equalsIgnoreCase("spawn_minion"))
|
||||
{
|
||||
final Attackable mob = (Attackable) addSpawn(RAIKEL_LEOS, npc.getX(), npc.getY(), npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
@ -254,49 +141,13 @@ public class Orfen extends AbstractNpcAI
|
||||
return super.onSkillSee(npc, caster, skill, targets, isSummon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onFactionCall(Npc npc, Npc caller, Player attacker, boolean isSummon)
|
||||
{
|
||||
if ((caller == null) || (npc == null) || npc.isCastingNow(SkillCaster::isAnyNormalType))
|
||||
{
|
||||
return super.onFactionCall(npc, caller, attacker, isSummon);
|
||||
}
|
||||
final int npcId = npc.getId();
|
||||
final int callerId = caller.getId();
|
||||
if ((npcId == RAIKEL_LEOS) && (getRandom(20) == 0))
|
||||
{
|
||||
npc.setTarget(attacker);
|
||||
npc.doCast(BLOW.getSkill());
|
||||
}
|
||||
else if (npcId == RIBA_IREN)
|
||||
{
|
||||
int chance = 1;
|
||||
if (callerId == ORFEN)
|
||||
{
|
||||
chance = 9;
|
||||
}
|
||||
if ((callerId != RIBA_IREN) && (caller.getCurrentHp() < (caller.getMaxHp() / 2.0)) && (getRandom(10) < chance))
|
||||
{
|
||||
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null);
|
||||
npc.setTarget(caller);
|
||||
npc.doCast(ORFEN_HEAL.getSkill());
|
||||
}
|
||||
}
|
||||
return super.onFactionCall(npc, caller, attacker, isSummon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon)
|
||||
{
|
||||
final int npcId = npc.getId();
|
||||
if (npcId == ORFEN)
|
||||
{
|
||||
if (!_isTeleported && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 4)))
|
||||
{
|
||||
_isTeleported = true;
|
||||
setSpawnPoint(npc, 0);
|
||||
}
|
||||
else if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0))
|
||||
if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0))
|
||||
{
|
||||
npc.broadcastSay(ChatType.NPC_GENERAL, TEXT[getRandom(3)], attacker.getName());
|
||||
attacker.teleToLocation(npc.getLocation());
|
||||
@ -304,14 +155,6 @@ public class Orfen extends AbstractNpcAI
|
||||
npc.doCast(PARALYSIS.getSkill());
|
||||
}
|
||||
}
|
||||
else if (npcId == RIBA_IREN)
|
||||
{
|
||||
if (!npc.isCastingNow(SkillCaster::isAnyNormalType) && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2.0)))
|
||||
{
|
||||
npc.setTarget(attacker);
|
||||
npc.doCast(ORFEN_HEAL.getSkill());
|
||||
}
|
||||
}
|
||||
return super.onAttack(npc, attacker, damage, isSummon);
|
||||
}
|
||||
|
||||
@ -330,15 +173,7 @@ public class Orfen extends AbstractNpcAI
|
||||
final StatSet info = GrandBossManager.getInstance().getStatSet(ORFEN);
|
||||
info.set("respawn_time", System.currentTimeMillis() + respawnTime);
|
||||
GrandBossManager.getInstance().setStatSet(ORFEN, info);
|
||||
cancelQuestTimer("check_minion_loc", npc, null);
|
||||
cancelQuestTimer("check_orfen_pos", npc, null);
|
||||
startQuestTimer("despawn_minions", 20000, null, null);
|
||||
cancelQuestTimers("spawn_minion");
|
||||
}
|
||||
else if ((GrandBossManager.getInstance().getStatus(ORFEN) == ALIVE) && (npc.getId() == RAIKEL_LEOS))
|
||||
{
|
||||
_minions.remove(npc);
|
||||
startQuestTimer("spawn_minion", 360000, npc, null);
|
||||
}
|
||||
return super.onKill(npc, killer, isSummon);
|
||||
}
|
||||
|
@ -763,9 +763,6 @@
|
||||
<param name="MoveAroundSocial" value="80" />
|
||||
<param name="MoveAroundSocial1" value="80" />
|
||||
<param name="MoveAroundSocial2" value="80" />
|
||||
<minions name="Privates">
|
||||
<npc id="29016" count="4" respawnTime="360" weightPoint="1" />
|
||||
</minions>
|
||||
</parameters>
|
||||
<race>FAIRY</race>
|
||||
<sex>FEMALE</sex>
|
||||
|
@ -13,12 +13,12 @@ CREATE TABLE IF NOT EXISTS `grandboss_data` (
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
|
||||
|
||||
INSERT IGNORE INTO `grandboss_data` (`boss_id`,`loc_x`,`loc_y`,`loc_z`,`heading`,`currentHP`,`currentMP`) VALUES
|
||||
(29001, -21610, 181594, -5734, 0, 229898.48, 667.776), -- Queen Ant
|
||||
(29001, 93069, 8925, -3904, 0, 229898.48, 667.776), -- Queen Ant
|
||||
(29006, 17726, 108915, -6480, 0, 622493.58388, 3793.536), -- Core
|
||||
(29014, 55024, 17368, -5412, 10126, 622493.58388, 3793.536), -- Orfen
|
||||
(29014, 64418, 29467, -3792, 10126, 622493.58388, 3793.536), -- Orfen
|
||||
(29020, 116033, 17447, 10107, -25348, 4068372, 39960), -- Baium
|
||||
(29022, 52207, 217230, -3341, 0, 28531442, 12240), -- Zaken
|
||||
-- (29028, -105200, -253104, -15264, 0, 62041918, 2248572), -- Valakas
|
||||
(29068, 185708, 114298, -8221,32768, 62802301, 1998000); -- Antharas
|
||||
-- (25286, 185080, -12613, -5499, 16550, 556345880, 86847), -- Anakim
|
||||
-- (25283, 185062, -9605, -5499, 15640, 486021997, 79600), -- Lilith
|
||||
-- (25286, -6675, 18505, -5488, 16550, 556345880, 86847), -- Anakim
|
||||
-- (25283, 185059, -9610, -5488, 15640, 486021997, 79600), -- Lilith
|
||||
|
@ -16,14 +16,10 @@
|
||||
*/
|
||||
package ai.bosses.Orfen;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.gameserver.ai.CtrlIntention;
|
||||
import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
|
||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||
import org.l2jmobius.gameserver.model.Location;
|
||||
import org.l2jmobius.gameserver.model.Spawn;
|
||||
import org.l2jmobius.gameserver.model.StatSet;
|
||||
@ -35,8 +31,6 @@ import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.GrandBoss;
|
||||
import org.l2jmobius.gameserver.model.holders.SkillHolder;
|
||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||
import org.l2jmobius.gameserver.model.skill.SkillCaster;
|
||||
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
||||
import org.l2jmobius.gameserver.network.NpcStringId;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.PlaySound;
|
||||
|
||||
@ -44,17 +38,11 @@ import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Orfen's AI
|
||||
* @author Emperorc
|
||||
* @author Emperorc, NasSeKa
|
||||
*/
|
||||
public class Orfen extends AbstractNpcAI
|
||||
{
|
||||
private static final Location[] POS =
|
||||
{
|
||||
new Location(43728, 17220, -4342),
|
||||
new Location(55024, 17368, -5412),
|
||||
new Location(53504, 21248, -5486),
|
||||
new Location(53248, 24576, -5262)
|
||||
};
|
||||
private static final Location POS = new Location(64418, 29467, -3792);
|
||||
|
||||
private static final NpcStringId[] TEXT =
|
||||
{
|
||||
@ -65,33 +53,15 @@ public class Orfen extends AbstractNpcAI
|
||||
};
|
||||
|
||||
private static final int ORFEN = 29014;
|
||||
// private static final int RAIKEL = 29015;
|
||||
private static final int RAIKEL_LEOS = 29016;
|
||||
// private static final int RIBA = 29017;
|
||||
private static final int RIBA_IREN = 29018;
|
||||
|
||||
private static final byte ALIVE = 0;
|
||||
private static final byte DEAD = 1;
|
||||
|
||||
private static final SkillHolder PARALYSIS = new SkillHolder(4064, 1);
|
||||
private static final SkillHolder BLOW = new SkillHolder(4067, 4);
|
||||
private static final SkillHolder ORFEN_HEAL = new SkillHolder(4516, 1);
|
||||
|
||||
private static boolean _isTeleported;
|
||||
private static Set<Attackable> _minions = ConcurrentHashMap.newKeySet();
|
||||
private static ZoneType _zone;
|
||||
|
||||
private Orfen()
|
||||
{
|
||||
final int[] mobs =
|
||||
{
|
||||
ORFEN,
|
||||
RAIKEL_LEOS,
|
||||
RIBA_IREN
|
||||
};
|
||||
registerMobs(mobs);
|
||||
_isTeleported = false;
|
||||
_zone = ZoneManager.getInstance().getZoneById(12013);
|
||||
registerMobs(ORFEN);
|
||||
final StatSet info = GrandBossManager.getInstance().getStatSet(ORFEN);
|
||||
final int status = GrandBossManager.getInstance().getStatus(ORFEN);
|
||||
if (status == DEAD)
|
||||
@ -107,21 +77,7 @@ public class Orfen extends AbstractNpcAI
|
||||
else
|
||||
{
|
||||
// the time has already expired while the server was offline. Immediately spawn Orfen.
|
||||
final int i = getRandom(10);
|
||||
Location loc;
|
||||
if (i < 4)
|
||||
{
|
||||
loc = POS[1];
|
||||
}
|
||||
else if (i < 7)
|
||||
{
|
||||
loc = POS[2];
|
||||
}
|
||||
else
|
||||
{
|
||||
loc = POS[3];
|
||||
}
|
||||
final GrandBoss orfen = (GrandBoss) addSpawn(ORFEN, loc, false, 0);
|
||||
final GrandBoss orfen = (GrandBoss) addSpawn(ORFEN, POS, false, 0);
|
||||
GrandBossManager.getInstance().setStatus(ORFEN, ALIVE);
|
||||
spawnBoss(orfen);
|
||||
}
|
||||
@ -145,8 +101,8 @@ public class Orfen extends AbstractNpcAI
|
||||
((Attackable) npc).clearAggroList();
|
||||
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null);
|
||||
final Spawn spawn = npc.getSpawn();
|
||||
spawn.setLocation(POS[index]);
|
||||
npc.teleToLocation(POS[index], false);
|
||||
spawn.setLocation(POS);
|
||||
npc.teleToLocation(POS, false);
|
||||
}
|
||||
|
||||
public void spawnBoss(GrandBoss npc)
|
||||
@ -154,23 +110,6 @@ public class Orfen extends AbstractNpcAI
|
||||
GrandBossManager.getInstance().addBoss(npc);
|
||||
npc.broadcastPacket(new PlaySound(1, "BS01_A", 1, npc.getObjectId(), npc.getX(), npc.getY(), npc.getZ()));
|
||||
startQuestTimer("check_orfen_pos", 10000, npc, null, true);
|
||||
// Spawn minions
|
||||
final int x = npc.getX();
|
||||
final int y = npc.getY();
|
||||
Attackable mob;
|
||||
mob = (Attackable) addSpawn(RAIKEL_LEOS, x + 100, y + 100, npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
mob = (Attackable) addSpawn(RAIKEL_LEOS, x + 100, y - 100, npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
mob = (Attackable) addSpawn(RAIKEL_LEOS, x - 100, y + 100, npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
mob = (Attackable) addSpawn(RAIKEL_LEOS, x - 100, y - 100, npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
startQuestTimer("check_minion_loc", 10000, npc, null, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -178,62 +117,10 @@ public class Orfen extends AbstractNpcAI
|
||||
{
|
||||
if (event.equalsIgnoreCase("orfen_unlock"))
|
||||
{
|
||||
final int i = getRandom(10);
|
||||
Location loc;
|
||||
if (i < 4)
|
||||
{
|
||||
loc = POS[1];
|
||||
}
|
||||
else if (i < 7)
|
||||
{
|
||||
loc = POS[2];
|
||||
}
|
||||
else
|
||||
{
|
||||
loc = POS[3];
|
||||
}
|
||||
final GrandBoss orfen = (GrandBoss) addSpawn(ORFEN, loc, false, 0);
|
||||
final GrandBoss orfen = (GrandBoss) addSpawn(ORFEN, POS, false, 0);
|
||||
GrandBossManager.getInstance().setStatus(ORFEN, ALIVE);
|
||||
spawnBoss(orfen);
|
||||
}
|
||||
else if (event.equalsIgnoreCase("check_orfen_pos"))
|
||||
{
|
||||
if ((_isTeleported && (npc.getCurrentHp() > (npc.getMaxHp() * 0.95))) || (!_zone.isInsideZone(npc) && !_isTeleported))
|
||||
{
|
||||
setSpawnPoint(npc, getRandom(3) + 1);
|
||||
_isTeleported = false;
|
||||
}
|
||||
else if (_isTeleported && !_zone.isInsideZone(npc))
|
||||
{
|
||||
setSpawnPoint(npc, 0);
|
||||
}
|
||||
}
|
||||
else if (event.equalsIgnoreCase("check_minion_loc"))
|
||||
{
|
||||
for (Attackable mob : _minions)
|
||||
{
|
||||
if (!npc.isInsideRadius2D(mob, 3000))
|
||||
{
|
||||
mob.teleToLocation(npc.getLocation());
|
||||
((Attackable) npc).clearAggroList();
|
||||
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (event.equalsIgnoreCase("despawn_minions"))
|
||||
{
|
||||
for (Attackable mob : _minions)
|
||||
{
|
||||
mob.decayMe();
|
||||
}
|
||||
_minions.clear();
|
||||
}
|
||||
else if (event.equalsIgnoreCase("spawn_minion"))
|
||||
{
|
||||
final Attackable mob = (Attackable) addSpawn(RAIKEL_LEOS, npc.getX(), npc.getY(), npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
@ -254,49 +141,13 @@ public class Orfen extends AbstractNpcAI
|
||||
return super.onSkillSee(npc, caster, skill, targets, isSummon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onFactionCall(Npc npc, Npc caller, Player attacker, boolean isSummon)
|
||||
{
|
||||
if ((caller == null) || (npc == null) || npc.isCastingNow(SkillCaster::isAnyNormalType))
|
||||
{
|
||||
return super.onFactionCall(npc, caller, attacker, isSummon);
|
||||
}
|
||||
final int npcId = npc.getId();
|
||||
final int callerId = caller.getId();
|
||||
if ((npcId == RAIKEL_LEOS) && (getRandom(20) == 0))
|
||||
{
|
||||
npc.setTarget(attacker);
|
||||
npc.doCast(BLOW.getSkill());
|
||||
}
|
||||
else if (npcId == RIBA_IREN)
|
||||
{
|
||||
int chance = 1;
|
||||
if (callerId == ORFEN)
|
||||
{
|
||||
chance = 9;
|
||||
}
|
||||
if ((callerId != RIBA_IREN) && (caller.getCurrentHp() < (caller.getMaxHp() / 2.0)) && (getRandom(10) < chance))
|
||||
{
|
||||
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null);
|
||||
npc.setTarget(caller);
|
||||
npc.doCast(ORFEN_HEAL.getSkill());
|
||||
}
|
||||
}
|
||||
return super.onFactionCall(npc, caller, attacker, isSummon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon)
|
||||
{
|
||||
final int npcId = npc.getId();
|
||||
if (npcId == ORFEN)
|
||||
{
|
||||
if (!_isTeleported && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 4)))
|
||||
{
|
||||
_isTeleported = true;
|
||||
setSpawnPoint(npc, 0);
|
||||
}
|
||||
else if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0))
|
||||
if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0))
|
||||
{
|
||||
npc.broadcastSay(ChatType.NPC_GENERAL, TEXT[getRandom(3)], attacker.getName());
|
||||
attacker.teleToLocation(npc.getLocation());
|
||||
@ -304,14 +155,6 @@ public class Orfen extends AbstractNpcAI
|
||||
npc.doCast(PARALYSIS.getSkill());
|
||||
}
|
||||
}
|
||||
else if (npcId == RIBA_IREN)
|
||||
{
|
||||
if (!npc.isCastingNow(SkillCaster::isAnyNormalType) && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2.0)))
|
||||
{
|
||||
npc.setTarget(attacker);
|
||||
npc.doCast(ORFEN_HEAL.getSkill());
|
||||
}
|
||||
}
|
||||
return super.onAttack(npc, attacker, damage, isSummon);
|
||||
}
|
||||
|
||||
@ -330,15 +173,7 @@ public class Orfen extends AbstractNpcAI
|
||||
final StatSet info = GrandBossManager.getInstance().getStatSet(ORFEN);
|
||||
info.set("respawn_time", System.currentTimeMillis() + respawnTime);
|
||||
GrandBossManager.getInstance().setStatSet(ORFEN, info);
|
||||
cancelQuestTimer("check_minion_loc", npc, null);
|
||||
cancelQuestTimer("check_orfen_pos", npc, null);
|
||||
startQuestTimer("despawn_minions", 20000, null, null);
|
||||
cancelQuestTimers("spawn_minion");
|
||||
}
|
||||
else if ((GrandBossManager.getInstance().getStatus(ORFEN) == ALIVE) && (npc.getId() == RAIKEL_LEOS))
|
||||
{
|
||||
_minions.remove(npc);
|
||||
startQuestTimer("spawn_minion", 360000, npc, null);
|
||||
}
|
||||
return super.onKill(npc, killer, isSummon);
|
||||
}
|
||||
|
@ -763,9 +763,6 @@
|
||||
<param name="MoveAroundSocial" value="80" />
|
||||
<param name="MoveAroundSocial1" value="80" />
|
||||
<param name="MoveAroundSocial2" value="80" />
|
||||
<minions name="Privates">
|
||||
<npc id="29016" count="4" respawnTime="360" weightPoint="1" />
|
||||
</minions>
|
||||
</parameters>
|
||||
<race>FAIRY</race>
|
||||
<sex>FEMALE</sex>
|
||||
|
@ -13,12 +13,12 @@ CREATE TABLE IF NOT EXISTS `grandboss_data` (
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
|
||||
|
||||
INSERT IGNORE INTO `grandboss_data` (`boss_id`,`loc_x`,`loc_y`,`loc_z`,`heading`,`currentHP`,`currentMP`) VALUES
|
||||
(29001, -21610, 181594, -5734, 0, 229898.48, 667.776), -- Queen Ant
|
||||
(29001, 93069, 8925, -3904, 0, 229898.48, 667.776), -- Queen Ant
|
||||
(29006, 17726, 108915, -6480, 0, 622493.58388, 3793.536), -- Core
|
||||
(29014, 55024, 17368, -5412, 10126, 622493.58388, 3793.536), -- Orfen
|
||||
(29014, 64418, 29467, -3792, 10126, 622493.58388, 3793.536), -- Orfen
|
||||
(29020, 116033, 17447, 10107, -25348, 4068372, 39960), -- Baium
|
||||
(29022, 52207, 217230, -3341, 0, 28531442, 12240), -- Zaken
|
||||
-- (29028, -105200, -253104, -15264, 0, 62041918, 2248572), -- Valakas
|
||||
(29068, 185708, 114298, -8221,32768, 62802301, 1998000); -- Antharas
|
||||
-- (25286, 185080, -12613, -5499, 16550, 556345880, 86847), -- Anakim
|
||||
-- (25283, 185062, -9605, -5499, 15640, 486021997, 79600), -- Lilith
|
||||
-- (25286, -6675, 18505, -5488, 16550, 556345880, 86847), -- Anakim
|
||||
-- (25283, 185059, -9610, -5488, 15640, 486021997, 79600), -- Lilith
|
||||
|
@ -16,14 +16,10 @@
|
||||
*/
|
||||
package ai.bosses.Orfen;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.gameserver.ai.CtrlIntention;
|
||||
import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
|
||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||
import org.l2jmobius.gameserver.model.Location;
|
||||
import org.l2jmobius.gameserver.model.Spawn;
|
||||
import org.l2jmobius.gameserver.model.StatSet;
|
||||
@ -35,8 +31,6 @@ import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.GrandBoss;
|
||||
import org.l2jmobius.gameserver.model.holders.SkillHolder;
|
||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||
import org.l2jmobius.gameserver.model.skill.SkillCaster;
|
||||
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
||||
import org.l2jmobius.gameserver.network.NpcStringId;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.PlaySound;
|
||||
|
||||
@ -44,17 +38,11 @@ import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Orfen's AI
|
||||
* @author Emperorc
|
||||
* @author Emperorc, NasSeKa
|
||||
*/
|
||||
public class Orfen extends AbstractNpcAI
|
||||
{
|
||||
private static final Location[] POS =
|
||||
{
|
||||
new Location(43728, 17220, -4342),
|
||||
new Location(55024, 17368, -5412),
|
||||
new Location(53504, 21248, -5486),
|
||||
new Location(53248, 24576, -5262)
|
||||
};
|
||||
private static final Location POS = new Location(64418, 29467, -3792);
|
||||
|
||||
private static final NpcStringId[] TEXT =
|
||||
{
|
||||
@ -65,33 +53,15 @@ public class Orfen extends AbstractNpcAI
|
||||
};
|
||||
|
||||
private static final int ORFEN = 29014;
|
||||
// private static final int RAIKEL = 29015;
|
||||
private static final int RAIKEL_LEOS = 29016;
|
||||
// private static final int RIBA = 29017;
|
||||
private static final int RIBA_IREN = 29018;
|
||||
|
||||
private static final byte ALIVE = 0;
|
||||
private static final byte DEAD = 1;
|
||||
|
||||
private static final SkillHolder PARALYSIS = new SkillHolder(4064, 1);
|
||||
private static final SkillHolder BLOW = new SkillHolder(4067, 4);
|
||||
private static final SkillHolder ORFEN_HEAL = new SkillHolder(4516, 1);
|
||||
|
||||
private static boolean _isTeleported;
|
||||
private static Set<Attackable> _minions = ConcurrentHashMap.newKeySet();
|
||||
private static ZoneType _zone;
|
||||
|
||||
private Orfen()
|
||||
{
|
||||
final int[] mobs =
|
||||
{
|
||||
ORFEN,
|
||||
RAIKEL_LEOS,
|
||||
RIBA_IREN
|
||||
};
|
||||
registerMobs(mobs);
|
||||
_isTeleported = false;
|
||||
_zone = ZoneManager.getInstance().getZoneById(12013);
|
||||
registerMobs(ORFEN);
|
||||
final StatSet info = GrandBossManager.getInstance().getStatSet(ORFEN);
|
||||
final int status = GrandBossManager.getInstance().getStatus(ORFEN);
|
||||
if (status == DEAD)
|
||||
@ -107,21 +77,7 @@ public class Orfen extends AbstractNpcAI
|
||||
else
|
||||
{
|
||||
// the time has already expired while the server was offline. Immediately spawn Orfen.
|
||||
final int i = getRandom(10);
|
||||
Location loc;
|
||||
if (i < 4)
|
||||
{
|
||||
loc = POS[1];
|
||||
}
|
||||
else if (i < 7)
|
||||
{
|
||||
loc = POS[2];
|
||||
}
|
||||
else
|
||||
{
|
||||
loc = POS[3];
|
||||
}
|
||||
final GrandBoss orfen = (GrandBoss) addSpawn(ORFEN, loc, false, 0);
|
||||
final GrandBoss orfen = (GrandBoss) addSpawn(ORFEN, POS, false, 0);
|
||||
GrandBossManager.getInstance().setStatus(ORFEN, ALIVE);
|
||||
spawnBoss(orfen);
|
||||
}
|
||||
@ -145,8 +101,8 @@ public class Orfen extends AbstractNpcAI
|
||||
((Attackable) npc).clearAggroList();
|
||||
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null);
|
||||
final Spawn spawn = npc.getSpawn();
|
||||
spawn.setLocation(POS[index]);
|
||||
npc.teleToLocation(POS[index], false);
|
||||
spawn.setLocation(POS);
|
||||
npc.teleToLocation(POS, false);
|
||||
}
|
||||
|
||||
public void spawnBoss(GrandBoss npc)
|
||||
@ -154,23 +110,6 @@ public class Orfen extends AbstractNpcAI
|
||||
GrandBossManager.getInstance().addBoss(npc);
|
||||
npc.broadcastPacket(new PlaySound(1, "BS01_A", 1, npc.getObjectId(), npc.getX(), npc.getY(), npc.getZ()));
|
||||
startQuestTimer("check_orfen_pos", 10000, npc, null, true);
|
||||
// Spawn minions
|
||||
final int x = npc.getX();
|
||||
final int y = npc.getY();
|
||||
Attackable mob;
|
||||
mob = (Attackable) addSpawn(RAIKEL_LEOS, x + 100, y + 100, npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
mob = (Attackable) addSpawn(RAIKEL_LEOS, x + 100, y - 100, npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
mob = (Attackable) addSpawn(RAIKEL_LEOS, x - 100, y + 100, npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
mob = (Attackable) addSpawn(RAIKEL_LEOS, x - 100, y - 100, npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
startQuestTimer("check_minion_loc", 10000, npc, null, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -178,62 +117,10 @@ public class Orfen extends AbstractNpcAI
|
||||
{
|
||||
if (event.equalsIgnoreCase("orfen_unlock"))
|
||||
{
|
||||
final int i = getRandom(10);
|
||||
Location loc;
|
||||
if (i < 4)
|
||||
{
|
||||
loc = POS[1];
|
||||
}
|
||||
else if (i < 7)
|
||||
{
|
||||
loc = POS[2];
|
||||
}
|
||||
else
|
||||
{
|
||||
loc = POS[3];
|
||||
}
|
||||
final GrandBoss orfen = (GrandBoss) addSpawn(ORFEN, loc, false, 0);
|
||||
final GrandBoss orfen = (GrandBoss) addSpawn(ORFEN, POS, false, 0);
|
||||
GrandBossManager.getInstance().setStatus(ORFEN, ALIVE);
|
||||
spawnBoss(orfen);
|
||||
}
|
||||
else if (event.equalsIgnoreCase("check_orfen_pos"))
|
||||
{
|
||||
if ((_isTeleported && (npc.getCurrentHp() > (npc.getMaxHp() * 0.95))) || (!_zone.isInsideZone(npc) && !_isTeleported))
|
||||
{
|
||||
setSpawnPoint(npc, getRandom(3) + 1);
|
||||
_isTeleported = false;
|
||||
}
|
||||
else if (_isTeleported && !_zone.isInsideZone(npc))
|
||||
{
|
||||
setSpawnPoint(npc, 0);
|
||||
}
|
||||
}
|
||||
else if (event.equalsIgnoreCase("check_minion_loc"))
|
||||
{
|
||||
for (Attackable mob : _minions)
|
||||
{
|
||||
if (!npc.isInsideRadius2D(mob, 3000))
|
||||
{
|
||||
mob.teleToLocation(npc.getLocation());
|
||||
((Attackable) npc).clearAggroList();
|
||||
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (event.equalsIgnoreCase("despawn_minions"))
|
||||
{
|
||||
for (Attackable mob : _minions)
|
||||
{
|
||||
mob.decayMe();
|
||||
}
|
||||
_minions.clear();
|
||||
}
|
||||
else if (event.equalsIgnoreCase("spawn_minion"))
|
||||
{
|
||||
final Attackable mob = (Attackable) addSpawn(RAIKEL_LEOS, npc.getX(), npc.getY(), npc.getZ(), 0, false, 0);
|
||||
mob.setIsRaidMinion(true);
|
||||
_minions.add(mob);
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
@ -254,49 +141,13 @@ public class Orfen extends AbstractNpcAI
|
||||
return super.onSkillSee(npc, caster, skill, targets, isSummon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onFactionCall(Npc npc, Npc caller, Player attacker, boolean isSummon)
|
||||
{
|
||||
if ((caller == null) || (npc == null) || npc.isCastingNow(SkillCaster::isAnyNormalType))
|
||||
{
|
||||
return super.onFactionCall(npc, caller, attacker, isSummon);
|
||||
}
|
||||
final int npcId = npc.getId();
|
||||
final int callerId = caller.getId();
|
||||
if ((npcId == RAIKEL_LEOS) && (getRandom(20) == 0))
|
||||
{
|
||||
npc.setTarget(attacker);
|
||||
npc.doCast(BLOW.getSkill());
|
||||
}
|
||||
else if (npcId == RIBA_IREN)
|
||||
{
|
||||
int chance = 1;
|
||||
if (callerId == ORFEN)
|
||||
{
|
||||
chance = 9;
|
||||
}
|
||||
if ((callerId != RIBA_IREN) && (caller.getCurrentHp() < (caller.getMaxHp() / 2.0)) && (getRandom(10) < chance))
|
||||
{
|
||||
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null);
|
||||
npc.setTarget(caller);
|
||||
npc.doCast(ORFEN_HEAL.getSkill());
|
||||
}
|
||||
}
|
||||
return super.onFactionCall(npc, caller, attacker, isSummon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon)
|
||||
{
|
||||
final int npcId = npc.getId();
|
||||
if (npcId == ORFEN)
|
||||
{
|
||||
if (!_isTeleported && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 4)))
|
||||
{
|
||||
_isTeleported = true;
|
||||
setSpawnPoint(npc, 0);
|
||||
}
|
||||
else if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0))
|
||||
if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0))
|
||||
{
|
||||
npc.broadcastSay(ChatType.NPC_GENERAL, TEXT[getRandom(3)], attacker.getName());
|
||||
attacker.teleToLocation(npc.getLocation());
|
||||
@ -304,14 +155,6 @@ public class Orfen extends AbstractNpcAI
|
||||
npc.doCast(PARALYSIS.getSkill());
|
||||
}
|
||||
}
|
||||
else if (npcId == RIBA_IREN)
|
||||
{
|
||||
if (!npc.isCastingNow(SkillCaster::isAnyNormalType) && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2.0)))
|
||||
{
|
||||
npc.setTarget(attacker);
|
||||
npc.doCast(ORFEN_HEAL.getSkill());
|
||||
}
|
||||
}
|
||||
return super.onAttack(npc, attacker, damage, isSummon);
|
||||
}
|
||||
|
||||
@ -330,15 +173,7 @@ public class Orfen extends AbstractNpcAI
|
||||
final StatSet info = GrandBossManager.getInstance().getStatSet(ORFEN);
|
||||
info.set("respawn_time", System.currentTimeMillis() + respawnTime);
|
||||
GrandBossManager.getInstance().setStatSet(ORFEN, info);
|
||||
cancelQuestTimer("check_minion_loc", npc, null);
|
||||
cancelQuestTimer("check_orfen_pos", npc, null);
|
||||
startQuestTimer("despawn_minions", 20000, null, null);
|
||||
cancelQuestTimers("spawn_minion");
|
||||
}
|
||||
else if ((GrandBossManager.getInstance().getStatus(ORFEN) == ALIVE) && (npc.getId() == RAIKEL_LEOS))
|
||||
{
|
||||
_minions.remove(npc);
|
||||
startQuestTimer("spawn_minion", 360000, npc, null);
|
||||
}
|
||||
return super.onKill(npc, killer, isSummon);
|
||||
}
|
||||
|
@ -763,9 +763,6 @@
|
||||
<param name="MoveAroundSocial" value="80" />
|
||||
<param name="MoveAroundSocial1" value="80" />
|
||||
<param name="MoveAroundSocial2" value="80" />
|
||||
<minions name="Privates">
|
||||
<npc id="29016" count="4" respawnTime="360" weightPoint="1" />
|
||||
</minions>
|
||||
</parameters>
|
||||
<race>FAIRY</race>
|
||||
<sex>FEMALE</sex>
|
||||
|
Loading…
Reference in New Issue
Block a user