aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/LiquidTileStatic.cpp
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
commitb691c43c44ff180d10e7d4a9afc83b98551ff586 (patch)
tree3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.World/LiquidTileStatic.cpp
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.World/LiquidTileStatic.cpp')
-rw-r--r--Minecraft.World/LiquidTileStatic.cpp85
1 files changed, 85 insertions, 0 deletions
diff --git a/Minecraft.World/LiquidTileStatic.cpp b/Minecraft.World/LiquidTileStatic.cpp
new file mode 100644
index 00000000..1d82d3dd
--- /dev/null
+++ b/Minecraft.World/LiquidTileStatic.cpp
@@ -0,0 +1,85 @@
+#include "stdafx.h"
+#include "net.minecraft.world.level.h"
+#include "LiquidTileStatic.h"
+#include "FireTile.h"
+
+LiquidTileStatic::LiquidTileStatic(int id, Material *material) : LiquidTile(id, material)
+{
+ setTicking(false);
+ if (material == Material::lava) setTicking(true);
+}
+
+bool LiquidTileStatic::isPathfindable(LevelSource *level, int x, int y, int z)
+{
+ return material != Material::lava;
+}
+
+void LiquidTileStatic::neighborChanged(Level *level, int x, int y, int z, int type)
+{
+ LiquidTile::neighborChanged(level, x, y, z, type);
+ if (level->getTile(x, y, z) == id)
+ {
+ setDynamic(level, x, y, z);
+ }
+}
+
+void LiquidTileStatic::setDynamic(Level *level, int x, int y, int z)
+{
+ int d = level->getData(x, y, z);
+ level->noNeighborUpdate = true;
+ level->setTileAndDataNoUpdate(x, y, z, id - 1, d);
+ level->setTilesDirty(x, y, z, x, y, z);
+ level->addToTickNextTick(x, y, z, id - 1, getTickDelay());
+ level->noNeighborUpdate = false;
+}
+
+void LiquidTileStatic::tick(Level *level, int x, int y, int z, Random *random)
+{
+ if (material == Material::lava)
+ {
+ int h = random->nextInt(3);
+ for (int i = 0; i < h; i++)
+ {
+ x += random->nextInt(3) - 1;
+ y++;
+ z += random->nextInt(3) - 1;
+ int t = level->getTile(x, y, z);
+ if (t == 0)
+ {
+ if (isFlammable(level, x - 1, y, z) ||
+ isFlammable(level, x + 1, y, z) ||
+ isFlammable(level, x, y, z - 1) ||
+ isFlammable(level, x, y, z + 1) ||
+ isFlammable(level, x, y - 1, z) ||
+ isFlammable(level, x, y + 1, z))
+ {
+ level->setTile(x, y, z, Tile::fire_Id);
+ return;
+ }
+ }
+ else if (Tile::tiles[t]->material->blocksMotion())
+ {
+ return;
+ }
+
+ }
+ if (h == 0)
+ {
+ int ox = x;
+ int oz = z;
+ for (int i = 0; i< 3; i++)
+ {
+ x = ox + random->nextInt(3) - 1;
+ z = oz + random->nextInt(3) - 1;
+ if (level->isEmptyTile(x, y + 1, z) && isFlammable(level, x, y, z)) {
+ level->setTile(x, y + 1, z, Tile::fire_Id);
+ }
+ }
+ }
+ }
+}
+
+bool LiquidTileStatic::isFlammable(Level *level, int x, int y, int z)
+{
+ return level->getMaterial(x, y, z)->isFlammable();
+}