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

七、计分板

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

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


获取计分板

  • 获取原版的计分板

首先我们需要一个对象。

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服务器插件开发教程(八)进度、进度条与自定义合成表

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值