#pragma once #include "Tile.h" class Mob; class Player; class StairTile : public Tile { friend class Tile; private: static const int DEAD_SPACE_COLUMN_COUNT = 2; static int DEAD_SPACES[8][DEAD_SPACE_COLUMN_COUNT]; public: static const int UPSIDEDOWN_BIT = 4; // the direction is the way going up (for normal non-upsidedown stairs) static const int DIR_EAST = 0; static const int DIR_WEST = 1; static const int DIR_SOUTH = 2; static const int DIR_NORTH = 3; private: Tile *base; int basedata; bool isClipping; int clipStep; protected: StairTile(int id, Tile *base, int basedata); public: void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param bool isSolidRender(bool isServerLevel = false); bool isCubeShaped(); int getRenderShape(); void setBaseShape(LevelSource *level, int x, int y, int z); static bool isStairs(int id); private: bool isLockAttached(LevelSource *level, int x, int y, int z, int data); public: bool setStepShape(LevelSource *level, int x, int y, int z); bool setInnerPieceShape(LevelSource *level, int x, int y, int z); void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); /** DELEGATES: **/ public: void addLights(Level *level, int x, int y, int z); void animateTick(Level *level, int x, int y, int z, Random *random); void attack(Level *level, int x, int y, int z, shared_ptr player); void destroy(Level *level, int x, int y, int z, int data); int getLightColor(LevelSource *level, int x, int y, int z, int tileId = -1); float getBrightness(LevelSource *level, int x, int y, int z); float getExplosionResistance(shared_ptr source); int getRenderLayer(); Icon *getTexture(int face, int data); int getTickDelay(); AABB *getTileAABB(Level *level, int x, int y, int z); void handleEntityInside(Level *level, int x, int y, int z, shared_ptr e, Vec3 *current); bool mayPick(); bool mayPick(int data, bool liquid); bool mayPlace(Level *level, int x, int y, int z); void onPlace(Level *level, int x, int y, int z); void onRemove(Level *level, int x, int y, int z, int id, int data); void prepareRender(Level *level, int x, int y, int z); void stepOn(Level *level, int x, int y, int z, shared_ptr entity); void tick(Level *level, int x, int y, int z, Random *random); bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param void wasExploded(Level *level, int x, int y, int z); void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); HitResult *clip(Level *level, int xt, int yt, int zt, Vec3 *a, Vec3 *b); virtual void registerIcons(IconRegister *iconRegister); };