123 lines
4.0 KiB
C++
Executable File
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--;
|
|
}
|
|
}
|
|
}
|