RuneHive-Game
Loading...
Searching...
No Matches
RangedEffects.java
Go to the documentation of this file.
1package com.runehive.game.world.entity.combat.ranged;
2
3import com.google.common.collect.ImmutableSet;
4import com.runehive.game.Graphic;
5import com.runehive.game.world.entity.combat.CombatImpact;
6import com.runehive.game.world.entity.combat.CombatType;
7import com.runehive.game.world.entity.combat.CombatUtil;
8import com.runehive.game.world.entity.combat.PoisonType;
9import com.runehive.game.world.entity.combat.attack.FightType;
10import com.runehive.game.world.entity.combat.attack.FormulaFactory;
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.hit.HitIcon;
14import com.runehive.game.world.entity.mob.Mob;
15import com.runehive.game.world.entity.mob.data.LockType;
16import com.runehive.game.world.entity.mob.player.Player;
17import com.runehive.game.world.entity.skill.Skill;
18import com.runehive.util.RandomUtils;
19
20import java.util.List;
21import java.util.concurrent.TimeUnit;
22
23import static com.runehive.game.world.entity.combat.CombatUtil.getHitDelay;
24
25public enum RangedEffects {
27 @Override
28 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
29 return hit.isAccurate() && hit.getDamage() > 0 && RandomUtils.success(0.05);
30 }
31
32 @Override
33 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
34 int baseHit = hit.getDamage();
35 hit.setDamage((int) (baseHit * 1.10));
36 defender.graphic(new Graphic(749, 0, 20));
37 }
38 }),
40 final ImmutableSet<Integer> affectedNpcs = ImmutableSet.of(941, 55, 54, 53, 50, 5362, 1590, 1591, 1592, 5363, 110, 1633, 1634, 1635, 1636, 1019, 2591, 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599, 2600, 2601, 2602, 2603, 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, 2616, 2627, 2628, 2629, 2630, 2631, 2631, 2734, 2735, 2736, 2737, 2738, 2739, 2740, 2741, 2742, 2743, 2744, 2745, 2746);
41
42 @Override
43 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
44 if (defender.isPlayer() && defender.getPlayer().equipment.containsAny(1383, 1395, 1403, 21006)) {
45 return false;
46 }
47
48 return hit.isAccurate() && hit.getDamage() > 0 && RandomUtils.success(0.06);
49 }
50
51 @Override
52 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
53 boolean multiply = false;
54 int baseHit = hit.getDamage();
55
56 if (defender.isNpc() && affectedNpcs.contains(defender.getNpc().id)) {
57 multiply = true;
58 }
59
60 if (defender.isPlayer() && defender.getPlayer().equipment.containsAny(1387, 1393, 1401)) {
61 multiply = true;
62 }
63
64 hit.setDamage((int) ((baseHit * 1.075) * (multiply ? 1.20 : 1.0)));
65 defender.graphic(new Graphic(750, 0, 20));
66 }
67 }),
69 @Override
70 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
71 return hit.isAccurate() && hit.getDamage() > 0 && RandomUtils.success(0.06);
72 }
73
74 @Override
75 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
76 defender.locking.lock(1199, TimeUnit.MILLISECONDS, LockType.WALKING);
77 defender.graphic(new Graphic(755, 0, 20));
78 }
79 }),
81 @Override
82 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
83 return hit.isAccurate() && hit.getDamage() > 0 && !defender.isNpc() && RandomUtils.success(0.04);
84 }
85
86 @Override
87 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
88 defender.skills.get(Skill.MAGIC).removeLevel(1);
89 defender.graphic(new Graphic(757, 0, 20));
90 }
91 }),
93 @Override
94 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
95 return hit.isAccurate() && hit.getDamage() > 0 && !defender.isNpc() && RandomUtils.success(0.04);
96 }
97
98 @Override
99 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
100 int baseHit = hit.getDamage();
101 int percentage = (int) (baseHit * 0.05);
102 defender.skills.get(Skill.PRAYER).removeLevel(percentage);
103 attacker.skills.get(Skill.PRAYER).addLevel(percentage);
104 defender.graphic(new Graphic(759, 100, 20));
105 }
106 }),
108 @Override
109 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
110 if (defender.isPoisoned()) return false;
111 return hit.isAccurate() && hit.getDamage() > 0 && RandomUtils.success(0.54);
112 }
113
114 @Override
115 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
117 }
118 }),
120 @Override
121 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
122 if (attacker.getCurrentHealth() / 5 <= 0) return false;
123 if (defender.isPlayer() && !RandomUtils.success(0.11)) return false;
124 if (defender.isNpc() && !RandomUtils.success(0.06)) return false;
125 return hit.isAccurate() && hit.getDamage() > 0;
126 }
127
128 @Override
129 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
130 int damage = defender.getCurrentHealth() / 5;
131
132 if (damage > 100)
133 damage = 100;
134
135 hit.setDamage(damage);
136 defender.graphic(new Graphic(754, 0, 20));
137
138 int inflict = attacker.getCurrentHealth() / 10;
139 attacker.damage(new Hit(inflict, HitIcon.DEFLECT));
140 }
141 }),
143 @Override
144 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
145 if (defender.isPlayer() && !RandomUtils.success(0.05)) return false;
146 if (defender.isNpc() && !RandomUtils.success(0.10)) return false;
147 return hit.isAccurate() && hit.getDamage() > 0;
148 }
149
150 @Override
151 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
152 hit.setDamage(hit.getDamage() + RandomUtils.inclusive(5, 14));
153 defender.graphic(new Graphic(758, 0, 20));
154 }
155 }),
157 @Override
158 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
159 if (defender.isPlayer() && defender.getPlayer().equipment.containsAny(1540, 11283)) {
160 return false;
161 }
162
163 if (defender.isPlayer() && defender.getPlayer().getAntifireDetails().isPresent()) {
164 return false;
165 }
166
167 return hit.isAccurate() && hit.getDamage() > 0 && RandomUtils.success(0.06);
168 }
169
170 @Override
171 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
172 int baseHit = hit.getDamage();
173// hit.setDamage((int) (baseHit * 1.14));
174 hit.setDamage((int) (baseHit * 1.58));
175 defender.graphic(new Graphic(756, 0, 20));
176 }
177 }),
179 @Override
180 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
181 return hit.isAccurate() && hit.getDamage() > 0 && RandomUtils.success(0.10);
182 }
183
184 @Override
185 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
186 // TODO spell shouldn't work on undead
187 int damage = hit.getDamage() * 6 / 5;
188 hit.setDamage(damage);
189 attacker.heal(damage / 4);
190 defender.graphic(new Graphic(756, 0, 20));
191 }
192 }),
193
195 @Override
196 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
197 return attacker.isPlayer();
198 }
199
200 @Override
201 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
202 Player player = attacker.getPlayer();
203 FightType fightType = player.getCombat().getFightType();
204 CombatType type = fightType.equals(FightType.FLARE) ? CombatType.RANGED : fightType.equals(FightType.SCORCH) ? CombatType.MELEE : CombatType.MAGIC;
205
206 if (type.equals(CombatType.MAGIC)) {
207 Skill magic = player.skills.get(Skill.MAGIC);
208 int max = (int) (Math.floor(0.5 + magic.getLevel() * 15 / 80) * 10);
209 Hit magicHit = FormulaFactory.nextMagicHit(attacker, defender, max);
210 hit.setAs(magicHit);
211 } else if (type.equals(CombatType.MELEE)) {
212 Hit magicHit = FormulaFactory.nextMeleeHit(attacker, defender, 1);
213 hit.setAs(magicHit);
214 }
215 }
216 }),
218 @Override
219 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
220 return attacker.isPlayer();
221 }
222
223 @Override
224 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
225 Player player = attacker.getPlayer();
226 FightType fightType = player.getCombat().getFightType();
227 CombatType type = fightType.equals(FightType.FLARE) ? CombatType.RANGED : fightType.equals(FightType.SCORCH) ? CombatType.MELEE : CombatType.MAGIC;
228
229 if (type.equals(CombatType.MAGIC)) {
230 Skill magic = player.skills.get(Skill.MAGIC);
231 int max = (int) (Math.floor(0.5 + magic.getLevel() * 123 / 640) * 10);
232 Hit magicHit = FormulaFactory.nextMagicHit(attacker, defender, max);
233 hit.setAs(magicHit);
234 } else if (type.equals(CombatType.MELEE)) {
235 Hit magicHit = FormulaFactory.nextMeleeHit(attacker, defender, 1);
236 hit.setAs(magicHit);
237 }
238 }
239 }),
241 @Override
242 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
243 return attacker.isPlayer();
244 }
245
246 @Override
247 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
248 Player player = attacker.getPlayer();
249 FightType fightType = player.getCombat().getFightType();
250 CombatType type = fightType.equals(FightType.FLARE) ? CombatType.RANGED : fightType.equals(FightType.SCORCH) ? CombatType.MELEE : CombatType.MAGIC;
251
252 if (type.equals(CombatType.MAGIC)) {
253 Skill magic = player.skills.get(Skill.MAGIC);
254 int max = (int) (Math.floor(0.5 + magic.getLevel() * 141 / 640) * 10);
255 Hit magicHit = FormulaFactory.nextMagicHit(attacker, defender, max);
256 hit.setAs(magicHit);
257 } else if (type.equals(CombatType.MELEE)) {
258 Hit magicHit = FormulaFactory.nextMeleeHit(attacker, defender, 1);
259 hit.setAs(magicHit);
260 }
261 }
262 }),
264 @Override
265 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
266 return attacker.isPlayer();
267 }
268
269 @Override
270 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
271 Player player = attacker.getPlayer();
272 FightType fightType = player.getCombat().getFightType();
273 CombatType type = fightType.equals(FightType.FLARE) ? CombatType.RANGED : fightType.equals(FightType.SCORCH) ? CombatType.MELEE : CombatType.MAGIC;
274
275 if (type.equals(CombatType.MAGIC)) {
276 Skill magic = player.skills.get(Skill.MAGIC);
277 int max = (int) (Math.floor(0.5 + magic.getLevel() * 156 / 640) * 10);
278 Hit magicHit = FormulaFactory.nextMagicHit(attacker, defender, max);
279 hit.setAs(magicHit);
280 } else if (type.equals(CombatType.MELEE)) {
281 Hit magicHit = FormulaFactory.nextMeleeHit(attacker, defender, 1);
282 hit.setAs(magicHit);
283 }
284 }
285 }),
286
287 CHINCHOMPA((attacker, defender, hit, hits) -> {
288 int baseHit = hit.getDamage();
289 CombatUtil.areaAction(defender,
290 actor -> {
291 int min = baseHit - 5;
292 if (min < 0) min = 0;
293 hitEvent(attacker, defender, actor, RandomUtils.inclusive(min, baseHit + 5), hits);
294 });
295 }),
296 RED_CHINCHOMPA((attacker, defender, hit, hits) -> {
297 CombatUtil.areaAction(defender, actor -> hitEvent(attacker, defender, actor, hit.getDamage(), hits));
298 });
299
300 private final CombatImpact effect;
301
303 this.effect = effect;
304 }
305
307 return effect;
308 }
309
310 private static void hitEvent(Mob attacker, Mob defender, Mob actor, int damage, List<Hit> extra) {
311 if (!defender.equals(actor)) {
312 int hitDelay = getHitDelay(attacker, defender, CombatType.RANGED);
313 CombatHit hit = new CombatHit(new Hit(damage, HitIcon.RANGED), hitDelay, 0);
314 attacker.getCombat().submitHits(actor, hit);
315 if (extra != null) extra.add(hit);
316 }
317 }
318
319}
Represents a single graphic that can be used by entities.
Definition Graphic.java:10
abstract boolean equals(Object obj)
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.
Supplies factory methods useful for combat.
static Hit nextMagicHit(Mob attacker, Mob defender, int max)
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
Handles the mob class.
Definition Mob.java:66
void poison(PoisonType type)
Applies poison with an intensity of type to the entity.
Definition Mob.java:500
abstract Combat<? extends Mob > getCombat()
The combat of the mob.
final boolean isNpc()
Check if an entity is an npc.
Definition Mob.java:550
final boolean isPlayer()
Check if an entity is a player.
Definition Mob.java:564
Optional< Graphic > graphic
Definition Mob.java:91
This class represents a character controlled by a player.
Definition Player.java:125
Optional< AntifireDetails > getAntifireDetails()
Definition Player.java:897
Combat< Player > getCombat()
The combat of the mob.
Definition Player.java:759
Represents a trainable and usable skill.
Definition Skill.java:18
static final int PRAYER
The prayer skill id.
Definition Skill.java:36
void removeLevel(int amount)
Removes levels from this skill by the given amount.
Definition Skill.java:325
static final int MAGIC
The magic skill id.
Definition Skill.java:39
void addLevel(int amount)
Adds levels to this skill by the given amount.
Definition Skill.java:316
Skill get(int id)
Gets the skill for an id.
final boolean containsAny(int... identifiers)
Determines if this container contains any identifiers.
A static-util class that provides additional functionality for generating pseudo-random numbers.
static int inclusive(int min, int max)
Returns a pseudo-random int value between inclusive min and inclusive max.
static boolean success(double value)
Determines if a pseudorandomly generated double rounded to two decimal places is below or equal to va...
The enumerated type whose elements represent the different levels of poison.
SUPER_RANGED
The strongest poison type for ranged ammunition.
The enumerated type whose elements represent the fighting types.
The enumerated type whose elements represent the hit icon of a Hit.
Definition HitIcon.java:8
DEFLECT
Represents the leech hit icon.
Definition HitIcon.java:23
RANGED
Represents the ranged bow hit icon.
Definition HitIcon.java:17
static void hitEvent(Mob attacker, Mob defender, Mob actor, int damage, List< Hit > extra)
Represents a combat impact hit effect.