Orientation.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #include "Orientation.h"
  2. #include "BlockFilter.h"
  3. #include "Constants.h"
  4. #include "Game.h"
  5. #include "Chunk.h"
  6. OrientationConfig::OrientationConfig()
  7. : ReferenceCounter()
  8. {}
  9. AttachToNeighborOrientationConfig::AttachToNeighborOrientationConfig()
  10. : OrientationConfig(),
  11. validDirections(NO_DIRECTION),
  12. filter(0)
  13. {}
  14. AttachToNeighborOrientationConfig::~AttachToNeighborOrientationConfig()
  15. {
  16. if (filter)
  17. {
  18. filter->release();
  19. }
  20. }
  21. Direction AttachToNeighborOrientationConfig::calculateOrientation(
  22. Framework::Vec3<int> pos, int dimensionId, Chunk* zChunk) const
  23. {
  24. for (int i = 0; i < 6; i++)
  25. {
  26. Direction direction = getDirectionFromIndex(i);
  27. if ((validDirections & direction) != 0)
  28. {
  29. Framework::Vec3<int> neighborPos = pos + getDirection(direction);
  30. if (neighborPos.z >= 0 && neighborPos.z < WORLD_HEIGHT
  31. && Game::getChunkCenter(neighborPos.x, neighborPos.y) == zChunk->getCenter())
  32. {
  33. const Block* zNeighborBlock = zChunk->zBlockConstWC(
  34. neighborPos.x, neighborPos.y, neighborPos.z);
  35. if (zNeighborBlock && filter->test(zNeighborBlock))
  36. {
  37. return getOppositeDirection(direction);
  38. }
  39. }
  40. }
  41. }
  42. return NORTH;
  43. }
  44. void AttachToNeighborOrientationConfig::setValidDirections(
  45. Directions validDirections)
  46. {
  47. this->validDirections = validDirections;
  48. }
  49. Directions AttachToNeighborOrientationConfig::getValidDirections() const
  50. {
  51. return validDirections;
  52. }
  53. void AttachToNeighborOrientationConfig::setFilter(BlockFilter* filter)
  54. {
  55. if (this->filter)
  56. {
  57. this->filter->release();
  58. }
  59. this->filter = filter;
  60. }
  61. BlockFilter* AttachToNeighborOrientationConfig::zFilter() const
  62. {
  63. return filter;
  64. }
  65. AttachToNeighborOrientationConfigFactory::
  66. AttachToNeighborOrientationConfigFactory()
  67. : SubTypeFactory()
  68. {}
  69. AttachToNeighborOrientationConfig*
  70. AttachToNeighborOrientationConfigFactory::fromJson(
  71. Framework::JSON::JSONObject* zJson) const
  72. {
  73. AttachToNeighborOrientationConfig* result
  74. = new AttachToNeighborOrientationConfig();
  75. result->setFilter(Game::INSTANCE->zTypeRegistry()->fromJson<BlockFilter>(
  76. zJson->zValue("condition")));
  77. for (Framework::JSON::JSONValue* direction :
  78. *zJson->zValue("directions")->asArray())
  79. {
  80. Framework::Text dirStr = direction->asString()->getString();
  81. if (dirStr.isEqual("TOP"))
  82. {
  83. result->setValidDirections(
  84. result->getValidDirections() | Direction::TOP);
  85. }
  86. else if (dirStr.isEqual("BOTTOM"))
  87. {
  88. result->setValidDirections(
  89. result->getValidDirections() | Direction::BOTTOM);
  90. }
  91. else if (dirStr.isEqual("EAST"))
  92. {
  93. result->setValidDirections(
  94. result->getValidDirections() | Direction::EAST);
  95. }
  96. else if (dirStr.isEqual("NORTH"))
  97. {
  98. result->setValidDirections(
  99. result->getValidDirections() | Direction::NORTH);
  100. }
  101. else if (dirStr.isEqual("WEST"))
  102. {
  103. result->setValidDirections(
  104. result->getValidDirections() | Direction::WEST);
  105. }
  106. else if (dirStr.isEqual("SOUTH"))
  107. {
  108. result->setValidDirections(
  109. result->getValidDirections() | Direction::SOUTH);
  110. }
  111. }
  112. return result;
  113. }
  114. Framework::JSON::JSONObject*
  115. AttachToNeighborOrientationConfigFactory::toJsonObject(
  116. AttachToNeighborOrientationConfig* zObject) const
  117. {
  118. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  119. result->addValue("condition",
  120. Game::INSTANCE->zTypeRegistry()->toJson(zObject->zFilter()));
  121. Framework::JSON::JSONArray* directionsArray
  122. = new Framework::JSON::JSONArray();
  123. if (zObject->getValidDirections() & Direction::TOP)
  124. {
  125. directionsArray->addValue(new Framework::JSON::JSONString("TOP"));
  126. }
  127. if (zObject->getValidDirections() & Direction::BOTTOM)
  128. {
  129. directionsArray->addValue(new Framework::JSON::JSONString("BOTTOM"));
  130. }
  131. if (zObject->getValidDirections() & Direction::EAST)
  132. {
  133. directionsArray->addValue(new Framework::JSON::JSONString("EAST"));
  134. }
  135. if (zObject->getValidDirections() & Direction::NORTH)
  136. {
  137. directionsArray->addValue(new Framework::JSON::JSONString("NORTH"));
  138. }
  139. if (zObject->getValidDirections() & Direction::WEST)
  140. {
  141. directionsArray->addValue(new Framework::JSON::JSONString("WEST"));
  142. }
  143. if (zObject->getValidDirections() & Direction::SOUTH)
  144. {
  145. directionsArray->addValue(new Framework::JSON::JSONString("SOUTH"));
  146. }
  147. result->addValue("directions", directionsArray);
  148. return result;
  149. }
  150. JSONObjectValidationBuilder*
  151. AttachToNeighborOrientationConfigFactory::addToValidator(
  152. JSONObjectValidationBuilder* builder) const
  153. {
  154. Framework::JSON::JSONArray* defaultDirectionsArray
  155. = new Framework::JSON::JSONArray();
  156. defaultDirectionsArray->addValue(new Framework::JSON::JSONString("EAST"));
  157. defaultDirectionsArray->addValue(new Framework::JSON::JSONString("NORTH"));
  158. defaultDirectionsArray->addValue(new Framework::JSON::JSONString("WEST"));
  159. defaultDirectionsArray->addValue(new Framework::JSON::JSONString("SOUTH"));
  160. return builder
  161. ->withRequiredAttribute("condition",
  162. Game::INSTANCE->zTypeRegistry()->getValidator<BlockFilter>())
  163. ->withRequiredArray("directions")
  164. ->addAcceptedStringInArray()
  165. ->whichIsOneOf({"TOP", "BOTTOM", "EAST", "NORTH", "WEST", "SOUTH"})
  166. ->finishString()
  167. ->withDefault(defaultDirectionsArray)
  168. ->finishArray();
  169. }
  170. const char* AttachToNeighborOrientationConfigFactory::getTypeToken() const
  171. {
  172. return "attachToNeighbor";
  173. }