323 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			323 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.network.protocol.game;
 | |
| 
 | |
| import java.util.UUID;
 | |
| import net.minecraft.network.RegistryFriendlyByteBuf;
 | |
| import net.minecraft.network.chat.Component;
 | |
| import net.minecraft.network.chat.ComponentSerialization;
 | |
| import net.minecraft.network.codec.StreamCodec;
 | |
| import net.minecraft.network.codec.StreamDecoder;
 | |
| import net.minecraft.network.protocol.Packet;
 | |
| import net.minecraft.network.protocol.PacketType;
 | |
| import net.minecraft.world.BossEvent;
 | |
| 
 | |
| public class ClientboundBossEventPacket implements Packet<ClientGamePacketListener> {
 | |
| 	public static final StreamCodec<RegistryFriendlyByteBuf, ClientboundBossEventPacket> STREAM_CODEC = Packet.codec(
 | |
| 		ClientboundBossEventPacket::write, ClientboundBossEventPacket::new
 | |
| 	);
 | |
| 	private static final int FLAG_DARKEN = 1;
 | |
| 	private static final int FLAG_MUSIC = 2;
 | |
| 	private static final int FLAG_FOG = 4;
 | |
| 	private final UUID id;
 | |
| 	private final ClientboundBossEventPacket.Operation operation;
 | |
| 	static final ClientboundBossEventPacket.Operation REMOVE_OPERATION = new ClientboundBossEventPacket.Operation() {
 | |
| 		@Override
 | |
| 		public ClientboundBossEventPacket.OperationType getType() {
 | |
| 			return ClientboundBossEventPacket.OperationType.REMOVE;
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public void dispatch(UUID id, ClientboundBossEventPacket.Handler handler) {
 | |
| 			handler.remove(id);
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public void write(RegistryFriendlyByteBuf buffer) {
 | |
| 		}
 | |
| 	};
 | |
| 
 | |
| 	private ClientboundBossEventPacket(UUID id, ClientboundBossEventPacket.Operation operation) {
 | |
| 		this.id = id;
 | |
| 		this.operation = operation;
 | |
| 	}
 | |
| 
 | |
| 	private ClientboundBossEventPacket(RegistryFriendlyByteBuf buffer) {
 | |
| 		this.id = buffer.readUUID();
 | |
| 		ClientboundBossEventPacket.OperationType operationType = buffer.readEnum(ClientboundBossEventPacket.OperationType.class);
 | |
| 		this.operation = operationType.reader.decode(buffer);
 | |
| 	}
 | |
| 
 | |
| 	public static ClientboundBossEventPacket createAddPacket(BossEvent event) {
 | |
| 		return new ClientboundBossEventPacket(event.getId(), new ClientboundBossEventPacket.AddOperation(event));
 | |
| 	}
 | |
| 
 | |
| 	public static ClientboundBossEventPacket createRemovePacket(UUID id) {
 | |
| 		return new ClientboundBossEventPacket(id, REMOVE_OPERATION);
 | |
| 	}
 | |
| 
 | |
| 	public static ClientboundBossEventPacket createUpdateProgressPacket(BossEvent event) {
 | |
| 		return new ClientboundBossEventPacket(event.getId(), new ClientboundBossEventPacket.UpdateProgressOperation(event.getProgress()));
 | |
| 	}
 | |
| 
 | |
| 	public static ClientboundBossEventPacket createUpdateNamePacket(BossEvent event) {
 | |
| 		return new ClientboundBossEventPacket(event.getId(), new ClientboundBossEventPacket.UpdateNameOperation(event.getName()));
 | |
| 	}
 | |
| 
 | |
| 	public static ClientboundBossEventPacket createUpdateStylePacket(BossEvent event) {
 | |
| 		return new ClientboundBossEventPacket(event.getId(), new ClientboundBossEventPacket.UpdateStyleOperation(event.getColor(), event.getOverlay()));
 | |
| 	}
 | |
| 
 | |
| 	public static ClientboundBossEventPacket createUpdatePropertiesPacket(BossEvent event) {
 | |
| 		return new ClientboundBossEventPacket(
 | |
| 			event.getId(),
 | |
| 			new ClientboundBossEventPacket.UpdatePropertiesOperation(event.shouldDarkenScreen(), event.shouldPlayBossMusic(), event.shouldCreateWorldFog())
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	private void write(RegistryFriendlyByteBuf buffer) {
 | |
| 		buffer.writeUUID(this.id);
 | |
| 		buffer.writeEnum(this.operation.getType());
 | |
| 		this.operation.write(buffer);
 | |
| 	}
 | |
| 
 | |
| 	static int encodeProperties(boolean darkenScreen, boolean playMusic, boolean createWorldFog) {
 | |
| 		int i = 0;
 | |
| 		if (darkenScreen) {
 | |
| 			i |= 1;
 | |
| 		}
 | |
| 
 | |
| 		if (playMusic) {
 | |
| 			i |= 2;
 | |
| 		}
 | |
| 
 | |
| 		if (createWorldFog) {
 | |
| 			i |= 4;
 | |
| 		}
 | |
| 
 | |
| 		return i;
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public PacketType<ClientboundBossEventPacket> type() {
 | |
| 		return GamePacketTypes.CLIENTBOUND_BOSS_EVENT;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Passes this Packet on to the NetHandler for processing.
 | |
| 	 */
 | |
| 	public void handle(ClientGamePacketListener handler) {
 | |
| 		handler.handleBossUpdate(this);
 | |
| 	}
 | |
| 
 | |
| 	public void dispatch(ClientboundBossEventPacket.Handler handler) {
 | |
| 		this.operation.dispatch(this.id, handler);
 | |
| 	}
 | |
| 
 | |
| 	static class AddOperation implements ClientboundBossEventPacket.Operation {
 | |
| 		private final Component name;
 | |
| 		private final float progress;
 | |
| 		private final BossEvent.BossBarColor color;
 | |
| 		private final BossEvent.BossBarOverlay overlay;
 | |
| 		private final boolean darkenScreen;
 | |
| 		private final boolean playMusic;
 | |
| 		private final boolean createWorldFog;
 | |
| 
 | |
| 		AddOperation(BossEvent event) {
 | |
| 			this.name = event.getName();
 | |
| 			this.progress = event.getProgress();
 | |
| 			this.color = event.getColor();
 | |
| 			this.overlay = event.getOverlay();
 | |
| 			this.darkenScreen = event.shouldDarkenScreen();
 | |
| 			this.playMusic = event.shouldPlayBossMusic();
 | |
| 			this.createWorldFog = event.shouldCreateWorldFog();
 | |
| 		}
 | |
| 
 | |
| 		private AddOperation(RegistryFriendlyByteBuf buffer) {
 | |
| 			this.name = ComponentSerialization.TRUSTED_STREAM_CODEC.decode(buffer);
 | |
| 			this.progress = buffer.readFloat();
 | |
| 			this.color = buffer.readEnum(BossEvent.BossBarColor.class);
 | |
| 			this.overlay = buffer.readEnum(BossEvent.BossBarOverlay.class);
 | |
| 			int i = buffer.readUnsignedByte();
 | |
| 			this.darkenScreen = (i & 1) > 0;
 | |
| 			this.playMusic = (i & 2) > 0;
 | |
| 			this.createWorldFog = (i & 4) > 0;
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public ClientboundBossEventPacket.OperationType getType() {
 | |
| 			return ClientboundBossEventPacket.OperationType.ADD;
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public void dispatch(UUID id, ClientboundBossEventPacket.Handler handler) {
 | |
| 			handler.add(id, this.name, this.progress, this.color, this.overlay, this.darkenScreen, this.playMusic, this.createWorldFog);
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public void write(RegistryFriendlyByteBuf buffer) {
 | |
| 			ComponentSerialization.TRUSTED_STREAM_CODEC.encode(buffer, this.name);
 | |
| 			buffer.writeFloat(this.progress);
 | |
| 			buffer.writeEnum(this.color);
 | |
| 			buffer.writeEnum(this.overlay);
 | |
| 			buffer.writeByte(ClientboundBossEventPacket.encodeProperties(this.darkenScreen, this.playMusic, this.createWorldFog));
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public interface Handler {
 | |
| 		default void add(
 | |
| 			UUID id,
 | |
| 			Component name,
 | |
| 			float progress,
 | |
| 			BossEvent.BossBarColor color,
 | |
| 			BossEvent.BossBarOverlay overlay,
 | |
| 			boolean darkenScreen,
 | |
| 			boolean playMusic,
 | |
| 			boolean createWorldFog
 | |
| 		) {
 | |
| 		}
 | |
| 
 | |
| 		default void remove(UUID id) {
 | |
| 		}
 | |
| 
 | |
| 		default void updateProgress(UUID id, float progress) {
 | |
| 		}
 | |
| 
 | |
| 		default void updateName(UUID id, Component name) {
 | |
| 		}
 | |
| 
 | |
| 		default void updateStyle(UUID id, BossEvent.BossBarColor color, BossEvent.BossBarOverlay overlay) {
 | |
| 		}
 | |
| 
 | |
| 		default void updateProperties(UUID id, boolean darkenScreen, boolean playMusic, boolean createWorldFog) {
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	interface Operation {
 | |
| 		ClientboundBossEventPacket.OperationType getType();
 | |
| 
 | |
| 		void dispatch(UUID id, ClientboundBossEventPacket.Handler handler);
 | |
| 
 | |
| 		void write(RegistryFriendlyByteBuf buffer);
 | |
| 	}
 | |
| 
 | |
| 	static enum OperationType {
 | |
| 		ADD(ClientboundBossEventPacket.AddOperation::new),
 | |
| 		REMOVE(registryFriendlyByteBuf -> ClientboundBossEventPacket.REMOVE_OPERATION),
 | |
| 		UPDATE_PROGRESS(ClientboundBossEventPacket.UpdateProgressOperation::new),
 | |
| 		UPDATE_NAME(ClientboundBossEventPacket.UpdateNameOperation::new),
 | |
| 		UPDATE_STYLE(ClientboundBossEventPacket.UpdateStyleOperation::new),
 | |
| 		UPDATE_PROPERTIES(ClientboundBossEventPacket.UpdatePropertiesOperation::new);
 | |
| 
 | |
| 		final StreamDecoder<RegistryFriendlyByteBuf, ClientboundBossEventPacket.Operation> reader;
 | |
| 
 | |
| 		private OperationType(final StreamDecoder<RegistryFriendlyByteBuf, ClientboundBossEventPacket.Operation> reader) {
 | |
| 			this.reader = reader;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	record UpdateNameOperation(Component name) implements ClientboundBossEventPacket.Operation {
 | |
| 		private UpdateNameOperation(RegistryFriendlyByteBuf buffer) {
 | |
| 			this(ComponentSerialization.TRUSTED_STREAM_CODEC.decode(buffer));
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public ClientboundBossEventPacket.OperationType getType() {
 | |
| 			return ClientboundBossEventPacket.OperationType.UPDATE_NAME;
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public void dispatch(UUID id, ClientboundBossEventPacket.Handler handler) {
 | |
| 			handler.updateName(id, this.name);
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public void write(RegistryFriendlyByteBuf buffer) {
 | |
| 			ComponentSerialization.TRUSTED_STREAM_CODEC.encode(buffer, this.name);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	record UpdateProgressOperation(float progress) implements ClientboundBossEventPacket.Operation {
 | |
| 		private UpdateProgressOperation(RegistryFriendlyByteBuf buffer) {
 | |
| 			this(buffer.readFloat());
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public ClientboundBossEventPacket.OperationType getType() {
 | |
| 			return ClientboundBossEventPacket.OperationType.UPDATE_PROGRESS;
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public void dispatch(UUID id, ClientboundBossEventPacket.Handler handler) {
 | |
| 			handler.updateProgress(id, this.progress);
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public void write(RegistryFriendlyByteBuf buffer) {
 | |
| 			buffer.writeFloat(this.progress);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	static class UpdatePropertiesOperation implements ClientboundBossEventPacket.Operation {
 | |
| 		private final boolean darkenScreen;
 | |
| 		private final boolean playMusic;
 | |
| 		private final boolean createWorldFog;
 | |
| 
 | |
| 		UpdatePropertiesOperation(boolean darkenScreen, boolean playMusic, boolean createWorldFog) {
 | |
| 			this.darkenScreen = darkenScreen;
 | |
| 			this.playMusic = playMusic;
 | |
| 			this.createWorldFog = createWorldFog;
 | |
| 		}
 | |
| 
 | |
| 		private UpdatePropertiesOperation(RegistryFriendlyByteBuf buffer) {
 | |
| 			int i = buffer.readUnsignedByte();
 | |
| 			this.darkenScreen = (i & 1) > 0;
 | |
| 			this.playMusic = (i & 2) > 0;
 | |
| 			this.createWorldFog = (i & 4) > 0;
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public ClientboundBossEventPacket.OperationType getType() {
 | |
| 			return ClientboundBossEventPacket.OperationType.UPDATE_PROPERTIES;
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public void dispatch(UUID id, ClientboundBossEventPacket.Handler handler) {
 | |
| 			handler.updateProperties(id, this.darkenScreen, this.playMusic, this.createWorldFog);
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public void write(RegistryFriendlyByteBuf buffer) {
 | |
| 			buffer.writeByte(ClientboundBossEventPacket.encodeProperties(this.darkenScreen, this.playMusic, this.createWorldFog));
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	static class UpdateStyleOperation implements ClientboundBossEventPacket.Operation {
 | |
| 		private final BossEvent.BossBarColor color;
 | |
| 		private final BossEvent.BossBarOverlay overlay;
 | |
| 
 | |
| 		UpdateStyleOperation(BossEvent.BossBarColor color, BossEvent.BossBarOverlay overlay) {
 | |
| 			this.color = color;
 | |
| 			this.overlay = overlay;
 | |
| 		}
 | |
| 
 | |
| 		private UpdateStyleOperation(RegistryFriendlyByteBuf buffer) {
 | |
| 			this.color = buffer.readEnum(BossEvent.BossBarColor.class);
 | |
| 			this.overlay = buffer.readEnum(BossEvent.BossBarOverlay.class);
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public ClientboundBossEventPacket.OperationType getType() {
 | |
| 			return ClientboundBossEventPacket.OperationType.UPDATE_STYLE;
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public void dispatch(UUID id, ClientboundBossEventPacket.Handler handler) {
 | |
| 			handler.updateStyle(id, this.color, this.overlay);
 | |
| 		}
 | |
| 
 | |
| 		@Override
 | |
| 		public void write(RegistryFriendlyByteBuf buffer) {
 | |
| 			buffer.writeEnum(this.color);
 | |
| 			buffer.writeEnum(this.overlay);
 | |
| 		}
 | |
| 	}
 | |
| }
 |