[Minecraft教程]我的世界插件制作-计分板[Bukkit][Scoreboard]

前言:

        关于本篇知识需要了解Bukkit API中对Scoreboard的包装

        1.13+版本API        1.12.2版本API

        这里以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)得到该计分板显示在某DisplaySlotObjective.
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);
    }
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值