Files
mc-lce/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/VineTile_SPU.h
2026-03-01 02:38:58 +02:00

99 lines
2.4 KiB
C++

#pragma once
#include "Tile_SPU.h"
#include "Direction_SPU.h"
class VineTile_SPU : public Tile_SPU
{
public:
static const int VINE_SOUTH = 1 << Direction::SOUTH;
static const int VINE_NORTH = 1 << Direction::NORTH;
static const int VINE_EAST = 1 << Direction::EAST;
static const int VINE_WEST = 1 << Direction::WEST;
public:
VineTile_SPU(int id) : Tile_SPU(id) {}
virtual void updateDefaultShape() { setShape(0, 0, 0, 1, 1, 1); }
virtual int getRenderShape() { return SHAPE_VINE; }
virtual bool isSolidRender(bool isServerLevel = false) { return false; }
virtual bool isCubeShaped() { return false; }
float _max(float a, float b) { return a > b ? a : b; }
float _min(float a, float b) { return a < b ? a : b; }
bool isAcceptableNeighbor(int id)
{
if (id == 0) return false;
TileRef_SPU tile(id);
if (tile->isCubeShaped() && tile->getMaterial()->blocksMotion()) return true;
return false;
}
virtual void updateShape(ChunkRebuildData *level, int x, int y, int z, int forceData = -1, TileEntity* forceEntity = NULL) // 4J added forceData, forceEntity param
{
const float thickness = 1.0f / 16.0f;
int facings = level->getData(x, y, z);
float minX = 1;
float minY = 1;
float minZ = 1;
float maxX = 0;
float maxY = 0;
float maxZ = 0;
bool hasWall = facings > 0;
if ((facings & VINE_WEST) != 0)
{
maxX = _max(maxX, thickness);
minX = 0;
minY = 0;
maxY = 1;
minZ = 0;
maxZ = 1;
hasWall = true;
}
if ((facings & VINE_EAST) != 0)
{
minX = _min(minX, 1 - thickness);
maxX = 1;
minY = 0;
maxY = 1;
minZ = 0;
maxZ = 1;
hasWall = true;
}
if ((facings & VINE_NORTH) != 0)
{
maxZ = _max(maxZ, thickness);
minZ = 0;
minX = 0;
maxX = 1;
minY = 0;
maxY = 1;
hasWall = true;
}
if ((facings & VINE_SOUTH) != 0)
{
minZ = _min(minZ, 1 - thickness);
maxZ = 1;
minX = 0;
maxX = 1;
minY = 0;
maxY = 1;
hasWall = true;
}
if (!hasWall && isAcceptableNeighbor(level->getTile(x, y + 1, z)))
{
minY = _min(minY, 1 - thickness);
maxY = 1;
minX = 0;
maxX = 1;
minZ = 0;
maxZ = 1;
}
setShape(minX, minY, minZ, maxX, maxY, maxZ);
}
public:
virtual int getColor(ChunkRebuildData *level, int x, int y, int z, int data) { return getColor(level, x, y, z); } // 4J added
virtual int getColor(ChunkRebuildData *level, int x, int y, int z){ return level->getFoliageColor(x, z); }
};