123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- #pragma once
- #include <Array.h>
- #include <Datei.h>
- #include <Either.h>
- #include <Punkt.h>
- #include <Vec3.h>
- #include "Block.h"
- #include "Constants.h"
- #include "DoLaterHandler.h"
- #include "InformationObserver.h"
- #include "Tickable.h"
- class ChunkMap;
- class Chunk : public virtual Framework::ReferenceCounter,
- public Tickable
- {
- private:
- int dimensionId;
- Framework::Punkt location;
- Block** blocks;
- Chunk* zNeighbours[4];
- unsigned short* blockIds;
- Framework::Either<Block*, int> zBlockNeighbor(
- Framework::Vec3<int> location, OUT Chunk** zNeighborChunk);
- bool added;
- Framework::Critical cs;
- Framework::RCArray<InformationObserver> observers;
- Framework::Array<int> lightSources;
- Framework::Array<Block*> tickSourcesEachTick;
- Framework::Array<Block*> tickSourcesAfterUpdate;
- bool worldUpdated;
- unsigned char* lightData;
- bool currentlyLoading;
- void addLightSource(int index);
- void removeLightSource(int index);
- void sendLightToClient(Framework::StreamWriter* zWriter);
- void broadcastLightData(int index, bool foreground);
- const Block* zBlockConst(int index) const;
- bool isVisible(int index) const;
- public:
- Chunk(Framework::Punkt location, int dimensionId);
- Chunk(Framework::Punkt location,
- int dimensionId,
- Framework::StreamReader* zReader);
- ~Chunk();
- void lock();
- void unlock();
- void tick(TickQueue* zQueue) override;
- void postTick() override;
- 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<Block*, int> zBlockAt(
- Framework::Vec3<int> cLocation) const;
- const Block* zBlockConst(Framework::Vec3<int> location) const;
- void instantiateBlock(Framework::Vec3<int> location);
- void generateBlock(Framework::Vec3<int> location);
- void putBlockAt(Framework::Vec3<int> location, Block* block);
- void putBlockTypeAt(Framework::Vec3<int> location, int type);
- void sendBlockInfo(Framework::Vec3<int> location);
- 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;
- void onLoaded();
- void onUnloaded();
- Framework::Punkt getCenter() const;
- Framework::Vec3<int> getMin() const;
- Framework::Vec3<int> getMax() const;
- void prepareRemove();
- void setAdded();
- bool hasObservers() const;
- unsigned char* getLightData(Framework::Vec3<int> location) const;
- void setLightData(
- Framework::Vec3<int> location, unsigned char* data, bool foreground);
- int getBlockTypeAt(Framework::Vec3<int> location) const;
- void onEntityEnters(Entity* zEntity, Chunk* lastChunk);
- void onEntityLeaves(Entity* zEntity, Chunk* zNextChunk);
- bool hasObserver(int entityId) const;
- inline static int index(Framework::Vec3<int> localLocation)
- {
- return (localLocation.x * CHUNK_SIZE + localLocation.y) * WORLD_HEIGHT
- + localLocation.z;
- }
- friend ChunkMap;
- };
|