diff --git a/src/main/java/net/server/channel/handlers/AbstractDealDamageHandler.java b/src/main/java/net/server/channel/handlers/AbstractDealDamageHandler.java index d438238c35..c2f8f09580 100644 --- a/src/main/java/net/server/channel/handlers/AbstractDealDamageHandler.java +++ b/src/main/java/net/server/channel/handlers/AbstractDealDamageHandler.java @@ -44,7 +44,6 @@ import server.maps.MapObject; import server.maps.MapObjectType; import server.maps.MapleMap; import tools.PacketCreator; -import tools.Pair; import tools.Randomizer; import java.awt.*; @@ -491,22 +490,18 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { map.damageMonster(player, monster, totDamageToOneMonster); } if (monster.isBuffed(MonsterStatus.WEAPON_REFLECT) && !attack.magic) { - List> mobSkills = monster.getSkills(); - - for (Pair ms : mobSkills) { - if (ms.left == 145) { // TODO: de-magic - MobSkill toUse = MobSkillFactory.getMobSkill(MobSkillType.PHYSICAL_AND_MAGIC_COUNTER, ms.right); + for (MobSkillId msId : monster.getSkills()) { + if (msId.type() == MobSkillType.PHYSICAL_AND_MAGIC_COUNTER) { + MobSkill toUse = MobSkillFactory.getMobSkill(MobSkillType.PHYSICAL_AND_MAGIC_COUNTER, msId.level()); player.addHP(-toUse.getX()); map.broadcastMessage(player, PacketCreator.damagePlayer(0, monster.getId(), player.getId(), toUse.getX(), 0, 0, false, 0, true, monster.getObjectId(), 0, 0), true); } } } if (monster.isBuffed(MonsterStatus.MAGIC_REFLECT) && attack.magic) { - List> mobSkills = monster.getSkills(); - - for (Pair ms : mobSkills) { - if (ms.left == 145) { // TODO: de-magic - MobSkill toUse = MobSkillFactory.getMobSkill(MobSkillType.PHYSICAL_AND_MAGIC_COUNTER, ms.right); + for (MobSkillId msId : monster.getSkills()) { + if (msId.type() == MobSkillType.PHYSICAL_AND_MAGIC_COUNTER) { + MobSkill toUse = MobSkillFactory.getMobSkill(MobSkillType.PHYSICAL_AND_MAGIC_COUNTER, msId.level()); player.addHP(-toUse.getY()); map.broadcastMessage(player, PacketCreator.damagePlayer(0, monster.getId(), player.getId(), toUse.getY(), 0, 0, false, 0, true, monster.getObjectId(), 0, 0), true); } diff --git a/src/main/java/net/server/channel/handlers/MoveLifeHandler.java b/src/main/java/net/server/channel/handlers/MoveLifeHandler.java index 3d522a02e5..c00b76b60c 100644 --- a/src/main/java/net/server/channel/handlers/MoveLifeHandler.java +++ b/src/main/java/net/server/channel/handlers/MoveLifeHandler.java @@ -32,7 +32,6 @@ import server.maps.MapObject; import server.maps.MapObjectType; import server.maps.MapleMap; import tools.PacketCreator; -import tools.Pair; import tools.Randomizer; import tools.exceptions.EmptyMovementException; @@ -124,9 +123,9 @@ public final class MoveLifeHandler extends AbstractMovementPacketHandler { if (noSkills > 0) { int rndSkill = Randomizer.nextInt(noSkills); - Pair skillToUse = monster.getSkills().get(rndSkill); - nextSkillId = skillToUse.getLeft(); - nextSkillLevel = skillToUse.getRight(); + MobSkillId skillToUse = monster.getSkills().get(rndSkill); + nextSkillId = skillToUse.type().getId(); + nextSkillLevel = skillToUse.level(); nextUse = MobSkillFactory.getMobSkill(MobSkillType.from(nextSkillId), nextSkillLevel); if (!(nextUse != null && monster.canUseSkill(nextUse, false) && nextUse.getHP() >= (int) (((float) monster.getHp() / monster.getMaxHp()) * 100) && mobMp >= nextUse.getMpCon())) { diff --git a/src/main/java/server/life/LifeFactory.java b/src/main/java/server/life/LifeFactory.java index 772a4a5373..b465ef8917 100644 --- a/src/main/java/server/life/LifeFactory.java +++ b/src/main/java/server/life/LifeFactory.java @@ -188,11 +188,12 @@ public class LifeFactory { Data monsterSkillInfoData = monsterInfoData.getChildByPath("skill"); if (monsterSkillInfoData != null) { int i = 0; - List> skills = new ArrayList<>(); + List skills = new ArrayList<>(); while (monsterSkillInfoData.getChildByPath(Integer.toString(i)) != null) { int skillId = DataTool.getInt(i + "/skill", monsterSkillInfoData, 0); int skillLv = DataTool.getInt(i + "/level", monsterSkillInfoData, 0); - skills.add(new Pair<>(skillId, skillLv)); + MobSkillType type = MobSkillType.from(skillId); + skills.add(new MobSkillId(type, skillLv)); Data monsterSkillData = monsterData.getChildByPath("skill" + (i + 1)); if (monsterSkillData != null) { @@ -201,7 +202,7 @@ public class LifeFactory { animationTime += DataTool.getIntConvert("delay", effectEntry, 0); } - MobSkill skill = MobSkillFactory.getMobSkill(MobSkillType.from(skillId), skillLv); + MobSkill skill = MobSkillFactory.getMobSkill(type, skillLv); mi.setMobSkillAnimationTime(skill, animationTime); } diff --git a/src/main/java/server/life/MobSkillFactory.java b/src/main/java/server/life/MobSkillFactory.java index 4de58ec8ad..e2d85daebb 100644 --- a/src/main/java/server/life/MobSkillFactory.java +++ b/src/main/java/server/life/MobSkillFactory.java @@ -69,7 +69,7 @@ public class MobSkillFactory { return Optional.of(existingMs); } - Data skillData = skillRoot.getChildByPath(type + "/level/" + level); + Data skillData = skillRoot.getChildByPath("%d/level/%d".formatted(type.getId(), level)); if (skillData == null) { return Optional.empty(); } diff --git a/src/main/java/server/life/MobSkillId.java b/src/main/java/server/life/MobSkillId.java new file mode 100644 index 0000000000..0e80304ca0 --- /dev/null +++ b/src/main/java/server/life/MobSkillId.java @@ -0,0 +1,3 @@ +package server.life; + +public record MobSkillId(MobSkillType type, int level) {} diff --git a/src/main/java/server/life/Monster.java b/src/main/java/server/life/Monster.java index 77c1bb9dd9..9e836e403a 100644 --- a/src/main/java/server/life/Monster.java +++ b/src/main/java/server/life/Monster.java @@ -1426,7 +1426,7 @@ public class Monster extends AbstractLoadedLife { return map.getAggroCoordinator(); } - public List> getSkills() { + public List getSkills() { return stats.getSkills(); } @@ -1436,8 +1436,8 @@ public class Monster extends AbstractLoadedLife { public int getSkillPos(int skillId, int level) { int pos = 0; - for (Pair ms : this.getSkills()) { - if (ms.getLeft() == skillId && ms.getRight() == level) { + for (MobSkillId ms : this.getSkills()) { + if (ms.type().getId() == skillId && ms.level() == level) { return pos; } @@ -1490,7 +1490,7 @@ public class Monster extends AbstractLoadedLife { private boolean isReflectSkill(MobSkill mobSkill) { return switch (mobSkill.getType()) { case PHYSICAL_COUNTER, MAGIC_COUNTER, PHYSICAL_AND_MAGIC_COUNTER -> true; - default -> false ; + default -> false; }; } diff --git a/src/main/java/server/life/MonsterStats.java b/src/main/java/server/life/MonsterStats.java index 8a7cecddbd..05fa81aa4a 100644 --- a/src/main/java/server/life/MonsterStats.java +++ b/src/main/java/server/life/MonsterStats.java @@ -41,7 +41,7 @@ public class MonsterStats { public Map resistance = new HashMap<>(); public List revives = Collections.emptyList(); public byte tagColor, tagBgColor; - public List> skills = new ArrayList<>(); + public List skills = new ArrayList<>(); public Pair cool = null; public BanishInfo banish = null; public List loseItem = null; @@ -190,17 +190,16 @@ public class MonsterStats { this.tagBgColor = (byte) tagBgColor; } - public void setSkills(List> skills) { + public void setSkills(List skills) { for (int i = this.skills.size(); i < skills.size(); i++) { this.skills.add(null); } - for (int i = 0; i < skills.size(); i++) { this.skills.set(i, skills.get(i)); } } - public List> getSkills() { + public List getSkills() { return Collections.unmodifiableList(this.skills); } @@ -209,8 +208,8 @@ public class MonsterStats { } public boolean hasSkill(int skillId, int level) { - for (Pair skill : skills) { - if (skill.getLeft() == skillId && skill.getRight() == level) { + for (MobSkillId skill : skills) { + if (skill.type().getId() == skillId && skill.level() == level) { return true; } } diff --git a/src/main/java/tools/mapletools/MonsterStatFetcher.java b/src/main/java/tools/mapletools/MonsterStatFetcher.java index 508e6d0815..641727856a 100644 --- a/src/main/java/tools/mapletools/MonsterStatFetcher.java +++ b/src/main/java/tools/mapletools/MonsterStatFetcher.java @@ -3,12 +3,10 @@ package tools.mapletools; import provider.*; import provider.wz.DataType; import provider.wz.WZFiles; -import server.life.Element; -import server.life.ElementalEffectiveness; +import server.life.*; import server.life.LifeFactory.BanishInfo; import server.life.LifeFactory.loseItem; import server.life.LifeFactory.selfDestruction; -import server.life.MonsterStats; import tools.Pair; import java.time.Duration; @@ -110,9 +108,12 @@ public class MonsterStatFetcher { Data monsterSkillData = monsterInfoData.getChildByPath("skill"); if (monsterSkillData != null) { int i = 0; - List> skills = new ArrayList<>(); + List skills = new ArrayList<>(); while (monsterSkillData.getChildByPath(Integer.toString(i)) != null) { - skills.add(new Pair<>(DataTool.getInt(i + "/skill", monsterSkillData, 0), DataTool.getInt(i + "/level", monsterSkillData, 0))); + int skillId = DataTool.getInt(i + "/skill", monsterSkillData, 0); + MobSkillType type = MobSkillType.from(skillId); + int skillLevel = DataTool.getInt(i + "/level", monsterSkillData, 0); + skills.add(new MobSkillId(type, skillLevel)); i++; } stats.setSkills(skills);