89 lines
3.4 KiB
Java
89 lines
3.4 KiB
Java
package net.minecraft.network.protocol.game;
|
|
|
|
import com.google.common.collect.Lists;
|
|
import io.netty.buffer.ByteBuf;
|
|
import java.util.ArrayList;
|
|
import java.util.Collection;
|
|
import java.util.List;
|
|
import net.minecraft.core.Holder;
|
|
import net.minecraft.network.RegistryFriendlyByteBuf;
|
|
import net.minecraft.network.codec.ByteBufCodecs;
|
|
import net.minecraft.network.codec.StreamCodec;
|
|
import net.minecraft.network.protocol.Packet;
|
|
import net.minecraft.network.protocol.PacketType;
|
|
import net.minecraft.resources.ResourceLocation;
|
|
import net.minecraft.world.entity.ai.attributes.Attribute;
|
|
import net.minecraft.world.entity.ai.attributes.AttributeInstance;
|
|
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
|
|
|
|
public class ClientboundUpdateAttributesPacket implements Packet<ClientGamePacketListener> {
|
|
public static final StreamCodec<RegistryFriendlyByteBuf, ClientboundUpdateAttributesPacket> STREAM_CODEC = StreamCodec.composite(
|
|
ByteBufCodecs.VAR_INT,
|
|
ClientboundUpdateAttributesPacket::getEntityId,
|
|
ClientboundUpdateAttributesPacket.AttributeSnapshot.STREAM_CODEC.apply(ByteBufCodecs.list()),
|
|
ClientboundUpdateAttributesPacket::getValues,
|
|
ClientboundUpdateAttributesPacket::new
|
|
);
|
|
private final int entityId;
|
|
private final List<ClientboundUpdateAttributesPacket.AttributeSnapshot> attributes;
|
|
|
|
public ClientboundUpdateAttributesPacket(int entityId, Collection<AttributeInstance> attributes) {
|
|
this.entityId = entityId;
|
|
this.attributes = Lists.<ClientboundUpdateAttributesPacket.AttributeSnapshot>newArrayList();
|
|
|
|
for (AttributeInstance attributeInstance : attributes) {
|
|
this.attributes
|
|
.add(
|
|
new ClientboundUpdateAttributesPacket.AttributeSnapshot(
|
|
attributeInstance.getAttribute(), attributeInstance.getBaseValue(), attributeInstance.getModifiers()
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
private ClientboundUpdateAttributesPacket(int entityId, List<ClientboundUpdateAttributesPacket.AttributeSnapshot> attributes) {
|
|
this.entityId = entityId;
|
|
this.attributes = attributes;
|
|
}
|
|
|
|
@Override
|
|
public PacketType<ClientboundUpdateAttributesPacket> type() {
|
|
return GamePacketTypes.CLIENTBOUND_UPDATE_ATTRIBUTES;
|
|
}
|
|
|
|
/**
|
|
* Passes this Packet on to the NetHandler for processing.
|
|
*/
|
|
public void handle(ClientGamePacketListener handler) {
|
|
handler.handleUpdateAttributes(this);
|
|
}
|
|
|
|
public int getEntityId() {
|
|
return this.entityId;
|
|
}
|
|
|
|
public List<ClientboundUpdateAttributesPacket.AttributeSnapshot> getValues() {
|
|
return this.attributes;
|
|
}
|
|
|
|
public record AttributeSnapshot(Holder<Attribute> attribute, double base, Collection<AttributeModifier> modifiers) {
|
|
public static final StreamCodec<ByteBuf, AttributeModifier> MODIFIER_STREAM_CODEC = StreamCodec.composite(
|
|
ResourceLocation.STREAM_CODEC,
|
|
AttributeModifier::id,
|
|
ByteBufCodecs.DOUBLE,
|
|
AttributeModifier::amount,
|
|
AttributeModifier.Operation.STREAM_CODEC,
|
|
AttributeModifier::operation,
|
|
AttributeModifier::new
|
|
);
|
|
public static final StreamCodec<RegistryFriendlyByteBuf, ClientboundUpdateAttributesPacket.AttributeSnapshot> STREAM_CODEC = StreamCodec.composite(
|
|
Attribute.STREAM_CODEC,
|
|
ClientboundUpdateAttributesPacket.AttributeSnapshot::attribute,
|
|
ByteBufCodecs.DOUBLE,
|
|
ClientboundUpdateAttributesPacket.AttributeSnapshot::base,
|
|
MODIFIER_STREAM_CODEC.apply(ByteBufCodecs.collection(ArrayList::new)),
|
|
ClientboundUpdateAttributesPacket.AttributeSnapshot::modifiers,
|
|
ClientboundUpdateAttributesPacket.AttributeSnapshot::new
|
|
);
|
|
}
|
|
}
|