Minecraft(我的世界)中文论坛

标题: [Wiki][PoS]BungeeTabListPlus

作者: GiNYAi    时间: 2018-5-9 22:45
标题: [Wiki][PoS]BungeeTabListPlus
本帖最后由 GiNYAi 于 2020-2-12 02:27 编辑

概览


关于翻译的一些说明




设置

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




配置文件基础

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




配置文件进阶

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




特殊页面




开发者资源

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




暂时废弃

安装BungeeTabListPlus


系统要求


安装



命令与权限



所有占位符

玩家关联占位符

每个玩家关联占位符拥有两个版本:一个是关联正在查看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}

服务器关联占位符


特殊占位符



配置文件基础 Part 1: 概览

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




配置文件基础 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,你需要满足以下条件:


之后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属性来处理权限组的优先度。而且如果你希望根据玩家的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你可以使用海量的额外的占位符。

必要条件


使用方法




排序玩家

所有向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中配置。这里是全部的全局设置项以及详细的描述:




元件参考页

下面这些元件都是可用的


  这个元件提供了一个简单的向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 可选的:这个元件可以使用的最多格子数量。




表达式语法

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

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

常量


占位符:

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

例子:

  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注册自定义占位符。


  假设你注册了一个叫 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>
复制代码

添加自定义占位符


创建一个自定义Tab列表


示例:
你可以在这里找到示例的完整的源代码 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注册自定义占位符。



[groupid=1680]Power of Spongie[/groupid]
作者: GiNYAi    时间: 2018-5-9 22:55
本帖最后由 GiNYAi 于 2018-5-15 22:16 编辑

使用 MM2BC 转换 https://mm2bc.ustc-zzzz.net/
OTZ 内部引用的超链接忘记删了
指向其它页的超链接已经全部换成看起来和超链接差不多的样式了
内部指向的链接也已经修复了

文本文档 BungeeTabListPlus.txt (196.9 KB, 下载次数: 264)


作者: 江旭凡    时间: 2018-5-9 23:02
维利古德牛逼居然汉化了
作者: Grace_Black    时间: 2018-5-10 19:09
楼主那些链接全部404了
作者: GiNYAi    时间: 2018-5-10 19:29
Grace_Black 发表于 2018-5-10 19:09
楼主那些链接全部404了

这届读者不行啊
第一个回复不是已经解释了么
作者: 2254513908    时间: 2018-5-18 20:31
......................
作者: 2254513908    时间: 2018-5-18 20:31
..............
作者: 2254513908    时间: 2018-5-18 20:33
66666666666666666666666666666
作者: 1062924405    时间: 2018-6-1 16:50
GiNYAi 发表于 2018-5-9 22:55
使用 MM2BC 转换 https://mm2bc.ustc-zzzz.net/
OTZ 内部引用的超链接忘记删了
指向其它页的超链 ...

楼主有Q嘛 我可以加一下嘛
作者: Victor_Elect    时间: 2018-6-17 15:36
支持楼主,加油
作者: GAryJohn    时间: 2018-6-21 09:38
先顶为敬d=====( ̄▽ ̄*)b
作者: 我爱侬    时间: 2018-6-27 20:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: sea_001    时间: 2018-7-8 20:42
感谢大佬的分享
作者: 940461793    时间: 2019-7-24 15:36
请问如何设置只显示当前服务器玩家在线数量 和当前服务器玩家ID
作者: xiaojundada    时间: 2019-12-6 18:26
怎样做到子服没人的时候Tab上不显示没人子服的名字,当那个子服有人在,Tab就显示
作者: soil-sword    时间: 2019-12-8 03:11
BungeeTabList。。。PLUS?!
太强了
作者: 232237    时间: 2020-2-3 08:39
作者万岁
作者: GGGGB    时间: 2020-2-13 12:29
我吐了,弄一个萌新 简单点得吧,直接简单粗暴,弄那么花里胡哨的,不实用
作者: Dearxiaosa    时间: 2020-3-6 11:56
666666666666666
作者: 1455331289    时间: 2020-3-20 16:07
有没有大佬知道 金币的变量是什么
作者: 糯米fksc    时间: 2020-8-28 14:01
MCBBS有你更精彩~