#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, std::shared_ptr forceEntity = std::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, std::shared_ptr source); /** DELEGATES: **/ public: virtual void addLights(Level* level, int x, int y, int z); virtual void animateTick(Level* level, int x, int y, int z, Random* random); virtual void attack(Level* level, int x, int y, int z, std::shared_ptr player); virtual void destroy(Level* level, int x, int y, int z, int data); virtual int getLightColor(LevelSource* level, int x, int y, int z, int tileId = -1); virtual float getBrightness(LevelSource* level, int x, int y, int z); virtual float getExplosionResistance(std::shared_ptr source); virtual int getRenderLayer(); virtual Icon* getTexture(int face, int data); virtual int getTickDelay(Level* level); virtual AABB getTileAABB(Level* level, int x, int y, int z); virtual void handleEntityInside(Level* level, int x, int y, int z, std::shared_ptr e, Vec3* current); virtual bool mayPick(); virtual bool mayPick(int data, bool liquid); virtual bool mayPlace(Level* level, int x, int y, int z); virtual void onPlace(Level* level, int x, int y, int z); virtual void onRemove(Level* level, int x, int y, int z, int id, int data); virtual void prepareRender(Level* level, int x, int y, int z); virtual void stepOn(Level* level, int x, int y, int z, std::shared_ptr entity); virtual void tick(Level* level, int x, int y, int z, Random* random); virtual bool use(Level* level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param virtual void wasExploded(Level* level, int x, int y, int z, Explosion* explosion); virtual void setPlacedBy(Level* level, int x, int y, int z, std::shared_ptr by, std::shared_ptr itemInstance); virtual int getPlacedOnFaceDataValue(Level* level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); virtual HitResult* clip(Level* level, int xt, int yt, int zt, Vec3* a, Vec3* b); virtual void registerIcons(IconRegister* iconRegister); };