Lessen magic numbers around mob skills with new "type" enum
This commit is contained in:
@@ -27,10 +27,7 @@ import config.YamlConfig;
|
|||||||
import net.packet.InPacket;
|
import net.packet.InPacket;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import server.life.MobSkill;
|
import server.life.*;
|
||||||
import server.life.MobSkillFactory;
|
|
||||||
import server.life.Monster;
|
|
||||||
import server.life.MonsterInformationProvider;
|
|
||||||
import server.maps.MapObject;
|
import server.maps.MapObject;
|
||||||
import server.maps.MapObjectType;
|
import server.maps.MapObjectType;
|
||||||
import server.maps.MapleMap;
|
import server.maps.MapleMap;
|
||||||
@@ -103,7 +100,7 @@ public final class MoveLifeHandler extends AbstractMovementPacketHandler {
|
|||||||
|
|
||||||
if (monster.canUseSkill(toUse, true)) {
|
if (monster.canUseSkill(toUse, true)) {
|
||||||
int animationTime = MonsterInformationProvider.getInstance().getMobSkillAnimationTime(toUse);
|
int animationTime = MonsterInformationProvider.getInstance().getMobSkillAnimationTime(toUse);
|
||||||
if (animationTime > 0 && toUse.getSkillId() != 129) {
|
if (animationTime > 0 && toUse.getType() != MobSkillType.BANISH) {
|
||||||
toUse.applyDelayedEffect(player, monster, true, animationTime);
|
toUse.applyDelayedEffect(player, monster, true, animationTime);
|
||||||
} else {
|
} else {
|
||||||
banishPlayers = new LinkedList<>();
|
banishPlayers = new LinkedList<>();
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ import java.util.*;
|
|||||||
public class MobSkill {
|
public class MobSkill {
|
||||||
private static final Logger log = LoggerFactory.getLogger(MobSkill.class);
|
private static final Logger log = LoggerFactory.getLogger(MobSkill.class);
|
||||||
|
|
||||||
private final int skillId;
|
private final MobSkillType type;
|
||||||
private final int skillLevel;
|
private final int skillLevel;
|
||||||
private int mpCon;
|
private int mpCon;
|
||||||
private final List<Integer> toSummon = new ArrayList<>();
|
private final List<Integer> toSummon = new ArrayList<>();
|
||||||
@@ -57,8 +57,8 @@ public class MobSkill {
|
|||||||
private Point lt, rb;
|
private Point lt, rb;
|
||||||
private int limit;
|
private int limit;
|
||||||
|
|
||||||
public MobSkill(int skillId, int level) {
|
public MobSkill(MobSkillType type, int level) {
|
||||||
this.skillId = skillId;
|
this.type = type;
|
||||||
this.skillLevel = level;
|
this.skillLevel = level;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,28 +130,12 @@ public class MobSkill {
|
|||||||
Disease disease = null;
|
Disease disease = null;
|
||||||
Map<MonsterStatus, Integer> stats = new ArrayMap<>();
|
Map<MonsterStatus, Integer> stats = new ArrayMap<>();
|
||||||
List<Integer> reflection = new LinkedList<>();
|
List<Integer> reflection = new LinkedList<>();
|
||||||
switch (skillId) {
|
switch (type) {
|
||||||
case 100:
|
case ATTACK_UP, ATTACK_UP_M, PAD -> stats.put(MonsterStatus.WEAPON_ATTACK_UP, x);
|
||||||
case 110:
|
case MAGIC_ATTACK_UP, MAGIC_ATTACK_UP_M, MAD -> stats.put(MonsterStatus.MAGIC_ATTACK_UP, x);
|
||||||
case 150:
|
case DEFENSE_UP, DEFENSE_UP_M, PDR -> stats.put(MonsterStatus.WEAPON_DEFENSE_UP, x);
|
||||||
stats.put(MonsterStatus.WEAPON_ATTACK_UP, x);
|
case MAGIC_DEFENSE_UP, MAGIC_DEFENSE_UP_M, MDR -> stats.put(MonsterStatus.MAGIC_DEFENSE_UP, x);
|
||||||
break;
|
case HEAL_M -> {
|
||||||
case 101:
|
|
||||||
case 111:
|
|
||||||
case 151:
|
|
||||||
stats.put(MonsterStatus.MAGIC_ATTACK_UP, x);
|
|
||||||
break;
|
|
||||||
case 102:
|
|
||||||
case 112:
|
|
||||||
case 152:
|
|
||||||
stats.put(MonsterStatus.WEAPON_DEFENSE_UP, x);
|
|
||||||
break;
|
|
||||||
case 103:
|
|
||||||
case 113:
|
|
||||||
case 153:
|
|
||||||
stats.put(MonsterStatus.MAGIC_DEFENSE_UP, x);
|
|
||||||
break;
|
|
||||||
case 114:
|
|
||||||
if (lt != null && rb != null && skill) {
|
if (lt != null && rb != null && skill) {
|
||||||
List<MapObject> objects = getObjectsInRange(monster, MapObjectType.MONSTER);
|
List<MapObject> objects = getObjectsInRange(monster, MapObjectType.MONSTER);
|
||||||
final int hps = (getX() / 1000) * (int) (950 + 1050 * Math.random());
|
final int hps = (getX() / 1000) * (int) (950 + 1050 * Math.random());
|
||||||
@@ -161,29 +145,15 @@ public class MobSkill {
|
|||||||
} else {
|
} else {
|
||||||
monster.heal(getX(), getY());
|
monster.heal(getX(), getY());
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case 120:
|
case SEAL -> disease = Disease.SEAL;
|
||||||
disease = Disease.SEAL;
|
case DARKNESS -> disease = Disease.DARKNESS;
|
||||||
break;
|
case WEAKNESS -> disease = Disease.WEAKEN;
|
||||||
case 121:
|
case STUN -> disease = Disease.STUN;
|
||||||
disease = Disease.DARKNESS;
|
case CURSE -> disease = Disease.CURSE;
|
||||||
break;
|
case POISON -> disease = Disease.POISON;
|
||||||
case 122:
|
case SLOW -> disease = Disease.SLOW;
|
||||||
disease = Disease.WEAKEN;
|
case DISPEL -> {
|
||||||
break;
|
|
||||||
case 123:
|
|
||||||
disease = Disease.STUN;
|
|
||||||
break;
|
|
||||||
case 124:
|
|
||||||
disease = Disease.CURSE;
|
|
||||||
break;
|
|
||||||
case 125:
|
|
||||||
disease = Disease.POISON;
|
|
||||||
break;
|
|
||||||
case 126: // Slow
|
|
||||||
disease = Disease.SLOW;
|
|
||||||
break;
|
|
||||||
case 127:
|
|
||||||
if (lt != null && rb != null && skill) {
|
if (lt != null && rb != null && skill) {
|
||||||
for (Character character : getPlayersInRange(monster)) {
|
for (Character character : getPlayersInRange(monster)) {
|
||||||
character.dispel();
|
character.dispel();
|
||||||
@@ -191,66 +161,52 @@ public class MobSkill {
|
|||||||
} else {
|
} else {
|
||||||
player.dispel();
|
player.dispel();
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case 128: // Seduce
|
case SEDUCE -> disease = Disease.SEDUCE;
|
||||||
disease = Disease.SEDUCE;
|
case BANISH -> {
|
||||||
break;
|
|
||||||
case 129: // Banish
|
|
||||||
if (lt != null && rb != null && skill) {
|
if (lt != null && rb != null && skill) {
|
||||||
banishPlayers.addAll(getPlayersInRange(monster));
|
banishPlayers.addAll(getPlayersInRange(monster));
|
||||||
} else {
|
} else {
|
||||||
banishPlayers.add(player);
|
banishPlayers.add(player);
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case 131: // Mist
|
case AREA_POISON -> {
|
||||||
monster.getMap().spawnMist(new Mist(calculateBoundingBox(monster.getPosition()), monster, this), x * 100, false, false, false);
|
monster.getMap().spawnMist(new Mist(calculateBoundingBox(monster.getPosition()), monster, this), x * 100, false, false, false);
|
||||||
break;
|
}
|
||||||
case 132:
|
case REVERSE_INPUT -> disease = Disease.CONFUSE;
|
||||||
disease = Disease.CONFUSE;
|
case UNDEAD -> disease = Disease.ZOMBIFY;
|
||||||
break;
|
case PHYSICAL_IMMUNE -> {
|
||||||
case 133: // zombify
|
|
||||||
disease = Disease.ZOMBIFY;
|
|
||||||
break;
|
|
||||||
case 140:
|
|
||||||
if (makeChanceResult() && !monster.isBuffed(MonsterStatus.MAGIC_IMMUNITY)) {
|
if (makeChanceResult() && !monster.isBuffed(MonsterStatus.MAGIC_IMMUNITY)) {
|
||||||
stats.put(MonsterStatus.WEAPON_IMMUNITY, x);
|
stats.put(MonsterStatus.WEAPON_IMMUNITY, x);
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case 141:
|
case MAGIC_IMMUNE -> {
|
||||||
if (makeChanceResult() && !monster.isBuffed(MonsterStatus.WEAPON_IMMUNITY)) {
|
if (makeChanceResult() && !monster.isBuffed(MonsterStatus.WEAPON_IMMUNITY)) {
|
||||||
stats.put(MonsterStatus.MAGIC_IMMUNITY, x);
|
stats.put(MonsterStatus.MAGIC_IMMUNITY, x);
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case 143: // Weapon Reflect
|
case PHYSICAL_COUNTER -> {
|
||||||
stats.put(MonsterStatus.WEAPON_REFLECT, 10);
|
stats.put(MonsterStatus.WEAPON_REFLECT, 10);
|
||||||
stats.put(MonsterStatus.WEAPON_IMMUNITY, 10);
|
stats.put(MonsterStatus.WEAPON_IMMUNITY, 10);
|
||||||
reflection.add(x);
|
reflection.add(x);
|
||||||
break;
|
}
|
||||||
case 144: // Magic Reflect
|
case MAGIC_COUNTER -> {
|
||||||
stats.put(MonsterStatus.MAGIC_REFLECT, 10);
|
stats.put(MonsterStatus.MAGIC_REFLECT, 10);
|
||||||
stats.put(MonsterStatus.MAGIC_IMMUNITY, 10);
|
stats.put(MonsterStatus.MAGIC_IMMUNITY, 10);
|
||||||
reflection.add(x);
|
reflection.add(x);
|
||||||
break;
|
}
|
||||||
case 145: // Weapon / Magic reflect
|
case PHYSICAL_AND_MAGIC_COUNTER -> {
|
||||||
stats.put(MonsterStatus.WEAPON_REFLECT, 10);
|
stats.put(MonsterStatus.WEAPON_REFLECT, 10);
|
||||||
stats.put(MonsterStatus.WEAPON_IMMUNITY, 10);
|
stats.put(MonsterStatus.WEAPON_IMMUNITY, 10);
|
||||||
stats.put(MonsterStatus.MAGIC_REFLECT, 10);
|
stats.put(MonsterStatus.MAGIC_REFLECT, 10);
|
||||||
stats.put(MonsterStatus.MAGIC_IMMUNITY, 10);
|
stats.put(MonsterStatus.MAGIC_IMMUNITY, 10);
|
||||||
reflection.add(x);
|
reflection.add(x);
|
||||||
break;
|
}
|
||||||
case 154:
|
case ACC -> stats.put(MonsterStatus.ACC, x);
|
||||||
stats.put(MonsterStatus.ACC, x);
|
case EVA -> stats.put(MonsterStatus.AVOID, x);
|
||||||
break;
|
case SPEED -> stats.put(MonsterStatus.SPEED, x);
|
||||||
case 155:
|
case SEAL_SKILL -> stats.put(MonsterStatus.SEAL_SKILL, x);
|
||||||
stats.put(MonsterStatus.AVOID, x);
|
case SUMMON -> {
|
||||||
break;
|
|
||||||
case 156:
|
|
||||||
stats.put(MonsterStatus.SPEED, x);
|
|
||||||
break;
|
|
||||||
case 157:
|
|
||||||
stats.put(MonsterStatus.SEAL_SKILL, x);
|
|
||||||
break;
|
|
||||||
case 200: // summon
|
|
||||||
int skillLimit = this.getLimit();
|
int skillLimit = this.getLimit();
|
||||||
MapleMap map = monster.getMap();
|
MapleMap map = monster.getMap();
|
||||||
|
|
||||||
@@ -322,18 +278,15 @@ public class MobSkill {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
default:
|
|
||||||
log.warn("Unhandled Mob skill: {}", skillId);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
if (stats.size() > 0) {
|
if (stats.size() > 0) {
|
||||||
if (lt != null && rb != null && skill) {
|
if (lt != null && rb != null && skill) {
|
||||||
for (MapObject mons : getObjectsInRange(monster, MapObjectType.MONSTER)) {
|
for (MapObject mons : getObjectsInRange(monster, MapObjectType.MONSTER)) {
|
||||||
((Monster) mons).applyMonsterBuff(stats, getX(), getSkillId(), getDuration(), this, reflection);
|
((Monster) mons).applyMonsterBuff(stats, getX(), type.getId(), getDuration(), this, reflection);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
monster.applyMonsterBuff(stats, getX(), getSkillId(), getDuration(), this, reflection);
|
monster.applyMonsterBuff(stats, getX(), type.getId(), getDuration(), this, reflection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (disease != null) {
|
if (disease != null) {
|
||||||
@@ -361,8 +314,12 @@ public class MobSkill {
|
|||||||
return monster.getMap().getPlayersInRange(calculateBoundingBox(monster.getPosition()));
|
return monster.getMap().getPlayersInRange(calculateBoundingBox(monster.getPosition()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MobSkillType getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
public int getSkillId() {
|
public int getSkillId() {
|
||||||
return skillId;
|
return type.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getSkillLevel() {
|
public int getSkillLevel() {
|
||||||
|
|||||||
@@ -63,8 +63,7 @@ public class MobSkillFactory {
|
|||||||
}
|
}
|
||||||
writeLock.lock();
|
writeLock.lock();
|
||||||
try {
|
try {
|
||||||
MobSkill ret;
|
MobSkill ret = mobSkills.get(key);
|
||||||
ret = mobSkills.get(key);
|
|
||||||
if (ret == null) {
|
if (ret == null) {
|
||||||
Data skillData = skillRoot.getChildByPath(skillId + "/level/" + level);
|
Data skillData = skillRoot.getChildByPath(skillId + "/level/" + level);
|
||||||
if (skillData != null) {
|
if (skillData != null) {
|
||||||
@@ -93,7 +92,7 @@ public class MobSkillFactory {
|
|||||||
lt = (Point) ltd.getData();
|
lt = (Point) ltd.getData();
|
||||||
rb = (Point) skillData.getChildByPath("rb").getData();
|
rb = (Point) skillData.getChildByPath("rb").getData();
|
||||||
}
|
}
|
||||||
ret = new MobSkill(skillId, level);
|
ret = new MobSkill(MobSkillType.from(skillId), level);
|
||||||
ret.addSummons(toSummon);
|
ret.addSummons(toSummon);
|
||||||
ret.setCoolTime(cooltime);
|
ret.setCoolTime(cooltime);
|
||||||
ret.setDuration(duration);
|
ret.setDuration(duration);
|
||||||
|
|||||||
61
src/main/java/server/life/MobSkillType.java
Normal file
61
src/main/java/server/life/MobSkillType.java
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
package server.life;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
public enum MobSkillType {
|
||||||
|
ATTACK_UP(100),
|
||||||
|
MAGIC_ATTACK_UP(101),
|
||||||
|
DEFENSE_UP(102),
|
||||||
|
MAGIC_DEFENSE_UP(103),
|
||||||
|
ATTACK_UP_M(110),
|
||||||
|
MAGIC_ATTACK_UP_M(111),
|
||||||
|
DEFENSE_UP_M(112),
|
||||||
|
MAGIC_DEFENSE_UP_M(113),
|
||||||
|
HEAL_M(114),
|
||||||
|
HASTE_M(115),
|
||||||
|
SEAL(120),
|
||||||
|
DARKNESS(121),
|
||||||
|
WEAKNESS(122),
|
||||||
|
STUN(123),
|
||||||
|
CURSE(124),
|
||||||
|
POISON(125),
|
||||||
|
SLOW(126),
|
||||||
|
DISPEL(127),
|
||||||
|
SEDUCE(128),
|
||||||
|
BANISH(129),
|
||||||
|
AREA_POISON(131),
|
||||||
|
REVERSE_INPUT(132),
|
||||||
|
UNDEAD(133),
|
||||||
|
STOP_POTION(134),
|
||||||
|
STOP_MOTION(135),
|
||||||
|
FEAR(136),
|
||||||
|
PHYSICAL_IMMUNE(140),
|
||||||
|
MAGIC_IMMUNE(141),
|
||||||
|
HARD_SKIN(142),
|
||||||
|
PHYSICAL_COUNTER(143),
|
||||||
|
MAGIC_COUNTER(144),
|
||||||
|
PHYSICAL_AND_MAGIC_COUNTER(145),
|
||||||
|
PAD(150),
|
||||||
|
MAD(151),
|
||||||
|
PDR(152),
|
||||||
|
MDR(153),
|
||||||
|
ACC(154),
|
||||||
|
EVA(155),
|
||||||
|
SPEED(156),
|
||||||
|
SEAL_SKILL(157),
|
||||||
|
SUMMON(200);
|
||||||
|
|
||||||
|
private final int id;
|
||||||
|
|
||||||
|
MobSkillType(int id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MobSkillType from(int id) {
|
||||||
|
return Arrays.stream(values()).findFirst().orElseThrow(IllegalArgumentException::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1276,11 +1276,11 @@ public class Monster extends AbstractLoadedLife {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void dispelSkill(final MobSkill skillId) {
|
public final void dispelSkill(final MobSkill skill) {
|
||||||
List<MonsterStatus> toCancel = new ArrayList<>();
|
List<MonsterStatus> toCancel = new ArrayList<>();
|
||||||
for (Entry<MonsterStatus, MonsterStatusEffect> effects : stati.entrySet()) {
|
for (Entry<MonsterStatus, MonsterStatusEffect> effects : stati.entrySet()) {
|
||||||
MonsterStatusEffect mse = effects.getValue();
|
MonsterStatusEffect mse = effects.getValue();
|
||||||
if (mse.getMobSkill() != null && mse.getMobSkill().getSkillId() == skillId.getSkillId()) { //not checking for level.
|
if (mse.getMobSkill() != null && mse.getMobSkill().getType() == skill.getType()) { //not checking for level.
|
||||||
toCancel.add(effects.getKey());
|
toCancel.add(effects.getKey());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1452,8 +1452,7 @@ public class Monster extends AbstractLoadedLife {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int useSkillid = toUse.getSkillId();
|
if (isReflectSkill(toUse)) {
|
||||||
if (useSkillid >= 143 && useSkillid <= 145) {
|
|
||||||
if (this.isBuffed(MonsterStatus.WEAPON_REFLECT) || this.isBuffed(MonsterStatus.MAGIC_REFLECT)) {
|
if (this.isBuffed(MonsterStatus.WEAPON_REFLECT) || this.isBuffed(MonsterStatus.MAGIC_REFLECT)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1462,7 +1461,7 @@ public class Monster extends AbstractLoadedLife {
|
|||||||
monsterLock.lock();
|
monsterLock.lock();
|
||||||
try {
|
try {
|
||||||
for (Pair<Integer, Integer> skill : usedSkills) { // thanks OishiiKawaiiDesu for noticing an issue with mobskill cooldown
|
for (Pair<Integer, Integer> skill : usedSkills) { // thanks OishiiKawaiiDesu for noticing an issue with mobskill cooldown
|
||||||
if (skill.getLeft() == useSkillid && skill.getRight() == toUse.getSkillLevel()) {
|
if (skill.getLeft() == toUse.getSkillId() && skill.getRight() == toUse.getSkillLevel()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1488,8 +1487,16 @@ public class Monster extends AbstractLoadedLife {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isReflectSkill(MobSkill mobSkill) {
|
||||||
|
return switch (mobSkill.getType()) {
|
||||||
|
case PHYSICAL_COUNTER, MAGIC_COUNTER, PHYSICAL_AND_MAGIC_COUNTER -> true;
|
||||||
|
default -> false ;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
private void usedSkill(MobSkill skill) {
|
private void usedSkill(MobSkill skill) {
|
||||||
final int skillId = skill.getSkillId(), level = skill.getSkillLevel();
|
final int skillId = skill.getSkillId();
|
||||||
|
final int level = skill.getSkillLevel();
|
||||||
long cooltime = skill.getCoolTime();
|
long cooltime = skill.getCoolTime();
|
||||||
|
|
||||||
monsterLock.lock();
|
monsterLock.lock();
|
||||||
|
|||||||
Reference in New Issue
Block a user