Paths are more configurable
This commit is contained in:
parent
e92b83b627
commit
5ba77eaedf
|
@ -15,6 +15,10 @@ public class DemonVillagePath
|
||||||
public int zi;
|
public int zi;
|
||||||
public ForgeDirection dir;
|
public ForgeDirection dir;
|
||||||
public int length;
|
public int length;
|
||||||
|
|
||||||
|
public boolean canGoDown = true;
|
||||||
|
public boolean tunnelIfObstructed = true;
|
||||||
|
public boolean createBridgeInAirIfObstructed = false;
|
||||||
|
|
||||||
public DemonVillagePath(int xi, int yi, int zi, ForgeDirection dir, int length)
|
public DemonVillagePath(int xi, int yi, int zi, ForgeDirection dir, int length)
|
||||||
{
|
{
|
||||||
|
@ -25,22 +29,54 @@ public class DemonVillagePath
|
||||||
this.length = length;
|
this.length = length;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Int3 constructFullPath(TEDemonPortal portal, World world, int clearance)
|
public Int3AndBool constructFullPath(TEDemonPortal portal, World world, int clearance)
|
||||||
{
|
{
|
||||||
int xPos = this.xi;
|
int xPos = this.xi;
|
||||||
int yPos = this.yi;
|
int yPos = this.yi;
|
||||||
int zPos = this.zi;
|
int zPos = this.zi;
|
||||||
int rad = this.getRoadRadius();
|
int rad = this.getRoadRadius();
|
||||||
|
int value = 0;
|
||||||
|
|
||||||
|
int finalYPos = this.constructPartialPath(portal, world, clearance, xPos - rad * dir.offsetX, yPos, zPos - rad * dir.offsetZ, dir, length + rad, false);
|
||||||
|
|
||||||
for (int i = -rad; i <= rad; i++)
|
for (int i = -rad; i <= rad; i++)
|
||||||
{
|
{
|
||||||
this.constructPartialPath(portal, world, clearance, xPos - rad * dir.offsetX + i * dir.offsetZ, yPos, zPos - rad * dir.offsetZ + i * dir.offsetX, dir, length + 2 * rad);
|
value = Math.max(this.constructPartialPath(portal, world, clearance, xPos - rad * dir.offsetX + i * dir.offsetZ, yPos, zPos - rad * dir.offsetZ + i * dir.offsetX, dir, length + 2 * rad, true), value);
|
||||||
|
System.out.println("" + (length + 2 * rad) + ", " + value + "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Int3 position = new Int3(xPos, finalYPos, zPos);
|
||||||
|
|
||||||
return this.getFinalLocation(world, clearance);
|
boolean bool = value >= length + 2 * rad;
|
||||||
|
|
||||||
|
return new Int3AndBool(position, bool);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Int3AndBool
|
||||||
|
{
|
||||||
|
public Int3 coords;
|
||||||
|
public boolean bool;
|
||||||
|
public Int3AndBool(Int3 int3, boolean bool)
|
||||||
|
{
|
||||||
|
this.coords = int3;
|
||||||
|
this.bool = bool;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void constructPartialPath(TEDemonPortal portal, World world, int clearance, int xi, int yi, int zi, ForgeDirection dir, int length)
|
/**
|
||||||
|
*
|
||||||
|
* @param portal
|
||||||
|
* @param world
|
||||||
|
* @param clearance
|
||||||
|
* @param xi
|
||||||
|
* @param yi
|
||||||
|
* @param zi
|
||||||
|
* @param dir
|
||||||
|
* @param length
|
||||||
|
* @param doConstruct
|
||||||
|
* @return length if doConstruct, yPos if !doConstruct
|
||||||
|
*/
|
||||||
|
public int constructPartialPath(TEDemonPortal portal, World world, int clearance, int xi, int yi, int zi, ForgeDirection dir, int length, boolean doConstruct)
|
||||||
{
|
{
|
||||||
int xPos = xi;
|
int xPos = xi;
|
||||||
int yPos = yi;
|
int yPos = yi;
|
||||||
|
@ -51,6 +87,8 @@ public class DemonVillagePath
|
||||||
int xOffset = i * dir.offsetX;
|
int xOffset = i * dir.offsetX;
|
||||||
int zOffset = i * dir.offsetZ;
|
int zOffset = i * dir.offsetZ;
|
||||||
|
|
||||||
|
boolean completed = false;
|
||||||
|
|
||||||
for (int yOffset = 0; yOffset <= clearance; yOffset++)
|
for (int yOffset = 0; yOffset <= clearance; yOffset++)
|
||||||
{
|
{
|
||||||
int sign = 1;
|
int sign = 1;
|
||||||
|
@ -60,10 +98,14 @@ public class DemonVillagePath
|
||||||
|
|
||||||
if (!block1.isReplaceable(world, xPos + xOffset, yPos + sign * yOffset, zPos + zOffset) && this.isBlockReplaceable(block1) && highBlock1.isReplaceable(world, xPos + xOffset, yPos + sign * yOffset + 1, zPos + zOffset))
|
if (!block1.isReplaceable(world, xPos + xOffset, yPos + sign * yOffset, zPos + zOffset) && this.isBlockReplaceable(block1) && highBlock1.isReplaceable(world, xPos + xOffset, yPos + sign * yOffset + 1, zPos + zOffset))
|
||||||
{
|
{
|
||||||
world.setBlock(xPos + xOffset, yPos + sign * yOffset, zPos + zOffset, portal.getRoadBlock(), portal.getRoadMeta(), 3);
|
if(doConstruct)
|
||||||
|
{
|
||||||
|
world.setBlock(xPos + xOffset, yPos + sign * yOffset, zPos + zOffset, portal.getRoadBlock(), portal.getRoadMeta(), 3);
|
||||||
|
}
|
||||||
yPos += sign * yOffset;
|
yPos += sign * yOffset;
|
||||||
|
completed = true;
|
||||||
break;
|
break;
|
||||||
} else
|
} else if(canGoDown)
|
||||||
{
|
{
|
||||||
sign = -1;
|
sign = -1;
|
||||||
Block block2 = world.getBlock(xPos + xOffset, yPos + sign * yOffset, zPos + zOffset);
|
Block block2 = world.getBlock(xPos + xOffset, yPos + sign * yOffset, zPos + zOffset);
|
||||||
|
@ -71,13 +113,66 @@ public class DemonVillagePath
|
||||||
|
|
||||||
if (!block2.isReplaceable(world, xPos + xOffset, yPos + sign * yOffset, zPos + zOffset) && this.isBlockReplaceable(block1) && highBlock2.isReplaceable(world, xPos + xOffset, yPos + sign * yOffset + 1, zPos + zOffset))
|
if (!block2.isReplaceable(world, xPos + xOffset, yPos + sign * yOffset, zPos + zOffset) && this.isBlockReplaceable(block1) && highBlock2.isReplaceable(world, xPos + xOffset, yPos + sign * yOffset + 1, zPos + zOffset))
|
||||||
{
|
{
|
||||||
world.setBlock(xPos + xOffset, yPos + sign * yOffset, zPos + zOffset, portal.getRoadBlock(), portal.getRoadMeta(), 3);
|
if(doConstruct)
|
||||||
|
{
|
||||||
|
world.setBlock(xPos + xOffset, yPos + sign * yOffset, zPos + zOffset, portal.getRoadBlock(), portal.getRoadMeta(), 3);
|
||||||
|
}
|
||||||
yPos += sign * yOffset;
|
yPos += sign * yOffset;
|
||||||
|
completed = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!completed)
|
||||||
|
{
|
||||||
|
boolean returnAmount = true;
|
||||||
|
if(createBridgeInAirIfObstructed)
|
||||||
|
{
|
||||||
|
Block block1 = world.getBlock(xPos + xOffset, yPos, zPos + zOffset);
|
||||||
|
|
||||||
|
if (block1.isReplaceable(world, xPos + xOffset, yPos, zPos + zOffset) || !this.isBlockReplaceable(block1))
|
||||||
|
{
|
||||||
|
returnAmount = false;
|
||||||
|
|
||||||
|
if(doConstruct)
|
||||||
|
{
|
||||||
|
world.setBlock(xPos + xOffset, yPos, zPos + zOffset, portal.getRoadBlock(), portal.getRoadMeta(), 3);
|
||||||
|
}
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
returnAmount = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}else if(this.tunnelIfObstructed)
|
||||||
|
{
|
||||||
|
Block block1 = world.getBlock(xPos + xOffset, yPos, zPos + zOffset);
|
||||||
|
|
||||||
|
if (!block1.isReplaceable(world, xPos + xOffset, yPos, zPos + zOffset) || this.isBlockReplaceable(block1))
|
||||||
|
{
|
||||||
|
returnAmount = false;
|
||||||
|
|
||||||
|
if(doConstruct)
|
||||||
|
{
|
||||||
|
world.setBlock(xPos + xOffset, yPos, zPos + zOffset, portal.getRoadBlock(), portal.getRoadMeta(), 3);
|
||||||
|
world.setBlockToAir(xPos + xOffset, yPos + 1, zPos + zOffset);
|
||||||
|
world.setBlockToAir(xPos + xOffset, yPos + 2, zPos + zOffset);
|
||||||
|
world.setBlockToAir(xPos + xOffset, yPos + 3, zPos + zOffset);
|
||||||
|
}
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
returnAmount = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(returnAmount)
|
||||||
|
{
|
||||||
|
return doConstruct ? i : yPos;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return doConstruct ? length : yPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Int3 getFinalLocation(World world, int clearance)
|
public Int3 getFinalLocation(World world, int clearance)
|
||||||
|
|
|
@ -1,14 +1,19 @@
|
||||||
package WayofTime.alchemicalWizardry.common.demonVillage.tileEntity;
|
package WayofTime.alchemicalWizardry.common.demonVillage.tileEntity;
|
||||||
|
|
||||||
import WayofTime.alchemicalWizardry.AlchemicalWizardry;
|
import java.io.BufferedReader;
|
||||||
import WayofTime.alchemicalWizardry.common.Int3;
|
import java.io.File;
|
||||||
import WayofTime.alchemicalWizardry.common.block.BlockTeleposer;
|
import java.io.FileNotFoundException;
|
||||||
import WayofTime.alchemicalWizardry.common.demonVillage.*;
|
import java.io.FileReader;
|
||||||
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.DemonPacketRegistry;
|
import java.util.ArrayList;
|
||||||
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.DemonType;
|
import java.util.HashMap;
|
||||||
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.demon.IHoardDemon;
|
import java.util.HashSet;
|
||||||
import com.google.gson.Gson;
|
import java.util.LinkedList;
|
||||||
import com.google.gson.GsonBuilder;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.entity.EntityCreature;
|
import net.minecraft.entity.EntityCreature;
|
||||||
import net.minecraft.entity.EntityLivingBase;
|
import net.minecraft.entity.EntityLivingBase;
|
||||||
|
@ -19,13 +24,22 @@ import net.minecraft.nbt.NBTTagList;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraftforge.common.util.Constants;
|
import net.minecraftforge.common.util.Constants;
|
||||||
import net.minecraftforge.common.util.ForgeDirection;
|
import net.minecraftforge.common.util.ForgeDirection;
|
||||||
|
import WayofTime.alchemicalWizardry.AlchemicalWizardry;
|
||||||
|
import WayofTime.alchemicalWizardry.common.Int3;
|
||||||
|
import WayofTime.alchemicalWizardry.common.block.BlockTeleposer;
|
||||||
|
import WayofTime.alchemicalWizardry.common.demonVillage.BuildingSchematic;
|
||||||
|
import WayofTime.alchemicalWizardry.common.demonVillage.DemonBuilding;
|
||||||
|
import WayofTime.alchemicalWizardry.common.demonVillage.DemonCrosspath;
|
||||||
|
import WayofTime.alchemicalWizardry.common.demonVillage.DemonVillagePath;
|
||||||
|
import WayofTime.alchemicalWizardry.common.demonVillage.DemonVillagePath.Int3AndBool;
|
||||||
|
import WayofTime.alchemicalWizardry.common.demonVillage.GridSpace;
|
||||||
|
import WayofTime.alchemicalWizardry.common.demonVillage.GridSpaceHolder;
|
||||||
|
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.DemonPacketRegistry;
|
||||||
|
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.DemonType;
|
||||||
|
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.demon.IHoardDemon;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import com.google.gson.Gson;
|
||||||
import java.io.File;
|
import com.google.gson.GsonBuilder;
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.FileReader;
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
|
|
||||||
public class TEDemonPortal extends TileEntity
|
public class TEDemonPortal extends TileEntity
|
||||||
{
|
{
|
||||||
|
@ -202,6 +216,7 @@ public class TEDemonPortal extends TileEntity
|
||||||
|
|
||||||
public void notifyDemons(EntityLivingBase demon, EntityLivingBase target, double radius) //TODO
|
public void notifyDemons(EntityLivingBase demon, EntityLivingBase target, double radius) //TODO
|
||||||
{
|
{
|
||||||
|
this.lockdownTimer = 1000;
|
||||||
for(IHoardDemon thrallDemon : this.hoardList)
|
for(IHoardDemon thrallDemon : this.hoardList)
|
||||||
{
|
{
|
||||||
if(thrallDemon instanceof EntityCreature)
|
if(thrallDemon instanceof EntityCreature)
|
||||||
|
@ -288,6 +303,13 @@ public class TEDemonPortal extends TileEntity
|
||||||
this.houseCooldown = TEDemonPortal.buildingGridDelay;
|
this.houseCooldown = TEDemonPortal.buildingGridDelay;
|
||||||
this.roadCooldown = TEDemonPortal.roadGridDelay;
|
this.roadCooldown = TEDemonPortal.roadGridDelay;
|
||||||
this.demonHoardCooldown = TEDemonPortal.demonHoardDelay;
|
this.demonHoardCooldown = TEDemonPortal.demonHoardDelay;
|
||||||
|
|
||||||
|
this.createRandomRoad();
|
||||||
|
|
||||||
|
if (this.createRandomBuilding(DemonBuilding.BUILDING_PORTAL, tier) >= 1)
|
||||||
|
{
|
||||||
|
this.buildingStage = 0;
|
||||||
|
}
|
||||||
|
|
||||||
isInitialized = true;
|
isInitialized = true;
|
||||||
}
|
}
|
||||||
|
@ -312,6 +334,7 @@ public class TEDemonPortal extends TileEntity
|
||||||
if(buildingStage >= 0 && buildingStage <=2)
|
if(buildingStage >= 0 && buildingStage <=2)
|
||||||
{
|
{
|
||||||
AlchemicalWizardry.logger.info("BuildingStage = " + buildingStage);
|
AlchemicalWizardry.logger.info("BuildingStage = " + buildingStage);
|
||||||
|
AlchemicalWizardry.logger.info("Tier = " + this.tier);
|
||||||
this.createPortalBuilding(buildingStage, nextDemonPortalName, tier);
|
this.createPortalBuilding(buildingStage, nextDemonPortalName, tier);
|
||||||
buildingStage++;
|
buildingStage++;
|
||||||
return;
|
return;
|
||||||
|
@ -894,11 +917,11 @@ public class TEDemonPortal extends TileEntity
|
||||||
return new Int3(0, 0, 0);
|
return new Int3(0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void createGriddedRoad(int gridXi, int yi, int gridZi, ForgeDirection dir, int gridLength, boolean convertStarter) //Total grid length
|
public int createGriddedRoad(int gridXi, int yi, int gridZi, ForgeDirection dir, int gridLength, boolean convertStarter) //Total grid length
|
||||||
{
|
{
|
||||||
if (gridLength == 0 || gridLength == 1)
|
if (gridLength == 0 || gridLength == 1)
|
||||||
{
|
{
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (convertStarter)
|
if (convertStarter)
|
||||||
|
@ -922,7 +945,8 @@ public class TEDemonPortal extends TileEntity
|
||||||
{
|
{
|
||||||
DemonVillagePath path = new DemonVillagePath(xCoord + initGridX * 5, initY, zCoord + initGridZ * 5, dir, 6);
|
DemonVillagePath path = new DemonVillagePath(xCoord + initGridX * 5, initY, zCoord + initGridZ * 5, dir, 6);
|
||||||
|
|
||||||
Int3 next = path.constructFullPath(this, worldObj, this.getRoadStepClearance());
|
Int3AndBool temp = path.constructFullPath(this, worldObj, this.getRoadStepClearance());
|
||||||
|
Int3 next = temp.coords;
|
||||||
|
|
||||||
if (next != null)
|
if (next != null)
|
||||||
{
|
{
|
||||||
|
@ -930,6 +954,11 @@ public class TEDemonPortal extends TileEntity
|
||||||
if(printDebug)
|
if(printDebug)
|
||||||
AlchemicalWizardry.logger.info("" + initY);
|
AlchemicalWizardry.logger.info("" + initY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!temp.bool)
|
||||||
|
{
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
initGridX += dir.offsetX;
|
initGridX += dir.offsetX;
|
||||||
initGridZ += dir.offsetZ;
|
initGridZ += dir.offsetZ;
|
||||||
|
@ -939,6 +968,8 @@ public class TEDemonPortal extends TileEntity
|
||||||
this.setGridSpace(initGridX, initGridZ, new GridSpace(GridSpace.ROAD, initY));
|
this.setGridSpace(initGridX, initGridZ, new GridSpace(GridSpace.ROAD, initY));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return gridLength - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void expandAreaInNegX()
|
public void expandAreaInNegX()
|
||||||
|
@ -1330,6 +1361,10 @@ public class TEDemonPortal extends TileEntity
|
||||||
build.buildAll(this, worldObj, xCoord + (x + xOff) * 5, yLevel, zCoord + (z + zOff) * 5, chosenDirection.getOpposite(), true);
|
build.buildAll(this, worldObj, xCoord + (x + xOff) * 5, yLevel, zCoord + (z + zOff) * 5, chosenDirection.getOpposite(), true);
|
||||||
build.setAllGridSpaces(x + xOff, z + zOff, yLevel, chosenDirection.getOpposite(), GridSpace.HOUSE, grid);
|
build.setAllGridSpaces(x + xOff, z + zOff, yLevel, chosenDirection.getOpposite(), GridSpace.HOUSE, grid);
|
||||||
this.loadGSH(grid);
|
this.loadGSH(grid);
|
||||||
|
|
||||||
|
DemonVillagePath path = new DemonVillagePath(xCoord + (x) * 5, yLevel, zCoord + (z) * 5, chosenDirection, 2);
|
||||||
|
|
||||||
|
Int3AndBool temp = path.constructFullPath(this, worldObj, this.getRoadStepClearance());
|
||||||
|
|
||||||
return build.getNumberOfGridSpaces();
|
return build.getNumberOfGridSpaces();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue