diff options
Diffstat (limited to 'Minecraft.World/PistonExtensionTile.cpp')
| -rw-r--r-- | Minecraft.World/PistonExtensionTile.cpp | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/Minecraft.World/PistonExtensionTile.cpp b/Minecraft.World/PistonExtensionTile.cpp new file mode 100644 index 00000000..1827ddde --- /dev/null +++ b/Minecraft.World/PistonExtensionTile.cpp @@ -0,0 +1,210 @@ +#include "stdafx.h" +#include "PistonExtensionTile.h" +#include "PistonBaseTile.h" +#include "Facing.h" +#include "net.minecraft.world.level.h" + +PistonExtensionTile::PistonExtensionTile(int id) : Tile(id, Material::piston,isSolidRender() ) +{ + // 4J added initialiser + overrideTopTexture = NULL; + + setSoundType(SOUND_STONE); + setDestroyTime(0.5f); +} + +void PistonExtensionTile::setOverrideTopTexture(Icon *overrideTopTexture) +{ + this->overrideTopTexture = overrideTopTexture; +} + +void PistonExtensionTile::clearOverrideTopTexture() +{ + this->overrideTopTexture = NULL; +} + +void PistonExtensionTile::onRemove(Level *level, int x, int y, int z, int id, int data) +{ + Tile::onRemove(level, x, y, z, id, data); + int facing = Facing::OPPOSITE_FACING[getFacing(data)]; + x += Facing::STEP_X[facing]; + y += Facing::STEP_Y[facing]; + z += Facing::STEP_Z[facing]; + + int t = level->getTile(x, y, z); + + if (t == Tile::pistonBase_Id || t == Tile::pistonStickyBase_Id) + { + data = level->getData(x, y, z); + if (PistonBaseTile::isExtended(data)) + { + Tile::tiles[t]->spawnResources(level, x, y, z, data, 0); + level->setTile(x, y, z, 0); + + } + } +} + +Icon *PistonExtensionTile::getTexture(int face, int data) +{ + int facing = getFacing(data); + + if (face == facing) + { + if (overrideTopTexture != NULL) + { + return overrideTopTexture; + } + if ((data & STICKY_BIT) != 0) + { + return PistonBaseTile::getTexture(PistonBaseTile::PLATFORM_STICKY_TEX); + } + return PistonBaseTile::getTexture(PistonBaseTile::PLATFORM_TEX); + } + if (facing < 6 && face == Facing::OPPOSITE_FACING[facing]) + { + return PistonBaseTile::getTexture(PistonBaseTile::PLATFORM_TEX); + } + return PistonBaseTile::getTexture(PistonBaseTile::EDGE_TEX); // edge and arms +} + +void PistonExtensionTile::registerIcons(IconRegister *iconRegister) +{ + // None +} + +int PistonExtensionTile::getRenderShape() +{ + return SHAPE_PISTON_EXTENSION; +} + +bool PistonExtensionTile::isSolidRender(bool isServerLevel) +{ + return false; +} + +bool PistonExtensionTile::isCubeShaped() +{ + return false; +} + +bool PistonExtensionTile::mayPlace(Level *level, int x, int y, int z) +{ + return false; +} + +bool PistonExtensionTile::mayPlace(Level *level, int x, int y, int z, int face) +{ + return false; +} + +int PistonExtensionTile::getResourceCount(Random *random) +{ + return 0; +} + +void PistonExtensionTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr<Entity> source) +{ + int data = level->getData(x, y, z); + + const float thickness = PistonBaseTile::PLATFORM_THICKNESS / 16.0f; + const float smallEdge1 = (8.0f - (PistonBaseTile::PLATFORM_THICKNESS / 2.0f)) / 16.0f; + const float smallEdge2 = (8.0f + (PistonBaseTile::PLATFORM_THICKNESS / 2.0f)) / 16.0f; + const float largeEdge1 = (8.0f - PistonBaseTile::PLATFORM_THICKNESS) / 16.0f; + const float largeEdge2 = (8.0f + PistonBaseTile::PLATFORM_THICKNESS) / 16.0f; + + switch (getFacing(data)) + { + case Facing::DOWN: + setShape(0, 0, 0, 1, thickness, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); + setShape(smallEdge1, thickness, smallEdge1, smallEdge2, 1, smallEdge2); + Tile::addAABBs(level, x, y, z, box, boxes, source); + break; + case Facing::UP: + setShape(0, 1 - thickness, 0, 1, 1, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); + setShape(smallEdge1, 0, smallEdge1, smallEdge2, 1 - thickness, smallEdge2); + Tile::addAABBs(level, x, y, z, box, boxes, source); + break; + case Facing::NORTH: + setShape(0, 0, 0, 1, 1, thickness); + Tile::addAABBs(level, x, y, z, box, boxes, source); + setShape(largeEdge1, smallEdge1, thickness, largeEdge2, smallEdge2, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); + break; + case Facing::SOUTH: + setShape(0, 0, 1 - thickness, 1, 1, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); + setShape(largeEdge1, smallEdge1, 0, largeEdge2, smallEdge2, 1 - thickness); + Tile::addAABBs(level, x, y, z, box, boxes, source); + break; + case Facing::WEST: + setShape(0, 0, 0, thickness, 1, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); + setShape(smallEdge1, largeEdge1, thickness, smallEdge2, largeEdge2, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); + break; + case Facing::EAST: + setShape(1 - thickness, 0, 0, 1, 1, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); + setShape(0, smallEdge1, largeEdge1, 1 - thickness, smallEdge2, largeEdge2); + Tile::addAABBs(level, x, y, z, box, boxes, source); + break; + } + setShape(0, 0, 0, 1, 1, 1); + +} + +void PistonExtensionTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr<TileEntity> forceEntity) // 4J added forceData, forceEntity param +{ + int data = (forceData == -1 ) ? level->getData(x, y, z) : forceData; + + const float thickness = PistonBaseTile::PLATFORM_THICKNESS / 16.0f; + + switch (getFacing(data)) + { + case Facing::DOWN: + setShape(0, 0, 0, 1, thickness, 1); + break; + case Facing::UP: + setShape(0, 1 - thickness, 0, 1, 1, 1); + break; + case Facing::NORTH: + setShape(0, 0, 0, 1, 1, thickness); + break; + case Facing::SOUTH: + setShape(0, 0, 1 - thickness, 1, 1, 1); + break; + case Facing::WEST: + setShape(0, 0, 0, thickness, 1, 1); + break; + case Facing::EAST: + setShape(1 - thickness, 0, 0, 1, 1, 1); + break; + } +} + +void PistonExtensionTile::neighborChanged(Level *level, int x, int y, int z, int type) +{ + int facing = getFacing(level->getData(x, y, z)); + int tile = level->getTile(x - Facing::STEP_X[facing], y - Facing::STEP_Y[facing], z - Facing::STEP_Z[facing]); + if (tile != Tile::pistonBase_Id && tile != Tile::pistonStickyBase_Id) + { + level->setTile(x, y, z, 0); + } + else + { + Tile::tiles[tile]->neighborChanged(level, x - Facing::STEP_X[facing], y - Facing::STEP_Y[facing], z - Facing::STEP_Z[facing], type); + } +} + +int PistonExtensionTile::getFacing(int data) +{ + return data & 0x7; +} + +int PistonExtensionTile::cloneTileId(Level *level, int x, int y, int z) +{ + return 0; +}
\ No newline at end of file |
