package handling.channel.handler;
import client.MapleCharacter;
import client.MapleClient;
import constants.GameConstants;
import handling.channel.ChannelServer;
import handling.world.PartyOperation;
import handling.world.World;
import handling.world.WorldFindService;
import handling.world.WorldSidekickService;
import handling.world.WrodlPartyService;
import handling.world.party.ExpeditionType;
import handling.world.party.MapleExpedition;
import handling.world.party.MapleParty;
import handling.world.party.MaplePartyCharacter;
import handling.world.party.PartySearch;
import handling.world.party.PartySearchType;
import handling.world.sidekick.MapleSidekick;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import server.ServerProperties;
import server.maps.FieldLimitType;
import server.quest.MapleQuest;
import tools.FileoutputUtil;
import tools.MaplePacketCreator;
import tools.StringUtil;
import tools.data.input.SeekableLittleEndianAccessor;
import tools.packet.PartyPacket;
public class PartyHandler {
public static void DenyPartyRequest(SeekableLittleEndianAccessor slea, MapleClient c) {
WrodlPartyService partyService = WrodlPartyService.getInstance();
if ((c.getPlayer().getParty() == null) && (c.getPlayer().getQuestNoAdd(MapleQuest.getInstance(122901)) == null)) {
int action = slea.readByte();
int partyId = slea.readInt();
MapleParty party = partyService.getParty(partyId);
if (party != null) {
if (party.getExpeditionId() > 0) {
c.getPlayer().dropMessage(5, "加入远征队伍的状态下无法进行此操作。");
return;
}
switch (action) {
case 0x1F:
case 0x20://0x21-1 119ok
break;
case 0x24://0x23+1 119ok
case 0x3A:
MapleCharacter cfrom = c.getChannelServer().getPlayerStorage().getCharacterById(party.getLeader().getId());
if (cfrom == null) {
break;
}
cfrom.dropMessage(5, new StringBuilder().append("'").append(c.getPlayer().getName()).append("'玩家拒绝了组队招待。").toString());
break;
case 0x25://0x24+1 119ok
case 0x3B:
if (party.getMembers().size() < 6) {
c.getPlayer().setParty(party);
partyService.updateParty(partyId, PartyOperation.加入队伍, new MaplePartyCharacter(c.getPlayer()));
c.getPlayer().receivePartyMemberHP();
c.getPlayer().updatePartyMemberHP();
} else {
c.getPlayer().dropMessage(5, "组队成员已满");
}
break;
default:
FileoutputUtil.log(new StringBuilder().append("第二方收到组队邀请处理( 0x").append(StringUtil.getLeftPaddedStr(Integer.toHexString(action).toUpperCase(), '0', 2)).append(" ) 未知.").toString());
}
} else {
c.getPlayer().dropMessage(5, "要参加的队伍不存在。");
}
} else {
int action = slea.readByte();
int charId = slea.readInt();
MapleCharacter cfrom;
MapleParty party = partyService.getParty(c.getPlayer().getParty().getId());
switch (action) {
case 0x25:
c.getPlayer().dropMessage(5, "您已经有一个组队,无法加入其他组队!");
break;
case 0x42:
break;
case 0x48:
cfrom = c.getChannelServer().getPlayerStorage().getCharacterById(charId);
if (cfrom == null) {
break;
}
cfrom.dropMessage(5, new StringBuilder().append(c.getPlayer().getName()).append("拒绝了组队加入申请。").toString());
break;
case 0x49:
cfrom = c.getChannelServer().getPlayerStorage().getCharacterById(charId);
if (cfrom == null) {
break;
}
if (party.getMembers().size() < 6) {
cfrom.setParty(party);
partyService.updateParty(party.getId(), PartyOperation.加入队伍, new MaplePartyCharacter(cfrom));
cfrom.receivePartyMemberHP();
cfrom.updatePartyMemberHP();
} else {
c.getPlayer().dropMessage(5, "组队成员已满。");
cfrom.dropMessage(5, "组队成员已满。");
}
break;
default:
FileoutputUtil.log(new StringBuilder().append("第二方收到申请加入组队处理( 0x").append(StringUtil.getLeftPaddedStr(Integer.toHexString(action).toUpperCase(), '0', 2)).append(" ) 未知.").toString());
}
}
}
public static void PartyOperation(SeekableLittleEndianAccessor slea, MapleClient c) {
int operation = slea.readByte();
MapleParty party = c.getPlayer().getParty();
WrodlPartyService partyService = WrodlPartyService.getInstance();
MaplePartyCharacter partyPlayer = new MaplePartyCharacter(c.getPlayer());
switch (operation) {
case 1://创建组队
if (party == null) {
boolean 非公开组队 = slea.readByte() == 1;
String 组队名称 = slea.readMapleAsciiString();
party = partyService.createParty(partyPlayer, 非公开组队, 组队名称);
c.getPlayer().setParty(party);
c.getSession().write(PartyPacket.partyCreated(party));
} else {
if (party.getExpeditionId() > 0) {
c.getPlayer().dropMessage(5, "加入远征队伍的状态下无法进行此操作。");
return;
}
if ((partyPlayer.equals(party.getLeader())) && (party.getMembers().size() == 1)) {
c.getSession().write(PartyPacket.partyCreated(party));
} else {
c.getPlayer().dropMessage(5, "你已经存在一个队伍中,无法创建!");
}
}
break;
case 2:
if (party == null) {
break;
}
if (party.getExpeditionId() > 0) {
c.getPlayer().dropMessage(5, "加入远征队伍的状态下无法进行此操作。");
return;
}
if (partyPlayer.equals(party.getLeader())) {
partyService.updateParty(party.getId(), PartyOperation.解散队伍, partyPlayer);
if (c.getPlayer().getEventInstance() != null) {
c.getPlayer().getEventInstance().disbandParty();
}
} else {
if (c.getPlayer().getEventInstance() != null) {
c.getPlayer().getEventInstance().leftParty(c.getPlayer());
}
partyService.updateParty(party.getId(), PartyOperation.离开队伍, partyPlayer);
}
c.getPlayer().setParty(null);
break;
case 3:
int partyid = slea.readInt();
if (party == null) {
party = partyService.getParty(partyid);
if (party != null) {
if (party.getExpeditionId() > 0) {
c.getPlayer().dropMessage(5, "加入远征队伍的状态下无法进行此操作。");
return;
}
if ((party.getMembers().size() < 6) && (c.getPlayer().getQuestNoAdd(MapleQuest.getInstance(122901)) == null)) {
c.getPlayer().setParty(party);
partyService.updateParty(party.getId(), PartyOperation.加入队伍, partyPlayer);
c.getPlayer().receivePartyMemberHP();
c.getPlayer().updatePartyMemberHP();
} else {
c.getPlayer().dropMessage(5, "组队成员已满");
}
} else {
c.getPlayer().dropMessage(5, "要加入的队伍不存在");
}
} else {
c.getPlayer().dropMessage(5, "您已经有一个组队,无法加入其他组队!");
}
break;
case 4:
if (party == null) {
party = partyService.createParty(partyPlayer, false, c.getPlayer().getName() + "的组队");
c.getPlayer().setParty(party);
c.getSession().write(PartyPacket.partyCreated(party));
}
String theName = slea.readMapleAsciiString();
int theCh = WorldFindService.getInstance().findChannel(theName);
if (theCh > 0) {
MapleCharacter invited = ChannelServer.getInstance(theCh).getPlayerStorage().getCharacterByName(theName);
if (invited != null) {
if (party.getExpeditionId() > 0) {
c.getPlayer().dropMessage(5, "加入远征队伍的状态下无法进行此操作。");
} else if (invited.getParty() != null) {
c.getPlayer().dropMessage(5, new StringBuilder().append("'").append(theName).append("'已经加入其他组。").toString());
} else if (invited.getQuestNoAdd(MapleQuest.getInstance(122901)) != null) {
c.getPlayer().dropMessage(5, new StringBuilder().append("'").append(theName).append("'玩家处于拒绝组队状态。").toString());
} else if (party.getMembers().size() < 6) {
c.getSession().write(PartyPacket.partyStatusMessage(0x20, invited.getName()));//0x1F+1 119ok
invited.getClient().getSession().write(PartyPacket.partyInvite(c.getPlayer()));
} else {
c.getPlayer().dropMessage(5, "组队成员已满");
}
} else {
c.getPlayer().dropMessage(5, new StringBuilder().append("在当前服务器找不到..'").append(theName).append("'。").toString());
}
} else {
c.getPlayer().dropMessage(5, new StringBuilder().append("在当前服务器找不到..'").append(theName).append("'。").toString());
}
break;
case 6:
if ((party == null) || (!partyPlayer.equals(party.getLeader()))) {
break;
}
if (party.getExpeditionId() > 0) {
c.getPlayer().dropMessage(5, "加入远征队伍的状态下无法进行此操作。");
return;
}
MaplePartyCharacter expelled = party.getMemberById(slea.readInt());
if (expelled != null) {
partyService.updateParty(party.getId(), PartyOperation.驱逐成员, expelled);
if ((c.getPlayer().getEventInstance() != null)
&& (expelled.isOnline())) {
c.getPlayer().getEventInstance().disbandParty();
}
}
break;
case 7:
if (party == null) {
break;
}
if (party.getExpeditionId() > 0) {
c.getPlayer().dropMessage(5, "加入远征队伍的状态下无法进行此操作。");
return;
}
MaplePartyCharacter newleader = party.getMemberById(slea.readInt());
if ((newleader != null) && (partyPlayer.equals(party.getLeader()))) {
partyService.updateParty(party.getId(), PartyOperation.改变队长, newleader);
}
break;
case 8:
if (party != null) {
if ((c.getPlayer().getEventInstance() != null) || (party.getExpeditionId() > 0)) {
c.getPlayer().dropMessage(5, "加入远征队伍的状态下无法进行此操作。");
return;
}
if (partyPlayer.equals(party.getLeader())) {
partyService.updateParty(party.getId(), PartyOperation.解散队伍, partyPlayer);
} else {
partyService.updateParty(party.getId(), PartyOperation.离开队伍, partyPlayer);
}
c.getPlayer().setParty(null);
}
int toPartyId = slea.readInt();
if (party == null) {
party = partyService.getParty(toPartyId);
if ((party != null) && (party.getMembers().size() < 6)) {
if (party.getExpeditionId() > 0) {
c.getPlayer().dropMessage(5, "加入远征队伍的状态下无法进行此操作。");
return;
}
MapleCharacter cfrom = c.getPlayer().getMap().getCharacterById(party.getLeader().getId());
if ((cfrom != null) && (cfrom.getQuestNoAdd(MapleQuest.getInstance(122900)) == null)) {
c.getSession().write(PartyPacket.partyStatusMessage(0x42, c.getPlayer().getName()));//0x41+1 119ok
cfrom.getClient().getSession().write(PartyPacket.partyRequestInvite(c.getPlayer()));
} else {
c.getPlayer().dropMessage(5, "没有在该地图找此队伍的队长.");
}
} else {
c.getPlayer().dropMessage(5, "要加入的队伍不存在或者人数已满");
}
} else {
c.getPlayer().dropMessage(5, "无法找到组队。请重新确认组队信息。");
}
break;
case 9:
if (slea.readByte() > 0) {
c.getPlayer().getQuestRemove(MapleQuest.getInstance(122900));
} else {
c.getPlayer().getQuestNAdd(MapleQuest.getInstance(122900));
}
break;
case 13:
if (party == null) {
break;
}
boolean 非公开组队 = slea.readByte() == 1;
String 组队名称 = slea.readMapleAsciiString();
c.getPlayer().getParty().setName(组队名称);
c.getPlayer().getParty().set非公开组队(非公开组队);
partyService.updateParty(c.getPlayer().getParty().getId(), PartyOperation.更新信息, partyPlayer);
break;
case 5:
default:
if (!ServerProperties.ShowPacket()) {
break;
}
FileoutputUtil.log(new StringBuilder().append("组队邀请处理( ").append(operation).append(" ) 未知.").toString());
}
}
public static void AllowPartyInvite(SeekableLittleEndianAccessor slea, MapleClient c) {
if (slea.readByte() > 0) {
c.getPlayer().getQuestRemove(MapleQuest.getInstance(122901));
} else {
c.getPlayer().getQuestNAdd(MapleQuest.getInstance(122901));
}
}
public static void DenySidekickRequest(SeekableLittleEndianAccessor slea, MapleClient c) {
int action = slea.readByte();
int cid = slea.readInt();
if ((c.getPlayer().getSidekick() == null) && (action == 90)) {
MapleCharacter party = c.getPlayer().getMap().getCharacterById(cid);
if (party != null) {
if ((party.getSidekick() != null) || (!MapleSidekick.checkLevels(c.getPlayer().getLevel(), party.getLevel()))) {
return;
}
int sid = WorldSidekickService.getInstance().createSidekick(c.getPlayer().getId(), party.getId());
if (sid <= 0) {
c.getPlayer().dropMessage(5, "Please try again.");
} else {
MapleSidekick s = WorldSidekickService.getInstance().getSidekick(sid);
c.getPlayer().setSidekick(s);
c.getSession().write(PartyPacket.updateSidekick(c.getPlayer(), s, true));
party.setSidekick(s);
party.getClient().getSession().write(PartyPacket.updateSidekick(party, s, true));
}
} else {
c.getPlayer().dropMessage(5, "The sidekick you are trying to join does not exist");
}
}
}
public static void SidekickOperation(SeekableLittleEndianAccessor slea, MapleClient c) {
int operation = slea.readByte();
switch (operation) {
case 65:
if (c.getPlayer().getSidekick() != null) {
break;
}
MapleCharacter other = c.getPlayer().getMap().getCharacterByName(slea.readMapleAsciiString());
if ((other.getSidekick() == null) && (MapleSidekick.checkLevels(c.getPlayer().getLevel(), other.getLevel()))) {
other.getClient().getSession().write(PartyPacket.sidekickInvite(c.getPlayer()));
c.getPlayer().dropMessage(1, new StringBuilder().append("You have sent the sidekick invite to ").append(other.getName()).append(".").toString());
}
break;
case 63:
if (c.getPlayer().getSidekick() == null) {
break;
}
c.getPlayer().getSidekick().eraseToDB();
}
}
public static void MemberSearch(SeekableLittleEndianAccessor slea, MapleClient c) {
if ((c.getPlayer().isInBlockedMap()) || (FieldLimitType.VipRock.check(c.getPlayer().getMap().getFieldLimit()))) {
c.getPlayer().dropMessage(5, "无法在这个地方进行搜索。");
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
List members = new ArrayList();
for (MapleCharacter chr : c.getPlayer().getMap().getCharactersThreadsafe()) {
if (chr.getId() != c.getPlayer().getId() && chr.getParty() == null && chr.getGMLevel() <= c.getPlayer().getGMLevel()) {
members.add(chr);
}
}
c.getSession().write(PartyPacket.showMemberSearch(members));
}
public static void PartySearch(SeekableLittleEndianAccessor slea, MapleClient c) {
if ((c.getPlayer().isInBlockedMap()) || (FieldLimitType.VipRock.check(c.getPlayer().getMap().getFieldLimit()))) {
c.getPlayer().dropMessage(5, "无法在这个地方进行搜索。");
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
List parties = new ArrayList();
for (MapleCharacter chr : c.getPlayer().getMap().getCharactersThreadsafe()) {
if (chr.getParty() != null && !parties.contains(chr.getParty()) && chr.getParty().is非公开组队()) {
if (c.getPlayer().getParty() != null && chr.getParty().getId() == c.getPlayer().getParty().getId()) {
continue;
}
parties.add(chr.getParty());
}
}
c.getSession().write(PartyPacket.showPartySearch(parties));
}
}