#pragma once #include #include #include #include "Area.h" class Item; class BlockFilter; class PlaceableProof : public Framework::ReferenceCounter { public: PlaceableProof(); virtual bool isPlacable( const Item* item, Framework::Vec3 pos, int dimensionId) = 0; }; class PlaceableProofAnd : public PlaceableProof { private: Framework::RCArray proofs; public: PlaceableProofAnd(Framework::RCArray proofs); bool isPlacable( const Item* item, Framework::Vec3 pos, int dimensionId) override; const Framework::RCArray& getProofs() const; }; class PlaceableProofAndFactory : public SubTypeFactory { public: PlaceableProofAndFactory(); PlaceableProofAnd* fromJson( Framework::JSON::JSONObject* zJson) const override; Framework::JSON::JSONObject* toJson( PlaceableProofAnd* zObject) const override; Framework::JSON::Validator::JSONValidator* getValidator( Framework::JSON::Validator::ObjectValidationBuilder< Framework::JSON::Validator::JSONValidator>* builder) const override; Framework::Text getTypeToken() const override; }; class PlaceableProofOr : public PlaceableProof { private: Framework::RCArray proofs; public: PlaceableProofOr(Framework::RCArray proofs); bool isPlacable( const Item* item, Framework::Vec3 pos, int dimensionId) override; const Framework::RCArray& getProofs() const; }; class PlaceableProofOrFactory : public SubTypeFactory { public: PlaceableProofOrFactory(); PlaceableProofOr* fromJson( Framework::JSON::JSONObject* zJson) const override; Framework::JSON::JSONObject* toJson( PlaceableProofOr* zObject) const override; Framework::JSON::Validator::JSONValidator* getValidator( Framework::JSON::Validator::ObjectValidationBuilder< Framework::JSON::Validator::JSONValidator>* builder) const override; Framework::Text getTypeToken() const override; }; class PlaceableProofNot : public PlaceableProof { private: PlaceableProof* proof; public: PlaceableProofNot(PlaceableProof* proof); ~PlaceableProofNot(); bool isPlacable( const Item* item, Framework::Vec3 pos, int dimensionId) override; PlaceableProof* zProof() const; }; class PlaceableProofNotFactory : public SubTypeFactory { public: PlaceableProofNotFactory(); PlaceableProofNot* fromJson( Framework::JSON::JSONObject* zJson) const override; Framework::JSON::JSONObject* toJson( PlaceableProofNot* zObject) const override; Framework::JSON::Validator::JSONValidator* getValidator( Framework::JSON::Validator::ObjectValidationBuilder< Framework::JSON::Validator::JSONValidator>* builder) const override; Framework::Text getTypeToken() const override; }; class PlaceableProofBlockFilter : public PlaceableProof { private: Direction direction; int distance; BlockFilter* filter; public: PlaceableProofBlockFilter( Direction direction, int distance, BlockFilter* filter); ~PlaceableProofBlockFilter(); bool isPlacable( const Item* item, Framework::Vec3 pos, int dimensionId) override; Direction getDirection() const; int getDistance() const; BlockFilter* zFilter() const; }; class PlaceableProofBlockFilterFactory : public SubTypeFactory { public: PlaceableProofBlockFilterFactory(); PlaceableProofBlockFilter* fromJson( Framework::JSON::JSONObject* zJson) const override; Framework::JSON::JSONObject* toJson( PlaceableProofBlockFilter* zObject) const override; Framework::JSON::Validator::JSONValidator* getValidator( Framework::JSON::Validator::ObjectValidationBuilder< Framework::JSON::Validator::JSONValidator>* builder) const override; Framework::Text getTypeToken() const override; }; // TODO: add item Filter