70public class Cerberus
extends MultiStrategy {
71 private static final MagicAttack MAGIC =
new MagicAttack();
72 private static final RangedAttack RANGED =
new RangedAttack();
73 private static final LavaAttack LAVA =
new LavaAttack();
74 private static final GhostAttack GHOST =
new GhostAttack();
75 private static final CombatStrategy<Npc>[] FULL_STRATEGIES = createStrategyArray(NpcMeleeStrategy.get(), MAGIC, RANGED);
78 currentStrategy = MAGIC;
82 public boolean canAttack(
Npc attacker,
Mob defender) {
83 int random =
Utility.random(5, 20);
85 boolean spawnedLava = attacker.attributes.is(
"CERBERUS_LAVA");
86 boolean spawnedGhost = attacker.attributes.is(
"CERBERUS_GHOST");
88 if (attacker.getCurrentHealth() <= 200 && !spawnedLava && random >= 17) {
89 currentStrategy = LAVA;
90 }
else if (attacker.getCurrentHealth() <= 400 && !spawnedGhost && random > 14) {
91 currentStrategy = GHOST;
93 currentStrategy = randomStrategy(FULL_STRATEGIES);
95 return currentStrategy.canAttack(attacker, defender);
98 private static class GhostAttack
extends NpcMagicStrategy {
104 public void hit(
Npc attacker,
Mob defender,
Hit hit) {
111 private void special(
Npc ghost,
Mob other,
Npc attacker) {
121 overhead =
Prayer.PROTECT_FROM_RANGE;
122 projectile.setId(1230);
126 overhead =
Prayer.PROTECT_FROM_MAGIC;
127 projectile.setId(127);
131 overhead =
Prayer.PROTECT_FROM_MELEE;
132 projectile.setId(1248);
137 Prayer finalOverhead = overhead;
139 projectile.send(ghost, other);
141 if (attacker.isDead()) {
144 if (other.getPlayer().equipment.contains(12817)) {
146 }
else if (other.prayer.
isActive(finalOverhead)) {
147 int drain = other.getPlayer().equipment.contains(12821) ? 15 : 30;
149 skill.
modifyLevel(level -> level - drain, 0, skill.getLevel());
154 if (hit.getDamage() != 0) {
155 other.writeDamage(hit);
161 public void start(
Npc attacker,
Mob defender,
Hit[] hits) {
166 List<Npc> ghosts =
new ArrayList<>(3);
167 Player player = defender.getPlayer();
172 Collections.shuffle(ghosts);
173 ghosts.get(0).setPosition(
new Position(1239, 1265));
174 ghosts.get(1).setPosition(
new Position(1240, 1265));
175 ghosts.get(2).setPosition(
new Position(1241, 1265));
176 ghosts.get(0).register();
177 ghosts.get(1).register();
178 ghosts.get(2).register();
179 attacker.animate(4494);
180 attacker.
speak(
"Aaarrrooooooooo");
181 attacker.attributes.set(
"CERBERUS_GHOST", Boolean.TRUE);
185 private boolean possible() {
186 return attacker !=
null
187 && !attacker.isDead()
189 && !defender.isDead()
190 && !defender.inTeleport
191 && !defender.locking.
locked()
192 &&
Area.inCerberus(defender);
198 protected void execute() {
205 ghosts.get(0).walk(
new Position(ghosts.get(0).getX(), ghosts.get(0).getY() - 9),
true);
206 ghosts.get(1).walk(
new Position(ghosts.get(1).getX(), ghosts.get(1).getY() - 9),
true);
207 ghosts.get(2).walk(
new Position(ghosts.get(2).getX(), ghosts.get(2).getY() - 9),
true);
208 }
else if (count == 13) {
209 special(ghosts.get(0), player, attacker);
210 }
else if (count == 16) {
211 ghosts.get(0).walk(
new Position(ghosts.get(0).getX(), ghosts.get(0).getY() + 9),
true);
212 special(ghosts.get(1), player, attacker);
213 }
else if (count == 19) {
214 ghosts.get(1).walk(
new Position(ghosts.get(1).getX(), ghosts.get(1).getY() + 9),
true);
215 special(ghosts.get(2), player, attacker);
216 }
else if (count == 21) {
217 ghosts.get(2).walk(
new Position(ghosts.get(2).getX(), ghosts.get(2).getY() + 9),
true);
218 }
else if (count == 40) {
225 protected void onCancel(
boolean logout) {
226 for (
Npc ghost : ghosts) {
229 attacker.attributes.set(
"CERBERUS_GHOST", Boolean.FALSE);
240 private static class LavaAttack
extends NpcMagicStrategy {
246 public void hit(
Npc attacker,
Mob defender,
Hit hit) {
254 public void start(
Npc attacker,
Mob defender,
Hit[] hits) {
256 List<Position> positions = Arrays.asList(boundaries);
257 Collections.shuffle(positions);
259 attacker.
speak(
"Grrrrrrrrrrrrrr");
261 attacker.attributes.set(
"CERBERUS_LAVA", Boolean.TRUE);
264 World.
schedule(lavaTask(attacker, defender, positions.get(0)));
265 World.
schedule(lavaTask(attacker, defender, positions.get(1)));
273 protected void execute() {
276 }
else if (count == 19) {
278 attacker.attributes.set(
"CERBERUS_LAVA", Boolean.FALSE);
283 int damage = defender.
getPosition().equals(position) ? 15 : 7;
284 defender.writeDamage(
new Hit(damage));
297 private static class MagicAttack
extends NpcMagicStrategy {
309 CombatHit combatHit = nextMagicHit(attacker, defender, 29);
310 combatHit.setAccurate(
true);
315 private static class RangedAttack
extends NpcRangedStrategy {
327 CombatHit combatHit = nextMagicHit(attacker, defender, 29);
328 combatHit.setAccurate(
true);