mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2026-04-23 00:20:42 +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.DataOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FilenameFilter;
|
import java.io.FilenameFilter;
|
||||||
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
@@ -599,8 +600,25 @@ public class NMSBinding implements INMSBinding {
|
|||||||
var biomeFiles = biome.listFiles(jsonFilter);
|
var biomeFiles = biome.listFiles(jsonFilter);
|
||||||
if (biomeFiles == null) continue;
|
if (biomeFiles == null) continue;
|
||||||
for (File biomeFile : biomeFiles) {
|
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 {
|
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);
|
register(Registry.BIOME_REGISTRY, from(file.getName(), biomeFile), value, replace);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName());
|
Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName());
|
||||||
@@ -639,28 +657,15 @@ public class NMSBinding implements INMSBinding {
|
|||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
boolean frozen = field.getBoolean(registry);
|
boolean frozen = field.getBoolean(registry);
|
||||||
field.setBoolean(registry, false);
|
field.setBoolean(registry, false);
|
||||||
Field holdersField = null;
|
Field valueField = getField(Holder.Reference.class, "T");
|
||||||
boolean holders = false;
|
valueField.setAccessible(true);
|
||||||
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<>());
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
registry.createIntrusiveHolder(value);
|
var holder = registry.register(key, value, Lifecycle.stable());
|
||||||
registry.register(key, value, Lifecycle.stable());
|
if (frozen) valueField.set(holder, value);
|
||||||
return true;
|
return true;
|
||||||
} finally {
|
} finally {
|
||||||
field.setBoolean(registry, frozen);
|
field.setBoolean(registry, frozen);
|
||||||
if (holders) {
|
|
||||||
holdersField.set(registry, null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
throw new IllegalStateException(e);
|
throw new IllegalStateException(e);
|
||||||
@@ -777,20 +782,14 @@ public class NMSBinding implements INMSBinding {
|
|||||||
@Advice.OnMethodEnter
|
@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) {
|
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");
|
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;
|
var logger = MinecraftServer.LOGGER;
|
||||||
ResourceKey<DimensionType> typeKey = ResourceKey.create(Registry.DIMENSION_TYPE_REGISTRY, new ResourceLocation("iris", key.location().getPath()));
|
ResourceKey<DimensionType> typeKey = ResourceKey.create(Registry.DIMENSION_TYPE_REGISTRY, new ResourceLocation("iris", key.location().getPath()));
|
||||||
RegistryAccess registryAccess = server.registryAccess();
|
RegistryAccess registryAccess = server.registryAccess();
|
||||||
Registry<DimensionType> registry = registryAccess.registry(Registry.DIMENSION_TYPE_REGISTRY).orElse(null);
|
Registry<DimensionType> registry = registryAccess.registry(Registry.DIMENSION_TYPE_REGISTRY).orElse(null);
|
||||||
if (registry == null) {
|
if (registry == null) throw new IllegalStateException("Unable to find registry for dimension type " + typeKey);
|
||||||
logger.warn("Unable to find registry for dimension type {}", typeKey);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Holder<DimensionType> holder = registry.getHolder(typeKey).orElse(null);
|
Holder<DimensionType> holder = registry.getHolder(typeKey).orElse(null);
|
||||||
if (holder == null) {
|
if (holder == null) throw new IllegalStateException("Unable to find dimension type " + typeKey);
|
||||||
logger.warn("Unable to find dimension type {}", typeKey);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
levelStem = new LevelStem(holder, levelStem.generator());
|
levelStem = new LevelStem(holder, levelStem.generator());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import java.io.DataInputStream;
|
|||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FilenameFilter;
|
import java.io.FilenameFilter;
|
||||||
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
@@ -601,8 +602,25 @@ public class NMSBinding implements INMSBinding {
|
|||||||
var biomeFiles = biome.listFiles(jsonFilter);
|
var biomeFiles = biome.listFiles(jsonFilter);
|
||||||
if (biomeFiles == null) continue;
|
if (biomeFiles == null) continue;
|
||||||
for (File biomeFile : biomeFiles) {
|
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 {
|
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);
|
register(Registries.BIOME, from(file.getName(), biomeFile), value, replace);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName());
|
Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName());
|
||||||
@@ -641,28 +659,15 @@ public class NMSBinding implements INMSBinding {
|
|||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
boolean frozen = field.getBoolean(registry);
|
boolean frozen = field.getBoolean(registry);
|
||||||
field.setBoolean(registry, false);
|
field.setBoolean(registry, false);
|
||||||
Field holdersField = null;
|
Field valueField = getField(Holder.Reference.class, "T");
|
||||||
boolean holders = false;
|
valueField.setAccessible(true);
|
||||||
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<>());
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
registry.createIntrusiveHolder(value);
|
var holder = registry.register(key, value, Lifecycle.stable());
|
||||||
registry.register(key, value, Lifecycle.stable());
|
if (frozen) valueField.set(holder, value);
|
||||||
return true;
|
return true;
|
||||||
} finally {
|
} finally {
|
||||||
field.setBoolean(registry, frozen);
|
field.setBoolean(registry, frozen);
|
||||||
if (holders) {
|
|
||||||
holdersField.set(registry, null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
throw new IllegalStateException(e);
|
throw new IllegalStateException(e);
|
||||||
@@ -778,20 +783,13 @@ public class NMSBinding implements INMSBinding {
|
|||||||
@Advice.OnMethodEnter
|
@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) {
|
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");
|
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(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()));
|
ResourceKey<DimensionType> typeKey = ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()));
|
||||||
RegistryAccess registryAccess = server.registryAccess();
|
RegistryAccess registryAccess = server.registryAccess();
|
||||||
Registry<DimensionType> registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null);
|
Registry<DimensionType> registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null);
|
||||||
if (registry == null) {
|
if (registry == null) throw new IllegalStateException("Unable to find registry for dimension type " + typeKey);
|
||||||
logger.warn("Unable to find registry for dimension type {}", typeKey);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Holder<DimensionType> holder = registry.getHolder(typeKey).orElse(null);
|
Holder<DimensionType> holder = registry.getHolder(typeKey).orElse(null);
|
||||||
if (holder == null) {
|
if (holder == null) throw new IllegalStateException("Unable to find dimension type " + typeKey);
|
||||||
logger.warn("Unable to find dimension type {}", typeKey);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
levelStem = new LevelStem(holder, levelStem.generator());
|
levelStem = new LevelStem(holder, levelStem.generator());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import java.io.DataInputStream;
|
|||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FilenameFilter;
|
import java.io.FilenameFilter;
|
||||||
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
@@ -605,8 +606,25 @@ public class NMSBinding implements INMSBinding {
|
|||||||
var biomeFiles = biome.listFiles(jsonFilter);
|
var biomeFiles = biome.listFiles(jsonFilter);
|
||||||
if (biomeFiles == null) continue;
|
if (biomeFiles == null) continue;
|
||||||
for (File biomeFile : biomeFiles) {
|
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 {
|
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);
|
register(Registries.BIOME, from(file.getName(), biomeFile), value, replace);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName());
|
Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName());
|
||||||
@@ -645,28 +663,15 @@ public class NMSBinding implements INMSBinding {
|
|||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
boolean frozen = field.getBoolean(registry);
|
boolean frozen = field.getBoolean(registry);
|
||||||
field.setBoolean(registry, false);
|
field.setBoolean(registry, false);
|
||||||
Field holdersField = null;
|
Field valueField = getField(Holder.Reference.class, "T");
|
||||||
boolean holders = false;
|
valueField.setAccessible(true);
|
||||||
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<>());
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
registry.createIntrusiveHolder(value);
|
var holder = registry.register(key, value, Lifecycle.stable());
|
||||||
registry.register(key, value, Lifecycle.stable());
|
if (frozen) valueField.set(holder, value);
|
||||||
return true;
|
return true;
|
||||||
} finally {
|
} finally {
|
||||||
field.setBoolean(registry, frozen);
|
field.setBoolean(registry, frozen);
|
||||||
if (holders) {
|
|
||||||
holdersField.set(registry, null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
throw new IllegalStateException(e);
|
throw new IllegalStateException(e);
|
||||||
@@ -782,20 +787,13 @@ public class NMSBinding implements INMSBinding {
|
|||||||
@Advice.OnMethodEnter
|
@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) {
|
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");
|
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(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()));
|
ResourceKey<DimensionType> typeKey = ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()));
|
||||||
RegistryAccess registryAccess = server.registryAccess();
|
RegistryAccess registryAccess = server.registryAccess();
|
||||||
Registry<DimensionType> registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null);
|
Registry<DimensionType> registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null);
|
||||||
if (registry == null) {
|
if (registry == null) throw new IllegalStateException("Unable to find registry for dimension type " + typeKey);
|
||||||
logger.warn("Unable to find registry for dimension type {}", typeKey);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Holder<DimensionType> holder = registry.getHolder(typeKey).orElse(null);
|
Holder<DimensionType> holder = registry.getHolder(typeKey).orElse(null);
|
||||||
if (holder == null) {
|
if (holder == null) throw new IllegalStateException("Unable to find dimension type " + typeKey);
|
||||||
logger.warn("Unable to find dimension type {}", typeKey);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
levelStem = new LevelStem(holder, levelStem.generator());
|
levelStem = new LevelStem(holder, levelStem.generator());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ import java.io.DataInputStream;
|
|||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FilenameFilter;
|
import java.io.FilenameFilter;
|
||||||
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
@@ -592,8 +593,25 @@ public class NMSBinding implements INMSBinding {
|
|||||||
var biomeFiles = biome.listFiles(jsonFilter);
|
var biomeFiles = biome.listFiles(jsonFilter);
|
||||||
if (biomeFiles == null) continue;
|
if (biomeFiles == null) continue;
|
||||||
for (File biomeFile : biomeFiles) {
|
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 {
|
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);
|
register(Registries.BIOME, from(file.getName(), biomeFile), value, replace);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName());
|
Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName());
|
||||||
@@ -632,28 +650,15 @@ public class NMSBinding implements INMSBinding {
|
|||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
boolean frozen = field.getBoolean(registry);
|
boolean frozen = field.getBoolean(registry);
|
||||||
field.setBoolean(registry, false);
|
field.setBoolean(registry, false);
|
||||||
Field holdersField = null;
|
Field valueField = getField(Holder.Reference.class, "T");
|
||||||
boolean holders = false;
|
valueField.setAccessible(true);
|
||||||
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<>());
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
registry.createIntrusiveHolder(value);
|
var holder = registry.register(key, value, Lifecycle.stable());
|
||||||
registry.register(key, value, Lifecycle.stable());
|
if (frozen) valueField.set(holder, value);
|
||||||
return true;
|
return true;
|
||||||
} finally {
|
} finally {
|
||||||
field.setBoolean(registry, frozen);
|
field.setBoolean(registry, frozen);
|
||||||
if (holders) {
|
|
||||||
holdersField.set(registry, null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
throw new IllegalStateException(e);
|
throw new IllegalStateException(e);
|
||||||
@@ -782,20 +787,13 @@ public class NMSBinding implements INMSBinding {
|
|||||||
@Advice.OnMethodEnter
|
@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) {
|
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");
|
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(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()));
|
ResourceKey<DimensionType> typeKey = ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()));
|
||||||
RegistryAccess registryAccess = server.registryAccess();
|
RegistryAccess registryAccess = server.registryAccess();
|
||||||
Registry<DimensionType> registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null);
|
Registry<DimensionType> registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null);
|
||||||
if (registry == null) {
|
if (registry == null) throw new IllegalStateException("Unable to find registry for dimension type " + typeKey);
|
||||||
logger.warn("Unable to find registry for dimension type {}", typeKey);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Holder<DimensionType> holder = registry.getHolder(typeKey).orElse(null);
|
Holder<DimensionType> holder = registry.getHolder(typeKey).orElse(null);
|
||||||
if (holder == null) {
|
if (holder == null) throw new IllegalStateException("Unable to find dimension type " + typeKey);
|
||||||
logger.warn("Unable to find dimension type {}", typeKey);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
levelStem = new LevelStem(holder, levelStem.generator());
|
levelStem = new LevelStem(holder, levelStem.generator());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import java.io.DataInputStream;
|
|||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FilenameFilter;
|
import java.io.FilenameFilter;
|
||||||
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
@@ -602,8 +603,25 @@ public class NMSBinding implements INMSBinding {
|
|||||||
var biomeFiles = biome.listFiles(jsonFilter);
|
var biomeFiles = biome.listFiles(jsonFilter);
|
||||||
if (biomeFiles == null) continue;
|
if (biomeFiles == null) continue;
|
||||||
for (File biomeFile : biomeFiles) {
|
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 {
|
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);
|
register(Registries.BIOME, from(file.getName(), biomeFile), value, replace);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName());
|
Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName());
|
||||||
@@ -642,28 +660,15 @@ public class NMSBinding implements INMSBinding {
|
|||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
boolean frozen = field.getBoolean(registry);
|
boolean frozen = field.getBoolean(registry);
|
||||||
field.setBoolean(registry, false);
|
field.setBoolean(registry, false);
|
||||||
Field holdersField = null;
|
Field valueField = getField(Holder.Reference.class, "T");
|
||||||
boolean holders = false;
|
valueField.setAccessible(true);
|
||||||
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<>());
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
registry.createIntrusiveHolder(value);
|
var holder = registry.register(key, value, Lifecycle.stable());
|
||||||
registry.register(key, value, Lifecycle.stable());
|
if (frozen) valueField.set(holder, value);
|
||||||
return true;
|
return true;
|
||||||
} finally {
|
} finally {
|
||||||
field.setBoolean(registry, frozen);
|
field.setBoolean(registry, frozen);
|
||||||
if (holders) {
|
|
||||||
holdersField.set(registry, null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
throw new IllegalStateException(e);
|
throw new IllegalStateException(e);
|
||||||
@@ -784,20 +789,13 @@ public class NMSBinding implements INMSBinding {
|
|||||||
@Advice.OnMethodEnter
|
@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) {
|
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");
|
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(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()));
|
ResourceKey<DimensionType> typeKey = ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()));
|
||||||
RegistryAccess registryAccess = server.registryAccess();
|
RegistryAccess registryAccess = server.registryAccess();
|
||||||
Registry<DimensionType> registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null);
|
Registry<DimensionType> registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null);
|
||||||
if (registry == null) {
|
if (registry == null) throw new IllegalStateException("Unable to find registry for dimension type " + typeKey);
|
||||||
logger.warn("Unable to find registry for dimension type {}", typeKey);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Holder<DimensionType> holder = registry.getHolder(typeKey).orElse(null);
|
Holder<DimensionType> holder = registry.getHolder(typeKey).orElse(null);
|
||||||
if (holder == null) {
|
if (holder == null) throw new IllegalStateException("Unable to find dimension type " + typeKey);
|
||||||
logger.warn("Unable to find dimension type {}", typeKey);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
levelStem = new LevelStem(holder, levelStem.generator());
|
levelStem = new LevelStem(holder, levelStem.generator());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,21 +7,15 @@ import java.io.DataOutputStream;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FilenameFilter;
|
import java.io.FilenameFilter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.instrument.ClassFileTransformer;
|
|
||||||
import java.lang.instrument.Instrumentation;
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import com.google.common.base.Supplier;
|
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonNull;
|
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import com.mojang.datafixers.util.Pair;
|
import com.mojang.datafixers.util.Pair;
|
||||||
import com.mojang.serialization.Codec;
|
import com.mojang.serialization.Codec;
|
||||||
@@ -29,27 +23,19 @@ import com.mojang.serialization.JsonOps;
|
|||||||
import com.mojang.serialization.Lifecycle;
|
import com.mojang.serialization.Lifecycle;
|
||||||
import com.volmit.iris.engine.object.IrisDimension;
|
import com.volmit.iris.engine.object.IrisDimension;
|
||||||
import com.volmit.iris.util.format.C;
|
import com.volmit.iris.util.format.C;
|
||||||
import com.volmit.iris.util.function.NastySupplier;
|
|
||||||
import com.volmit.iris.util.io.IO;
|
import com.volmit.iris.util.io.IO;
|
||||||
import it.unimi.dsi.fastutil.objects.Reference2IntMap;
|
import it.unimi.dsi.fastutil.objects.Reference2IntMap;
|
||||||
import net.bytebuddy.ByteBuddy;
|
import net.bytebuddy.ByteBuddy;
|
||||||
import net.bytebuddy.agent.builder.AgentBuilder;
|
|
||||||
import net.bytebuddy.asm.Advice;
|
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.dynamic.loading.ClassReloadingStrategy;
|
||||||
import net.bytebuddy.matcher.ElementMatchers;
|
import net.bytebuddy.matcher.ElementMatchers;
|
||||||
import net.bytebuddy.utility.JavaModule;
|
|
||||||
import net.minecraft.core.IdMapper;
|
import net.minecraft.core.IdMapper;
|
||||||
import net.minecraft.core.MappedRegistry;
|
import net.minecraft.core.MappedRegistry;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
import net.minecraft.server.level.progress.ChunkProgressListener;
|
import net.minecraft.server.level.progress.ChunkProgressListener;
|
||||||
import net.minecraft.util.GsonHelper;
|
import net.minecraft.util.GsonHelper;
|
||||||
import net.minecraft.util.worldupdate.WorldUpgrader;
|
|
||||||
import net.minecraft.world.RandomSequences;
|
import net.minecraft.world.RandomSequences;
|
||||||
import net.minecraft.world.level.Level;
|
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.DimensionType;
|
||||||
import net.minecraft.world.level.dimension.LevelStem;
|
import net.minecraft.world.level.dimension.LevelStem;
|
||||||
import net.minecraft.world.level.storage.LevelStorageSource;
|
import net.minecraft.world.level.storage.LevelStorageSource;
|
||||||
@@ -615,8 +601,25 @@ public class NMSBinding implements INMSBinding {
|
|||||||
var biomeFiles = biome.listFiles(jsonFilter);
|
var biomeFiles = biome.listFiles(jsonFilter);
|
||||||
if (biomeFiles == null) continue;
|
if (biomeFiles == null) continue;
|
||||||
for (File biomeFile : biomeFiles) {
|
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 {
|
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);
|
register(Registries.BIOME, from(file.getName(), biomeFile), value, replace);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName());
|
Iris.error("Failed to register biome " + file.getName() + ":" + biomeFile.getName());
|
||||||
@@ -655,28 +658,15 @@ public class NMSBinding implements INMSBinding {
|
|||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
boolean frozen = field.getBoolean(registry);
|
boolean frozen = field.getBoolean(registry);
|
||||||
field.setBoolean(registry, false);
|
field.setBoolean(registry, false);
|
||||||
Field holdersField = null;
|
Field valueField = getField(Holder.Reference.class, "T");
|
||||||
boolean holders = false;
|
valueField.setAccessible(true);
|
||||||
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<>());
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
registry.createIntrusiveHolder(value);
|
var holder = registry.register(key, value, Lifecycle.stable());
|
||||||
registry.register(key, value, Lifecycle.stable());
|
if (frozen) valueField.set(holder, value);
|
||||||
return true;
|
return true;
|
||||||
} finally {
|
} finally {
|
||||||
field.setBoolean(registry, frozen);
|
field.setBoolean(registry, frozen);
|
||||||
if (holders) {
|
|
||||||
holdersField.set(registry, null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
throw new IllegalStateException(e);
|
throw new IllegalStateException(e);
|
||||||
@@ -796,20 +786,13 @@ public class NMSBinding implements INMSBinding {
|
|||||||
@Advice.OnMethodEnter
|
@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) {
|
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");
|
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(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()));
|
ResourceKey<DimensionType> typeKey = ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()));
|
||||||
RegistryAccess registryAccess = server.registryAccess();
|
RegistryAccess registryAccess = server.registryAccess();
|
||||||
Registry<DimensionType> registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null);
|
Registry<DimensionType> registry = registryAccess.registry(Registries.DIMENSION_TYPE).orElse(null);
|
||||||
if (registry == null) {
|
if (registry == null) throw new IllegalStateException("Unable to find registry for dimension type " + typeKey);
|
||||||
logger.warn("Unable to find registry for dimension type {}", typeKey);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Holder<DimensionType> holder = registry.getHolder(typeKey).orElse(null);
|
Holder<DimensionType> holder = registry.getHolder(typeKey).orElse(null);
|
||||||
if (holder == null) {
|
if (holder == null) throw new IllegalStateException("Unable to find dimension type " + typeKey);
|
||||||
logger.warn("Unable to find dimension type {}", typeKey);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
levelStem = new LevelStem(holder, levelStem.generator());
|
levelStem = new LevelStem(holder, levelStem.generator());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user