From dc1ff4754ccfe906675f866ca1e52d08c671b774 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Sat, 12 Mar 2016 11:47:05 +0000 Subject: [PATCH] Retro gen, enable in ores.json config file, disable once ran --- src/main/java/techreborn/Core.java | 2 + .../techreborn/world/TechRebornRetroGen.java | 85 +++++++++++++++++++ .../techreborn/world/TechRebornWorldGen.java | 4 + .../world/config/WorldGenConfig.java | 2 + 4 files changed, 93 insertions(+) create mode 100644 src/main/java/techreborn/world/TechRebornRetroGen.java diff --git a/src/main/java/techreborn/Core.java b/src/main/java/techreborn/Core.java index 425746c22..de070a476 100644 --- a/src/main/java/techreborn/Core.java +++ b/src/main/java/techreborn/Core.java @@ -40,6 +40,7 @@ import techreborn.packets.PacketAesu; import techreborn.packets.PacketIdsu; import techreborn.proxies.CommonProxy; import techreborn.tiles.idsu.IDSUManager; +import techreborn.world.TechRebornRetroGen; import techreborn.world.TechRebornWorldGen; @Mod(modid = ModInfo.MOD_ID, name = ModInfo.MOD_NAME, version = ModInfo.MOD_VERSION, dependencies = ModInfo.MOD_DEPENDENCUIES, guiFactory = ModInfo.GUI_FACTORY_CLASS, acceptedMinecraftVersions = "[1.8.8,1.8.9]") @@ -131,6 +132,7 @@ public class Core { MinecraftForge.EVENT_BUS.register(new MultiblockServerTickHandler()); MinecraftForge.EVENT_BUS.register(new TRTickHandler()); MinecraftForge.EVENT_BUS.register(new OreUnifier()); + MinecraftForge.EVENT_BUS.register(worldGen.retroGen); if (config.scrapboxDispenser) { BlockDispenser.dispenseBehaviorRegistry.putObject(ModItems.scrapBox, new BehaviorDispenseScrapbox()); } diff --git a/src/main/java/techreborn/world/TechRebornRetroGen.java b/src/main/java/techreborn/world/TechRebornRetroGen.java new file mode 100644 index 000000000..68606829a --- /dev/null +++ b/src/main/java/techreborn/world/TechRebornRetroGen.java @@ -0,0 +1,85 @@ +package techreborn.world; + +import com.google.common.base.Objects; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import net.minecraft.util.BlockPos; +import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.world.ChunkDataEvent; +import reborncore.common.misc.ChunkCoord; +import techreborn.Core; + +import java.util.*; + +/** + * Based off https://github.com/SteamNSteel/SteamNSteel + */ +public class TechRebornRetroGen { + private static final String RETROGEN_TAG = "techrebonr:retogen"; + private static final Set completedChunks = Sets.newHashSet(); + private final Deque chunksToRetroGen = new ArrayDeque(64); + + private boolean isChunkEligibleForRetroGen(ChunkDataEvent.Load event) { + return Core.worldGen.config.retroGenOres && event.world.provider.getDimensionId() == 0 + && event.getData().getString(RETROGEN_TAG).isEmpty(); + } + + public void markChunk(ChunkCoord coord) { + completedChunks.add(coord); + } + + private boolean isTickEligibleForRetroGen(TickEvent.WorldTickEvent event) { + return event.phase == TickEvent.Phase.END || event.side == Side.SERVER; + } + + + @SubscribeEvent + public void onWorldTick(TickEvent.WorldTickEvent event) { + if (isTickEligibleForRetroGen(event)) { + if (!chunksToRetroGen.isEmpty()) { + final ChunkCoord coord = chunksToRetroGen.pollFirst(); + Core.logHelper.info("Regenerating ore in " + coord + '.'); + final World world = event.world; + if (world.getChunkProvider().chunkExists(coord.getX(), coord.getZ())) { + final long seed = world.getSeed(); + final Random rng = new Random(seed); + final long xSeed = rng.nextLong() >> 2 + 1L; + final long zSeed = rng.nextLong() >> 2 + 1L; + final long chunkSeed = (xSeed * coord.getX() + zSeed * coord.getZ()) * seed; + rng.setSeed(chunkSeed); + Core.worldGen.generate(rng, coord.getX() << 4, coord.getZ() << 4, world, null, null); + } + } + } + } + + @SubscribeEvent + public void onChunkLoad(ChunkDataEvent.Load event) { + if (isChunkEligibleForRetroGen(event)) { + final ChunkCoord coord = ChunkCoord.of(event); + Core.logHelper.info("Queueing retro ore gen for " + coord + '.'); + chunksToRetroGen.addLast(coord); + } + } + + @SubscribeEvent + public void onChunkSave(ChunkDataEvent.Save event) { + final ChunkCoord coord = ChunkCoord.of(event); + if (completedChunks.contains(coord)) { + event.getData().setString(RETROGEN_TAG, "X"); + completedChunks.remove(coord); + } + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("chunksToRetroGen", chunksToRetroGen) + .toString(); + } +} diff --git a/src/main/java/techreborn/world/TechRebornWorldGen.java b/src/main/java/techreborn/world/TechRebornWorldGen.java index 3d5ad3ab8..226747c80 100644 --- a/src/main/java/techreborn/world/TechRebornWorldGen.java +++ b/src/main/java/techreborn/world/TechRebornWorldGen.java @@ -6,10 +6,12 @@ import com.google.gson.reflect.TypeToken; import net.minecraft.util.BlockPos; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.feature.WorldGenMinable; import net.minecraftforge.common.BiomeDictionary; import net.minecraftforge.fml.common.IWorldGenerator; +import reborncore.common.misc.ChunkCoord; import techreborn.Core; import techreborn.init.ModBlocks; import techreborn.world.config.OreConfig; @@ -60,6 +62,7 @@ public class TechRebornWorldGen implements IWorldGenerator { public File configFile; public static RubberTreeGenerator treeGenerator = new RubberTreeGenerator(); public boolean jsonInvalid = false; + public final TechRebornRetroGen retroGen = new TechRebornRetroGen(); public void load() { init(); @@ -192,6 +195,7 @@ public class TechRebornWorldGen implements IWorldGenerator { } } + retroGen.markChunk(ChunkCoord.of(chunkX, chunkZ)); } } } diff --git a/src/main/java/techreborn/world/config/WorldGenConfig.java b/src/main/java/techreborn/world/config/WorldGenConfig.java index 78b3ce52b..46eef200c 100644 --- a/src/main/java/techreborn/world/config/WorldGenConfig.java +++ b/src/main/java/techreborn/world/config/WorldGenConfig.java @@ -11,6 +11,8 @@ public class WorldGenConfig { public boolean generateOres = true; + public boolean retroGenOres = false; + public List overworldOres; public List neatherOres;