| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- #include "Orientation.h"
- #include "BlockFilter.h"
- #include "Constants.h"
- #include "Game.h"
- #include "Chunk.h"
- OrientationConfig::OrientationConfig()
- : ReferenceCounter()
- {}
- AttachToNeighborOrientationConfig::AttachToNeighborOrientationConfig()
- : OrientationConfig(),
- validDirections(NO_DIRECTION),
- filter(0)
- {}
- AttachToNeighborOrientationConfig::~AttachToNeighborOrientationConfig()
- {
- if (filter)
- {
- filter->release();
- }
- }
- Direction AttachToNeighborOrientationConfig::calculateOrientation(
- Framework::Vec3<int> pos, int dimensionId, Chunk* zChunk) const
- {
- for (int i = 0; i < 6; i++)
- {
- Direction direction = getDirectionFromIndex(i);
- if ((validDirections & direction) != 0)
- {
- Framework::Vec3<int> neighborPos = pos + getDirection(direction);
- if (neighborPos.z >= 0 && neighborPos.z < WORLD_HEIGHT
- && Game::getChunkCenter(neighborPos.x, neighborPos.y) == zChunk->getCenter())
- {
- const Block* zNeighborBlock = zChunk->zBlockConstWC(
- neighborPos.x, neighborPos.y, neighborPos.z);
- if (zNeighborBlock && filter->test(zNeighborBlock))
- {
- return getOppositeDirection(direction);
- }
- }
- }
- }
- return NORTH;
- }
- void AttachToNeighborOrientationConfig::setValidDirections(
- Directions validDirections)
- {
- this->validDirections = validDirections;
- }
- Directions AttachToNeighborOrientationConfig::getValidDirections() const
- {
- return validDirections;
- }
- void AttachToNeighborOrientationConfig::setFilter(BlockFilter* filter)
- {
- if (this->filter)
- {
- this->filter->release();
- }
- this->filter = filter;
- }
- BlockFilter* AttachToNeighborOrientationConfig::zFilter() const
- {
- return filter;
- }
- AttachToNeighborOrientationConfigFactory::
- AttachToNeighborOrientationConfigFactory()
- : SubTypeFactory()
- {}
- AttachToNeighborOrientationConfig*
- AttachToNeighborOrientationConfigFactory::fromJson(
- Framework::JSON::JSONObject* zJson) const
- {
- AttachToNeighborOrientationConfig* result
- = new AttachToNeighborOrientationConfig();
- result->setFilter(Game::INSTANCE->zTypeRegistry()->fromJson<BlockFilter>(
- zJson->zValue("condition")));
- for (Framework::JSON::JSONValue* direction :
- *zJson->zValue("directions")->asArray())
- {
- Framework::Text dirStr = direction->asString()->getString();
- if (dirStr.isEqual("TOP"))
- {
- result->setValidDirections(
- result->getValidDirections() | Direction::TOP);
- }
- else if (dirStr.isEqual("BOTTOM"))
- {
- result->setValidDirections(
- result->getValidDirections() | Direction::BOTTOM);
- }
- else if (dirStr.isEqual("EAST"))
- {
- result->setValidDirections(
- result->getValidDirections() | Direction::EAST);
- }
- else if (dirStr.isEqual("NORTH"))
- {
- result->setValidDirections(
- result->getValidDirections() | Direction::NORTH);
- }
- else if (dirStr.isEqual("WEST"))
- {
- result->setValidDirections(
- result->getValidDirections() | Direction::WEST);
- }
- else if (dirStr.isEqual("SOUTH"))
- {
- result->setValidDirections(
- result->getValidDirections() | Direction::SOUTH);
- }
- }
- return result;
- }
- Framework::JSON::JSONObject*
- AttachToNeighborOrientationConfigFactory::toJsonObject(
- AttachToNeighborOrientationConfig* zObject) const
- {
- Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
- result->addValue("condition",
- Game::INSTANCE->zTypeRegistry()->toJson(zObject->zFilter()));
- Framework::JSON::JSONArray* directionsArray
- = new Framework::JSON::JSONArray();
- if (zObject->getValidDirections() & Direction::TOP)
- {
- directionsArray->addValue(new Framework::JSON::JSONString("TOP"));
- }
- if (zObject->getValidDirections() & Direction::BOTTOM)
- {
- directionsArray->addValue(new Framework::JSON::JSONString("BOTTOM"));
- }
- if (zObject->getValidDirections() & Direction::EAST)
- {
- directionsArray->addValue(new Framework::JSON::JSONString("EAST"));
- }
- if (zObject->getValidDirections() & Direction::NORTH)
- {
- directionsArray->addValue(new Framework::JSON::JSONString("NORTH"));
- }
- if (zObject->getValidDirections() & Direction::WEST)
- {
- directionsArray->addValue(new Framework::JSON::JSONString("WEST"));
- }
- if (zObject->getValidDirections() & Direction::SOUTH)
- {
- directionsArray->addValue(new Framework::JSON::JSONString("SOUTH"));
- }
- result->addValue("directions", directionsArray);
- return result;
- }
- JSONObjectValidationBuilder*
- AttachToNeighborOrientationConfigFactory::addToValidator(
- JSONObjectValidationBuilder* builder) const
- {
- Framework::JSON::JSONArray* defaultDirectionsArray
- = new Framework::JSON::JSONArray();
- defaultDirectionsArray->addValue(new Framework::JSON::JSONString("EAST"));
- defaultDirectionsArray->addValue(new Framework::JSON::JSONString("NORTH"));
- defaultDirectionsArray->addValue(new Framework::JSON::JSONString("WEST"));
- defaultDirectionsArray->addValue(new Framework::JSON::JSONString("SOUTH"));
- return builder
- ->withRequiredAttribute("condition",
- Game::INSTANCE->zTypeRegistry()->getValidator<BlockFilter>())
- ->withRequiredArray("directions")
- ->addAcceptedStringInArray()
- ->whichIsOneOf({"TOP", "BOTTOM", "EAST", "NORTH", "WEST", "SOUTH"})
- ->finishString()
- ->withDefault(defaultDirectionsArray)
- ->finishArray();
- }
- const char* AttachToNeighborOrientationConfigFactory::getTypeToken() const
- {
- return "attachToNeighbor";
- }
|