71 private static Magic MAGIC =
new Magic();
72 private static Melee MELEE =
new Melee();
74 private static final CombatStrategy<Npc>[] FULL_STRATEGIES = createStrategyArray(NpcMeleeStrategy.get(), MAGIC);
75 private static final CombatStrategy<Npc>[] MAGIC_STRATEGIES = createStrategyArray(MAGIC, MAGIC, MAGIC);
76 private static final CombatStrategy<Npc>[] NON_MELEE = createStrategyArray(MAGIC, MELEE, MELEE, MAGIC, MAGIC);
80 currentStrategy = MAGIC;
81 currentStrategy = MELEE;
85 public boolean canAttack(
Npc attacker,
Mob defender) {
86 if (!currentStrategy.canAttack(attacker, defender)) {
87 currentStrategy = randomStrategy(MAGIC_STRATEGIES);
88 currentStrategy = randomStrategy(NON_MELEE);
90 return currentStrategy.canAttack(attacker, defender);
95 currentStrategy.block(attacker, defender, hit, combatType);
98 if (!defender.
getCombat().isAttacking()) {
100 defender.graphic(1196);
101 defender.graphic(481);
102 if (
Utility.random(1, 25) == 2) {
104 Prayer.PROTECT_FROM_RANGE);
105 defender.getPlayer().send(
new SendMessage(
"Your overhead prayers have been disabled!"));
108 if (RandomUtils.success(.65))
114 attacker.
move(destination);
122 public void finishOutgoing(Npc attacker,
Mob defender) {
123 currentStrategy.finishOutgoing(attacker, defender);
124 if (NpcMeleeStrategy.get().withinDistance(attacker, defender)) {
125 currentStrategy = randomStrategy(FULL_STRATEGIES);
127 currentStrategy = randomStrategy(MAGIC_STRATEGIES);
132 public int getAttackDelay(Npc attacker, Mob defender, FightType fightType) {
133 return attacker.definition.getAttackDelay();
136 private static class Melee
extends NpcRangedStrategy {
139 super(CombatProjectile.getDefinition(
"EMPTY"));
143 public void hit(Npc attacker, Mob defender, Hit hit) {
147 public void attack(Npc attacker, Mob defender, Hit hit) {
151 public void start(Npc attacker, Mob defender, Hit[] hits) {
153 attacker.animate(
new Animation(7840, UpdatePriority.VERY_HIGH));
154 CombatHit hit = nextMeleeHit(attacker, defender, 21);
155 defender.graphic(1176);
156 CombatUtil.areaAction(attacker, 64, 18, mob -> {
157 mob.damage(nextMagicHit(attacker, defender, 38));
163 public CombatHit[] getHits(Npc attacker, Mob defender) {
164 CombatHit hit = nextRangedHit(attacker, defender, 38);
165 hit.setAccurate(
false);
166 return new CombatHit[] { hit };
170 public int modifyAccuracy(Npc attacker, Mob defender,
int roll) {
171 return roll + 50_000;
177 private static class Magic
extends NpcMagicStrategy {
179 super(CombatProjectile.getDefinition(
"EMPTY"));
183 public void hit(Npc attacker, Mob defender, Hit hit) {
187 public void attack(Npc attacker, Mob defender, Hit hit) {
191 public void start(Npc attacker, Mob defender, Hit[] hits) {
192 Projectile projectile =
new Projectile(1378, 50, 80, 85, 25);
193 attacker.animate(
new Animation(7841, UpdatePriority.VERY_HIGH));
194 CombatUtil.areaAction(attacker, 64, 18, mob -> {
195 projectile.send(attacker, defender);
196 defender.graphic(157);
197 mob.damage(nextMagicHit(attacker, defender, 35));
201 if (Utility.random(0, 10) == 1) {
202 attacker.animate(
new Animation(7849, UpdatePriority.VERY_HIGH));
203 attacker.graphic(
new Graphic(1296, UpdatePriority.VERY_HIGH));
205 attacker.speak(
"Time To HEAL!");
206 defender.getPlayer().send(
new SendMessage(
"Porazdir heals himself!"));
213 public CombatHit[] getHits(Npc attacker, Mob defender) {
214 CombatHit hit = nextMagicHit(attacker, defender, 38);
215 hit.setAccurate(
false);
216 return new CombatHit[] { hit };
220 public int modifyAccuracy(Npc attacker, Mob defender,
int roll) {
221 return roll + 50_000;