RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
Hydra.java
1package com.osroyale.game.world.entity.combat.strategy.npc.boss;
2
3import com.osroyale.game.Animation;
4import com.osroyale.game.Graphic;
5import com.osroyale.game.Projectile;
6import com.osroyale.game.UpdatePriority;
7import com.osroyale.game.task.Task;
8import com.osroyale.game.world.World;
9import com.osroyale.game.world.entity.combat.attack.FightType;
10import com.osroyale.game.world.entity.combat.hit.CombatHit;
11import com.osroyale.game.world.entity.combat.hit.Hit;
12import com.osroyale.game.world.entity.combat.strategy.CombatStrategy;
13import com.osroyale.game.world.entity.combat.strategy.npc.MultiStrategy;
14import com.osroyale.game.world.entity.combat.strategy.npc.NpcMagicStrategy;
15import com.osroyale.game.world.entity.combat.strategy.npc.NpcRangedStrategy;
16import com.osroyale.game.world.entity.mob.Mob;
17import com.osroyale.game.world.entity.mob.npc.Npc;
18import com.osroyale.game.world.position.Position;
19import com.osroyale.util.RandomUtils;
20import com.osroyale.util.Utility;
21
22import java.util.*;
23
24import static com.osroyale.game.world.entity.combat.CombatUtil.createStrategyArray;
25import static com.osroyale.game.world.entity.combat.CombatUtil.randomStrategy;
26import static com.osroyale.game.world.entity.combat.projectile.CombatProjectile.getDefinition;
27
60
61public class Hydra extends MultiStrategy {
62 private static final Magic MAGIC = new Magic();
63 private static final Ranged RANGED = new Ranged();
64 private static final CombatStrategy<Npc>[] STRATEGIES = createStrategyArray(MAGIC, RANGED);
65 private int attackCount = 0;
66
67 public Hydra() {
68 this.currentStrategy = randomStrategy(STRATEGIES);
69 }
70
71 private CombatStrategy getNextStrategy() {
72 return RandomUtils.randomExclude(STRATEGIES, currentStrategy);
73 }
74
75 @Override
76 public void hit(Npc attacker, Mob defender, Hit hit) {
77 super.hit(attacker, defender, hit);
78 attackCount++;
79 if (attackCount > 2) {
80 if (Utility.hasOneOutOf(30)) {
81 poisonAttack(attacker, defender);
82 }
83 currentStrategy = getNextStrategy();
84 attackCount = 0;
85 }
86 }
87
88 private static void poisonAttack(Npc attacker, Mob defender) {
89 Position[] boundaries = Utility.getInnerBoundaries(defender.getPosition(), 5, 5);
90 List<Position> positions = Arrays.asList(boundaries);
91 Collections.shuffle(positions);
92
93 attacker.animate(new Animation(8262, UpdatePriority.VERY_HIGH));
94 World.sendProjectile(attacker, defender, new Projectile(1644, 37, 15, 42, 0));
95 attacker.attributes.set("HYDRA_POISON", Boolean.TRUE);
96
97 World.schedule(poisonTask(attacker, defender, defender.getPosition()));
98 World.schedule(poisonTask(attacker, defender, positions.get(0)));
99 World.schedule(poisonTask(attacker, defender, positions.get(1)));
100 }
101
102
103 private static Task poisonTask(Npc attacker, Mob defender, Position position) {
104 return new Task(1) {
105 int count = 0;
106
107 @Override
108 protected void execute() {
109 if (count == 0) {
110 World.sendGraphic(new Graphic(1654), position);
111 } else if (count == 18) {
112 attacker.attributes.set("HYDRA_POISON", Boolean.FALSE);
113 cancel();
114 return;
115 }
116 if (count % 2 == 0 && defender.getPosition().equals(position)) {
117 var damage = 4;
118 if (defender.getPlayer().getPoisonImmunity().get() > 0) {
119 damage = Utility.random(1, 3, true);
120 defender.getPlayer().message("Your poison immunity reduces the damage taken from the acidic pool.");
121 }
122 defender.writeDamage(new Hit(damage));
123 }
124 count++;
125 }
126 };
127 }
128
129 private static class Magic extends NpcMagicStrategy {
130 private static final Animation ANIMATION = new Animation(8263, UpdatePriority.HIGH);
131
132 private Magic() {
133 super(getDefinition("Hydra Magic"));
134 }
135
136 @Override
137 public CombatHit[] getHits(Npc attacker, Mob defender) {
138 CombatHit combatHit = nextMagicHit(attacker, defender, 22);
139 combatHit.setAccurate(true);
140 return new CombatHit[]{combatHit};
141 }
142
143 @Override
144 public Animation getAttackAnimation(Npc attacker, Mob defender) {
145 return ANIMATION;
146 }
147
148 @Override
149 public int getAttackDistance(Npc attacker, FightType fightType) {
150 return 10;
151 }
152 }
153
154 private static class Ranged extends NpcRangedStrategy {
155 private static final Animation ANIMATION = new Animation(8261, UpdatePriority.HIGH);
156
157 private Ranged() {
158 super(getDefinition("Hydra Ranged"));
159 }
160
161 @Override
162 public CombatHit[] getHits(Npc attacker, Mob defender) {
163 return new CombatHit[]{nextRangedHit(attacker, defender, 22)};
164 }
165
166 @Override
167 public Animation getAttackAnimation(Npc attacker, Mob defender) {
168 return ANIMATION;
169 }
170
171 @Override
172 public int getAttackDistance(Npc attacker, FightType fightType) {
173 return 10;
174 }
175 }
176
177}
static void sendGraphic(Graphic graphic, Position position, int instance)
Definition World.java:305
static void schedule(Task task)
Definition World.java:284
static void sendProjectile(Projectile projectile, Position position, int instance, int lock, byte offsetX, byte offsetY)
Definition World.java:332