World.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include <cmath>
  2. #include "common/world/HighMap.h"
  3. #include "common/world/World.h"
  4. #include "utils/Random.h"
  5. World::World(const BlockRegistry& blockRegistry)
  6. : blockRegistry(blockRegistry), blocks(7, 7), dirty(true) {
  7. }
  8. void World::setBlock(int x, int y, int z, const Block& block) {
  9. blocks.set(x, y, z, block.getId());
  10. }
  11. const Block& World::getBlock(int x, int y, int z) const {
  12. return blockRegistry.getBlock(blocks.get(x, y, z));
  13. }
  14. int World::getSize() const {
  15. return blocks.getSize();
  16. }
  17. int World::getHeight() const {
  18. return blocks.getHeight();
  19. }
  20. void World::addPlayer(Player* p) {
  21. players.add(p);
  22. }
  23. List<CollisionBox> World::getBoxes(const CollisionBox& box) const {
  24. int minX = floorf(box.getMin()[0]);
  25. int minY = floorf(box.getMin()[1]);
  26. int minZ = floorf(box.getMin()[2]);
  27. int maxX = floorf(box.getMax()[0]);
  28. int maxY = floorf(box.getMax()[1]);
  29. int maxZ = floorf(box.getMax()[2]);
  30. List<CollisionBox> boxes;
  31. for(int x = minX; x <= maxX; x++) {
  32. for(int y = minY; y <= maxY; y++) {
  33. for(int z = minZ; z <= maxZ; z++) {
  34. getBlock(x, y, z).addBoxes(
  35. boxes, Vector3(static_cast<float>(x), static_cast<float>(y),
  36. static_cast<float>(z)));
  37. }
  38. }
  39. }
  40. return boxes;
  41. }
  42. void World::tick() {
  43. for(Player* p : players) {
  44. p->tick();
  45. Vector3 move = p->getVelocity();
  46. CollisionBox box = p->getCollisionBox();
  47. List<CollisionBox> boxes = getBoxes(box.expand(move));
  48. if(boxes.getLength() == 0) {
  49. p->move(move);
  50. continue;
  51. }
  52. Vector3 realMove;
  53. constexpr float step = 0.05f;
  54. while(move[0] != 0.0f || move[1] != 0.0f || move[2] != 0.0f) {
  55. Vector3 old = realMove;
  56. if(move[0] > step) {
  57. realMove[0] += step;
  58. move[0] -= step;
  59. } else if(move[0] < -step) {
  60. realMove[0] -= step;
  61. move[0] += step;
  62. } else if(move[0] != 0.0f) {
  63. realMove[0] += move[0];
  64. move[0] = 0.0f;
  65. }
  66. CollisionBox moved = box.offset(realMove);
  67. for(const CollisionBox& box : boxes) {
  68. if(box.collidesWith(moved)) {
  69. move[0] = 0.0f;
  70. realMove = old;
  71. break;
  72. }
  73. }
  74. old = realMove;
  75. if(move[1] > step) {
  76. realMove[1] += step;
  77. move[1] -= step;
  78. } else if(move[1] < -step) {
  79. realMove[1] -= step;
  80. move[1] += step;
  81. } else if(move[1] != 0.0f) {
  82. realMove[1] += move[1];
  83. move[1] = 0.0f;
  84. }
  85. moved = box.offset(realMove);
  86. for(const CollisionBox& box : boxes) {
  87. if(box.collidesWith(moved)) {
  88. move[1] = 0.0f;
  89. realMove = old;
  90. break;
  91. }
  92. }
  93. old = realMove;
  94. if(move[2] > step) {
  95. realMove[2] += step;
  96. move[2] -= step;
  97. } else if(move[2] < -step) {
  98. realMove[2] -= step;
  99. move[2] += step;
  100. } else if(move[2] != 0.0f) {
  101. realMove[2] += move[2];
  102. move[2] = 0.0f;
  103. }
  104. moved = box.offset(realMove);
  105. for(const CollisionBox& box : boxes) {
  106. if(box.collidesWith(moved)) {
  107. move[2] = 0.0f;
  108. realMove = old;
  109. break;
  110. }
  111. }
  112. }
  113. p->move(realMove);
  114. }
  115. }