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 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<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 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<MobSkill> 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<Integer> 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<Integer> 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;
}
}