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.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<Pair<Integer, Integer>> mobSkills = monster.getSkills();
for (Pair<Integer, Integer> 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<Pair<Integer, Integer>> mobSkills = monster.getSkills();
for (Pair<Integer, Integer> 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);
}

View File

@@ -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<Integer, Integer> 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())) {

View File

@@ -188,11 +188,12 @@ public class LifeFactory {
Data monsterSkillInfoData = monsterInfoData.getChildByPath("skill");
if (monsterSkillInfoData != null) {
int i = 0;
List<Pair<Integer, Integer>> skills = new ArrayList<>();
List<MobSkillId> 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);
}

View File

@@ -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();
}

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();
}
public List<Pair<Integer, Integer>> getSkills() {
public List<MobSkillId> 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<Integer, Integer> 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;
};
}

View File

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

View File

@@ -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<Pair<Integer, Integer>> skills = new ArrayList<>();
List<MobSkillId> 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);