diff options
Diffstat (limited to 'Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StairTile_SPU.cpp')
| -rw-r--r-- | Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StairTile_SPU.cpp | 292 |
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; +} |
