9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-28 19:39:11 +00:00

fix some bugs

This commit is contained in:
XiaoMoMi
2025-03-23 01:02:48 +08:00
parent dd9913c3f3
commit 554635b038
6 changed files with 44 additions and 38 deletions

View File

@@ -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();

View File

@@ -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;
}
}

View File

@@ -314,6 +314,7 @@ public class ComponentItemFactory extends BukkitItemFactory {
@Override
protected void merge(ItemWrapper<ItemStack> item1, ItemWrapper<ItemStack> item2) {
// load previous changes on nms items
item1.load();
Object itemStack1 = item1.getLiteralObject();
Object itemStack2 = item2.getLiteralObject();

View File

@@ -244,6 +244,7 @@ public class UniversalItemFactory extends BukkitItemFactory {
@Override
protected void merge(ItemWrapper<ItemStack> item1, ItemWrapper<ItemStack> item2) {
// load previous changes on nms items
item1.load();
TagCompound.merge(ItemObject.getCustomDataTag(item1.getLiteralObject()), ItemObject.getCustomDataTag(item2.getLiteralObject()), true, true);
}

View File

@@ -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<String> 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));
}
}
}

View File

@@ -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(