From 03582751c5137948246ca2e4c0970cd24a718b78 Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Wed, 9 Oct 2024 12:24:33 +0200 Subject: [PATCH] improve CraftWorldInfo creation --- .../com/volmit/iris/util/reflect/Reflect.java | 42 +++++++++++++++++++ .../iris/core/nms/v1_19_R1/MemoryWorld.java | 19 ++------- .../iris/core/nms/v1_19_R2/MemoryWorld.java | 19 ++------- .../iris/core/nms/v1_19_R3/MemoryWorld.java | 19 ++------- .../iris/core/nms/v1_20_R1/MemoryWorld.java | 20 ++------- .../iris/core/nms/v1_20_R2/MemoryWorld.java | 19 ++------- .../iris/core/nms/v1_20_R3/MemoryWorld.java | 20 +++------ .../iris/core/nms/v1_20_R4/MemoryWorld.java | 19 ++------- .../iris/core/nms/v1_21_R1/MemoryWorld.java | 19 ++------- 9 files changed, 75 insertions(+), 121 deletions(-) create mode 100644 core/src/main/java/com/volmit/iris/util/reflect/Reflect.java diff --git a/core/src/main/java/com/volmit/iris/util/reflect/Reflect.java b/core/src/main/java/com/volmit/iris/util/reflect/Reflect.java new file mode 100644 index 000000000..80ea3fcea --- /dev/null +++ b/core/src/main/java/com/volmit/iris/util/reflect/Reflect.java @@ -0,0 +1,42 @@ +package com.volmit.iris.util.reflect; + +import com.volmit.iris.core.nms.container.Pair; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class Reflect { + + public static T newInstance(Class type, Object... initArgs) throws NoSuchMethodException, InvocationTargetException { + var list = Arrays.stream(initArgs) + .map(arg -> new Pair, Object>(arg.getClass(), arg)) + .toList(); + return newInstance(type, list); + } + + public static T newInstance(Class type, List, Object>> initArgs) throws NoSuchMethodException, InvocationTargetException{ + constructors: + for (var c : type.getDeclaredConstructors()) { + var types = c.getParameterTypes(); + for (int i = 0; i < types.length; i++) { + if (!types[i].isAssignableFrom(initArgs.get(i).getA())) + continue constructors; + } + + c.setAccessible(true); + try { + return (T) c.newInstance(initArgs); + } catch (InstantiationException | IllegalAccessException e) { + throw new InvocationTargetException(e); + } + } + + var constructors = Arrays.stream(type.getDeclaredConstructors()) + .map(Constructor::toGenericString) + .collect(Collectors.joining("\n")); + throw new NoSuchMethodException("No matching constructor found in:\n" + constructors); + } +} diff --git a/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/MemoryWorld.java b/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/MemoryWorld.java index b786e9c0b..7aebf7d5f 100644 --- a/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/MemoryWorld.java +++ b/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/MemoryWorld.java @@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableList; import com.mojang.serialization.Lifecycle; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.IMemoryWorld; +import com.volmit.iris.util.reflect.Reflect; import com.volmit.iris.util.scheduling.J; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; @@ -104,21 +105,9 @@ public class MemoryWorld implements IMemoryWorld { worldInfo = new CraftWorldInfo(worldData, access, creator.environment(), levelStem.typeHolder().value()); } catch (Throwable e) { try { - var c = CraftWorldInfo.class.getDeclaredConstructor( - ServerLevelData.class, - LevelStorageSource.LevelStorageAccess.class, - World.Environment.class, - DimensionType.class, - net.minecraft.world.level.chunk.ChunkGenerator.class, - RegistryAccess.Frozen.class); - - worldInfo = c.newInstance(worldData, access, creator.environment(), levelStem.typeHolder().value(), levelStem.generator(), server.registryAccess()); - } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | - IllegalAccessException ex) { - var constructors = Arrays.stream(CraftWorldInfo.class.getDeclaredConstructors()) - .map(Constructor::toGenericString) - .collect(Collectors.joining("\n")); - throw new IOException("Failed to find CraftWorldInfo constructor found: " + constructors, ex); + worldInfo = Reflect.newInstance(CraftWorldInfo.class, worldData, access, creator.environment(), levelStem.typeHolder().value(), levelStem.generator(), server.registryAccess()); + } catch (NoSuchMethodException | InvocationTargetException ex) { + throw new IOException("Failed to create CraftWorldInfo", ex); } } if (biomeProvider == null && generator != null) { diff --git a/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/MemoryWorld.java b/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/MemoryWorld.java index 769056d66..aadf4c462 100644 --- a/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/MemoryWorld.java +++ b/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/MemoryWorld.java @@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableList; import com.mojang.serialization.Lifecycle; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.IMemoryWorld; +import com.volmit.iris.util.reflect.Reflect; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; import net.minecraft.core.registries.Registries; @@ -110,21 +111,9 @@ public class MemoryWorld implements IMemoryWorld { worldInfo = new CraftWorldInfo(worldData, access, creator.environment(), levelStem.type().value()); } catch (Throwable e) { try { - var c = CraftWorldInfo.class.getDeclaredConstructor( - ServerLevelData.class, - LevelStorageSource.LevelStorageAccess.class, - World.Environment.class, - DimensionType.class, - net.minecraft.world.level.chunk.ChunkGenerator.class, - RegistryAccess.Frozen.class); - - worldInfo = c.newInstance(worldData, access, creator.environment(), levelStem.type().value(), levelStem.generator(), server.registryAccess()); - } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | - IllegalAccessException ex) { - var constructors = Arrays.stream(CraftWorldInfo.class.getDeclaredConstructors()) - .map(Constructor::toGenericString) - .collect(Collectors.joining("\n")); - throw new IOException("Failed to find CraftWorldInfo constructor found: " + constructors, ex); + worldInfo = Reflect.newInstance(CraftWorldInfo.class, worldData, access, creator.environment(), levelStem.type().value(), levelStem.generator(), server.registryAccess()); + } catch (NoSuchMethodException | InvocationTargetException ex) { + throw new IOException("Failed to create CraftWorldInfo", ex); } } if (biomeProvider == null && generator != null) { diff --git a/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/MemoryWorld.java b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/MemoryWorld.java index 68b5bf12f..939ea680c 100644 --- a/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/MemoryWorld.java +++ b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/MemoryWorld.java @@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableList; import com.mojang.serialization.Lifecycle; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.IMemoryWorld; +import com.volmit.iris.util.reflect.Reflect; import com.volmit.iris.util.scheduling.J; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; @@ -112,21 +113,9 @@ public class MemoryWorld implements IMemoryWorld { worldInfo = new CraftWorldInfo(worldData, access, creator.environment(), levelStem.type().value()); } catch (Throwable e) { try { - var c = CraftWorldInfo.class.getDeclaredConstructor( - ServerLevelData.class, - LevelStorageSource.LevelStorageAccess.class, - World.Environment.class, - DimensionType.class, - net.minecraft.world.level.chunk.ChunkGenerator.class, - RegistryAccess.Frozen.class); - - worldInfo = c.newInstance(worldData, access, creator.environment(), levelStem.type().value(), levelStem.generator(), server.registryAccess()); - } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | - IllegalAccessException ex) { - var constructors = Arrays.stream(CraftWorldInfo.class.getDeclaredConstructors()) - .map(Constructor::toGenericString) - .collect(Collectors.joining("\n")); - throw new IOException("Failed to find CraftWorldInfo constructor found: " + constructors, ex); + worldInfo = Reflect.newInstance(CraftWorldInfo.class, worldData, access, creator.environment(), levelStem.type().value(), levelStem.generator(), server.registryAccess()); + } catch (NoSuchMethodException | InvocationTargetException ex) { + throw new IOException("Failed to create CraftWorldInfo", ex); } } if (biomeProvider == null && generator != null) { diff --git a/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/MemoryWorld.java b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/MemoryWorld.java index 3249a437e..1b0ff489a 100644 --- a/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/MemoryWorld.java +++ b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/MemoryWorld.java @@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableList; import com.mojang.serialization.Lifecycle; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.IMemoryWorld; +import com.volmit.iris.util.reflect.Reflect; import com.volmit.iris.util.scheduling.J; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; @@ -113,22 +114,9 @@ public class MemoryWorld implements IMemoryWorld { worldInfo = new CraftWorldInfo(worldData, access, creator.environment(), levelStem.type().value()); } catch (Throwable e) { try { - var c = CraftWorldInfo.class.getDeclaredConstructor( - ServerLevelData.class, - LevelStorageSource.LevelStorageAccess.class, - World.Environment.class, - DimensionType.class, - net.minecraft.world.level.chunk.ChunkGenerator.class, - RegistryAccess.Frozen.class); - - worldInfo = c.newInstance(worldData, access, creator.environment(), levelStem.type().value(), levelStem.generator(), server.registryAccess()); - } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | - IllegalAccessException ex) { - var constructors = Arrays.stream(CraftWorldInfo.class.getDeclaredConstructors()) - .map(Constructor::toGenericString) - .collect(Collectors.joining("\n")); - CraftAttributeInstance - throw new IOException("Failed to find CraftWorldInfo constructor found: " + constructors, ex); + worldInfo = Reflect.newInstance(CraftWorldInfo.class, worldData, access, creator.environment(), levelStem.type().value(), levelStem.generator(), server.registryAccess()); + } catch (NoSuchMethodException | InvocationTargetException ex) { + throw new IOException("Failed to create CraftWorldInfo", ex); } } if (biomeProvider == null && generator != null) { diff --git a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/MemoryWorld.java b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/MemoryWorld.java index 81f0ba35b..5d7e37762 100644 --- a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/MemoryWorld.java +++ b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/MemoryWorld.java @@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableList; import com.mojang.serialization.Lifecycle; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.IMemoryWorld; +import com.volmit.iris.util.reflect.Reflect; import com.volmit.iris.util.scheduling.J; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; @@ -112,21 +113,9 @@ public class MemoryWorld implements IMemoryWorld { worldInfo = new CraftWorldInfo(worldData, access, creator.environment(), levelStem.type().value()); } catch (Throwable e) { try { - var c = CraftWorldInfo.class.getDeclaredConstructor( - ServerLevelData.class, - LevelStorageSource.LevelStorageAccess.class, - World.Environment.class, - DimensionType.class, - net.minecraft.world.level.chunk.ChunkGenerator.class, - RegistryAccess.Frozen.class); - - worldInfo = c.newInstance(worldData, access, creator.environment(), levelStem.type().value(), levelStem.generator(), server.registryAccess()); - } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | - IllegalAccessException ex) { - var constructors = Arrays.stream(CraftWorldInfo.class.getDeclaredConstructors()) - .map(Constructor::toGenericString) - .collect(Collectors.joining("\n")); - throw new IOException("Failed to find CraftWorldInfo constructor found: " + constructors, ex); + worldInfo = Reflect.newInstance(CraftWorldInfo.class, worldData, access, creator.environment(), levelStem.type().value(), levelStem.generator(), server.registryAccess()); + } catch (NoSuchMethodException | InvocationTargetException ex) { + throw new IOException("Failed to create CraftWorldInfo", ex); } } if (biomeProvider == null && generator != null) { diff --git a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/MemoryWorld.java b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/MemoryWorld.java index c3007b488..bc149d4d7 100644 --- a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/MemoryWorld.java +++ b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/MemoryWorld.java @@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableList; import com.mojang.serialization.Lifecycle; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.IMemoryWorld; +import com.volmit.iris.util.reflect.Reflect; import com.volmit.iris.util.scheduling.J; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; @@ -65,6 +66,7 @@ import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.nio.file.Files; import java.util.Arrays; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -116,21 +118,9 @@ public class MemoryWorld implements IMemoryWorld { worldInfo = new CraftWorldInfo(worldData, access, creator.environment(), levelStem.type().value()); } catch (Throwable e) { try { - var c = CraftWorldInfo.class.getDeclaredConstructor( - ServerLevelData.class, - LevelStorageSource.LevelStorageAccess.class, - World.Environment.class, - DimensionType.class, - net.minecraft.world.level.chunk.ChunkGenerator.class, - RegistryAccess.Frozen.class); - - worldInfo = c.newInstance(worldData, access, creator.environment(), levelStem.type().value(), levelStem.generator(), server.registryAccess()); - } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | - IllegalAccessException ex) { - var constructors = Arrays.stream(CraftWorldInfo.class.getDeclaredConstructors()) - .map(Constructor::toGenericString) - .collect(Collectors.joining("\n")); - throw new IOException("Failed to find CraftWorldInfo constructor found: " + constructors, ex); + worldInfo = Reflect.newInstance(CraftWorldInfo.class, worldData, access, creator.environment(), levelStem.type().value(), levelStem.generator(), server.registryAccess()); + } catch (NoSuchMethodException | InvocationTargetException ex) { + throw new IOException("Failed to create CraftWorldInfo", ex); } } if (biomeProvider == null && generator != null) { diff --git a/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/MemoryWorld.java b/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/MemoryWorld.java index d2f4bf856..be80bad6b 100644 --- a/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/MemoryWorld.java +++ b/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/MemoryWorld.java @@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableList; import com.mojang.serialization.Lifecycle; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.IMemoryWorld; +import com.volmit.iris.util.reflect.Reflect; import com.volmit.iris.util.scheduling.J; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; @@ -114,21 +115,9 @@ public class MemoryWorld implements IMemoryWorld { worldInfo = new CraftWorldInfo(worldData, access, creator.environment(), levelStem.type().value()); } catch (Throwable e) { try { - var c = CraftWorldInfo.class.getDeclaredConstructor( - ServerLevelData.class, - LevelStorageSource.LevelStorageAccess.class, - World.Environment.class, - DimensionType.class, - net.minecraft.world.level.chunk.ChunkGenerator.class, - RegistryAccess.Frozen.class); - - worldInfo = c.newInstance(worldData, access, creator.environment(), levelStem.type().value(), levelStem.generator(), server.registryAccess()); - } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | - IllegalAccessException ex) { - var constructors = Arrays.stream(CraftWorldInfo.class.getDeclaredConstructors()) - .map(Constructor::toGenericString) - .collect(Collectors.joining("\n")); - throw new IOException("Failed to find CraftWorldInfo constructor found: " + constructors, ex); + worldInfo = Reflect.newInstance(CraftWorldInfo.class, worldData, access, creator.environment(), levelStem.type().value(), levelStem.generator(), server.registryAccess()); + } catch (NoSuchMethodException | InvocationTargetException ex) { + throw new IOException("Failed to create CraftWorldInfo", ex); } } if (biomeProvider == null && generator != null) { diff --git a/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/MemoryWorld.java b/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/MemoryWorld.java index a4e901df1..fd14be059 100644 --- a/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/MemoryWorld.java +++ b/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/MemoryWorld.java @@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableList; import com.mojang.serialization.Lifecycle; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.IMemoryWorld; +import com.volmit.iris.util.reflect.Reflect; import com.volmit.iris.util.scheduling.J; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; @@ -115,21 +116,9 @@ public class MemoryWorld implements IMemoryWorld { worldInfo = new CraftWorldInfo(worldData, access, creator.environment(), levelStem.type().value()); } catch (Throwable e) { try { - var c = CraftWorldInfo.class.getDeclaredConstructor( - ServerLevelData.class, - LevelStorageSource.LevelStorageAccess.class, - World.Environment.class, - DimensionType.class, - net.minecraft.world.level.chunk.ChunkGenerator.class, - RegistryAccess.Frozen.class); - - worldInfo = c.newInstance(worldData, access, creator.environment(), levelStem.type().value(), levelStem.generator(), server.registryAccess()); - } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | - IllegalAccessException ex) { - var constructors = Arrays.stream(CraftWorldInfo.class.getDeclaredConstructors()) - .map(Constructor::toGenericString) - .collect(Collectors.joining("\n")); - throw new IOException("Failed to find CraftWorldInfo constructor found: " + constructors, ex); + worldInfo = Reflect.newInstance(CraftWorldInfo.class, worldData, access, creator.environment(), levelStem.type().value(), levelStem.generator(), server.registryAccess()); + } catch (NoSuchMethodException | InvocationTargetException ex) { + throw new IOException("Failed to create CraftWorldInfo", ex); } } if (biomeProvider == null && generator != null) {