From a6ec6adbb5ce3ee08e0426c2b83a5c42dc62fef1 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 3 Sep 2022 14:07:24 +0200 Subject: [PATCH] Combine type and skillLevel in MobSkill --- src/main/java/client/Character.java | 5 ++-- src/main/java/server/life/MobSkill.java | 26 ++++++++----------- src/main/java/server/life/Monster.java | 11 +++++---- src/main/java/server/maps/Mist.java | 4 +-- src/main/java/tools/PacketCreator.java | 33 +++++++++++++------------ 5 files changed, 38 insertions(+), 41 deletions(-) diff --git a/src/main/java/client/Character.java b/src/main/java/client/Character.java index 0713864928..1a2f148638 100644 --- a/src/main/java/client/Character.java +++ b/src/main/java/client/Character.java @@ -8108,8 +8108,9 @@ public class Character extends AbstractCharacterObject { ps.setInt(2, e.getKey().ordinal()); MobSkill ms = e.getValue().getRight(); - ps.setInt(3, ms.getSkillId()); - ps.setInt(4, ms.getSkillLevel()); + MobSkillId msId = ms.getId(); + ps.setInt(3, msId.type().getId()); + ps.setInt(4, msId.level()); ps.setInt(5, e.getValue().getLeft().intValue()); ps.addBatch(); } diff --git a/src/main/java/server/life/MobSkill.java b/src/main/java/server/life/MobSkill.java index 0ab6ca91fb..560a2262e2 100644 --- a/src/main/java/server/life/MobSkill.java +++ b/src/main/java/server/life/MobSkill.java @@ -47,8 +47,7 @@ import java.util.*; public class MobSkill { private static final Logger log = LoggerFactory.getLogger(MobSkill.class); - private final MobSkillType type; - private final int skillLevel; + private final MobSkillId id; private final int mpCon; private final int spawnEffect; private final int hp; @@ -65,8 +64,7 @@ public class MobSkill { private MobSkill(MobSkillType type, int level, int mpCon, int spawnEffect, int hp, int x, int y, int count, long duration, long cooltime, float prop, Point lt, Point rb, int limit, List toSummon) { - this.type = type; - this.skillLevel = level; + this.id = new MobSkillId(type, level); this.mpCon = mpCon; this.spawnEffect = spawnEffect; this.hp = hp; @@ -195,7 +193,7 @@ public class MobSkill { Disease disease = null; Map stats = new EnumMap<>(MonsterStatus.class); List reflection = new ArrayList<>(); - switch (type) { + switch (id.type()) { case ATTACK_UP, ATTACK_UP_M, PAD -> stats.put(MonsterStatus.WEAPON_ATTACK_UP, x); case MAGIC_ATTACK_UP, MAGIC_ATTACK_UP_M, MAD -> stats.put(MonsterStatus.MAGIC_ATTACK_UP, x); case DEFENSE_UP, DEFENSE_UP_M, PDR -> stats.put(MonsterStatus.WEAPON_DEFENSE_UP, x); @@ -368,10 +366,10 @@ public class MobSkill { private void applyMonsterBuffs(Map stats, boolean skill, Monster monster, List reflection) { if (lt != null && rb != null && skill) { for (MapObject mons : getObjectsInRange(monster, MapObjectType.MONSTER)) { - ((Monster) mons).applyMonsterBuff(stats, getX(), type.getId(), getDuration(), this, reflection); + ((Monster) mons).applyMonsterBuff(stats, getX(), getDuration(), this, reflection); } } else { - monster.applyMonsterBuff(stats, getX(), type.getId(), getDuration(), this, reflection); + monster.applyMonsterBuff(stats, getX(), getDuration(), this, reflection); } } @@ -399,16 +397,12 @@ public class MobSkill { return monster.getMap().getPlayersInRange(calculateBoundingBox(monster.getPosition())); } + public MobSkillId getId() { + return id; + } + public MobSkillType getType() { - return type; - } - - public int getSkillId() { - return type.getId(); - } - - public int getSkillLevel() { - return skillLevel; + return id.type(); } public int getMpCon() { diff --git a/src/main/java/server/life/Monster.java b/src/main/java/server/life/Monster.java index 7a254d0fb1..ee000abf84 100644 --- a/src/main/java/server/life/Monster.java +++ b/src/main/java/server/life/Monster.java @@ -82,7 +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<>(); + private final List> usedSkills = new ArrayList<>(); // TODO: change to Set private final Map, Integer> skillsUsed = new HashMap<>(); private final Set usedAttacks = new HashSet<>(); private Set calledMobOids = null; @@ -1289,7 +1289,7 @@ public class Monster extends AbstractLoadedLife { } } - public void applyMonsterBuff(final Map stats, final int x, int skillId, long duration, MobSkill skill, final List reflection) { + public void applyMonsterBuff(final Map stats, final int x, long duration, MobSkill skill, final List reflection) { final Runnable cancelTask = () -> { if (isAlive()) { Packet packet = PacketCreator.cancelMonsterStatus(getObjectId(), stats); @@ -1448,7 +1448,8 @@ public class Monster extends AbstractLoadedLife { monsterLock.lock(); try { for (Pair skill : usedSkills) { // thanks OishiiKawaiiDesu for noticing an issue with mobskill cooldown - if (skill.getLeft() == toUse.getSkillId() && skill.getRight() == toUse.getSkillLevel()) { + MobSkillId msId = toUse.getId(); + if (skill.getLeft() == msId.type().getId() && skill.getRight() == msId.level()) { return false; } } @@ -1482,8 +1483,8 @@ public class Monster extends AbstractLoadedLife { } private void usedSkill(MobSkill skill) { - final int skillId = skill.getSkillId(); - final int level = skill.getSkillLevel(); + final int skillId = skill.getId().type().getId(); + final int level = skill.getId().level(); long cooltime = skill.getCoolTime(); monsterLock.lock(); diff --git a/src/main/java/server/maps/Mist.java b/src/main/java/server/maps/Mist.java index 0b9960824e..6aa41391d8 100644 --- a/src/main/java/server/maps/Mist.java +++ b/src/main/java/server/maps/Mist.java @@ -138,14 +138,14 @@ public class Mist extends AbstractMapObject { if (owner != null) { return PacketCreator.spawnMist(getObjectId(), owner.getId(), getSourceSkill().getId(), owner.getSkillLevel(SkillFactory.getSkill(source.getSourceId())), this); } - return PacketCreator.spawnMist(getObjectId(), mob.getId(), skill.getSkillId(), skill.getSkillLevel(), this); + return PacketCreator.spawnMobMist(getObjectId(), mob.getId(), skill.getId(), this); } public final Packet makeFakeSpawnData(int level) { if (owner != null) { return PacketCreator.spawnMist(getObjectId(), owner.getId(), getSourceSkill().getId(), level, this); } - return PacketCreator.spawnMist(getObjectId(), mob.getId(), skill.getSkillId(), skill.getSkillLevel(), this); + return PacketCreator.spawnMobMist(getObjectId(), mob.getId(), skill.getId(), this); } @Override diff --git a/src/main/java/tools/PacketCreator.java b/src/main/java/tools/PacketCreator.java index 6df026de3d..54629626b3 100644 --- a/src/main/java/tools/PacketCreator.java +++ b/src/main/java/tools/PacketCreator.java @@ -64,10 +64,7 @@ import server.CashShop.CashItemFactory; import server.CashShop.SpecialCashItem; import server.*; import server.events.gm.Snowball; -import server.life.MobSkill; -import server.life.Monster; -import server.life.NPC; -import server.life.PlayerNPC; +import server.life.*; import server.maps.*; import server.maps.MiniGame.MiniGameResult; import server.movement.LifeMovementFragment; @@ -106,6 +103,11 @@ public class PacketCreator { return utcTimestamp * 10000 + FT_UT_OFFSET; } + private static void writeMobSkillId(OutPacket packet, MobSkillId msId) { + packet.writeShort(msId.type().getId()); + packet.writeShort(msId.level()); + } + public static Packet showHpHealed(int cid, int amount) { OutPacket p = OutPacket.create(SendOpcode.SHOW_FOREIGN_EFFECT); p.writeInt(cid); @@ -1410,8 +1412,7 @@ public class PacketCreator { MobSkill mobSkill = mse.getMobSkill(); if (mobSkill != null) { - p.writeShort(mobSkill.getSkillId()); - p.writeShort(mobSkill.getSkillLevel()); + writeMobSkillId(p, mobSkill.getId()); switch (s.getKey()) { case WEAPON_REFLECT -> pCounter = mobSkill.getX(); @@ -2917,8 +2918,7 @@ public class PacketCreator { writeLongMaskD(p, statups); for (Pair statup : statups) { p.writeShort(statup.getRight().shortValue()); - p.writeShort(skill.getSkillId()); - p.writeShort(skill.getSkillLevel()); + writeMobSkillId(p, skill.getId()); p.writeInt((int) skill.getDuration()); } p.writeShort(0); // ??? wk charges have 600 here o.o @@ -2936,8 +2936,7 @@ public class PacketCreator { if (statup.getLeft() == Disease.POISON) { p.writeShort(statup.getRight().shortValue()); } - p.writeShort(skill.getSkillId()); - p.writeShort(skill.getSkillLevel()); + writeMobSkillId(p, skill.getId()); } p.writeShort(0); // same as give_buff p.writeShort(900);//Delay @@ -3051,8 +3050,7 @@ public class PacketCreator { if (statup.getLeft() == Disease.POISON) { p.writeShort(statup.getRight().shortValue()); } - p.writeShort(skill.getSkillId()); - p.writeShort(skill.getSkillLevel()); + writeMobSkillId(p, skill.getId()); } p.writeShort(0); // same as give_buff p.writeShort(900);//Delay @@ -3932,8 +3930,7 @@ public class PacketCreator { for (Map.Entry stat : stati.entrySet()) { p.writeShort(stat.getValue()); if (mse.isMonsterSkill()) { - p.writeShort(mse.getMobSkill().getSkillId()); - p.writeShort(mse.getMobSkill().getSkillLevel()); + writeMobSkillId(p, mse.getMobSkill().getId()); } else { p.writeInt(mse.getSkill().getId()); } @@ -3984,11 +3981,15 @@ public class PacketCreator { return p; } - public static Packet spawnMist(int objId, int ownerChrId, int skill, int level, Mist mist) { + public static Packet spawnMobMist(int objId, int ownerMobId, MobSkillId msId, Mist mist) { + return spawnMist(objId, ownerMobId, msId.type().getId(), msId.level(), mist); + } + + public static Packet spawnMist(int objId, int ownerId, int skill, int level, Mist mist) { OutPacket p = OutPacket.create(SendOpcode.SPAWN_MIST); p.writeInt(objId); p.writeInt(mist.isMobMist() ? 0 : mist.isPoisonMist() ? 1 : mist.isRecoveryMist() ? 4 : 2); // mob mist = 0, player poison = 1, smokescreen = 2, unknown = 3, recovery = 4 - p.writeInt(ownerChrId); + p.writeInt(ownerId); p.writeInt(skill); p.writeByte(level); p.writeShort(mist.getSkillDelay()); // Skill delay