first commit
This commit is contained in:
292
Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StairTile_SPU.cpp
Normal file
292
Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/StairTile_SPU.cpp
Normal file
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user