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:
ronancpl
2018-02-17 00:07:10 -02:00
parent 278b5e8140
commit 8f76e7be25
43 changed files with 910 additions and 123 deletions

View File

@@ -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()) {

View File

@@ -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();

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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: