Ver Fonte

improve json type system and add basic quest system

Kolja Strohm há 9 meses atrás
pai
commit
67001cf308

+ 14 - 2
FactoryCraft/BlockType.cpp

@@ -238,7 +238,8 @@ void BlockType::writeTypeInfo(StreamWriter* zWriter) const
     getModel().writeTo(zWriter);
 }
 
-bool BlockType::isFluid() const {
+bool BlockType::isFluid() const
+{
     return false;
 }
 
@@ -253,4 +254,15 @@ int BlockType::getTypeId(const char* name)
             return StaticRegistry<BlockType>::INSTANCE.zElement(i)->getId();
     }
     return 0;
-}
+}
+
+Framework::Text BlockType::getTypeName(int id)
+{
+    for (int i = 0; i < StaticRegistry<BlockType>::INSTANCE.getCount(); i++)
+    {
+        if (StaticRegistry<BlockType>::INSTANCE.zElement(i)
+            && StaticRegistry<BlockType>::INSTANCE.zElement(i)->getId() == id)
+            return StaticRegistry<BlockType>::INSTANCE.zElement(i)->getName();
+    }
+    return 0;
+}

+ 1 - 0
FactoryCraft/BlockType.h

@@ -105,6 +105,7 @@ public:
     virtual bool isFluid() const;
 
     static int getTypeId(const char* name);
+    static Framework::Text getTypeName(int id);
 };
 
 const Block* getDefaultBlock(Framework::Either<Block*, int> b);

+ 12 - 0
FactoryCraft/FactoryCraft.vcxproj

@@ -96,6 +96,7 @@
     <RemoteTargetPath>$(RemoteProjectDir)/$(TargetName)$(TargetExt)</RemoteTargetPath>
   </PropertyGroup>
   <ItemGroup>
+    <ClInclude Include="BlockInfoCommand.h" />
     <ClInclude Include="GeneratorRule.h" />
     <ClInclude Include="BlockTypeGeneratorRule.h" />
     <ClInclude Include="Chest.h" />
@@ -134,6 +135,7 @@
     <ClInclude Include="Grass.h" />
     <ClInclude Include="Chat.h" />
     <ClInclude Include="Hoe.h" />
+    <ClInclude Include="InformationObserver.h" />
     <ClInclude Include="Inventory.h" />
     <ClInclude Include="Item.h" />
     <ClInclude Include="ItemEntity.h" />
@@ -158,6 +160,10 @@
     <ClInclude Include="Player.h" />
     <ClInclude Include="PlayerHand.h" />
     <ClInclude Include="PlayerRegister.h" />
+    <ClInclude Include="Quest.h" />
+    <ClInclude Include="QuestEvent.h" />
+    <ClInclude Include="QuestRequirement.h" />
+    <ClInclude Include="QuestReward.h" />
     <ClInclude Include="RandNoise.h" />
     <ClInclude Include="Recipie.h" />
     <ClInclude Include="RecipieList.h" />
@@ -191,6 +197,7 @@
     <ClCompile Include="BasicTool.cpp" />
     <ClCompile Include="BiomGenerator.cpp" />
     <ClCompile Include="Block.cpp" />
+    <ClCompile Include="BlockInfoCommand.cpp" />
     <ClCompile Include="BlockType.cpp" />
     <ClCompile Include="BlockTypeGeneratorRule.cpp" />
     <ClCompile Include="CaveGenerator.cpp" />
@@ -219,6 +226,7 @@
     <ClCompile Include="GrantCommand.cpp" />
     <ClCompile Include="Grass.cpp" />
     <ClCompile Include="Hoe.cpp" />
+    <ClCompile Include="InformationObserver.cpp" />
     <ClCompile Include="Inventory.cpp" />
     <ClCompile Include="Item.cpp" />
     <ClCompile Include="ItemEntity.cpp" />
@@ -242,6 +250,10 @@
     <ClCompile Include="Player.cpp" />
     <ClCompile Include="PlayerHand.cpp" />
     <ClCompile Include="PlayerRegister.cpp" />
+    <ClCompile Include="Quest.cpp" />
+    <ClCompile Include="QuestEvent.cpp" />
+    <ClCompile Include="QuestRequirement.cpp" />
+    <ClCompile Include="QuestReward.cpp" />
     <ClCompile Include="RecipieList.cpp" />
     <ClCompile Include="RandNoise.cpp" />
     <ClCompile Include="Recipie.cpp" />

+ 39 - 0
FactoryCraft/FactoryCraft.vcxproj.filters

@@ -94,6 +94,9 @@
     <Filter Include="world\generator\biom\rules">
       <UniqueIdentifier>{3a03ed08-0a9d-4887-a1f0-d2a84028c425}</UniqueIdentifier>
     </Filter>
+    <Filter Include="quests">
+      <UniqueIdentifier>{5e0c1d26-c9fa-4935-9e93-67915bd2c0a9}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="Chunk.h">
@@ -351,6 +354,24 @@
     <ClInclude Include="TypeRegistry.h">
       <Filter>server\config</Filter>
     </ClInclude>
+    <ClInclude Include="Quest.h">
+      <Filter>quests</Filter>
+    </ClInclude>
+    <ClInclude Include="QuestEvent.h">
+      <Filter>quests</Filter>
+    </ClInclude>
+    <ClInclude Include="QuestRequirement.h">
+      <Filter>quests</Filter>
+    </ClInclude>
+    <ClInclude Include="QuestReward.h">
+      <Filter>quests</Filter>
+    </ClInclude>
+    <ClInclude Include="InformationObserver.h">
+      <Filter>server\response</Filter>
+    </ClInclude>
+    <ClInclude Include="BlockInfoCommand.h">
+      <Filter>chat\commands</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Server.cpp">
@@ -596,5 +617,23 @@
     <ClCompile Include="StructureCollection.cpp">
       <Filter>world\generator\templates</Filter>
     </ClCompile>
+    <ClCompile Include="Quest.cpp">
+      <Filter>quests</Filter>
+    </ClCompile>
+    <ClCompile Include="QuestEvent.cpp">
+      <Filter>quests</Filter>
+    </ClCompile>
+    <ClCompile Include="QuestRequirement.cpp">
+      <Filter>quests</Filter>
+    </ClCompile>
+    <ClCompile Include="QuestReward.cpp">
+      <Filter>quests</Filter>
+    </ClCompile>
+    <ClCompile Include="InformationObserver.cpp">
+      <Filter>server\response</Filter>
+    </ClCompile>
+    <ClCompile Include="BlockInfoCommand.cpp">
+      <Filter>chat\commands</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 8 - 7
FactoryCraft/Game.cpp

@@ -309,8 +309,7 @@ Game::Game(Framework::Text name, Framework::Text worldsDir)
       ticksPerSecond(0),
       totalTime(0)
 {
-    if (!DateiExistiert(worldsDir + "/" + name))
-        DateiPfadErstellen(worldsDir + "/" + name + "/");
+    if (!DateiExistiert(path)) DateiPfadErstellen(path + "/");
     Datei d;
     d.setDatei(path + "/eid");
     if (d.existiert())
@@ -542,8 +541,9 @@ void Game::api(Framework::InMemoryBuffer* zRequest, GameClient* zOrigin)
                 if (!dim)
                 {
                     std::cout << "ERROR: could not create dimension "
-							  << zOrigin->zEntity()->getDimensionId() << ". No Factory was provided.\n";
-					return;
+                              << zOrigin->zEntity()->getDimensionId()
+                              << ". No Factory was provided.\n";
+                    return;
                 }
                 addDimension(dim);
             }
@@ -757,10 +757,11 @@ GameClient* Game::addPlayer(FCKlient* client, Framework::Text name)
         if (!dim)
         {
             std::cout << "ERROR: could not create dimension "
-					  << (int)player->getDimensionId() << ". No Factory was provided.\n";
-			return 0;
+                      << (int)player->getDimensionId()
+                      << ". No Factory was provided.\n";
+            return 0;
         }
-        NetworkMessage *msg = new NetworkMessage();
+        NetworkMessage* msg = new NetworkMessage();
         msg->syncTime(dim->getCurrentDayTime(),
             dim->getNightDuration(),
             dim->getNightTransitionDuration(),

+ 1 - 5
FactoryCraft/GeneratorTemplate.cpp

@@ -32,8 +32,4 @@ Framework::Vec3<int> GeneratorTemplate::getMinAffectedOffset() const
 Framework::Vec3<int> GeneratorTemplate::getMaxAffectedOffset() const
 {
     return minPosOffset + maxSize;
-}
-
-GeneratorTemplateFactory::GeneratorTemplateFactory()
-    : ReferenceCounter()
-{}
+}

+ 0 - 10
FactoryCraft/GeneratorTemplate.h

@@ -27,14 +27,4 @@ public:
     float getPropability() const;
     Framework::Vec3<int> getMinAffectedOffset() const;
     Framework::Vec3<int> getMaxAffectedOffset() const;
-};
-
-class GeneratorTemplateFactory : public Framework::ReferenceCounter
-{
-public:
-    GeneratorTemplateFactory();
-    virtual GeneratorTemplate* createTemplate(
-        Framework::JSON::JSONValue* zConfig)
-        = 0;
-    virtual Framework::JSON::Validator::JSONValidator* getValidator() = 0;
 };

+ 717 - 0
FactoryCraft/Quest.cpp

@@ -0,0 +1,717 @@
+#include "Quest.h"
+
+QuestRequirementStorage::QuestRequirementStorage(Framework::Text requirementId)
+    : ReferenceCounter(),
+      requirementId(requirementId),
+      fulfilled(0),
+      data(new Framework::JSON::JSONObject())
+{}
+
+QuestRequirementStorage::~QuestRequirementStorage()
+{
+    data->release();
+}
+
+void QuestRequirementStorage::putValue(
+    Framework::Text key, Framework::JSON::JSONValue* value)
+{
+    data->removeValue(key);
+    data->addValue(key, value);
+}
+
+Framework::JSON::JSONValue* QuestRequirementStorage::getValue(
+    Framework::Text key) const
+{
+    return data->getValue(key);
+}
+
+Framework::JSON::JSONValue* QuestRequirementStorage::zValue(
+    Framework::Text key) const
+{
+    return data->zValue(key);
+}
+
+bool QuestRequirementStorage::containsKey(Framework::Text key) const
+{
+    return data->hasValue(key);
+}
+
+void QuestRequirementStorage::setFullfilled(bool fullfilled)
+{
+    this->fulfilled = fullfilled;
+}
+
+bool QuestRequirementStorage::isFullfilled() const
+{
+    return fulfilled;
+}
+
+const Framework::Text& QuestRequirementStorage::getRequirementId() const
+{
+    return requirementId;
+}
+
+QuestRequirementStorageType::QuestRequirementStorageType()
+    : TypeFactory<QuestRequirementStorage>()
+{}
+
+QuestRequirementStorage* QuestRequirementStorageType::fromJson(
+    Framework::JSON::JSONValue* zJson) const
+{
+    QuestRequirementStorage* result = new QuestRequirementStorage(
+        zJson->asObject()->zValue("requirementId")->asString()->getString());
+    result->setFullfilled(
+        zJson->asObject()->zValue("fulfilled")->asBool()->getBool());
+    result->data->release();
+    result->data = zJson->asObject()->getValue("data")->asObject();
+    return result;
+}
+
+Framework::JSON::JSONValue* QuestRequirementStorageType::toJSON(
+    QuestRequirementStorage* zObject) const
+{
+    Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
+    result->addValue("requirementId",
+        new Framework::JSON::JSONString(zObject->getRequirementId()));
+    result->addValue(
+        "fulfilled", new Framework::JSON::JSONBool(zObject->isFullfilled()));
+    Framework::Text dataString = zObject->data->toString();
+    result->addValue("data", Framework::JSON::Parser::getValue(dataString));
+    return result;
+}
+
+Framework::JSON::Validator::JSONValidator*
+QuestRequirementStorageType::getValidator() const
+{
+    return Framework::JSON::Validator::JSONValidator::buildForObject()
+        ->withRequiredString("requirementId")
+        ->finishString()
+        ->withRequiredBool("fulfilled")
+        ->withDefault(false)
+        ->finishBool()
+        ->withRequiredObject("data")
+        ->finishObject()
+        ->finishObject();
+}
+
+QuestStorage::QuestStorage(Framework::Text questId)
+    : questId(questId),
+      finished(0),
+      rewarded(0)
+{}
+
+void QuestStorage::setQuestFinished(bool finished)
+{
+    this->finished = finished;
+}
+
+void QuestStorage::setQuestRewarded(bool rewarded)
+{
+    this->rewarded = rewarded;
+}
+
+bool QuestStorage::isQuestFinished() const
+{
+    return finished;
+}
+
+bool QuestStorage::isQuestRewarded() const
+{
+    return rewarded;
+}
+
+QuestRequirementStorage* QuestStorage::zStorage(Framework::Text requirementId)
+{
+    for (QuestRequirementStorage* storage : requirements)
+    {
+        if (storage->getRequirementId().istGleich(requirementId))
+        {
+            return storage;
+        }
+    }
+    QuestRequirementStorage* result
+        = new QuestRequirementStorage(requirementId);
+    requirements.add(result);
+    return result;
+}
+
+const Framework::Text& QuestStorage::getQuestId() const
+{
+    return questId;
+}
+
+QuestStorageType::QuestStorageType()
+    : TypeFactory<QuestStorage>()
+{}
+
+QuestStorage* QuestStorageType::fromJson(
+    Framework::JSON::JSONValue* zJson) const
+{
+    QuestStorage* result = new QuestStorage(
+        zJson->asObject()->zValue("questId")->asString()->getString());
+    result->finished
+        = zJson->asObject()->zValue("finished")->asBool()->getBool();
+    result->rewarded
+        = zJson->asObject()->zValue("rewarded")->asBool()->getBool();
+    Framework::JSON::JSONArray* rewardsArray
+        = zJson->asObject()->zValue("requirements")->asArray();
+    for (int i = 0; i < rewardsArray->getLength(); i++)
+    {
+        result->requirements.add(
+            Game::INSTANCE->zTypeRegistry()->fromJson<QuestRequirementStorage>(
+                rewardsArray->zValue(i)->asObject()));
+    }
+    return result;
+}
+
+Framework::JSON::JSONValue* QuestStorageType::toJSON(
+    QuestStorage* zObject) const
+{
+    Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
+    result->addValue(
+        "questId", new Framework::JSON::JSONString(zObject->questId));
+    result->addValue(
+        "finished", new Framework::JSON::JSONBool(zObject->finished));
+    result->addValue(
+        "rewarded", new Framework::JSON::JSONBool(zObject->rewarded));
+    Framework::JSON::JSONArray* rewardsArray = new Framework::JSON::JSONArray();
+    for (QuestRequirementStorage* storage : zObject->requirements)
+    {
+        rewardsArray->addValue(
+            Game::INSTANCE->zTypeRegistry()->toJSON(storage));
+    }
+    result->addValue("requirements", rewardsArray);
+    return result;
+}
+
+Framework::JSON::Validator::JSONValidator*
+QuestStorageType::getValidator() const
+{
+    return Framework::JSON::Validator::JSONValidator::buildForObject()
+        ->withRequiredString("questId")
+        ->finishString()
+        ->withRequiredBool("finished")
+        ->withDefault(false)
+        ->finishBool()
+        ->withRequiredBool("rewarded")
+        ->withDefault(false)
+        ->finishBool()
+        ->withRequiredArray("requirements")
+        ->addAcceptedTypeInArray(Game::INSTANCE->zTypeRegistry()
+                                     ->getValidator<QuestRequirementStorage>())
+        ->finishArray()
+        ->finishObject();
+}
+
+QuestParty::QuestParty()
+    : ReferenceCounter()
+{}
+
+void QuestParty::addMember(int memberEntityId)
+{
+    memberEntityIds.add(memberEntityId);
+}
+
+void QuestParty::removeMember(int memberEntityId)
+{
+    memberEntityIds.removeValue(memberEntityId);
+}
+
+bool QuestParty::isMember(int memberEntityId) const
+{
+    return memberEntityIds.hat(memberEntityId);
+}
+
+bool QuestParty::isEmpty() const
+{
+    return memberEntityIds.getEintragAnzahl() == 0;
+}
+
+QuestStorage* QuestParty::zQuestStorage(Framework::Text questId)
+{
+    for (QuestStorage* storage : questStorage)
+    {
+        if (storage->getQuestId().istGleich(questId))
+        {
+            return storage;
+        }
+    }
+    QuestStorage* result = new QuestStorage(questId);
+    questStorage.add(result);
+    return result;
+}
+
+QuestParty* QuestParty::clone() const
+{
+    QuestParty* result = new QuestParty();
+    for (QuestStorage* storage : questStorage)
+    {
+        Framework::JSON::JSONValue* value
+            = Game::INSTANCE->zTypeRegistry()->toJSON(storage);
+        result->questStorage.add(
+            Game::INSTANCE->zTypeRegistry()->fromJson<QuestStorage>(value));
+        value->release();
+    }
+    return result;
+}
+
+QuestPartyType::QuestPartyType()
+    : TypeFactory<QuestParty>()
+{}
+
+QuestParty* QuestPartyType::fromJson(
+    Framework::JSON::JSONValue* zJson) const
+{
+    QuestParty* result = new QuestParty();
+    Framework::JSON::JSONArray* membersArray
+        = zJson->asObject()->zValue("members")->asArray();
+    for (int i = 0; i < membersArray->getLength(); i++)
+    {
+        result->memberEntityIds.add(
+            (int)membersArray->zValue(i)->asNumber()->getNumber());
+    }
+    Framework::JSON::JSONArray* storagesArray
+        = zJson->asObject()->zValue("quests")->asArray();
+    for (int i = 0; i < storagesArray->getLength(); i++)
+    {
+        result->questStorage.add(
+            Game::INSTANCE->zTypeRegistry()->fromJson<QuestStorage>(
+                storagesArray->zValue(i)->asObject()));
+    }
+    return result;
+}
+
+Framework::JSON::JSONValue* QuestPartyType::toJSON(
+    QuestParty* zObject) const
+{
+    Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
+    Framework::JSON::JSONArray* membersArray = new Framework::JSON::JSONArray();
+    for (int memberEntityId : zObject->memberEntityIds)
+    {
+        membersArray->addValue(new Framework::JSON::JSONNumber(memberEntityId));
+    }
+    result->addValue("members", membersArray);
+    Framework::JSON::JSONArray* storagesArray
+        = new Framework::JSON::JSONArray();
+    for (QuestStorage* storage : zObject->questStorage)
+    {
+        storagesArray->addValue(
+            Game::INSTANCE->zTypeRegistry()->toJSON(storage));
+    }
+    result->addValue("quests", storagesArray);
+    return result;
+}
+
+Framework::JSON::Validator::JSONValidator* QuestPartyType::getValidator() const
+{
+    return Framework::JSON::Validator::JSONValidator::buildForObject()
+        ->withRequiredArray("members")
+        ->addAcceptedNumberInArray()
+        ->finishNumber()
+        ->removeInvalidEntries()
+        ->finishArray()
+        ->withRequiredArray("quests")
+        ->addAcceptedTypeInArray(
+            Game::INSTANCE->zTypeRegistry()->getValidator<QuestStorage>())
+        ->removeInvalidEntries()
+        ->finishArray()
+        ->finishObject();
+}
+
+Quest::Quest(Framework::Text questId)
+    : ReferenceCounter(),
+      questId(questId)
+{}
+
+void Quest::processEvent(QuestEvent* zEvent, QuestStorage* zStorage)
+{
+    bool finished = 1;
+    for (QuestRequirement* requirement : requirements)
+    {
+        QuestRequirementStorage* zRequirementStorage
+            = zStorage->zStorage(requirement->getRequirementId());
+        if (!zRequirementStorage->isFullfilled())
+        {
+            requirement->processEvent(zEvent, zRequirementStorage);
+            finished &= zRequirementStorage->isFullfilled();
+        }
+    }
+    if (finished)
+    {
+        zStorage->setQuestFinished(1);
+    }
+}
+
+bool Quest::isVisible(QuestParty* zParty)
+{
+    bool visible = 1;
+    for (Framework::Text* requiredQuestId : requiredQuestsIds)
+    {
+        visible &= zParty->zQuestStorage(*requiredQuestId)->isQuestFinished();
+    }
+    return visible;
+}
+
+void Quest::giveReward(
+    int choice, Entity* zTargetEntity, QuestStorage* zStorage)
+{
+    if (!zStorage->isQuestFinished() || zStorage->isQuestRewarded())
+    {
+        return;
+    }
+    rewards.z(choice)->giveReward(zTargetEntity);
+    zStorage->setQuestRewarded(1);
+}
+
+const Framework::Text& Quest::getQuestId() const
+{
+    return questId;
+}
+
+QuestType::QuestType()
+    : TypeFactory<Quest>()
+{}
+
+Quest* QuestType::fromJson(Framework::JSON::JSONValue* zJson) const
+{
+    Quest* result = new Quest(
+        zJson->asObject()->zValue("questId")->asString()->getString());
+    result->questName
+        = zJson->asObject()->zValue("questName")->asString()->getString();
+    Framework::JSON::JSONArray* requiredQuestIdsArray
+        = zJson->asObject()->zValue("requiredQuestIds")->asArray();
+    for (int i = 0; i < requiredQuestIdsArray->getLength(); i++)
+    {
+        result->requiredQuestsIds.add(new Framework::Text(
+            requiredQuestIdsArray->zValue(i)->asString()->getString()));
+    }
+    Framework::JSON::JSONArray* requirementsArray
+        = zJson->asObject()->zValue("requirements")->asArray();
+    for (int i = 0; i < requirementsArray->getLength(); i++)
+    {
+        result->requirements.add(
+            Game::INSTANCE->zTypeRegistry()->fromJson<QuestRequirement>(
+                requirementsArray->zValue(i)));
+    }
+    Framework::JSON::JSONArray* rewardsArray
+        = zJson->asObject()->zValue("rewards")->asArray();
+    for (int i = 0; i < rewardsArray->getLength(); i++)
+    {
+        result->rewards.add(
+            Game::INSTANCE->zTypeRegistry()->fromJson<QuestReward>(
+                requirementsArray->zValue(i)));
+    }
+    return result;
+}
+
+Framework::JSON::JSONValue* QuestType::toJSON(Quest* zObject) const
+{
+    Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
+    result->addValue(
+        "questId", new Framework::JSON::JSONString(zObject->questId));
+    result->addValue(
+        "questName", new Framework::JSON::JSONString(zObject->questName));
+    Framework::JSON::JSONArray* requiredQuestIdsArray
+        = new Framework::JSON::JSONArray();
+    for (Framework::Text* requiredQuestId : zObject->requiredQuestsIds)
+    {
+        requiredQuestIdsArray->addValue(
+            new Framework::JSON::JSONString(*requiredQuestId));
+    }
+    result->addValue("requiredQuestIds", requiredQuestIdsArray);
+    Framework::JSON::JSONArray* requirementsArray
+        = new Framework::JSON::JSONArray();
+    for (QuestRequirement* requirement : zObject->requirements)
+    {
+        requirementsArray->addValue(requirement->getAsJSON());
+    }
+    result->addValue("requirements", requirementsArray);
+    Framework::JSON::JSONArray* rewardsArray = new Framework::JSON::JSONArray();
+    for (QuestReward* reward : zObject->rewards)
+    {
+        rewardsArray->addValue(reward->getAsJSON());
+    }
+    return result;
+}
+
+Framework::JSON::Validator::JSONValidator* QuestType::getValidator() const
+{
+    return Framework::JSON::Validator::JSONValidator::buildForObject()
+        ->withRequiredString("questId")
+        ->finishString()
+        ->withRequiredString("questName")
+        ->finishString()
+        ->withRequiredArray("requiredQuestIds")
+        ->addAcceptedStringInArray()
+        ->finishString()
+        ->finishArray()
+        ->withRequiredArray("requirements")
+        ->addAcceptedTypeInArray(
+            Game::INSTANCE->zTypeRegistry()->getValidator<QuestRequirement>())
+        ->finishArray()
+        ->withRequiredArray("rewards")
+        ->addAcceptedTypeInArray(
+            Game::INSTANCE->zTypeRegistry()->getValidator<QuestReward>())
+        ->finishArray()
+        ->finishObject();
+}
+
+QuestCollection::QuestCollection(Framework::Text name)
+    : ReferenceCounter(),
+      name(name)
+{}
+
+void QuestCollection::processEvent(QuestEvent* zEvent, QuestParty* zParty)
+{
+    for (Quest* quest : quests)
+    {
+        QuestStorage* zStorage = zParty->zQuestStorage(quest->getQuestId());
+        if (quest->isVisible(zParty) && !zStorage->isQuestFinished())
+        {
+            quest->processEvent(zEvent, zStorage);
+        }
+    }
+}
+
+bool QuestCollection::isVisible(QuestParty* zParty)
+{
+    bool visible = 1;
+    for (Quest* quest : quests)
+    {
+        visible &= quest->isVisible(zParty);
+    }
+    return visible;
+}
+
+void QuestCollection::giveReward(Framework::Text questId,
+    int choice,
+    Entity* zTargetEntity,
+    QuestParty* zParty)
+{
+    QuestStorage* zStorage = zParty->zQuestStorage(questId);
+    if (zStorage->isQuestRewarded() || !zStorage->isQuestFinished())
+    {
+        return;
+    }
+    for (Quest* quest : quests)
+    {
+        if (quest->getQuestId() == questId)
+        {
+            quest->giveReward(choice, zTargetEntity, zStorage);
+            return;
+        }
+    }
+}
+
+void QuestCollection::addQuest(Quest* zQuest)
+{
+    quests.add(zQuest);
+}
+
+QuestCollectionType::QuestCollectionType()
+    : TypeFactory<QuestCollection>()
+{}
+
+QuestCollection* QuestCollectionType::fromJson(
+    Framework::JSON::JSONValue* zJson) const
+{
+    QuestCollection* result = new QuestCollection(
+        zJson->asObject()->zValue("name")->asString()->getString());
+    Framework::JSON::JSONArray* questsArray
+        = zJson->asObject()->zValue("quests")->asArray();
+    for (int i = 0; i < questsArray->getLength(); i++)
+    {
+        result->quests.add(Game::INSTANCE->zTypeRegistry()->fromJson<Quest>(
+            questsArray->zValue(i)->asObject()));
+    }
+    return result;
+}
+
+Framework::JSON::JSONValue* QuestCollectionType::toJSON(
+    QuestCollection* zObject) const
+{
+    Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
+    result->addValue("name", new Framework::JSON::JSONString(zObject->name));
+    Framework::JSON::JSONArray* questsArray = new Framework::JSON::JSONArray();
+    for (Quest* quest : zObject->quests)
+    {
+        questsArray->addValue(Game::INSTANCE->zTypeRegistry()->toJSON(quest));
+    }
+    result->addValue("quests", questsArray);
+    return result;
+}
+
+Framework::JSON::Validator::JSONValidator*
+QuestCollectionType::getValidator() const
+{
+    return Framework::JSON::Validator::JSONValidator::buildForObject()
+        ->withRequiredString("name")
+        ->finishString()
+        ->withRequiredArray("quests")
+        ->addAcceptedTypeInArray(
+            Game::INSTANCE->zTypeRegistry()->getValidator<Quest>())
+        ->removeInvalidEntries()
+        ->finishArray()
+        ->finishObject();
+}
+
+QuestManager::QuestManager()
+    : ReferenceCounter()
+{}
+
+void QuestManager::loadQuests()
+{
+    Framework::Text worldDir = Game::INSTANCE->getWorldDirectory();
+    Framework::Text questDir = worldDir + "/quests";
+    if (!Framework::DateiExistiert(questDir))
+    {
+        std::cout << "no quest data found in world save, using default data\n";
+        questDir = "data/quests";
+    }
+    Framework::JSON::JSONValue* value
+        = Framework::JSON::loadJSONFromFile(questDir + "/quests.json");
+    if (!value || value->getType() == Framework::JSON::JSONType::NULL_)
+    {
+        std::cout << "No valid quests.json found in " << questDir << "\n";
+        if (value)
+        {
+            value->release();
+        }
+    }
+    else
+    {
+        std::cout << "loading quests ...\n";
+        Framework::JSON::Validator::JSONValidator* validator
+            = Framework::JSON::Validator::JSONValidator::buildForArray()
+                  ->addAcceptedTypeInArray(
+                      Game::INSTANCE->zTypeRegistry()
+                          ->getValidator<QuestCollection>())
+                  ->removeInvalidEntries()
+                  ->finishArray();
+        Framework::RCArray<Framework::JSON::Validator::JSONValidationResult>
+            validationResult;
+        Framework::JSON::JSONArray* valid
+            = validator->getValidParts(value, &validationResult)->asArray();
+        for (Framework::JSON::Validator::JSONValidationResult* invalidPart :
+            validationResult)
+        {
+            invalidPart->printInvalidInfo();
+        }
+        value->release();
+        for (Framework::JSON::JSONValue* validPart : *valid)
+        {
+            questCollections.add(
+                Game::INSTANCE->zTypeRegistry()->fromJson<QuestCollection>(
+                    validPart->asObject()));
+        }
+        valid->release();
+        validator->release();
+    }
+    value = Framework::JSON::loadJSONFromFile(questDir + "/parties.json");
+    if (!value || value->getType() == Framework::JSON::JSONType::NULL_)
+    {
+        if (value)
+        {
+            value->release();
+        }
+    }
+    else
+    {
+        std::cout << "loading quest parties ...\n";
+        Framework::JSON::Validator::JSONValidator* validator
+            = Framework::JSON::Validator::JSONValidator::buildForArray()
+                  ->addAcceptedTypeInArray(Game::INSTANCE->zTypeRegistry()
+                                               ->getValidator<QuestParty>())
+                  ->removeInvalidEntries()
+                  ->finishArray();
+        Framework::RCArray<Framework::JSON::Validator::JSONValidationResult>
+            validationResult;
+        Framework::JSON::JSONArray* valid
+            = validator->getValidParts(value, &validationResult)->asArray();
+        for (Framework::JSON::Validator::JSONValidationResult* invalidPart :
+            validationResult)
+        {
+            invalidPart->printInvalidInfo();
+        }
+        value->release();
+        for (Framework::JSON::JSONValue* validPart : *valid)
+        {
+            parties.add(Game::INSTANCE->zTypeRegistry()->fromJson<QuestParty>(
+                validPart->asObject()));
+        }
+        valid->release();
+        validator->release();
+    }
+    std::cout << "Loaded " << questCollections.getEintragAnzahl()
+              << " Quest Collections and " << parties.getEintragAnzahl()
+              << " Quest Parties\n";
+}
+
+void QuestManager::saveQuests()
+{
+    Framework::Text worldDir = Game::INSTANCE->getWorldDirectory();
+    Framework::Text questDir = worldDir + "/quests";
+    if (!Framework::DateiExistiert(questDir))
+    {
+        Framework::DateiPfadErstellen(questDir + "/");
+    }
+    Framework::JSON::JSONArray* questCollectionsArray
+        = new Framework::JSON::JSONArray();
+    for (QuestCollection* questCollection : questCollections)
+    {
+        questCollectionsArray->addValue(
+            Game::INSTANCE->zTypeRegistry()->toJSON(questCollection));
+    }
+    Datei datei(questDir + "/quests.json");
+    if (!datei.existiert()) datei.erstellen();
+    datei.open(Framework::Datei::Style::schreiben);
+    Framework::Text jsonStr = questCollectionsArray->toString();
+    datei.schreibe(jsonStr.getText(), jsonStr.getLength());
+    datei.close();
+    questCollectionsArray->release();
+    Framework::JSON::JSONArray* partiesArray = new Framework::JSON::JSONArray();
+    for (QuestParty* party : parties)
+    {
+        partiesArray->addValue(Game::INSTANCE->zTypeRegistry()->toJSON(party));
+    }
+    datei.setDatei(questDir + "/parties.json");
+    if (!datei.existiert()) datei.erstellen();
+    datei.open(Framework::Datei::Style::schreiben);
+    jsonStr = partiesArray->toString();
+    datei.schreibe(jsonStr.getText(), jsonStr.getLength());
+    datei.close();
+    partiesArray->release();
+}
+
+void QuestManager::processEvent(QuestEvent* zEvent)
+{
+    Entity* zEntity = zEvent->zActingEntity();
+    for (QuestParty* party : parties)
+    {
+        if (party->isMember(zEntity->getId()))
+        {
+            for (QuestCollection* questCollection : questCollections)
+            {
+                questCollection->processEvent(zEvent, party);
+            }
+            return;
+        }
+    }
+}
+
+void QuestManager::giveReward(
+    Framework::Text questId, int choice, Entity* zTargetEntity)
+{
+    for (QuestParty* party : parties)
+    {
+        if (party->isMember(zTargetEntity->getId()))
+        {
+            for (QuestCollection* questCollection : questCollections)
+            {
+                questCollection->giveReward(
+                    questId, choice, zTargetEntity, party);
+            }
+            return;
+        }
+    }
+}

+ 188 - 0
FactoryCraft/Quest.h

@@ -0,0 +1,188 @@
+#pragma once
+
+#include <JSON.h>
+
+#include "Game.h"
+#include "QuestEvent.h"
+#include "QuestRequirement.h"
+#include "QuestReward.h"
+#include "TypeRegistry.h"
+
+class QuestRequirementStorageType;
+
+class QuestRequirementStorage : public virtual Framework::ReferenceCounter
+{
+private:
+    Framework::Text requirementId;
+    bool fulfilled;
+    Framework::JSON::JSONObject* data;
+
+public:
+    QuestRequirementStorage(Framework::Text requirementId);
+    ~QuestRequirementStorage();
+
+    void putValue(Framework::Text key, Framework::JSON::JSONValue* value);
+    Framework::JSON::JSONValue* getValue(Framework::Text key) const;
+    Framework::JSON::JSONValue* zValue(Framework::Text key) const;
+    bool containsKey(Framework::Text key) const;
+    void setFullfilled(bool fullfilled);
+    bool isFullfilled() const;
+    const Framework::Text& getRequirementId() const;
+
+    friend QuestRequirementStorageType;
+};
+
+class QuestRequirementStorageType : public TypeFactory<QuestRequirementStorage>
+{
+public:
+    QuestRequirementStorageType();
+    QuestRequirementStorage* fromJson(
+        Framework::JSON::JSONValue* zJson) const override;
+    Framework::JSON::JSONValue* toJSON(
+        QuestRequirementStorage* zObject) const override;
+    Framework::JSON::Validator::JSONValidator* getValidator() const override;
+};
+
+class QuestStorageType;
+
+class QuestStorage : public virtual Framework::ReferenceCounter
+{
+private:
+    Framework::Text questId;
+    bool finished;
+    bool rewarded;
+    Framework::RCArray<QuestRequirementStorage> requirements;
+
+public:
+    QuestStorage(Framework::Text questId);
+
+    void setQuestFinished(bool finished);
+    void setQuestRewarded(bool rewarded);
+    bool isQuestFinished() const;
+    bool isQuestRewarded() const;
+    QuestRequirementStorage* zStorage(Framework::Text requirementId);
+    const Framework::Text& getQuestId() const;
+
+    friend QuestStorageType;
+};
+
+class QuestStorageType : public TypeFactory<QuestStorage>
+{
+public:
+    QuestStorageType();
+    QuestStorage* fromJson(
+        Framework::JSON::JSONValue* zJson) const override;
+    Framework::JSON::JSONValue* toJSON(
+        QuestStorage* zObject) const override;
+    Framework::JSON::Validator::JSONValidator* getValidator() const override;
+};
+
+class QuestPartyType;
+
+class QuestParty : public virtual Framework::ReferenceCounter
+{
+private:
+    Framework::Array<int> memberEntityIds;
+    Framework::RCArray<QuestStorage> questStorage;
+
+public:
+    QuestParty();
+
+    void addMember(int memberEntityId);
+    void removeMember(int memberEntityId);
+    bool isMember(int memberEntityId) const;
+    bool isEmpty() const;
+    QuestStorage* zQuestStorage(Framework::Text questId);
+    QuestParty* clone() const;
+
+    friend QuestPartyType;
+};
+
+class QuestPartyType : public TypeFactory<QuestParty>
+{
+public:
+    QuestPartyType();
+    QuestParty* fromJson(Framework::JSON::JSONValue* zJson) const override;
+    Framework::JSON::JSONValue* toJSON(QuestParty* zObject) const override;
+    Framework::JSON::Validator::JSONValidator* getValidator() const override;
+};
+
+class QuestType;
+
+class Quest : public virtual Framework::ReferenceCounter
+{
+private:
+    Framework::Text questId;
+    Framework::Text questName;
+    Framework::RCArray<Framework::Text> requiredQuestsIds;
+    Framework::RCArray<QuestRequirement> requirements;
+    Framework::RCArray<QuestReward> rewards;
+
+public:
+    Quest(Framework::Text questId);
+
+    void processEvent(QuestEvent* zEvent, QuestStorage* zStorage);
+    bool isVisible(QuestParty* zParty);
+    void giveReward(int choice, Entity* zTargetEntity, QuestStorage* zStorage);
+    const Framework::Text& getQuestId() const;
+
+    friend QuestType;
+};
+
+class QuestType : public TypeFactory<Quest>
+{
+public:
+    QuestType();
+    Quest* fromJson(Framework::JSON::JSONValue* zJson) const override;
+    Framework::JSON::JSONValue* toJSON(Quest* zObject) const override;
+    Framework::JSON::Validator::JSONValidator* getValidator() const override;
+};
+
+class QuestCollectionType;
+
+class QuestCollection : public virtual Framework::ReferenceCounter
+{
+private:
+    Framework::Text name;
+    Framework::RCArray<Quest> quests;
+
+public:
+    QuestCollection(Framework::Text name);
+
+    void processEvent(QuestEvent* zEvent, QuestParty* zParty);
+    bool isVisible(QuestParty* zParty);
+    void giveReward(Framework::Text questId,
+        int choice,
+        Entity* zTargetEntity,
+        QuestParty* zParty);
+    void addQuest(Quest* zQuest);
+
+    friend QuestCollectionType;
+};
+
+class QuestCollectionType : public TypeFactory<QuestCollection>
+{
+public:
+    QuestCollectionType();
+    QuestCollection* fromJson(
+        Framework::JSON::JSONValue* zJson) const override;
+    Framework::JSON::JSONValue* toJSON(
+        QuestCollection* zObject) const override;
+    Framework::JSON::Validator::JSONValidator* getValidator() const override;
+};
+
+class QuestManager : public virtual Framework::ReferenceCounter
+{
+private:
+    Framework::RCArray<QuestCollection> questCollections;
+    Framework::RCArray<QuestParty> parties;
+
+public:
+    QuestManager();
+
+    void loadQuests();
+    void saveQuests();
+
+    void processEvent(QuestEvent* zEvent);
+    void giveReward(Framework::Text questId, int choice, Entity* zTargetEntity);
+};

+ 16 - 0
FactoryCraft/QuestEvent.cpp

@@ -0,0 +1,16 @@
+#include "QuestEvent.h"
+
+QuestEvent::QuestEvent(Entity* actingEntity)
+    : ReferenceCounter(),
+      actingEntity(actingEntity)
+{}
+
+QuestEvent::~QuestEvent()
+{
+    actingEntity->release();
+}
+
+Entity* QuestEvent::zActingEntity() const
+{
+    return actingEntity;
+}

+ 45 - 0
FactoryCraft/QuestEvent.h

@@ -0,0 +1,45 @@
+#pragma once
+
+#include "Entity.h"
+
+class QuestEvent: public virtual Framework::ReferenceCounter
+{
+private:
+    Entity* actingEntity;
+
+public:
+    QuestEvent(Entity* actingEntity);
+    ~QuestEvent();
+
+    Entity* zActingEntity() const;
+};
+
+class QuestEventBlockBreak : public QuestEvent
+{
+
+};
+
+class QuestEventBlockPlace : public QuestEvent
+{
+
+};
+
+class QuestEventBlockInteract : public QuestEvent
+{
+
+};
+
+class QuestEventTimeUpdate : public QuestEvent
+{
+
+};
+
+class QuestEventCraft : public QuestEvent
+{
+
+};
+
+class QuestEventItemPickup : public QuestEvent
+{
+
+};

+ 11 - 0
FactoryCraft/QuestRequirement.cpp

@@ -0,0 +1,11 @@
+#include "QuestRequirement.h"
+
+QuestRequirement::QuestRequirement(Framework::Text id)
+	: ReferenceCounter(),
+	  id(id)
+{}
+
+const Framework::Text& QuestRequirement::getRequirementId() const
+{
+	return id;
+}

+ 36 - 0
FactoryCraft/QuestRequirement.h

@@ -0,0 +1,36 @@
+#pragma once
+
+#include "QuestEvent.h"
+
+class QuestRequirementStorage;
+
+class QuestRequirement : public virtual Framework::ReferenceCounter
+{
+private:
+    Framework::Text id;
+
+public:
+    QuestRequirement(Framework::Text id);
+    virtual bool processEvent(
+        QuestEvent* zEvent, QuestRequirementStorage* zStorage)
+        = 0;
+    virtual Framework::JSON::JSONObject* getAsJSON() const = 0;
+    const Framework::Text& getRequirementId() const;
+};
+
+class QuestRequirementBlockBreak : public QuestRequirement
+{
+
+};
+
+class QuestRequirementBlockPlace : public QuestRequirement
+{};
+
+class QuestRequirementBlockInteract : public QuestRequirement
+{};
+
+class QuestRequirementCraft : public QuestRequirement
+{};
+
+class QuestRequirementItemInInventory : public QuestRequirement
+{};

+ 11 - 0
FactoryCraft/QuestReward.cpp

@@ -0,0 +1,11 @@
+#include "QuestReward.h"
+
+QuestReward::QuestReward(Framework::Text rewardId)
+	: ReferenceCounter(),
+	  rewardId(rewardId)
+{}
+
+const Framework::Text& QuestReward::getRewardId() const
+{
+	return rewardId;
+}

+ 22 - 0
FactoryCraft/QuestReward.h

@@ -0,0 +1,22 @@
+#pragma once
+
+#include "Entity.h"
+
+class QuestReward : public virtual Framework::ReferenceCounter
+{
+private:
+	Framework::Text rewardId;
+
+public:
+    QuestReward(Framework::Text rewardId);
+
+    virtual void giveReward(Entity* zTargetEntity) = 0;
+    virtual Framework::JSON::JSONObject* getAsJSON() const = 0;
+
+    const Framework::Text& getRewardId() const;
+};
+
+class QuestRewardItem : public QuestReward
+{
+
+};

+ 2 - 2
FactoryCraft/StructureCollection.cpp

@@ -20,7 +20,7 @@ StructureTemplateCollection::StructureTemplateCollection(
         *zConfig->asObject()->zValue("structures")->asArray())
     {
         GeneratorTemplate* templ
-            = Game::INSTANCE->zTypeRegistry()->createGeneratorTemplate(value);
+            = Game::INSTANCE->zTypeRegistry()->fromJson<GeneratorTemplate>(value);
         if (first)
         {
             minAffected = templ->getMinAffectedOffset();
@@ -120,7 +120,7 @@ StructureTemplateCollection::getConfigValidator()
             "condition", JExpressionParser::getBoolValidator())
         ->withRequiredArray("structures")
         ->addAcceptedTypeInArray(
-            Game::INSTANCE->zTypeRegistry()->getGeneratorTemplateValidator())
+            Game::INSTANCE->zTypeRegistry()->getValidator<GeneratorTemplate>())
         ->finishArray()
         ->finishObject();
 }

+ 33 - 10
FactoryCraft/TreeTemplate.cpp

@@ -84,11 +84,11 @@ const BlockType* TreeTemplate::getLeavesType() const
 }
 
 TreeTemplateFactory::TreeTemplateFactory()
-    : GeneratorTemplateFactory()
+    : SubTypeFactory<GeneratorTemplate, TreeTemplate>()
 {}
 
-GeneratorTemplate* TreeTemplateFactory::createTemplate(
-    Framework::JSON::JSONValue* zConfig)
+TreeTemplate* TreeTemplateFactory::fromJson(
+    Framework::JSON::JSONObject* zConfig) const
 {
     return new TreeTemplate((float)zConfig->asObject()
                                 ->zValue("propability")
@@ -98,14 +98,32 @@ GeneratorTemplate* TreeTemplateFactory::createTemplate(
             zConfig->asObject()->zValue("wood")->asString()->getString()),
         BlockType::getTypeId(
             zConfig->asObject()->zValue("leaves")->asString()->getString()),
-        (int)(round(zConfig->asObject()
-                  ->zValue("minSize")
-                  ->asNumber()
-                  ->getNumber())),
-        (int)(round(zConfig->asObject()->zValue("maxSize")->asNumber()->getNumber())));
+        (int)(round(
+            zConfig->asObject()->zValue("minSize")->asNumber()->getNumber())),
+        (int)(round(
+            zConfig->asObject()->zValue("maxSize")->asNumber()->getNumber())));
 }
 
-Framework::JSON::Validator::JSONValidator* TreeTemplateFactory::getValidator()
+Framework::JSON::JSONObject* TreeTemplateFactory::toJSON(
+    TreeTemplate* zObject) const
+{
+    Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
+    result->addValue(
+        "propability", new Framework::JSON::JSONNumber((double)zObject->getPropability()));
+    result->addValue("wood", new Framework::JSON::JSONString(BlockType::getTypeName(zObject->woodBlockTypeId)));
+    result->addValue("leaves",
+        new Framework::JSON::JSONString(
+            BlockType::getTypeName(zObject->leaveBlockType)));
+    result->addValue(
+        "minSize", new Framework::JSON::JSONNumber((double)zObject->minHeight));
+    result->addValue(
+        "maxSize", new Framework::JSON::JSONNumber((double)zObject->maxHeight));
+    return result;
+}
+
+Framework::JSON::Validator::JSONValidator* TreeTemplateFactory::getValidator(
+    Framework::JSON::Validator::ObjectValidationBuilder<
+        Framework::JSON::Validator::JSONValidator>* builder) const
 {
     Framework::RCArray<Framework::Text> blockTypeNames;
     for (int i = 0; i < StaticRegistry<BlockType>::INSTANCE.getCount(); i++)
@@ -116,7 +134,7 @@ Framework::JSON::Validator::JSONValidator* TreeTemplateFactory::getValidator()
                 StaticRegistry<BlockType>::INSTANCE.zElement(i)->getName()));
         }
     }
-    return Framework::JSON::Validator::JSONValidator::buildForObject()
+    return builder
         ->withRequiredString("type")
         ->withExactMatch("Tree")
         ->finishString()
@@ -136,4 +154,9 @@ Framework::JSON::Validator::JSONValidator* TreeTemplateFactory::getValidator()
         ->whichIsGreaterThen(0)
         ->finishNumber()
         ->finishObject();
+}
+
+Framework::Text TreeTemplateFactory::getTypeToken() const
+{
+    return "Tree";
 }

+ 12 - 5
FactoryCraft/TreeTemplate.h

@@ -1,6 +1,7 @@
 #pragma once
 
 #include "GeneratorTemplate.h"
+#include "TypeRegistry.h"
 
 class TreeTemplate : public GeneratorTemplate
 {
@@ -20,13 +21,19 @@ public:
         Framework::Vec3<int> location, Noise* zNoise, int dimensionId) override;
     const BlockType* getWoodType() const;
     const BlockType* getLeavesType() const;
+
+    friend class TreeTemplateFactory;
 };
 
-class TreeTemplateFactory : public GeneratorTemplateFactory
+class TreeTemplateFactory
+    : public SubTypeFactory<GeneratorTemplate, TreeTemplate>
 {
 public:
-	TreeTemplateFactory();
-    GeneratorTemplate* createTemplate(
-		Framework::JSON::JSONValue* zConfig) override;
-    Framework::JSON::Validator::JSONValidator* getValidator() override;
+    TreeTemplateFactory();
+    TreeTemplate* fromJson(Framework::JSON::JSONObject* zConfig) const override;
+    Framework::JSON::JSONObject* toJSON(TreeTemplate* zObject) const override;
+    Framework::JSON::Validator::JSONValidator* getValidator(
+        Framework::JSON::Validator::ObjectValidationBuilder<
+            Framework::JSON::Validator::JSONValidator>* builder) const override;
+    virtual Framework::Text getTypeToken() const override;
 };

+ 10 - 35
FactoryCraft/TypeRegistry.cpp

@@ -5,6 +5,7 @@
 #include "OverworldDimensionGenerator.h"
 #include "TreeTemplate.h"
 #include "OverworldDimension.h"
+#include "Quest.h"
 
 TypeRegistry::TypeRegistry()
     : ReferenceCounter()
@@ -17,7 +18,15 @@ TypeRegistry::TypeRegistry()
     registerGeneratorRuleFactory(new BlockTypeGeneratorRuleFactory());
     registerGeneratorRuleFactory(new BlockInstanceGeneratorRuleFactory());
     // register templates
-    registerGeneratorTemplate(new TreeTemplateFactory());
+    registerSubType<GeneratorTemplate, TreeTemplate>(new TreeTemplateFactory());
+
+    // register quest datastructures
+    registerType<QuestRequirementStorage>(
+		new QuestRequirementStorageType());
+    registerType<QuestStorage>(new QuestStorageType());
+    registerType<QuestParty>(new QuestPartyType());
+    registerType<Quest>(new QuestType());
+    registerType<QuestCollection>(new QuestCollectionType());
 }
 
 void TypeRegistry::registerGeneratorRuleFactory(GeneratorRuleFactory* factory)
@@ -112,38 +121,4 @@ Dimension* TypeRegistry::createDimension(int id)
 		}
     }
     return 0;
-}
-
-void TypeRegistry::registerGeneratorTemplate(GeneratorTemplateFactory* factory)
-{
-    generatorTemplates.add(factory);
-}
-
-GeneratorTemplate* TypeRegistry::createGeneratorTemplate(
-    Framework::JSON::JSONValue* zConfig)
-{
-    for (GeneratorTemplateFactory* f : generatorTemplates)
-    {
-        Framework::JSON::Validator::JSONValidator* validator
-            = f->getValidator();
-        if (validator->isValid(zConfig))
-        {
-            validator->release();
-            return f->createTemplate(zConfig);
-        }
-        validator->release();
-    }
-    return 0;
-}
-
-Framework::JSON::Validator::JSONValidator*
-TypeRegistry::getGeneratorTemplateValidator()
-{
-    auto validator = Framework::JSON::Validator::JSONValidator::buildForOneOf()
-                         ->typeSpecifiedByAttribute("type");
-    for (GeneratorTemplateFactory* f : generatorTemplates)
-    {
-        validator->addAcceptedType(f->getValidator());
-    }
-    return validator->finishOneOf();
 }

+ 335 - 7
FactoryCraft/TypeRegistry.h

@@ -1,9 +1,243 @@
 #pragma once
 
+#include <cstdlib>
+#include <JSON.h>
+#include <typeinfo>
+
+#include "Dimension.h"
 #include "DimensionGenerator.h"
 #include "GeneratorRule.h"
-#include "GeneratorTemplate.h"
-#include "Dimension.h"
+
+class TypeRegistry;
+
+/*
+ * Used to convert an object of type T to a JSONValue and vice versa.
+ * Can be registered at the TypeRegistry to be used by the JSON system
+ */
+template<typename T> class TypeFactory : public Framework::ReferenceCounter
+{
+public:
+    TypeFactory()
+        : ReferenceCounter(){};
+    virtual T* fromJson(Framework::JSON::JSONValue* zJson) const = 0;
+    virtual Framework::JSON::JSONValue* toJSON(T* zObject) const = 0;
+    virtual Framework::JSON::Validator::JSONValidator* getValidator() const = 0;
+};
+
+/*
+ * Used to convert an object of type S witch inherits from type T to a JSONValue
+ * and vice versa. Can be registered at the TypeRegistry to be used by the JSON
+ */
+template<typename T,
+    typename S,
+    typename = std::enable_if<std::is_base_of<T, S>::value>>
+class SubTypeFactory : public Framework::ReferenceCounter
+{
+public:
+    SubTypeFactory()
+        : ReferenceCounter(){};
+
+    virtual S* fromJson(Framework::JSON::JSONObject* zJson) const = 0;
+    virtual Framework::JSON::JSONObject* toJSON(S* zObject) const = 0;
+    virtual Framework::JSON::Validator::JSONValidator* getValidator(
+        Framework::JSON::Validator::ObjectValidationBuilder<
+            Framework::JSON::Validator::JSONValidator>* builder) const
+        = 0;
+    virtual Framework::Text getTypeToken() const = 0;
+};
+
+template<typename T> class SubTypeFactoryRef
+    : public Framework::ReferenceCounter
+{
+private:
+    Framework::Text typetoken;
+    std::function<T*(Framework::JSON::JSONObject*)> fromJsonFunc;
+    std::function<Framework::JSON::JSONObject*(T*)> toJsonFunc;
+    std::function<Framework::JSON::Validator::JSONValidator*(
+        Framework::JSON::Validator::ObjectValidationBuilder<
+            Framework::JSON::Validator::JSONValidator>*)>
+        getValidatorFunc;
+    Framework::ReferenceCounter* factory;
+
+public:
+    SubTypeFactoryRef(Framework::Text typetoken,
+        std::function<T*(Framework::JSON::JSONObject*)> fromJsonFunc,
+        std::function<Framework::JSON::JSONObject*(T*)> toJsonFunc,
+        std::function<Framework::JSON::Validator::JSONValidator*(
+            Framework::JSON::Validator::ObjectValidationBuilder<
+                Framework::JSON::Validator::JSONValidator>*)> getValidatorFunc,
+        Framework::ReferenceCounter* factory)
+        : ReferenceCounter(),
+          typetoken(typetoken),
+          fromJsonFunc(fromJsonFunc),
+          toJsonFunc(toJsonFunc),
+          getValidatorFunc(getValidatorFunc),
+          factory(factory)
+    {}
+
+    ~SubTypeFactoryRef()
+    {
+        factory->release();
+    }
+
+    T* fromJson(Framework::JSON::JSONObject* zJson) const
+    {
+        return fromJsonFunc(zJson);
+    }
+
+    Framework::JSON::JSONObject* toJSON(T* zObject) const
+    {
+        return toJsonFunc(zObject);
+    }
+
+    Framework::JSON::Validator::JSONValidator* getValidator(
+        Framework::JSON::Validator::ObjectValidationBuilder<
+            Framework::JSON::Validator::JSONValidator>* builder) const
+    {
+        return getValidatorFunc(builder);
+    }
+
+    const Framework::Text& getTypetoken() const
+    {
+        return typetoken;
+    }
+};
+
+template<typename T> class PolymorphTypeFactory : public TypeFactory<T>
+{
+private:
+    Framework::RCArray<SubTypeFactoryRef<T>> factories;
+
+public:
+    PolymorphTypeFactory()
+        : TypeFactory<T>()
+    {}
+
+    T* fromJson(Framework::JSON::JSONValue* zJson) const override
+    {
+        for (SubTypeFactoryRef<T>* factory : factories)
+        {
+            if (zJson->asObject()
+                    ->zValue("type")
+                    ->asString()
+                    ->getString()
+                    .istGleich(factory->getTypetoken()))
+            {
+                return factory->fromJson(zJson->asObject());
+            }
+        }
+        return 0;
+    }
+
+    Framework::JSON::JSONValue* toJSON(T* zObject) const override
+    {
+        for (SubTypeFactoryRef<T>* factory : factories)
+        {
+            Framework::JSON::JSONObject* result = factory->toJSON(zObject);
+            if (result)
+            {
+                result->addValue("type",
+                    new Framework::JSON::JSONString(factory->getTypetoken()));
+                return result;
+            }
+        }
+        return 0;
+    }
+
+    Framework::JSON::Validator::JSONValidator* getValidator() const override
+    {
+        auto validator
+            = Framework::JSON::Validator::JSONValidator::buildForOneOf()
+                  ->typeSpecifiedByAttribute("type");
+        for (SubTypeFactoryRef<T>* factory : factories)
+        {
+            validator = validator->addAcceptedType(factory->getValidator(
+                Framework::JSON::Validator::JSONValidator::buildForObject()
+                    ->withRequiredString("type")
+                    ->withExactMatch(factory->getTypetoken())
+                    ->finishString()));
+        }
+        return validator->finishOneOf();
+    }
+
+    template<typename S,
+        typename = std::enable_if<std::is_base_of<T, S>::value>>
+    void addFactory(SubTypeFactory<T, S>* factory)
+    {
+        factories.add(new SubTypeFactoryRef<T>(
+            factory->getTypeToken(),
+            [factory](Framework::JSON::JSONObject* zJson) {
+                S* value = factory->fromJson(zJson);
+                if (value)
+                {
+                    return dynamic_cast<T*>(factory->fromJson(zJson));
+                }
+                return (T*)0;
+            },
+            [factory](T* zObject) {
+                S* value = dynamic_cast<S*>(zObject);
+                if (value)
+                {
+                    return factory->toJSON(value);
+                }
+                return (Framework::JSON::JSONObject*)0;
+            },
+            [factory](Framework::JSON::Validator::ObjectValidationBuilder<
+                Framework::JSON::Validator::JSONValidator>* builder) {
+                return factory->getValidator(builder);
+            },
+            dynamic_cast<Framework::ReferenceCounter*>(factory)));
+    }
+};
+
+class TypeFatoryRef : public Framework::ReferenceCounter
+{
+private:
+    std::function<void*(Framework::JSON::JSONValue*)> fromJsonFunc;
+    std::function<Framework::JSON::JSONValue*(void*)> toJsonFunc;
+    std::function<Framework::JSON::Validator::JSONValidator*()>
+        getValidatorFunc;
+    Framework::ReferenceCounter* factory;
+
+public:
+    TypeFatoryRef(
+        std::function<void*(Framework::JSON::JSONValue*)> fromJsonFunc,
+        std::function<Framework::JSON::JSONValue*(void*)> toJsonFunc,
+        std::function<Framework::JSON::Validator::JSONValidator*()>
+            getValidatorFunc,
+        Framework::ReferenceCounter* factory)
+        : ReferenceCounter(),
+          fromJsonFunc(fromJsonFunc),
+          toJsonFunc(toJsonFunc),
+          getValidatorFunc(getValidatorFunc),
+          factory(factory)
+    {}
+
+    ~TypeFatoryRef()
+    {
+        factory->release();
+    }
+
+    void* fromJson(Framework::JSON::JSONValue* zJson) const
+    {
+        return fromJsonFunc(zJson);
+    }
+
+    Framework::JSON::JSONValue* toJSON(void* zObject) const
+    {
+        return toJsonFunc(zObject);
+    }
+
+    Framework::JSON::Validator::JSONValidator* getValidator() const
+    {
+        return getValidatorFunc();
+    }
+
+    template<typename T> TypeFactory<T>* zFactory() const
+    {
+        return (TypeFactory<T>*)(factory);
+    }
+};
 
 class TypeRegistry : public Framework::ReferenceCounter
 {
@@ -11,7 +245,7 @@ private:
     Framework::RCArray<GeneratorRuleFactory> generatorRules;
     Framework::RCArray<DimensionGeneratorFactory> dimensionGenerators;
     Framework::RCArray<DimensionFactory> dimensionFactories;
-    Framework::RCArray<GeneratorTemplateFactory> generatorTemplates;
+    Framework::RCTrie<TypeFatoryRef> parsableTypes;
 
 public:
     TypeRegistry();
@@ -31,8 +265,102 @@ public:
     void registerDimension(DimensionFactory* factory);
     Dimension* createDimension(int id);
 
-    void registerGeneratorTemplate(GeneratorTemplateFactory* factory);
-    GeneratorTemplate* createGeneratorTemplate(
-        Framework::JSON::JSONValue* zConfig);
-    Framework::JSON::Validator::JSONValidator* getGeneratorTemplateValidator();
+    template<typename T,
+        typename S,
+        typename = std::enable_if<std::is_base_of<T, S>::value>>
+    void registerSubType(SubTypeFactory<T, S>* factory)
+    {
+        Framework::Text typeId = typeid(T).name();
+        TypeFatoryRef* typeFactoryRef
+            = parsableTypes.z(typeId, typeId.getLength());
+        if (!typeFactoryRef)
+        {
+            PolymorphTypeFactory<T>* polymorphFactory
+                = new PolymorphTypeFactory<T>();
+            registerType(polymorphFactory);
+            typeFactoryRef = parsableTypes.z(typeId, typeId.getLength());
+        }
+        PolymorphTypeFactory<T>* polymorphFactory
+            = dynamic_cast<PolymorphTypeFactory<T>*>(
+                typeFactoryRef->zFactory<T>());
+        if (!polymorphFactory)
+        {
+            throw Framework::Text("Type not registered as Polymorphic type: ")
+                + typeId;
+        }
+        polymorphFactory->addFactory<S>(factory);
+    }
+
+    template<typename T> void registerType(TypeFactory<T>* factory)
+    {
+        Framework::Text typeId = typeid(T).name();
+        TypeFatoryRef* typeFactoryRef
+            = parsableTypes.z(typeId, typeId.getLength());
+        if (typeFactoryRef)
+        {
+            throw Framework::Text("Type already registered: ") + typeId;
+        }
+        typeFactoryRef = new TypeFatoryRef(
+            [factory](Framework::JSON::JSONValue* zJson) {
+                return factory->fromJson(zJson);
+            },
+            [factory](void* zObject) { return factory->toJSON((T*)zObject); },
+            [factory]() { return factory->getValidator(); },
+            factory);
+        parsableTypes.set(typeId, typeId.getLength(), typeFactoryRef);
+    }
+
+    template<typename T> T* fromJson(Framework::JSON::JSONValue* zJson) const
+    {
+        Framework::Text typeId = typeid(T).name();
+        TypeFatoryRef* typeFactoryRef
+            = parsableTypes.z(typeId, typeId.getLength());
+        if (!typeFactoryRef)
+        {
+            throw Framework::Text("Type not registered: ") + typeId;
+        }
+        return (T*)(typeFactoryRef->fromJson(zJson));
+    }
+
+    template<typename T> Framework::JSON::JSONValue* toJSON(T* zObject) const
+    {
+        Framework::Text typeId = typeid(T).name();
+        TypeFatoryRef* typeFactoryRef
+            = parsableTypes.z(typeId, typeId.getLength());
+        if (!typeFactoryRef)
+        {
+            throw Framework::Text("Type not registered: ") + typeId;
+        }
+        return typeFactoryRef->toJSON(zObject);
+    }
+
+    template<typename T>
+    Framework::JSON::Validator::JSONValidator* getValidator() const
+    {
+        Framework::Text typeId = typeid(T).name();
+        TypeFatoryRef* typeFactoryRef
+            = parsableTypes.z(typeId, typeId.getLength());
+        if (!typeFactoryRef)
+        {
+            throw Framework::Text("Type not registered: ") + typeId;
+        }
+        return typeFactoryRef->getValidator();
+    }
+
+    template<typename T> Framework::JSON::JSONValue* getValidParts(
+        Framework::JSON::JSONValue* zJson) const
+    {
+        Framework::RCArray<Framework::JSON::Validator::JSONValidationResult>
+            invalidParts;
+        Framework::JSON::Validator::JSONValidator* validator
+            = getValidator<T>();
+        Framework::JSON::JSONValue* result
+            = validator->getValidParts(zJson, &invalidParts);
+        for (Framework::JSON::Validator::JSONValidationResult* invalidPart :
+            invalidParts)
+        {
+            invalidPart->printInvalidInfo();
+        }
+        return result;
+    }
 };

+ 17 - 3
NoiseTest/NoiseTest.cpp

@@ -27,6 +27,16 @@ float border = 0.5;
 float border2 = -1;
 bool showValue = 1;
 
+class A
+{
+
+};
+
+class HelloWorld : public A
+{
+
+};
+
 void updateView()
 {
     Vec3<int> minP
@@ -87,6 +97,10 @@ void updateView()
 
 int main()
 {
+    A *b = new HelloWorld();
+    std::cout << typeid(*b).name() << std::endl;
+    delete b;
+    /*
     Framework::initFramework();
     FastNoiseLite* noise = new FastNoiseLite(1);
     noise->SetNoiseType(FastNoiseLite::NoiseType::NoiseType_Perlin);
@@ -97,7 +111,7 @@ int main()
     /* FastNoiseLite* noise = new FastNoiseLite(0);
     noise->SetNoiseType(FastNoiseLite::NoiseType::NoiseType_ValueCubic);
     noise->SetFrequency(3.f);
-    wrapper = new FastNoiseWrapper(noise, 0);*/
+    wrapper = new FastNoiseWrapper(noise, 0);
      FastNoiseLite* n = new FastNoiseLite(2);
     n->SetNoiseType(FastNoiseLite::NoiseType::NoiseType_Cellular);
     n->SetFrequency(0.005f);
@@ -133,7 +147,7 @@ int main()
    // wrapper = new NoiseCombinerA(wrapper, wrapper2);
     //wrapper = new ShapedNoise(wrapper);
     //((ShapedNoise*)wrapper)->setNeighborOffset(4.f);
-    //wrapper = new RandNoise(34255);*/
+    //wrapper = new RandNoise(34255);
 
     img = new Bild();
     img->neuBild(1600, 1600, 0xFF000000);
@@ -232,6 +246,6 @@ int main()
     rth->beenden();
     window->setBildschirm(0);
     rth->release();
-    Framework::releaseFramework();
+    Framework::releaseFramework();*/
     return 0;
 }

+ 1 - 0
NoiseTest/NoiseTest.vcxproj

@@ -111,6 +111,7 @@
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ConformanceMode>true</ConformanceMode>
       <LanguageStandard>stdcpp17</LanguageStandard>
+      <AdditionalOptions>/GR %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     <Link>
       <SubSystem>Console</SubSystem>

+ 8 - 0
Windows Version/Windows Version.vcxproj

@@ -224,6 +224,10 @@ copy ..\..\..\..\..\Allgemein\Framework\x64\release\Framework.dll Framework.dll<
     <ClCompile Include="..\FactoryCraft\Player.cpp" />
     <ClCompile Include="..\FactoryCraft\PlayerHand.cpp" />
     <ClCompile Include="..\FactoryCraft\PlayerRegister.cpp" />
+    <ClCompile Include="..\FactoryCraft\Quest.cpp" />
+    <ClCompile Include="..\FactoryCraft\QuestEvent.cpp" />
+    <ClCompile Include="..\FactoryCraft\QuestRequirement.cpp" />
+    <ClCompile Include="..\FactoryCraft\QuestReward.cpp" />
     <ClCompile Include="..\FactoryCraft\RecipieList.cpp" />
     <ClCompile Include="..\FactoryCraft\RandNoise.cpp" />
     <ClCompile Include="..\FactoryCraft\Recipie.cpp" />
@@ -319,6 +323,10 @@ copy ..\..\..\..\..\Allgemein\Framework\x64\release\Framework.dll Framework.dll<
     <ClInclude Include="..\FactoryCraft\Player.h" />
     <ClInclude Include="..\FactoryCraft\PlayerHand.h" />
     <ClInclude Include="..\FactoryCraft\PlayerRegister.h" />
+    <ClInclude Include="..\FactoryCraft\Quest.h" />
+    <ClInclude Include="..\FactoryCraft\QuestEvent.h" />
+    <ClInclude Include="..\FactoryCraft\QuestRequirement.h" />
+    <ClInclude Include="..\FactoryCraft\QuestReward.h" />
     <ClInclude Include="..\FactoryCraft\RandNoise.h" />
     <ClInclude Include="..\FactoryCraft\Recipie.h" />
     <ClInclude Include="..\FactoryCraft\RecipieList.h" />

+ 27 - 0
Windows Version/Windows Version.vcxproj.filters

@@ -97,6 +97,9 @@
     <Filter Include="world\dimensions">
       <UniqueIdentifier>{2ad688cd-aafc-4b2b-8163-964d1e87d087}</UniqueIdentifier>
     </Filter>
+    <Filter Include="quests">
+      <UniqueIdentifier>{58a901d6-aa56-4225-b9cd-9b12552701cc}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\FactoryCraft\Server.cpp">
@@ -369,6 +372,18 @@
     <ClCompile Include="..\FactoryCraft\BlockInstanceGeneratorRule.cpp">
       <Filter>world\generator\biom\rules</Filter>
     </ClCompile>
+    <ClCompile Include="..\FactoryCraft\Quest.cpp">
+      <Filter>quests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\QuestEvent.cpp">
+      <Filter>quests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\QuestRequirement.cpp">
+      <Filter>quests</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\QuestReward.cpp">
+      <Filter>quests</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\FactoryCraft\Chunk.h">
@@ -653,5 +668,17 @@
     <ClInclude Include="..\FactoryCraft\BlockInstanceGeneratorRule.h">
       <Filter>world\generator\biom\rules</Filter>
     </ClInclude>
+    <ClInclude Include="..\FactoryCraft\Quest.h">
+      <Filter>quests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\QuestEvent.h">
+      <Filter>quests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\QuestRequirement.h">
+      <Filter>quests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\QuestReward.h">
+      <Filter>quests</Filter>
+    </ClInclude>
   </ItemGroup>
 </Project>

+ 1 - 1
Windows Version/data/syntax/generatorValidation.xml

@@ -1 +1 @@
-<array removeInvalidEntries="true"><oneOf typeSpecifiedBy="dimension"><object><value name="dimension"><string equals="Overworld"/></value><value name="bioms"><array><object><value name="name"><string/></value><value name="condition"><oneOf typeSpecifiedBy="type"><object id="jeb_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jeb_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><bool/></value></object><object id="jeb_blockType"><value name="type"><string oneOf='["blockType"]'/></value><value name="blockType"><string oneOf='["","Air","Dirt","Sand","Gravel","Stone","Granite Stone","Cobble Stone","Basalt Stone","Oak Wood","Birch Wood","Beech Wood","Pine Wood","Oak Wood Leaves","Birch Wood Leaves","Beech Wood Leaves","Pine Wood Leaves","Oak Wood Sebling","Birch Wood Sebling","Beech Wood Sebling","Pine Wood Sebling","Torch","Grass","Farmland","WheatSeeds","Wheat","Water","Crafting Table","Chest"]'/></value><value name="x"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object id="jeb_bool_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["&&","||"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jeb_variable"/><objectRef ref="jeb_constant"/><objectRef ref="jeb_blockType"/><objectRef ref="jeb_bool_operator"/><objectRef ref="jeb_float_operator"/></oneOf></array></value></object><object id="jeb_float_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='[">","<",">=","<=","==","!=",">i","<i",">=i","<=i","==i","!=i"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></array></value></object></oneOf></value><value name="structurCollections"><array><object><value name="activeNoise"><oneOf typeSpecifiedBy="type"><object id="jn_random"><value name="type"><string equals="random"/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object id="jn_factorize"><value name="type"><string equals="factorize"/></value><value name="factorA"><number greater="0.000000" less="1.000000"/></value><value name="noiseA"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="noiseB"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_multiply"><value name="type"><string equals="multiply"/></value><value name="base"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="multiplier"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_negate"><value name="type"><string equals="negate"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_flatten"><value name="type"><string equals="flatten"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number default="1.000000"/></value><value name="addition"><number default="0.000000"/></value></object><object id="jn_scale"><value name="type"><string equals="scale"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number/></value></object><object id="jn_fastNoiseLite"><value name="type"><string oneOf='["Cellular","ValueCubic","Perlin","OpenSimplex2S","OpenSimplex2","Value"]'/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="rotationType3D"><string optional="true" oneOf='["None","ImproveXYPlanes","ImproveXZPlanes"]'/></value><value name="frequency"><number optional="true"/></value><value name="fractalType"><string optional="true" oneOf='["None","FBm","Ridged","PingPong","DomainWarpProgressive","DomainWarpIndependent"]'/></value><value name="fractalOctaves"><number optional="true"/></value><value name="fractalLacunarity"><number optional="true"/></value><value name="fractalGain"><number optional="true"/></value><value name="cellularDistanceFunction"><string optional="true" oneOf='["Hybrid","Manhattan","EuclideanSq","Euclidean"]'/></value><value name="cellularReturnType"><string optional="true" oneOf='["CellValue","Distance","Distance2","Distance2Add","Distance2Sub","Distance2Mul","Distance2Div"]'/></value><value name="cellularJitter"><number optional="true"/></value><value name="domainWarpType"><string optional="true" oneOf='["BasicGrid","OpenSimplex2","OpenSimplex2Reduced"]'/></value><value name="domainWarpAmp"><number optional="true"/></value><value name="multiplier"><number optional="true" greater="0.000000"/></value></object></oneOf></value><value name="structureNoise"><oneOf typeSpecifiedBy="type"><object id="jn_random"><value name="type"><string equals="random"/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object id="jn_factorize"><value name="type"><string equals="factorize"/></value><value name="factorA"><number greater="0.000000" less="1.000000"/></value><value name="noiseA"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="noiseB"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_multiply"><value name="type"><string equals="multiply"/></value><value name="base"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="multiplier"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_negate"><value name="type"><string equals="negate"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_flatten"><value name="type"><string equals="flatten"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number default="1.000000"/></value><value name="addition"><number default="0.000000"/></value></object><object id="jn_scale"><value name="type"><string equals="scale"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number/></value></object><object id="jn_fastNoiseLite"><value name="type"><string oneOf='["Cellular","ValueCubic","Perlin","OpenSimplex2S","OpenSimplex2","Value"]'/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="rotationType3D"><string optional="true" oneOf='["None","ImproveXYPlanes","ImproveXZPlanes"]'/></value><value name="frequency"><number optional="true"/></value><value name="fractalType"><string optional="true" oneOf='["None","FBm","Ridged","PingPong","DomainWarpProgressive","DomainWarpIndependent"]'/></value><value name="fractalOctaves"><number optional="true"/></value><value name="fractalLacunarity"><number optional="true"/></value><value name="fractalGain"><number optional="true"/></value><value name="cellularDistanceFunction"><string optional="true" oneOf='["Hybrid","Manhattan","EuclideanSq","Euclidean"]'/></value><value name="cellularReturnType"><string optional="true" oneOf='["CellValue","Distance","Distance2","Distance2Add","Distance2Sub","Distance2Mul","Distance2Div"]'/></value><value name="cellularJitter"><number optional="true"/></value><value name="domainWarpType"><string optional="true" oneOf='["BasicGrid","OpenSimplex2","OpenSimplex2Reduced"]'/></value><value name="domainWarpAmp"><number optional="true"/></value><value name="multiplier"><number optional="true" greater="0.000000"/></value></object></oneOf></value><value name="threshold"><number greater="0.000000"/></value><value name="condition"><oneOf typeSpecifiedBy="type"><object id="jeb_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jeb_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><bool/></value></object><object id="jeb_blockType"><value name="type"><string oneOf='["blockType"]'/></value><value name="blockType"><string oneOf='["","Air","Dirt","Sand","Gravel","Stone","Granite Stone","Cobble Stone","Basalt Stone","Oak Wood","Birch Wood","Beech Wood","Pine Wood","Oak Wood Leaves","Birch Wood Leaves","Beech Wood Leaves","Pine Wood Leaves","Oak Wood Sebling","Birch Wood Sebling","Beech Wood Sebling","Pine Wood Sebling","Torch","Grass","Farmland","WheatSeeds","Wheat","Water","Crafting Table","Chest"]'/></value><value name="x"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object id="jeb_bool_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["&&","||"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jeb_variable"/><objectRef ref="jeb_constant"/><objectRef ref="jeb_blockType"/><objectRef ref="jeb_bool_operator"/><objectRef ref="jeb_float_operator"/></oneOf></array></value></object><object id="jeb_float_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='[">","<",">=","<=","==","!=",">i","<i",">=i","<=i","==i","!=i"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></array></value></object></oneOf></value><value name="structures"><array><oneOf typeSpecifiedBy="type"><object><value name="type"><string equals="Tree"/></value><value name="wood"><string oneOf='["","Air","Dirt","Sand","Gravel","Stone","Granite Stone","Cobble Stone","Basalt Stone","Oak Wood","Birch Wood","Beech Wood","Pine Wood","Oak Wood Leaves","Birch Wood Leaves","Beech Wood Leaves","Pine Wood Leaves","Oak Wood Sebling","Birch Wood Sebling","Beech Wood Sebling","Pine Wood Sebling","Torch","Grass","Farmland","WheatSeeds","Wheat","Water","Crafting Table","Chest"]'/></value><value name="leaves"><string oneOf='["","Air","Dirt","Sand","Gravel","Stone","Granite Stone","Cobble Stone","Basalt Stone","Oak Wood","Birch Wood","Beech Wood","Pine Wood","Oak Wood Leaves","Birch Wood Leaves","Beech Wood Leaves","Pine Wood Leaves","Oak Wood Sebling","Birch Wood Sebling","Beech Wood Sebling","Pine Wood Sebling","Torch","Grass","Farmland","WheatSeeds","Wheat","Water","Crafting Table","Chest"]'/></value><value name="minSize"><number greater="0.000000"/></value><value name="maxSize"><number greater="0.000000"/></value><value name="propability"><number greater="0.000000"/></value></object></oneOf></array></value></object></array></value><value name="blocks"><array><oneOf typeSpecifiedBy="type"><object><value name="type"><string equals="blockType"/></value><value name="blockType"><string oneOf='["","Air","Dirt","Sand","Gravel","Stone","Granite Stone","Cobble Stone","Basalt Stone","Oak Wood","Birch Wood","Beech Wood","Pine Wood","Oak Wood Leaves","Birch Wood Leaves","Beech Wood Leaves","Pine Wood Leaves","Oak Wood Sebling","Birch Wood Sebling","Beech Wood Sebling","Pine Wood Sebling","Torch","Grass","Farmland","WheatSeeds","Wheat","Water","Crafting Table","Chest"]'/></value><value name="noise"><oneOf typeSpecifiedBy="type"><object optional="true" id="jn_random"><value name="type"><string equals="random"/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object optional="true" id="jn_factorize"><value name="type"><string equals="factorize"/></value><value name="factorA"><number greater="0.000000" less="1.000000"/></value><value name="noiseA"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="noiseB"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object optional="true" id="jn_multiply"><value name="type"><string equals="multiply"/></value><value name="base"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="multiplier"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object optional="true" id="jn_negate"><value name="type"><string equals="negate"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object optional="true" id="jn_flatten"><value name="type"><string equals="flatten"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number default="1.000000"/></value><value name="addition"><number default="0.000000"/></value></object><object optional="true" id="jn_scale"><value name="type"><string equals="scale"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number/></value></object><object optional="true" id="jn_fastNoiseLite"><value name="type"><string oneOf='["Cellular","ValueCubic","Perlin","OpenSimplex2S","OpenSimplex2","Value"]'/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="rotationType3D"><string optional="true" oneOf='["None","ImproveXYPlanes","ImproveXZPlanes"]'/></value><value name="frequency"><number optional="true"/></value><value name="fractalType"><string optional="true" oneOf='["None","FBm","Ridged","PingPong","DomainWarpProgressive","DomainWarpIndependent"]'/></value><value name="fractalOctaves"><number optional="true"/></value><value name="fractalLacunarity"><number optional="true"/></value><value name="fractalGain"><number optional="true"/></value><value name="cellularDistanceFunction"><string optional="true" oneOf='["Hybrid","Manhattan","EuclideanSq","Euclidean"]'/></value><value name="cellularReturnType"><string optional="true" oneOf='["CellValue","Distance","Distance2","Distance2Add","Distance2Sub","Distance2Mul","Distance2Div"]'/></value><value name="cellularJitter"><number optional="true"/></value><value name="domainWarpType"><string optional="true" oneOf='["BasicGrid","OpenSimplex2","OpenSimplex2Reduced"]'/></value><value name="domainWarpAmp"><number optional="true"/></value><value name="multiplier"><number optional="true" greater="0.000000"/></value></object></oneOf></value><value name="condition"><oneOf typeSpecifiedBy="type"><object id="jeb_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jeb_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><bool/></value></object><object id="jeb_blockType"><value name="type"><string oneOf='["blockType"]'/></value><value name="blockType"><string oneOf='["","Air","Dirt","Sand","Gravel","Stone","Granite Stone","Cobble Stone","Basalt Stone","Oak Wood","Birch Wood","Beech Wood","Pine Wood","Oak Wood Leaves","Birch Wood Leaves","Beech Wood Leaves","Pine Wood Leaves","Oak Wood Sebling","Birch Wood Sebling","Beech Wood Sebling","Pine Wood Sebling","Torch","Grass","Farmland","WheatSeeds","Wheat","Water","Crafting Table","Chest"]'/></value><value name="x"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object id="jeb_bool_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["&&","||"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jeb_variable"/><objectRef ref="jeb_constant"/><objectRef ref="jeb_blockType"/><objectRef ref="jeb_bool_operator"/><objectRef ref="jeb_float_operator"/></oneOf></array></value></object><object id="jeb_float_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='[">","<",">=","<=","==","!=",">i","<i",">=i","<=i","==i","!=i"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></array></value></object></oneOf></value><value name="threshold"><number optional="true" greaterOrEqual="0.000000" lessOrEqual="1.000000"/></value></object><object><value name="type"><string equals="blockInstance"/></value><value name="blockType"><string oneOf='["","Air","Dirt","Sand","Gravel","Stone","Granite Stone","Cobble Stone","Basalt Stone","Oak Wood","Birch Wood","Beech Wood","Pine Wood","Oak Wood Leaves","Birch Wood Leaves","Beech Wood Leaves","Pine Wood Leaves","Oak Wood Sebling","Birch Wood Sebling","Beech Wood Sebling","Pine Wood Sebling","Torch","Grass","Farmland","WheatSeeds","Wheat","Water","Crafting Table","Chest"]'/></value><value name="noise"><oneOf typeSpecifiedBy="type"><object optional="true" id="jn_random"><value name="type"><string equals="random"/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object optional="true" id="jn_factorize"><value name="type"><string equals="factorize"/></value><value name="factorA"><number greater="0.000000" less="1.000000"/></value><value name="noiseA"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="noiseB"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object optional="true" id="jn_multiply"><value name="type"><string equals="multiply"/></value><value name="base"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="multiplier"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object optional="true" id="jn_negate"><value name="type"><string equals="negate"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object optional="true" id="jn_flatten"><value name="type"><string equals="flatten"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number default="1.000000"/></value><value name="addition"><number default="0.000000"/></value></object><object optional="true" id="jn_scale"><value name="type"><string equals="scale"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number/></value></object><object optional="true" id="jn_fastNoiseLite"><value name="type"><string oneOf='["Cellular","ValueCubic","Perlin","OpenSimplex2S","OpenSimplex2","Value"]'/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="rotationType3D"><string optional="true" oneOf='["None","ImproveXYPlanes","ImproveXZPlanes"]'/></value><value name="frequency"><number optional="true"/></value><value name="fractalType"><string optional="true" oneOf='["None","FBm","Ridged","PingPong","DomainWarpProgressive","DomainWarpIndependent"]'/></value><value name="fractalOctaves"><number optional="true"/></value><value name="fractalLacunarity"><number optional="true"/></value><value name="fractalGain"><number optional="true"/></value><value name="cellularDistanceFunction"><string optional="true" oneOf='["Hybrid","Manhattan","EuclideanSq","Euclidean"]'/></value><value name="cellularReturnType"><string optional="true" oneOf='["CellValue","Distance","Distance2","Distance2Add","Distance2Sub","Distance2Mul","Distance2Div"]'/></value><value name="cellularJitter"><number optional="true"/></value><value name="domainWarpType"><string optional="true" oneOf='["BasicGrid","OpenSimplex2","OpenSimplex2Reduced"]'/></value><value name="domainWarpAmp"><number optional="true"/></value><value name="multiplier"><number optional="true" greater="0.000000"/></value></object></oneOf></value><value name="condition"><oneOf typeSpecifiedBy="type"><object id="jeb_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jeb_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><bool/></value></object><object id="jeb_blockType"><value name="type"><string oneOf='["blockType"]'/></value><value name="blockType"><string oneOf='["","Air","Dirt","Sand","Gravel","Stone","Granite Stone","Cobble Stone","Basalt Stone","Oak Wood","Birch Wood","Beech Wood","Pine Wood","Oak Wood Leaves","Birch Wood Leaves","Beech Wood Leaves","Pine Wood Leaves","Oak Wood Sebling","Birch Wood Sebling","Beech Wood Sebling","Pine Wood Sebling","Torch","Grass","Farmland","WheatSeeds","Wheat","Water","Crafting Table","Chest"]'/></value><value name="x"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object id="jeb_bool_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["&&","||"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jeb_variable"/><objectRef ref="jeb_constant"/><objectRef ref="jeb_blockType"/><objectRef ref="jeb_bool_operator"/><objectRef ref="jeb_float_operator"/></oneOf></array></value></object><object id="jeb_float_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='[">","<",">=","<=","==","!=",">i","<i",">=i","<=i","==i","!=i"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></array></value></object></oneOf></value><value name="threshold"><number optional="true" greaterOrEqual="0.000000" lessOrEqual="1.000000"/></value></object></oneOf></array></value></object></array></value><value name="biomNoise"><oneOf typeSpecifiedBy="type"><object id="jn_random"><value name="type"><string equals="random"/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object id="jn_factorize"><value name="type"><string equals="factorize"/></value><value name="factorA"><number greater="0.000000" less="1.000000"/></value><value name="noiseA"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="noiseB"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_multiply"><value name="type"><string equals="multiply"/></value><value name="base"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="multiplier"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_negate"><value name="type"><string equals="negate"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_flatten"><value name="type"><string equals="flatten"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number default="1.000000"/></value><value name="addition"><number default="0.000000"/></value></object><object id="jn_scale"><value name="type"><string equals="scale"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number/></value></object><object id="jn_fastNoiseLite"><value name="type"><string oneOf='["Cellular","ValueCubic","Perlin","OpenSimplex2S","OpenSimplex2","Value"]'/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="rotationType3D"><string optional="true" oneOf='["None","ImproveXYPlanes","ImproveXZPlanes"]'/></value><value name="frequency"><number optional="true"/></value><value name="fractalType"><string optional="true" oneOf='["None","FBm","Ridged","PingPong","DomainWarpProgressive","DomainWarpIndependent"]'/></value><value name="fractalOctaves"><number optional="true"/></value><value name="fractalLacunarity"><number optional="true"/></value><value name="fractalGain"><number optional="true"/></value><value name="cellularDistanceFunction"><string optional="true" oneOf='["Hybrid","Manhattan","EuclideanSq","Euclidean"]'/></value><value name="cellularReturnType"><string optional="true" oneOf='["CellValue","Distance","Distance2","Distance2Add","Distance2Sub","Distance2Mul","Distance2Div"]'/></value><value name="cellularJitter"><number optional="true"/></value><value name="domainWarpType"><string optional="true" oneOf='["BasicGrid","OpenSimplex2","OpenSimplex2Reduced"]'/></value><value name="domainWarpAmp"><number optional="true"/></value><value name="multiplier"><number optional="true" greater="0.000000"/></value></object></oneOf></value><value name="dimensionSeed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="heightLayers"><array default="[]" removeInvalidEntries="true"><object><value name="name"><string/></value><value name="noise"><oneOf typeSpecifiedBy="type"><object id="jn_random"><value name="type"><string equals="random"/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object id="jn_factorize"><value name="type"><string equals="factorize"/></value><value name="factorA"><number greater="0.000000" less="1.000000"/></value><value name="noiseA"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="noiseB"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_multiply"><value name="type"><string equals="multiply"/></value><value name="base"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="multiplier"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_negate"><value name="type"><string equals="negate"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_flatten"><value name="type"><string equals="flatten"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number default="1.000000"/></value><value name="addition"><number default="0.000000"/></value></object><object id="jn_scale"><value name="type"><string equals="scale"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number/></value></object><object id="jn_fastNoiseLite"><value name="type"><string oneOf='["Cellular","ValueCubic","Perlin","OpenSimplex2S","OpenSimplex2","Value"]'/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="rotationType3D"><string optional="true" oneOf='["None","ImproveXYPlanes","ImproveXZPlanes"]'/></value><value name="frequency"><number optional="true"/></value><value name="fractalType"><string optional="true" oneOf='["None","FBm","Ridged","PingPong","DomainWarpProgressive","DomainWarpIndependent"]'/></value><value name="fractalOctaves"><number optional="true"/></value><value name="fractalLacunarity"><number optional="true"/></value><value name="fractalGain"><number optional="true"/></value><value name="cellularDistanceFunction"><string optional="true" oneOf='["Hybrid","Manhattan","EuclideanSq","Euclidean"]'/></value><value name="cellularReturnType"><string optional="true" oneOf='["CellValue","Distance","Distance2","Distance2Add","Distance2Sub","Distance2Mul","Distance2Div"]'/></value><value name="cellularJitter"><number optional="true"/></value><value name="domainWarpType"><string optional="true" oneOf='["BasicGrid","OpenSimplex2","OpenSimplex2Reduced"]'/></value><value name="domainWarpAmp"><number optional="true"/></value><value name="multiplier"><number optional="true" greater="0.000000"/></value></object></oneOf></value><value name="value"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object></array></value></object></oneOf></array>
+<array removeInvalidEntries="true"><oneOf typeSpecifiedBy="dimension"><object><value name="dimension"><string equals="Overworld"/></value><value name="bioms"><array><object><value name="name"><string/></value><value name="condition"><oneOf typeSpecifiedBy="type"><object id="jeb_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jeb_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><bool/></value></object><object id="jeb_blockType"><value name="type"><string oneOf='["blockType"]'/></value><value name="blockType"><string oneOf='["","Air","Dirt","Sand","Gravel","Stone","Granite Stone","Cobble Stone","Basalt Stone","Oak Wood","Birch Wood","Beech Wood","Pine Wood","Oak Wood Leaves","Birch Wood Leaves","Beech Wood Leaves","Pine Wood Leaves","Oak Wood Sebling","Birch Wood Sebling","Beech Wood Sebling","Pine Wood Sebling","Torch","Grass","Farmland","WheatSeeds","Wheat","Water","Crafting Table","Chest"]'/></value><value name="x"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object id="jeb_bool_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["&&","||"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jeb_variable"/><objectRef ref="jeb_constant"/><objectRef ref="jeb_blockType"/><objectRef ref="jeb_bool_operator"/><objectRef ref="jeb_float_operator"/></oneOf></array></value></object><object id="jeb_float_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='[">","<",">=","<=","==","!=",">i","<i",">=i","<=i","==i","!=i"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></array></value></object></oneOf></value><value name="structurCollections"><array><object><value name="activeNoise"><oneOf typeSpecifiedBy="type"><object id="jn_random"><value name="type"><string equals="random"/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object id="jn_factorize"><value name="type"><string equals="factorize"/></value><value name="factorA"><number greater="0.000000" less="1.000000"/></value><value name="noiseA"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="noiseB"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_multiply"><value name="type"><string equals="multiply"/></value><value name="base"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="multiplier"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_negate"><value name="type"><string equals="negate"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_flatten"><value name="type"><string equals="flatten"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number default="1.000000"/></value><value name="addition"><number default="0.000000"/></value></object><object id="jn_scale"><value name="type"><string equals="scale"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number/></value></object><object id="jn_fastNoiseLite"><value name="type"><string oneOf='["Cellular","ValueCubic","Perlin","OpenSimplex2S","OpenSimplex2","Value"]'/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="rotationType3D"><string optional="true" oneOf='["None","ImproveXYPlanes","ImproveXZPlanes"]'/></value><value name="frequency"><number optional="true"/></value><value name="fractalType"><string optional="true" oneOf='["None","FBm","Ridged","PingPong","DomainWarpProgressive","DomainWarpIndependent"]'/></value><value name="fractalOctaves"><number optional="true"/></value><value name="fractalLacunarity"><number optional="true"/></value><value name="fractalGain"><number optional="true"/></value><value name="cellularDistanceFunction"><string optional="true" oneOf='["Hybrid","Manhattan","EuclideanSq","Euclidean"]'/></value><value name="cellularReturnType"><string optional="true" oneOf='["CellValue","Distance","Distance2","Distance2Add","Distance2Sub","Distance2Mul","Distance2Div"]'/></value><value name="cellularJitter"><number optional="true"/></value><value name="domainWarpType"><string optional="true" oneOf='["BasicGrid","OpenSimplex2","OpenSimplex2Reduced"]'/></value><value name="domainWarpAmp"><number optional="true"/></value><value name="multiplier"><number optional="true" greater="0.000000"/></value></object></oneOf></value><value name="structureNoise"><oneOf typeSpecifiedBy="type"><object id="jn_random"><value name="type"><string equals="random"/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object id="jn_factorize"><value name="type"><string equals="factorize"/></value><value name="factorA"><number greater="0.000000" less="1.000000"/></value><value name="noiseA"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="noiseB"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_multiply"><value name="type"><string equals="multiply"/></value><value name="base"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="multiplier"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_negate"><value name="type"><string equals="negate"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_flatten"><value name="type"><string equals="flatten"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number default="1.000000"/></value><value name="addition"><number default="0.000000"/></value></object><object id="jn_scale"><value name="type"><string equals="scale"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number/></value></object><object id="jn_fastNoiseLite"><value name="type"><string oneOf='["Cellular","ValueCubic","Perlin","OpenSimplex2S","OpenSimplex2","Value"]'/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="rotationType3D"><string optional="true" oneOf='["None","ImproveXYPlanes","ImproveXZPlanes"]'/></value><value name="frequency"><number optional="true"/></value><value name="fractalType"><string optional="true" oneOf='["None","FBm","Ridged","PingPong","DomainWarpProgressive","DomainWarpIndependent"]'/></value><value name="fractalOctaves"><number optional="true"/></value><value name="fractalLacunarity"><number optional="true"/></value><value name="fractalGain"><number optional="true"/></value><value name="cellularDistanceFunction"><string optional="true" oneOf='["Hybrid","Manhattan","EuclideanSq","Euclidean"]'/></value><value name="cellularReturnType"><string optional="true" oneOf='["CellValue","Distance","Distance2","Distance2Add","Distance2Sub","Distance2Mul","Distance2Div"]'/></value><value name="cellularJitter"><number optional="true"/></value><value name="domainWarpType"><string optional="true" oneOf='["BasicGrid","OpenSimplex2","OpenSimplex2Reduced"]'/></value><value name="domainWarpAmp"><number optional="true"/></value><value name="multiplier"><number optional="true" greater="0.000000"/></value></object></oneOf></value><value name="threshold"><number greater="0.000000"/></value><value name="condition"><oneOf typeSpecifiedBy="type"><object id="jeb_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jeb_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><bool/></value></object><object id="jeb_blockType"><value name="type"><string oneOf='["blockType"]'/></value><value name="blockType"><string oneOf='["","Air","Dirt","Sand","Gravel","Stone","Granite Stone","Cobble Stone","Basalt Stone","Oak Wood","Birch Wood","Beech Wood","Pine Wood","Oak Wood Leaves","Birch Wood Leaves","Beech Wood Leaves","Pine Wood Leaves","Oak Wood Sebling","Birch Wood Sebling","Beech Wood Sebling","Pine Wood Sebling","Torch","Grass","Farmland","WheatSeeds","Wheat","Water","Crafting Table","Chest"]'/></value><value name="x"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object id="jeb_bool_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["&&","||"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jeb_variable"/><objectRef ref="jeb_constant"/><objectRef ref="jeb_blockType"/><objectRef ref="jeb_bool_operator"/><objectRef ref="jeb_float_operator"/></oneOf></array></value></object><object id="jeb_float_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='[">","<",">=","<=","==","!=",">i","<i",">=i","<=i","==i","!=i"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></array></value></object></oneOf></value><value name="structures"><array><oneOf typeSpecifiedBy="type"><object><value name="type"><string equals="Tree"/><string equals="Tree"/></value><value name="wood"><string oneOf='["","Air","Dirt","Sand","Gravel","Stone","Granite Stone","Cobble Stone","Basalt Stone","Oak Wood","Birch Wood","Beech Wood","Pine Wood","Oak Wood Leaves","Birch Wood Leaves","Beech Wood Leaves","Pine Wood Leaves","Oak Wood Sebling","Birch Wood Sebling","Beech Wood Sebling","Pine Wood Sebling","Torch","Grass","Farmland","WheatSeeds","Wheat","Water","Crafting Table","Chest"]'/></value><value name="leaves"><string oneOf='["","Air","Dirt","Sand","Gravel","Stone","Granite Stone","Cobble Stone","Basalt Stone","Oak Wood","Birch Wood","Beech Wood","Pine Wood","Oak Wood Leaves","Birch Wood Leaves","Beech Wood Leaves","Pine Wood Leaves","Oak Wood Sebling","Birch Wood Sebling","Beech Wood Sebling","Pine Wood Sebling","Torch","Grass","Farmland","WheatSeeds","Wheat","Water","Crafting Table","Chest"]'/></value><value name="minSize"><number greater="0.000000"/></value><value name="maxSize"><number greater="0.000000"/></value><value name="propability"><number greater="0.000000"/></value></object></oneOf></array></value></object></array></value><value name="blocks"><array><oneOf typeSpecifiedBy="type"><object><value name="type"><string equals="blockType"/></value><value name="blockType"><string oneOf='["","Air","Dirt","Sand","Gravel","Stone","Granite Stone","Cobble Stone","Basalt Stone","Oak Wood","Birch Wood","Beech Wood","Pine Wood","Oak Wood Leaves","Birch Wood Leaves","Beech Wood Leaves","Pine Wood Leaves","Oak Wood Sebling","Birch Wood Sebling","Beech Wood Sebling","Pine Wood Sebling","Torch","Grass","Farmland","WheatSeeds","Wheat","Water","Crafting Table","Chest"]'/></value><value name="noise"><oneOf typeSpecifiedBy="type"><object optional="true" id="jn_random"><value name="type"><string equals="random"/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object optional="true" id="jn_factorize"><value name="type"><string equals="factorize"/></value><value name="factorA"><number greater="0.000000" less="1.000000"/></value><value name="noiseA"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="noiseB"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object optional="true" id="jn_multiply"><value name="type"><string equals="multiply"/></value><value name="base"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="multiplier"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object optional="true" id="jn_negate"><value name="type"><string equals="negate"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object optional="true" id="jn_flatten"><value name="type"><string equals="flatten"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number default="1.000000"/></value><value name="addition"><number default="0.000000"/></value></object><object optional="true" id="jn_scale"><value name="type"><string equals="scale"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number/></value></object><object optional="true" id="jn_fastNoiseLite"><value name="type"><string oneOf='["Cellular","ValueCubic","Perlin","OpenSimplex2S","OpenSimplex2","Value"]'/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="rotationType3D"><string optional="true" oneOf='["None","ImproveXYPlanes","ImproveXZPlanes"]'/></value><value name="frequency"><number optional="true"/></value><value name="fractalType"><string optional="true" oneOf='["None","FBm","Ridged","PingPong","DomainWarpProgressive","DomainWarpIndependent"]'/></value><value name="fractalOctaves"><number optional="true"/></value><value name="fractalLacunarity"><number optional="true"/></value><value name="fractalGain"><number optional="true"/></value><value name="cellularDistanceFunction"><string optional="true" oneOf='["Hybrid","Manhattan","EuclideanSq","Euclidean"]'/></value><value name="cellularReturnType"><string optional="true" oneOf='["CellValue","Distance","Distance2","Distance2Add","Distance2Sub","Distance2Mul","Distance2Div"]'/></value><value name="cellularJitter"><number optional="true"/></value><value name="domainWarpType"><string optional="true" oneOf='["BasicGrid","OpenSimplex2","OpenSimplex2Reduced"]'/></value><value name="domainWarpAmp"><number optional="true"/></value><value name="multiplier"><number optional="true" greater="0.000000"/></value></object></oneOf></value><value name="condition"><oneOf typeSpecifiedBy="type"><object id="jeb_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jeb_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><bool/></value></object><object id="jeb_blockType"><value name="type"><string oneOf='["blockType"]'/></value><value name="blockType"><string oneOf='["","Air","Dirt","Sand","Gravel","Stone","Granite Stone","Cobble Stone","Basalt Stone","Oak Wood","Birch Wood","Beech Wood","Pine Wood","Oak Wood Leaves","Birch Wood Leaves","Beech Wood Leaves","Pine Wood Leaves","Oak Wood Sebling","Birch Wood Sebling","Beech Wood Sebling","Pine Wood Sebling","Torch","Grass","Farmland","WheatSeeds","Wheat","Water","Crafting Table","Chest"]'/></value><value name="x"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object id="jeb_bool_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["&&","||"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jeb_variable"/><objectRef ref="jeb_constant"/><objectRef ref="jeb_blockType"/><objectRef ref="jeb_bool_operator"/><objectRef ref="jeb_float_operator"/></oneOf></array></value></object><object id="jeb_float_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='[">","<",">=","<=","==","!=",">i","<i",">=i","<=i","==i","!=i"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></array></value></object></oneOf></value><value name="threshold"><number optional="true" greaterOrEqual="0.000000" lessOrEqual="1.000000"/></value></object><object><value name="type"><string equals="blockInstance"/></value><value name="blockType"><string oneOf='["","Air","Dirt","Sand","Gravel","Stone","Granite Stone","Cobble Stone","Basalt Stone","Oak Wood","Birch Wood","Beech Wood","Pine Wood","Oak Wood Leaves","Birch Wood Leaves","Beech Wood Leaves","Pine Wood Leaves","Oak Wood Sebling","Birch Wood Sebling","Beech Wood Sebling","Pine Wood Sebling","Torch","Grass","Farmland","WheatSeeds","Wheat","Water","Crafting Table","Chest"]'/></value><value name="noise"><oneOf typeSpecifiedBy="type"><object optional="true" id="jn_random"><value name="type"><string equals="random"/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object optional="true" id="jn_factorize"><value name="type"><string equals="factorize"/></value><value name="factorA"><number greater="0.000000" less="1.000000"/></value><value name="noiseA"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="noiseB"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object optional="true" id="jn_multiply"><value name="type"><string equals="multiply"/></value><value name="base"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="multiplier"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object optional="true" id="jn_negate"><value name="type"><string equals="negate"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object optional="true" id="jn_flatten"><value name="type"><string equals="flatten"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number default="1.000000"/></value><value name="addition"><number default="0.000000"/></value></object><object optional="true" id="jn_scale"><value name="type"><string equals="scale"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number/></value></object><object optional="true" id="jn_fastNoiseLite"><value name="type"><string oneOf='["Cellular","ValueCubic","Perlin","OpenSimplex2S","OpenSimplex2","Value"]'/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="rotationType3D"><string optional="true" oneOf='["None","ImproveXYPlanes","ImproveXZPlanes"]'/></value><value name="frequency"><number optional="true"/></value><value name="fractalType"><string optional="true" oneOf='["None","FBm","Ridged","PingPong","DomainWarpProgressive","DomainWarpIndependent"]'/></value><value name="fractalOctaves"><number optional="true"/></value><value name="fractalLacunarity"><number optional="true"/></value><value name="fractalGain"><number optional="true"/></value><value name="cellularDistanceFunction"><string optional="true" oneOf='["Hybrid","Manhattan","EuclideanSq","Euclidean"]'/></value><value name="cellularReturnType"><string optional="true" oneOf='["CellValue","Distance","Distance2","Distance2Add","Distance2Sub","Distance2Mul","Distance2Div"]'/></value><value name="cellularJitter"><number optional="true"/></value><value name="domainWarpType"><string optional="true" oneOf='["BasicGrid","OpenSimplex2","OpenSimplex2Reduced"]'/></value><value name="domainWarpAmp"><number optional="true"/></value><value name="multiplier"><number optional="true" greater="0.000000"/></value></object></oneOf></value><value name="condition"><oneOf typeSpecifiedBy="type"><object id="jeb_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jeb_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><bool/></value></object><object id="jeb_blockType"><value name="type"><string oneOf='["blockType"]'/></value><value name="blockType"><string oneOf='["","Air","Dirt","Sand","Gravel","Stone","Granite Stone","Cobble Stone","Basalt Stone","Oak Wood","Birch Wood","Beech Wood","Pine Wood","Oak Wood Leaves","Birch Wood Leaves","Beech Wood Leaves","Pine Wood Leaves","Oak Wood Sebling","Birch Wood Sebling","Beech Wood Sebling","Pine Wood Sebling","Torch","Grass","Farmland","WheatSeeds","Wheat","Water","Crafting Table","Chest"]'/></value><value name="x"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object id="jeb_bool_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["&&","||"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jeb_variable"/><objectRef ref="jeb_constant"/><objectRef ref="jeb_blockType"/><objectRef ref="jeb_bool_operator"/><objectRef ref="jeb_float_operator"/></oneOf></array></value></object><object id="jeb_float_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='[">","<",">=","<=","==","!=",">i","<i",">=i","<=i","==i","!=i"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></array></value></object></oneOf></value><value name="threshold"><number optional="true" greaterOrEqual="0.000000" lessOrEqual="1.000000"/></value></object></oneOf></array></value></object></array></value><value name="biomNoise"><oneOf typeSpecifiedBy="type"><object id="jn_random"><value name="type"><string equals="random"/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object id="jn_factorize"><value name="type"><string equals="factorize"/></value><value name="factorA"><number greater="0.000000" less="1.000000"/></value><value name="noiseA"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="noiseB"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_multiply"><value name="type"><string equals="multiply"/></value><value name="base"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="multiplier"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_negate"><value name="type"><string equals="negate"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_flatten"><value name="type"><string equals="flatten"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number default="1.000000"/></value><value name="addition"><number default="0.000000"/></value></object><object id="jn_scale"><value name="type"><string equals="scale"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number/></value></object><object id="jn_fastNoiseLite"><value name="type"><string oneOf='["Cellular","ValueCubic","Perlin","OpenSimplex2S","OpenSimplex2","Value"]'/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="rotationType3D"><string optional="true" oneOf='["None","ImproveXYPlanes","ImproveXZPlanes"]'/></value><value name="frequency"><number optional="true"/></value><value name="fractalType"><string optional="true" oneOf='["None","FBm","Ridged","PingPong","DomainWarpProgressive","DomainWarpIndependent"]'/></value><value name="fractalOctaves"><number optional="true"/></value><value name="fractalLacunarity"><number optional="true"/></value><value name="fractalGain"><number optional="true"/></value><value name="cellularDistanceFunction"><string optional="true" oneOf='["Hybrid","Manhattan","EuclideanSq","Euclidean"]'/></value><value name="cellularReturnType"><string optional="true" oneOf='["CellValue","Distance","Distance2","Distance2Add","Distance2Sub","Distance2Mul","Distance2Div"]'/></value><value name="cellularJitter"><number optional="true"/></value><value name="domainWarpType"><string optional="true" oneOf='["BasicGrid","OpenSimplex2","OpenSimplex2Reduced"]'/></value><value name="domainWarpAmp"><number optional="true"/></value><value name="multiplier"><number optional="true" greater="0.000000"/></value></object></oneOf></value><value name="dimensionSeed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="heightLayers"><array default="[]" removeInvalidEntries="true"><object><value name="name"><string/></value><value name="noise"><oneOf typeSpecifiedBy="type"><object id="jn_random"><value name="type"><string equals="random"/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object><object id="jn_factorize"><value name="type"><string equals="factorize"/></value><value name="factorA"><number greater="0.000000" less="1.000000"/></value><value name="noiseA"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="noiseB"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_multiply"><value name="type"><string equals="multiply"/></value><value name="base"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="multiplier"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_negate"><value name="type"><string equals="negate"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value></object><object id="jn_flatten"><value name="type"><string equals="flatten"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number default="1.000000"/></value><value name="addition"><number default="0.000000"/></value></object><object id="jn_scale"><value name="type"><string equals="scale"/></value><value name="noise"><oneOf typeSpecifiedBy="type"><objectRef ref="jn_random"/><objectRef ref="jn_factorize"/><objectRef ref="jn_multiply"/><objectRef ref="jn_negate"/><objectRef ref="jn_flatten"/><objectRef ref="jn_scale"/><objectRef ref="jn_fastNoiseLite"/></oneOf></value><value name="factor"><number/></value></object><object id="jn_fastNoiseLite"><value name="type"><string oneOf='["Cellular","ValueCubic","Perlin","OpenSimplex2S","OpenSimplex2","Value"]'/></value><value name="seed"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value><value name="rotationType3D"><string optional="true" oneOf='["None","ImproveXYPlanes","ImproveXZPlanes"]'/></value><value name="frequency"><number optional="true"/></value><value name="fractalType"><string optional="true" oneOf='["None","FBm","Ridged","PingPong","DomainWarpProgressive","DomainWarpIndependent"]'/></value><value name="fractalOctaves"><number optional="true"/></value><value name="fractalLacunarity"><number optional="true"/></value><value name="fractalGain"><number optional="true"/></value><value name="cellularDistanceFunction"><string optional="true" oneOf='["Hybrid","Manhattan","EuclideanSq","Euclidean"]'/></value><value name="cellularReturnType"><string optional="true" oneOf='["CellValue","Distance","Distance2","Distance2Add","Distance2Sub","Distance2Mul","Distance2Div"]'/></value><value name="cellularJitter"><number optional="true"/></value><value name="domainWarpType"><string optional="true" oneOf='["BasicGrid","OpenSimplex2","OpenSimplex2Reduced"]'/></value><value name="domainWarpAmp"><number optional="true"/></value><value name="multiplier"><number optional="true" greater="0.000000"/></value></object></oneOf></value><value name="value"><oneOf typeSpecifiedBy="type"><object id="jef_variable"><value name="type"><string oneOf='["variable"]'/></value><value name="name"><string/></value></object><object id="jef_constant"><value name="type"><string oneOf='["constant"]'/></value><value name="value"><number/></value></object><object id="jef_noise"><value name="type"><string oneOf='["noise"]'/></value><value name="name"><string default='"noise"'/></value><value name="x"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="y"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value><value name="z"><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></value></object><object id="jef_operator"><value name="type"><string oneOf='["operator"]'/></value><value name="operator"><string oneOf='["+","-","*","/"]'/></value><value name="values"><array><oneOf typeSpecifiedBy="type"><objectRef ref="jef_variable"/><objectRef ref="jef_constant"/><objectRef ref="jef_noise"/><objectRef ref="jef_operator"/></oneOf></array></value></object></oneOf></value></object></array></value></object></oneOf></array>

+ 0 - 964
enc_temp_folder/b53f6e405359497e0849fc21f79ef2/Dimension.cpp

@@ -1,964 +0,0 @@
-#include "Dimension.h"
-
-#include "Constants.h"
-#include "Datei.h"
-#include "Game.h"
-#include "NoBlock.h"
-
-using namespace Framework;
-
-Dimension::Dimension(int id)
-    : Thread(),
-      nextStructureId(0),
-      dimensionId(id),
-      gravity(9.8f),
-      chunks(new RCTrie<Chunk>()),
-      entities(new RCArray<Entity>()),
-      map(new DimensionMap(id)),
-      stop(0),
-      currentDayTime(0.0),
-      nightDuration(0.0),
-      nightTransitionDuration(0.0),
-      dayDuration(1000.0)
-{
-    Datei d;
-    d.setDatei(
-        Game::INSTANCE->getWorldDirectory() + "/dim/" + Text(id) + "/meta.dim");
-    if (d.existiert())
-    {
-        d.open(Datei::Style::lesen);
-        d.lese((char*)&nextStructureId, 8);
-        d.lese((char*)&currentDayTime, 8);
-        d.close();
-    }
-    start();
-}
-
-Dimension::~Dimension()
-{
-    entities->release();
-    chunks->release();
-    map->release();
-}
-
-void Dimension::configureDayNightCyncle(
-    double nightDuration, double nightTransitionDuration, double dayDuration)
-{
-    this->nightDuration = nightDuration;
-    this->nightTransitionDuration = nightTransitionDuration;
-    this->dayDuration = dayDuration;
-}
-
-void Dimension::api(Framework::InMemoryBuffer* zRequest,
-    NetworkMessage* zResponse,
-    Entity* zSource)
-{
-    DoLaterHandler laterHandler;
-    char type;
-    zRequest->lese(&type, 1);
-    switch (type)
-    {
-    case 0: // chunk message
-        {
-            Punkt center;
-            zRequest->lese((char*)&center.x, 4);
-            zRequest->lese((char*)&center.y, 4);
-            cs.lock();
-            Chunk* cC = zChunk(Game::getChunkCenter(center.x, center.y));
-            if (!cC)
-            {
-                // TODO: have a max amount of waiting requests per player
-                waitingRequests.add(
-                    {dynamic_cast<InMemoryBuffer*>(zRequest->getThis()),
-                        center,
-                        zSource->getId()});
-                Game::INSTANCE->requestArea({center.x - CHUNK_SIZE / 2,
-                    center.y - CHUNK_SIZE / 2,
-                    center.x + CHUNK_SIZE / 2 - 1,
-                    center.y + CHUNK_SIZE / 2 - 1,
-                    dimensionId});
-            }
-            else
-            {
-                cC->api(zRequest, zSource, laterHandler);
-            }
-            cs.unlock();
-            break;
-        }
-    case 1: // block message
-        {
-            Vec3<int> location;
-            zRequest->lese((char*)&location.x, 4);
-            zRequest->lese((char*)&location.y, 4);
-            zRequest->lese((char*)&location.z, 4);
-            Framework::Either<Block*, int> block = zBlock(location);
-            if (block.isA())
-            {
-                block.getA()->api(zRequest, zResponse);
-            }
-            break;
-        }
-    case 2: // map request
-        {
-            map->api(zRequest, zResponse, zSource, this);
-            break;
-        }
-    }
-}
-
-void Dimension::tickEntities()
-{
-    this->currentDayTime += 1.0 / MAX_TICKS_PER_SECOND;
-    if (this->currentDayTime
-        > dayDuration + nightDuration + nightTransitionDuration * 2)
-    {
-        this->currentDayTime
-            = dayDuration + nightDuration + nightTransitionDuration * 2;
-    }
-    for (auto entity : *entities)
-    {
-        if (!entity->isRemoved()
-            && (entity->isMoving()
-                || zChunk(Game::getChunkCenter((int)entity->getPosition().x,
-                    (int)entity->getPosition().y))))
-            entity->prepareTick(this);
-    }
-    int index = 0;
-    for (auto entity : *entities)
-    {
-        if (!entity->isRemoved()
-            && (entity->isMoving()
-                || zChunk(Game::getChunkCenter((int)entity->getPosition().x,
-                    (int)entity->getPosition().y))))
-            entity->tick(this);
-        index++;
-    }
-}
-
-void Dimension::thread()
-{
-    // light calculation
-    int index = 0;
-    ZeitMesser messer;
-    messer.messungStart();
-    double time = 0;
-    bool isForeground = 0;
-    Framework::Array<Framework::Vec3<int>> internalLightUpdateQueue;
-    while (!stop)
-    {
-        Vec3<int> position;
-        if (internalLightUpdateQueue.getEintragAnzahl())
-        {
-            position = internalLightUpdateQueue.get(0);
-            internalLightUpdateQueue.remove(0);
-        }
-        else
-        {
-            removedChunksCs.lock();
-            if (removedChunks.getEintragAnzahl() > 0)
-            {
-                Chunk* removedChunk = removedChunks.z(0);
-                removedChunksCs.unlock();
-                Text filePath = Game::INSTANCE->getWorldDirectory() + "/dim/"
-                              + getDimensionId() + "/";
-                filePath.appendHex(removedChunk->getCenter().x);
-                filePath += "_";
-                filePath.appendHex(removedChunk->getCenter().y);
-                filePath += ".chunk";
-                Datei d;
-                d.setDatei(filePath);
-                d.erstellen();
-                d.open(Datei::Style::schreiben);
-                removedChunk->save(&d);
-                char addr[8];
-                getAddrOfWorld(removedChunk->getCenter(), addr);
-                map->removeMap(addr, 8);
-                d.close();
-                removedChunksCs.lock();
-                removedChunks.remove(0);
-            }
-            removedChunksCs.unlock();
-            if (priorizedLightUpdateQueue.getEintragAnzahl())
-            {
-                prioLightCs.lock();
-                position = priorizedLightUpdateQueue.get(0);
-                priorizedLightUpdateQueue.remove(0);
-                prioLightCs.unlock();
-                isForeground = 1;
-            }
-            else
-            {
-                if (!lightUpdateQueue.getEintragAnzahl())
-                {
-                    messer.messungEnde();
-                    time += messer.getSekunden();
-                    Sleep(500);
-                    messer.messungStart();
-                    continue;
-                }
-                lightCs.lock();
-                position = lightUpdateQueue.get(0);
-                lightUpdateQueue.remove(0);
-                lightCs.unlock();
-                isForeground = 0;
-            }
-        }
-        Chunk* chunk
-            = zChunk(Game::INSTANCE->getChunkCenter(position.x, position.y));
-        if (position.z >= 0 && position.z < WORLD_HEIGHT)
-        {
-            if (chunk)
-            {
-                Vec3<int> chunkPos = chunkCoordinates(position);
-                unsigned char* light = chunk->getLightData(chunkPos);
-                unsigned char dayLight[6] = {255, 255, 255, 0, 0, 0};
-                unsigned char noLight[6] = {0, 0, 0, 0, 0, 0};
-                unsigned char newLight[6] = {0, 0, 0, 0, 0, 0};
-                // add neighbor light emission
-                for (int i = 0; i < 6; i++)
-                {
-                    unsigned char* neighborLeight;
-                    Vec3<int> neighborPos
-                        = position + getDirection(getDirectionFromIndex(i));
-                    if (neighborPos.z < 0)
-                    {
-                        neighborLeight = noLight;
-                    }
-                    else if (neighborPos.z >= WORLD_HEIGHT)
-                    {
-                        neighborLeight = dayLight;
-                    }
-                    else
-                    {
-                        Chunk* neighborChunk
-                            = zChunk(Game::INSTANCE->getChunkCenter(
-                                neighborPos.x, neighborPos.y));
-                        if (neighborChunk)
-                            neighborLeight = neighborChunk->getLightData(
-                                chunkCoordinates(neighborPos));
-                        else
-                            neighborLeight = noLight;
-                    }
-                    for (int j = 0; j < 3; j++)
-                        newLight[j] = (unsigned char)MAX(newLight[j],
-                            i == getDirectionIndex(TOP)
-                                ? neighborLeight[j]
-                                : (unsigned char)((float)neighborLeight[j]
-                                                  * 0.8f));
-                    for (int j = 3; j < 6; j++)
-                        newLight[j] = (unsigned char)MAX(newLight[j],
-                            (unsigned char)((float)neighborLeight[j] * 0.85f));
-                }
-                const Block* current = zBlockOrDefault(position);
-                // add own light emission
-                for (int j = 3; j < 6; j++)
-                    newLight[j] = (unsigned char)MAX(
-                        newLight[j], current->getLightEmisionColor()[j - 3]);
-                current->filterPassingLight(newLight);
-                current->filterPassingLight(newLight + 3);
-                for (int i = 0; i < 6; i++)
-                {
-                    if (newLight[i] != light[i])
-                    {
-                        chunk->setLightData(chunkPos, newLight, isForeground);
-                        for (int j = 0; j < 6; j++)
-                            internalLightUpdateQueue.add(
-                                position
-                                    + getDirection(getDirectionFromIndex(j)),
-                                0);
-                        break;
-                    }
-                }
-            }
-        }
-        index++;
-        if (index > 100000)
-        {
-            messer.messungEnde();
-            time += messer.getSekunden();
-            std::cout << "100000 light updates needed " << time << " seconds\n";
-            time = 0;
-            index = 0;
-            messer.messungStart();
-        }
-    }
-    std::cout << Text("Dimension ") + this->getDimensionId()
-                     + " update Thread exited.\n";
-}
-
-void Dimension::getAddrOf(Punkt cPos, char* addr) const
-{
-    *(int*)addr = cPos.x;
-    *((int*)addr + 1) = cPos.y;
-}
-
-void Dimension::getAddrOfWorld(Punkt wPos, char* addr) const
-{
-    if (wPos.x < 0) wPos.x -= CHUNK_SIZE;
-    if (wPos.y < 0) // needed because otherwise would (-8, -8) have the same
-                    // adress as (8, 8)
-        wPos.y -= CHUNK_SIZE;
-    wPos /= CHUNK_SIZE;
-    getAddrOf(wPos, addr);
-}
-
-void Dimension::saveStructure(MultiblockStructure* zStructure) const
-{
-    Datei d;
-    Text path = Game::INSTANCE->getWorldDirectory() + "/dim/"
-              + Text(dimensionId) + "/structures/";
-    path.appendHex(zStructure->getStructureId());
-    path += ".str";
-    d.setDatei(path);
-    d.erstellen();
-    d.open(Datei::Style::schreiben);
-    auto uPos = zStructure->getUniquePosition();
-    d.schreibe((char*)&uPos.x, 4);
-    d.schreibe((char*)&uPos.y, 4);
-    d.schreibe((char*)&uPos.z, 4);
-    int typeId = zStructure->getStructureTypeId();
-    d.schreibe((char*)&typeId, 4);
-    __int64 strId = zStructure->getStructureId();
-    d.schreibe((char*)&strId, 8);
-    StaticRegistry<MultiblockStructureType>::INSTANCE
-        .zElement(zStructure->getStructureTypeId())
-        ->saveStructure(zStructure, &d);
-    d.close();
-}
-
-Chunk* Dimension::zChunk(Punkt wPos) const
-{
-    char addr[8];
-    getAddrOfWorld(wPos, addr);
-    return chunks->z(addr, 8);
-}
-
-Framework::Either<Block*, int> Dimension::zBlock(Vec3<int> location)
-{
-    Chunk* c = zChunk(Game::INSTANCE->getChunkCenter(location.x, location.y));
-    if (c)
-    {
-        location = chunkCoordinates(location);
-        return c->zBlockAt(location);
-    }
-    return 0;
-}
-
-Block* Dimension::zRealBlockInstance(Framework::Vec3<int> location)
-{
-    Chunk* c = zChunk(Game::INSTANCE->getChunkCenter(location.x, location.y));
-    if (c)
-    {
-        location = chunkCoordinates(location);
-        c->instantiateBlock(location);
-        auto result = c->zBlockAt(location);
-        return result.isA() ? result.getA() : 0;
-    }
-    return 0;
-}
-
-const Block* Dimension::zBlockOrDefault(Framework::Vec3<int> location)
-{
-    Chunk* c = zChunk(Game::INSTANCE->getChunkCenter(location.x, location.y));
-    if (c)
-    {
-        location = chunkCoordinates(location);
-        return c->zBlockConst(location);
-    }
-    return &NoBlock::INSTANCE;
-}
-
-int Dimension::getBlockType(Framework::Vec3<int> location)
-{
-    Chunk* c = zChunk(Game::INSTANCE->getChunkCenter(location.x, location.y));
-    if (c)
-    {
-        location = chunkCoordinates(location);
-        return c->getBlockTypeAt(location);
-    }
-    return BlockTypeEnum::NO_BLOCK;
-}
-
-void Dimension::placeBlock(
-    Framework::Vec3<int> location, Framework::Either<Block*, int> block)
-{
-    Chunk* c = zChunk(Game::getChunkCenter(location.x, location.y));
-    if (c)
-    {
-        location = chunkCoordinates(location);
-        if (block.isA())
-            c->putBlockAt(location, block);
-        else
-        {
-            c->putBlockAt(location, 0);
-            c->putBlockTypeAt(location, block);
-        }
-    }
-    else if (block.isA())
-        block.getA()->release();
-}
-
-void Dimension::sendBlockInfo(Framework::Vec3<int> location)
-{
-    Chunk* c = zChunk(Game::getChunkCenter(location.x, location.y));
-    if (c)
-    {
-        location = chunkCoordinates(location);
-        c->sendBlockInfo(location);
-    }
-}
-
-void Dimension::addEntity(Entity* entity)
-{
-    entities->add(entity);
-}
-
-void Dimension::setChunk(Chunk* chunk, Punkt center)
-{
-    char addr[8];
-    getAddrOfWorld(center, addr);
-    if (chunk) map->loadMap(addr, 8, chunk);
-    chunkCs.lock();
-    Chunk* old = chunks->get(addr, 8);
-    if (old)
-    {
-        Game::INSTANCE->zTickOrganizer()->removeTickSource(old);
-        old->prepareRemove();
-        for (int i = 0; i < chunkList.getEintragAnzahl(); i++)
-        {
-            if (chunkList.get(i) == old)
-            {
-                chunkList.remove(i);
-                break;
-            }
-        }
-    }
-    chunks->set(addr, 8, chunk);
-    if (chunk)
-    {
-        chunkList.add(chunk);
-        chunk->setAdded();
-    }
-    getAddrOfWorld(center + Punkt(CHUNK_SIZE, 0), addr);
-    Chunk* zChunk = chunks->z(addr, 8);
-    if (zChunk)
-    {
-        zChunk->setNeighbor(WEST, chunk);
-        if (chunk)
-        {
-            chunk->setNeighbor(EAST, zChunk);
-        }
-    }
-    getAddrOfWorld(center + Punkt(-CHUNK_SIZE, 0), addr);
-    zChunk = chunks->z(addr, 8);
-    if (zChunk)
-    {
-        zChunk->setNeighbor(EAST, chunk);
-        if (chunk) chunk->setNeighbor(WEST, zChunk);
-    }
-    getAddrOfWorld(center + Punkt(0, CHUNK_SIZE), addr);
-    zChunk = chunks->z(addr, 8);
-    if (zChunk)
-    {
-        zChunk->setNeighbor(NORTH, chunk);
-        if (chunk) chunk->setNeighbor(SOUTH, zChunk);
-    }
-    getAddrOfWorld(center + Punkt(0, -CHUNK_SIZE), addr);
-    zChunk = chunks->z(addr, 8);
-    if (zChunk)
-    {
-        zChunk->setNeighbor(SOUTH, chunk);
-        if (chunk) chunk->setNeighbor(NORTH, zChunk);
-    }
-    DoLaterHandler laterHandler;
-    if (chunk)
-    {
-        cs.lock();
-        int index = 0;
-        for (Iterator<RequestQueue> iterator = waitingRequests.begin();
-             iterator;)
-        {
-            Entity* zE = Game::INSTANCE->zEntity(iterator.val().sourceId);
-            if (zE)
-            {
-                if (iterator.val().chunkCenter == chunk->getCenter())
-                {
-                    chunk->api(iterator.val().request, zE, laterHandler);
-                    iterator.val().request->release();
-                    iterator.remove();
-                    continue;
-                }
-            }
-            else
-            {
-                iterator.val().request->release();
-                iterator.remove();
-                continue;
-            }
-            iterator++;
-            index++;
-        }
-        cs.unlock();
-        Game::INSTANCE->zTickOrganizer()->addTickSource(chunk);
-    }
-    chunkCs.unlock();
-    if (old)
-    {
-        old->onUnloaded();
-        removedChunksCs.lock();
-        removedChunks.add(old);
-        removedChunksCs.unlock();
-    }
-    if (chunk) chunk->onLoaded();
-    laterHandler.execute();
-    if (chunk) updateLightAtChunkBorders(center);
-}
-
-void Dimension::save(Text worldDir) const
-{
-    Datei d;
-    d.setDatei(Game::INSTANCE->getWorldDirectory() + "/dim/" + Text(dimensionId)
-               + "/meta.dim");
-    d.erstellen();
-    d.open(Datei::Style::schreiben);
-    d.schreibe((char*)&nextStructureId, 8);
-    d.schreibe((char*)&currentDayTime, 8);
-    d.close();
-    for (auto chunk = chunkList.begin(); chunk; chunk++)
-    {
-        if (!chunk._) continue;
-        Datei* file = new Datei();
-        Text filePath = worldDir + "/dim/" + dimensionId + "/";
-        filePath.appendHex(chunk->getCenter().x);
-        filePath += "_";
-        filePath.appendHex(chunk->getCenter().y);
-        filePath += ".chunk";
-        file->setDatei(filePath);
-        if (file->open(Datei::Style::schreiben)) chunk->save(file);
-        file->close();
-        file->release();
-        char addr[8];
-        getAddrOfWorld(chunk->getCenter(), addr);
-        map->saveMap(addr, 8);
-    }
-    Text filePath = worldDir + "/dim/" + dimensionId + "/entities";
-    Datei* file = new Datei();
-    file->setDatei(filePath);
-    if (file->open(Datei::Style::schreiben))
-    {
-        for (Entity* entity : *entities)
-        {
-            if (entity->zType()->getId() != EntityTypeEnum::PLAYER)
-            {
-                if (!entity->isRemoved())
-                {
-                    int type = entity->zType()->getId();
-                    file->schreibe((char*)&type, 4);
-                    StaticRegistry<EntityType>::INSTANCE.zElement(type)
-                        ->saveEntity(entity, file);
-                }
-            }
-            else
-            {
-                Datei pFile;
-                pFile.setDatei(worldDir + "/player/"
-                               + Game::INSTANCE->getPlayerId(
-                                   ((Player*)entity)->getName()));
-                if (pFile.open(Datei::Style::schreiben))
-                    StaticRegistry<EntityType>::INSTANCE
-                        .zElement(EntityTypeEnum::PLAYER)
-                        ->saveEntity(entity, &pFile);
-            }
-        }
-        file->close();
-    }
-    for (MultiblockStructure* structure : structures)
-    {
-        saveStructure(structure);
-    }
-}
-
-int Dimension::getDimensionId() const
-{
-    return dimensionId;
-}
-
-bool Dimension::hasChunck(int x, int y)
-{
-    if (zChunk(Punkt(x, y))) return 1;
-    removedChunksCs.lock();
-    for (Chunk* c : removedChunks)
-    {
-        if (c->getCenter().x == x && c->getCenter().y == y)
-        {
-            removedChunksCs.unlock();
-            return 1;
-        }
-    }
-    removedChunksCs.unlock();
-    return 0;
-}
-
-bool Dimension::reviveChunk(int x, int y)
-{
-    chunkCs.lock();
-    if (zChunk(Punkt(x, y)))
-    {
-        chunkCs.unlock();
-        return 1;
-    }
-    removedChunksCs.lock();
-    int index = 0;
-    for (Iterator<Chunk*> i = removedChunks.begin(); i; i++)
-    {
-        if (i->getCenter().x == x && i->getCenter().y == y)
-        {
-            setChunk(dynamic_cast<Chunk*>(i->getThis()), Punkt(x, y));
-            if (index > 0) i.remove();
-            removedChunksCs.unlock();
-            chunkCs.unlock();
-            return 1;
-        }
-        index++;
-    }
-    removedChunksCs.unlock();
-    chunkCs.unlock();
-    return 0;
-}
-
-float Dimension::getGravity() const
-{
-    return gravity;
-}
-
-void Dimension::removeOldChunks()
-{
-    chunkCs.lock();
-    int index = 0;
-    for (Chunk* chunk : chunkList)
-    {
-        if (!chunk->hasObservers()) setChunk(0, chunk->getCenter());
-        index++;
-    }
-    chunkCs.unlock();
-    structurCs.lock();
-    Iterator<MultiblockStructure*> i = structures.begin();
-    while (i)
-    {
-        if (i->isEmpty())
-        {
-            i.remove();
-            continue;
-        }
-        else if (i->isFullyUnloaded())
-        {
-            saveStructure(i);
-            i.remove();
-            continue;
-        }
-        i++;
-    }
-    structurCs.unlock();
-}
-
-Entity* Dimension::zEntity(int id)
-{
-    for (auto entity : *entities)
-    {
-        if (!entity->isRemoved() && entity->getId() == id) return entity;
-    }
-    return 0;
-}
-
-Entity* Dimension::zNearestEntity(
-    Framework::Vec3<float> pos, std::function<bool(Entity*)> filter)
-{
-    Entity* result = 0;
-    float sqDist = 0;
-    for (auto entity : *entities)
-    {
-        if (!entity->isRemoved() && filter(entity))
-        {
-            float d = pos.abstandSq(entity->getPosition());
-            if (!result || d < sqDist)
-            {
-                result = entity;
-                sqDist = d;
-            }
-        }
-    }
-    return result;
-}
-
-void Dimension::removeEntity(int id)
-{
-    int index = 0;
-    for (auto entity : *entities)
-    {
-        if (entity->getId() == id)
-        {
-            entities->remove(index);
-            return;
-        }
-        index++;
-    }
-}
-
-void Dimension::removeSubscriptions(Entity* zEntity)
-{
-    for (Chunk* chunk : chunkList)
-        chunk->removeObserver(zEntity);
-}
-
-void Dimension::updateLightning(Vec3<int> location)
-{
-    lightCs.lock();
-    lightUpdateQueue.add(location, 0);
-    lightCs.unlock();
-}
-
-void Dimension::updateLightningWithoutWait(Framework::Vec3<int> location)
-{
-    prioLightCs.lock();
-    priorizedLightUpdateQueue.add(location, 0);
-    prioLightCs.unlock();
-}
-
-void Dimension::updateLightAtChunkBorders(Punkt chunkCenter)
-{
-    if (lightUpdateQueue.getEintragAnzahl() > 300000)
-    {
-        std::cout
-            << "warning: light calculation queue is over 300000 blocks long\n";
-    }
-    for (int i = WORLD_HEIGHT - 1; i >= 0; i--)
-    {
-        for (int j = 0; j < CHUNK_SIZE; j++)
-        {
-            updateLightning(Vec3<int>(chunkCenter.x - CHUNK_SIZE / 2 - 1,
-                chunkCenter.y - CHUNK_SIZE / 2 + j,
-                i));
-            updateLightning(Vec3<int>(chunkCenter.x - CHUNK_SIZE / 2,
-                chunkCenter.y - CHUNK_SIZE / 2 + j,
-                i));
-            updateLightning(Vec3<int>(chunkCenter.x + CHUNK_SIZE / 2 - 1,
-                chunkCenter.y - CHUNK_SIZE / 2 + j,
-                i));
-            updateLightning(Vec3<int>(chunkCenter.x + CHUNK_SIZE / 2,
-                chunkCenter.y - CHUNK_SIZE / 2 + j,
-                i));
-            updateLightning(Vec3<int>(chunkCenter.x - CHUNK_SIZE / 2 + j,
-                chunkCenter.y - CHUNK_SIZE / 2 - 1,
-                i));
-            updateLightning(Vec3<int>(chunkCenter.x - CHUNK_SIZE / 2 + j,
-                chunkCenter.y - CHUNK_SIZE / 2,
-                i));
-            updateLightning(Vec3<int>(chunkCenter.x - CHUNK_SIZE / 2 + j,
-                chunkCenter.y + CHUNK_SIZE / 2 - 1,
-                i));
-            updateLightning(Vec3<int>(chunkCenter.x - CHUNK_SIZE / 2 + j,
-                chunkCenter.y + CHUNK_SIZE / 2,
-                i));
-        }
-    }
-}
-
-__int64 Dimension::getNextStructureId()
-{
-    return nextStructureId++;
-}
-
-void Dimension::addStructure(MultiblockStructure* structure)
-{
-    structurCs.lock();
-    structures.add(structure);
-    structurCs.unlock();
-}
-
-MultiblockStructure* Dimension::zStructureByPosition(
-    Framework::Vec3<int> uniquePosition)
-{
-    structurCs.lock();
-    for (MultiblockStructure* str : structures)
-    {
-        if (str->getUniquePosition() == uniquePosition)
-        {
-            structurCs.unlock();
-            return str;
-        }
-    }
-    // search for structure file
-    Datei dir(Game::INSTANCE->getWorldDirectory() + "/dim/" + Text(dimensionId)
-              + "/structures");
-    RCArray<Text>* names = dir.getDateiListe();
-    if (names)
-    {
-        Vec3<int> uPos;
-        for (Text* name : *names)
-        {
-            Datei d(Text(dir.zPfad()->getText()) + "/" + name->getText());
-            if (d.open(Datei::Style::lesen))
-            {
-                d.lese((char*)&uPos.x, 4);
-                d.lese((char*)&uPos.y, 4);
-                d.lese((char*)&uPos.z, 4);
-                if (uPos == uniquePosition)
-                {
-                    int type;
-                    d.lese((char*)&type, 4);
-                    __int64 strId;
-                    d.lese((char*)&strId, 8);
-                    MultiblockStructure* str
-                        = StaticRegistry<MultiblockStructureType>::INSTANCE
-                              .zElement(type)
-                              ->loadStructure(
-                                  dimensionId, strId, uniquePosition, &d);
-                    d.close();
-                    structures.add(str);
-                    names->release();
-                    structurCs.unlock();
-                    return str;
-                }
-                d.close();
-            }
-        }
-        names->release();
-    }
-    structurCs.unlock();
-    return 0;
-}
-
-MultiblockStructure* Dimension::zStructureById(__int64 id)
-{
-    structurCs.lock();
-    for (MultiblockStructure* str : structures)
-    {
-        if (str->getStructureId() == id)
-        {
-            structurCs.unlock();
-            return str;
-        }
-    }
-    // search for structure file
-    Text path = Game::INSTANCE->getWorldDirectory() + "/dim/"
-              + Text(dimensionId) + "/structures/";
-    path.appendHex(id);
-    path += ".str";
-    Datei d(path);
-    Vec3<int> uPos;
-    if (d.open(Datei::Style::lesen))
-    {
-        d.lese((char*)&uPos.x, 4);
-        d.lese((char*)&uPos.y, 4);
-        d.lese((char*)&uPos.z, 4);
-        int type;
-        d.lese((char*)&type, 4);
-        __int64 strId;
-        d.lese((char*)&strId, 8);
-        MultiblockStructure* str
-            = StaticRegistry<MultiblockStructureType>::INSTANCE.zElement(type)
-                  ->loadStructure(dimensionId, strId, uPos, &d);
-        d.close();
-        structures.add(str);
-        structurCs.unlock();
-        return str;
-    }
-    std::cout << "WARNING: did not find Structure information file '" << path
-              << "'.\n";
-    structurCs.unlock();
-    return 0;
-}
-
-void Dimension::requestStopAndWait()
-{
-    stop = 1;
-    warteAufThread(1000000);
-}
-
-void Dimension::updateMap(int x, int y, int height)
-{
-    chunkCs.lock();
-    int h1 = height % 2 == 0 ? height : height - 1;
-    int h2 = h1 + 1;
-    const Block* b1 = zBlockOrDefault({x, y, h1});
-    const Block* b2 = zBlockOrDefault({x, y, h2});
-    bool visible = 1;
-    if (h2 != WORLD_HEIGHT - 1)
-    {
-        const Block* b3 = zBlockOrDefault({x, y, h2 + 1});
-        visible = b3->isPassable() || b3->isTransparent();
-    }
-    int color1
-        = (b2->isPassable() || b2->isTransparent()) ? b1->getMapColor() : 0;
-    int color2 = visible ? b2->getMapColor() : 0;
-    int color1m = 0;
-    int color2m = 0;
-    if (h1 > 0)
-    {
-        const Block* b1m = zBlockOrDefault({x, y, h1 - 2});
-        const Block* b2m = zBlockOrDefault({x, y, h1 - 1});
-        color1m = (b2m->isPassable() || b2m->isTransparent())
-                    ? b1m->getMapColor()
-                    : 0;
-        color2m = (b1->isPassable() || b1->isTransparent()) ? b2m->getMapColor()
-                                                            : 0;
-    }
-    char addr[8];
-    Punkt center = Game::INSTANCE->getChunkCenter(x, y);
-    getAddrOfWorld(center, addr);
-    ChunkMap* cMap = map->getMap(addr, 8, center);
-    if (cMap)
-    {
-        Framework::Vec3<int> chunkLocation = chunkCoordinates({x, y, height});
-        if (cMap->update((char)chunkLocation.x,
-                (char)chunkLocation.y,
-                (unsigned char)(chunkLocation.z / 2),
-                color1,
-                color2)
-            || (h1 > 0
-                && cMap->update((char)chunkLocation.x,
-                    (char)chunkLocation.y,
-                    (unsigned char)(chunkLocation.z / 2) - 1,
-                    color1m,
-                    color2m)))
-        {
-            map->onMapUpdated(addr, 8);
-        }
-    }
-    chunkCs.unlock();
-}
-
-int Dimension::getChunkCount()
-{
-    return chunkList.getEintragAnzahl();
-}
-
-double Dimension::getCurrentDayTime() const
-{
-    return currentDayTime;
-}
-
-double Dimension::getNightDuration() const
-{
-    return nightDuration;
-}
-
-double Dimension::getNightTransitionDuration() const
-{
-    return nightTransitionDuration;
-}
-
-double Dimension::getDayDuration() const
-{
-    return dayDuration;
-}
-
-DimensionFactory::DimensionFactory(int dimensionId)
-    : ReferenceCounter(),
-      dimensionId(dimensionId)
-{}
-
-int DimensionFactory::getDimensionId() const
-{
-    return dimensionId;
-}