4jcraft/targets/minecraft/world/level/tile/TreeTile.cpp

80 lines
2.9 KiB
C++

#include "TreeTile.h"
#include <memory>
#include "LeafTile.h"
#include "minecraft/world/IconRegister.h"
#include "minecraft/world/item/ItemInstance.h"
#include "minecraft/world/level/Level.h"
#include "minecraft/world/level/material/Material.h"
#include "minecraft/world/level/tile/RotatedPillarTile.h"
#include "minecraft/world/level/tile/Tile.h"
#include "strings.h"
const unsigned int TreeTile::TREE_NAMES[TreeTile::TREE_NAMES_LENGTH] = {
IDS_TILE_LOG_OAK, IDS_TILE_LOG_SPRUCE, IDS_TILE_LOG_BIRCH,
IDS_TILE_LOG_JUNGLE};
const std::string TreeTile::TREE_STRING_NAMES[TreeTile::TREE_NAMES_LENGTH] = {
"oak", "spruce", "birch", "jungle"};
const std::string TreeTile::TREE_TEXTURES[] = {"tree_side", "tree_spruce",
"tree_birch", "tree_jungle"};
TreeTile::TreeTile(int id) : RotatedPillarTile(id, Material::wood) {}
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->setData(
x + xo, y + yo, z + zo,
currentData | LeafTile::UPDATE_LEAF_BIT,
Tile::UPDATE_NONE);
}
}
}
}
}
unsigned int TreeTile::getDescriptionId(int iData /*= -1*/) {
int type = iData & MASK_TYPE;
if (type < 0) type = 0;
return TreeTile::TREE_NAMES[type];
}
Icon* TreeTile::getTypeTexture(int type) { return icons_side[type]; }
Icon* TreeTile::getTopTexture(int type) { return icons_top[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) {
for (int i = 0; i < TREE_NAMES_LENGTH; i++) {
icons_side[i] = iconRegister->registerIcon(getIconName() + "_" +
TREE_STRING_NAMES[i]);
icons_top[i] = iconRegister->registerIcon(
getIconName() + "_" + TREE_STRING_NAMES[i] + "_top");
}
}