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 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,75 +40,90 @@ 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) {
|
||||||
Data skillData = skillRoot.getChildByPath(skillId + "/level/" + level);
|
return Optional.of(ms);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
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 {
|
} finally {
|
||||||
writeLock.unlock();
|
writeLock.unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String createKey(int skillId, int skillLevel) {
|
||||||
|
return skillId + "" + skillLevel;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user