minecraft-src/net/minecraft/network/protocol/game/ClientboundAddEntityPacket.java
2025-07-04 02:00:41 +03:00

186 lines
4.8 KiB
Java

package net.minecraft.network.protocol.game;
import java.util.UUID;
import net.minecraft.core.BlockPos;
import net.minecraft.core.registries.Registries;
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.server.level.ServerEntity;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.phys.Vec3;
public class ClientboundAddEntityPacket implements Packet<ClientGamePacketListener> {
public static final StreamCodec<RegistryFriendlyByteBuf, ClientboundAddEntityPacket> STREAM_CODEC = Packet.codec(
ClientboundAddEntityPacket::write, ClientboundAddEntityPacket::new
);
private static final double MAGICAL_QUANTIZATION = 8000.0;
private static final double LIMIT = 3.9;
private final int id;
private final UUID uuid;
private final EntityType<?> type;
private final double x;
private final double y;
private final double z;
private final int xa;
private final int ya;
private final int za;
private final byte xRot;
private final byte yRot;
private final byte yHeadRot;
private final int data;
public ClientboundAddEntityPacket(Entity entity, ServerEntity serverEntity) {
this(entity, serverEntity, 0);
}
public ClientboundAddEntityPacket(Entity entity, ServerEntity serverEntity, int data) {
this(
entity.getId(),
entity.getUUID(),
serverEntity.getPositionBase().x(),
serverEntity.getPositionBase().y(),
serverEntity.getPositionBase().z(),
serverEntity.getLastSentXRot(),
serverEntity.getLastSentYRot(),
entity.getType(),
data,
serverEntity.getLastSentMovement(),
serverEntity.getLastSentYHeadRot()
);
}
public ClientboundAddEntityPacket(Entity entity, int data, BlockPos pos) {
this(
entity.getId(),
entity.getUUID(),
pos.getX(),
pos.getY(),
pos.getZ(),
entity.getXRot(),
entity.getYRot(),
entity.getType(),
data,
entity.getDeltaMovement(),
entity.getYHeadRot()
);
}
public ClientboundAddEntityPacket(
int id, UUID uuid, double x, double y, double z, float xRot, float yRot, EntityType<?> type, int data, Vec3 deltaMovement, double yHeadRot
) {
this.id = id;
this.uuid = uuid;
this.x = x;
this.y = y;
this.z = z;
this.xRot = Mth.packDegrees(xRot);
this.yRot = Mth.packDegrees(yRot);
this.yHeadRot = Mth.packDegrees((float)yHeadRot);
this.type = type;
this.data = data;
this.xa = (int)(Mth.clamp(deltaMovement.x, -3.9, 3.9) * 8000.0);
this.ya = (int)(Mth.clamp(deltaMovement.y, -3.9, 3.9) * 8000.0);
this.za = (int)(Mth.clamp(deltaMovement.z, -3.9, 3.9) * 8000.0);
}
private ClientboundAddEntityPacket(RegistryFriendlyByteBuf buffer) {
this.id = buffer.readVarInt();
this.uuid = buffer.readUUID();
this.type = ByteBufCodecs.registry(Registries.ENTITY_TYPE).decode(buffer);
this.x = buffer.readDouble();
this.y = buffer.readDouble();
this.z = buffer.readDouble();
this.xRot = buffer.readByte();
this.yRot = buffer.readByte();
this.yHeadRot = buffer.readByte();
this.data = buffer.readVarInt();
this.xa = buffer.readShort();
this.ya = buffer.readShort();
this.za = buffer.readShort();
}
private void write(RegistryFriendlyByteBuf buffer) {
buffer.writeVarInt(this.id);
buffer.writeUUID(this.uuid);
ByteBufCodecs.registry(Registries.ENTITY_TYPE).encode(buffer, this.type);
buffer.writeDouble(this.x);
buffer.writeDouble(this.y);
buffer.writeDouble(this.z);
buffer.writeByte(this.xRot);
buffer.writeByte(this.yRot);
buffer.writeByte(this.yHeadRot);
buffer.writeVarInt(this.data);
buffer.writeShort(this.xa);
buffer.writeShort(this.ya);
buffer.writeShort(this.za);
}
@Override
public PacketType<ClientboundAddEntityPacket> type() {
return GamePacketTypes.CLIENTBOUND_ADD_ENTITY;
}
/**
* Passes this Packet on to the NetHandler for processing.
*/
public void handle(ClientGamePacketListener handler) {
handler.handleAddEntity(this);
}
public int getId() {
return this.id;
}
public UUID getUUID() {
return this.uuid;
}
public EntityType<?> getType() {
return this.type;
}
public double getX() {
return this.x;
}
public double getY() {
return this.y;
}
public double getZ() {
return this.z;
}
public double getXa() {
return this.xa / 8000.0;
}
public double getYa() {
return this.ya / 8000.0;
}
public double getZa() {
return this.za / 8000.0;
}
public float getXRot() {
return Mth.unpackDegrees(this.xRot);
}
public float getYRot() {
return Mth.unpackDegrees(this.yRot);
}
public float getYHeadRot() {
return Mth.unpackDegrees(this.yHeadRot);
}
public int getData() {
return this.data;
}
}