Raidboss changes.
Contributed by champzix1.
This commit is contained in:
@@ -847,7 +847,7 @@ public class Trasken extends AbstractNpcAI
|
||||
{
|
||||
tie_trasken = addSpawn(TAIL_TRASKEN, CENTER_LOCATION, false, 0, true);
|
||||
hp_tail = tie_trasken.getCurrentHp();
|
||||
startQuestTimer("spawn_rnd", 30000, tie_trasken, null);
|
||||
startQuestTimer("spawn_rnd", 3000000, tie_trasken, null);
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
@@ -858,7 +858,7 @@ public class Trasken extends AbstractNpcAI
|
||||
trasken.doCast(SKILL_TRASKEN_UP.getSkill());
|
||||
hp_trasken = trasken.getCurrentHp();
|
||||
|
||||
startQuestTimer("spawn_rnd", 70000, trasken, null);
|
||||
startQuestTimer("spawn_rnd", 9000000, trasken, null);
|
||||
for (Location loc : Spawn_Larva_1)
|
||||
{
|
||||
addSpawn(LAVRA_1, loc, false, 0, true);
|
||||
|
@@ -16,32 +16,23 @@
|
||||
*/
|
||||
package ai.bosses.Valakas;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.gameserver.ai.CtrlIntention;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
|
||||
import org.l2jmobius.gameserver.enums.MountType;
|
||||
import org.l2jmobius.gameserver.geoengine.GeoEngine;
|
||||
import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
|
||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||
import org.l2jmobius.gameserver.model.Location;
|
||||
import org.l2jmobius.gameserver.model.StatsSet;
|
||||
import org.l2jmobius.gameserver.model.World;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.GrandBossInstance;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.holders.SkillHolder;
|
||||
import org.l2jmobius.gameserver.model.skills.BuffInfo;
|
||||
import org.l2jmobius.gameserver.model.skills.Skill;
|
||||
import org.l2jmobius.gameserver.model.skills.SkillCaster;
|
||||
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.PlaySound;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.SocialAction;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.SpecialCamera;
|
||||
import org.l2jmobius.gameserver.util.Util;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
@@ -54,36 +45,36 @@ public final class Valakas extends AbstractNpcAI
|
||||
// NPC
|
||||
private static final int VALAKAS = 29028;
|
||||
// Skills
|
||||
private static final SkillHolder VALAKAS_LAVA_SKIN = new SkillHolder(4680, 1);
|
||||
// private static final SkillHolder VALAKAS_LAVA_SKIN = new SkillHolder(4680, 1);
|
||||
private static final int VALAKAS_REGENERATION = 4691;
|
||||
|
||||
private static final SkillHolder[] VALAKAS_REGULAR_SKILLS =
|
||||
{
|
||||
new SkillHolder(4681, 1), // Valakas Trample
|
||||
new SkillHolder(4682, 1), // Valakas Trample
|
||||
new SkillHolder(4683, 1), // Valakas Dragon Breath
|
||||
new SkillHolder(4689, 1), // Valakas Fear TODO: has two levels only level one is used.
|
||||
};
|
||||
|
||||
private static final SkillHolder[] VALAKAS_LOWHP_SKILLS =
|
||||
{
|
||||
new SkillHolder(4681, 1), // Valakas Trample
|
||||
new SkillHolder(4682, 1), // Valakas Trample
|
||||
new SkillHolder(4683, 1), // Valakas Dragon Breath
|
||||
new SkillHolder(4689, 1), // Valakas Fear TODO: has two levels only level one is used.
|
||||
new SkillHolder(4690, 1), // Valakas Meteor Storm
|
||||
};
|
||||
|
||||
private static final SkillHolder[] VALAKAS_AOE_SKILLS =
|
||||
{
|
||||
new SkillHolder(4683, 1), // Valakas Dragon Breath
|
||||
new SkillHolder(4684, 1), // Valakas Dragon Breath
|
||||
new SkillHolder(4685, 1), // Valakas Tail Stomp
|
||||
new SkillHolder(4686, 1), // Valakas Tail Stomp
|
||||
new SkillHolder(4688, 1), // Valakas Stun
|
||||
new SkillHolder(4689, 1), // Valakas Fear TODO: has two levels only level one is used.
|
||||
new SkillHolder(4690, 1), // Valakas Meteor Storm
|
||||
};
|
||||
// private static final SkillHolder[] VALAKAS_REGULAR_SKILLS =
|
||||
// {
|
||||
// new SkillHolder(4681, 1), // Valakas Trample
|
||||
// new SkillHolder(4682, 1), // Valakas Trample
|
||||
// new SkillHolder(4683, 1), // Valakas Dragon Breath
|
||||
// new SkillHolder(4689, 1), // Valakas Fear TODO: has two levels only level one is used.
|
||||
// };
|
||||
//
|
||||
// private static final SkillHolder[] VALAKAS_LOWHP_SKILLS =
|
||||
// {
|
||||
// new SkillHolder(4681, 1), // Valakas Trample
|
||||
// new SkillHolder(4682, 1), // Valakas Trample
|
||||
// new SkillHolder(4683, 1), // Valakas Dragon Breath
|
||||
// new SkillHolder(4689, 1), // Valakas Fear TODO: has two levels only level one is used.
|
||||
// new SkillHolder(4690, 1), // Valakas Meteor Storm
|
||||
// };
|
||||
//
|
||||
// private static final SkillHolder[] VALAKAS_AOE_SKILLS =
|
||||
// {
|
||||
// new SkillHolder(4683, 1), // Valakas Dragon Breath
|
||||
// new SkillHolder(4684, 1), // Valakas Dragon Breath
|
||||
// new SkillHolder(4685, 1), // Valakas Tail Stomp
|
||||
// new SkillHolder(4686, 1), // Valakas Tail Stomp
|
||||
// new SkillHolder(4688, 1), // Valakas Stun
|
||||
// new SkillHolder(4689, 1), // Valakas Fear TODO: has two levels only level one is used.
|
||||
// new SkillHolder(4690, 1), // Valakas Meteor Storm
|
||||
// };
|
||||
|
||||
// Locations
|
||||
private static final Location TELEPORT_CUBE_LOCATIONS[] =
|
||||
@@ -114,7 +105,7 @@ public final class Valakas extends AbstractNpcAI
|
||||
private static final byte DEAD = 3; // Valakas has been killed. Entry is locked.
|
||||
// Misc
|
||||
private long _timeTracker = 0; // Time tracker for last attack on Valakas.
|
||||
private Playable _actualVictim; // Actual target of Valakas.
|
||||
// private Playable _actualVictim; // Actual target of Valakas.
|
||||
private static ZoneType ZONE;
|
||||
|
||||
private Valakas()
|
||||
@@ -355,10 +346,10 @@ public final class Valakas extends AbstractNpcAI
|
||||
|
||||
startQuestTimer("remove_players", 900000, null, null);
|
||||
}
|
||||
else if (event.equalsIgnoreCase("skill_task"))
|
||||
{
|
||||
callSkillAI(npc);
|
||||
}
|
||||
// else if (event.equalsIgnoreCase("skill_task"))
|
||||
// {
|
||||
// callSkillAI(npc);
|
||||
// }
|
||||
}
|
||||
else if (event.equalsIgnoreCase("valakas_unlock"))
|
||||
{
|
||||
@@ -373,12 +364,12 @@ public final class Valakas extends AbstractNpcAI
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onSpawn(Npc npc)
|
||||
{
|
||||
npc.disableCoreAI(true);
|
||||
return super.onSpawn(npc);
|
||||
}
|
||||
// @Override
|
||||
// public String onSpawn(Npc npc)
|
||||
// {
|
||||
// npc.disableCoreAI(true);
|
||||
// return super.onSpawn(npc);
|
||||
// }
|
||||
|
||||
@Override
|
||||
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon)
|
||||
@@ -449,105 +440,105 @@ public final class Valakas extends AbstractNpcAI
|
||||
return super.onKill(npc, killer, isSummon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAggroRangeEnter(Npc npc, PlayerInstance player, boolean isSummon)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
private void callSkillAI(Npc npc)
|
||||
{
|
||||
if (npc.isInvul() || npc.isCastingNow(SkillCaster::isAnyNormalType))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Pickup a target if no or dead victim. 10% luck he decides to reconsiders his target.
|
||||
if ((_actualVictim == null) || _actualVictim.isDead() || !(npc.isInSurroundingRegion(_actualVictim)) || (getRandom(10) == 0))
|
||||
{
|
||||
_actualVictim = getRandomTarget(npc);
|
||||
}
|
||||
|
||||
// If result is still null, Valakas will roam. Don't go deeper in skill AI.
|
||||
if (_actualVictim == null)
|
||||
{
|
||||
if (getRandom(10) == 0)
|
||||
{
|
||||
final int posX = npc.getX() + getRandom(-1400, 1400);
|
||||
final int posY = npc.getY() + getRandom(-1400, 1400);
|
||||
if (GeoEngine.getInstance().canMoveToTarget(npc.getX(), npc.getY(), npc.getZ(), posX, posY, npc.getZ(), npc.getInstanceWorld()))
|
||||
{
|
||||
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(posX, posY, npc.getZ(), 0));
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
final Skill skill = getRandomSkill(npc).getSkill();
|
||||
|
||||
// Cast the skill or follow the target.
|
||||
if (Util.checkIfInRange((skill.getCastRange() < 600) ? 600 : skill.getCastRange(), npc, _actualVictim, true))
|
||||
{
|
||||
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
|
||||
npc.setTarget(_actualVictim);
|
||||
npc.doCast(skill);
|
||||
}
|
||||
else
|
||||
{
|
||||
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, _actualVictim, null);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Pick a random skill.<br>
|
||||
* Valakas will mostly use utility skills. If Valakas feels surrounded, he will use AoE skills.<br>
|
||||
* Lower than 50% HPs, he will begin to use Meteor skill.
|
||||
* @param npc valakas
|
||||
* @return a skill holder
|
||||
*/
|
||||
private SkillHolder getRandomSkill(Npc npc)
|
||||
{
|
||||
final int hpRatio = (int) ((npc.getCurrentHp() / npc.getMaxHp()) * 100);
|
||||
|
||||
// Valakas Lava Skin has priority.
|
||||
if ((hpRatio < 75) && (getRandom(150) == 0) && !npc.isAffectedBySkill(VALAKAS_LAVA_SKIN.getSkillId()))
|
||||
{
|
||||
return VALAKAS_LAVA_SKIN;
|
||||
}
|
||||
|
||||
// Valakas will use mass spells if he feels surrounded.
|
||||
if (World.getInstance().getVisibleObjectsInRange(npc, PlayerInstance.class, 1200).size() >= 20)
|
||||
{
|
||||
return VALAKAS_AOE_SKILLS[getRandom(VALAKAS_AOE_SKILLS.length)];
|
||||
}
|
||||
|
||||
if (hpRatio > 50)
|
||||
{
|
||||
return VALAKAS_REGULAR_SKILLS[getRandom(VALAKAS_REGULAR_SKILLS.length)];
|
||||
}
|
||||
|
||||
return VALAKAS_LOWHP_SKILLS[getRandom(VALAKAS_LOWHP_SKILLS.length)];
|
||||
}
|
||||
|
||||
/**
|
||||
* Pickup a random Playable from the zone, deads targets aren't included.
|
||||
* @param npc
|
||||
* @return a random Playable.
|
||||
*/
|
||||
private Playable getRandomTarget(Npc npc)
|
||||
{
|
||||
final List<Playable> result = new ArrayList<>();
|
||||
|
||||
World.getInstance().forEachVisibleObject(npc, Playable.class, obj ->
|
||||
{
|
||||
if (!obj.isPet() && !obj.isDead())
|
||||
{
|
||||
result.add(obj);
|
||||
}
|
||||
});
|
||||
|
||||
return (result.isEmpty()) ? null : result.get(getRandom(result.size()));
|
||||
}
|
||||
// @Override
|
||||
// public String onAggroRangeEnter(Npc npc, PlayerInstance player, boolean isSummon)
|
||||
// {
|
||||
// return null;
|
||||
// }
|
||||
//
|
||||
// private void callSkillAI(Npc npc)
|
||||
// {
|
||||
// if (npc.isInvul() || npc.isCastingNow(SkillCaster::isAnyNormalType))
|
||||
// {
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// // Pickup a target if no or dead victim. 10% luck he decides to reconsiders his target.
|
||||
// if ((_actualVictim == null) || _actualVictim.isDead() || !(npc.isInSurroundingRegion(_actualVictim)) || (getRandom(10) == 0))
|
||||
// {
|
||||
// _actualVictim = getRandomTarget(npc);
|
||||
// }
|
||||
//
|
||||
// // If result is still null, Valakas will roam. Don't go deeper in skill AI.
|
||||
// if (_actualVictim == null)
|
||||
// {
|
||||
// if (getRandom(10) == 0)
|
||||
// {
|
||||
// final int posX = npc.getX() + getRandom(-1400, 1400);
|
||||
// final int posY = npc.getY() + getRandom(-1400, 1400);
|
||||
// if (GeoEngine.getInstance().canMoveToTarget(npc.getX(), npc.getY(), npc.getZ(), posX, posY, npc.getZ(), npc.getInstanceWorld()))
|
||||
// {
|
||||
// npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(posX, posY, npc.getZ(), 0));
|
||||
// }
|
||||
// }
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// final Skill skill = getRandomSkill(npc).getSkill();
|
||||
//
|
||||
// // Cast the skill or follow the target.
|
||||
// if (Util.checkIfInRange((skill.getCastRange() < 600) ? 600 : skill.getCastRange(), npc, _actualVictim, true))
|
||||
// {
|
||||
// npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
|
||||
// npc.setTarget(_actualVictim);
|
||||
// npc.doCast(skill);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// npc.getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, _actualVictim, null);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * Pick a random skill.<br>
|
||||
// * Valakas will mostly use utility skills. If Valakas feels surrounded, he will use AoE skills.<br>
|
||||
// * Lower than 50% HPs, he will begin to use Meteor skill.
|
||||
// * @param npc valakas
|
||||
// * @return a skill holder
|
||||
// */
|
||||
// private SkillHolder getRandomSkill(Npc npc)
|
||||
// {
|
||||
// final int hpRatio = (int) ((npc.getCurrentHp() / npc.getMaxHp()) * 100);
|
||||
//
|
||||
// // Valakas Lava Skin has priority.
|
||||
// if ((hpRatio < 75) && (getRandom(150) == 0) && !npc.isAffectedBySkill(VALAKAS_LAVA_SKIN.getSkillId()))
|
||||
// {
|
||||
// return VALAKAS_LAVA_SKIN;
|
||||
// }
|
||||
//
|
||||
// // Valakas will use mass spells if he feels surrounded.
|
||||
// if (World.getInstance().getVisibleObjectsInRange(npc, PlayerInstance.class, 1200).size() >= 20)
|
||||
// {
|
||||
// return VALAKAS_AOE_SKILLS[getRandom(VALAKAS_AOE_SKILLS.length)];
|
||||
// }
|
||||
//
|
||||
// if (hpRatio > 50)
|
||||
// {
|
||||
// return VALAKAS_REGULAR_SKILLS[getRandom(VALAKAS_REGULAR_SKILLS.length)];
|
||||
// }
|
||||
//
|
||||
// return VALAKAS_LOWHP_SKILLS[getRandom(VALAKAS_LOWHP_SKILLS.length)];
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * Pickup a random Playable from the zone, deads targets aren't included.
|
||||
// * @param npc
|
||||
// * @return a random Playable.
|
||||
// */
|
||||
// private Playable getRandomTarget(Npc npc)
|
||||
// {
|
||||
// final List<Playable> result = new ArrayList<>();
|
||||
//
|
||||
// World.getInstance().forEachVisibleObject(npc, Playable.class, obj ->
|
||||
// {
|
||||
// if (!obj.isPet() && !obj.isDead())
|
||||
// {
|
||||
// result.add(obj);
|
||||
// }
|
||||
// });
|
||||
//
|
||||
// return (result.isEmpty()) ? null : result.get(getRandom(result.size()));
|
||||
// }
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
|
Reference in New Issue
Block a user