Various Fixes #166
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user