2025-11-24 22:52:51 +03:00

190 lines
5.9 KiB
Java

/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* org.jspecify.annotations.Nullable
*/
package net.minecraft.network.protocol.game;
import java.util.function.Function;
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.network.protocol.game.GamePacketTypes;
import net.minecraft.network.protocol.game.ServerGamePacketListener;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.phys.Vec3;
import org.jspecify.annotations.Nullable;
public class ServerboundInteractPacket
implements Packet<ServerGamePacketListener> {
public static final StreamCodec<FriendlyByteBuf, ServerboundInteractPacket> STREAM_CODEC = Packet.codec(ServerboundInteractPacket::write, ServerboundInteractPacket::new);
private final int entityId;
private final Action action;
private final boolean usingSecondaryAction;
private static final Action ATTACK_ACTION = new Action(){
@Override
public ActionType getType() {
return ActionType.ATTACK;
}
@Override
public void dispatch(Handler handler) {
handler.onAttack();
}
@Override
public void write(FriendlyByteBuf output) {
}
};
private ServerboundInteractPacket(int entityId, boolean usingSecondaryAction, Action action) {
this.entityId = entityId;
this.action = action;
this.usingSecondaryAction = usingSecondaryAction;
}
public static ServerboundInteractPacket createAttackPacket(Entity entity, boolean usingSecondaryAction) {
return new ServerboundInteractPacket(entity.getId(), usingSecondaryAction, ATTACK_ACTION);
}
public static ServerboundInteractPacket createInteractionPacket(Entity entity, boolean usingSecondaryAction, InteractionHand hand) {
return new ServerboundInteractPacket(entity.getId(), usingSecondaryAction, new InteractionAction(hand));
}
public static ServerboundInteractPacket createInteractionPacket(Entity entity, boolean usingSecondaryAction, InteractionHand hand, Vec3 location) {
return new ServerboundInteractPacket(entity.getId(), usingSecondaryAction, new InteractionAtLocationAction(hand, location));
}
private ServerboundInteractPacket(FriendlyByteBuf input) {
this.entityId = input.readVarInt();
ActionType type = input.readEnum(ActionType.class);
this.action = type.reader.apply(input);
this.usingSecondaryAction = input.readBoolean();
}
private void write(FriendlyByteBuf output) {
output.writeVarInt(this.entityId);
output.writeEnum(this.action.getType());
this.action.write(output);
output.writeBoolean(this.usingSecondaryAction);
}
@Override
public PacketType<ServerboundInteractPacket> type() {
return GamePacketTypes.SERVERBOUND_INTERACT;
}
@Override
public void handle(ServerGamePacketListener listener) {
listener.handleInteract(this);
}
public @Nullable Entity getTarget(ServerLevel level) {
return level.getEntityOrPart(this.entityId);
}
public boolean isUsingSecondaryAction() {
return this.usingSecondaryAction;
}
public void dispatch(Handler handler) {
this.action.dispatch(handler);
}
private static interface Action {
public ActionType getType();
public void dispatch(Handler var1);
public void write(FriendlyByteBuf var1);
}
private static class InteractionAction
implements Action {
private final InteractionHand hand;
private InteractionAction(InteractionHand hand) {
this.hand = hand;
}
private InteractionAction(FriendlyByteBuf input) {
this.hand = input.readEnum(InteractionHand.class);
}
@Override
public ActionType getType() {
return ActionType.INTERACT;
}
@Override
public void dispatch(Handler handler) {
handler.onInteraction(this.hand);
}
@Override
public void write(FriendlyByteBuf output) {
output.writeEnum(this.hand);
}
}
private static class InteractionAtLocationAction
implements Action {
private final InteractionHand hand;
private final Vec3 location;
private InteractionAtLocationAction(InteractionHand hand, Vec3 location) {
this.hand = hand;
this.location = location;
}
private InteractionAtLocationAction(FriendlyByteBuf input) {
this.location = new Vec3(input.readFloat(), input.readFloat(), input.readFloat());
this.hand = input.readEnum(InteractionHand.class);
}
@Override
public ActionType getType() {
return ActionType.INTERACT_AT;
}
@Override
public void dispatch(Handler handler) {
handler.onInteraction(this.hand, this.location);
}
@Override
public void write(FriendlyByteBuf output) {
output.writeFloat((float)this.location.x);
output.writeFloat((float)this.location.y);
output.writeFloat((float)this.location.z);
output.writeEnum(this.hand);
}
}
private static enum ActionType {
INTERACT(InteractionAction::new),
ATTACK(input -> ATTACK_ACTION),
INTERACT_AT(InteractionAtLocationAction::new);
private final Function<FriendlyByteBuf, Action> reader;
private ActionType(Function<FriendlyByteBuf, Action> reader) {
this.reader = reader;
}
}
public static interface Handler {
public void onInteraction(InteractionHand var1);
public void onInteraction(InteractionHand var1, Vec3 var2);
public void onAttack();
}
}