fix NMSBindings

This commit is contained in:
CrazyDev22 2024-04-24 17:55:40 +02:00
parent 1ad35c1310
commit bb020cab25
6 changed files with 108 additions and 24 deletions

View File

@ -12,6 +12,7 @@ import java.util.List;
import java.util.Vector;
import java.util.concurrent.atomic.AtomicInteger;
import net.minecraft.world.level.Level;
import org.bukkit.*;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
@ -170,6 +171,17 @@ public class NMSBinding implements INMSBinding {
return null;
}
private RegistryAccess getRegistryAccess(World world) {
try {
var field = getField(Level.class, RegistryAccess.class);
field.setAccessible(true);
return (RegistryAccess) field.get(((CraftWorld) world).getHandle());
} catch (Throwable e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
public void deserializeTile(CompoundTag c, Location pos) {
((CraftWorld) pos.getWorld()).getHandle().getChunkAt(new BlockPos(pos.getBlockX(), 0, pos.getBlockZ())).setBlockEntityNbt(convert(c));
@ -253,8 +265,7 @@ public class NMSBinding implements INMSBinding {
@Override
public Object getBiomeBase(World world, Biome biome) {
return CraftBlock.biomeToBiomeBase(((CraftWorld) world).getHandle()
.registryAccess().registry(Registry.BIOME_REGISTRY).orElse(null), biome);
return CraftBlock.biomeToBiomeBase(getRegistryAccess(world).registry(Registry.BIOME_REGISTRY).orElse(null), biome);
}
@Override
@ -291,8 +302,11 @@ public class NMSBinding implements INMSBinding {
public int getBiomeId(Biome biome) {
for (World i : Bukkit.getWorlds()) {
if (i.getEnvironment().equals(World.Environment.NORMAL)) {
Registry<net.minecraft.world.level.biome.Biome> registry = ((CraftWorld) i).getHandle().registryAccess().registry(Registry.BIOME_REGISTRY).orElse(null);
return registry.getId((net.minecraft.world.level.biome.Biome) getBiomeBase(registry, biome));
var registry = getRegistryAccess(i).registry(Registry.BIOME_REGISTRY).orElse(null);
if (registry != null) {
var holder = (Holder<net.minecraft.world.level.biome.Biome>) getBiomeBase(registry, biome);
return registry.getId(holder.value());
}
}
}

View File

@ -12,6 +12,7 @@ import java.util.List;
import java.util.Vector;
import java.util.concurrent.atomic.AtomicInteger;
import net.minecraft.world.level.Level;
import org.bukkit.*;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
@ -171,6 +172,17 @@ public class NMSBinding implements INMSBinding {
return null;
}
private RegistryAccess getRegistryAccess(World world) {
try {
var field = getField(Level.class, RegistryAccess.class);
field.setAccessible(true);
return (RegistryAccess) field.get(((CraftWorld) world).getHandle());
} catch (Throwable e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
public void deserializeTile(CompoundTag c, Location pos) {
((CraftWorld) pos.getWorld()).getHandle().getChunkAt(new BlockPos(pos.getBlockX(), 0, pos.getBlockZ())).setBlockEntityNbt(convert(c));
@ -254,8 +266,7 @@ public class NMSBinding implements INMSBinding {
@Override
public Object getBiomeBase(World world, Biome biome) {
return CraftBlock.biomeToBiomeBase(((CraftWorld) world).getHandle()
.registryAccess().registry(Registries.BIOME).orElse(null), biome);
return CraftBlock.biomeToBiomeBase(getRegistryAccess(world).registry(Registries.BIOME).orElse(null), biome);
}
@Override
@ -292,8 +303,11 @@ public class NMSBinding implements INMSBinding {
public int getBiomeId(Biome biome) {
for (World i : Bukkit.getWorlds()) {
if (i.getEnvironment().equals(World.Environment.NORMAL)) {
Registry<net.minecraft.world.level.biome.Biome> registry = ((CraftWorld) i).getHandle().registryAccess().registry(Registries.BIOME).orElse(null);
return registry.getId((net.minecraft.world.level.biome.Biome) getBiomeBase(registry, biome));
var registry = getRegistryAccess(i).registry(Registries.BIOME).orElse(null);
if (registry != null) {
var holder = (Holder<net.minecraft.world.level.biome.Biome>) getBiomeBase(registry, biome);
return registry.getId(holder.value());
}
}
}

View File

@ -12,6 +12,7 @@ import java.util.List;
import java.util.Vector;
import java.util.concurrent.atomic.AtomicInteger;
import net.minecraft.world.level.Level;
import org.bukkit.*;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
@ -172,6 +173,17 @@ public class NMSBinding implements INMSBinding {
return null;
}
private RegistryAccess getRegistryAccess(World world) {
try {
var field = getField(Level.class, RegistryAccess.class);
field.setAccessible(true);
return (RegistryAccess) field.get(((CraftWorld) world).getHandle());
} catch (Throwable e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
public void deserializeTile(CompoundTag c, Location pos) {
((CraftWorld) pos.getWorld()).getHandle().getChunkAt(new BlockPos(pos.getBlockX(), 0, pos.getBlockZ())).setBlockEntityNbt(convert(c));
@ -255,8 +267,7 @@ public class NMSBinding implements INMSBinding {
@Override
public Object getBiomeBase(World world, Biome biome) {
return CraftBlock.biomeToBiomeBase(((CraftWorld) world).getHandle()
.registryAccess().registry(Registries.BIOME).orElse(null), biome);
return CraftBlock.biomeToBiomeBase(getRegistryAccess(world).registry(Registries.BIOME).orElse(null), biome);
}
@Override
@ -294,8 +305,11 @@ public class NMSBinding implements INMSBinding {
public int getBiomeId(Biome biome) {
for (World i : Bukkit.getWorlds()) {
if (i.getEnvironment().equals(World.Environment.NORMAL)) {
Registry<net.minecraft.world.level.biome.Biome> registry = ((CraftWorld) i).getHandle().registryAccess().registry(Registries.BIOME).orElse(null);
return registry.getId((net.minecraft.world.level.biome.Biome) getBiomeBase(registry, biome));
var registry = getRegistryAccess(i).registry(Registries.BIOME).orElse(null);
if (registry != null) {
var holder = (Holder<net.minecraft.world.level.biome.Biome>) getBiomeBase(registry, biome);
return registry.getId(holder.value());
}
}
}

View File

@ -27,6 +27,7 @@ import net.minecraft.nbt.TagParser;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.EntityDimensions;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.biome.BiomeSource;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
@ -175,6 +176,17 @@ public class NMSBinding implements INMSBinding {
return null;
}
private RegistryAccess getRegistryAccess(World world) {
try {
var field = getField(Level.class, RegistryAccess.class);
field.setAccessible(true);
return (RegistryAccess) field.get(((CraftWorld) world).getHandle());
} catch (Throwable e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
public void deserializeTile(CompoundTag c, Location pos) {
((CraftWorld) pos.getWorld()).getHandle().getChunkAt(new BlockPos(pos.getBlockX(), 0, pos.getBlockZ())).setBlockEntityNbt(convert(c));
@ -258,8 +270,7 @@ public class NMSBinding implements INMSBinding {
@Override
public Object getBiomeBase(World world, Biome biome) {
return CraftBlock.biomeToBiomeBase(((CraftWorld) world).getHandle()
.registryAccess().registry(Registries.BIOME).orElse(null), biome);
return CraftBlock.biomeToBiomeBase(getRegistryAccess(world).registry(Registries.BIOME).orElse(null), biome);
}
@Override
@ -296,8 +307,11 @@ public class NMSBinding implements INMSBinding {
public int getBiomeId(Biome biome) {
for (World i : Bukkit.getWorlds()) {
if (i.getEnvironment().equals(World.Environment.NORMAL)) {
Registry<net.minecraft.world.level.biome.Biome> registry = ((CraftWorld) i).getHandle().registryAccess().registry(Registries.BIOME).orElse(null);
return registry.getId((net.minecraft.world.level.biome.Biome) getBiomeBase(registry, biome));
var registry = getRegistryAccess(i).registry(Registries.BIOME).orElse(null);
if (registry != null) {
var holder = (Holder<net.minecraft.world.level.biome.Biome>) getBiomeBase(registry, biome);
return registry.getId(holder.value());
}
}
}

View File

@ -12,6 +12,7 @@ import java.util.List;
import java.util.Vector;
import java.util.concurrent.atomic.AtomicInteger;
import net.minecraft.world.level.Level;
import org.bukkit.*;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
@ -173,6 +174,17 @@ public class NMSBinding implements INMSBinding {
return null;
}
private RegistryAccess getRegistryAccess(World world) {
try {
var field = getField(Level.class, RegistryAccess.class);
field.setAccessible(true);
return (RegistryAccess) field.get(((CraftWorld) world).getHandle());
} catch (Throwable e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
public void deserializeTile(CompoundTag c, Location pos) {
((CraftWorld) pos.getWorld()).getHandle().getChunkAt(new BlockPos(pos.getBlockX(), 0, pos.getBlockZ())).setBlockEntityNbt(convert(c));
@ -256,8 +268,7 @@ public class NMSBinding implements INMSBinding {
@Override
public Object getBiomeBase(World world, Biome biome) {
return biomeToBiomeBase(((CraftWorld) world).getHandle()
.registryAccess().registry(Registries.BIOME).orElse(null), biome);
return biomeToBiomeBase(getRegistryAccess(world).registry(Registries.BIOME).orElse(null), biome);
}
@Override
@ -294,8 +305,11 @@ public class NMSBinding implements INMSBinding {
public int getBiomeId(Biome biome) {
for (World i : Bukkit.getWorlds()) {
if (i.getEnvironment().equals(World.Environment.NORMAL)) {
Registry<net.minecraft.world.level.biome.Biome> registry = ((CraftWorld) i).getHandle().registryAccess().registry(Registries.BIOME).orElse(null);
return registry.getId((net.minecraft.world.level.biome.Biome) getBiomeBase(registry, biome));
var registry = getRegistryAccess(i).registry(Registries.BIOME).orElse(null);
if (registry != null) {
var holder = (Holder<net.minecraft.world.level.biome.Biome>) getBiomeBase(registry, biome);
return registry.getId(holder.value());
}
}
}

View File

@ -12,6 +12,7 @@ import java.util.List;
import java.util.Vector;
import java.util.concurrent.atomic.AtomicInteger;
import net.minecraft.world.level.Level;
import org.bukkit.*;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
@ -173,6 +174,17 @@ public class NMSBinding implements INMSBinding {
return null;
}
private RegistryAccess getRegistryAccess(World world) {
try {
var field = getField(Level.class, RegistryAccess.class);
field.setAccessible(true);
return (RegistryAccess) field.get(((CraftWorld) world).getHandle());
} catch (Throwable e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
public void deserializeTile(CompoundTag c, Location pos) {
((CraftWorld) pos.getWorld()).getHandle().getChunkAt(new BlockPos(pos.getBlockX(), 0, pos.getBlockZ())).setBlockEntityNbt(convert(c));
@ -256,8 +268,7 @@ public class NMSBinding implements INMSBinding {
@Override
public Object getBiomeBase(World world, Biome biome) {
return biomeToBiomeBase(((CraftWorld) world).getHandle()
.registryAccess().registry(Registries.BIOME).orElse(null), biome);
return biomeToBiomeBase(getRegistryAccess(world).registry(Registries.BIOME).orElse(null), biome);
}
@Override
@ -294,8 +305,11 @@ public class NMSBinding implements INMSBinding {
public int getBiomeId(Biome biome) {
for (World i : Bukkit.getWorlds()) {
if (i.getEnvironment().equals(World.Environment.NORMAL)) {
Registry<net.minecraft.world.level.biome.Biome> registry = ((CraftWorld) i).getHandle().registryAccess().registry(Registries.BIOME).orElse(null);
return registry.getId((net.minecraft.world.level.biome.Biome) getBiomeBase(registry, biome));
var registry = getRegistryAccess(i).registry(Registries.BIOME).orElse(null);
if (registry != null) {
var holder = (Holder<net.minecraft.world.level.biome.Biome>) getBiomeBase(registry, biome);
return registry.getId(holder.value());
}
}
}