WK charges fix + Job level cap + MapleQuestItemFetcher

Fixed WK charges not overriding one another and some concurrency issues within MapleMap and EventInstanceManager.
New feature: job level cap, limits EXP gain until job advancement is done.
New tool: MapleQuestItemFetcher, searches through the server files for missing quest items and reports the results.
This commit is contained in:
ronancpl
2017-11-07 10:44:00 -02:00
parent 1fead59c57
commit 624aca375e
164 changed files with 26482 additions and 35341 deletions
@@ -1129,7 +1129,6 @@ public class MapleItemInformationProvider {
return isQuestItemCache.get(itemId);
}
MapleData data = getItemData(itemId);
System.out.println(data);
boolean questItem = MapleDataTool.getIntConvert("info/quest", data, 0) == 1;
isQuestItemCache.put(itemId, questItem);
return questItem;
+11 -3
View File
@@ -455,9 +455,10 @@ public class MapleStatEffect {
case Marksman.SHARP_EYES:
statups.add(new Pair<>(MapleBuffStat.SHARP_EYES, Integer.valueOf(ret.x << 8 | ret.y)));
break;
// THIEF
case Rogue.DARK_SIGHT:
case WindArcher.WIND_WALK:
statups.add(new Pair<>(MapleBuffStat.WIND_WALK, Integer.valueOf(x)));
break;
case Rogue.DARK_SIGHT:
case NightWalker.DARK_SIGHT:
statups.add(new Pair<>(MapleBuffStat.DARKSIGHT, Integer.valueOf(x)));
break;
@@ -1099,6 +1100,9 @@ public class MapleStatEffect {
} else if (isDs()) {
List<Pair<MapleBuffStat, Integer>> dsstat = Collections.singletonList(new Pair<>(MapleBuffStat.DARKSIGHT, 0));
mbuff = MaplePacketCreator.giveForeignBuff(applyto.getId(), dsstat);
} else if (isWw()) {
List<Pair<MapleBuffStat, Integer>> dsstat = Collections.singletonList(new Pair<>(MapleBuffStat.WIND_WALK, 0));
mbuff = MaplePacketCreator.giveForeignBuff(applyto.getId(), dsstat);
} else if (isCombo()) {
mbuff = MaplePacketCreator.giveForeignBuff(applyto.getId(), statups);
} else if (isMonsterRiding()) {
@@ -1353,7 +1357,11 @@ public class MapleStatEffect {
}
private boolean isDs() {
return skill && (sourceid == Rogue.DARK_SIGHT || sourceid == WindArcher.WIND_WALK || sourceid == NightWalker.DARK_SIGHT);
return skill && (sourceid == Rogue.DARK_SIGHT || sourceid == NightWalker.DARK_SIGHT);
}
private boolean isWw() {
return skill && (sourceid == WindArcher.WIND_WALK);
}
private boolean isCombo() {
+3 -4
View File
@@ -287,7 +287,7 @@ public class MapleMonster extends AbstractLoadedMapleLife {
}
int partyLevel = 0;
int leechMinLevel = (ServerConstants.USE_UNDERLEVELED_EXP_BLOCK) ? getLevel() - ServerConstants.MIN_UNDERLEVEL_TO_EXP_GAIN : 0; //NO EXP WILL BE GIVEN for those who are underleveled!
int leechMinLevel = (ServerConstants.USE_ENFORCE_MOB_LEVEL_RANGE) ? getLevel() - ServerConstants.MIN_UNDERLEVEL_TO_EXP_GAIN : 0; //NO EXP WILL BE GIVEN for those who are underleveled!
int leechCount = 0;
for (MapleCharacter mc : members) {
@@ -347,7 +347,7 @@ public class MapleMonster extends AbstractLoadedMapleLife {
long pXP = (long)xp + (partyExp.containsKey(pID) ? partyExp.get(pID) : 0);
partyExp.put(pID, (int)Math.min(pXP, Integer.MAX_VALUE));
} else {
if(!ServerConstants.USE_UNDERLEVELED_EXP_BLOCK || mc.getLevel() >= getLevel() - ServerConstants.MIN_UNDERLEVEL_TO_EXP_GAIN) {
if(!ServerConstants.USE_ENFORCE_MOB_LEVEL_RANGE || mc.getLevel() >= getLevel() - ServerConstants.MIN_UNDERLEVEL_TO_EXP_GAIN) {
//NO EXP WILL BE GIVEN for those who are underleveled!
giveExpToCharacter(mc, xp, isKiller, 1);
} else {
@@ -1021,8 +1021,7 @@ public class MapleMonster extends AbstractLoadedMapleLife {
}
final MapleMonster mons = this;
TimerManager tMan = TimerManager.getInstance();
tMan.schedule(
TimerManager.getInstance().schedule(
new Runnable() {
@Override
+7 -3
View File
@@ -602,6 +602,8 @@ public class MapleMap {
private void startItemMonitor() {
chrWLock.lock();
try {
if(itemMonitor != null) return;
itemMonitor = TimerManager.getInstance().register(new Runnable() {
@Override
public void run() {
@@ -1093,14 +1095,13 @@ public class MapleMap {
public void destroyReactor(int oid) {
final MapleReactor reactor = getReactorByOid(oid);
TimerManager tMan = TimerManager.getInstance();
broadcastMessage(MaplePacketCreator.destroyReactor(reactor));
reactor.cancelReactorTimeout();
reactor.setAlive(false);
removeMapObject(reactor);
if (reactor.getDelay() > 0) {
tMan.schedule(new Runnable() {
TimerManager.getInstance().schedule(new Runnable() {
@Override
public void run() {
respawnReactor(reactor);
@@ -1879,9 +1880,12 @@ public class MapleMap {
}
public void addPlayer(final MapleCharacter chr) {
int chrSize;
chrWLock.lock();
try {
characters.add(chr);
chrSize = characters.size();
addPartyMemberInternal(chr);
} finally {
chrWLock.unlock();
@@ -1889,7 +1893,7 @@ public class MapleMap {
chr.setMapId(mapid);
itemMonitorTimeout = 1;
if (getCharacters().size() <= 1) {
if (chrSize == 1) {
if(!hasItemMonitor()) startItemMonitor();
if (onFirstUserEnter.length() != 0 && !chr.hasEntered(onFirstUserEnter, mapid) && MapScriptManager.getInstance().scriptExists(onFirstUserEnter, true)) {