Event disposing patch + Papulatus rework + V. scroll exploit patch
Solved issues with PQs/events in progress not disposing properly party leavers (warping them out of the event maps). Solved issues with cleared PQs/events disposing players unproperly when leaving or disbanding the party. Reworked Papulatus battle now working as an event instance, similar to how Capt Latanica battle is dealt. Fixed a possible PE exploit with Vega's scroll.
This commit is contained in:
@@ -406,7 +406,7 @@ public final class MakerSkillHandler extends AbstractMaplePacketHandler {
|
||||
if(!(c.getPlayer().isGM() && ServerConstants.USE_PERFECT_GM_SCROLL)) {
|
||||
eqp.setUpgradeSlots((byte)(eqp.getUpgradeSlots() + 1));
|
||||
}
|
||||
item = MapleItemInformationProvider.getInstance().scrollEquipWithId(eqp, 2049100, true, 0, c.getPlayer().isGM());
|
||||
item = MapleItemInformationProvider.getInstance().scrollEquipWithId(eqp, 2049100, true, 2049100, c.getPlayer().isGM());
|
||||
}
|
||||
|
||||
if(!reagentids.isEmpty()) {
|
||||
|
||||
@@ -564,14 +564,15 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
|
||||
return;
|
||||
}
|
||||
|
||||
//should have a check here against PE hacks
|
||||
|
||||
Equip toScroll = (Equip) eitem;
|
||||
if (toScroll.getUpgradeSlots() < 1) {
|
||||
c.getSession().write(MaplePacketCreator.getInventoryFull());
|
||||
return;
|
||||
}
|
||||
|
||||
//should have a check here against PE hacks
|
||||
if(itemId / 1000000 != 5) itemId = 0;
|
||||
|
||||
c.getPlayer().toggleBlockCashShop();
|
||||
|
||||
final int curlevel = toScroll.getLevel();
|
||||
|
||||
@@ -101,6 +101,7 @@ public class EventInstanceManager {
|
||||
private ScheduledFuture<?> event_schedule = null;
|
||||
private boolean disposed = false;
|
||||
private boolean eventCleared = false;
|
||||
private boolean eventStarted = false;
|
||||
|
||||
// multi-leveled PQ rewards!
|
||||
private Map<Integer, List<Integer>> collectionSet = new HashMap<>(ServerConstants.MAX_EVENT_LEVELS);
|
||||
@@ -507,18 +508,20 @@ public class EventInstanceManager {
|
||||
try {
|
||||
mobs.remove(mob);
|
||||
|
||||
try {
|
||||
em.getIv().invokeFunction("monsterKilled", mob, this, hasKiller);
|
||||
} catch (ScriptException | NoSuchMethodException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
|
||||
if (mobs.isEmpty()) {
|
||||
if(eventStarted) {
|
||||
try {
|
||||
em.getIv().invokeFunction("allMonstersDead", this, hasKiller);
|
||||
em.getIv().invokeFunction("monsterKilled", mob, this, hasKiller);
|
||||
} catch (ScriptException | NoSuchMethodException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
|
||||
if (mobs.isEmpty()) {
|
||||
try {
|
||||
em.getIv().invokeFunction("allMonstersDead", this, hasKiller);
|
||||
} catch (ScriptException | NoSuchMethodException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
sL.unlock();
|
||||
@@ -1072,6 +1075,20 @@ public class EventInstanceManager {
|
||||
}
|
||||
}
|
||||
|
||||
public final void startEvent() {
|
||||
try {
|
||||
sL.lock();
|
||||
try {
|
||||
eventStarted = true;
|
||||
em.getIv().invokeFunction("afterSetup", this);
|
||||
} finally {
|
||||
sL.unlock();
|
||||
}
|
||||
} catch (ScriptException | NoSuchMethodException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public final void setEventCleared() {
|
||||
eventCleared = true;
|
||||
|
||||
@@ -1097,20 +1114,20 @@ public class EventInstanceManager {
|
||||
return false;
|
||||
}
|
||||
|
||||
public final boolean checkEventTeamLacking(boolean testLeader, int minPlayers) {
|
||||
public final boolean checkEventTeamLacking(boolean leavingEventMap, int minPlayers) {
|
||||
if(eventCleared && getPlayerCount() > 1) return false;
|
||||
|
||||
if(!eventCleared && testLeader && !isEventTeamLeaderOn()) return true;
|
||||
if(!eventCleared && leavingEventMap && !isEventTeamLeaderOn()) return true;
|
||||
if(getPlayerCount() < minPlayers) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public final boolean isEventTeamLackingNow(boolean testLeader, int minPlayers, MapleCharacter quitter) {
|
||||
public final boolean isEventTeamLackingNow(boolean leavingEventMap, int minPlayers, MapleCharacter quitter) {
|
||||
if(eventCleared) {
|
||||
if(getPlayerCount() <= 1) return true;
|
||||
if(leavingEventMap && getPlayerCount() <= 1) return true;
|
||||
} else {
|
||||
if(testLeader && getLeaderId() == quitter.getId()) return true;
|
||||
if(leavingEventMap && getLeaderId() == quitter.getId()) return true;
|
||||
if(getPlayerCount() <= minPlayers) return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -298,7 +298,7 @@ public class EventManager {
|
||||
exped.start();
|
||||
eim.registerExpedition(exped);
|
||||
|
||||
iv.invokeFunction("afterSetup", eim);
|
||||
eim.startEvent();
|
||||
} catch (ScriptException | NoSuchMethodException ex) {
|
||||
Logger.getLogger(EventManager.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
@@ -334,7 +334,8 @@ public class EventManager {
|
||||
eim.setLeader(leader);
|
||||
|
||||
if(chr != null) eim.registerPlayer(chr);
|
||||
iv.invokeFunction("afterSetup", eim);
|
||||
|
||||
eim.startEvent();
|
||||
} catch (ScriptException | NoSuchMethodException ex) {
|
||||
Logger.getLogger(EventManager.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
@@ -371,7 +372,8 @@ public class EventManager {
|
||||
|
||||
eim.registerParty(party, map);
|
||||
party.setEligibleMembers(null);
|
||||
iv.invokeFunction("afterSetup", eim);
|
||||
|
||||
eim.startEvent();
|
||||
} catch (ScriptException | NoSuchMethodException ex) {
|
||||
Logger.getLogger(EventManager.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
@@ -408,7 +410,8 @@ public class EventManager {
|
||||
|
||||
eim.registerParty(party, map);
|
||||
party.setEligibleMembers(null);
|
||||
iv.invokeFunction("afterSetup", eim);
|
||||
|
||||
eim.startEvent();
|
||||
} catch (ScriptException | NoSuchMethodException ex) {
|
||||
Logger.getLogger(EventManager.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
@@ -448,7 +451,8 @@ public class EventManager {
|
||||
|
||||
iv.invokeFunction("setup", eim);
|
||||
eim.setProperty("leader", ldr);
|
||||
iv.invokeFunction("afterSetup", eim);
|
||||
|
||||
eim.startEvent();
|
||||
} catch (ScriptException | NoSuchMethodException ex) {
|
||||
Logger.getLogger(EventManager.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
|
||||
@@ -871,9 +871,9 @@ public class MapleItemInformationProvider {
|
||||
if (((nEquip.getUpgradeSlots() > 0 || ItemConstants.isCleanSlate(scrollId))) || assertGM) {
|
||||
double prop = (double)stats.get("success");
|
||||
if (vegaItemId == 5610000) {
|
||||
prop = 30.0;
|
||||
if(prop == 10.0) prop = 30.0;
|
||||
} else if (vegaItemId == 5610001) {
|
||||
prop = 90.0;
|
||||
if(prop == 60.0) prop = 90.0;
|
||||
} else if (vegaItemId == 2049100) {
|
||||
prop = 100.0;
|
||||
}
|
||||
@@ -884,11 +884,11 @@ public class MapleItemInformationProvider {
|
||||
case 2040727:
|
||||
flag |= ItemConstants.SPIKES;
|
||||
nEquip.setFlag((byte) flag);
|
||||
return equip;
|
||||
break;
|
||||
case 2041058:
|
||||
flag |= ItemConstants.COLD;
|
||||
nEquip.setFlag((byte) flag);
|
||||
return equip;
|
||||
break;
|
||||
case 2049000:
|
||||
case 2049001:
|
||||
case 2049002:
|
||||
|
||||
Reference in New Issue
Block a user