ClientboundBossEventPacket.java

net.minecraft.network.protocol.game.ClientboundBossEventPacket

信息

  • 全限定名:net.minecraft.network.protocol.game.ClientboundBossEventPacket
  • 类型:public class
  • 包:net.minecraft.network.protocol.game
  • 源码路径:src/main/java/net/minecraft/network/protocol/game/ClientboundBossEventPacket.java
  • 起始行号:L13
  • 实现:Packet
  • 职责:

    TODO

字段/常量

  • STREAM_CODEC

    • 类型: StreamCodec<RegistryFriendlyByteBuf,ClientboundBossEventPacket>
    • 修饰符: public static final
    • 源码定位: L14
    • 说明:

      TODO

  • FLAG_DARKEN

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L17
    • 说明:

      TODO

  • FLAG_MUSIC

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L18
    • 说明:

      TODO

  • FLAG_FOG

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L19
    • 说明:

      TODO

  • id

    • 类型: UUID
    • 修饰符: private final
    • 源码定位: L20
    • 说明:

      TODO

  • operation

    • 类型: ClientboundBossEventPacket.Operation
    • 修饰符: private final
    • 源码定位: L21
    • 说明:

      TODO

  • REMOVE_OPERATION

    • 类型: ClientboundBossEventPacket.Operation
    • 修饰符: private static final public public public
    • 源码定位: L22
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.network.protocol.game.ClientboundBossEventPacket.AddOperation

    • 类型: class
    • 修饰符: private static
    • 源码定位: L112
    • 说明:

      TODO

  • net.minecraft.network.protocol.game.ClientboundBossEventPacket.Handler

    • 类型: interface
    • 修饰符: public
    • 源码定位: L162
    • 说明:

      TODO

  • net.minecraft.network.protocol.game.ClientboundBossEventPacket.Operation

    • 类型: interface
    • 修饰符: private
    • 源码定位: L191
    • 说明:

      TODO

  • net.minecraft.network.protocol.game.ClientboundBossEventPacket.OperationType

    • 类型: enum
    • 修饰符: private static
    • 源码定位: L199
    • 说明:

      TODO

  • net.minecraft.network.protocol.game.ClientboundBossEventPacket.UpdateNameOperation

    • 类型: record
    • 修饰符: private
    • 源码定位: L214
    • 说明:

      TODO

  • net.minecraft.network.protocol.game.ClientboundBossEventPacket.UpdateProgressOperation

    • 类型: record
    • 修饰符: private
    • 源码定位: L235
    • 说明:

      TODO

  • net.minecraft.network.protocol.game.ClientboundBossEventPacket.UpdatePropertiesOperation

    • 类型: class
    • 修饰符: private static
    • 源码定位: L256
    • 说明:

      TODO

  • net.minecraft.network.protocol.game.ClientboundBossEventPacket.UpdateStyleOperation

    • 类型: class
    • 修饰符: private static
    • 源码定位: L290
    • 说明:

      TODO

构造器

private ClientboundBossEventPacket(UUID id, ClientboundBossEventPacket.Operation operation) @ L38

  • 构造器名:ClientboundBossEventPacket
  • 源码定位:L38
  • 修饰符:private

参数:

  • id: UUID
  • operation: ClientboundBossEventPacket.Operation

说明:

TODO

private ClientboundBossEventPacket(RegistryFriendlyByteBuf input) @ L43

  • 构造器名:ClientboundBossEventPacket
  • 源码定位:L43
  • 修饰符:private

参数:

  • input: RegistryFriendlyByteBuf

说明:

TODO

方法

下面的方法块按源码顺序生成。

public static ClientboundBossEventPacket createAddPacket(BossEvent event) @ L49

  • 方法名:createAddPacket
  • 源码定位:L49
  • 返回类型:ClientboundBossEventPacket
  • 修饰符:public static

参数:

  • event: BossEvent

说明:

TODO

public static ClientboundBossEventPacket createRemovePacket(UUID id) @ L53

  • 方法名:createRemovePacket
  • 源码定位:L53
  • 返回类型:ClientboundBossEventPacket
  • 修饰符:public static

参数:

  • id: UUID

说明:

TODO

public static ClientboundBossEventPacket createUpdateProgressPacket(BossEvent event) @ L57

  • 方法名:createUpdateProgressPacket
  • 源码定位:L57
  • 返回类型:ClientboundBossEventPacket
  • 修饰符:public static

参数:

  • event: BossEvent

说明:

TODO

public static ClientboundBossEventPacket createUpdateNamePacket(BossEvent event) @ L61

  • 方法名:createUpdateNamePacket
  • 源码定位:L61
  • 返回类型:ClientboundBossEventPacket
  • 修饰符:public static

参数:

  • event: BossEvent

说明:

TODO

public static ClientboundBossEventPacket createUpdateStylePacket(BossEvent event) @ L65

  • 方法名:createUpdateStylePacket
  • 源码定位:L65
  • 返回类型:ClientboundBossEventPacket
  • 修饰符:public static

参数:

  • event: BossEvent

说明:

TODO

public static ClientboundBossEventPacket createUpdatePropertiesPacket(BossEvent event) @ L69

  • 方法名:createUpdatePropertiesPacket
  • 源码定位:L69
  • 返回类型:ClientboundBossEventPacket
  • 修饰符:public static

参数:

  • event: BossEvent

说明:

TODO

private void write(RegistryFriendlyByteBuf output) @ L76

  • 方法名:write
  • 源码定位:L76
  • 返回类型:void
  • 修饰符:private

参数:

  • output: RegistryFriendlyByteBuf

说明:

TODO

private static int encodeProperties(boolean darkenScreen, boolean playMusic, boolean createWorldFog) @ L82

  • 方法名:encodeProperties
  • 源码定位:L82
  • 返回类型:int
  • 修饰符:private static

参数:

  • darkenScreen: boolean
  • playMusic: boolean
  • createWorldFog: boolean

说明:

TODO

public PacketType<ClientboundBossEventPacket> type() @ L99

  • 方法名:type
  • 源码定位:L99
  • 返回类型:PacketType
  • 修饰符:public

参数:

说明:

TODO

public void handle(ClientGamePacketListener listener) @ L104

  • 方法名:handle
  • 源码定位:L104
  • 返回类型:void
  • 修饰符:public

参数:

  • listener: ClientGamePacketListener

说明:

TODO

public void dispatch(ClientboundBossEventPacket.Handler handler) @ L108

  • 方法名:dispatch
  • 源码定位:L108
  • 返回类型:void
  • 修饰符:public

参数:

  • handler: ClientboundBossEventPacket.Handler

说明:

TODO

代码

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;
    private 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 output) {
        }
    };
 
    private ClientboundBossEventPacket(UUID id, ClientboundBossEventPacket.Operation operation) {
        this.id = id;
        this.operation = operation;
    }
 
    private ClientboundBossEventPacket(RegistryFriendlyByteBuf input) {
        this.id = input.readUUID();
        ClientboundBossEventPacket.OperationType type = input.readEnum(ClientboundBossEventPacket.OperationType.class);
        this.operation = type.reader.decode(input);
    }
 
    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 output) {
        output.writeUUID(this.id);
        output.writeEnum(this.operation.getType());
        this.operation.write(output);
    }
 
    private static int encodeProperties(boolean darkenScreen, boolean playMusic, boolean createWorldFog) {
        int properties = 0;
        if (darkenScreen) {
            properties |= 1;
        }
 
        if (playMusic) {
            properties |= 2;
        }
 
        if (createWorldFog) {
            properties |= 4;
        }
 
        return properties;
    }
 
    @Override
    public PacketType<ClientboundBossEventPacket> type() {
        return GamePacketTypes.CLIENTBOUND_BOSS_EVENT;
    }
 
    public void handle(ClientGamePacketListener listener) {
        listener.handleBossUpdate(this);
    }
 
    public void dispatch(ClientboundBossEventPacket.Handler handler) {
        this.operation.dispatch(this.id, handler);
    }
 
    private 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;
 
        private 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 input) {
            this.name = ComponentSerialization.TRUSTED_STREAM_CODEC.decode(input);
            this.progress = input.readFloat();
            this.color = input.readEnum(BossEvent.BossBarColor.class);
            this.overlay = input.readEnum(BossEvent.BossBarOverlay.class);
            int flags = input.readUnsignedByte();
            this.darkenScreen = (flags & 1) > 0;
            this.playMusic = (flags & 2) > 0;
            this.createWorldFog = (flags & 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 output) {
            ComponentSerialization.TRUSTED_STREAM_CODEC.encode(output, this.name);
            output.writeFloat(this.progress);
            output.writeEnum(this.color);
            output.writeEnum(this.overlay);
            output.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) {
        }
    }
 
    private interface Operation {
        ClientboundBossEventPacket.OperationType getType();
 
        void dispatch(UUID id, ClientboundBossEventPacket.Handler handler);
 
        void write(RegistryFriendlyByteBuf output);
    }
 
    private static enum OperationType {
        ADD(ClientboundBossEventPacket.AddOperation::new),
        REMOVE(input -> ClientboundBossEventPacket.REMOVE_OPERATION),
        UPDATE_PROGRESS(ClientboundBossEventPacket.UpdateProgressOperation::new),
        UPDATE_NAME(ClientboundBossEventPacket.UpdateNameOperation::new),
        UPDATE_STYLE(ClientboundBossEventPacket.UpdateStyleOperation::new),
        UPDATE_PROPERTIES(ClientboundBossEventPacket.UpdatePropertiesOperation::new);
 
        private final StreamDecoder<RegistryFriendlyByteBuf, ClientboundBossEventPacket.Operation> reader;
 
        private OperationType(StreamDecoder<RegistryFriendlyByteBuf, ClientboundBossEventPacket.Operation> reader) {
            this.reader = reader;
        }
    }
 
    private record UpdateNameOperation(Component name) implements ClientboundBossEventPacket.Operation {
        private UpdateNameOperation(RegistryFriendlyByteBuf input) {
            this(ComponentSerialization.TRUSTED_STREAM_CODEC.decode(input));
        }
 
        @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 output) {
            ComponentSerialization.TRUSTED_STREAM_CODEC.encode(output, this.name);
        }
    }
 
    private record UpdateProgressOperation(float progress) implements ClientboundBossEventPacket.Operation {
        private UpdateProgressOperation(RegistryFriendlyByteBuf input) {
            this(input.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 output) {
            output.writeFloat(this.progress);
        }
    }
 
    private static class UpdatePropertiesOperation implements ClientboundBossEventPacket.Operation {
        private final boolean darkenScreen;
        private final boolean playMusic;
        private final boolean createWorldFog;
 
        private UpdatePropertiesOperation(boolean darkenScreen, boolean playMusic, boolean createWorldFog) {
            this.darkenScreen = darkenScreen;
            this.playMusic = playMusic;
            this.createWorldFog = createWorldFog;
        }
 
        private UpdatePropertiesOperation(RegistryFriendlyByteBuf input) {
            int flags = input.readUnsignedByte();
            this.darkenScreen = (flags & 1) > 0;
            this.playMusic = (flags & 2) > 0;
            this.createWorldFog = (flags & 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 output) {
            output.writeByte(ClientboundBossEventPacket.encodeProperties(this.darkenScreen, this.playMusic, this.createWorldFog));
        }
    }
 
    private static class UpdateStyleOperation implements ClientboundBossEventPacket.Operation {
        private final BossEvent.BossBarColor color;
        private final BossEvent.BossBarOverlay overlay;
 
        private UpdateStyleOperation(BossEvent.BossBarColor color, BossEvent.BossBarOverlay overlay) {
            this.color = color;
            this.overlay = overlay;
        }
 
        private UpdateStyleOperation(RegistryFriendlyByteBuf input) {
            this.color = input.readEnum(BossEvent.BossBarColor.class);
            this.overlay = input.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 output) {
            output.writeEnum(this.color);
            output.writeEnum(this.overlay);
        }
    }
}

引用的其他类