Dimension.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #pragma once
  2. #include <Critical.h>
  3. #include <Either.h>
  4. #include <InMemoryBuffer.h>
  5. #include <Punkt.h>
  6. #include <Thread.h>
  7. #include <Trie.h>
  8. #include "Chunk.h"
  9. #include "Constants.h"
  10. #include "MultiblockStructure.h"
  11. #include "MultiblockStructureManager.h"
  12. class DimensionMap;
  13. class NetworkMessage;
  14. class Block;
  15. class DimensionEnum
  16. {
  17. public:
  18. static const int OVERWORLD = 0;
  19. };
  20. struct RequestQueue
  21. {
  22. Framework::InMemoryBuffer* request;
  23. Framework::Punkt chunkCenter;
  24. int sourceId;
  25. };
  26. class Dimension : public Framework::Thread
  27. {
  28. private:
  29. __int64 nextStructureId;
  30. int dimensionId;
  31. float gravity;
  32. Framework::RCTrie<Chunk>* chunks;
  33. Framework::Array<Chunk*> chunkList;
  34. Framework::Critical chunkCs;
  35. Framework::RCArray<Entity>* entities;
  36. Framework::Array<RequestQueue> waitingRequests;
  37. Framework::Critical cs;
  38. Framework::Array<Framework::Vec3<int>> lightUpdateQueue;
  39. Framework::Array<Framework::Vec3<int>> priorizedLightUpdateQueue;
  40. Framework::Critical lightCs;
  41. Framework::Critical prioLightCs;
  42. Framework::Critical structurCs;
  43. Framework::RCArray<Chunk> removedChunks;
  44. Framework::Critical removedChunksCs;
  45. Framework::RCArray<MultiblockStructure> structures;
  46. MultiblockStructureManager* structureManager;
  47. DimensionMap* map;
  48. bool stop;
  49. double currentDayTime;
  50. double nightDuration;
  51. double nightTransitionDuration;
  52. double dayDuration;
  53. void getAddrOf(Framework::Punkt cPos, char* addr) const;
  54. void getAddrOfWorld(Framework::Punkt wPos, char* addr) const;
  55. void saveStructure(MultiblockStructure* zStructure) const;
  56. public:
  57. Dimension(int id);
  58. ~Dimension();
  59. void configureDayNightCyncle(double nightDuration,
  60. double nightTransitionDuration,
  61. double dayDuration);
  62. void api(Framework::InMemoryBuffer* zRequest,
  63. NetworkMessage* zResponse,
  64. Entity* zSource);
  65. void tickEntities();
  66. void thread() override;
  67. Framework::Either<Block*, int> zBlock(
  68. Framework::Vec3<int> location, OUT Chunk** zChunk);
  69. Block* zRealBlockInstance(Framework::Vec3<int> location);
  70. const Block* zBlockOrDefault(Framework::Vec3<int> location);
  71. int getBlockType(Framework::Vec3<int> location);
  72. void placeBlock(
  73. Framework::Vec3<int> location, Framework::Either<Block*, int> block);
  74. void sendBlockInfo(Framework::Vec3<int> location);
  75. void addEntity(Entity* entity);
  76. void setChunk(Chunk* chunk, Framework::Punkt center);
  77. void save(Framework::Text worldDir) const;
  78. int getDimensionId() const;
  79. bool hasChunck(int x, int y);
  80. bool reviveChunk(int x, int y);
  81. Chunk* zChunk(Framework::Punkt wPos) const;
  82. float getGravity() const;
  83. void removeOldChunks();
  84. Entity* zEntity(int id);
  85. Entity* zNearestEntity(
  86. Framework::Vec3<float> pos, std::function<bool(Entity*)> filter);
  87. void removeEntity(int id);
  88. void removeSubscriptions(Entity* zEntity);
  89. void updateLightning(Framework::Vec3<int> location);
  90. void updateLightningWithoutWait(Framework::Vec3<int> location);
  91. void updateLightAtChunkBorders(Framework::Punkt chunkCenter);
  92. __int64 getNextStructureId();
  93. void addStructure(MultiblockStructure* structure);
  94. MultiblockStructure* zStructureByPosition(
  95. Framework::Vec3<int> uniquePosition);
  96. MultiblockStructure* zStructureById(__int64 id);
  97. void requestStopAndWait();
  98. void updateMap(int x, int y, int height);
  99. int getChunkCount();
  100. double getCurrentDayTime() const;
  101. double getNightDuration() const;
  102. double getNightTransitionDuration() const;
  103. double getDayDuration() const;
  104. inline static Framework::Vec3<int> chunkCoordinates(
  105. Framework::Vec3<int> worldLocation)
  106. {
  107. Framework::Vec3<int> result = worldLocation;
  108. result.x = result.x % CHUNK_SIZE;
  109. result.y = result.y % CHUNK_SIZE;
  110. if (result.x < 0) result.x += CHUNK_SIZE;
  111. if (result.y < 0) result.y += CHUNK_SIZE;
  112. return result;
  113. }
  114. friend DimensionMap;
  115. };