RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
RangedEffects.java
1package com.osroyale.game.world.entity.combat.ranged;
2
3import com.google.common.collect.ImmutableSet;
4import com.osroyale.game.Graphic;
5import com.osroyale.game.world.entity.combat.CombatImpact;
6import com.osroyale.game.world.entity.combat.CombatType;
7import com.osroyale.game.world.entity.combat.CombatUtil;
8import com.osroyale.game.world.entity.combat.PoisonType;
9import com.osroyale.game.world.entity.combat.attack.FightType;
10import com.osroyale.game.world.entity.combat.attack.FormulaFactory;
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.hit.HitIcon;
14import com.osroyale.game.world.entity.mob.Mob;
15import com.osroyale.game.world.entity.mob.data.LockType;
16import com.osroyale.game.world.entity.mob.player.Player;
17import com.osroyale.game.world.entity.skill.Skill;
18import com.osroyale.util.RandomUtils;
19
20import java.util.List;
21import java.util.concurrent.TimeUnit;
22
23import static com.osroyale.game.world.entity.combat.CombatUtil.getHitDelay;
24
46
47public enum RangedEffects {
48 OPAL_BOLTS(new CombatImpact() {
49 @Override
50 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
51 return hit.isAccurate() && hit.getDamage() > 0 && RandomUtils.success(0.05);
52 }
53
54 @Override
55 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
56 int baseHit = hit.getDamage();
57 hit.setDamage((int) (baseHit * 1.10));
58 defender.graphic(new Graphic(749, 0, 20));
59 }
60 }),
61 PEARL_BOLTS(new CombatImpact() {
62 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);
63
64 @Override
65 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
66 if (defender.isPlayer() && defender.getPlayer().equipment.containsAny(1383, 1395, 1403, 21006)) {
67 return false;
68 }
69
70 return hit.isAccurate() && hit.getDamage() > 0 && RandomUtils.success(0.06);
71 }
72
73 @Override
74 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
75 boolean multiply = false;
76 int baseHit = hit.getDamage();
77
78 if (defender.isNpc() && affectedNpcs.contains(defender.getNpc().id)) {
79 multiply = true;
80 }
81
82 if (defender.isPlayer() && defender.getPlayer().equipment.containsAny(1387, 1393, 1401)) {
83 multiply = true;
84 }
85
86 hit.setDamage((int) ((baseHit * 1.075) * (multiply ? 1.20 : 1.0)));
87 defender.graphic(new Graphic(750, 0, 20));
88 }
89 }),
90 JADE_BOLTS(new CombatImpact() {
91 @Override
92 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
93 return hit.isAccurate() && hit.getDamage() > 0 && RandomUtils.success(0.06);
94 }
95
96 @Override
97 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
98 defender.locking.lock(1199, TimeUnit.MILLISECONDS, LockType.WALKING);
99 defender.graphic(new Graphic(755, 0, 20));
100 }
101 }),
102 TOPAZ_BOLTS(new CombatImpact() {
103 @Override
104 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
105 return hit.isAccurate() && hit.getDamage() > 0 && !defender.isNpc() && RandomUtils.success(0.04);
106 }
107
108 @Override
109 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
110 defender.skills.get(Skill.MAGIC).removeLevel(1);
111 defender.graphic(new Graphic(757, 0, 20));
112 }
113 }),
114 SAPPHIRE_BOLTS(new CombatImpact() {
115 @Override
116 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
117 return hit.isAccurate() && hit.getDamage() > 0 && !defender.isNpc() && RandomUtils.success(0.04);
118 }
119
120 @Override
121 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
122 int baseHit = hit.getDamage();
123 int percentage = (int) (baseHit * 0.05);
124 defender.skills.get(Skill.PRAYER).removeLevel(percentage);
125 attacker.skills.get(Skill.PRAYER).addLevel(percentage);
126 defender.graphic(new Graphic(759, 100, 20));
127 }
128 }),
129 EMERALD_BOLTS(new CombatImpact() {
130 @Override
131 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
132 if (defender.isPoisoned()) return false;
133 return hit.isAccurate() && hit.getDamage() > 0 && RandomUtils.success(0.54);
134 }
135
136 @Override
137 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
139 }
140 }),
141 RUBY_BOLTS(new CombatImpact() {
142 @Override
143 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
144 if (attacker.getCurrentHealth() / 5 <= 0) return false;
145 if (defender.isPlayer() && !RandomUtils.success(0.11)) return false;
146 if (defender.isNpc() && !RandomUtils.success(0.06)) 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 int damage = defender.getCurrentHealth() / 5;
153
154 if (damage > 100)
155 damage = 100;
156
157 hit.setDamage(damage);
158 defender.graphic(new Graphic(754, 0, 20));
159
160 int inflict = attacker.getCurrentHealth() / 10;
161 attacker.damage(new Hit(inflict, HitIcon.DEFLECT));
162 }
163 }),
164 DIAMOND_BOLTS(new CombatImpact() {
165 @Override
166 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
167 if (defender.isPlayer() && !RandomUtils.success(0.05)) return false;
168 if (defender.isNpc() && !RandomUtils.success(0.10)) return false;
169 return hit.isAccurate() && hit.getDamage() > 0;
170 }
171
172 @Override
173 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
174 hit.setDamage(hit.getDamage() + RandomUtils.inclusive(5, 14));
175 defender.graphic(new Graphic(758, 0, 20));
176 }
177 }),
178 DRAGON_BOLTS(new CombatImpact() {
179 @Override
180 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
181 if (defender.isPlayer() && defender.getPlayer().equipment.containsAny(1540, 11283)) {
182 return false;
183 }
184
185 if (defender.isPlayer() && defender.getPlayer().getAntifireDetails().isPresent()) {
186 return false;
187 }
188
189 return hit.isAccurate() && hit.getDamage() > 0 && RandomUtils.success(0.06);
190 }
191
192 @Override
193 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
194 int baseHit = hit.getDamage();
195// hit.setDamage((int) (baseHit * 1.14));
196 hit.setDamage((int) (baseHit * 1.58));
197 defender.graphic(new Graphic(756, 0, 20));
198 }
199 }),
200 ONYX_BOLTS(new CombatImpact() {
201 @Override
202 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
203 return hit.isAccurate() && hit.getDamage() > 0 && RandomUtils.success(0.10);
204 }
205
206 @Override
207 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
208 // TODO spell shouldn't work on undead
209 int damage = hit.getDamage() * 6 / 5;
210 hit.setDamage(damage);
211 attacker.heal(damage / 4);
212 defender.graphic(new Graphic(756, 0, 20));
213 }
214 }),
215
216 GUAM_TAR(new CombatImpact() {
217 @Override
218 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
219 return attacker.isPlayer();
220 }
221
222 @Override
223 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
224 Player player = attacker.getPlayer();
225 FightType fightType = player.getCombat().getFightType();
226 CombatType type = fightType.equals(FightType.FLARE) ? CombatType.RANGED : fightType.equals(FightType.SCORCH) ? CombatType.MELEE : CombatType.MAGIC;
227
228 if (type.equals(CombatType.MAGIC)) {
229 Skill magic = player.skills.get(Skill.MAGIC);
230 int max = (int) (Math.floor(0.5 + magic.getLevel() * 15 / 80) * 10);
231 Hit magicHit = FormulaFactory.nextMagicHit(attacker, defender, max);
232 hit.setAs(magicHit);
233 } else if (type.equals(CombatType.MELEE)) {
234 Hit magicHit = FormulaFactory.nextMeleeHit(attacker, defender, 1);
235 hit.setAs(magicHit);
236 }
237 }
238 }),
239 MARRENTIL_TAR(new CombatImpact() {
240 @Override
241 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
242 return attacker.isPlayer();
243 }
244
245 @Override
246 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
247 Player player = attacker.getPlayer();
248 FightType fightType = player.getCombat().getFightType();
249 CombatType type = fightType.equals(FightType.FLARE) ? CombatType.RANGED : fightType.equals(FightType.SCORCH) ? CombatType.MELEE : CombatType.MAGIC;
250
251 if (type.equals(CombatType.MAGIC)) {
252 Skill magic = player.skills.get(Skill.MAGIC);
253 int max = (int) (Math.floor(0.5 + magic.getLevel() * 123 / 640) * 10);
254 Hit magicHit = FormulaFactory.nextMagicHit(attacker, defender, max);
255 hit.setAs(magicHit);
256 } else if (type.equals(CombatType.MELEE)) {
257 Hit magicHit = FormulaFactory.nextMeleeHit(attacker, defender, 1);
258 hit.setAs(magicHit);
259 }
260 }
261 }),
262 TARROMIN_TAR(new CombatImpact() {
263 @Override
264 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
265 return attacker.isPlayer();
266 }
267
268 @Override
269 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
270 Player player = attacker.getPlayer();
271 FightType fightType = player.getCombat().getFightType();
272 CombatType type = fightType.equals(FightType.FLARE) ? CombatType.RANGED : fightType.equals(FightType.SCORCH) ? CombatType.MELEE : CombatType.MAGIC;
273
274 if (type.equals(CombatType.MAGIC)) {
275 Skill magic = player.skills.get(Skill.MAGIC);
276 int max = (int) (Math.floor(0.5 + magic.getLevel() * 141 / 640) * 10);
277 Hit magicHit = FormulaFactory.nextMagicHit(attacker, defender, max);
278 hit.setAs(magicHit);
279 } else if (type.equals(CombatType.MELEE)) {
280 Hit magicHit = FormulaFactory.nextMeleeHit(attacker, defender, 1);
281 hit.setAs(magicHit);
282 }
283 }
284 }),
285 HARRALANDER_TAR(new CombatImpact() {
286 @Override
287 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
288 return attacker.isPlayer();
289 }
290
291 @Override
292 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
293 Player player = attacker.getPlayer();
294 FightType fightType = player.getCombat().getFightType();
295 CombatType type = fightType.equals(FightType.FLARE) ? CombatType.RANGED : fightType.equals(FightType.SCORCH) ? CombatType.MELEE : CombatType.MAGIC;
296
297 if (type.equals(CombatType.MAGIC)) {
298 Skill magic = player.skills.get(Skill.MAGIC);
299 int max = (int) (Math.floor(0.5 + magic.getLevel() * 156 / 640) * 10);
300 Hit magicHit = FormulaFactory.nextMagicHit(attacker, defender, max);
301 hit.setAs(magicHit);
302 } else if (type.equals(CombatType.MELEE)) {
303 Hit magicHit = FormulaFactory.nextMeleeHit(attacker, defender, 1);
304 hit.setAs(magicHit);
305 }
306 }
307 }),
308
309 CHINCHOMPA((attacker, defender, hit, hits) -> {
310 int baseHit = hit.getDamage();
311 CombatUtil.areaAction(defender,
312 actor -> {
313 int min = baseHit - 5;
314 if (min < 0) min = 0;
315 hitEvent(attacker, defender, actor, RandomUtils.inclusive(min, baseHit + 5), hits);
316 });
317 }),
318 RED_CHINCHOMPA((attacker, defender, hit, hits) -> {
319 CombatUtil.areaAction(defender, actor -> hitEvent(attacker, defender, actor, hit.getDamage(), hits));
320 });
321
322 private final CombatImpact effect;
323
324 RangedEffects(CombatImpact effect) {
325 this.effect = effect;
326 }
327
328 public CombatImpact getEffect() {
329 return effect;
330 }
331
332 private static void hitEvent(Mob attacker, Mob defender, Mob actor, int damage, List<Hit> extra) {
333 if (!defender.equals(actor)) {
334 int hitDelay = getHitDelay(attacker, defender, CombatType.RANGED);
335 CombatHit hit = new CombatHit(new Hit(damage, HitIcon.RANGED), hitDelay, 0);
336 attacker.getCombat().submitHits(actor, hit);
337 if (extra != null) extra.add(hit);
338 }
339 }
340
341}
static void areaAction(Mob mob, Consumer< Mob > action)
void poison(PoisonType type)
Definition Mob.java:537
abstract Combat<? extends Mob > getCombat()