PNPC & Pmob + Events Wheel & P. Leave patch + Proper cash use deplete

Reworked cash item consume. It now depletes from the selected slot rather than from the first slot it appears on inventory.
Implemented PNPC and PMOB commands.
Solved an issue with some events finishing abruptly when players quit a party.
Added missing mandatory script functions to the event scripts.
Solved an interaction issue with Wheel of Destiny activation in event instances.
Added interaction with NPC Mom & Dad in the Engagement prequest.
Solved an issue with event maps being disposed while reactor's spray items activity is still in effect.
Fixed modifier scrolls such as Spikes on Shoes depleting a upgrade slot.
Added a server flag for avoiding compulsory consuming by pet autopot.
Added a cache for fetching mob names.
Implemented boss drop rate.
Smart protected commands system against command requests in burst by the same user.
Revised login handler, bringing disconnection checks before checking login state and preventing new client reattribution to already logged-in character objects.
Botched login handler sessions now properly gets closed.
This commit is contained in:
ronancpl
2019-01-16 14:46:28 -02:00
parent 132a4ee989
commit 0203d45901
107 changed files with 2740 additions and 473 deletions

View File

@@ -81,7 +81,25 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
final int cid = slea.readInt();
final Server server = Server.getInstance();
MapleCharacter player = c.getWorldServer().getPlayerStorage().getCharacterById(cid);
World wserv = server.getWorld(c.getWorld());
if(wserv == null) {
c.disconnect(true, false);
return;
}
Channel cserv = wserv.getChannel(c.getChannel());
if(cserv == null) {
c.setChannel(1);
cserv = wserv.getChannel(c.getChannel());
if(cserv == null) {
c.disconnect(true, false);
return;
}
}
MapleCharacter player = wserv.getPlayerStorage().getCharacterById(cid);
boolean newcomer = false;
IoSession session = c.getSession();
@@ -106,40 +124,17 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
}
} else {
remoteHwid = player.getClient().getHWID();
c.setCharacterSlots((byte) player.getClient().getCharacterSlots());
player.newClient(c);
}
if (player == null) { //If you are still getting null here then please just uninstall the game >.>, we dont need you fucking with the logs
c.disconnect(true, false);
return;
}
int hwidLen = remoteHwid.length();
session.setAttribute(MapleClient.CLIENT_HWID, remoteHwid);
session.setAttribute(MapleClient.CLIENT_NIBBLEHWID, remoteHwid.substring(hwidLen - 8, hwidLen));
c.setHWID(remoteHwid);
c.setPlayer(player);
c.setAccID(player.getAccountID());
boolean allowLogin = true;
World world = server.getWorld(c.getWorld());
if(world == null) {
c.disconnect(true, false);
return;
}
Channel cserv = world.getChannel(c.getChannel());
if(cserv == null) {
c.setChannel(1);
cserv = world.getChannel(c.getChannel());
if(cserv == null) {
c.disconnect(true, false);
return;
}
}
/* is this check really necessary?
if (state == MapleClient.LOGIN_SERVER_TRANSITION || state == MapleClient.LOGIN_NOTLOGGEDIN) {
@@ -149,7 +144,7 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
}
for (String charName : charNames) {
if(c.getWorldServer().getPlayerStorage().getCharacterByName(charName) != null) {
if(wserv.getPlayerStorage().getCharacterByName(charName) != null) {
allowLogin = false;
break;
}
@@ -160,12 +155,16 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
c.lockClient(); // Sync this to prevent wrong login state for double channel changes
try {
int state = c.getLoginState();
if (state == MapleClient.LOGIN_LOGGEDIN) {
return;
}
if (state != MapleClient.LOGIN_SERVER_TRANSITION || !allowLogin) {
c.setPlayer(null);
c.announce(MaplePacketCreator.getAfterLoginError(7));
c.setAccID(0);
if (state == MapleClient.LOGIN_LOGGEDIN) {
c.disconnect(true, false);
} else {
c.announce(MaplePacketCreator.getAfterLoginError(7));
}
return;
}
c.updateLoginState(MapleClient.LOGIN_LOGGEDIN);
@@ -173,8 +172,18 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
c.unlockClient();
}
if (!newcomer) {
c.setCharacterSlots((byte) player.getClient().getCharacterSlots());
player.newClient(c);
}
int hwidLen = remoteHwid.length();
session.setAttribute(MapleClient.CLIENT_HWID, remoteHwid);
session.setAttribute(MapleClient.CLIENT_NIBBLEHWID, remoteHwid.substring(hwidLen - 8, hwidLen));
c.setHWID(remoteHwid);
cserv.addPlayer(player);
world.addPlayer(player);
wserv.addPlayer(player);
player.setEnteredChannelWorld();
List<PlayerBuffValueHolder> buffs = server.getPlayerBuffStorage().getBuffsFromStorage(cid);
@@ -209,8 +218,8 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
BuddyList bl = player.getBuddylist();
int buddyIds[] = bl.getBuddyIds();
world.loggedOn(player.getName(), player.getId(), c.getChannel(), buddyIds);
for (CharacterIdChannelPair onlineBuddy : world.multiBuddyFind(player.getId(), buddyIds)) {
wserv.loggedOn(player.getName(), player.getId(), c.getChannel(), buddyIds);
for (CharacterIdChannelPair onlineBuddy : wserv.multiBuddyFind(player.getId(), buddyIds)) {
BuddylistEntry ble = bl.get(onlineBuddy.getCharacterId());
ble.setChannel(onlineBuddy.getChannel());
bl.put(ble);
@@ -219,10 +228,10 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
c.announce(MaplePacketCreator.loadFamily(player));
if (player.getFamilyId() > 0) {
MapleFamily f = world.getFamily(player.getFamilyId());
MapleFamily f = wserv.getFamily(player.getFamilyId());
if (f == null) {
f = new MapleFamily(player.getId());
world.addFamily(player.getFamilyId(), f);
wserv.addFamily(player.getFamilyId(), f);
}
player.setFamily(f);
c.announce(MaplePacketCreator.getFamilyInfo(f.getMember(player.getId())));
@@ -271,7 +280,7 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
pchar.setChannel(c.getChannel());
pchar.setMapId(player.getMapId());
pchar.setOnline(true);
world.updateParty(player.getParty().getId(), PartyOperation.LOG_ONOFF, pchar);
wserv.updateParty(player.getParty().getId(), PartyOperation.LOG_ONOFF, pchar);
player.updatePartyMemberHP();
}
@@ -292,22 +301,20 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
c.announce(MaplePacketCreator.requestBuddylistAdd(pendingBuddyRequest.getId(), c.getPlayer().getId(), pendingBuddyRequest.getName()));
}
if (newcomer) {
for(MaplePet pet : player.getPets()) {
if(pet != null)
world.registerPetHunger(player, player.getPetIndex(pet));
}
player.reloadQuestExpirations();
}
c.announce(MaplePacketCreator.updateGender(player));
player.checkMessenger();
c.announce(MaplePacketCreator.enableReport());
player.changeSkillLevel(SkillFactory.getSkill(10000000 * player.getJobType() + 12), (byte) (player.getLinkedLevel() / 10), 20, -1);
player.checkBerserk(player.isHidden());
if (newcomer){
if (newcomer) {
for(MaplePet pet : player.getPets()) {
if(pet != null)
wserv.registerPetHunger(player, player.getPetIndex(pet));
}
player.reloadQuestExpirations();
/*
if (!c.hasVotedAlready()){
player.announce(MaplePacketCreator.earnTitleMessage("You can vote now! Vote and earn a vote point!"));
@@ -354,7 +361,7 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler {
if(player.getPartnerId() > 0) {
int partnerId = player.getPartnerId();
final MapleCharacter partner = c.getWorldServer().getPlayerStorage().getCharacterById(partnerId);
final MapleCharacter partner = wserv.getPlayerStorage().getCharacterById(partnerId);
if(partner != null && !partner.isAwayFromWorld()) {
player.announce(Wedding.OnNotifyWeddingPartnerTransfer(partnerId, partner.getMapId()));