mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-15 10:21:45 -04:00
Make cable collision box closer to cable shape
This commit is contained in:
parent
105e26b499
commit
9c00fcfc28
@ -5,7 +5,6 @@ import java.util.Collections
|
|||||||
|
|
||||||
import li.cil.oc.client.Textures
|
import li.cil.oc.client.Textures
|
||||||
import li.cil.oc.common.block
|
import li.cil.oc.common.block
|
||||||
import li.cil.oc.common.block.Cable
|
|
||||||
import li.cil.oc.common.tileentity
|
import li.cil.oc.common.tileentity
|
||||||
import li.cil.oc.integration.Mods
|
import li.cil.oc.integration.Mods
|
||||||
import li.cil.oc.util.BlockPosition
|
import li.cil.oc.util.BlockPosition
|
||||||
@ -40,7 +39,7 @@ class CableModel extends SmartBlockModelBase {
|
|||||||
val faces = mutable.ArrayBuffer.empty[BakedQuad]
|
val faces = mutable.ArrayBuffer.empty[BakedQuad]
|
||||||
|
|
||||||
val color = Some(t.getColor)
|
val color = Some(t.getColor)
|
||||||
val mask = Cable.neighbors(t.world, t.getPos)
|
val mask = block.Cable.neighbors(t.world, t.getPos)
|
||||||
faces ++= bakeQuads(Middle, cableTexture, color)
|
faces ++= bakeQuads(Middle, cableTexture, color)
|
||||||
for (side <- EnumFacing.values) {
|
for (side <- EnumFacing.values) {
|
||||||
val connected = (mask & (1 << side.getIndex)) != 0
|
val connected = (mask & (1 << side.getIndex)) != 0
|
||||||
|
@ -1,14 +1,15 @@
|
|||||||
package li.cil.oc.common.block
|
package li.cil.oc.common.block
|
||||||
|
|
||||||
|
import java.util
|
||||||
|
|
||||||
import li.cil.oc.common.capabilities.Capabilities
|
import li.cil.oc.common.capabilities.Capabilities
|
||||||
import li.cil.oc.common.tileentity
|
import li.cil.oc.common.tileentity
|
||||||
import li.cil.oc.util.Color
|
import li.cil.oc.util.Color
|
||||||
import net.minecraft.block.Block
|
import net.minecraft.block.Block
|
||||||
import net.minecraft.block.state.IBlockState
|
import net.minecraft.block.state.IBlockState
|
||||||
import net.minecraft.entity.EntityLivingBase
|
|
||||||
import net.minecraft.entity.player.EntityPlayer
|
import net.minecraft.entity.player.EntityPlayer
|
||||||
import net.minecraft.item.EnumDyeColor
|
import net.minecraft.entity.{Entity, EntityLivingBase}
|
||||||
import net.minecraft.item.ItemStack
|
import net.minecraft.item.{EnumDyeColor, ItemStack}
|
||||||
import net.minecraft.tileentity.TileEntity
|
import net.minecraft.tileentity.TileEntity
|
||||||
import net.minecraft.util.EnumFacing
|
import net.minecraft.util.EnumFacing
|
||||||
import net.minecraft.util.math.AxisAlignedBB
|
import net.minecraft.util.math.AxisAlignedBB
|
||||||
@ -59,6 +60,10 @@ class Cable(protected implicit val tileTag: ClassTag[tileentity.Cable]) extends
|
|||||||
|
|
||||||
override def getBoundingBox(state: IBlockState, world: IBlockAccess, pos: BlockPos): AxisAlignedBB = Cable.bounds(world, pos)
|
override def getBoundingBox(state: IBlockState, world: IBlockAccess, pos: BlockPos): AxisAlignedBB = Cable.bounds(world, pos)
|
||||||
|
|
||||||
|
override def addCollisionBoxToList(state : IBlockState, world : World, pos : BlockPos, entityBox : AxisAlignedBB, boxes : util.List[AxisAlignedBB], entity : Entity) = {
|
||||||
|
Cable.parts(world, pos, entityBox, boxes)
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------- //
|
// ----------------------------------------------------------------------- //
|
||||||
|
|
||||||
override def createNewTileEntity(world: World, metadata: Int) = new tileentity.Cable()
|
override def createNewTileEntity(world: World, metadata: Int) = new tileentity.Cable()
|
||||||
@ -86,31 +91,28 @@ class Cable(protected implicit val tileTag: ClassTag[tileentity.Cable]) extends
|
|||||||
}
|
}
|
||||||
|
|
||||||
object Cable {
|
object Cable {
|
||||||
|
private final val MIN = 0.375
|
||||||
|
private final val MAX = 1 - MIN
|
||||||
|
|
||||||
|
final val DefaultBounds: AxisAlignedBB = new AxisAlignedBB(MIN, MIN, MIN, MAX, MAX, MAX)
|
||||||
|
|
||||||
|
final val CachedParts: Array[AxisAlignedBB] = Array(
|
||||||
|
new AxisAlignedBB( MIN, 0, MIN, MAX, MIN, MAX ), // Down
|
||||||
|
new AxisAlignedBB( MIN, MAX, MIN, MAX, 1, MAX ), // Up
|
||||||
|
new AxisAlignedBB( MIN, MIN, 0, MAX, MAX, MIN ), // North
|
||||||
|
new AxisAlignedBB( MIN, MIN, MAX, MAX, MAX, 1 ), // South
|
||||||
|
new AxisAlignedBB( 0, MIN, MIN, MIN, MAX, MAX ), // West
|
||||||
|
new AxisAlignedBB( MAX, MIN, MIN, 1, MAX, MAX )) // East
|
||||||
|
|
||||||
final val CachedBounds = {
|
final val CachedBounds = {
|
||||||
// 6 directions = 6 bits = 11111111b >> 2 = 0xFF >> 2
|
// 6 directions = 6 bits = 11111111b >> 2 = 0xFF >> 2
|
||||||
(0 to 0xFF >> 2).map(mask => {
|
(0 to 0xFF >> 2).map(mask => {
|
||||||
var minX = -0.125
|
EnumFacing.VALUES.foldLeft(DefaultBounds)((bound, side) => {
|
||||||
var minY = -0.125
|
if (((1 << side.getIndex) & mask) != 0) bound.union(CachedParts(side.ordinal()))
|
||||||
var minZ = -0.125
|
else bound
|
||||||
var maxX = 0.125
|
})
|
||||||
var maxY = 0.125
|
|
||||||
var maxZ = 0.125
|
|
||||||
for (side <- EnumFacing.values) {
|
|
||||||
if (((1 << side.getIndex) & mask) != 0) {
|
|
||||||
if (side.getFrontOffsetX < 0) minX += side.getFrontOffsetX * 0.375
|
|
||||||
else maxX += side.getFrontOffsetX * 0.375
|
|
||||||
if (side.getFrontOffsetY < 0) minY += side.getFrontOffsetY * 0.375
|
|
||||||
else maxY += side.getFrontOffsetY * 0.375
|
|
||||||
if (side.getFrontOffsetZ < 0) minZ += side.getFrontOffsetZ * 0.375
|
|
||||||
else maxZ += side.getFrontOffsetZ * 0.375
|
|
||||||
}
|
|
||||||
}
|
|
||||||
new AxisAlignedBB(
|
|
||||||
minX + 0.5, minY + 0.5, minZ + 0.5,
|
|
||||||
maxX + 0.5, maxY + 0.5, maxZ + 0.5)
|
|
||||||
}).toArray
|
}).toArray
|
||||||
}
|
}
|
||||||
final val DefaultBounds = CachedBounds(0)
|
|
||||||
|
|
||||||
def mask(side: EnumFacing, value: Int = 0) = value | (1 << side.getIndex)
|
def mask(side: EnumFacing, value: Int = 0) = value | (1 << side.getIndex)
|
||||||
|
|
||||||
@ -140,6 +142,19 @@ object Cable {
|
|||||||
|
|
||||||
def bounds(world: IBlockAccess, pos: BlockPos) = Cable.CachedBounds(Cable.neighbors(world, pos))
|
def bounds(world: IBlockAccess, pos: BlockPos) = Cable.CachedBounds(Cable.neighbors(world, pos))
|
||||||
|
|
||||||
|
def parts(world: IBlockAccess, pos: BlockPos, entityBox : AxisAlignedBB, boxes : util.List[AxisAlignedBB]) = {
|
||||||
|
val center = Cable.DefaultBounds.offset(pos)
|
||||||
|
if (entityBox.intersectsWith(center)) boxes.add(center)
|
||||||
|
|
||||||
|
val mask = Cable.neighbors(world, pos)
|
||||||
|
for (side <- EnumFacing.VALUES) {
|
||||||
|
if(((1 << side.getIndex) & mask) != 0) {
|
||||||
|
val part = Cable.CachedParts(side.ordinal()).offset(pos)
|
||||||
|
if (entityBox.intersectsWith(part)) boxes.add(part)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private def hasNetworkNode(tileEntity: TileEntity, side: EnumFacing): Boolean = {
|
private def hasNetworkNode(tileEntity: TileEntity, side: EnumFacing): Boolean = {
|
||||||
if (tileEntity != null) {
|
if (tileEntity != null) {
|
||||||
if (tileEntity.isInstanceOf[tileentity.RobotProxy]) return false
|
if (tileEntity.isInstanceOf[tileentity.RobotProxy]) return false
|
||||||
@ -181,4 +196,4 @@ object Cable {
|
|||||||
case im: tileentity.traits.ImmibisMicroblock => im.ImmibisMicroblocks_isSideOpen(side.ordinal)
|
case im: tileentity.traits.ImmibisMicroblock => im.ImmibisMicroblocks_isSideOpen(side.ordinal)
|
||||||
case _ => true
|
case _ => true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user