Fix mob using attack with no diseaseSkill causing errors
This commit is contained in:
@@ -1046,7 +1046,7 @@ public class StatEffect {
|
||||
if (dis == null) {
|
||||
chrApp.dispel();
|
||||
} else {
|
||||
MobSkill mobSkill = MobSkillFactory.getMobSkill(dis.getMobSkillType(), skill.level());
|
||||
MobSkill mobSkill = MobSkillFactory.getMobSkillOrThrow(dis.getMobSkillType(), skill.level());
|
||||
chrApp.giveDebuff(dis, mobSkill);
|
||||
}
|
||||
}
|
||||
@@ -1059,7 +1059,7 @@ public class StatEffect {
|
||||
if (dis == null) {
|
||||
chrApp.dispel();
|
||||
} else {
|
||||
MobSkill mobSkill = MobSkillFactory.getMobSkill(dis.getMobSkillType(), skill.level());
|
||||
MobSkill mobSkill = MobSkillFactory.getMobSkillOrThrow(dis.getMobSkillType(), skill.level());
|
||||
chrApp.giveDebuff(dis, mobSkill);
|
||||
}
|
||||
}
|
||||
@@ -1070,8 +1070,8 @@ public class StatEffect {
|
||||
applyfrom.dispelDebuff(debuff);
|
||||
}
|
||||
} else if (mobSkill > 0 && mobSkillLevel > 0) {
|
||||
var mobSkillType = MobSkillType.from(mobSkill);
|
||||
MobSkill ms = MobSkillFactory.getMobSkill(mobSkillType, mobSkillLevel);
|
||||
MobSkillType mobSkillType = MobSkillType.from(mobSkill).orElseThrow();
|
||||
MobSkill ms = MobSkillFactory.getMobSkillOrThrow(mobSkillType, mobSkillLevel);
|
||||
Disease dis = Disease.getBySkill(mobSkillType);
|
||||
|
||||
if (target > 0) {
|
||||
|
||||
@@ -192,7 +192,7 @@ public class LifeFactory {
|
||||
while (monsterSkillInfoData.getChildByPath(Integer.toString(i)) != null) {
|
||||
int skillId = DataTool.getInt(i + "/skill", monsterSkillInfoData, 0);
|
||||
int skillLv = DataTool.getInt(i + "/level", monsterSkillInfoData, 0);
|
||||
MobSkillType type = MobSkillType.from(skillId);
|
||||
MobSkillType type = MobSkillType.from(skillId).orElseThrow();
|
||||
skills.add(new MobSkillId(type, skillLv));
|
||||
|
||||
Data monsterSkillData = monsterData.getChildByPath("skill" + (i + 1));
|
||||
@@ -202,7 +202,7 @@ public class LifeFactory {
|
||||
animationTime += DataTool.getIntConvert("delay", effectEntry, 0);
|
||||
}
|
||||
|
||||
MobSkill skill = MobSkillFactory.getMobSkill(type, skillLv);
|
||||
MobSkill skill = MobSkillFactory.getMobSkillOrThrow(type, skillLv);
|
||||
mi.setMobSkillAnimationTime(skill, animationTime);
|
||||
}
|
||||
|
||||
|
||||
@@ -47,20 +47,24 @@ public class MobSkillFactory {
|
||||
private static final Lock readLock = readWriteLock.readLock();
|
||||
private static final Lock writeLock = readWriteLock.writeLock();
|
||||
|
||||
public static MobSkill getMobSkill(final MobSkillType type, final int level) {
|
||||
public static MobSkill getMobSkillOrThrow(MobSkillType type, int level) {
|
||||
return getMobSkill(type, level).orElseThrow(
|
||||
() -> new IllegalArgumentException("No MobSkill exists for type %s, level %d".formatted(type, level))
|
||||
);
|
||||
}
|
||||
|
||||
public static Optional<MobSkill> getMobSkill(final MobSkillType type, final int level) {
|
||||
readLock.lock();
|
||||
try {
|
||||
MobSkill ms = mobSkills.get(createKey(type, level));
|
||||
if (ms != null) {
|
||||
return ms;
|
||||
return Optional.of(ms);
|
||||
}
|
||||
} finally {
|
||||
readLock.unlock();
|
||||
}
|
||||
|
||||
return loadMobSkill(type, level).orElseThrow(
|
||||
() -> new IllegalArgumentException("No MobSkill exists for type %s, level %d".formatted(type, level))
|
||||
);
|
||||
return loadMobSkill(type, level);
|
||||
}
|
||||
|
||||
private static Optional<MobSkill> loadMobSkill(final MobSkillType type, final int level) {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package server.life;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Optional;
|
||||
|
||||
public enum MobSkillType {
|
||||
ATTACK_UP(100),
|
||||
@@ -51,11 +52,18 @@ public enum MobSkillType {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public static MobSkillType from(int id) {
|
||||
public static Optional<MobSkillType> from(int id) {
|
||||
if (isOutOfIdRange(id)) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
return Arrays.stream(values())
|
||||
.filter(type -> type.getId() == id)
|
||||
.findFirst()
|
||||
.orElseThrow(IllegalArgumentException::new);
|
||||
.findAny();
|
||||
}
|
||||
|
||||
private static boolean isOutOfIdRange(int id) {
|
||||
return id < 100 || id > 200;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
|
||||
@@ -47,7 +47,7 @@ public class CarnivalFactory {
|
||||
int mobSkillId = DataTool.getInt("mobSkillID", z, 0);
|
||||
MobSkillType mobSkillType = null;
|
||||
if (mobSkillId != 0) {
|
||||
mobSkillType = MobSkillType.from(mobSkillId);
|
||||
mobSkillType = MobSkillType.from(mobSkillId).orElseThrow();
|
||||
}
|
||||
int level = DataTool.getInt("level", z, 0);
|
||||
boolean isMultiTarget = DataTool.getInt("target", z, 1) > 1;
|
||||
@@ -63,7 +63,7 @@ public class CarnivalFactory {
|
||||
for (Data z : dataRoot.getData("MCGuardian.img")) {
|
||||
int spendCp = DataTool.getInt("spendCP", z, 0);
|
||||
int mobSkillId = DataTool.getInt("mobSkillID", z, 0);
|
||||
MobSkillType mobSkillType = MobSkillType.from(mobSkillId);
|
||||
MobSkillType mobSkillType = MobSkillType.from(mobSkillId).orElseThrow();
|
||||
int level = DataTool.getInt("level", z, 0);
|
||||
guardians.put(Integer.parseInt(z.getName()), new MCSkill(spendCp, mobSkillType, level, true));
|
||||
}
|
||||
@@ -92,7 +92,7 @@ public class CarnivalFactory {
|
||||
|
||||
public record MCSkill(int cpLoss, MobSkillType mobSkillType, int level, boolean targetsAll) {
|
||||
public MobSkill getSkill() {
|
||||
return MobSkillFactory.getMobSkill(mobSkillType, level);
|
||||
return MobSkillFactory.getMobSkillOrThrow(mobSkillType, level);
|
||||
}
|
||||
|
||||
public Disease getDisease() {
|
||||
|
||||
Reference in New Issue
Block a user