package com.captainbern.minecraft.net.codec.play.server; import com.captainbern.minecraft.game.entity.attribute.Attribute; import com.captainbern.minecraft.game.entity.attribute.AttributeModifier; import com.captainbern.minecraft.net.codec.Codec; import com.captainbern.minecraft.net.packet.play.server.PacketEntityProperties; import com.captainbern.minecraft.net.util.ByteBufUtils; import io.netty.buffer.ByteBuf; import java.util.ArrayList; import java.util.List; import java.util.UUID; public class CodecEntityProperties implements Codec<PacketEntityProperties> { public ByteBuf encode(ByteBuf byteBuf, PacketEntityProperties packet) { ByteBufUtils.writeVarInt(byteBuf, packet.getEntityId()); byteBuf.writeInt(packet.getAttributes().size()); for (Attribute attribute : packet.getAttributes()) { ByteBufUtils.writeUTF(byteBuf, attribute.getType().getKey()); byteBuf.writeDouble(attribute.getValue()); ByteBufUtils.writeVarInt(byteBuf, attribute.getModifiers().size()); for (AttributeModifier modifier : attribute.getModifiers()) { ByteBufUtils.writeUuid(byteBuf, modifier.getType()); byteBuf.writeDouble(modifier.getAmount()); byteBuf.writeByte(modifier.getOperation().getId()); } } return byteBuf; } public PacketEntityProperties decode(ByteBuf byteBuf) { int entityId = ByteBufUtils.readVarInt(byteBuf); int attributeLength = byteBuf.readInt(); List<Attribute> attributes = new ArrayList<>(); for (int i = 0; i < attributeLength; i++) { String key = ByteBufUtils.readUTF(byteBuf); double value = byteBuf.readDouble(); int modifierLength = ByteBufUtils.readVarInt(byteBuf); List<AttributeModifier> modifiers = new ArrayList<>(); for (int j = 0; j < modifierLength; j++) { UUID type = ByteBufUtils.readUuid(byteBuf); // Some Bukkit plugins use a custom UUID to store persistent data on items double amount = byteBuf.readDouble(); byte modifierOperation = byteBuf.readByte(); modifiers.add(new AttributeModifier(type, amount, modifierOperation)); } attributes.add(new Attribute(key, value, modifiers)); } return new PacketEntityProperties(entityId, attributes); } }