From 554635b0389b21a5ac0d218da782ecb3d3d5b3c3 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sun, 23 Mar 2025 01:02:48 +0800 Subject: [PATCH] fix some bugs --- .../furniture/FurnitureEventListener.java | 1 - .../entity/furniture/LoadedFurniture.java | 12 ++-- .../item/factory/ComponentItemFactory.java | 1 + .../item/factory/UniversalItemFactory.java | 1 + .../plugin/network/PacketConsumers.java | 63 +++++++++++-------- .../craftengine/bukkit/util/Reflections.java | 4 +- 6 files changed, 44 insertions(+), 38 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java index 79de897cc..8222f585e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java @@ -74,7 +74,6 @@ public class FurnitureEventListener implements Listener { this.manager.handleEntityUnload(event.getEntity()); } - @EventHandler(ignoreCancelled = true) public void onPlayerQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java index a39858e62..e4e8071ab 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java @@ -81,6 +81,7 @@ public class LoadedFurniture { for (int i = 0; i < interactionEntityIds.size(); ++i) { this.interactionEntityIds[i] = interactionEntityIds.get(i); } + this.resetSpawnPackets(); } private void resetSpawnPackets() { @@ -148,13 +149,6 @@ public class LoadedFurniture { this.location = location; } - public Object spawnPacket() { - if (this.cachedSpawnPacket == null) { - this.resetSpawnPackets(); - } - return this.cachedSpawnPacket; - } - @NotNull public Entity baseEntity() { Entity entity = baseEntity.get(); @@ -286,4 +280,8 @@ public class LoadedFurniture { this.addSeatEntity(seatEntity); seatEntity.addPassenger(player); } + + public @NotNull Object spawnPacket() { + return cachedSpawnPacket; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory.java index e44302c71..e2e6cff48 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory.java @@ -314,6 +314,7 @@ public class ComponentItemFactory extends BukkitItemFactory { @Override protected void merge(ItemWrapper item1, ItemWrapper item2) { + // load previous changes on nms items item1.load(); Object itemStack1 = item1.getLiteralObject(); Object itemStack2 = item2.getLiteralObject(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java index c8d3890c4..085c997e8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java @@ -244,6 +244,7 @@ public class UniversalItemFactory extends BukkitItemFactory { @Override protected void merge(ItemWrapper item1, ItemWrapper item2) { + // load previous changes on nms items item1.load(); TagCompound.merge(ItemObject.getCustomDataTag(item1.getLiteralObject()), ItemObject.getCustomDataTag(item2.getLiteralObject()), true, true); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index 806bbb19c..2d75e74ba 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -3,8 +3,6 @@ package net.momirealms.craftengine.bukkit.plugin.network; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.ints.IntList; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; import net.momirealms.craftengine.bukkit.api.CraftEngineFurniture; import net.momirealms.craftengine.bukkit.api.event.FurnitureBreakEvent; import net.momirealms.craftengine.bukkit.api.event.FurnitureInteractEvent; @@ -35,9 +33,11 @@ import org.bukkit.util.RayTraceResult; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.time.Instant; -import java.util.*; +import java.util.Arrays; +import java.util.Map; +import java.util.Objects; import java.util.function.BiConsumer; +import java.util.function.Consumer; public class PacketConsumers { private static int[] mappings; @@ -671,19 +671,21 @@ public class PacketConsumers { if (message != null && !message.isEmpty()) { ImageManager manager = CraftEngine.instance().imageManager(); if (!manager.isDefaultFontInUse()) return; - try { - String str = replaceIllegalString(message, manager); - if (message.equals(str)) return; + runIfContainsIllegalCharacter(message, manager, (s) -> { event.setCancelled(true); - Object newPacket = Reflections.constructor$ServerboundChatPacket.newInstance( - str, - Reflections.field$ServerboundChatPacket$timeStamp.get(packet), - Reflections.field$ServerboundChatPacket$salt.get(packet), - Reflections.field$ServerboundChatPacket$signature.get(packet), - Reflections.field$ServerboundChatPacket$lastSeenMessages.get(packet) - ); - user.receivePacket(newPacket); - } catch (Exception ignore) {} + try { + Object newPacket = Reflections.constructor$ServerboundChatPacket.newInstance( + s, + Reflections.field$ServerboundChatPacket$timeStamp.get(packet), + Reflections.field$ServerboundChatPacket$salt.get(packet), + Reflections.field$ServerboundChatPacket$signature.get(packet), + Reflections.field$ServerboundChatPacket$lastSeenMessages.get(packet) + ); + user.receivePacket(newPacket); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to create replaced chat packet", e); + } + }); } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ServerboundChatPacket", e); @@ -697,10 +699,13 @@ public class PacketConsumers { if (message != null && !message.isEmpty()) { ImageManager manager = CraftEngine.instance().imageManager(); if (!manager.isDefaultFontInUse()) return; - try { - String str = replaceIllegalString(message, manager); - Reflections.field$ServerboundRenameItemPacket$name.set(packet, str); - } catch (Exception ignore) {} + runIfContainsIllegalCharacter(message, manager, (s) -> { + try { + Reflections.field$ServerboundRenameItemPacket$name.set(packet, s); + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to replace chat", e); + } + }); } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ServerboundRenameItemPacket", e); @@ -712,15 +717,15 @@ public class PacketConsumers { try { String[] lines = (String[]) Reflections.field$ServerboundSignUpdatePacket$lines.get(packet); ImageManager manager = CraftEngine.instance().imageManager(); + if (!manager.isDefaultFontInUse()) return; for (int i = 0; i < lines.length; i++) { String line = lines[i]; if (line != null && !line.isEmpty()) { - if (!manager.isDefaultFontInUse()) return; try { - String str = replaceIllegalString(line, manager); - if (line.equals(str)) continue; - lines[i] = str; - } catch (Exception ignore){} + int lineIndex = i; + runIfContainsIllegalCharacter(line, manager, (s) -> lines[lineIndex] = s); + } catch (Exception ignore) { + } } } } catch (Exception e) { @@ -728,18 +733,22 @@ public class PacketConsumers { } }; - private static String replaceIllegalString(String string, ImageManager manager) { + private static void runIfContainsIllegalCharacter(String string, ImageManager manager, Consumer callback) { char[] chars = string.toCharArray(); int[] codepoints = CharacterUtils.charsToCodePoints(chars); int[] newCodepoints = new int[codepoints.length]; + boolean hasIllegal = false; for (int i = 0; i < codepoints.length; i++) { int codepoint = codepoints[i]; if (!manager.isIllegalCharacter(codepoint)) { newCodepoints[i] = codepoint; } else { newCodepoints[i] = '*'; + hasIllegal = true; } } - return new String(newCodepoints, 0, newCodepoints.length); + if (hasIllegal) { + callback.accept(new String(newCodepoints, 0, newCodepoints.length)); + } } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index 71ffe4d60..4ed697c8e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -136,9 +136,7 @@ public class Reflections { ); public static final Constructor constructor$ClientboundSystemChatPacket = requireNonNull( - VersionHelper.isVersionNewerThan1_20_4() - ? ReflectionUtils.getConstructor(clazz$ClientboundSystemChatPacket, clazz$Component, boolean.class) - : ReflectionUtils.getConstructor(clazz$ClientboundSystemChatPacket, Component.class, String.class, boolean.class) + ReflectionUtils.getConstructor(clazz$ClientboundSystemChatPacket, clazz$Component, boolean.class) ); public static final Field field$ClientboundSystemChatPacket$overlay = requireNonNull(