diff options
Diffstat (limited to 'Minecraft.World/LeafTile.cpp')
| -rw-r--r-- | Minecraft.World/LeafTile.cpp | 259 |
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*/) |
