Skip to content

New Bytebuf API#819

Open
Lumine1909 wants to merge 7 commits intoLeavesMC:dev/1.21.11from
Lumine1909:dev/new-bytebuf
Open

New Bytebuf API#819
Lumine1909 wants to merge 7 commits intoLeavesMC:dev/1.21.11from
Lumine1909:dev/new-bytebuf

Conversation

@Lumine1909
Copy link
Member

@Lumine1909 Lumine1909 commented Feb 15, 2026

由于Paper重写了Bukkit内部处理事件的逻辑 通过创建匿名类+static final modifier内联插件中事件处理方法的MethodHandler 使用Bukkit事件系统传递PacketEvent将不再产生由于反射导致的额外开销
我们可以重新设计一部分这个API 以提升性能和便捷性

@Lumine1909 Lumine1909 marked this pull request as draft February 15, 2026 09:43
@Lumine1909 Lumine1909 marked this pull request as ready for review February 17, 2026 08:24
@Lumine1909
Copy link
Member Author

测试喵 Code review喵

我的测试用例

加载后所有玩家都能使用F3+F4切换模式(
onPacketOut 两个版本都测试成功

package io.github.lumine1909;

import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
import org.leavesmc.leaves.bytebuf.PacketType;
import org.leavesmc.leaves.event.bytebuf.PacketInEvent;
import org.leavesmc.leaves.event.bytebuf.PacketOutEvent;

public class DemoPlugin extends JavaPlugin implements Listener {

  public static DemoPlugin plugin;

  @Override
  public void onEnable() {
      plugin = this;
      Bukkit.getPluginManager().registerEvents(this, plugin);
  }

  @EventHandler
  public void onPacketOut(PacketOutEvent e) {
      if (e.getPacketType() != PacketType.Clientbound.ENTITY_EVENT) {
          return;
      }
      e.getBytebuf().writerIndex(4).writeByte(28);
      //e.setBytebuf(Bytebuf.buf().writeInt(e.getBytebuf().readInt()).writeByte(28));
  }

  @EventHandler
  public void onPacketIn(PacketInEvent e) {
      if (e.getPacketType() != PacketType.Serverbound.CHANGE_GAME_MODE) {
          return;
      }
      e.setCancelled(true);
      Player player = e.getAudience().getPlayer();
      if (player == null) {
          return;
      }
      GameMode gameMode = switch (e.getBytebuf().readByte()) {
          case 0 -> GameMode.SURVIVAL;
          case 1 -> GameMode.CREATIVE;
          case 2 -> GameMode.ADVENTURE;
          case 3 -> GameMode.SPECTATOR;
          default -> throw new IllegalStateException();
      };
      Bukkit.getScheduler().runTask(plugin, () -> player.setGameMode(gameMode));
  }
}

@Lumine1909 Lumine1909 requested review from MC-XiaoHei and s-yh-china and removed request for MC-XiaoHei February 17, 2026 08:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant