Bukkit(原版同理)的玩家/实体带颜色发光机制简谈
本文最后更新于 307 天前,其中的信息可能已经有所发展或是发生改变。

Bukkit(原版同理)的玩家/实体带颜色发光机制简谈

众所周知,在 Bukkit 的代表实体的 org.bukkit.entity.Entity 对象中有 setGlowing(boolean flag) 这么一个方法,根据 Javadoc 中的描述:

  • setGlowing

    void setGlowing(boolean flag)

    Sets whether the entity has a team colored (default: white) glow. nb: this refers to the ‘Glowing’ entity property, not whether a glowing potion effect is applied

    • Parameters:

    flag – if the entity is glowing

我们可以很容易的得知,这个方法是通过设置实体的 Glowing 属性,来实现让实体发光的效果。

但是我们发现,这样设置的实体发光,其发光颜色是白色的,但并没有在类似的位置找到设置实体发光颜色的方法。因此,该如何让一个实体发出其他颜色的光呢。

其实这就要借助 Minecraft 的记分板(ScoreBoard)功能了。众所周知,ScoreBoard 可以将玩家划分成不同的队伍,然后为队伍设置不同的颜色,此时,当玩家发光时,发光颜色就会变为队伍颜色。所以,我们需要为实体设置计分板队伍。

在过去的版本中,Bukkit 仅支持 OfflinePlayer 作为 Team 对象的成员,但现在,Bukkit 将成员的类型设置成了 String 而不是 OfflinePlayer,这就允许非玩家对象被加入 Team中。

那么,我们应该传入什么样的 String 来代表一个实体呢?很容易联想到就是实体的 UUID 了。

因此,键入以下代码:

Entity entity = ...
Scoreboard sb = Bukkit.getScoreboardManager().getMainScoreboard();
Team team = sb.registerNewTeam("Team_Name");
team.setColor(ChatColor.RED)
team.addEntry(entity.getUniqueId().toString())

此时,当为 entity 设置 setGlowing(true) 后,就会看到实体产生红色的光芒了。

使用这种方式设置的实体发光,支持诸如动物(Animal),怪物(Monster),掉落物(Item)等等一众的自然实体,除了…玩家。

这是一个令人疑惑的设计:当我们查看 Bukkit 已经弃用的 addPlayer 方法(而不是 addEntry )时,我们看到实现是这样的:

public void addPlayer(OfflinePlayer player) throws IllegalStateException, IllegalArgumentException {
        Validate.notNull(player, "OfflinePlayer cannot be null");
        this.addEntry(player.getName());
    }

这也就意味着,对于记分板而言,需要用玩家的游戏 ID 来表示这个玩家,而非这个玩家的 UUID,这是需要注意的一点。

同时,还需要注意的一些事情是:对于 ScoreboardManager,Bukkit 还提供了一个 getNewScoreboard() 方法用来产生一个新的子记分板,用以区分主记分板,但 使用这个计分板创建的队伍并不能(通过setColor方法)改变实体颜色。另外,由于 getMainScoreboard() 返回的记分板对象代表的是游戏世界的主记分板,因此,这些计分板数据 不仅可以被 /scoreboard 指令操控,所有修改还将随着世界一齐被保存,因此,当创建 Team 时,请务必检查上一次是否已经创建过一个同名的 Team,避免引发异常。

评论

  1. ZX夏夜之风
    Windows Chrome 100.0.4844.51
    5月前
    2022-4-22 15:21:09

    贺兰大佬,看完这篇文章之后我想到了之前我遇到的一个问题。
    当时我想用Minecraft队伍的那个隐藏名字设置来隐藏玩家名字,但是我失败了
    看到这句话我想到了可能的原因
    “使用这个计分板创建的队伍并不能(通过setColor方法)改变实体颜色。”
    同理,使用这个计分板创建的队伍是否也并不能隐藏玩家名称呢?

    • 博主
      ZX夏夜之风
      Android Chrome 100.0.4896.79
      5月前
      2022-4-22 15:33:39

      你别说,还真是。只有主计分板才能做到那些功能。之前在搞cmzy的时候恰巧也遇到这个问题了所以记得很清晰

  2. ZX夏夜之风
    Linux Chrome 89.0.4389.116
    5月前
    2022-4-24 18:43:31

    所以只要我把getNewScoreboard方法换成getMainScoreboard方法就可以了?
    (那相当于间接的使用了/team)

    • 博主
      ZX夏夜之风
      Android Chrome 100.0.4896.79
      5月前
      2022-4-24 18:52:09

      是,但同时也千万记得因为这些信息会被序列化到地图里,所以用完了一定要要removeTeam,否则下次重复创建同名team的时候会报错

  3. ZX夏夜之风
    Linux Chrome 89.0.4389.116
    5月前
    2022-4-25 12:07:07

    感谢大佬指导awa!

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇