aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/LeafTile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.World/LeafTile.cpp')
-rw-r--r--Minecraft.World/LeafTile.cpp259
1 files changed, 140 insertions, 119 deletions
diff --git a/Minecraft.World/LeafTile.cpp b/Minecraft.World/LeafTile.cpp
index 8b7d381c..684618a7 100644
--- a/Minecraft.World/LeafTile.cpp
+++ b/Minecraft.World/LeafTile.cpp
@@ -8,18 +8,18 @@
#include "net.minecraft.world.h"
const unsigned int LeafTile::LEAF_NAMES[LEAF_NAMES_LENGTH] = { IDS_TILE_LEAVES_OAK,
- IDS_TILE_LEAVES_SPRUCE,
- IDS_TILE_LEAVES_BIRCH,
- IDS_TILE_LEAVES_JUNGLE,
- };
+ IDS_TILE_LEAVES_SPRUCE,
+ IDS_TILE_LEAVES_BIRCH,
+ IDS_TILE_LEAVES_JUNGLE,
+};
const wstring LeafTile::TEXTURES[2][4] = { {L"leaves", L"leaves_spruce", L"leaves", L"leaves_jungle"}, {L"leaves_opaque", L"leaves_spruce_opaque", L"leaves_opaque", L"leaves_jungle_opaque"},};
LeafTile::LeafTile(int id) : TransparentTile(id, Material::leaves, false, isSolidRender())
{
checkBuffer = NULL;
- fancyTextureSet = 0;
- setTicking(true);
+ fancyTextureSet = 0;
+ setTicking(true);
}
LeafTile::~LeafTile()
@@ -30,26 +30,26 @@ LeafTile::~LeafTile()
int LeafTile::getColor() const
{
// 4J Stu - Not using this any more
- //double temp = 0.5;
- //double rain = 1.0;
+ //double temp = 0.5;
+ //double rain = 1.0;
- //return FoliageColor::get(temp, rain);
+ //return FoliageColor::get(temp, rain);
return Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Foliage_Common );
}
int LeafTile::getColor(int data)
{
- if ((data & LEAF_TYPE_MASK) == EVERGREEN_LEAF)
+ if ((data & LEAF_TYPE_MASK) == EVERGREEN_LEAF)
{
- return FoliageColor::getEvergreenColor();
- }
- if ((data & LEAF_TYPE_MASK) == BIRCH_LEAF)
+ return FoliageColor::getEvergreenColor();
+ }
+ if ((data & LEAF_TYPE_MASK) == BIRCH_LEAF)
{
- return FoliageColor::getBirchColor();
- }
+ return FoliageColor::getBirchColor();
+ }
- return FoliageColor::getDefaultColor();
+ return FoliageColor::getDefaultColor();
}
int LeafTile::getColor(LevelSource *level, int x, int y, int z)
@@ -60,14 +60,14 @@ int LeafTile::getColor(LevelSource *level, int x, int y, int z)
// 4J - changed interface to have data passed in, and put existing interface as wrapper above
int LeafTile::getColor(LevelSource *level, int x, int y, int z, int data)
{
- if ((data & LEAF_TYPE_MASK) == EVERGREEN_LEAF)
+ if ((data & LEAF_TYPE_MASK) == EVERGREEN_LEAF)
{
- return FoliageColor::getEvergreenColor();
- }
- if ((data & LEAF_TYPE_MASK) == BIRCH_LEAF)
+ return FoliageColor::getEvergreenColor();
+ }
+ if ((data & LEAF_TYPE_MASK) == BIRCH_LEAF)
{
- return FoliageColor::getBirchColor();
- }
+ return FoliageColor::getBirchColor();
+ }
int totalRed = 0;
int totalGreen = 0;
@@ -90,113 +90,113 @@ int LeafTile::getColor(LevelSource *level, int x, int y, int z, int data)
void LeafTile::onRemove(Level *level, int x, int y, int z, int id, int data)
{
- int r = 1;
- int r2 = r + 1;
+ int r = 1;
+ int r2 = r + 1;
- if (level->hasChunksAt(x - r2, y - r2, z - r2, x + r2, y + r2, z + r2))
+ 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++)
+ 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 t = level->getTile(x + xo, y + yo, z + zo);
+ if (t == Tile::leaves_Id)
{
- int currentData = level->getData(x + xo, y + yo, z + zo);
- level->setDataNoUpdate(x + xo, y + yo, z + zo, currentData | UPDATE_LEAF_BIT);
- }
- }
- }
+ int currentData = level->getData(x + xo, y + yo, z + zo);
+ level->setData(x + xo, y + yo, z + zo, currentData | UPDATE_LEAF_BIT, Tile::UPDATE_NONE);
+ }
+ }
+ }
}
void LeafTile::tick(Level *level, int x, int y, int z, Random *random)
{
- if (level->isClientSide) return;
+ if (level->isClientSide) return;
- int currentData = level->getData(x, y, z);
- if ((currentData & UPDATE_LEAF_BIT) != 0 && (currentData & PERSISTENT_LEAF_BIT) == 0)
+ int currentData = level->getData(x, y, z);
+ if ((currentData & UPDATE_LEAF_BIT) != 0 && (currentData & PERSISTENT_LEAF_BIT) == 0)
{
- int r = LeafTile::REQUIRED_WOOD_RANGE;
- int r2 = r + 1;
+ int r = REQUIRED_WOOD_RANGE;
+ int r2 = r + 1;
- int W = 32;
- int WW = W * W;
- int WO = W / 2;
- if (checkBuffer == NULL)
+ int W = 32;
+ int WW = W * W;
+ int WO = W / 2;
+ if (checkBuffer == NULL)
{
- checkBuffer = new int[W * W * W];
- }
+ checkBuffer = new int[W * W * W];
+ }
- if (level->hasChunksAt(x - r2, y - r2, z - r2, x + r2, y + r2, z + r2))
+ if (level->hasChunksAt(x - r2, y - r2, z - r2, x + r2, y + r2, z + r2))
{
// 4J Stu - Assuming we remain in the same chunk, getTile accesses an array that varies least by y
// Changing the ordering here to loop by y last
- for (int xo = -r; xo <= r; xo++)
+ for (int xo = -r; xo <= r; xo++)
for (int zo = -r; zo <= r; zo++)
for (int yo = -r; yo <= r; yo++)
{
- int t = level->getTile(x + xo, y + yo, z + zo);
- if (t == Tile::treeTrunk_Id)
+ int t = level->getTile(x + xo, y + yo, z + zo);
+ if (t == Tile::treeTrunk_Id)
{
- checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO)] = 0;
+ checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO)] = 0;
}
else if (t == Tile::leaves_Id)
{
- checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO)] = -2;
- }
+ checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO)] = -2;
+ }
else
{
- checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO)] = -1;
- }
- }
- for (int i = 1; i <= LeafTile::REQUIRED_WOOD_RANGE; i++)
- {
- for (int xo = -r; xo <= r; xo++)
- for (int yo = -r; yo <= r; yo++)
- for (int zo = -r; zo <= r; zo++)
- {
- if (checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO)] == i - 1)
- {
- if (checkBuffer[(xo + WO - 1) * WW + (yo + WO) * W + (zo + WO)] == -2)
- {
- checkBuffer[(xo + WO - 1) * WW + (yo + WO) * W + (zo + WO)] = i;
- }
- if (checkBuffer[(xo + WO + 1) * WW + (yo + WO) * W + (zo + WO)] == -2)
- {
- checkBuffer[(xo + WO + 1) * WW + (yo + WO) * W + (zo + WO)] = i;
- }
- if (checkBuffer[(xo + WO) * WW + (yo + WO - 1) * W + (zo + WO)] == -2)
- {
- checkBuffer[(xo + WO) * WW + (yo + WO - 1) * W + (zo + WO)] = i;
- }
- if (checkBuffer[(xo + WO) * WW + (yo + WO + 1) * W + (zo + WO)] == -2)
- {
- checkBuffer[(xo + WO) * WW + (yo + WO + 1) * W + (zo + WO)] = i;
- }
- if (checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO - 1)] == -2)
- {
- checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO - 1)] = i;
- }
- if (checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO + 1)] == -2)
+ checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO)] = -1;
+ }
+ }
+ for (int i = 1; i <= REQUIRED_WOOD_RANGE; i++)
+ {
+ for (int xo = -r; xo <= r; xo++)
+ for (int yo = -r; yo <= r; yo++)
+ for (int zo = -r; zo <= r; zo++)
{
- checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO + 1)] = i;
- }
- }
- }
- }
- }
-
- int mid = checkBuffer[(WO) * WW + (WO) * W + (WO)];
- if (mid >= 0)
+ if (checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO)] == i - 1)
+ {
+ if (checkBuffer[(xo + WO - 1) * WW + (yo + WO) * W + (zo + WO)] == -2)
+ {
+ checkBuffer[(xo + WO - 1) * WW + (yo + WO) * W + (zo + WO)] = i;
+ }
+ if (checkBuffer[(xo + WO + 1) * WW + (yo + WO) * W + (zo + WO)] == -2)
+ {
+ checkBuffer[(xo + WO + 1) * WW + (yo + WO) * W + (zo + WO)] = i;
+ }
+ if (checkBuffer[(xo + WO) * WW + (yo + WO - 1) * W + (zo + WO)] == -2)
+ {
+ checkBuffer[(xo + WO) * WW + (yo + WO - 1) * W + (zo + WO)] = i;
+ }
+ if (checkBuffer[(xo + WO) * WW + (yo + WO + 1) * W + (zo + WO)] == -2)
+ {
+ checkBuffer[(xo + WO) * WW + (yo + WO + 1) * W + (zo + WO)] = i;
+ }
+ if (checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO - 1)] == -2)
+ {
+ checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO - 1)] = i;
+ }
+ if (checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO + 1)] == -2)
+ {
+ checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO + 1)] = i;
+ }
+ }
+ }
+ }
+ }
+
+ int mid = checkBuffer[(WO) * WW + (WO) * W + (WO)];
+ if (mid >= 0)
{
- level->setDataNoUpdate(x, y, z, currentData & ~UPDATE_LEAF_BIT);
- }
+ level->setData(x, y, z, currentData & ~UPDATE_LEAF_BIT, Tile::UPDATE_NONE);
+ }
else
{
- die(level, x, y, z);
- }
- }
+ die(level, x, y, z);
+ }
+ }
}
@@ -214,8 +214,8 @@ void LeafTile::animateTick(Level *level, int x, int y, int z, Random *random)
void LeafTile::die(Level *level, int x, int y, int z)
{
- Tile::spawnResources(level, x, y, z, level->getData(x, y, z), 0);
- level->setTile(x, y, z, 0);
+ Tile::spawnResources(level, x, y, z, level->getData(x, y, z), 0);
+ level->removeTile(x, y, z);
}
int LeafTile::getResourceCount(Random *random)
@@ -238,13 +238,30 @@ void LeafTile::spawnResources(Level *level, int x, int y, int z, int data, float
{
chance = 40;
}
+ if (playerBonusLevel > 0)
+ {
+ chance -= 2 << playerBonusLevel;
+ if (chance < 10)
+ {
+ chance = 10;
+ }
+ }
if (level->random->nextInt(chance) == 0)
{
int type = getResource(data, level->random,playerBonusLevel);
popResource(level, x, y, z, shared_ptr<ItemInstance>( new ItemInstance(type, 1, getSpawnResourcesAuxValue(data))));
}
- if ((data & LEAF_TYPE_MASK) == NORMAL_LEAF && level->random->nextInt(200) == 0)
+ chance = 200;
+ if (playerBonusLevel > 0)
+ {
+ chance -= 10 << playerBonusLevel;
+ if (chance < 40)
+ {
+ chance = 40;
+ }
+ }
+ if ((data & LEAF_TYPE_MASK) == NORMAL_LEAF && level->random->nextInt(chance) == 0)
{
popResource(level, x, y, z, shared_ptr<ItemInstance>(new ItemInstance(Item::apple_Id, 1, 0)));
}
@@ -253,20 +270,20 @@ void LeafTile::spawnResources(Level *level, int x, int y, int z, int data, float
void LeafTile::playerDestroy(Level *level, shared_ptr<Player> player, int x, int y, int z, int data)
{
- if (!level->isClientSide && player->getSelectedItem() != NULL && player->getSelectedItem()->id == Item::shears->id)
+ if (!level->isClientSide && player->getSelectedItem() != NULL && player->getSelectedItem()->id == Item::shears->id)
{
- player->awardStat(
+ player->awardStat(
GenericStats::blocksMined(id),
GenericStats::param_blocksMined(id,data,1)
);
- // drop leaf block instead of sapling
- popResource(level, x, y, z, shared_ptr<ItemInstance>(new ItemInstance(Tile::leaves_Id, 1, data & LEAF_TYPE_MASK)));
- }
+ // drop leaf block instead of sapling
+ popResource(level, x, y, z, shared_ptr<ItemInstance>(new ItemInstance(Tile::leaves_Id, 1, data & LEAF_TYPE_MASK)));
+ }
else
{
- TransparentTile::playerDestroy(level, player, x, y, z, data);
- }
+ TransparentTile::playerDestroy(level, player, x, y, z, data);
+ }
}
int LeafTile::getSpawnResourcesAuxValue(int data)
@@ -284,21 +301,25 @@ bool LeafTile::isSolidRender(bool isServerLevel)
Icon *LeafTile::getTexture(int face, int data)
{
- if ((data & LEAF_TYPE_MASK) == EVERGREEN_LEAF)
+ if ((data & LEAF_TYPE_MASK) == EVERGREEN_LEAF)
{
- return icons[fancyTextureSet][EVERGREEN_LEAF];
- }
- if ((data & LEAF_TYPE_MASK) == JUNGLE_LEAF)
+ return icons[fancyTextureSet][EVERGREEN_LEAF];
+ }
+ if ((data & LEAF_TYPE_MASK) == JUNGLE_LEAF)
+ {
+ return icons[fancyTextureSet][JUNGLE_LEAF];
+ }
+ if ((data & LEAF_TYPE_MASK) == BIRCH_LEAF)
{
- return icons[fancyTextureSet][JUNGLE_LEAF];
- }
- return icons[fancyTextureSet][0];
+ return icons[fancyTextureSet][BIRCH_LEAF];
+ }
+ return icons[fancyTextureSet][0];
}
void LeafTile::setFancy(bool fancyGraphics)
{
- allowSame = fancyGraphics;
- fancyTextureSet = (fancyGraphics ? 0 : 1);
+ allowSame = fancyGraphics;
+ fancyTextureSet = (fancyGraphics ? 0 : 1);
}
shared_ptr<ItemInstance> LeafTile::getSilkTouchItemInstance(int data)
@@ -314,7 +335,7 @@ void LeafTile::stepOn(Level *level, int x, int y, int z, shared_ptr<Entity> enti
bool LeafTile::shouldTileTick(Level *level, int x,int y,int z)
{
int currentData = level->getData(x, y, z);
- return (currentData & UPDATE_LEAF_BIT) != 0;
+ return (currentData & UPDATE_LEAF_BIT) != 0;
}
unsigned int LeafTile::getDescriptionId(int iData /*= -1*/)