package tools.packet; import client.MapleCharacter; import client.MapleStat; import client.inventory.Item; import client.inventory.MaplePet; import handling.SendPacketOpcode; import java.awt.Point; import java.util.List; import server.movement.LifeMovementFragment; import tools.data.output.MaplePacketLittleEndianWriter; public class PetPacket { /** * 召唤宠物更新道具栏道具状态 * @param pet * @param item * @param active * @return */ public static byte[] updatePet(MaplePet pet, Item item, boolean active) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.MODIFY_INVENTORY_ITEM.getValue()); mplew.write(0); mplew.write(1); // 道具数量+1? mplew.write(3); mplew.write(pet.getType()); // 1-5之间 mplew.writeShort(pet.getInventoryPosition()); // 位置 mplew.writeShort(pet.getInventoryPosition()); PacketHelper.addItemInfo(mplew, item); return mplew.getPacket(); } public static byte[] showPetPickUpMsg(boolean canPickup, int pets) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.PET_PICKUP_MSG.getValue()); mplew.write(canPickup ? 1 : 0); mplew.write(pets); return mplew.getPacket(); } public static byte[] showPetAutoEatMsg() { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.PET_AUTO_EAT_MSG.getValue()); return mplew.getPacket(); } public static byte[] showPet(MapleCharacter chr, MaplePet pet, boolean remove, boolean hunger) { return showPet(chr, pet, remove, hunger, false); } /** * 召唤宠物 * @param chr * @param pet * @param remove * @param hunger * @param show * @return */ public static byte[] showPet(MapleCharacter chr, MaplePet pet, boolean remove, boolean hunger, boolean show) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); // mplew.write(show ? SendPacketOpcode.SHOW_PET.getValue() : SendPacketOpcode.SPAWN_PET.getValue()); mplew.write(SendPacketOpcode.SPAWN_PET.getValue()); mplew.writeInt(chr.getId()); mplew.write(remove ? 0 : 1); if (!remove) { addPetInfo(mplew, chr, pet, false); } else { mplew.write(hunger ? 1 : 0); // 1-肚子饿回家了;2-宠物到期变成娃娃 } return mplew.getPacket(); } /** * 添加宠物信息 * @param mplew * @param chr * @param pet * @param showpet */ public static void addPetInfo(MaplePacketLittleEndianWriter mplew, MapleCharacter chr, MaplePet pet, boolean showpet) { if (showpet) { mplew.write(1); } mplew.writeInt(pet.getPetItemId()); mplew.writeMapleAsciiString(pet.getName()); mplew.writeLong(pet.getUniqueId()); mplew.writePos(pet.getPos()); mplew.write(pet.getStance()); mplew.writeShort(pet.getFh()); // 宠物饥饿度? } /** * 宠物移动 * @param chrId * @param slot * @param startPos * @param moves * @return */ public static byte[] movePet(int chrId, int slot, Point startPos, List<LifeMovementFragment> moves) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.MOVE_PET.getValue()); mplew.writeInt(chrId); PacketHelper.serializeMovementList(mplew, moves); mplew.write(0); // 防止38,囧 return mplew.getPacket(); } public static byte[] petChat(int chaId, int un, String text, byte slot) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.PET_CHAT.getValue()); mplew.writeInt(chaId); mplew.writeInt(slot); mplew.writeShort(un); mplew.writeMapleAsciiString(text); return mplew.getPacket(); } public static byte[] commandResponse(int chrId, byte command, boolean success, boolean food) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.PET_COMMAND.getValue()); mplew.writeInt(chrId); mplew.write(food ? 2 : 1); if (food) { mplew.write(success ? 1 : 0); mplew.writeInt(0); } else { mplew.write(command); mplew.writeShort(0); } return mplew.getPacket(); } public static byte[] showOwnPetLevelUp() { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.SHOW_SPECIAL_EFFECT.getValue()); mplew.write(0x7); mplew.write(0); mplew.writeZero(3); return mplew.getPacket(); } public static byte[] showPetLevelUp(MapleCharacter chr) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.SHOW_FOREIGN_EFFECT.getValue()); mplew.writeInt(chr.getId()); mplew.write(6); mplew.write(0); mplew.writeZero(3); return mplew.getPacket(); } public static byte[] loadExceptionList(MapleCharacter chr, MaplePet pet) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.PET_EXCEPTION_LIST.getValue()); mplew.writeInt(chr.getId()); mplew.writeInt(0); mplew.writeLong(pet.getUniqueId()); List excluded = pet.getExcluded(); mplew.write(excluded.size()); for (Object excluded1 : excluded) { mplew.writeInt(((Integer) excluded1)); } return mplew.getPacket(); } public static byte[] petStatUpdate(MapleCharacter chr) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.write(SendPacketOpcode.UPDATE_STATS.getValue()); mplew.write(0); mplew.writeLong(MapleStat.宠物.getValue()); MaplePet pets = chr.getSpawnPets(); if (pets != null) { mplew.writeLong(pets.getUniqueId()); } else { mplew.writeLong(0L); } mplew.write(0); mplew.writeShort(0); return mplew.getPacket(); } }