9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2026-01-04 15:41:38 +00:00

添加容器包拦截

This commit is contained in:
XiaoMoMi
2025-04-06 13:20:45 +08:00
parent 8f0f557534
commit 8c7c529c63
14 changed files with 108 additions and 86 deletions

View File

@@ -28,7 +28,7 @@ public class BukkitGuiManager implements GuiManager, Listener {
@Override
public void delayedInit() {
Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap());
this.timerTask = plugin.scheduler().sync().runRepeating(this::timerTask, 20, 20);
this.timerTask = plugin.scheduler().sync().runRepeating(this::timerTask, 30, 30);
}
@Override
@@ -40,10 +40,21 @@ public class BukkitGuiManager implements GuiManager, Listener {
}
public void timerTask() {
for (Player player : Bukkit.getOnlinePlayers()) {
org.bukkit.inventory.Inventory top = !VersionHelper.isVersionNewerThan1_21() ? LegacyInventoryUtils.getTopInventory(player) : player.getOpenInventory().getTopInventory();
if (top.getHolder() instanceof CraftEngineInventoryHolder holder) {
holder.gui().onTimer();
if (VersionHelper.isFolia()) {
for (Player player : Bukkit.getOnlinePlayers()) {
this.plugin.scheduler().sync().run(() -> {
org.bukkit.inventory.Inventory top = !VersionHelper.isVersionNewerThan1_21() ? LegacyInventoryUtils.getTopInventory(player) : player.getOpenInventory().getTopInventory();
if (top.getHolder() instanceof CraftEngineInventoryHolder holder) {
holder.gui().onTimer();
}
}, player.getWorld(), player.getLocation().getBlockX() >> 4, player.getLocation().getBlockZ() >> 4);
}
} else {
for (Player player : Bukkit.getOnlinePlayers()) {
org.bukkit.inventory.Inventory top = !VersionHelper.isVersionNewerThan1_21() ? LegacyInventoryUtils.getTopInventory(player) : player.getOpenInventory().getTopInventory();
if (top.getHolder() instanceof CraftEngineInventoryHolder holder) {
holder.gui().onTimer();
}
}
}
}

View File

@@ -150,11 +150,12 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
registerNMSPacketConsumer(PacketConsumers.EDIT_BOOK, Reflections.clazz$ServerboundEditBookPacket);
registerNMSPacketConsumer(PacketConsumers.CUSTOM_PAYLOAD, Reflections.clazz$ServerboundCustomPayloadPacket);
registerNMSPacketConsumer(PacketConsumers.SET_ENTITY_DATA, Reflections.clazz$ClientboundSetEntityDataPacket);
registerNMSPacketConsumer(PacketConsumers.OPEN_SCREEN, Reflections.clazz$ClientboundOpenScreenPacket);
// registerNMSPacketConsumer(PacketConsumers.OPEN_SCREEN, Reflections.clazz$ClientboundOpenScreenPacket);
registerByteBufPacketConsumer(PacketConsumers.SECTION_BLOCK_UPDATE, this.packetIds.clientboundSectionBlocksUpdatePacket());
registerByteBufPacketConsumer(PacketConsumers.BLOCK_UPDATE, this.packetIds.clientboundBlockUpdatePacket());
registerByteBufPacketConsumer(PacketConsumers.LEVEL_PARTICLE, this.packetIds.clientboundLevelParticlesPacket());
registerByteBufPacketConsumer(PacketConsumers.LEVEL_EVENT, this.packetIds.clientboundLevelEventPacket());
registerByteBufPacketConsumer(PacketConsumers.OPEN_SCREEN, this.packetIds.clientboundOpenScreenPacket());
}
public static BukkitNetworkManager instance() {

View File

@@ -32,6 +32,8 @@ import net.momirealms.craftengine.core.world.chunk.PalettedContainer;
import net.momirealms.craftengine.core.world.chunk.packet.MCSection;
import net.momirealms.sparrow.nbt.NBT;
import net.momirealms.sparrow.nbt.Tag;
import net.momirealms.sparrow.nbt.TagTypes;
import net.momirealms.sparrow.nbt.serializer.NBTComponentSerializer;
import org.bukkit.*;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player;
@@ -241,36 +243,47 @@ public class PacketConsumers {
}
};
// public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> OPEN_SCREEN = (user, event) -> {
// try {
// if (VersionHelper.isVersionNewerThan1_20_3()) {
// FriendlyByteBuf buf = event.getBuffer();
// } else {
// FriendlyByteBuf buf = event.getBuffer();
// int containerId = buf.readVarInt();
// int type = buf.readVarInt();
// String json = buf.readUtf();
// Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(json);
// if (tokens.isEmpty()) return;
// event.setChanged(true);
// Component component = AdventureHelper.jsonToComponent(json);
// for (Map.Entry<String, String> token : tokens.entrySet()) {
// component = component.replaceText(b -> {
// b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()));
// });
// }
// buf.clear();
// buf.writeVarInt(event.packetID());
// buf.writeVarInt(containerId);
// buf.writeVarInt(type);
// buf.writeUtf(AdventureHelper.componentToJson(component));
// }
// } catch (Exception e) {
// CraftEngine.instance().logger().warn("Failed to handle ClientboundOpenScreenPacket", e);
// }
// };
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> OPEN_SCREEN = (user, event) -> {
try {
if (VersionHelper.isVersionNewerThan1_20_3()) {
FriendlyByteBuf buf = event.getBuffer();
int containerId = buf.readVarInt();
int type = buf.readVarInt();
Tag nbt = buf.readNbt(false);
if (nbt == null) return;
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
if (tokens.isEmpty()) return;
Component component = NBTComponentSerializer.nbt().deserialize(nbt);
for (Map.Entry<String, String> token : tokens.entrySet()) {
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
}
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeVarInt(containerId);
buf.writeVarInt(type);
buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false);
} else {
FriendlyByteBuf buf = event.getBuffer();
int containerId = buf.readVarInt();
int type = buf.readVarInt();
String json = buf.readUtf();
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(json);
if (tokens.isEmpty()) return;
event.setChanged(true);
Component component = AdventureHelper.jsonToComponent(json);
for (Map.Entry<String, String> token : tokens.entrySet()) {
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
}
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeVarInt(containerId);
buf.writeVarInt(type);
buf.writeUtf(AdventureHelper.componentToJson(component));
}
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundOpenScreenPacket", e);
}
};
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> LEVEL_PARTICLE = (user, event) -> {
try {
@@ -1026,11 +1039,11 @@ public class PacketConsumers {
}
};
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> OPEN_SCREEN = (user, event, packet) -> {
try {
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundOpenScreenPacket", e);
}
};
// public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> OPEN_SCREEN = (user, event, packet) -> {
// try {
//
// } catch (Exception e) {
// CraftEngine.instance().logger().warn("Failed to handle ClientboundOpenScreenPacket", e);
// }
// };
}

View File

@@ -11,4 +11,6 @@ public interface PacketIds {
int clientboundLevelEventPacket();
int clientboundAddEntityPacket();
int clientboundOpenScreenPacket();
}

View File

@@ -28,4 +28,9 @@ public class PacketIds1_20 implements PacketIds {
public int clientboundAddEntityPacket() {
return 1;
}
@Override
public int clientboundOpenScreenPacket() {
return 48;
}
}

View File

@@ -28,4 +28,10 @@ public class PacketIds1_20_2 implements PacketIds {
public int clientboundAddEntityPacket() {
return 1;
}
//TODO TEST
@Override
public int clientboundOpenScreenPacket() {
return 48;
}
}

View File

@@ -28,4 +28,10 @@ public class PacketIds1_20_3 implements PacketIds {
public int clientboundAddEntityPacket() {
return 1;
}
//TODO TEST
@Override
public int clientboundOpenScreenPacket() {
return 48;
}
}

View File

@@ -28,4 +28,10 @@ public class PacketIds1_20_5 implements PacketIds {
public int clientboundAddEntityPacket() {
return 1;
}
//TODO TEST
@Override
public int clientboundOpenScreenPacket() {
return 48;
}
}

View File

@@ -28,4 +28,9 @@ public class PacketIds1_21 implements PacketIds {
public int clientboundAddEntityPacket() {
return PacketIdFinder.clientboundByName("minecraft:add_entity");
}
@Override
public int clientboundOpenScreenPacket() {
return PacketIdFinder.clientboundByName("minecraft:open_screen");
}
}

View File

@@ -1,32 +0,0 @@
package net.momirealms.craftengine.bukkit.plugin.network.impl;
import net.momirealms.craftengine.bukkit.plugin.network.PacketIds;
@Deprecated
public class PacketIds1_21_2 implements PacketIds {
@Override
public int clientboundBlockUpdatePacket() {
return 9;
}
@Override
public int clientboundSectionBlocksUpdatePacket() {
return 78;
}
@Override
public int clientboundLevelParticlesPacket() {
return 42;
}
@Override
public int clientboundLevelEventPacket() {
return 41;
}
@Override
public int clientboundAddEntityPacket() {
return 1;
}
}