forked from Kolyah35/minecraft-pe-0.6.1
the whole game
This commit is contained in:
109
src/world/item/crafting/Recipe.cpp
Executable file
109
src/world/item/crafting/Recipe.cpp
Executable file
@@ -0,0 +1,109 @@
|
||||
#include "Recipe.h"
|
||||
#include "../../../util/Mth.h"
|
||||
#include "../../level/tile/Tile.h"
|
||||
|
||||
void ItemPack::add( int id, int count /* = 1 */ )
|
||||
{
|
||||
Map::iterator it = items.find(id);
|
||||
if (it == items.end()) {
|
||||
items.insert(std::make_pair(id, count));
|
||||
} else {
|
||||
it->second += count;
|
||||
}
|
||||
}
|
||||
|
||||
void ItemPack::print() const
|
||||
{
|
||||
Map::const_iterator it = items.begin();
|
||||
while (it != items.end()) {
|
||||
ItemInstance item = getItemInstanceForId(it->first);
|
||||
//LOGI("> %d - %d, %d\n", it->first, item.id, item.getAuxValue());
|
||||
++it;
|
||||
}
|
||||
}
|
||||
|
||||
int ItemPack::getMaxMultipliesOf( ItemPack& v ) const
|
||||
{
|
||||
if (v.items.empty())
|
||||
return 0;
|
||||
int minCount = 99;
|
||||
|
||||
Map::iterator it = v.items.begin();
|
||||
while (it != v.items.end()) {
|
||||
if (it->first <= 0) {
|
||||
++it;
|
||||
continue;
|
||||
}
|
||||
|
||||
Map::const_iterator jt = items.find(it->first);
|
||||
if (jt == items.end()) {
|
||||
//LOGI("shotto: %d (%s) wasn't found!\n", it->first, getItemInstanceForId(it->first).toString().c_str());
|
||||
return 0;
|
||||
}
|
||||
if (it->second == 0) {
|
||||
//LOGE("getMaxMultipliesOf: Can't have count 0 of item: %d\n", it->first);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int count = jt->second / it->second;
|
||||
if (count == 0) return 0;
|
||||
minCount = Mth::Min(minCount, count);
|
||||
++it;
|
||||
}
|
||||
return minCount;
|
||||
}
|
||||
|
||||
std::vector<ItemInstance> ItemPack::getItemInstances() const
|
||||
{
|
||||
std::vector<ItemInstance> out;
|
||||
Map::const_iterator it = items.begin();
|
||||
while (it != items.end()) {
|
||||
int id = it->first;
|
||||
int count = it->second;
|
||||
|
||||
ItemInstance item = getItemInstanceForId(id);
|
||||
item.count = count;
|
||||
out.push_back(item);
|
||||
++it;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
int ItemPack::getIdForItemInstance( const ItemInstance* ii )
|
||||
{
|
||||
bool anyAuxValue = Recipe::isAnyAuxValue(ii);
|
||||
return ii->id * 512 + (anyAuxValue? -1/*Recipes::ANY_AUX_VALUE*/ : ii->getAuxValue());
|
||||
}
|
||||
int ItemPack::getIdForItemInstanceAnyAux( const ItemInstance* ii )
|
||||
{
|
||||
return ii->id * 512 - 1;
|
||||
}
|
||||
|
||||
ItemInstance ItemPack::getItemInstanceForId( int id )
|
||||
{
|
||||
id += 256;
|
||||
return ItemInstance(id / 512, 1, (id & 511) - 256);
|
||||
}
|
||||
|
||||
int ItemPack::getCount( int id ) const
|
||||
{
|
||||
Map::const_iterator it = items.find(id);
|
||||
if (it == items.end()) return 0;
|
||||
return it->second;
|
||||
}
|
||||
|
||||
|
||||
/*static*/
|
||||
const int Recipe::SIZE_2X2 = 0;
|
||||
const int Recipe::SIZE_3X3 = 1;
|
||||
|
||||
bool Recipe::isAnyAuxValue( int id )
|
||||
{
|
||||
bool isTile = id < 256;
|
||||
if (!isTile) return false;
|
||||
if (id == Tile::cloth->id
|
||||
|| id == Tile::stoneSlabHalf->id
|
||||
|| id == Tile::sandStone->id)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
Reference in New Issue
Block a user