RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
Derwen.java
1package com.osroyale.game.world.entity.combat.strategy.npc.boss.magearena;
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.impl.ForceMovementTask;
8import com.osroyale.game.world.World;
9import com.osroyale.game.world.entity.combat.CombatUtil;
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.Direction;
20import com.osroyale.game.world.entity.mob.Mob;
21import com.osroyale.game.world.entity.mob.npc.Npc;
22import com.osroyale.game.world.entity.mob.player.ForceMovement;
23import com.osroyale.game.world.pathfinding.path.SimplePathChecker;
24import com.osroyale.game.world.position.Position;
25import com.osroyale.net.packet.out.SendMessage;
26import com.osroyale.util.Utility;
27
28import static com.osroyale.game.world.entity.combat.CombatUtil.createStrategyArray;
29import static com.osroyale.game.world.entity.combat.CombatUtil.randomStrategy;
30
72
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();
78
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,
82 LIGHTNING_RAIN);
83 private static final CombatStrategy<Npc>[] NON_MELEE = createStrategyArray(MAGIC, MELEE, MELEE, MAGIC, MAGIC,
84 TELE_GRAB, LIGHTNING_RAIN);
85
87 public Derwen() {
88 currentStrategy = MAGIC;
89 currentStrategy = MELEE;
90 }
91
92 @Override
93 public boolean canAttack(Npc attacker, Mob defender) {
94 if (!currentStrategy.withinDistance(attacker, defender)) {
95 currentStrategy = randomStrategy(MAGIC_STRATEGIES);
96 currentStrategy = randomStrategy(NON_MELEE);
97 }
98 return currentStrategy.canAttack(attacker, defender);
99 }
100
101 @Override
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);
106 } else {
107 currentStrategy = randomStrategy(MAGIC_STRATEGIES);
108 }
109 }
110
111 @Override
112 public int getAttackDelay(Npc attacker, Mob defender, FightType fightType) {
113 return attacker.definition.getAttackDelay();
114 }
115
116 private static class Melee extends NpcRangedStrategy {
117
118 public Melee() {
119 super(CombatProjectile.getDefinition("EMPTY"));
120 }
121
122 @Override
123 public void hit(Npc attacker, Mob defender, Hit hit) {
124 }
125
126 @Override
127 public void attack(Npc attacker, Mob defender, Hit hit) {
128 }
129
130 @Override
131 public void start(Npc attacker, Mob defender, Hit[] hits) {
132
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));
138 });
139
140 }
141
142 @Override
143 public CombatHit[] getHits(Npc attacker, Mob defender) {
144 CombatHit hit = nextRangedHit(attacker, defender, 38);
145 hit.setAccurate(false);
146 return new CombatHit[] { hit };
147 }
148
149 @Override
150 public int modifyAccuracy(Npc attacker, Mob defender, int roll) {
151 return roll + 50_000;
152 }
153
154 }
155
157 private static class Magic extends NpcMagicStrategy {
158 public Magic() {
159 super(CombatProjectile.getDefinition("EMPTY"));
160 }
161
162 @Override
163 public void hit(Npc attacker, Mob defender, Hit hit) {
164 }
165
166 @Override
167 public void attack(Npc attacker, Mob defender, Hit hit) {
168 }
169
170 @Override
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));
178
179 });
180
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));
184 attacker.heal(130);
185 attacker.speak("Time To HEAL!");
186 defender.getPlayer().send(new SendMessage("Derwen heals himself!"));
187
188 }
189
190 }
191
192 @Override
193 public CombatHit[] getHits(Npc attacker, Mob defender) {
194 CombatHit hit = nextMagicHit(attacker, defender, 38);
195 hit.setAccurate(false);
196 return new CombatHit[] { hit };
197 }
198
199 @Override
200 public int modifyAccuracy(Npc attacker, Mob defender, int roll) {
201 return roll + 50_000;
202 }
203 }
204
205 private static class TeleGrab extends NpcMagicStrategy {
206 TeleGrab() {
207 super(CombatProjectile.getDefinition("EMPTY"));
208 }
209
210 @Override
211 public void hit(Npc attacker, Mob defender, Hit hit) {
212 }
213
214 @Override
215 public void attack(Npc attacker, Mob defender, Hit hit) {
216 }
217
218 @Override
219 public CombatHit[] getHits(Npc attacker, Mob defender) {
220 CombatHit hit = nextMagicHit(attacker, defender, 38);
221 hit.setAccurate(false);
222 return new CombatHit[] { hit };
223 }
224 }
225
226 private static class LightingRain extends NpcMagicStrategy {
227 LightingRain() {
228 super(CombatProjectile.getDefinition("Vorkath Frozen Special"));
229 }
230
231 @Override
232 public void hit(Npc attacker, Mob defender, Hit hit) {
233 }
234
235 @Override
236 public void attack(Npc attacker, Mob defender, Hit hit) {
237 }
238
239 @Override
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();
249
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);
255 }
256 });
257 }
258
259 @Override
260 public CombatHit[] getHits(Npc attacker, Mob defender) {
261 CombatHit hit = nextMagicHit(attacker, defender, 38);
262 hit.setAccurate(false);
263 return new CombatHit[] { hit };
264 }
265 }
266}