我的世界Bukkit服务器插件开发教程(七)计分板

  • Post author:
  • Post category:其他




七、计分板


写在前面


对于计分板,相信大部分人会认为这是一个计分的玩意。但不然,它的用处远远不止计分那样简单,计分板在服务器中起着重要的作用,在大部分插件中都有着它的身影。

另注:本章节有大量干货,请细细咀嚼。



获取计分板

  • 获取原版的计分板

首先我们需要一个对象。

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服务器插件开发教程(八)

进度

、进度条与自定义合成表



版权声明:本文为weixin_45445598原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。