mirror of
https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1.git
synced 2026-04-05 15:03:31 +00:00
the whole game
This commit is contained in:
359
src/world/entity/player/Inventory.cpp
Executable file
359
src/world/entity/player/Inventory.cpp
Executable file
@@ -0,0 +1,359 @@
|
||||
#include "Inventory.h"
|
||||
#include "../../level/material/Material.h"
|
||||
#include "../../level/tile/QuartzBlockTile.h"
|
||||
#include "../../level/tile/TreeTile.h"
|
||||
#include "../../level/tile/StoneSlabTile.h"
|
||||
#include "../../item/DyePowderItem.h"
|
||||
#include "../../item/crafting/Recipe.h"
|
||||
#include "../../item/CoalItem.h"
|
||||
#include "../../level/tile/SandStoneTile.h"
|
||||
|
||||
Inventory::Inventory( Player* player, bool creativeMode )
|
||||
: super( 36 + Inventory::MAX_SELECTION_SIZE,
|
||||
MAX_SELECTION_SIZE,
|
||||
ContainerType::INVENTORY,
|
||||
creativeMode),
|
||||
player(player),
|
||||
selected(0)
|
||||
{
|
||||
setupDefault();
|
||||
compressLinkedSlotList(0);
|
||||
}
|
||||
|
||||
Inventory::~Inventory() {
|
||||
}
|
||||
|
||||
ItemInstance* Inventory::getSelected() {
|
||||
return getLinked(selected);
|
||||
}
|
||||
|
||||
void Inventory::selectSlot( int slot ) {
|
||||
if (slot < MAX_SELECTION_SIZE && slot >= 0)
|
||||
selected = slot;
|
||||
}
|
||||
|
||||
bool Inventory::moveToSelectedSlot( int inventorySlot, bool propagate ) {
|
||||
return linkSlot(selected, inventorySlot, propagate);
|
||||
}
|
||||
|
||||
int Inventory::getSelectionSize() {
|
||||
return MAX_SELECTION_SIZE;
|
||||
}
|
||||
|
||||
void Inventory::setupDefault() {
|
||||
clearInventory();
|
||||
int Sel[MAX_SELECTION_SIZE] = {0};
|
||||
|
||||
#ifdef DEMO_MODE
|
||||
if (_isCreative) {
|
||||
Sel[0] = addItem(new ItemInstance(Item::shovel_stone));
|
||||
addItem(new ItemInstance(Item::pickAxe_stone));
|
||||
addItem(new ItemInstance(Item::hatchet_stone));
|
||||
addItem(new ItemInstance((Item*)Item::shears));
|
||||
addItem(new ItemInstance(Tile::ladder));
|
||||
Sel[3] = addItem(new ItemInstance(Tile::torch));
|
||||
addItem(new ItemInstance(Item::door_wood));
|
||||
|
||||
Sel[4] = addItem(new ItemInstance(Tile::stoneBrick));
|
||||
Sel[5] = addItem(new ItemInstance(Tile::wood));
|
||||
Sel[2] = addItem(new ItemInstance(Tile::redBrick));
|
||||
Sel[1] = addItem(new ItemInstance(Tile::dirt));
|
||||
addItem(new ItemInstance(Tile::sandStone));
|
||||
addItem(new ItemInstance(Tile::gravel));
|
||||
addItem(new ItemInstance(Tile::rock));
|
||||
addItem(new ItemInstance(Tile::sand));
|
||||
//addItem(new ItemInstance(Tile::clay));
|
||||
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 15));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 14));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 13));
|
||||
Sel[7] = addItem(new ItemInstance(Tile::cloth, 1, 12));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 11));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 10));
|
||||
Sel[8] = addItem(new ItemInstance(Tile::cloth, 1, 9));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 8));
|
||||
Sel[6] = addItem(new ItemInstance(Tile::glass));
|
||||
addItem(new ItemInstance(Tile::thinGlass));
|
||||
addItem(new ItemInstance(Tile::stairs_stone));
|
||||
addItem(new ItemInstance(Tile::bookshelf));
|
||||
addItem(new ItemInstance(Tile::workBench));
|
||||
addItem(new ItemInstance(Tile::chest));
|
||||
addItem(new ItemInstance(Tile::furnace));
|
||||
|
||||
addItem(new ItemInstance(((Tile*)Tile::flower)));
|
||||
addItem(new ItemInstance(Tile::cactus));
|
||||
|
||||
//
|
||||
// Those below are inactive due to demo
|
||||
//
|
||||
addItem(new ItemInstance(Item::sword_stone));
|
||||
addItem(new ItemInstance(Tile::treeTrunk, 1, 0));
|
||||
addItem(new ItemInstance(Tile::treeTrunk, 1, 1));
|
||||
addItem(new ItemInstance(Tile::treeTrunk, 1, 2));
|
||||
addItem(new ItemInstance(Tile::fence));
|
||||
addItem(new ItemInstance(Tile::fenceGate));
|
||||
addItem(new ItemInstance(Item::reeds));
|
||||
addItem(new ItemInstance(((Tile*)Tile::rose)));
|
||||
addItem(new ItemInstance(((Tile*)Tile::mushroom2)));
|
||||
addItem(new ItemInstance(((Tile*)Tile::mushroom1)));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 7));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 6));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 5));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 4));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 3));
|
||||
addItem(new ItemInstance(Tile::stairs_wood));
|
||||
addItem(new ItemInstance(Tile::goldBlock));
|
||||
addItem(new ItemInstance(Tile::ironBlock));
|
||||
addItem(new ItemInstance(Tile::emeraldBlock));
|
||||
addItem(new ItemInstance(Tile::lapisBlock));
|
||||
addItem(new ItemInstance(Tile::obsidian));
|
||||
addItem(new ItemInstance((Tile*)Tile::leaves, 1, 0));
|
||||
addItem(new ItemInstance((Tile*)Tile::leaves, 1, 1));
|
||||
addItem(new ItemInstance((Tile*)Tile::leaves, 1, 2));
|
||||
addItem(new ItemInstance(Tile::stoneSlabHalf));
|
||||
} else {
|
||||
#if defined(WIN32)
|
||||
// Survival
|
||||
addItem(new ItemInstance((Item*)Item::shears));
|
||||
addItem(new ItemInstance(Tile::redBrick));
|
||||
addItem(new ItemInstance(Tile::glass));
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
if (_isCreative) {
|
||||
// Blocks
|
||||
Sel[1] = addItem(new ItemInstance(Tile::stoneBrick));
|
||||
addItem(new ItemInstance(Tile::stoneBrickSmooth, 1, 0));
|
||||
addItem(new ItemInstance(Tile::stoneBrickSmooth, 1, 1));
|
||||
addItem(new ItemInstance(Tile::stoneBrickSmooth, 1, 2));
|
||||
addItem(new ItemInstance(Tile::mossStone));
|
||||
Sel[5] = addItem(new ItemInstance(Tile::wood));
|
||||
Sel[2] = addItem(new ItemInstance(Tile::redBrick));
|
||||
|
||||
#ifdef RPI
|
||||
Sel[3] = addItem(new ItemInstance(Tile::rock));
|
||||
#else
|
||||
Sel[0] = addItem(new ItemInstance(Tile::rock));
|
||||
#endif
|
||||
Sel[4] = addItem(new ItemInstance(Tile::dirt));
|
||||
addItem(new ItemInstance(Tile::grass));
|
||||
addItem(new ItemInstance(Tile::clay));
|
||||
addItem(new ItemInstance(Tile::sandStone, 1, 0));
|
||||
addItem(new ItemInstance(Tile::sandStone, 1, 1));
|
||||
addItem(new ItemInstance(Tile::sandStone, 1, 2));
|
||||
addItem(new ItemInstance(Tile::sand));
|
||||
addItem(new ItemInstance(Tile::gravel));
|
||||
|
||||
Sel[7] = addItem(new ItemInstance(Tile::treeTrunk, 1, 0));
|
||||
addItem(new ItemInstance(Tile::treeTrunk, 1, 1));
|
||||
addItem(new ItemInstance(Tile::treeTrunk, 1, 2));
|
||||
addItem(new ItemInstance(Tile::netherBrick));
|
||||
addItem(new ItemInstance(Tile::netherrack));
|
||||
addItem(new ItemInstance(Tile::stairs_stone));
|
||||
addItem(new ItemInstance(Tile::stairs_wood));
|
||||
Sel[6] = addItem(new ItemInstance(Tile::stairs_brick));
|
||||
addItem(new ItemInstance(Tile::stairs_sandStone));
|
||||
addItem(new ItemInstance(Tile::stairs_stoneBrickSmooth));
|
||||
addItem(new ItemInstance(Tile::stairs_netherBricks));
|
||||
addItem(new ItemInstance(Tile::stairs_quartz));
|
||||
addItem(new ItemInstance(Tile::stoneSlabHalf, 1, StoneSlabTile::STONE_SLAB));
|
||||
addItem(new ItemInstance(Tile::stoneSlabHalf, 1, StoneSlabTile::COBBLESTONE_SLAB));
|
||||
addItem(new ItemInstance(Tile::stoneSlabHalf, 1, StoneSlabTile::WOOD_SLAB));
|
||||
addItem(new ItemInstance(Tile::stoneSlabHalf, 1, StoneSlabTile::BRICK_SLAB));
|
||||
addItem(new ItemInstance(Tile::stoneSlabHalf, 1, StoneSlabTile::SAND_SLAB));
|
||||
addItem(new ItemInstance(Tile::stoneSlabHalf, 1, StoneSlabTile::SMOOTHBRICK_SLAB));
|
||||
|
||||
addItem(new ItemInstance(Tile::quartzBlock, 1, QuartzBlockTile::TYPE_DEFAULT));
|
||||
addItem(new ItemInstance(Tile::quartzBlock, 1, QuartzBlockTile::TYPE_LINES));
|
||||
addItem(new ItemInstance(Tile::quartzBlock, 1, QuartzBlockTile::TYPE_CHISELED));
|
||||
|
||||
|
||||
|
||||
// Ores
|
||||
addItem(new ItemInstance(Tile::coalOre));
|
||||
addItem(new ItemInstance(Tile::ironOre));
|
||||
addItem(new ItemInstance(Tile::goldOre));
|
||||
addItem(new ItemInstance(Tile::emeraldOre));
|
||||
addItem(new ItemInstance(Tile::lapisOre));
|
||||
addItem(new ItemInstance(Tile::redStoneOre));
|
||||
|
||||
addItem(new ItemInstance(Tile::goldBlock));
|
||||
addItem(new ItemInstance(Tile::ironBlock));
|
||||
addItem(new ItemInstance(Tile::emeraldBlock));
|
||||
addItem(new ItemInstance(Tile::lapisBlock));
|
||||
addItem(new ItemInstance(Tile::obsidian));
|
||||
addItem(new ItemInstance(Tile::snow));
|
||||
addItem(new ItemInstance(Tile::glass));
|
||||
addItem(new ItemInstance(Tile::lightGem));
|
||||
|
||||
addItem(new ItemInstance(Tile::netherReactor));
|
||||
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 0));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 7));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 6));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 5));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 4));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 3));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 2));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 1));
|
||||
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 15));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 14));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 13));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 12));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 11));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 10));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 9));
|
||||
addItem(new ItemInstance(Tile::cloth, 1, 8));
|
||||
addItem(new ItemInstance(Tile::ladder));
|
||||
#ifdef RPI
|
||||
addItem(new ItemInstance(Tile::torch));
|
||||
#else
|
||||
Sel[3] = addItem(new ItemInstance(Tile::torch));
|
||||
#endif
|
||||
addItem(new ItemInstance(Tile::thinGlass));
|
||||
|
||||
addItem(new ItemInstance(Item::door_wood));
|
||||
addItem(new ItemInstance(Tile::trapdoor));
|
||||
addItem(new ItemInstance(Tile::fence));
|
||||
addItem(new ItemInstance(Tile::fenceGate));
|
||||
|
||||
addItem(new ItemInstance(Item::bed));
|
||||
addItem(new ItemInstance(Tile::bookshelf));
|
||||
addItem(new ItemInstance(Item::painting));
|
||||
addItem(new ItemInstance(Tile::workBench));
|
||||
addItem(new ItemInstance(Tile::stonecutterBench));
|
||||
addItem(new ItemInstance(Tile::chest));
|
||||
addItem(new ItemInstance(Tile::furnace));
|
||||
addItem(new ItemInstance(Tile::tnt));
|
||||
|
||||
addItem(new ItemInstance(((Tile*)Tile::flower)));
|
||||
addItem(new ItemInstance(((Tile*)Tile::rose)));
|
||||
addItem(new ItemInstance(((Tile*)Tile::mushroom1)));
|
||||
addItem(new ItemInstance(((Tile*)Tile::mushroom2)));
|
||||
addItem(new ItemInstance(Tile::cactus));
|
||||
addItem(new ItemInstance(Tile::melon));
|
||||
addItem(new ItemInstance(Item::reeds));
|
||||
Sel[8] = addItem(new ItemInstance(Tile::sapling, 1, 0));
|
||||
addItem(new ItemInstance(Tile::sapling, 1, 1));
|
||||
addItem(new ItemInstance(Tile::sapling, 1, 2));
|
||||
addItem(new ItemInstance((Tile*)Tile::leaves, 1, 0));
|
||||
addItem(new ItemInstance((Tile*)Tile::leaves, 1, 1));
|
||||
addItem(new ItemInstance((Tile*)Tile::leaves, 1, 2));
|
||||
|
||||
addItem(new ItemInstance(Item::seeds_wheat));
|
||||
addItem(new ItemInstance(Item::seeds_melon));
|
||||
addItem(new ItemInstance(Item::dye_powder, 1, DyePowderItem::WHITE));
|
||||
addItem(new ItemInstance(Item::hoe_iron));
|
||||
#ifdef RPI
|
||||
Sel[0] = addItem(new ItemInstance(Item::sword_iron));
|
||||
#else
|
||||
addItem(new ItemInstance(Item::sword_iron));
|
||||
#endif
|
||||
addItem(new ItemInstance(Item::bow));
|
||||
addItem(new ItemInstance(Item::sign));
|
||||
} else {
|
||||
#if defined(WIN32)
|
||||
// Survival
|
||||
addItem(new ItemInstance(Item::ironIngot, 64));
|
||||
addItem(new ItemInstance(Item::ironIngot, 34));
|
||||
addItem(new ItemInstance(Tile::stonecutterBench));
|
||||
addItem(new ItemInstance(Tile::workBench));
|
||||
addItem(new ItemInstance(Tile::furnace));
|
||||
addItem(new ItemInstance(Tile::wood, 54));
|
||||
addItem(new ItemInstance(Item::stick, 14));
|
||||
addItem(new ItemInstance(Item::coal, 31));
|
||||
addItem(new ItemInstance(Tile::sand, 6));
|
||||
addItem(new ItemInstance(Item::dye_powder, 23, DyePowderItem::PURPLE));
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
for (unsigned int i = 0; i < items.size(); ++i) {
|
||||
ItemInstance* item = items[i];
|
||||
|
||||
if (i < MAX_SELECTION_SIZE) {
|
||||
if (item)
|
||||
LOGE("Error: Should not have items on slot %i\n", i);
|
||||
|
||||
items[i] = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (item && _isCreative)
|
||||
item->count = 5;
|
||||
}
|
||||
|
||||
for (int i = 0; i < MAX_SELECTION_SIZE; ++i) {
|
||||
linkedSlots[i] = LinkedSlot(Sel[i]);
|
||||
}
|
||||
|
||||
//LOGI("Inventory has %d items\n", (int)items.size());
|
||||
}
|
||||
|
||||
void Inventory::clearInventoryWithDefault()
|
||||
{
|
||||
clearInventory();
|
||||
setupDefault();
|
||||
}
|
||||
|
||||
int Inventory::getAttackDamage( Entity* entity )
|
||||
{
|
||||
ItemInstance* item = getSelected();
|
||||
if (item != NULL) return item->getAttackDamage(entity);
|
||||
return 1;
|
||||
}
|
||||
|
||||
bool Inventory::canDestroy( Tile* tile )
|
||||
{
|
||||
if (tile->material->isAlwaysDestroyable()) return true;
|
||||
|
||||
ItemInstance* item = getSelected();
|
||||
if (item != NULL) return item->canDestroySpecial(tile);
|
||||
return false;
|
||||
}
|
||||
|
||||
float Inventory::getDestroySpeed( Tile* tile )
|
||||
{
|
||||
ItemInstance* item = getSelected();
|
||||
if (item && item->id >= 256) {
|
||||
return Item::items[item->id]->getDestroySpeed(NULL, tile);
|
||||
}
|
||||
return 1.0f;
|
||||
}
|
||||
|
||||
bool Inventory::moveToSelectionSlot( int selectionSlot, int inventorySlot, bool propagate ) {
|
||||
return linkSlot(selectionSlot, inventorySlot, propagate);
|
||||
}
|
||||
|
||||
bool Inventory::moveToEmptySelectionSlot( int inventorySlot ) {
|
||||
return linkEmptySlot(inventorySlot);
|
||||
}
|
||||
|
||||
void Inventory::doDrop( ItemInstance* item, bool randomly )
|
||||
{
|
||||
player->drop(item, randomly);
|
||||
}
|
||||
|
||||
bool Inventory::stillValid(Player* player) {
|
||||
if (this->player->removed) return false;
|
||||
if (player->distanceToSqr(this->player) > 8 * 8) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Inventory::add( ItemInstance* item ){
|
||||
if (_isCreative || player->hasFakeInventory)
|
||||
return true;
|
||||
|
||||
return super::add(item);
|
||||
}
|
||||
|
||||
bool Inventory::removeItem( const ItemInstance* samePtr ) {
|
||||
for (int i = MAX_SELECTION_SIZE; i < (int)items.size(); ++i) {
|
||||
if (items[i] == samePtr) {
|
||||
clearSlot(i);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
Reference in New Issue
Block a user