From a1a5c0908a864727120da7df4357b3edc781be81 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 14 Jan 2014 05:47:26 -0400 Subject: [PATCH 1/8] Fixes for Rifts Fixed a bug I introduced during my previous commit that caused solo rifts to spread and rifts with neighbors not to spread. Also cleaned up the code a bit to cut back on the number of mysterious random rolls we were using and commented the code. --- .../tileentities/TileEntityRift.java | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index 5b5f14d0..442d4e1a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -36,6 +36,8 @@ public class TileEntityRift extends TileEntity private static final int MAX_ANCESTOR_LINKS = 3; private static final int ENDERMAN_SPAWNING_CHANCE = 1; private static final int MAX_ENDERMAN_SPAWNING_CHANCE = 32; + private static final int RIFT_SPREAD_CHANCE = 1; + private static final int MAX_RIFT_SPREAD_CHANCE = 256; private static Random random = new Random(); @@ -299,20 +301,13 @@ public class TileEntityRift extends TileEntity public void grow(DDProperties properties) { - if (worldObj.isRemote || hasGrownRifts || !properties.RiftSpreadEnabled || random.nextInt(5) == 0) + if (worldObj.isRemote || hasGrownRifts || !properties.RiftSpreadEnabled + || random.nextInt(MAX_RIFT_SPREAD_CHANCE) < RIFT_SPREAD_CHANCE) { return; } NewDimData dimension = PocketManager.getDimensionData(worldObj); - - if(random.nextInt(dimension.findRiftsInRange(this.worldObj, 5, xCoord, yCoord, zCoord).size()+1)<2) - { - if(random.nextInt(7)!=0) - { - return; - } - } DimLink link = dimension.getLink(xCoord, yCoord, zCoord); if (countAncestorLinks(link) > MAX_ANCESTOR_LINKS) @@ -320,8 +315,11 @@ public class TileEntityRift extends TileEntity return; } - //FIXME: This condition would prevent people from creating rooms of densely packed rifts... ~SenseiKiwi - if (updateNearestRift()) + // The probability of rifts trying to spread increases if more rifts are nearby + // Players should see rifts spread faster within clusters than at the edges of clusters + // Also, single rifts CANNOT spread. + int nearRifts = dimension.findRiftsInRange(this.worldObj, 5, xCoord, yCoord, zCoord).size(); + if (nearRifts == 0 || random.nextInt(nearRifts) == 0) { return; } @@ -343,7 +341,7 @@ public class TileEntityRift extends TileEntity { dimension.createChildLink(x, y, z, link); hasGrownRifts = true; - return; + break; } else { From 76f515e207963094d937bca61864e521831fefb1 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 14 Jan 2014 06:46:42 -0400 Subject: [PATCH 2/8] Minor Changes Tweaked spacing in files. --- .../StevenDimDoors/mod_pocketDim/schematic/Schematic.java | 1 - .../mod_pocketDim/world/gateways/GatewayBlockFilter.java | 8 +++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java index 230075ca..bc866feb 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java @@ -378,7 +378,6 @@ public class Schematic { { for (dx = 0; dx < width; dx++) { - setBlockDirectly(world, x + dx, y + dy, z + dz, blocks[index], metadata[index]); index++; } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayBlockFilter.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayBlockFilter.java index 5098f94f..ef048258 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayBlockFilter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayBlockFilter.java @@ -15,14 +15,14 @@ public class GatewayBlockFilter extends SchematicFilter { private int transientDoorID; - public GatewayBlockFilter(short dimensionalDoorID,short transientDoorID) + public GatewayBlockFilter(short dimensionalDoorID, short transientDoorID) { - super("GatewayEnteranceFinder"); + super("GatewayEntranceFinder"); this.dimensionalDoorID = dimensionalDoorID; this.entranceDoorLocation = null; this.entranceOrientation = 0; this.schematic = null; - this.transientDoorID=transientDoorID; + this.transientDoorID = transientDoorID; } public int getEntranceOrientation() { @@ -45,7 +45,6 @@ public class GatewayBlockFilter extends SchematicFilter { { int indexBelow; int indexDoubleBelow; - System.out.println(blocks[index]); if (blocks[index] == dimensionalDoorID) { indexBelow = schematic.calculateIndexBelow(index); @@ -67,7 +66,6 @@ public class GatewayBlockFilter extends SchematicFilter { } } return false; - } @Override From 1b2a119aa75a9c509137cd4884bf04605d64d9fb Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 14 Jan 2014 06:48:33 -0400 Subject: [PATCH 3/8] Fixed Placement in BaseGateway Fixed bad gateway placement in BaseGateway. Also improved code spacing a little. This doesn't fix the block ID issue yet. --- .../world/gateways/BaseGateway.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java index 358c01fb..c4a9a576 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java @@ -53,11 +53,11 @@ public abstract class BaseGateway * Now we have a new issue- we get an index array out of bounds. One of the exported *blocks* is -69. * */ - Point3D doorLocation= new Point3D(0,0,0); + Point3D doorLocation = new Point3D(0, 0, 0); int orientation = 0; try { - if(this.schematicPath!=null) + if (this.schematicPath != null) { Schematic schematic = Schematic.readFromResource(schematicPath); schematic.applyFilter(filter); @@ -65,12 +65,12 @@ public abstract class BaseGateway doorLocation = filter.getEntranceDoorLocation(); orientation = filter.getEntranceOrientation(); - schematic.copyToWorld(world, x-schematic.getWidth()+doorLocation.getX(), y-schematic.getHeight()+doorLocation.getY(), z-schematic.getLength()+doorLocation.getZ()); + schematic.copyToWorld(world, x - doorLocation.getX(), y, z - doorLocation.getZ()); //TODO debug code to easily locate the rifts - for(int c = 0; c<240; c++) + for (int c = 5; c < 240; c++) { - world.setBlock(x, y+c, z,Block.glowStone.blockID); + world.setBlock(x, y + c, z, Block.glowStone.blockID); } } } @@ -79,7 +79,7 @@ public abstract class BaseGateway e.printStackTrace(); return false; } - this.generateRandomBits(world, x,y,z); + this.generateRandomBits(world, x, y, z); DimLink link = PocketManager.getDimensionData(world).createLink(x, y + 1, z, LinkTypes.DUNGEON, orientation); PocketBuilder.generateSelectedDungeonPocket(link, mod_pocketDim.properties, this.getStartingDungeon(world.rand)); @@ -123,10 +123,9 @@ public abstract class BaseGateway { return !surfaceGateway; } + public boolean isBiomeValid(BiomeGenBase biome) { - return this.isBiomeSpecific||this.allowedBiomeNames.contains(biome.biomeName.toLowerCase()); + return this.isBiomeSpecific || this.allowedBiomeNames.contains(biome.biomeName.toLowerCase()); } - - } From 75db61e951a98fb9875860beb40adae9bb387d1e Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 14 Jan 2014 07:18:05 -0400 Subject: [PATCH 4/8] Minor Change There is no resource leak! --- .../StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index 84ff4a4a..a5adc429 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -87,7 +87,6 @@ public class DungeonSchematic extends Schematic { public static DungeonSchematic readFromFile(File schematicFile) throws FileNotFoundException, InvalidSchematicException { - // TODO: fix resource leak return readFromStream(new FileInputStream(schematicFile)); } From 5df79bb206fba9a4f836fbe93a95621ca73c2ca8 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 14 Jan 2014 07:22:51 -0400 Subject: [PATCH 5/8] Fixed ID Mapping in DungeonSchematic Fixed issue with DungeonSchematic not standardizing the block IDs for transient doors. --- .../StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index a5adc429..6fc3a52d 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -167,6 +167,7 @@ public class DungeonSchematic extends Schematic { mapping.put((short) properties.PermaFabricBlockID, STANDARD_ETERNAL_FABRIC_ID); mapping.put((short) properties.WarpDoorID, STANDARD_WARP_DOOR_ID); mapping.put((short) properties.DimensionalDoorID, STANDARD_DIMENSIONAL_DOOR_ID); + mapping.put((short) properties.TransientDoorID, STANDARD_TRANSIENT_DOOR_ID); return mapping; } From 8416d650b19d1ec4e8312fadf11a70af51543ef3 Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 14 Jan 2014 07:32:42 -0400 Subject: [PATCH 6/8] Changed ID Source in BaseGateway Changed where we get block IDs from for GatewayBlockFilter. DDProperties always has correct block IDs. It's only item IDs that are modified by Forge so that DDProperties is wrong. --- .../mod_pocketDim/world/gateways/BaseGateway.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java index c4a9a576..48308884 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java @@ -32,8 +32,7 @@ public abstract class BaseGateway public BaseGateway(DDProperties properties) { - //not using DD properties because sometimes its IDS can be wrong, but require it so we dont init too early - filter = new GatewayBlockFilter((short) mod_pocketDim.dimensionalDoor.blockID,(short) mod_pocketDim.transientDoor.blockID); + filter = new GatewayBlockFilter((short) properties.DimensionalDoorID, (short) properties.TransientDoorID); } /** From 15cfe6fc3320b6f732c4dd3a183a13f10e20632c Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Sun, 19 Jan 2014 00:20:14 -0400 Subject: [PATCH 7/8] Resolved Merge Conflicts Resolved some merge conflicts. --- .../experimental/LiquidCorium.java | 13 +++ .../experimental/LiquidCoriumBlock.java | 106 +++++++++++++++++ .../mod_pocketDim/core/DDTeleporter.java | 7 +- .../mod_pocketDim/mod_pocketDim.java | 18 ++- .../mod_pocketDim/ticking/MobMonolith.java | 44 ++++++- .../ticking/MonolithSpawner.java | 4 +- .../mod_pocketDim/world/GatewayGenerator.java | 36 +++--- .../world/gateways/BaseGateway.java | 108 ++++++++++++------ .../world/gateways/GatewayBlockFilter.java | 20 +++- .../gateways/GatewaySandstonePillars.java | 42 +++++++ .../world/gateways/GatewayTwoPillars.java | 33 +++++- .../textures/blocks/tile.Corium_flowing.png | Bin 0 -> 9931 bytes .../blocks/tile.Corium_flowing.png.mcmeta | 27 +++++ .../textures/blocks/tile.Corium_still.png | Bin 0 -> 10420 bytes .../blocks/tile.Corium_still.png.mcmeta | 51 +++++++++ .../gateways/sandstonePillars.schematic | Bin 0 -> 365 bytes .../schematics/gateways/twoPillars.schematic | Bin 244 -> 268 bytes 17 files changed, 440 insertions(+), 69 deletions(-) create mode 100644 src/main/java/StevenDimDoors/experimental/LiquidCorium.java create mode 100644 src/main/java/StevenDimDoors/experimental/LiquidCoriumBlock.java create mode 100644 src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewaySandstonePillars.java create mode 100644 src/main/resources/assets/dimdoors/textures/blocks/tile.Corium_flowing.png create mode 100644 src/main/resources/assets/dimdoors/textures/blocks/tile.Corium_flowing.png.mcmeta create mode 100644 src/main/resources/assets/dimdoors/textures/blocks/tile.Corium_still.png create mode 100644 src/main/resources/assets/dimdoors/textures/blocks/tile.Corium_still.png.mcmeta create mode 100644 src/main/resources/schematics/gateways/sandstonePillars.schematic diff --git a/src/main/java/StevenDimDoors/experimental/LiquidCorium.java b/src/main/java/StevenDimDoors/experimental/LiquidCorium.java new file mode 100644 index 00000000..955765b5 --- /dev/null +++ b/src/main/java/StevenDimDoors/experimental/LiquidCorium.java @@ -0,0 +1,13 @@ +package StevenDimDoors.experimental; + +import net.minecraftforge.fluids.Fluid; + +public class LiquidCorium extends Fluid +{ + + public LiquidCorium(String fluidName) + { + super(fluidName); + } + +} diff --git a/src/main/java/StevenDimDoors/experimental/LiquidCoriumBlock.java b/src/main/java/StevenDimDoors/experimental/LiquidCoriumBlock.java new file mode 100644 index 00000000..4ea1c124 --- /dev/null +++ b/src/main/java/StevenDimDoors/experimental/LiquidCoriumBlock.java @@ -0,0 +1,106 @@ +package StevenDimDoors.experimental; + +import java.util.Random; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +import StevenDimDoors.mod_pocketDim.Point3D; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Icon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.fluids.BlockFluidBase; +import net.minecraftforge.fluids.BlockFluidFinite; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.oredict.OreDictionary; + +public class LiquidCoriumBlock extends BlockFluidFinite +{ + private Icon iconFlowing; + private Icon iconStill; + + public static Point3D[] spreadPoints= new Point3D[4]; + public LiquidCoriumBlock(int id, Fluid fluid, Material material) + { + super(id, fluid, material); + this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); + } + + public void onBlockPlacedBy(World par1World, int par2, int par3, int par4, EntityLivingBase par5EntityLivingBase, ItemStack par6ItemStack) + { + par1World.setBlock(par2, par3, par4, this.blockID,15,2); + } + + @Override + public void updateTick(World world, int x, int y, int z, Random rand) + { + boolean didChange=false; + int fluid = this.getQuantaValue(world, x, y, z); + int blockBeneath = world.getBlockId(x, y-1,z); + + if(!(blockBeneath==0||blockBeneath==this.blockID)) + { + for(int xCount=-1;xCount<2;xCount++) + { + for(int yCount=-1;yCount<1;yCount++) + { + for(int zCount=-1;zCount<2;zCount++) + { + int id= world.getBlockId(x+xCount, y+yCount, z+zCount); + if(!(id ==0||id==this.blockID||id==Block.bedrock.blockID)&&!(Math.abs(zCount)+Math.abs(yCount)+Math.abs(xCount)>1)) + { + Block block =Block.blocksList[id]; + if(block.getUnlocalizedName().contains("ore")) + { + world.setBlock(x+xCount, y+yCount, z+zCount,this.blockID,6,2); + } + if(fluid>block.blockHardness*2&&yCount==0&&rand.nextInt(3)==0) + { + didChange=true;; + world.setBlock(x+xCount, y+yCount, z+zCount,0); + } + else if(fluid>block.blockHardness*2+1&&yCount==-1&&!didChange&&rand.nextBoolean()) + { + world.setBlock(x+xCount, y+yCount, z+zCount, 0); + } + + + } + } + } + } + } + + if((fluid==1)&&blockBeneath!=this.blockID&&blockBeneath!=Block.bedrock.blockID) + { + world.setBlockToAir(x, y, z); + world.setBlock(x, y-1, z,Block.bedrock.blockID); + } + super.updateTick(world, x, y, z, rand); + + } + + @SideOnly(Side.CLIENT) + @Override + public void registerIcons(IconRegister ir) + { + + iconStill = ir.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName()+"_still"); + iconFlowing = ir.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName()+"_flowing"); + } + @Override + public Icon getIcon(int side, int meta) + { + return side <= 1 ? iconStill : iconFlowing; + } + + +} diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index b522e9ac..95e61ee2 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -274,8 +274,6 @@ public class DDTeleporter { throw new IllegalArgumentException("destination cannot be null."); } - - //This beautiful teleport method is based off of xCompWiz's teleport function. WorldServer oldWorld = (WorldServer) entity.worldObj; @@ -372,6 +370,10 @@ public class DDTeleporter NBTTagCompound entityNBT = new NBTTagCompound(); entity.isDead = false; entity.writeMountToNBT(entityNBT); + if(entityNBT.hasNoTags()) + { + return entity; + } entity.isDead = true; entity = EntityList.createEntityFromNBT(entityNBT, newWorld); @@ -411,6 +413,7 @@ public class DDTeleporter // Let's try doing this down here in case this is what's killing NEI. GameRegistry.onPlayerChangedDimension((EntityPlayer)entity); + } DDTeleporter.placeInPortal(entity, newWorld, destination, properties, checkOrientation); return entity; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 5f4fe93a..f8770b57 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -1,5 +1,7 @@ package StevenDimDoors.mod_pocketDim; +import StevenDimDoors.experimental.LiquidCorium; +import StevenDimDoors.experimental.LiquidCoriumBlock; import StevenDimDoors.mod_pocketDim.blocks.BlockDimWall; import StevenDimDoors.mod_pocketDim.blocks.BlockDimWallPerm; import StevenDimDoors.mod_pocketDim.blocks.BlockDoorGold; @@ -76,6 +78,7 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityEggInfo; import net.minecraft.entity.EntityList; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; import net.minecraft.item.EnumToolMaterial; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -84,6 +87,8 @@ import net.minecraft.world.biome.BiomeGenBase; import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; @Mod(modid = mod_pocketDim.modid, name = "Dimensional Doors", version = mod_pocketDim.version) @@ -138,6 +143,9 @@ public class mod_pocketDim public static MonolithSpawner spawner; //Added this field temporarily. Will be refactored out later. public static GatewayGenerator riftGen; public static PlayerTracker tracker; + + public static Block coriumBlock; + public static Fluid coriumFluid; public static CreativeTabs dimDoorsCreativeTab = new CreativeTabs("dimDoorsCreativeTab") { @@ -232,7 +240,7 @@ public class mod_pocketDim DimensionManager.registerProviderType(properties.PocketProviderID, PocketProvider.class, false); DimensionManager.registerProviderType(properties.LimboProviderID, LimboProvider.class, false); DimensionManager.registerDimension(properties.LimboDimensionID, properties.LimboProviderID); - + LanguageRegistry.addName(goldDoor, "Golden Door"); LanguageRegistry.addName(goldDimDoor, "Golden Dimensional Door"); LanguageRegistry.addName(transientDoor , "transientDoor"); @@ -282,8 +290,16 @@ public class mod_pocketDim DungeonHelper.initialize(); this.riftGen.initGateways(); + coriumFluid = new LiquidCorium("Corium").setDensity(1000).setTemperature(3473).setDensity(9400).setLuminosity(6).setRarity(EnumRarity.rare); + coriumBlock = new LiquidCoriumBlock(900, coriumFluid, Material.lava).setQuantaPerBlock(16).setTickRate(20).setTickRandomly(true).setUnlocalizedName("Corium"); + FluidRegistry.registerFluid(coriumFluid); + GameRegistry.registerBlock(coriumBlock,"Corium"); + LanguageRegistry.addName(coriumBlock, "Corium"); + + + // Register loot chests DDLoot.registerInfo(properties); proxy.loadTextures(); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java index 1cbb356e..74b3cc91 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java @@ -2,6 +2,8 @@ package StevenDimDoors.mod_pocketDim.ticking; import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; import net.minecraft.entity.DataWatcher; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityFlying; @@ -29,7 +31,7 @@ public class MobMonolith extends EntityFlying implements IMob float soundTime = 0; int aggro = 0; byte textureState = 0; - + float entityCollisionReduction = 100; float scaleFactor = 0; int aggroMax; int destX = 0; // unused fields? @@ -99,6 +101,39 @@ public class MobMonolith extends EntityFlying implements IMob super.entityInit(); this.dataWatcher.addObject(16, Byte.valueOf((byte)0)); } + + public boolean isClipping() + { + + int i = MathHelper.floor_double(this.boundingBox.minX); + int j = MathHelper.floor_double(this.boundingBox.maxX + 1.0D); + int k = MathHelper.floor_double(this.boundingBox.minY); + int l = MathHelper.floor_double(this.boundingBox.maxY + 1.0D); + int i1 = MathHelper.floor_double(this.boundingBox.minZ); + int j1 = MathHelper.floor_double(this.boundingBox.maxZ + 1.0D); + + for (int k1 = i; k1 < j; ++k1) + { + for (int l1 = k; l1 < l; ++l1) + { + for (int i2 = i1; i2 < j1; ++i2) + { + if(!this.worldObj.isAirBlock(k1, l1, i2)) + { + return true; + } + } + } + } + + + return false; + } + @Override + public boolean isEntityAlive() + { + return false; + } @Override public void onEntityUpdate() @@ -107,12 +142,11 @@ public class MobMonolith extends EntityFlying implements IMob { this.setDead(); } - + super.onEntityUpdate(); - - if (this.isEntityAlive() && this.isEntityInsideOpaqueBlock()) + if(this.isClipping()) { - this.setDead(); + this.moveEntity(0, .1, 0); } EntityPlayer entityPlayer = this.worldObj.getClosestPlayerToEntity(this, 30); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MonolithSpawner.java b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MonolithSpawner.java index fac59e45..8b58f374 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MonolithSpawner.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MonolithSpawner.java @@ -129,8 +129,8 @@ public class MonolithSpawner implements IRegularTickReceiver { } while (!pocket.isAirBlock(x,jumpHeight+6 , z)&&jumpSanity<20); - Entity monolith = new MobMonolith(pocket); - monolith.setLocationAndAngles(x, jumpHeight, z, 1, 1); + MobMonolith monolith = new MobMonolith(pocket); + monolith.setLocationAndAngles(x, jumpHeight-(5-monolith.getRenderSizeModifier()*5), z, 1, 1); pocket.spawnEntityInWorld(monolith); didSpawn = true; } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java index 75a65dbe..8d7f3037 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/GatewayGenerator.java @@ -16,6 +16,7 @@ import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.items.ItemDimensionalDoor; import StevenDimDoors.mod_pocketDim.world.gateways.BaseGateway; +import StevenDimDoors.mod_pocketDim.world.gateways.GatewaySandstonePillars; import StevenDimDoors.mod_pocketDim.world.gateways.GatewayTwoPillars; import cpw.mods.fml.common.IWorldGenerator; @@ -36,6 +37,7 @@ public class GatewayGenerator implements IWorldGenerator private static final int END_DIMENSION_ID = 1; private static ArrayList gateways; + private static BaseGateway defaultGateway; private final DDProperties properties; @@ -48,7 +50,11 @@ public class GatewayGenerator implements IWorldGenerator public void initGateways() { gateways=new ArrayList(); - gateways.add(new GatewayTwoPillars(this.properties)); + this.defaultGateway=new GatewayTwoPillars(this.properties); + + //add gateways here + gateways.add(new GatewaySandstonePillars(this.properties)); + } @Override @@ -146,25 +152,23 @@ public class GatewayGenerator implements IWorldGenerator //Build the gateway if we found a valid location if (valid) { - this.gateways.get(random.nextInt(gateways.size())).generate(world, x, y, z); - /** - //Create a partial link to a dungeon. - dimension = PocketManager.getDimensionData(world); - link = dimension.createLink(x, y + 1, z, LinkTypes.DUNGEON, 0); - - //If the current dimension isn't Limbo, build a Rift Gateway out of Stone Bricks - if (dimension.id() != properties.LimboDimensionID) + //TODO I feel like this is slow and should be optimized. We are linear time with total # of generation restrictions + //Create an array and copy valid gateways into it + ArrayList validGateways = new ArrayList(); + for(BaseGateway gateway:gateways) { - createStoneGateway(world, x, y, z, random); + if(gateway.isLocationValid(world, x, y, z, world.getBiomeGenForCoords(x, z))) + { + validGateways.add(gateway); + } } - else + //Add default gateway if we where unable to find a suitable gateway + if(validGateways.isEmpty()) { - createLimboGateway(world, x, y, z, properties.LimboBlockID); + validGateways.add(this.defaultGateway); } - - //Place the shiny transient door into a dungeon - ItemDimensionalDoor.placeDoorBlock(world, x, y, z, 0, mod_pocketDim.transientDoor); - **/ + //randomly select a gateway from the pool of viable gateways + validGateways.get(random.nextInt(validGateways.size())).generate(world, x, y, z); } } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java index 48308884..9f58bc87 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java @@ -21,18 +21,41 @@ import net.minecraft.world.biome.BiomeGenBase; public abstract class BaseGateway { + //This pack is what the dungeon initially generates into from this gateway. protected DungeonPack startingPack; + + /**Flag that determines if this gateway is tied to a specific biome. + *For compatabilities sake, we are just using string comparison to check. + **/ protected boolean isBiomeSpecific; - protected ArrayList allowedBiomeNames; + + /** + * List of biome names that we check against. Is by default a whitelist, but the isBiomeValid method + * can be overriden for specific gateways. For example, any biome containing 'forest' would be valid if we added 'forest', + * even from other mods. + */ + protected ArrayList biomeNames = new ArrayList(); + + /** + * List containing all the .schematics attached to this gateway. Selection is random by default, + * but can be overriden for specific gateways in getSchematicToBuild + */ + protected ArrayList schematicPaths= new ArrayList(); + + //TODO not yet implemented protected boolean surfaceGateway; + + //TODO not yet implemented protected int generationWeight; - protected String schematicPath; + + //Used to find the doorway for the .schematic protected GatewayBlockFilter filter; public BaseGateway(DDProperties properties) { - filter = new GatewayBlockFilter((short) properties.DimensionalDoorID, (short) properties.TransientDoorID); + filter = new GatewayBlockFilter((short) properties.DimensionalDoorID, (short) properties.TransientDoorID, + (short) properties.WarpDoorID); } /** @@ -44,40 +67,24 @@ public abstract class BaseGateway */ public boolean generate(World world, int x, int y, int z) { - /** - * We have two cases here. The gateway may or may not specify a schematic to load from. If it does, we need to line up the door in the schematic with the given rift. - * I tried doing this by taking the difference between the selected coords for the door, and the position of the door relative to the bounds of the .schematic, - * but it doesnt work. It seems like it should, though. Odd. - * - * Now we have a new issue- we get an index array out of bounds. One of the exported *blocks* is -69. - * - */ - Point3D doorLocation = new Point3D(0, 0, 0); int orientation = 0; - try + + if (this.hasSchematic()) { - if (this.schematicPath != null) - { - Schematic schematic = Schematic.readFromResource(schematicPath); - schematic.applyFilter(filter); - - doorLocation = filter.getEntranceDoorLocation(); - orientation = filter.getEntranceOrientation(); - - schematic.copyToWorld(world, x - doorLocation.getX(), y, z - doorLocation.getZ()); - - //TODO debug code to easily locate the rifts - for (int c = 5; c < 240; c++) - { - world.setBlock(x, y + c, z, Block.glowStone.blockID); - } - } - } - catch (Exception e) - { - e.printStackTrace(); - return false; + Schematic schematic = this.getSchematicToBuild(world, x, y, z); + + schematic.applyFilter(filter); + Point3D doorLocation = filter.getEntranceDoorLocation(); + orientation = filter.getEntranceOrientation(); + + // I suspect that the location used below is wrong. Gateways should be placed vertically based on + // the Y position of the surface where they belong. I'm pretty sure including doorLocation.getY() + // messes up the calculation. ~SenseiKiwi + + //schematic.copyToWorld(world, x - doorLocation.getX(), y, z - doorLocation.getZ()); + schematic.copyToWorld(world, x - doorLocation.getX(), y + 1 - doorLocation.getY(), z - doorLocation.getZ()); } + this.generateRandomBits(world, x, y, z); DimLink link = PocketManager.getDimensionData(world).createLink(x, y + 1, z, LinkTypes.DUNGEON, orientation); @@ -86,6 +93,29 @@ public abstract class BaseGateway return true; } + /** + * Gets a .schematic to generate for this gateway + * @param world + * @param x + * @param y + * @param z + * @return + */ + public Schematic getSchematicToBuild(World world, int x, int y, int z) + { + //TODO- refine selection criteria here, this is the default case + try + { + return Schematic.readFromResource(schematicPaths.get(world.rand.nextInt(schematicPaths.size()))); + } + catch (Exception e) + { + e.printStackTrace(); + System.err.println("Could not load schematic for gateway"); + return null; + } + } + /** * Use this function to generate randomized bits of the structure. * @param world @@ -115,7 +145,8 @@ public abstract class BaseGateway */ public boolean isLocationValid(World world, int x, int y, int z, BiomeGenBase biome) { - return false; + //TODO- refine condition here as warranted + return this.isBiomeValid(biome); } public boolean shouldGenUnderground() @@ -125,6 +156,11 @@ public abstract class BaseGateway public boolean isBiomeValid(BiomeGenBase biome) { - return this.isBiomeSpecific || this.allowedBiomeNames.contains(biome.biomeName.toLowerCase()); + return !this.isBiomeSpecific || this.biomeNames.contains(biome.biomeName.toLowerCase()); + } + + public boolean hasSchematic() + { + return this.schematicPaths != null && !this.schematicPaths.isEmpty(); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayBlockFilter.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayBlockFilter.java index ef048258..97e07e6c 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayBlockFilter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayBlockFilter.java @@ -9,20 +9,22 @@ import StevenDimDoors.mod_pocketDim.schematic.SchematicFilter; public class GatewayBlockFilter extends SchematicFilter { private short dimensionalDoorID; + private int transientDoorID; + private int warpDoorID; private int entranceOrientation; private Schematic schematic; private Point3D entranceDoorLocation; - private int transientDoorID; - - public GatewayBlockFilter(short dimensionalDoorID, short transientDoorID) + + public GatewayBlockFilter(short dimensionalDoorID, short transientDoorID, short warpDoorID) { super("GatewayEntranceFinder"); - this.dimensionalDoorID = dimensionalDoorID; this.entranceDoorLocation = null; this.entranceOrientation = 0; this.schematic = null; + this.dimensionalDoorID = dimensionalDoorID; this.transientDoorID = transientDoorID; + this.warpDoorID = warpDoorID; } public int getEntranceOrientation() { @@ -65,6 +67,16 @@ public class GatewayBlockFilter extends SchematicFilter { return true; } } + if (blocks[index] == warpDoorID) + { + indexBelow = schematic.calculateIndexBelow(index); + if (indexBelow >= 0 && blocks[indexBelow] == warpDoorID) + { + entranceDoorLocation = schematic.calculatePoint(index); + entranceOrientation = (metadata[indexBelow] & 3); + return true; + } + } return false; } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewaySandstonePillars.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewaySandstonePillars.java new file mode 100644 index 00000000..e1249081 --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewaySandstonePillars.java @@ -0,0 +1,42 @@ +package StevenDimDoors.mod_pocketDim.world.gateways; + +import java.util.ArrayList; +import java.util.Random; + +import StevenDimDoors.mod_pocketDim.DDProperties; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; +import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; +import net.minecraft.block.Block; +import net.minecraft.world.World; +import net.minecraft.world.chunk.IChunkProvider; + +public class GatewaySandstonePillars extends BaseGateway +{ + + private static final int GATEWAY_RADIUS = 4; + + public GatewaySandstonePillars(DDProperties properties) + { + super(properties); + super.startingPack=DungeonHelper.instance().getDungeonPack("RUINS"); + super.isBiomeSpecific=true; + super.biomeNames.add("desert"); + surfaceGateway=true; + generationWeight = 0; + schematicPaths.add("/schematics/gateways/sandstonePillars.schematic"); + + } + @Override + public boolean generate(World world, int x, int y, int z) + { + //simple to transform the generation location here. + //Do you think this is the best way to do this? + return super.generate(world, x, y+2, z); + } + @Override + public void generateRandomBits(World world, int x, int y, int z) + { + } + +} diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayTwoPillars.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayTwoPillars.java index eda1b8e0..64448986 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayTwoPillars.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayTwoPillars.java @@ -6,28 +6,55 @@ import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; +import net.minecraft.block.Block; import net.minecraft.world.World; public class GatewayTwoPillars extends BaseGateway { - private GatewayBlockFilter filter; + private static final int GATEWAY_RADIUS = 4; public GatewayTwoPillars(DDProperties properties) { super(properties); super.startingPack=DungeonHelper.instance().getDungeonPack("RUINS"); super.isBiomeSpecific=false; - super.allowedBiomeNames=null; + super.biomeNames=null; surfaceGateway=true; generationWeight = 0; - schematicPath="/schematics/gateways/twoPillars.schematic"; + schematicPaths.add("/schematics/gateways/twoPillars.schematic"); } @Override void generateRandomBits(World world, int x, int y, int z) { + final int blockID = Block.stoneBrick.blockID; + //Replace some of the ground around the gateway with bricks + for (int xc = -GATEWAY_RADIUS; xc <= GATEWAY_RADIUS; xc++) + { + for (int zc= -GATEWAY_RADIUS; zc <= GATEWAY_RADIUS; zc++) + { + //Check that the block is supported by an opaque block. + //This prevents us from building over a cliff, on the peak of a mountain, + //or the surface of the ocean or a frozen lake. + if (world.isBlockOpaqueCube(x + xc, y - 2, z + zc)) + { + //Randomly choose whether to place bricks or not. The math is designed so that the + //chances of placing a block decrease as we get farther from the gateway's center. + if (Math.abs(xc) + Math.abs(zc) < world.rand.nextInt(2) + 3) + { + //Place Stone Bricks + world.setBlock(x + xc, y - 1, z + zc, blockID, 0, 3); + } + else if (Math.abs(xc) + Math.abs(zc) < world.rand.nextInt(3) + 3) + { + //Place Cracked Stone Bricks + world.setBlock(x + xc, y - 1, z + zc, blockID, 2, 3); + } + } + } + } } } diff --git a/src/main/resources/assets/dimdoors/textures/blocks/tile.Corium_flowing.png b/src/main/resources/assets/dimdoors/textures/blocks/tile.Corium_flowing.png new file mode 100644 index 0000000000000000000000000000000000000000..af07f91d2c25b15584f13e9173988cc5d3017a4c GIT binary patch literal 9931 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 VzBT7zh!cl^j)virFR&LO{|D{T2crN0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/dimdoors/textures/blocks/tile.Corium_still.png.mcmeta b/src/main/resources/assets/dimdoors/textures/blocks/tile.Corium_still.png.mcmeta new file mode 100644 index 00000000..2b289375 --- /dev/null +++ b/src/main/resources/assets/dimdoors/textures/blocks/tile.Corium_still.png.mcmeta @@ -0,0 +1,51 @@ +{ + "animation": + { + "frametime": 3, + "frames": + [ + +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +18, +17, +16, +15, +14, +13, +12, +11, +10, +9, +8, +7, +6, +5, +4, +3, +2, +1 + + ] + } +} + + diff --git a/src/main/resources/schematics/gateways/sandstonePillars.schematic b/src/main/resources/schematics/gateways/sandstonePillars.schematic new file mode 100644 index 0000000000000000000000000000000000000000..30315b5a299f51d6ae0464ab1039a95e56e95199 GIT binary patch literal 365 zcmV-z0h0b7iwFP!000000KHSePQx$^brQO^8yw)&@8A!{I)Ts-NFZ^J)@ZfXB~u%u zjnjUHui)o!x^^mEDI5StcHHOp5+_lI5I)XRwUQR+KAgnTN&t2X0K9hYoHG|br$Pu; zmJi&PY!7hQ%P24*DwLF+vZm2DbG#1xJ6X^#W0kkc9*rYe7q?Z09!dzoR9m#DijopQ zcqgsOQDy~r<7}PE5Kf;kQ#EbqnhAho0_O*O8{;ZACTDP#%HmpSt&#_cIS3e;9F?~8 zf<{Amvp!L#8?@Ba1s3s(UMQm{sYE?Py(IM1td+jcCz&Z!LQAk$w(1$;gL6 zeT?#Fi)xQx=Zq4UQmE4kZEzbYmG(xY$gSeSu7P&Tn&uSmQ78U4vP&9$vM!5S^O1c3 LmTY9l&jbJfIB}xP literal 0 HcmV?d00001 diff --git a/src/main/resources/schematics/gateways/twoPillars.schematic b/src/main/resources/schematics/gateways/twoPillars.schematic index bef07047f9190e0c3f91866df73a3f0edd4435da..75f538db2f88cdd17c5cd760d08ea224b9e076d6 100644 GIT binary patch literal 268 zcmV+n0rUPJiwFP!000000KHMmPQx$|9H-5zlmmPKU(!oyDmWB@1QKUAUd5}Xc9a;Y z<=6N*HYyD*>X|+4%&vFGBYT4UwY0R=fy)%*LI(|ChKmuMm)Qv){pK9m(ghAoojQ!= zPdZS`y6zCq>&EIF(>Jc^I5z3EGem4~GxYZbZwv2Rg=?$32Xc!p96mGdIK3qlKEv#m@Vz-g*)Hmdw+ePg=G9sZq`$fUMpc35mh<`Mp{+Ngc z6A_XXxhh!1De}27_q8uKot)jBym)$m=InoxN8-u`j3dPFY(!#|A{q8)SYv$*;eAN{ S!VkY#4*473(Z%sB0ssJ=#DKK` literal 244 zcmVENDG9_hPd3xUc1WnU z!|1KS=8XsX#nwU Date: Sun, 19 Jan 2014 01:51:21 -0400 Subject: [PATCH 8/8] Resolved Merge Conflicts Again ... --- .../mod_pocketDim/world/gateways/BaseGateway.java | 2 +- .../mod_pocketDim/world/gateways/GatewayBlockFilter.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java index 9f58bc87..58f6da7c 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/BaseGateway.java @@ -158,7 +158,7 @@ public abstract class BaseGateway { return !this.isBiomeSpecific || this.biomeNames.contains(biome.biomeName.toLowerCase()); } - + public boolean hasSchematic() { return this.schematicPaths != null && !this.schematicPaths.isEmpty(); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayBlockFilter.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayBlockFilter.java index 97e07e6c..ed66c611 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayBlockFilter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayBlockFilter.java @@ -15,7 +15,6 @@ public class GatewayBlockFilter extends SchematicFilter { private Schematic schematic; private Point3D entranceDoorLocation; - public GatewayBlockFilter(short dimensionalDoorID, short transientDoorID, short warpDoorID) { super("GatewayEntranceFinder");