Break off mob skill loading into separate method
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user