diff --git a/src/main/java/cr0s/warpdrive/WarpDrive.java b/src/main/java/cr0s/warpdrive/WarpDrive.java index 69edf5a5..9cb93df5 100644 --- a/src/main/java/cr0s/warpdrive/WarpDrive.java +++ b/src/main/java/cr0s/warpdrive/WarpDrive.java @@ -118,6 +118,7 @@ import cr0s.warpdrive.data.JumpgatesRegistry; import cr0s.warpdrive.data.StarMapRegistry; import cr0s.warpdrive.event.ChunkHandler; import cr0s.warpdrive.event.ClientHandler; +import cr0s.warpdrive.event.CommonWorldGenerator; import cr0s.warpdrive.event.LivingHandler; import cr0s.warpdrive.event.WorldHandler; import cr0s.warpdrive.item.ItemAirTank; @@ -141,9 +142,7 @@ import cr0s.warpdrive.render.RenderOverlayAir; import cr0s.warpdrive.render.RenderOverlayCamera; import cr0s.warpdrive.render.RenderOverlayLocation; import cr0s.warpdrive.world.BiomeSpace; -import cr0s.warpdrive.world.HyperSpaceWorldGenerator; import cr0s.warpdrive.world.HyperSpaceWorldProvider; -import cr0s.warpdrive.world.SpaceWorldGenerator; import cr0s.warpdrive.world.SpaceWorldProvider; import org.apache.logging.log4j.Logger; @@ -274,9 +273,7 @@ public class WarpDrive implements LoadingCallback { public static BiomeGenBase spaceBiome; @SuppressWarnings("FieldCanBeLocal") - private SpaceWorldGenerator spaceWorldGenerator; - @SuppressWarnings("FieldCanBeLocal") - private HyperSpaceWorldGenerator hyperSpaceWorldGenerator; + private CommonWorldGenerator commonWorldGenerator; public static Field fieldBlockHardness = null; @@ -683,10 +680,8 @@ public class WarpDrive implements LoadingCallback { ForgeChunkManager.setForcedChunkLoadingCallback(instance, instance); - spaceWorldGenerator = new SpaceWorldGenerator(); - GameRegistry.registerWorldGenerator(spaceWorldGenerator, 0); - hyperSpaceWorldGenerator = new HyperSpaceWorldGenerator(); - GameRegistry.registerWorldGenerator(hyperSpaceWorldGenerator, 0); + commonWorldGenerator = new CommonWorldGenerator(); + GameRegistry.registerWorldGenerator(commonWorldGenerator, 0); spaceBiome = (new BiomeSpace(WarpDriveConfig.G_SPACE_BIOME_ID)).setColor(0).setDisableRain().setBiomeName("Space"); BiomeDictionary.registerBiomeType(spaceBiome, BiomeDictionary.Type.DEAD, BiomeDictionary.Type.WASTELAND); diff --git a/src/main/java/cr0s/warpdrive/compat/CompatWarpDrive.java b/src/main/java/cr0s/warpdrive/compat/CompatWarpDrive.java index 54a94a4d..6288e304 100644 --- a/src/main/java/cr0s/warpdrive/compat/CompatWarpDrive.java +++ b/src/main/java/cr0s/warpdrive/compat/CompatWarpDrive.java @@ -1,6 +1,7 @@ package cr0s.warpdrive.compat; +import cr0s.warpdrive.WarpDrive; import cr0s.warpdrive.api.IBlockTransformer; import cr0s.warpdrive.api.ITransformation; import cr0s.warpdrive.block.breathing.BlockAirFlow; @@ -8,6 +9,7 @@ import cr0s.warpdrive.block.breathing.BlockAirSource; import cr0s.warpdrive.block.energy.TileEntityEnergyBank; import cr0s.warpdrive.block.hull.BlockHullSlab; import cr0s.warpdrive.config.WarpDriveConfig; +import cr0s.warpdrive.data.ChunkData; import cr0s.warpdrive.data.StateAir; import cr0s.warpdrive.event.ChunkHandler; @@ -15,7 +17,6 @@ import net.minecraft.block.Block; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.IWorldAccess; import net.minecraft.world.World; public class CompatWarpDrive implements IBlockTransformer { @@ -39,7 +40,14 @@ public class CompatWarpDrive implements IBlockTransformer { public NBTBase saveExternals(final World world, final int x, final int y, final int z, final Block block, final int blockMeta, final TileEntity tileEntity) { if (block instanceof BlockAirFlow || block instanceof BlockAirSource) { - final int dataAir = ChunkHandler.getChunkData(world, x, y, z).getDataAir(x, y, z); + final ChunkData chunkData = ChunkHandler.getChunkData(world, x, y, z, false); + if (chunkData == null) { + WarpDrive.logger.error(String.format("CompatWarpDrive trying to get data from an non-loaded chunk in %s @ (%d %d %d)", + world.provider.getDimensionName(), x, y, z)); + assert(false); + return null; + } + final int dataAir = chunkData.getDataAir(x, y, z); if (dataAir == StateAir.AIR_DEFAULT) { return null; } @@ -115,7 +123,14 @@ public class CompatWarpDrive implements IBlockTransformer { } if (((NBTTagCompound) nbtBase).hasKey("dataAir")) { final int dataAir = ((NBTTagCompound) nbtBase).getInteger("dataAir"); - ChunkHandler.getChunkData(world, x, y, z).setDataAir(x, y, z, dataAir); + final ChunkData chunkData = ChunkHandler.getChunkData(world, x, y, z, false); + if (chunkData == null) { + WarpDrive.logger.error(String.format("CompatWarpDrive trying to set data from an non-loaded chunk in %s @ (%d %d %d)", + world.provider.getDimensionName(), x, y, z)); + assert(false); + return; + } + chunkData.setDataAir(x, y, z, dataAir); } } } diff --git a/src/main/java/cr0s/warpdrive/data/ChunkData.java b/src/main/java/cr0s/warpdrive/data/ChunkData.java index 9996048e..dddf7bdd 100644 --- a/src/main/java/cr0s/warpdrive/data/ChunkData.java +++ b/src/main/java/cr0s/warpdrive/data/ChunkData.java @@ -62,22 +62,22 @@ public class ChunkData { && timeUnloaded != 0L && time - timeUnloaded < RELOAD_DELAY_MIN_MS ) { WarpDrive.logger.warn(String.format("Chunk %s (%d %d %d) is reloading after only %d ms", - chunkCoordIntPair, - getChunkPosition().chunkPosX, getChunkPosition().chunkPosY, getChunkPosition().chunkPosZ, - time - timeUnloaded)); + chunkCoordIntPair, + getChunkPosition().chunkPosX, getChunkPosition().chunkPosY, getChunkPosition().chunkPosZ, + time - timeUnloaded)); } + // load defaults + Arrays.fill(dataAirSegments, null); + Arrays.fill(tickAirSegments, null); + isModified = false; + // check version if (nbtTagCompoundChunk.hasKey(TAG_CHUNK_MOD_DATA)) { final NBTTagCompound nbtTagCompound = nbtTagCompoundChunk.getCompoundTag(TAG_CHUNK_MOD_DATA); final int version = nbtTagCompound.getInteger(TAG_VERSION); assert (version == 0 || version == 1); - // load defaults - Arrays.fill(dataAirSegments, null); - Arrays.fill(tickAirSegments, null); - isModified = false; - // load from NBT data if (version == 1) { final NBTTagList nbtTagList = nbtTagCompound.getTagList(TAG_AIR, Constants.NBT.TAG_COMPOUND); @@ -142,7 +142,7 @@ public class ChunkData { // mark as loaded timeLoaded = time; isLoaded = true; - if (WarpDrive.isDev && WarpDriveConfig.LOGGING_CHUNK_HANDLER) { + if (WarpDriveConfig.LOGGING_CHUNK_HANDLER) { WarpDrive.logger.info(String.format("Chunk %s (%d %d %d) is now loaded", chunkCoordIntPair, getChunkPosition().chunkPosX, getChunkPosition().chunkPosY, getChunkPosition().chunkPosZ)); @@ -496,10 +496,10 @@ public class ChunkData { @Override public String toString() { final ChunkPosition chunkPosition = getChunkPosition(); - return String.format("%s (%d %d @ %d %d %d) hasAir %s isNotEmpty %s )", + return String.format("%s (%d %d @ %d %d %d) isLoaded %s hasAir %s isNotEmpty %s )", getClass().getSimpleName(), chunkCoordIntPair.chunkXPos, chunkCoordIntPair.chunkZPos, chunkPosition.chunkPosX, chunkPosition.chunkPosY, chunkPosition.chunkPosZ, - hasAir(), isNotEmpty()); + isLoaded, hasAir(), isNotEmpty()); } } \ No newline at end of file diff --git a/src/main/java/cr0s/warpdrive/data/StateAir.java b/src/main/java/cr0s/warpdrive/data/StateAir.java index 8d330d80..ac033289 100644 --- a/src/main/java/cr0s/warpdrive/data/StateAir.java +++ b/src/main/java/cr0s/warpdrive/data/StateAir.java @@ -91,7 +91,12 @@ public class StateAir { private void refresh(final World world) { // update chunk cache if (chunkData == null || !chunkData.isInside(x, y, z)) { - chunkData = ChunkHandler.getChunkData(world, x, y, z); + chunkData = ChunkHandler.getChunkData(world, x, y, z, false); + if (chunkData == null) { + WarpDrive.logger.error(String.format("State air trying to get data from an non-loaded chunk in %s @ (%d %d %d)", + world.provider.getDimensionName(), x, y, z)); + assert(false); + } chunk = null; } if (chunk == null) { diff --git a/src/main/java/cr0s/warpdrive/event/ChunkHandler.java b/src/main/java/cr0s/warpdrive/event/ChunkHandler.java index cbf1553e..5f2a9df6 100644 --- a/src/main/java/cr0s/warpdrive/event/ChunkHandler.java +++ b/src/main/java/cr0s/warpdrive/event/ChunkHandler.java @@ -23,7 +23,6 @@ import cpw.mods.fml.common.gameevent.TickEvent.WorldTickEvent; import cpw.mods.fml.relauncher.Side; import net.minecraftforge.event.world.ChunkDataEvent; import net.minecraftforge.event.world.ChunkEvent; -import net.minecraftforge.event.world.ChunkWatchEvent; import net.minecraftforge.event.world.WorldEvent; public class ChunkHandler { @@ -40,48 +39,72 @@ public class ChunkHandler { /* event catchers */ @SubscribeEvent public void onLoadWorld(WorldEvent.Load event) { - if (event.world.isRemote || event.world.provider.dimensionId != 0) { - return; - } - if (WarpDriveConfig.LOGGING_CHUNK_HANDLER) { - WarpDrive.logger.info(String.format("World %s load.", - event.world.provider.getDimensionName())); + if (event.world.isRemote || event.world.provider.dimensionId == 0) { + if (WarpDriveConfig.LOGGING_CHUNK_HANDLER) { + WarpDrive.logger.info(String.format("%s world %s load.", + event.world.isRemote ? "Client" : "Server", + event.world.provider.getDimensionName())); + } } - // load star map - final String filename = String.format("%s/%s.dat", event.world.getSaveHandler().getWorldDirectory().getPath(), WarpDrive.MODID); - final NBTTagCompound tagCompound = Commons.readNBTFromFile(filename); - WarpDrive.starMap.readFromNBT(tagCompound); + if ( !event.world.isRemote + && event.world.provider.dimensionId == 0 ) { + // load star map + final String filename = String.format("%s/%s.dat", event.world.getSaveHandler().getWorldDirectory().getPath(), WarpDrive.MODID); + final NBTTagCompound tagCompound = Commons.readNBTFromFile(filename); + WarpDrive.starMap.readFromNBT(tagCompound); + } + } + + // new chunks aren't loaded + public static void onGenerated(final World world, final int chunkX, final int chunkZ) { + if (WarpDriveConfig.LOGGING_CHUNK_HANDLER) { + WarpDrive.logger.info(String.format("%s world %s chunk [%d, %d] generating", + world.isRemote ? "Client" : "Server", + world.provider.getDimensionName(), + chunkX, chunkZ)); + } + + final ChunkData chunkData = getChunkData(world.isRemote, world.provider.dimensionId, chunkX, chunkZ, true); + assert(chunkData != null); + // (world can load a non-generated chunk, or the chunk be regenerated, so we reset only as needed) + if (!chunkData.isLoaded()) { + chunkData.load(new NBTTagCompound()); + } } // (server side only) @SubscribeEvent public void onLoadChunkData(ChunkDataEvent.Load event) { if (WarpDriveConfig.LOGGING_CHUNK_HANDLER) { - WarpDrive.logger.info(String.format("World %s chunk %s loading data", + WarpDrive.logger.info(String.format("%s world %s chunk %s loading data (1)", + event.world.isRemote ? "Client" : "Server", event.world.provider.getDimensionName(), event.getChunk().getChunkCoordIntPair())); } - final ChunkData chunkData = getChunkData(event.world.isRemote, event.world.provider.dimensionId, event.getChunk().xPosition, event.getChunk().zPosition); + final ChunkData chunkData = getChunkData(event.world.isRemote, event.world.provider.dimensionId, event.getChunk().xPosition, event.getChunk().zPosition, true); + assert(chunkData != null); chunkData.load(event.getData()); } // (called after data loading, only useful client side) @SubscribeEvent public void onLoadChunk(ChunkEvent.Load event) { + if (WarpDriveConfig.LOGGING_CHUNK_HANDLER) { + WarpDrive.logger.info(String.format("%s world %s chunk %s loaded (2)", + event.world.isRemote ? "Client" : "Server", + event.world.provider.getDimensionName(), + event.getChunk().getChunkCoordIntPair())); + } + if (event.world.isRemote) { - if (WarpDriveConfig.LOGGING_CHUNK_HANDLER) { - WarpDrive.logger.info(String.format("World %s chunk %s loaded", - event.world.provider.getDimensionName(), - event.getChunk().getChunkCoordIntPair())); - } - - final ChunkData chunkData = getChunkData(event.world.isRemote, event.world.provider.dimensionId, event.getChunk().xPosition, event.getChunk().zPosition); + final ChunkData chunkData = getChunkData(event.world.isRemote, event.world.provider.dimensionId, event.getChunk().xPosition, event.getChunk().zPosition, true); + assert(chunkData != null); chunkData.load(new NBTTagCompound()); } } - + /* // (server side only) @SubscribeEvent public void onWatchChunk(ChunkWatchEvent.Watch event) { @@ -92,31 +115,44 @@ public class ChunkHandler { event.player)); } } - + /**/ // (server side only) // not called when chunk wasn't changed since last save? @SubscribeEvent public void onSaveChunkData(ChunkDataEvent.Save event) { if (WarpDriveConfig.LOGGING_CHUNK_HANDLER) { - WarpDrive.logger.info(String.format("World %s chunk %s save data", + WarpDrive.logger.info(String.format("%s world %s chunk %s save data", + event.world.isRemote ? "Client" : "Server", event.world.provider.getDimensionName(), event.getChunk().getChunkCoordIntPair())); } - final ChunkData chunkData = getChunkData(event.world.isRemote, event.world.provider.dimensionId, event.getChunk().xPosition, event.getChunk().zPosition); - chunkData.save(event.getData()); + final ChunkData chunkData = getChunkData(event.world.isRemote, event.world.provider.dimensionId, event.getChunk().xPosition, event.getChunk().zPosition, false); + if (chunkData != null) { + chunkData.save(event.getData()); + } else { + WarpDrive.logger.error(String.format("%s world %s chunk %s is saving data without loading it first!", + event.world.isRemote ? "Client" : "Server", + event.world.provider.getDimensionName(), + event.getChunk().getChunkCoordIntPair())); + } } // (server side only) @SubscribeEvent public void onSaveWorld(WorldEvent.Save event) { - if (event.world.isRemote || event.world.provider.dimensionId != 0) { + if (event.world.provider.dimensionId != 0) { return; } if (WarpDriveConfig.LOGGING_CHUNK_HANDLER) { - WarpDrive.logger.info(String.format("World %s saved.", + WarpDrive.logger.info(String.format("%s world %s saved.", + event.world.isRemote ? "Client" : "Server", event.world.provider.getDimensionName())); } + if (event.world.isRemote) { + return; + } + // save star map final String filename = String.format("%s/%s.dat", event.world.getSaveHandler().getWorldDirectory().getPath(), WarpDrive.MODID); final NBTTagCompound tagCompound = new NBTTagCompound(); @@ -127,7 +163,8 @@ public class ChunkHandler { @SubscribeEvent public void onUnloadWorld(WorldEvent.Unload event) { if (WarpDriveConfig.LOGGING_CHUNK_HANDLER) { - WarpDrive.logger.info(String.format("World %s unload", + WarpDrive.logger.info(String.format("%s world %s unload", + event.world.isRemote ? "Client" : "Server", event.world.provider.getDimensionName())); } @@ -144,10 +181,6 @@ public class ChunkHandler { } } - if (event.world.isRemote || event.world.provider.dimensionId != 0) { - return; - } - // @TODO unload star map } @@ -156,25 +189,36 @@ public class ChunkHandler { @SubscribeEvent public void onUnloadChunk(ChunkEvent.Unload event) { if (WarpDriveConfig.LOGGING_CHUNK_HANDLER) { - WarpDrive.logger.info(String.format("World %s chunk %s unload", + WarpDrive.logger.info(String.format("%s world %s chunk %s unload", + event.world.isRemote ? "Client" : "Server", event.world.provider.getDimensionName(), event.getChunk().getChunkCoordIntPair())); } - getChunkData(event.world.isRemote, event.world.provider.dimensionId, event.getChunk().xPosition, event.getChunk().zPosition).unload(); + final ChunkData chunkData = getChunkData(event.world.isRemote, event.world.provider.dimensionId, event.getChunk().xPosition, event.getChunk().zPosition, false); + if (chunkData != null) { + chunkData.unload(); + } else { + WarpDrive.logger.error(String.format("%s world %s chunk %s is unloading without loading it first!", + event.world.isRemote ? "Client" : "Server", + event.world.provider.getDimensionName(), + event.getChunk().getChunkCoordIntPair())); + } } - + /* // (not called when closing SSP game) + // warning: will return invalid world when switching dimensions @SubscribeEvent public void onUnwatchChunk(ChunkWatchEvent.UnWatch event) { if (WarpDriveConfig.LOGGING_CHUNK_HANDLER) { - WarpDrive.logger.info(String.format("World %s chunk %s unwatch by %s", + WarpDrive.logger.info(String.format("%s world %s chunk %s unwatch by %s", + event.player.worldObj.isRemote ? "Client" : "Server", event.player.worldObj.provider.getDimensionName(), event.chunk, event.player)); } } - + /**/ @SubscribeEvent public void onWorldTick(WorldTickEvent event) { if (event.side != Side.SERVER || event.phase != Phase.END) { @@ -186,21 +230,29 @@ public class ChunkHandler { public static void onBlockUpdated(final World world, final int x, final int y, final int z) { if (!world.isRemote) { - getChunkData(world, x, y, z).onBlockUpdated(x, y, z); + final ChunkData chunkData = getChunkData(world, x, y, z, false); + if (chunkData != null) { + chunkData.onBlockUpdated(x, y, z); + } else { + WarpDrive.logger.error(String.format("%s world %s block updating at (%d %d %d), while chunk isn't loaded!", + world.isRemote ? "Client" : "Server", + world.provider.getDimensionName(), + x, y, z)); + } } } /* internal access */ - public static ChunkData getChunkData(final World world, final int x, final int y, final int z) { - return getChunkData(world.isRemote, world.provider.dimensionId, x, y, z); + public static ChunkData getChunkData(final World world, final int x, final int y, final int z, final boolean doCreate) { + return getChunkData(world.isRemote, world.provider.dimensionId, x, y, z, doCreate); } - private static ChunkData getChunkData(final boolean isRemote, final int dimensionId, final int x, final int y, final int z) { + private static ChunkData getChunkData(final boolean isRemote, final int dimensionId, final int x, final int y, final int z, final boolean doCreate) { assert (y >= 0 && y <= 255); - return getChunkData(isRemote, dimensionId, x >> 4, z >> 4); + return getChunkData(isRemote, dimensionId, x >> 4, z >> 4, doCreate); } - private static ChunkData getChunkData(final boolean isRemote, final int dimensionId, final int xChunk, final int zChunk) { + private static ChunkData getChunkData(final boolean isRemote, final int dimensionId, final int xChunk, final int zChunk, final boolean doCreate) { // get dimension data LocalProfiler.updateCallStat("getChunkData"); final Map> registry = isRemote ? registryClient : registryServer; @@ -208,6 +260,9 @@ public class ChunkHandler { // (lambda expressions are forcing synchronisation, so we don't use them here) //noinspection Java8MapApi if (mapRegistryItems == null) { + if (!doCreate) { + return null; + } // TLongObjectMap m = TCollections.synchronizedMap(new TLongObjectHashMap(2048) ); // @TODO: http://trove4j.sourceforge.net/javadocs/gnu/trove/TCollections.html#synchronizedMap(gnu.trove.map.TLongObjectMap) mapRegistryItems = new LinkedHashMap<>(2048); // Collections.synchronizedMap(new LinkedHashMap<>(2048)); @@ -219,7 +274,16 @@ public class ChunkHandler { // (lambda expressions are forcing synchronisation, so we don't use them here) //noinspection Java8MapApi if (chunkData == null) { + if (!doCreate) { + return null; + } chunkData = new ChunkData(xChunk, zChunk); + if (WarpDriveConfig.LOGGING_CHUNK_HANDLER) { + WarpDrive.logger.info(String.format("%s world DIM%d chunk %s is being added to the registry", + isRemote ? "Client" : "Server", + dimensionId, + chunkData.getChunkCoords())); + } mapRegistryItems.put(index, chunkData); } return chunkData; @@ -234,12 +298,13 @@ public class ChunkHandler { /* commons */ public static boolean isLoaded(final World world, final int x, final int y, final int z) { - return getChunkData(world, x, y, z).isLoaded(); + final ChunkData chunkData = getChunkData(world, x, y, z, false); + return chunkData != null && chunkData.isLoaded(); } /* air handling */ public static StateAir getStateAir(final World world, final int x, final int y, final int z) { - return getChunkData(world, x, y, z).getStateAir(world, x, y, z); + return getChunkData(world, x, y, z, true).getStateAir(world, x, y, z); } public static void updateTick(final World world) { @@ -251,15 +316,25 @@ public class ChunkHandler { return; } int countLoaded = 0; - final long time = System.currentTimeMillis() - CHUNK_HANDLER_UNLOADED_CHUNK_MAX_AGE_MS; - for(Iterator> entryIterator = mapRegistryItems.entrySet().iterator(); entryIterator.hasNext(); ) { + final long timeForRemoval = System.currentTimeMillis() - CHUNK_HANDLER_UNLOADED_CHUNK_MAX_AGE_MS; + final long timeForThrottle = System.currentTimeMillis() + 200; + for(final Iterator> entryIterator = mapRegistryItems.entrySet().iterator(); entryIterator.hasNext(); ) { final Map.Entry entryChunkData = entryIterator.next(); final ChunkData chunkData = entryChunkData.getValue(); // update loaded chunks, remove old unloaded chunks if (chunkData.isLoaded()) { - updateTickLoopStep(world, mapRegistryItems, entryChunkData.getValue()); countLoaded++; - } else if (chunkData.timeUnloaded < time) { + if (System.currentTimeMillis() < timeForThrottle) { + updateTickLoopStep(world, mapRegistryItems, entryChunkData.getValue()); + } + } else if (chunkData.timeUnloaded < timeForRemoval) { + if (WarpDriveConfig.LOGGING_CHUNK_HANDLER) { + WarpDrive.logger.info(String.format("%s world %s chunk %s is being removed from updateTick (size is %d)", + world.isRemote ? "Client" : "Server", + world.provider.getDimensionName(), + chunkData.getChunkCoords(), + mapRegistryItems.size())); + } entryIterator.remove(); } } diff --git a/src/main/java/cr0s/warpdrive/world/SpaceWorldGenerator.java b/src/main/java/cr0s/warpdrive/event/CommonWorldGenerator.java similarity index 93% rename from src/main/java/cr0s/warpdrive/world/SpaceWorldGenerator.java rename to src/main/java/cr0s/warpdrive/event/CommonWorldGenerator.java index 0d391414..d7d9351d 100644 --- a/src/main/java/cr0s/warpdrive/world/SpaceWorldGenerator.java +++ b/src/main/java/cr0s/warpdrive/event/CommonWorldGenerator.java @@ -1,4 +1,4 @@ -package cr0s.warpdrive.world; +package cr0s.warpdrive.event; import cr0s.warpdrive.data.CelestialObjectManager; import cr0s.warpdrive.config.WarpDriveConfig; @@ -7,6 +7,7 @@ import cr0s.warpdrive.config.structures.Orb.OrbShell; import cr0s.warpdrive.config.structures.OrbInstance; import cr0s.warpdrive.config.structures.StructureGroup; import cr0s.warpdrive.data.CelestialObject; +import cr0s.warpdrive.event.ChunkHandler; import java.util.Random; @@ -15,10 +16,14 @@ import net.minecraft.world.chunk.IChunkProvider; import cpw.mods.fml.common.IWorldGenerator; -public class SpaceWorldGenerator implements IWorldGenerator { +public class CommonWorldGenerator implements IWorldGenerator { @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { + // chunk data creation + ChunkHandler.onGenerated(world, chunkX, chunkZ); + + // actual structure generation try { final int x = (chunkX * 16) + (5 - random.nextInt(10)); final int z = (chunkZ * 16) + (5 - random.nextInt(10)); @@ -45,6 +50,7 @@ public class SpaceWorldGenerator implements IWorldGenerator { exception.printStackTrace(); } } + /** * * @deprecated reference design for EntitySphereGenerator diff --git a/src/main/java/cr0s/warpdrive/world/HyperSpaceWorldGenerator.java b/src/main/java/cr0s/warpdrive/world/HyperSpaceWorldGenerator.java deleted file mode 100644 index b8ed3542..00000000 --- a/src/main/java/cr0s/warpdrive/world/HyperSpaceWorldGenerator.java +++ /dev/null @@ -1,17 +0,0 @@ -package cr0s.warpdrive.world; - -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.chunk.IChunkProvider; - -import cpw.mods.fml.common.IWorldGenerator; - -public class HyperSpaceWorldGenerator implements IWorldGenerator { - @Override - public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { - if (world.provider.dimensionId != 0) { - // ... - } - } -}