aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/Mushroom.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/Mushroom.cpp
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.World/Mushroom.cpp')
-rw-r--r--Minecraft.World/Mushroom.cpp107
1 files changed, 107 insertions, 0 deletions
diff --git a/Minecraft.World/Mushroom.cpp b/Minecraft.World/Mushroom.cpp
new file mode 100644
index 00000000..1056cdec
--- /dev/null
+++ b/Minecraft.World/Mushroom.cpp
@@ -0,0 +1,107 @@
+#include "stdafx.h"
+#include "net.minecraft.world.level.h"
+#include "net.minecraft.world.level.levelgen.feature.h"
+#include "net.minecraft.world.h"
+#include "Mushroom.h"
+
+Mushroom::Mushroom(int id, const wstring &texture) : Bush(id)
+{
+ this->updateDefaultShape();
+ this->setTicking(true);
+ this->texture = texture;
+}
+
+// 4J Added override
+void Mushroom::updateDefaultShape()
+{
+ float ss = 0.2f;
+ this->setShape(0.5f - ss, 0, 0.5f - ss, 0.5f + ss, ss * 2, 0.5f + ss);
+}
+
+void Mushroom::tick(Level *level, int x, int y, int z, Random *random)
+{
+ if (random->nextInt(25) == 0)
+ {
+ int r = 4;
+ int max = 5;
+ for (int xx = x - r; xx <= x + r; xx++)
+ for (int zz = z - r; zz <= z + r; zz++)
+ for (int yy = y - 1; yy <= y + 1; yy++)
+ {
+ if (level->getTile(xx, yy, zz) == id && --max <= 0) return;
+ }
+
+ int x2 = x + random->nextInt(3) - 1;
+ int y2 = y + random->nextInt(2) - random->nextInt(2);
+ int z2 = z + random->nextInt(3) - 1;
+ for (int i = 0; i < 4; i++)
+ {
+ if (level->isEmptyTile(x2, y2, z2) && canSurvive(level, x2, y2, z2))
+ {
+ x = x2;
+ y = y2;
+ z = z2;
+ }
+ x2 = x + random->nextInt(3) - 1;
+ y2 = y + random->nextInt(2) - random->nextInt(2);
+ z2 = z + random->nextInt(3) - 1;
+ }
+
+ if (level->isEmptyTile(x2, y2, z2) && canSurvive(level, x2, y2, z2))
+ {
+ level->setTile(x2, y2, z2, id);
+ }
+ }
+}
+
+bool Mushroom::mayPlace(Level *level, int x, int y, int z)
+{
+ return Bush::mayPlace(level, x, y, z) && canSurvive(level, x, y, z);
+}
+
+bool Mushroom::mayPlaceOn(int tile)
+{
+ return Tile::solid[tile];
+}
+
+bool Mushroom::canSurvive(Level *level, int x, int y, int z)
+{
+ if (y < 0 || y >= Level::maxBuildHeight) return false;
+
+ int below = level->getTile(x, y - 1, z);
+
+ return below == Tile::mycel_Id || (level->getDaytimeRawBrightness(x, y, z) < 13 && mayPlaceOn(below));
+}
+
+bool Mushroom::growTree(Level *level, int x, int y, int z, Random *random)
+{
+ int data = level->getData(x, y, z);
+
+ level->setTileNoUpdate(x, y, z, 0);
+ Feature *f = NULL;
+
+ if (id == Tile::mushroom1_Id)
+ {
+ f = new HugeMushroomFeature(0);
+ }
+ else if (id == Tile::mushroom2_Id)
+ {
+ f = new HugeMushroomFeature(1);
+ }
+
+ if (f == NULL || !f->place(level, random, x, y, z))
+ {
+ level->setTileAndDataNoUpdate(x, y, z, this->id, data);
+ if( f != NULL )
+ delete f;
+ return false;
+ }
+ if( f != NULL )
+ delete f;
+ return true;
+}
+
+void Mushroom::registerIcons(IconRegister *iconRegister)
+{
+ icon = iconRegister->registerIcon(texture);
+}