package net.minecraft.network.protocol.game; import java.util.function.Function; import javax.annotation.Nullable; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.PacketType; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.Vec3; public class ServerboundInteractPacket implements Packet { public static final StreamCodec STREAM_CODEC = Packet.codec( ServerboundInteractPacket::write, ServerboundInteractPacket::new ); private final int entityId; private final ServerboundInteractPacket.Action action; private final boolean usingSecondaryAction; static final ServerboundInteractPacket.Action ATTACK_ACTION = new ServerboundInteractPacket.Action() { @Override public ServerboundInteractPacket.ActionType getType() { return ServerboundInteractPacket.ActionType.ATTACK; } @Override public void dispatch(ServerboundInteractPacket.Handler p_179624_) { p_179624_.onAttack(); } @Override public void write(FriendlyByteBuf p_179622_) { } }; private ServerboundInteractPacket(int p_179598_, boolean p_179599_, ServerboundInteractPacket.Action p_179600_) { this.entityId = p_179598_; this.action = p_179600_; this.usingSecondaryAction = p_179599_; } public static ServerboundInteractPacket createAttackPacket(Entity p_179606_, boolean p_179607_) { return new ServerboundInteractPacket(p_179606_.getId(), p_179607_, ATTACK_ACTION); } public static ServerboundInteractPacket createInteractionPacket(Entity p_179609_, boolean p_179610_, InteractionHand p_179611_) { return new ServerboundInteractPacket(p_179609_.getId(), p_179610_, new ServerboundInteractPacket.InteractionAction(p_179611_)); } public static ServerboundInteractPacket createInteractionPacket(Entity p_179613_, boolean p_179614_, InteractionHand p_179615_, Vec3 p_179616_) { return new ServerboundInteractPacket(p_179613_.getId(), p_179614_, new ServerboundInteractPacket.InteractionAtLocationAction(p_179615_, p_179616_)); } private ServerboundInteractPacket(FriendlyByteBuf p_179602_) { this.entityId = p_179602_.readVarInt(); ServerboundInteractPacket.ActionType serverboundinteractpacket$actiontype = p_179602_.readEnum(ServerboundInteractPacket.ActionType.class); this.action = serverboundinteractpacket$actiontype.reader.apply(p_179602_); this.usingSecondaryAction = p_179602_.readBoolean(); } private void write(FriendlyByteBuf p_134058_) { p_134058_.writeVarInt(this.entityId); p_134058_.writeEnum(this.action.getType()); this.action.write(p_134058_); p_134058_.writeBoolean(this.usingSecondaryAction); } @Override public PacketType type() { return GamePacketTypes.SERVERBOUND_INTERACT; } public void handle(ServerGamePacketListener p_134055_) { p_134055_.handleInteract(this); } @Nullable public Entity getTarget(ServerLevel p_179604_) { return p_179604_.getEntityOrPart(this.entityId); } public boolean isUsingSecondaryAction() { return this.usingSecondaryAction; } public void dispatch(ServerboundInteractPacket.Handler p_179618_) { this.action.dispatch(p_179618_); } interface Action { ServerboundInteractPacket.ActionType getType(); void dispatch(ServerboundInteractPacket.Handler p_179626_); void write(FriendlyByteBuf p_179625_); } static enum ActionType { INTERACT(ServerboundInteractPacket.InteractionAction::new), ATTACK(p_179639_ -> ServerboundInteractPacket.ATTACK_ACTION), INTERACT_AT(ServerboundInteractPacket.InteractionAtLocationAction::new); final Function reader; private ActionType(final Function p_179636_) { this.reader = p_179636_; } } public interface Handler { void onInteraction(InteractionHand p_179643_); void onInteraction(InteractionHand p_179644_, Vec3 p_179645_); void onAttack(); } static class InteractionAction implements ServerboundInteractPacket.Action { private final InteractionHand hand; InteractionAction(InteractionHand p_179648_) { this.hand = p_179648_; } private InteractionAction(FriendlyByteBuf p_179650_) { this.hand = p_179650_.readEnum(InteractionHand.class); } @Override public ServerboundInteractPacket.ActionType getType() { return ServerboundInteractPacket.ActionType.INTERACT; } @Override public void dispatch(ServerboundInteractPacket.Handler p_179655_) { p_179655_.onInteraction(this.hand); } @Override public void write(FriendlyByteBuf p_179653_) { p_179653_.writeEnum(this.hand); } } static class InteractionAtLocationAction implements ServerboundInteractPacket.Action { private final InteractionHand hand; private final Vec3 location; InteractionAtLocationAction(InteractionHand p_179659_, Vec3 p_179660_) { this.hand = p_179659_; this.location = p_179660_; } private InteractionAtLocationAction(FriendlyByteBuf p_179662_) { this.location = new Vec3(p_179662_.readFloat(), p_179662_.readFloat(), p_179662_.readFloat()); this.hand = p_179662_.readEnum(InteractionHand.class); } @Override public ServerboundInteractPacket.ActionType getType() { return ServerboundInteractPacket.ActionType.INTERACT_AT; } @Override public void dispatch(ServerboundInteractPacket.Handler p_179667_) { p_179667_.onInteraction(this.hand, this.location); } @Override public void write(FriendlyByteBuf p_179665_) { p_179665_.writeFloat((float)this.location.x); p_179665_.writeFloat((float)this.location.y); p_179665_.writeFloat((float)this.location.z); p_179665_.writeEnum(this.hand); } } }