Files
minecraft-pe-0.6.1/src/world/entity/player/Inventory.cpp
Shredder 055f00be49 A bit big of a commit but
Added 3 Fog Choices (Pocket) (Java) (Unknown that was unused)

Restored Java Beta Sky Color code that was unused that depends on biome temperature (choosable using Java fog)

Tile Shadows and Entity Shadows that appear beneath them have been restored and fixed from the unused code, toggleable by turning fancy graphics on or off

Entities will now render flames on themselves when on fire, including the player

Added option to use Java Style Item Count text and position in tweaks

- fileshredder
2026-04-06 01:52:27 +05:00

361 lines
12 KiB
C++
Executable File

#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));
addItem(new ItemInstance(Item::flintAndSteel));
#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;
}