前言:
关于本篇知识需要了解Bukkit API中对Scoreboard的包装
这里以1.12.2版本为例,通过javadoc[API 帮助文档]中我们可以知道,在Bukkit中,关于Scoreboard计分板的操作都被放置在org.bukkit.scoreboard包中了,接下来我们可以尝试一下
注意:本篇文章依赖于Spiot核心,请在idea添加此核心在进行剩下的操作,需要添加Minecraft Development
首次打开idea创建一个package包,关于不能创建package包可以查看这篇文章,此package包名字我将设置为org.bukkit.scoreboard,接着创建一个类
我们创建对象,使用Scoreboard进行展示数据给玩家
创建一个类,类中创建player变量
package org.bukkit.scoreboard;
import org.bukkit.entity.Player;
public class djxtext {
public static void Text(Player player){
}
}
导入org.bukkit.Bukkit;
导入org.bukkit.entity.Player;
导入org.bukkit.scoreboard.ScoreboardManager;
注意,我们需要的ScoreboardManager[计分板管理]这个接口的对象
getMainScoreboard() | 获取初始服务器计分板 |
getNewScoreboard() | 获取一个新的计分板,由服务器持续保存监测,可受玩家,插件影响 |
ScoreboardManager manager = Bukkit.getScoreboardManager();//获取计分板管理赋值到manager变量
在Bukkit中这个静态中,我们可以直接使用Scoreboard接口的对象,我们可以通过manager里的方法来进行获取,接下来我们创建一个计分板
Scoreboard scoreboard = manager.getNewScoreboard();
第一个Scoreboard是接口 第二个scoreboard是变量赋值manager变量中的调用接口 ScoreboardManager一个getNewScoreboard方法
现在我们计分板已经创建完成接下来我们可以在里面添加内容
clearSlot(DisplaySlot slot) | 清除指定的DisplaySlot位置的Objective. |
getEntries() | 获取此记分板跟踪的所有条目 |
getEntryTeam(java.lang.String entry) | 获取在这个计分板上的项目队伍. |
getObjective(DisplaySlot slot) | 得到该计分板显示在某DisplaySlot的Objective. |
getObjective(java.lang.String name) | 通过Objective名称得到在这个计分板中对应的Objective. |
getObjectives() | 得到所有的Objective在该计分板中. |
getObjectivesByCriteria(java.lang.String criteria) | 通过Objective标准来得到在这个计分板中对应的Objective. |
getScores(java.lang.String entry) | 获取这个计分板上的所有分数. |
getTeam(java.lang.String teamName) | 得到一个给定名称的队伍在该计分板中. |
getTeams() | 得到这个计分板中所有的队伍 |
registerNewObjective(java.lang.String name, java.lang.String criteria) | 注册一个新的Objective在这个计分板中. |
registerNewTeam(java.lang.String name) | 注册一个新的队伍在这个计分板中. |
resetScores(java.lang.String entry) | 移除这个计分板中所有的分数(重置) . |
Objective objective = scoreboard.registerNewObjective(String name,String criteria,String displayName);
//String name内部名称 没有很多标准 只要没有与其他的名称重复就是
//String criteria 准则
//String displayName 显示名称
例如:
Objective objective = scoreboard.registerNewObjective("MGL","dummy","§e欢迎来到梦故里")//§e是我的世界颜色代码
注意:使用setDisplayName函数也是同样的效果
关于准则 我建议去中文MinecraftWiki
准则名称 | 描述 | 能否被修改 |
---|---|---|
dummy 虚拟型 | 只能通过命令修改分数,诸如死亡等游戏行为并不能修改分数。这可以被用来模拟事件标记、状态映射和货币等。 | 是 |
trigger 触发器 | 只能通过命令修改分数,诸如死亡等游戏行为并不能修改分数。/trigger 能够用于设置/增减使用trigger作准则的记分项。如果以trigger为准则的记分项没有对玩家启用,则该玩家使用该/trigger 命令会失败。成功使用过一次/trigger 成功之后,该玩家的该命令将重新被关闭。注意/trigger 可以在不允许作弊的情况下被非管理员的普通玩家使用。这可以比较方便地通过/tellraw 界面来实现玩家输入。 | 是 |
deathCount 死亡次数 | 当玩家死亡时,分数会自动增加。 | 是 |
playerKillCount 杀死玩家总量 | 当玩家杀死其他玩家时分数会自动增加。 | 是 |
totalKillCount 杀死生物总量 | 当玩家杀死其他生物时分数会自动增加。 | 是 |
health 生命值 | 普通玩家会在0~20之间。代表玩家拥有红心数量的两倍。在玩家第一次改变血量前会显示为0。额外的血或者伤害吸收的血也会计算在血量中,也就是说当获得了属性或者修饰器,或者伤害吸收、生命提升的效果后生命值可以超过20。 | 否 |
xp 经验值 | 对应玩家拥有的经验值。 | 否 |
level 等级 | 对应玩家当前的经验等级。 | 否 |
food 饱和度 | 在0~20之间,代表玩家拥有的饱和度。在玩家第一次改变饱和度前会显示为0。 | 否 |
air 空气值 | 在0~300之间;代表潜水的玩家剩余的空气,对应玩家的空气NBT标签。 | 否 |
armor 盔甲值 | 在0~20之间;代表玩家拥有的盔甲值。在玩家第一次更换盔甲前会显示为0。 | 否 |
一般我们常用虚拟型dummy和trigger触发型
dummy 型的准则同时也更适合于插件开发, 并且它不会被玩家死亡或击杀变动
接着我们给Objective设置显示的位置接着看Objective接口方法
显示位置 | 描述 |
---|---|
list 列表 | 在玩家列表中以黄色文字在玩家名称后显示分数信息(默认为Tab键),并不会显示记分项名称。[仅Java版] 在暂停页面的玩家列表显示分数信息。[仅基岩版] |
sidebar 侧边栏 | 在屏幕的右侧显示。在列表的最上方显示记分项的显示名称(display name),并显示玩家的高分榜。值得注意的是,即使玩家离线,如果在该记分项下存在一定分数也会在"侧边栏"中进行显示,并且没有痕迹的玩家也不会被显示。除此之外,以#开头的伪造的玩家名称在任何情况下都不会在侧边栏可见。 |
sidebar.team.<color> 侧边栏.队伍.<颜色>[仅Java版] | 有16个的具体队伍的侧边栏显示形式。它们和标准的侧边栏同样操作,但只有指定颜色的队伍中的玩家可以看见(例如"sidebar.team.green"绿色队伍中的玩家可以看见)。有效的颜色是:"black", "dark_blue", "dark_green", "dark_aqua", "dark_red", "dark_purple", "gold", "gray", "dark_gray", "blue", "green", "aqua", "red", "light_purple", "yellow", 和 "white"。 |
belowName 名称下方 | 在玩家的名称牌之下,在他们的头之上,于记分项的显示名称(display name)后面显示分数。在10个方块以外、玩家潜行时隐藏。这一显示位置在单人游戏中不可见。 |
getCriteria() | 获取对象规则. |
getDisplayName() | 获取对象内用于显示的名称. |
getDisplaySlot() | 获取对象显示的计分板位置区域. |
getName() | 获取对象名称. |
getScore(java.lang.String entry) | 获取一个对象的计分项目的积分. |
getScoreboard() | 获取对象所链接的计分板. |
isModifiable() | 获取布尔值:对象分数是否可以被插件直接修改. |
setDisplayName(java.lang.String displayName) | 设置对象内用于显示的名称. |
setDisplaySlot(DisplaySlot slot) | 设置对象显示的计分板位置区域. |
unregister() | 注销对象 scoreboard. |
objective.setDisplaySlot(DisplaySlot.SIDEBAR);
设置计分板位置在侧边栏
接着给记分项增加 内容与对应的分数 调用Score
这里我放出翻译过后的接口介绍
getEntry() | 获取此得分正在跟踪的条目 |
getObjective() | 获取此得分跟踪的目标 |
getScore() | 获取当前得分 |
getScoreboard() | 获取关联目标的计分板 |
isScoreSet() | 显示是否在任何时间点设置了此分数 |
setScore(int score) | 设置当前得分 |
Score djx1 = objective.getScore("§a§l欢迎来到梦故里 尊贵的:"+player.getDisplayName());
djx1.setScore(1);
Score djx2 = objective.getScore("/n");
djx1.setScore(2);
Score djx3 = objective.getScore("§b§l玩家生命值:"+player.getHealth());
djx1.setScore(3);
Score djx4 = objective.getScore("/n");
djx1.setScore(4);
Score djx5 = objective.getScore("§b§l玩家经验值值:"+player.getExp());
djx1.setScore(5);
Score djx6 = objective.getScore("§e§l祝你游戏愉快");
djx1.setScore(6);
将计分板显示到玩家客户端上
player.setScoreboard(scoreboard);
整体代码如下
package org.bukkit.scoreboard;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.ScoreboardManager;
public class djxtext {
public static void Text(Player player){
ScoreboardManager manager = Bukkit.getScoreboardManager();
Scoreboard scoreboard = manager.getNewScoreboard();
Objective objective = scoreboard.registerNewObjective("MGL","dummy","§e§l欢迎来到梦故里");
objective.setDisplaySlot(DisplaySlot.SIDEBAR);
Score djx1 = objective.getScore("§a§l欢迎来到梦故里 尊贵的:"+player.getDisplayName());
djx1.setScore(1);
Score djx2 = objective.getScore("/n");
djx1.setScore(2);
Score djx3 = objective.getScore("§b§l玩家生命值:"+player.getHealth());
djx1.setScore(3);
Score djx4 = objective.getScore("/n");
djx1.setScore(4);
Score djx5 = objective.getScore("§b§l玩家经验值值:"+player.getExp());
djx1.setScore(5);
Score djx6 = objective.getScore("§e§l祝你游戏愉快");
djx1.setScore(6);
player.setScoreboard(scoreboard);
}
}