RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
MagicImpact.java
1package com.osroyale.game.world.entity.combat.magic;
2
3import com.osroyale.game.world.entity.combat.CombatImpact;
4import com.osroyale.game.world.entity.combat.CombatType;
5import com.osroyale.game.world.entity.combat.CombatUtil;
6import com.osroyale.game.world.entity.combat.PoisonType;
7import com.osroyale.game.world.entity.combat.attack.FormulaFactory;
8import com.osroyale.game.world.entity.combat.effect.CombatEffectType;
9import com.osroyale.game.world.entity.combat.hit.CombatHit;
10import com.osroyale.game.world.entity.combat.hit.Hit;
11import com.osroyale.game.world.entity.mob.Mob;
12import com.osroyale.game.world.entity.mob.data.LockType;
13import com.osroyale.game.world.entity.mob.npc.Npc;
14import com.osroyale.game.world.entity.mob.player.Player;
15import com.osroyale.game.world.entity.skill.Skill;
16import com.osroyale.util.RandomUtils;
17
18import java.util.List;
19import java.util.concurrent.TimeUnit;
20
48
49public enum MagicImpact {
50 TELEBLOCK((attacker, defender, hit, extra) -> teleblock(defender)),
51
52 BIND((attacker, defender, hit, extra) -> freeze(defender, 5)),
53 SNARE(((attacker, defender, hit, extra) -> freeze(defender, 10))),
54 ENTANGLE(((attacker, defender, hit, extra) -> freeze(defender, 15))),
55
56 CONFUSE((attacker, defender, hit, extra) -> lowerSkill(defender, Skill.ATTACK, 5)),
57 WEAKEN((attacker, defender, hit, extra) -> lowerSkill(defender, Skill.STRENGTH, 5)),
58 CURSE((attacker, defender, hit, extra) -> lowerSkill(defender, Skill.DEFENCE, 5)),
59
60 VULNERABILITY((attacker, defender, hit, extra) -> lowerSkill(defender, Skill.DEFENCE, 10)),
61 ENFEEBLE((attacker, defender, hit, extra) -> lowerSkill(defender, Skill.STRENGTH, 10)),
62 STUN((attacker, defender, hit, extra) -> lowerSkill(defender, Skill.ATTACK, 10)),
63
64 MAGIC_DART((attacker, defender, hit, extra) -> {
65 if (attacker.isPlayer() && hit.isAccurate()) {
66 Player player = attacker.getPlayer();
67 int damage = 10 + player.skills.getLevel(Skill.MAGIC) / 10;
68
69 if (defender.isNpc() && player.slayer.getTask() != null) {
70 Npc mob = defender.getNpc();
71 if (player.slayer.getTask().valid(mob.getName())) {
72 damage = 13 + player.skills.getLevel(Skill.MAGIC) / 6;
73 }
74 }
75
76 hit.setDamage(RandomUtils.inclusive(damage));
77 }
78 }),
79
80 SMOKE_RUSH((attacker, defender, hit, extra) -> poison(attacker, defender, hit, PoisonType.DEFAULT_MAGIC)),
81 SMOKE_BURST((attacker, defender, hit, extra) -> CombatUtil.areaAction(defender, other -> smokeBurst(attacker, defender, other, hit, extra))),
82 SMOKE_BLITZ((attacker, defender, hit, extra) -> poison(attacker, defender, hit, PoisonType.SUPER_MAGIC)),
83 SMOKE_BARRAGE((attacker, defender, hit, extra) -> CombatUtil.areaAction(defender, other -> smokeBarrage(attacker, defender, other, hit, extra))),
84
85 SHADOW_RUSH((attacker, defender, hit, extra) -> lowerSkill(defender, Skill.ATTACK, 10)),
86 SHADOW_BURST((attacker, defender, hit, extra) -> CombatUtil.areaAction(defender, other -> shadowBurst(attacker, defender, other, extra))),
87 SHADOW_BLITZ((attacker, defender, hit, extra) -> lowerSkill(defender, Skill.ATTACK, 15)),
88 SHADOW_BARRAGE((attacker, defender, hit, extra) -> CombatUtil.areaAction(defender, other -> shadowBarrage(attacker, defender, other, extra))),
89
90 BLOOD_RUSH((attacker, defender, hit, extra) -> heal(attacker, hit)),
91 BLOOD_BURST((attacker, defender, hit, extra) -> CombatUtil.areaAction(defender, other -> bloodBurst(attacker, defender, other, hit, extra))),
92 BLOOD_BLITZ((attacker, defender, hit, extra) -> heal(attacker, hit)),
93 BLOOD_BARRAGE((attacker, defender, hit, extra) -> CombatUtil.areaAction(defender, other -> bloodBarrage(attacker, defender, other, hit, extra))),
94
95 ICE_RUSH((attacker, defender, hit, extra) -> freeze(defender, 5)),
96 ICE_BURST((attacker, defender, hit, extra) -> CombatUtil.areaAction(defender, other -> iceBurst(attacker, defender, other, extra))),
97 ICE_BLITZ((attacker, defender, hit, extra) -> freeze(defender, 15)),
98 ICE_BARRAGE((attacker, defender, hit, extra) -> CombatUtil.areaAction(defender, other -> iceBarrage(attacker, defender, other, extra))),
99
100 KBD_FREEZE((attacker, defender, hit, extra) -> freeze(defender, 5)),
101 KBD_POISON((attacker, defender, hit, extra) -> poison(attacker, defender, hit, PoisonType.DEFAULT_NPC)),
102 KBD_SHOCK((attacker, defender, hit, extra) -> kbdShock(defender)),
103
104 AHRIM_BLAST((attacker, defender, hit, extra) -> {
105// if (hit.isAccurate() && Math.random() < 0.20) {
106// defender.skills.get(Skill.STRENGTH).removeLevel(5);
107// defender.skills.refresh(Skill.STRENGTH);
108// }
109 });
110
111 private final CombatImpact effect;
112
113 MagicImpact(CombatImpact effect) {
114 this.effect = new CombatImpact() {
115 @Override
116 public boolean canAffect(Mob attacker, Mob defender, Hit hit) {
117 return hit.isAccurate() && effect.canAffect(attacker, defender, hit);
118 }
119
120 @Override
121 public void impact(Mob attacker, Mob defender, Hit hit, List<Hit> hits) {
122 effect.impact(attacker, defender, hit, hits);
123 }
124 };
125 }
126
127 public CombatImpact getEffect() {
128 return effect;
129 }
130
131 private static void kbdShock(Mob defender) {
132 if (!defender.isPlayer()) {
133 return;
134 }
135
136 Player player = defender.getPlayer();
137 int id = RandomUtils.inclusiveExcludes(Skill.ATTACK, Skill.MAGIC, Skill.HITPOINTS);
138 Skill skill = player.skills.get(id);
139
140 if (skill.getLevel() - 1 >= 0) {
141 skill.removeLevel(1);
142 player.skills.refresh(id);
143 }
144 }
145
146 private static void lowerSkill(Mob defender, int id, int percentage) {
147 if (!defender.isPlayer()) {
148 return;
149 }
150
151 Player player = defender.getPlayer();
152 Skill skill = player.skills.get(id);
153
154 double ratio = percentage / 100.0;
155 int limit = (int) (skill.getMaxLevel() * (1 - ratio));
156 int amount = (int) (skill.getLevel() * ratio);
157
158 if (skill.getLevel() - amount < limit) {
159 amount = skill.getLevel() - limit;
160 }
161
162 if (amount > 0) {
163 skill.removeLevel(amount);
164 player.skills.refresh(id);
165 }
166 }
167
168 private static void poison(Mob attacker, Mob defender, Hit hit, PoisonType type) {
169 if (!hit.isAccurate() || defender.isPoisoned()) {
170 return;
171 }
172
173 if (!attacker.isNpc() && hit.getDamage() < 1) {
174 return;
175 }
176
177 defender.poison(type);
178 }
179
180 private static void freeze(Mob defender, int timer) {
181 if (!defender.freezeImmunity.finished()) {
182 return;
183 }
184
185 defender.freezeImmunity.reset(TimeUnit.MILLISECONDS.convert(timer + 10, TimeUnit.SECONDS));
186 defender.locking.lock(timer, LockType.FREEZE);
187 defender.movement.reset();
188 }
189
190 private static void heal(Mob attacker, Hit hit) {
191 Skill skill = attacker.skills.get(Skill.HITPOINTS);
192
193 if (skill.getLevel() < skill.getMaxLevel()) {
194 float heal = hit.getDamage() / 40f;
195
196 if (heal + skill.getLevel() > skill.getMaxLevel()) {
197 heal = skill.getMaxLevel() - skill.getLevel();
198 }
199
200 attacker.heal((int) (heal * 10));
201 }
202 }
203
204 private static void smokeBurst(Mob attacker, Mob defender, Mob other, Hit hit, List<Hit> extra) {
205 poison(attacker, defender, hit, PoisonType.DEFAULT_MAGIC);
206 CombatHit next = hitEvent(attacker, defender, other, 18, extra);
207 if (next != null && (attacker.isNpc() || (next.isAccurate() && next.getDamage() > 0))) {
208 poison(attacker, other, hit, PoisonType.DEFAULT_MAGIC);
209 }
210 }
211
212 private static void smokeBarrage(Mob attacker, Mob defender, Mob other, Hit hit, List<Hit> extra) {
213 poison(attacker, defender, hit, PoisonType.SUPER_MAGIC);
214 CombatHit next = hitEvent(attacker, defender, other, 27, extra);
215 if (next != null && (attacker.isNpc() || (next.isAccurate() && next.getDamage() > 0))) {
216 poison(attacker, other, hit, PoisonType.SUPER_MAGIC);
217 }
218 }
219
220 private static void shadowBurst(Mob attacker, Mob defender, Mob other, List<Hit> extra) {
221 lowerSkill(defender, Skill.ATTACK, 10);
222 CombatHit next = hitEvent(attacker, defender, other, 19, extra);
223 if (next != null && next.isAccurate()) {
224 lowerSkill(other, Skill.ATTACK, 10);
225 }
226 }
227
228 private static void shadowBarrage(Mob attacker, Mob defender, Mob other, List<Hit> extra) {
229 lowerSkill(defender, Skill.ATTACK, 15);
230 CombatHit next = hitEvent(attacker, defender, other, 28, extra);
231 if (next != null && next.isAccurate()) {
232 lowerSkill(other, Skill.ATTACK, 15);
233 }
234 }
235
236 private static void bloodBurst(Mob attacker, Mob defender, Mob other, Hit hit, List<Hit> extra) {
237 heal(attacker, hit);
238 CombatHit next = hitEvent(attacker, defender, other, 21, extra);
239 if (next != null && next.isAccurate()) {
240 heal(attacker, next);
241 }
242 }
243
244 private static void bloodBarrage(Mob attacker, Mob defender, Mob other, Hit hit, List<Hit> extra) {
245 heal(attacker, hit);
246 CombatHit next = hitEvent(attacker, defender, other, 29, extra);
247 if (next != null && next.isAccurate()) {
248 heal(attacker, next);
249 }
250 }
251
252 private static void iceBurst(Mob attacker, Mob defender, Mob other, List<Hit> extra) {
253 freeze(defender, 10);
254 CombatHit next = hitEvent(attacker, defender, other, 22, extra);
255 if (next != null && next.isAccurate()) {
256 freeze(other, 10);
257 }
258 }
259
260 private static void iceBarrage(Mob attacker, Mob defender, Mob other, List<Hit> extra) {
261 freeze(defender, 20);
262 CombatHit next = hitEvent(attacker, defender, other, 28, extra);
263 if (next != null && next.isAccurate()) {
264 freeze(other, 20);
265 }
266 }
267
268 private static void teleblock(Mob defender) {
269 if (defender.isPlayer()) {
270 CombatUtil.effect(defender, CombatEffectType.TELEBLOCK);
271 }
272 }
273
274 private static CombatHit hitEvent(Mob attacker, Mob defender, Mob other, int max, List<Hit> extra) {
275 if (!attacker.getCombat().canAttack(other)) {
276 return null;
277 }
278
279 if (!attacker.equals(other) && !defender.equals(other)) {
280 int hitDelay = CombatUtil.getHitDelay(attacker, defender, CombatType.MAGIC);
281 CombatHit hit = new CombatHit(FormulaFactory.nextMagicHit(attacker, other, max), hitDelay, 0);
282 attacker.getCombat().submitHits(other, hit);
283 if (extra != null) extra.add(hit);
284 return hit;
285 }
286 return null;
287 }
288
289}
static void areaAction(Mob mob, Consumer< Mob > action)
static int getHitDelay(final Mob attacker, final Mob defender, final CombatType type)
static boolean effect(Mob mob, CombatEffectType effect)
void poison(PoisonType type)
Definition Mob.java:537
abstract Combat<? extends Mob > getCombat()
default boolean canAffect(Mob attacker, Mob defender, Hit hit)