73public class Derwen extends MultiStrategy {
74 private static Magic MAGIC =
new Magic();
75 private static Melee MELEE =
new Melee();
76 private static LightingRain LIGHTNING_RAIN =
new LightingRain();
77 private static TeleGrab TELE_GRAB =
new TeleGrab();
79 private static final CombatStrategy<Npc>[] FULL_STRATEGIES = createStrategyArray(NpcMeleeStrategy.get(), MAGIC,
80 TELE_GRAB, LIGHTNING_RAIN);
81 private static final CombatStrategy<Npc>[] MAGIC_STRATEGIES = createStrategyArray(MAGIC, MAGIC, MAGIC, TELE_GRAB,
83 private static final CombatStrategy<Npc>[] NON_MELEE = createStrategyArray(MAGIC, MELEE, MELEE, MAGIC, MAGIC,
84 TELE_GRAB, LIGHTNING_RAIN);
88 currentStrategy = MAGIC;
89 currentStrategy = MELEE;
93 public boolean canAttack(
Npc attacker,
Mob defender) {
94 if (!currentStrategy.withinDistance(attacker, defender)) {
95 currentStrategy = randomStrategy(MAGIC_STRATEGIES);
96 currentStrategy = randomStrategy(NON_MELEE);
98 return currentStrategy.canAttack(attacker, defender);
102 public void finishOutgoing(
Npc attacker,
Mob defender) {
103 currentStrategy.finishOutgoing(attacker, defender);
104 if (NpcMeleeStrategy.get().withinDistance(attacker, defender)) {
105 currentStrategy = randomStrategy(FULL_STRATEGIES);
107 currentStrategy = randomStrategy(MAGIC_STRATEGIES);
112 public int getAttackDelay(
Npc attacker,
Mob defender, FightType fightType) {
116 private static class Melee
extends NpcRangedStrategy {
119 super(CombatProjectile.getDefinition(
"EMPTY"));
123 public void hit(Npc attacker,
Mob defender, Hit hit) {
127 public void attack(Npc attacker, Mob defender, Hit hit) {
131 public void start(Npc attacker, Mob defender, Hit[] hits) {
133 attacker.animate(
new Animation(7848, UpdatePriority.VERY_HIGH));
134 CombatHit hit = nextMeleeHit(attacker, defender, 21);
135 defender.graphic(1176);
136 CombatUtil.areaAction(attacker, 64, 18, mob -> {
137 mob.damage(nextMagicHit(attacker, defender, 38));
143 public CombatHit[] getHits(Npc attacker, Mob defender) {
144 CombatHit hit = nextRangedHit(attacker, defender, 38);
145 hit.setAccurate(
false);
146 return new CombatHit[] { hit };
150 public int modifyAccuracy(Npc attacker, Mob defender,
int roll) {
151 return roll + 50_000;
157 private static class Magic
extends NpcMagicStrategy {
159 super(CombatProjectile.getDefinition(
"EMPTY"));
163 public void hit(Npc attacker, Mob defender, Hit hit) {
167 public void attack(Npc attacker, Mob defender, Hit hit) {
171 public void start(Npc attacker, Mob defender, Hit[] hits) {
172 attacker.animate(
new Animation(7849, UpdatePriority.VERY_HIGH));
173 Projectile projectile =
new Projectile(1379, 50, 80, 85, 25);
174 CombatUtil.areaAction(attacker, 64, 18, mob -> {
175 projectile.send(attacker, defender);
176 defender.graphic(157);
177 mob.damage(nextMagicHit(attacker, defender, 35));
181 if (Utility.random(0, 25) == 1) {
182 attacker.animate(
new Animation(7849, UpdatePriority.VERY_HIGH));
183 attacker.graphic(
new Graphic(1296, UpdatePriority.VERY_HIGH));
185 attacker.speak(
"Time To HEAL!");
186 defender.getPlayer().send(
new SendMessage(
"Derwen heals himself!"));
193 public CombatHit[] getHits(Npc attacker, Mob defender) {
194 CombatHit hit = nextMagicHit(attacker, defender, 38);
195 hit.setAccurate(
false);
196 return new CombatHit[] { hit };
200 public int modifyAccuracy(Npc attacker, Mob defender,
int roll) {
201 return roll + 50_000;
205 private static class TeleGrab
extends NpcMagicStrategy {
207 super(CombatProjectile.getDefinition(
"EMPTY"));
211 public void hit(Npc attacker, Mob defender, Hit hit) {
215 public void attack(Npc attacker, Mob defender, Hit hit) {
219 public CombatHit[] getHits(Npc attacker, Mob defender) {
220 CombatHit hit = nextMagicHit(attacker, defender, 38);
221 hit.setAccurate(
false);
222 return new CombatHit[] { hit };
226 private static class LightingRain
extends NpcMagicStrategy {
228 super(CombatProjectile.getDefinition(
"Vorkath Frozen Special"));
232 public void hit(Npc attacker, Mob defender, Hit hit) {
236 public void attack(Npc attacker, Mob defender, Hit hit) {
240 public void start(Npc attacker, Mob defender, Hit[] hits) {
241 attacker.animate(
new Animation(7849, UpdatePriority.VERY_HIGH));
242 World.sendProjectile(attacker, defender,
new Projectile(1382, 46, 80, 43, 31));
243 World.schedule(1, () -> {
244 if (defender.isPlayer()) {
245 Position current = defender.getPosition();
246 Position best = Utility.findBestInside(defender, attacker);
247 int dx = current.getX() - best.getX();
248 int dy = current.getY() - best.getY();
250 int y = dy / (dx == 0 ? dy : dx);
251 Position destination = current.transform(dx, y);
252 if (SimplePathChecker.checkLine(defender, destination))
253 defender.damage(
new Hit(Utility.random(1, 3)));
254 defender.interact(attacker);
260 public CombatHit[] getHits(Npc attacker, Mob defender) {
261 CombatHit hit = nextMagicHit(attacker, defender, 38);
262 hit.setAccurate(
false);
263 return new CombatHit[] { hit };