diff --git a/src/main/java/client/Disease.java b/src/main/java/client/Disease.java index 6e8d4ec7be..57aa471e57 100644 --- a/src/main/java/client/Disease.java +++ b/src/main/java/client/Disease.java @@ -22,37 +22,34 @@ package client; import constants.game.GameConstants; +import server.life.MobSkillType; + +import java.util.Arrays; public enum Disease { NULL(0x0), - SLOW(0x1, 126), - SEDUCE(0x80, 128), + SLOW(0x1, MobSkillType.SLOW), + SEDUCE(0x80, MobSkillType.SEDUCE), FISHABLE(0x100), ZOMBIFY(0x4000), - CONFUSE(0x80000, 132), - STUN(0x2000000000000L, 123), - POISON(0x4000000000000L, 125), - SEAL(0x8000000000000L, 120), - DARKNESS(0x10000000000000L, 121), - WEAKEN(0x4000000000000000L, 122), - CURSE(0x8000000000000000L, 124); + CONFUSE(0x80000, MobSkillType.REVERSE_INPUT), + STUN(0x2000000000000L, MobSkillType.STUN), + POISON(0x4000000000000L, MobSkillType.POISON), + SEAL(0x8000000000000L, MobSkillType.SEAL), + DARKNESS(0x10000000000000L, MobSkillType.DARKNESS), + WEAKEN(0x4000000000000000L, MobSkillType.WEAKNESS), + CURSE(0x8000000000000000L, MobSkillType.CURSE); private final long i; - private final boolean first; - private final int mobskill; + private final MobSkillType mobSkillType; Disease(long i) { - this(i, false, 0); + this(i, null); } - Disease(long i, int skill) { - this(i, false, skill); - } - - Disease(long i, boolean first, int skill) { + Disease(long i, MobSkillType skill) { this.i = i; - this.first = first; - this.mobskill = skill; + this.mobSkillType = skill; } public long getValue() { @@ -60,11 +57,11 @@ public enum Disease { } public boolean isFirst() { - return first; + return false; } - public int getDisease() { - return mobskill; + public MobSkillType getMobSkillType() { + return mobSkillType; } public static Disease ordinal(int ord) { @@ -80,13 +77,14 @@ public enum Disease { return diseases[(int) (Math.random() * diseases.length)]; } - public static final Disease getBySkill(final int skill) { - for (Disease d : Disease.values()) { - if (d.getDisease() == skill && d.getDisease() != 0) { - return d; - } + public static final Disease getBySkill(MobSkillType skill) { + if (skill == null) { + return null; } - return null; + return Arrays.stream(Disease.values()) + .filter(d -> d.mobSkillType == skill) + .findAny() + .orElse(null); } } \ No newline at end of file diff --git a/src/main/java/net/server/channel/handlers/MonsterCarnivalHandler.java b/src/main/java/net/server/channel/handlers/MonsterCarnivalHandler.java index a477e9edd9..302562e1c7 100644 --- a/src/main/java/net/server/channel/handlers/MonsterCarnivalHandler.java +++ b/src/main/java/net/server/channel/handlers/MonsterCarnivalHandler.java @@ -29,6 +29,7 @@ import net.packet.InPacket; import net.server.world.Party; import net.server.world.PartyCharacter; import server.life.LifeFactory; +import server.life.MobSkillType; import server.life.Monster; import server.partyquest.CarnivalFactory; import server.partyquest.CarnivalFactory.MCSkill; @@ -102,10 +103,7 @@ public final class MonsterCarnivalHandler extends AbstractPacketHandler { final Disease dis = skill.getDisease(); Party enemies = c.getPlayer().getParty().getEnemy(); if (skill.targetsAll) { - int hitChance = 0; - if (dis.getDisease() == 121 || dis.getDisease() == 122 || dis.getDisease() == 125 || dis.getDisease() == 126) { - hitChance = (int) (Math.random() * 100); - } + int hitChance = rollHitChance(dis.getMobSkillType()); if (hitChance <= 80) { for (PartyCharacter mpc : enemies.getPartyMembers()) { Character mc = mpc.getPlayer(); @@ -179,4 +177,11 @@ public final class MonsterCarnivalHandler extends AbstractPacketHandler { } } } + + private int rollHitChance(MobSkillType type) { + return switch (type) { + case DARKNESS, WEAKNESS, POISON, SLOW -> (int) (Math.random() * 100); + default -> 0; + }; + } } diff --git a/src/main/java/server/StatEffect.java b/src/main/java/server/StatEffect.java index a0791a1281..9a42178dca 100644 --- a/src/main/java/server/StatEffect.java +++ b/src/main/java/server/StatEffect.java @@ -1046,7 +1046,7 @@ public class StatEffect { if (dis == null) { chrApp.dispel(); } else { - chrApp.giveDebuff(dis, MCSkill.getMobSkill(dis.getDisease(), skill.level)); + chrApp.giveDebuff(dis, MCSkill.getMobSkill(dis.getMobSkillType(), skill.level)); } } } @@ -1058,7 +1058,7 @@ public class StatEffect { if (dis == null) { chrApp.dispel(); } else { - chrApp.giveDebuff(dis, MCSkill.getMobSkill(dis.getDisease(), skill.level)); + chrApp.giveDebuff(dis, MCSkill.getMobSkill(dis.getMobSkillType(), skill.level)); } } } @@ -1068,8 +1068,9 @@ public class StatEffect { applyfrom.dispelDebuff(debuff); } } else if (mobSkill > 0 && mobSkillLevel > 0) { - MobSkill ms = MobSkillFactory.getMobSkill(MobSkillType.from(mobSkill), mobSkillLevel); - Disease dis = Disease.getBySkill(mobSkill); + var mobSkillType = MobSkillType.from(mobSkill); + MobSkill ms = MobSkillFactory.getMobSkill(mobSkillType, mobSkillLevel); + Disease dis = Disease.getBySkill(mobSkillType); if (target > 0) { for (Character chr : applyto.getMap().getAllPlayers()) { diff --git a/src/main/java/server/partyquest/CarnivalFactory.java b/src/main/java/server/partyquest/CarnivalFactory.java index 19c55bc61e..3b852504df 100644 --- a/src/main/java/server/partyquest/CarnivalFactory.java +++ b/src/main/java/server/partyquest/CarnivalFactory.java @@ -43,7 +43,15 @@ public class CarnivalFactory { } for (Data z : dataRoot.getData("MCSkill.img")) { Integer id = Integer.parseInt(z.getName()); - MCSkill ms = new MCSkill(DataTool.getInt("spendCP", z, 0), DataTool.getInt("mobSkillID", z, 0), DataTool.getInt("level", z, 0), DataTool.getInt("target", z, 1) > 1); + int spendCp = DataTool.getInt("spendCP", z, 0); + int mobSkillId = DataTool.getInt("mobSkillID", z, 0); + MobSkillType mobSkillType = null; + if (mobSkillId != 0) { + mobSkillType = MobSkillType.from(mobSkillId); + } + int level = DataTool.getInt("level", z, 0); + boolean isMultiTarget = DataTool.getInt("target", z, 1) > 1; + MCSkill ms = new MCSkill(spendCp, mobSkillType, level, isMultiTarget); skills.put(id, ms); if (ms.targetsAll) { @@ -53,7 +61,11 @@ public class CarnivalFactory { } } for (Data z : dataRoot.getData("MCGuardian.img")) { - guardians.put(Integer.parseInt(z.getName()), new MCSkill(DataTool.getInt("spendCP", z, 0), DataTool.getInt("mobSkillID", z, 0), DataTool.getInt("level", z, 0), true)); + int spendCp = DataTool.getInt("spendCP", z, 0); + int mobSkillId = DataTool.getInt("mobSkillID", z, 0); + MobSkillType mobSkillType = MobSkillType.from(mobSkillId); + int level = DataTool.getInt("level", z, 0); + guardians.put(Integer.parseInt(z.getName()), new MCSkill(spendCp, mobSkillType, level, true)); } } @@ -67,7 +79,7 @@ public class CarnivalFactory { public MCSkill getSkill(final int id) { MCSkill skill = skills.get(id); - if (skill != null && skill.skillid <= 0) { + if (skill != null && skill.mobSkillType == null) { return randomizeSkill(skill.targetsAll); } else { return skill; @@ -80,26 +92,28 @@ public class CarnivalFactory { public static class MCSkill { - public int cpLoss, skillid, level; + public int cpLoss; + public MobSkillType mobSkillType; + public int level; public boolean targetsAll; - public MCSkill(int _cpLoss, int _skillid, int _level, boolean _targetsAll) { + public MCSkill(int _cpLoss, MobSkillType mobSkillType, int _level, boolean _targetsAll) { cpLoss = _cpLoss; - skillid = _skillid; + mobSkillType = mobSkillType; level = _level; targetsAll = _targetsAll; } public MobSkill getSkill() { - return getMobSkill(skillid, level); + return getMobSkill(mobSkillType, level); } - public static MobSkill getMobSkill(int skillid, int level) { - return MobSkillFactory.getMobSkill(MobSkillType.from(skillid), level); + public static MobSkill getMobSkill(MobSkillType type, int level) { + return MobSkillFactory.getMobSkill(type, level); } public Disease getDisease() { - return Disease.getBySkill(skillid); + return Disease.getBySkill(mobSkillType); } } }