mirror of
https://github.com/libraryaddict/LibsDisguises.git
synced 2025-03-02 04:01:26 +01:00
Fix item parsing, needs to be tested in 1.18 & 1.20
This commit is contained in:
parent
dd5b9e2dc5
commit
f954b70f31
@ -9,6 +9,7 @@ import io.netty.buffer.PooledByteBufAllocator;
|
||||
import lombok.SneakyThrows;
|
||||
import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
|
||||
import net.minecraft.core.Registry;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.network.syncher.SynchedEntityData;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
@ -383,4 +384,12 @@ public class ReflectionManager implements ReflectionManagerAbstract {
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
@ -10,6 +10,7 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
import lombok.SneakyThrows;
|
||||
import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
|
||||
import net.minecraft.core.Registry;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.network.syncher.SynchedEntityData;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
@ -383,4 +384,12 @@ public class ReflectionManager implements ReflectionManagerAbstract {
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ import lombok.SneakyThrows;
|
||||
import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
|
||||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.core.Registry;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.network.syncher.SynchedEntityData;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
@ -386,4 +387,12 @@ public class ReflectionManager implements ReflectionManagerAbstract {
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
|
||||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.core.Registry;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.network.syncher.SynchedEntityData;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
@ -446,4 +447,5 @@ public class ReflectionManager implements ReflectionManagerAbstract {
|
||||
|
||||
return registry.getId(CraftArt.bukkitToMinecraft(type));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
|
||||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.core.Registry;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.network.syncher.SynchedEntityData;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
|
@ -3,15 +3,12 @@ package me.libraryaddict.disguise.utilities.reflection.v1_20_R4;
|
||||
import com.mojang.authlib.GameProfile;
|
||||
import com.mojang.authlib.ProfileLookupCallback;
|
||||
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.PooledByteBufAllocator;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
import lombok.SneakyThrows;
|
||||
import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
|
||||
import net.minecraft.core.Registry;
|
||||
import net.minecraft.core.component.DataComponentPatch;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.core.registries.Registries;
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf;
|
||||
@ -460,20 +457,7 @@ public class ReflectionManager implements ReflectionManagerAbstract {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object serializeComponents(ItemStack itemStack) {
|
||||
if (itemStack == 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);
|
||||
public String getDataAsString(ItemStack itemStack) {
|
||||
return itemStack.hasItemMeta() ? itemStack.getItemMeta().getAsComponentString() : null;
|
||||
}
|
||||
}
|
||||
|
@ -3,15 +3,12 @@ package me.libraryaddict.disguise.utilities.reflection.v1_21_R1;
|
||||
import com.mojang.authlib.GameProfile;
|
||||
import com.mojang.authlib.ProfileLookupCallback;
|
||||
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.PooledByteBufAllocator;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
import lombok.SneakyThrows;
|
||||
import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
|
||||
import net.minecraft.core.Registry;
|
||||
import net.minecraft.core.component.DataComponentPatch;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.core.registries.Registries;
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf;
|
||||
@ -465,20 +462,7 @@ public class ReflectionManager implements ReflectionManagerAbstract {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object serializeComponents(ItemStack itemStack) {
|
||||
if (itemStack == 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);
|
||||
public String getDataAsString(ItemStack itemStack) {
|
||||
return itemStack.hasItemMeta() ? itemStack.getItemMeta().getAsComponentString() : null;
|
||||
}
|
||||
}
|
||||
|
@ -3,15 +3,12 @@ package me.libraryaddict.disguise.utilities.reflection.v1_21_R2;
|
||||
import com.mojang.authlib.GameProfile;
|
||||
import com.mojang.authlib.ProfileLookupCallback;
|
||||
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.PooledByteBufAllocator;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
import lombok.SneakyThrows;
|
||||
import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
|
||||
import net.minecraft.core.Registry;
|
||||
import net.minecraft.core.component.DataComponentPatch;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.core.registries.Registries;
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf;
|
||||
@ -468,20 +465,7 @@ public class ReflectionManager implements ReflectionManagerAbstract {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object serializeComponents(ItemStack itemStack) {
|
||||
if (itemStack == 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);
|
||||
public String getDataAsString(ItemStack itemStack) {
|
||||
return itemStack.hasItemMeta() ? itemStack.getItemMeta().getAsComponentString() : null;
|
||||
}
|
||||
}
|
||||
|
@ -3,15 +3,12 @@ package me.libraryaddict.disguise.utilities.reflection.v1_21_R3;
|
||||
import com.mojang.authlib.GameProfile;
|
||||
import com.mojang.authlib.ProfileLookupCallback;
|
||||
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.PooledByteBufAllocator;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
import lombok.SneakyThrows;
|
||||
import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
|
||||
import net.minecraft.core.Registry;
|
||||
import net.minecraft.core.component.DataComponentPatch;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.core.registries.Registries;
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf;
|
||||
@ -468,20 +465,7 @@ public class ReflectionManager implements ReflectionManagerAbstract {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object serializeComponents(ItemStack itemStack) {
|
||||
if (itemStack == 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);
|
||||
public String getDataAsString(ItemStack itemStack) {
|
||||
return itemStack.hasItemMeta() ? itemStack.getItemMeta().getAsComponentString() : null;
|
||||
}
|
||||
}
|
||||
|
@ -436,7 +436,6 @@ public class DisguiseParser {
|
||||
}
|
||||
|
||||
return TranslateType.DISGUISE_OPTIONS_PARAMETERS.reverseGet("null");
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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.NBTString;
|
||||
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 org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class ItemStackSerializer {
|
||||
|
||||
@ -32,15 +28,16 @@ public class ItemStackSerializer {
|
||||
String type = ReflectionManager.getItemName(item.getType());
|
||||
|
||||
if (item.hasItemMeta() && NmsVersion.v1_13.isSupported()) {
|
||||
if (NmsVersion.v1_20_R4.isSupported()) {
|
||||
Object asJava = ReflectionManager.getNmsReflection().serializeComponents(item);
|
||||
if (ReflectionManager.getNmsReflection() != null) {
|
||||
String asString = ReflectionManager.getNmsReflection().getDataAsString(item);
|
||||
|
||||
if (asJava != null) {
|
||||
String asString = serializeObj(asJava);
|
||||
if (asString != null && asString.length() > 2) {
|
||||
// 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 {
|
||||
NBT nbt = DisguiseUtilities.fromBukkitItemStack(item).getNBT();
|
||||
@ -82,86 +79,35 @@ public class ItemStackSerializer {
|
||||
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) {
|
||||
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) {
|
||||
if (base.getType() == NBTType.COMPOUND) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
|
@ -154,7 +154,7 @@ public interface ReflectionManagerAbstract {
|
||||
throw new IllegalStateException("Not implemented");
|
||||
}
|
||||
|
||||
default Object serializeComponents(ItemStack itemStack) {
|
||||
throw new IllegalStateException("Not implemented");
|
||||
default String getDataAsString(ItemStack itemStack) {
|
||||
return itemStack.hasItemMeta() ? itemStack.getItemMeta().getAsString() : null;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user