mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-17 22:31:52 +00:00
Corrected issues with worldGenContext not correctly being set (Ref: https://stackoverflow.com/questions/56039341/get-declared-fields-of-java-lang-reflect-fields-in-jdk12/56043252#56043252)
This commit is contained in:
@@ -8,6 +8,7 @@
|
|||||||
package com.dfsek.terra.api.util.reflection;
|
package com.dfsek.terra.api.util.reflection;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import sun.misc.Unsafe;
|
||||||
|
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
import java.lang.reflect.AnnotatedElement;
|
import java.lang.reflect.AnnotatedElement;
|
||||||
@@ -26,6 +27,18 @@ import java.util.stream.Stream;
|
|||||||
|
|
||||||
|
|
||||||
public final class ReflectionUtil {
|
public final class ReflectionUtil {
|
||||||
|
private static final Unsafe UNSAFE;
|
||||||
|
|
||||||
|
static {
|
||||||
|
try{
|
||||||
|
final Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
|
||||||
|
unsafeField.setAccessible(true);
|
||||||
|
UNSAFE = (Unsafe) unsafeField.get(null);
|
||||||
|
} catch(NoSuchFieldException | IllegalAccessException e){
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static Field[] getFields(@NotNull Class<?> type) {
|
public static Field[] getFields(@NotNull Class<?> type) {
|
||||||
Field[] result = type.getDeclaredFields();
|
Field[] result = type.getDeclaredFields();
|
||||||
Class<?> parentClass = type.getSuperclass();
|
Class<?> parentClass = type.getSuperclass();
|
||||||
@@ -35,6 +48,14 @@ public final class ReflectionUtil {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void setFinalField(Object obj, String fieldName, Object value) throws NoSuchFieldException {
|
||||||
|
Field field = obj.getClass().getDeclaredField(fieldName);
|
||||||
|
field.setAccessible(true);
|
||||||
|
long fieldOffset = UNSAFE.objectFieldOffset(field);
|
||||||
|
|
||||||
|
UNSAFE.putObject(obj, fieldOffset, value);
|
||||||
|
}
|
||||||
|
|
||||||
public static Method[] getMethods(@NotNull Class<?> type) {
|
public static Method[] getMethods(@NotNull Class<?> type) {
|
||||||
Method[] result = type.getDeclaredMethods();
|
Method[] result = type.getDeclaredMethods();
|
||||||
Class<?> parentClass = type.getSuperclass();
|
Class<?> parentClass = type.getSuperclass();
|
||||||
|
|||||||
+12
-14
@@ -1,9 +1,12 @@
|
|||||||
package com.dfsek.terra.bukkit.nms.v1_21;
|
package com.dfsek.terra.bukkit.nms.v1_21;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.util.reflection.ReflectionUtil;
|
||||||
|
|
||||||
import net.minecraft.server.level.ChunkMap;
|
import net.minecraft.server.level.ChunkMap;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.world.level.chunk.ChunkGenerator;
|
import net.minecraft.world.level.chunk.ChunkGenerator;
|
||||||
import net.minecraft.world.level.chunk.status.WorldGenContext;
|
import net.minecraft.world.level.chunk.status.WorldGenContext;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.craftbukkit.CraftWorld;
|
import org.bukkit.craftbukkit.CraftWorld;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
@@ -12,7 +15,6 @@ import org.bukkit.event.world.WorldInitEvent;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
@@ -41,21 +43,17 @@ public class NMSInjectListener implements Listener {
|
|||||||
ChunkGenerator vanilla = serverWorld.getChunkSource().getGenerator();
|
ChunkGenerator vanilla = serverWorld.getChunkSource().getGenerator();
|
||||||
NMSBiomeProvider provider = new NMSBiomeProvider(pack.getBiomeProvider(), craftWorld.getSeed());
|
NMSBiomeProvider provider = new NMSBiomeProvider(pack.getBiomeProvider(), craftWorld.getSeed());
|
||||||
ChunkMap chunkMap = serverWorld.getChunkSource().chunkMap;
|
ChunkMap chunkMap = serverWorld.getChunkSource().chunkMap;
|
||||||
|
WorldGenContext worldGenContext = chunkMap.worldGenContext;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Field worldGenContextField = chunkMap.getClass().getDeclaredField("worldGenContext");
|
ReflectionUtil.setFinalField(chunkMap, "worldGenContext", new WorldGenContext(
|
||||||
worldGenContextField.setAccessible(true);
|
worldGenContext.level(),
|
||||||
|
new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()),
|
||||||
WorldGenContext worldGenContext = (WorldGenContext) worldGenContextField.get(chunkMap);
|
worldGenContext.structureManager(),
|
||||||
worldGenContextField.set(chunkMap,
|
worldGenContext.lightEngine(),
|
||||||
new WorldGenContext(
|
worldGenContext.mainThreadMailBox()
|
||||||
worldGenContext.level(),
|
));
|
||||||
new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()),
|
} catch(NoSuchFieldException e) {
|
||||||
worldGenContext.structureManager(),
|
|
||||||
worldGenContext.lightEngine(),
|
|
||||||
worldGenContext.mainThreadMailBox()
|
|
||||||
));
|
|
||||||
} catch(NoSuchFieldException | IllegalAccessException e) {
|
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user