#pragma once #include #include #include #include "Chunk.h" #include "NetworkMessage.h" struct RequestQueue { Framework::InMemoryBuffer* request; Framework::Punkt chunkCenter; int sourceId; }; class Dimension : public Framework::Thread { private: int dimensionId; float gravity; Framework::Trie* chunks; Framework::Array chunkList; Framework::Critical chunkCs; Framework::RCArray* entities; Framework::Array waitingRequests; Framework::Critical cs; void getAddrOf(Framework::Punkt cPos, char* addr) const; void getAddrOfWorld(Framework::Punkt wPos, char* addr) const; Framework::Array> lightUpdateQueue; Framework::Array> priorizedLightUpdateQueue; Framework::Critical lightCs; Framework::Critical prioLightCs; Framework::RCArray removedChunks; Framework::Critical removedChunksCs; public: Dimension(int id); ~Dimension(); void api(Framework::InMemoryBuffer* zRequest, NetworkMessage* zResponse, Entity* zSource); void tickEntities(); void thread() override; Framework::Either zBlock(Framework::Vec3 location); Block* zRealBlockInstance(Framework::Vec3 location); const Block* zBlockOrDefault(Framework::Vec3 location); void placeBlock(Framework::Vec3 location, Framework::Either block); void addEntity(Entity* entity); void setChunk(Chunk* chunk, Framework::Punkt center); void save(Framework::Text worldDir) const; int getDimensionId() const; bool hasChunck(int x, int y); bool reviveChunk(int x, int y); Chunk* zChunk(Framework::Punkt wPos) const; float getGravity() const; void removeOldChunks(); Entity* zEntity(int id); Entity* zNearestEntity(Framework::Vec3 pos, std::function filter); void removeEntity(int id); void removeSubscriptions(Entity* zEntity); void updateLightning(Framework::Vec3 location); void updateLightningWithoutWait(Framework::Vec3 location); void updateLightAtChunkBorders(Framework::Punkt chunkCenter); };