186 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| 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.server.level.ServerLevel;
 | |
| import net.minecraft.world.InteractionHand;
 | |
| import net.minecraft.world.entity.Entity;
 | |
| import net.minecraft.world.phys.Vec3;
 | |
| import org.jetbrains.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 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 handler) {
 | |
| 			handler.onAttack();
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public void write(FriendlyByteBuf buffer) {
 | |
| 		}
 | |
| 	};
 | |
| 
 | |
| 	private ServerboundInteractPacket(int entityId, boolean usingSecondaryAction, ServerboundInteractPacket.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 ServerboundInteractPacket.InteractionAction(hand));
 | |
| 	}
 | |
| 
 | |
| 	public static ServerboundInteractPacket createInteractionPacket(Entity entity, boolean usingSecondaryAction, InteractionHand hand, Vec3 interactionLocation) {
 | |
| 		return new ServerboundInteractPacket(
 | |
| 			entity.getId(), usingSecondaryAction, new ServerboundInteractPacket.InteractionAtLocationAction(hand, interactionLocation)
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	private ServerboundInteractPacket(FriendlyByteBuf buffer) {
 | |
| 		this.entityId = buffer.readVarInt();
 | |
| 		ServerboundInteractPacket.ActionType actionType = buffer.readEnum(ServerboundInteractPacket.ActionType.class);
 | |
| 		this.action = (ServerboundInteractPacket.Action)actionType.reader.apply(buffer);
 | |
| 		this.usingSecondaryAction = buffer.readBoolean();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Writes the raw packet data to the data stream.
 | |
| 	 */
 | |
| 	private void write(FriendlyByteBuf buffer) {
 | |
| 		buffer.writeVarInt(this.entityId);
 | |
| 		buffer.writeEnum(this.action.getType());
 | |
| 		this.action.write(buffer);
 | |
| 		buffer.writeBoolean(this.usingSecondaryAction);
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public PacketType<ServerboundInteractPacket> type() {
 | |
| 		return GamePacketTypes.SERVERBOUND_INTERACT;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Passes this Packet on to the NetHandler for processing.
 | |
| 	 */
 | |
| 	public void handle(ServerGamePacketListener handler) {
 | |
| 		handler.handleInteract(this);
 | |
| 	}
 | |
| 
 | |
| 	@Nullable
 | |
| 	public Entity getTarget(ServerLevel level) {
 | |
| 		return level.getEntityOrPart(this.entityId);
 | |
| 	}
 | |
| 
 | |
| 	public boolean isUsingSecondaryAction() {
 | |
| 		return this.usingSecondaryAction;
 | |
| 	}
 | |
| 
 | |
| 	public void dispatch(ServerboundInteractPacket.Handler handler) {
 | |
| 		this.action.dispatch(handler);
 | |
| 	}
 | |
| 
 | |
| 	interface Action {
 | |
| 		ServerboundInteractPacket.ActionType getType();
 | |
| 
 | |
| 		void dispatch(ServerboundInteractPacket.Handler handler);
 | |
| 
 | |
| 		void write(FriendlyByteBuf buffer);
 | |
| 	}
 | |
| 
 | |
| 	static enum ActionType {
 | |
| 		INTERACT(ServerboundInteractPacket.InteractionAction::new),
 | |
| 		ATTACK(friendlyByteBuf -> ServerboundInteractPacket.ATTACK_ACTION),
 | |
| 		INTERACT_AT(ServerboundInteractPacket.InteractionAtLocationAction::new);
 | |
| 
 | |
| 		final Function<FriendlyByteBuf, ServerboundInteractPacket.Action> reader;
 | |
| 
 | |
| 		private ActionType(final Function<FriendlyByteBuf, ServerboundInteractPacket.Action> reader) {
 | |
| 			this.reader = reader;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public interface Handler {
 | |
| 		void onInteraction(InteractionHand hand);
 | |
| 
 | |
| 		void onInteraction(InteractionHand hand, Vec3 interactionLocation);
 | |
| 
 | |
| 		void onAttack();
 | |
| 	}
 | |
| 
 | |
| 	static class InteractionAction implements ServerboundInteractPacket.Action {
 | |
| 		private final InteractionHand hand;
 | |
| 
 | |
| 		InteractionAction(InteractionHand hand) {
 | |
| 			this.hand = hand;
 | |
| 		}
 | |
| 
 | |
| 		private InteractionAction(FriendlyByteBuf buffer) {
 | |
| 			this.hand = buffer.readEnum(InteractionHand.class);
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public ServerboundInteractPacket.ActionType getType() {
 | |
| 			return ServerboundInteractPacket.ActionType.INTERACT;
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public void dispatch(ServerboundInteractPacket.Handler handler) {
 | |
| 			handler.onInteraction(this.hand);
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public void write(FriendlyByteBuf buffer) {
 | |
| 			buffer.writeEnum(this.hand);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	static class InteractionAtLocationAction implements ServerboundInteractPacket.Action {
 | |
| 		private final InteractionHand hand;
 | |
| 		private final Vec3 location;
 | |
| 
 | |
| 		InteractionAtLocationAction(InteractionHand hand, Vec3 location) {
 | |
| 			this.hand = hand;
 | |
| 			this.location = location;
 | |
| 		}
 | |
| 
 | |
| 		private InteractionAtLocationAction(FriendlyByteBuf buffer) {
 | |
| 			this.location = new Vec3(buffer.readFloat(), buffer.readFloat(), buffer.readFloat());
 | |
| 			this.hand = buffer.readEnum(InteractionHand.class);
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public ServerboundInteractPacket.ActionType getType() {
 | |
| 			return ServerboundInteractPacket.ActionType.INTERACT_AT;
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public void dispatch(ServerboundInteractPacket.Handler handler) {
 | |
| 			handler.onInteraction(this.hand, this.location);
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public void write(FriendlyByteBuf buffer) {
 | |
| 			buffer.writeFloat((float)this.location.x);
 | |
| 			buffer.writeFloat((float)this.location.y);
 | |
| 			buffer.writeFloat((float)this.location.z);
 | |
| 			buffer.writeEnum(this.hand);
 | |
| 		}
 | |
| 	}
 | |
| }
 |