mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2026-06-24 21:51:24 +00:00
Oh well
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package com.volmit.iris.core.tools;
|
package com.volmit.iris.core.tools;
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
|
import com.volmit.iris.core.nms.INMS;
|
||||||
import com.volmit.iris.engine.framework.Engine;
|
import com.volmit.iris.engine.framework.Engine;
|
||||||
import com.volmit.iris.engine.object.IrisBiome;
|
import com.volmit.iris.engine.object.IrisBiome;
|
||||||
import com.volmit.iris.engine.object.IrisBiomeCustom;
|
import com.volmit.iris.engine.object.IrisBiomeCustom;
|
||||||
@@ -125,7 +126,6 @@ public class IrisBiomeFixer {
|
|||||||
for (int y = minY; y < maxY; y++) {
|
for (int y = minY; y < maxY; y++) {
|
||||||
for (int z = 0; z < 16; z++) {
|
for (int z = 0; z < 16; z++) {
|
||||||
Block block = chunk.getBlock(x, y, z);
|
Block block = chunk.getBlock(x, y, z);
|
||||||
Biome bukkitBiome;
|
|
||||||
IrisBiome irisBiome = engine.getBiome(x, y, z);
|
IrisBiome irisBiome = engine.getBiome(x, y, z);
|
||||||
IrisBiomeCustom custom;
|
IrisBiomeCustom custom;
|
||||||
try {
|
try {
|
||||||
@@ -135,27 +135,17 @@ public class IrisBiomeFixer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (custom != null) {
|
if (custom != null) {
|
||||||
// Attempt to get the Biome enum constant
|
|
||||||
try {
|
try {
|
||||||
bukkitBiome = Biome.valueOf(custom.getId().toUpperCase());
|
int id = INMS.get().getBiomeBaseIdForKey(engine.getDimension().getLoadKey() + ":" + custom.getId());
|
||||||
world.setBiome(block.getX(), block.getY(), block.getZ(), bukkitBiome);
|
Biome biome = (Biome) INMS.get().getBiomeBaseFromId(id);
|
||||||
} catch (IllegalArgumentException ex) {
|
world.setBiome(block.getX(), block.getY(), block.getZ(), biome);
|
||||||
// Custom biome not found in Biome enum
|
} catch (Exception e) {
|
||||||
// Attempt to set custom biome via NMS
|
Iris.warn("Fallback! IrisBiome ID: " + custom.getId() + " is invalid!");
|
||||||
try {
|
world.setBiome(block.getX(), block.getY(), block.getZ(), irisBiome.getDerivative());
|
||||||
setCustomBiome(block, custom.getId());
|
|
||||||
} catch (Exception e) {
|
|
||||||
// Log unregistered or failed to set custom biome
|
|
||||||
logUnregisteredBiome(custom.getId());
|
|
||||||
// Fallback to derivative biome
|
|
||||||
bukkitBiome = irisBiome.getDerivative();
|
|
||||||
world.setBiome(block.getX(), block.getY(), block.getZ(), bukkitBiome);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Use derivative biome if custom biome is null
|
// Use derivative biome if custom biome is null
|
||||||
bukkitBiome = irisBiome.getDerivative();
|
world.setBiome(block.getX(), block.getY(), block.getZ(), irisBiome.getDerivative());
|
||||||
world.setBiome(block.getX(), block.getY(), block.getZ(), bukkitBiome);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -193,64 +183,6 @@ public class IrisBiomeFixer {
|
|||||||
Iris.info(String.format("Biome Fixing Completed: %d/%d chunks processed.", generated.get(), totalChunks.get()));
|
Iris.info(String.format("Biome Fixing Completed: %d/%d chunks processed.", generated.get(), totalChunks.get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets a custom biome using NMS (Minecraft's internal classes).
|
|
||||||
*
|
|
||||||
* @param block The block whose biome is to be set.
|
|
||||||
* @param biomeId The NamespacedKey of the custom biome (e.g., "custom:my_biome").
|
|
||||||
* @throws Exception If reflection or NMS interaction fails.
|
|
||||||
*/
|
|
||||||
private void setCustomBiome(Block block, String biomeId) throws Exception {
|
|
||||||
// Parse the NamespacedKey
|
|
||||||
NamespacedKey key = NamespacedKey.fromString(biomeId);
|
|
||||||
if (key == null) {
|
|
||||||
throw new IllegalArgumentException("Invalid biome ID: " + biomeId);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Access NMS classes using reflection
|
|
||||||
// Adjust the version string as needed (e.g., "v1_20_R1")
|
|
||||||
String nmsVersion = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3];
|
|
||||||
Class<?> worldClass = Class.forName("org.bukkit.craftbukkit." + nmsVersion + ".CraftWorld");
|
|
||||||
Object nmsWorld = worldClass.cast(world).getClass().getMethod("getHandle").invoke(world);
|
|
||||||
|
|
||||||
Class<?> chunkClass = Class.forName("net.minecraft.world.level.chunk.Chunk");
|
|
||||||
Object nmsChunk = chunkClass.cast(nmsWorld.getClass().getMethod("getChunk", int.class, int.class, boolean.class)
|
|
||||||
.invoke(nmsWorld, block.getChunk().getX(), block.getChunk().getZ(), false));
|
|
||||||
|
|
||||||
// Get the biome registry
|
|
||||||
Class<?> registryKeyClass = Class.forName("net.minecraft.resources.ResourceKey");
|
|
||||||
Class<?> biomeClass = Class.forName("net.minecraft.world.level.biome.Biome");
|
|
||||||
Class<?> registryClass = Class.forName("net.minecraft.core.Registry");
|
|
||||||
Method biomeRegistryMethod = registryClass.getMethod("a", Class.class, Object.class);
|
|
||||||
Object biomeRegistry = biomeRegistryMethod.invoke(null, biomeClass, null); // Replace null with actual registry if needed
|
|
||||||
|
|
||||||
// Get the biome by key
|
|
||||||
Method getBiomeMethod = biomeClass.getMethod("a", registryKeyClass);
|
|
||||||
Object customBiome = getBiomeMethod.invoke(null, key.getNamespace() + ":" + key.getKey());
|
|
||||||
|
|
||||||
if (customBiome == null) {
|
|
||||||
throw new IllegalArgumentException("Custom biome not found: " + biomeId);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the biome in the chunk
|
|
||||||
Method setBiomeMethod = chunkClass.getMethod("setBiome", int.class, int.class, biomeClass);
|
|
||||||
setBiomeMethod.invoke(nmsChunk, block.getX() & 15, block.getZ() & 15, customBiome);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Logs unregistered or failed to set custom biomes to a file.
|
|
||||||
*
|
|
||||||
* @param biomeId The ID of the biome that failed to register.
|
|
||||||
*/
|
|
||||||
private void logUnregisteredBiome(String biomeId) {
|
|
||||||
try (BufferedWriter writer = new BufferedWriter(new FileWriter(unregisteredBiomesFile, true))) {
|
|
||||||
writer.write(biomeId);
|
|
||||||
writer.newLine();
|
|
||||||
} catch (IOException e) {
|
|
||||||
Iris.error("Failed to log unregistered biome: " + biomeId, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private long computeETA(int cps) {
|
private long computeETA(int cps) {
|
||||||
if (chunksPerSecond.size() < chunksPerSecond.getMax()) {
|
if (chunksPerSecond.size() < chunksPerSecond.getMax()) {
|
||||||
if (cps == 0) return Long.MAX_VALUE;
|
if (cps == 0) return Long.MAX_VALUE;
|
||||||
|
|||||||
Reference in New Issue
Block a user