Files
minecraft-pe-0.6.1/src/world/item/DyePowderItem.cpp
2026-03-02 22:04:18 +03:00

123 lines
4.0 KiB
C++
Executable File

#include "DyePowderItem.h"
#include "../entity/Mob.h"
#include "../entity/animal/Sheep.h"
#include "../entity/player/Player.h"
#include "../level/Level.h"
#include "../level/tile/Tile.h"
#include "../level/tile/Sapling.h"
#include "../level/tile/GrassTile.h"
#include "../../util/Mth.h"
#include "../level/tile/ClothTile.h"
#include "../level/tile/CropTile.h"
#include "../level/tile/StemTile.h"
const std::string DyePowderItem::COLOR_DESCS[] = {
"black", "red", "green", "brown", "blue", "purple", "cyan", "silver", "gray", "pink", "lime", "yellow", "lightBlue", "magenta", "orange", "white"
};
const int DyePowderItem::COLOR_RGB[] = {
0x1e1b1b, 0xb3312c, 0x3b511a, 0x51301a, 0x253192, 0x7b2fbe, 0x287697, 0x287697, 0x434343, 0xd88198, 0x41cd34, 0xdecf2a, 0x6689d3, 0xc354cd, 0xeb8844, 0xf0f0f0
};
DyePowderItem::DyePowderItem( int id )
: super(id)
{
setStackedByData(true);
setMaxDamage(0);
}
int DyePowderItem::getIcon( int itemAuxValue )
{
int colorValue = Mth::clamp(itemAuxValue, 0, 15);
return icon + (colorValue % 8) * ICON_COLUMNS + (colorValue / 8);
}
std::string DyePowderItem::getDescriptionId( const ItemInstance* itemInstance ) const
{
int colorValue = Mth::clamp(itemInstance->getAuxValue(), 0, 15);
return super::getDescriptionId() + "." + COLOR_DESCS[colorValue];
}
bool DyePowderItem::useOn( ItemInstance* itemInstance, Player* player, Level* level, int x, int y, int z, int face, float clickX, float clickY, float clickZ )
{
//if (!player->mayBuild(x, y, z)) return false;
if (itemInstance->getAuxValue() == WHITE) {
// bone meal is a fertilizer, so instantly grow trees and stuff
int tile = level->getTile(x, y, z);
if (tile == Tile::sapling->id) {
if (!level->isClientSide) {
((Sapling*) Tile::sapling)->growTree(level, x, y, z, &level->random);
}
itemInstance->count--;
return true;
} /*else if (tile == Tile::mushroom1->id || tile == Tile::mushroom2->id) {
if (!level->isOnline) {
if (((Mushroom) Tile::tiles[tile]).growTree(level, x, y, z, level->random)) {
itemInstance.count--;
}
}
return true;
}*/ else if (tile == Tile::melonStem->id/* || tile == Tile::pumpkinStem->id*/) {
if (!level->isClientSide) {
((StemTile*) Tile::tiles[tile])->growCropsToMax(level, x, y, z);
}
itemInstance->count--;
return true;
} else if (tile == Tile::crops->id) {
if (!level->isClientSide) {
((CropTile*) Tile::crops)->growCropsToMax(level, x, y, z);
}
itemInstance->count--;
} else if (tile == Tile::grass->id) {
if (!level->isClientSide) {
for (int j = 0; j < 32; j++) {
int xx = x;
int yy = y + 1;
int zz = z;
bool continueMainLoop = false;
for (int i = 0; i < j / 16; i++) {
xx += random.nextInt(3) - 1;
yy += (random.nextInt(3) - 1) * random.nextInt(3) / 2;
zz += random.nextInt(3) - 1;
if (level->getTile(xx, yy - 1, zz) != Tile::grass->id || level->isSolidBlockingTile(xx, yy, zz)) {
continueMainLoop = true;
break;
}
}
if(continueMainLoop)
continue;
if (level->getTile(xx, yy, zz) == 0) {
/*if (random.nextInt(10) != 0) {
level->setTileAndData(xx, yy, zz, Tile::tallgrass.id, TallGrass.TALL_GRASS);
} else*/ if (random.nextInt(3) != 0) {
level->setTile(xx, yy, zz, Tile::flower->id);
} else {
level->setTile(xx, yy, zz, Tile::rose->id);
}
}
}
}
itemInstance->count--;
return true;
}
}
return false;
}
void DyePowderItem::interactEnemy( ItemInstance* itemInstance, Mob* mob )
{
if (mob->getEntityTypeId() == MobTypes::Sheep) {
Sheep* sheep = (Sheep*) mob;
// convert to tile-based color value (0 is white instead of black)
int newColor = ClothTile::getTileDataForItemAuxValue(itemInstance->getAuxValue());
if (!sheep->isSheared() && sheep->getColor() != newColor) {
sheep->setColor(newColor);
itemInstance->count--;
}
}
}