package tools.packet; import client.MapleCharacter; import handling.SendPacketOpcode; import handling.world.PartyOperation; import handling.world.WrodlPartyService; 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 handling.world.sidekick.MapleSidekickCharacter; import java.awt.Point; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import server.ServerProperties; import tools.data.output.MaplePacketLittleEndianWriter; public class PartyPacket { private static final Logger log = Logger.getLogger(PartyPacket.class); public static byte[] partyCreated(MapleParty party) {//创建组队 MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.PARTY_OPERATION.getValue()); mplew.write(0x07);//0x0E+1 119ok for (int i = 0; i < 5; i++) { if (i >= 0 && i <= 2) mplew.writeInt(1); else if (i >= 3 && i <= 4) mplew.writeShort(1); } return mplew.getPacket(); } public static byte[] partyInvite(MapleCharacter from) {//组队邀请 MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.PARTY_OPERATION.getValue()); mplew.write(0x4);//0x5是随机邀请 mplew.writeInt(from.getParty() == null ? 0 : from.getParty().getId()); mplew.writeMapleAsciiString(from.getName()); return mplew.getPacket(); } public static byte[] partyRequestInvite(MapleCharacter from) {//邀请反馈 MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.PARTY_OPERATION.getValue()); mplew.write(0x08);//0x08+0 119ok mplew.writeInt(from.getId()); mplew.writeMapleAsciiString(from.getName()); mplew.writeInt(from.getLevel()); mplew.writeInt(from.getJob()); mplew.writeInt(0); return mplew.getPacket(); } public static byte[] partyStatusMessage(int message) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.PARTY_OPERATION.getValue()); mplew.write(message); return mplew.getPacket(); } public static byte[] partyStatusMessage(int message, String charName) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.PARTY_OPERATION.getValue()); mplew.write(message); mplew.writeMapleAsciiString(charName); return mplew.getPacket(); } public static byte[] partyStatusMessage(String message) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.SPOUSE_MESSAGE.getValue()); mplew.writeShort(11); mplew.writeMapleAsciiString(message); return mplew.getPacket(); } private static void addPartyStatus(int forchannel, MapleParty party, MaplePacketLittleEndianWriter mplew, boolean leaving) { addPartyStatus(forchannel, party, mplew, leaving, false); } private static void addPartyStatus(int forchannel, MapleParty party, MaplePacketLittleEndianWriter mplew, boolean leaving, boolean exped) { List<MaplePartyCharacter> partymembers; if (party == null) { partymembers = new ArrayList(); } else { partymembers = new ArrayList(party.getMembers()); } while (partymembers.size() < 6) { partymembers.add(new MaplePartyCharacter()); } for (MaplePartyCharacter partychar : partymembers) { mplew.writeInt(partychar.getId()); } for (MaplePartyCharacter partychar : partymembers) { mplew.writeAsciiString(partychar.getName(), 0x13); } for (MaplePartyCharacter partychar : partymembers) { if (partychar.isOnline()) { // This handles the Map IDs, but in v40 beta if you're // not on the same map, the player appears offline. We // have to eventually find a workaround for this. mplew.writeInt(partychar.getMapid()); } else { mplew.writeInt(-2); } } mplew.writeInt(party == null ? 0 : party.getLeader().getId()); for (MaplePartyCharacter partychar : partymembers) { if (partychar.isOnline()) { mplew.writeInt(partychar.getChannel() - 1); } else { mplew.writeInt(-2); } } for (MaplePartyCharacter partychar : partymembers) { if ((partychar.getChannel() == forchannel) && (!leaving)) { mplew.writeInt(partychar.getDoorTown()); mplew.writeInt(partychar.getDoorTarget()); mplew.writeInt(partychar.getDoorPosition().x); mplew.writeInt(partychar.getDoorPosition().y); } else { mplew.writeInt(leaving ? 999999999 : 0); mplew.writeInt(leaving ? 999999999 : 0); mplew.writeInt(leaving ? -1 : 0); mplew.writeInt(leaving ? -1 : 0); } } } public static byte[] updateParty(int forChannel, MapleParty party, PartyOperation op, MaplePartyCharacter target) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.PARTY_OPERATION.getValue()); switch (op) { case 离开队伍: case 驱逐成员: case 解散队伍: mplew.write(0xB);//0x13+1 119ok mplew.writeInt(party.getId()); mplew.writeInt(target.getId()); if (op == PartyOperation.解散队伍) { mplew.write(0); } else { mplew.write(1); mplew.write(op == PartyOperation.驱逐成员 ? 1 : 0); mplew.writeMapleAsciiString(target.getName()); addPartyStatus(forChannel, party, mplew, op == PartyOperation.离开队伍); } break; case 加入队伍: mplew.write(0xE);//0x16+1 119ok mplew.writeInt(party.getId()); mplew.writeMapleAsciiString(target.getName()); addPartyStatus(forChannel, party, mplew, false); break; case 更新队伍: case LOG_ONOFF: mplew.write(op == PartyOperation.LOG_ONOFF ? 0x38 : 0x0E);//0x37+1|0x0D+1 119ok mplew.writeInt(party.getId()); addPartyStatus(forChannel, party, mplew, op == PartyOperation.LOG_ONOFF); break; case 更新信息: mplew.write(0x4C);//new 119ok mplew.writeBool(party.is非公开组队()); mplew.writeMapleAsciiString(new String[]{party.getName(), null, null, null}); break; case 改变队长: case CHANGE_LEADER_DC: mplew.write(0x2F);//0x2E+1 119ok mplew.writeInt(target.getId()); mplew.write(op == PartyOperation.CHANGE_LEADER_DC ? 1 : 0); } return mplew.getPacket(); } public static byte[] partyPortal(int townId, int targetId, int skillId, Point position, boolean animation) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.PARTY_OPERATION.getValue()); mplew.writeShort(0x1A); mplew.writeInt(townId); mplew.writeInt(targetId); mplew.writePos(position); return mplew.getPacket(); } public static byte[] updatePartyMemberHP(int chrId, int curhp, int maxhp) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.UPDATE_PARTYMEMBER_HP.getValue()); mplew.writeInt(chrId); mplew.writeInt(curhp); mplew.writeInt(maxhp); return mplew.getPacket(); } public static byte[] getPartyListing(PartySearchType pst) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.PARTY_OPERATION.getValue()); mplew.write(108); mplew.writeInt(pst.id); List<PartySearch> parties = WrodlPartyService.getInstance().searchParty(pst); mplew.writeInt(parties.size()); for (PartySearch party : parties) { if (pst.exped) { MapleExpedition me = WrodlPartyService.getInstance().getExped(party.getId()); mplew.writeInt(party.getId()); mplew.writeAsciiString(party.getName(), 37); mplew.writeInt(pst.id); mplew.writeInt(0); for (int i = 0; i < 5; i++) { if (i < me.getParties().size()) { MapleParty part = WrodlPartyService.getInstance().getParty((me.getParties().get(i)).intValue()); if (part != null) { addPartyStatus(-1, part, mplew, false, true); } else { mplew.writeZero(226); } } else { mplew.writeZero(226); } } } else { mplew.writeInt(party.getId()); mplew.writeAsciiString(party.getName(), 37); addPartyStatus(-1, WrodlPartyService.getInstance().getParty(party.getId()), mplew, false, true); } } return mplew.getPacket(); } public static byte[] partyListingAdded(PartySearch ps) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.PARTY_OPERATION.getValue()); mplew.write(106); mplew.writeInt(ps.getType().id); if (ps.getType().exped) { MapleExpedition me = WrodlPartyService.getInstance().getExped(ps.getId()); mplew.writeInt(ps.getId()); mplew.writeAsciiString(ps.getName(), 37); mplew.writeInt(ps.getType().id); mplew.writeInt(0); for (int i = 0; i < 5; i++) { if (i < me.getParties().size()) { MapleParty party = WrodlPartyService.getInstance().getParty((me.getParties().get(i)).intValue()); if (party != null) { addPartyStatus(-1, party, mplew, false, true); } else { mplew.writeZero(226); } } else { mplew.writeZero(226); } } } else { mplew.writeInt(ps.getId()); mplew.writeAsciiString(ps.getName(), 37); addPartyStatus(-1, WrodlPartyService.getInstance().getParty(ps.getId()), mplew, false, true); } return mplew.getPacket(); } public static byte[] removePartySearch(PartySearch ps) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.PARTY_OPERATION.getValue()); mplew.write(107); mplew.writeInt(ps.getType().id); mplew.writeInt(ps.getId()); mplew.writeInt(2); return mplew.getPacket(); } public static byte[] showMemberSearch(List<MapleCharacter> players) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.MEMBER_SEARCH.getValue()); mplew.write(players.size()); for (MapleCharacter chr : players) { mplew.writeInt(chr.getId()); mplew.writeMapleAsciiString(chr.getName()); mplew.writeInt(chr.getJob()); mplew.write(chr.getLevel()); } return mplew.getPacket(); } public static byte[] showPartySearch(List<MapleParty> partylist) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.PARTY_SEARCH.getValue()); mplew.write(partylist.size()); for (MapleParty party : partylist) { mplew.writeInt(party.getId()); mplew.writeMapleAsciiString(party.getLeader().getName()); mplew.write(party.getLeader().getLevel()); mplew.write(party.getLeader().isOnline() ? 1 : 0); mplew.writeMapleAsciiString(new String[]{party.getName(), null, null, null}); mplew.write(party.getMembers().size()); for (MaplePartyCharacter partyChr : party.getMembers()) { mplew.writeInt(partyChr.getId()); mplew.writeMapleAsciiString(partyChr.getName()); mplew.writeInt(partyChr.getJobId()); mplew.write(partyChr.getLevel()); mplew.write(partyChr.isOnline() ? 1 : 0); } } return mplew.getPacket(); } public static byte[] sidekickInvite(MapleCharacter from) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.SIDEKICK_OPERATION.getValue()); mplew.write(65); mplew.writeInt(from.getId()); mplew.writeMapleAsciiString(from.getName()); mplew.writeInt(from.getLevel()); mplew.writeInt(from.getJob()); mplew.writeInt(0); mplew.write(0); return mplew.getPacket(); } public static byte[] disbandSidekick(MapleSidekick s) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.SIDEKICK_OPERATION.getValue()); mplew.write(75); mplew.writeInt(s.getId()); mplew.writeInt(s.getCharacter(0).getId()); mplew.write(0); mplew.writeInt(s.getCharacter(1).getId()); return mplew.getPacket(); } public static byte[] updateSidekick(MapleCharacter first, MapleSidekick s, boolean f) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.SIDEKICK_OPERATION.getValue()); mplew.write(f ? 0x4E : 0x46); MapleSidekickCharacter second = s.getCharacter(s.getCharacter(0).getId() == first.getId() ? 1 : 0); boolean online = first.getMap().getCharacterById(second.getId()) != null; mplew.writeInt(s.getId()); if (f) { mplew.writeMapleAsciiString(second.getName()); } List<String> msg = s.getSidekickMsg(online); mplew.writeInt(msg.size()); for (String m : msg) { mplew.writeMapleAsciiString(m); } mplew.writeInt(first.getId()); mplew.writeInt(second.getId()); mplew.writeAsciiString(first.getName(), 13); mplew.writeAsciiString(second.getName(), 13); mplew.writeInt(first.getJob()); mplew.writeInt(second.getJobId()); mplew.writeInt(first.getLevel()); mplew.writeInt(second.getLevel()); mplew.writeInt(first.getClient().getChannel() - 1); mplew.writeInt(online ? first.getClient().getChannel() - 1 : 0); mplew.writeLong(0L); mplew.writeInt(first.getId()); if (f) { mplew.writeInt(first.getId()); } mplew.writeInt(second.getId()); if (!f) { mplew.writeInt(first.getId()); } mplew.writeInt(first.getMapId()); mplew.writeInt(online ? first.getMapId() : 999999999); mplew.writeInt(1); mplew.write(Math.abs(first.getLevel() - second.getLevel())); mplew.writeInt(0); mplew.writeInt(0); mplew.writeInt(2147483647); mplew.writeInt(1); return mplew.getPacket(); } }