diff --git a/src/main/java/StevenDimDoors/experimental/SphereDecayOperation.java b/src/main/java/StevenDimDoors/experimental/SphereDecayOperation.java index 95587b64..0af0bac7 100644 --- a/src/main/java/StevenDimDoors/experimental/SphereDecayOperation.java +++ b/src/main/java/StevenDimDoors/experimental/SphereDecayOperation.java @@ -12,8 +12,8 @@ import net.minecraft.tileentity.TileEntityChest; import net.minecraft.tileentity.TileEntityDispenser; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDLoot; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.schematic.WorldOperation; /** diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java b/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java index 9109f16b..24e58dff 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java @@ -1,5 +1,6 @@ package StevenDimDoors.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -8,89 +9,82 @@ import static StevenDimDoors.mod_pocketDim.mod_pocketDim.*; public class CraftingManager { - + private CraftingManager() { } + public static void registerRecipes(DDProperties properties) - { - if (properties.CraftingDimensionalDoorAllowed) - { - GameRegistry.addRecipe(new ItemStack(itemDimensionalDoor, 1), new Object[] - { - " ", "yxy", " ", 'x', mod_pocketDim.itemStableFabric, 'y', Item.doorIron - }); - } - if(properties.CraftingUnstableDoorAllowed) - { - GameRegistry.addRecipe(new ItemStack(itemUnstableDoor, 1), new Object[] - { - " ", "yxy", " ", 'x', Item.eyeOfEnder, 'y', mod_pocketDim.itemDimensionalDoor - }); - } - if(properties.CraftingWarpDoorAllowed) - { - GameRegistry.addRecipe(new ItemStack(itemWarpDoor, 1), new Object[] - { - " ", "yxy", " ", 'x', mod_pocketDim.itemStableFabric, 'y', Item.doorWood - }); - } - if(properties.CraftingTransTrapdoorAllowed) - { - GameRegistry.addRecipe(new ItemStack(transTrapdoor, 1), new Object[] - { - " y ", " x ", " y ", 'x', mod_pocketDim.itemStableFabric, 'y', Block.trapdoor - }); - } - if(properties.CraftingRiftSignatureAllowed) - { - GameRegistry.addRecipe(new ItemStack(itemRiftSignature, 1), new Object[] - { - " y ", "yxy", " y ", 'x', mod_pocketDim.itemStableFabric, 'y', Item.ingotIron - }); - } - - if(properties.CraftingRiftRemoverAllowed) - { - GameRegistry.addRecipe(new ItemStack(itemRiftRemover, 1), new Object[] - { - "yyy", "yxy", "yyy", 'x', mod_pocketDim.itemStableFabric, 'y', Item.ingotGold - }); - } - - if (properties.CraftingRiftBladeAllowed) - { - GameRegistry.addRecipe(new ItemStack(itemRiftBlade, 1), new Object[] - { - " x ", " x ", " y ", 'x', mod_pocketDim.itemStableFabric, 'y', Item.blazeRod - }); - } - + { if (properties.CraftingStableFabricAllowed) { - GameRegistry.addRecipe(new ItemStack(itemStableFabric, 1), new Object[] - { - "yyy", "yxy", "yyy", 'x', Item.enderPearl, 'y', mod_pocketDim.itemWorldThread - }); + switch (properties.WorldThreadRequirementLevel) + { + case 1: + GameRegistry.addShapelessRecipe(new ItemStack(itemStableFabric, 1), + Item.enderPearl, mod_pocketDim.itemWorldThread); + break; + case 2: + GameRegistry.addRecipe(new ItemStack(itemStableFabric, 1), + "yxy", 'x', Item.enderPearl, 'y', mod_pocketDim.itemWorldThread); + break; + case 3: + GameRegistry.addRecipe(new ItemStack(itemStableFabric, 1), + " y ", "yxy", " y ", 'x', Item.enderPearl, 'y', mod_pocketDim.itemWorldThread); + break; + default: + GameRegistry.addRecipe(new ItemStack(itemStableFabric, 1), + "yyy", "yxy", "yyy", 'x', Item.enderPearl, 'y', mod_pocketDim.itemWorldThread); + break; + } } + if (properties.CraftingDimensionalDoorAllowed) + { + GameRegistry.addRecipe(new ItemStack(itemDimensionalDoor, 1), + "yxy", 'x', mod_pocketDim.itemStableFabric, 'y', Item.doorIron); + } + if (properties.CraftingUnstableDoorAllowed) + { + GameRegistry.addRecipe(new ItemStack(itemUnstableDoor, 1), + "yxy", 'x', Item.eyeOfEnder, 'y', mod_pocketDim.itemDimensionalDoor); + } + if (properties.CraftingWarpDoorAllowed) + { + GameRegistry.addRecipe(new ItemStack(itemWarpDoor, 1), + "yxy", 'x', mod_pocketDim.itemStableFabric, 'y', Item.doorWood); + } + if (properties.CraftingTransTrapdoorAllowed) + { + GameRegistry.addRecipe(new ItemStack(transTrapdoor, 1), + "y", "x", "y", 'x', mod_pocketDim.itemStableFabric, 'y', Block.trapdoor); + } + if (properties.CraftingRiftSignatureAllowed) + { + GameRegistry.addRecipe(new ItemStack(itemRiftSignature, 1), + " y ", "yxy", " y ", 'x', mod_pocketDim.itemStableFabric, 'y', Item.ingotIron); + } + if (properties.CraftingRiftRemoverAllowed) + { + GameRegistry.addRecipe(new ItemStack(itemRiftRemover, 1), + "yyy", "yxy", "yyy", 'x', mod_pocketDim.itemStableFabric, 'y', Item.ingotGold); + } + if (properties.CraftingRiftBladeAllowed) + { + GameRegistry.addRecipe(new ItemStack(itemRiftBlade, 1), + "x", "x", "y", 'x', mod_pocketDim.itemStableFabric, 'y', Item.blazeRod); + } if (properties.CraftingStabilizedRiftSignatureAllowed) { - GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemStabilizedLinkSignature,1), new Object[] - { - " y ", "yxy", " y ", 'x', mod_pocketDim.itemRiftSignature, 'y', mod_pocketDim.itemStableFabric - }); + GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemStabilizedLinkSignature,1), + " y ", "yxy", " y ", 'x', mod_pocketDim.itemRiftSignature, 'y', mod_pocketDim.itemStableFabric); } if (properties.CraftingGoldenDimensionalDoorAllowed) { - GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemGoldenDimensionalDoor,1), new Object[] - { - " ", "xyx", " ", 'x', mod_pocketDim.itemGoldenDoor, 'y', Item.eyeOfEnder - }); + GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemGoldenDimensionalDoor,1), + "yxy", 'x', mod_pocketDim.itemGoldenDoor, 'y', mod_pocketDim.itemStableFabric); } if (properties.CraftingGoldenDoorAllowed) { - GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemGoldenDoor, 1), new Object[] - { - "yy ", "yy ", "yy ", 'y', Item.ingotGold - }); + GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemGoldenDoor, 1), + "yy", "yy", "yy", 'y', Item.ingotGold); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/DDLoot.java b/src/main/java/StevenDimDoors/mod_pocketDim/DDLoot.java index 74dc5e97..50f4fb6d 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/DDLoot.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/DDLoot.java @@ -12,6 +12,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.WeightedRandom; import net.minecraft.util.WeightedRandomChestContent; import net.minecraftforge.common.ChestGenHooks; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.util.WeightedContainer; /* @@ -19,7 +20,7 @@ import StevenDimDoors.mod_pocketDim.util.WeightedContainer; */ public class DDLoot { - private static final String[] SPECIAL_SKULL_OWNERS = new String[] { "stevenrs11", "kamikazekiwi3", "Jaitsu", "XCompWiz", "skyboy026", "Wylker" }; + private static final String[] SPECIAL_SKULL_OWNERS = new String[] { "stevenrs11", "kamikazekiwi3", "fbt", "Jaitsu", "XCompWiz", "skyboy026", "Wylker" }; private static final double MIN_ITEM_DAMAGE = 0.3; private static final double MAX_ITEM_DAMAGE = 0.9; @@ -30,7 +31,7 @@ public class DDLoot { public static final String DIMENSIONAL_DUNGEON_CHEST = "dimensionalDungeonChest"; public static ChestGenHooks DungeonChestInfo = null; - private static final int CHEST_SIZE = 5; + private static final int CHEST_SIZE = 6; private DDLoot() { } @@ -55,7 +56,7 @@ public class DDLoot { addContent(true, items, Item.appleGold.itemID, 10); addContent(properties.FabricOfRealityLootEnabled, items, mod_pocketDim.blockDimWall.blockID, 20, 16, 64); - addContent(properties.WorldThreadLootEnabled, items, mod_pocketDim.itemWorldThread.itemID, 80, 2, 8); + addContent(properties.WorldThreadLootEnabled, items, mod_pocketDim.itemWorldThread.itemID, 80, 2, 12); // Add all the items to our dungeon chest addItemsToContainer(DungeonChestInfo, items); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/DimData.java b/src/main/java/StevenDimDoors/mod_pocketDim/DimData.java index 76481618..cd572853 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/DimData.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/DimData.java @@ -8,6 +8,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import StevenDimDoors.mod_pocketDim.config.DDProperties; + import net.minecraft.util.MathHelper; import net.minecraft.world.World; @Deprecated diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java index 8f6c4a3e..d3b09f46 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -19,6 +19,7 @@ import net.minecraftforge.event.entity.living.LivingFallEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.terraingen.InitMapGenEvent; import net.minecraftforge.event.world.WorldEvent; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.items.BaseItemDoor; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java index ee37ab0d..9c56e91a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java @@ -17,8 +17,8 @@ import net.minecraft.util.Icon; import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.PocketManager; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java index 5047d9e4..d3dac454 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java @@ -11,8 +11,8 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; import StevenDimDoors.mod_pocketDim.util.Point4D; @@ -51,7 +51,8 @@ public class BlockDimWallPerm extends Block @Override public void onEntityWalking(World world, int x, int y, int z, Entity entity) { - if (!world.isRemote && world.provider.dimensionId == properties.LimboDimensionID) + if (!world.isRemote && world.provider.dimensionId == properties.LimboDimensionID + && mod_pocketDim.worldProperties.LimboEscapeEnabled) { World overworld = DimensionManager.getWorld(0); if (overworld != null && entity instanceof EntityPlayerMP) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java index 54972e4d..1e8f91e7 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java @@ -4,8 +4,8 @@ import java.util.Random; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import net.minecraft.block.BlockDoor; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.IconFlipped; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java index b4ffd219..5a788dbb 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java @@ -1,7 +1,7 @@ package StevenDimDoors.mod_pocketDim.blocks; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java index 5f6f8966..cc15c9f6 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java @@ -7,7 +7,6 @@ import java.util.Queue; import java.util.Random; import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.BlockFlowing; import net.minecraft.block.BlockFluid; import net.minecraft.block.ITileEntityProvider; @@ -20,13 +19,14 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fluids.IFluidBlock; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; +import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDimClient.ClosingRiftFX; import StevenDimDoors.mod_pocketDimClient.GoggleRiftFX; import StevenDimDoors.mod_pocketDimClient.RiftFX; @@ -38,7 +38,7 @@ public class BlockRift extends Block implements ITileEntityProvider { private static final float MIN_IMMUNE_RESISTANCE = 5000.0F; private static final int BLOCK_DESTRUCTION_RANGE = 4; - private static final int BLOCK_DESTRUCTION_VOLUME = (int) Math.pow(2 * BLOCK_DESTRUCTION_RANGE + 1, 3); + private static final int RIFT_SPREAD_RANGE = 5; private static final int MAX_BLOCK_SEARCH_CHANCE = 100; private static final int BLOCK_SEARCH_CHANCE = 50; private static final int MAX_BLOCK_DESTRUCTION_CHANCE = 100; @@ -164,11 +164,30 @@ public class BlockRift extends Block implements ITileEntityProvider private void destroyNearbyBlocks(World world, int x, int y, int z, Random random) { - HashMap pointDistances = new HashMap(BLOCK_DESTRUCTION_VOLUME); - Queue points = new LinkedList(); + // Find reachable blocks that are vulnerable to rift damage (ignoring air, of course) + ArrayList targets = findReachableBlocks(world, x, y, z, BLOCK_DESTRUCTION_RANGE, false); - //Perform a breadth-first search outwards from the point at which the rift is located. Record the distances - //of the points we visit to stop the search at its maximum range. + // For each block, randomly decide whether to destroy it. + // The randomness makes it so the destroyed area appears "noisy" if the rift is exposed to a large surface. + for (Point3D target : targets) + { + if (random.nextInt(MAX_BLOCK_DESTRUCTION_CHANCE) < BLOCK_DESTRUCTION_CHANCE) + { + spawnWorldThread(world.getBlockId(target.getX(), target.getY(), target.getZ()), world, x, y, z, random); + world.destroyBlock(target.getX(), target.getY(), target.getZ(), false); + } + } + } + + private ArrayList findReachableBlocks(World world, int x, int y, int z, int range, boolean includeAir) + { + int searchVolume = (int) Math.pow(2 * range + 1, 3); + HashMap pointDistances = new HashMap(searchVolume); + Queue points = new LinkedList(); + ArrayList targets = new ArrayList(); + + // Perform a breadth-first search outwards from the point at which the rift is located. + // Record the distances of the points we visit to stop the search at its maximum range. pointDistances.put(new Point3D(x, y, z), 0); addAdjacentBlocks(x, y, z, 0, pointDistances, points); while (!points.isEmpty()) @@ -176,10 +195,14 @@ public class BlockRift extends Block implements ITileEntityProvider Point3D current = points.remove(); int distance = pointDistances.get(current); - //If the current block is air, continue searching. Otherwise, try destroying the block. + // If the current block is air, continue searching. Otherwise, add the block to our list. if (world.isAirBlock(current.getX(), current.getY(), current.getZ())) { - //Make sure we stay within the search range + if (includeAir) + { + targets.add(current); + } + // Make sure we stay within the search range if (distance < BLOCK_DESTRUCTION_RANGE) { addAdjacentBlocks(current.getX(), current.getY(), current.getZ(), distance, pointDistances, points); @@ -187,18 +210,16 @@ public class BlockRift extends Block implements ITileEntityProvider } else { - //Check if the current block is immune to destruction by rifts. If not, randomly decide whether to destroy it. - //The randomness makes it so the destroyed area appears "noisy" if the rift is exposed to a large surface. - if (!isBlockImmune(world, current.getX(), current.getY(), current.getZ()) && - random.nextInt(MAX_BLOCK_DESTRUCTION_CHANCE) < BLOCK_DESTRUCTION_CHANCE) + // Check if the current block is immune to destruction by rifts. If not, add it to our list. + if (!isBlockImmune(world, current.getX(), current.getY(), current.getZ())) { - this.spawnWorldThread(world.getBlockId(current.getX(), current.getY(), current.getZ()), world, x, y, z, random); - world.destroyBlock(current.getX(), current.getY(), current.getZ(), false); + targets.add(current); } } } + return targets; } - + private void spawnWorldThread(int blockID, World world, int x, int y, int z, Random random) { if (blockID != 0 && (random.nextInt(MAX_WORLD_THREAD_CHANCE) < WORLD_THREAD_CHANCE) @@ -236,11 +257,40 @@ public class BlockRift extends Block implements ITileEntityProvider if (!this.isBlockImmune(world, x, y, z) && world.getChunkProvider().chunkExists(x >> 4, z >> 4)) { int blockID = world.getBlockId(x, y, z); - world.setBlock(x, y, z, properties.RiftBlockID); - this.spawnWorldThread(blockID, world, x, y, z, random); + if (world.setBlock(x, y, z, properties.RiftBlockID)) + spawnWorldThread(blockID, world, x, y, z, random); } } + public boolean spreadRift(NewDimData dimension, DimLink parent, World world, Random random) + { + int x, y, z, blockID; + Point4D source = parent.source(); + + // Find reachable blocks that are vulnerable to rift damage and include air + ArrayList targets = findReachableBlocks(world, source.getX(), source.getY(), source.getZ(), + RIFT_SPREAD_RANGE, true); + + if (!targets.isEmpty()) + { + // Choose randomly from among the possible locations where we can spawn a new rift + Point3D target = targets.get( random.nextInt(targets.size()) ); + x = target.getX(); + y = target.getY(); + z = target.getZ(); + + // Create a child, replace the block with a rift, and consider dropping World Thread + blockID = world.getBlockId(x, y, z); + if (world.setBlock(x, y, z, properties.RiftBlockID)) + { + dimension.createChildLink(x, y, z, parent); + spawnWorldThread(blockID, world, x, y, z, random); + return true; + } + } + return false; + } + /** * Lets pistons push through rifts, destroying them */ diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java index f8869ea9..42d25f6f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java @@ -3,7 +3,7 @@ package StevenDimDoors.mod_pocketDim.blocks; import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java index bac5c5dd..fb0a1871 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java @@ -6,7 +6,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java index cf2b6993..e59a94c4 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java @@ -3,7 +3,7 @@ package StevenDimDoors.mod_pocketDim.blocks; import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java index 7decebfc..6f7d881b 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java @@ -3,7 +3,7 @@ package StevenDimDoors.mod_pocketDim.blocks; import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java index 23e0b64c..d5ba8dde 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java @@ -21,7 +21,7 @@ public class CommandCreateDungeonRift extends DDCommandBase private CommandCreateDungeonRift() { - super("dd-rift", ""); + super("dd-rift", ""); } public static CommandCreateDungeonRift instance() @@ -41,7 +41,7 @@ public class CommandCreateDungeonRift extends DDCommandBase if (sender.worldObj.isRemote) { return DDCommandResult.SUCCESS; - } + } if (command.length == 0) { return DDCommandResult.TOO_FEW_ARGUMENTS; @@ -50,61 +50,38 @@ public class CommandCreateDungeonRift extends DDCommandBase { return DDCommandResult.TOO_MANY_ARGUMENTS; } + + DimLink link; + DungeonData result; + int x = MathHelper.floor_double(sender.posX); + int y = MathHelper.floor_double(sender.posY); + int z = MathHelper.floor_double (sender.posZ); + int orientation = MathHelper.floor_double((sender.rotationYaw + 180.0F) * 4.0F / 360.0F - 0.5D) & 3; - if (command[0].equals("list")) + result = findDungeonByPartialName(command[0], dungeonHelper.getRegisteredDungeons()); + if (result == null) { - Collection dungeonNames = dungeonHelper.getDungeonNames(); - for (String name : dungeonNames) - { - sendChat(sender, name); - } - sendChat(sender, ""); + result = findDungeonByPartialName(command[0], dungeonHelper.getUntaggedDungeons()); + } + //Check if we found any matches + if (result != null) + { + //Create a rift to our selected dungeon and notify the player + dimension = PocketManager.getDimensionData(sender.worldObj); + link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON, orientation); + PocketBuilder.generateSelectedDungeonPocket(link, mod_pocketDim.properties, result); + sender.worldObj.setBlock(x, y + 1, z, mod_pocketDim.blockRift.blockID, 0, 3); + sendChat(sender, "Created a rift to \"" + result.schematicName() + "\" dungeon (Dimension ID = " + link.destination().getDimension() + ")."); } else { - DimLink link; - DungeonData result; - int x = MathHelper.floor_double(sender.posX); - int y = MathHelper.floor_double(sender.posY); - int z = MathHelper.floor_double (sender.posZ); - int orientation = MathHelper.floor_double((sender.rotationYaw + 180.0F) * 4.0F / 360.0F - 0.5D) & 3; - - if (command[0].equals("random")) - { - - dimension = PocketManager.getDimensionData(sender.worldObj); - link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON, orientation); - sender.worldObj.setBlock(x, y + 1, z,mod_pocketDim.blockRift.blockID, 0, 3); - sendChat(sender, "Created a rift to a random dungeon."); - } - else - { - result = findDungeonByPartialName(command[0], dungeonHelper.getRegisteredDungeons()); - if (result == null) - { - result = findDungeonByPartialName(command[0], dungeonHelper.getUntaggedDungeons()); - } - //Check if we found any matches - if (result != null) - { - //Create a rift to our selected dungeon and notify the player - dimension = PocketManager.getDimensionData(sender.worldObj); - link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON, orientation); - PocketBuilder.generateSelectedDungeonPocket(link, mod_pocketDim.properties, result); - sender.worldObj.setBlock(x, y + 1, z, mod_pocketDim.blockRift.blockID, 0, 3); - sendChat(sender, "Created a rift to \"" + result.schematicName() + "\" dungeon (Dimension ID = " + link.destination().getDimension() + ")."); - } - else - { - //No matches! - return new DDCommandResult("Error: The specified dungeon was not found. Use 'list' to see a list of the available dungeons."); - } - } + //No matches! + return new DDCommandResult("Error: The specified dungeon was not found. Use 'dd-list' to see a list of the available dungeons."); } return DDCommandResult.SUCCESS; } - private DungeonData findDungeonByPartialName(String query, Collection dungeons) + private static DungeonData findDungeonByPartialName(String query, Collection dungeons) { //Search for the shortest dungeon name that contains the lowercase query string. String dungeonName; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateRandomRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateRandomRift.java new file mode 100644 index 00000000..013921b2 --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateRandomRift.java @@ -0,0 +1,117 @@ +package StevenDimDoors.mod_pocketDim.commands; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Random; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.MathHelper; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.LinkTypes; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; +import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; +import StevenDimDoors.mod_pocketDim.world.PocketBuilder; + +public class CommandCreateRandomRift extends DDCommandBase +{ + private static CommandCreateRandomRift instance = null; + private static Random random = new Random(); + + private CommandCreateRandomRift() + { + super("dd-random", ""); + } + + public static CommandCreateRandomRift instance() + { + if (instance == null) + instance = new CommandCreateRandomRift(); + + return instance; + } + + @Override + protected DDCommandResult processCommand(EntityPlayer sender, String[] command) + { + NewDimData dimension; + DungeonHelper dungeonHelper = DungeonHelper.instance(); + + if (sender.worldObj.isRemote) + { + return DDCommandResult.SUCCESS; + } + if (command.length > 1) + { + return DDCommandResult.TOO_MANY_ARGUMENTS; + } + + DimLink link; + DungeonData result; + int x = MathHelper.floor_double(sender.posX); + int y = MathHelper.floor_double(sender.posY); + int z = MathHelper.floor_double (sender.posZ); + int orientation = MathHelper.floor_double((sender.rotationYaw + 180.0F) * 4.0F / 360.0F - 0.5D) & 3; + + if (command.length == 0) + { + dimension = PocketManager.getDimensionData(sender.worldObj); + link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON, orientation); + sender.worldObj.setBlock(x, y + 1, z,mod_pocketDim.blockRift.blockID, 0, 3); + sendChat(sender, "Created a rift to a random dungeon."); + } + else + { + result = getRandomDungeonByPartialName(command[0], dungeonHelper.getRegisteredDungeons()); + if (result == null) + { + result = getRandomDungeonByPartialName(command[0], dungeonHelper.getUntaggedDungeons()); + } + //Check if we found any matches + if (result != null) + { + //Create a rift to our selected dungeon and notify the player + dimension = PocketManager.getDimensionData(sender.worldObj); + link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON, orientation); + PocketBuilder.generateSelectedDungeonPocket(link, mod_pocketDim.properties, result); + sender.worldObj.setBlock(x, y + 1, z, mod_pocketDim.blockRift.blockID, 0, 3); + sendChat(sender, "Created a rift to \"" + result.schematicName() + "\" dungeon (Dimension ID = " + link.destination().getDimension() + ")."); + } + else + { + //No matches! + return new DDCommandResult("Error: The specified dungeon was not found. Use 'list' to see a list of the available dungeons."); + } + } + return DDCommandResult.SUCCESS; + } + + private static DungeonData getRandomDungeonByPartialName(String query, Collection dungeons) + { + // Search for all dungeons that contain the lowercase query string. + String dungeonName; + String normalQuery = query.toLowerCase(); + ArrayList matches = new ArrayList(); + + for (DungeonData dungeon : dungeons) + { + // We need to extract the file's name. Comparing against schematicPath could + // yield false matches if the query string is contained within the path. + dungeonName = dungeon.schematicName().toLowerCase(); + if (dungeonName.contains(normalQuery)) + { + matches.add(dungeon); + } + } + if (matches.isEmpty()) + { + return null; + } + else + { + return matches.get( random.nextInt(matches.size()) ); + } + } +} \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java index 86008cdf..4c0ad4dd 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandExportDungeon.java @@ -4,7 +4,7 @@ import java.io.File; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayer; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; public class CommandExportDungeon extends DDCommandBase diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandListDungeons.java b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandListDungeons.java new file mode 100644 index 00000000..043d0fd3 --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandListDungeons.java @@ -0,0 +1,74 @@ +package StevenDimDoors.mod_pocketDim.commands; + +import java.util.ArrayList; + +import net.minecraft.entity.player.EntityPlayer; +import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; + +public class CommandListDungeons extends DDCommandBase +{ + private static CommandListDungeons instance = null; + + private CommandListDungeons() + { + super("dd-list", ""); + } + + public static CommandListDungeons instance() + { + if (instance == null) + instance = new CommandListDungeons(); + + return instance; + } + + @Override + protected DDCommandResult processCommand(EntityPlayer sender, String[] command) + { + int page; + int index; + int limit; + int pageCount; + ArrayList dungeonNames; + + if (sender.worldObj.isRemote) + { + return DDCommandResult.SUCCESS; + } + if (command.length > 1) + { + return DDCommandResult.TOO_MANY_ARGUMENTS; + } + if (command.length == 0) + { + page = 1; + } + else + { + try + { + page = Integer.parseInt(command[0]); + } + catch (NumberFormatException e) + { + return DDCommandResult.INVALID_ARGUMENTS; + } + } + dungeonNames = DungeonHelper.instance().getDungeonNames(); + pageCount = (dungeonNames.size() - 1) / 10 + 1; + if (page < 1 || page > pageCount) + { + return DDCommandResult.INVALID_ARGUMENTS; + } + sendChat(sender, "List of dungeons (page " + page + " of " + pageCount + "):"); + index = (page - 1) * 10; + limit = Math.min(index + 10, dungeonNames.size()); + for (; index < limit; index++) + { + sendChat(sender, dungeonNames.get(index)); + } + sendChat(sender, ""); + + return DDCommandResult.SUCCESS; + } +} \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/DDProperties.java b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java similarity index 95% rename from src/main/java/StevenDimDoors/mod_pocketDim/DDProperties.java rename to src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java index 0c61fafa..67b1b116 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/DDProperties.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java @@ -1,4 +1,4 @@ -package StevenDimDoors.mod_pocketDim; +package StevenDimDoors.mod_pocketDim.config; import java.io.File; @@ -87,7 +87,6 @@ public class DDProperties * Other Flags */ - public final boolean WorldRiftGenerationEnabled; public final boolean RiftSpreadEnabled; public final boolean RiftGriefingEnabled; public final boolean RiftsSpawnEndermenEnabled; @@ -109,6 +108,7 @@ public class DDProperties public final int FortressGatewayGenerationChance; public final int MonolithSpawningChance; public final int LimboReturnRange; + public final int WorldThreadRequirementLevel; public final String CustomSchematicDirectory; @@ -145,6 +145,10 @@ public class DDProperties CraftingGoldenDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Golden Door", true).getBoolean(true); CraftingGoldenDimensionalDoorAllowed = config.get(CATEGORY_CRAFTING, "Allow Crafting Golden Dimensional Door", true).getBoolean(true); + WorldThreadRequirementLevel = config.get(CATEGORY_CRAFTING, "World Thread Requirement Level", 4, + "Controls the amount of World Thread needed to craft Stable Fabric. The number must be an " + + "integer from 1 to 4. The levels change the recipe to use 1, 2, 4, or 8 threads, respectively. The default level is 4.").getInt(); + RiftBladeLootEnabled = config.get(CATEGORY_LOOT, "Enable Rift Blade Loot", true).getBoolean(true); FabricOfRealityLootEnabled = config.get(CATEGORY_LOOT, "Enable Fabric of Reality Loot", true).getBoolean(true); WorldThreadLootEnabled = config.get(CATEGORY_LOOT, "Enable World Thread Loot", true).getBoolean(true); @@ -157,7 +161,7 @@ public class DDProperties "Sets whether groups of connected rifts will spawn Endermen").getBoolean(true); LimboEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Limbo", true, - "Sets whether the Limbo dimension is activated").getBoolean(true); + "Sets whether players are teleported to Limbo when they die in any pocket dimension").getBoolean(true); LimboReturnsInventoryEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Limbo Returns Inventory", true, "Sets whether players keep their inventories upon dying and respawning in Limbo").getBoolean(true); HardcoreLimboEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Hardcore Limbo", false, @@ -204,9 +208,6 @@ public class DDProperties LimboDimensionID = config.get(CATEGORY_DIMENSION, "Limbo Dimension ID", -23).getInt(); PocketProviderID = config.get(CATEGORY_PROVIDER, "Pocket Provider ID", 24).getInt(); LimboProviderID = config.get(CATEGORY_PROVIDER, "Limbo Provider ID", 13).getInt(); - - WorldRiftGenerationEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Rift World Generation", true, - "Sets whether dungeon rifts generate in dimensions other than Limbo").getBoolean(true); MonolithTeleportationEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Monolith Teleportation", true, "Sets whether Monoliths can teleport players").getBoolean(true); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDWorldProperties.java b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDWorldProperties.java new file mode 100644 index 00000000..db2a4988 --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDWorldProperties.java @@ -0,0 +1,79 @@ +package StevenDimDoors.mod_pocketDim.config; + +import java.io.File; + +import net.minecraftforge.common.Configuration; + +public class DDWorldProperties +{ + /** + * World Generation Settings + */ + + public final DimensionFilter RiftClusterDimensions; + public final DimensionFilter RiftGatewayDimensions; + + /** + * General Flags + */ + public final boolean LimboEscapeEnabled; + + + //Names of categories + private static final String CATEGORY_WORLD_GENERATION = "world generation"; + + public DDWorldProperties(File configFile) + { + // TODO: For the next major update (e.g. to MC 1.7), please move all world-specific settings + // into this config file instead of using the global ID file. + + Configuration config = new Configuration(configFile); + config.load(); + + config.addCustomCategoryComment(CATEGORY_WORLD_GENERATION, + "The following settings require lists of dimensions in a specific format. " + + "A list must consist of ranges separated by commas. A range may be a single number to indicate " + + "just one dimension or two numbers in the form \"X - Y\". Spaces are permitted " + + "but not required. Example: -100, -10 - -1, 20 - 30"); + + RiftClusterDimensions = loadFilter(config, "Rift Cluster", "Rift Clusters"); + RiftGatewayDimensions = loadFilter(config, "Rift Gateway", "Rift Gateways"); + + LimboEscapeEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Limbo Escape", true, + "Sets whether players are teleported out of Limbo when walking over the Eternal Fabric that " + + "generates near the bottom of the dimension. If disabled, players could still leave through " + + "dungeons in Limbo or by dying (if Hardcore Limbo is disabled). The default value is true.").getBoolean(true); + + config.save(); + } + + private static DimensionFilter loadFilter(Configuration config, String prefix, String description) + { + boolean enableBlacklist = config.get(CATEGORY_WORLD_GENERATION, "Enable " + prefix + " Blacklist", true, + "Sets whether " + description + " will not generate in certain blacklisted dimensions. " + + "If set to false, then " + description + " will follow a whitelist instead.").getBoolean(true); + + String whitelist = config.get(CATEGORY_WORLD_GENERATION, prefix + " Whitelist", "", + "A list of the only dimensions in which " + description + " may generate.").getString(); + + String blacklist = config.get(CATEGORY_WORLD_GENERATION, prefix + " Blacklist", "", + "A list of dimensions in which " + description + " may not generate.").getString(); + + try + { + if (enableBlacklist) + { + return DimensionFilter.parseBlacklist(blacklist); + } + else + { + return DimensionFilter.parseWhitelist(whitelist); + } + } + catch (Exception inner) + { + throw new RuntimeException("An error occurred while loading a whitelist or blacklist setting for " + + description + ". Please make sure that your configuration file is set up correctly.", inner); + } + } +} \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/config/DimensionFilter.java b/src/main/java/StevenDimDoors/mod_pocketDim/config/DimensionFilter.java new file mode 100644 index 00000000..53b8b3ee --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDim/config/DimensionFilter.java @@ -0,0 +1,93 @@ +package StevenDimDoors.mod_pocketDim.config; + +import com.google.common.collect.Range; +import com.google.common.collect.RangeSet; +import com.google.common.collect.TreeRangeSet; + +public class DimensionFilter +{ + private RangeSet blacklist; + + private DimensionFilter(RangeSet blacklist) + { + this.blacklist = blacklist; + } + + public boolean isAccepted(int dimensionID) + { + return !blacklist.contains(dimensionID); + } + + public boolean isRejected(int dimensionID) + { + return blacklist.contains(dimensionID); + } + + private static RangeSet parseRangeSet(String list) + { + int index; + int start; + int end; + String startPart; + String endPart; + String[] intervals; + RangeSet ranges = TreeRangeSet.create(); + + // Strip out all whitespace characters + list = list.replaceAll("\\s", ""); + if (list.isEmpty()) + { + return ranges; + } + intervals = list.split(","); + + // Iterate over all the interval strings + for (String interval : intervals) + { + // Check if the interval contains a minus sign after the first character + // That indicates that we're dealing with an interval and not a single number + if (interval.length() > 1) + { + index = interval.indexOf("-", 1); + } + else + { + index = -1; + } + try + { + if (index >= 0) + { + // Parse this as a range with two values as endpoints + startPart = interval.substring(0, index); + endPart = interval.substring(index + 1); + start = Integer.parseInt(startPart); + end = Integer.parseInt(endPart); + } + else + { + // Parse this as a single value + start = Integer.parseInt(interval); + end = start; + } + // Add the interval to the set of intervals + ranges.add( Range.closed(start, end) ); + } + catch (Exception e) + { + throw new IllegalArgumentException("\"" + interval + "\" is not a valid value or range for dimension IDs"); + } + } + return ranges; + } + + public static DimensionFilter parseWhitelist(String list) + { + return new DimensionFilter(parseRangeSet(list).complement()); + } + + public static DimensionFilter parseBlacklist(String list) + { + return new DimensionFilter(parseRangeSet(list)); + } +} diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index e4e9c7aa..bdb7fd71 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -22,10 +22,10 @@ import net.minecraft.world.WorldServer; import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.network.ForgePacket; import net.minecraftforge.common.network.packet.DimensionRegisterPacket; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; import StevenDimDoors.mod_pocketDim.items.BaseItemDoor; import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; @@ -40,9 +40,12 @@ public class DDTeleporter { private static final Random random = new Random(); private static final int NETHER_DIMENSION_ID = -1; + private static final int OVERWORLD_DIMENSION_ID = 0; private static final int END_DIMENSION_ID = 1; private static final int MAX_NETHER_EXIT_CHANCE = 100; private static final int NETHER_EXIT_CHANCE = 20; //20% chance to compensate for frequent exit failures - the Nether often doesn't have enough space for an exit + private static final int MAX_OVERWORLD_EXIT_CHANCE = 100; + private static final int OVERWORLD_EXIT_CHANCE = 15; private static final int MAX_ROOT_SHIFT_CHANCE = 100; private static final int START_ROOT_SHIFT_CHANCE = 0; private static final int ROOT_SHIFT_CHANCE_PER_LEVEL = 5; @@ -633,7 +636,11 @@ public class DDTeleporter if (random.nextInt(MAX_ROOT_SHIFT_CHANCE) < shiftChance) { - if (random.nextInt(MAX_NETHER_EXIT_CHANCE) < NETHER_EXIT_CHANCE) + if (current.root().id() != OVERWORLD_DIMENSION_ID && random.nextInt(MAX_OVERWORLD_EXIT_CHANCE) < OVERWORLD_EXIT_CHANCE) + { + return generateSafeExit(PocketManager.getDimensionData(OVERWORLD_DIMENSION_ID), link, properties); + } + if (current.root().id() != NETHER_DIMENSION_ID && random.nextInt(MAX_NETHER_EXIT_CHANCE) < NETHER_EXIT_CHANCE) { return generateSafeExit(PocketManager.getDimensionData(NETHER_DIMENSION_ID), link, properties); } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java index 46158a80..ba977d58 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -8,14 +8,13 @@ import java.util.TreeMap; import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; -@SuppressWarnings("deprecation") public abstract class NewDimData { private static class InnerDimLink extends DimLink diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 29fbf754..842c6c81 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -15,9 +15,9 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.DimensionManager; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.helpers.Compactor; import StevenDimDoors.mod_pocketDim.helpers.DeleteFolder; import StevenDimDoors.mod_pocketDim.saving.DDSaveHandler; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index 8395d9b6..38848ad3 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -16,9 +16,9 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntitySign; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.blocks.IDimDoor; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java index 62bec134..f1242259 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java @@ -12,7 +12,7 @@ import net.minecraft.tileentity.TileEntityChest; import net.minecraft.tileentity.TileEntityDispenser; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDLoot; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.schematic.WorldOperation; public class FillContainersOperation extends WorldOperation @@ -20,8 +20,8 @@ public class FillContainersOperation extends WorldOperation private Random random; private DDProperties properties; - private static final int GRAVE_CHEST_CHANCE = 100; - private static final int MAX_GRAVE_CHEST_CHANCE = 700; + private static final int GRAVE_CHEST_CHANCE = 1; + private static final int MAX_GRAVE_CHEST_CHANCE = 6; public FillContainersOperation(Random random, DDProperties properties) { diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index 3f8e7a3b..545168d7 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -19,8 +19,8 @@ import java.util.regex.Pattern; import net.minecraft.util.WeightedRandom; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; @@ -577,11 +577,11 @@ public class DungeonHelper return selection; } - public Collection getDungeonNames() { - - //Use a HashSet to guarantee that all dungeon names will be distinct. - //This shouldn't be necessary if we keep proper lists without repetitions, - //but it's a fool-proof workaround. + public ArrayList getDungeonNames() + { + // Use a HashSet to guarantee that all dungeon names will be distinct. + // This shouldn't be necessary if we keep proper lists without repetitions, + // but it's a fool-proof workaround. HashSet dungeonNames = new HashSet(); dungeonNames.addAll( parseDungeonNames(registeredDungeons) ); dungeonNames.addAll( parseDungeonNames(untaggedDungeons) ); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java index 86512702..e97ad6ab 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java @@ -11,8 +11,8 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java index ceee3880..d8462519 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java @@ -20,8 +20,8 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.PocketManager; import com.google.common.collect.Multimap; import cpw.mods.fml.relauncher.Side; @@ -36,41 +36,9 @@ public class ItemRiftBlade extends ItemSword super(itemID, EnumToolMaterial.EMERALD); this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); - this.setMaxStackSize(1); - this.setMaxDamage(500); - this.hasSubtypes = false; this.properties = properties; } - - @Override - @SideOnly(Side.CLIENT) - public boolean isFull3D() - { - return true; - } - - @Override - public float getStrVsBlock(ItemStack par1ItemStack, Block par2Block) - { - if (par2Block.blockID == Block.web.blockID) - { - return 15.0F; - } - else - { - Material material = par2Block.blockMaterial; - return material != Material.plants && material != Material.vine && material != Material.coral && material != Material.leaves && material != Material.pumpkin ? 1.0F : 1.5F; - } - } - - @Override - public Multimap getItemAttributeModifiers() - { - Multimap multimap = super.getItemAttributeModifiers(); - multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", (double)7, 0)); - return multimap; - } - + @Override @SideOnly(Side.CLIENT) public boolean hasEffect(ItemStack par1ItemStack) @@ -78,13 +46,6 @@ public class ItemRiftBlade extends ItemSword return true; } - @Override - public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLiving, EntityLivingBase par3EntityLiving) - { - par1ItemStack.damageItem(1, par3EntityLiving); - return true; - } - @Override public MovingObjectPosition getMovingObjectPositionFromPlayer(World par1World, EntityPlayer par2EntityPlayer, boolean par3) { @@ -147,7 +108,7 @@ public class ItemRiftBlade extends ItemSword if (!world.isRemote) { @SuppressWarnings("unchecked") - List list = world.getEntitiesWithinAABB(EntityLiving.class, AxisAlignedBB.getBoundingBox(player.posX-8,player.posY-8, player.posZ-8, player.posX+8,player.posY+8, player.posZ+8)); + List list = world.getEntitiesWithinAABB(EntityLiving.class, AxisAlignedBB.getBoundingBox(player.posX-10,player.posY-10, player.posZ-10, player.posX+10,player.posY+10, player.posZ+10)); list.remove(player); for (EntityLiving ent : list) @@ -223,8 +184,7 @@ public class ItemRiftBlade extends ItemSword @SideOnly(Side.CLIENT) public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - par3List.add("Creates temporary doors"); - par3List.add("on rifts, rotates doors,"); + par3List.add("Opens temporary doors on rifts"); par3List.add("and has a teleport attack."); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index a4e68444..a5f2e8a7 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -15,7 +15,6 @@ import net.minecraft.world.biome.BiomeGenBase; import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fluids.Fluid; import StevenDimDoors.mod_pocketDim.blocks.BlockDimWall; import StevenDimDoors.mod_pocketDim.blocks.BlockDimWallPerm; import StevenDimDoors.mod_pocketDim.blocks.BlockDoorGold; @@ -29,11 +28,15 @@ import StevenDimDoors.mod_pocketDim.blocks.UnstableDoor; import StevenDimDoors.mod_pocketDim.blocks.WarpDoor; import StevenDimDoors.mod_pocketDim.commands.CommandCreateDungeonRift; import StevenDimDoors.mod_pocketDim.commands.CommandCreatePocket; +import StevenDimDoors.mod_pocketDim.commands.CommandCreateRandomRift; import StevenDimDoors.mod_pocketDim.commands.CommandDeleteAllLinks; import StevenDimDoors.mod_pocketDim.commands.CommandDeleteRifts; import StevenDimDoors.mod_pocketDim.commands.CommandExportDungeon; +import StevenDimDoors.mod_pocketDim.commands.CommandListDungeons; import StevenDimDoors.mod_pocketDim.commands.CommandResetDungeons; import StevenDimDoors.mod_pocketDim.commands.CommandTeleportPlayer; +import StevenDimDoors.mod_pocketDim.config.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDWorldProperties; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.helpers.ChunkLoaderHelper; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; @@ -74,8 +77,9 @@ import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.event.FMLServerAboutToStartEvent; import cpw.mods.fml.common.event.FMLServerStartingEvent; -import cpw.mods.fml.common.event.FMLServerStoppingEvent; +import cpw.mods.fml.common.event.FMLServerStoppedEvent; import cpw.mods.fml.common.network.NetworkMod; import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler; import cpw.mods.fml.common.registry.EntityRegistry; @@ -134,6 +138,7 @@ public class mod_pocketDim public static boolean isPlayerWearingGoogles = false; public static DDProperties properties; + public static DDWorldProperties worldProperties; public static CustomLimboPopulator spawner; //Added this field temporarily. Will be refactored out later. public static FastRiftRegenerator fastRiftRegenerator; public static GatewayGenerator gatewayGenerator; @@ -229,8 +234,11 @@ public class mod_pocketDim GameRegistry.registerBlock(blockDimWall, ItemBlockDimWall.class, "Fabric of Reality"); - DimensionManager.registerProviderType(properties.PocketProviderID, PocketProvider.class, false); - DimensionManager.registerProviderType(properties.LimboProviderID, LimboProvider.class, false); + if (!DimensionManager.registerProviderType(properties.PocketProviderID, PocketProvider.class, false)) + throw new IllegalStateException("There is a provider ID conflict between PocketProvider from Dimensional Doors and another provider type. Fix your configuration!"); + if (!DimensionManager.registerProviderType(properties.LimboProviderID, LimboProvider.class, false)) + throw new IllegalStateException("There is a provider ID conflict between LimboProvider from Dimensional Doors and another provider type. Fix your configuration!"); + DimensionManager.registerDimension(properties.LimboDimensionID, properties.LimboProviderID); LanguageRegistry.addName(goldenDoor, "Golden Door"); @@ -296,28 +304,41 @@ public class mod_pocketDim } @EventHandler - public void onServerStopping(FMLServerStoppingEvent event) + public void onServerStopped(FMLServerStoppedEvent event) { try { PocketManager.unload(); deathTracker.writeToFile(); deathTracker = null; + worldProperties = null; } catch (Exception e) { e.printStackTrace(); } } + + @EventHandler + public void onServerAboutToStart(FMLServerAboutToStartEvent event) + { + final String saveRootDirectory = DimensionManager.getCurrentSaveRootDirectory().getAbsolutePath(); + + // Load the config file that's specific to this world + worldProperties = new DDWorldProperties(new File(saveRootDirectory + "/DimensionalDoors/DimDoorsWorld.cfg")); + + // Initialize a new DeathTracker + deathTracker = new DeathTracker(saveRootDirectory + "/DimensionalDoors/data/deaths.txt"); + } @EventHandler public void onServerStarting(FMLServerStartingEvent event) { - //TODO- load dims with forced chunks on server startup here - // Register commands with the server event.registerServerCommand( CommandResetDungeons.instance() ); event.registerServerCommand( CommandCreateDungeonRift.instance() ); + event.registerServerCommand( CommandListDungeons.instance() ); + event.registerServerCommand( CommandCreateRandomRift.instance() ); event.registerServerCommand( CommandDeleteAllLinks.instance() ); //CommandDeleteDimensionData.instance().register(event); event.registerServerCommand( CommandDeleteRifts.instance() ); @@ -327,9 +348,6 @@ public class mod_pocketDim event.registerServerCommand( CommandCreatePocket.instance() ); event.registerServerCommand( CommandTeleportPlayer.instance() ); - // Initialize a new DeathTracker - String deathTrackerFile = DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/data/deaths.txt"; - deathTracker = new DeathTracker(deathTrackerFile); try { @@ -337,7 +355,8 @@ public class mod_pocketDim } catch (Exception e) { - System.out.println("Loading chunkloaders failed"); + System.err.println("Failed to load chunk loaders for Dimensional Doors. The following error occurred:"); + System.err.println(e.toString()); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/CustomLimboPopulator.java b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/CustomLimboPopulator.java index 908e2e94..465e57b2 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/CustomLimboPopulator.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/CustomLimboPopulator.java @@ -9,8 +9,8 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.world.GameRules; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.helpers.yCoordHelper; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/LimboDecay.java b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/LimboDecay.java index c3251090..e5c9420e 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/LimboDecay.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/LimboDecay.java @@ -7,7 +7,7 @@ import net.minecraft.block.BlockContainer; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; /** * Provides methods for applying Limbo decay. Limbo decay refers to the effect that most blocks placed in Limbo diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java index 9119d084..ae1f7cc9 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java @@ -18,8 +18,8 @@ import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.world.LimboProvider; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index 6432062c..135235e5 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -25,9 +25,9 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.ServerPacketHandler; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; @@ -35,13 +35,15 @@ import StevenDimDoors.mod_pocketDim.util.Point4D; public class TileEntityRift extends TileEntity { - private static final int MAX_SPREAD_ATTEMPTS = 3; - private static final int MAX_SEARCH_ATTEMPTS = 50; - private static final int MAX_ANCESTOR_LINKS = 3; + private static final int RIFT_INTERACTION_RANGE = 5; + private static final int MAX_ANCESTOR_LINKS = 2; + private static final int MAX_CHILD_LINKS = 1; private static final int ENDERMAN_SPAWNING_CHANCE = 1; private static final int MAX_ENDERMAN_SPAWNING_CHANCE = 32; private static final int RIFT_SPREAD_CHANCE = 1; private static final int MAX_RIFT_SPREAD_CHANCE = 256; + private static final int HOSTILE_ENDERMAN_CHANCE = 1; + private static final int MAX_HOSTILE_ENDERMAN_CHANCE = 3; private static Random random = new Random(); @@ -53,7 +55,6 @@ public class TileEntityRift extends TileEntity public int zOffset = 0; public boolean shouldClose = false; private boolean hasUpdated = false; - private boolean hasGrownRifts = false; public DimLink nearestRiftData; public int spawnedEndermenID = 0; @@ -109,8 +110,6 @@ public class TileEntityRift extends TileEntity this.calculateOldParticleOffset(); //this also calculates the distance for the particle stuff. } updateTimer++; - - } @Override @@ -171,10 +170,10 @@ public class TileEntityRift extends TileEntity enderman.setLocationAndAngles(xCoord + 0.5, yCoord - 1, zCoord + 0.5, 5, 6); worldObj.spawnEntityInWorld(enderman); - if(this.worldObj.rand.nextInt(3)==0) + if (random.nextInt(MAX_HOSTILE_ENDERMAN_CHANCE) < HOSTILE_ENDERMAN_CHANCE) { EntityPlayer player = this.worldObj.getClosestPlayerToEntity(enderman, 50); - if(player!=null) + if (player != null) { enderman.setTarget(player); } @@ -320,7 +319,7 @@ public class TileEntityRift extends TileEntity public void grow(DDProperties properties) { - if (worldObj.isRemote || hasGrownRifts || !properties.RiftSpreadEnabled + if (worldObj.isRemote || !properties.RiftSpreadEnabled || random.nextInt(MAX_RIFT_SPREAD_CHANCE) < RIFT_SPREAD_CHANCE || this.shouldClose) { return; @@ -329,58 +328,20 @@ public class TileEntityRift extends TileEntity NewDimData dimension = PocketManager.getDimensionData(worldObj); DimLink link = dimension.getLink(xCoord, yCoord, zCoord); - if (countAncestorLinks(link) > MAX_ANCESTOR_LINKS) + if (link.childCount() >= MAX_CHILD_LINKS || countAncestorLinks(link) >= MAX_ANCESTOR_LINKS) { return; } - // The probability of rifts trying to spread increases if more rifts are nearby - // Players should see rifts spread faster within clusters than at the edges of clusters + // The probability of rifts trying to spread increases if more rifts are nearby. + // Players should see rifts spread faster within clusters than at the edges of clusters. // Also, single rifts CANNOT spread. - int nearRifts = dimension.findRiftsInRange(this.worldObj, 5, xCoord, yCoord, zCoord).size(); + int nearRifts = dimension.findRiftsInRange(worldObj, RIFT_INTERACTION_RANGE, xCoord, yCoord, zCoord).size(); if (nearRifts == 0 || random.nextInt(nearRifts) == 0) { return; } - - int x, y, z; - int spreadAttempts = 0; - for (int searchAttempts = 0; searchAttempts < MAX_SEARCH_ATTEMPTS; searchAttempts++) - { - x = xCoord + MathHelper.getRandomIntegerInRange(random, -6, 6); - y = yCoord + MathHelper.getRandomIntegerInRange(random, -4, 4); - z = zCoord + MathHelper.getRandomIntegerInRange(random, -6, 6); - - if (y >= 0 && y < worldObj.getActualHeight() && worldObj.isAirBlock(x, y, z)) - { - Vec3 position = worldObj.getWorldVec3Pool().getVecFromPool(xCoord, yCoord, zCoord); - Vec3 spreadTarget = worldObj.getWorldVec3Pool().getVecFromPool(x, y, z); - MovingObjectPosition hit = worldObj.clip(position, spreadTarget, false); - if (hit == null || !mod_pocketDim.blockRift.isBlockImmune(worldObj, hit.blockX, hit.blockY, hit.blockZ)) - { - if(hit!=null) - { - dimension.createChildLink(hit.blockX, hit.blockY, hit.blockZ, link); - this.worldObj.setBlock(hit.blockX, hit.blockY, hit.blockZ, mod_pocketDim.blockRift.blockID); - } - else - { - dimension.createChildLink(x,y,z,link); - this.worldObj.setBlock(x,y,z, mod_pocketDim.blockRift.blockID); - } - hasGrownRifts = true; - break; - } - else - { - spreadAttempts++; - if (spreadAttempts >= MAX_SPREAD_ATTEMPTS) - { - break; - } - } - } - } + mod_pocketDim.blockRift.spreadRift(dimension, link, worldObj, random); } @Override @@ -393,7 +354,6 @@ public class TileEntityRift extends TileEntity this.xOffset = nbt.getInteger("xOffset"); this.yOffset = nbt.getInteger("yOffset"); this.zOffset = nbt.getInteger("zOffset"); - this.hasGrownRifts = nbt.getBoolean("grownRifts"); this.age = nbt.getInteger("age"); this.shouldClose = nbt.getBoolean("shouldClose"); this.spawnedEndermenID = nbt.getInteger("spawnedEndermenID"); @@ -406,7 +366,6 @@ public class TileEntityRift extends TileEntity nbt.setInteger("age", this.age); nbt.setInteger("count", this.updateTimer); nbt.setInteger("count2", this.riftCloseTimer); - nbt.setBoolean("grownRifts",this.hasGrownRifts); nbt.setInteger("xOffset", this.xOffset); nbt.setInteger("yOffset", this.yOffset); nbt.setInteger("zOffset", this.zOffset); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/CustomCaveGen.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/CustomCaveGen.java index 3e892be6..1f9b6808 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/CustomCaveGen.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/CustomCaveGen.java @@ -6,7 +6,7 @@ import net.minecraft.block.Block; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.gen.MapGenBase; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; public class CustomCaveGen extends MapGenBase { diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboGenerator.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboGenerator.java index a53faaf4..dd3185f3 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboGenerator.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboGenerator.java @@ -17,7 +17,7 @@ import net.minecraft.world.gen.feature.MapGenScatteredFeature; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.Event.Result; import net.minecraftforge.event.terraingen.ChunkProviderEvent; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.ticking.CustomLimboPopulator; public class LimboGenerator extends ChunkProviderGenerate diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java index 71e587d6..3be95209 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java @@ -12,8 +12,8 @@ import net.minecraft.world.biome.WorldChunkManagerHell; import net.minecraft.world.chunk.IChunkProvider; import net.minecraftforge.client.IRenderHandler; import StevenDimDoors.mod_pocketDim.CloudRenderBlank; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.ticking.CustomLimboPopulator; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index 8a30d344..c384ec48 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -9,9 +9,9 @@ import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.storage.ExtendedBlockStorage; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.experimental.MazeBuilder; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.blocks.IDimDoor; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketProvider.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketProvider.java index 33f8c703..08924d82 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketProvider.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketProvider.java @@ -9,8 +9,8 @@ import net.minecraft.world.chunk.IChunkProvider; import net.minecraftforge.client.IRenderHandler; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.CloudRenderBlank; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.ticking.CustomLimboPopulator; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDNetherFortressGenerator.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDNetherFortressGenerator.java index c34c5fed..644a5c1b 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDNetherFortressGenerator.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDNetherFortressGenerator.java @@ -1,6 +1,6 @@ package StevenDimDoors.mod_pocketDim.world.fortresses; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import net.minecraft.world.gen.structure.MapGenNetherBridge; import net.minecraft.world.gen.structure.MapGenStructureIO; import net.minecraft.world.gen.structure.StructureStart; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDStructureNetherBridgeStart.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDStructureNetherBridgeStart.java index 5736e36c..bc7cc065 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDStructureNetherBridgeStart.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDStructureNetherBridgeStart.java @@ -10,7 +10,7 @@ import net.minecraft.world.gen.structure.ComponentNetherBridgeThrone; import net.minecraft.world.gen.structure.StructureBoundingBox; import net.minecraft.world.gen.structure.StructureComponent; import net.minecraft.world.gen.structure.StructureNetherBridgeStart; -import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.config.DDProperties; public class DDStructureNetherBridgeStart extends StructureNetherBridgeStart { diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java index 0a2b47da..92572b70 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java @@ -6,9 +6,9 @@ import java.util.Random; import java.util.TreeMap; import java.util.Map.Entry; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayGenerator.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayGenerator.java index a95ee24d..9936150f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayGenerator.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayGenerator.java @@ -8,8 +8,8 @@ import net.minecraft.block.material.Material; import net.minecraft.world.World; import net.minecraft.world.chunk.IChunkProvider; import net.minecraftforge.common.DimensionManager; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkTypes; import StevenDimDoors.mod_pocketDim.core.NewDimData; @@ -58,15 +58,17 @@ public class GatewayGenerator implements IWorldGenerator @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { - //Don't generate rifts or gateways if the rift generation flag is disabled, - //the current world is a pocket dimension, or the world is remote. - //Also don't generate anything in The End. - if (world.isRemote || (!properties.WorldRiftGenerationEnabled) || - (world.provider instanceof PocketProvider) || (world.provider.dimensionId == END_DIMENSION_ID)||(world.provider.dimensionId == NETHER_DIMENSION_ID)) + // Don't generate rifts or gateways if the current world is a pocket dimension or the world is remote. + // Also don't generate anything in the Nether or The End. + int dimensionID = world.provider.dimensionId; + if (world.isRemote + || (world.provider instanceof PocketProvider) + || (dimensionID == END_DIMENSION_ID) + || (dimensionID == NETHER_DIMENSION_ID)) { return; } - //This check prevents a crash related to superflat worlds not loading World 0 + // This check prevents a crash related to superflat worlds not loading World 0 if (DimensionManager.getWorld(OVERWORLD_DIMENSION_ID) == null) { return; @@ -78,8 +80,10 @@ public class GatewayGenerator implements IWorldGenerator DimLink link; NewDimData dimension; - //Randomly decide whether to place a cluster of rifts here - if (random.nextInt(MAX_CLUSTER_GENERATION_CHANCE) < properties.ClusterGenerationChance) + // Check if we're allowed to generate rift clusters in this dimension. + // If so, randomly decide whether to one. + if (mod_pocketDim.worldProperties.RiftClusterDimensions.isAccepted(dimensionID) + && random.nextInt(MAX_CLUSTER_GENERATION_CHANCE) < properties.ClusterGenerationChance) { link = null; dimension = null; @@ -113,9 +117,10 @@ public class GatewayGenerator implements IWorldGenerator while (random.nextInt(MAX_CLUSTER_GROWTH_CHANCE) < CLUSTER_GROWTH_CHANCE); } - // Randomly decide whether to place a Rift Gateway here. + // Check if we can place a Rift Gateway in this dimension, then randomly decide whether to place one. // This only happens if a rift cluster was NOT generated. - else if (random.nextInt(MAX_GATEWAY_GENERATION_CHANCE) < properties.GatewayGenerationChance) + else if (mod_pocketDim.worldProperties.RiftGatewayDimensions.isAccepted(dimensionID) && + random.nextInt(MAX_GATEWAY_GENERATION_CHANCE) < properties.GatewayGenerationChance) { valid = false; x = y = z = 0; //Stop the compiler from freaking out diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayLimbo.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayLimbo.java index 8c54e2c8..6dbf10b9 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayLimbo.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayLimbo.java @@ -1,8 +1,8 @@ package StevenDimDoors.mod_pocketDim.world.gateways; import net.minecraft.world.World; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.items.BaseItemDoor; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewaySandstonePillars.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewaySandstonePillars.java index 32b0bfa6..cab1e12f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewaySandstonePillars.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewaySandstonePillars.java @@ -3,8 +3,8 @@ package StevenDimDoors.mod_pocketDim.world.gateways; import java.util.ArrayList; import java.util.Random; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import net.minecraft.block.Block; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayTwoPillars.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayTwoPillars.java index 595d522d..9e1ea336 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayTwoPillars.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayTwoPillars.java @@ -2,8 +2,8 @@ package StevenDimDoors.mod_pocketDim.world.gateways; import java.util.ArrayList; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; import StevenDimDoors.mod_pocketDim.world.LimboProvider; diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java index 88358d1d..6639974c 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java @@ -11,8 +11,8 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java index dc65e578..0f3ea97d 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java @@ -11,9 +11,9 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; -import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.blocks.TransTrapdoor; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityTransTrapdoor; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/src/main/resources/schematics/ruins.txt b/src/main/resources/schematics/ruins.txt index 2641e62f..f922cbbc 100644 --- a/src/main/resources/schematics/ruins.txt +++ b/src/main/resources/schematics/ruins.txt @@ -1,4 +1,5 @@ /schematics/ruins/complexHall_buggyTopEntry1_open_100.schematic +/schematics/ruins/ComplexHall_Cere-PuzzleWall_Open_75.schematic /schematics/ruins/complexHall_exitRuinsWithHiddenDoor_open_100.schematic /schematics/ruins/complexHall_hallwayHiddenTreasure_closed_100.schematic /schematics/ruins/complexHall_largeBrokenHall_closed_100.schematic @@ -15,6 +16,7 @@ /schematics/ruins/complexHall_tntPuzzleTrap_closed_50.schematic /schematics/ruins/deadEnd_azersDungeonO_closed_100.schematic /schematics/ruins/deadEnd_brokenPillarsO_open_100.schematic +/schematics/ruins/DeadEnd_Cere-FloatingAltar_Open_75.schematic /schematics/ruins/deadEnd_diamondTowerTemple1_open_100.schematic /schematics/ruins/deadEnd_fallingTrapO_open_100.schematic /schematics/ruins/deadEnd_hiddenStaircaseO_open_100.schematic @@ -72,6 +74,7 @@ /schematics/ruins/trap_pistonSmasherHall_closed_100.schematic /schematics/ruins/Trap_SK-FakeTNTTrap-B_Closed_50.schematic /schematics/ruins/Trap_SK-NicolesTower_Open_50.schematic +/schematics/ruins/Trap_SK-RaceTheLight_Closed_50.schematic /schematics/ruins/Trap_SK-RestlessCorridor_Open_40.schematic /schematics/ruins/Trap_SK-SimpleLeftTrap_Closed_50.schematic /schematics/ruins/Trap_SK-SimpleRightTrap_Closed_50.schematic @@ -79,6 +82,3 @@ /schematics/ruins/Trap_SK-TrappedStairsUp_Closed_50.schematic /schematics/ruins/Trap_SK-UTrapRight_Open_50.schematic /schematics/ruins/trap_wallFallcomboPistonHall_closed_200.schematic -/schematics/ruins/DeadEnd_Floating-Altar_Open_100.schematic -/schematics/ruins/complexHall_exitRuinsWithHiddenDoor_open_100 -.schematic diff --git a/src/main/resources/schematics/ruins/ComplexHall_Cere-PuzzleWall_Open.schematic b/src/main/resources/schematics/ruins/ComplexHall_Cere-PuzzleWall_Open_75.schematic similarity index 100% rename from src/main/resources/schematics/ruins/ComplexHall_Cere-PuzzleWall_Open.schematic rename to src/main/resources/schematics/ruins/ComplexHall_Cere-PuzzleWall_Open_75.schematic diff --git a/src/main/resources/schematics/ruins/DeadEnd_Cere-FloatingAltar_Open_100.schematic b/src/main/resources/schematics/ruins/DeadEnd_Cere-FloatingAltar_Open_75.schematic similarity index 100% rename from src/main/resources/schematics/ruins/DeadEnd_Cere-FloatingAltar_Open_100.schematic rename to src/main/resources/schematics/ruins/DeadEnd_Cere-FloatingAltar_Open_75.schematic diff --git a/src/main/resources/schematics/ruins/Trap_SK-RaceTheLight_Closed_50.schematic b/src/main/resources/schematics/ruins/Trap_SK-RaceTheLight_Closed_50.schematic new file mode 100644 index 00000000..44df5265 Binary files /dev/null and b/src/main/resources/schematics/ruins/Trap_SK-RaceTheLight_Closed_50.schematic differ