当前位置: 首页 > 知识库问答 >
问题:

Bukkit ProtocolLib Nametags

颛孙子民
2023-03-14

我正在尝试更改玩家实体上方的名称。我已经成功地做到了这一点,但它有一个副作用,即将玩家皮肤更改为默认值。我如何在不重置玩家皮肤的情况下更改玩家的姓名标签。

使用的插件库

>

  • 协议库

    数据包包装器

    用于更改名称的代码

    public void changeNameOnHead(Player player, String name) {
     PlayerInfoData pid = new
     PlayerInfoData(WrappedGameProfile.fromPlayer(player), 1,
      EnumWrappers.NativeGameMode.SURVIVAL,
      WrappedChatComponent.fromText(player.getName()));
    
    
     WrapperPlayServerPlayerInfo wpspi = new WrapperPlayServerPlayerInfo();
     wpspi.setAction(EnumWrappers.PlayerInfoAction.REMOVE_PLAYER);
     wpspi.setData(Collections.singletonList(pid));
    
    
     for (Player p: Bukkit.getOnlinePlayers()) {
      if (p.equals(player)) {
       continue;
      }
      p.hidePlayer(player);
      wpspi.sendPacket(p);
     }
    
     ProtocolLibrary.getProtocolManager().addPacketListener(
      new PacketAdapter(RoleplayEngine.Instance,
       PacketType.Play.Server.PLAYER_INFO) {
    
       @Override
       public void onPacketSending(PacketEvent event) {
    
        if (event.getPacket().getPlayerInfoAction().read(0) != EnumWrappers.PlayerInfoAction.ADD_PLAYER) {
         return;
        }
    
        PlayerInfoData pid =
         event.getPacket().getPlayerInfoDataLists().read(0).get(0);
    
        if (pid.getProfile().getUUID() !=
         player.getUniqueId()) return;
    
    
        PlayerInfoData newPid = new PlayerInfoData(
         pid.getProfile().withName(name),
         pid.getPing(),
         pid.getGameMode(),
         WrappedChatComponent.fromText(name)
        );
    
    
        event.getPacket().getPlayerInfoDataLists().write(0,
         Collections.singletonList(newPid));
    
       }
      }
     );
    
     for (Player p: Bukkit.getOnlinePlayers()) {
      if (p.equals(player)) {
       continue;
      }
      p.showPlayer(player);
     }
    
    }
    
  • 共有1个答案

    卜昂熙
    2023-03-14

    你可以尝试使用github中的这个库来更改玩家的名字和皮肤。

    快速用法示例:

    PlayerDisplayModifier p = new PublicDisplayModifier(plugin);
    p.changeDisplay(myPlayer, "SkinPlayer", "NewName");
    

    如果您的服务器为1.8及更低版本,则此方法有效,但不确定它是否适用于更高版本。

    如果您的服务器版本高于1.8,您可以尝试使用昵称集成Api,该插件还具有面向开发人员的API。它是开源的,所以你可能会挖掘使昵称更改成为可能的代码片段。

    最后,你也可以尝试使用md-5的iTAG,以及ataranlen的一个很好的分支。

     类似资料:

    相关问答

    相关文章

    相关阅读