package javastory.channel.handling; import java.rmi.RemoteException; import javastory.channel.ChannelCharacter; import javastory.channel.ChannelClient; import javastory.channel.ChannelServer; import javastory.channel.Party; import javastory.channel.PartyMember; import javastory.io.PacketFormatException; import javastory.io.PacketReader; import javastory.rmi.WorldChannelInterface; import javastory.tools.packets.ChannelPackets; import javastory.world.core.PartyOperation; public class PartyHandler { public static void handleDenyPartyInvitation(final PacketReader reader, final ChannelClient c) throws PacketFormatException { final int action = reader.readByte(); final int partyid = reader.readInt(); final ChannelCharacter player = c.getPlayer(); final PartyMember member = player.getPartyMembership(); if (member == null) { player.sendNotice(5, "You can't join the party as you are already in one"); return; } try { final WorldChannelInterface wci = ChannelServer.getWorldInterface(); final Party party = wci.getParty(partyid); if (party == null) { player.sendNotice(5, "The party you are trying to join does not exist"); return; } switch (action) { case 0x1B: // accept if (party.getMembers().size() < 6) { wci.updateParty(partyid, PartyOperation.JOIN, new PartyMember(partyid, player)); player.receivePartyMemberHP(); player.updatePartyMemberHP(); } else { c.write(ChannelPackets.partyStatusMessage(17)); } break; case 0x16: break; default: final ChannelCharacter cfrom = ChannelServer.getPlayerStorage().getCharacterById(party.getLeader().getCharacterId()); if (cfrom != null) { cfrom.getClient().write(ChannelPackets.partyStatusMessage(23, player.getName())); } break; } } catch (final RemoteException e) { ChannelServer.pingWorld(); } } public static void handlePartyOperation(final PacketReader reader, final ChannelClient c) throws PacketFormatException { final int operation = reader.readByte(); final WorldChannelInterface wci = ChannelServer.getWorldInterface(); final ChannelCharacter player = c.getPlayer(); PartyMember member = player.getPartyMembership(); switch (operation) { case 1: // create if (member == null) { try { final Party party = wci.createParty(); member = player.setPartyMembership(party.getId()); party.addMember(member); } catch (final RemoteException e) { ChannelServer.pingWorld(); } c.write(ChannelPackets.partyCreated()); } else { player.sendNotice(5, "You can't create a party as you are already in one."); } break; case 2: // leave if (member != null) { // are we in a party? o.O" try { if (member.isLeader()) { // disband wci.updateParty(member.getPartyId(), PartyOperation.DISBAND, member); if (player.getEventInstance() != null) { player.getEventInstance().disbandParty(); } } else { wci.updateParty(member.getPartyId(), PartyOperation.LEAVE, member); if (player.getEventInstance() != null) { player.getEventInstance().leftParty(player); } } } catch (final RemoteException e) { ChannelServer.pingWorld(); } player.setParty(null); } break; case 3: // accept invitation final int partyId = reader.readInt(); if (!player.hasParty()) { try { final Party party = wci.getParty(partyId); if (party != null) { if (party.getMembers().size() < 6) { member = player.setPartyMembership(partyId); wci.updateParty(party.getId(), PartyOperation.JOIN, member); player.receivePartyMemberHP(); player.updatePartyMemberHP(); } else { c.write(ChannelPackets.partyStatusMessage(17)); } } else { player.sendNotice(5, "The party you are trying to join does not exist"); } } catch (final RemoteException e) { ChannelServer.pingWorld(); } } else { player.sendNotice(5, "You can't join the party as you are already in one"); } break; case 4: // invite // TODO store pending invitations and check against them final String name = reader.readLengthPrefixedString(); final ChannelCharacter inviter = ChannelServer.getPlayerStorage().getCharacterByName(name); if (inviter != null && inviter.getWorldId() == c.getWorldId()) { final PartyMember inviterMember = inviter.getPartyMembership(); if (inviterMember != null) { try { final Party party = ChannelServer.getWorldInterface().getParty(inviterMember.getPartyId()); if (party.getMembers().size() < 6) { c.write(ChannelPackets.partyStatusMessage(22, inviter.getName())); inviter.getClient().write(ChannelPackets.partyInvite(player)); } else { c.write(ChannelPackets.partyStatusMessage(17)); } } catch (final RemoteException ex) { player.sendNotice(5, "There was a problem connecting to the world server."); } } else { c.write(ChannelPackets.partyStatusMessage(16)); } } else { c.write(ChannelPackets.partyStatusMessage(19)); } break; case 5: // expel if (member.isLeader()) { try { final Party party = ChannelServer.getWorldInterface().getParty(member.getPartyId()); final PartyMember expelled = party.getMemberById(reader.readInt()); if (expelled != null) { wci.updateParty(party.getId(), PartyOperation.EXPEL, expelled); if (player.getEventInstance() != null) { /* * if leader wants to boot someone, then the whole * party gets expelled TODO: Find an easier way to * get the character behind a MaplePartyCharacter * possibly remove just the expellee. */ if (expelled.isOnline()) { player.getEventInstance().disbandParty(); } } } } catch (final RemoteException e) { ChannelServer.pingWorld(); } } break; case 6: // change leader try { final Party party = ChannelServer.getWorldInterface().getParty(member.getPartyId()); final PartyMember newleader = party.getMemberById(reader.readInt()); wci.updateParty(party.getId(), PartyOperation.CHANGE_LEADER, newleader); } catch (final RemoteException e) { ChannelServer.pingWorld(); } break; default: System.out.println("Unhandled Party function." + operation + ""); break; } } }