RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
JalTokJad.java
1package com.osroyale.content.activity.infernomobs;
2
3import com.osroyale.game.Animation;
4import com.osroyale.game.Graphic;
5import com.osroyale.game.UpdatePriority;
6import com.osroyale.game.task.Task;
7import com.osroyale.game.task.impl.CeillingCollapseTask;
8import com.osroyale.game.world.World;
9import com.osroyale.game.world.entity.combat.CombatType;
10import com.osroyale.game.world.entity.combat.attack.FightType;
11import com.osroyale.game.world.entity.combat.hit.CombatHit;
12import com.osroyale.game.world.entity.combat.hit.Hit;
13import com.osroyale.game.world.entity.combat.projectile.CombatProjectile;
14import com.osroyale.game.world.entity.combat.strategy.CombatStrategy;
15import com.osroyale.game.world.entity.combat.strategy.npc.MultiStrategy;
16import com.osroyale.game.world.entity.combat.strategy.npc.NpcMagicStrategy;
17import com.osroyale.game.world.entity.combat.strategy.npc.NpcMeleeStrategy;
18import com.osroyale.game.world.entity.combat.strategy.npc.NpcRangedStrategy;
19import com.osroyale.game.world.entity.mob.Mob;
20import com.osroyale.game.world.entity.mob.movement.waypoint.Waypoint;
21import com.osroyale.game.world.entity.mob.npc.Npc;
22import com.osroyale.game.world.entity.mob.player.Player;
23import com.osroyale.game.world.entity.mob.prayer.Prayer;
24import com.osroyale.game.world.position.Position;
25import com.osroyale.util.RandomUtils;
26import com.osroyale.util.Stopwatch;
27import com.osroyale.util.Utility;
28
29import java.util.concurrent.TimeUnit;
30
31import static com.osroyale.game.world.entity.combat.CombatUtil.createStrategyArray;
32import static com.osroyale.game.world.entity.combat.CombatUtil.randomStrategy;
33import static com.osroyale.game.world.entity.combat.projectile.CombatProjectile.getDefinition;
34
71
72public class JalTokJad extends MultiStrategy {
73 private static RangedAttack RANGED = new RangedAttack();
74 private static MagicAttack MAGIC = new MagicAttack();
75 private static MeleeAttack MELEE = new MeleeAttack();
76 private static final CombatStrategy<Npc>[] FULL_STRATEGIES = createStrategyArray(RANGED, MAGIC, MELEE);
77 private static final CombatStrategy<Npc>[] NON_MELEE = createStrategyArray(RANGED, MAGIC);
78
79 public JalTokJad() {
80 currentStrategy = randomStrategy(NON_MELEE);
81 }
82
83 @Override
84 public boolean canAttack(Npc attacker, Mob defender) {
85 if (!currentStrategy.withinDistance(attacker, defender)) {
86 currentStrategy = randomStrategy(NON_MELEE);
87 }
88 return currentStrategy.canAttack(attacker, defender);
89 }
90
91 @Override
92 public void block(Mob attacker, Npc defender, Hit hit, CombatType combatType) {
93 currentStrategy.block(attacker, defender, hit, combatType);
94 defender.getCombat().attack(attacker);
95 }
96
97 private boolean hasGuardians;
98 private static int OBJECT = 1;
99 public static int POS1 = 2274;
100 public static int POS2 = 5337;
101
102 @Override
103 public void hit(Npc attacker, Mob defender, Hit hit) {
104 super.hit(attacker, defender, hit);
105
106 if (!defender.isPlayer())
107 return;
108 Player player = defender.getPlayer();
109
110 if (currentStrategy.getCombatType().equals(CombatType.MELEE)
111 && player.prayer.isActive(Prayer.PROTECT_FROM_MELEE)) {
112 hit.setDamage(0);
113 } else if (currentStrategy.getCombatType().equals(CombatType.RANGED)
114 && player.prayer.isActive(Prayer.PROTECT_FROM_RANGE)) {
115 hit.setDamage(0);
116 } else if (currentStrategy.getCombatType().equals(CombatType.MAGIC)
117 && player.prayer.isActive(Prayer.PROTECT_FROM_MAGIC)) {
118 hit.setDamage(0);
119 }
120
121 if (hasGuardians || attacker.getCurrentHealth() >= 175) {
122 return;
123 }
124 hasGuardians = true;
125
126 for (int i = 0; i <= 2; i++) {
127 Position spawn = RandomUtils.random(Utility.getInnerBoundaries(attacker));
128 Npc guardian = new Guardian(spawn, attacker);
129 guardian.register();
130 guardian.definition.setRespawnTime(-1);
131 guardian.walkExactlyTo(new Position(POS1, POS2, guardian.getHeight()), () -> {
132
133 World.sendGraphic(new Graphic(1460, true), guardian.getPosition());
134 defender.damage(new Hit(10 * guardian.getCurrentHealth() / guardian.getMaximumHealth()));
135 World.schedule(new CeillingCollapseTask(defender.getPlayer()));
136 });
137 }
138 }
139
140 @Override
141 public void finishOutgoing(Npc attacker, Mob defender) {
142 currentStrategy.finishOutgoing(attacker, defender);
143 if (NpcMeleeStrategy.get().withinDistance(attacker, defender)) {
144 currentStrategy = randomStrategy(FULL_STRATEGIES);
145 } else {
146 currentStrategy = randomStrategy(NON_MELEE);
147 }
148 }
149
150 @Override
151 public int modifyAccuracy(Npc attacker, Mob defender, int roll) {
152 return roll + 150_000;
153 }
154
155 private static class RangedAttack extends NpcRangedStrategy {
156
157 private final Animation ANIMATION = new Animation(7593, UpdatePriority.HIGH);
158
159 RangedAttack() {
160 super(CombatProjectile.getDefinition("EMPTY"));
161 }
162
163 @Override
164 public void start(Npc attacker, Mob defender, Hit[] hits) {
165 attacker.animate(ANIMATION, true);
166 World.schedule(new Task(2) {
167 @Override
168 protected void execute() {
170 cancel();
171
172 World.schedule(new Task(1) {
173 @Override
174 protected void execute() {
175 cancel();
176 }
177 });
178 }
179 });
180 }
181
182 @Override
183 public int getAttackDelay(Npc attacker, Mob defender, FightType fightType) {
184 return 5;
185 }
186
187 @Override
188 public void hit(Npc attacker, Mob defender, Hit hit) {
189 }
190
191 @Override
192 public void attack(Npc attacker, Mob defender, Hit hit) {
193 }
194
195 @Override
196 public CombatHit[] getHits(Npc attacker, Mob defender) {
197 return new CombatHit[] { nextRangedHit(attacker, defender, 97, 2, 2) };
198 }
199
200 @Override
201 public Animation getAttackAnimation(Npc attacker, Mob defender) {
202 return ANIMATION;
203 }
204 }
205
206 private static class MagicAttack extends NpcMagicStrategy {
207 private final Animation ANIMATION = new Animation(7592, UpdatePriority.HIGH);
208
209 public MagicAttack() {
210 super(getDefinition("jal jad Magic"));
211 }
212
213 @Override
214 public CombatHit[] getHits(Npc attacker, Mob defender) {
215 CombatHit hit = nextMagicHit(attacker, defender, 97, 2, 2);
216 hit.setAccurate(true);
217 return new CombatHit[] { hit };
218 }
219
220 @Override
221 public int getAttackDelay(Npc attacker, Mob defender, FightType fightType) {
222 return 5;
223 }
224
225 public Animation getAttackAnimation(Npc attacker, Mob defender) {
226 return ANIMATION;
227 }
228 }
229
230 private class Guardian extends Npc {
231 private final Stopwatch lastHeal = new Stopwatch();
232
233 private Guardian(Position spawn, Npc healer) {
234 super(7705, spawn);
235 lastHeal.start();
236 setWaypoint(new Waypoint(this, healer) {
237 @Override
238 protected void onDestination() {
239 CombatProjectile.getDefinition("Scorpia guardian").getProjectile()
240 .ifPresent(projectile -> projectile.send(mob, healer));
241 lastHeal.reset();
242 lastHeal.start();
243 mob.animate(new Animation(2637));
244 healer.heal(4);
245 }
246 });
247 }
248
249 @Override
250 public void sequence() {
251 super.sequence();
252 long millis = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
253 if (millis > 15_000) {
254 unregister();
255 }
256 }
257 }
258
259 private static class MeleeAttack extends NpcMeleeStrategy {
260 private final Animation ANIMATION = new Animation(7590, UpdatePriority.HIGH);
261
262 @Override
263 public CombatHit[] getHits(Npc attacker, Mob defender) {
264 CombatHit hit = nextMeleeHit(attacker, defender, 97, 5, 2);
265 hit.setAccurate(true);
266 return new CombatHit[] { hit };
267 }
268
269 public Animation getAttackAnimation(Npc attacker, Mob defender) {
270 return ANIMATION;
271 }
272 }
273
274}
static void sendGraphic(Graphic graphic, Position position, int instance)
Definition World.java:305
static void schedule(Task task)
Definition World.java:284
abstract Combat<? extends Mob > getCombat()