aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorglowredman <35727266+glowredman@users.noreply.github.com>2023-07-04 18:36:24 +0200
committerGitHub <noreply@github.com>2023-07-04 18:36:24 +0200
commit8115282baedea5d663ef2a8fb40091804de32e86 (patch)
tree39ac8a5d06eca3b244ffc4104cc0177e25be0424
parent4d82ca71bc5192cacb73323e4d489622e2f39727 (diff)
downloadGT5-Unofficial-8115282baedea5d663ef2a8fb40091804de32e86.tar.gz
GT5-Unofficial-8115282baedea5d663ef2a8fb40091804de32e86.tar.bz2
GT5-Unofficial-8115282baedea5d663ef2a8fb40091804de32e86.zip
Fix GT Ore Gen (#2081)
* fix the oldest bug in the pack * Use old oregen for existing maps * Use enum for OregenPattern version * Use `WorldEvent$Load` instead of `FMLServerStartedEvent` * Reset `oregenPattern` singleton on world load * Fix `oregenPattern` being reset when any dim is loaded --------- Co-authored-by: chochem <40274384+chochem@users.noreply.github.com>
-rw-r--r--src/main/java/gregtech/common/GT_Proxy.java1
-rw-r--r--src/main/java/gregtech/common/GT_Worldgenerator.java78
2 files changed, 78 insertions, 1 deletions
diff --git a/src/main/java/gregtech/common/GT_Proxy.java b/src/main/java/gregtech/common/GT_Proxy.java
index 6fc3f41d12..12a034d5a6 100644
--- a/src/main/java/gregtech/common/GT_Proxy.java
+++ b/src/main/java/gregtech/common/GT_Proxy.java
@@ -1092,6 +1092,7 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler, IG
MinecraftForge.EVENT_BUS.register(new GlobalEnergyWorldSavedData(""));
MinecraftForge.EVENT_BUS.register(new SpaceProjectWorldSavedData());
+ MinecraftForge.EVENT_BUS.register(new GT_Worldgenerator.OregenPatternSavedData(""));
// IC2 Hazmat
addFullHazmatToIC2Item("hazmatHelmet");
diff --git a/src/main/java/gregtech/common/GT_Worldgenerator.java b/src/main/java/gregtech/common/GT_Worldgenerator.java
index c731042390..42550ef009 100644
--- a/src/main/java/gregtech/common/GT_Worldgenerator.java
+++ b/src/main/java/gregtech/common/GT_Worldgenerator.java
@@ -13,12 +13,16 @@ import java.util.List;
import java.util.Random;
import net.minecraft.init.Blocks;
+import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
+import net.minecraft.world.WorldSavedData;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.IChunkProvider;
+import net.minecraftforge.event.world.WorldEvent;
import cpw.mods.fml.common.IWorldGenerator;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import gregtech.api.GregTech_API;
import gregtech.api.enums.Materials;
@@ -56,6 +60,7 @@ public class GT_Worldgenerator implements IWorldGenerator {
public static Hashtable<Long, GT_Worldgen_GT_Ore_Layer> validOreveins = new Hashtable<>(1024);
public boolean mIsGenerating = false;
public static final Object listLock = new Object();
+ public static OregenPattern oregenPattern = OregenPattern.AXISSYMMETRICAL;
public GT_Worldgenerator() {
endAsteroids = GregTech_API.sWorldgenFile.get("endasteroids", "GenerateAsteroids", true);
@@ -122,6 +127,77 @@ public class GT_Worldgenerator implements IWorldGenerator {
}
}
+ public static boolean isOreChunk(int chunkX, int chunkZ) {
+ if (oregenPattern == OregenPattern.EQUAL_SPACING) {
+ return Math.floorMod(chunkX, 3) == 1 && Math.floorMod(chunkZ, 3) == 1;
+ }
+ // add next if statement here or convert to switch when expanding OregenPattern enum
+
+ // AXISSYMMETRICAL
+ return Math.abs(chunkX) % 3 == 1 && Math.abs(chunkZ) % 3 == 1;
+ }
+
+ public static class OregenPatternSavedData extends WorldSavedData {
+
+ private static final String NAME = "GregTech_OregenPattern";
+ private static final String KEY = "oregenPattern";
+
+ public OregenPatternSavedData(String p_i2141_1_) {
+ super(p_i2141_1_);
+ }
+
+ public static void loadData(World world) {
+ if (world.getWorldInfo()
+ .getWorldTotalTime() == 0L) {
+ // The world has just been created -> use newest pattern
+ oregenPattern = OregenPattern.values()[OregenPattern.values().length - 1];
+ } else {
+ // This is an old world. Use legacy pattern for now, readFromNBT may change this if
+ // GregTech_OregenPattern.dat is present
+ oregenPattern = OregenPattern.AXISSYMMETRICAL;
+ }
+
+ // load OregenPatternSavedData
+ WorldSavedData instance = world.mapStorage
+ .loadData(OregenPatternSavedData.class, OregenPatternSavedData.NAME);
+ if (instance == null) {
+ instance = new OregenPatternSavedData(NAME);
+ world.mapStorage.setData(OregenPatternSavedData.NAME, instance);
+ }
+ instance.markDirty();
+ }
+
+ @SubscribeEvent
+ public void onWorldLoad(WorldEvent.Load event) {
+ final World world = event.world;
+ if (!world.isRemote && world.provider.dimensionId == 0) {
+ loadData(world);
+ }
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound p_76184_1_) {
+ if (p_76184_1_.hasKey(KEY)) {
+ int ordinal = p_76184_1_.getByte(KEY);
+ ordinal = MathHelper.clamp_int(ordinal, 0, OregenPattern.values().length - 1);
+ oregenPattern = OregenPattern.values()[ordinal];
+ }
+ }
+
+ @Override
+ public void writeToNBT(NBTTagCompound p_76187_1_) {
+ // If we have so many different OregenPatterns that byte isn't good enough something is wrong
+ p_76187_1_.setByte(KEY, (byte) oregenPattern.ordinal());
+ }
+
+ }
+
+ public enum OregenPattern {
+ // The last value is used when creating a new world
+ AXISSYMMETRICAL,
+ EQUAL_SPACING;
+ }
+
public static class WorldGenContainer implements Runnable {
public final Random mRandom;
@@ -454,7 +530,7 @@ public class GT_Worldgenerator implements IWorldGenerator {
for (int x = wXbox; x < eXbox; x++) {
for (int z = nZbox; z < sZbox; z++) {
// Determine if this X/Z is an orevein seed
- if (((Math.abs(x) % 3) == 1) && ((Math.abs(z) % 3) == 1)) {
+ if (isOreChunk(x, z)) {
if (debugWorldGen) GT_Log.out.println("Adding seed x=" + x + " z=" + z);
seedList.add(new NearbySeeds(x, z));
}