From 59f335ac8c7bdf37de0925748ee896540e05769a Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Thu, 26 Jun 2014 12:11:51 -0400 Subject: [PATCH] Added Dispenser Support for SRS Added support for using Stabilized Rift Signatures from dispensers under specific conditions. Everything works except for playing the sound that occurs when an SRS is used. Not sure why that's not working. --- .../mod_pocketDim/CraftingManager.java | 9 +++- .../items/ItemStabilizedRiftSignature.java | 52 ++++++++++++++++++- .../DispenserBehaviorStabilizedRS.java | 42 +++++++++++++++ .../mod_pocketDim/mod_pocketDim.java | 1 + 4 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 src/main/java/StevenDimDoors/mod_pocketDim/items/behaviors/DispenserBehaviorStabilizedRS.java diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java b/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java index 6ff7121..7cc635d 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java @@ -1,9 +1,11 @@ package StevenDimDoors.mod_pocketDim; -import StevenDimDoors.mod_pocketDim.config.DDProperties; import net.minecraft.block.Block; +import net.minecraft.block.BlockDispenser; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import StevenDimDoors.mod_pocketDim.config.DDProperties; +import StevenDimDoors.mod_pocketDim.items.behaviors.DispenserBehaviorStabilizedRS; import cpw.mods.fml.common.registry.GameRegistry; public class CraftingManager @@ -87,4 +89,9 @@ public class CraftingManager } } + public static void registerDispenserBehaviors() + { + // Register the dispenser behaviors for certain DD items + BlockDispenser.dispenseBehaviorRegistry.putObject(mod_pocketDim.itemStabilizedRiftSignature, new DispenserBehaviorStabilizedRS()); + } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java index 66ee5fd..b47bff6 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java @@ -45,10 +45,10 @@ public class ItemStabilizedRiftSignature extends ItemRiftSignature { return true; } - Point4DOrientation source = getSource(stack); + int orientation = MathHelper.floor_double((player.rotationYaw + 180.0F) * 4.0F / 360.0F - 0.5D) & 3; // Check if the Stabilized Rift Signature has been initialized - int orientation = MathHelper.floor_double((player.rotationYaw + 180.0F) * 4.0F / 360.0F - 0.5D) & 3; + Point4DOrientation source = getSource(stack); if (source != null) { // Yes, it's initialized. @@ -117,6 +117,54 @@ public class ItemStabilizedRiftSignature extends ItemRiftSignature return true; } + public static boolean useFromDispenser(ItemStack stack, World world, int x, int y, int z) + { + // Stabilized Rift Signatures can only be used from dispensers to restore + // a previous link pair. The operation would be free for a player, so + // dispensers can also perform it for free. Otherwise, the item does nothing. + if (world.isRemote) + { + return false; + } + + // Adjust Y so the rift is at head level, depending on the presence of certain blocks + int adjustedY = adjustYForSpecialBlocks(world, x, y + 2, z); + Point4DOrientation source = getSource(stack); + + // The SRS must have been initialized + if (source != null) + { + NewDimData sourceDimension = PocketManager.getDimensionData(source.getDimension()); + NewDimData destinationDimension = PocketManager.getDimensionData(world); + DimLink reverse = destinationDimension.getLink(x, adjustedY, z); + DimLink link; + + // Check whether the SRS is being used to restore one of its previous + // link pairs. In other words, the SRS is being used on a location + // that already has a link pointing to the SRS's source, with the + // intention of overwriting the source-side link to point there. + if (reverse != null && source.getPoint().equals(reverse.destination())) + { + // Only the source-to-destination link is needed. + link = sourceDimension.createLink(source.getX(), source.getY(), source.getZ(), LinkTypes.NORMAL, source.getOrientation()); + destinationDimension.setLinkDestination(link, x, adjustedY, z); + + // Try placing a rift at the source point, but check if its world is loaded first + World sourceWorld = DimensionManager.getWorld(sourceDimension.id()); + if (sourceWorld != null && + !mod_pocketDim.blockRift.isBlockImmune(sourceWorld, source.getX(), source.getY(), source.getZ())) + { + sourceWorld.setBlock(source.getX(), source.getY(), source.getZ(), mod_pocketDim.blockRift.blockID); + } + + // This call doesn't seem to be working... + world.playSoundEffect(x + 0.5, adjustedY + 0.5, z + 0.5, "mods.DimDoors.sfx.riftEnd", 0.6f, 1); + return true; + } + } + return false; + } + /** * allows items to add custom lines of information to the mouseover description */ diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/behaviors/DispenserBehaviorStabilizedRS.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/behaviors/DispenserBehaviorStabilizedRS.java new file mode 100644 index 0000000..f79fe26 --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/behaviors/DispenserBehaviorStabilizedRS.java @@ -0,0 +1,42 @@ +package StevenDimDoors.mod_pocketDim.items.behaviors; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.BehaviorDefaultDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import StevenDimDoors.mod_pocketDim.items.ItemStabilizedRiftSignature; + +public class DispenserBehaviorStabilizedRS extends BehaviorDefaultDispenseItem +{ + @Override + public ItemStack dispenseStack(IBlockSource dispenser, ItemStack stack) + { + // Search for a non-air block up to 3 blocks in front of a dispenser. + // If it's found, call ItemStabilizedRiftSignature.useFromDispenser(). + int x = dispenser.getXInt(); + int y = dispenser.getYInt(); + int z = dispenser.getZInt(); + EnumFacing facing = BlockDispenser.getFacing(dispenser.getBlockMetadata()); + int dx = facing.getFrontOffsetX(); + int dy = facing.getFrontOffsetY(); + int dz = facing.getFrontOffsetZ(); + World world = dispenser.getWorld(); + + for (int k = 1; k <= 3; k++) + { + x += dx; + y += dy; + z += dz; + if (!world.isAirBlock(x, y, z)) + { + // Found a block. Activate the item. + ItemStabilizedRiftSignature.useFromDispenser(stack, world, x, y, z); + break; + } + } + // The item stack isn't modified + return stack; + } +} diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 267f644..6554a6a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -292,6 +292,7 @@ public class mod_pocketDim LanguageRegistry.instance().addStringLocalization("entity.DimDoors.Obelisk.name", "Monolith"); CraftingManager.registerRecipes(properties); + CraftingManager.registerDispenserBehaviors(); DungeonHelper.initialize(); gatewayGenerator = new GatewayGenerator(properties); GameRegistry.registerWorldGenerator(mod_pocketDim.gatewayGenerator);