aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/TreeTile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.World/TreeTile.cpp')
-rw-r--r--Minecraft.World/TreeTile.cpp141
1 files changed, 141 insertions, 0 deletions
diff --git a/Minecraft.World/TreeTile.cpp b/Minecraft.World/TreeTile.cpp
new file mode 100644
index 00000000..29871625
--- /dev/null
+++ b/Minecraft.World/TreeTile.cpp
@@ -0,0 +1,141 @@
+#include "stdafx.h"
+#include "net.minecraft.world.level.h"
+#include "net.minecraft.world.level.tile.piston.h"
+#include "net.minecraft.h"
+#include "net.minecraft.world.h"
+#include "LeafTile.h"
+
+#include "TreeTile.h"
+
+const unsigned int TreeTile::TREE_NAMES[TREE_NAMES_LENGTH] = { IDS_TILE_LOG_OAK,
+ IDS_TILE_LOG_SPRUCE,
+ IDS_TILE_LOG_BIRCH,
+ IDS_TILE_LOG_JUNGLE
+ };
+
+const wstring TreeTile::TREE_TEXTURES[] = {L"tree_side", L"tree_spruce", L"tree_birch", L"tree_jungle"};
+
+TreeTile::TreeTile(int id) : Tile(id, Material::wood)
+{
+ icons = NULL;
+ iconTop = NULL;
+}
+
+int TreeTile::getRenderShape()
+{
+ return Tile::SHAPE_TREE;
+}
+
+int TreeTile::getResourceCount(Random *random)
+{
+ return 1;
+}
+
+int TreeTile::getResource(int data, Random *random, int playerBonusLevel)
+{
+ return Tile::treeTrunk_Id;
+}
+
+void TreeTile::onRemove(Level *level, int x, int y, int z, int id, int data)
+{
+ int r = LeafTile::REQUIRED_WOOD_RANGE;
+ int r2 = r + 1;
+
+ if (level->hasChunksAt(x - r2, y - r2, z - r2, x + r2, y + r2, z + r2))
+ {
+ for (int xo = -r; xo <= r; xo++)
+ for (int yo = -r; yo <= r; yo++)
+ for (int zo = -r; zo <= r; zo++)
+ {
+ int t = level->getTile(x + xo, y + yo, z + zo);
+ if (t == Tile::leaves_Id)
+ {
+ int currentData = level->getData(x + xo, y + yo, z + zo);
+ if ((currentData & LeafTile::UPDATE_LEAF_BIT) == 0)
+ {
+ level->setDataNoUpdate(x + xo, y + yo, z + zo, currentData | LeafTile::UPDATE_LEAF_BIT);
+ }
+ }
+ }
+ }
+}
+
+void TreeTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr<Mob> by)
+{
+ int type = level->getData(x, y, z) & MASK_TYPE;
+ int dir = PistonBaseTile::getNewFacing(level, x, y, z, dynamic_pointer_cast<Player>(by));
+ int facing = 0;
+
+ switch (dir)
+ {
+ case Facing::NORTH:
+ case Facing::SOUTH:
+ facing = FACING_Z;
+ break;
+ case Facing::EAST:
+ case Facing::WEST:
+ facing = FACING_X;
+ break;
+ case Facing::UP:
+ case Facing::DOWN:
+ facing = FACING_Y;
+ break;
+ }
+
+ level->setData(x, y, z, type | facing);
+}
+
+Icon *TreeTile::getTexture(int face, int data)
+{
+ int dir = data & MASK_FACING;
+ int type = data & MASK_TYPE;
+
+ if (dir == FACING_Y && (face == Facing::UP || face == Facing::DOWN))
+ {
+ return iconTop;
+ }
+ else if (dir == FACING_X && (face == Facing::EAST || face == Facing::WEST))
+ {
+ return iconTop;
+ }
+ else if (dir == FACING_Z && (face == Facing::NORTH || face == Facing::SOUTH))
+ {
+ return iconTop;
+ }
+
+ return icons[type];
+}
+
+unsigned int TreeTile::getDescriptionId(int iData /*= -1*/)
+{
+ int type = iData & MASK_TYPE;
+ if(type < 0 ) type = 0;
+ return TreeTile::TREE_NAMES[type];
+}
+
+int TreeTile::getSpawnResourcesAuxValue(int data)
+{
+ return data & MASK_TYPE;
+}
+
+int TreeTile::getWoodType(int data)
+{
+ return data & MASK_TYPE;
+}
+
+shared_ptr<ItemInstance> TreeTile::getSilkTouchItemInstance(int data)
+{
+ // fix to avoid getting silktouched sideways logs
+ return shared_ptr<ItemInstance>(new ItemInstance(id, 1, getWoodType(data)));
+}
+
+void TreeTile::registerIcons(IconRegister *iconRegister)
+{
+ iconTop = iconRegister->registerIcon(L"tree_top");
+ icons = new Icon*[TREE_NAMES_LENGTH];
+
+ for (int i = 0; i < TREE_NAMES_LENGTH; i++)
+ {
+ icons[i] = iconRegister->registerIcon(TREE_TEXTURES[i]);
+ }
+} \ No newline at end of file