package tools.packet;
import client.MapleCharacter;
import client.MapleStat;
import client.inventory.Item;
import client.inventory.MaplePet;
import constants.ServerConfig;
import handling.SendPacketOpcode;
import java.awt.Point;
import java.util.List;
import server.movement.LifeMovementFragment;
import tools.data.MaplePacketLittleEndianWriter;
public class PetPacket {
public static final byte[] updatePet(MaplePet pet, Item item, boolean active) {
if (ServerConfig.LOG_PACKETS) {
System.out.println("調用位置: " + new java.lang.Throwable().getStackTrace()[0]);
}
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.INVENTORY_OPERATION.getValue());
mplew.write(0);
mplew.write(2);
mplew.write(0);
mplew.write(3);
mplew.write(5);
mplew.writeShort(pet.getInventoryPosition());
mplew.write(0);
mplew.write(5);
mplew.writeShort(pet.getInventoryPosition());
mplew.write(3);
mplew.writeInt(pet.getPetItemId());
mplew.write(1);
mplew.writeLong(pet.getUniqueId());
PacketHelper.addPetItemInfo(mplew, item, pet, active);
return mplew.getPacket();
}
public static final byte[] showPet(MapleCharacter chr, MaplePet pet, boolean remove, boolean hunger) {
return showPet(chr, pet, remove, hunger, false);
}
public static final byte[] showPet(MapleCharacter chr, MaplePet pet, boolean remove, boolean hunger, boolean show) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(show ? SendPacketOpcode.SHOW_PET.getValue() : SendPacketOpcode.SPAWN_PET.getValue());
mplew.writeInt(chr.getId());
mplew.writeInt(chr.getPetIndex(pet));
mplew.write(remove ? 0 : 1);
mplew.write(hunger ? 1 : 0);
if (!remove) {
addPetInfo(mplew, chr, pet, false);
}
return mplew.getPacket();
}
public static final byte[] removePet(int cid, int index) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SPAWN_PET.getValue());
mplew.writeInt(cid);
mplew.writeInt(index);
mplew.writeShort(0);
return mplew.getPacket();
}
public static byte[] movePet(int cid, int pid, byte slot, Point pos, List<LifeMovementFragment> moves) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.MOVE_PET.getValue());
mplew.writeInt(cid);
mplew.writeInt(slot);
mplew.writeInt(0);
mplew.writePos(pos);
mplew.writeInt(pid);
PacketHelper.serializeMovementList(mplew, moves);
return mplew.getPacket();
}
public static byte[] petChat(int cid, int un, String text, byte slot) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.PET_CHAT.getValue());
mplew.writeInt(cid);
mplew.writeInt(slot);
mplew.write(un);
mplew.write(0);
mplew.writeMapleAsciiString(text);
return mplew.getPacket();
}
public static byte[] petColor(int cid, byte slot, int color) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.PET_COLOR.getValue());
mplew.writeInt(cid);
mplew.write(slot);
mplew.writeInt(color);
return mplew.getPacket();
}
public static final byte[] commandResponse(int cid, byte command, byte slot, boolean success, boolean food) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.PET_COMMAND.getValue());
mplew.writeInt(cid);
mplew.writeInt(slot);
mplew.write(command == 1 ? 2 : 1);
if (command != 1) {
mplew.write(command);
mplew.write(success ? 1 : 0);
mplew.write(0);
} else {
mplew.write(1);
mplew.writeInt(0);
}
return mplew.getPacket();
}
public static final byte[] petSize(int cid, byte slot, short size) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.PET_SIZE.getValue());
mplew.writeInt(cid);
mplew.writeInt(slot);
mplew.writeShort(size);
mplew.write(0);
mplew.write(0);
return mplew.getPacket();
}
public static final byte[] showPetUpdate(MapleCharacter chr, int uniqueId, byte index) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.PET_EXCEPTION_LIST.getValue());
mplew.writeInt(chr.getId());
mplew.writeInt(index);
mplew.writeLong(uniqueId);
mplew.write(0); // > 0 => + [Int]
return mplew.getPacket();
}
public static byte[] petStatUpdate(MapleCharacter chr) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.UPDATE_STATS.getValue());
mplew.write(0);
mplew.writeLong(MapleStat.PET.getValue());
byte count = 0;
for (MaplePet pet : chr.getPets()) {
if (pet.getSummoned()) {
mplew.writeLong(pet.getUniqueId());
count = (byte) (count + 1);
}
}
while (count < 3) {
mplew.writeZeroBytes(8);
count = (byte) (count + 1);
}
mplew.write(0);
mplew.writeShort(0);
mplew.writeZeroBytes(100);
return mplew.getPacket();
}
public static void addPetInfo(MaplePacketLittleEndianWriter mplew, MapleCharacter chr, MaplePet pet, boolean showpet) {
if (showpet) {
mplew.write(1);
mplew.writeInt(chr.getPetIndex(pet));
}
mplew.writeInt(pet.getPetItemId());
mplew.writeMapleAsciiString(pet.getName());
mplew.writeLong(pet.getUniqueId());
mplew.writePos(pet.getPos());
mplew.write(pet.getStance());
mplew.writeShort(pet.getFh());
mplew.writeInt(-1);
mplew.writeShort(100);
mplew.write(0);
mplew.write(0);
}
public static void addPet(MaplePacketLittleEndianWriter mplew, MapleCharacter chr, MaplePet pet) {
if (pet.getPetItemId() == 0) {
mplew.writeInt(0);
} else {
mplew.writeInt(pet.getPetItemId());
}
}
public static byte[] showPetPickUpMsg(boolean canPickup, int pets) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.USE_CASH_PET_SKILL.getValue());
mplew.write(canPickup ? 1 : 0);
mplew.write(pets);
return mplew.getPacket();
}
}