RuneHive-Game
Loading...
Searching...
No Matches
MagicImpact.java
Go to the documentation of this file.
1package com.runehive.game.world.entity.combat.magic;
2
3import com.runehive.game.world.entity.combat.CombatImpact;
4import com.runehive.game.world.entity.combat.CombatType;
5import com.runehive.game.world.entity.combat.CombatUtil;
6import com.runehive.game.world.entity.combat.PoisonType;
7import com.runehive.game.world.entity.combat.attack.FormulaFactory;
8import com.runehive.game.world.entity.combat.effect.CombatEffectType;
9import com.runehive.game.world.entity.combat.hit.CombatHit;
10import com.runehive.game.world.entity.combat.hit.Hit;
11import com.runehive.game.world.entity.mob.Mob;
12import com.runehive.game.world.entity.mob.data.LockType;
13import com.runehive.game.world.entity.mob.npc.Npc;
14import com.runehive.game.world.entity.mob.player.Player;
15import com.runehive.game.world.entity.skill.Skill;
16import com.runehive.util.RandomUtils;
17
18import java.util.List;
19import java.util.concurrent.TimeUnit;
20
21public enum MagicImpact {
22 TELEBLOCK((attacker, defender, hit, extra) -> teleblock(defender)),
23
24 BIND((attacker, defender, hit, extra) -> freeze(defender, 5)),
25 SNARE(((attacker, defender, hit, extra) -> freeze(defender, 10))),
26 ENTANGLE(((attacker, defender, hit, extra) -> freeze(defender, 15))),
27
28 CONFUSE((attacker, defender, hit, extra) -> lowerSkill(defender, Skill.ATTACK, 5)),
29 WEAKEN((attacker, defender, hit, extra) -> lowerSkill(defender, Skill.STRENGTH, 5)),
30 CURSE((attacker, defender, hit, extra) -> lowerSkill(defender, Skill.DEFENCE, 5)),
31
32 VULNERABILITY((attacker, defender, hit, extra) -> lowerSkill(defender, Skill.DEFENCE, 10)),
33 ENFEEBLE((attacker, defender, hit, extra) -> lowerSkill(defender, Skill.STRENGTH, 10)),
34 STUN((attacker, defender, hit, extra) -> lowerSkill(defender, Skill.ATTACK, 10)),
35
36 MAGIC_DART((attacker, defender, hit, extra) -> {
37 if (attacker.isPlayer() && hit.isAccurate()) {
38 Player player = attacker.getPlayer();
39 int damage = 10 + player.skills.getLevel(Skill.MAGIC) / 10;
40
41 if (defender.isNpc() && player.slayer.getTask() != null) {
42 Npc mob = defender.getNpc();
43 if (player.slayer.getTask().valid(mob.getName())) {
44 damage = 13 + player.skills.getLevel(Skill.MAGIC) / 6;
45 }
46 }
47
48 hit.setDamage(RandomUtils.inclusive(damage));
49 }
50 }),
51
52 SMOKE_RUSH((attacker, defender, hit, extra) -> poison(attacker, defender, hit, PoisonType.DEFAULT_MAGIC)),
53 SMOKE_BURST((attacker, defender, hit, extra) -> CombatUtil.areaAction(defender, other -> smokeBurst(attacker, defender, other, hit, extra))),
54 SMOKE_BLITZ((attacker, defender, hit, extra) -> poison(attacker, defender, hit, PoisonType.SUPER_MAGIC)),
55 SMOKE_BARRAGE((attacker, defender, hit, extra) -> CombatUtil.areaAction(defender, other -> smokeBarrage(attacker, defender, other, hit, extra))),
56
57 SHADOW_RUSH((attacker, defender, hit, extra) -> lowerSkill(defender, Skill.ATTACK, 10)),
58 SHADOW_BURST((attacker, defender, hit, extra) -> CombatUtil.areaAction(defender, other -> shadowBurst(attacker, defender, other, extra))),
59 SHADOW_BLITZ((attacker, defender, hit, extra) -> lowerSkill(defender, Skill.ATTACK, 15)),
60 SHADOW_BARRAGE((attacker, defender, hit, extra) -> CombatUtil.areaAction(defender, other -> shadowBarrage(attacker, defender, other, extra))),
61
62 BLOOD_RUSH((attacker, defender, hit, extra) -> heal(attacker, hit)),
63 BLOOD_BURST((attacker, defender, hit, extra) -> CombatUtil.areaAction(defender, other -> bloodBurst(attacker, defender, other, hit, extra))),
64 BLOOD_BLITZ((attacker, defender, hit, extra) -> heal(attacker, hit)),
65 BLOOD_BARRAGE((attacker, defender, hit, extra) -> CombatUtil.areaAction(defender, other -> bloodBarrage(attacker, defender, other, hit, extra))),
66
67 ICE_RUSH((attacker, defender, hit, extra) -> freeze(defender, 5)),
68 ICE_BURST((attacker, defender, hit, extra) -> CombatUtil.areaAction(defender, other -> iceBurst(attacker, defender, other, extra))),
69 ICE_BLITZ((attacker, defender, hit, extra) -> freeze(defender, 15)),
70 ICE_BARRAGE((attacker, defender, hit, extra) -> CombatUtil.areaAction(defender, other -> iceBarrage(attacker, defender, other, extra))),
71
72 KBD_FREEZE((attacker, defender, hit, extra) -> freeze(defender, 5)),
73 KBD_POISON((attacker, defender, hit, extra) -> poison(attacker, defender, hit, PoisonType.DEFAULT_NPC)),
74 KBD_SHOCK((attacker, defender, hit, extra) -> kbdShock(defender)),
75
76 AHRIM_BLAST((attacker, defender, hit, extra) -> {
77// if (hit.isAccurate() && Math.random() < 0.20) {
78// defender.skills.get(Skill.STRENGTH).removeLevel(5);
79// defender.skills.refresh(Skill.STRENGTH);
80// }
81 });
82
83 private final CombatImpact effect;
84
86 this.effect = new CombatImpact() {
87 @Override
88 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
89 return hit.isAccurate() && effect.canAffect(attacker, defender, hit);
90 }
91
92 @Override
93 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
94 effect.impact(attacker, defender, hit, hits);
95 }
96 };
97 }
98
100 return effect;
101 }
102
103 private static void kbdShock(Mob defender) {
104 if (!defender.isPlayer()) {
105 return;
106 }
107
108 Player player = defender.getPlayer();
110 Skill skill = player.skills.get(id);
111
112 if (skill.getLevel() - 1 >= 0) {
113 skill.removeLevel(1);
114 player.skills.refresh(id);
115 }
116 }
117
118 private static void lowerSkill(Mob defender, int id, int percentage) {
119 if (!defender.isPlayer()) {
120 return;
121 }
122
123 Player player = defender.getPlayer();
124 Skill skill = player.skills.get(id);
125
126 double ratio = percentage / 100.0;
127 int limit = (int) (skill.getMaxLevel() * (1 - ratio));
128 int amount = (int) (skill.getLevel() * ratio);
129
130 if (skill.getLevel() - amount < limit) {
131 amount = skill.getLevel() - limit;
132 }
133
134 if (amount > 0) {
135 skill.removeLevel(amount);
136 player.skills.refresh(id);
137 }
138 }
139
140 private static void poison(Mob attacker, Mob defender, Hit hit, PoisonType type) {
141 if (!hit.isAccurate() || defender.isPoisoned()) {
142 return;
143 }
144
145 if (!attacker.isNpc() && hit.getDamage() < 1) {
146 return;
147 }
148
149 defender.poison(type);
150 }
151
152 private static void freeze(Mob defender, int timer) {
153 if (!defender.freezeImmunity.finished()) {
154 return;
155 }
156
157 defender.freezeImmunity.reset(TimeUnit.MILLISECONDS.convert(timer + 10, TimeUnit.SECONDS));
158 defender.locking.lock(timer, LockType.FREEZE);
159 defender.movement.reset();
160 }
161
162 private static void heal(Mob attacker, Hit hit) {
163 Skill skill = attacker.skills.get(Skill.HITPOINTS);
164
165 if (skill.getLevel() < skill.getMaxLevel()) {
166 float heal = hit.getDamage() / 40f;
167
168 if (heal + skill.getLevel() > skill.getMaxLevel()) {
169 heal = skill.getMaxLevel() - skill.getLevel();
170 }
171
172 attacker.heal((int) (heal * 10));
173 }
174 }
175
176 private static void smokeBurst(Mob attacker, Mob defender, Mob other, Hit hit, List<Hit> extra) {
177 poison(attacker, defender, hit, PoisonType.DEFAULT_MAGIC);
178 CombatHit next = hitEvent(attacker, defender, other, 18, extra);
179 if (next != null && (attacker.isNpc() || (next.isAccurate() && next.getDamage() > 0))) {
180 poison(attacker, other, hit, PoisonType.DEFAULT_MAGIC);
181 }
182 }
183
184 private static void smokeBarrage(Mob attacker, Mob defender, Mob other, Hit hit, List<Hit> extra) {
185 poison(attacker, defender, hit, PoisonType.SUPER_MAGIC);
186 CombatHit next = hitEvent(attacker, defender, other, 27, extra);
187 if (next != null && (attacker.isNpc() || (next.isAccurate() && next.getDamage() > 0))) {
188 poison(attacker, other, hit, PoisonType.SUPER_MAGIC);
189 }
190 }
191
192 private static void shadowBurst(Mob attacker, Mob defender, Mob other, List<Hit> extra) {
193 lowerSkill(defender, Skill.ATTACK, 10);
194 CombatHit next = hitEvent(attacker, defender, other, 19, extra);
195 if (next != null && next.isAccurate()) {
196 lowerSkill(other, Skill.ATTACK, 10);
197 }
198 }
199
200 private static void shadowBarrage(Mob attacker, Mob defender, Mob other, List<Hit> extra) {
201 lowerSkill(defender, Skill.ATTACK, 15);
202 CombatHit next = hitEvent(attacker, defender, other, 28, extra);
203 if (next != null && next.isAccurate()) {
204 lowerSkill(other, Skill.ATTACK, 15);
205 }
206 }
207
208 private static void bloodBurst(Mob attacker, Mob defender, Mob other, Hit hit, List<Hit> extra) {
209 heal(attacker, hit);
210 CombatHit next = hitEvent(attacker, defender, other, 21, extra);
211 if (next != null && next.isAccurate()) {
212 heal(attacker, next);
213 }
214 }
215
216 private static void bloodBarrage(Mob attacker, Mob defender, Mob other, Hit hit, List<Hit> extra) {
217 heal(attacker, hit);
218 CombatHit next = hitEvent(attacker, defender, other, 29, extra);
219 if (next != null && next.isAccurate()) {
220 heal(attacker, next);
221 }
222 }
223
224 private static void iceBurst(Mob attacker, Mob defender, Mob other, List<Hit> extra) {
225 freeze(defender, 10);
226 CombatHit next = hitEvent(attacker, defender, other, 22, extra);
227 if (next != null && next.isAccurate()) {
228 freeze(other, 10);
229 }
230 }
231
232 private static void iceBarrage(Mob attacker, Mob defender, Mob other, List<Hit> extra) {
233 freeze(defender, 20);
234 CombatHit next = hitEvent(attacker, defender, other, 28, extra);
235 if (next != null && next.isAccurate()) {
236 freeze(other, 20);
237 }
238 }
239
240 private static void teleblock(Mob defender) {
241 if (defender.isPlayer()) {
243 }
244 }
245
246 private static CombatHit hitEvent(Mob attacker, Mob defender, Mob other, int max, List<Hit> extra) {
247 if (!attacker.getCombat().canAttack(other)) {
248 return null;
249 }
250
251 if (!attacker.equals(other) && !defender.equals(other)) {
252 int hitDelay = CombatUtil.getHitDelay(attacker, defender, CombatType.MAGIC);
253 CombatHit hit = new CombatHit(FormulaFactory.nextMagicHit(attacker, other, max), hitDelay, 0);
254 attacker.getCombat().submitHits(other, hit);
255 if (extra != null) extra.add(hit);
256 return hit;
257 }
258 return null;
259 }
260
261}
abstract boolean equals(Object obj)
A collection of util methods and constants related to combat.
static int getHitDelay(final Mob attacker, final Mob defender, final CombatType type)
Gets the hit delay for the specified type.
static boolean effect(Mob mob, CombatEffectType effect)
Applies the effect in any context.
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
int getDamage()
Gets the damage amount.
Definition Hit.java:121
boolean isAccurate()
Checks if the hit is accurate.
Definition Hit.java:148
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
void reset()
Resets the walking queue so it contains no more steps.
Represents a non-player character in the in-game world.
Definition Npc.java:29
This class represents a character controlled by a player.
Definition Player.java:125
Represents a trainable and usable skill.
Definition Skill.java:18
static final int DEFENCE
The defence skill id.
Definition Skill.java:24
static final int MAGIC
The magic skill id.
Definition Skill.java:39
static final int ATTACK
The attack skill id.
Definition Skill.java:21
static final int STRENGTH
The strength skill id.
Definition Skill.java:27
static final int HITPOINTS
The hitpoints skill id.
Definition Skill.java:30
int getLevel(int id)
Gets the level of a skill.
Skill get(int id)
Gets the skill for an id.
void refresh()
Refreshes all the skills for the mob.
A static-util class that provides additional functionality for generating pseudo-random numbers.
static int inclusiveExcludes(int min, int max, int... exclude)
Returns a pseudo-random int value between inclusive min and inclusive max excluding the specified num...
static int inclusive(int min, int max)
Returns a pseudo-random int value between inclusive min and inclusive max.
boolean valid(String name)
Checks if the npc is a slayer task assignment.
The enumerated type whose elements represent the different levels of poison.
DEFAULT_MAGIC
The default poison type for magic spells.
DEFAULT_NPC
The default poison type for poisonous NPCs.
SUPER_MAGIC
The strongest poison type for magic spells.
The enumerated type whose values represent the collection of different combat effect types.
static void iceBarrage(Mob attacker, Mob defender, Mob other, List< Hit > extra)
static void poison(Mob attacker, Mob defender, Hit hit, PoisonType type)
static void bloodBurst(Mob attacker, Mob defender, Mob other, Hit hit, List< Hit > extra)
static void bloodBarrage(Mob attacker, Mob defender, Mob other, Hit hit, List< Hit > extra)
static void iceBurst(Mob attacker, Mob defender, Mob other, List< Hit > extra)
static void shadowBarrage(Mob attacker, Mob defender, Mob other, List< Hit > extra)
static CombatHit hitEvent(Mob attacker, Mob defender, Mob other, int max, List< Hit > extra)
static void smokeBurst(Mob attacker, Mob defender, Mob other, Hit hit, List< Hit > extra)
static void lowerSkill(Mob defender, int id, int percentage)
static void shadowBurst(Mob attacker, Mob defender, Mob other, List< Hit > extra)
static void smokeBarrage(Mob attacker, Mob defender, Mob other, Hit hit, List< Hit > extra)
Represents a combat impact hit effect.