49public enum MagicImpact {
50 TELEBLOCK((attacker, defender, hit, extra) -> teleblock(defender)),
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))),
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)),
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)),
64 MAGIC_DART((attacker, defender, hit, extra) -> {
65 if (attacker.isPlayer() && hit.isAccurate()) {
66 Player player = attacker.getPlayer();
69 if (defender.isNpc() && player.slayer.getTask() !=
null) {
70 Npc mob = defender.getNpc();
71 if (player.slayer.getTask().
valid(mob.getName())) {
76 hit.setDamage(RandomUtils.inclusive(damage));
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))),
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))),
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))),
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))),
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)),
104 AHRIM_BLAST((attacker, defender, hit, extra) -> {
116 public boolean canAffect(
Mob attacker,
Mob defender,
Hit hit) {
117 return hit.isAccurate() && effect.
canAffect(attacker, defender, hit);
121 public void impact(
Mob attacker,
Mob defender,
Hit hit, List<Hit> hits) {
122 effect.impact(attacker, defender, hit, hits);
131 private static void kbdShock(
Mob defender) {
136 Player player = defender.getPlayer();
138 Skill skill = player.skills.
get(
id);
140 if (skill.getLevel() - 1 >= 0) {
141 skill.removeLevel(1);
146 private static void lowerSkill(
Mob defender,
int id,
int percentage) {
151 Player player = defender.getPlayer();
152 Skill skill = player.skills.
get(
id);
154 double ratio = percentage / 100.0;
155 int limit = (int) (skill.getMaxLevel() * (1 - ratio));
156 int amount = (int) (skill.getLevel() * ratio);
158 if (skill.getLevel() - amount < limit) {
159 amount = skill.getLevel() - limit;
163 skill.removeLevel(amount);
169 if (!hit.isAccurate() || defender.isPoisoned()) {
173 if (!attacker.
isNpc() && hit.getDamage() < 1) {
180 private static void freeze(
Mob defender,
int timer) {
181 if (!defender.freezeImmunity.finished()) {
185 defender.freezeImmunity.reset(TimeUnit.MILLISECONDS.convert(timer + 10, TimeUnit.SECONDS));
186 defender.locking.lock(timer,
LockType.FREEZE);
187 defender.movement.
reset();
190 private static void heal(
Mob attacker,
Hit hit) {
193 if (skill.getLevel() < skill.getMaxLevel()) {
194 float heal = hit.getDamage() / 40f;
196 if (heal + skill.getLevel() > skill.getMaxLevel()) {
197 heal = skill.getMaxLevel() - skill.getLevel();
200 attacker.heal((
int) (heal * 10));
204 private static void smokeBurst(
Mob attacker,
Mob defender,
Mob other,
Hit hit, List<Hit> extra) {
206 CombatHit next = hitEvent(attacker, defender, other, 18, extra);
212 private static void smokeBarrage(
Mob attacker,
Mob defender,
Mob other,
Hit hit, List<Hit> extra) {
214 CombatHit next = hitEvent(attacker, defender, other, 27, extra);
220 private static void shadowBurst(
Mob attacker,
Mob defender,
Mob other, List<Hit> extra) {
222 CombatHit next = hitEvent(attacker, defender, other, 19, extra);
228 private static void shadowBarrage(
Mob attacker,
Mob defender,
Mob other, List<Hit> extra) {
230 CombatHit next = hitEvent(attacker, defender, other, 28, extra);
236 private static void bloodBurst(
Mob attacker,
Mob defender,
Mob other,
Hit hit, List<Hit> extra) {
238 CombatHit next = hitEvent(attacker, defender, other, 21, extra);
240 heal(attacker, next);
244 private static void bloodBarrage(
Mob attacker,
Mob defender,
Mob other,
Hit hit, List<Hit> extra) {
246 CombatHit next = hitEvent(attacker, defender, other, 29, extra);
248 heal(attacker, next);
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);
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);
268 private static void teleblock(
Mob defender) {
274 private static CombatHit hitEvent(
Mob attacker,
Mob defender,
Mob other,
int max, List<Hit> extra) {
275 if (!attacker.
getCombat().canAttack(other)) {
279 if (!attacker.equals(other) && !defender.equals(other)) {
282 attacker.
getCombat().submitHits(other, hit);
283 if (extra !=
null) extra.add(hit);