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.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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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())) {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
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();
|
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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user