From 6e62a6a45d662cb2f0aac228a5953d0d1d9475bf Mon Sep 17 00:00:00 2001 From: P0nk Date: Fri, 2 Sep 2022 07:58:52 +0200 Subject: [PATCH] Break off mob skill loading into separate method --- .../java/server/life/MobSkillFactory.java | 125 ++++++++++-------- 1 file changed, 69 insertions(+), 56 deletions(-) diff --git a/src/main/java/server/life/MobSkillFactory.java b/src/main/java/server/life/MobSkillFactory.java index 0e9cee415b..599315b8a7 100644 --- a/src/main/java/server/life/MobSkillFactory.java +++ b/src/main/java/server/life/MobSkillFactory.java @@ -28,10 +28,8 @@ import provider.DataTool; import provider.wz.WZFiles; import java.awt.*; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -42,75 +40,90 @@ import static java.util.concurrent.TimeUnit.SECONDS; * @author Danny (Leifde) */ public class MobSkillFactory { - private static final Map mobSkills = new HashMap<>(); - private final static DataProvider dataSource = DataProviderFactory.getDataProvider(WZFiles.SKILL); + private static final DataProvider dataSource = DataProviderFactory.getDataProvider(WZFiles.SKILL); private static final Data skillRoot = dataSource.getData("MobSkill.img"); - private final static ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); - private final static Lock readLock = readWriteLock.readLock(); - private final static Lock writeLock = readWriteLock.writeLock(); + private static final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); + private static final Lock readLock = readWriteLock.readLock(); + private static final Lock writeLock = readWriteLock.writeLock(); - public static MobSkill getMobSkill(final int skillId, final int level) { - final String key = skillId + "" + level; + public static MobSkill getMobSkill(final int skillId, final int level) { // TODO: return Optional readLock.lock(); try { - MobSkill ret = mobSkills.get(key); + MobSkill ret = mobSkills.get(createKey(skillId, level)); if (ret != null) { return ret; } } finally { readLock.unlock(); } + + return loadMobSkill(skillId, level).orElse(null); + } + + private static Optional loadMobSkill(final int skillId, final int level) { writeLock.lock(); try { - MobSkill ret = mobSkills.get(key); - if (ret == null) { - Data skillData = skillRoot.getChildByPath(skillId + "/level/" + level); - if (skillData != null) { - int mpCon = DataTool.getInt(skillData.getChildByPath("mpCon"), 0); - List toSummon = new ArrayList<>(); - for (int i = 0; i > -1; i++) { - if (skillData.getChildByPath(String.valueOf(i)) == null) { - break; - } - toSummon.add(DataTool.getInt(skillData.getChildByPath(String.valueOf(i)), 0)); - } - int effect = DataTool.getInt("summonEffect", skillData, 0); - int hp = DataTool.getInt("hp", skillData, 100); - int x = DataTool.getInt("x", skillData, 1); - int y = DataTool.getInt("y", skillData, 1); - int count = DataTool.getInt("count", skillData, 1); - long duration = SECONDS.toMillis(DataTool.getInt("time", skillData, 0)); - long cooltime = SECONDS.toMillis(DataTool.getInt("interval", skillData, 0)); - int iprop = DataTool.getInt("prop", skillData, 100); - float prop = iprop / 100; - int limit = DataTool.getInt("limit", skillData, 0); - Data ltd = skillData.getChildByPath("lt"); - Point lt = null; - Point rb = null; - if (ltd != null) { - lt = (Point) ltd.getData(); - rb = (Point) skillData.getChildByPath("rb").getData(); - } - ret = new MobSkill(MobSkillType.from(skillId), level); - ret.addSummons(toSummon); - ret.setCoolTime(cooltime); - ret.setDuration(duration); - ret.setHp(hp); - ret.setMpCon(mpCon); - ret.setSpawnEffect(effect); - ret.setX(x); - ret.setY(y); - ret.setCount(count); - ret.setProp(prop); - ret.setLimit(limit); - ret.setLtRb(lt, rb); - } - mobSkills.put(skillId + "" + level, ret); + MobSkill ms = mobSkills.get(createKey(skillId, level)); + if (ms != null) { + return Optional.of(ms); } - return ret; + + Data skillData = skillRoot.getChildByPath(skillId + "/level/" + level); + if (skillData == null) { + return Optional.empty(); + } + + int mpCon = DataTool.getInt(skillData.getChildByPath("mpCon"), 0); + List toSummon = new ArrayList<>(); + for (int i = 0; i > -1; i++) { + if (skillData.getChildByPath(String.valueOf(i)) == null) { + break; + } + toSummon.add(DataTool.getInt(skillData.getChildByPath(String.valueOf(i)), 0)); + } + int effect = DataTool.getInt("summonEffect", skillData, 0); + int hp = DataTool.getInt("hp", skillData, 100); + int x = DataTool.getInt("x", skillData, 1); + int y = DataTool.getInt("y", skillData, 1); + int count = DataTool.getInt("count", skillData, 1); + long duration = SECONDS.toMillis(DataTool.getInt("time", skillData, 0)); + long cooltime = SECONDS.toMillis(DataTool.getInt("interval", skillData, 0)); + int iprop = DataTool.getInt("prop", skillData, 100); + float prop = iprop / 100; + int limit = DataTool.getInt("limit", skillData, 0); + + Data ltData = skillData.getChildByPath("lt"); + Data rbData = skillData.getChildByPath("rb"); + Point lt = null; + Point rb = null; + if (ltData != null && rbData != null) { + lt = (Point) ltData.getData(); + rb = (Point) rbData.getData(); + } + + ms = new MobSkill(MobSkillType.from(skillId), level); + ms.addSummons(toSummon); + ms.setCoolTime(cooltime); + ms.setDuration(duration); + ms.setHp(hp); + ms.setMpCon(mpCon); + ms.setSpawnEffect(effect); + ms.setX(x); + ms.setY(y); + ms.setCount(count); + ms.setProp(prop); + ms.setLimit(limit); + ms.setLtRb(lt, rb); + + mobSkills.put(createKey(skillId, level), ms); + return Optional.of(ms); } finally { writeLock.unlock(); } } + + private static String createKey(int skillId, int skillLevel) { + return skillId + "" + skillLevel; + } }