76 private static Magic MAGIC =
new Magic();
77 private static Melee MELEE =
new Melee();
78 private static LightingRain LIGHTNING_RAIN =
new LightingRain();
79 private static TeleGrab TELE_GRAB =
new TeleGrab();
81 private static final CombatStrategy<Npc>[] FULL_STRATEGIES = createStrategyArray(NpcMeleeStrategy.get(), MAGIC,
82 TELE_GRAB, LIGHTNING_RAIN);
83 private static final CombatStrategy<Npc>[] MAGIC_STRATEGIES = createStrategyArray(MAGIC, MAGIC, MAGIC, TELE_GRAB,
85 private static final CombatStrategy<Npc>[] NON_MELEE = createStrategyArray(MAGIC, MELEE, MELEE, MAGIC, MAGIC,
86 TELE_GRAB, LIGHTNING_RAIN);
90 currentStrategy = MAGIC;
91 currentStrategy = MELEE;
95 public boolean canAttack(
Npc attacker,
Mob defender) {
96 if (!currentStrategy.withinDistance(attacker, defender)) {
97 currentStrategy = randomStrategy(MAGIC_STRATEGIES);
98 currentStrategy = randomStrategy(NON_MELEE);
100 return currentStrategy.canAttack(attacker, defender);
105 currentStrategy.block(attacker, defender, hit, combatType);
108 if (!defender.
getCombat().isAttacking()) {
110 defender.graphic(1196);
111 defender.graphic(481);
112 defender.
speak(
"Night King, Lend me your powers for i am your faithful servant!");
115 if (RandomUtils.success(.65))
121 attacker.
move(destination);
129 public void finishOutgoing(
Npc attacker,
Mob defender) {
130 currentStrategy.finishOutgoing(attacker, defender);
131 if (NpcMeleeStrategy.get().withinDistance(attacker, defender)) {
132 currentStrategy = randomStrategy(FULL_STRATEGIES);
134 currentStrategy = randomStrategy(MAGIC_STRATEGIES);
139 public int getAttackDelay(Npc attacker, Mob defender, FightType fightType) {
140 return attacker.definition.getAttackDelay();
143 private static class Melee
extends NpcRangedStrategy {
146 super(CombatProjectile.getDefinition(
"EMPTY"));
150 public void hit(Npc attacker, Mob defender, Hit hit) {
154 public void attack(Npc attacker, Mob defender, Hit hit) {
158 public void start(Npc attacker, Mob defender, Hit[] hits) {
160 attacker.animate(
new Animation(7962, UpdatePriority.VERY_HIGH));
161 Projectile projectile =
new Projectile(162, 50, 80, 85, 25);
162 CombatHit hit = nextMeleeHit(attacker, defender, 21);
163 defender.graphic(163);
164 CombatUtil.areaAction(attacker, 64, 18, mob -> {
165 projectile.send(attacker, defender);
166 mob.damage(nextMagicHit(attacker, defender, 35));
181 public CombatHit[] getHits(Npc attacker, Mob defender) {
182 CombatHit hit = nextRangedHit(attacker, defender, 38);
183 hit.setAccurate(
false);
184 return new CombatHit[] { hit };
188 public int modifyAccuracy(Npc attacker, Mob defender,
int roll) {
189 return roll + 50_000;
195 private static class Magic
extends NpcMagicStrategy {
197 super(CombatProjectile.getDefinition(
"EMPTY"));
201 public void hit(Npc attacker, Mob defender, Hit hit) {
205 public void attack(Npc attacker, Mob defender, Hit hit) {
209 public void start(Npc attacker, Mob defender, Hit[] hits) {
210 Projectile projectile =
new Projectile(393, 50, 80, 85, 25);
211 attacker.animate(
new Animation(7853, UpdatePriority.VERY_HIGH));
212 CombatUtil.areaAction(attacker, 64, 18, mob -> {
213 projectile.send(attacker, defender);
214 defender.graphic(157);
215 mob.damage(nextMagicHit(attacker, defender, 35));
219 if (Utility.random(0, 20) == 1) {
220 attacker.animate(
new Animation(7965, UpdatePriority.VERY_HIGH));
221 attacker.graphic(
new Graphic(1296, UpdatePriority.VERY_HIGH));
223 attacker.speak(
"Time To HEAL!");
230 public CombatHit[] getHits(Npc attacker, Mob defender) {
231 CombatHit hit = nextMagicHit(attacker, defender, 38);
232 hit.setAccurate(
false);
233 return new CombatHit[] { hit };
237 public int modifyAccuracy(Npc attacker, Mob defender,
int roll) {
238 return roll + 50_000;
242 private static class TeleGrab
extends NpcMagicStrategy {
244 super(CombatProjectile.getDefinition(
"EMPTY"));
248 public void hit(Npc attacker, Mob defender, Hit hit) {
252 public void attack(Npc attacker, Mob defender, Hit hit) {
256 public void start(Npc attacker, Mob defender, Hit[] hits) {
258 attacker.animate(
new Animation(7964, UpdatePriority.VERY_HIGH));
259 Projectile projectile =
new Projectile(1479, 50, 80, 85, 25);
260 projectile.send(attacker, defender);
261 defender.damage(
new Hit(Utility.random(20, 50)));
262 attacker.speak(
"I AM A DECENDENT OF HELL!");
270 public CombatHit[] getHits(Npc attacker, Mob defender) {
271 CombatHit hit = nextMagicHit(attacker, defender, 38);
272 hit.setAccurate(
false);
273 return new CombatHit[] { hit };
277 private static class LightingRain
extends NpcMagicStrategy {
279 super(CombatProjectile.getDefinition(
"Vorkath Frozen Special"));
283 public void hit(Npc attacker, Mob defender, Hit hit) {
287 public void attack(Npc attacker, Mob defender, Hit hit) {
291 public void start(Npc attacker, Mob defender, Hit[] hits) {
292 attacker.animate(
new Animation(7962, UpdatePriority.VERY_HIGH));
293 World.sendProjectile(attacker, defender,
new Projectile(395, 46, 80, 43, 31));
294 World.schedule(1, () -> {
295 if (defender.isPlayer()) {
296 Position current = defender.getPosition();
297 Position best = Utility.findBestInside(defender, attacker);
298 int dx = current.getX() - best.getX();
299 int dy = current.getY() - best.getY();
300 int y = dy / (dx == 0 ? dy : dx);
302 Position destination = current.
transform(dx, y);
303 if (SimplePathChecker.checkLine(defender, destination)) {
305 defender.damage(
new Hit(Utility.random(1, 3)));
306 defender.interact(attacker);
313 public CombatHit[] getHits(Npc attacker, Mob defender) {
314 CombatHit hit = nextMagicHit(attacker, defender, 38);
315 hit.setAccurate(
false);
316 return new CombatHit[] { hit };