Fix item parsing, needs to be tested in 1.18 & 1.20

This commit is contained in:
libraryaddict 2025-01-17 21:49:10 +13:00
parent dd5b9e2dc5
commit f954b70f31
12 changed files with 73 additions and 162 deletions

View File

@ -9,6 +9,7 @@ import io.netty.buffer.PooledByteBufAllocator;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract; import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
@ -383,4 +384,12 @@ public class ReflectionManager implements ReflectionManagerAbstract {
return registry.getId(CraftArt.BukkitToNotch(type)); return registry.getId(CraftArt.BukkitToNotch(type));
} }
@Override
public String getDataAsString(ItemStack itemStack) {
net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
CompoundTag compoundTag = nmsItem.save(new CompoundTag());
return compoundTag.getAsString();
}
} }

View File

@ -10,6 +10,7 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract; import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
@ -383,4 +384,12 @@ public class ReflectionManager implements ReflectionManagerAbstract {
return registry.getId(CraftArt.BukkitToNotch(type)); return registry.getId(CraftArt.BukkitToNotch(type));
} }
@Override
public String getDataAsString(ItemStack itemStack) {
net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
CompoundTag compoundTag = nmsItem.save(new CompoundTag());
return compoundTag.getAsString();
}
} }

View File

@ -11,6 +11,7 @@ import lombok.SneakyThrows;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract; import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
@ -386,4 +387,12 @@ public class ReflectionManager implements ReflectionManagerAbstract {
return registry.getId(CraftArt.BukkitToNotch(type)); return registry.getId(CraftArt.BukkitToNotch(type));
} }
@Override
public String getDataAsString(ItemStack itemStack) {
net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(itemStack);
CompoundTag compoundTag = nmsItem.save(new CompoundTag());
return compoundTag.getAsString();
}
} }

View File

@ -11,6 +11,7 @@ import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
@ -446,4 +447,5 @@ public class ReflectionManager implements ReflectionManagerAbstract {
return registry.getId(CraftArt.bukkitToMinecraft(type)); return registry.getId(CraftArt.bukkitToMinecraft(type));
} }
} }

View File

@ -11,6 +11,7 @@ import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;

View File

@ -3,15 +3,12 @@ package me.libraryaddict.disguise.utilities.reflection.v1_20_R4;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import com.mojang.authlib.ProfileLookupCallback; import com.mojang.authlib.ProfileLookupCallback;
import com.mojang.authlib.minecraft.MinecraftSessionService; import com.mojang.authlib.minecraft.MinecraftSessionService;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.JavaOps;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.PooledByteBufAllocator; import io.netty.buffer.PooledByteBufAllocator;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract; import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.component.DataComponentPatch;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf;
@ -460,20 +457,7 @@ public class ReflectionManager implements ReflectionManagerAbstract {
} }
@Override @Override
public Object serializeComponents(ItemStack itemStack) { public String getDataAsString(ItemStack itemStack) {
if (itemStack == null) { return itemStack.hasItemMeta() ? itemStack.getItemMeta().getAsComponentString() : null;
return null;
}
net.minecraft.world.item.ItemStack item = CraftItemStack.asNMSCopy(itemStack);
DataComponentPatch comps = item.getComponentsPatch();
if (comps == null) {
return null;
}
DataResult<Object> cond = DataComponentPatch.CODEC.encodeStart(JavaOps.INSTANCE, comps);
return cond.result().orElse(null);
} }
} }

View File

@ -3,15 +3,12 @@ package me.libraryaddict.disguise.utilities.reflection.v1_21_R1;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import com.mojang.authlib.ProfileLookupCallback; import com.mojang.authlib.ProfileLookupCallback;
import com.mojang.authlib.minecraft.MinecraftSessionService; import com.mojang.authlib.minecraft.MinecraftSessionService;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.JavaOps;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.PooledByteBufAllocator; import io.netty.buffer.PooledByteBufAllocator;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract; import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.component.DataComponentPatch;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf;
@ -465,20 +462,7 @@ public class ReflectionManager implements ReflectionManagerAbstract {
} }
@Override @Override
public Object serializeComponents(ItemStack itemStack) { public String getDataAsString(ItemStack itemStack) {
if (itemStack == null) { return itemStack.hasItemMeta() ? itemStack.getItemMeta().getAsComponentString() : null;
return null;
}
net.minecraft.world.item.ItemStack item = CraftItemStack.asNMSCopy(itemStack);
DataComponentPatch comps = item.getComponentsPatch();
if (comps == null) {
return null;
}
DataResult<Object> cond = DataComponentPatch.CODEC.encodeStart(JavaOps.INSTANCE, comps);
return cond.result().orElse(null);
} }
} }

View File

@ -3,15 +3,12 @@ package me.libraryaddict.disguise.utilities.reflection.v1_21_R2;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import com.mojang.authlib.ProfileLookupCallback; import com.mojang.authlib.ProfileLookupCallback;
import com.mojang.authlib.minecraft.MinecraftSessionService; import com.mojang.authlib.minecraft.MinecraftSessionService;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.JavaOps;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.PooledByteBufAllocator; import io.netty.buffer.PooledByteBufAllocator;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract; import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.component.DataComponentPatch;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf;
@ -468,20 +465,7 @@ public class ReflectionManager implements ReflectionManagerAbstract {
} }
@Override @Override
public Object serializeComponents(ItemStack itemStack) { public String getDataAsString(ItemStack itemStack) {
if (itemStack == null) { return itemStack.hasItemMeta() ? itemStack.getItemMeta().getAsComponentString() : null;
return null;
}
net.minecraft.world.item.ItemStack item = CraftItemStack.asNMSCopy(itemStack);
DataComponentPatch comps = item.getComponentsPatch();
if (comps == null) {
return null;
}
DataResult<Object> cond = DataComponentPatch.CODEC.encodeStart(JavaOps.INSTANCE, comps);
return cond.result().orElse(null);
} }
} }

View File

@ -3,15 +3,12 @@ package me.libraryaddict.disguise.utilities.reflection.v1_21_R3;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import com.mojang.authlib.ProfileLookupCallback; import com.mojang.authlib.ProfileLookupCallback;
import com.mojang.authlib.minecraft.MinecraftSessionService; import com.mojang.authlib.minecraft.MinecraftSessionService;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.JavaOps;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.PooledByteBufAllocator; import io.netty.buffer.PooledByteBufAllocator;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract; import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.component.DataComponentPatch;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf;
@ -468,20 +465,7 @@ public class ReflectionManager implements ReflectionManagerAbstract {
} }
@Override @Override
public Object serializeComponents(ItemStack itemStack) { public String getDataAsString(ItemStack itemStack) {
if (itemStack == null) { return itemStack.hasItemMeta() ? itemStack.getItemMeta().getAsComponentString() : null;
return null;
}
net.minecraft.world.item.ItemStack item = CraftItemStack.asNMSCopy(itemStack);
DataComponentPatch comps = item.getComponentsPatch();
if (comps == null) {
return null;
}
DataResult<Object> cond = DataComponentPatch.CODEC.encodeStart(JavaOps.INSTANCE, comps);
return cond.result().orElse(null);
} }
} }

View File

@ -436,7 +436,6 @@ public class DisguiseParser {
} }
return TranslateType.DISGUISE_OPTIONS_PARAMETERS.reverseGet("null"); return TranslateType.DISGUISE_OPTIONS_PARAMETERS.reverseGet("null");
} }
/** /**

View File

@ -9,16 +9,12 @@ import com.github.retrooper.packetevents.protocol.nbt.NBTLongArray;
import com.github.retrooper.packetevents.protocol.nbt.NBTNumber; import com.github.retrooper.packetevents.protocol.nbt.NBTNumber;
import com.github.retrooper.packetevents.protocol.nbt.NBTString; import com.github.retrooper.packetevents.protocol.nbt.NBTString;
import com.github.retrooper.packetevents.protocol.nbt.NBTType; import com.github.retrooper.packetevents.protocol.nbt.NBTType;
import it.unimi.dsi.fastutil.bytes.ByteList;
import it.unimi.dsi.fastutil.ints.IntList;
import it.unimi.dsi.fastutil.longs.LongList;
import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
public class ItemStackSerializer { public class ItemStackSerializer {
@ -32,15 +28,16 @@ public class ItemStackSerializer {
String type = ReflectionManager.getItemName(item.getType()); String type = ReflectionManager.getItemName(item.getType());
if (item.hasItemMeta() && NmsVersion.v1_13.isSupported()) { if (item.hasItemMeta() && NmsVersion.v1_13.isSupported()) {
if (NmsVersion.v1_20_R4.isSupported()) { if (ReflectionManager.getNmsReflection() != null) {
Object asJava = ReflectionManager.getNmsReflection().serializeComponents(item); String asString = ReflectionManager.getNmsReflection().getDataAsString(item);
if (asJava != null) { if (asString != null && asString.length() > 2) {
String asString = serializeObj(asJava); // Vanilla seems to turn this into a string that contains for UUID
// : [I; 772059800,
// And there should be no space, so we must strip all spaces that are unneeded.
asString = stripSpacesFromString(asString);
if (asString.length() > 2) { type += "[" + asString.substring(1, asString.length() - 1) + "]";
type += "[" + asString.substring(1, asString.length() - 1) + "]";
}
} }
} else { } else {
NBT nbt = DisguiseUtilities.fromBukkitItemStack(item).getNBT(); NBT nbt = DisguiseUtilities.fromBukkitItemStack(item).getNBT();
@ -82,86 +79,35 @@ public class ItemStackSerializer {
return mcArray; return mcArray;
} }
private static String stripSpacesFromString(String string) {
StringBuilder result = new StringBuilder();
boolean inQuote = false;
boolean escaped = false;
for (int i = 0; i < string.length(); i++) {
char c = string.charAt(i);
if (escaped) {
result.append(c);
escaped = false;
} else if (c == '\\') {
escaped = true;
} else if (c == '"') {
inQuote = !inQuote;
} else if (!inQuote && c == ' ') {
continue; // Skip spaces outside quotes
}
result.append(c);
}
return result.toString();
}
public static String serialize(NBT base) { public static String serialize(NBT base) {
return serialize(0, base); return serialize(0, base);
} }
private static String serializeObj(Object object) {
return serializeObj(0, object);
}
private static String serializeObj(int depth, Object object) {
if (object instanceof Map) {
StringBuilder builder = new StringBuilder();
builder.append("{");
for (Map.Entry<String, Object> entry : ((Map<String, Object>) object).entrySet()) {
String val = serializeObj(depth + 1, entry.getValue());
// Skip root empty values
if (depth == 0 && val.matches("0(\\.0)?")) {
continue;
}
if (builder.length() > 1) {
builder.append(",");
}
builder.append(entry.getKey()).append("=").append(val);
}
builder.append("}");
return builder.toString();
} else if (object instanceof ByteList) {
ByteList byteArray = (ByteList) object;
List<String> bytes = new ArrayList<>();
for (byte b : byteArray) {
bytes.add(String.valueOf(b));
}
return "[B;" + String.join(",", bytes) + "]";
} else if (object instanceof IntList) {
IntList byteArray = (IntList) object;
List<String> bytes = new ArrayList<>();
for (int b : byteArray) {
bytes.add(String.valueOf(b));
}
return "[I;" + String.join(",", bytes) + "]";
} else if (object instanceof LongList) {
LongList byteArray = (LongList) object;
List<String> bytes = new ArrayList<>();
for (long b : byteArray) {
bytes.add(String.valueOf(b));
}
return "[L;" + String.join(",", bytes) + "]";
} else if (object instanceof List) {
List<String> serialized = new ArrayList<>();
for (Object obj : ((List) object)) {
serialized.add(serializeObj(depth + 1, obj));
}
return "[" + StringUtils.join(serialized, ",") + "]";
} else if (object instanceof Number) {
return object.toString();
} else if (object instanceof String) {
if (((String) object).contains("\"") && !((String) object).contains("'")) {
return "'" + object + "'";
}
return "\"" + ((String) object).replace("\\", "\\\\").replace("\"", "\\\"") + "\"";
} else {
throw new IllegalArgumentException();
}
}
private static String serialize(int depth, NBT base) { private static String serialize(int depth, NBT base) {
if (base.getType() == NBTType.COMPOUND) { if (base.getType() == NBTType.COMPOUND) {
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();

View File

@ -154,7 +154,7 @@ public interface ReflectionManagerAbstract {
throw new IllegalStateException("Not implemented"); throw new IllegalStateException("Not implemented");
} }
default Object serializeComponents(ItemStack itemStack) { default String getDataAsString(ItemStack itemStack) {
throw new IllegalStateException("Not implemented"); return itemStack.hasItemMeta() ? itemStack.getItemMeta().getAsString() : null;
} }
} }