Skip to content

Commit

Permalink
Add blockreader functionality tested with 1.20.4
Browse files Browse the repository at this point in the history
  • Loading branch information
Ste3et committed Jan 9, 2024
1 parent b94bded commit fe3e4db
Show file tree
Hide file tree
Showing 9 changed files with 100 additions and 52 deletions.
@@ -1,32 +1,37 @@
package de.Ste3et_C0st.FurnitureLib.NBT.BlockDataReader;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;

import org.bukkit.Bukkit;
import org.bukkit.block.data.BlockData;

import de.Ste3et_C0st.FurnitureLib.NBT.NBTCompressedStreamTools;
import de.Ste3et_C0st.FurnitureLib.NBT.CraftItemStack;
import de.Ste3et_C0st.FurnitureLib.NBT.NBTTagCompound;

public class BlockDataConverter1_20 extends BlockDataReader{

private static Class<?> registries, worldClass, resourceKeyClass;
private static Class<?> nmsNBTReadLimiter, clazz_nbttools, calzz_gameProfile, craftBlockDataClass;
private static Method clazz_nbttools_method_a_input;
private static Class<?> registries, resourceKeyClass;
private static Class<?> calzz_gameProfile, craftBlockDataClass;
private static Class<?> craftWorldClass, iWorldReader, classHolderGetter;
private static Object regsitrie;
private static Method worldReaderHandle, holderLookup;

static {
try {
registries = Class.forName("net.minecraft.core.registries");
worldClass = Class.forName("net.minecraft.world.level.World");
registries = Class.forName("net.minecraft.core.registries.Registries");
resourceKeyClass = Class.forName("net.minecraft.resources.ResourceKey");
nmsNBTReadLimiter = Class.forName("net.minecraft.nbt.NBTReadLimiter");
clazz_nbttools = Class.forName("net.minecraft.nbt.NBTCompressedStreamTools");
calzz_gameProfile = Class.forName("net.minecraft.nbt.GameProfileSerializer");
craftBlockDataClass = Class.forName("org.bukkit.craftbukkit.v1_20_R3.block.data.CraftBlockData");
craftWorldClass = Class.forName("org.bukkit.craftbukkit.v1_20_R3.CraftWorld");
iWorldReader = Class.forName("net.minecraft.world.level.IWorldReader");
classHolderGetter = Class.forName("net.minecraft.core.HolderGetter");

clazz_nbttools_method_a_input = clazz_nbttools.getMethod("a", InputStream.class, nmsNBTReadLimiter);
regsitrie = registries.getDeclaredField("f").get(null);

holderLookup = iWorldReader.getMethod("a", resourceKeyClass);
worldReaderHandle = craftWorldClass.getMethod("getHandle");
} catch (Exception e) {
e.printStackTrace();
}
Expand All @@ -35,24 +40,23 @@ public class BlockDataConverter1_20 extends BlockDataReader{

@Override
public Optional<BlockData> read(NBTTagCompound compound) {
//GameProfileSerializer.a((HolderGetter)dM().a(Registries.f), nbt.p("block_state"))
try {
byte[] data = NBTCompressedStreamTools.toByte(compound);
Object nbtTag = clazz_nbttools_method_a_input.invoke(null, new ByteArrayInputStream(data), nmsNBTReadLimiter.getMethod("a").invoke(null));

Object NMSblock_entity_type = registries.getDeclaredField("f");
Object HolderLookup = worldClass.getDeclaredMethod("a", resourceKeyClass).invoke(null, NMSblock_entity_type);

Object iBlockData = calzz_gameProfile.getDeclaredMethod("a", HolderLookup.getClass(), nbtTag.getClass()).invoke(null, HolderLookup, nbtTag);
Object craftBlockData = craftBlockDataClass.getDeclaredMethod("fromData", iBlockData.getClass()).invoke(null, iBlockData);

return Optional.ofNullable(BlockData.class.cast(craftBlockData));
}catch (Exception e) {
e.printStackTrace();
}
AtomicReference<BlockData> returnAtomic = new AtomicReference<>();

CraftItemStack.getReader().ifPresent(itemReader -> {
try {
Object nbtTag = itemReader.convertCompound(compound);
Object craftWorld = craftWorldClass.cast(Bukkit.getWorlds().stream().findFirst().get());
Object nmsWorld = iWorldReader.cast(worldReaderHandle.invoke(craftWorld));
Object HolderLookup = holderLookup.invoke(nmsWorld, regsitrie);
Object iBlockData = calzz_gameProfile.getDeclaredMethod("a", classHolderGetter, nbtTag.getClass()).invoke(null, HolderLookup, nbtTag);
Object craftBlockData = craftBlockDataClass.getDeclaredMethod("fromData", iBlockData.getClass()).invoke(null, iBlockData);
returnAtomic.set(BlockData.class.cast(craftBlockData));
}catch (Exception e) {
e.printStackTrace();
}
});

return Optional.empty();
return Optional.ofNullable(returnAtomic.get());
}

}
Expand Up @@ -12,20 +12,22 @@

public class CraftBlockData {

private final static BlockDataReader reader;

//test
private final static BlockDataReader READER;

static {
if(FurnitureLib.getVersion(new MinecraftVersion("1.20.3"))) {
reader = new BlockDataConverter1_20();
READER = new BlockDataConverter1_20();
}else {
reader = null;
READER = null;
}
}

public Optional<BlockData> read(NBTTagCompound compound){
if(Objects.isNull(reader)) return Optional.empty();
return reader.read(compound);
if(Objects.isNull(READER)) return Optional.empty();
return READER.read(compound);
}

public static Optional<BlockDataReader> getReader() {
return Optional.ofNullable(READER);
}
}
Expand Up @@ -11,29 +11,34 @@
import com.comphenix.protocol.utility.MinecraftVersion;

import java.util.Objects;
import java.util.Optional;

public class CraftItemStack {

private final static ItemStackReader reader;
private final static ItemStackReader READER;

static {
if(FurnitureLib.getVersion(new MinecraftVersion("1.20.3"))) {
reader = new ItemStackV120_1();
READER = new ItemStackV120_1();
}else if(FurnitureLib.getVersionInt() < 13) {
reader = new ItemStackV111_112();
READER = new ItemStackV111_112();
}else {
reader = new ItemStackV113();
READER = new ItemStackV113();
}
}

public ItemStack getItemStack(NBTTagCompound nbtTagCompound) {
if(Objects.nonNull(reader)) {
return reader.getItemStack(nbtTagCompound);
if(Objects.nonNull(READER)) {
return READER.getItemStack(nbtTagCompound);
}
return null;
}

public NBTTagCompound getNBTTag(ItemStack is) throws Exception {
return reader.getNBTTag(is);
return READER.getNBTTag(is);
}

public static Optional<ItemStackReader> getReader() {
return Optional.ofNullable(READER);
}
}
Expand Up @@ -2,7 +2,10 @@

import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.function.Function;

import org.bukkit.inventory.ItemStack;

import de.Ste3et_C0st.FurnitureLib.NBT.NBTCompressedStreamTools;
Expand Down Expand Up @@ -54,5 +57,6 @@ static String getNbtFolder() {
static String getItemStackClass() {
return FurnitureLib.getVersionInt() > 16 ? "net.minecraft.world.item.ItemStack" : "net.minecraft.server." + FurnitureLib.getBukkitVersion() + ".ItemStack";
}


public abstract Object convertCompound(NBTTagCompound nbtTagCompound) throws Exception;
}
Expand Up @@ -27,14 +27,18 @@ public class ItemStackV111_112 extends ItemStackReader{

public ItemStack getItemStack(NBTTagCompound nbt) {
try {
byte[] data = NBTCompressedStreamTools.toByte(nbt);
Object mns_nbt = clazz_nbttools_method_a_input.invoke(null, new ByteArrayInputStream(data));
Object nms_item = constructor_nms_item.newInstance(mns_nbt);
Object nms_item = constructor_nms_item.newInstance(convertCompound(nbt));
return (ItemStack) asBukkitCopy.invoke(null, nms_item);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

@Override
public Object convertCompound(NBTTagCompound nbtTagCompound) throws Exception{
byte[] data = NBTCompressedStreamTools.toByte(nbtTagCompound);
return clazz_nbttools_method_a_input.invoke(null, new ByteArrayInputStream(data));
}

}
Expand Up @@ -25,14 +25,18 @@ public class ItemStackV113 extends ItemStackReader{

public ItemStack getItemStack(NBTTagCompound nbt) {
try {
byte[] data = NBTCompressedStreamTools.toByte(nbt);
Object nbtTag = clazz_nbttools_method_a_input.invoke(null, new ByteArrayInputStream(data));
Object nms_item = a.invoke(null, nbtTag);
Object nms_item = a.invoke(null, convertCompound(nbt));
return (ItemStack) asBukkitCopy.invoke(null, nms_item);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

@Override
public Object convertCompound(NBTTagCompound nbtTagCompound) throws Exception {
byte[] data = NBTCompressedStreamTools.toByte(nbtTagCompound);
return clazz_nbttools_method_a_input.invoke(null, new ByteArrayInputStream(data));
}

}
Expand Up @@ -14,7 +14,6 @@ public class ItemStackV120_1 extends ItemStackReader{
private static Class<?> nmsNBTReadLimiter;
private static Method a, asBukkitCopy;


static {
try {
nmsNBTReadLimiter = Class.forName(getNbtFolder() + ".NBTReadLimiter");
Expand All @@ -28,14 +27,18 @@ public class ItemStackV120_1 extends ItemStackReader{

public ItemStack getItemStack(NBTTagCompound nbt) {
try {
byte[] data = NBTCompressedStreamTools.toByte(nbt);
Object nbtTag = clazz_nbttools_method_a_input.invoke(null, new ByteArrayInputStream(data), nmsNBTReadLimiter.getMethod("a").invoke(null));
Object nms_item = a.invoke(null, nbtTag);
Object nms_item = a.invoke(null, convertCompound(nbt));
return (ItemStack) asBukkitCopy.invoke(null, nms_item);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

@Override
public Object convertCompound(NBTTagCompound nbtTagCompound) throws Exception {
byte[] data = NBTCompressedStreamTools.toByte(nbtTagCompound);
return clazz_nbttools_method_a_input.invoke(null, new ByteArrayInputStream(data), nmsNBTReadLimiter.getMethod("a").invoke(null));
}

}
Expand Up @@ -9,6 +9,7 @@
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import java.util.logging.Logger;

@SuppressWarnings({"rawtypes", "unchecked", "unused"})
Expand Down Expand Up @@ -254,6 +255,19 @@ public boolean hasKeyOfType(String s, int i) {

return b0 == i || i == 99 && (b0 == 1 || b0 == 2 || b0 == 3 || b0 == 4 || b0 == 5 || b0 == 6);
}

public <M extends NBTBase> boolean getCompound(String key, final Class<M> clazz, Consumer<? super M> consumer){
try {
NBTBase base = this.get(key);
if(base != null && clazz.isInstance(this.get(key))) {
consumer.accept((M) base);
return true;
}
}catch (Exception e) {
e.printStackTrace();
}
return false;
}

public boolean isEmpty() {
return this.map.isEmpty();
Expand Down
Expand Up @@ -13,7 +13,9 @@
import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry;
import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject;

import de.Ste3et_C0st.FurnitureLib.NBT.CraftBlockData;
import de.Ste3et_C0st.FurnitureLib.NBT.NBTTagCompound;
import de.Ste3et_C0st.FurnitureLib.NBT.NBTTagString;
import de.Ste3et_C0st.FurnitureLib.Utilitis.DefaultKey;
import de.Ste3et_C0st.FurnitureLib.Utilitis.EntitySize;
import de.Ste3et_C0st.FurnitureLib.main.ObjectID;
Expand Down Expand Up @@ -96,6 +98,12 @@ public void loadMetadata(NBTTagCompound metadata) {
if(metadata.hasKeyOfType("block_state", 8)) {
this.setBlockData(Bukkit.createBlockData(metadata.getString("block_state")));
}

metadata.getCompound("block_state", NBTTagCompound.class, compound -> {
CraftBlockData.getReader().ifPresent(reader -> {
fBlock_display.this.setBlockData(reader.read(compound).get());
});
});
}

@Override
Expand Down

0 comments on commit fe3e4db

Please sign in to comment.