1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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, std::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;
}
std::shared_ptr<ItemInstance> TreeTile::getSilkTouchItemInstance(int data)
{
// fix to avoid getting silktouched sideways logs
return std::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]);
}
}
|