Chunk.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #pragma once
  2. #include <Array.h>
  3. #include <Datei.h>
  4. #include <Either.h>
  5. #include <Punkt.h>
  6. #include <Vec3.h>
  7. #include "Block.h"
  8. #include "Constants.h"
  9. #include "DoLaterHandler.h"
  10. #include "Entity.h"
  11. #include "InformationObserver.h"
  12. #include "Tickable.h"
  13. class ChunkMap;
  14. class Chunk : public virtual Framework::ReferenceCounter,
  15. public Tickable
  16. {
  17. private:
  18. int dimensionId;
  19. Framework::Punkt location;
  20. Block*** blocks;
  21. Chunk* zNeighbours[4];
  22. unsigned short** blockIds;
  23. Framework::Either<Block*, int> zBlockNeighbor(
  24. Framework::Vec3<int> location, OUT Chunk** zNeighborChunk);
  25. bool added;
  26. Framework::Critical cs;
  27. Framework::RCArray<InformationObserver> observers;
  28. Framework::Array<int> lightSources;
  29. Framework::Array<Block*> tickSourcesEachTick;
  30. Framework::Array<Block*> tickSourcesAfterUpdate;
  31. bool worldUpdated;
  32. unsigned char* lightData;
  33. bool currentlyLoading;
  34. Framework::RCArray<Entity> entitiesInChunk;
  35. Framework::Array<int> lastSavedEntityIds;
  36. void addLightSource(int z, int index);
  37. void removeLightSource(int z, int index);
  38. void sendToClient(Framework::StreamWriter* zWriter, bool* instanceMap);
  39. void sendLightToClient(Framework::StreamWriter* zWriter, bool* instanceMap);
  40. void broadcastLightData(int z, int index, bool foreground);
  41. const Block* zBlockConst(int z, int index) const;
  42. bool isVisible(int z, int index) const;
  43. public:
  44. Chunk(Framework::Punkt location, int dimensionId);
  45. Chunk(Framework::Punkt location,
  46. int dimensionId,
  47. Framework::StreamReader* zReader);
  48. ~Chunk();
  49. void lock();
  50. void unlock();
  51. void tick(TickQueue* zQueue) override;
  52. void postTick() override;
  53. void notifyObservers(NetworkMessage* msg);
  54. void addObserver(Entity* zEntity, DoLaterHandler& laterHandler);
  55. void removeObserver(Entity* zEntity);
  56. void api(Framework::StreamReader* zRequest,
  57. Entity* zSource,
  58. DoLaterHandler& laterHandler);
  59. void initializeLightning();
  60. void updateLightSources();
  61. Framework::Either<Block*, int> zBlockAt(
  62. Framework::Vec3<int> cLocation) const;
  63. const Block* zBlockConst(Framework::Vec3<int> location) const;
  64. void instantiateBlock(Framework::Vec3<int> location);
  65. void generateBlock(Framework::Vec3<int> location);
  66. void putBlockAt(Framework::Vec3<int> location, Block* block);
  67. void putBlockTypeAt(Framework::Vec3<int> location, int type);
  68. void sendBlockInfo(Framework::Vec3<int> location);
  69. void setNeighbor(Direction dir, Chunk* zChunk);
  70. Chunk* zNeighbor(Direction dir) const;
  71. void load(Framework::StreamReader* zReader);
  72. void save(Framework::StreamWriter* zWriter,
  73. Framework::Array<Framework::Punkt>& otherChunksToSave);
  74. void removeUnusedBlocks();
  75. int getDimensionId() const;
  76. void onLoaded();
  77. void onUnloaded();
  78. Framework::Punkt getCenter() const;
  79. Framework::Vec3<int> getMin() const;
  80. Framework::Vec3<int> getMax() const;
  81. void prepareRemove();
  82. void setAdded();
  83. bool hasObservers() const;
  84. unsigned char* getLightData(Framework::Vec3<int> location) const;
  85. void setLightData(
  86. Framework::Vec3<int> location, unsigned char* data, bool foreground);
  87. int getBlockTypeAt(Framework::Vec3<int> location) const;
  88. int getBlockTypeAtWC(int x, int y, int z) const;
  89. void onEntityEnters(Entity* zEntity, Chunk* lastChunk);
  90. void onEntityLeaves(Entity* zEntity, Chunk* zNextChunk);
  91. bool hasObserver(int entityId) const;
  92. void addGeneratedEntity(Entity* entity);
  93. const Framework::RCArray<Entity>& getEntitiesInChunk() const;
  94. inline static int index(int x, int y)
  95. {
  96. return x * CHUNK_SIZE + y;
  97. }
  98. friend ChunkMap;
  99. };