RuneHive-Game
Loading...
Searching...
No Matches
Derwen.java
Go to the documentation of this file.
1package com.runehive.game.world.entity.combat.strategy.npc.boss.magearena;
2
3import com.runehive.game.Animation;
4import com.runehive.game.Graphic;
5import com.runehive.game.Projectile;
6import com.runehive.game.UpdatePriority;
7import com.runehive.game.task.impl.ForceMovementTask;
8import com.runehive.game.world.World;
9import com.runehive.game.world.entity.combat.CombatUtil;
10import com.runehive.game.world.entity.combat.attack.FightType;
11import com.runehive.game.world.entity.combat.hit.CombatHit;
12import com.runehive.game.world.entity.combat.hit.Hit;
13import com.runehive.game.world.entity.combat.projectile.CombatProjectile;
14import com.runehive.game.world.entity.combat.strategy.CombatStrategy;
15import com.runehive.game.world.entity.combat.strategy.npc.MultiStrategy;
16import com.runehive.game.world.entity.combat.strategy.npc.NpcMagicStrategy;
17import com.runehive.game.world.entity.combat.strategy.npc.NpcMeleeStrategy;
18import com.runehive.game.world.entity.combat.strategy.npc.NpcRangedStrategy;
19import com.runehive.game.world.entity.mob.Direction;
20import com.runehive.game.world.entity.mob.Mob;
21import com.runehive.game.world.entity.mob.npc.Npc;
22import com.runehive.game.world.entity.mob.player.ForceMovement;
23import com.runehive.game.world.pathfinding.path.SimplePathChecker;
24import com.runehive.game.world.position.Position;
25import com.runehive.net.packet.out.SendMessage;
26import com.runehive.util.Utility;
27
28import static com.runehive.game.world.entity.combat.CombatUtil.createStrategyArray;
29import static com.runehive.game.world.entity.combat.CombatUtil.randomStrategy;
30
31/**
32 * Handles Derwen Combat Strategy
33 *
34 * @author TJ#5762
35 */
36public class Derwen extends MultiStrategy {
37 private static Magic MAGIC = new Magic();
38 private static Melee MELEE = new Melee();
40 private static TeleGrab TELE_GRAB = new TeleGrab();
41
42 private static final CombatStrategy<Npc>[] FULL_STRATEGIES = createStrategyArray(NpcMeleeStrategy.get(), MAGIC,
44 private static final CombatStrategy<Npc>[] MAGIC_STRATEGIES = createStrategyArray(MAGIC, MAGIC, MAGIC, TELE_GRAB,
46 private static final CombatStrategy<Npc>[] NON_MELEE = createStrategyArray(MAGIC, MELEE, MELEE, MAGIC, MAGIC,
48
49 /** Constructs a new <code>Derwen</code>. */
50 public Derwen() {
53 }
54
55 @Override
56 public boolean canAttack(Npc attacker, Mob defender) {
57 if (!currentStrategy.withinDistance(attacker, defender)) {
58 currentStrategy = randomStrategy(MAGIC_STRATEGIES);
59 currentStrategy = randomStrategy(NON_MELEE);
60 }
61 return currentStrategy.canAttack(attacker, defender);
62 }
63
64 @Override
65 public void finishOutgoing(Npc attacker, Mob defender) {
66 currentStrategy.finishOutgoing(attacker, defender);
67 if (NpcMeleeStrategy.get().withinDistance(attacker, defender)) {
68 currentStrategy = randomStrategy(FULL_STRATEGIES);
69 } else {
70 currentStrategy = randomStrategy(MAGIC_STRATEGIES);
71 }
72 }
73
74 @Override
75 public int getAttackDelay(Npc attacker, Mob defender, FightType fightType) {
76 return attacker.definition.getAttackDelay();
77 }
78
79 private static class Melee extends NpcRangedStrategy {
80
81 public Melee() {
82 super(CombatProjectile.getDefinition("EMPTY"));
83 }
84
85 @Override
86 public void hit(Npc attacker, Mob defender, Hit hit) {
87 }
88
89 @Override
90 public void attack(Npc attacker, Mob defender, Hit hit) {
91 }
92
93 @Override
94 public void start(Npc attacker, Mob defender, Hit[] hits) {
95
96 attacker.animate(new Animation(7848, UpdatePriority.VERY_HIGH));
97 CombatHit hit = nextMeleeHit(attacker, defender, 21);
98 defender.graphic(1176);
99 CombatUtil.areaAction(attacker, 64, 18, mob -> {
100 mob.damage(nextMagicHit(attacker, defender, 38));
101 });
102
103 }
104
105 @Override
106 public CombatHit[] getHits(Npc attacker, Mob defender) {
107 CombatHit hit = nextRangedHit(attacker, defender, 38);
108 hit.setAccurate(false);
109 return new CombatHit[] { hit };
110 }
111
112 @Override
113 public int modifyAccuracy(Npc attacker, Mob defender, int roll) {
114 return roll + 50_000;
115 }
116
117 }
118
119 /** Jisticiar magic strategy. */
120 private static class Magic extends NpcMagicStrategy {
121 public Magic() {
122 super(CombatProjectile.getDefinition("EMPTY"));
123 }
124
125 @Override
126 public void hit(Npc attacker, Mob defender, Hit hit) {
127 }
128
129 @Override
130 public void attack(Npc attacker, Mob defender, Hit hit) {
131 }
132
133 @Override
134 public void start(Npc attacker, Mob defender, Hit[] hits) {
135 attacker.animate(new Animation(7849, UpdatePriority.VERY_HIGH));
136 Projectile projectile = new Projectile(1379, 50, 80, 85, 25);
137 CombatUtil.areaAction(attacker, 64, 18, mob -> {
138 projectile.send(attacker, defender);
139 defender.graphic(157);
140 mob.damage(nextMagicHit(attacker, defender, 35));
141
142 });
143
144 if (Utility.random(0, 25) == 1) {
145 attacker.animate(new Animation(7849, UpdatePriority.VERY_HIGH));
146 attacker.graphic(new Graphic(1296, UpdatePriority.VERY_HIGH));
147 attacker.heal(130);
148 attacker.speak("Time To HEAL!");
149 defender.getPlayer().send(new SendMessage("Derwen heals himself!"));
150
151 }
152
153 }
154
155 @Override
156 public CombatHit[] getHits(Npc attacker, Mob defender) {
157 CombatHit hit = nextMagicHit(attacker, defender, 38);
158 hit.setAccurate(false);
159 return new CombatHit[] { hit };
160 }
161
162 @Override
163 public int modifyAccuracy(Npc attacker, Mob defender, int roll) {
164 return roll + 50_000;
165 }
166 }
167
168 private static class TeleGrab extends NpcMagicStrategy {
170 super(CombatProjectile.getDefinition("EMPTY"));
171 }
172
173 @Override
174 public void hit(Npc attacker, Mob defender, Hit hit) {
175 }
176
177 @Override
178 public void attack(Npc attacker, Mob defender, Hit hit) {
179 }
180
181 @Override
182 public CombatHit[] getHits(Npc attacker, Mob defender) {
183 CombatHit hit = nextMagicHit(attacker, defender, 38);
184 hit.setAccurate(false);
185 return new CombatHit[] { hit };
186 }
187 }
188
189 private static class LightingRain extends NpcMagicStrategy {
191 super(CombatProjectile.getDefinition("Vorkath Frozen Special"));
192 }
193
194 @Override
195 public void hit(Npc attacker, Mob defender, Hit hit) {
196 }
197
198 @Override
199 public void attack(Npc attacker, Mob defender, Hit hit) {
200 }
201
202 @Override
203 public void start(Npc attacker, Mob defender, Hit[] hits) {
204 attacker.animate(new Animation(7849, UpdatePriority.VERY_HIGH));
205 World.sendProjectile(attacker, defender, new Projectile(1382, 46, 80, 43, 31));
206 World.schedule(1, () -> {
207 if (defender.isPlayer()) {
208 Position current = defender.getPosition();
209 Position best = Utility.findBestInside(defender, attacker);
210 int dx = current.getX() - best.getX();
211 int dy = current.getY() - best.getY();
212
213 int y = dy / (dx == 0 ? dy : dx);
214 Position destination = current.transform(dx, y);
215 if (SimplePathChecker.checkLine(defender, destination))
216 defender.damage(new Hit(Utility.random(1, 3)));
217 defender.interact(attacker);
218 }
219 });
220 }
221
222 @Override
223 public CombatHit[] getHits(Npc attacker, Mob defender) {
224 CombatHit hit = nextMagicHit(attacker, defender, 38);
225 hit.setAccurate(false);
226 return new CombatHit[] { hit };
227 }
228 }
229}
Class that models a single animation used by an entity.
Represents a single graphic that can be used by entities.
Definition Graphic.java:10
Represents the game world.
Definition World.java:46
static void schedule(Task task)
Submits a new event.
Definition World.java:247
static void sendProjectile(Projectile projectile, Position position, int instance, int lock, byte offsetX, byte offsetY)
Sends a world projectile.
Definition World.java:295
A collection of util methods and constants related to combat.
static void areaAction(Mob mob, Consumer< Mob > action)
Executes an action for mobs within a 3x3 square, including the source mob.
A wrapper for a Hit object, adding additional variables for hit and hitsplat delays.
A Hit object holds the damage amount and hitsplat data.
Definition Hit.java:10
final CombatHit nextRangedHit(T attacker, Mob defender)
final CombatHit nextMagicHit(T attacker, Mob defender)
int getAttackDelay(Npc attacker, Mob defender, FightType fightType)
Definition Derwen.java:75
Handles the mob class.
Definition Mob.java:66
void speak(String forceChat)
Sets the mob's forced chat.
Definition Mob.java:127
void interact(Mob mob)
Sets the mob interacting with another mob.
Definition Mob.java:278
final boolean isPlayer()
Check if an entity is a player.
Definition Mob.java:564
Optional< Graphic > graphic
Definition Mob.java:91
Represents a non-player character in the in-game world.
Definition Npc.java:29
Represents a PathFinder which is meant to be used to check projectiles passage in a straight line.
static boolean checkLine(Interactable source, Interactable target)
Represents a single tile on the game world.
Definition Position.java:14
int getY()
Gets the absolute y coordinate.
Definition Position.java:46
int getX()
Gets the absolute x coordinate.
Definition Position.java:41
Position transform(int diffX, int diffY, int diffZ)
Creates a new location based on this location.
The OutgoingPacket that sends a message to a Players chatbox in the client.
Handles miscellaneous methods.
Definition Utility.java:27
static int random(int bound)
Definition Utility.java:239
static Position findBestInside(Interactable source, Interactable target)
Definition Utility.java:498
Represents different priorities for updating.
The enumerated type whose elements represent the fighting types.