PuddingKC
请问可以通过发送数据包的方式重置(取消)玩家挥动和右键使用武器时的手部动画吗。可以使用ProtocolLib等插件作为前置,API是1.12.2的版本,求个代码。

听风说离别
在 Minecraft 中,取消或重置玩家挥动和右键使用武器时的手部动画涉及到修改客户端和服务器之间的通信,这需要使用 Packet 来实现。
在你提到的 1.12.2 版本中,使用 ProtocolLib 插件是一种可能的方法。

在 1.12.2 版本中,可以使用 ProtocolLib 修改客户端和服务器之间的数据包。
下面是一种可能的方法,这里使用 ProtocolLib 的 API:
  1. import com.comphenix.protocol.ProtocolLibrary;
  2. import com.comphenix.protocol.ProtocolManager;
  3. import com.comphenix.protocol.events.PacketContainer;
  4. import com.comphenix.protocol.wrappers.EnumWrappers;
  5. import org.bukkit.entity.Player;
  6. import org.bukkit.plugin.java.JavaPlugin;

  7. public class YourPlugin extends JavaPlugin {

  8.     private static ProtocolManager protocolManager;

  9.     @Override
  10.     public void onEnable() {
  11.         if (!setupProtocolLib()) {
  12.             getLogger().severe("ProtocolLib not found! Disabling plugin.");
  13.             getServer().getPluginManager().disablePlugin(this);
  14.             return;
  15.         }

  16.         getServer().getPluginManager().registerEvents(new YourListener(), this);
  17.     }

  18.     private boolean setupProtocolLib() {
  19.         if (getServer().getPluginManager().getPlugin("ProtocolLib") == null) {
  20.             return false;
  21.         }

  22.         protocolManager = ProtocolLibrary.getProtocolManager();
  23.         return true;
  24.     }

  25.     public static ProtocolManager getProtocolManager() {
  26.         return protocolManager;
  27.     }
  28. }
复制代码

在这个插件中,我们检查 ProtocolLib 是否可用,并注册了一个事件监听器 YourListener。
接下来,在你的监听器中,你可以捕捉相关事件,并发送修改手部动画的数据包:
  1. import com.comphenix.protocol.PacketType;
  2. import com.comphenix.protocol.events.PacketContainer;
  3. import com.comphenix.protocol.events.PacketEvent;
  4. import com.comphenix.protocol.wrappers.EnumWrappers;
  5. import org.bukkit.event.EventHandler;
  6. import org.bukkit.event.Listener;
  7. import org.bukkit.event.player.PlayerInteractEvent;

  8. public class YourListener implements Listener {

  9.     @EventHandler
  10.     public void onPlayerInteract(PlayerInteractEvent event) {
  11.         // 检查右键使用武器的事件
  12.         if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
  13.             Player player = event.getPlayer();

  14.             // 发送取消手部动画的数据包
  15.             sendAnimationPacket(player);
  16.         }
  17.     }

  18.     private void sendAnimationPacket(Player player) {
  19.         try {
  20.             PacketContainer packet = YourPlugin.getProtocolManager().createPacket(PacketType.Play.Server.ANIMATION);

  21.             // 设置玩家 ID 和动画枚举
  22.             packet.getIntegers().write(0, player.getEntityId());
  23.             packet.getBytes().write(1, EnumWrappers.Animation.SWING_MAIN_ARM.getId());

  24.             YourPlugin.getProtocolManager().sendServerPacket(player, packet);
  25.         } catch (Exception e) {
  26.             e.printStackTrace();
  27.         }
  28.     }
  29. }
复制代码

请确保正确导入 ProtocolLib 的相关类。

请注意,修改客户端行为可能会导致与 Minecraft 官方协议的不一致,因此请谨慎使用。
此外,具体的数据包结构可能会因 Minecraft 的更新而改变,因此在不同版本中可能需要适配。


‮tcejorPoiK
没法实现,只能让玩家手臂摆动,但是不能让玩家在手臂摆动时停止。
玩家挥动和右键使用武器的手臂摆动似乎也只在客户端上计算,所以也没法通过拦截数据包来防止摆动,应该是没啥办法。

PuddingKC
‮tcejorPoiK 发表于 2024-1-17 11:48
没法实现,只能让玩家手臂摆动,但是不能让玩家在手臂摆动时停止。
玩家挥动和右键使用武器的手臂摆动似乎 ...

好的,感谢

第一页 上一页 下一页 最后一页