#pragma once #include "Block.h" #include "BlockType.h" #include "Item.h" #include "TypeRegistry.h" class BlockType; class ItemType; class BasicBlockType; class BasicBlock : public Block { public: BasicBlock(int typeId, Framework::Vec3 pos, int dimensionId); BasicBlock(int typeId, Framework::Vec3 pos, int dimensionId, bool hasInventory); virtual bool onTick( TickQueue* zQueue, int numTicks, bool& blocked) override; virtual void onPostTick() override; friend BasicBlockType; }; struct SpawnConfig { int min; int max; double chance; Framework::Text itemTypeName; int typeId; }; class BasicBlockType : public BlockType { private: Framework::Text itemTypeName; int itemTypeId; bool transparent; bool passable; float speedModifier; bool interactable; protected: virtual void createSuperBlock(Block* zBlock, Item* zItem) const override; public: BasicBlockType(Framework::Text itemTypeName, ModelInfo* model, Framework::Text name, int mapColor, bool modelSubscription, float hardness, Framework::RCArray groupNames); virtual bool initialize(Game* zGame) override; virtual Block* createBlock( Framework::Vec3 position, int dimensionId) const override; virtual Item* createItem() const override; Framework::Text getItemTypeName() const; virtual ItemType* createItemType() const override; int getItemTypeId() const; void setTransparent(bool transparent); bool isTransparent() const; void setPassable(bool passable); bool isPassable() const; void setSpeedModifier(float speedModifier); float getSpeedModifier() const; void setInteractable(bool interactable); }; class BasicBlockTypeFactory : public SubTypeFactory { public: BasicBlockTypeFactory(); BasicBlockType* fromJson(Framework::JSON::JSONObject* zJson) const override; Framework::JSON::JSONObject* toJson(BasicBlockType* 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 AdditionalItemSpawningBlock : public BasicBlock { private: Framework::Array spawns; public: AdditionalItemSpawningBlock(int typeId, Framework::Vec3 pos, int dimensionId); void addSpawn(SpawnConfig config); virtual void onDestroy() override; }; class AdditionalItemSpawningBlockType : public BasicBlockType { private: Framework::Array spawns; protected: virtual void createSuperBlock(Block* zBlock, Item* zItem) const override; public: AdditionalItemSpawningBlockType(Framework::Text itemTypeName, ModelInfo* model, Framework::Text name, int mapColor, bool modelSubscription, float hardness, Framework::Array spawns, Framework::RCArray groupNames); virtual bool initialize(Game* zGame) override; virtual Block* createBlock( Framework::Vec3 position, int dimensionId) const override; const Framework::Array& getSpawns() const; }; class AdditionalItemSpawningBlockTypeFactory : public SubTypeFactory { public: AdditionalItemSpawningBlockTypeFactory(); AdditionalItemSpawningBlockType* fromJson( Framework::JSON::JSONObject* zJson) const override; Framework::JSON::JSONObject* toJson( AdditionalItemSpawningBlockType* zObject) const override; Framework::JSON::Validator::JSONValidator* getValidator( Framework::JSON::Validator::ObjectValidationBuilder< Framework::JSON::Validator::JSONValidator>* builder) const override; Framework::Text getTypeToken() const override; };