七、计分板
写在前面
对于计分板,相信大部分人会认为这是一个计分的玩意。但不然,它的用处远远不止计分那样简单,计分板在服务器中起着重要的作用,在大部分插件中都有着它的身影。
另注:本章节有大量干货,请细细咀嚼。
获取计分板
- 获取原版的计分板
首先我们需要一个对象。
Scoreboard scoreboard;
然后,再去获得服务器的计分板。
//获取服务器中对主计分板的管理
scoreboard = getServer().getScoreboardManager().getMainScoreboard();
新建计分板
- 新建一个不受原版指令控制的计分板
Scoreboard scoreboard = manager.getNewScoreboard();
教程改进
由于§
是一个特殊的字符,而在键盘上并没有§
这个键,为了打代码更加的方便,我们将颜色标识§
转换为&
。
//将§转为&,这样我们打代码会更加方便
public String parse(String s) {
return s.replace("&","§").replace("§§","&");
}
在获取计分板之后,我们来看看计分板的作用。
1.计分项
- 计分板可以计分……当然,也不止计分。
我相信当初计分板的用途是用来显示玩家的分数及排名,但却被开发者们玩成了可以创建队伍又可以计分又可以写字的一块板子
1.1.计分项
- 计分项为
Objective
类
首先新建一个计分项:
Objective obj;
对于一个计分板,我们需要有标题、准则、内部名。
obj = scoreboard.registerNewObjective("内部名","dummy","我是标题~");
内部名和标题很好理解,而准测是什么?
准则 | 描述 |
---|---|
dummy | 无法使用指令修改准则 |
deathCount | 累加死亡次数准则 |
playerKillCount | 玩家击杀次数记录准则 |
killByTeam.XXX | 记录XXX队的击杀数准则 |
teamKill | 记录击杀队伍数准则 |
使用dummy
准则,使得玩家无法通过指令修改计分板,大大提高了插件的地位,加强插件集权。
之后,我们还需设置计分板显示位置:
//设置显示位置为侧边栏
obj.setDisplaySlot(DisplaySlot.SIDEBAR);
显示位置 | 描述 |
---|---|
BELOW_NAME | 设置位置在玩家Tag里 |
PLAYER_LIST | 设置位置在玩家列表中 |
SIDEBAR | 设置位置在侧边栏中 |
之后,我们就可以加入分数了。
- 分数为
Score
类
想要设置分数,首先需要找到Objective
Score score = obj.getScore("Java全科分数:");
之后就可以设置分数了:
score.setScore(760);
然后,向玩家推送计分板:
Player player = (Player) sender;
player.setScoreboard(scoreboard);
总结:先设置项,再为该项添加分数,最后推送给指定玩家(不推送玩家无法看见)
2.队伍
- Team可以帮助我们快速分队、设置选项。
2.1.基操
- 创建队伍。
Team team = scoreboard.registerNewTeam("红队");
在上面的代码中,我们在计分板中注册了“红队”这一队伍,并赋给team
。
而为了区别其他队伍,我们为这个team
中的所有玩家设置类似于称号一样的前缀(prefix)。
- 设置前缀
//设置红队所有玩家的前缀
team.setPrefix(parse("&[红队]"));
同样的,有前缀也就有后缀(Suffix):
- 设置后缀
team.setSuffix(parse("&a至高无上"));
但是,我们的队伍却是空的,我们需要向其加入玩家(实体):
- 加入实体
//加入实体
team.addEntry("Java");
如果我们想要移除一个实体,可以removeEntry
来实现。
- 移除实体
//移除实体
team.removeEntry("Java");
同样的,如果我们想要移除一个队伍,可以通过本身取消注册。
- 移除队伍
//移除队伍
team.unregister();
- 展示名
向其他队伍展示己队的名字,可以使用setDisplayName
team.setDisplayName(parse("&4至高无上的Java"));
效果图:
2.2.选项
- Team中有着许多选项供用。
既然Team是自带的,也是自家产的,多好的东西,干嘛自己写一个Team呢?
选项 | 描述 |
---|---|
NAME_TAG_VISIBILITY | 玩家名字是否可见 |
DEATH_MESSAGE_VISIBILITY | 死亡信息是否可见 |
COLLISION_RULE | 实体碰撞 |
如:我要设置队伍中的玩家名字可见,而在其他队伍中队友名字不可见。
team.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.FOR_OTHER_TEAMS);
上面代码中的FOR_OTHER_TEAMS
意思为对其他队伍关闭这个选项,如果是FOR_OWN_TEAM
则是对我所在的队伍关闭这个选项
此外,还有一些其他选项,不过不是通过setOption
来实现。
选项 | 描述 |
---|---|
setAllowFriendlyFire | 是否对友军开火 |
canSeeFriendlyInvisibles | 队友是否隐身 |
至于更多方法实现,请参阅BukkitAPI文档。
上一篇:我的世界Bukkit服务器插件开发教程(六)定时器
下一篇:我的世界Bukkit服务器插件开发教程(八)进度、进度条与自定义合成表