From 42f0656b1befcfe0d19fecfd4c874778dbbd2546 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Mon, 24 Mar 2014 20:58:36 -0400 Subject: [PATCH 1/7] Changes Made saving a bit more robust, now we only delete ones that where not modified. Also overhauled door placement, its all handled by the eventHandler now. --- .../mod_pocketDim/EventHookContainer.java | 359 +++++++++--------- .../mod_pocketDim/items/BaseItemDoor.java | 163 +++++++- .../items/ItemDimensionalDoor.java | 20 +- .../mod_pocketDim/items/ItemGoldDimDoor.java | 24 +- .../mod_pocketDim/items/ItemUnstableDoor.java | 20 +- .../mod_pocketDim/items/ItemWarpDoor.java | 20 +- .../mod_pocketDim/saving/DDSaveHandler.java | 50 ++- 7 files changed, 362 insertions(+), 294 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java index f52fa18..67519a1 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.blocks.BaseDimDoor; import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.PocketManager; @@ -32,218 +33,202 @@ import cpw.mods.fml.relauncher.SideOnly; public class EventHookContainer { - private final DDProperties properties; - + private final DDProperties properties; + public EventHookContainer(DDProperties properties) { this.properties = properties; } - + @ForgeSubscribe(priority = EventPriority.LOW) public void onInitMapGen(InitMapGenEvent event) { - // Replace the Nether fortress generator with our own only if any gateways would ever generate. - // This allows admins to disable our fortress overriding without disabling all gateways. + // Replace the Nether fortress generator with our own only if any + // gateways would ever generate. + // This allows admins to disable our fortress overriding without + // disabling all gateways. /* - if (properties.FortressGatewayGenerationChance > 0 && properties.WorldRiftGenerationEnabled && - event.type == InitMapGenEvent.EventType.NETHER_BRIDGE) + * if (properties.FortressGatewayGenerationChance > 0 && + * properties.WorldRiftGenerationEnabled && event.type == + * InitMapGenEvent.EventType.NETHER_BRIDGE) { event.newGen = new + * DDNetherFortressGenerator(); } + */ + } + + @SideOnly(Side.CLIENT) + @ForgeSubscribe + public void onSoundLoad(SoundLoadEvent event) + { + event.manager.addSound(mod_pocketDim.modid + ":monk.ogg"); + event.manager.addSound(mod_pocketDim.modid + ":crack.ogg"); + event.manager.addSound(mod_pocketDim.modid + ":tearing.ogg"); + event.manager.addSound(mod_pocketDim.modid + ":rift.ogg"); + event.manager.addSound(mod_pocketDim.modid + ":riftStart.ogg"); + event.manager.addSound(mod_pocketDim.modid + ":riftEnd.ogg"); + event.manager.addSound(mod_pocketDim.modid + ":riftClose.ogg"); + event.manager.addSound(mod_pocketDim.modid + ":riftDoor.ogg"); + event.manager.addSound(mod_pocketDim.modid + ":creepy.ogg"); + } + + @SideOnly(Side.CLIENT) + @ForgeSubscribe + public void onSoundEffectResult(PlayBackgroundMusicEvent event) + { + if (FMLClientHandler.instance().getClient().thePlayer.worldObj.provider.dimensionId == mod_pocketDim.properties.LimboDimensionID) + ; { - event.newGen = new DDNetherFortressGenerator(); + this.playMusicForDim(FMLClientHandler.instance().getClient().thePlayer.worldObj); } - */ } - - @SideOnly(Side.CLIENT) - @ForgeSubscribe - public void onSoundLoad(SoundLoadEvent event) - { - event.manager.addSound(mod_pocketDim.modid+":monk.ogg"); - event.manager.addSound(mod_pocketDim.modid+":crack.ogg"); - event.manager.addSound(mod_pocketDim.modid+":tearing.ogg"); - event.manager.addSound(mod_pocketDim.modid+":rift.ogg"); - event.manager.addSound(mod_pocketDim.modid+":riftStart.ogg"); - event.manager.addSound(mod_pocketDim.modid+":riftEnd.ogg"); - event.manager.addSound(mod_pocketDim.modid+":riftClose.ogg"); - event.manager.addSound(mod_pocketDim.modid+":riftDoor.ogg"); - event.manager.addSound(mod_pocketDim.modid+":creepy.ogg"); - } - - @SideOnly(Side.CLIENT) - @ForgeSubscribe - public void onSoundEffectResult(PlayBackgroundMusicEvent event) - { - if (FMLClientHandler.instance().getClient().thePlayer.worldObj.provider.dimensionId==mod_pocketDim.properties.LimboDimensionID); - { - this.playMusicForDim(FMLClientHandler.instance().getClient().thePlayer.worldObj); - } - } - + @ForgeSubscribe public void onPlayerEvent(PlayerInteractEvent event) { - // Handle placing Vanilla doors on rifts - if (!event.entity.worldObj.isRemote) + // Handle all door placement here + + World world = event.entity.worldObj; + ItemStack stack = event.entityPlayer.inventory.getCurrentItem(); + if (stack != null) { - World world = event.entity.worldObj; - ItemStack stack = event.entityPlayer.inventory.getCurrentItem(); - if (stack != null) + if (stack.getItem() instanceof ItemDoor) { - Item item = stack.getItem(); - if (item instanceof ItemDoor) + if(mod_pocketDim.itemDimensionalDoor.tryToPlaceDoor(stack, event.entityPlayer, world, event.x, event.y, event.z, event.face)) { - Block doorToPlace = null; - if (stack.itemID == Item.doorIron.itemID) - { - doorToPlace = mod_pocketDim.dimensionalDoor; - } - else if (stack.itemID == Item.doorWood.itemID) - { - doorToPlace = mod_pocketDim.warpDoor; - } - else if (stack.itemID == mod_pocketDim.itemGoldenDoor.itemID) - { - doorToPlace = mod_pocketDim.goldenDimensionalDoor; - } - - if (doorToPlace != null) - { - // SenseiKiwi: Why do we have a condition like this? And the event isn't cancelled if we take the else portion. - // Comments would have been very helpful. - if (mod_pocketDim.itemDimensionalDoor.tryPlacingDoor(doorToPlace, world, event.entityPlayer, stack)) - { - if (!event.entityPlayer.capabilities.isCreativeMode) - { - stack.stackSize--; - } - event.setCanceled(true); - } - else - { - BaseItemDoor.tryItemUse(doorToPlace, stack, event.entityPlayer, world, event.x, event.y, event.z, event.face, true, true); - } - } + //cancel the event so we dont get two doors from vanilla doors + event.setCanceled(true); } } } - } - - @ForgeSubscribe - public void onWorldLoad(WorldEvent.Load event) - { - // We need to initialize PocketManager here because onServerAboutToStart fires before we can - // use DimensionManager and onServerStarting fires after the game tries to generate terrain. - // If a gateway tries to generate before PocketManager has initialized, we get a crash. - if (!PocketManager.isLoaded()) - { - PocketManager.load(); - } - - if (event.world != null) - { - this.playMusicForDim(event.world); - } - } - - @ForgeSubscribe - public void onPlayerFall(LivingFallEvent event) - { - event.setCanceled(event.entity.worldObj.provider.dimensionId == properties.LimboDimensionID); - } - - @ForgeSubscribe(priority = EventPriority.HIGHEST) - public boolean onDeathWithHighPriority(LivingDeathEvent event) - { - // Teleport the entity to Limbo if it's a player in a pocket dimension and - // if Limbo preserves player inventories. We'll check again in a low-priority event handler - // to give other mods a chance to save the player if Limbo does _not_ preserve inventories. - - Entity entity = event.entity; - - if (entity instanceof EntityPlayer && properties.LimboEnabled && - entity.worldObj.provider instanceof PocketProvider && properties.LimboReturnsInventoryEnabled) - { - EntityPlayer player = (EntityPlayer) entity; - mod_pocketDim.deathTracker.addUsername(player.username); - revivePlayerInLimbo(player); - event.setCanceled(true); - return false; - } - return true; - } - - @ForgeSubscribe(priority = EventPriority.LOWEST) - public boolean onDeathWithLowPriority(LivingDeathEvent event) - { - // This low-priority handler gives mods a chance to save a player from death before we apply - // teleporting them to Limbo _without_ preserving their inventory. We also check if the player - // died in a pocket dimension and record it, regardless of whether the player will be sent to Limbo. - - Entity entity = event.entity; - - if (entity instanceof EntityPlayer && entity.worldObj.provider instanceof PocketProvider) - { - EntityPlayer player = (EntityPlayer) entity; - mod_pocketDim.deathTracker.addUsername(player.username); + } - if (properties.LimboEnabled && !properties.LimboReturnsInventoryEnabled) - { - player.inventory.clearInventory(-1, -1); - revivePlayerInLimbo(player); - event.setCanceled(true); - } - return false; - } - return true; - } - - private void revivePlayerInLimbo(EntityPlayer player) - { - player.extinguish(); + @ForgeSubscribe + public void onWorldLoad(WorldEvent.Load event) + { + // We need to initialize PocketManager here because onServerAboutToStart + // fires before we can + // use DimensionManager and onServerStarting fires after the game tries + // to generate terrain. + // If a gateway tries to generate before PocketManager has initialized, + // we get a crash. + if (!PocketManager.isLoaded()) + { + PocketManager.load(); + } + + if (event.world != null) + { + this.playMusicForDim(event.world); + } + } + + @ForgeSubscribe + public void onPlayerFall(LivingFallEvent event) + { + event.setCanceled(event.entity.worldObj.provider.dimensionId == properties.LimboDimensionID); + } + + @ForgeSubscribe(priority = EventPriority.HIGHEST) + public boolean onDeathWithHighPriority(LivingDeathEvent event) + { + // Teleport the entity to Limbo if it's a player in a pocket dimension + // and + // if Limbo preserves player inventories. We'll check again in a + // low-priority event handler + // to give other mods a chance to save the player if Limbo does _not_ + // preserve inventories. + + Entity entity = event.entity; + + if (entity instanceof EntityPlayer && properties.LimboEnabled && entity.worldObj.provider instanceof PocketProvider + && properties.LimboReturnsInventoryEnabled) + { + EntityPlayer player = (EntityPlayer) entity; + mod_pocketDim.deathTracker.addUsername(player.username); + revivePlayerInLimbo(player); + event.setCanceled(true); + return false; + } + return true; + } + + @ForgeSubscribe(priority = EventPriority.LOWEST) + public boolean onDeathWithLowPriority(LivingDeathEvent event) + { + // This low-priority handler gives mods a chance to save a player from + // death before we apply + // teleporting them to Limbo _without_ preserving their inventory. We + // also check if the player + // died in a pocket dimension and record it, regardless of whether the + // player will be sent to Limbo. + + Entity entity = event.entity; + + if (entity instanceof EntityPlayer && entity.worldObj.provider instanceof PocketProvider) + { + EntityPlayer player = (EntityPlayer) entity; + mod_pocketDim.deathTracker.addUsername(player.username); + + if (properties.LimboEnabled && !properties.LimboReturnsInventoryEnabled) + { + player.inventory.clearInventory(-1, -1); + revivePlayerInLimbo(player); + event.setCanceled(true); + } + return false; + } + return true; + } + + private void revivePlayerInLimbo(EntityPlayer player) + { + player.extinguish(); player.clearActivePotions(); player.setHealth(player.getMaxHealth()); Point4D destination = LimboProvider.getLimboSkySpawn(player, properties); DDTeleporter.teleportEntity(player, destination, false); - } + } - @ForgeSubscribe - public void onWorldSave(WorldEvent.Save event) - { - if (event.world.provider.dimensionId == 0) - { - PocketManager.save(); - - if (mod_pocketDim.deathTracker != null && mod_pocketDim.deathTracker.isModified()) - { - mod_pocketDim.deathTracker.writeToFile(); - } - } - } - - public void playMusicForDim(World world) - { - if (world.isRemote) - { - SoundManager sndManager = FMLClientHandler.instance().getClient().sndManager; + @ForgeSubscribe + public void onWorldSave(WorldEvent.Save event) + { + if (event.world.provider.dimensionId == 0) + { + PocketManager.save(); - // SenseiKiwi: I've added the following check as a quick fix for a reported crash. - // This needs to work without a hitch or we have to stop trying to replace the background music... - if (sndManager != null && sndManager.sndSystem != null) - { - if (world.provider instanceof LimboProvider) - { - sndManager.sndSystem.stop("BgMusic"); - SoundPoolEntry soundPoolEntry = sndManager.soundPoolSounds.getRandomSoundFromSoundPool(mod_pocketDim.modid+":creepy"); - if (soundPoolEntry != null) - { - sndManager.sndSystem.backgroundMusic("LimboMusic", soundPoolEntry.getSoundUrl(), soundPoolEntry.getSoundName(), false); - sndManager.sndSystem.play("LimboMusic"); - } - } - else if (!(world.provider instanceof LimboProvider)) - { - sndManager.sndSystem.stop("LimboMusic"); - } - } - } - } + if (mod_pocketDim.deathTracker != null && mod_pocketDim.deathTracker.isModified()) + { + mod_pocketDim.deathTracker.writeToFile(); + } + } + } + + public void playMusicForDim(World world) + { + if (world.isRemote) + { + SoundManager sndManager = FMLClientHandler.instance().getClient().sndManager; + + // SenseiKiwi: I've added the following check as a quick fix for a + // reported crash. + // This needs to work without a hitch or we have to stop trying to + // replace the background music... + if (sndManager != null && sndManager.sndSystem != null) + { + if (world.provider instanceof LimboProvider) + { + sndManager.sndSystem.stop("BgMusic"); + SoundPoolEntry soundPoolEntry = sndManager.soundPoolSounds.getRandomSoundFromSoundPool(mod_pocketDim.modid + ":creepy"); + if (soundPoolEntry != null) + { + sndManager.sndSystem.backgroundMusic("LimboMusic", soundPoolEntry.getSoundUrl(), soundPoolEntry.getSoundName(), false); + sndManager.sndSystem.play("LimboMusic"); + } + } + else if (!(world.provider instanceof LimboProvider)) + { + sndManager.sndSystem.stop("LimboMusic"); + } + } + } + } } \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java index e97ad6a..d29f322 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java @@ -1,25 +1,31 @@ package StevenDimDoors.mod_pocketDim.items; +import java.util.HashMap; import java.util.List; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; import net.minecraft.item.ItemDoor; import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; - public abstract class BaseItemDoor extends ItemDoor { + // maps non-dimensional door items to their corresponding dimensional door + // item + private static HashMap vanillaDoorMapping = new HashMap(); private static DDProperties properties = null; public BaseItemDoor(int itemID, Material material) @@ -29,6 +35,10 @@ public abstract class BaseItemDoor extends ItemDoor this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); if (properties == null) properties = DDProperties.instance(); + + vanillaDoorMapping.put((ItemDoor) mod_pocketDim.itemGoldenDoor, (BaseItemDoor) mod_pocketDim.itemGoldenDimensionalDoor); + vanillaDoorMapping.put((ItemDoor) Item.doorIron, (BaseItemDoor) mod_pocketDim.itemDimensionalDoor); + vanillaDoorMapping.put((ItemDoor) Item.doorWood, (BaseItemDoor) mod_pocketDim.itemWarpDoor); } @Override @@ -41,12 +51,86 @@ public abstract class BaseItemDoor extends ItemDoor @Override public abstract void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4); + /** + * Overriden in subclasses to specify which door block that door item will + * place + * + * @return + */ + protected abstract BaseDimDoor getDoortoItemMapping(); + + /** + * Overriden here to remove vanilla block placement functionality from + * dimensional doors, we handle this in the EventHookContainer + */ @Override - public abstract boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ); - - public static boolean tryItemUse(Block doorBlock, ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, boolean requireLink, boolean reduceStack) + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { - // Only place doors on top of blocks - check if we're targeting the top side + // TODO Auto-generated method stub + return false; + } + + public static BaseDimDoor getDoorToPlace(Item item) + { + if (!(item instanceof BaseItemDoor)) + { + item = BaseItemDoor.vanillaDoorMapping.get(item); + } + return ((BaseItemDoor) item).getDoortoItemMapping(); + } + + /** + * Tries to place a door block, called in EventHookContainer + * + * @param doorBlock + * @param stack + * @param player + * @param world + * @param x + * @param y + * @param z + * @param side + * @param requireLink + * @param reduceStack + * @return + */ + public static boolean tryToPlaceDoor(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side) + { + if (world.isRemote) + { + return false; + } + if (!(stack.getItem() instanceof ItemDoor)) + { + throw new IllegalArgumentException("The itemstack must correspond to some type of door"); + } + if (BaseItemDoor.placeDoorOnBlock(getDoorToPlace(stack.getItem()), stack, player, world, x, y, z, side)) + { + return true; + } + return BaseItemDoor.placeDoorOnRift(getDoorToPlace(stack.getItem()), world, player, stack); + } + + /** + * try to place a door block on a block + * @param doorBlock + * @param stack + * @param player + * @param world + * @param x + * @param y + * @param z + * @param side + * @return + */ + public static boolean placeDoorOnBlock(Block doorBlock, ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side) + { + if (world.isRemote) + { + return false; + } + // Only place doors on top of blocks - check if we're targeting the top + // side if (side == 1 && !world.isRemote) { int blockID = world.getBlockId(x, y, z); @@ -58,14 +142,13 @@ public abstract class BaseItemDoor extends ItemDoor } } - if (canPlace(world, x, y, z) && canPlace(world, x, y + 1, z) && - player.canPlayerEdit(x, y, z, side, stack) && player.canPlayerEdit(x, y + 1, z, side, stack) && - (!requireLink || PocketManager.getLink(x, y + 1, z, world) != null)&&stack.stackSize>0) + if (canPlace(world, x, y, z) && canPlace(world, x, y + 1, z) && player.canPlayerEdit(x, y, z, side, stack) + && player.canPlayerEdit(x, y + 1, z, side, stack) && stack.stackSize > 0) { int orientation = MathHelper.floor_double((player.rotationYaw + 180.0F) * 4.0F / 360.0F - 0.5D) & 3; placeDoorBlock(world, x, y, z, orientation, doorBlock); - if (!player.capabilities.isCreativeMode && reduceStack) + if (!player.capabilities.isCreativeMode) { stack.stackSize--; } @@ -75,17 +158,23 @@ public abstract class BaseItemDoor extends ItemDoor return false; } - @Override - public abstract ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player); - - public boolean tryPlacingDoor(Block doorBlock, World world, EntityPlayer player, ItemStack item) + /** + * uses a raytrace to try and place a door on a rift + * + * @param doorBlock + * @param world + * @param player + * @param stack + * @return + */ + public static boolean placeDoorOnRift(Block doorBlock, World world, EntityPlayer player, ItemStack stack) { if (world.isRemote) { return false; } - MovingObjectPosition hit = getMovingObjectPositionFromPlayer(player.worldObj, player, true); + MovingObjectPosition hit = BaseItemDoor.doRayTrace(player.worldObj, player, true); if (hit != null) { if (world.getBlockId(hit.blockX, hit.blockY, hit.blockZ) == properties.RiftBlockID) @@ -97,15 +186,19 @@ public abstract class BaseItemDoor extends ItemDoor int y = hit.blockY; int z = hit.blockZ; - if (player.canPlayerEdit(x, y, z, hit.sideHit, item) && player.canPlayerEdit(x, y - 1, z, hit.sideHit, item)) + if (player.canPlayerEdit(x, y, z, hit.sideHit, stack) && player.canPlayerEdit(x, y - 1, z, hit.sideHit, stack)) { if (canPlace(world, x, y, z) && canPlace(world, x, y - 1, z)) { int orientation = MathHelper.floor_double(((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; placeDoorBlock(world, x, y - 1, z, orientation, doorBlock); - if(!(item.getItem() instanceof BaseItemDoor)) + if (!(stack.getItem() instanceof BaseItemDoor)) { - ((TileEntityDimDoor)world.getBlockTileEntity(x, y, z)).hasGennedPair=true; + ((TileEntityDimDoor) world.getBlockTileEntity(x, y, z)).hasGennedPair = true; + } + if (!player.capabilities.isCreativeMode) + { + stack.stackSize--; } return true; } @@ -122,4 +215,38 @@ public abstract class BaseItemDoor extends ItemDoor return (id == properties.RiftBlockID || id == 0 || Block.blocksList[id].blockMaterial.isReplaceable()); } + + /** + * Copied from minecraft Item.class + * TODO we probably can improve this + * + * @param par1World + * @param par2EntityPlayer + * @param par3 + * @return + */ + protected static MovingObjectPosition doRayTrace(World par1World, EntityPlayer par2EntityPlayer, boolean par3) + { + float f = 1.0F; + float f1 = par2EntityPlayer.prevRotationPitch + (par2EntityPlayer.rotationPitch - par2EntityPlayer.prevRotationPitch) * f; + float f2 = par2EntityPlayer.prevRotationYaw + (par2EntityPlayer.rotationYaw - par2EntityPlayer.prevRotationYaw) * f; + double d0 = par2EntityPlayer.prevPosX + (par2EntityPlayer.posX - par2EntityPlayer.prevPosX) * (double) f; + double d1 = par2EntityPlayer.prevPosY + (par2EntityPlayer.posY - par2EntityPlayer.prevPosY) * (double) f + + (double) (par1World.isRemote ? par2EntityPlayer.getEyeHeight() - par2EntityPlayer.getDefaultEyeHeight() : par2EntityPlayer.getEyeHeight()); + double d2 = par2EntityPlayer.prevPosZ + (par2EntityPlayer.posZ - par2EntityPlayer.prevPosZ) * (double) f; + Vec3 vec3 = par1World.getWorldVec3Pool().getVecFromPool(d0, d1, d2); + float f3 = MathHelper.cos(-f2 * 0.017453292F - (float) Math.PI); + float f4 = MathHelper.sin(-f2 * 0.017453292F - (float) Math.PI); + float f5 = -MathHelper.cos(-f1 * 0.017453292F); + float f6 = MathHelper.sin(-f1 * 0.017453292F); + float f7 = f4 * f5; + float f8 = f3 * f5; + double d3 = 5.0D; + if (par2EntityPlayer instanceof EntityPlayerMP) + { + d3 = ((EntityPlayerMP) par2EntityPlayer).theItemInWorldManager.getBlockReachDistance(); + } + Vec3 vec31 = vec3.addVector((double) f7 * d3, (double) f6 * d3, (double) f8 * d3); + return par1World.rayTraceBlocks_do_do(vec3, vec31, par3, !par3); + } } \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java index 6804e28..a85f5e4 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java @@ -7,6 +7,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; public class ItemDimensionalDoor extends BaseItemDoor { @@ -26,23 +27,8 @@ public class ItemDimensionalDoor extends BaseItemDoor } @Override - public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) + protected BaseDimDoor getDoortoItemMapping() { - if (!world.isRemote) - { - if (tryPlacingDoor(mod_pocketDim.dimensionalDoor, world, player, stack) && - !player.capabilities.isCreativeMode) - { - stack.stackSize--; - } - } - return stack; - } - - @Override - public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, - int z, int par7, float par8, float par9, float par10) - { - return tryItemUse(mod_pocketDim.dimensionalDoor, stack, player, world, x, y, z, par7, false, true); + return (BaseDimDoor) mod_pocketDim.dimensionalDoor; } } \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDimDoor.java index a39a24a..fceb2f3 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDimDoor.java @@ -7,6 +7,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; public class ItemGoldDimDoor extends BaseItemDoor { @@ -16,7 +17,6 @@ public class ItemGoldDimDoor extends BaseItemDoor // TODO Auto-generated constructor stub } - @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) @@ -27,26 +27,8 @@ public class ItemGoldDimDoor extends BaseItemDoor } @Override - public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, - int z, int par7, float par8, float par9, float par10) + protected BaseDimDoor getDoortoItemMapping() { - return tryItemUse(mod_pocketDim.goldenDimensionalDoor, stack, player, world, x, y, z, par7, false, true); + return (BaseDimDoor) mod_pocketDim.goldenDimensionalDoor; } - - @Override - public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) - { - if (!world.isRemote) - { - if (tryPlacingDoor(mod_pocketDim.goldenDimensionalDoor, world, player, stack) && - !player.capabilities.isCreativeMode) - { - stack.stackSize--; - } - } - return stack; - } - - - } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java index a7d63ec..809fc86 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java @@ -7,6 +7,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; public class ItemUnstableDoor extends BaseItemDoor { @@ -23,23 +24,8 @@ public class ItemUnstableDoor extends BaseItemDoor } @Override - public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) + protected BaseDimDoor getDoortoItemMapping() { - if (!world.isRemote) - { - if (tryPlacingDoor(mod_pocketDim.unstableDoor, world, player, stack) && - !player.capabilities.isCreativeMode) - { - stack.stackSize--; - } - } - return stack; - } - - @Override - public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, - int z, int par7, float par8, float par9, float par10) - { - return tryItemUse(mod_pocketDim.unstableDoor, stack, player, world, x, y, z, par7, false, true); + return (BaseDimDoor) mod_pocketDim.unstableDoor; } } \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java index 0309a3f..ac3f66a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java @@ -7,6 +7,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; public class ItemWarpDoor extends BaseItemDoor { @@ -26,23 +27,8 @@ public class ItemWarpDoor extends BaseItemDoor } @Override - public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) + protected BaseDimDoor getDoortoItemMapping() { - if (!world.isRemote) - { - if (tryPlacingDoor(mod_pocketDim.warpDoor, world, player, stack) && - !player.capabilities.isCreativeMode) - { - stack.stackSize--; - } - } - return stack; - } - - @Override - public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, - int z, int par7, float par8, float par9, float par10) - { - return tryItemUse(mod_pocketDim.warpDoor, stack, player, world, x, y, z, par7, false, true); + return (BaseDimDoor) mod_pocketDim.warpDoor; } } \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java b/src/main/java/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java index fb39f5b..8cef1fd 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java @@ -7,6 +7,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Deque; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -243,43 +244,58 @@ public class DDSaveHandler // Create the data directory for our dimensions // Don't catch exceptions here. If we can't create this folder, // the mod should crash to let the user know early on. + + //I still dont think that this is the best way to do this, but atleast it is better than + //risking deleting everything. I delete files afterwards that I did not modify. - String basePath = DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/data/"; - File basePathFile = new File(basePath); - Files.createParentDirs(basePathFile); - basePathFile.mkdir(); - + //get the save directory path + File saveDirectory = new File(DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/data/"); + + //create the save directory + Files.createParentDirs(saveDirectory); + saveDirectory.mkdir(); + + //create and write the blackList BlacklistProcessor blacklistReader = new BlacklistProcessor(); - writeBlacklist(blacklist, blacklistReader,basePath); + writeBlacklist(blacklist, blacklistReader,saveDirectory); FileFilter dataFileFilter = new FileFilters.RegexFileFilter("dim_-?\\d+\\.txt"); - //TODO Deal with temp files correctly - File[] dataFiles = basePathFile.listFiles(dataFileFilter); + //Take the list of all dimData files already saved in the save Directory, and map them according to ID. + File[] dataFiles = saveDirectory.listFiles(dataFileFilter); + HashMap unsavedDimData = new HashMap(); for (File dataFile : dataFiles) { - dataFile.delete(); + unsavedDimData.put(Integer.parseInt(dataFile.getName().split("[.]")[0].substring(4)), dataFile); } - - basePathFile = null; - basePath += "dim_"; - boolean succeeded = true; + + //write the dimension save data, and remove the ones we save from the mapping DimDataProcessor writer = new DimDataProcessor(); for (IPackable dimension : dimensions) { - succeeded &= writeDimension(dimension, writer, basePath); + succeeded &= writeDimension(dimension, writer, saveDirectory.getAbsolutePath()+"/dim_"); + unsavedDimData.remove(Integer.parseInt(dimension.name())); + } + + //once we have finished saving, delete the files from the save directory that where not saved + if(succeeded) + { + for (File dataFile : unsavedDimData.values()) + { + dataFile.delete(); + } } return succeeded; } - private static boolean writeBlacklist(List blacklist, BlacklistProcessor writer, String basePath) + private static boolean writeBlacklist(List blacklist, BlacklistProcessor writer, File saveDirectory) { try { - File tempFile = new File(basePath + "blacklist.tmp"); - File saveFile = new File(basePath + "blacklist.txt"); + File tempFile = new File(saveDirectory.getAbsolutePath() + "blacklist.tmp"); + File saveFile = new File(saveDirectory.getAbsolutePath() + "blacklist.txt"); writer.writeToFile(tempFile, blacklist); saveFile.delete(); tempFile.renameTo(saveFile); -- 2.39.5 From 76e9fce9d4d2fd1aba09c822a6215ec3f3888902 Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Mon, 24 Mar 2014 21:09:21 -0400 Subject: [PATCH 2/7] Fixed all doors being placed as dim doors --- .../java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java index d29f322..5f7ca97 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java @@ -143,7 +143,8 @@ public abstract class BaseItemDoor extends ItemDoor } if (canPlace(world, x, y, z) && canPlace(world, x, y + 1, z) && player.canPlayerEdit(x, y, z, side, stack) - && player.canPlayerEdit(x, y + 1, z, side, stack) && stack.stackSize > 0) + && (player.canPlayerEdit(x, y + 1, z, side, stack) && stack.stackSize > 0) + &&((stack.getItem() instanceof BaseItemDoor) || PocketManager.getLink(x, y + 1, z, world) != null)) { int orientation = MathHelper.floor_double((player.rotationYaw + 180.0F) * 4.0F / 360.0F - 0.5D) & 3; placeDoorBlock(world, x, y, z, orientation, doorBlock); -- 2.39.5 From 9914666639e930c606efe08d71c5a09d4870903b Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Mon, 24 Mar 2014 20:58:36 -0400 Subject: [PATCH 3/7] Changes Made saving a bit more robust, now we only delete ones that where not modified. Also overhauled door placement, its all handled by the eventHandler now. --- .../mod_pocketDim/EventHookContainer.java | 359 +++++++++--------- .../mod_pocketDim/items/BaseItemDoor.java | 163 +++++++- .../items/ItemDimensionalDoor.java | 20 +- .../mod_pocketDim/items/ItemGoldDimDoor.java | 24 +- .../mod_pocketDim/items/ItemUnstableDoor.java | 20 +- .../mod_pocketDim/items/ItemWarpDoor.java | 20 +- .../mod_pocketDim/saving/DDSaveHandler.java | 50 ++- 7 files changed, 362 insertions(+), 294 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java index f52fa18..67519a1 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.blocks.BaseDimDoor; import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; import StevenDimDoors.mod_pocketDim.core.PocketManager; @@ -32,218 +33,202 @@ import cpw.mods.fml.relauncher.SideOnly; public class EventHookContainer { - private final DDProperties properties; - + private final DDProperties properties; + public EventHookContainer(DDProperties properties) { this.properties = properties; } - + @ForgeSubscribe(priority = EventPriority.LOW) public void onInitMapGen(InitMapGenEvent event) { - // Replace the Nether fortress generator with our own only if any gateways would ever generate. - // This allows admins to disable our fortress overriding without disabling all gateways. + // Replace the Nether fortress generator with our own only if any + // gateways would ever generate. + // This allows admins to disable our fortress overriding without + // disabling all gateways. /* - if (properties.FortressGatewayGenerationChance > 0 && properties.WorldRiftGenerationEnabled && - event.type == InitMapGenEvent.EventType.NETHER_BRIDGE) + * if (properties.FortressGatewayGenerationChance > 0 && + * properties.WorldRiftGenerationEnabled && event.type == + * InitMapGenEvent.EventType.NETHER_BRIDGE) { event.newGen = new + * DDNetherFortressGenerator(); } + */ + } + + @SideOnly(Side.CLIENT) + @ForgeSubscribe + public void onSoundLoad(SoundLoadEvent event) + { + event.manager.addSound(mod_pocketDim.modid + ":monk.ogg"); + event.manager.addSound(mod_pocketDim.modid + ":crack.ogg"); + event.manager.addSound(mod_pocketDim.modid + ":tearing.ogg"); + event.manager.addSound(mod_pocketDim.modid + ":rift.ogg"); + event.manager.addSound(mod_pocketDim.modid + ":riftStart.ogg"); + event.manager.addSound(mod_pocketDim.modid + ":riftEnd.ogg"); + event.manager.addSound(mod_pocketDim.modid + ":riftClose.ogg"); + event.manager.addSound(mod_pocketDim.modid + ":riftDoor.ogg"); + event.manager.addSound(mod_pocketDim.modid + ":creepy.ogg"); + } + + @SideOnly(Side.CLIENT) + @ForgeSubscribe + public void onSoundEffectResult(PlayBackgroundMusicEvent event) + { + if (FMLClientHandler.instance().getClient().thePlayer.worldObj.provider.dimensionId == mod_pocketDim.properties.LimboDimensionID) + ; { - event.newGen = new DDNetherFortressGenerator(); + this.playMusicForDim(FMLClientHandler.instance().getClient().thePlayer.worldObj); } - */ } - - @SideOnly(Side.CLIENT) - @ForgeSubscribe - public void onSoundLoad(SoundLoadEvent event) - { - event.manager.addSound(mod_pocketDim.modid+":monk.ogg"); - event.manager.addSound(mod_pocketDim.modid+":crack.ogg"); - event.manager.addSound(mod_pocketDim.modid+":tearing.ogg"); - event.manager.addSound(mod_pocketDim.modid+":rift.ogg"); - event.manager.addSound(mod_pocketDim.modid+":riftStart.ogg"); - event.manager.addSound(mod_pocketDim.modid+":riftEnd.ogg"); - event.manager.addSound(mod_pocketDim.modid+":riftClose.ogg"); - event.manager.addSound(mod_pocketDim.modid+":riftDoor.ogg"); - event.manager.addSound(mod_pocketDim.modid+":creepy.ogg"); - } - - @SideOnly(Side.CLIENT) - @ForgeSubscribe - public void onSoundEffectResult(PlayBackgroundMusicEvent event) - { - if (FMLClientHandler.instance().getClient().thePlayer.worldObj.provider.dimensionId==mod_pocketDim.properties.LimboDimensionID); - { - this.playMusicForDim(FMLClientHandler.instance().getClient().thePlayer.worldObj); - } - } - + @ForgeSubscribe public void onPlayerEvent(PlayerInteractEvent event) { - // Handle placing Vanilla doors on rifts - if (!event.entity.worldObj.isRemote) + // Handle all door placement here + + World world = event.entity.worldObj; + ItemStack stack = event.entityPlayer.inventory.getCurrentItem(); + if (stack != null) { - World world = event.entity.worldObj; - ItemStack stack = event.entityPlayer.inventory.getCurrentItem(); - if (stack != null) + if (stack.getItem() instanceof ItemDoor) { - Item item = stack.getItem(); - if (item instanceof ItemDoor) + if(mod_pocketDim.itemDimensionalDoor.tryToPlaceDoor(stack, event.entityPlayer, world, event.x, event.y, event.z, event.face)) { - Block doorToPlace = null; - if (stack.itemID == Item.doorIron.itemID) - { - doorToPlace = mod_pocketDim.dimensionalDoor; - } - else if (stack.itemID == Item.doorWood.itemID) - { - doorToPlace = mod_pocketDim.warpDoor; - } - else if (stack.itemID == mod_pocketDim.itemGoldenDoor.itemID) - { - doorToPlace = mod_pocketDim.goldenDimensionalDoor; - } - - if (doorToPlace != null) - { - // SenseiKiwi: Why do we have a condition like this? And the event isn't cancelled if we take the else portion. - // Comments would have been very helpful. - if (mod_pocketDim.itemDimensionalDoor.tryPlacingDoor(doorToPlace, world, event.entityPlayer, stack)) - { - if (!event.entityPlayer.capabilities.isCreativeMode) - { - stack.stackSize--; - } - event.setCanceled(true); - } - else - { - BaseItemDoor.tryItemUse(doorToPlace, stack, event.entityPlayer, world, event.x, event.y, event.z, event.face, true, true); - } - } + //cancel the event so we dont get two doors from vanilla doors + event.setCanceled(true); } } } - } - - @ForgeSubscribe - public void onWorldLoad(WorldEvent.Load event) - { - // We need to initialize PocketManager here because onServerAboutToStart fires before we can - // use DimensionManager and onServerStarting fires after the game tries to generate terrain. - // If a gateway tries to generate before PocketManager has initialized, we get a crash. - if (!PocketManager.isLoaded()) - { - PocketManager.load(); - } - - if (event.world != null) - { - this.playMusicForDim(event.world); - } - } - - @ForgeSubscribe - public void onPlayerFall(LivingFallEvent event) - { - event.setCanceled(event.entity.worldObj.provider.dimensionId == properties.LimboDimensionID); - } - - @ForgeSubscribe(priority = EventPriority.HIGHEST) - public boolean onDeathWithHighPriority(LivingDeathEvent event) - { - // Teleport the entity to Limbo if it's a player in a pocket dimension and - // if Limbo preserves player inventories. We'll check again in a low-priority event handler - // to give other mods a chance to save the player if Limbo does _not_ preserve inventories. - - Entity entity = event.entity; - - if (entity instanceof EntityPlayer && properties.LimboEnabled && - entity.worldObj.provider instanceof PocketProvider && properties.LimboReturnsInventoryEnabled) - { - EntityPlayer player = (EntityPlayer) entity; - mod_pocketDim.deathTracker.addUsername(player.username); - revivePlayerInLimbo(player); - event.setCanceled(true); - return false; - } - return true; - } - - @ForgeSubscribe(priority = EventPriority.LOWEST) - public boolean onDeathWithLowPriority(LivingDeathEvent event) - { - // This low-priority handler gives mods a chance to save a player from death before we apply - // teleporting them to Limbo _without_ preserving their inventory. We also check if the player - // died in a pocket dimension and record it, regardless of whether the player will be sent to Limbo. - - Entity entity = event.entity; - - if (entity instanceof EntityPlayer && entity.worldObj.provider instanceof PocketProvider) - { - EntityPlayer player = (EntityPlayer) entity; - mod_pocketDim.deathTracker.addUsername(player.username); + } - if (properties.LimboEnabled && !properties.LimboReturnsInventoryEnabled) - { - player.inventory.clearInventory(-1, -1); - revivePlayerInLimbo(player); - event.setCanceled(true); - } - return false; - } - return true; - } - - private void revivePlayerInLimbo(EntityPlayer player) - { - player.extinguish(); + @ForgeSubscribe + public void onWorldLoad(WorldEvent.Load event) + { + // We need to initialize PocketManager here because onServerAboutToStart + // fires before we can + // use DimensionManager and onServerStarting fires after the game tries + // to generate terrain. + // If a gateway tries to generate before PocketManager has initialized, + // we get a crash. + if (!PocketManager.isLoaded()) + { + PocketManager.load(); + } + + if (event.world != null) + { + this.playMusicForDim(event.world); + } + } + + @ForgeSubscribe + public void onPlayerFall(LivingFallEvent event) + { + event.setCanceled(event.entity.worldObj.provider.dimensionId == properties.LimboDimensionID); + } + + @ForgeSubscribe(priority = EventPriority.HIGHEST) + public boolean onDeathWithHighPriority(LivingDeathEvent event) + { + // Teleport the entity to Limbo if it's a player in a pocket dimension + // and + // if Limbo preserves player inventories. We'll check again in a + // low-priority event handler + // to give other mods a chance to save the player if Limbo does _not_ + // preserve inventories. + + Entity entity = event.entity; + + if (entity instanceof EntityPlayer && properties.LimboEnabled && entity.worldObj.provider instanceof PocketProvider + && properties.LimboReturnsInventoryEnabled) + { + EntityPlayer player = (EntityPlayer) entity; + mod_pocketDim.deathTracker.addUsername(player.username); + revivePlayerInLimbo(player); + event.setCanceled(true); + return false; + } + return true; + } + + @ForgeSubscribe(priority = EventPriority.LOWEST) + public boolean onDeathWithLowPriority(LivingDeathEvent event) + { + // This low-priority handler gives mods a chance to save a player from + // death before we apply + // teleporting them to Limbo _without_ preserving their inventory. We + // also check if the player + // died in a pocket dimension and record it, regardless of whether the + // player will be sent to Limbo. + + Entity entity = event.entity; + + if (entity instanceof EntityPlayer && entity.worldObj.provider instanceof PocketProvider) + { + EntityPlayer player = (EntityPlayer) entity; + mod_pocketDim.deathTracker.addUsername(player.username); + + if (properties.LimboEnabled && !properties.LimboReturnsInventoryEnabled) + { + player.inventory.clearInventory(-1, -1); + revivePlayerInLimbo(player); + event.setCanceled(true); + } + return false; + } + return true; + } + + private void revivePlayerInLimbo(EntityPlayer player) + { + player.extinguish(); player.clearActivePotions(); player.setHealth(player.getMaxHealth()); Point4D destination = LimboProvider.getLimboSkySpawn(player, properties); DDTeleporter.teleportEntity(player, destination, false); - } + } - @ForgeSubscribe - public void onWorldSave(WorldEvent.Save event) - { - if (event.world.provider.dimensionId == 0) - { - PocketManager.save(); - - if (mod_pocketDim.deathTracker != null && mod_pocketDim.deathTracker.isModified()) - { - mod_pocketDim.deathTracker.writeToFile(); - } - } - } - - public void playMusicForDim(World world) - { - if (world.isRemote) - { - SoundManager sndManager = FMLClientHandler.instance().getClient().sndManager; + @ForgeSubscribe + public void onWorldSave(WorldEvent.Save event) + { + if (event.world.provider.dimensionId == 0) + { + PocketManager.save(); - // SenseiKiwi: I've added the following check as a quick fix for a reported crash. - // This needs to work without a hitch or we have to stop trying to replace the background music... - if (sndManager != null && sndManager.sndSystem != null) - { - if (world.provider instanceof LimboProvider) - { - sndManager.sndSystem.stop("BgMusic"); - SoundPoolEntry soundPoolEntry = sndManager.soundPoolSounds.getRandomSoundFromSoundPool(mod_pocketDim.modid+":creepy"); - if (soundPoolEntry != null) - { - sndManager.sndSystem.backgroundMusic("LimboMusic", soundPoolEntry.getSoundUrl(), soundPoolEntry.getSoundName(), false); - sndManager.sndSystem.play("LimboMusic"); - } - } - else if (!(world.provider instanceof LimboProvider)) - { - sndManager.sndSystem.stop("LimboMusic"); - } - } - } - } + if (mod_pocketDim.deathTracker != null && mod_pocketDim.deathTracker.isModified()) + { + mod_pocketDim.deathTracker.writeToFile(); + } + } + } + + public void playMusicForDim(World world) + { + if (world.isRemote) + { + SoundManager sndManager = FMLClientHandler.instance().getClient().sndManager; + + // SenseiKiwi: I've added the following check as a quick fix for a + // reported crash. + // This needs to work without a hitch or we have to stop trying to + // replace the background music... + if (sndManager != null && sndManager.sndSystem != null) + { + if (world.provider instanceof LimboProvider) + { + sndManager.sndSystem.stop("BgMusic"); + SoundPoolEntry soundPoolEntry = sndManager.soundPoolSounds.getRandomSoundFromSoundPool(mod_pocketDim.modid + ":creepy"); + if (soundPoolEntry != null) + { + sndManager.sndSystem.backgroundMusic("LimboMusic", soundPoolEntry.getSoundUrl(), soundPoolEntry.getSoundName(), false); + sndManager.sndSystem.play("LimboMusic"); + } + } + else if (!(world.provider instanceof LimboProvider)) + { + sndManager.sndSystem.stop("LimboMusic"); + } + } + } + } } \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java index e97ad6a..d29f322 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java @@ -1,25 +1,31 @@ package StevenDimDoors.mod_pocketDim.items; +import java.util.HashMap; import java.util.List; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; import net.minecraft.item.ItemDoor; import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; - public abstract class BaseItemDoor extends ItemDoor { + // maps non-dimensional door items to their corresponding dimensional door + // item + private static HashMap vanillaDoorMapping = new HashMap(); private static DDProperties properties = null; public BaseItemDoor(int itemID, Material material) @@ -29,6 +35,10 @@ public abstract class BaseItemDoor extends ItemDoor this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); if (properties == null) properties = DDProperties.instance(); + + vanillaDoorMapping.put((ItemDoor) mod_pocketDim.itemGoldenDoor, (BaseItemDoor) mod_pocketDim.itemGoldenDimensionalDoor); + vanillaDoorMapping.put((ItemDoor) Item.doorIron, (BaseItemDoor) mod_pocketDim.itemDimensionalDoor); + vanillaDoorMapping.put((ItemDoor) Item.doorWood, (BaseItemDoor) mod_pocketDim.itemWarpDoor); } @Override @@ -41,12 +51,86 @@ public abstract class BaseItemDoor extends ItemDoor @Override public abstract void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4); + /** + * Overriden in subclasses to specify which door block that door item will + * place + * + * @return + */ + protected abstract BaseDimDoor getDoortoItemMapping(); + + /** + * Overriden here to remove vanilla block placement functionality from + * dimensional doors, we handle this in the EventHookContainer + */ @Override - public abstract boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ); - - public static boolean tryItemUse(Block doorBlock, ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, boolean requireLink, boolean reduceStack) + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { - // Only place doors on top of blocks - check if we're targeting the top side + // TODO Auto-generated method stub + return false; + } + + public static BaseDimDoor getDoorToPlace(Item item) + { + if (!(item instanceof BaseItemDoor)) + { + item = BaseItemDoor.vanillaDoorMapping.get(item); + } + return ((BaseItemDoor) item).getDoortoItemMapping(); + } + + /** + * Tries to place a door block, called in EventHookContainer + * + * @param doorBlock + * @param stack + * @param player + * @param world + * @param x + * @param y + * @param z + * @param side + * @param requireLink + * @param reduceStack + * @return + */ + public static boolean tryToPlaceDoor(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side) + { + if (world.isRemote) + { + return false; + } + if (!(stack.getItem() instanceof ItemDoor)) + { + throw new IllegalArgumentException("The itemstack must correspond to some type of door"); + } + if (BaseItemDoor.placeDoorOnBlock(getDoorToPlace(stack.getItem()), stack, player, world, x, y, z, side)) + { + return true; + } + return BaseItemDoor.placeDoorOnRift(getDoorToPlace(stack.getItem()), world, player, stack); + } + + /** + * try to place a door block on a block + * @param doorBlock + * @param stack + * @param player + * @param world + * @param x + * @param y + * @param z + * @param side + * @return + */ + public static boolean placeDoorOnBlock(Block doorBlock, ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side) + { + if (world.isRemote) + { + return false; + } + // Only place doors on top of blocks - check if we're targeting the top + // side if (side == 1 && !world.isRemote) { int blockID = world.getBlockId(x, y, z); @@ -58,14 +142,13 @@ public abstract class BaseItemDoor extends ItemDoor } } - if (canPlace(world, x, y, z) && canPlace(world, x, y + 1, z) && - player.canPlayerEdit(x, y, z, side, stack) && player.canPlayerEdit(x, y + 1, z, side, stack) && - (!requireLink || PocketManager.getLink(x, y + 1, z, world) != null)&&stack.stackSize>0) + if (canPlace(world, x, y, z) && canPlace(world, x, y + 1, z) && player.canPlayerEdit(x, y, z, side, stack) + && player.canPlayerEdit(x, y + 1, z, side, stack) && stack.stackSize > 0) { int orientation = MathHelper.floor_double((player.rotationYaw + 180.0F) * 4.0F / 360.0F - 0.5D) & 3; placeDoorBlock(world, x, y, z, orientation, doorBlock); - if (!player.capabilities.isCreativeMode && reduceStack) + if (!player.capabilities.isCreativeMode) { stack.stackSize--; } @@ -75,17 +158,23 @@ public abstract class BaseItemDoor extends ItemDoor return false; } - @Override - public abstract ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player); - - public boolean tryPlacingDoor(Block doorBlock, World world, EntityPlayer player, ItemStack item) + /** + * uses a raytrace to try and place a door on a rift + * + * @param doorBlock + * @param world + * @param player + * @param stack + * @return + */ + public static boolean placeDoorOnRift(Block doorBlock, World world, EntityPlayer player, ItemStack stack) { if (world.isRemote) { return false; } - MovingObjectPosition hit = getMovingObjectPositionFromPlayer(player.worldObj, player, true); + MovingObjectPosition hit = BaseItemDoor.doRayTrace(player.worldObj, player, true); if (hit != null) { if (world.getBlockId(hit.blockX, hit.blockY, hit.blockZ) == properties.RiftBlockID) @@ -97,15 +186,19 @@ public abstract class BaseItemDoor extends ItemDoor int y = hit.blockY; int z = hit.blockZ; - if (player.canPlayerEdit(x, y, z, hit.sideHit, item) && player.canPlayerEdit(x, y - 1, z, hit.sideHit, item)) + if (player.canPlayerEdit(x, y, z, hit.sideHit, stack) && player.canPlayerEdit(x, y - 1, z, hit.sideHit, stack)) { if (canPlace(world, x, y, z) && canPlace(world, x, y - 1, z)) { int orientation = MathHelper.floor_double(((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3; placeDoorBlock(world, x, y - 1, z, orientation, doorBlock); - if(!(item.getItem() instanceof BaseItemDoor)) + if (!(stack.getItem() instanceof BaseItemDoor)) { - ((TileEntityDimDoor)world.getBlockTileEntity(x, y, z)).hasGennedPair=true; + ((TileEntityDimDoor) world.getBlockTileEntity(x, y, z)).hasGennedPair = true; + } + if (!player.capabilities.isCreativeMode) + { + stack.stackSize--; } return true; } @@ -122,4 +215,38 @@ public abstract class BaseItemDoor extends ItemDoor return (id == properties.RiftBlockID || id == 0 || Block.blocksList[id].blockMaterial.isReplaceable()); } + + /** + * Copied from minecraft Item.class + * TODO we probably can improve this + * + * @param par1World + * @param par2EntityPlayer + * @param par3 + * @return + */ + protected static MovingObjectPosition doRayTrace(World par1World, EntityPlayer par2EntityPlayer, boolean par3) + { + float f = 1.0F; + float f1 = par2EntityPlayer.prevRotationPitch + (par2EntityPlayer.rotationPitch - par2EntityPlayer.prevRotationPitch) * f; + float f2 = par2EntityPlayer.prevRotationYaw + (par2EntityPlayer.rotationYaw - par2EntityPlayer.prevRotationYaw) * f; + double d0 = par2EntityPlayer.prevPosX + (par2EntityPlayer.posX - par2EntityPlayer.prevPosX) * (double) f; + double d1 = par2EntityPlayer.prevPosY + (par2EntityPlayer.posY - par2EntityPlayer.prevPosY) * (double) f + + (double) (par1World.isRemote ? par2EntityPlayer.getEyeHeight() - par2EntityPlayer.getDefaultEyeHeight() : par2EntityPlayer.getEyeHeight()); + double d2 = par2EntityPlayer.prevPosZ + (par2EntityPlayer.posZ - par2EntityPlayer.prevPosZ) * (double) f; + Vec3 vec3 = par1World.getWorldVec3Pool().getVecFromPool(d0, d1, d2); + float f3 = MathHelper.cos(-f2 * 0.017453292F - (float) Math.PI); + float f4 = MathHelper.sin(-f2 * 0.017453292F - (float) Math.PI); + float f5 = -MathHelper.cos(-f1 * 0.017453292F); + float f6 = MathHelper.sin(-f1 * 0.017453292F); + float f7 = f4 * f5; + float f8 = f3 * f5; + double d3 = 5.0D; + if (par2EntityPlayer instanceof EntityPlayerMP) + { + d3 = ((EntityPlayerMP) par2EntityPlayer).theItemInWorldManager.getBlockReachDistance(); + } + Vec3 vec31 = vec3.addVector((double) f7 * d3, (double) f6 * d3, (double) f8 * d3); + return par1World.rayTraceBlocks_do_do(vec3, vec31, par3, !par3); + } } \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java index 6804e28..a85f5e4 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java @@ -7,6 +7,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; public class ItemDimensionalDoor extends BaseItemDoor { @@ -26,23 +27,8 @@ public class ItemDimensionalDoor extends BaseItemDoor } @Override - public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) + protected BaseDimDoor getDoortoItemMapping() { - if (!world.isRemote) - { - if (tryPlacingDoor(mod_pocketDim.dimensionalDoor, world, player, stack) && - !player.capabilities.isCreativeMode) - { - stack.stackSize--; - } - } - return stack; - } - - @Override - public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, - int z, int par7, float par8, float par9, float par10) - { - return tryItemUse(mod_pocketDim.dimensionalDoor, stack, player, world, x, y, z, par7, false, true); + return (BaseDimDoor) mod_pocketDim.dimensionalDoor; } } \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDimDoor.java index a39a24a..fceb2f3 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDimDoor.java @@ -7,6 +7,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; public class ItemGoldDimDoor extends BaseItemDoor { @@ -16,7 +17,6 @@ public class ItemGoldDimDoor extends BaseItemDoor // TODO Auto-generated constructor stub } - @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) @@ -27,26 +27,8 @@ public class ItemGoldDimDoor extends BaseItemDoor } @Override - public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, - int z, int par7, float par8, float par9, float par10) + protected BaseDimDoor getDoortoItemMapping() { - return tryItemUse(mod_pocketDim.goldenDimensionalDoor, stack, player, world, x, y, z, par7, false, true); + return (BaseDimDoor) mod_pocketDim.goldenDimensionalDoor; } - - @Override - public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) - { - if (!world.isRemote) - { - if (tryPlacingDoor(mod_pocketDim.goldenDimensionalDoor, world, player, stack) && - !player.capabilities.isCreativeMode) - { - stack.stackSize--; - } - } - return stack; - } - - - } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java index a7d63ec..809fc86 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java @@ -7,6 +7,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; public class ItemUnstableDoor extends BaseItemDoor { @@ -23,23 +24,8 @@ public class ItemUnstableDoor extends BaseItemDoor } @Override - public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) + protected BaseDimDoor getDoortoItemMapping() { - if (!world.isRemote) - { - if (tryPlacingDoor(mod_pocketDim.unstableDoor, world, player, stack) && - !player.capabilities.isCreativeMode) - { - stack.stackSize--; - } - } - return stack; - } - - @Override - public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, - int z, int par7, float par8, float par9, float par10) - { - return tryItemUse(mod_pocketDim.unstableDoor, stack, player, world, x, y, z, par7, false, true); + return (BaseDimDoor) mod_pocketDim.unstableDoor; } } \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java index 0309a3f..ac3f66a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java @@ -7,6 +7,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; public class ItemWarpDoor extends BaseItemDoor { @@ -26,23 +27,8 @@ public class ItemWarpDoor extends BaseItemDoor } @Override - public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) + protected BaseDimDoor getDoortoItemMapping() { - if (!world.isRemote) - { - if (tryPlacingDoor(mod_pocketDim.warpDoor, world, player, stack) && - !player.capabilities.isCreativeMode) - { - stack.stackSize--; - } - } - return stack; - } - - @Override - public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, - int z, int par7, float par8, float par9, float par10) - { - return tryItemUse(mod_pocketDim.warpDoor, stack, player, world, x, y, z, par7, false, true); + return (BaseDimDoor) mod_pocketDim.warpDoor; } } \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java b/src/main/java/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java index fb39f5b..8cef1fd 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java @@ -7,6 +7,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Deque; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -243,43 +244,58 @@ public class DDSaveHandler // Create the data directory for our dimensions // Don't catch exceptions here. If we can't create this folder, // the mod should crash to let the user know early on. + + //I still dont think that this is the best way to do this, but atleast it is better than + //risking deleting everything. I delete files afterwards that I did not modify. - String basePath = DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/data/"; - File basePathFile = new File(basePath); - Files.createParentDirs(basePathFile); - basePathFile.mkdir(); - + //get the save directory path + File saveDirectory = new File(DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/data/"); + + //create the save directory + Files.createParentDirs(saveDirectory); + saveDirectory.mkdir(); + + //create and write the blackList BlacklistProcessor blacklistReader = new BlacklistProcessor(); - writeBlacklist(blacklist, blacklistReader,basePath); + writeBlacklist(blacklist, blacklistReader,saveDirectory); FileFilter dataFileFilter = new FileFilters.RegexFileFilter("dim_-?\\d+\\.txt"); - //TODO Deal with temp files correctly - File[] dataFiles = basePathFile.listFiles(dataFileFilter); + //Take the list of all dimData files already saved in the save Directory, and map them according to ID. + File[] dataFiles = saveDirectory.listFiles(dataFileFilter); + HashMap unsavedDimData = new HashMap(); for (File dataFile : dataFiles) { - dataFile.delete(); + unsavedDimData.put(Integer.parseInt(dataFile.getName().split("[.]")[0].substring(4)), dataFile); } - - basePathFile = null; - basePath += "dim_"; - boolean succeeded = true; + + //write the dimension save data, and remove the ones we save from the mapping DimDataProcessor writer = new DimDataProcessor(); for (IPackable dimension : dimensions) { - succeeded &= writeDimension(dimension, writer, basePath); + succeeded &= writeDimension(dimension, writer, saveDirectory.getAbsolutePath()+"/dim_"); + unsavedDimData.remove(Integer.parseInt(dimension.name())); + } + + //once we have finished saving, delete the files from the save directory that where not saved + if(succeeded) + { + for (File dataFile : unsavedDimData.values()) + { + dataFile.delete(); + } } return succeeded; } - private static boolean writeBlacklist(List blacklist, BlacklistProcessor writer, String basePath) + private static boolean writeBlacklist(List blacklist, BlacklistProcessor writer, File saveDirectory) { try { - File tempFile = new File(basePath + "blacklist.tmp"); - File saveFile = new File(basePath + "blacklist.txt"); + File tempFile = new File(saveDirectory.getAbsolutePath() + "blacklist.tmp"); + File saveFile = new File(saveDirectory.getAbsolutePath() + "blacklist.txt"); writer.writeToFile(tempFile, blacklist); saveFile.delete(); tempFile.renameTo(saveFile); -- 2.39.5 From 3a292d7eac89fa9c1403b06fe22ef09d8000be5e Mon Sep 17 00:00:00 2001 From: StevenRS11 Date: Mon, 24 Mar 2014 21:09:21 -0400 Subject: [PATCH 4/7] Fixed all doors being placed as dim doors --- .../java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java index d29f322..5f7ca97 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java @@ -143,7 +143,8 @@ public abstract class BaseItemDoor extends ItemDoor } if (canPlace(world, x, y, z) && canPlace(world, x, y + 1, z) && player.canPlayerEdit(x, y, z, side, stack) - && player.canPlayerEdit(x, y + 1, z, side, stack) && stack.stackSize > 0) + && (player.canPlayerEdit(x, y + 1, z, side, stack) && stack.stackSize > 0) + &&((stack.getItem() instanceof BaseItemDoor) || PocketManager.getLink(x, y + 1, z, world) != null)) { int orientation = MathHelper.floor_double((player.rotationYaw + 180.0F) * 4.0F / 360.0F - 0.5D) & 3; placeDoorBlock(world, x, y, z, orientation, doorBlock); -- 2.39.5 From f682ba6a2b1ca1ed25e232fe92276d8ec16fc9a4 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 26 Mar 2014 02:12:53 -0400 Subject: [PATCH 5/7] Fixes for Saving Process * Switched to deleting dimension data when a dimension is removed instead of trying to figure out which dimensions were removed later * Fixed a bug with blacklist paths * Rearranged saving code slightly to avoid the potential performance impact of repeated calls to getAbsolutePath() --- .../mod_pocketDim/core/PocketManager.java | 14 ++++-- .../mod_pocketDim/saving/DDSaveHandler.java | 49 +++++-------------- 2 files changed, 23 insertions(+), 40 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 842c6c8..4d8a07a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -304,6 +304,7 @@ public class PocketManager return true; } + public static boolean deletePocket(NewDimData target, boolean deleteFolder) { // We can't delete the dimension if it's currently loaded or if it's not actually a pocket. @@ -314,7 +315,7 @@ public class PocketManager { if (deleteFolder) { - deleteDimensionFolder(target); + deleteDimensionFiles(target); } dimensionIDBlackList.add(dimension.id); deleteDimensionData(dimension.id); @@ -322,20 +323,25 @@ public class PocketManager } return false; } - private static boolean deleteDimensionFolder(NewDimData target) + + private static boolean deleteDimensionFiles(NewDimData target) { InnerDimData dimension = (InnerDimData) target; if (dimension.isPocketDimension() && DimensionManager.getWorld(dimension.id()) == null) { - File saveDirectory = new File(DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/pocketDimID" + dimension.id()); + String saveRootPath = DimensionManager.getCurrentSaveRootDirectory().getAbsolutePath(); + File saveDirectory = new File(saveRootPath + "/DimensionalDoors/pocketDimID" + dimension.id()); DeleteFolder.deleteFolder(saveDirectory); + File dataFile = new File(saveRootPath + "/DimensionalDoors/data/dim_" + dimension.id() + ".txt"); + dataFile.delete(); return true; } return false; } + private static boolean deleteDimensionData(int dimensionID) { - if(dimensionData.containsKey(dimensionID)&& DimensionManager.getWorld(dimensionID) == null) + if (dimensionData.containsKey(dimensionID) && DimensionManager.getWorld(dimensionID) == null) { NewDimData target = PocketManager.getDimensionData(dimensionID); InnerDimData dimension = (InnerDimData) target; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java b/src/main/java/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java index 8cef1fd..b995edd 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/saving/DDSaveHandler.java @@ -244,58 +244,35 @@ public class DDSaveHandler // Create the data directory for our dimensions // Don't catch exceptions here. If we can't create this folder, // the mod should crash to let the user know early on. - - //I still dont think that this is the best way to do this, but atleast it is better than - //risking deleting everything. I delete files afterwards that I did not modify. - //get the save directory path + // Get the save directory path File saveDirectory = new File(DimensionManager.getCurrentSaveRootDirectory() + "/DimensionalDoors/data/"); + String savePath = saveDirectory.getAbsolutePath(); - //create the save directory + // Create the save directory Files.createParentDirs(saveDirectory); saveDirectory.mkdir(); - //create and write the blackList - BlacklistProcessor blacklistReader = new BlacklistProcessor(); - writeBlacklist(blacklist, blacklistReader,saveDirectory); - - FileFilter dataFileFilter = new FileFilters.RegexFileFilter("dim_-?\\d+\\.txt"); - - //Take the list of all dimData files already saved in the save Directory, and map them according to ID. - File[] dataFiles = saveDirectory.listFiles(dataFileFilter); - HashMap unsavedDimData = new HashMap(); - for (File dataFile : dataFiles) - { - unsavedDimData.put(Integer.parseInt(dataFile.getName().split("[.]")[0].substring(4)), dataFile); - } + // Create and write the blackList + writeBlacklist(blacklist, savePath); + // Write the dimension save data, and remove the ones we save from the mapping boolean succeeded = true; - - //write the dimension save data, and remove the ones we save from the mapping DimDataProcessor writer = new DimDataProcessor(); for (IPackable dimension : dimensions) { - succeeded &= writeDimension(dimension, writer, saveDirectory.getAbsolutePath()+"/dim_"); - unsavedDimData.remove(Integer.parseInt(dimension.name())); - } - - //once we have finished saving, delete the files from the save directory that where not saved - if(succeeded) - { - for (File dataFile : unsavedDimData.values()) - { - dataFile.delete(); - } + succeeded &= writeDimension(dimension, writer, savePath + "/dim_"); } return succeeded; } - private static boolean writeBlacklist(List blacklist, BlacklistProcessor writer, File saveDirectory) + private static boolean writeBlacklist(List blacklist, String savePath) { try { - File tempFile = new File(saveDirectory.getAbsolutePath() + "blacklist.tmp"); - File saveFile = new File(saveDirectory.getAbsolutePath() + "blacklist.txt"); + BlacklistProcessor writer = new BlacklistProcessor(); + File tempFile = new File(savePath + "/blacklist.tmp"); + File saveFile = new File(savePath + "/blacklist.txt"); writer.writeToFile(tempFile, blacklist); saveFile.delete(); tempFile.renameTo(saveFile); @@ -306,9 +283,9 @@ public class DDSaveHandler System.err.println("Could not save blacklist. The following error occurred:"); printException(e, true); return false; - } - + } } + private static boolean writeDimension(IPackable dimension, DimDataProcessor writer, String basePath) { try -- 2.39.5 From 35c5943faf5fa4c8b7e751fd4e4565894dbbc15d Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 26 Mar 2014 03:13:07 -0400 Subject: [PATCH 6/7] Changes to EventHookContainer * Fixed comments messed up by auto-formatting * Minor formatting changes * Combined two conditions in the door-placement code into an equivalent condition --- .../mod_pocketDim/EventHookContainer.java | 53 ++++++++----------- 1 file changed, 22 insertions(+), 31 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java index 67519a1..72d1704 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -33,7 +33,7 @@ import cpw.mods.fml.relauncher.SideOnly; public class EventHookContainer { - private final DDProperties properties; + private final DDProperties properties; public EventHookContainer(DDProperties properties) { @@ -44,9 +44,8 @@ public class EventHookContainer public void onInitMapGen(InitMapGenEvent event) { // Replace the Nether fortress generator with our own only if any - // gateways would ever generate. - // This allows admins to disable our fortress overriding without - // disabling all gateways. + // gateways would ever generate. This allows admins to disable our + // fortress overriding without disabling all gateways. /* * if (properties.FortressGatewayGenerationChance > 0 && * properties.WorldRiftGenerationEnabled && event.type == @@ -88,15 +87,13 @@ public class EventHookContainer World world = event.entity.worldObj; ItemStack stack = event.entityPlayer.inventory.getCurrentItem(); - if (stack != null) + if (stack != null && stack.getItem() instanceof ItemDoor) { - if (stack.getItem() instanceof ItemDoor) + if (mod_pocketDim.itemDimensionalDoor.tryToPlaceDoor(stack, event.entityPlayer, world, + event.x, event.y, event.z, event.face)) { - if(mod_pocketDim.itemDimensionalDoor.tryToPlaceDoor(stack, event.entityPlayer, world, event.x, event.y, event.z, event.face)) - { - //cancel the event so we dont get two doors from vanilla doors - event.setCanceled(true); - } + // Cancel the event so that we don't get two doors + event.setCanceled(true); } } } @@ -105,11 +102,9 @@ public class EventHookContainer public void onWorldLoad(WorldEvent.Load event) { // We need to initialize PocketManager here because onServerAboutToStart - // fires before we can - // use DimensionManager and onServerStarting fires after the game tries - // to generate terrain. - // If a gateway tries to generate before PocketManager has initialized, - // we get a crash. + // fires before we can use DimensionManager and onServerStarting fires + // after the game tries to generate terrain. If a gateway tries to + // generate before PocketManager has initialized, we get a crash. if (!PocketManager.isLoaded()) { PocketManager.load(); @@ -131,16 +126,14 @@ public class EventHookContainer public boolean onDeathWithHighPriority(LivingDeathEvent event) { // Teleport the entity to Limbo if it's a player in a pocket dimension - // and - // if Limbo preserves player inventories. We'll check again in a - // low-priority event handler - // to give other mods a chance to save the player if Limbo does _not_ - // preserve inventories. + // and if Limbo preserves player inventories. We'll check again in a + // low-priority event handler to give other mods a chance to save the + // player if Limbo does _not_ preserve inventories. Entity entity = event.entity; - if (entity instanceof EntityPlayer && properties.LimboEnabled && entity.worldObj.provider instanceof PocketProvider - && properties.LimboReturnsInventoryEnabled) + if (properties.LimboEnabled && properties.LimboReturnsInventoryEnabled && + entity instanceof EntityPlayer && entity.worldObj.provider instanceof PocketProvider) { EntityPlayer player = (EntityPlayer) entity; mod_pocketDim.deathTracker.addUsername(player.username); @@ -155,11 +148,10 @@ public class EventHookContainer public boolean onDeathWithLowPriority(LivingDeathEvent event) { // This low-priority handler gives mods a chance to save a player from - // death before we apply - // teleporting them to Limbo _without_ preserving their inventory. We - // also check if the player - // died in a pocket dimension and record it, regardless of whether the - // player will be sent to Limbo. + // death before we apply teleporting them to Limbo _without_ preserving + // their inventory. We also check if the player died in a pocket + // dimension and record it, regardless of whether the player will be + // sent to Limbo. Entity entity = event.entity; @@ -209,9 +201,8 @@ public class EventHookContainer SoundManager sndManager = FMLClientHandler.instance().getClient().sndManager; // SenseiKiwi: I've added the following check as a quick fix for a - // reported crash. - // This needs to work without a hitch or we have to stop trying to - // replace the background music... + // reported crash. This needs to work without a hitch or we have to + // stop trying to replace the background music... if (sndManager != null && sndManager.sndSystem != null) { if (world.provider instanceof LimboProvider) -- 2.39.5 From 248ac1ecf4939585fbbaa062e6eaeae29e6b86bd Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Wed, 26 Mar 2014 03:32:17 -0400 Subject: [PATCH 7/7] Minor Change Minor mix-up with saving a change to a comment --- .../java/StevenDimDoors/mod_pocketDim/EventHookContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java index 72d1704..f241c24 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -92,7 +92,7 @@ public class EventHookContainer if (mod_pocketDim.itemDimensionalDoor.tryToPlaceDoor(stack, event.entityPlayer, world, event.x, event.y, event.z, event.face)) { - // Cancel the event so that we don't get two doors + // Cancel the event so that we don't get two doors from vanilla doors event.setCanceled(true); } } -- 2.39.5