ServerScoreboard.java

net.minecraft.server.ServerScoreboard

信息

  • 全限定名:net.minecraft.server.ServerScoreboard
  • 类型:public class
  • 包:net.minecraft.server
  • 源码路径:src/main/java/net/minecraft/server/ServerScoreboard.java
  • 起始行号:L27
  • 继承:Scoreboard
  • 职责:

    TODO

字段/常量

  • server

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

      TODO

  • trackedObjectives

    • 类型: Set<Objective>
    • 修饰符: private final
    • 源码定位: L29
    • 说明:

      TODO

  • dirty

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L30
    • 说明:

      TODO

内部类/嵌套类型

构造器

public ServerScoreboard(MinecraftServer server) @ L32

  • 构造器名:ServerScoreboard
  • 源码定位:L32
  • 修饰符:public

参数:

  • server: MinecraftServer

说明:

TODO

方法

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

public void load(ScoreboardSaveData.Packed data) @ L36

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

参数:

  • data: ScoreboardSaveData.Packed

说明:

TODO

private ScoreboardSaveData.Packed store() @ L46

  • 方法名:store
  • 源码定位:L46
  • 返回类型:ScoreboardSaveData.Packed
  • 修饰符:private

参数:

说明:

TODO

protected void onScoreChanged(ScoreHolder owner, Objective objective, Score score) @ L50

  • 方法名:onScoreChanged
  • 源码定位:L50
  • 返回类型:void
  • 修饰符:protected

参数:

  • owner: ScoreHolder
  • objective: Objective
  • score: Score

说明:

TODO

protected void onScoreLockChanged(ScoreHolder owner, Objective objective) @ L70

  • 方法名:onScoreLockChanged
  • 源码定位:L70
  • 返回类型:void
  • 修饰符:protected

参数:

  • owner: ScoreHolder
  • objective: Objective

说明:

TODO

public void onPlayerRemoved(ScoreHolder player) @ L76

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

参数:

  • player: ScoreHolder

说明:

TODO

public void onPlayerScoreRemoved(ScoreHolder player, Objective objective) @ L83

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

参数:

  • player: ScoreHolder
  • objective: Objective

说明:

TODO

public void setDisplayObjective(DisplaySlot slot, Objective objective) @ L93

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

参数:

  • slot: DisplaySlot
  • objective: Objective

说明:

TODO

public boolean addPlayerToTeam(String player, PlayerTeam team) @ L116

  • 方法名:addPlayerToTeam
  • 源码定位:L116
  • 返回类型:boolean
  • 修饰符:public

参数:

  • player: String
  • team: PlayerTeam

说明:

TODO

public void removePlayerFromTeam(String player, PlayerTeam team) @ L130

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

参数:

  • player: String
  • team: PlayerTeam

说明:

TODO

public void onObjectiveAdded(Objective objective) @ L138

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

参数:

  • objective: Objective

说明:

TODO

public void onObjectiveChanged(Objective objective) @ L144

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

参数:

  • objective: Objective

说明:

TODO

public void onObjectiveRemoved(Objective objective) @ L154

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

参数:

  • objective: Objective

说明:

TODO

public void onTeamAdded(PlayerTeam team) @ L164

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

参数:

  • team: PlayerTeam

说明:

TODO

public void onTeamChanged(PlayerTeam team) @ L171

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

参数:

  • team: PlayerTeam

说明:

TODO

public void onTeamRemoved(PlayerTeam team) @ L179

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

参数:

  • team: PlayerTeam

说明:

TODO

protected void setDirty() @ L187

  • 方法名:setDirty
  • 源码定位:L187
  • 返回类型:void
  • 修饰符:protected

参数:

说明:

TODO

public void storeToSaveDataIfDirty(ScoreboardSaveData saveData) @ L191

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

参数:

  • saveData: ScoreboardSaveData

说明:

TODO

public List<Packet<?>> getStartTrackingPackets(Objective objective) @ L198

  • 方法名:getStartTrackingPackets
  • 源码定位:L198
  • 返回类型:List<Packet<?>>
  • 修饰符:public

参数:

  • objective: Objective

说明:

TODO

public void startTrackingObjective(Objective objective) @ L219

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

参数:

  • objective: Objective

说明:

TODO

public List<Packet<?>> getStopTrackingPackets(Objective objective) @ L231

  • 方法名:getStopTrackingPackets
  • 源码定位:L231
  • 返回类型:List<Packet<?>>
  • 修饰符:public

参数:

  • objective: Objective

说明:

TODO

public void stopTrackingObjective(Objective objective) @ L244

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

参数:

  • objective: Objective

说明:

TODO

public int getObjectiveDisplaySlotCount(Objective objective) @ L256

  • 方法名:getObjectiveDisplaySlotCount
  • 源码定位:L256
  • 返回类型:int
  • 修饰符:public

参数:

  • objective: Objective

说明:

TODO

private void updatePlayerWaypoint(String player) @ L268

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

参数:

  • player: String

说明:

TODO

private void updateTeamWaypoints(PlayerTeam team) @ L275

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

参数:

  • team: PlayerTeam

说明:

TODO

代码

public class ServerScoreboard extends Scoreboard {
    private final MinecraftServer server;
    private final Set<Objective> trackedObjectives = Sets.newHashSet();
    private boolean dirty;
 
    public ServerScoreboard(MinecraftServer server) {
        this.server = server;
    }
 
    public void load(ScoreboardSaveData.Packed data) {
        data.objectives().forEach(x$0 -> this.loadObjective(x$0));
        data.scores().forEach(x$0 -> this.loadPlayerScore(x$0));
        data.displaySlots().forEach((slot, name) -> {
            Objective objective = this.getObjective(name);
            this.setDisplayObjective(slot, objective);
        });
        data.teams().forEach(x$0 -> this.loadPlayerTeam(x$0));
    }
 
    private ScoreboardSaveData.Packed store() {
        return new ScoreboardSaveData.Packed(this.packObjectives(), this.packPlayerScores(), this.packDisplaySlots(), this.packPlayerTeams());
    }
 
    @Override
    protected void onScoreChanged(ScoreHolder owner, Objective objective, Score score) {
        super.onScoreChanged(owner, objective, score);
        if (this.trackedObjectives.contains(objective)) {
            this.server
                .getPlayerList()
                .broadcastAll(
                    new ClientboundSetScorePacket(
                        owner.getScoreboardName(),
                        objective.getName(),
                        score.value(),
                        Optional.ofNullable(score.display()),
                        Optional.ofNullable(score.numberFormat())
                    )
                );
        }
 
        this.setDirty();
    }
 
    @Override
    protected void onScoreLockChanged(ScoreHolder owner, Objective objective) {
        super.onScoreLockChanged(owner, objective);
        this.setDirty();
    }
 
    @Override
    public void onPlayerRemoved(ScoreHolder player) {
        super.onPlayerRemoved(player);
        this.server.getPlayerList().broadcastAll(new ClientboundResetScorePacket(player.getScoreboardName(), null));
        this.setDirty();
    }
 
    @Override
    public void onPlayerScoreRemoved(ScoreHolder player, Objective objective) {
        super.onPlayerScoreRemoved(player, objective);
        if (this.trackedObjectives.contains(objective)) {
            this.server.getPlayerList().broadcastAll(new ClientboundResetScorePacket(player.getScoreboardName(), objective.getName()));
        }
 
        this.setDirty();
    }
 
    @Override
    public void setDisplayObjective(DisplaySlot slot, @Nullable Objective objective) {
        Objective old = this.getDisplayObjective(slot);
        super.setDisplayObjective(slot, objective);
        if (old != objective && old != null) {
            if (this.getObjectiveDisplaySlotCount(old) > 0) {
                this.server.getPlayerList().broadcastAll(new ClientboundSetDisplayObjectivePacket(slot, objective));
            } else {
                this.stopTrackingObjective(old);
            }
        }
 
        if (objective != null) {
            if (this.trackedObjectives.contains(objective)) {
                this.server.getPlayerList().broadcastAll(new ClientboundSetDisplayObjectivePacket(slot, objective));
            } else {
                this.startTrackingObjective(objective);
            }
        }
 
        this.setDirty();
    }
 
    @Override
    public boolean addPlayerToTeam(String player, PlayerTeam team) {
        if (super.addPlayerToTeam(player, team)) {
            this.server
                .getPlayerList()
                .broadcastAll(ClientboundSetPlayerTeamPacket.createPlayerPacket(team, player, ClientboundSetPlayerTeamPacket.Action.ADD));
            this.updatePlayerWaypoint(player);
            this.setDirty();
            return true;
        } else {
            return false;
        }
    }
 
    @Override
    public void removePlayerFromTeam(String player, PlayerTeam team) {
        super.removePlayerFromTeam(player, team);
        this.server.getPlayerList().broadcastAll(ClientboundSetPlayerTeamPacket.createPlayerPacket(team, player, ClientboundSetPlayerTeamPacket.Action.REMOVE));
        this.updatePlayerWaypoint(player);
        this.setDirty();
    }
 
    @Override
    public void onObjectiveAdded(Objective objective) {
        super.onObjectiveAdded(objective);
        this.setDirty();
    }
 
    @Override
    public void onObjectiveChanged(Objective objective) {
        super.onObjectiveChanged(objective);
        if (this.trackedObjectives.contains(objective)) {
            this.server.getPlayerList().broadcastAll(new ClientboundSetObjectivePacket(objective, 2));
        }
 
        this.setDirty();
    }
 
    @Override
    public void onObjectiveRemoved(Objective objective) {
        super.onObjectiveRemoved(objective);
        if (this.trackedObjectives.contains(objective)) {
            this.stopTrackingObjective(objective);
        }
 
        this.setDirty();
    }
 
    @Override
    public void onTeamAdded(PlayerTeam team) {
        super.onTeamAdded(team);
        this.server.getPlayerList().broadcastAll(ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(team, true));
        this.setDirty();
    }
 
    @Override
    public void onTeamChanged(PlayerTeam team) {
        super.onTeamChanged(team);
        this.server.getPlayerList().broadcastAll(ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(team, false));
        this.updateTeamWaypoints(team);
        this.setDirty();
    }
 
    @Override
    public void onTeamRemoved(PlayerTeam team) {
        super.onTeamRemoved(team);
        this.server.getPlayerList().broadcastAll(ClientboundSetPlayerTeamPacket.createRemovePacket(team));
        this.updateTeamWaypoints(team);
        this.setDirty();
    }
 
    protected void setDirty() {
        this.dirty = true;
    }
 
    public void storeToSaveDataIfDirty(ScoreboardSaveData saveData) {
        if (this.dirty) {
            this.dirty = false;
            saveData.setData(this.store());
        }
    }
 
    public List<Packet<?>> getStartTrackingPackets(Objective objective) {
        List<Packet<?>> packets = Lists.newArrayList();
        packets.add(new ClientboundSetObjectivePacket(objective, 0));
 
        for (DisplaySlot slot : DisplaySlot.values()) {
            if (this.getDisplayObjective(slot) == objective) {
                packets.add(new ClientboundSetDisplayObjectivePacket(slot, objective));
            }
        }
 
        for (PlayerScoreEntry score : this.listPlayerScores(objective)) {
            packets.add(
                new ClientboundSetScorePacket(
                    score.owner(), objective.getName(), score.value(), Optional.ofNullable(score.display()), Optional.ofNullable(score.numberFormatOverride())
                )
            );
        }
 
        return packets;
    }
 
    public void startTrackingObjective(Objective objective) {
        List<Packet<?>> packets = this.getStartTrackingPackets(objective);
 
        for (ServerPlayer player : this.server.getPlayerList().getPlayers()) {
            for (Packet<?> packet : packets) {
                player.connection.send(packet);
            }
        }
 
        this.trackedObjectives.add(objective);
    }
 
    public List<Packet<?>> getStopTrackingPackets(Objective objective) {
        List<Packet<?>> packets = Lists.newArrayList();
        packets.add(new ClientboundSetObjectivePacket(objective, 1));
 
        for (DisplaySlot slot : DisplaySlot.values()) {
            if (this.getDisplayObjective(slot) == objective) {
                packets.add(new ClientboundSetDisplayObjectivePacket(slot, objective));
            }
        }
 
        return packets;
    }
 
    public void stopTrackingObjective(Objective objective) {
        List<Packet<?>> packets = this.getStopTrackingPackets(objective);
 
        for (ServerPlayer player : this.server.getPlayerList().getPlayers()) {
            for (Packet<?> packet : packets) {
                player.connection.send(packet);
            }
        }
 
        this.trackedObjectives.remove(objective);
    }
 
    public int getObjectiveDisplaySlotCount(Objective objective) {
        int count = 0;
 
        for (DisplaySlot slot : DisplaySlot.values()) {
            if (this.getDisplayObjective(slot) == objective) {
                count++;
            }
        }
 
        return count;
    }
 
    private void updatePlayerWaypoint(String player) {
        ServerPlayer serverPlayer = this.server.getPlayerList().getPlayerByName(player);
        if (serverPlayer != null) {
            serverPlayer.level().getWaypointManager().remakeConnections(serverPlayer);
        }
    }
 
    private void updateTeamWaypoints(PlayerTeam team) {
        for (ServerLevel level : this.server.getAllLevels()) {
            team.getPlayers()
                .stream()
                .map(name -> this.server.getPlayerList().getPlayerByName(name))
                .filter(Objects::nonNull)
                .forEach(player -> level.getWaypointManager().remakeConnections(player));
        }
    }
}

引用的其他类