package javastory.channel.packet;
import java.util.List;
import javastory.channel.ChannelCharacter;
import javastory.channel.client.Pet;
import javastory.channel.movement.LifeMovementFragment;
import javastory.game.Stat;
import javastory.io.GamePacket;
import javastory.io.PacketBuilder;
import javastory.server.handling.ServerPacketOpcode;
import javastory.tools.FiletimeUtil;
import javastory.tools.HexTool;
public class PetPacket {
public static final GamePacket updatePet(final Pet pet, final boolean alive) {
final PacketBuilder builder = new PacketBuilder();
builder.writeAsShort(ServerPacketOpcode.MODIFY_INVENTORY_ITEM.getValue());
builder.writeAsByte(0);
builder.writeAsByte(2);
builder.writeAsByte(3);
builder.writeAsByte(5);
final short inventoryPosition = pet.getInventoryPosition();
builder.writeAsByte(inventoryPosition);
builder.writeAsShort(0);
builder.writeAsByte(5);
builder.writeAsByte(inventoryPosition);
builder.writeAsByte(0);
builder.writeAsByte(3);
builder.writeInt(pet.getPetItemId());
builder.writeAsByte(1);
builder.writeInt(pet.getUniqueId());
builder.writeInt(0);
builder.writeBytes(HexTool.getByteArrayFromHexString("00 80 F9 58 8D 3B C7 24"));
builder.writePaddedString(pet.getName(), 13);
builder.writeAsByte(pet.getLevel());
builder.writeAsShort(pet.getCloseness());
builder.writeAsByte(pet.getFullness());
long expiration;
if (alive) {
expiration = FiletimeUtil.getFiletime(System.currentTimeMillis());
} else {
expiration = FiletimeUtil.ITEM_EXPIRATION;
}
builder.writeLong(expiration);
builder.writeAsShort(0);
builder.writeInt(1);
builder.writeInt(0);
builder.writeZeroBytes(5);
return builder.getPacket();
}
public static final GamePacket showPet(final ChannelCharacter chr, final Pet pet) {
final PacketBuilder builder = new PacketBuilder();
builder.writeAsShort(ServerPacketOpcode.SPAWN_PET.getValue());
builder.writeInt(chr.getId());
builder.writeByte(chr.getPetIndex(pet));
builder.writeAsByte(1);
builder.writeAsByte(1);
builder.writeInt(pet.getPetItemId());
builder.writeLengthPrefixedString(pet.getName());
builder.writeInt(pet.getUniqueId());
builder.writeInt(0);
builder.writeAsShort(pet.getPosition().x);
builder.writeAsShort(pet.getPosition().y - 20);
builder.writeAsByte(pet.getStance());
builder.writeInt(pet.getFoothold());
return builder.getPacket();
}
public static GamePacket removePet(final ChannelCharacter chr, final Pet pet, final boolean hunger) {
final PacketBuilder builder = new PacketBuilder();
builder.writeAsShort(ServerPacketOpcode.SPAWN_PET.getValue());
builder.writeInt(chr.getId());
builder.writeByte(chr.getPetIndex(pet));
builder.writeAsByte(0);
builder.writeAsByte(hunger);
return builder.getPacket();
}
public static final GamePacket movePet(final int characterId, final int petId, final byte slot, final List<LifeMovementFragment> moves) {
final PacketBuilder builder = new PacketBuilder();
builder.writeAsShort(ServerPacketOpcode.MOVE_PET.getValue());
builder.writeInt(characterId);
builder.writeByte(slot);
builder.writeLong(petId);
PacketHelper.serializeMovementList(builder, moves);
return builder.getPacket();
}
public static final GamePacket petChat(final int cid, final int un, final String text, final byte slot) {
final PacketBuilder builder = new PacketBuilder();
builder.writeAsShort(ServerPacketOpcode.PET_CHAT.getValue());
builder.writeInt(cid);
builder.writeByte(slot);
builder.writeAsByte(0);
builder.writeAsByte(un);
builder.writeLengthPrefixedString(text);
builder.writeAsByte(0);
return builder.getPacket();
}
public static final GamePacket commandResponse(final int cid, final byte command, final byte slot, final boolean success, final boolean food) {
final PacketBuilder builder = new PacketBuilder();
builder.writeAsShort(ServerPacketOpcode.PET_COMMAND.getValue());
builder.writeInt(cid);
builder.writeByte(slot);
builder.writeAsByte(command == 1 ? 1 : 0);
builder.writeByte(command);
if (command == 1) {
builder.writeAsByte(0);
} else {
builder.writeAsShort(success ? 1 : 0);
}
return builder.getPacket();
}
public static final GamePacket showOwnPetLevelUp(final byte index) {
final PacketBuilder builder = new PacketBuilder();
builder.writeAsShort(ServerPacketOpcode.SHOW_ITEM_GAIN_INCHAT.getValue());
builder.writeAsByte(4);
builder.writeAsByte(0);
builder.writeByte(index); // Pet Index
return builder.getPacket();
}
public static final GamePacket showPetLevelUp(final ChannelCharacter chr, final byte index) {
final PacketBuilder builder = new PacketBuilder();
builder.writeAsShort(ServerPacketOpcode.SHOW_FOREIGN_EFFECT.getValue());
builder.writeInt(chr.getId());
builder.writeAsByte(4);
builder.writeAsByte(0);
builder.writeByte(index);
return builder.getPacket();
}
public static final GamePacket emptyStatUpdate() {
final PacketBuilder builder = new PacketBuilder();
builder.writeAsShort(ServerPacketOpcode.UPDATE_STATS.getValue());
builder.writeAsByte(1);
builder.writeInt(0);
return builder.getPacket();
}
public static final GamePacket petStatUpdate(final ChannelCharacter chr) {
final PacketBuilder builder = new PacketBuilder();
builder.writeAsShort(ServerPacketOpcode.UPDATE_STATS.getValue());
builder.writeAsByte(0);
int mask = 0;
mask |= Stat.PET.getValue();
builder.writeInt(mask);
byte count = 0;
for (final Pet pet : chr.getPets()) {
if (pet.isSummoned()) {
builder.writeInt(pet.getUniqueId());
builder.writeZeroBytes(4);
count++;
}
}
while (count < 3) {
builder.writeZeroBytes(8);
count++;
}
builder.writeAsByte(0);
return builder.getPacket();
}
public static final GamePacket weirdStatUpdate(final Pet pet) {
final PacketBuilder builder = new PacketBuilder();
builder.writeAsShort(ServerPacketOpcode.UPDATE_STATS.getValue());
builder.writeAsByte(0);
builder.writeAsByte(8);
builder.writeAsByte(0);
builder.writeAsByte(0x18);
builder.writeAsByte(0);
builder.writeInt(pet.getUniqueId());
builder.writeLong(0);
builder.writeLong(0);
builder.writeInt(0);
builder.writeAsByte(1);
return builder.getPacket();
}
}