本帖最后由 GiNYAi 于 2020-2-12 02:27 编辑

概览


关于翻译的一些说明
  • 本文最后更新与2018年4月20日,如果你发现其中的内容过时,请回帖提醒我更新。如果你发现了翻译或者排版的问题,也欢迎回帖指出。




设置

如果你无法正确地安装这个插件,这些页面会有所帮助。




配置文件基础

以下的页面会提供编辑BungeeTabListPlus的配置文件的基础知识。建议你在开始配置之前,按照顺序阅读全部页面。




配置文件进阶

这些页面包含一些更进阶的知识点。你可以以任何顺序阅读他们。但是建议在此之前阅读完基础部分。

  • 文本对齐与裁剪长文本

    了解如何文本对齐是如何工作的以及如何裁剪长文本。
  • 动画

    学习如何设置动画。
  • 配合PermissionsEx

    显示来自PermissionsEx的前缀和后缀,并且按照权限组排序玩家。
  • 使用PlaceholderAPI

    通过使用PlaceholderAPI,获取1000+的额外占位符。
  • 排序玩家

    玩家可以根据很多不同的标准排序。比如字母顺序,权限组或者服务器。
  • 自定义占位符

    自定义占位符是一种有力的工具,让你可以进一步的自定义Tab列表。
  • 多个Tab列表

    你可以给不同的玩家,服务器,MC版本等等,显示不同的Tab列表。
  • DYNAMIC_SIZE_FIXED_COLUMNS Tab列表样式

    DYNAMIC_SIZE_FIXED_COLUMNS 是第三种可用的tab列表样式。它与 FIXED_SIZE 十分相似。它会保持固定的列数,同时又会根据内容自动调整行数。
    你可以使用与使用 FIXED_SIZE 时相同方式,创建自定义格子,自由地设置Tab列表内容。




特殊页面

  • 配置文件示例

    一些优秀的例子。演示了你都可以使用这个插件实现哪些功能。你可以使用他们作为你自己Tab列表配置的起点。
  • 所有占位符

    所有内构占位符的列表。
  • 全局设置(config.yml)

    详细的解释了 config.yml 中的所有设置项,以防你可能会需要编辑其中的一些设置。
  • 所有元件

    所有元件以及各自的设置项的列表。
  • 表达式语法

    表达式语法的技术性的描述。



开发者资源

这里有一些你使用这个插件的API时可能会用上的的链接。




暂时废弃

安装BungeeTabListPlus


系统要求

  • BungeeCord 995 +
  • 通过使用ProtocolSupportBungee插件,你让这个插件兼容更古老的Minecraft客户端。
  • Java 8
  • 内存需求:根据你使用的设置与其它插件,BungeeCord需要设置的内存空间可能会有所不同。  

    玩家数量所需最小 RAM
      25100MB
      50250MB
      100500MB
      2501GB


安装

  • 从spigotmc或者jenkins下载BungeeTabListPlus.jar,并且把他安装到你的BungeeCord服务器上。

    如果你有使用RedisBungee连接的多个BungeeCord服务器,你需要在所有的BungeeCord服务器上安装这个插件。
  • 可选: 从spigotmc或者jenkins下载BungeeTabListPlus_BukkitBridge.jar,并且把它安装到你的所有的Spigot和Bukkit服务器上。(Spongo服务器安装BungeeTabListPlus_SpongeBridge.jar)

    大部分变量需要这步才能工作。同时,对于类似VanishNoPacket的支持也需要这步。



命令与权限

  • /btlp help

    所需权限: bungeetablistplus.command

    显示帮助信息。
  • /btlp status

    所需权限: bungeetablistplus.command

    显示插件的版本,检查更新以及桥插件的状态信息。
  • /btlp reload

    所需权限: bungeetablistplus.command bungeetablistplus.admin

    重载配置文件。
  • /btlp hide on

    所需权限: bungeetablistplus.command bungeetablistplus.hide

    将你自己从Tab列表中隐藏。
  • /btlp hide off

    所需权限: bungeetablistplus.command bungeetablistplus.hide

    使你在Tab列表中可见。
  • /btlp hide

    所需权限: bungeetablistplus.command bungeetablistplus.hide

    在隐身与不隐身之间切换。
  • /btlp fake add <name>

    所需权限: bungeetablistplus.command bungeetablistplus.admin

    向Tab列表中添加假人。
  • /btlp fake addrandom <number>

    所需权限: bungeetablistplus.command bungeetablistplus.admin

    向Tab列表中,添加 <number> 个随机假人。
  • /btlp fake remove <name>

    所需权限: bungeetablistplus.command bungeetablistplus.admin

    从Tab列表中移除一个假人。
  • /btlp fake removeall

    所需权限: bungeetablistplus.command bungeetablistplus.admin

    从Tab列表中移除所有假人。
  • /btlp fake list

    所需权限: bungeetablistplus.command bungeetablistplus.admin

    列出Tab列表中可见的假人。


所有占位符

玩家关联占位符

每个玩家关联占位符拥有两个版本:一个是关联正在查看Tab列表的玩家,另一个是关联一个显示在Tab列表上玩家。例如显示玩家的名字有 ${viewer name} ${player name} ,前者可以用在任何地方,而后者只能用在显示玩家的格子中以及玩家集合的过滤设置中。

Viewer 版本Player 版本
${viewer bungeecord_display_name} ${player bungeecord_display_name}
${viewer bungeecord_primary_group} ${player bungeecord_primary_group}
${viewer bungeeperms_display} ${player bungeeperms_display}
${viewer bungeeperms_prefix} ${player bungeeperms_prefix}
${viewer bungeeperms_primary_group} ${player bungeeperms_primary_group}
${viewer bungeeperms_primary_group_prefix} ${player bungeeperms_primary_group_prefix}
${viewer bungeeperms_suffix} ${player bungeeperms_suffix}
${viewer bungeeperms_user_prefix} ${player bungeeperms_user_prefix}
${viewer client_version} ${player client_version}
${viewer bungeeonlinetime_hours} ${player bungeeonlinetime_hours}
${viewer bungeeonlinetime_minutes} ${player bungeeonlinetime_minutes}
${viewer bungeeonlinetime_seconds} ${player bungeeonlinetime_seconds}
${viewer redisbungee_server_id} ${player redisbungee_server_id}
${viewer display_name} ${player display_name}
${viewer essentials_afk} ${viewer essentials_afk}
${viewer faction_at_current_location} ${player faction_at_current_location}
${viewer faction_member_count} ${player faction_member_count}
${viewer faction_name} ${player faction_name}
${viewer faction_online_member_count} ${player faction_online_member_count}
${viewer faction_player_power} ${player faction_player_power}
${viewer faction_power} ${player faction_power}
${viewer faction_rank} ${player faction_rank}
${viewer gamemode} ${player gamemode}
${viewer health} ${player health}
${viewer is_hidden} ${player is_hidden}
${viewer level} ${player level}
${viewer location_x} ${player location_x}
${viewer location_y} ${player location_y}
${viewer location_z} ${player location_z}
${viewer max_health} ${player max_health}
${viewer multiverse_world_alias} ${player multiverse_world_alias}
${viewer name} ${player name}
${viewer permission <permission>} ${player permission <permission>}
${viewer ping} ${player ping}
${viewer player_points} ${player player_points}
${viewer server} ${player server}
${viewer session_duration_hours} ${viewer session_duration_hours}
${viewer session_duration_minutes} ${viewer session_duration_minutes}
${viewer session_duration_seconds} ${viewer session_duration_seconds}
${viewer SimpleClans_ClanName} ${player SimpleClans_ClanName}
${viewer SimpleClans_ClanMembers} ${player SimpleClans_ClanMembers}
${viewer SimpleClans_ClanTag} ${player SimpleClans_ClanTag}
${viewer SimpleClans_ClanTagLabel} ${player SimpleClans_ClanTagLabel}
${viewer SimpleClans_ClanColorTag} ${player SimpleClans_ClanColorTag}
${viewer SimpleClans_OnlineClanMembers} ${player SimpleClans_OnlineClanMembers}
${viewer skin} ${player skin}
${viewer tab_name} ${player tab_name}
${viewer team} ${player team}
${viewer total_xp} ${player total_xp}
${viewer uuid} ${player uuid}
${viewer vault_balance} ${player vault_balance}
${viewer vault_balance2} ${player vault_balance2}
${viewer vault_currency} ${player vault_currency}
${viewer vault_currency_plural} ${player vault_currency_plural}
${viewer vault_primary_group} ${player vault_primary_group}
${viewer vault_player_prefix} ${player vault_player_prefix}
${viewer vault_prefix} ${player vault_prefix}
${viewer vault_primary_group_prefix} ${player vault_primary_group_prefix}
${viewer vault_suffix} ${player vault_suffix}
${viewer world} ${player world}
${viewer xp} ${player xp}
${viewer askyblock_island_level} ${player askyblock_island_level}
${viewer askyblock_island_name} ${player askyblock_island_name}
${viewer askyblock_team_leader} ${player askyblock_team_leader}
${viewer luckperms_prefix} ${player luckperms_prefix}
${viewer luckperms_suffix} ${player luckperms_suffix}
${viewer luckperms_primary_group} ${player luckperms_primary_group}
${viewer paf_clans_clan_name} ${player paf_clans_clan_name}
${viewer paf_clans_clan_tag} ${player paf_clans_clan_tag}
${viewer paf_clans_clan_member_count} ${player paf_clans_clan_member_count}
${viewer paf_clans_clan_online_member_count} ${player paf_clans_clan_online_member_count}
${viewer paf_clans_is_leader} ${player paf_clans_is_leader}

服务器关联占位符

  • TPS

    ${server:<server name> tps} 基于某个特定的服务器解释占位符。例如: ${server:factions tps}

    ${viewer server tps} 正在查看Tab列表的玩家所连接的服务器的tps。相应的也有 ${player server tps}

    ${server tps} 可以在 players by server 元件中的 serverHeader 中使用。
  • 在线状态

    ${server:<server name> online} 检查特定的服务器是否在线。player和viewer的变种也存在,但是我不认为他们有什么用。

    ${server online} 也可以在 players by server 元件中的 serverHeader 中使用。

    这个占位符会被解析为 true 或者 false ,所以单独使用它,可能和你的预期有所出入,你或许会希望在一个 条件元件 中使用其作为条件。

特殊占位符

  • ${time <format>}

    显示当前的时间。例如 ${time HH:mm:ss} 。你可以在这里获取更多关于日期格式的信息 https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html.
  • ${server_player_count} 可以在 players by server 元件中的 serverHeader 中使用。
  • ${other_count} 可以在所有向Tab列表添加玩家的元件的 morePlayersComponent 设置项中使用。
  • ${playerset:<name> size} 一个玩家集合中玩家的数量. 详见 玩家集合.


配置文件基础 Part 1: 概览

这个页面提供可以的配置的文件和目录的概览。解释什么设置项可以在哪个文件中设置。

  • config.yml :

    全局设置项,例如时间占位符所使用的时区。 你很有可能并不需要修改这里的任何一项。
  • tabLists/

    这里存放控制Tab列表样式的文件。默认,这里只会有一个名为 default.yml 的文件。然而你可以创建更多文件并根据若干条件(例如:不同服务器或者不同权限组)来提供不同Tab列表给不同的玩家。如何实现的细节将会在稍后讨论。
  • heads/

    这是可以用作Tab列表中图标的图片文件的目录。 如果你愿意,你可以添加自定义图标。文件必须为8x8像素,png格式。



配置文件基础 Part 2: Tab列表配置文件结构


Tab列表的样式由文件 tabLists/default.yml 定义。这页解释该文件的结构。

你可以通过在 tabLists 文件夹中,使用这里描述的格式,创建多个 *.yml 文件来创建多个Tab列表样式。这样可以实现例如在指定服务器给管理员和玩家显示不同的Tab列表。更多信息见多个Tab列表

每一个Tab列表配置可以被分成两部分。共通部分在所有Tab列表配置文件中都是一样的,而样式特有部分则根据你想创建固定/动态(根据在线玩家数量调整)大小的Tab列表而不同。

FIXED_SIZE(固定大小)
DYNAMIC_SIZE(动态大小)

共通部分

接下来的代码示例只是让你看一下Tab列表配置文件共通部分的组成是什么样的。如果其中的一些部分看起来过于复杂,不要担心,之后会详细解释的。

  1. showTo: "all"
  2. priority: 0

  3. showHeaderFooter: true
  4. header:
  5. - '&cWelcome &f${viewer name}'
  6. - '&eW&celcome &f${viewer name}'
  7. - '&eWe&clcome &f${viewer name}'
  8. - '&eWel&ccome &f${viewer name}'
  9. - '&eWelc&come &f${viewer name}'
  10. - '&eWelco&cme &f${viewer name}'
  11. - '&eWelcom&ce &f${viewer name}'
  12. - '&eWelcome &f${viewer name}'
  13. - '&cW&eelcome &f${viewer name}'
  14. - '&cWe&elcome &f${viewer name}'
  15. - '&cWel&ecome &f${viewer name}'
  16. - '&cWelc&eome &f${viewer name}'
  17. - '&cWelco&eme &f${viewer name}'
  18. - '&cWelcom&ee &f${viewer name}'
  19. - '&cWelcome &f${viewer name}'
  20. headerAnimationUpdateInterval: 0.2
  21. footer:
  22. - |-
  23.   &6Line 1
  24.   &eLine 2
  25. - |-
  26.   &eLine 1
  27.   &6Line 2
  28. footerAnimationUpdateInterval: 0.5

  29. customPlaceholders:
  30.   afk_tag:
  31.     !conditional
  32.     condition: ${player essentials_afk}
  33.     true: '&7|&oaway'
  34.     false: ''
  35.   viewer_colored_ping0:
  36.     !conditional
  37.     condition: "${viewer ping} < 50"
  38.     true: "&a${viewer ping}"
  39.     false: "&e${viewer ping}"
  40.   viewer_colored_ping:
  41.     !conditional
  42.     condition: "${viewer ping} < 150"
  43.     true: ${viewer_colored_ping0}
  44.     false: "&c${viewer ping}"

  45. playerSets:
  46.   global:
  47.     filter: "true"

  48. type: FIXED_SIZE
复制代码

type 可以被设置为 FIXED_SIZE DYNAMIC_SIZE 。根据所选样式的不同,会有不同的特有部分可用。

FIXED_SIZE 选项让你的Tab列表拥有固定的大小,有些类似于1.8之前的Tab列表。它还允许你使用自定义格,来向玩家展示额外的信息。

DYNAMIC_SIZE 选项则有些类似于原版的Tab列表。它会调整它的大小以适应在线玩家的数量。然而它并不允许使用自定义格。

FIXED_SIZE 特有部分

这部分的代码示例只是给你展示固定大小的样式的特殊选项是由哪些元素组成的。如果你现在无法理解它,不用担心,它在这只是作为一个示例。

  1. size: 60

  2. defaultIcon: colors/dark_gray.png
  3. defaultPing: 1000

  4. components:
  5. - {text: "&cServer: &6${viewer server}", icon: "default/server.png", ping: 0}
  6. - {text: "&cRank: &6${viewer vault_primary_group}", icon: "default/rank.png", ping: 0}
  7. - {text: "&cPing: ${viewer_colored_ping}ms", icon: "default/ping.png", ping: 0}
  8. -
  9. -
  10. -
  11. - !players_by_server
  12.   playerSet: global
  13.   serverHeader:
  14.   - {text: "&e&n${server}&f&o (${server_player_count}):", icon: "colors/yellow.png", ping: 0}
  15.   serverSeparator:
  16.   -
  17.   -
  18.   -
  19.   includeEmptyServers: true
  20.   playerComponent: "${player vault_prefix}${player name}${afk_tag}"
  21.   morePlayersComponent: {text: "&7... and &e${other_count} &7others", icon: "colors/gray.png", ping: 0}
  22. - !spacer {}
  23. -
  24. -
  25. -
  26. - !animated
  27.   interval: 0.2
  28.   components:
  29.   - {text: "&6&c=&6==============", icon: "colors/gold.png", ping: 0}
  30.   - {text: "&6=&c=&6=============", icon: "colors/gold.png", ping: 0}
  31.   - {text: "&6==&c=&6============", icon: "colors/gold.png", ping: 0}
  32.   - {text: "&6===&c=&6===========", icon: "colors/gold.png", ping: 0}
  33.   - {text: "&6====&c=&6==========", icon: "colors/gold.png", ping: 0}
  34.   - {text: "&6=====&c=&6=========", icon: "colors/gold.png", ping: 0}
  35.   - {text: "&6======&c=&6========", icon: "colors/gold.png", ping: 0}
  36.   - {text: "&6=======&c=&6=======", icon: "colors/gold.png", ping: 0}
  37.   - {text: "&6========&c=&6======", icon: "colors/gold.png", ping: 0}
  38.   - {text: "&6=========&c=&6=====", icon: "colors/gold.png", ping: 0}
  39.   - {text: "&6==========&c=&6====", icon: "colors/gold.png", ping: 0}
  40.   - {text: "&6===========&c=&6===", icon: "colors/gold.png", ping: 0}
  41.   - {text: "&6============&c=&6==", icon: "colors/gold.png", ping: 0}
  42.   - {text: "&6=============&c=&6=", icon: "colors/gold.png", ping: 0}
  43.   - {text: "&6==============&c=&6", icon: "colors/gold.png", ping: 0}
  44. - !animated
  45.   interval: 0.2
  46.   components:
  47.   - {text: "&6&c=&6==============", icon: "colors/gold.png", ping: 0}
  48.   - {text: "&6=&c=&6=============", icon: "colors/gold.png", ping: 0}
  49.   - {text: "&6==&c=&6============", icon: "colors/gold.png", ping: 0}
  50.   - {text: "&6===&c=&6===========", icon: "colors/gold.png", ping: 0}
  51.   - {text: "&6====&c=&6==========", icon: "colors/gold.png", ping: 0}
  52.   - {text: "&6=====&c=&6=========", icon: "colors/gold.png", ping: 0}
  53.   - {text: "&6======&c=&6========", icon: "colors/gold.png", ping: 0}
  54.   - {text: "&6=======&c=&6=======", icon: "colors/gold.png", ping: 0}
  55.   - {text: "&6========&c=&6======", icon: "colors/gold.png", ping: 0}
  56.   - {text: "&6=========&c=&6=====", icon: "colors/gold.png", ping: 0}
  57.   - {text: "&6==========&c=&6====", icon: "colors/gold.png", ping: 0}
  58.   - {text: "&6===========&c=&6===", icon: "colors/gold.png", ping: 0}
  59.   - {text: "&6============&c=&6==", icon: "colors/gold.png", ping: 0}
  60.   - {text: "&6=============&c=&6=", icon: "colors/gold.png", ping: 0}
  61.   - {text: "&6==============&c=&6", icon: "colors/gold.png", ping: 0}
  62. - !animated
  63.   interval: 0.2
  64.   components:
  65.   - {text: "&6&c=&6==============", icon: "colors/gold.png", ping: 0}
  66.   - {text: "&6=&c=&6=============", icon: "colors/gold.png", ping: 0}
  67.   - {text: "&6==&c=&6============", icon: "colors/gold.png", ping: 0}
  68.   - {text: "&6===&c=&6===========", icon: "colors/gold.png", ping: 0}
  69.   - {text: "&6====&c=&6==========", icon: "colors/gold.png", ping: 0}
  70.   - {text: "&6=====&c=&6=========", icon: "colors/gold.png", ping: 0}
  71.   - {text: "&6======&c=&6========", icon: "colors/gold.png", ping: 0}
  72.   - {text: "&6=======&c=&6=======", icon: "colors/gold.png", ping: 0}
  73.   - {text: "&6========&c=&6======", icon: "colors/gold.png", ping: 0}
  74.   - {text: "&6=========&c=&6=====", icon: "colors/gold.png", ping: 0}
  75.   - {text: "&6==========&c=&6====", icon: "colors/gold.png", ping: 0}
  76.   - {text: "&6===========&c=&6===", icon: "colors/gold.png", ping: 0}
  77.   - {text: "&6============&c=&6==", icon: "colors/gold.png", ping: 0}
  78.   - {text: "&6=============&c=&6=", icon: "colors/gold.png", ping: 0}
  79.   - {text: "&6==============&c=&6", icon: "colors/gold.png", ping: 0}
  80. - {text: "&cTime: &6${time H:mm:ss}", icon: "default/clock.png", ping: 0}
  81. - {text: "&cPlayers: &6${playerset:global size}", icon: "default/players.png", ping: 0}
  82. - {text: "&cBalance: &6${viewer vault_balance 1.2}", icon: "default/balance.png", ping: 0}
复制代码

DYNAMIC_SIZE 特有部分

  1. playerSet: global

  2. playerOrder: "vaultGroupInfo,alphabetically"

  3. playerComponent: "${player name}"
复制代码


配置文件基础 Part 3: 页眉与页脚

页眉与页脚可以由Tab列表配置文件设置。Tab列表配置文件指 tabLists 文件夹中所有的 .yml 文件。默认只有 tabLists/default.yml

配置文件中控制页眉和页脚的部分是这样的:

  1. showHeaderFooter: true
  2. header:
  3. - '&cWelcome &f${viewer name}'
  4. - '&eW&celcome &f${viewer name}'
  5. - '&eWe&clcome &f${viewer name}'
  6. - '&eWel&ccome &f${viewer name}'
  7. - '&eWelc&come &f${viewer name}'
  8. - '&eWelco&cme &f${viewer name}'
  9. - '&eWelcom&ce &f${viewer name}'
  10. - '&eWelcome &f${viewer name}'
  11. - '&cW&eelcome &f${viewer name}'
  12. - '&cWe&elcome &f${viewer name}'
  13. - '&cWel&ecome &f${viewer name}'
  14. - '&cWelc&eome &f${viewer name}'
  15. - '&cWelco&eme &f${viewer name}'
  16. - '&cWelcom&ee &f${viewer name}'
  17. - '&cWelcome &f${viewer name}'
  18. headerAnimationUpdateInterval: 0.2
  19. footer:
  20. - |-
  21.   &6Line 1
  22.   &eLine 2
  23. - |-
  24.   &eLine 1
  25.   &6Line 2
  26. footerAnimationUpdateInterval: 0.5
复制代码

showHeaderFooter 用来设置页眉与页脚的开启/关闭。如果你使用bukkit插件提供页眉与页脚的话,你可能会需要关闭本插件的。

header footer 设置项包含页眉和页脚中实际显示的文本。你可以在其中使用以 § & 作为标记样式代码。对于所有的占位符你必须使用其 viewer 变体。

如果你给页眉与页脚提供了多条文本, headerAnimationUpdateInterval footerAnimationUpdateInterval 可以控制插件在你提供的文本间切换的间隔。这可以用来创建动画。

简单的无动画页眉与页脚

这里演示了如何创建一个简单的,没有动画的页眉与页脚。

  1. showHeaderFooter: true
  2. header:
  3. - '&cWelcome &f${viewer name}' # The header text
  4. headerAnimationUpdateInterval: 0.2 # Ignore this, there's no animation
  5. footer:
  6. - '&f&nPowered by BungeeTabListPlus' # The footer text
  7. footerAnimationUpdateInterval: 0.5 # Ignore this, there's no animation
复制代码

多行页眉与页脚

你可以像这样创建一个多行的页眉与页脚:

  1. showHeaderFooter: true
  2. header: # The header text:
  3. - |-
  4.   &cWelcome &f${viewer name}
  5.   &bto yourserver.example.com
  6. headerAnimationUpdateInterval: 0.2 # Ignore this, there's no animation
  7. footer: # The footer text:
  8. - |-
  9.   &6Line 1
  10.   &eLine 2
  11. footerAnimationUpdateInterval: 0.5 # Ignore this, there's no animation
复制代码

动画页眉与页脚

这里是有动画效果的例子:

  1. showHeaderFooter: true
  2. header:
  3. - '&cWelcome &f${viewer name}'
  4. - '&eW&celcome &f${viewer name}'
  5. - '&eWe&clcome &f${viewer name}'
  6. - '&eWel&ccome &f${viewer name}'
  7. - '&eWelc&come &f${viewer name}'
  8. - '&eWelco&cme &f${viewer name}'
  9. - '&eWelcom&ce &f${viewer name}'
  10. - '&eWelcome &f${viewer name}'
  11. - '&cW&eelcome &f${viewer name}'
  12. - '&cWe&elcome &f${viewer name}'
  13. - '&cWel&ecome &f${viewer name}'
  14. - '&cWelc&eome &f${viewer name}'
  15. - '&cWelco&eme &f${viewer name}'
  16. - '&cWelcom&ee &f${viewer name}'
  17. - '&cWelcome &f${viewer name}'
  18. headerAnimationUpdateInterval: 0.2
  19. footer:
  20. - |-
  21.   &6Line 1
  22.   &eLine 2
  23. - |-
  24.   &eLine 1
  25.   &6Line 2
  26. footerAnimationUpdateInterval: 0.5
复制代码

headerAnimationUpdateInterval 控制多少秒之后(这里是0.2秒)下一个文本会被显示。页脚的与此相同。


配置文件基础 Part 4: 玩家集合

一个 玩家集合 是一个你全部玩家的子集,每个玩家集合都有其名字。玩家集合在插件显示玩家与玩家数量时会用到。

玩家集合在Tab列表配置文件中定义。一个简单的包含所有玩家的 玩家集合 可以像这样创建:

  1. playerSets:
  2.   all_players: # 玩家集合的名字
  3.     filter: all # 包含所有玩家
复制代码

现在你可以使用这个 玩家集合 在你服务器的页眉与页脚中显示玩家数量了:

  1. footer:
  2. - '&7Total players:&f ${playerset:all_players size}'
复制代码

就如你从上面的例子中看到的那样。 ${playerset:all_players size} 占位符可以显示 玩家集合 中玩家的数量。所有的 玩家集合 都可以这样使用:使用 ${playerset:<name> size} 显示特定 玩家集合 中玩家的数量。

我们来创建一个 玩家集合 只包含特定服务器上的玩家。在这个例子中,假装这里有一个叫做 lobby 的服务器。

  1. playerSets:
  2.   all_players:
  3.     filter: all
  4.   lobby:
  5.     filter: ${player server} == "lobby"
复制代码

现在还不是很难。让我们再创建一个服务器 survival 玩家集合

  1. playerSets:
  2.   all_players:
  3.     filter: all
  4.   lobby:
  5.     filter: ${player server} == "lobby"
  6.   survival:
  7.     filter: ${player server} == "survival"
复制代码

使用这些在页脚显示服务器玩家数量:

  1. footer:
  2. - |-
  3.   &7Total players:&f ${playerset:all_players size}
  4.   Lobby: ${playerset:lobby size} | Survival: ${playerset:survival size}
复制代码

现在来说一下,在 玩家集合 filter (过滤器)中使用占位符。当添加玩家到集合中时,通常你会需要使用占位符的 player 变种。

最后但也同样重要的,我们来创建一个包含所有管理员的 玩家集合。这个例子中认为拥有 admin 或者 owner 权限组的玩家是管理员:

  1. playerSets:
  2.   all_players:
  3.     filter: all
  4.   lobby:
  5.     filter: ${player server} == "lobby"
  6.   survival:
  7.     filter: ${player server} == "survival"
  8.   admins:
  9.     filter: ${player vault_primary_group} == "admin" or ${player vault_primary_group} == "owner"
复制代码

为了增加可读性,复杂的 filter (过滤器)可以被分成多行:

  1. playerSets:
  2.   all_players:
  3.     filter: all
  4.   lobby:
  5.     filter: ${player server} == "lobby"
  6.   survival:
  7.     filter: ${player server} == "survival"
  8.   admins:
  9.     filter: |-
  10.       ${player vault_primary_group} == "admin"
  11.       or ${player vault_primary_group} == "owner"
复制代码

      

配置文件基础 Part 5: 动态大小Tab列表

正如你已经了解的BungeeTabListPlus把Tab列表分为两类。这页讨论动态大小Tab列表。动态大小Tab列表根据要显示的玩家的数量调整他的大小,但是其并不允许使用自定义内容的格子。

下面的图片展示了一个动态大小Tab列表是什么样子的。

这里是一个创建动态大小Tab列表的配置文件,可以创建动态大小Tab列表:

  1. showTo: "all"
  2. priority: 0

  3. playerSets:
  4.   all_players: #一个包含所有玩家的玩家集合
  5.     filter: "true"
  6.     hiddenPlayers: "VISIBLE" #在Tab列表上显示隐藏的玩家,来避免小问题

  7. # 一个简易的页眉与页脚
  8. showHeaderFooter: true
  9. header:
  10. - '&cWelcome &f${viewer name}'
  11. headerAnimationUpdateInterval: 1.0
  12. footer:
  13. - '&f&oPowered by BungeeTabListPlus'
  14. footerAnimationUpdateInterval: 1.0

  15. # 我们需要一个动态大小的Tab列表
  16. type: DYNAMIC_SIZE

  17. # 下面是动态大小Tab列表的特有设置项

  18. # 在这里,你可以通过指定一个玩家集合来设置显示哪些玩家。
  19. # 这个示例中,我们使用上面创建的玩家集合`all_players`。
  20. playerSet: all_players

  21. # 在这里可以设置玩家们的排序方式。
  22. playerOrder: "alphabetically"

  23. # 这个设置项控制玩家名字的样式。
  24. playerComponent: "${player name}"
复制代码

现在让我们来仔细看一下动态大小Tab列表特有设置项: playerSet 选项用来设置在Tab列表上显示哪些玩家。

playerOrder 选项用来设置玩家的顺序。 更多信息

playerComponent 控制玩家格的样式。如果你喜欢你可以在这里添加前缀。注意使用占位符时你需要使用 player 变种。



配置文件基础 Part 6: 固定大小Tab列表 - 简介

这页讨论固定大小Tab列表。要创建一个固定大小Tab列表,必需吧Tab列表配置文件中的 type 设置为 FIXED_SIZE



简单示例



  1. showTo: all
  2. priority: 1

  3. showHeaderFooter: false

  4. playerSets: {} # 现在仍什么都没有

  5. type: FIXED_SIZE

  6. size: 80

  7. defaultIcon: colors/black.png
  8. defaultPing: 1000

  9. components:
  10. - 'Slot 1'
  11. - 'Slot 2'
  12. - 'Slot 3'
  13. - 'Slot 4'
  14. - 'Slot 5'
  15. - 'Slot 6'
  16. - 'Slot 7'
  17. - 'Slot 8'
  18. - 'Slot 9'
  19. - 'Slot 10'
复制代码

size 选项控制Tab列表的大小。这里是一些常用的值:

size
20120
30215
40220
60320
80420

注意 size 超过80无法在Minecraft 1.8以上版本使用。对于Minecraft 1.7以及之前的版本,Tab列表配置文件中的 size 必须与BungeeCord的config.yml中设置的一致。

defaultIcon defaultPing 选项用来设置空格子以及未指定图标的自定义格的图标与ping。关于图标已经ping会在稍后详细解释。

现在,你可以尝试自己修改Tab列表的尺寸以及添加自定义格了。



在自定义格中使用颜色与占位符

你可以使用以 § & 为标记的样式代码。对于所有玩家相关的占位符你需要使用 viewer 变种。

例子:



  1. showTo: all
  2. priority: 1

  3. showHeaderFooter: false

  4. playerSets:
  5.   all_players:
  6.     filter: all

  7. type: FIXED_SIZE

  8. size: 80

  9. defaultIcon: colors/black.png
  10. defaultPing: 1000

  11. components:
  12. - '&aGreen'
  13. - '&bBlue'
  14. - '&cRed'
  15. - '&eYellow'
  16. - 'Players: ${playerset:all_players size}'
  17. - 'Ping: ${viewer ping}'
  18. - 'Server: ${viewer server}'
复制代码

这个例子中展示了颜色代码的使用,在自定义格中显示一个玩家集合的数量,以及显示ping和玩家所在服务器的占位符。



更改自定义格的图标以及ping状态

在之前的例子中,我们使用

  1. - '&aGreen'
复制代码

来创建一个自定义格。上面的实际是一种简写。完整的格式:

  1. - {text: '&aGreen'}
复制代码

使用完整格式还可以让我们修改该格子的图标与ping:

  1. - {text: '&aGreen', icon: 'colors/green.png', ping: 100}
复制代码

现在我们来看一下我们可以怎么样使用这些知识改进上面的例子



  1. showTo: all
  2. priority: 1

  3. showHeaderFooter: false

  4. playerSets:
  5.   all_players:
  6.     filter: all

  7. type: FIXED_SIZE

  8. size: 80

  9. defaultIcon: colors/black.png
  10. defaultPing: 1000

  11. components:
  12. - {text: '&aGreen', icon: 'colors/green.png'}
  13. - {text: '&bBlue', icon: 'colors/aqua.png'}
  14. - {text: '&cRed', icon: 'colors/red.png'}
  15. - {text: '&eYellow', icon: 'colors/yellow.png'}
  16. - 'Players: ${playerset:all_players size}'
  17. - {text: 'Ping: ${viewer ping}', ping: '${viewer ping}'}
  18. - {text: 'Server: ${viewer server}', icon: 'default/server.png', ping: 0}
复制代码

你可以设置 icon 为下列值之一:


ping值代表ping的毫秒数。这里有所有值的列表

描述图像
< 0×
0 - 1495个信号格
150 - 2994个信号格
300 - 5993个信号格
600 - 9992个信号格
> 10001个信号格



文本对齐

除了 text, iconping 还有第四个可以在自定义格中自定义的参数:alignment。这里有一个小例子解释它有什么作用。



  1. showTo: all
  2. priority: 1

  3. showHeaderFooter: false

  4. playerSets:
  5.   all_players:
  6.     filter: all

  7. type: FIXED_SIZE

  8. size: 80

  9. defaultIcon: colors/black.png
  10. defaultPing: 1000

  11. components:
  12. - {text: 'Slot 1', alignment: LEFT}
  13. - {text: 'Slot 2', alignment: CENTER}
  14. - {text: 'Slot 3', alignment: CENTER}
  15. - {text: 'Slot 4', alignment: RIGHT}
复制代码




配置文件基础 Part 7: 固定大小Tab列表 - 添加玩家

现在,我们来向Tab列表中添加一些玩家。有两种添加玩家的方式。使用 players(玩家) 或者 players by server(按服务器分组玩家) 元件。

这里是他们的差别。

players 元件
players by server元件

正如你所见 players 元件简单地列出玩家而 players by server 元件则将玩家们按照服务器分组。



使用 players 元件

这里演示如何使用 players 元件向Tab列表添加玩家:



  1. showTo: "true"
  2. priority: 1

  3. showHeaderFooter: false

  4. playerSets:
  5.   all_players:
  6.     filter: "all"

  7. type: FIXED_SIZE

  8. size: 80

  9. defaultIcon: colors/black.png
  10. defaultPing: 1000

  11. components:
  12. - !players
  13.   playerSet: all_players
  14.   playerComponent: "${player name}"
  15.   morePlayersComponent: '... and ${other_count} others'
复制代码

!players 标记告诉插件,我们想要在这里使用 players 元件。在标记之后我们需要设置 players 元件的一些设置项。

首先是 playerSet 设置项。通过指定一个 player set 来设置哪些玩家会被显示在Tab列表上。

playerComponent 控制玩家格的样式。你可以使用颜色代码与占位符。注意使用占位符时应当使用其 player 变种。

morePlayersComponent 设置当没有足够的空间在Tab列表上显示所有玩家时会显示的一个自定义格:



重新添加自定义格

当使用 players 元件的时候,我们仍可以使用自定义格。如下所示:

  1. showTo: "true"
  2. priority: 1

  3. showHeaderFooter: false

  4. playerSets:
  5.   all_players:
  6.     filter: "all"

  7. type: FIXED_SIZE

  8. size: 80

  9. defaultIcon: colors/black.png
  10. defaultPing: 1000

  11. components:
  12. -
  13. - {text: '&bWelcome', alignment: RIGHT}
  14. - '${viewer name}'
  15. -
  16. -
  17. -
  18. -
  19. -
  20. - !players
  21.   playerSet: all_players
  22.   playerComponent: "${player name}"
  23.   morePlayersComponent: '... and ${other_count} others'
复制代码

这里是效果图:

在底部添加自定义格会在稍后讨论。



使用 players by server 元件

现在这里是如何使用 players by server 元件在Tab列表上显示玩家。



  1. showTo: "true"
  2. priority: 1

  3. showHeaderFooter: false

  4. playerSets:
  5.   all_players:
  6.     filter: "all"

  7. type: FIXED_SIZE

  8. size: 80

  9. defaultIcon: colors/black.png
  10. defaultPing: 1000

  11. components:
  12. -
  13. - {text: '&bWelcome', alignment: RIGHT}
  14. - '${viewer name}'
  15. -
  16. - !players_by_server
  17.   playerSet: all_players
  18.   serverHeader:
  19.   - '&b&l>&3 ${server}(${server_player_count}):'
  20.   showServers: NON_EMPTY
  21.   playerComponent: "${player name}"
  22.   morePlayersComponent: '... and ${other_count} others'
复制代码

!players_by_server 标记告诉插件我们想要在这个位置使用 players by server 元件在Tab列表上显示玩家。

在那个标记之后我们需要设定一些 players bu server 元件所需的设置项。

首先是 playerSet 设置项。通过指定一个 玩家集合 来设置哪些玩家会被显示在Tab列表上。

Then there's the serverHeader option. It is a list of custom slots displayed  for each server above the players on that server. Here two special placeholders ${server} and ${server_player_count} can be used to display the name of the server and the number of players on it. 然后是 serverHeader 设置项。它是,显示在每个服务器玩家之前的一列自定义格。这里可以使用两个特殊的占位符 ${server} ${server_player_count} ,用来显示服务器名,以及其玩家数。

showServers 控制哪些服务器会显示在Tab列表上:

选项描述
ALL 显示所有的服务器
ONLINE 显示所有正在运行的服务器
NON_EMPTY 只会显示有玩家的服务器

ALL NON_EMPTY

playerComponent 控制玩家格子的样式。你可以使用颜色代码与占位符。注意使用占位符的时候应当使用其 player 变种。

morePlayersComponent 设置当没有足够的空间在Tab列表上显示所有玩家时会显示的一个自定义格:



改进设计

现在我们来稍微改进上面的设计:



  1. showTo: "true"
  2. priority: 1

  3. showHeaderFooter: false

  4. playerSets:
  5.   all_players:
  6.     filter: "all"

  7. type: FIXED_SIZE

  8. size: 80

  9. defaultIcon: colors/black.png
  10. defaultPing: 1000

  11. components:
  12. # 在第一行使用colors/gray.png作为图标
  13. - {icon: colors/gray.png}
  14. - {text: '&bWelcome', alignment: RIGHT, icon: colors/gray.png}
  15. - {text: '${viewer name}', icon: colors/gray.png}
  16. - {icon: colors/gray.png}
  17. # 在这里添加一行空行
  18. -
  19. -
  20. -
  21. -
  22. - !players_by_server
  23.   playerSet: all_players
  24.   #给serverHeader添加图标
  25.   serverHeader:
  26.   - {text: '&b&l>&3 ${server}(${server_player_count}):', icon: 'colors/aqua.png'}
  27.   showServers: NON_EMPTY
  28.   playerComponent: "${player name}"
  29.   morePlayersComponent: '... and ${other_count} others'
复制代码



在服务器之间添加空行

服务器之间直接相连,会使得Tab列表看起来很拥挤。我们通过在服务器之间添加空行来解决这个问题。使用 players by server 元件的 serverSeparator 设置项即可实现。

  1. - !players_by_server
  2.   playerSet: all_players
  3.   serverHeader:
  4.   - {text: '&b&l>&3 ${server}(${server_player_count}):', icon: 'colors/aqua.png'}
  5.   serverSeparator:
  6.   -
  7.   -
  8.   -
  9.   -
  10.   showServers: NON_EMPTY
  11.   playerComponent: "${player name}"
  12.   morePlayersComponent: '... and ${other_count} others'
复制代码

serverSeparator 设置项可以设置在两个相邻的服务器之间显示一组自定义格。因为是一组自定义格,我们也可以在其中添加一些文本:

  1. - !players_by_server
  2.   playerSet: all_players
  3.   serverHeader:
  4.   - {text: '&b&l>&3 ${server}(${server_player_count}):', icon: 'colors/aqua.png'}
  5.   serverSeparator:
  6.   -
  7.   - {text: '-=-', alignment: CENTER}
  8.   - {text: '-=-', alignment: CENTER}
  9.   -
  10.   showServers: NON_EMPTY
  11.   playerComponent: "${player name}"
  12.   morePlayersComponent: '... and ${other_count} others'
复制代码

这里是上面的例子实际看起来的效果:

这里是完整的配置文件以供参考:

  1. showTo: "true"
  2. priority: 1

  3. showHeaderFooter: false

  4. playerSets:
  5.   all_players:
  6.     filter: "all"

  7. type: FIXED_SIZE

  8. size: 80

  9. defaultIcon: colors/black.png
  10. defaultPing: 1000

  11. components:
  12. - {icon: colors/gray.png}
  13. - {text: '&bWelcome', alignment: RIGHT, icon: colors/gray.png}
  14. - {text: '${viewer name}', icon: colors/gray.png}
  15. - {icon: colors/gray.png}
  16. -
  17. -
  18. -
  19. -
  20. - !players_by_server
  21.   playerSet: all_players
  22.   serverHeader:
  23.   - {text: '&b&l>&3 ${server}(${server_player_count}):', icon: 'colors/aqua.png'}
  24.   serverSeparator:
  25.   -
  26.   -
  27.   -
  28.   -
  29.   showServers: NON_EMPTY
  30.   playerComponent: "${player name}"
  31.   morePlayersComponent: '... and ${other_count} others'
复制代码



在底部添加自定义格

让我们来看一下,像这样在 players by server 元件之后添加自定义格会发生什么:

  1. showTo: "true"
  2. priority: 1

  3. showHeaderFooter: false

  4. playerSets:
  5.   all_players:
  6.     filter: "all"

  7. type: FIXED_SIZE

  8. size: 80

  9. defaultIcon: colors/black.png
  10. defaultPing: 1000

  11. components:
  12. - {icon: colors/gray.png}
  13. - {text: '&bWelcome', alignment: RIGHT, icon: colors/gray.png}
  14. - {text: '${viewer name}', icon: colors/gray.png}
  15. - {icon: colors/gray.png}
  16. -
  17. -
  18. -
  19. -
  20. - !players_by_server
  21.   playerSet: all_players
  22.   serverHeader:
  23.   - {text: '&b&l>&3 ${server}(${server_player_count}):', icon: 'colors/aqua.png'}
  24.   serverSeparator:
  25.   -
  26.   -
  27.   -
  28.   -
  29.   showServers: NON_EMPTY
  30.   playerComponent: "${player name}"
  31.   morePlayersComponent: '... and ${other_count} others'
  32. # 在这里添加四个自定义格:
  33. - "Four"
  34. - "more"
  35. - "custom"
  36. - "Slots"
复制代码

那样修改的结果是这样的:



并没有如我们所愿。现在需要某种方式来告诉插件把最后的四个自定义格移动到底部。我们需要 spacer 元件来实现:

  1. showTo: "true"
  2. priority: 1

  3. showHeaderFooter: false

  4. playerSets:
  5.   all_players:
  6.     filter: "all"

  7. type: FIXED_SIZE

  8. size: 80

  9. defaultIcon: colors/black.png
  10. defaultPing: 1000

  11. components:
  12. - {icon: colors/gray.png}
  13. - {text: '&bWelcome', alignment: RIGHT, icon: colors/gray.png}
  14. - {text: '${viewer name}', icon: colors/gray.png}
  15. - {icon: colors/gray.png}
  16. -
  17. -
  18. -
  19. -
  20. - !players_by_server
  21.   playerSet: all_players
  22.   serverHeader:
  23.   - {text: '&b&l>&3 ${server}(${server_player_count}):', icon: 'colors/aqua.png'}
  24.   serverSeparator:
  25.   -
  26.   -
  27.   -
  28.   -
  29.   showServers: NON_EMPTY
  30.   playerComponent: "${player name}"
  31.   morePlayersComponent: '... and ${other_count} others'
  32. # 添加一个Spacer元件
  33. - !spacer {}
  34. # 我们的位于底部的四个自定义格:
  35. - "Four"
  36. - "more"
  37. - "custom"
  38. - "Slots"
复制代码

终于像我们所期望的一样了:



这是什么原理呢?Spacer(隔板)元件会 _占据_ 它能获得的尽可能多的未被使用的格子,所以会把我们的四个自定义格固定在Tab列表的最底部。



拓展阅读

playersplayers by server 元件都有更多的可以用来进一步自定义的设置项。例如,你可以自定义玩家的排序方式,在 players by server 元件中还可以定义服务器显示的顺序。

你可以在这里找到如何设置玩家顺序的信息。

想要查看元件的所有可用的设置项,请阅读元件参考.



配置文件基础 Part 8: 固定大小Tab列表 - 表格元件

这页展示了如何使用 table 元件来自定义Tab列表的布局。



按列分割Tab列表



  1. showTo: 'true'
  2. priority: 1

  3. showHeaderFooter: false

  4. # 3个玩家集,每个服务器一个
  5. playerSets:
  6.   lobby:
  7.     filter: ${player server} == "spawn"
  8.   survival:
  9.     filter: ${player server} == "survival"
  10.   creative:
  11.     filter: ${player server} == "creative"

  12. type: FIXED_SIZE
  13. size: 60

  14. defaultIcon: "colors/dark_gray.png"
  15. defaultPing: 1000

  16. components:
  17. - !table
  18.   columns:
  19.     0: # 第一列
  20.     - {text: "&a&lLobby", icon: "colors/green.png", ping: 0}
  21.     - !players
  22.       playerSet: lobby
  23.       playerComponent: "${player name}"
  24.       morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
  25.     1: # 第二列
  26.     - {text: "&b&lSurvival", icon: "colors/aqua.png", ping: 0}
  27.     - !players
  28.       playerSet: survival
  29.       playerComponent: "${player name}"
  30.       morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
  31.     2: # 第三列
  32.     - {text: "&c&lCreative", icon: "colors/red.png", ping: 0}
  33.     - !players
  34.       playerSet: creative
  35.       playerComponent: "${player name}"
  36.       morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
复制代码

这里的 !table 标记告诉插件,我们想要使用一个 table 元件。然后,我们使用 columns 选项来定义每一列的内容。每一列的内容又是由一组元件构成。在这个例子中,有一个自定义格显示服务器名,之后是一个 players 元件显示服务器上的玩家。

实际上,也可以不把写服务器名的自定义格放入 table 元件之中。我们也可以把他们放在 table 之前。下面的例子展示了那样修改之后,配置文件的 components 部分会变成什么样。注意这个与上面的例子显示的结果是一样的。

  1. components:
  2. - {text: "&a&lLobby", icon: "colors/green.png", ping: 0}
  3. - {text: "&b&lSurvival", icon: "colors/aqua.png", ping: 0}
  4. - {text: "&c&lCreative", icon: "colors/red.png", ping: 0}
  5. - !table
  6.   columns:
  7.     0: # 第一列
  8.     - !players
  9.       playerSet: lobby
  10.       playerComponent: "${player name}"
  11.       morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
  12.     1: # 第二列
  13.     - !players
  14.       playerSet: survival
  15.       playerComponent: "${player name}"
  16.       morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
  17.     2: # 第三列
  18.     - !players
  19.       playerSet: creative
  20.       playerComponent: "${player name}"
  21.       morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
复制代码



在一列中只使用自定义格

现在我们修改最左边的列,使其显示一些自定义格,而不是lobby服务器的玩家。



  1. showTo: 'true'
  2. priority: 1

  3. showHeaderFooter: false

  4. # 三个玩家组,每个对应一个服务器
  5. playerSets:
  6.   all_players:
  7.     filter: all
  8.   lobby:
  9.     filter: ${player server} == "spawn"
  10.   survival:
  11.     filter: ${player server} == "survival"
  12.   creative:
  13.     filter: ${player server} == "creative"

  14. type: FIXED_SIZE
  15. size: 60

  16. defaultIcon: "colors/dark_gray.png"
  17. defaultPing: 1000

  18. components:
  19. - !table
  20.   columns:
  21.     0: # 在第一列显示一些信息
  22.     - {text: "&lInfo", icon: "colors/gold.png", ping: 0} # 第1行
  23.     - {text: "", icon: "colors/gold.png", ping: 0} # 第2行
  24.     - {text: "", icon: "colors/gold.png", ping: 0} # 第3行
  25.     - {text: "&cServer:", icon: "default/server.png", ping: 0} # 第4行
  26.     - {text: "&6${viewer server}", icon: "default/server.png", ping: 0} # 第5行
  27.     - {text: "", icon: "colors/gold.png", ping: 0} # 第6行
  28.     - {text: "&cRank:", icon: "default/rank.png", ping: 0} # 第7行
  29.     - {text: "&6${viewer vault_primary_group}", icon: "default/rank.png", ping: 0} # 第8行
  30.     - {text: "", icon: "colors/gold.png", ping: 0} # 第9行
  31.     - {text: "&cPing:", icon: "default/ping.png", ping: 0} # 第10行
  32.     - {text: "&6${viewer ping}ms", icon: "default/ping.png", ping: 0} # 第11行
  33.     - {text: "", icon: "colors/gold.png", ping: 0} # 第12行
  34.     - {text: "&cPlayers:", icon: "default/players.png", ping: 0} # 第13行
  35.     - {text: "&6${playerset:all_players size}", icon: "default/players.png", ping: 0} # 第14行
  36.     - {text: "", icon: "colors/gold.png", ping: 0} # 第15行
  37.     - {text: "&cBalance:", icon: "default/balance.png", ping: 0} # 第16行
  38.     - {text: "&6${viewer vault_balance}", icon: "default/balance.png", ping: 0} # 第17行
  39.     - {text: "", icon: "colors/gold.png", ping: 0} # 第18行
  40.     - {text: "&cTime:", icon: "default/clock.png", ping: 0} # 第19行
  41.     - {text: "&6${time HH:mm:ss}", icon: "default/clock.png", ping: 0} # 第20行
  42.     1: # 第二列
  43.     - {text: "&b&lSurvival", icon: "colors/aqua.png", ping: 0}
  44.     - !players
  45.       playerSet: survival
  46.       playerComponent: "${player name}"
  47.       morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
  48.     2: # 第三列
  49.     - {text: "&c&lCreative", icon: "colors/red.png", ping: 0}
  50.     - !players
  51.       playerSet: creative
  52.       playerComponent: "${player name}"
  53.       morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
复制代码



在一列中显示两个服务器

现在我们希望重新把大厅lobby加回去,并且让它显示在第三列,creative服下面。为了实现那样的效果,我们在配置文件中做了如下的改动:

  1. components:
  2. - !table
  3.   columns:
  4.     0: # 在第一列显示一些信息
  5.     - {text: "&lInfo", icon: "colors/gold.png", ping: 0} # 第一行
  6.     - # ... 这部分并没有修改
  7.     1: # 第二列也没有任何修改
  8.     - {text: "&b&lSurvival", icon: "colors/aqua.png", ping: 0}
  9.     - !players
  10.       playerSet: survival
  11.       playerComponent: "${player name}"
  12.       morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
  13.     2: # 第三列
  14.     - {text: "&c&lCreative", icon: "colors/red.png", ping: 0}
  15.     - !players
  16.       playerSet: creative
  17.       playerComponent: "${player name}"
  18.       morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
  19.       # 我们在第一个玩家元件中设置minSize 与 maxSize为9,所以它会一直占据9个格子
  20.       minSize: 9
  21.       maxSize: 9
  22.     # 现在我们添加大厅服务器
  23.     - {text: "&a&lLobby", icon: "colors/green.png", ping: 0}
  24.     - !players
  25.       playerSet: lobby
  26.       playerComponent: "${player name}"
  27.       morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
复制代码

现在它看起来就像下面这样





一个服务器使用多行

现在我们让生存服务器使用两列:



这里是配置文件:

  1. showTo: 'true'
  2. priority: 1

  3. showHeaderFooter: false

  4. playerSets:
  5.   all_players:
  6.     filter: all
  7.   lobby:
  8.     filter: ${player server} == "spawn"
  9.   survival:
  10.     filter: ${player server} == "survival"
  11.   creative:
  12.     filter: ${player server} == "creative"

  13. type: FIXED_SIZE
  14. size: 80 # 增加Tab列表的大小到80

  15. defaultIcon: "colors/dark_gray.png"
  16. defaultPing: 1000

  17. components:
  18. - !table
  19.   columns:
  20.     0:
  21.     - {text: "&lInfo", icon: "colors/gold.png", ping: 0}
  22.     - {text: "", icon: "colors/gold.png", ping: 0}
  23.     - {text: "", icon: "colors/gold.png", ping: 0}
  24.     - {text: "&cServer:", icon: "default/server.png", ping: 0}
  25.     - {text: "&6${viewer server}", icon: "default/server.png", ping: 0}
  26.     - {text: "", icon: "colors/gold.png", ping: 0}
  27.     - {text: "&cRank:", icon: "default/rank.png", ping: 0}
  28.     - {text: "&6${viewer vault_primary_group}", icon: "default/rank.png", ping: 0}
  29.     - {text: "", icon: "colors/gold.png", ping: 0}
  30.     - {text: "&cPing:", icon: "default/ping.png", ping: 0}
  31.     - {text: "&6${viewer ping}ms", icon: "default/ping.png", ping: 0}
  32.     - {text: "", icon: "colors/gold.png", ping: 0}
  33.     - {text: "&cPlayers:", icon: "default/players.png", ping: 0}
  34.     - {text: "&6${playerset:all_players size}", icon: "default/players.png", ping: 0}
  35.     - {text: "", icon: "colors/gold.png", ping: 0}
  36.     - {text: "&cBalance:", icon: "default/balance.png", ping: 0}
  37.     - {text: "&6${viewer vault_balance}", icon: "default/balance.png", ping: 0}
  38.     - {text: "", icon: "colors/gold.png", ping: 0}
  39.     - {text: "&cTime:", icon: "default/clock.png", ping: 0}
  40.     - {text: "&6${time HH:mm:ss}", icon: "default/clock.png", ping: 0}
  41.     1-2: #这里我们希望使用第二第三列
  42.     - {text: "&b&lSurvival", icon: "colors/aqua.png", ping: 0}
  43.     # 我们需要两个自定义格来显示服务器名
  44.     - {text: "&b&lSurvival", icon: "colors/aqua.png", ping: 0}
  45.     - !players
  46.       playerSet: survival
  47.       playerComponent: "${player name}"
  48.       morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
  49.     3: # 现在是第四列
  50.     - {text: "&c&lCreative", icon: "colors/red.png", ping: 0}
  51.     - !players
  52.       playerSet: creative
  53.       playerComponent: "${player name}"
  54.       morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
  55.       minSize: 9
  56.       maxSize: 9
  57.     - {text: "&a&lLobby", icon: "colors/green.png", ping: 0}
  58.     - !players
  59.       playerSet: lobby
  60.       playerComponent: "${player name}"
  61.       morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
复制代码


文本对齐与裁剪长文本

阅读配置文件基础 Part 6: 固定大小Tab列表 - 简介之后,你知道你可以让插件左对齐,居中,右对齐文本。这页将会解释那是如何工作的,以及如何自动裁剪过于长的文本(例如 特别长的玩家名)



文本对齐

引用之前提供的这个例子:



  1. showTo: all
  2. priority: 1

  3. showHeaderFooter: false

  4. playerSets:
  5.   all_players:
  6.     filter: all

  7. type: FIXED_SIZE

  8. size: 80

  9. defaultIcon: colors/black.png
  10. defaultPing: 1000

  11. components:
  12. - {text: 'Slot 1', alignment: LEFT}
  13. - {text: 'Slot 2', alignment: CENTER}
  14. - {text: 'Slot 3', alignment: CENTER}
  15. - {text: 'Slot 4', alignment: RIGHT}
复制代码

虽然示例图片看起来非常棒,但是对齐设置并不能总是正常工作。为了理解原因,我们需要了解它内部是如何工作的:

当你设置一个格子的对齐为 CENTER RIGHT 时插件会在文本前加一些空格来向右移动文本。为了准确的计算空格的数量,插件需要知道客户端Tab列表的一格的大小,而一格的大小取决与玩家屏幕的宽和高。很遗憾我们并不能知道玩家屏幕的尺寸。因为插件并不知道一格 _真实_ 的大小,所以插件使用使用了刚打开Minecraft窗口时的大小进行推算。

不幸的是,这意味着对齐设置对于你的一些玩家来说会是错位的。虽然默认值对于很多玩家是可行的,但是它不能适用于所有人。



裁剪长文本

长文本是能够被裁剪的。 longText 设置项就是为此而生。有两种方式设置:设置全局来使其对所有格子生效,或者只设置某些格子。

下面的示例会裁剪所有格子中的长文本,并且添加三个句点 .



  1. showTo: "true"
  2. priority: 1

  3. showHeaderFooter: false

  4. playerSets:
  5.   all_players:
  6.     filter: "all"

  7. # 裁剪长文本并且添加三个点
  8. longText: CROP_3DOTS

  9. type: FIXED_SIZE

  10. size: 80

  11. defaultIcon: colors/black.png
  12. defaultPing: 1000

  13. components:
  14. -
  15. - {text: '&bWelcome', alignment: RIGHT}
  16. - '${viewer vault_prefix}&b${viewer name}'
  17. -
  18. - !players
  19.   playerSet: all_players
  20.   playerComponent: "${player vault_prefix}${player name}"
  21.   morePlayersComponent: '... and ${other_count} others'
复制代码

另一种选择是只对特定的格子设置 longText ,在下面例子中是对所有玩家格。



  1. showTo: "true"
  2. priority: 1

  3. showHeaderFooter: false

  4. playerSets:
  5.   all_players:
  6.     filter: "all"

  7. type: FIXED_SIZE

  8. size: 80

  9. defaultIcon: colors/black.png
  10. defaultPing: 1000

  11. components:
  12. -
  13. - {text: '&bWelcome', alignment: RIGHT}
  14. - '${viewer vault_prefix}&b${viewer name}'
  15. -
  16. - !players
  17.   playerSet: all_players
  18.   # 只裁剪过长的玩家名
  19.   playerComponent: {text: "${player vault_prefix}${player name}", longText: CROP_3DOTS}
  20.   morePlayersComponent: '... and ${other_count} others'
复制代码

这里是你可以在 longText 设置项中使用的值的表格:

结果
DISPLAY_ALL
CROP
CROP_2DOTS
CROP_3DOTS

默认值(如果你不设置它)是 DISPLAY_ALL

将来或许会添加其它的选项(比如滚动)。如果你对此感兴趣,有你自己的想法,不必拘束你可以在GitHub上创建一个issue。

注意,在裁剪长文本的时候,你可能会遇到与使用文本对齐设置项时相同的问题。因为插件并不知道一个格子的 _真实_ 大小(因为其取决于客户端窗口大小),插件假定的默认值对于大多数玩家效果很好,但是对于某些玩家文本可能仍会超出格子边界,而另一些玩家看起来虽然仍有很多空间但是文本却被裁剪了。


动画效果

使用 !animated 元件可以创建动画,可以设定间隔以及一组循环显示的元件。这里有一个简单的例子:



  1. !animated
  2. interval: 0.2
  3. components:
  4. - {text: "&6&c=&6==============", icon: "colors/gold.png", ping: 0}
  5. - {text: "&6=&c=&6=============", icon: "colors/gold.png", ping: 0}
  6. - {text: "&6==&c=&6============", icon: "colors/gold.png", ping: 0}
  7. - {text: "&6===&c=&6===========", icon: "colors/gold.png", ping: 0}
  8. - {text: "&6====&c=&6==========", icon: "colors/gold.png", ping: 0}
  9. - {text: "&6=====&c=&6=========", icon: "colors/gold.png", ping: 0}
  10. - {text: "&6======&c=&6========", icon: "colors/gold.png", ping: 0}
  11. - {text: "&6=======&c=&6=======", icon: "colors/gold.png", ping: 0}
  12. - {text: "&6========&c=&6======", icon: "colors/gold.png", ping: 0}
  13. - {text: "&6=========&c=&6=====", icon: "colors/gold.png", ping: 0}
  14. - {text: "&6==========&c=&6====", icon: "colors/gold.png", ping: 0}
  15. - {text: "&6===========&c=&6===", icon: "colors/gold.png", ping: 0}
  16. - {text: "&6============&c=&6==", icon: "colors/gold.png", ping: 0}
  17. - {text: "&6=============&c=&6=", icon: "colors/gold.png", ping: 0}
  18. - {text: "&6==============&c=&6", icon: "colors/gold.png", ping: 0}
复制代码

这里是一个完整的配置,你可以看到 !animated 动画元件是如何使用的:

  1. showTo: "true"
  2. priority: 1

  3. showHeaderFooter: false

  4. playerSets:
  5.   all_players:
  6.     filter: "all"

  7. type: FIXED_SIZE

  8. size: 20

  9. defaultIcon: colors/black.png
  10. defaultPing: 1000

  11. components:
  12. - !players
  13.   playerSet: all_players
  14.   playerComponent: "${player name}"
  15.   morePlayersComponent: '... and ${other_count} others'
  16. - !spacer {}
  17. - !animated
  18.   interval: 0.2
  19.   components:
  20.   - {text: "&6&c=&6==============", icon: "colors/gold.png", ping: 0}
  21.   - {text: "&6=&c=&6=============", icon: "colors/gold.png", ping: 0}
  22.   - {text: "&6==&c=&6============", icon: "colors/gold.png", ping: 0}
  23.   - {text: "&6===&c=&6===========", icon: "colors/gold.png", ping: 0}
  24.   - {text: "&6====&c=&6==========", icon: "colors/gold.png", ping: 0}
  25.   - {text: "&6=====&c=&6=========", icon: "colors/gold.png", ping: 0}
  26.   - {text: "&6======&c=&6========", icon: "colors/gold.png", ping: 0}
  27.   - {text: "&6=======&c=&6=======", icon: "colors/gold.png", ping: 0}
  28.   - {text: "&6========&c=&6======", icon: "colors/gold.png", ping: 0}
  29.   - {text: "&6=========&c=&6=====", icon: "colors/gold.png", ping: 0}
  30.   - {text: "&6==========&c=&6====", icon: "colors/gold.png", ping: 0}
  31.   - {text: "&6===========&c=&6===", icon: "colors/gold.png", ping: 0}
  32.   - {text: "&6============&c=&6==", icon: "colors/gold.png", ping: 0}
  33.   - {text: "&6=============&c=&6=", icon: "colors/gold.png", ping: 0}
  34.   - {text: "&6==============&c=&6", icon: "colors/gold.png", ping: 0}
复制代码

你也可以在动画中改变图标和ping。然而并不建议在快速的动画中改变图标,因为客户端总会需要一些时间来更新图标。


配合PermissionsEx使用


必要条件

为了BungeeTabListPlus能够挂钩PermissionsEx,你需要满足以下条件:

  • 一个近期的版本的PermissionsEx。
  • 你需要在你所有的Spigot/Bukkit服务器上安装一个近期的版本的Vault。
  • 你需要在你所有的Spigot/Bukkit服务器上安装BungeeTabListPlus_BukkitBridge。

之后BungeeTabListPlus应当能够从PermissionsEx获取权限信息,权限组信息,以及前缀/后缀信息。

你可以使用下列占位符来显示那些信息:

占位符解释
${viewer vault_primary_group}
${player vault_primary_group}
一个玩家的主权限组。
阅读下面的内容了解PermissionsEx如何确定一个玩家的主权限组。
${viewer vault_prefix}
${player vault_prefix}
一个玩家的前缀。
${viewer vault_suffix}
${player vault_suffix}
一个玩家的后缀。

主权限组

上面所有的占位符都依赖于PermissionsEx选取正确的主权限组。如果你的一个玩家只指定一个权限组,你将不会遇到任何问题。然而经常会需要为一个玩家指定多个权限组。在这种情况下,插件选择的主权限组会经常与你的期望有所出入。为了修复这个问题,了解PermissionsEx如何确定玩家的主权限组就显得十分重要。

PermissionsEx使用如下规则确定主权限组:

  • 如果你给你的权限组设置了weight属性,那么低weight的权限组会比高weight的拥有更高的优先度。拥有最低weight的权限组会成为主权限组。
  • 如果没有设置weight属性,那么最先添加的权限组会成为主权限组。

如果你需要为单个玩家指定多个权限组,我强烈建议你使用weight属性来处理权限组的优先度。而且如果你希望根据玩家的PEX的权限组来对Tab列表中的玩家进行排序,weight属性当然也是必须被设置的。

排序Tab列表中的玩家

BungeeTabListPlus可以根据PermissionsEx的信息排序玩家。首先你必须设置你所有的权限组的weight属性。

BungeeTabListPlus会玩家的根据主权限组weight来排序,拥有更低weight的玩家会显示在前面。

使用权限信息来排序玩家,你需要对你的Tab列表的配置文件做如下修改:

  1. playerOrder: "vaultGroupInfo"
复制代码

示例配置

这个示例,展示了应用了上面所有信息之后的默认配置会是什么样的:

  1. showTo: "true"

  2. priority: 21

  3. type: FIXED_SIZE

  4. showHeaderFooter: true

  5. header:
  6. - '&cWelcome &f${viewer name}'
  7. - '&eW&celcome &f${viewer name}'
  8. - '&eWe&clcome &f${viewer name}'
  9. - '&eWel&ccome &f${viewer name}'
  10. - '&eWelc&come &f${viewer name}'
  11. - '&eWelco&cme &f${viewer name}'
  12. - '&eWelcom&ce &f${viewer name}'
  13. - '&eWelcome &f${viewer name}'
  14. - '&cW&eelcome &f${viewer name}'
  15. - '&cWe&elcome &f${viewer name}'
  16. - '&cWel&ecome &f${viewer name}'
  17. - '&cWelc&eome &f${viewer name}'
  18. - '&cWelco&eme &f${viewer name}'
  19. - '&cWelcom&ee &f${viewer name}'
  20. - '&cWelcome &f${viewer name}'

  21. headerAnimationUpdateInterval: 0.2

  22. footer:
  23. - |-
  24.   &6Line 1
  25.   &eLine 2
  26. - |-
  27.   &eLine 1
  28.   &6Line 2

  29. footerAnimationUpdateInterval: 0.5

  30. customPlaceholders:
  31.   afk_tag:
  32.     !conditional
  33.     condition: ${player essentials_afk}
  34.     true: '&7|&oaway'
  35.     false: ''
  36.   viewer_colored_ping0:
  37.     !conditional
  38.     condition: "${viewer ping} < 50"
  39.     true: "&a${viewer ping}"
  40.     false: "&e${viewer ping}"
  41.   viewer_colored_ping:
  42.     !conditional
  43.     condition: "${viewer ping} < 150"
  44.     true: ${viewer_colored_ping0}
  45.     false: "&c${viewer ping}"

  46. defaultIcon: colors/dark_gray.png
  47. defaultPing: 1000
  48. size: 60
  49. playerSets:
  50.   global:
  51.     filter: "true"
  52. components:
  53. - {text: "&cServer: &6${viewer server}", icon: "default/server.png", ping: 0}
  54. - {text: "&cRank: &6${viewer vault_primary_group}", icon: "default/rank.png", ping: 0}
  55. # 根据ping的高低以不同颜色显示ping
  56. - {text: "&cPing: ${viewer_colored_ping}ms", icon: "default/ping.png", ping: 0}
  57. - !players_by_server
  58.   playerSet: global
  59.   # 排序玩家:
  60.   playerOrder: "vaultGroupInfo"
  61.   serverHeader:
  62.   - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  63.   - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  64.   - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  65.   - {text: "&e&n${server}&f&o (${server_player_count}):", icon: "colors/yellow.png", ping: 0}
  66.   includeEmptyServers: true
  67.   # 添加前缀与后缀:
  68.   playerComponent: {text: "${player vault_prefix}${player name}${player vault_suffix}${afk_tag}", icon: "${player skin}", ping: "${player ping}"}
  69.   morePlayersComponent: {text: "&7... and &e${other_count} &7others", icon: "colors/gray.png", ping: 0}
  70. # 我们希望下面的元件显示在Tab列表的最底部
  71. - !spacer {}
  72. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  73. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  74. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  75. # 底部的动画
  76. - !animated
  77.   interval: 0.2
  78.   components:
  79.   - {text: "&6&c=&6==============", icon: "colors/gold.png", ping: 0}
  80.   - {text: "&6=&c=&6=============", icon: "colors/gold.png", ping: 0}
  81.   - {text: "&6==&c=&6============", icon: "colors/gold.png", ping: 0}
  82.   - {text: "&6===&c=&6===========", icon: "colors/gold.png", ping: 0}
  83.   - {text: "&6====&c=&6==========", icon: "colors/gold.png", ping: 0}
  84.   - {text: "&6=====&c=&6=========", icon: "colors/gold.png", ping: 0}
  85.   - {text: "&6======&c=&6========", icon: "colors/gold.png", ping: 0}
  86.   - {text: "&6=======&c=&6=======", icon: "colors/gold.png", ping: 0}
  87.   - {text: "&6========&c=&6======", icon: "colors/gold.png", ping: 0}
  88.   - {text: "&6=========&c=&6=====", icon: "colors/gold.png", ping: 0}
  89.   - {text: "&6==========&c=&6====", icon: "colors/gold.png", ping: 0}
  90.   - {text: "&6===========&c=&6===", icon: "colors/gold.png", ping: 0}
  91.   - {text: "&6============&c=&6==", icon: "colors/gold.png", ping: 0}
  92.   - {text: "&6=============&c=&6=", icon: "colors/gold.png", ping: 0}
  93.   - {text: "&6==============&c=&6", icon: "colors/gold.png", ping: 0}
  94. - !animated
  95.   interval: 0.2
  96.   components:
  97.   - {text: "&6&c=&6==============", icon: "colors/gold.png", ping: 0}
  98.   - {text: "&6=&c=&6=============", icon: "colors/gold.png", ping: 0}
  99.   - {text: "&6==&c=&6============", icon: "colors/gold.png", ping: 0}
  100.   - {text: "&6===&c=&6===========", icon: "colors/gold.png", ping: 0}
  101.   - {text: "&6====&c=&6==========", icon: "colors/gold.png", ping: 0}
  102.   - {text: "&6=====&c=&6=========", icon: "colors/gold.png", ping: 0}
  103.   - {text: "&6======&c=&6========", icon: "colors/gold.png", ping: 0}
  104.   - {text: "&6=======&c=&6=======", icon: "colors/gold.png", ping: 0}
  105.   - {text: "&6========&c=&6======", icon: "colors/gold.png", ping: 0}
  106.   - {text: "&6=========&c=&6=====", icon: "colors/gold.png", ping: 0}
  107.   - {text: "&6==========&c=&6====", icon: "colors/gold.png", ping: 0}
  108.   - {text: "&6===========&c=&6===", icon: "colors/gold.png", ping: 0}
  109.   - {text: "&6============&c=&6==", icon: "colors/gold.png", ping: 0}
  110.   - {text: "&6=============&c=&6=", icon: "colors/gold.png", ping: 0}
  111.   - {text: "&6==============&c=&6", icon: "colors/gold.png", ping: 0}
  112. - !animated
  113.   interval: 0.2
  114.   components:
  115.   - {text: "&6&c=&6==============", icon: "colors/gold.png", ping: 0}
  116.   - {text: "&6=&c=&6=============", icon: "colors/gold.png", ping: 0}
  117.   - {text: "&6==&c=&6============", icon: "colors/gold.png", ping: 0}
  118.   - {text: "&6===&c=&6===========", icon: "colors/gold.png", ping: 0}
  119.   - {text: "&6====&c=&6==========", icon: "colors/gold.png", ping: 0}
  120.   - {text: "&6=====&c=&6=========", icon: "colors/gold.png", ping: 0}
  121.   - {text: "&6======&c=&6========", icon: "colors/gold.png", ping: 0}
  122.   - {text: "&6=======&c=&6=======", icon: "colors/gold.png", ping: 0}
  123.   - {text: "&6========&c=&6======", icon: "colors/gold.png", ping: 0}
  124.   - {text: "&6=========&c=&6=====", icon: "colors/gold.png", ping: 0}
  125.   - {text: "&6==========&c=&6====", icon: "colors/gold.png", ping: 0}
  126.   - {text: "&6===========&c=&6===", icon: "colors/gold.png", ping: 0}
  127.   - {text: "&6============&c=&6==", icon: "colors/gold.png", ping: 0}
  128.   - {text: "&6=============&c=&6=", icon: "colors/gold.png", ping: 0}
  129.   - {text: "&6==============&c=&6", icon: "colors/gold.png", ping: 0}
  130. - {text: "&cTime: &6${time H:mm:ss}", icon: "default/clock.png", ping: 0}
  131. - {text: "&cPlayers: &6${playerset:global size}", icon: "default/players.png", ping: 0}
  132. - {text: "&cBalance: &6${viewer vault_balance 1.2}", icon: "default/balance.png", ping: 0}
复制代码



使用PlaceholderAPI


使用 PlaceholderAPI你可以使用海量的额外的占位符。

必要条件

  • 你需要在你的spigot服务器上安装PlaceholderAPI
  • 你需要在你的spigot服务器上安装BungeeTabListPlus_BukkitBridge

使用方法

  • https://www.spigotmc.org/wiki/placeholderapi-placeholders/选取一个占位符。这里我们以 %statistic_kill_entity_CREEPER% 为例。
  • 使用 /papi ecloud download 命令,下载所需的PlaceholderAPI Expansion。如果所需的拓展已经安装的话,你可以跳过这步。对应我们的例子,我们需要Statistic拓展: /papi ecloud download Statistic 。在下载完毕之后,输入 /papi reload 来启用它。
  • 使用 /papi parse ... 命令,测试PlaceholderAPI是否正常工作。对于我们的例子,输入 /papi parse %statistic_kill_entity_CREEPER% 。如果它没有被正确的替换,重试步骤2。
  • 在BungeeTabListPlus的配置中使用这个占位符: %statistic_kill_entity_CREEPER% 并不会在配置文件中生效。你需要使用 ${viewer statistic_kill_entity_CREEPER} 来为正在查看tab列表的玩家解释这个占位符或者 ${player statistic_kill_entity_CREEPER} 为一个tab列表中列出的玩家。

    例子:

    1. components:
    2. - {text: "&6Creepers killed: &c${viewer statistic_kill_entity_CREEPER}", icon: "colors/gold.png", ping: 0}
    复制代码




排序玩家

所有向Tab列表添加玩家的元件允许设置 playerOrder 设置项,可以用来指定Tab列表上玩家的顺序。

例 1:按照字母排序

  1. !players
  2. playerSet: global
  3. playerOrder: "alphabetically"
  4. ...
复制代码

playerOrder 被设置为使用的比较的规则。

例 2:根据玩家权限组排列,拥有相同权限组的玩家根据字母顺序

  1. !players
  2. playerSet: global
  3. playerOrder: "vaultGroupInfo,alphabetically"
  4. ...
复制代码

符号 , 可以用来链接任意数量的不同比较规则。

所有比较规则:

规则描述
vaultGroupInfo 会优先填入更高权限组的玩家,使用来自Vault的数据
vaultGroupInfoReversed 如果期望与上面那个的顺序相反,可以使用这个,使用来自Vault的数据
vaultPrefix 根据玩家前缀的字母顺序排列
bungeePermsGroupInfo 会优先填入更高权限组的玩家,使用来自BungeePerms的数据
bungeePermsGroupInfoReversed 如果期望与上面那个的顺序相反,可以使用这个,使用来自BungeePerms的数据
bungeeCordGroups 会优先填入更高权限组的玩家,使用来自BungeeCords config.yml的数据
bungeeCordGroupsReversed 如果期望与上面那个的顺序相反,可以使用这个,使用来自BungeeCords config.yml的数据
youFirst 会首先填入查看Tab列表的玩家
alphabetically 会按照字母顺序填入玩家
teamfirst 与正在查看Tab列表的者同队的玩家在前
teams 根据队伍的字母顺序
factionfirst 与正在查看Tab列表者同一帮派的玩家会优先显示
factions 根据帮派的字母顺序
worldName 根据玩家所在世界的名字的字母排序
playerWorldFirst 与查看Tab列表者同世界的玩家会优先显示
serverAlphabetically 根据玩家所在服务器的名字的字母排序
playerServerFirst 与查看Tab列表者同服务器的玩家会优先显示
AFKLast AFK状态的玩家显示在最后
connectedFirst 根据玩家假如服务器的顺序排列
connectedLast 与上一个相同,不过后加入的玩家会显示在前面
LuckPermsGroupInfo 根据LuckPerms的权限组排序.
LuckPermsGroupInfoReversed 根据LuckPerms的权限组排序。顺序相反



自定义占位符

自定义占位符可以在config.yml中(可以在所有Tab列表中使用)或者每个Tab列表的配置文件中(只在该Tab列表中有效)设置。

一个简单的例子

  1. customPlaceholders:
  2.   afk_tag:
  3.     !conditional
  4.     condition: ${player essentials_afk}
  5.     true: '&7 | away'
  6.     false: ''
  7.   custom_prefix:
  8.     !switch
  9.     expression: ${player vault_primary_group}
  10.     replacements:
  11.       "admin": "&c[A]&f"
  12.       "mod": "&b[M]&f"
  13.       "vip": "&b[V]&f"
  14.     defaultReplacement: "&7"
复制代码

将上面的代码放入config.yml或者tablist.yml,你就可以使用 ${afk_tag} ${custom_prefix} 占位符了。

如何使用这些占位符的例子:

  1. components:
  2. ...
  3. - !players
  4.   ...
  5.   playerComponent: {text: "${custom_prefix}${player name}${afk_tag}", icon: "${player skin}", ping: "${player ping}"}
  6. ...
复制代码

参数

自定义占位符可以使用参数。我们来通过给占位符增加一个参数来改进上面的例子:

  1. customPlaceholders:
  2.   afk_tag:
  3.     !conditional
  4.     parameters: 1
  5.     condition: ${%0 essentials_afk}
  6.     true: '&7 | away'
  7.     false: ''
  8.   custom_prefix:
  9.     !switch
  10.     parameters: 1
  11.     expression: ${%0 vault_primary_group}
  12.     replacements:
  13.       "admin": "&c[A]&f"
  14.       "mod": "&b[M]&f"
  15.       "vip": "&b[V]&f"
  16.     defaultReplacement: "&7"
复制代码

现在我们可以根据情境不同使用 ${afk_tag viewer} ${afk_tag player} 以及 ${custom_prefix viewer} 或者 ${custom_prefix player}


多个Tab列表

插件目录中有一个文件夹叫做 tabLists ,在文件夹中只有一个文件叫做 default.yml ,其中存储着Tab列表的样式。看到这个你可能会疑惑如果其中只有一个文件为什么要一个文件夹。这是因为你可以设置多个Tab列表。第二个Tab列表可以通过复制 default.yml 并重命名(必须以 .yml )结尾。在创建完新的文件之后你需要编辑它。尤其重要的是修改设定显示给谁的 showTo 以及多个Tab列表符合时最终决定玩家会看到哪个的优先级 priority

例子

Factions专用的Tab列表

  1. # tabLists/Factions.yml

  2. # 这个Tab列表应该显示给在factions服务器上的玩家。
  3. showTo: '${viewer server} == "factions"'
  4. # 优先级应该高于默认Tab列表的。
  5. priority: 25

  6. # 并没有页眉/页脚因为Wiki的空间有限 ;)
  7. # 如果你喜欢的话你可以自己加上页眉\页脚。
  8. showHeaderFooter: false

  9. # 尺寸60的固定大小Tab列表
  10. type: FIXED_SIZE
  11. size: 60 # 3列,20行

  12. # 我喜欢使用 colors/dark_gray.png 作为默认图标
  13. defaultIcon: "colors/dark_gray.png"
  14. defaultPing: 1000

  15. # 我们所需要的玩家集合
  16. playerSets:
  17.   # 所有的玩家
  18.   global:
  19.     filter: "true"
  20.   # 你的帮派的玩家
  21.   faction:
  22.     filter: |-
  23.       ${player faction_name} == ${viewer faction_name}

  24. components:
  25. - !table
  26.   columns:
  27.     0: # 第1列
  28.     - {text: "&lInfo", icon: "colors/gold.png", ping: 0} # 第1行
  29.     - {text: "", icon: "colors/gold.png", ping: 0} # 第2行
  30.     - {text: "", icon: "colors/gold.png", ping: 0} # 第3行
  31.     - {text: "&cServer:", icon: "default/server.png", ping: 0} # 第4行
  32.     - {text: "&6${viewer server}", icon: "default/server.png", ping: 0} # 第5行
  33.     - {text: "", icon: "colors/gold.png", ping: 0} # 第6行
  34.     - {text: "&cRank:", icon: "default/rank.png", ping: 0} # 第7行
  35.     - {text: "&6${viewer vault_primary_group}", icon: "default/rank.png", ping: 0} # 第8行
  36.     - {text: "", icon: "colors/gold.png", ping: 0} # 第9行
  37.     - {text: "&cPing:", icon: "default/ping.png", ping: 0} # 第10行
  38.     - {text: "&6${viewer ping}ms", icon: "default/ping.png", ping: 0} # 第11行
  39.     - {text: "", icon: "colors/gold.png", ping: 0} # 第12行
  40.     - {text: "&cPlayers:", icon: "default/players.png", ping: 0} # 第13行
  41.     - {text: "&6${playerset:global size}", icon: "default/players.png", ping: 0} # 第14行
  42.     - {text: "", icon: "colors/gold.png", ping: 0} # 第15行
  43.     - {text: "&cBalance:", icon: "default/balance.png", ping: 0} # 第16行
  44.     - {text: "&6${viewer vault_balance}", icon: "default/balance.png", ping: 0} # 第17行
  45.     - {text: "", icon: "colors/gold.png", ping: 0} # 第18行
  46.     - {text: "&cTime:", icon: "default/clock.png", ping: 0} # 第19行
  47.     - {text: "&6${time HH:mm:ss}", icon: "default/clock.png", ping: 0} # 第20行
  48.     1: # 第2列
  49.     - {text: "&a&lPlayers", icon: "colors/green.png", ping: 0} # 第1行
  50.     # 现在我们现实网络上的玩家列表。
  51.     - !players # 第2至20行
  52.       playerSet: global
  53.       playerComponent: "${player vault_prefix}&f${player name}"
  54.       morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
  55.     2: # 第三列
  56.     - !conditional # 第三列的内容会根据玩家是否是一个帮派的成员而不同。
  57.       condition: |-
  58.         ${viewer faction_name} == ""
  59.       true: # Not in a faction
  60.       - {text: "&6Faction list", icon: "colors/gold.png", alignment: CENTER} # 第1行
  61.       -
  62.       -
  63.       -
  64.       -
  65.       -
  66.       -
  67.       -
  68.       -
  69.       - {text: "Not in a Faction", alignment: CENTER} # 第10行
  70.       - {text: "Join one!", alignment: CENTER} # 第11行
  71.       false: # Member of a faction
  72.       - {text: "&6Faction &f${viewer faction_name}", icon: "colors/gold.png", alignment: CENTER} # 第1行
  73.       - {text: "&f${playerset:faction size} of ${viewer faction_member_count} &6Online", icon: "colors/gold.png", alignment: CENTER} # 第2行
  74.       - # 第3行
  75.       - !players # We use the remaining row to display the players in the players faction
  76.         playerSet: faction
  77.         playerComponent: "${player name}"
  78.         morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
复制代码




DYNAMIC_SIZE_FIXED_COLUMNS

DYNAMIC_SIZE_FIXED_COLUMNS 是一种Tab列表样式,它与 FIXED_SIZE 样式非常相似。它提供与 FIXED_SIZE 几乎相同的类型特有选项。两者间的不同是。当你使用 FIXED_SIZE 时,你定义Tab列表应有的格子数量。而当你使用 DYNAMIC_SIZE_FIXED_COLUMNS 时,你定义列的数量而BungeeTabListPlus会根据内容动态的调整行数。

这是它实际看起来的样子:



这里是配置文件。注意其与 FIXED_SIZE 看起来非常相似。

  1. showTo: all
  2. priority: 10

  3. showHeaderFooter: false

  4. playerSets:
  5.   global:
  6.     filter: "true"
  7.     hiddenPlayers: VISIBLE

  8. type: DYNAMIC_SIZE_FIXED_COLUMNS

  9. # 列的数量可以在这里设置
  10. # 可以设置为1至4
  11. columns: 1

  12. defaultIcon: colors/dark_gray.png
  13. defaultPing: 1000

  14. components:
  15. - {text: "&6===============", icon: "colors/gold.png", ping: 0}
  16. - {text: "&cServer: &6${viewer server}&e", icon: "default/server.png", ping: 0}
  17. - {text: "&cRank: &6${viewer vault_primary_group}", icon: "default/rank.png", ping: 0}
  18. - {text: "&cPing: &6${viewer ping}ms", icon: "default/ping.png", ping: 0}
  19. - {text: "&6===============", icon: "colors/gold.png", ping: 0}
  20. - !players
  21.   playerSet: global
  22.   playerOrder: connectedFirst
  23.   playerComponent: "${player vault_prefix}${player name}"
  24.   morePlayersComponent: {text: "&7... and &e${other_count} &7others", icon: "colors/gray.png", ping: 0}
  25. - !spacer {}
  26. - {text: "&6===============", icon: "colors/gold.png", ping: 0}
复制代码

当使用两列时:



注意行数是有范围限制的。当使用两列时,行数必须在11至20之间

这里是使用两列的配置:

  1. showTo: all
  2. priority: 10

  3. showHeaderFooter: false

  4. playerSets:
  5.   global:
  6.     filter: "true"
  7.     hiddenPlayers: VISIBLE

  8. type: DYNAMIC_SIZE_FIXED_COLUMNS

  9. # 列的数量可以在这里设置
  10. # 可以设置为1至4
  11. columns: 2

  12. defaultIcon: colors/dark_gray.png
  13. defaultPing: 1000

  14. components:
  15. - {text: "&6===============", icon: "colors/gold.png", ping: 0}
  16. - {text: "&6===============", icon: "colors/gold.png", ping: 0}
  17. - {text: "&cServer: &6${viewer server}&e", icon: "default/server.png", ping: 0}
  18. - {text: "&cRank: &6${viewer vault_primary_group}", icon: "default/rank.png", ping: 0}
  19. - {text: "&cPing: &6${viewer ping}ms", icon: "default/ping.png", ping: 0}
  20. - {text: "&cTPS: &6${viewer server tps}", icon: "default/ping.png", ping: 0}
  21. - {text: "&6===============", icon: "colors/gold.png", ping: 0}
  22. - {text: "&6===============", icon: "colors/gold.png", ping: 0}
  23. - !players
  24.   playerSet: global
  25.   playerOrder: connectedFirst
  26.   playerComponent: "${player vault_prefix}${player name}"
  27.   morePlayersComponent: {text: "&7... and &e${other_count} &7others", icon: "colors/gray.png", ping: 0}
  28. - !spacer {}
  29. - {text: "&6===============", icon: "colors/gold.png", ping: 0}
  30. - {text: "&6===============", icon: "colors/gold.png", ping: 0}
复制代码


配置文件示例


默认配置



  1. showTo: "all"

  2. priority: 21

  3. type: FIXED_SIZE

  4. showHeaderFooter: true

  5. header:
  6. - '&cWelcome &f${viewer name}'
  7. - '&eW&celcome &f${viewer name}'
  8. - '&eWe&clcome &f${viewer name}'
  9. - '&eWel&ccome &f${viewer name}'
  10. - '&eWelc&come &f${viewer name}'
  11. - '&eWelco&cme &f${viewer name}'
  12. - '&eWelcom&ce &f${viewer name}'
  13. - '&eWelcome &f${viewer name}'
  14. - '&cW&eelcome &f${viewer name}'
  15. - '&cWe&elcome &f${viewer name}'
  16. - '&cWel&ecome &f${viewer name}'
  17. - '&cWelc&eome &f${viewer name}'
  18. - '&cWelco&eme &f${viewer name}'
  19. - '&cWelcom&ee &f${viewer name}'
  20. - '&cWelcome &f${viewer name}'

  21. headerAnimationUpdateInterval: 0.2

  22. footer:
  23. - |-
  24.   &6Line 1
  25.   &eLine 2
  26. - |-
  27.   &eLine 1
  28.   &6Line 2

  29. footerAnimationUpdateInterval: 0.5

  30. customPlaceholders:
  31.   afk_tag:
  32.     !conditional
  33.     condition: ${player essentials_afk}
  34.     true: '&7|&oaway'
  35.     false: ''
  36.   viewer_colored_ping0:
  37.     !conditional
  38.     condition: "${viewer ping} < 50"
  39.     true: "&a${viewer ping}"
  40.     false: "&e${viewer ping}"
  41.   viewer_colored_ping:
  42.     !conditional
  43.     condition: "${viewer ping} < 150"
  44.     true: ${viewer_colored_ping0}
  45.     false: "&c${viewer ping}"

  46. defaultIcon: colors/dark_gray.png
  47. defaultPing: 1000
  48. size: 60
  49. playerSets:
  50.   global:
  51.     filter: "true"
  52. components:
  53. - {text: "&cServer: &6${viewer server}", icon: "default/server.png", ping: 0}
  54. - {text: "&cRank: &6${viewer vault_primary_group}", icon: "default/rank.png", ping: 0}
  55. # 根据延迟的高低用不同颜色显示ping
  56. - {text: "&cPing: ${viewer_colored_ping}ms", icon: "default/ping.png", ping: 0}
  57. - !players_by_server
  58.   playerSet: global
  59.   serverHeader:
  60.   - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  61.   - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  62.   - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  63.   - {text: "&e&n${server}&f&o (${server_player_count}):", icon: "colors/yellow.png", ping: 0}
  64.   showServers: ALL
  65.   playerComponent: {text: "${player name}${afk_tag}", icon: "${player skin}", ping: "${player ping}"}
  66.   morePlayersComponent: {text: "&7... and &e${other_count} &7others", icon: "colors/gray.png", ping: 0}
  67. # 我们希望下面的元件在Tab列表的最底部
  68. - !spacer {}
  69. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  70. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  71. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  72. # 在底部的动画
  73. - !animated
  74.   interval: 0.2
  75.   components:
  76.   - {text: "&6&c=&6==============", icon: "colors/gold.png", ping: 0}
  77.   - {text: "&6=&c=&6=============", icon: "colors/gold.png", ping: 0}
  78.   - {text: "&6==&c=&6============", icon: "colors/gold.png", ping: 0}
  79.   - {text: "&6===&c=&6===========", icon: "colors/gold.png", ping: 0}
  80.   - {text: "&6====&c=&6==========", icon: "colors/gold.png", ping: 0}
  81.   - {text: "&6=====&c=&6=========", icon: "colors/gold.png", ping: 0}
  82.   - {text: "&6======&c=&6========", icon: "colors/gold.png", ping: 0}
  83.   - {text: "&6=======&c=&6=======", icon: "colors/gold.png", ping: 0}
  84.   - {text: "&6========&c=&6======", icon: "colors/gold.png", ping: 0}
  85.   - {text: "&6=========&c=&6=====", icon: "colors/gold.png", ping: 0}
  86.   - {text: "&6==========&c=&6====", icon: "colors/gold.png", ping: 0}
  87.   - {text: "&6===========&c=&6===", icon: "colors/gold.png", ping: 0}
  88.   - {text: "&6============&c=&6==", icon: "colors/gold.png", ping: 0}
  89.   - {text: "&6=============&c=&6=", icon: "colors/gold.png", ping: 0}
  90.   - {text: "&6==============&c=&6", icon: "colors/gold.png", ping: 0}
  91. - !animated
  92.   interval: 0.2
  93.   components:
  94.   - {text: "&6&c=&6==============", icon: "colors/gold.png", ping: 0}
  95.   - {text: "&6=&c=&6=============", icon: "colors/gold.png", ping: 0}
  96.   - {text: "&6==&c=&6============", icon: "colors/gold.png", ping: 0}
  97.   - {text: "&6===&c=&6===========", icon: "colors/gold.png", ping: 0}
  98.   - {text: "&6====&c=&6==========", icon: "colors/gold.png", ping: 0}
  99.   - {text: "&6=====&c=&6=========", icon: "colors/gold.png", ping: 0}
  100.   - {text: "&6======&c=&6========", icon: "colors/gold.png", ping: 0}
  101.   - {text: "&6=======&c=&6=======", icon: "colors/gold.png", ping: 0}
  102.   - {text: "&6========&c=&6======", icon: "colors/gold.png", ping: 0}
  103.   - {text: "&6=========&c=&6=====", icon: "colors/gold.png", ping: 0}
  104.   - {text: "&6==========&c=&6====", icon: "colors/gold.png", ping: 0}
  105.   - {text: "&6===========&c=&6===", icon: "colors/gold.png", ping: 0}
  106.   - {text: "&6============&c=&6==", icon: "colors/gold.png", ping: 0}
  107.   - {text: "&6=============&c=&6=", icon: "colors/gold.png", ping: 0}
  108.   - {text: "&6==============&c=&6", icon: "colors/gold.png", ping: 0}
  109. - !animated
  110.   interval: 0.2
  111.   components:
  112.   - {text: "&6&c=&6==============", icon: "colors/gold.png", ping: 0}
  113.   - {text: "&6=&c=&6=============", icon: "colors/gold.png", ping: 0}
  114.   - {text: "&6==&c=&6============", icon: "colors/gold.png", ping: 0}
  115.   - {text: "&6===&c=&6===========", icon: "colors/gold.png", ping: 0}
  116.   - {text: "&6====&c=&6==========", icon: "colors/gold.png", ping: 0}
  117.   - {text: "&6=====&c=&6=========", icon: "colors/gold.png", ping: 0}
  118.   - {text: "&6======&c=&6========", icon: "colors/gold.png", ping: 0}
  119.   - {text: "&6=======&c=&6=======", icon: "colors/gold.png", ping: 0}
  120.   - {text: "&6========&c=&6======", icon: "colors/gold.png", ping: 0}
  121.   - {text: "&6=========&c=&6=====", icon: "colors/gold.png", ping: 0}
  122.   - {text: "&6==========&c=&6====", icon: "colors/gold.png", ping: 0}
  123.   - {text: "&6===========&c=&6===", icon: "colors/gold.png", ping: 0}
  124.   - {text: "&6============&c=&6==", icon: "colors/gold.png", ping: 0}
  125.   - {text: "&6=============&c=&6=", icon: "colors/gold.png", ping: 0}
  126.   - {text: "&6==============&c=&6", icon: "colors/gold.png", ping: 0}
  127. - {text: "&cTime: &6${time H:mm:ss}", icon: "default/clock.png", ping: 0}
  128. - {text: "&cPlayers: &6${playerset:global size}", icon: "default/players.png", ping: 0}
  129. - {text: "&cBalance: &6${viewer vault_balance 1.2}", icon: "default/balance.png", ping: 0}
复制代码

每个服务器一列



  1. showTo: "all"

  2. priority: 22

  3. type: FIXED_SIZE

  4. showHeaderFooter: true

  5. header:
  6. - '&cWelcome &f${viewer name}'
  7. - '&eW&celcome &f${viewer name}'
  8. - '&eWe&clcome &f${viewer name}'
  9. - '&eWel&ccome &f${viewer name}'
  10. - '&eWelc&come &f${viewer name}'
  11. - '&eWelco&cme &f${viewer name}'
  12. - '&eWelcom&ce &f${viewer name}'
  13. - '&eWelcome &f${viewer name}'
  14. - '&cW&eelcome &f${viewer name}'
  15. - '&cWe&elcome &f${viewer name}'
  16. - '&cWel&ecome &f${viewer name}'
  17. - '&cWelc&eome &f${viewer name}'
  18. - '&cWelco&eme &f${viewer name}'
  19. - '&cWelcom&ee &f${viewer name}'
  20. - '&cWelcome &f${viewer name}'

  21. headerAnimationUpdateInterval: 0.2

  22. footer:
  23. - |-
  24.   &6Line 1
  25.   &eLine 2
  26. - |-
  27.   &eLine 1
  28.   &6Line 2

  29. footerAnimationUpdateInterval: 0.5

  30. customPlaceholders:
  31.   afk_tag:
  32.     !conditional
  33.     condition: ${player essentials_afk}
  34.     true: '&7|&oaway'
  35.     false: ''
  36.   viewer_colored_ping0:
  37.     !conditional
  38.     condition: "${viewer ping} < 50"
  39.     true: "&a${viewer ping}"
  40.     false: "&e${viewer ping}"
  41.   viewer_colored_ping:
  42.     !conditional
  43.     condition: "${viewer ping} < 150"
  44.     true: ${viewer_colored_ping0}
  45.     false: "&c${viewer ping}"

  46. defaultIcon: colors/dark_gray.png
  47. defaultPing: 1000
  48. size: 60
  49. playerSets:
  50.   global:
  51.     filter: "true"
  52.   lobby:
  53.     filter: |-
  54.       ${player server} == "lobby"
  55.   survival:
  56.     filter: |-
  57.       ${player server} == "survival"
  58.   creative:
  59.     filter: |-
  60.       ${player server} == "creative"
  61. components:
  62. - !table
  63.   columns:
  64.     0:
  65.       - {text: "&2&lLobby", icon: "colors/dark_green.png", ping: 0}
  66.       - !players
  67.         playerSet: lobby
  68.         playerComponent: {text: "${player name}${afk_tag}", icon: "${player skin}", ping: "${player ping}"}
  69.         morePlayersComponent: {text: "&7... and &e${other_count} &7others", icon: "colors/dark_green.png", ping: 0}
  70.     1:
  71.       - {text: "&3&lSurvival", icon: "colors/dark_aqua.png", ping: 0}
  72.       - !players
  73.         playerSet: survival
  74.         playerComponent: {text: "${player name}${afk_tag}", icon: "${player skin}", ping: "${player ping}"}
  75.         morePlayersComponent: {text: "&7... and &e${other_count} &7others", icon: "colors/dark_aqua.png", ping: 0}
  76.     2:
  77.       - {text: "&6&lInfo", icon: "colors/gold.png", ping: 0}
  78.       - !animated
  79.         interval: 1.5
  80.         components:
  81.         - {text: "&cBalance: &6${viewer vault_balance 1.2}", icon: "default/balance.png", ping: 0}
  82.         - {text: "&cServer: &6${viewer server}", icon: "default/server.png", ping: 0}
  83.         - {text: "&cRank: &6${viewer vault_primary_group}", icon: "default/rank.png", ping: 0}
  84.         - {text: "&cPing: ${viewer_colored_ping}ms", icon: "default/ping.png", ping: 0}
  85.       - !animated
  86.         interval: 1.5
  87.         components:
  88.         - {text: "&6━━━━━━━━━━━━━━━━━━━━", icon: "colors/gold.png", ping: 0}
  89.         - {text: "&c━━━━━━━━━━━━━━━━━━━━", icon: "colors/gold.png", ping: 0}
  90.       - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  91.       - {text: "&4&lCreative", icon: "colors/dark_red.png", ping: 0}
  92.       - !players
  93.         playerSet: creative
  94.         playerComponent: {text: "${player name}${afk_tag}", icon: "${player skin}", ping: "${player ping}"}
  95.         morePlayersComponent: {text: "&7... and &e${other_count} &7others", icon: "colors/dark_red.png", ping: 0}
复制代码

动态尺寸,全局列表



  1. showTo: "all"
  2. priority: 100

  3. type: DYNAMIC_SIZE

  4. showHeaderFooter: true

  5. header:
  6. - '&cWelcome &f${viewer name}'
  7. - '&eW&celcome &f${viewer name}'
  8. - '&eWe&clcome &f${viewer name}'
  9. - '&eWel&ccome &f${viewer name}'
  10. - '&eWelc&come &f${viewer name}'
  11. - '&eWelco&cme &f${viewer name}'
  12. - '&eWelcom&ce &f${viewer name}'
  13. - '&eWelcome &f${viewer name}'
  14. - '&cW&eelcome &f${viewer name}'
  15. - '&cWe&elcome &f${viewer name}'
  16. - '&cWel&ecome &f${viewer name}'
  17. - '&cWelc&eome &f${viewer name}'
  18. - '&cWelco&eme &f${viewer name}'
  19. - '&cWelcom&ee &f${viewer name}'
  20. - '&cWelcome &f${viewer name}'

  21. headerAnimationUpdateInterval: 0.2

  22. footer:
  23. - '&f&oPowered by BungeeTabListPlus'

  24. footerAnimationUpdateInterval: 0.5

  25. customPlaceholders:
  26.   other_server_prefix: # 使其它服务器上的玩家显示为灰色
  27.     !conditional
  28.     condition: '${viewer server} == ${player server}'
  29.     true: '&f'
  30.     false: '&7'

  31. playerSets:
  32.   global:
  33.     filter: "true"
  34.     hiddenPlayers: "VISIBLE" # 在Tab列表是显示隐藏的玩家,来避免小问题

  35. playerSet: global

  36. playerOrder: "playerServerFirst,serverAlphabetically,vaultGroupInfo,alphabetically"

  37. playerComponent: {text: "${other_server_prefix}${player name}", icon: "${player skin}", ping: "${player ping}"}
复制代码

信息列,一个服务器两列,两个服务器一列



  1. showTo: 'all'
  2. priority: 30

  3. type: FIXED_SIZE

  4. showHeaderFooter: false

  5. defaultIcon: "colors/dark_gray.png"
  6. defaultPing: 1000
  7. size: 80

  8. playerSets:
  9.   global:
  10.     filter: "true"
  11.   lobby:
  12.     filter: |-
  13.       ${player server} == "spawn"
  14.   survival:
  15.     filter: |-
  16.       ${player server} == "survival"
  17.   creative:
  18.     filter: |-
  19.       ${player server} == "creative"

  20. components:
  21. - !table
  22.   columns:
  23.     0:
  24.     - {text: "&lInfo", icon: "colors/gold.png", ping: 0}
  25.     - {text: "", icon: "colors/gold.png", ping: 0}
  26.     - {text: "", icon: "colors/gold.png", ping: 0}
  27.     - {text: "&cServer:", icon: "default/server.png", ping: 0}
  28.     - {text: "&6${viewer server}", icon: "default/server.png", ping: 0}
  29.     - {text: "", icon: "colors/gold.png", ping: 0}
  30.     - {text: "&cRank:", icon: "default/rank.png", ping: 0}
  31.     - {text: "&6${viewer vault_primary_group}", icon: "default/rank.png", ping: 0}
  32.     - {text: "", icon: "colors/gold.png", ping: 0}
  33.     - {text: "&cPing:", icon: "default/ping.png", ping: 0}
  34.     - {text: "&6${viewer ping}ms", icon: "default/ping.png", ping: 0}
  35.     - {text: "", icon: "colors/gold.png", ping: 0}
  36.     - {text: "&cPlayers:", icon: "default/players.png", ping: 0}
  37.     - {text: "&6${playerset:global size}", icon: "default/players.png", ping: 0}
  38.     - {text: "", icon: "colors/gold.png", ping: 0}
  39.     - {text: "&cBalance:", icon: "default/balance.png", ping: 0}
  40.     - {text: "&6${viewer vault_balance}", icon: "default/balance.png", ping: 0}
  41.     - {text: "", icon: "colors/gold.png", ping: 0}
  42.     - {text: "&cTime:", icon: "default/clock.png", ping: 0}
  43.     - {text: "&6${time HH:mm:ss}", icon: "default/clock.png", ping: 0}
  44.     1-2:
  45.     - {text: "&a&lLobby", icon: "colors/green.png", ping: 0}
  46.     - {text: "&a&lLobby", icon: "colors/green.png", ping: 0}
  47.     - !players
  48.       playerSet: lobby
  49.       playerComponent: {text: "${player vault_prefix}${player name}", icon: "${player skin}", ping: "${player ping}"}
  50.       morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
  51.     3:
  52.     - {text: "&b&lSurvival", icon: "colors/aqua.png", ping: 0}
  53.     - !players
  54.       playerSet: survival
  55.       playerComponent: {text: "${player vault_prefix}${player name}", icon: "${player skin}", ping: "${player ping}"}
  56.       morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
  57.       minSize: 9
  58.       maxSize: 9
  59.     - {text: "&c&lCreative", icon: "colors/red.png", ping: 0}
  60.     - !players
  61.       playerSet: creative
  62.       playerComponent: {text: "${player vault_prefix}&f${player name}", icon: "${player skin}", ping: "${player ping}"}
  63.       morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
  64.       minSize: 9
  65.       maxSize: 9
复制代码

每个玩家使用多个格子



  1. showTo: "all"

  2. priority: 200

  3. type: FIXED_SIZE

  4. showHeaderFooter: true

  5. header:
  6. - '&cWelcome &f${viewer name}'
  7. - '&eW&celcome &f${viewer name}'
  8. - '&eWe&clcome &f${viewer name}'
  9. - '&eWel&ccome &f${viewer name}'
  10. - '&eWelc&come &f${viewer name}'
  11. - '&eWelco&cme &f${viewer name}'
  12. - '&eWelcom&ce &f${viewer name}'
  13. - '&eWelcome &f${viewer name}'
  14. - '&cW&eelcome &f${viewer name}'
  15. - '&cWe&elcome &f${viewer name}'
  16. - '&cWel&ecome &f${viewer name}'
  17. - '&cWelc&eome &f${viewer name}'
  18. - '&cWelco&eme &f${viewer name}'
  19. - '&cWelcom&ee &f${viewer name}'
  20. - '&cWelcome &f${viewer name}'

  21. headerAnimationUpdateInterval: 0.2

  22. footer:
  23. - '&f&oPowered by BungeeTabListPlus'

  24. footerAnimationUpdateInterval: 0.5

  25. customPlaceholders:
  26.   player_colored_ping0:
  27.     !conditional
  28.     condition: "${player ping} < 50"
  29.     true: "&a${player ping}"
  30.     false: "&e${player ping}"
  31.   player_colored_ping:
  32.     !conditional
  33.     condition: "${player ping} < 150"
  34.     true: ${player_colored_ping0}
  35.     false: "&c${player ping}"

  36. defaultIcon: colors/dark_gray.png
  37. defaultPing: 1000
  38. size: 60
  39. playerSets:
  40.   global:
  41.     filter: "true"
  42.     hiddenPlayers: VISIBLE_TO_ADMINS
  43. components:
  44. - {text: "&cName", icon: "default/players.png", ping: 0}
  45. - {text: "&cServer", icon: "default/server.png", ping: 0}
  46. - {text: "&cPing", icon: "default/ping.png", ping: 0}
  47. # 这里设置玩家元件
  48. - !players
  49.   playerSet: global
  50.   playerComponent:
  51.     - {text: "${player name}", icon: "${player skin}", ping: "${player ping}"}
  52.     - {text: "${player server}", icon: "${player skin}", ping: "${player ping}"}
  53.     - {text: "${player_colored_ping}ms", icon: "${player skin}", ping: "${player ping}"}
  54.   morePlayersComponent: {text: "&7... and &e${other_count} &7others", icon: "colors/gray.png", ping: 0}
  55. # 我们希望下面的元件位于Tab列表最底部
  56. - !spacer {}
  57. # 另一个空行
  58. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  59. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  60. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  61. - {text: "&cTime: &6${time H:mm:ss}", icon: "default/clock.png", ping: 0}
  62. - {text: "&cPlayers: &6${playerset:global size}", icon: "default/players.png", ping: 0}
  63. - {text: "&cMC-Version: &6${viewer client_version}", icon: "colors/gold.png", ping: 0}
复制代码

只显示在同一服务器上的玩家



  1. showTo: "all"

  2. priority: 10

  3. type: FIXED_SIZE

  4. showHeaderFooter: true

  5. header:
  6. - '&cWelcome &f${viewer name}'
  7. - '&eW&celcome &f${viewer name}'
  8. - '&eWe&clcome &f${viewer name}'
  9. - '&eWel&ccome &f${viewer name}'
  10. - '&eWelc&come &f${viewer name}'
  11. - '&eWelco&cme &f${viewer name}'
  12. - '&eWelcom&ce &f${viewer name}'
  13. - '&eWelcome &f${viewer name}'
  14. - '&cW&eelcome &f${viewer name}'
  15. - '&cWe&elcome &f${viewer name}'
  16. - '&cWel&ecome &f${viewer name}'
  17. - '&cWelc&eome &f${viewer name}'
  18. - '&cWelco&eme &f${viewer name}'
  19. - '&cWelcom&ee &f${viewer name}'
  20. - '&cWelcome &f${viewer name}'

  21. headerAnimationUpdateInterval: 0.2

  22. footer:
  23. - '&f&oPowered by BungeeTabListPlus'

  24. footerAnimationUpdateInterval: 0.5

  25. customPlaceholders:
  26.   viewer_colored_ping0:
  27.     !conditional
  28.     condition: "${viewer ping} < 50"
  29.     true: "&a${viewer ping}"
  30.     false: "&e${viewer ping}"
  31.   viewer_colored_ping:
  32.     !conditional
  33.     condition: "${viewer ping} < 150"
  34.     true: ${viewer_colored_ping0}
  35.     false: "&c${viewer ping}"

  36. defaultIcon: colors/dark_gray.png
  37. defaultPing: 1000
  38. size: 60
  39. playerSets:
  40.   global:
  41.     filter: "true"
  42.     hiddenPlayers: VISIBLE_TO_ADMINS
  43.   currentserver:
  44.     filter: "${player server} == ${viewer server}"
  45.     hiddenPlayers: VISIBLE_TO_ADMINS
  46. components:
  47. - {text: "&cServer: &6${viewer server}", icon: "default/server.png", ping: 0}
  48. - {text: "&cRank: &6${viewer vault_primary_group}", icon: "default/rank.png", ping: 0}
  49. - {text: "&cPing: ${viewer_colored_ping}ms", icon: "default/ping.png", ping: 0}
  50. # 一个空行
  51. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  52. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  53. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  54. # 这里是玩家元件
  55. - !players
  56.   playerSet: currentserver
  57.   playerOrder: "vaultGroupInfo,alphabetically"
  58.   playerComponent: {text: "${player vault_prefix}${player name}", icon: "${player skin}", ping: "${player ping}"}
  59.   morePlayersComponent: {text: "&7... and &e${other_count} &7others", icon: "colors/gray.png", ping: 0}
  60. # 我们期望下面的元件位于Tab列表最底部
  61. - !spacer {}
  62. # 另一个空行
  63. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  64. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  65. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  66. # 底部的动画
  67. - &animated_line
  68.   !animated
  69.   interval: 0.2
  70.   components:
  71.   - {text: "&6&c=&6==============", icon: "colors/gold.png", ping: 0}
  72.   - {text: "&6=&c=&6=============", icon: "colors/gold.png", ping: 0}
  73.   - {text: "&6==&c=&6============", icon: "colors/gold.png", ping: 0}
  74.   - {text: "&6===&c=&6===========", icon: "colors/gold.png", ping: 0}
  75.   - {text: "&6====&c=&6==========", icon: "colors/gold.png", ping: 0}
  76.   - {text: "&6=====&c=&6=========", icon: "colors/gold.png", ping: 0}
  77.   - {text: "&6======&c=&6========", icon: "colors/gold.png", ping: 0}
  78.   - {text: "&6=======&c=&6=======", icon: "colors/gold.png", ping: 0}
  79.   - {text: "&6========&c=&6======", icon: "colors/gold.png", ping: 0}
  80.   - {text: "&6=========&c=&6=====", icon: "colors/gold.png", ping: 0}
  81.   - {text: "&6==========&c=&6====", icon: "colors/gold.png", ping: 0}
  82.   - {text: "&6===========&c=&6===", icon: "colors/gold.png", ping: 0}
  83.   - {text: "&6============&c=&6==", icon: "colors/gold.png", ping: 0}
  84.   - {text: "&6=============&c=&6=", icon: "colors/gold.png", ping: 0}
  85.   - {text: "&6==============&c=&6", icon: "colors/gold.png", ping: 0}
  86. - *animated_line
  87. - *animated_line
  88. - {text: "&cTime: &6${time H:mm:ss}", icon: "default/clock.png", ping: 0}
  89. - {text: "&cPlayers: &6${playerset:global size}", icon: "default/players.png", ping: 0}
  90. - {text: "&cBalance: &6${viewer vault_balance 1.2}[        DISCUZ_CODE_57        ]quot;, icon: "default/balance.png", ping: 0}
复制代码

区分管理员与普通玩家



  1. showTo: "all"
  2. priority: 10

  3. type: FIXED_SIZE

  4. showHeaderFooter: false

  5. defaultIcon: colors/dark_gray.png
  6. defaultPing: 1000
  7. size: 60
  8. playerSets:
  9.   global:
  10.     filter: "true"
  11.   admins:
  12.     filter: ${player vault_primary_group} == "Admin"
  13.   nonadmins:
  14.     filter: ${player vault_primary_group} != "Admin"
  15. components:
  16. - {text: "&cServer: &6${viewer server}", icon: "default/server.png", ping: 0}
  17. - {text: "&cRank: &6${viewer vault_primary_group}", icon: "default/rank.png", ping: 0}
  18. - {text: "&cPing: &6${viewer ping}ms", icon: "default/ping.png", ping: 0}
  19. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  20. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  21. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  22. - {text: "&e&l━━━━━━━━━━", icon: "colors/dark_gray.png", ping: 1000, alignment: CENTER}
  23. - {text: "&e&lAdmins", icon: "colors/dark_gray.png", ping: 1000, alignment: CENTER}
  24. - {text: "&e&l━━━━━━━━━━", icon: "colors/dark_gray.png", ping: 1000, alignment: CENTER}
  25. - !players
  26.   playerSet: admins
  27.   playerOrder: 'alphabetically'
  28.   playerComponent: {text: "${player name}", icon: "${player skin}", ping: "${player ping}"}
  29.   morePlayersComponent: {text: "&7... and &e${other_count} &7others", icon: "colors/gray.png", ping: 0}
  30. - !table {} # 添加一个空的表格元件会使下一个元件位于最左侧一列
  31. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  32. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  33. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  34. - {text: "&e&l━━━━━━━━━━", icon: "colors/dark_gray.png", ping: 1000, alignment: CENTER}
  35. - {text: "&e&lPlayers", icon: "colors/dark_gray.png", ping: 1000, alignment: CENTER}
  36. - {text: "&e&l━━━━━━━━━━", icon: "colors/dark_gray.png", ping: 1000, alignment: CENTER}
  37. - !players
  38.   playerSet: nonadmins
  39.   playerOrder: 'alphabetically'
  40.   playerComponent: {text: "${player name}", icon: "${player skin}", ping: "${player ping}"}
  41.   morePlayersComponent: {text: "&7... and &e${other_count} &7others", icon: "colors/gray.png", ping: 0}
  42. - !spacer {}
  43. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  44. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  45. - {text: "", icon: "colors/dark_gray.png", ping: 1000}
  46. - {text: "&6=============", icon: "colors/gold.png", ping: 0}
  47. - {text: "&6=============", icon: "colors/gold.png", ping: 0}
  48. - {text: "&6=============", icon: "colors/gold.png", ping: 0}
  49. - {text: "&cTime: &6${time H:mm:ss}", icon: "default/clock.png", ping: 0}
  50. - {text: "&cPlayers: &6${playerset:global size}", icon: "default/players.png", ping: 0}
  51. - {text: "&cBalance: &6${viewer vault_balance}", icon: "default/balance.png", ping: 0}
复制代码



全局设置

一些全局设置项可以在config.yml中配置。这里是全部的全局设置项以及详细的描述:

  • tablistUpdateInterval: 1.0

    这里设定每隔多少秒Tab列表对所有玩家更新。你可以使用小于1的值,例如0.1会每秒更新十次。设置为-1则会关闭Tab列表的定期更新。默认值是1。

    这个设置项已于BungeeTabListPlus 2.8.0版本移除.
  • updateOnPlayerJoinLeave: true

    Whether the tablist should be updated when a player joins or leaves the network. Setting this to false can improve performance on big servers. Default is true but you might want to change this depending on your setup. Tab列表是否应在玩家加入或离开时更新。设置为false可以提升在大型服务器上的性能。默认为true但是你可能想会在设置时修改这个。

    这个设置项已于BungeeTabListPlus 2.8.0版本移除.
  • updateOnServerChange: true

    Tab列表是否应在玩家更换服务器时更新。设置为false可以提升在大型服务器上的性能。默认为true但是你可能想会在设置时修改这个。

    这个设置项已于BungeeTabListPlus 2.8.0版本移除.
  • charLimit: -1

    你可以在这里限制一个格子中显示的字符数量。你可以使用其来避免一个格子中的文本过长。 颜色代码不被计算在内;-1代表无限制。我建议你不要修改这个。

    这个设置项已于BungeeTabListPlus 2.8.0版本移除.
  • permissionSource: AUTO

    允许你决定BungeeTabListPlus应该从哪里获取类似昵称,前缀,后缀,权限组的信息。

    描述         
      AUTO自动选择最佳的
      BUKKIT从bukkit/vault获取信息
      BUNGEEPERMS从bungeeperms获取信息
      BUNGEE从bungee获取权限组,从config.yml获取前缀


    在大多数情况下使用auto是最好的选择,所以我不建议你修改这个。

    这个设置项已于BungeeTabListPlus 2.8.0版本移除.
  • showPlayersInGamemode3: true

    处于旁观模式的玩家是否应当显示在Tab列表上。

    这个设置项已于BungeeTabListPlus 2.8.0版本移除.
  • checkForUpdates: true

    如果开启BungeeTabListPlus将会自动检查是否有更新可用。你可以输入 /btlp 来查看是否有更新可用。你必须自己下载安装更新。
  • notifyAdminsIfUpdateAvailable: true

    如果这个开启,并且上面的也开启,管理员将会看到通知他们新版本BungeeTabListPlus可用的聊天消息。
  • automaticallySendBugReports: true

    如果设置为true,插件在遭遇错误时会自动发送一个错误报告。
  • 服务器别名

    1. serverAlias:
    2.   server1: Spawn
    3.   server2: Creative
    4.   server3: PvP
    复制代码

    你可以在这里为你的服务器设置昵称。这会被{server}变量使用。如果你不希望你的玩家看到bungeecord的配置文件中的服务器的内部名(例中的server1)时,可能会用到这个。他们会看到这里定义的昵称 (server1 被 Spawn替代)。你也可以在这里使用样式代码,例如&c是红色。

    如果两个服务器拥有相同的别名,如果设置使用按服务器分组玩家,插件将会将他们分到一组。

    这个设置项已于BungeeTabListPlus 2.8.0版本移除.
  • 世界别名

    1. worldAlias:
    2.   spawn:world: PvP
    3.   spawn:hub: Spawn
    4.   server2:world: Creative
    复制代码

    与服务器别名类似。为某个服务器的某个世界定义一个别名。

    这个设置项已于BungeeTabListPlus 2.8.0版本移除.
  • 服务器前缀

    1. serverPrefixes:
    2.   SkyBlock: '&8(&dS&8)'
    3.   Minigames: '&8(&bM&8)'
    复制代码

    你可以在这里设置每个服务器的前缀。可以通过使用{serverPrefix}变量来使用这些前缀。

    这个设置项已于BungeeTabListPlus 2.8.0版本移除.
  • 前缀

    1. prefixes:
    2.   default: ''
    3.   vip: '&b[VIP]'
    4.   admin: '&c[A] '
    复制代码

    这个设置让你可以在不使用BungeePerms或者一个Bukkit侧权限插件的情况下设置玩家的前缀。你可以给一个权限租指定一个前缀。

    即是安装了BungeePerms或者Bukkit侧的权限插件的前缀是可用的,插件仍会优先使用定义在这里的前缀。

    这个设置项已于BungeeTabListPlus 2.8.0版本移除.
  • pingDelay: -1   

    这个只与{onlineState}变量有关,这个变量用于显示你网络中的一个服务器是否在线。为了知道一个服务器是否在线插件会周期性地ping所有服务器。你可以在这里设置扫描的时间间隔(秒)。要关闭这个功能只需要设置 pingDelay 为-1。
  • online-text: '&2 ON'   

    这个只与{onlineState}变量有关,这个变量用于显示你网络中的一个服务器是否在线。这里的设置会在服务器在线的时候替换{onlineState}。

    这个设置项已于BungeeTabListPlus 2.8.0版本移除.
  • offline-text: '&c OFF'   

    这个只与{onlineState}变量有关,这个变量用于显示你网络中的一个服务器是否在线。这里的设置会在服务器离线的时候替换{onlineState}。

    这个设置项已于BungeeTabListPlus 2.8.0版本移除.
  • 假人

    1. fakePlayers:
    2. - Herobrine
    3. - Notch
    复制代码

    在配置文件的这个部分,你可以设置一些“虚假的”玩家。他们会随机地显示在Tab列表上。默认这是一个空列表而且你不应修改它。

    要关闭假人,设置其为下面这样(默认值):

    1.   fakePlayers: []
    复制代码

  • 排除的服务器

    1. excludeServers:
    2. - server2
    3. - server7
    复制代码

    你可以在这里设置一些服务器,你希望在那些服务器会使用它们自己的Tab列表。我建议,如果你不清楚自己正在做什么,不要在这里添加任何你的服务器。在这里列出的服务器上的所有玩家将不会看到由本插件提供的Tab列表,而会看到他们所在的服务器本地的Tab列表。
  • 隐藏服务器

    1. hiddenServers:
    2. - server3
    3. - server9
    复制代码

    你希望从全局Tab列表中隐藏的服务器。

    注意这个是与上面的excludeServers不同的。这个选项会隐藏在列出的服务器上的所有玩家,使他们不会出现在Tab列表上,而被排除的服务器的玩家仍会显示在BungeeTabListPlusTab列表上,但是他们不会看到全局Tab列表。
  • 隐藏玩家

    1. hiddenPlayers:
    2. - CodeCrafter47
    3. - d9935dff-9702-404b-9d44-8efd35b0928d
    复制代码

    设置你希望长期在Tab列表上隐藏玩家。你也可以在这里所以UUID。注意拥有 bungeetablistplus.seevanished 权限的玩家仍会在他们的Tab列表里看到隐藏的玩家。
  • time-zone: Europe/Berlin    

    这里设置{time}变量所使用的时区。可以使用类似 America/Los_Angeles 的全名,或者 GMT+8
  • 自定义占位符

    1. customPlaceholders:
    2.   ...
    复制代码

    详见 自定义占位符



元件参考页

下面这些元件都是可用的

  • 基础元件

    1. {text: "...", icon: "image.png", ping: 0}
    复制代码

    基础元件代表Tab列表中一个格子的内容。 icon 选项可以设置为玩家的UUID,玩家名,或者 BungeeTabListPlus/heads 目录下的一个图片文件

    基础元件可以使用 alignment 来设置文本对齐,其可以设置为 LEFT , CENTER RIGHT

    1. {text: "Centered text", icon: "image.png", ping: 0, alignment: CENTER}
    复制代码

    或者右对齐文本:

    1. {text: "At the right", icon: "image.png", ping: 0, alignment: RIGHT}
    复制代码

    另一个设置项是 longText ,可以用来指定当文本太长时会怎么处理。其可以被设置为 DISPLAY_ALL , CROP , CROP_2DOTS CROP_3DOTS 。默认设定是 DISPLAY_ALL ,不论如何都会显示文本。其它的选项则会裁剪部分文本以适应格子大小。根据你选择的选项不同还会添加2或3个句点 . 。例子:

    1. {text: "${player vault_prefix}${player name}", longText: CROP_2DOTS}
    复制代码

  • 动画元件

    1. !animated
    2. components: <元件列表>
    3. interval: <数字>
    复制代码

    例子:

    1. !animated
    2. components:
    3.   - {text: "&7Hello &a${player name}", icon: "${player skin}", ping: 0}
    4.   - {text: "&7Hello &b${player name}", icon: "${player skin}", ping: 0}
    5.   - {text: "&7Hello &c${player name}", icon: "${player skin}", ping: 0}
    6.   - {text: "&7Hello &d${player name}", icon: "${player skin}", ping: 0}
    7. interval: 0.4
    复制代码

    这个元件使得创建拥有动画效果的格子成为可能。

    | 设置项 | 描述 | | ------ | ----------- | | components | 这些元件将会逐个循环显示. | | interval | 切换当前显示的元件的时间间隔,单位为秒。 |
  • 条件元件

    1. !conditional
    2. condition: <表达式>
    3. true: <如果表达式结果为true,显示的内容>
    4. false: <如果表达式结果为false,显示的内容>
    复制代码

    例子:

    1. !conditional
    2. condition: |-
    3.   ${server:survival online} == true
    4. true: {text: "&bSurvival: &aONLINE", icon: "colors/green.png", ping: 0}
    5. false: {text: "&bSurvival: &cOFFLINE", icon: "colors/red.png", ping: 0}
    复制代码

    这个元件可以动态的修改Tab列表的内容,上面的例子演示了如何用其代替{onlineState}变量。

    | 设置项 | 描述 | | ------ | ----------- | | condition | 用于求值的表达式. | | true | 如果 condition 结果为 true 真,使用这里的文本. | | false | 如果 condition 结果为 false 假,使用这里的文本. |

    更多信息: 表达式语法
  • 玩家元件

    1. !players
    2. playerSet: <字符串>
    3. playerOrder: <字符串>
    4. playerComponent: <一个或者一组元件>
    5. morePlayersComponent: <一个或者一组元件>
    6. fillSlotsVertical: <true/false>
    7. minSize: <数字>
    8. maxSize: <数字>
    复制代码

    例子:

    1. !players
    2. playerSet: global
    3. playerOrder: "vaultGroupInfo,alphabetically"
    4. playerComponent: {text: "${player name}", icon: "${player skin}", ping: "${player ping}"}
    5. morePlayersComponent: {text: "... and ${other_count} others", icon: "default/players.png", ping: 0}
    6. minSize: 0
    7. maxSize: 6
    复制代码


  这个元件提供了一个简单的向Tab列表添加玩家的方式。

设置项描述
playerSet 选择哪些玩家会被添加到Tab列表。
playerOrder 设定玩家在Tab列表中排列的顺序,详见排序玩家
playerComponent 设定一个玩家在Tab列表中会如何显示 。通常你会把这个设定为 {text: "${player name}", icon: "${player skin}", ping: "${player ping}"} , 最后添加一个前缀。这个可以设置为一组基础元素,这样可以用多栏显示一个玩家。
morePlayersComponent 这项将会在玩家数量超过Tab列表上的空间(或者超过 max-size )时显示。
fillSlotsVertical 可选的:如果设置为true,Tab列表会从上往下填充,而不是从左往右。
minSize 可选的:这个元件需要使用的最少格子数量。
maxSize 可选的:这个元件可以使用的最多格子数量。

  • 按服务器分组玩家元件

    1. !players_by_server
    2. playerSet: <字符串>
    3. playerOrder: <字符串>
    4. serverOrder: <字符串>
    5. customServerOrder: <服务器列表>
    6. serverHeader: <一组元件>
    7. serverFooter: <一组元件>
    8. serverSeparator: <一组元件>
    9. includeEmptyServers: <布尔值>
    10. showServers: <ALL, ONLINE, NON_EMPTY>
    11. hiddenServers: <服务器列表>
    12. playerComponent: <一个或一组元件>
    13. morePlayersComponent: <一个或一组元件>
    14. fillSlotsVertical: <true/false>
    15. minSizePerServer: <数字>
    16. maxSizePerServer: <数字>
    17. minSize: <数字>
    18. maxSize: <数字>
    复制代码

    例子:

    1. !players_by_server
    2. playerSet: global
    3. playerOrder: "vaultGroupInfo,alphabetically"
    4. serverOrder: "playercount,alphabetically"
    5. serverHeader:
    6. - {text: "&e&n${server}&f&o (${server_player_count}):", icon: "colors/yellow.png", ping: 0}
    7. showServers: NON_EMPTY
    8. playerComponent: {text: "${player name}", icon: "${player skin}", ping: "${player ping}"}
    9. morePlayersComponent: {text: "&7... and &e${other_count} &7others", icon: "colors/gray.png", ping: 0}
    复制代码

    这个元件把玩家按照服务器分组,然后添加到Tab列表中。就像在默认配置中看到的那样。

    设置项描述
    playerSet 选择哪些玩家会被添加到Tab列表。
    playerOrder 设定玩家在Tab列表中显示的顺序。详见排序玩家
    serverOrder 设定服务器显示的顺序。可用的选项有 alphabetically , playercount , online 以及 custom 。这些可以使用逗号,连接起来就像在 playerOrder 中那样工作。
    customServerOrder 如果你在 serverOrder 选项中使用 custom 。那么在这里设置服务器的顺序。下面有一个示例片段。
    serverHeader 服务器头会在每个服务器的玩家的前面显示一次。
    serverFooter 可选:服务器脚会在每个服务器的玩家的最后显示。
    serverSeparator 可选:服务器分隔会在两个服务器中间显示。
    includeEmptyServers 是否也显示空服务器这个选项已经被 showServers 取代
    showServers 哪些服务器会显示在Tab列表上。可以被设置为 ALL , ONLINE 已经 NON_EMPTY
    hiddenServers 设定不显示的服务器。详见下面的例子。
    playerComponent 设定一个玩家在Tab列表中会如何显示 。通常你会把这个设定为 {text: "${player name}", icon: "${player skin}", ping: "${player ping}"} , 最后添加一个前缀。这个可以设置为一组基础元素,这样可以多栏显示一个玩家。
    morePlayersComponent 这项将会在玩家数量超过Tab列表上的空间(或者超过 max-size )时显示。
    fillSlotsVertical 可选的:如果设置为true,Tab列表会从上往下填充,而不是从左往右。
    minSizePerServer 可选的:一个服务器最少使用的格子数量。
    maxSizePerServer 可选的:一个服务器最多使用的格子数量。
    minSize 可选的:这个元件最少使用的格子数量。
    maxSize 可选的:这个元件最多使用的格子数量。



    使用 serverOrder: custom 的示例:

    1. !players_by_server
    2. playerSet: global
    3. serverOrder: custom
    4. customServerOrder: [spawn, survival, creative]
    5. # ...
    复制代码

    使用 hiddenServers 选项的示例:

    1. !players_by_server
    2. playerSet: global
    3. showServers: ALL
    4. hiddenServers: [hub, private]
    5. # ...
    复制代码



    1. !table
    2. columns:
    3. <列序号>: <一组元件>
    复制代码

    例子:

    1. !table
    2. columns:
    3.   0-1:
    4.     - {text: "Survival"}
    5.     - {text: ""}
    6.     - !players
    7.       playerSet: survival
    8.       playerComponent: {text: "${player name}", icon: "${player skin}", ping: "${player ping}"}
    9.       morePlayersComponent: {text: "... and ${other_count} others", skin: "default/players.png", ping: 0}
    10.   2:
    11.     - {text: "Stats:"}
    12.     - {text: "Playtime:"}
    13.     - {text: "  Total: ${viewer bungeeonlinetime}"} # 仅仅是作为例子,这个占位符目前并不存在
    14.     - {text: "  Session: ${viewer onlinetime}"}
    15.     - {text: ""}
    16.     - {text: "Balance: ${viewer vault_balance}"}
    17.     - {text: ""}
    18.     - {text: "Faction: ${viewer faction}"}
    复制代码

    允许独立的设置列的内容。这样就可以使用每个服务器一列的布局。
  • 隔板

    1. !spacer {}
    复制代码

    例子:

    1. size: 20
    2. components:
    3. - {text: "Top-most slot", icon: "colors/gold.png", ping: 0}
    4. - !spacer {}
    5. - {text: "Slot at the very bottom", icon: "colors/gold.png", ping: 0}
    复制代码

  • 容器

    1. !container
    2. fillSlotsVertical: <true/false>
    3. minSize: <数字>
    4. maxSize: <数字>
    5. components: <一组元件>
    复制代码

    例子:

    1. components:
    2. - !container
    3.   fillSlotsVertical: true
    4.   components:
    5.   - "Admins:"
    6.   - !players
    7.     playerSet: admin
    8.     playerComponent: "${player vault_prefix}${player name}${afk_tag}"
    9.     morePlayersComponent: {text: "&7... and &e${other_count} &7others", icon: "colors/gray.png", ping: 0}
    10.   -
    11.   - !players_by_server
    12.     playerSet: global
    13.     serverOrder: "playercount,online,alphabetically"
    14.     serverHeader:
    15.     - {text: "&e&n${server}&f&o (${server_player_count}):", icon: "colors/yellow.png", ping: 0}
    16.     serverSeparator:
    17.     -
    18.     playerComponent: "${player vault_prefix}${player name}${afk_tag}"
    19.     morePlayersComponent: {text: "&7... and &e${other_count} &7others", icon: "colors/gray.png", ping: 0}
    复制代码

    设置项描述
    fillSlotsVertical 可选的:如果设置为true,Tab列表会从上往下填充,而不是从左往右
    minSize 可选的:这个元件最少使用的格子数量。
    maxSize 可选的:这个元件最多使用的格子数量。
    components 这些元件将会显示在这个容器元件在Tab列表中所占据的空间中。




表达式语法

表达式在插件的配置中的很多不同位置使用。使用这里解释一下什么是一个表达式:

注意语义:一个表达式的结果可能是布尔值(true/ false),一个数字或者一个字符串。在大部分场合,插件会需要一个布尔值的结果。如果表达式并没有返回一个布尔值作为结果,那么结果会被自动转换。如果一个数字为 0 ,它就会被转为 false 其它情况会被转为 true 。一个字符串会被转换为 true 如果它等于 "true" ,其它的情况字符串将会被转为 false

常量

  • 所有的数字都是一个表达式,所以下面这些例子都是正确的表达式:

    1. 0
    2. 1000
    3. -7
    4. 47.2
    复制代码

  • 双引号中的字符串是一个正确的表达式。例子:

    1. "Hello World"
    2. ""
    复制代码

  • 布尔值常量有 true ,, false 以及 all (与 true 相同).

占位符:

任何占位符都是正确的表达式。查看 所有占位符列表 获取更多信息.

例子:

  1. ${player name}
  2. ${viewer uuid}
  3. ${playerset:global size}
  4. ${server:lobby online}
  5. ${viewer server tps}
复制代码

二元操作符

<表达式> <二元操作符> <表达式> 是一个正确的表达式。

操作符语义
and 如果两边都为 true ,则结果为 true
or 如果两边至少有一方为 true ,则结果为 true
== 检验两边是否相等
!= 如果两边不相等结果为 true , 否则为 false
< 比较两个数字, 如果左边比右边小则结果为 true
<= 比较两个数字, 如果左边比右边小或者两边相等,则结果为 true
> 比较两个数字, 如果左边比右边大,则结果为 true
>= 比较两个数字, 如果左边比右边大或者两边相等,则结果为 true
. 连接两个字符串。

例子

  1. ${viewer name} == "CodeCrafter47"
  2. ${viewer ping} <= 50
  3. 50 < ${viewer ping} <= 150
  4. ${viewer server} == "survival" and ${viewer world} == "world_nether"
复制代码

括号

( <表达式> ) 是一个正确的表达式. 使用括号可以避免歧义。

例子:

  1. (${viewer server} == "survival" and ${viewer world} == "world_nether") or (${viewer group} == "Admin")
复制代码

求反

你可以使用 ! 来求反一个布尔值表达式。

例子:

  1. !${server:lobby online}
  2. !(${viewer server} == "survival" and ${viewer world} == "world_nether")
复制代码



使用BungeeTabListPlus的API

Maven仓库

为了便捷的获取所需的依赖你应当把我的Maven仓库添加到你的项目中。

  1. <repository>
  2.     <id>codecrafter47-repo</id>
  3.     <url>http://nexus.codecrafter47.de/content/repositories/public/</url>
  4. </repository>
复制代码

Javadoc

Bukkit side API

Bungee side API

Sponge side API

Bukkit side API

如果你的Bukkit服务器上安装了BungeeTabListPlus_BukkitBridge.jar那么你可以通过其提供的API注册自定义占位符。

  • 在plugin.yml中添加这个:

    1. depend: ['BungeeTabListPlus']
    复制代码

    或者如果你希望你的插件可以在没有安装BungeeTabListPlus的情况下运行,添加这个:

    1. softdepend: ['BungeeTabListPlus']
    复制代码

  • 在你的maven项目中添加依赖BungeeTabListPlus API。

    1. <dependency>
    2.     <groupId>codecrafter47.bungeetablistplus</groupId>
    3.     <artifactId>bungeetablistplus-api-bukkit</artifactId>
    4.     <version>2.7.0</version>
    5.     <scope>provided</scope>
    6. </dependency>
    复制代码

  • 为你的自定义变量创建一个类

    1. import codecrafter47.bungeetablistplus.api.bukkit.Variable;

    2. public class TestVariable extends Variable {
    3.     public TestVariable() {
    4.         // name of the variable without { }
    5.         super("test");
    6.     }

    7.     @Override
    8.     public String getReplacement(Player player) {
    9.         // return the replacement for the variable
    10.         return ...;
    11.     }
    12. }
    复制代码

  • 在onEnable中注册你的变量

    1. BungeeTabListPlusBukkitAPI.registerVariable(this, new TestVariable());
    复制代码

  • 使用你的变量:

  假设你注册了一个叫 my_variable 的变量,那么你可以在你的配置文件中使用 ${viewer my_variable} ${player my_variable}

Bungee side API

插件在BungeeCord上提供了大量的API,允许第三方插件创建自定义变量,或者为玩家们设置自定义Tab列表。

为你的项目添加BungeeTabListPlus API依赖

添加这个到bungee.yml (或 plugin.yml):

  1. depends: ['BungeeTabListPlus']
复制代码

如果你只是希望可以可选的挂钩BungeeTabListPlus,使用:

  1. softDepends: ['BungeeTabListPlus']
复制代码

为你的Maven项目添加BungeeTabListPlus API依赖。

  1. <dependency>
  2.     <groupId>codecrafter47.bungeetablistplus</groupId>
  3.     <artifactId>bungeetablistplus-api-bungee</artifactId>
  4.     <version>2.7.0</version>
  5.     <scope>provided</scope>
  6. </dependency>
复制代码

添加自定义占位符

  • 为你的自定义变量创建一个类

    1. import codecrafter47.bungeetablistplus.api.bungee.Variable;
    2. import net.md_5.bungee.api.connection.ProxiedPlayer;

    3. public class MyVariable extends Variable {

    4.     public MyVariable() {
    5.         super("my_variable");
    6.     }

    7.     @Override
    8.     public String getReplacement(ProxiedPlayer player) {
    9.         return null;
    10.     }
    11. }
    复制代码

  • 在onEnable注册你的变量

    1. BungeeTabListPlusAPI.registerVariable(this, new MyVariable());
    复制代码

  • 使用你的变量:

    假设你注册了一个叫 my_variable 的变量,那么你可以在你的配置文件中使用 ${viewer my_variable} ${player my_variable}

创建一个自定义Tab列表

  • 创建一个自定义Tab列表  
    1. CustomTablist customTablist = BungeeTabListPlusAPI.createCustomTablist();
    复制代码

    修改Tab列表的大小
    1. customTablist.setSize(80);
    复制代码

    修改Tab列表的内容
    1. customTablist.setSlot(row, column, icon, text, ping);
    复制代码

  • 给玩家使用你的自定义Tab列表
    1. BungeeTabListPlusAPI.setCustomTabList(player, new MyTabListProvider());
    复制代码

    移除一个玩家使用的自定义Tab列表
    1. BungeeTabListPlusAPI.removeCustomTabList(player);
    复制代码


示例:
你可以在这里找到示例的完整的源代码 https://github.com/CodeCrafter47/BungeeTabListPlus/example/bungee.


  1. public class DemoPlugin extends Plugin {

  2.     private CustomTablist customTablist;
  3.     private Icon icon = Icon.DEFAULT;

  4.     @Override
  5.     public void onEnable() {
  6.         // 创建一个自定义Tab列表
  7.         customTablist = BungeeTabListPlusAPI.createCustomTablist();
  8.         // 拥有19行1列
  9.         customTablist.setSize(19);

  10.        // 如果玩家输入 /tabdemo 他将会看到这个自定义Tab列表
  11.         getProxy().getPluginManager().registerCommand(this, new Command("tabdemo") {
  12.             @Override
  13.             public void execute(CommandSender sender, String[] args) {
  14.                 if (sender instanceof ProxiedPlayer) {
  15.                     BungeeTabListPlusAPI.setCustomTabList(((ProxiedPlayer) sender), customTablist);
  16.                 }
  17.             }
  18.         });

  19.         // 每秒调用updateCustomTablist来更新我们的自定义Tab列表的内容
  20.         getProxy().getScheduler().schedule(this, this::updateCustomTablist, 1, 1, TimeUnit.SECONDS);

  21.         // 创建我们的图标。使用默认的图标直到自定义的创建完毕。
  22.         try {
  23.             BufferedImage image = ImageIO.read(getResourceAsStream("icon.png"));
  24.             BungeeTabListPlusAPI.createIcon(image, icon -> this.icon = icon);
  25.         } catch (IOException ex) {
  26.             getLogger().log(Level.SEVERE, "Failed to load icon.", ex);
  27.         }
  28.     }

  29.     /**
  30.      * 这个方法在Tab列表上绘制一个指针式时钟。
  31.      */
  32.     private void updateCustomTablist() {
  33.         // 创建一个图像
  34.         BufferedImage image = new BufferedImage(19, 19, BufferedImage.TYPE_INT_ARGB);
  35.         Graphics2D g = image.createGraphics();
  36.         // 背景
  37.         g.setColor(getAWTColor(ChatColor.DARK_GRAY));
  38.         g.fillRect(0, 0, 19, 19);
  39.         // 圆盘
  40.         g.setColor(getAWTColor(ChatColor.GRAY));
  41.         for (int x = 0; x < 19; x++)
  42.             for (int y = 0; y < 19; y++)
  43.                 if ((8.5 - x) * (8.5 - x) + (8.5 - y) * (8.5 - y) < 81)
  44.                     g.drawRect(x, y, 1, 1);
  45.         // 箭头
  46.         int hour = Calendar.getInstance().get(Calendar.HOUR);
  47.         g.setColor(getAWTColor(ChatColor.DARK_RED));
  48.         g.drawLine(9, 9, (int) round(9 + 8 * sin(hour / 6.0 * PI)), (int) round(9 - 8 * cos(hour / 6.0 * PI)));
  49.         int minute = Calendar.getInstance().get(Calendar.MINUTE);
  50.         g.setColor(getAWTColor(ChatColor.RED));
  51.         g.drawLine(9, 9, (int) round(9 + 8 * sin(minute / 30.0 * PI)), (int) round(9 - 8 * cos(minute / 30.0 * PI)));
  52.         int second = Calendar.getInstance().get(Calendar.SECOND);
  53.         g.setColor(getAWTColor(ChatColor.GOLD));
  54.         g.drawLine(9, 9, (int) round(9 + 9 * sin(second / 30.0 * PI)), (int) round(9 - 9 * cos(second / 30.0 * PI)));
  55.         // 把图像转换成文本
  56.         for (int line = 0; line < 19; line++) {
  57.             String text = "";
  58.             for (int x = 0; x < 19; x++) {
  59.                 ChatColor chatColor = getSimilarChatColor(new Color(image.getRGB(x, line)));
  60.                 text += chatColor == null ? ' ' : chatColor.toString() + '█';
  61.             }
  62.             customTablist.setSlot(line, 0, icon, text, 0);
  63.         }
  64.     }
  65. }
复制代码

控制假人

获取FakePlayerManager:

  1. FakePlayerManager fakePlayerManager = BungeeTabListPlusAPI.getFakePlayerManager();
复制代码

开启关闭配置文件中的假人随机加入游戏:

  1. fakePlayerManager.setRandomJoinLeaveEnabled(true);
  2. fakePlayerManager.setRandomJoinLeaveEnabled(false);
复制代码

获取显示在Tab列表上的所有假人:

  1. Collection<FakePlayer> onlineFakePlayers = fakePlayerManager.getOnlineFakePlayers();
复制代码

向Tab列表上添加一个假人:

  1. ServerInfo server = ...;
  2. FakePlayer fakePlayer = fakePlayerManager.createFakePlayer("Name", server);

  3. fakePlayer.setPing(47);
  4. fakePlayer.setRandomServerSwitchEnabled(true);
  5. fakePlayer.setSkin(BungeeTabListPlusAPI.getSkinForPlayer("Herobrine"));
复制代码

从Tab列表上移除一个假人:

  1. fakePlayerManager.removeFakePlayer(fakePlayer);
复制代码

Sponge side API

如果你的Sponge服务器上安装了BungeeTabListPlus_SpongeBridge.jar那么你可以通过其提供的API注册自定义占位符。

  • 在你的@Plugin注解中添加BungeeTabListPlus依赖:

    1. @Plugin(id = "your_id", name = "your_name", version = "your_version", dependencies = {@Dependency(id = "bungeetablistplus")})
    复制代码

    或者如果你希望你的插件在没有安装BungeeTabListPlus的情况下也可以运行:

    1. @Plugin(id = "your_id", name = "your_name", version = "your_version", dependencies = {@Dependency(id = "bungeetablistplus", optional = true)})
    复制代码

  • 向你的Maven项目添加BungeeTabListPlus API依赖。

    1. <dependency>
    2.     <groupId>codecrafter47.bungeetablistplus</groupId>
    3.     <artifactId>bungeetablistplus-sponge-bukkit</artifactId>
    4.     <version>2.7.0</version>
    5.     <scope>provided</scope>
    6. </dependency>
    复制代码

  • 为你的自定义变量创建一个类

    1. import codecrafter47.bungeetablistplus.api.sponge.Variable;

    2. public class TestVariable extends Variable {
    3.     public TestVariable() {
    4.         // name of the variable without { }
    5.         super("test");
    6.     }

    7.     @Override
    8.     public String getReplacement(Player player) {
    9.         // return the replacement for the variable
    10.         return ...;
    11.     }
    12. }
    复制代码

  • 注册你的占位符。你应当在POST_INITIALIZATION阶段或者之后注册。

    1. BungeeTabListPlusSpongeAPI.registerVariable(this, new TestVariable());
    复制代码

  • 使用你的变量:

    假设你注册了一个叫 my_variable 的变量,那么你可以在你的配置文件中使用 ${viewer my_variable} ${player my_variable}


[groupid=1680]Power of Spongie[/groupid]