White scroll & PiratePQ fix + Party for starters + concurrency protection on event scripts
Fixed successful scrolled items not using up an upgrade slot when using white scroll. Fixed some issues with the PiratePQ and added a "clear all boxes to complete a stage"-mode. Added "Party for Starters" feature. Added concurrency protection on event script modules.
This commit is contained in:
@@ -30,11 +30,38 @@ import tools.MaplePacketCreator;
|
||||
import tools.data.input.SeekableLittleEndianAccessor;
|
||||
import client.MapleCharacter;
|
||||
import client.MapleClient;
|
||||
import constants.ServerConstants;
|
||||
import scripting.event.EventInstanceManager;
|
||||
import server.maps.MapleMap;
|
||||
|
||||
public final class PartyOperationHandler extends AbstractMaplePacketHandler {
|
||||
|
||||
public static void leaveParty(MapleParty party, MaplePartyCharacter partyplayer, MapleClient c) {
|
||||
World world = c.getWorldServer();
|
||||
MapleCharacter player = c.getPlayer();
|
||||
|
||||
if (party != null && partyplayer != null) {
|
||||
if (partyplayer.getId() == party.getLeaderId()) {
|
||||
c.getWorldServer().removeMapPartyMembers(party.getId());
|
||||
|
||||
world.updateParty(party.getId(), PartyOperation.DISBAND, partyplayer);
|
||||
if (player.getEventInstance() != null) {
|
||||
player.getEventInstance().disbandParty();
|
||||
}
|
||||
} else {
|
||||
player.getMap().removePartyMember(player);
|
||||
|
||||
world.updateParty(party.getId(), PartyOperation.LEAVE, partyplayer);
|
||||
if (player.getEventInstance() != null) {
|
||||
player.getEventInstance().leftParty(player);
|
||||
}
|
||||
}
|
||||
|
||||
player.setParty(null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
|
||||
int operation = slea.readByte();
|
||||
MapleCharacter player = c.getPlayer();
|
||||
@@ -43,46 +70,28 @@ public final class PartyOperationHandler extends AbstractMaplePacketHandler {
|
||||
MaplePartyCharacter partyplayer = player.getMPC();
|
||||
switch (operation) {
|
||||
case 1: { // create
|
||||
if(player.getLevel() < 10) {
|
||||
c.announce(MaplePacketCreator.partyStatusMessage(10));
|
||||
return;
|
||||
if(player.getLevel() < 10 && !ServerConstants.USE_PARTY_FOR_STARTERS) {
|
||||
c.announce(MaplePacketCreator.partyStatusMessage(10));
|
||||
return;
|
||||
}
|
||||
if (player.getParty() == null) {
|
||||
partyplayer = new MaplePartyCharacter(player);
|
||||
party = world.createParty(partyplayer);
|
||||
player.setParty(party);
|
||||
player.setMPC(partyplayer);
|
||||
player.getMap().addPartyMember(player);
|
||||
player.silentPartyUpdate();
|
||||
c.announce(MaplePacketCreator.partyCreated(partyplayer));
|
||||
partyplayer = new MaplePartyCharacter(player);
|
||||
party = world.createParty(partyplayer);
|
||||
player.setParty(party);
|
||||
player.setMPC(partyplayer);
|
||||
player.getMap().addPartyMember(player);
|
||||
player.silentPartyUpdate();
|
||||
c.announce(MaplePacketCreator.partyCreated(partyplayer));
|
||||
} else {
|
||||
c.announce(MaplePacketCreator.serverNotice(5, "You can't create a party as you are already in one."));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
if (party != null && partyplayer != null) {
|
||||
if (partyplayer.getId() == party.getLeaderId()) {
|
||||
c.getWorldServer().removeMapPartyMembers(party.getId());
|
||||
|
||||
world.updateParty(party.getId(), PartyOperation.DISBAND, partyplayer);
|
||||
if (player.getEventInstance() != null) {
|
||||
player.getEventInstance().disbandParty();
|
||||
}
|
||||
} else {
|
||||
player.getMap().removePartyMember(player);
|
||||
|
||||
world.updateParty(party.getId(), PartyOperation.LEAVE, partyplayer);
|
||||
if (player.getEventInstance() != null) {
|
||||
player.getEventInstance().leftParty(player);
|
||||
}
|
||||
}
|
||||
|
||||
player.setParty(null);
|
||||
}
|
||||
case 2: { // leave/disband
|
||||
leaveParty(party, partyplayer, c);
|
||||
break;
|
||||
}
|
||||
case 3: {//join
|
||||
case 3: { // join
|
||||
int partyid = slea.readInt();
|
||||
if (c.getPlayer().getParty() == null) {
|
||||
party = world.getParty(partyid);
|
||||
@@ -105,16 +114,26 @@ public final class PartyOperationHandler extends AbstractMaplePacketHandler {
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 4: {//invite
|
||||
case 4: { // invite
|
||||
String name = slea.readMapleAsciiString();
|
||||
MapleCharacter invited = world.getPlayerStorage().getCharacterByName(name);
|
||||
if (invited != null) {
|
||||
if(invited.getLevel() < 10) { //min requirement is level 10
|
||||
c.announce(MaplePacketCreator.serverNotice(5, "The player you have invited does not meet the requirements."));
|
||||
return;
|
||||
if(invited.getLevel() < 10 && (!ServerConstants.USE_PARTY_FOR_STARTERS || player.getLevel() >= 10)) { //min requirement is level 10
|
||||
c.announce(MaplePacketCreator.serverNotice(5, "The player you have invited does not meet the requirements."));
|
||||
return;
|
||||
}
|
||||
if(ServerConstants.USE_PARTY_FOR_STARTERS && invited.getLevel() >= 10 && player.getLevel() < 10) { //trying to invite high level
|
||||
c.announce(MaplePacketCreator.serverNotice(5, "The player you have invited does not meet the requirements."));
|
||||
return;
|
||||
}
|
||||
|
||||
if (invited.getParty() == null) {
|
||||
if (player.getParty() == null) {
|
||||
if(player.getLevel() < 10 && !ServerConstants.USE_PARTY_FOR_STARTERS) {
|
||||
c.announce(MaplePacketCreator.partyStatusMessage(10));
|
||||
return;
|
||||
}
|
||||
|
||||
partyplayer = new MaplePartyCharacter(player);
|
||||
party = world.createParty(partyplayer);
|
||||
player.setParty(party);
|
||||
@@ -158,7 +177,7 @@ public final class PartyOperationHandler extends AbstractMaplePacketHandler {
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 6: {
|
||||
case 6: { // change leader
|
||||
int newLeader = slea.readInt();
|
||||
MaplePartyCharacter newLeadr = party.getMemberById(newLeader);
|
||||
world.updateParty(party.getId(), PartyOperation.CHANGE_LEADER, newLeadr);
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
*/
|
||||
package net.server.world;
|
||||
|
||||
import client.MapleClient;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
@@ -195,6 +196,24 @@ public class MapleParty {
|
||||
return slot;
|
||||
}
|
||||
|
||||
public void assignNewLeader(MapleClient c) {
|
||||
World world = c.getWorldServer();
|
||||
MaplePartyCharacter newLeadr = null;
|
||||
|
||||
lock.lock();
|
||||
try {
|
||||
for(MaplePartyCharacter mpc : members) {
|
||||
if(mpc.getId() != leaderId && (newLeadr == null || newLeadr.getLevel() < mpc.getLevel())) {
|
||||
newLeadr = mpc;
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
|
||||
if(newLeadr != null) world.updateParty(this.getId(), PartyOperation.CHANGE_LEADER, newLeadr);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
|
||||
@@ -27,7 +27,6 @@ import java.util.LinkedHashMap;
|
||||
import java.util.Collection;
|
||||
|
||||
import server.maps.MapleDoor;
|
||||
import server.MapleStatEffect;
|
||||
import client.MapleCharacter;
|
||||
import client.MapleJob;
|
||||
import java.util.Collections;
|
||||
|
||||
@@ -400,8 +400,8 @@ public class World {
|
||||
chr.setParty(null);
|
||||
chr.setMPC(null);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user