Bladeren bron

add light pass through weight for fluid blocks and send isFluid boolean to client for each block type

Kolja Strohm 1 jaar geleden
bovenliggende
commit
6779488f12

+ 6 - 0
FactoryCraft/BlockType.cpp

@@ -231,11 +231,17 @@ void BlockType::writeTypeInfo(StreamWriter* zWriter) const
     zWriter->schreibe((char*)&inst, 1);
     bool sub = doesNeedModelSubscription();
     zWriter->schreibe((char*)&sub, 1);
+    bool fluid = isFluid();
+    zWriter->schreibe((char*)&fluid, 1);
     int maxHp = getInitialMaxHP();
     zWriter->schreibe((char*)&maxHp, 4);
     getModel().writeTo(zWriter);
 }
 
+bool BlockType::isFluid() const {
+    return false;
+}
+
 int BlockType::getTypeId(const char* name)
 {
     Text n = name;

+ 1 - 0
FactoryCraft/BlockType.h

@@ -102,6 +102,7 @@ public:
     const char* getName() const;
     const bool doesNeedModelSubscription() const;
     void writeTypeInfo(Framework::StreamWriter* zWriter) const;
+    virtual bool isFluid() const;
 
     static int getTypeId(const char* name);
 };

+ 28 - 7
FactoryCraft/FluidBlock.cpp

@@ -2,8 +2,11 @@
 
 #include "Game.h"
 
-FluidBlock::FluidBlock(int typeId, Framework::Vec3<int> pos, int dimensionId)
-    : Block(typeId, 0, pos, dimensionId, 0)
+FluidBlock::FluidBlock(int typeId,
+    Framework::Vec3<int> pos,
+    int dimensionId, Vec3<float> lightWeights)
+    : Block(typeId, 0, pos, dimensionId, 0),
+      lightWeights(lightWeights)
 {
     transparent = 1;
     passable = 1;
@@ -153,7 +156,8 @@ void FluidBlock::onPostTick()
                         = getPos() + getDirection(getDirectionFromIndex(i));
                     if (neighbourTypes[i] == BlockTypeEnum::AIR)
                     {
-                        FluidBlock* spawn = new FluidBlock(typeId, pos, dimensionId);
+                        FluidBlock* spawn = new FluidBlock(
+                            typeId, pos, dimensionId, lightWeights);
                         spawn->fluidAmount = 1;
                         Game::INSTANCE->zDimension(getDimensionId())
                             ->placeBlock(pos, spawn);
@@ -244,9 +248,20 @@ void FluidBlock::sortByAmound(FluidBlock** array, int count)
     }
 }
 
-FluidBlockType::FluidBlockType(
-    int id, ModelInfo model, const char* name, int mapColor)
-    : BlockType(id, 0, model, 1, 10, 0, name, true, mapColor)
+void FluidBlock::filterPassingLight(unsigned char rgb[3]) const
+{
+    rgb[0] = (unsigned char)(rgb[0] * lightWeights.x);
+    rgb[1] = (unsigned char)(rgb[1] * lightWeights.y);
+    rgb[2] = (unsigned char)(rgb[2] * lightWeights.z);
+}
+
+FluidBlockType::FluidBlockType(int id,
+    ModelInfo model,
+    const char* name,
+    int mapColor,
+    Vec3<float> lightWeights)
+    : BlockType(id, 0, model, 1, 10, 0, name, true, mapColor),
+      lightWeights(lightWeights)
 {}
 
 void FluidBlockType::loadSuperBlock(
@@ -272,7 +287,13 @@ Item* FluidBlockType::createItem() const
 
 Block* FluidBlockType::createBlock(Framework::Vec3<int> position, int dimensionId) const
 {
-    FluidBlock* result = new FluidBlock(getId(), position, dimensionId);
+    FluidBlock* result
+        = new FluidBlock(getId(), position, dimensionId, lightWeights);
     result->fluidAmount = 1000;
     return result;
+}
+
+bool FluidBlockType::isFluid() const
+{
+    return true;
 }

+ 17 - 2
FactoryCraft/FluidBlock.h

@@ -12,6 +12,7 @@ private:
     short fluidAmount;
     short lastBroadcastedAmount;
     int nextFlow;
+    Framework::Vec3<float> lightWeights;
 
 protected:
     virtual bool onTick(
@@ -20,17 +21,25 @@ protected:
     void broadcastAmount();
 
 public:
-    FluidBlock(int typeId, Framework::Vec3<int> pos, int dimensionId);
+    FluidBlock(int typeId,
+        Framework::Vec3<int> pos,
+        int dimensionId,
+        Framework::Vec3<float> lightWeights);
     virtual ~FluidBlock();
 
     virtual void sendModelInfo(NetworkMessage* zMessage) override;
     static void sortByAmound(FluidBlock** array, int count);
 
+    virtual void filterPassingLight(unsigned char rgb[3]) const override;
+
     friend FluidBlockType;
 };
 
 class FluidBlockType : public BlockType
 {
+private:
+    Framework::Vec3<float> lightWeights;
+
 protected:
     virtual void loadSuperBlock(Block* zBlock,
         Framework::StreamReader* zReader,
@@ -41,5 +50,11 @@ protected:
     virtual Block* createBlock(Framework::Vec3<int> position, int dimesionId) const override;
 
 public:
-    FluidBlockType(int id, ModelInfo model, const char* name, int mapColor);
+    FluidBlockType(int id,
+        ModelInfo model,
+        const char* name,
+        int mapColor,
+        Framework::Vec3<float> lightWeights);
+
+    bool isFluid() const override;
 };

+ 1 - 1
FactoryCraft/StaticInitializerOrder.cpp

@@ -283,7 +283,7 @@ void initializeBlockTypes()
     (new FluidBlockType(BlockTypeEnum::WATER,
          ModelInfo("fluid", "fluids.ltdb/water.png", 6),
          "Water",
-         0xFF2323BF))
+         0xFF2323BF, Vec3<float>(0.8f, 0.8f, 0.95f)))
         ->initializeDefault();
     (new BasicBlockType(BlockTypeEnum::CRAFTING_TABLE,
          ItemTypeEnum::CRAFTING_TABLE,

+ 2 - 2
Windows Version/data/generator/overworld.json

@@ -338,7 +338,7 @@
                     },
                     {
                       "type": "constant",
-                      "value": 190
+                      "value": 200
                     }
                   ]
                 },
@@ -392,7 +392,7 @@
                     },
                     {
                       "type": "constant",
-                      "value": 190
+                      "value": 200
                     }
                   ]
                 }