diff --git a/src/main/java/server/life/Monster.java b/src/main/java/server/life/Monster.java index ee000abf84..efd42f8b8d 100644 --- a/src/main/java/server/life/Monster.java +++ b/src/main/java/server/life/Monster.java @@ -82,8 +82,7 @@ public class Monster extends AbstractLoadedLife { private int VenomMultiplier = 0; private boolean fake = false; private boolean dropsDisabled = false; - private final List> usedSkills = new ArrayList<>(); // TODO: change to Set - private final Map, Integer> skillsUsed = new HashMap<>(); + private final Set usedSkills = new HashSet<>(); private final Set usedAttacks = new HashSet<>(); private Set calledMobOids = null; private WeakReference callerMob = new WeakReference<>(null); @@ -1447,11 +1446,8 @@ public class Monster extends AbstractLoadedLife { monsterLock.lock(); try { - for (Pair skill : usedSkills) { // thanks OishiiKawaiiDesu for noticing an issue with mobskill cooldown - MobSkillId msId = toUse.getId(); - if (skill.getLeft() == msId.type().getId() && skill.getRight() == msId.level()) { - return false; - } + if (usedSkills.contains(toUse.getId())) { + return false; } int mpCon = toUse.getMpCon(); @@ -1483,48 +1479,28 @@ public class Monster extends AbstractLoadedLife { } private void usedSkill(MobSkill skill) { - final int skillId = skill.getId().type().getId(); - final int level = skill.getId().level(); - long cooltime = skill.getCoolTime(); - + final MobSkillId msId = skill.getId(); monsterLock.lock(); try { mp -= skill.getMpCon(); - Pair skillKey = new Pair<>(skillId, level); - this.usedSkills.add(skillKey); - - Integer useCount = this.skillsUsed.remove(skillKey); - if (useCount != null) { - this.skillsUsed.put(skillKey, useCount + 1); - } else { - this.skillsUsed.put(skillKey, 1); - } + this.usedSkills.add(msId); } finally { monsterLock.unlock(); } final Monster mons = this; MapleMap mmap = mons.getMap(); - Runnable r = () -> mons.clearSkill(skillId, level); + Runnable r = () -> mons.clearSkill(skill.getId()); MobClearSkillService service = (MobClearSkillService) map.getChannelServer().getServiceAccess(ChannelServices.MOB_CLEAR_SKILL); - service.registerMobClearSkillAction(mmap.getId(), r, cooltime); + service.registerMobClearSkillAction(mmap.getId(), r, skill.getCoolTime()); } - private void clearSkill(int skillId, int level) { + private void clearSkill(MobSkillId msId) { monsterLock.lock(); try { - int index = -1; - for (Pair skill : usedSkills) { - if (skill.getLeft() == skillId && skill.getRight() == level) { - index = usedSkills.indexOf(skill); - break; - } - } - if (index != -1) { - usedSkills.remove(index); - } + usedSkills.remove(msId); } finally { monsterLock.unlock(); }