#pragma once #include #include #include #include #include class MultiblockStructureType; class Block; class MultiblockStructureEnum { public: static const int TREE = 0; }; class MultiblockStructure : public virtual Framework::ReferenceCounter { private: Framework::Array affectedChunks; Framework::Array> memberBlockPositions; Framework::Vec3 uniquePosition; int dimensionId; __int64 structureId; int structureTypeId; bool isLoading; protected: Framework::RCArray loadedMembers; public: MultiblockStructure(int dimensionId, __int64 structureId, Framework::Vec3 uniquePosition, int structureTypeId); ~MultiblockStructure(); void onBlockLoaded(Block* block); void onBlockUnloaded(Block* zBlock); void addMemberPosition(Framework::Vec3 blockPos); virtual void onBlockRemoved(Block* zBlock); bool isEmpty() const; bool isFullyLoaded() const; bool isFullyUnloaded() const; bool isBlockMember(Block* zBlock) const; __int64 getStructureId() const; Framework::Vec3 getUniquePosition() const; int getStructureTypeId() const; friend MultiblockStructureType; }; class MultiblockStructureType : public Framework::ReferenceCounter { private: const int id; protected: MultiblockStructureType(int id); ~MultiblockStructureType(); virtual void loadSuperStructure(MultiblockStructure* zStructure, Framework::StreamReader* zReader) const; virtual void saveSuperStructure(MultiblockStructure* zStructure, Framework::StreamWriter* zWriter) const; virtual MultiblockStructure* createStructure(int dimensionId, __int64 structureId, Framework::Vec3 uniquePosition) const = 0; public: MultiblockStructure* loadStructure(int dimensionId, __int64 structureId, Framework::Vec3 uniquePosition, Framework::StreamReader* zReader) const; void saveStructure(MultiblockStructure* zStructure, Framework::StreamWriter* zWriter) const; int getId() const; };