本帖最后由 longlongz 于 2018-11-24 04:03 编辑

BossShopPro
ServerPinging | 服务器Ping
字数统计: 1678字


注:Ping的定义过于复杂/难懂,所以选择性的使用了英文而不是中文
Ping: 互联网包探索器

Serverpinging允许你在BossShopPro文本中显示玩家数量和一个特定服务器的描述, 例如一个物品的描述lore或者消息

BossShopPro 中,有些地方与 BossShop不同.

注意:
在新版Minecraft版本中,ServerPinging不一定适合你。这个问题已被察觉并会被尽快修复。
我建议你使用下方方法(暂时)来使用PlaceholderAPI来替代:

·       如果你在使用BC端: https://www.spigotmc.org/wiki/placeholderapi-placeholders/#bungeecord-placeholders
·       通用"Pinger": https://www.spigotmc.org/wiki/placeholderapi-placeholders/#pinger-placeholders
另外一种“修复”这个问题的方法可能是添加占位符(例如 "%player%") 来匹配商店物品,使占位符更新。

否认声明: 我并没有自己测试这些PAPI占位符。如果你有任何相关的问题可以发消息给我。


Guide|使用方法
你可以在config.yml发现你的一个服务器的通用列表:

  1. ServerPinging:
  2.   Enabled: false
  3.   Delay: 45
  4.   FixConnector: false
  5.   Timeout: 4000
  6.   WaitTimeAfterFail: 4500
  7.   List:
  8.   - becto.net:25565
复制代码
如果你想要使用这个功能,请设置
  1.   Enabled: true
复制代码
这个延迟会告诉 BossShopPro以什么频率向列表中的服务器发送Ping。这个被
“帧”定义(20帧 = 1秒)。默认为45帧 = 2.25秒,但是你当然也可以增加或减少这个数字。
Code (Text):
Delay: 45
因为Minecraft有很多不同的版本,所有有些服务器需要使用不同的方法来ping。这里有很多不同类型的连接器不断测试正确项来实现支持所有的版本。当ServerPinging第一次被运行时,它会测试所有可用的连接器类型直到发现正确的一个。然后ID就会被保存到 "BossShopPro/data"文件中。在将来ServerPinging会被直接使用保存的ID来快速加载。

ServerPing在50次尝试中依然无法找到任何可用的服务器是,它会尝试其他的连接器因为可能会有些变动(例如服务器更新)会需要一个新的连接器。为了防止 BossShopPro 在成功找到正确项时继续尝试新的连接器,你可以设置"FixConnector: true".

  1. FixConnector: false
复制代码
接下来是可配置的超时:插件会尝试ping那些被定义的服务器直到成功或超时并接受连接失败,可能是因为目标服务器可能处于离线状态。超时是由毫秒定义的。
  1. Timeout: 4000
复制代码
如果插件无法ping一个服务器,它会等待一定的时间(毫秒)然后重新尝试。这样BossShopPro就不会尝试像在线服务器一样快速的ping离线服务器,这就是完全不必要的。
  1. WaitTimeAfterFail: 4500
复制代码

最后,这里有一个ping服务器对象列表。这里有两种你可以添加到列表中的服务器:

3.    任何服务器: '<服务器名>:<ip>:<端口>' (你可以使用任何的服务器名)
4.    通过BC来连接服务器: '<BC配置中的服务器名>' (使用BungeeCord时无法使用motd占位符)
任何服务器列表例子:
  1.   List:
  2.   - becto:mc.becto.net:25565
  3.   - snapcraft:mc.snapcraft.net:25565
复制代码
使用BC的列表例子:
  1.   List:
  2.   - survival
  3.   - creative
复制代码

你可以在任何地方使用下方变量来显示玩家数量或者服务器motd:

·       %players_<服务器名>% - 这个会替换成服务器中拥有的玩家数
·       %motd_<服务器名>% - 这会替换成服务器的motd

提示: 你可以将不同服务器叠加在一起来显示服务器总玩家数(需要v1.0.1!)例子::

·       Becto 服务器玩家数: %players_becto%
·       Snapcraft服务器玩家数: %players_snapcraft%
·       两个服务器的总玩家数: %players_becto:snapcraft%


Example|例子
config.yml:

  1. ServerPinging:
  2.   Enabled: true
  3.   Delay: 45
  4.   List:
  5.   - hypixel:mc.hypixel.net:25565
  6.   - mineplex:us.mineplex.com:25565
  7.   - cubecraft:play.cubecraftgames.net:25565
  8.   - hivemc:eu.hivemc.com:25565
  9.   - badlion:na.badlion.net:25565
复制代码
商店菜单:
  1. ShopName: ping
  2. DisplayName: 'Ping菜单'
  3. InventorySize: 45
  4. signs:
  5.   text: '[]'
  6.   NeedPermissionToCreateSign: true
  7. shop:
  8.   '1':
  9.     RewardType: NOTHING
  10.     PriceType: NOTHING
  11.     MenuItem:
  12.     - name:&6Hypixel
  13.     - amount:1
  14.     - type:FEATHER
  15.     - lore:&f%players_hypixel% #Hypixel服务器玩家数
  16.     Message: ''
  17.     ExtraPermission: ''
  18.     InventoryLocation: 1
  19.   '10':
  20.     RewardType: NOTHING
  21.     PriceType: NOTHING
  22.     MenuItem:
  23.     - name:&6Mineplex
  24.     - amount:1
  25.     - type:FEATHER
  26.     - lore:&f%players_mineplex% #Mineplex总玩家数
  27.     Message: ''
  28.     ExtraPermission: ''
  29.     InventoryLocation: 10
  30.   '19':
  31.     RewardType: NOTHING
  32.     PriceType: NOTHING
  33.     MenuItem:
  34.     - name:&6Cubecraft
  35.     - amount:1
  36.     - type:FEATHER
  37.     - lore:&f%players_cubecraft% #Cubecraft总玩家数
  38.     Message: ''
  39.     ExtraPermission: ''
  40.     InventoryLocation: 19
  41.   '21':
  42.     RewardType: NOTHING
  43.     PriceType: NOTHING
  44.     MenuItem:
  45.     - name:&6Total
  46.     - amount:1
  47.     - type:FEATHER
  48.     - lore:&f%players_hypixel:minexplex:cubecraft:hivemc:badlion% #多个服务器玩家总和
  49.     Message: ''
  50.     ExtraPermission: ''
  51.     InventoryLocation: 21
  52.   '28':
  53.     RewardType: NOTHING
  54.     PriceType: NOTHING
  55.     MenuItem:
  56.     - name:&6HiveMC
  57.     - amount:1
  58.     - type:FEATHER
  59.     - lore:&f%players_hivemc%
  60.     Message: ''
  61.     ExtraPermission: ''
  62.     InventoryLocation: 28
  63.   '37':
  64.     RewardType: NOTHING
  65.     PriceType: NOTHING
  66.     MenuItem:
  67.     - name:&6Badlion
  68.     - amount:1
  69.     - type:FEATHER
  70.     - lore:&f%players_badlion%
  71.     Message: ''
  72.     ExtraPermission: ''
  73.     InventoryLocation: 37
复制代码

输出:


这可能不支持老服务器(1.7或以下)来ping很新的服务器(1.9或以上),支持与其他服务器相同版本的服务器永远是可行的。



BungeeCord 全球聊天&玩家聊天输入
BossShopPro API 允许让其他插件通过玩家聊天来获得玩家输入(input)。这就是 PlayerShops addon 的方法,可以让玩家输入他们商店的名字和物品的价格。如果你正在使用 BungeeCordBC),你可能会想要通过所有的玩家聊天消息,例如使用BC来连接不同服务器的聊天信息,实现全服聊天。为了可以区分普通聊天信息和特殊玩家输入,BossShopPro 使用了插件聊天频道并了解玩家的消息是否属于普通聊天。

下方是一个BC插件的例子,可以检测玩家的输入(input):

  1. import java.io.ByteArrayInputStream;
  2. import java.io.DataInputStream;
  3. import java.io.IOException;

  4. import net.md_5.bungee.api.event.PluginMessageEvent;
  5. import net.md_5.bungee.api.plugin.Listener;
  6. import net.md_5.bungee.event.EventHandler;

  7. public class BungeeCordPluginListener implements Listener {
  8.     @EventHandler
  9.     public void onPluginMessage(PluginMessageEvent e) {   

  10.         if(e.getTag().equalsIgnoreCase("BungeeCord")){
  11.             DataInputStream dis = new DataInputStream(new ByteArrayInputStream(e.getData()));


  12.             try{
  13.                 String subchannel = dis.readUTF();


  14.                 if (subchannel.equalsIgnoreCase("BossShopPro")){

  15.                     String type = dis.readUTF();

  16.                     if (type.equalsIgnoreCase("PlayerInput")){

  17.                         String playerUUID = dis.readUTF();      
  18.                         String inputType = dis.readUTF();

  19.                         if(inputType.equalsIgnoreCase("start")){
  20.                             String endTimeMillis = dis.readUTF();
  21.                             System.out.println("Received plugin message by BossShopPro of type "PlayerInput Start" with player " + playerUUID+". Knowing that incoming message should not be sent to the global chat until either a stop message is received or time '" + endTimeMillis + "' is reached.");

  22.                         }else if(inputType.equalsIgnoreCase("end")){
  23.                             System.out.println("Received plugin message by BossShopPro of type "PlayerInput End" with player " + playerUUID+". Knowing that messages of that player no longer belong to BossShopPro input and can be sent to the chat.");
  24.                         }
  25.                     }

  26.                 }

  27.             }
  28.             catch (IOException e1) {         
  29.                 e1.printStackTrace();         
  30.             }
  31.         }

  32.     }
  33. }
复制代码
你可以看到一条消息被使用"BungeeCord" 频道和"BossShopPro" 子频道来发送. 接下来,事件的类型被发送(当前只有一个事件叫做"PlayerInput". PlayerInput 还自带了受影响玩家的UUID。