minecraft-src/net/minecraft/network/protocol/game/ClientboundUpdateAttributesPacket.java
2025-07-04 01:41:11 +03:00

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
);
}
}