mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-12-27 11:09:06 +00:00
fixes to the per world dimensions + optimizations with the register method
This commit is contained in:
@@ -6,6 +6,7 @@ import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
@@ -599,8 +600,25 @@ public class NMSBinding implements INMSBinding {
|
||||
var biomeFiles = biome.listFiles(jsonFilter);
|
||||
if (biomeFiles == null) continue;
|
||||
for (File biomeFile : biomeFiles) {
|
||||
String json = null;
|
||||
int tries = 10;
|
||||
while (json == null && tries-- > 0) {
|
||||
try {
|
||||
json = IO.readAll(biomeFile);
|
||||
} catch (IOException e) {
|
||||
Iris.error("Failed to read biome " + file.getName() + ":" + biomeFile.getName() + " tries left: " + tries);
|
||||
if (tries == 0) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException ignored) {}
|
||||
}
|
||||
}
|
||||
if (json == null) continue;
|
||||
|
||||
try {
|
||||
var value = decode(net.minecraft.world.level.biome.Biome.CODEC, IO.readAll(file)).map(Holder::value).orElse(null);
|
||||
var value = decode(net.minecraft.world.level.biome.Biome.CODEC, json).map(Holder::value).orElse(null);
|
||||
register(Registry.BIOME_REGISTRY, from(file.getName(), biomeFile), value, replace);
|
||||
} catch (Throwable e) {
|
||||
Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName());
|
||||
@@ -639,28 +657,15 @@ public class NMSBinding implements INMSBinding {
|
||||
field.setAccessible(true);
|
||||
boolean frozen = field.getBoolean(registry);
|
||||
field.setBoolean(registry, false);
|
||||
Field holdersField = null;
|
||||
boolean holders = false;
|
||||
for (Field f : MappedRegistry.class.getDeclaredFields()) {
|
||||
if (!f.getGenericType().getTypeName().startsWith("java.util.Map<T, "))
|
||||
continue;
|
||||
holdersField = f;
|
||||
}
|
||||
if (holdersField != null) {
|
||||
holdersField.setAccessible(true);
|
||||
holders = holdersField.get(registry) == null;
|
||||
if (holders) holdersField.set(registry, new IdentityHashMap<>());
|
||||
}
|
||||
Field valueField = getField(Holder.Reference.class, "T");
|
||||
valueField.setAccessible(true);
|
||||
|
||||
try {
|
||||
registry.createIntrusiveHolder(value);
|
||||
registry.register(key, value, Lifecycle.stable());
|
||||
var holder = registry.register(key, value, Lifecycle.stable());
|
||||
if (frozen) valueField.set(holder, value);
|
||||
return true;
|
||||
} finally {
|
||||
field.setBoolean(registry, frozen);
|
||||
if (holders) {
|
||||
holdersField.set(registry, null);
|
||||
}
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
throw new IllegalStateException(e);
|
||||
@@ -777,20 +782,14 @@ public class NMSBinding implements INMSBinding {
|
||||
@Advice.OnMethodEnter
|
||||
static void enter(@Advice.Argument(0) MinecraftServer server, @Advice.Argument(2) LevelStorageSource.LevelStorageAccess access, @Advice.Argument(4) ResourceKey<Level> key, @Advice.Argument(value = 5, readOnly = false) LevelStem levelStem) {
|
||||
File iris = new File(access.levelDirectory.path().toFile(), "iris");
|
||||
if (!iris.exists()) return;
|
||||
if (!iris.exists() && !key.location().getPath().startsWith("iris/")) return;
|
||||
var logger = MinecraftServer.LOGGER;
|
||||
ResourceKey<DimensionType> typeKey = ResourceKey.create(Registry.DIMENSION_TYPE_REGISTRY, new ResourceLocation("iris", key.location().getPath()));
|
||||
RegistryAccess registryAccess = server.registryAccess();
|
||||
Registry<DimensionType> registry = registryAccess.registry(Registry.DIMENSION_TYPE_REGISTRY).orElse(null);
|
||||
if (registry == null) {
|
||||
logger.warn("Unable to find registry for dimension type {}", typeKey);
|
||||
return;
|
||||
}
|
||||
if (registry == null) throw new IllegalStateException("Unable to find registry for dimension type " + typeKey);
|
||||
Holder<DimensionType> holder = registry.getHolder(typeKey).orElse(null);
|
||||
if (holder == null) {
|
||||
logger.warn("Unable to find dimension type {}", typeKey);
|
||||
return;
|
||||
}
|
||||
if (holder == null) throw new IllegalStateException("Unable to find dimension type " + typeKey);
|
||||
levelStem = new LevelStem(holder, levelStem.generator());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
@@ -601,8 +602,25 @@ public class NMSBinding implements INMSBinding {
|
||||
var biomeFiles = biome.listFiles(jsonFilter);
|
||||
if (biomeFiles == null) continue;
|
||||
for (File biomeFile : biomeFiles) {
|
||||
String json = null;
|
||||
int tries = 10;
|
||||
while (json == null && tries-- > 0) {
|
||||
try {
|
||||
json = IO.readAll(biomeFile);
|
||||
} catch (IOException e) {
|
||||
Iris.error("Failed to read biome " + file.getName() + ":" + biomeFile.getName() + " tries left: " + tries);
|
||||
if (tries == 0) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException ignored) {}
|
||||
}
|
||||
}
|
||||
if (json == null) continue;
|
||||
|
||||
try {
|
||||
var value = decode(net.minecraft.world.level.biome.Biome.CODEC, IO.readAll(file)).map(Holder::value).orElse(null);
|
||||
var value = decode(net.minecraft.world.level.biome.Biome.CODEC, json).map(Holder::value).orElse(null);
|
||||
register(Registries.BIOME, from(file.getName(), biomeFile), value, replace);
|
||||
} catch (Throwable e) {
|
||||
Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName());
|
||||
@@ -641,28 +659,15 @@ public class NMSBinding implements INMSBinding {
|
||||
field.setAccessible(true);
|
||||
boolean frozen = field.getBoolean(registry);
|
||||
field.setBoolean(registry, false);
|
||||
Field holdersField = null;
|
||||
boolean holders = false;
|
||||
for (Field f : MappedRegistry.class.getDeclaredFields()) {
|
||||
if (!f.getGenericType().getTypeName().startsWith("java.util.Map<T, "))
|
||||
continue;
|
||||
holdersField = f;
|
||||
}
|
||||
if (holdersField != null) {
|
||||
holdersField.setAccessible(true);
|
||||
holders = holdersField.get(registry) == null;
|
||||
if (holders) holdersField.set(registry, new IdentityHashMap<>());
|
||||
}
|
||||
Field valueField = getField(Holder.Reference.class, "T");
|
||||
valueField.setAccessible(true);
|
||||
|
||||
try {
|
||||
registry.createIntrusiveHolder(value);
|
||||
registry.register(key, value, Lifecycle.stable());
|
||||
var holder = registry.register(key, value, Lifecycle.stable());
|
||||
if (frozen) valueField.set(holder, value);
|
||||
return true;
|
||||
} finally {
|
||||
field.setBoolean(registry, frozen);
|
||||
if (holders) {
|
||||
holdersField.set(registry, null);
|
||||
}
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
throw new IllegalStateException(e);
|
||||
@@ -778,20 +783,13 @@ public class NMSBinding implements INMSBinding {
|
||||
@Advice.OnMethodEnter
|
||||
static void enter(@Advice.Argument(0) MinecraftServer server, @Advice.Argument(2) LevelStorageSource.LevelStorageAccess access, @Advice.Argument(4) ResourceKey<Level> key, @Advice.Argument(value = 5, readOnly = false) LevelStem levelStem) {
|
||||
File iris = new File(access.levelDirectory.path().toFile(), "iris");
|
||||
if (!iris.exists()) return;
|
||||
var logger = MinecraftServer.LOGGER;
|
||||
if (!iris.exists() && !key.location().getPath().startsWith("iris/")) return;
|
||||
ResourceKey<DimensionType> typeKey = ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()));
|
||||
RegistryAccess registryAccess = server.registryAccess();
|
||||
Registry<DimensionType> registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null);
|
||||
if (registry == null) {
|
||||
logger.warn("Unable to find registry for dimension type {}", typeKey);
|
||||
return;
|
||||
}
|
||||
if (registry == null) throw new IllegalStateException("Unable to find registry for dimension type " + typeKey);
|
||||
Holder<DimensionType> holder = registry.getHolder(typeKey).orElse(null);
|
||||
if (holder == null) {
|
||||
logger.warn("Unable to find dimension type {}", typeKey);
|
||||
return;
|
||||
}
|
||||
if (holder == null) throw new IllegalStateException("Unable to find dimension type " + typeKey);
|
||||
levelStem = new LevelStem(holder, levelStem.generator());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
@@ -605,8 +606,25 @@ public class NMSBinding implements INMSBinding {
|
||||
var biomeFiles = biome.listFiles(jsonFilter);
|
||||
if (biomeFiles == null) continue;
|
||||
for (File biomeFile : biomeFiles) {
|
||||
String json = null;
|
||||
int tries = 10;
|
||||
while (json == null && tries-- > 0) {
|
||||
try {
|
||||
json = IO.readAll(biomeFile);
|
||||
} catch (IOException e) {
|
||||
Iris.error("Failed to read biome " + file.getName() + ":" + biomeFile.getName() + " tries left: " + tries);
|
||||
if (tries == 0) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException ignored) {}
|
||||
}
|
||||
}
|
||||
if (json == null) continue;
|
||||
|
||||
try {
|
||||
var value = decode(net.minecraft.world.level.biome.Biome.CODEC, IO.readAll(file)).map(Holder::value).orElse(null);
|
||||
var value = decode(net.minecraft.world.level.biome.Biome.CODEC, json).map(Holder::value).orElse(null);
|
||||
register(Registries.BIOME, from(file.getName(), biomeFile), value, replace);
|
||||
} catch (Throwable e) {
|
||||
Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName());
|
||||
@@ -645,28 +663,15 @@ public class NMSBinding implements INMSBinding {
|
||||
field.setAccessible(true);
|
||||
boolean frozen = field.getBoolean(registry);
|
||||
field.setBoolean(registry, false);
|
||||
Field holdersField = null;
|
||||
boolean holders = false;
|
||||
for (Field f : MappedRegistry.class.getDeclaredFields()) {
|
||||
if (!f.getGenericType().getTypeName().startsWith("java.util.Map<T, "))
|
||||
continue;
|
||||
holdersField = f;
|
||||
}
|
||||
if (holdersField != null) {
|
||||
holdersField.setAccessible(true);
|
||||
holders = holdersField.get(registry) == null;
|
||||
if (holders) holdersField.set(registry, new IdentityHashMap<>());
|
||||
}
|
||||
Field valueField = getField(Holder.Reference.class, "T");
|
||||
valueField.setAccessible(true);
|
||||
|
||||
try {
|
||||
registry.createIntrusiveHolder(value);
|
||||
registry.register(key, value, Lifecycle.stable());
|
||||
var holder = registry.register(key, value, Lifecycle.stable());
|
||||
if (frozen) valueField.set(holder, value);
|
||||
return true;
|
||||
} finally {
|
||||
field.setBoolean(registry, frozen);
|
||||
if (holders) {
|
||||
holdersField.set(registry, null);
|
||||
}
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
throw new IllegalStateException(e);
|
||||
@@ -782,20 +787,13 @@ public class NMSBinding implements INMSBinding {
|
||||
@Advice.OnMethodEnter
|
||||
static void enter(@Advice.Argument(0) MinecraftServer server, @Advice.Argument(2) LevelStorageSource.LevelStorageAccess access, @Advice.Argument(4) ResourceKey<Level> key, @Advice.Argument(value = 5, readOnly = false) LevelStem levelStem) {
|
||||
File iris = new File(access.levelDirectory.path().toFile(), "iris");
|
||||
if (!iris.exists()) return;
|
||||
var logger = MinecraftServer.LOGGER;
|
||||
if (!iris.exists() && !key.location().getPath().startsWith("iris/")) return;
|
||||
ResourceKey<DimensionType> typeKey = ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()));
|
||||
RegistryAccess registryAccess = server.registryAccess();
|
||||
Registry<DimensionType> registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null);
|
||||
if (registry == null) {
|
||||
logger.warn("Unable to find registry for dimension type {}", typeKey);
|
||||
return;
|
||||
}
|
||||
if (registry == null) throw new IllegalStateException("Unable to find registry for dimension type " + typeKey);
|
||||
Holder<DimensionType> holder = registry.getHolder(typeKey).orElse(null);
|
||||
if (holder == null) {
|
||||
logger.warn("Unable to find dimension type {}", typeKey);
|
||||
return;
|
||||
}
|
||||
if (holder == null) throw new IllegalStateException("Unable to find dimension type " + typeKey);
|
||||
levelStem = new LevelStem(holder, levelStem.generator());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,6 +88,7 @@ import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
@@ -592,8 +593,25 @@ public class NMSBinding implements INMSBinding {
|
||||
var biomeFiles = biome.listFiles(jsonFilter);
|
||||
if (biomeFiles == null) continue;
|
||||
for (File biomeFile : biomeFiles) {
|
||||
String json = null;
|
||||
int tries = 10;
|
||||
while (json == null && tries-- > 0) {
|
||||
try {
|
||||
json = IO.readAll(biomeFile);
|
||||
} catch (IOException e) {
|
||||
Iris.error("Failed to read biome " + file.getName() + ":" + biomeFile.getName() + " tries left: " + tries);
|
||||
if (tries == 0) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException ignored) {}
|
||||
}
|
||||
}
|
||||
if (json == null) continue;
|
||||
|
||||
try {
|
||||
var value = decode(net.minecraft.world.level.biome.Biome.CODEC, IO.readAll(file)).map(Holder::value).orElse(null);
|
||||
var value = decode(net.minecraft.world.level.biome.Biome.CODEC, json).map(Holder::value).orElse(null);
|
||||
register(Registries.BIOME, from(file.getName(), biomeFile), value, replace);
|
||||
} catch (Throwable e) {
|
||||
Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName());
|
||||
@@ -632,28 +650,15 @@ public class NMSBinding implements INMSBinding {
|
||||
field.setAccessible(true);
|
||||
boolean frozen = field.getBoolean(registry);
|
||||
field.setBoolean(registry, false);
|
||||
Field holdersField = null;
|
||||
boolean holders = false;
|
||||
for (Field f : MappedRegistry.class.getDeclaredFields()) {
|
||||
if (!f.getGenericType().getTypeName().startsWith("java.util.Map<T, "))
|
||||
continue;
|
||||
holdersField = f;
|
||||
}
|
||||
if (holdersField != null) {
|
||||
holdersField.setAccessible(true);
|
||||
holders = holdersField.get(registry) == null;
|
||||
if (holders) holdersField.set(registry, new IdentityHashMap<>());
|
||||
}
|
||||
Field valueField = getField(Holder.Reference.class, "T");
|
||||
valueField.setAccessible(true);
|
||||
|
||||
try {
|
||||
registry.createIntrusiveHolder(value);
|
||||
registry.register(key, value, Lifecycle.stable());
|
||||
var holder = registry.register(key, value, Lifecycle.stable());
|
||||
if (frozen) valueField.set(holder, value);
|
||||
return true;
|
||||
} finally {
|
||||
field.setBoolean(registry, frozen);
|
||||
if (holders) {
|
||||
holdersField.set(registry, null);
|
||||
}
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
throw new IllegalStateException(e);
|
||||
@@ -782,20 +787,13 @@ public class NMSBinding implements INMSBinding {
|
||||
@Advice.OnMethodEnter
|
||||
static void enter(@Advice.Argument(0) MinecraftServer server, @Advice.Argument(2) LevelStorageSource.LevelStorageAccess access, @Advice.Argument(4) ResourceKey<Level> key, @Advice.Argument(value = 5, readOnly = false) LevelStem levelStem) {
|
||||
File iris = new File(access.levelDirectory.path().toFile(), "iris");
|
||||
if (!iris.exists()) return;
|
||||
var logger = MinecraftServer.LOGGER;
|
||||
if (!iris.exists() && !key.location().getPath().startsWith("iris/")) return;
|
||||
ResourceKey<DimensionType> typeKey = ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()));
|
||||
RegistryAccess registryAccess = server.registryAccess();
|
||||
Registry<DimensionType> registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null);
|
||||
if (registry == null) {
|
||||
logger.warn("Unable to find registry for dimension type {}", typeKey);
|
||||
return;
|
||||
}
|
||||
if (registry == null) throw new IllegalStateException("Unable to find registry for dimension type " + typeKey);
|
||||
Holder<DimensionType> holder = registry.getHolder(typeKey).orElse(null);
|
||||
if (holder == null) {
|
||||
logger.warn("Unable to find dimension type {}", typeKey);
|
||||
return;
|
||||
}
|
||||
if (holder == null) throw new IllegalStateException("Unable to find dimension type " + typeKey);
|
||||
levelStem = new LevelStem(holder, levelStem.generator());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
@@ -602,8 +603,25 @@ public class NMSBinding implements INMSBinding {
|
||||
var biomeFiles = biome.listFiles(jsonFilter);
|
||||
if (biomeFiles == null) continue;
|
||||
for (File biomeFile : biomeFiles) {
|
||||
String json = null;
|
||||
int tries = 10;
|
||||
while (json == null && tries-- > 0) {
|
||||
try {
|
||||
json = IO.readAll(biomeFile);
|
||||
} catch (IOException e) {
|
||||
Iris.error("Failed to read biome " + file.getName() + ":" + biomeFile.getName() + " tries left: " + tries);
|
||||
if (tries == 0) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException ignored) {}
|
||||
}
|
||||
}
|
||||
if (json == null) continue;
|
||||
|
||||
try {
|
||||
var value = decode(net.minecraft.world.level.biome.Biome.CODEC, IO.readAll(file)).map(Holder::value).orElse(null);
|
||||
var value = decode(net.minecraft.world.level.biome.Biome.CODEC, json).map(Holder::value).orElse(null);
|
||||
register(Registries.BIOME, from(file.getName(), biomeFile), value, replace);
|
||||
} catch (Throwable e) {
|
||||
Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName());
|
||||
@@ -642,28 +660,15 @@ public class NMSBinding implements INMSBinding {
|
||||
field.setAccessible(true);
|
||||
boolean frozen = field.getBoolean(registry);
|
||||
field.setBoolean(registry, false);
|
||||
Field holdersField = null;
|
||||
boolean holders = false;
|
||||
for (Field f : MappedRegistry.class.getDeclaredFields()) {
|
||||
if (!f.getGenericType().getTypeName().startsWith("java.util.Map<T, "))
|
||||
continue;
|
||||
holdersField = f;
|
||||
}
|
||||
if (holdersField != null) {
|
||||
holdersField.setAccessible(true);
|
||||
holders = holdersField.get(registry) == null;
|
||||
if (holders) holdersField.set(registry, new IdentityHashMap<>());
|
||||
}
|
||||
Field valueField = getField(Holder.Reference.class, "T");
|
||||
valueField.setAccessible(true);
|
||||
|
||||
try {
|
||||
registry.createIntrusiveHolder(value);
|
||||
registry.register(key, value, Lifecycle.stable());
|
||||
var holder = registry.register(key, value, Lifecycle.stable());
|
||||
if (frozen) valueField.set(holder, value);
|
||||
return true;
|
||||
} finally {
|
||||
field.setBoolean(registry, frozen);
|
||||
if (holders) {
|
||||
holdersField.set(registry, null);
|
||||
}
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
throw new IllegalStateException(e);
|
||||
@@ -784,20 +789,13 @@ public class NMSBinding implements INMSBinding {
|
||||
@Advice.OnMethodEnter
|
||||
static void enter(@Advice.Argument(0) MinecraftServer server, @Advice.Argument(2) LevelStorageSource.LevelStorageAccess access, @Advice.Argument(4) ResourceKey<Level> key, @Advice.Argument(value = 5, readOnly = false) LevelStem levelStem) {
|
||||
File iris = new File(access.levelDirectory.path().toFile(), "iris");
|
||||
if (!iris.exists()) return;
|
||||
var logger = MinecraftServer.LOGGER;
|
||||
if (!iris.exists() && !key.location().getPath().startsWith("iris/")) return;
|
||||
ResourceKey<DimensionType> typeKey = ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()));
|
||||
RegistryAccess registryAccess = server.registryAccess();
|
||||
Registry<DimensionType> registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null);
|
||||
if (registry == null) {
|
||||
logger.warn("Unable to find registry for dimension type {}", typeKey);
|
||||
return;
|
||||
}
|
||||
if (registry == null) throw new IllegalStateException("Unable to find registry for dimension type " + typeKey);
|
||||
Holder<DimensionType> holder = registry.getHolder(typeKey).orElse(null);
|
||||
if (holder == null) {
|
||||
logger.warn("Unable to find dimension type {}", typeKey);
|
||||
return;
|
||||
}
|
||||
if (holder == null) throw new IllegalStateException("Unable to find dimension type " + typeKey);
|
||||
levelStem = new LevelStem(holder, levelStem.generator());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,21 +7,15 @@ import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.io.IOException;
|
||||
import java.lang.instrument.ClassFileTransformer;
|
||||
import java.lang.instrument.Instrumentation;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.nio.file.Files;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.base.Supplier;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonNull;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.mojang.datafixers.util.Pair;
|
||||
import com.mojang.serialization.Codec;
|
||||
@@ -29,27 +23,19 @@ import com.mojang.serialization.JsonOps;
|
||||
import com.mojang.serialization.Lifecycle;
|
||||
import com.volmit.iris.engine.object.IrisDimension;
|
||||
import com.volmit.iris.util.format.C;
|
||||
import com.volmit.iris.util.function.NastySupplier;
|
||||
import com.volmit.iris.util.io.IO;
|
||||
import it.unimi.dsi.fastutil.objects.Reference2IntMap;
|
||||
import net.bytebuddy.ByteBuddy;
|
||||
import net.bytebuddy.agent.builder.AgentBuilder;
|
||||
import net.bytebuddy.asm.Advice;
|
||||
import net.bytebuddy.description.type.TypeDescription;
|
||||
import net.bytebuddy.dynamic.DynamicType;
|
||||
import net.bytebuddy.dynamic.loading.ClassReloadingStrategy;
|
||||
import net.bytebuddy.matcher.ElementMatchers;
|
||||
import net.bytebuddy.utility.JavaModule;
|
||||
import net.minecraft.core.IdMapper;
|
||||
import net.minecraft.core.MappedRegistry;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.level.progress.ChunkProgressListener;
|
||||
import net.minecraft.util.GsonHelper;
|
||||
import net.minecraft.util.worldupdate.WorldUpgrader;
|
||||
import net.minecraft.world.RandomSequences;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.LevelAccessor;
|
||||
import net.minecraft.world.level.LevelHeightAccessor;
|
||||
import net.minecraft.world.level.dimension.DimensionType;
|
||||
import net.minecraft.world.level.dimension.LevelStem;
|
||||
import net.minecraft.world.level.storage.LevelStorageSource;
|
||||
@@ -615,8 +601,25 @@ public class NMSBinding implements INMSBinding {
|
||||
var biomeFiles = biome.listFiles(jsonFilter);
|
||||
if (biomeFiles == null) continue;
|
||||
for (File biomeFile : biomeFiles) {
|
||||
String json = null;
|
||||
int tries = 10;
|
||||
while (json == null && tries-- > 0) {
|
||||
try {
|
||||
json = IO.readAll(biomeFile);
|
||||
} catch (IOException e) {
|
||||
Iris.error("Failed to read biome " + file.getName() + ":" + biomeFile.getName() + " tries left: " + tries);
|
||||
if (tries == 0) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException ignored) {}
|
||||
}
|
||||
}
|
||||
if (json == null) continue;
|
||||
|
||||
try {
|
||||
var value = decode(net.minecraft.world.level.biome.Biome.CODEC, IO.readAll(file)).map(Holder::value).orElse(null);
|
||||
var value = decode(net.minecraft.world.level.biome.Biome.CODEC, json).map(Holder::value).orElse(null);
|
||||
register(Registries.BIOME, from(file.getName(), biomeFile), value, replace);
|
||||
} catch (Throwable e) {
|
||||
Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName());
|
||||
@@ -655,28 +658,15 @@ public class NMSBinding implements INMSBinding {
|
||||
field.setAccessible(true);
|
||||
boolean frozen = field.getBoolean(registry);
|
||||
field.setBoolean(registry, false);
|
||||
Field holdersField = null;
|
||||
boolean holders = false;
|
||||
for (Field f : MappedRegistry.class.getDeclaredFields()) {
|
||||
if (!f.getGenericType().getTypeName().startsWith("java.util.Map<T, "))
|
||||
continue;
|
||||
holdersField = f;
|
||||
}
|
||||
if (holdersField != null) {
|
||||
holdersField.setAccessible(true);
|
||||
holders = holdersField.get(registry) == null;
|
||||
if (holders) holdersField.set(registry, new IdentityHashMap<>());
|
||||
}
|
||||
Field valueField = getField(Holder.Reference.class, "T");
|
||||
valueField.setAccessible(true);
|
||||
|
||||
try {
|
||||
registry.createIntrusiveHolder(value);
|
||||
registry.register(key, value, Lifecycle.stable());
|
||||
var holder = registry.register(key, value, Lifecycle.stable());
|
||||
if (frozen) valueField.set(holder, value);
|
||||
return true;
|
||||
} finally {
|
||||
field.setBoolean(registry, frozen);
|
||||
if (holders) {
|
||||
holdersField.set(registry, null);
|
||||
}
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
throw new IllegalStateException(e);
|
||||
@@ -796,20 +786,13 @@ public class NMSBinding implements INMSBinding {
|
||||
@Advice.OnMethodEnter
|
||||
static void enter(@Advice.Argument(0) MinecraftServer server, @Advice.Argument(2) LevelStorageSource.LevelStorageAccess access, @Advice.Argument(4) ResourceKey<Level> key, @Advice.Argument(value = 5, readOnly = false) LevelStem levelStem) {
|
||||
File iris = new File(access.levelDirectory.path().toFile(), "iris");
|
||||
if (!iris.exists()) return;
|
||||
var logger = MinecraftServer.LOGGER;
|
||||
if (!iris.exists() && !key.location().getPath().startsWith("iris/")) return;
|
||||
ResourceKey<DimensionType> typeKey = ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()));
|
||||
RegistryAccess registryAccess = server.registryAccess();
|
||||
Registry<DimensionType> registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null);
|
||||
if (registry == null) {
|
||||
logger.warn("Unable to find registry for dimension type {}", typeKey);
|
||||
return;
|
||||
}
|
||||
if (registry == null) throw new IllegalStateException("Unable to find registry for dimension type " + typeKey);
|
||||
Holder<DimensionType> holder = registry.getHolder(typeKey).orElse(null);
|
||||
if (holder == null) {
|
||||
logger.warn("Unable to find dimension type {}", typeKey);
|
||||
return;
|
||||
}
|
||||
if (holder == null) throw new IllegalStateException("Unable to find dimension type " + typeKey);
|
||||
levelStem = new LevelStem(holder, levelStem.generator());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user