#pragma once #include "../Entity.h" #include "../Projectile.h" class Level; class CompoundTag; class Arrow : public Entity, public Projectile { public: eINSTANCEOF GetType() { return eTYPE_ARROW; } static Entity* create(Level* level) { return new Arrow(level); } private: // base damage, multiplied with velocity static const double ARROW_BASE_DAMAGE; public: static const int PICKUP_DISALLOWED = 0; static const int PICKUP_ALLOWED = 1; static const int PICKUP_CREATIVE_ONLY = 2; private: static const int ID_FLAGS = 16; static const int FLAG_CRIT = 1; private: int xTile; int yTile; int zTile; int lastTile; int lastData; bool inGround; public: int pickup; int shakeTime; std::shared_ptr owner; private: double baseDamage; int knockback; private: int life; int flightTime; // 4J - added common ctor code. void _init(); public: Arrow(Level* level); Arrow(Level* level, std::shared_ptr mob, std::shared_ptr target, float power, float uncertainty); Arrow(Level* level, double x, double y, double z); Arrow(Level* level, std::shared_ptr mob, float power); protected: virtual void defineSynchedData(); public: void shoot(double xd, double yd, double zd, float pow, float uncertainty); virtual void lerpTo(double x, double y, double z, float yRot, float xRot, int steps); virtual void lerpMotion(double xd, double yd, double zd); virtual void tick(); virtual void addAdditonalSaveData(CompoundTag* tag); virtual void readAdditionalSaveData(CompoundTag* tag); virtual void playerTouch(std::shared_ptr player); protected: virtual bool makeStepSound(); public: virtual float getShadowHeightOffs(); void setBaseDamage(double baseDamage); double getBaseDamage(); void setKnockback(int knockback); virtual bool isAttackable(); void setCritArrow(bool critArrow); bool isCritArrow(); };