82public class Vorkath
extends MultiStrategy {
83 private static final NpcMeleeStrategy MELEE = NpcMeleeStrategy.get();
84 private static final MagicAttack MAGIC =
new MagicAttack();
85 private static final RangedAttack RANGED =
new RangedAttack();
86 private static final FireballAttack FIREBALL =
new FireballAttack();
90 private static final DragonfireStrategy VENOM_DRAGONFIRE =
new VenomDragonfireAttack();
92 private static final VenomSpecial VENOM_SPECIAL =
new VenomSpecial();
93 private static final FrozenSpecial FROZEN_SPECIAL =
new FrozenSpecial();
95 private static final CombatStrategy<Npc>[] FULL_STRATEGIES = createStrategyArray(MELEE, DRAGONFIRE, MAGIC, FIREBALL, RANGED, VENOM_DRAGONFIRE, PINK_DRAGONFIRE);
96 private static final CombatStrategy<Npc>[] NON_MELEE = createStrategyArray(FIREBALL, DRAGONFIRE, MAGIC, RANGED, VENOM_DRAGONFIRE, PINK_DRAGONFIRE);
97 private final CombatStrategy<Npc>[] SPECIALS = createStrategyArray(VENOM_SPECIAL, FROZEN_SPECIAL);
99 private final Deque<CombatStrategy<Npc>> strategyQueue =
new LinkedList<>();
100 private int specialIndex;
103 currentStrategy = MELEE;
107 public void init(
Npc attacker,
Mob defender) {
108 if (strategyQueue.isEmpty()) {
109 for (
int index = 0; index < 6; index++) {
110 strategyQueue.add(RandomUtils.random(FULL_STRATEGIES));
112 strategyQueue.add(SPECIALS[specialIndex++ % SPECIALS.length]);
114 currentStrategy = strategyQueue.poll();
118 public boolean canAttack(
Npc attacker,
Mob defender) {
119 if (currentStrategy == MELEE && !MELEE.canAttack(attacker, defender)) {
120 currentStrategy = RandomUtils.random(NON_MELEE);
122 return currentStrategy.canAttack(attacker, defender);
126 public boolean withinDistance(
Npc attacker,
Mob defender) {
127 if (currentStrategy == MELEE && !MELEE.withinDistance(attacker, defender)) {
128 currentStrategy = RandomUtils.random(NON_MELEE);
130 return currentStrategy.canAttack(attacker, defender);
133 private static class VenomSpecial
extends NpcMagicStrategy {
139 public int getAttackDelay(
Npc attacker,
Mob defender,
FightType fightType) {
144 public void start(
Npc attacker,
Mob defender,
Hit[] hits) {
148 Collections.shuffle(boundaries);
157 for (
int index = 0; index < 40; index++) {
158 Position position = boundaries.get(index);
159 projectile.send(attacker, position);
165 World.
schedule(dragonFireTickableTask(attacker, defender, projectile2));
173 private boolean possible() {
174 return attacker !=
null
175 && !attacker.isDead()
176 && !defender.isDead()
177 && !defender.inTeleport
178 && !defender.locking.
locked()
179 &&
Area.inVorkath(defender);
183 protected void onCancel(
boolean logout) {
184 super.onCancel(logout);
186 if (!logout && attacker !=
null) {
187 final Combat<? extends Mob> combat = attacker.
getCombat();
188 if (combat !=
null) {
189 combat.clearDamageQueue();
195 protected void tick() {
211 projectile.send(attacker, position);
215 final Combat<? extends Mob> combat = defender.
getCombat();
216 if (combat !=
null) {
217 combat.clearDamageQueue();
237 protected void tick() {
241 }
else if (tick == 13) {
247 if (defender.
getPosition().equals(position) &&
Area.inVorkath(defender)) {
248 defender.writeDamage(
new Hit(
Utility.random(1, 10)));
256 CombatHit combatHit = nextMagicHit(attacker, defender, 0);
257 combatHit.setAccurate(
true);
263 private static class RangedAttack
extends NpcRangedStrategy {
276 return new CombatHit[]{nextRangedHit(attacker, defender, 32)};
280 private static class MagicAttack
extends NpcMagicStrategy {
293 return new CombatHit[]{nextRangedHit(attacker, defender, 32)};
297 private static class FrozenSpecial
extends NpcMagicStrategy {
310 public void hit(
Npc attacker,
Mob defender,
Hit hit) {
311 defender.graphic(
new Graphic(369));
312 defender.locking.lock(
LockType.FREEZE);
314 attacker.blockInteract =
true;
318 PROJECTILE.send(attacker,
new Position(2277, 4057));
321 attacker.blockInteract =
false;
322 Npc zombie =
new Npc(8063, defender.instance,
new Position(2277, 4057)) {
324 public void appendDeath() {
326 defender.locking.
unlock();
330 zombie.instance = defender.instance;
332 zombie.walkTo(defender, () -> {
334 defender.damage(
new Hit(60 * zombie.getCurrentHealth() / zombie.getMaximumHealth()));
335 defender.locking.
unlock();
343 public int getAttackDelay(
Npc attacker,
Mob defender,
FightType fightType) {
349 CombatHit combatHit = nextMagicHit(attacker, defender, -1);
350 combatHit.setAccurate(
false);
366 public int getAttackDistance(
Npc attacker,
FightType fightType) {
377 VenomDragonfireAttack() {
387 public int getAttackDistance(
Npc attacker,
FightType fightType) {
392 public void hit(
Npc attacker,
Mob defender,
Hit hit) {
393 super.hit(attacker, defender, hit);
394 if (hit.isAccurate()) {
408 PinkDragonfireAttack() {
418 public void hitsplat(
Npc attacker,
Mob defender,
Hit hit) {
419 super.hitsplat(attacker, defender, hit);
422 defender.prayer.
reset();
427 public int getAttackDistance(
Npc attacker,
FightType fightType) {
452 public void start(
Npc attacker,
Mob defender,
Hit[] hits) {
453 super.start(attacker, defender, hits);
458 public void attack(
Npc attacker,
Mob defender,
Hit hit) {
459 PROJECTILE.send(attacker, position);
463 public void hit(
Npc attacker,
Mob defender,
Hit hit) {
464 super.hitsplat(attacker, defender, hit);
466 hit.setAccurate(
false);
468 hit.setAs(
CombatUtil.generateDragonfire(attacker, defender, 150,
true));
469 hit.setAccurate(
true);
471 hit.setAs(
CombatUtil.generateDragonfire(attacker, defender, 150,
true));
472 hit.modifyDamage(damage -> damage / 2);
473 hit.setAccurate(
true);
478 public int getAttackDistance(
Npc attacker,
FightType fightType) {