Explorar el Código

add working windows version

Kolja Strohm hace 1 año
padre
commit
ddbe48cff5

+ 4 - 1
.gitignore

@@ -360,4 +360,7 @@ MigrationBackup/
 .ionide/
 
 # Fody - auto-generated XML schema
-FodyWeavers.xsd
+FodyWeavers.xsd
+/Windows Version/saves/Test
+/Windows Version/cert.crt
+/Windows Version/cert.key

+ 5 - 2
FactoryCraft/Block.h

@@ -136,7 +136,8 @@ public:
         std::function<bool(const Item*, int, Framework::Vec3<int>)> condition,
         bool andDefault);
     virtual bool canBeStackedWith(const Item* zItem) const override;
-    virtual bool canBePlacedAt(int dimensionId, Framework::Vec3<int> worldPos) const override;
+    virtual bool canBePlacedAt(
+        int dimensionId, Framework::Vec3<int> worldPos) const override;
 
     friend BasicBlockItemType;
     friend BlockType;
@@ -171,4 +172,6 @@ public:
     BasicBlockItemType* setPlacableProof(
         std::function<bool(const Item*, int, Framework::Vec3<int>)> condition,
         bool andDefault);
-};
+};
+
+#include "MultiblockStructure.h"

+ 10 - 1
FactoryCraft/ChatMessage.cpp

@@ -1,6 +1,8 @@
 #include "ChatMessage.h"
 
-#include <sys/time.h>
+#ifndef _WINDOWS
+#    include <sys/time.h>
+#endif
 
 ChatMessage::ChatMessage(Framework::Text message,
     Framework::Text channel,
@@ -10,9 +12,16 @@ ChatMessage::ChatMessage(Framework::Text message,
       channel(channel),
       targetPlayerName(targetPlayerName)
 {
+#ifdef _WINDOWS
+    struct tm timeinfo;
+    std::time(&time);
+    gmtime_s(&timeinfo ,& time); /* Convert to UTC */
+    time = mktime(&timeinfo);             /* Store as unix timestamp */
+#else
     timeval tv;
     gettimeofday(&tv, 0);
     time = tv.tv_sec;
+#endif
 }
 
 ChatMessage::ChatMessage(Framework::StreamReader* zReader)

+ 1 - 1
FactoryCraft/Chunk.cpp

@@ -927,7 +927,7 @@ unsigned char* Chunk::getLightData(Framework::Vec3<int> location) const
     int index
         = ((location.x * CHUNK_SIZE + location.y) * WORLD_HEIGHT + location.z)
         * 6;
-    assert(index < CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT);
+    assert(index < CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT * 6);
     return lightData + index;
 }
 

+ 3 - 0
FactoryCraft/CraftingStorage.cpp

@@ -6,6 +6,9 @@
 #include "Inventory.h"
 #include "Item.h"
 
+#undef min
+#undef max
+
 BasicShapedCrafter::BasicShapedCrafter(
     int width, int height, Inventory* zInventory, Framework::Text recipieList)
     : zInventory(zInventory),

+ 23 - 21
FactoryCraft/DimensionGenerator.cpp

@@ -94,34 +94,29 @@ DimensionGenerator::getGeneratedStructoresForArea(
                        + (int)(biom->zHeightMapNoise()->getNoise(
                                    (double)(x), (double)(y), 0.0)
                                * (MAX_AIR_LEVEL - MIN_AIR_LEVEL));
-            for (int z = minSearchZ; z <= maxSearchZ; z++)
+            for (int z = minSearchZ; z <= maxSearchZ && z < height; z++)
             {
-                if (z < height)
+                double rValue = structureNoise->getNoise((double)x, (double)y, (double)z);
+                double probSum = 0;
+                for (auto t : biom->getTemplates())
                 {
-                    double rValue = structureNoise->getNoise(
-                        (double)x, (double)y, (double)z);
-                    double probSum = 0;
-                    for (auto t : biom->getTemplates())
+                    if (t->isGenerationPossable(
+                            Framework::Vec3<int>(x, y, z), height - z))
                     {
-                        if (t->isGenerationPossable(
-                                Framework::Vec3<int>(x, y, z), height - z))
+                        if (rValue - probSum <= t->getPropability())
                         {
-                            if (rValue - probSum <= t->getPropability())
-                            {
-                                result->add(
-                                    t->generateAt(Framework::Vec3<int>(x, y, z),
-                                        structureNoise,
-                                        dimensionId));
-                                break;
-                            }
+                            result->add(
+                                t->generateAt(Framework::Vec3<int>(x, y, z),
+                                    structureNoise,
+                                    dimensionId));
+                            break;
                         }
-                        probSum += t->getPropability();
                     }
+                    probSum += t->getPropability();
                 }
             }
         }
     }
-
     return result;
 }
 
@@ -129,6 +124,8 @@ Chunk* DimensionGenerator::generateChunk(int centerX, int centerY)
 {
     std::cout << "generating chunk " << centerX << ", " << centerY << "\n";
     double structureTime = 0;
+    double structureTime2 = 0;
+    double structureTime3 = 0;
     double caveTime = 0;
     double blockGenTime = 0;
     double biomTime = 0;
@@ -192,15 +189,18 @@ Chunk* DimensionGenerator::generateChunk(int centerX, int centerY)
                     if (structure->isBlockAffected(
                             Framework::Vec3<int>(x + centerX, y + centerY, z)))
                     {
+                        zm.messungEnde();
+                        structureTime2 += zm.getSekunden();
+                        zm.messungStart();
                         generated = structure->generateBlockAt(
                             Framework::Vec3<int>(x + centerX, y + centerY, z));
                         structureAffected = 1;
                         zm.messungEnde();
-                        structureTime += zm.getSekunden();
+                        structureTime3 += zm.getSekunden();
                         break;
                     }
                     zm.messungEnde();
-                    structureTime += zm.getSekunden();
+                    structureTime2 += zm.getSekunden();
                 }
                 if (!structureAffected)
                 {
@@ -248,7 +248,9 @@ Chunk* DimensionGenerator::generateChunk(int centerX, int centerY)
     caveGen->release();
     structures->release();
     zmGlobal.messungEnde();
-    std::cout << "structureTime: " << structureTime << "\n";
+    std::cout << "structureGenerationTime: " << structureTime << "\n";
+    std::cout << "structure.isBlockAffected: " << structureTime2 << "\n";
+    std::cout << "structure.generateBlockAt: " << structureTime3 << "\n";
     std::cout << "caveTime: " << caveTime << "\n";
     std::cout << "blockGenTime: " << blockGenTime << "\n";
     std::cout << "biomTime: " << biomTime << "\n";

+ 1 - 1
FactoryCraft/GrowingPlant.cpp

@@ -126,7 +126,7 @@ GrowingPlantBlockType::GrowingPlantBlockType(int typeId,
     const char* readableName,
     int ticksNeeded,
     int mapColor)
-    : BlockType(typeId, 0, model, 1, 10.f, 0, name, true, mapColor),
+    : BlockType(typeId, 0, model, 1, 10, 0, name, true, mapColor),
       transparent(1),
       passable(1),
       hardness(0.1f),

+ 6 - 5
FactoryCraft/Inventory.cpp

@@ -168,7 +168,7 @@ MultipleInventoryLock::MultipleInventoryLock(Inventory** inventories, int count)
       locked(0)
 {
     // sort given inventories in locking order
-    bool used[count];
+    bool* used = new bool[count];
     memset(&used, 0, count);
     // TODO: use a performant sorting algorithm
     for (int i = 0; i < count; i++)
@@ -215,6 +215,7 @@ MultipleInventoryLock::MultipleInventoryLock(Inventory** inventories, int count)
         used[minJ] = 1;
     }
     lock();
+    delete[] used;
 }
 
 MultipleInventoryLock::~MultipleInventoryLock()
@@ -257,7 +258,7 @@ Inventory::Inventory(const Framework::Vec3<float> location, bool hasInventory)
         pullSlotsOrder = new Framework::RCArray<ItemSlot>();
         pushSlotsOrder = new Framework::RCArray<ItemSlot>();
         itemCache = new Framework::HashMap<int, Framework::Array<ItemSlot*>*>(
-            ITEM_CACHE_SIZE, std::_Identity<int>());
+            ITEM_CACHE_SIZE, [](int key) { return key; });
     }
     else
     {
@@ -362,8 +363,7 @@ void Inventory::afterPushStack(
     else
     {
         NetworkMessage* msg = new NetworkMessage();
-        char* message
-            = new char[30 + zItem->getName().getLength()];
+        char* message = new char[30 + zItem->getName().getLength()];
         message[0] = 2; // add new stack
         *(int*)(message + 1) = zSlot->getId();
         *(int*)(message + 5) = zSlot->getNumberOfItems();
@@ -554,7 +554,8 @@ void Inventory::addItems(ItemStack* zItems, Direction dir, ItemFilter* zFilter)
         for (auto targetSlot = pushSlotsOrder->begin(); targetSlot;
              targetSlot++)
         {
-            if (!targetSlot->isFull() && (!zFilter || zFilter->matchTargetSlot(targetSlot)))
+            if (!targetSlot->isFull()
+                && (!zFilter || zFilter->matchTargetSlot(targetSlot)))
             {
                 if (targetSlot->zStack())
                 {

+ 4 - 0
FactoryCraft/ItemEntity.cpp

@@ -2,6 +2,10 @@
 
 #include "Game.h"
 
+#ifdef _WINDOWS
+#    define __INT32_MAX__ 0x7FFFFFFF
+#endif
+
 ItemEntity::ItemEntity(
     Framework::Vec3<float> location, int dimensionId, int entityId)
     : Entity(EntityTypeEnum::ITEM, location, dimensionId, entityId)

+ 10 - 6
FactoryCraft/Server.h

@@ -2,7 +2,11 @@
 
 #include <Datei.h>
 #include <InitDatei.h>
+#ifdef _WINDOWS
+#include <Network\Server.h>
+#else
 #include <Server.h>
+#endif
 #include <Text.h>
 #include <Thread.h>
 
@@ -41,9 +45,9 @@ public:
 class FCKlient : public Thread
 {
 private:
-    SSLSKlient* klient;
-    SKlient* background;
-    SKlient* foreground;
+    Network::SSLSKlient* klient;
+    Network::SKlient* background;
+    Network::SKlient* foreground;
     FactoryCraftServer* ls;
     GameClient* zGameClient;
     NetworkReader* backgroundReader;
@@ -58,11 +62,11 @@ private:
 
 public:
     // Konstruktor
-    FCKlient(SSLSKlient* klient, FactoryCraftServer* ls);
+    FCKlient(Network::SSLSKlient* klient, FactoryCraftServer* ls);
     // Destruktor
     virtual ~FCKlient();
-    void setForegroundClient(SKlient* foreground);
-    void setBackgroundClient(SKlient* background);
+    void setForegroundClient(Network::SKlient* foreground);
+    void setBackgroundClient(Network::SKlient* background);
     // nicht constant
     void absturz();
     void thread();

+ 10 - 3
FactoryCraft/Start.cpp

@@ -5,7 +5,9 @@
 #include <Globals.h>
 #include <iostream>
 #include <Klient.h>
+#ifndef _WINDOWS
 #include <sys/resource.h>
+#endif
 #include <Text.h>
 #include <Zeit.h>
 #include <AsynchronCall.h>
@@ -26,18 +28,21 @@ void exit()
 }
 
 int main()
-{    
+{
+    Framework::initFramework();
+    
     initializeBlockTypes();
     initializeItemTypes();
     initializeEntityTypes();
     initializeDimensions();
     initializeMultiblockTypes();
 
+#ifndef _WINDOWS
     struct rlimit core_limits;
     core_limits.rlim_cur = core_limits.rlim_max = RLIM_INFINITY;
     setrlimit(RLIMIT_CORE, &core_limits);
 
-    Framework::initFramework();
+#endif
     Zeit* z = getZeit();
     Text* pfad = new Text("log/");
     pfad->append(z->getZeit("y-m-d_h-i-s.log"));
@@ -46,7 +51,9 @@ int main()
     std::ofstream file;
     file.open(pfad->getText());
     std::streambuf* sbuf = std::cout.rdbuf();
-    // std::cout.rdbuf( file.rdbuf() );
+    #ifndef _DEBUG
+    std::cout.rdbuf( file.rdbuf() );
+    #endif
     pfad->release();
 
     std::cout << "Starting...\n";

+ 10 - 2
FactoryCraft/TickWorker.cpp

@@ -1,7 +1,11 @@
 #include "TickWorker.h"
 
-#include <sys/syscall.h>
-#include <unistd.h>
+#ifndef _WINDOWS
+#    include <sys/syscall.h>
+#    include <unistd.h>
+#else
+#    define pid_t int
+#endif
 
 #include "Block.h"
 
@@ -26,7 +30,11 @@ void TickWorker::thread()
     // do not use multiple << here because they are not printed at once with
     // multiple threads
     pid_t tid;
+#ifdef _WINDOWS
+    tid = (int)(__int64)getThreadHandle();
+#else
     tid = (pid_t)syscall(SYS_gettid);
+#endif
     Framework::Text txt = Framework::Text("exiting tick worker ") + tid + "\n";
     std::cout << txt.getText();
 }

+ 15 - 1
FactoryCraft/WorldGenerator.cpp

@@ -1,5 +1,6 @@
 #include "WorldGenerator.h"
 
+#include <Betriebssystem.h>
 #include <functional>
 
 #include "Game.h"
@@ -39,7 +40,7 @@ void WorldGenerator::thread()
         cs.unlock();
         if (!hasNext)
         {
-            sleep(1);
+            Sleep(1000);
             continue;
         }
         Punkt start = Game::INSTANCE->getChunkCenter(next.startX, next.startY);
@@ -58,8 +59,18 @@ void WorldGenerator::thread()
                         = StaticRegistry<DimensionGenerator>::INSTANCE
                               .zElement(next.dimensionId)
                               ->generateChunk(x, y);
+                    ZeitMesser zm;
+                    zm.messungStart();
                     generatedChunk->initializeLightning();
+                    zm.messungEnde();
+                    std::cout << "light calculation: " << zm.getSekunden()
+                              << "\n";
+                    zm.messungStart();
                     generatedChunk->removeUnusedBlocks();
+                    zm.messungEnde();
+                    std::cout << "unused block removal: " << zm.getSekunden()
+                              << "\n";
+                    zm.messungStart();
                     Dimension* dim
                         = Game::INSTANCE->zDimension(next.dimensionId);
                     if (!dim)
@@ -68,6 +79,9 @@ void WorldGenerator::thread()
                         Game::INSTANCE->addDimension(dim);
                     }
                     dim->setChunk(generatedChunk, Punkt(x, y));
+                    zm.messungEnde();
+                    std::cout << "adding chunk to map: " << zm.getSekunden()
+                              << "\n";
                 }
             }
         }

BIN
Windows Version/Framework.dll


+ 0 - 217
Windows Version/Start.cpp

@@ -1,217 +0,0 @@
-#include <AsynchronCall.h>
-#include <Bild.h>
-#include <Bildschirm.h>
-#include <Fenster.h>
-#include <Globals.h>
-#include <iostream>
-#include <RenderThread.h>
-#include <string.h>
-
-#include "FastNoiseLite.h"
-#include "FastNoiseWrapper.h"
-#include "RandNoise.h"
-#include "ShapedNoise.h"
-
-using namespace Framework;
-
-WFenster* window;
-Bild* img;
-Vec3<int> position(0, 0, 0);
-int zoom = 1;
-bool exitF = 0;
-Noise* wrapper;
-float border = 0.5;
-float border2 = -1;
-bool showValue = 1;
-
-void updateView()
-{
-    Vec3<int> minP
-        = position
-        - Vec3<int>(img->getBreite() / 2, img->getHeight() / 2, 0) / zoom;
-    Vec3<int> maxP
-        = position
-        + Vec3<int>(img->getBreite() / 2, img->getHeight() / 2, 0) / zoom;
-    int counter = 0;
-    double min = INFINITY;
-    double max = -INFINITY;
-    for (int i = 0; i < img->getBreite(); i++)
-    {
-        for (int j = 0; j < img->getHeight(); j++)
-        {
-            Vec3<int> pos(i, j, 0);
-            pos -= Vec3<int>(img->getBreite() / 2, img->getHeight() / 2, 0);
-            pos /= zoom;
-            pos += position;
-			double noise = wrapper->getNoise(pos.x, pos.y, pos.z);
-            if (noise > max)
-            {
-                max = noise;
-            }
-            if (noise < min)
-            {
-                min = noise;
-            }
-            if (showValue)
-            {
-                int value = (int)(noise * 255);
-                img->setPixelDP(
-                    i, j, 0xFF000000 | (value << 16) | (value << 8) | value);
-            }
-            else
-            {
-                if (noise < border && noise > border2)
-                {
-                    img->setPixelDP(i, j, 0xFFFFFFFF);
-                    counter++;
-                }
-                else
-                {
-                    img->setPixelDP(i, j, 0xFF000000);
-                }
-            }
-        }
-    }
-    float percentage = ((float)counter / (img->getBreite() * img->getHeight())) * 100;
-    std::cout << "Showing " << minP.x << " " << minP.y << " to " << maxP.x
-              << " " << maxP.y << " at height " << position.z << " with border "
-              << border2 << " to "
-              << border << " true for " << percentage << "% of "
-              << (img->getBreite() / zoom) * (img->getHeight() / zoom)
-              << " blocks. Min: " << min << " Max: " << max
-              << std::endl;
-}
-
-int main()
-{
-    Framework::initFramework();
-    FastNoiseLite* noise = new FastNoiseLite(0);
-    noise->SetNoiseType(FastNoiseLite::NoiseType::NoiseType_ValueCubic);
-    wrapper = new FastNoiseWrapper(noise, 0);
-    ((FastNoiseWrapper*)wrapper)->setMultiplier(0.2f);
-    /* FastNoiseLite* noise = new FastNoiseLite(0);
-    noise->SetNoiseType(FastNoiseLite::NoiseType::NoiseType_ValueCubic);
-    noise->SetFrequency(3.f);
-    wrapper = new FastNoiseWrapper(noise, 0);*/
-    /* FastNoiseLite* n = new FastNoiseLite(0);
-    n->SetNoiseType(FastNoiseLite::NoiseType::NoiseType_Cellular);
-    n->SetFrequency(0.005f);
-    n->SetRotationType3D(FastNoiseLite::RotationType3D::RotationType3D_None);
-    n->SetCellularDistanceFunction(FastNoiseLite::CellularDistanceFunction::
-            CellularDistanceFunction_Hybrid);
-    n->SetCellularJitter(1.f);
-    n->SetCellularReturnType(
-        FastNoiseLite::CellularReturnType::CellularReturnType_CellValue);
-    n->SetFractalType(
-        FastNoiseLite::FractalType::FractalType_DomainWarpIndependent);
-    n->SetDomainWarpType(
-        FastNoiseLite::DomainWarpType::DomainWarpType_OpenSimplex2);
-    n->SetDomainWarpAmp(100.f);
-    n->SetFractalOctaves(3.f);
-    n->SetFractalLacunarity(2.f);
-    n->SetFractalGain(0.5f);
-    wrapper = new FastNoiseWrapper(n, 0);
-    wrapper = new ShapedNoise(wrapper);
-    ((ShapedNoise*)wrapper)->setNeighborOffset(4.f);
-    wrapper = new RandNoise(34255);*/
-
-    img = new Bild();
-    img->neuBild(1600, 1600, 0xFF000000);
-
-    BildZ* view = new BildZ();
-    view->setBildZ(img);
-    view->setStyle(BildZ::Style::Sichtbar);
-    view->setSize(800, 800);
-
-    WNDCLASS wc = Framework::F_Normal(GetModuleHandle(NULL));
-    wc.lpszClassName = "Fenster";
-    window = new WFenster();
-    window->erstellen(WS_OVERLAPPEDWINDOW, wc);
-    window->setSize(800, 800);
-    window->setPosition(100, 100);
-    window->setAnzeigeModus(SW_SHOW);
-    window->setVSchließAktion([](void* p, void* o) {
-        StopNachrichtenSchleife(window->getFensterHandle());
-    });
-
-    Bildschirm* screen = new Bildschirm2D(window);
-    window->setBildschirm(dynamic_cast<Bildschirm*>(screen->getThis()));
-    screen->addMember(view);
-    screen->setTestRend(0);
-    screen->update();
-    screen->render();
-    RenderTh* rth = new RenderTh();
-    rth->setQuiet(1);
-    rth->setBildschirm(screen);
-    rth->beginn();
-
-    updateView();
-
-    new AsynchronCall([]() {
-        char line[256];
-        while (!exitF)
-        {
-            std::cin.getline(line, 256);
-            if (strcmp(line, "exit") == 0)
-            {
-                StopNachrichtenSchleife(window->getFensterHandle());
-                break;
-            }
-            Text txt(line);
-            if (txt.positionVon("show ") == 0)
-            {
-                Text* x = txt.getTeilText(5);
-                position.x = (int)*x;
-                Text* y = x->getTeilText(x->positionVon(" ") + 1);
-                position.y = (int)*y;
-                Text* z = y->getTeilText(y->positionVon(" ") + 1);
-                position.z = (int)*z;
-                updateView();
-                z->release();
-                y->release();
-                x->release();
-            }
-            if (txt.positionVon("border ") == 0)
-            {
-				Text* x = txt.getTeilText(7);
-				border = (float)*x;
-				updateView();
-				x->release();
-            }
-            if (txt.positionVon("border2 ") == 0)
-            {
-                Text* x = txt.getTeilText(7);
-                border2 = (float)*x;
-                updateView();
-                x->release();
-            }
-			if (txt.positionVon("zoom ") == 0)
-			{
-				Text* x = txt.getTeilText(5);
-				zoom = (int)*x;
-				updateView();
-				x->release();
-            }
-            if (txt.positionVon("show value") == 0)
-            {
-                showValue = 1;
-                updateView();
-            }
-            if (txt.positionVon("show border") == 0)
-            {
-                showValue = 0;
-                updateView();
-            }
-        }
-    });
-
-    StartNachrichtenSchleife();
-
-    exitF = 1;
-
-    rth->beenden();
-    window->setBildschirm(0);
-    rth->release();
-    Framework::releaseFramework();
-    return 0;
-}

+ 164 - 7
Windows Version/Windows Version.vcxproj

@@ -50,7 +50,7 @@
     <UseDebugLibraries>false</UseDebugLibraries>
     <PlatformToolset>v143</PlatformToolset>
     <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
+    <CharacterSet>MultiByte</CharacterSet>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -71,11 +71,16 @@
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <IncludePath>..\..\..\..\..\Allgemein\Framework;..\FactoryCraft;;$(IncludePath)</IncludePath>
-    <LibraryPath>..\..\..\..\..\Allgemein\Framework\x64\debug;$(LibraryPath)</LibraryPath>
+    <IncludePath>..\..\..\..\..\Allgemein\Framework;..\FactoryCraft;..\..\..\..\..\Allgemein\Network\Network;..\..\..\..\..\Allgemein\Network;$(IncludePath)</IncludePath>
+    <LibraryPath>..\..\..\..\..\Allgemein\Framework\x64\debug;..\..\..\..\..\Allgemein\Network\x64\debug;$(LibraryPath)</LibraryPath>
     <CustomBuildBeforeTargets>Build</CustomBuildBeforeTargets>
     <SourcePath>..\FactoryCraft;$(SourcePath)</SourcePath>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <IncludePath>..\..\..\..\..\Allgemein\Framework;..\FactoryCraft;..\..\..\..\..\Allgemein\Network\Network;..\..\..\..\..\Allgemein\Network;$(IncludePath)</IncludePath>
+    <LibraryPath>..\..\..\..\..\Allgemein\Framework\x64\release;..\..\..\..\..\Allgemein\Network\x64\release;$(LibraryPath)</LibraryPath>
+    <SourcePath>..\FactoryCraft;$(SourcePath)</SourcePath>
+  </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
       <WarningLevel>Level3</WarningLevel>
@@ -108,16 +113,19 @@
     <ClCompile>
       <WarningLevel>Level3</WarningLevel>
       <SDLCheck>true</SDLCheck>
-      <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>_DEBUG;_CONSOLE;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ConformanceMode>true</ConformanceMode>
+      <LanguageStandard>stdcpp17</LanguageStandard>
     </ClCompile>
     <Link>
       <SubSystem>Console</SubSystem>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>Framework.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>Framework.lib;Network.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
     <CustomBuildStep>
       <Command>copy ..\..\..\..\..\Allgemein\Framework\x64\debug\Framework.dll Framework.dll</Command>
+      <Command>copy ..\..\..\..\..\Allgemein\Network\x64\debug\Network.dll Network.dll
+copy ..\..\..\..\..\Allgemein\Framework\x64\debug\Framework.dll Framework.dll</Command>
     </CustomBuildStep>
     <CustomBuildStep>
       <Outputs>kopieren ...;%(Outputs)</Outputs>
@@ -129,31 +137,180 @@
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <SDLCheck>true</SDLCheck>
-      <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>NDEBUG;_CONSOLE;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ConformanceMode>true</ConformanceMode>
+      <LanguageStandard>stdcpp17</LanguageStandard>
     </ClCompile>
     <Link>
       <SubSystem>Console</SubSystem>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
       <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>Framework.lib;Network.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
+    <CustomBuildStep>
+      <Command>copy ..\..\..\..\..\Allgemein\Network\x64\release\Network.dll Network.dll
+copy ..\..\..\..\..\Allgemein\Framework\x64\release\Framework.dll Framework.dll</Command>
+    </CustomBuildStep>
+    <CustomBuildStep>
+      <Outputs>Kopieren ...;%(Outputs)</Outputs>
+    </CustomBuildStep>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClCompile Include="..\FactoryCraft\AddEntityUpdate.cpp" />
+    <ClCompile Include="..\FactoryCraft\Area.cpp" />
+    <ClCompile Include="..\FactoryCraft\Axe.cpp" />
+    <ClCompile Include="..\FactoryCraft\BasicBlock.cpp" />
+    <ClCompile Include="..\FactoryCraft\BasicItems.cpp" />
+    <ClCompile Include="..\FactoryCraft\BasicTool.cpp" />
+    <ClCompile Include="..\FactoryCraft\BiomGenerator.cpp" />
+    <ClCompile Include="..\FactoryCraft\Block.cpp" />
+    <ClCompile Include="..\FactoryCraft\BlockType.cpp" />
+    <ClCompile Include="..\FactoryCraft\CaveGenerator.cpp" />
+    <ClCompile Include="..\FactoryCraft\Chat.cpp" />
+    <ClCompile Include="..\FactoryCraft\ChatCommand.cpp" />
+    <ClCompile Include="..\FactoryCraft\ChatCommandExecutor.cpp" />
+    <ClCompile Include="..\FactoryCraft\ChatMessage.cpp" />
+    <ClCompile Include="..\FactoryCraft\ChatObserver.cpp" />
+    <ClCompile Include="..\FactoryCraft\Chunk.cpp" />
+    <ClCompile Include="..\FactoryCraft\ChunkMap.cpp" />
+    <ClCompile Include="..\FactoryCraft\CraftingStorage.cpp" />
+    <ClCompile Include="..\FactoryCraft\Dimension.cpp" />
+    <ClCompile Include="..\FactoryCraft\DimensionGenerator.cpp" />
+    <ClCompile Include="..\FactoryCraft\DimensionMap.cpp" />
+    <ClCompile Include="..\FactoryCraft\DoLaterHandler.cpp" />
+    <ClCompile Include="..\FactoryCraft\Entity.cpp" />
+    <ClCompile Include="..\FactoryCraft\EntityRemovedUpdate.cpp" />
+    <ClCompile Include="..\FactoryCraft\EntityType.cpp" />
     <ClCompile Include="..\FactoryCraft\FastNoiseWrapper.cpp" />
+    <ClCompile Include="..\FactoryCraft\FluidBlock.cpp" />
+    <ClCompile Include="..\FactoryCraft\Game.cpp" />
+    <ClCompile Include="..\FactoryCraft\GeneratedStructure.cpp" />
+    <ClCompile Include="..\FactoryCraft\GenerationTemplate.cpp" />
+    <ClCompile Include="..\FactoryCraft\GrantCommand.cpp" />
+    <ClCompile Include="..\FactoryCraft\GrasslandBiom.cpp" />
+    <ClCompile Include="..\FactoryCraft\Grass.cpp" />
+    <ClCompile Include="..\FactoryCraft\Hoe.cpp" />
+    <ClCompile Include="..\FactoryCraft\Inventory.cpp" />
+    <ClCompile Include="..\FactoryCraft\Item.cpp" />
+    <ClCompile Include="..\FactoryCraft\ItemEntity.cpp" />
+    <ClCompile Include="..\FactoryCraft\ItemFilter.cpp" />
+    <ClCompile Include="..\FactoryCraft\ItemModifier.cpp" />
+    <ClCompile Include="..\FactoryCraft\ItemSkill.cpp" />
+    <ClCompile Include="..\FactoryCraft\ItemSlot.cpp" />
+    <ClCompile Include="..\FactoryCraft\ItemStack.cpp" />
+    <ClCompile Include="..\FactoryCraft\ItemType.cpp" />
+    <ClCompile Include="..\FactoryCraft\LightSources.cpp" />
+    <ClCompile Include="..\FactoryCraft\ModelInfo.cpp" />
+    <ClCompile Include="..\FactoryCraft\MultiblockStructure.cpp" />
+    <ClCompile Include="..\FactoryCraft\MultiblockTree.cpp" />
+    <ClCompile Include="..\FactoryCraft\NetworkMessage.cpp" />
+    <ClCompile Include="..\FactoryCraft\NoBlock.cpp" />
     <ClCompile Include="..\FactoryCraft\Noise.cpp" />
+    <ClCompile Include="..\FactoryCraft\OverworldDimension.cpp" />
     <ClCompile Include="..\FactoryCraft\NoiseInterpolator.cpp" />
+    <ClCompile Include="..\FactoryCraft\Player.cpp" />
+    <ClCompile Include="..\FactoryCraft\PlayerHand.cpp" />
+    <ClCompile Include="..\FactoryCraft\PlayerRegister.cpp" />
+    <ClCompile Include="..\FactoryCraft\RecipieList.cpp" />
     <ClCompile Include="..\FactoryCraft\RandNoise.cpp" />
+    <ClCompile Include="..\FactoryCraft\Recipie.cpp" />
+    <ClCompile Include="..\FactoryCraft\RecipieLoader.cpp" />
+    <ClCompile Include="..\FactoryCraft\SaveCommand.cpp" />
+    <ClCompile Include="..\FactoryCraft\Server.cpp" />
     <ClCompile Include="..\FactoryCraft\ShapedNoise.cpp" />
-    <ClCompile Include="Start.cpp" />
+    <ClCompile Include="..\FactoryCraft\Start.cpp" />
+    <ClCompile Include="..\FactoryCraft\StaticInitializerOrder.cpp" />
+    <ClCompile Include="..\FactoryCraft\TickOrganizer.cpp" />
+    <ClCompile Include="..\FactoryCraft\TickQueue.cpp" />
+    <ClCompile Include="..\FactoryCraft\TickWorker.cpp" />
+    <ClCompile Include="..\FactoryCraft\TreeSeblingBlock.cpp" />
+    <ClCompile Include="..\FactoryCraft\TreeTemplate.cpp" />
+    <ClCompile Include="..\FactoryCraft\GrowingPlant.cpp" />
+    <ClCompile Include="..\FactoryCraft\WorldGenerator.cpp" />
+    <ClCompile Include="..\FactoryCraft\WorldLoader.cpp" />
+    <ClCompile Include="..\FactoryCraft\WorldUpdate.cpp" />
+    <ClCompile Include="..\FactoryCraft\WormCaveGenerator.cpp" />
   </ItemGroup>
   <ItemGroup>
+    <ClInclude Include="..\FactoryCraft\ChunkMap.h" />
+    <ClInclude Include="..\FactoryCraft\AddEntityUpdate.h" />
+    <ClInclude Include="..\FactoryCraft\Area.h" />
+    <ClInclude Include="..\FactoryCraft\Axe.h" />
+    <ClInclude Include="..\FactoryCraft\BasicBlocks.h" />
+    <ClInclude Include="..\FactoryCraft\BasicItems.h" />
+    <ClInclude Include="..\FactoryCraft\BasicTool.h" />
+    <ClInclude Include="..\FactoryCraft\BiomGenerator.h" />
+    <ClInclude Include="..\FactoryCraft\Block.h" />
+    <ClInclude Include="..\FactoryCraft\BlockType.h" />
+    <ClInclude Include="..\FactoryCraft\CaveGenerator.h" />
+    <ClInclude Include="..\FactoryCraft\ChatCommandExecutor.h" />
+    <ClInclude Include="..\FactoryCraft\ChatMessage.h" />
+    <ClInclude Include="..\FactoryCraft\ChatObserver.h" />
+    <ClInclude Include="..\FactoryCraft\Chunk.h" />
+    <ClInclude Include="..\FactoryCraft\ChatCommand.h" />
+    <ClInclude Include="..\FactoryCraft\Constants.h" />
+    <ClInclude Include="..\FactoryCraft\CraftingStorage.h" />
+    <ClInclude Include="..\FactoryCraft\DimensionGenerator.h" />
+    <ClInclude Include="..\FactoryCraft\DoLaterHandler.h" />
+    <ClInclude Include="..\FactoryCraft\Effect.h" />
+    <ClInclude Include="..\FactoryCraft\EffectFactory.h" />
+    <ClInclude Include="..\FactoryCraft\Entity.h" />
+    <ClInclude Include="..\FactoryCraft\EntityRemovedUpdate.h" />
+    <ClInclude Include="..\FactoryCraft\EntityType.h" />
     <ClInclude Include="..\FactoryCraft\FastNoiseLite.h" />
     <ClInclude Include="..\FactoryCraft\FastNoiseWrapper.h" />
+    <ClInclude Include="..\FactoryCraft\FluidBlock.h" />
+    <ClInclude Include="..\FactoryCraft\Game.h" />
+    <ClInclude Include="..\FactoryCraft\GeneratedStructure.h" />
+    <ClInclude Include="..\FactoryCraft\GenerationTemplate.h" />
+    <ClInclude Include="..\FactoryCraft\GrantCommand.h" />
+    <ClInclude Include="..\FactoryCraft\GrasslandBiom.h" />
+    <ClInclude Include="..\FactoryCraft\Grass.h" />
+    <ClInclude Include="..\FactoryCraft\Chat.h" />
+    <ClInclude Include="..\FactoryCraft\Hoe.h" />
+    <ClInclude Include="..\FactoryCraft\Inventory.h" />
+    <ClInclude Include="..\FactoryCraft\Item.h" />
+    <ClInclude Include="..\FactoryCraft\ItemEntity.h" />
+    <ClInclude Include="..\FactoryCraft\ItemFilter.h" />
+    <ClInclude Include="..\FactoryCraft\ItemModifier.h" />
+    <ClInclude Include="..\FactoryCraft\ItemSkill.h" />
+    <ClInclude Include="..\FactoryCraft\ItemSlot.h" />
+    <ClInclude Include="..\FactoryCraft\ItemStack.h" />
+    <ClInclude Include="..\FactoryCraft\ItemType.h" />
+    <ClInclude Include="..\FactoryCraft\LightSources.h" />
+    <ClInclude Include="..\FactoryCraft\DimensionMap.h" />
+    <ClInclude Include="..\FactoryCraft\ModelInfo.h" />
+    <ClInclude Include="..\FactoryCraft\MultiblockStructure.h" />
+    <ClInclude Include="..\FactoryCraft\MultiblockTree.h" />
+    <ClInclude Include="..\FactoryCraft\NetworkMessage.h" />
     <ClInclude Include="..\FactoryCraft\Noise.h" />
+    <ClInclude Include="..\FactoryCraft\NoBlock.h" />
+    <ClInclude Include="..\FactoryCraft\OverworldDimension.h" />
     <ClInclude Include="..\FactoryCraft\NoiseInterpolator.h" />
+    <ClInclude Include="..\FactoryCraft\Player.h" />
+    <ClInclude Include="..\FactoryCraft\PlayerHand.h" />
+    <ClInclude Include="..\FactoryCraft\PlayerRegister.h" />
     <ClInclude Include="..\FactoryCraft\RandNoise.h" />
+    <ClInclude Include="..\FactoryCraft\Recipie.h" />
+    <ClInclude Include="..\FactoryCraft\RecipieList.h" />
+    <ClInclude Include="..\FactoryCraft\RecipieLoader.h" />
+    <ClInclude Include="..\FactoryCraft\SaveCommand.h" />
+    <ClInclude Include="..\FactoryCraft\Server.h" />
+    <ClInclude Include="..\FactoryCraft\Dimension.h" />
     <ClInclude Include="..\FactoryCraft\ShapedNoise.h" />
+    <ClInclude Include="..\FactoryCraft\StaticRegistry.h" />
+    <ClInclude Include="..\FactoryCraft\Tickable.h" />
+    <ClInclude Include="..\FactoryCraft\TickOrganizer.h" />
+    <ClInclude Include="..\FactoryCraft\TickQueue.h" />
+    <ClInclude Include="..\FactoryCraft\TickWorker.h" />
+    <ClInclude Include="..\FactoryCraft\TreeSeblingBlock.h" />
+    <ClInclude Include="..\FactoryCraft\TreeTemplate.h" />
+    <ClInclude Include="..\FactoryCraft\GrowingPlant.h" />
+    <ClInclude Include="..\FactoryCraft\WorldGenerator.h" />
+    <ClInclude Include="..\FactoryCraft\WorldLoader.h" />
+    <ClInclude Include="..\FactoryCraft\WorldUpdate.h" />
+    <ClInclude Include="..\FactoryCraft\WormCaveGenerator.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">

+ 500 - 17
Windows Version/Windows Version.vcxproj.filters

@@ -1,31 +1,247 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
-    <Filter Include="Quelldateien">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    <Filter Include="world">
+      <UniqueIdentifier>{75490044-5425-4526-abd2-44130408d418}</UniqueIdentifier>
     </Filter>
-    <Filter Include="Headerdateien">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
+    <Filter Include="game">
+      <UniqueIdentifier>{26d8996d-452d-4c1f-b52b-82310b4ee42f}</UniqueIdentifier>
     </Filter>
-    <Filter Include="Ressourcendateien">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    <Filter Include="effects">
+      <UniqueIdentifier>{d758dbfd-2172-4c68-bc59-b39c289c28df}</UniqueIdentifier>
     </Filter>
-    <Filter Include="world">
-      <UniqueIdentifier>{f2444d9a-75ef-4407-9668-4c82e9472d2f}</UniqueIdentifier>
+    <Filter Include="entities">
+      <UniqueIdentifier>{56ad694e-70aa-4ef4-b698-7ff7755b3e60}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="world\blocks">
+      <UniqueIdentifier>{43e43bc7-14fe-4897-9ec3-746bb2c14489}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="static">
+      <UniqueIdentifier>{ae61cabe-b357-4f84-82c7-79379f6cbf4a}</UniqueIdentifier>
     </Filter>
     <Filter Include="world\generator">
-      <UniqueIdentifier>{54819644-878f-4628-a772-1f4e0e32a8f4}</UniqueIdentifier>
+      <UniqueIdentifier>{b84787f0-e7e4-4981-b256-153b0e86120d}</UniqueIdentifier>
     </Filter>
     <Filter Include="world\generator\noise">
-      <UniqueIdentifier>{c3f7e64b-58c8-48b0-8075-22752b1cfdf9}</UniqueIdentifier>
+      <UniqueIdentifier>{6a594ea1-a32c-4e11-9f2c-d694f42e9076}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="world\generator\bioms">
+      <UniqueIdentifier>{a69078f1-3e20-4b14-943e-9d02c4df470d}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="world\generator\dimensions">
+      <UniqueIdentifier>{b04d9ff5-ad58-41e2-8e72-8de835e09c99}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="world\ticking">
+      <UniqueIdentifier>{03a72d46-51b8-4f26-b04a-f5f4d4f5af6e}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="world\update">
+      <UniqueIdentifier>{05bf4218-e0cd-4d0d-bd7b-eaea87023838}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="world\loader">
+      <UniqueIdentifier>{12fac988-c4d8-4db8-b4a8-1c025f117866}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="server">
+      <UniqueIdentifier>{479ff7ea-4fb5-4721-88d5-6f98e4e2ea07}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="inventory">
+      <UniqueIdentifier>{4d2e1a89-01ec-4f99-8aed-62d2e9707db9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="server\response">
+      <UniqueIdentifier>{bc887e43-0958-4685-91b8-670eee24b5c0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="inventory\items">
+      <UniqueIdentifier>{eb49f18d-6127-4d38-87db-e8427471535f}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="world\generator\templates">
+      <UniqueIdentifier>{99cadedd-b0ee-484d-8a9d-1edd793f169d}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="world\generator\templates\implementations">
+      <UniqueIdentifier>{c2b3a832-eac2-4bf5-bb1f-3e804afd7e71}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="inventory\recipies">
+      <UniqueIdentifier>{3289186e-1fb6-40a2-afb6-f9c87adaec62}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="world\generator\caves">
+      <UniqueIdentifier>{0a074c6e-f64a-4854-9f25-a8e933272e29}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="world\structures">
+      <UniqueIdentifier>{5565ec67-00d8-460a-b202-9b22323697e4}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="inventory\items\tools">
+      <UniqueIdentifier>{1dafa00c-6eca-4e1f-aeda-ba7c1b95265d}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="world\blocks\plants">
+      <UniqueIdentifier>{4d1a59d1-2b8c-447f-b1fb-ae6e07b60983}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="world\blocks\fluids">
+      <UniqueIdentifier>{677a56aa-6e9d-465c-bdcf-83118b2fc3d2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="chat">
+      <UniqueIdentifier>{4b976a90-56a3-4842-96f2-a5b9c07ef8a7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="chat\commands">
+      <UniqueIdentifier>{547d8b22-5902-40ce-9510-e54cabab093d}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="world\map">
+      <UniqueIdentifier>{cdafc254-a7ce-4911-8534-20ebcee5bec8}</UniqueIdentifier>
     </Filter>
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="Start.cpp">
-      <Filter>Quelldateien</Filter>
+    <ClCompile Include="..\FactoryCraft\Server.cpp">
+      <Filter>server</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\BlockType.cpp">
+      <Filter>world</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\Block.cpp">
+      <Filter>world</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\BasicBlock.cpp">
+      <Filter>world\blocks</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\Start.cpp">
+      <Filter>server</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\StaticInitializerOrder.cpp">
+      <Filter>static</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\ItemType.cpp">
+      <Filter>inventory</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\DimensionGenerator.cpp">
+      <Filter>world\generator</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\WorldGenerator.cpp">
+      <Filter>world\generator</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\OverworldDimension.cpp">
+      <Filter>world\generator\dimensions</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\GrasslandBiom.cpp">
+      <Filter>world\generator\bioms</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\BiomGenerator.cpp">
+      <Filter>world\generator</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\TickWorker.cpp">
+      <Filter>world\ticking</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\TickOrganizer.cpp">
+      <Filter>world\ticking</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\TickQueue.cpp">
+      <Filter>world\ticking</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\Item.cpp">
+      <Filter>inventory</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\Chunk.cpp">
+      <Filter>world</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\WorldLoader.cpp">
+      <Filter>world\loader</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\WorldUpdate.cpp">
+      <Filter>world\update</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\Dimension.cpp">
+      <Filter>world</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\ItemStack.cpp">
+      <Filter>inventory</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\ItemSlot.cpp">
+      <Filter>inventory</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\ItemSkill.cpp">
+      <Filter>inventory</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\ItemFilter.cpp">
+      <Filter>inventory</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\Inventory.cpp">
+      <Filter>inventory</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\Area.cpp">
+      <Filter>world</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\Entity.cpp">
+      <Filter>entities</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\EntityType.cpp">
+      <Filter>entities</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\Player.cpp">
+      <Filter>entities</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\Game.cpp">
+      <Filter>game</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\NetworkMessage.cpp">
+      <Filter>server\response</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\NoBlock.cpp">
+      <Filter>world\blocks</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\PlayerHand.cpp">
+      <Filter>inventory\items</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\ItemEntity.cpp">
+      <Filter>entities</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\AddEntityUpdate.cpp">
+      <Filter>world\update</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\EntityRemovedUpdate.cpp">
+      <Filter>world\update</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\GeneratedStructure.cpp">
+      <Filter>world\generator\templates</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\GenerationTemplate.cpp">
+      <Filter>world\generator\templates</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\TreeTemplate.cpp">
+      <Filter>world\generator\templates\implementations</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\RecipieLoader.cpp">
+      <Filter>inventory\recipies</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\Recipie.cpp">
+      <Filter>inventory\recipies</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\CraftingStorage.cpp">
+      <Filter>inventory\recipies</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\ModelInfo.cpp">
+      <Filter>static</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\DoLaterHandler.cpp">
+      <Filter>server</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\BasicItems.cpp">
+      <Filter>inventory\items</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\LightSources.cpp">
+      <Filter>world\blocks</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\WormCaveGenerator.cpp">
+      <Filter>world\generator\caves</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\CaveGenerator.cpp">
+      <Filter>world\generator\caves</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\ItemModifier.cpp">
+      <Filter>inventory\recipies</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\MultiblockStructure.cpp">
+      <Filter>world\structures</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\MultiblockTree.cpp">
+      <Filter>world\structures</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\TreeSeblingBlock.cpp">
+      <Filter>world\blocks</Filter>
     </ClCompile>
     <ClCompile Include="..\FactoryCraft\FastNoiseWrapper.cpp">
       <Filter>world\generator\noise</Filter>
@@ -42,14 +258,230 @@
     <ClCompile Include="..\FactoryCraft\ShapedNoise.cpp">
       <Filter>world\generator\noise</Filter>
     </ClCompile>
+    <ClCompile Include="..\FactoryCraft\Grass.cpp">
+      <Filter>world\blocks</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\Hoe.cpp">
+      <Filter>inventory\items\tools</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\BasicTool.cpp">
+      <Filter>inventory\items\tools</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\GrowingPlant.cpp">
+      <Filter>world\blocks\plants</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\FluidBlock.cpp">
+      <Filter>world\blocks\fluids</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\RecipieList.cpp">
+      <Filter>inventory\recipies</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\Axe.cpp">
+      <Filter>inventory\items\tools</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\SaveCommand.cpp">
+      <Filter>chat\commands</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\Chat.cpp">
+      <Filter>chat</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\ChatCommandExecutor.cpp">
+      <Filter>chat</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\ChatCommand.cpp">
+      <Filter>chat</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\ChatObserver.cpp">
+      <Filter>chat</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\ChatMessage.cpp">
+      <Filter>chat</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\GrantCommand.cpp">
+      <Filter>chat\commands</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\PlayerRegister.cpp">
+      <Filter>game</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\ChunkMap.cpp">
+      <Filter>world\map</Filter>
+    </ClCompile>
+    <ClCompile Include="..\FactoryCraft\DimensionMap.cpp">
+      <Filter>world\map</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
-    <ClInclude Include="..\FactoryCraft\FastNoiseWrapper.h">
-      <Filter>world\generator\noise</Filter>
+    <ClInclude Include="..\FactoryCraft\Chunk.h">
+      <Filter>world</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\Block.h">
+      <Filter>world</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\BlockType.h">
+      <Filter>world</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\Dimension.h">
+      <Filter>world</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\Game.h">
+      <Filter>game</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\Player.h">
+      <Filter>entities</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\Item.h">
+      <Filter>inventory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\ItemStack.h">
+      <Filter>inventory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\Inventory.h">
+      <Filter>inventory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\ItemType.h">
+      <Filter>inventory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\ItemSlot.h">
+      <Filter>inventory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\Effect.h">
+      <Filter>effects</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\EffectFactory.h">
+      <Filter>effects</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\ItemSkill.h">
+      <Filter>inventory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\Entity.h">
+      <Filter>entities</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\BasicBlocks.h">
+      <Filter>world\blocks</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\StaticRegistry.h">
+      <Filter>static</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\WorldGenerator.h">
+      <Filter>world\generator</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\BiomGenerator.h">
+      <Filter>world\generator</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\DimensionGenerator.h">
+      <Filter>world\generator</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\GrasslandBiom.h">
+      <Filter>world\generator\bioms</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\OverworldDimension.h">
+      <Filter>world\generator\dimensions</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\Constants.h">
+      <Filter>game</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\TickWorker.h">
+      <Filter>world\ticking</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\TickQueue.h">
+      <Filter>world\ticking</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\TickOrganizer.h">
+      <Filter>world\ticking</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\WorldUpdate.h">
+      <Filter>world\update</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\EntityType.h">
+      <Filter>entities</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\WorldLoader.h">
+      <Filter>world\loader</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\Area.h">
+      <Filter>world</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\ItemFilter.h">
+      <Filter>inventory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\Server.h">
+      <Filter>server</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\NetworkMessage.h">
+      <Filter>server\response</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\NoBlock.h">
+      <Filter>world\blocks</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\PlayerHand.h">
+      <Filter>inventory\items</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\ItemEntity.h">
+      <Filter>entities</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\AddEntityUpdate.h">
+      <Filter>world\update</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\EntityRemovedUpdate.h">
+      <Filter>world\update</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\GenerationTemplate.h">
+      <Filter>world\generator\templates</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\GeneratedStructure.h">
+      <Filter>world\generator\templates</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\TreeTemplate.h">
+      <Filter>world\generator\templates\implementations</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\Recipie.h">
+      <Filter>inventory\recipies</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\CraftingStorage.h">
+      <Filter>inventory\recipies</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\RecipieList.h">
+      <Filter>inventory\recipies</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\RecipieLoader.h">
+      <Filter>inventory\recipies</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\ModelInfo.h">
+      <Filter>static</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\DoLaterHandler.h">
+      <Filter>server</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\BasicItems.h">
+      <Filter>inventory\items</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\LightSources.h">
+      <Filter>world\blocks</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\CaveGenerator.h">
+      <Filter>world\generator\caves</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\WormCaveGenerator.h">
+      <Filter>world\generator\caves</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\ItemModifier.h">
+      <Filter>inventory\recipies</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\MultiblockStructure.h">
+      <Filter>world\structures</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\MultiblockTree.h">
+      <Filter>world\structures</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\TreeSeblingBlock.h">
+      <Filter>world\blocks</Filter>
     </ClInclude>
     <ClInclude Include="..\FactoryCraft\FastNoiseLite.h">
       <Filter>world\generator\noise</Filter>
     </ClInclude>
+    <ClInclude Include="..\FactoryCraft\FastNoiseWrapper.h">
+      <Filter>world\generator\noise</Filter>
+    </ClInclude>
     <ClInclude Include="..\FactoryCraft\Noise.h">
       <Filter>world\generator\noise</Filter>
     </ClInclude>
@@ -62,5 +494,56 @@
     <ClInclude Include="..\FactoryCraft\ShapedNoise.h">
       <Filter>world\generator\noise</Filter>
     </ClInclude>
+    <ClInclude Include="..\FactoryCraft\Tickable.h">
+      <Filter>world\ticking</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\Grass.h">
+      <Filter>world\blocks</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\Hoe.h">
+      <Filter>inventory\items\tools</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\BasicTool.h">
+      <Filter>inventory\items\tools</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\GrowingPlant.h">
+      <Filter>world\blocks\plants</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\FluidBlock.h">
+      <Filter>world\blocks\fluids</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\Axe.h">
+      <Filter>inventory\items\tools</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\ChatCommand.h">
+      <Filter>chat</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\ChatCommandExecutor.h">
+      <Filter>chat</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\Chat.h">
+      <Filter>chat</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\SaveCommand.h">
+      <Filter>chat\commands</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\ChatMessage.h">
+      <Filter>chat</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\ChatObserver.h">
+      <Filter>chat</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\GrantCommand.h">
+      <Filter>chat\commands</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\PlayerRegister.h">
+      <Filter>game</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\DimensionMap.h">
+      <Filter>world\map</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FactoryCraft\ChunkMap.h">
+      <Filter>world\map</Filter>
+    </ClInclude>
   </ItemGroup>
 </Project>

+ 317 - 0
Windows Version/data/recipies/basicItems.json

@@ -0,0 +1,317 @@
+[
+    {
+        "group": "inventory",
+        "height": 2,
+        "inputs": [
+            {
+                "filter": {
+                    "itemType": "Gravel"
+                },
+                "x": 0,
+                "y": 0
+            },
+            {
+                "filter": {
+                    "itemType": "Gravel"
+                },
+                "x": 0,
+                "y": 1
+            },
+            {
+                "filter": {
+                    "itemType": "Gravel"
+                },
+                "x": 1,
+                "y": 0
+            }
+        ],
+        "output": {
+            "itemType": "Flint"
+        },
+        "type": "shaped",
+        "width": 2
+    },
+    {
+        "group": "inventory",
+        "height": 2,
+        "inputs": [
+            {
+                "filter": {
+                    "itemType": "Gravel"
+                },
+                "x": 1,
+                "y": 1
+            },
+            {
+                "filter": {
+                    "itemType": "Gravel"
+                },
+                "x": 0,
+                "y": 1
+            },
+            {
+                "filter": {
+                    "itemType": "Gravel"
+                },
+                "x": 1,
+                "y": 0
+            }
+        ],
+        "output": {
+            "itemType": "Flint"
+        },
+        "type": "shaped",
+        "width": 2
+    },
+    {
+        "group": "inventory",
+        "height": 2,
+        "inputs": [
+            {
+                "filter": {
+                    "itemType": "Gravel"
+                },
+                "x": 0,
+                "y": 0
+            },
+            {
+                "filter": {
+                    "itemType": "Gravel"
+                },
+                "x": 1,
+                "y": 1
+            },
+            {
+                "filter": {
+                    "itemType": "Gravel"
+                },
+                "x": 1,
+                "y": 0
+            }
+        ],
+        "output": {
+            "itemType": "Flint"
+        },
+        "type": "shaped",
+        "width": 2
+    },
+    {
+        "group": "inventory",
+        "height": 2,
+        "inputs": [
+            {
+                "filter": {
+                    "itemType": "Gravel"
+                },
+                "x": 0,
+                "y": 0
+            },
+            {
+                "filter": {
+                    "itemType": "Gravel"
+                },
+                "x": 0,
+                "y": 1
+            },
+            {
+                "filter": {
+                    "itemType": "Gravel"
+                },
+                "x": 1,
+                "y": 1
+            }
+        ],
+        "output": {
+            "itemType": "Flint"
+        },
+        "type": "shaped",
+        "width": 2
+    },
+    {
+        "group": "inventory",
+        "height": 1,
+        "inputs": [
+            {
+                "filter": {
+                    "itemType": "Gravel"
+                },
+                "x": 0,
+                "y": 0
+            },
+            {
+                "filter": {
+                    "itemType": "Gravel"
+                },
+                "x": 1,
+                "y": 0
+            },
+            {
+                "filter": {
+                    "itemType": "Gravel"
+                },
+                "x": 2,
+                "y": 0
+            }
+        ],
+        "output": {
+            "itemType": "Flint"
+        },
+        "type": "shaped",
+        "width": 3
+    },
+    {
+        "group": "inventory",
+        "height": 3,
+        "inputs": [
+            {
+                "filter": {
+                    "itemType": "Gravel"
+                },
+                "x": 0,
+                "y": 0
+            },
+            {
+                "filter": {
+                    "itemType": "Gravel"
+                },
+                "x": 0,
+                "y": 1
+            },
+            {
+                "filter": {
+                    "itemType": "Gravel"
+                },
+                "x": 0,
+                "y": 2
+            }
+        ],
+        "output": {
+            "itemType": "Flint"
+        },
+        "type": "shaped",
+        "width": 1
+    },
+    {
+        "group": "inventory",
+        "height": 2,
+        "inputs": [
+            {
+                "filter": {
+                    "itemType": "Flint"
+                },
+                "x": 0,
+                "y": 0
+            },
+            {
+                "filter": {
+                    "left": {
+                        "left": {
+                            "itemType": "Oak"
+                        },
+                        "operator": "||",
+                        "right": {
+                            "itemType": "Birch"
+                        }
+                    },
+                    "operator": "||",
+                    "right": {
+                        "itemType": "Beech"
+                    }
+                },
+                "x": 0,
+                "y": 1
+            }
+        ],
+        "output": {
+            "itemType": "WoodenStick"
+        },
+        "type": "shaped",
+        "width": 1
+    },
+    {
+        "group": "inventory",
+        "height": 2,
+        "inputs": [
+            {
+                "filter": {
+                    "itemType": "Flint"
+                },
+                "x": 0,
+                "y": 0
+            },
+            {
+                "filter": {
+                    "itemType": "Pine"
+                },
+                "x": 0,
+                "y": 1
+            }
+        ],
+        "output": {
+            "itemType": "Resin"
+        },
+        "type": "shaped",
+        "width": 1
+    },
+    {
+        "group": "inventory",
+        "height": 2,
+        "inputs": [
+            {
+                "filter": {
+                    "itemType": "Resin"
+                },
+                "x": 0,
+                "y": 0
+            },
+            {
+                "filter": {
+                    "itemType": "WoodenStick"
+                },
+                "x": 0,
+                "y": 1
+            }
+        ],
+        "output": {
+            "itemType": "Torch"
+        },
+        "type": "shaped",
+        "width": 1
+    },
+    {
+        "group": "inventory",
+        "height": 1,
+        "inputs": [
+            {
+                "filter": {
+                    "left": {
+                        "left": {
+                            "itemType": "Beech Leaves"
+                        },
+                        "operator": "||",
+                        "right": {
+                            "itemType": "Birch Leaves"
+                        }
+                    },
+                    "operator": "||",
+                    "right": {
+                        "left": {
+                            "itemType": "Oak Leaves"
+                        },
+                        "operator": "||",
+                        "right": {
+                            "itemType": "Pine Leaves"
+                        }
+                    }
+                },
+                "x": 0,
+                "y": 0
+            }
+        ],
+        "output": {
+            "itemType": "WoodenStick"
+        },
+        "type": "shaped",
+        "width": 1
+    }
+]

+ 87 - 0
Windows Version/data/recipies/tools.json

@@ -0,0 +1,87 @@
+[
+	{
+		"type": "shaped",
+		"group": "inventory",
+		"width": 2,
+		"height": 3,
+		"inputs": [
+			{
+				"x": 0,
+				"y": 0,
+				"filter": {
+					"itemType": "Flint"
+				}
+			}
+			{
+				"x": 1,
+				"y": 0,
+				"filter": {
+					"itemType": "Flint"
+				}
+			},
+			{
+				"x": 1,
+				"y": 1,
+				"filter": {
+					"itemType": "WoodenStick"
+				}
+			},
+			{
+				"x": 1,
+				"y": 2,
+				"filter": {
+					"itemType": "WoodenStick"
+				}
+			}
+		],
+		"output": {
+			"itemType": "Hoe"
+		}
+	},
+	{
+		"type": "shaped",
+		"group": "inventory",
+		"width": 2,
+		"height": 3,
+		"inputs": [
+			{
+				"x": 0,
+				"y": 0,
+				"filter": {
+					"itemType": "Flint"
+				}
+			},
+			{
+				"x": 1,
+				"y": 0,
+				"filter": {
+					"itemType": "Flint"
+				}
+			},
+			{
+				"x": 0,
+				"y": 1,
+				"filter": {
+					"itemType": "Flint"
+				}
+			},
+			{
+				"x": 1,
+				"y": 1,
+				"filter": {
+					"itemType": "WoodenStick"
+				}
+			},
+			{
+				"x": 1,
+				"y": 2,
+				"filter": {
+					"itemType": "WoodenStick"
+				}
+			}
+		],
+		"output": {
+			"itemType": "Axe"
+		}
+	}
+]