From 25d3931210953202e76b08ff8afe51cc6676844c Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 7 Sep 2013 05:12:07 -0400 Subject: [PATCH 1/5] Improved DDLoot Fixed an issue with DDLoot where we couldn't distinguish between items with the same ID but different subtypes while merging loot categories. For instance, we could not include two different colors of dye in our loot because their item IDs matched. We can now tell them apart properly and include both items. --- StevenDimDoors/mod_pocketDim/DDLoot.java | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/DDLoot.java b/StevenDimDoors/mod_pocketDim/DDLoot.java index 41d80a9..a6be018 100644 --- a/StevenDimDoors/mod_pocketDim/DDLoot.java +++ b/StevenDimDoors/mod_pocketDim/DDLoot.java @@ -78,9 +78,6 @@ public class DDLoot { //because the items in that category have strange weights that are incompatible with all other //chest categories. - //This function has a flaw. It treats items with the same item ID but different damage values as - //the same item. For instance, it cannot distinguish between different types of wood. That shouldn't - //matter for most chest loot, though. This could be fixed if we cared enough. Random random = new Random(); HashMap container = new HashMap(); @@ -89,7 +86,9 @@ public class DDLoot { WeightedRandomChestContent[] items = ChestGenHooks.getItems(category, random); for (WeightedRandomChestContent item : items) { - int id = item.theItemId.itemID; + ItemStack stack = item.theItemId; + int id = stack.itemID; + int subtype = stack.getItem().getHasSubtypes() ? stack.getItemDamage() : 0; //Correct the weights of Vanilla dungeon chests (DUNGEON_CHEST) //Comparing by String references is valid here since they should match! @@ -100,20 +99,25 @@ public class DDLoot { item.itemWeight /= DUNGEON_CHEST_WEIGHT_INFLATION; if (item.itemWeight == 0) item.itemWeight = 1; - } - if (!container.containsKey(id)) + } + + //Generate an identifier for this item using its item ID and damage value, + //if it has subtypes. This solves the issue of matching items that have + //the same item ID but different subtypes (e.g. wood planks, dyes). + int key = ((subtype & 0xFFFF) << 16) + ((id & 0xFFFF) << 16); + WeightedRandomChestContent other = container.get(key); + if (other == null) { //This item has not been seen before. Simply add it to the container. - container.put(id, item); + container.put(key, item); } else { //This item conflicts with an existing entry. Replace that entry //if our current item has a lower weight. - WeightedRandomChestContent other = container.get(id); if (item.itemWeight < other.itemWeight) { - container.put(id, item); + container.put(key, item); } } } @@ -127,7 +131,7 @@ public class DDLoot { { if (item.theItemId.itemID == enchantedBookID) { - item.itemWeight = 3; + item.itemWeight = 4; break; } } From 07a5e2a64d87ef115f994852231bb7eea1685267 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 7 Sep 2013 12:27:28 -0400 Subject: [PATCH 2/5] Progress on Rewrite Completed exit door code. Also fixed noise calculation for dungeon door destinations - we were attempting to use pack depth in the calculation before it had been initialized. --- .../mod_pocketDim/core/DDTeleporter.java | 60 ++++--- .../mod_pocketDim/core/NewDimData.java | 2 +- .../mod_pocketDim/helpers/yCoordHelper.java | 160 +++++++++++++----- .../mod_pocketDim/world/PocketBuilder.java | 6 +- 4 files changed, 164 insertions(+), 64 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index b2e6388..5f693c8 100644 --- a/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -30,7 +30,11 @@ import cpw.mods.fml.common.registry.GameRegistry; public class DDTeleporter { private static final Random random = new Random(); - private static int END_DIMENSION_ID = 1; + private static final int END_DIMENSION_ID = 1; + 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; + public static int cooldown = 0; private DDTeleporter() { } @@ -465,16 +469,26 @@ public class DDTeleporter // A dungeon exit acts the same as a safe exit, but has the chance of // taking the user to any non-pocket dimension, excluding Limbo and The End. + NewDimData current = PocketManager.getDimensionData(link.source.getDimension()); ArrayList roots = PocketManager.getRootDimensions(); - for (int attempts = 0; attempts < 10; attempts++) + int shiftChance = START_ROOT_SHIFT_CHANCE + ROOT_SHIFT_CHANCE_PER_LEVEL * (current.packDepth() - 1); + + if (random.nextInt(MAX_ROOT_SHIFT_CHANCE) < shiftChance) { - NewDimData selection = roots.get( random.nextInt(roots.size()) ); - if (selection.id() != END_DIMENSION_ID && selection.id() != properties.LimboDimensionID) + for (int attempts = 0; attempts < 10; attempts++) { - return generateSafeExit(selection, link, properties); + NewDimData selection = roots.get( random.nextInt(roots.size()) ); + if (selection.id() != END_DIMENSION_ID && + selection.id() != properties.LimboDimensionID && + selection != current.root()) + { + return generateSafeExit(selection, link, properties); + } } } - return false; + + // Yes, this could lead you back into Limbo. That's intentional. + return generateSafeExit(current.root(), link, properties); } private static boolean generateSafeExit(NewDimData destinationDim, DimLink link, DDProperties properties) @@ -482,16 +496,9 @@ public class DDTeleporter // A safe exit attempts to place a Warp Door in a dimension with // some precautions to protect the player. The X and Z coordinates // are fixed to match the source (mostly - may be shifted a little), - // but the Y coordinate is chosen by searching for a safe location - // to place the door. + // but the Y coordinate is chosen by searching for the nearest + // a safe location to place the door. - // The direction of the vertical search is away from the map boundary - // closest to the source Y. In other words, if a player is really - // high up, the search goes down. If a player is near the bottom - // of the map, the search goes up. If a safe destination cannot be - // found, then we return false and the source-side door slams shut. - - Point3D destination; Point4D source = link.source(); World world = PocketManager.loadDimension(destinationDim.id()); if (world == null) @@ -499,11 +506,26 @@ public class DDTeleporter return false; } - boolean searchDown = (source.getY() >= world.getActualHeight() / 2); - destination = yCoordHelper.findSafeCube(world, source.getX(), source.getY() - 2, source.getZ(), searchDown); - if (destination == null) + int startY = source.getY() - 2; + Point3D destination; + Point3D locationUp = yCoordHelper.findSafeCubeUp(world, source.getX(), startY, source.getZ()); + Point3D locationDown = yCoordHelper.findSafeCubeDown(world, source.getX(), startY, source.getZ()); + + if (locationUp == null) { - destination = yCoordHelper.findSafeCube(world, source.getX(), source.getY() - 2, source.getZ(), !searchDown); + destination = locationDown; + } + else if (locationDown == null) + { + destination = locationUp; + } + else if (locationUp.getY() - startY <= startY - locationDown.getY()) + { + destination = locationUp; + } + else + { + destination = locationDown; } if (destination != null) { diff --git a/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/StevenDimDoors/mod_pocketDim/core/NewDimData.java index 40fe18d..9e735aa 100644 --- a/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -447,7 +447,7 @@ public abstract class NewDimData this.packDepth = calculatePackDepth(parent, dungeon); } - private static int calculatePackDepth(NewDimData parent, DungeonData current) + public static int calculatePackDepth(NewDimData parent, DungeonData current) { DungeonData predecessor = parent.dungeon(); if (current == null) diff --git a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java index d912b46..ec514e3 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java @@ -5,6 +5,7 @@ import net.minecraft.block.material.Material; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunkProvider; import StevenDimDoors.mod_pocketDim.Point3D; public class yCoordHelper @@ -70,7 +71,7 @@ public class yCoordHelper return (material.isLiquid() || !material.isReplaceable()); } - public static Point3D findSafeCube(World world, int x, int startY, int z, boolean searchDown) + public static Point3D findSafeCubeUp(World world, int x, int startY, int z) { // Search for a 3x3x3 cube of air with blocks underneath // We can also match against a 3x2x3 box with @@ -84,62 +85,139 @@ public class yCoordHelper localX = MathHelper.clamp_int(localX, 1, 14); localZ = MathHelper.clamp_int(localZ, 1, 14); - Chunk chunk = world.getChunkProvider().loadChunk(x >> 4, z >> 4); + Chunk chunk = initializeChunkArea(world, x >> 4, z >> 4); - int layers = 0; int height = world.getActualHeight(); int y, dx, dz, blockID; - boolean filled; + boolean isSafe; Block block; - Point3D location = null; - - if (searchDown) + + // Initialize layers to a huge negative number so that we won't + // consider an area as usable unless it gets reset to 0 first + // when we find a foundation upon which to build. + int layers = -1000000; + + // Check if a 3x3 layer of blocks is empty + // If we find a layer that contains replaceable blocks, it can + // serve as the base where we'll place the player and door. + for (y = Math.max(startY - 1, 0); y < height; y++) { - /*for (y = startY; y >= 0; y--) + isSafe = true; + for (dx = -1; dx <= 1 && isSafe; dx++) { - blockID = chunk.getBlockID(localX, y, localZ); - - }*/ - } - else - { - // Check if a 3x3 layer of blocks is empty - // If we find a layer that contains replaceable blocks, it can - // serve as the base where we'll place the player and door. - for (y = Math.max(startY, 0); y < height; y++) - { - filled = false; - for (dx = -1; dx <= 1 && !filled; dx++) + for (dz = -1; dz <= 1 && isSafe; dz++) { - for (dz = -1; dz <= 1 && !filled; dz++) + blockID = chunk.getBlockID(localX + dx, y, localZ + dz); + if (blockID != 0) { - blockID = chunk.getBlockID(localX + dx, y, localZ + dz); - if (blockID != 0) + block = Block.blocksList[blockID]; + if (!block.blockMaterial.isReplaceable()) { - block = Block.blocksList[blockID]; - if (block != null && !block.blockMaterial.isReplaceable()) - { - filled = true; - } - layers = 0; + isSafe = false; } - } - } - if (!filled) - { - layers++; - if (layers == 3) - { - location = new Point3D(localX + cornerX, y - 2, localZ + cornerZ); - break; + layers = 0; } } } + if (isSafe) + { + layers++; + if (layers == 3) + { + return new Point3D(localX + cornerX, y - 2, localZ + cornerZ); + } + } } - - return location; + return null; } + public static Point3D findSafeCubeDown(World world, int x, int startY, int z) + { + // Search for a 3x3x3 cube of air with blocks underneath + // We can also match against a 3x2x3 box with + // We shift the search area into the bounds of a chunk for the sake of simplicity, + // so that we don't need to worry about working across chunks. + + int localX = x < 0 ? (x % 16) + 16 : (x % 16); + int localZ = z < 0 ? (z % 16) + 16 : (z % 16); + int cornerX = x - localX; + int cornerZ = z - localZ; + localX = MathHelper.clamp_int(localX, 1, 14); + localZ = MathHelper.clamp_int(localZ, 1, 14); + + Chunk chunk = initializeChunkArea(world, x >> 4, z >> 4); + + int height = world.getActualHeight(); + int y, dx, dz, blockID; + boolean isSafe; + boolean hasBlocks; + Block block; + int layers = 0; + + // Check if a 3x3 layer of blocks is empty + // If we find a layer that contains replaceable blocks, it can + // serve as the base where we'll place the player and door. + for (y = Math.min(startY + 2, height - 1); y >= 0; y--) + { + isSafe = true; + hasBlocks = false; + for (dx = -1; dx <= 1 && isSafe; dx++) + { + for (dz = -1; dz <= 1 && isSafe; dz++) + { + blockID = chunk.getBlockID(localX + dx, y, localZ + dz); + if (blockID != 0) + { + block = Block.blocksList[blockID]; + if (!block.blockMaterial.isReplaceable()) + { + if (layers >= 3) + { + return new Point3D(localX + cornerX, y + 1, localZ + cornerZ); + } + isSafe = false; + } + hasBlocks = true; + } + } + } + if (isSafe) + { + layers++; + if (hasBlocks) + { + if (layers >= 3) + { + return new Point3D(localX + cornerX, y, localZ + cornerZ); + } + layers = 0; + } + } + } + return null; + } + + private static Chunk initializeChunkArea(World world, int chunkX, int chunkZ) + { + // We initialize a 3x3 area of chunks instead of just initializing + // the target chunk because things generated in adjacent chunks + // (e.g. trees) might intrude into the target chunk. + + IChunkProvider provider = world.getChunkProvider(); + Chunk target = provider.loadChunk(chunkX, chunkZ); + for (int dx = -1; dx <= 1; dx++) + { + for (int dz = -1; dz <= 1; dz++) + { + if (!provider.chunkExists(chunkX + dx, chunkZ + dz)) + { + provider.loadChunk(chunkX, chunkZ); + } + } + } + return target; + } + public static int adjustDestinationY(int y, int worldHeight, int entranceY, int dungeonHeight) { //The goal here is to guarantee that the dungeon fits within the vertical bounds diff --git a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index 0f2d42f..0b55e71 100644 --- a/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -87,7 +87,7 @@ public class PocketBuilder if (packConfig != null && packConfig.doDistortDoorCoordinates()) { - destination = calculateNoisyDestination(source, dimension, orientation); + destination = calculateNoisyDestination(source, dimension, dungeon, orientation); } else { @@ -111,9 +111,9 @@ public class PocketBuilder } } - private static Point3D calculateNoisyDestination(Point4D source, NewDimData dimension, int orientation) + private static Point3D calculateNoisyDestination(Point4D source, NewDimData dimension, DungeonData dungeon, int orientation) { - int depth = dimension.packDepth(); + int depth = NewDimData.calculatePackDepth(dimension.parent(), dungeon); int forwardNoise = MathHelper.getRandomIntegerInRange(random, -50 * depth, 150 * depth); int sidewaysNoise = MathHelper.getRandomIntegerInRange(random, -10 * depth, 10 * depth); From fd4b9b508609f8d46f3f494c81379ebd4df7ab3c Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 7 Sep 2013 13:14:43 -0400 Subject: [PATCH 3/5] Fixed Regression in DungeonSchematic As part of the rewrite, I'd removed code related to replacing the sandstone markers under dungeon exit doors, so the markers weren't being replaced. Now that's working again. --- .../mod_pocketDim/dungeon/DungeonSchematic.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index e33a455..2389c82 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -248,7 +248,7 @@ public class DungeonSchematic extends Schematic { //Set up link data for exit door for (Point3D location : exitDoorLocations) { - createExitDoorLink(dimension, location, entranceDoorLocation, turnAngle, pocketCenter); + createExitDoorLink(world, dimension, location, entranceDoorLocation, turnAngle, pocketCenter); } //Remove end portal frames and spawn Monoliths @@ -291,12 +291,22 @@ public class DungeonSchematic extends Schematic { prevDim.setDestination(reverseLink, destination.getX(), destination.getY(), destination.getZ()); } - private static void createExitDoorLink(NewDimData dimension, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) + private static void createExitDoorLink(World world, NewDimData dimension, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) { //Transform the door's location to the pocket coordinate system Point3D location = point.clone(); BlockRotator.transformPoint(location, entrance, rotation, pocketCenter); dimension.createLink(location.getX(), location.getY(), location.getZ(), LinkTypes.DUNGEON_EXIT); + //Replace the sandstone block under the exit door with the same block as the one underneath it + int x = location.getX(); + int y = location.getY() - 3; + int z = location.getZ(); + if (y >= 0) + { + int blockID = world.getBlockId(x, y, z); + int metadata = world.getBlockMetadata(x, y, z); + setBlockDirectly(world, x, y + 1, z, blockID, metadata); + } } private static void createDimensionalDoorLink(NewDimData dimension, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) From 921b6e88afd9c7e607dcf37539690cadd3efc050 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 7 Sep 2013 19:44:33 -0400 Subject: [PATCH 4/5] Removed Rift Creation and Unused Settings Removed the rift creation code from the Rift Blade and removed unused settings from DDProperties. Specifically, the rift creation flag for the Rift Blade, since that's getting removed, and the RiftSpreadModified, which hasn't been referenced for a while. I also cleaned up the code in Rift Blade slightly. Its special functions worked during testing but blocking did not. I'm not sure why at the moment. --- .../mod_pocketDim/DDProperties.java | 9 -- .../mod_pocketDim/items/ItemRiftBlade.java | 119 ++++-------------- 2 files changed, 22 insertions(+), 106 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/DDProperties.java b/StevenDimDoors/mod_pocketDim/DDProperties.java index a18218d..cb0ea3b 100644 --- a/StevenDimDoors/mod_pocketDim/DDProperties.java +++ b/StevenDimDoors/mod_pocketDim/DDProperties.java @@ -94,14 +94,12 @@ public class DDProperties public final boolean LimboReturnsInventoryEnabled; public final boolean DoorRenderingEnabled; public final boolean TNFREAKINGT_Enabled; - public final boolean RiftBladeRiftCreationEnabled; /** * Other */ public final int NonTntWeight; - public final int RiftSpreadModifier; public final int ClusterGenerationChance; public final int GatewayGenerationChance; public final int MonolithSpawningChance; @@ -166,9 +164,6 @@ public class DDProperties LimboReturnRange = config.get(Configuration.CATEGORY_GENERAL, "Limbo Return Range", 500, "Sets the farthest distance that Limbo can send you upon returning to the Overworld").getInt(); DoorRenderingEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Door Rendering", true).getBoolean(true); - RiftBladeRiftCreationEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Rift Creation with Rift Blade", true, - "Sets whether Rift Blades can create new rifts. If set to false, " + - "they will only be able to create transient doors on existing rifts.").getBoolean(true); TNFREAKINGT_Enabled = config.get(Configuration.CATEGORY_GENERAL, "EXPLOSIONS!!???!!!?!?!!", false).getBoolean(false); NonTntWeight = config.get(Configuration.CATEGORY_GENERAL, "HOWMUCHTNT", 25, @@ -218,10 +213,6 @@ public class DDProperties GatewayGenerationChance = config.get(Configuration.CATEGORY_GENERAL, "Gateway Generation Chance", 10, "Sets the chance (out of " + GatewayGenerator.MAX_GATEWAY_GENERATION_CHANCE + ") that a Rift Gateway will " + "generate in a given chunk. The default chance is 10.").getInt(); - - RiftSpreadModifier = config.get(Configuration.CATEGORY_GENERAL, "Rift Spread Modifier", 3, - "Sets the number of times a rift can spread. 0 prevents rifts from spreading at all. " + - "A value greater than 5 is not recommended as the growth is exponential.").getInt(); LimboBiomeID = config.get(CATEGORY_BIOME, "Limbo Biome ID", 251).getInt(); PocketBiomeID = config.get(CATEGORY_BIOME, "Pocket Biome ID", 250).getInt(); diff --git a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java index 9fc3115..857a7d8 100644 --- a/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java +++ b/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java @@ -9,7 +9,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.EnumAction; import net.minecraft.item.EnumToolMaterial; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; @@ -20,8 +19,6 @@ 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.core.LinkTypes; -import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -62,8 +59,14 @@ public class ItemRiftBlade extends ItemSword } } - @SideOnly(Side.CLIENT) @Override + public int getDamageVsEntity(Entity par1Entity) + { + return 7; + } + + @Override + @SideOnly(Side.CLIENT) public boolean hasEffect(ItemStack par1ItemStack) { return true; @@ -76,12 +79,6 @@ public class ItemRiftBlade extends ItemSword return true; } - @Override - public int getDamageVsEntity(Entity par1Entity) - { - return 7; - } - @Override public MovingObjectPosition getMovingObjectPositionFromPlayer(World par1World, EntityPlayer par2EntityPlayer, boolean par3) { @@ -139,61 +136,6 @@ public class ItemRiftBlade extends ItemSword return true; } - /** - * How long it takes to use or consume an item - */ - @Override - public int getMaxItemUseDuration(ItemStack par1ItemStack) - { - return 72000; - } - - @Override - public EnumAction getItemUseAction(ItemStack stack) - { - return properties.RiftBladeRiftCreationEnabled ? EnumAction.bow : EnumAction.block; - } - - @Override - public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int itemInUseCount) - { - //Condition for disabling rift creation - if (!properties.RiftBladeRiftCreationEnabled) - return; - - if (world.isRemote) - return; - - Vec3 var2 = player.getLook(1.0F); - - double cooef = -2; - var2.xCoord *= cooef; - var2.yCoord *= cooef; - var2.zCoord *= cooef; - double var5 = player.posX - var2.xCoord; - double var9 = player.posZ - var2.zCoord; - double var7 = player.posY - var2.yCoord + 2; - - int x = MathHelper.floor_double(var5); - int y = MathHelper.floor_double(var7); - int z = MathHelper.floor_double(var9); - - int orientation = (int) (MathHelper.floor_double((double) ((player.rotationYaw + 90) * 4.0F / 360.0F) + 0.5D) & 3); - - //TODO: This looks weird. Shouldn't we aim to only create rifts on maxed-out usage time? i.e. "<= 0" - if (this.getMaxItemUseDuration(stack) - itemInUseCount > 12 && - ItemDimensionalDoor.canPlace(world, x, y, z) && ItemDimensionalDoor.canPlace(world, x, y + 1, z)) - { - NewDimData dimension = PocketManager.getDimensionData(world); - if (!dimension.isPocketDimension() && dimension.getLink(x, y + 1, z) == null) - { - dimension.createLink(x, y + 1, z, LinkTypes.POCKET); - player.worldObj.playSoundAtEntity(player,"mods.DimDoors.sfx.riftDoor", 0.6f, 1); - ItemDimensionalDoor.placeDoorBlock(world, x, y, z, orientation, mod_pocketDim.transientDoor); - } - } - } - @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { @@ -212,7 +154,8 @@ public class ItemRiftBlade extends ItemSword double var7 = var3.dotProduct(var4); if( (var7+.1) > 1.0D - 0.025D / var5 ? player.canEntityBeSeen(ent) : false) { - ((ItemRiftBlade) stack.getItem()).teleportToEntity(stack, ent, player); + teleportToEntity(stack, ent, player); + stack.damageItem(3, player); return stack; } } @@ -220,36 +163,33 @@ public class ItemRiftBlade extends ItemSword MovingObjectPosition hit = this.getMovingObjectPositionFromPlayer(world, player, false); if (hit != null) { - if (world.getBlockId(hit.blockX, hit.blockY, hit.blockZ) == properties.RiftBlockID) + int x = hit.blockX; + int y = hit.blockY; + int z = hit.blockZ; + if (world.getBlockId(x, y, z) == properties.RiftBlockID) { - if (PocketManager.getLink(hit.blockX, hit.blockY, hit.blockZ, world) != null) + if (PocketManager.getLink(x, y, z, world) != null) { - Block block = mod_pocketDim.transientDoor; - int x = hit.blockX; - int y = hit.blockY; - int z = hit.blockZ; - - if (player.canPlayerEdit(x, y, z, hit.sideHit, stack) && player.canPlayerEdit(x, y + 1, z, hit.sideHit, stack) && !world.isRemote) + if (player.canPlayerEdit(x, y, z, hit.sideHit, stack) && + player.canPlayerEdit(x, y + 1, z, hit.sideHit, stack)) { int orientation = MathHelper.floor_double((double)((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; if (BaseItemDoor.canPlace(world, x, y, z) && BaseItemDoor.canPlace(world, x, y - 1, z)) { - ItemDimensionalDoor.placeDoorBlock(world, x, y - 1, z, orientation, block); + ItemDimensionalDoor.placeDoorBlock(world, x, y - 1, z, orientation, mod_pocketDim.transientDoor); player.worldObj.playSoundAtEntity(player,"mods.DimDoors.sfx.riftDoor", 0.6f, 1); - stack.damageItem(10, player); + stack.damageItem(3, player); + return stack; } } } - return stack; } } - //FIXME: Should this be inside or after this IF? player.setItemInUse(stack, this.getMaxItemUseDuration(stack)); } - return stack; } @@ -269,21 +209,6 @@ public class ItemRiftBlade extends ItemSword //That would cause this sword to accept gold as a repair material (since we set material = Gold). return mod_pocketDim.itemStableFabric.itemID == par2ItemStack.itemID ? true : false; } - - @Override - public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, - int z, int side, float hitX, float hitY, float hitZ) - { - if (BaseItemDoor.tryItemUse(mod_pocketDim.transientDoor, stack, player, world, x, y, z, side, true, false)) - { - world.playSoundAtEntity(player,"mods.DimDoors.sfx.riftDoor", 0.6f, 1); - return true; - } - else - { - return false; - } - } /** * allows items to add custom lines of information to the mouseover description @@ -292,8 +217,8 @@ public class ItemRiftBlade extends ItemSword @SideOnly(Side.CLIENT) public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - par3List.add("Opens a temporary door, has"); - par3List.add("a special teleport attack,"); - par3List.add("and rotates existing doors."); + par3List.add("Creates temporary doors"); + par3List.add("on rifts, rotates doors,"); + par3List.add("and has a teleport attack."); } } From 1d1d0a767cbadcd73d4b81238e7a85993da78745 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sat, 7 Sep 2013 20:14:14 -0400 Subject: [PATCH 5/5] Fixed Doors and Minor Dungeon Change Fixed the regression bug that caused some of our doors to get placed in the wrong direction. Changing doors to inherit from BaseDimDoor caused BlockRotator to assume they weren't dimensional doors because it used "instanceof DimensionalDoor" to check. Thanks for figuring it out, Steven! ^_^ Also made a minor change to dungeon generation. We now check the game rule doMobSpawning and don't spawn Monoliths from DungeonSchematic if the value is false. This is useful for testing without Monoliths around. We still do work to remove the portal frame blocks even if the mobs aren't spawned. --- .../mod_pocketDim/dungeon/DungeonSchematic.java | 17 +++++++++++------ .../mod_pocketDim/schematic/BlockRotator.java | 4 ++-- .../mod_pocketDim/ticking/MonolithSpawner.java | 2 +- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index 2389c82..1d2664b 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -27,6 +27,7 @@ import StevenDimDoors.mod_pocketDim.schematic.InvalidSchematicException; import StevenDimDoors.mod_pocketDim.schematic.ReplacementFilter; import StevenDimDoors.mod_pocketDim.schematic.Schematic; import StevenDimDoors.mod_pocketDim.ticking.MobMonolith; +import StevenDimDoors.mod_pocketDim.ticking.MonolithSpawner; import StevenDimDoors.mod_pocketDim.util.Point4D; public class DungeonSchematic extends Schematic { @@ -251,10 +252,11 @@ public class DungeonSchematic extends Schematic { createExitDoorLink(world, dimension, location, entranceDoorLocation, turnAngle, pocketCenter); } - //Remove end portal frames and spawn Monoliths + //Remove end portal frames and spawn Monoliths, if allowed + boolean canSpawn = MonolithSpawner.isMobSpawningAllowed(); for (Point3D location : monolithSpawnLocations) { - spawnMonolith(world, location, entranceDoorLocation, turnAngle, pocketCenter); + spawnMonolith(world, location, entranceDoorLocation, turnAngle, pocketCenter, canSpawn); } } @@ -317,7 +319,7 @@ public class DungeonSchematic extends Schematic { dimension.createLink(location.getX(), location.getY(), location.getZ(), LinkTypes.DUNGEON); } - private static void spawnMonolith(World world, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter) + private static void spawnMonolith(World world, Point3D point, Point3D entrance, int rotation, Point3D pocketCenter, boolean canSpawn) { //Transform the frame block's location to the pocket coordinate system Point3D location = point.clone(); @@ -325,8 +327,11 @@ public class DungeonSchematic extends Schematic { //Remove frame block setBlockDirectly(world, location.getX(), location.getY(), location.getZ(), 0, 0); //Spawn Monolith - Entity mob = new MobMonolith(world); - mob.setLocationAndAngles(location.getX(), location.getY(), location.getZ(), 1, 1); - world.spawnEntityInWorld(mob); + if (canSpawn) + { + Entity mob = new MobMonolith(world); + mob.setLocationAndAngles(location.getX(), location.getY(), location.getZ(), 1, 1); + world.spawnEntityInWorld(mob); + } } } diff --git a/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java b/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java index 06f14c8..f32c0dc 100644 --- a/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java +++ b/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java @@ -7,7 +7,7 @@ import net.minecraft.block.BlockRedstoneRepeater; import net.minecraft.block.BlockStairs; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.blocks.DimensionalDoor; +import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; public class BlockRotator { @@ -379,7 +379,7 @@ public class BlockRotator break; } } - else if(Block.blocksList[blockID] instanceof BlockRedstoneRepeater || Block.blocksList[blockID] instanceof BlockDoor || Block.blocksList[blockID] instanceof DimensionalDoor || blockID== Block.tripWireSource.blockID || Block.blocksList[blockID] instanceof BlockComparator) + else if(Block.blocksList[blockID] instanceof BlockRedstoneRepeater || Block.blocksList[blockID] instanceof BlockDoor || Block.blocksList[blockID] instanceof BaseDimDoor || blockID== Block.tripWireSource.blockID || Block.blocksList[blockID] instanceof BlockComparator) { switch (metadata) { diff --git a/StevenDimDoors/mod_pocketDim/ticking/MonolithSpawner.java b/StevenDimDoors/mod_pocketDim/ticking/MonolithSpawner.java index 59f8fb5..fac59e4 100644 --- a/StevenDimDoors/mod_pocketDim/ticking/MonolithSpawner.java +++ b/StevenDimDoors/mod_pocketDim/ticking/MonolithSpawner.java @@ -194,7 +194,7 @@ public class MonolithSpawner implements IRegularTickReceiver { } } - private static boolean isMobSpawningAllowed() + public static boolean isMobSpawningAllowed() { //This function is used to retrieve the value of doMobSpawning. The code is the same //as the code used by Minecraft. Jaitsu requested this to make testing easier. ~SenseiKiwi