Fixed pipe placement crash

This commit is contained in:
Calclavia 2014-09-21 10:28:51 +08:00
parent af305ec049
commit 57a1375bd7
6 changed files with 104 additions and 115 deletions

View file

@ -25,7 +25,7 @@ public class NodeTank extends NodeConnector implements IFluidTank, IFluidHandler
{
static final int PACKET_DESCRIPTION = 100, PACKET_TANK = 101;
LimitedTank tank;
byte renderSides = 0;
int renderSides = 0;
public NodeTank(INodeProvider parent)
{
@ -204,7 +204,7 @@ public class NodeTank extends NodeConnector implements IFluidTank, IFluidHandler
return tank.maxOutput;
}
public byte getRenderSides()
public int getRenderSides()
{
return renderSides;
}

View file

@ -9,10 +9,8 @@ import codechicken.lib.vec.Cuboid6
import codechicken.multipart._
import cpw.mods.fml.relauncher.{Side, SideOnly}
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.util.{IIcon, MovingObjectPosition}
import net.minecraftforge.common.util.ForgeDirection
import universalelectricity.api.core.grid.{INode, INodeProvider, ISave}
object PartFramedNode
{
@ -34,17 +32,17 @@ object PartFramedNode
insulatedSides(5) = new IndexedCuboid6(5, new Cuboid6(0.7, 0.3, 0.3, 1.0, 0.7, 0.7))
insulatedSides(6) = new IndexedCuboid6(6, new Cuboid6(0.3, 0.3, 0.3, 0.7, 0.7, 0.7))
def connectionMapContainsSide(connections: Byte, side: ForgeDirection): Boolean =
def connectionMapContainsSide(connections: Int, side: ForgeDirection): Boolean =
{
val tester: Byte = (1 << side.ordinal).asInstanceOf[Byte]
return ((connections & tester) > 0)
val tester = 1 << side.ordinal
return (connections & tester) > 0
}
}
abstract class PartFramedNode extends PartAbstract with TNodePartConnector with TSlottedPart with TNormalOcclusion with TIconHitEffects
{
/** Bitmask connections */
var connectionMask: Byte = 0x00
var connectionMask = 0x00
@SideOnly(Side.CLIENT)
protected var breakIcon: IIcon = null
@ -52,11 +50,6 @@ abstract class PartFramedNode extends PartAbstract with TNodePartConnector with
/** Client Side */
private var testingSide: ForgeDirection = null
override def occlusionTest(other: TMultiPart): Boolean =
{
return NormalOcclusionTest.apply(this, other)
}
override def getStrength(hit: MovingObjectPosition, player: EntityPlayer): Float =
{
return 10F
@ -108,15 +101,9 @@ abstract class PartFramedNode extends PartAbstract with TNodePartConnector with
return list
}
def getAllCurrentConnections: Byte =
{
return (connectionMask)
}
def getAllCurrentConnections = connectionMask
def getSlotMask: Int =
{
return PartMap.CENTER.mask
}
def getSlotMask = PartMap.CENTER.mask
def getHollowSize: Int =
{

View file

@ -12,6 +12,7 @@ import org.lwjgl.input.Keyboard
import resonant.lib.render.EnumColor
import resonant.lib.utility.LanguageUtility
import resonant.lib.wrapper.WrapList._
import resonantinduction.core.ResonantPartFactory
import universalelectricity.api.UnitDisplay
class ItemPipe extends TItemMultiPart
@ -21,7 +22,7 @@ class ItemPipe extends TItemMultiPart
def newPart(itemStack: ItemStack, player: EntityPlayer, world: World, pos: BlockCoord, side: Int, hit: Vector3): TMultiPart =
{
val part: PartPipe = MultiPartRegistry.createPart("resonant_induction_pipe", false).asInstanceOf[PartPipe]
val part = ResonantPartFactory.create(classOf[PartPipe])
part.preparePlacement(itemStack.getItemDamage)
return part
}

View file

@ -22,15 +22,17 @@ import resonantinduction.mechanical.fluid.pipe.PipeMaterials.PipeMaterial
*/
class PartPipe extends PartFramedNode with TMaterial[PipeMaterial] with TColorable with TSlottedPart with TNormalOcclusion with IFluidHandler
{
protected final val tank = new FluidTank(FluidContainerRegistry.BUCKET_VOLUME)
val tank = new FluidTank(FluidContainerRegistry.BUCKET_VOLUME)
override lazy val node = new PipePressureNode(this)
/**
* Computes the average fluid for client to render.
*/
private val averageTankData = new EvictingList[Integer](20)
private var markPacket: Boolean = true
private var markPacket = true
override lazy val node = new PipePressureNode(this)
material = PipeMaterials.ceramic
def preparePlacement(meta: Int)
{
@ -60,7 +62,7 @@ class PartPipe extends PartFramedNode with TMaterial[PipeMaterial] with TColorab
/**
* Sends fluid level to the client to be used in the renderer
*/
def sendFluidUpdate
def sendFluidUpdate()
{
val nbt = new NBTTagCompound
var averageAmount: Int = 0
@ -82,15 +84,13 @@ class PartPipe extends PartFramedNode with TMaterial[PipeMaterial] with TColorab
override def read(packet: MCDataInput, packetID: Int)
{
super.read(packet, packetID)
if (packetID == 3)
{
tank.setCapacity(packet.readInt)
tank.readFromNBT(packet.readNBTTagCompound)
}
else
{
super.read(packet, packetID)
}
}
@SideOnly(Side.CLIENT)

View file

@ -9,103 +9,104 @@ import resonantinduction.core.prefab.part.connector.TColorable$;
import universalelectricity.api.core.grid.INode;
import universalelectricity.api.core.grid.INodeProvider;
/** Pressure node for the pipe
/**
* Pressure node for the pipe
*
* @author Calclavia, Darkguardsman */
* @author Calclavia, Darkguardsman
*/
public class PipePressureNode extends NodePressure
{
public PipePressureNode(PartPipe parent)
{
super(parent);
}
public PipePressureNode(PartPipe parent)
{
super(parent);
}
public PartPipe pipe()
{
return (PartPipe) this.getParent();
}
public PartPipe pipe()
{
return (PartPipe) this.getParent();
}
public void doRecache()
{
connections.clear();
public void doRecache()
{
connections.clear();
if (world() != null)
{
int previousConnections = pipe().getAllCurrentConnections();
pipe().connectionMask_$eq((byte) 0);
if (world() != null)
{
byte previousConnections = pipe().getAllCurrentConnections();
pipe().connectionMask_$eq((byte) 0);
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
{
TileEntity tile = position().add(dir).getTileEntity(world());
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
{
TileEntity tile = position().add(dir).getTileEntity(world());
if (tile instanceof IFluidHandler)
{
if (tile instanceof INodeProvider)
{
// If anything happens while trying to access the node then forget about it.
INode check = null;
try
{
check = ((INodeProvider) tile).getNode(NodePressure.class, dir.getOpposite());
}
catch (Exception err)
{
check = null;
}
if (tile instanceof IFluidHandler)
{
if (tile instanceof INodeProvider)
{
// If anything happens while trying to access the node then forget about it.
INode check = null;
try
{
check = ((INodeProvider) tile).getNode(NodePressure.class, dir.getOpposite());
}
catch (Exception err)
{
check = null;
}
if (check != null && check instanceof NodePressure && canConnect(dir, check) && ((NodePressure) check).canConnect(dir.getOpposite(), this))
{
pipe().connectionMask_$eq(WorldUtility.setEnableSide(pipe().connectionMask(), dir, true));
connections.put(check, dir);
}
}
else if (canConnect(dir, tile))
{
pipe().connectionMask_$eq(WorldUtility.setEnableSide(pipe().connectionMask(), dir, true));
connections.put(tile, dir);
}
}
}
if (check != null && check instanceof NodePressure && canConnect(dir, check) && ((NodePressure) check).canConnect(dir.getOpposite(), this))
{
pipe().connectionMask_$eq(WorldUtility.setEnableSide(pipe().connectionMask(), dir, true));
connections.put(check, dir);
}
}
else if (canConnect(dir, tile))
{
pipe().connectionMask_$eq(WorldUtility.setEnableSide(pipe().connectionMask(), dir, true));
connections.put(tile, dir);
}
}
}
/** Only send packet updates if visuallyConnected changed. */
if (!world().isRemote && previousConnections != pipe().connectionMask())
{
pipe().sendConnectionUpdate();
}
}
}
/** Only send packet updates if visuallyConnected changed. */
if (!world().isRemote && previousConnections != pipe().connectionMask())
{
pipe().sendConnectionUpdate();
}
}
}
@Override
public boolean canConnect(ForgeDirection from, Object source)
{
if (!pipe().isBlockedOnSide(from))
{
if (source instanceof NodePressure)
{
NodePressure otherNode = (NodePressure) source;
@Override
public boolean canConnect(ForgeDirection from, Object source)
{
if (!pipe().isBlockedOnSide(from))
{
if (source instanceof NodePressure)
{
NodePressure otherNode = (NodePressure) source;
if (otherNode.getParent() instanceof PartPipe)
{
PartPipe otherPipe = (PartPipe) otherNode.getParent();
if (otherNode.getParent() instanceof PartPipe)
{
PartPipe otherPipe = (PartPipe) otherNode.getParent();
if (!otherPipe.isBlockedOnSide(from.getOpposite()) && pipe().material() == otherPipe.material())
{
return pipe().getColor() == otherPipe.getColor() || (pipe().getColor() == TColorable$.MODULE$.defaultColor() || otherPipe.getColor() == TColorable$.MODULE$.defaultColor());
}
if (!otherPipe.isBlockedOnSide(from.getOpposite()) && pipe().material() == otherPipe.material())
{
return pipe().getColor() == otherPipe.getColor() || (pipe().getColor() == TColorable$.MODULE$.defaultColor() || otherPipe.getColor() == TColorable$.MODULE$.defaultColor());
}
return false;
}
}
return false;
}
}
return super.canConnect(from, source) || source instanceof IFluidHandler;
}
return super.canConnect(from, source) || source instanceof IFluidHandler;
}
return false;
}
return false;
}
@Override
public String toString()
{
return this.getClass().getSimpleName() + this.hashCode();
}
@Override
public String toString()
{
return this.getClass().getSimpleName() + this.hashCode();
}
}

View file

@ -39,7 +39,7 @@ public class RenderPipe implements ISimpleItemRenderer
FluidStack fluid = part.tank().getFluid();
int capacity = part.tank().getCapacity();
byte renderSides = part.getAllCurrentConnections();
int renderSides = part.getAllCurrentConnections();
/**
if (fluid != null && fluid.amount > 0)
{
@ -112,7 +112,7 @@ public class RenderPipe implements ISimpleItemRenderer
}
@SuppressWarnings("incomplete-switch")
public static void render(int meta, int colorCode, byte sides)
public static void render(int meta, int colorCode, int sides)
{
RenderUtility.enableBlending();
RenderUtility.bind(TEXTURE);
@ -172,7 +172,7 @@ public class RenderPipe implements ISimpleItemRenderer
public void renderInventoryItem(IItemRenderer.ItemRenderType type, ItemStack itemStack, Object... data)
{
GL11.glPushMatrix();
render(itemStack.getItemDamage(), -1, Byte.parseByte("001100", 2));
render(itemStack.getItemDamage(), -1, 0xC);
GL11.glPopMatrix();
}
}