#pragma once #include "Block.h" #include "DoLaterHandler.h" #include #include #include #include #include class Chunk : public virtual Framework::ReferenceCounter { private: int dimensionId; Framework::Punkt location; Block** blocks; Chunk* zNeighbours[4]; unsigned short* blockIds; Framework::Either zBlockNeighbor(Framework::Vec3 location); bool added; Framework::Critical cs; Framework::Array observers; Framework::Array lightSources; unsigned char* lightData; void addLightSource(int index); void removeLightSource(int index); void sendLightToClient(Framework::StreamWriter* zWriter); public: Chunk(Framework::Punkt location, int dimensionId); Chunk(Framework::Punkt location, int dimensionId, Framework::StreamReader* zReader); ~Chunk(); void notifyObservers(NetworkMessage* msg); void addObserver(Entity* zEntity, DoLaterHandler& laterHandler); void removeObserver(Entity* zEntity); void api(Framework::StreamReader* zRequest, Entity* zSource, DoLaterHandler& laterHandler); void initializeLightning(); Framework::Either zBlockAt(Framework::Vec3 cLocation) const; const Block* zBlockConst(Framework::Vec3 location) const; void instantiateBlock(Framework::Vec3 location); void generateBlock(Framework::Vec3 location); void putBlockAt(Framework::Vec3 location, Block* block); void putBlockTypeAt(Framework::Vec3 location, int type); void setNeighbor(Direction dir, Chunk* zChunk); void load(Framework::StreamReader* zReader); void save(Framework::StreamWriter* zWriter); void sendToClient(Framework::StreamWriter* zWriter); void removeUnusedBlocks(); int getDimensionId() const; Framework::Punkt getCenter() const; Framework::Vec3 getMin() const; Framework::Vec3 getMax() const; void prepareRemove(); void setAdded(); bool hasObservers() const; unsigned char* getLightData(Framework::Vec3 location) const; void setLightData(Framework::Vec3 location, unsigned char* data, bool foreground); };