aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StairTile_SPU.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StairTile_SPU.cpp')
-rw-r--r--Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StairTile_SPU.cpp292
1 files changed, 292 insertions, 0 deletions
diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StairTile_SPU.cpp b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StairTile_SPU.cpp
new file mode 100644
index 00000000..5bdbdf4a
--- /dev/null
+++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StairTile_SPU.cpp
@@ -0,0 +1,292 @@
+#include "stdafx.h"
+#include "StairTile_SPU.h"
+#include "ChunkRebuildData.h"
+
+
+void StairTile_SPU::updateShape(ChunkRebuildData *level, int x, int y, int z, int forceData, TileEntity* forceEntity) // 4J added forceData, forceEntity param
+{
+ setShape(0, 0, 0, 1, 1, 1);
+}
+
+bool StairTile_SPU::isSolidRender(bool isServerLevel)
+{
+ return false;
+}
+
+int StairTile_SPU::getRenderShape()
+{
+ return Tile_SPU::SHAPE_STAIRS;
+}
+
+void StairTile_SPU::setBaseShape(ChunkRebuildData *level, int x, int y, int z)
+{
+ int data = level->getData(x, y, z);
+
+ if ((data & UPSIDEDOWN_BIT) != 0)
+ {
+ setShape(0, .5f, 0, 1, 1, 1);
+ }
+ else
+ {
+ setShape(0, 0, 0, 1, .5f, 1);
+ }
+}
+
+bool StairTile_SPU::isStairs(int id)
+{
+ switch(id)
+ {
+ case Tile_SPU::stairs_wood_Id:
+ case Tile_SPU::stairs_stone_Id:
+ case Tile_SPU::stairs_bricks_Id:
+ case Tile_SPU::stairs_stoneBrickSmooth_Id:
+ case Tile_SPU::stairs_netherBricks_Id:
+ case Tile_SPU::stairs_sandstone_Id:
+ case Tile_SPU::stairs_sprucewood_Id:
+ case Tile_SPU::stairs_birchwood_Id:
+ return true;
+ default:
+ return false;
+ }
+ return false;
+}
+
+bool StairTile_SPU::isLockAttached(ChunkRebuildData *level, int x, int y, int z, int data)
+{
+ int lockTile = level->getTile(x, y, z);
+ if (isStairs(lockTile) && level->getData(x, y, z) == data)
+ {
+ return true;
+ }
+
+ return false;
+}
+
+bool StairTile_SPU::setStepShape(ChunkRebuildData *level, int x, int y, int z)
+{
+ int data = level->getData(x, y, z);
+ int dir = data & 0x3;
+
+ float bottom = 0.5f;
+ float top = 1.0f;
+
+ if ((data & UPSIDEDOWN_BIT) != 0)
+ {
+ bottom = 0;
+ top = .5f;
+ }
+
+ float west = 0;
+ float east = 1;
+ float north = 0;
+ float south = .5f;
+
+ bool checkInnerPiece = true;
+
+ if (dir == DIR_EAST)
+ {
+ west = .5f;
+ south = 1;
+
+ int backTile = level->getTile(x + 1, y, z);
+ int backData = level->getData(x + 1, y, z);
+ if (isStairs(backTile) && ((data & UPSIDEDOWN_BIT) == (backData & UPSIDEDOWN_BIT)))
+ {
+ int backDir = backData & 0x3;
+ if (backDir == DIR_NORTH && !isLockAttached(level, x, y, z + 1, data))
+ {
+ south = .5f;
+ checkInnerPiece = false;
+ }
+ else if (backDir == DIR_SOUTH && !isLockAttached(level, x, y, z - 1, data))
+ {
+ north = .5f;
+ checkInnerPiece = false;
+ }
+ }
+ }
+ else if (dir == DIR_WEST)
+ {
+ east = .5f;
+ south = 1;
+
+ int backTile = level->getTile(x - 1, y, z);
+ int backData = level->getData(x - 1, y, z);
+ if (isStairs(backTile) && ((data & UPSIDEDOWN_BIT) == (backData & UPSIDEDOWN_BIT)))
+ {
+ int backDir = backData & 0x3;
+ if (backDir == DIR_NORTH && !isLockAttached(level, x, y, z + 1, data))
+ {
+ south = .5f;
+ checkInnerPiece = false;
+ }
+ else if (backDir == DIR_SOUTH && !isLockAttached(level, x, y, z - 1, data))
+ {
+ north = .5f;
+ checkInnerPiece = false;
+ }
+ }
+ }
+ else if (dir == DIR_SOUTH)
+ {
+ north = .5f;
+ south = 1;
+
+ int backTile = level->getTile(x, y, z + 1);
+ int backData = level->getData(x, y, z + 1);
+ if (isStairs(backTile) && ((data & UPSIDEDOWN_BIT) == (backData & UPSIDEDOWN_BIT)))
+ {
+ int backDir = backData & 0x3;
+ if (backDir == DIR_WEST && !isLockAttached(level, x + 1, y, z, data))
+ {
+ east = .5f;
+ checkInnerPiece = false;
+ }
+ else if (backDir == DIR_EAST && !isLockAttached(level, x - 1, y, z, data))
+ {
+ west = .5f;
+ checkInnerPiece = false;
+ }
+ }
+ }
+ else if (dir == DIR_NORTH)
+ {
+ int backTile = level->getTile(x, y, z - 1);
+ int backData = level->getData(x, y, z - 1);
+ if (isStairs(backTile) && ((data & UPSIDEDOWN_BIT) == (backData & UPSIDEDOWN_BIT)))
+ {
+ int backDir = backData & 0x3;
+ if (backDir == DIR_WEST && !isLockAttached(level, x + 1, y, z, data))
+ {
+ east = .5f;
+ checkInnerPiece = false;
+ }
+ else if (backDir == DIR_EAST && !isLockAttached(level, x - 1, y, z, data))
+ {
+ west = .5f;
+ checkInnerPiece = false;
+ }
+ }
+ }
+
+ setShape(west, bottom, north, east, top, south);
+ return checkInnerPiece;
+}
+
+/*
+* This method adds an extra 1/8 block if the stairs can attach as an
+* "inner corner."
+*/
+bool StairTile_SPU::setInnerPieceShape(ChunkRebuildData *level, int x, int y, int z)
+{
+ int data = level->getData(x, y, z);
+ int dir = data & 0x3;
+
+ float bottom = 0.5f;
+ float top = 1.0f;
+
+ if ((data & UPSIDEDOWN_BIT) != 0)
+ {
+ bottom = 0;
+ top = .5f;
+ }
+
+ float west = 0;
+ float east = .5f;
+ float north = .5f;
+ float south = 1.0f;
+
+ bool hasInnerPiece = false;
+
+ if (dir == DIR_EAST)
+ {
+ int frontTile = level->getTile(x - 1, y, z);
+ int frontData = level->getData(x - 1, y, z);
+ if (isStairs(frontTile) && ((data & UPSIDEDOWN_BIT) == (frontData & UPSIDEDOWN_BIT)))
+ {
+ int frontDir = frontData & 0x3;
+ if (frontDir == DIR_NORTH && !isLockAttached(level, x, y, z - 1, data))
+ {
+ north = 0;
+ south = .5f;
+ hasInnerPiece = true;
+ }
+ else if (frontDir == DIR_SOUTH && !isLockAttached(level, x, y, z + 1, data))
+ {
+ north = .5f;
+ south = 1;
+ hasInnerPiece = true;
+ }
+ }
+ }
+ else if (dir == DIR_WEST)
+ {
+ int frontTile = level->getTile(x + 1, y, z);
+ int frontData = level->getData(x + 1, y, z);
+ if (isStairs(frontTile) && ((data & UPSIDEDOWN_BIT) == (frontData & UPSIDEDOWN_BIT)))
+ {
+ west = .5f;
+ east = 1.0f;
+ int frontDir = frontData & 0x3;
+ if (frontDir == DIR_NORTH && !isLockAttached(level, x, y, z - 1, data))
+ {
+ north = 0;
+ south = .5f;
+ hasInnerPiece = true;
+ }
+ else if (frontDir == DIR_SOUTH && !isLockAttached(level, x, y, z + 1, data))
+ {
+ north = .5f;
+ south = 1;
+ hasInnerPiece = true;
+ }
+ }
+ }
+ else if (dir == DIR_SOUTH)
+ {
+ int frontTile = level->getTile(x, y, z - 1);
+ int frontData = level->getData(x, y, z - 1);
+ if (isStairs(frontTile) && ((data & UPSIDEDOWN_BIT) == (frontData & UPSIDEDOWN_BIT)))
+ {
+ north = 0;
+ south = .5f;
+
+ int frontDir = frontData & 0x3;
+ if (frontDir == DIR_WEST && !isLockAttached(level, x - 1, y, z, data))
+ {
+ hasInnerPiece = true;
+ }
+ else if (frontDir == DIR_EAST && !isLockAttached(level, x + 1, y, z, data))
+ {
+ west = .5f;
+ east = 1.0f;
+ hasInnerPiece = true;
+ }
+ }
+ }
+ else if (dir == DIR_NORTH)
+ {
+ int frontTile = level->getTile(x, y, z + 1);
+ int frontData = level->getData(x, y, z + 1);
+ if (isStairs(frontTile) && ((data & UPSIDEDOWN_BIT) == (frontData & UPSIDEDOWN_BIT)))
+ {
+ int frontDir = frontData & 0x3;
+ if (frontDir == DIR_WEST && !isLockAttached(level, x - 1, y, z, data))
+ {
+ hasInnerPiece = true;
+ }
+ else if (frontDir == DIR_EAST && !isLockAttached(level, x + 1, y, z, data))
+ {
+ west = .5f;
+ east = 1.0f;
+ hasInnerPiece = true;
+ }
+ }
+ }
+
+ if (hasInnerPiece)
+ {
+ setShape(west, bottom, north, east, top, south);
+ }
+ return hasInnerPiece;
+}