Break off mob skill loading into separate method

This commit is contained in:
P0nk
2022-09-02 07:58:52 +02:00
parent 3c9be7d70b
commit 6e62a6a45d

View File

@@ -28,10 +28,8 @@ import provider.DataTool;
import provider.wz.WZFiles; import provider.wz.WZFiles;
import java.awt.*; import java.awt.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.*;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -42,31 +40,40 @@ import static java.util.concurrent.TimeUnit.SECONDS;
* @author Danny (Leifde) * @author Danny (Leifde)
*/ */
public class MobSkillFactory { public class MobSkillFactory {
private static final Map<String, MobSkill> mobSkills = new HashMap<>(); private static final Map<String, MobSkill> 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 static final Data skillRoot = dataSource.getData("MobSkill.img");
private final static ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); private static final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private final static Lock readLock = readWriteLock.readLock(); private static final Lock readLock = readWriteLock.readLock();
private final static Lock writeLock = readWriteLock.writeLock(); private static final Lock writeLock = readWriteLock.writeLock();
public static MobSkill getMobSkill(final int skillId, final int level) { public static MobSkill getMobSkill(final int skillId, final int level) { // TODO: return Optional
final String key = skillId + "" + level;
readLock.lock(); readLock.lock();
try { try {
MobSkill ret = mobSkills.get(key); MobSkill ret = mobSkills.get(createKey(skillId, level));
if (ret != null) { if (ret != null) {
return ret; return ret;
} }
} finally { } finally {
readLock.unlock(); readLock.unlock();
} }
return loadMobSkill(skillId, level).orElse(null);
}
private static Optional<MobSkill> loadMobSkill(final int skillId, final int level) {
writeLock.lock(); writeLock.lock();
try { try {
MobSkill ret = mobSkills.get(key); MobSkill ms = mobSkills.get(createKey(skillId, level));
if (ret == null) { if (ms != null) {
return Optional.of(ms);
}
Data skillData = skillRoot.getChildByPath(skillId + "/level/" + level); Data skillData = skillRoot.getChildByPath(skillId + "/level/" + level);
if (skillData != null) { if (skillData == null) {
return Optional.empty();
}
int mpCon = DataTool.getInt(skillData.getChildByPath("mpCon"), 0); int mpCon = DataTool.getInt(skillData.getChildByPath("mpCon"), 0);
List<Integer> toSummon = new ArrayList<>(); List<Integer> toSummon = new ArrayList<>();
for (int i = 0; i > -1; i++) { for (int i = 0; i > -1; i++) {
@@ -85,32 +92,38 @@ public class MobSkillFactory {
int iprop = DataTool.getInt("prop", skillData, 100); int iprop = DataTool.getInt("prop", skillData, 100);
float prop = iprop / 100; float prop = iprop / 100;
int limit = DataTool.getInt("limit", skillData, 0); int limit = DataTool.getInt("limit", skillData, 0);
Data ltd = skillData.getChildByPath("lt");
Data ltData = skillData.getChildByPath("lt");
Data rbData = skillData.getChildByPath("rb");
Point lt = null; Point lt = null;
Point rb = null; Point rb = null;
if (ltd != null) { if (ltData != null && rbData != null) {
lt = (Point) ltd.getData(); lt = (Point) ltData.getData();
rb = (Point) skillData.getChildByPath("rb").getData(); rb = (Point) rbData.getData();
} }
ret = new MobSkill(MobSkillType.from(skillId), level);
ret.addSummons(toSummon); ms = new MobSkill(MobSkillType.from(skillId), level);
ret.setCoolTime(cooltime); ms.addSummons(toSummon);
ret.setDuration(duration); ms.setCoolTime(cooltime);
ret.setHp(hp); ms.setDuration(duration);
ret.setMpCon(mpCon); ms.setHp(hp);
ret.setSpawnEffect(effect); ms.setMpCon(mpCon);
ret.setX(x); ms.setSpawnEffect(effect);
ret.setY(y); ms.setX(x);
ret.setCount(count); ms.setY(y);
ret.setProp(prop); ms.setCount(count);
ret.setLimit(limit); ms.setProp(prop);
ret.setLtRb(lt, rb); ms.setLimit(limit);
} ms.setLtRb(lt, rb);
mobSkills.put(skillId + "" + level, ret);
} mobSkills.put(createKey(skillId, level), ms);
return ret; return Optional.of(ms);
} finally { } finally {
writeLock.unlock(); writeLock.unlock();
} }
} }
private static String createKey(int skillId, int skillLevel) {
return skillId + "" + skillLevel;
}
} }