71 private static final Integer[] GUARDIAN_IDS = {8064, 8065, 8066};
72 private final static Transform TRANSFORM =
new Transform();
73 private final static NpcMeleeStrategy MELEE = NpcMeleeStrategy.get();
74 private final static Magic MAGIC =
new Magic();
75 private final static Ranged RANGED =
new Ranged();
76 private static final BarrageAttack BARRAGE =
new BarrageAttack();
77 private final static PrayerAttack PRAYER =
new PrayerAttack();
78 private final static BoomAttack BOOM =
new BoomAttack();
80 private static int nextForm(
int id) {
81 return RandomUtils.randomExclude(GUARDIAN_IDS,
id);
85 public boolean canAttack(
Npc attacker,
Mob defender) {
86 if (!attacker.attributes.has(
"STONE_GUARDIAN_ATTACK")) {
87 attacker.attributes.put(
"STONE_GUARDIAN_ATTACK", 0);
90 if (!attacker.attributes.has(
"STONE_GUARDIAN_BLOCK")) {
91 attacker.attributes.put(
"STONE_GUARDIAN_BLOCK", 0);
93 int attackCount = attacker.attributes.get(
"STONE_GUARDIAN_ATTACK", Integer.class);
94 int blockCount = attacker.attributes.get(
"STONE_GUARDIAN_BLOCK", Integer.class);
96 if (attackCount >= 10 || blockCount >= 10) {
97 currentStrategy = TRANSFORM;
101 switch (attacker.id) {
103 CombatStrategy<Npc>[] SPECIALS = createStrategyArray(MELEE, PRAYER, BARRAGE, BOOM);
104 currentStrategy = randomStrategy(SPECIALS);
108 CombatStrategy<Npc>[] SPECIALS = createStrategyArray(RANGED, PRAYER, BARRAGE, BOOM);
109 currentStrategy = randomStrategy(SPECIALS);
113 CombatStrategy<Npc>[] SPECIALS = createStrategyArray(MAGIC, PRAYER, BARRAGE, BOOM);
114 currentStrategy = randomStrategy(SPECIALS);
119 return currentStrategy.canAttack(attacker, defender);
123 public void preDeath(
Mob attacker,
Npc defender,
Hit hit) {
124 defender.
speak(
"NOOOOOOOOOO!!!");
125 super.preDeath(attacker, defender, hit);
133 public void hitsplat(
Npc attacker,
Mob defender,
Hit hit) {
134 super.hitsplat(attacker, defender, hit);
135 int count = attacker.attributes.get(
"STONE_GUARDIAN_ATTACK", Integer.class);
136 attacker.attributes.put(
"STONE_GUARDIAN_ATTACK", count + 1);
141 super.block(attacker, defender, hit, combatType);
143 if (!attacker.attributes.has(
"STON_GUARDIAN_BLOCK")) {
144 attacker.attributes.put(
"STON_GUARDIAN_BLOCK", 0);
148 int count = attacker.attributes.get(
"STON_GUARDIAN_BLOCK", Integer.class);
149 attacker.attributes.put(
"STON_GUARDIAN_BLOCK", count + 1);
154 public int modifyAccuracy(
Npc attacker,
Mob defender,
int roll) {
159 public int modifyDefensive(
Mob attacker,
Npc defender,
int roll) {
164 private static class Transform
extends NpcMagicStrategy {
170 public void hit(
Npc attacker,
Mob defender,
Hit hit) {
174 public void attack(
Npc attacker,
Mob defender,
Hit hit) {
178 public void start(
Npc attacker,
Mob defender,
Hit[] hits) {
179 attacker.
speak(
"AH!!! Give me a minute here...");
182 attacker.attributes.set(
"STONE_GUARDIAN_ATTACK", 0);
183 attacker.attributes.set(
"STONE_GUARDIAN_BLOCK", 0);
184 attacker.damageImmunity.reset(3_000);
188 attacker.
speak(
"That feels better!");
189 attacker.transform(nextForm(attacker.id));
195 CombatHit hit = nextMagicHit(attacker, defender, -1);
196 hit.setAccurate(
false);
201 public int getAttackDelay(
Npc attacker,
Mob defender,
FightType fightType) {
206 private static class BoomAttack
extends NpcMagicStrategy {
212 public void hit(
Npc attacker,
Mob defender,
Hit hit) {
216 public void attack(
Npc attacker,
Mob defender,
Hit hit) {
220 public void start(
Npc attacker,
Mob defender,
Hit[] hits) {
221 attacker.
speak(
"BOOM!");
225 projectile.send(attacker, target);
229 if (player !=
null && !player.isDead() && player.getPosition().equals(target)) {
230 int damage = player.prayer.isActive(
Prayer.PROTECT_FROM_MELEE) ? 30 : 60;
231 player.writeDamage(
new Hit(
Utility.random(15, damage)));
240 CombatHit hit = nextMagicHit(attacker, defender, -1);
241 hit.setAccurate(
false);
246 public int getAttackDelay(
Npc attacker,
Mob defender,
FightType fightType) {
252 private static class BarrageAttack
extends NpcMagicStrategy {
258 public void hit(
Npc attacker,
Mob defender,
Hit hit) {
262 public void attack(
Npc attacker,
Mob defender,
Hit hit) {
266 public void start(
Npc attacker,
Mob defender,
Hit[] hits) {
267 attacker.
speak(
"GET READY FOR A CHILL!!");
272 projectile.send(attacker, defender);
275 if (mob.isPlayer() && !mob.locking.locked(
LockType.FREEZE)) {
276 mob.getPlayer().message(
true,
"The stone guardian has frozen you!");
278 mob.damage(nextMagicHit(attacker, defender, 30));
279 mob.locking.lock(25,
LockType.FREEZE);
282 mob.writeDamage(
new Hit(0));
290 CombatHit hit = nextMagicHit(attacker, defender, -1);
291 hit.setAccurate(
false);
296 public int getAttackDelay(
Npc attacker,
Mob defender,
FightType fightType) {
302 private static class PrayerAttack
extends NpcMagicStrategy {
308 public void hit(
Npc attacker,
Mob defender,
Hit hit) {
312 public void attack(
Npc attacker,
Mob defender,
Hit hit) {
316 public void start(
Npc attacker,
Mob defender,
Hit[] hits) {
317 attacker.
speak(
"YOUR GODS CAN'T SAVE YOU!");
322 projectile.send(attacker, defender);
325 if (mob.isPlayer() && mob.prayer.hasOverhead()) {
326 mob.prayer.deactivateOverhead();
327 mob.writeDamage(
new Hit(
Utility.random(15, 20)));
328 mob.getPlayer().message(
"The stone guardian has deactivated your overhead prayers!");
331 mob.writeDamage(
new Hit(0));
340 CombatHit hit = nextMagicHit(attacker, defender, -1);
341 hit.setAccurate(
false);
346 public int getAttackDelay(
Npc attacker,
Mob defender,
FightType fightType) {
352 private static class Magic
extends NpcMagicStrategy {
359 CombatHit hit = nextMagicHit(attacker, defender, 20);
360 hit.setAccurate(
true);
366 private static class Ranged
extends NpcRangedStrategy {
373 CombatHit hit = nextMagicHit(attacker, defender, 20);
374 hit.setAccurate(
true);