Add record MobSkillId for mob skill type + level combination

Pair is nasty to work with when they are passed around all over
This commit is contained in:
P0nk
2022-09-03 11:01:51 +02:00
parent 7a784a7938
commit 930d365752
8 changed files with 32 additions and 34 deletions

View File

@@ -44,7 +44,6 @@ import server.maps.MapObject;
import server.maps.MapObjectType; import server.maps.MapObjectType;
import server.maps.MapleMap; import server.maps.MapleMap;
import tools.PacketCreator; import tools.PacketCreator;
import tools.Pair;
import tools.Randomizer; import tools.Randomizer;
import java.awt.*; import java.awt.*;
@@ -491,22 +490,18 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
map.damageMonster(player, monster, totDamageToOneMonster); map.damageMonster(player, monster, totDamageToOneMonster);
} }
if (monster.isBuffed(MonsterStatus.WEAPON_REFLECT) && !attack.magic) { if (monster.isBuffed(MonsterStatus.WEAPON_REFLECT) && !attack.magic) {
List<Pair<Integer, Integer>> mobSkills = monster.getSkills(); for (MobSkillId msId : monster.getSkills()) {
if (msId.type() == MobSkillType.PHYSICAL_AND_MAGIC_COUNTER) {
for (Pair<Integer, Integer> ms : mobSkills) { MobSkill toUse = MobSkillFactory.getMobSkill(MobSkillType.PHYSICAL_AND_MAGIC_COUNTER, msId.level());
if (ms.left == 145) { // TODO: de-magic
MobSkill toUse = MobSkillFactory.getMobSkill(MobSkillType.PHYSICAL_AND_MAGIC_COUNTER, ms.right);
player.addHP(-toUse.getX()); 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); 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) { if (monster.isBuffed(MonsterStatus.MAGIC_REFLECT) && attack.magic) {
List<Pair<Integer, Integer>> mobSkills = monster.getSkills(); for (MobSkillId msId : monster.getSkills()) {
if (msId.type() == MobSkillType.PHYSICAL_AND_MAGIC_COUNTER) {
for (Pair<Integer, Integer> ms : mobSkills) { MobSkill toUse = MobSkillFactory.getMobSkill(MobSkillType.PHYSICAL_AND_MAGIC_COUNTER, msId.level());
if (ms.left == 145) { // TODO: de-magic
MobSkill toUse = MobSkillFactory.getMobSkill(MobSkillType.PHYSICAL_AND_MAGIC_COUNTER, ms.right);
player.addHP(-toUse.getY()); 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); map.broadcastMessage(player, PacketCreator.damagePlayer(0, monster.getId(), player.getId(), toUse.getY(), 0, 0, false, 0, true, monster.getObjectId(), 0, 0), true);
} }

View File

@@ -32,7 +32,6 @@ import server.maps.MapObject;
import server.maps.MapObjectType; import server.maps.MapObjectType;
import server.maps.MapleMap; import server.maps.MapleMap;
import tools.PacketCreator; import tools.PacketCreator;
import tools.Pair;
import tools.Randomizer; import tools.Randomizer;
import tools.exceptions.EmptyMovementException; import tools.exceptions.EmptyMovementException;
@@ -124,9 +123,9 @@ public final class MoveLifeHandler extends AbstractMovementPacketHandler {
if (noSkills > 0) { if (noSkills > 0) {
int rndSkill = Randomizer.nextInt(noSkills); int rndSkill = Randomizer.nextInt(noSkills);
Pair<Integer, Integer> skillToUse = monster.getSkills().get(rndSkill); MobSkillId skillToUse = monster.getSkills().get(rndSkill);
nextSkillId = skillToUse.getLeft(); nextSkillId = skillToUse.type().getId();
nextSkillLevel = skillToUse.getRight(); nextSkillLevel = skillToUse.level();
nextUse = MobSkillFactory.getMobSkill(MobSkillType.from(nextSkillId), nextSkillLevel); 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())) { if (!(nextUse != null && monster.canUseSkill(nextUse, false) && nextUse.getHP() >= (int) (((float) monster.getHp() / monster.getMaxHp()) * 100) && mobMp >= nextUse.getMpCon())) {

View File

@@ -188,11 +188,12 @@ public class LifeFactory {
Data monsterSkillInfoData = monsterInfoData.getChildByPath("skill"); Data monsterSkillInfoData = monsterInfoData.getChildByPath("skill");
if (monsterSkillInfoData != null) { if (monsterSkillInfoData != null) {
int i = 0; int i = 0;
List<Pair<Integer, Integer>> skills = new ArrayList<>(); List<MobSkillId> skills = new ArrayList<>();
while (monsterSkillInfoData.getChildByPath(Integer.toString(i)) != null) { while (monsterSkillInfoData.getChildByPath(Integer.toString(i)) != null) {
int skillId = DataTool.getInt(i + "/skill", monsterSkillInfoData, 0); int skillId = DataTool.getInt(i + "/skill", monsterSkillInfoData, 0);
int skillLv = DataTool.getInt(i + "/level", 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)); Data monsterSkillData = monsterData.getChildByPath("skill" + (i + 1));
if (monsterSkillData != null) { if (monsterSkillData != null) {
@@ -201,7 +202,7 @@ public class LifeFactory {
animationTime += DataTool.getIntConvert("delay", effectEntry, 0); animationTime += DataTool.getIntConvert("delay", effectEntry, 0);
} }
MobSkill skill = MobSkillFactory.getMobSkill(MobSkillType.from(skillId), skillLv); MobSkill skill = MobSkillFactory.getMobSkill(type, skillLv);
mi.setMobSkillAnimationTime(skill, animationTime); mi.setMobSkillAnimationTime(skill, animationTime);
} }

View File

@@ -69,7 +69,7 @@ public class MobSkillFactory {
return Optional.of(existingMs); 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) { if (skillData == null) {
return Optional.empty(); return Optional.empty();
} }

View File

@@ -0,0 +1,3 @@
package server.life;
public record MobSkillId(MobSkillType type, int level) {}

View File

@@ -1426,7 +1426,7 @@ public class Monster extends AbstractLoadedLife {
return map.getAggroCoordinator(); return map.getAggroCoordinator();
} }
public List<Pair<Integer, Integer>> getSkills() { public List<MobSkillId> getSkills() {
return stats.getSkills(); return stats.getSkills();
} }
@@ -1436,8 +1436,8 @@ public class Monster extends AbstractLoadedLife {
public int getSkillPos(int skillId, int level) { public int getSkillPos(int skillId, int level) {
int pos = 0; int pos = 0;
for (Pair<Integer, Integer> ms : this.getSkills()) { for (MobSkillId ms : this.getSkills()) {
if (ms.getLeft() == skillId && ms.getRight() == level) { if (ms.type().getId() == skillId && ms.level() == level) {
return pos; return pos;
} }
@@ -1490,7 +1490,7 @@ public class Monster extends AbstractLoadedLife {
private boolean isReflectSkill(MobSkill mobSkill) { private boolean isReflectSkill(MobSkill mobSkill) {
return switch (mobSkill.getType()) { return switch (mobSkill.getType()) {
case PHYSICAL_COUNTER, MAGIC_COUNTER, PHYSICAL_AND_MAGIC_COUNTER -> true; case PHYSICAL_COUNTER, MAGIC_COUNTER, PHYSICAL_AND_MAGIC_COUNTER -> true;
default -> false ; default -> false;
}; };
} }

View File

@@ -41,7 +41,7 @@ public class MonsterStats {
public Map<Element, ElementalEffectiveness> resistance = new HashMap<>(); public Map<Element, ElementalEffectiveness> resistance = new HashMap<>();
public List<Integer> revives = Collections.emptyList(); public List<Integer> revives = Collections.emptyList();
public byte tagColor, tagBgColor; public byte tagColor, tagBgColor;
public List<Pair<Integer, Integer>> skills = new ArrayList<>(); public List<MobSkillId> skills = new ArrayList<>();
public Pair<Integer, Integer> cool = null; public Pair<Integer, Integer> cool = null;
public BanishInfo banish = null; public BanishInfo banish = null;
public List<loseItem> loseItem = null; public List<loseItem> loseItem = null;
@@ -190,17 +190,16 @@ public class MonsterStats {
this.tagBgColor = (byte) tagBgColor; this.tagBgColor = (byte) tagBgColor;
} }
public void setSkills(List<Pair<Integer, Integer>> skills) { public void setSkills(List<MobSkillId> skills) {
for (int i = this.skills.size(); i < skills.size(); i++) { for (int i = this.skills.size(); i < skills.size(); i++) {
this.skills.add(null); this.skills.add(null);
} }
for (int i = 0; i < skills.size(); i++) { for (int i = 0; i < skills.size(); i++) {
this.skills.set(i, skills.get(i)); this.skills.set(i, skills.get(i));
} }
} }
public List<Pair<Integer, Integer>> getSkills() { public List<MobSkillId> getSkills() {
return Collections.unmodifiableList(this.skills); return Collections.unmodifiableList(this.skills);
} }
@@ -209,8 +208,8 @@ public class MonsterStats {
} }
public boolean hasSkill(int skillId, int level) { public boolean hasSkill(int skillId, int level) {
for (Pair<Integer, Integer> skill : skills) { for (MobSkillId skill : skills) {
if (skill.getLeft() == skillId && skill.getRight() == level) { if (skill.type().getId() == skillId && skill.level() == level) {
return true; return true;
} }
} }

View File

@@ -3,12 +3,10 @@ package tools.mapletools;
import provider.*; import provider.*;
import provider.wz.DataType; import provider.wz.DataType;
import provider.wz.WZFiles; import provider.wz.WZFiles;
import server.life.Element; import server.life.*;
import server.life.ElementalEffectiveness;
import server.life.LifeFactory.BanishInfo; import server.life.LifeFactory.BanishInfo;
import server.life.LifeFactory.loseItem; import server.life.LifeFactory.loseItem;
import server.life.LifeFactory.selfDestruction; import server.life.LifeFactory.selfDestruction;
import server.life.MonsterStats;
import tools.Pair; import tools.Pair;
import java.time.Duration; import java.time.Duration;
@@ -110,9 +108,12 @@ public class MonsterStatFetcher {
Data monsterSkillData = monsterInfoData.getChildByPath("skill"); Data monsterSkillData = monsterInfoData.getChildByPath("skill");
if (monsterSkillData != null) { if (monsterSkillData != null) {
int i = 0; int i = 0;
List<Pair<Integer, Integer>> skills = new ArrayList<>(); List<MobSkillId> skills = new ArrayList<>();
while (monsterSkillData.getChildByPath(Integer.toString(i)) != null) { 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++; i++;
} }
stats.setSkills(skills); stats.setSkills(skills);