Bukkit ScoreBoard表现得很奇怪

时间:2016-02-16 00:59:41

标签: java bukkit

我有一个这样的记分板:

int time = 15;

private ScoreboardManager sbManager;
private Scoreboard scoreBoard; 
private Objective obj;

private Score s0;

public void init(Player player) {
    sbManager = Bukkit.getScoreboardManager();
    scoreBoard = sbManager.getNewScoreboard();

    obj = scoreBoard.registerNewObjective("ScoreBoard", "dummy");

    obj.setDisplaySlot(DisplaySlot.SIDEBAR);
    obj.setDisplayName("Test");

    s0 = obj.getScore(Bukkit.getOfflinePlayer("Time = " + time));

    s0.setScore(6);

    player.setScoreboard(scoreBoard);

    Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable(){

        public void run() {
            time--;
            updateScoreBoard(player);
            System.out.println(time);
        }

    },20, 20);
}

每当我尝试更新它时,它就不会工作,顺便说一下我的记分板是一个“花哨”的,所以看起来应该是这样的: 时间=时间6< - '6'是默认的Minecraft得分。

以下是我的更新方法示例:

public void updateScoreBoard(Player p){ 

    s0 = obj.getScore(Bukkit.getOfflinePlayer("Time =" + time));

    s0.setScore(6);

    p.setScoreboard(scoreBoard);
}

1 个答案:

答案 0 :(得分:1)

因为你以非传统的方式使用记分牌,所以事情一定会变得棘手。通过“花哨”,我假设您的意思是在左侧显示分数名称​​和值并且彼此相邻的记分牌,这是通过将实际分数值放在名称{{1}内部来完成的。得分(就像你已经做过的那样)。

您的代码的具体问题是您实际上并未更改现有分数条目的值(因为该值设置为6以使条目保持在显示的同一行中)但创建 new 每次更新显示时的分数条目,因为分数条目由其名称而不是其分数值标识(这是必需的,以便不同的分数条目可以具有相同的值,例如,玩家可以拥有“银行”平衡“得分值为2,死亡人数”得分为2)。

如果不是这种情况,那么名为“时间= 14”且分数值为6的新分数条目将覆盖名称为“时间= 15”的上一分数条目,因为分数值相同,但事实并非如此。

当我测试您的代码段时,添加了更多行(分数条目),直到显示填充到最大容量。我只能假设这是你的代码“表现得很奇怪”的意思,因为你没有详细说明代码的预期和观察结果。

您需要删除包含过期值的上一个得分条目。由于API不打算以这种方式使用,因此不能简单地从目标中删除分数条目(重置分数不会删除整个条目)。

因此,每当您想要更新单个“花式”分数条目时,您需要创建一个具有新目标等的新记分板。这也意味着记分板中显示的所有分数需要独立跟踪,并且每当更新任何其他“花式”分数时重新添加并重新设置到新记分板。

String方法的这些更改对我有用:

updateScoreboard

请注意,此方法仅修复了添加更多条目的即时问题,如果您想要更多“花哨”甚至可能是正常分数条目,则需要分别处理所有条目。

所有这些额外的工作以及总是位于显示屏右侧的无意义的数字/值似乎只是为了删除分数名称和值之间的一点空白。

其他一些提示:每次启动新public void updateScoreBoard(Player p) { scoreBoard = sbManager.getNewScoreboard(); obj = scoreBoard.registerNewObjective("ScoreBoard", "dummy"); obj.setDisplaySlot(DisplaySlot.SIDEBAR); obj.setDisplayName("Test"); s0 = obj.getScore(Bukkit.getOfflinePlayer("Time = " + time)); s0.setScore(6); p.setScoreboard(scoreBoard); } 的记分板时,都不需要更新sbManager变量,管理器始终是同一个对象,因此使用{{1}一次就足够了。