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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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())) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
3
src/main/java/server/life/MobSkillId.java
Normal file
3
src/main/java/server/life/MobSkillId.java
Normal file
@@ -0,0 +1,3 @@
|
||||
package server.life;
|
||||
|
||||
public record MobSkillId(MobSkillType type, int level) {}
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user