Chunk.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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 "DoLaterHandler.h"
  9. #include "Tickable.h"
  10. class ChunkMap;
  11. class Chunk : public virtual Framework::ReferenceCounter,
  12. public Tickable
  13. {
  14. private:
  15. int dimensionId;
  16. Framework::Punkt location;
  17. Block** blocks;
  18. Chunk* zNeighbours[4];
  19. unsigned short* blockIds;
  20. Framework::Either<Block*, int> zBlockNeighbor(
  21. Framework::Vec3<int> location);
  22. bool added;
  23. Framework::Critical cs;
  24. Framework::Array<int> observers;
  25. Framework::Array<int> lightSources;
  26. Framework::Array<Block*> tickSources;
  27. unsigned char* lightData;
  28. bool currentlyLoading;
  29. void addLightSource(int index);
  30. void removeLightSource(int index);
  31. void sendLightToClient(Framework::StreamWriter* zWriter);
  32. void broadcastLightData(int index, bool foreground);
  33. public:
  34. Chunk(Framework::Punkt location, int dimensionId);
  35. Chunk(Framework::Punkt location,
  36. int dimensionId,
  37. Framework::StreamReader* zReader);
  38. ~Chunk();
  39. void lock();
  40. void unlock();
  41. void tick(TickQueue* zQueue) override;
  42. void postTick() override;
  43. void notifyObservers(NetworkMessage* msg);
  44. void addObserver(Entity* zEntity, DoLaterHandler& laterHandler);
  45. void removeObserver(Entity* zEntity);
  46. void api(Framework::StreamReader* zRequest,
  47. Entity* zSource,
  48. DoLaterHandler& laterHandler);
  49. void initializeLightning();
  50. Framework::Either<Block*, int> zBlockAt(
  51. Framework::Vec3<int> cLocation) const;
  52. const Block* zBlockConst(Framework::Vec3<int> location) const;
  53. void instantiateBlock(Framework::Vec3<int> location);
  54. void generateBlock(Framework::Vec3<int> location);
  55. void putBlockAt(Framework::Vec3<int> location, Block* block);
  56. void putBlockTypeAt(Framework::Vec3<int> location, int type);
  57. void sendBlockInfo(Framework::Vec3<int> location);
  58. void setNeighbor(Direction dir, Chunk* zChunk);
  59. void load(Framework::StreamReader* zReader);
  60. void save(Framework::StreamWriter* zWriter);
  61. void sendToClient(Framework::StreamWriter* zWriter);
  62. void removeUnusedBlocks();
  63. int getDimensionId() const;
  64. void onLoaded();
  65. void onUnloaded();
  66. Framework::Punkt getCenter() const;
  67. Framework::Vec3<int> getMin() const;
  68. Framework::Vec3<int> getMax() const;
  69. void prepareRemove();
  70. void setAdded();
  71. bool hasObservers() const;
  72. unsigned char* getLightData(Framework::Vec3<int> location) const;
  73. void setLightData(
  74. Framework::Vec3<int> location, unsigned char* data, bool foreground);
  75. friend ChunkMap;
  76. };