ClientAdvancements.java

net.minecraft.client.multiplayer.ClientAdvancements

信息

  • 全限定名:net.minecraft.client.multiplayer.ClientAdvancements
  • 类型:public class
  • 包:net.minecraft.client.multiplayer
  • 源码路径:src/main/java/net/minecraft/client/multiplayer/ClientAdvancements.java
  • 起始行号:L25
  • 职责:

    TODO

字段/常量

  • LOGGER

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

      TODO

  • minecraft

    • 类型: Minecraft
    • 修饰符: private final
    • 源码定位: L27
    • 说明:

      TODO

  • telemetryManager

    • 类型: WorldSessionTelemetryManager
    • 修饰符: private final
    • 源码定位: L28
    • 说明:

      TODO

  • tree

    • 类型: AdvancementTree
    • 修饰符: private final
    • 源码定位: L29
    • 说明:

      TODO

  • progress

    • 类型: Map<AdvancementHolder,AdvancementProgress>
    • 修饰符: private final
    • 源码定位: L30
    • 说明:

      TODO

  • listener

    • 类型: ClientAdvancements.Listener
    • 修饰符: private
    • 源码定位: L31
    • 说明:

      TODO

  • selectedTab

    • 类型: AdvancementHolder
    • 修饰符: private
    • 源码定位: L32
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.client.multiplayer.ClientAdvancements.Listener
    • 类型: interface
    • 修饰符: public
    • 源码定位: L112
    • 说明:

      TODO

构造器

public ClientAdvancements(Minecraft minecraft, WorldSessionTelemetryManager telemetryManager) @ L34

  • 构造器名:ClientAdvancements
  • 源码定位:L34
  • 修饰符:public

参数:

  • minecraft: Minecraft
  • telemetryManager: WorldSessionTelemetryManager

说明:

TODO

方法

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

public void update(ClientboundUpdateAdvancementsPacket packet) @ L39

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

参数:

  • packet: ClientboundUpdateAdvancementsPacket

说明:

TODO

public AdvancementTree getTree() @ L74

  • 方法名:getTree
  • 源码定位:L74
  • 返回类型:AdvancementTree
  • 修饰符:public

参数:

说明:

TODO

public void setSelectedTab(AdvancementHolder selectedTab, boolean tellServer) @ L78

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

参数:

  • selectedTab: AdvancementHolder
  • tellServer: boolean

说明:

TODO

public void setListener(ClientAdvancements.Listener listener) @ L92

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

参数:

  • listener: ClientAdvancements.Listener

说明:

TODO

public AdvancementHolder get(Identifier id) @ L106

  • 方法名:get
  • 源码定位:L106
  • 返回类型:AdvancementHolder
  • 修饰符:public

参数:

  • id: Identifier

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class ClientAdvancements {
    private static final Logger LOGGER = LogUtils.getLogger();
    private final Minecraft minecraft;
    private final WorldSessionTelemetryManager telemetryManager;
    private final AdvancementTree tree = new AdvancementTree();
    private final Map<AdvancementHolder, AdvancementProgress> progress = new Object2ObjectOpenHashMap<>();
    private ClientAdvancements.@Nullable Listener listener;
    private @Nullable AdvancementHolder selectedTab;
 
    public ClientAdvancements(Minecraft minecraft, WorldSessionTelemetryManager telemetryManager) {
        this.minecraft = minecraft;
        this.telemetryManager = telemetryManager;
    }
 
    public void update(ClientboundUpdateAdvancementsPacket packet) {
        if (packet.shouldReset()) {
            this.tree.clear();
            this.progress.clear();
        }
 
        this.tree.remove(packet.getRemoved());
        this.tree.addAll(packet.getAdded());
 
        for (Entry<Identifier, AdvancementProgress> entry : packet.getProgress().entrySet()) {
            AdvancementNode node = this.tree.get(entry.getKey());
            if (node != null) {
                AdvancementProgress progress = entry.getValue();
                progress.update(node.advancement().requirements());
                this.progress.put(node.holder(), progress);
                if (this.listener != null) {
                    this.listener.onUpdateAdvancementProgress(node, progress);
                }
 
                if (!packet.shouldReset() && progress.isDone()) {
                    if (this.minecraft.level != null) {
                        this.telemetryManager.onAdvancementDone(this.minecraft.level, node.holder());
                    }
 
                    Optional<DisplayInfo> display = node.advancement().display();
                    if (packet.shouldShowAdvancements() && display.isPresent() && display.get().shouldShowToast()) {
                        this.minecraft.getToastManager().addToast(new AdvancementToast(node.holder()));
                    }
                }
            } else {
                LOGGER.warn("Server informed client about progress for unknown advancement {}", entry.getKey());
            }
        }
    }
 
    public AdvancementTree getTree() {
        return this.tree;
    }
 
    public void setSelectedTab(@Nullable AdvancementHolder selectedTab, boolean tellServer) {
        ClientPacketListener connection = this.minecraft.getConnection();
        if (connection != null && selectedTab != null && tellServer) {
            connection.send(ServerboundSeenAdvancementsPacket.openedTab(selectedTab));
        }
 
        if (this.selectedTab != selectedTab) {
            this.selectedTab = selectedTab;
            if (this.listener != null) {
                this.listener.onSelectedTabChanged(selectedTab);
            }
        }
    }
 
    public void setListener(ClientAdvancements.@Nullable Listener listener) {
        this.listener = listener;
        this.tree.setListener(listener);
        if (listener != null) {
            this.progress.forEach((holder, progress) -> {
                AdvancementNode node = this.tree.get(holder);
                if (node != null) {
                    listener.onUpdateAdvancementProgress(node, progress);
                }
            });
            listener.onSelectedTabChanged(this.selectedTab);
        }
    }
 
    public @Nullable AdvancementHolder get(Identifier id) {
        AdvancementNode node = this.tree.get(id);
        return node != null ? node.holder() : null;
    }
 
    @OnlyIn(Dist.CLIENT)
    public interface Listener extends AdvancementTree.Listener {
        void onUpdateAdvancementProgress(AdvancementNode advancement, AdvancementProgress progress);
 
        void onSelectedTabChanged(@Nullable AdvancementHolder selectedTab);
    }
}

引用的其他类