1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- #include "CraftingStorage.h"
- BasicShapedCrafter::BasicShapedCrafter( int width, int height, Inventory* zInventory )
- : zInventory( zInventory ),
- width( width ),
- height( height )
- {
- for( int i = 0; i < width * height; i++ )
- {
- ItemSlot* slot = new ItemSlot( 1, std::numeric_limits<int>::max(), std::numeric_limits<int>::max(), INSIDE, INSIDE, 0 );
- zInventory->addSlot( slot );
- craftingInput.add( slot );
- }
- }
- bool BasicShapedCrafter::isAllAvailable( Framework::RCArray<ItemFilter>& filters, int width, int height )
- {
- for( int x = 0; x <= this->width - width; x++ )
- {
- for( int y = 0; y <= this->height - height; y++ )
- {
- for( int w = 0; w < width; w++ )
- {
- for( int h = 0; h < height; h++ )
- {
- ItemFilter* f = filters.z( w * width + h );
- ItemSlot* s = craftingInput.get( w * 2 + h );
- const Item* item = 0;
- if( s && s->zStack() )
- item = s->zStack()->zItem();
- if( (item && !f) || (!item && f) ) return 0;
- if( item && f && !f->matchItem( item ) )
- return 0;
- }
- }
- }
- }
- return 1;
- }
- bool BasicShapedCrafter::hasFreeSpace( const Item* zItem, int amount )
- {
- ItemStack* stack = new ItemStack( (Item*)zItem, amount );
- int addable = zInventory->numberOfAddableItems( stack, NO_DIRECTION );
- stack->release();
- return addable >= amount;
- }
- bool BasicShapedCrafter::consume( Framework::RCArray<ItemFilter>& filters, int width, int height )
- {
- for( ItemSlot* slot : craftingInput )
- {
- if( slot && slot->zStack() )
- {
- ItemStack* stack = zInventory->takeItemsOut( slot, 1, INSIDE );
- if( stack )
- stack->release();
- }
- }
- for( int x = 0; x < width; x++ )
- {
- for( int y = 0; y < height; y++ )
- {
- ItemFilter* f = filters.z( x * width + y );
- if( f )
- {
- ItemSlot* target = craftingInput.get( x * this->width + y );
- Framework::Array< ItemSlot*> tmp;
- tmp.add( target );
- zInventory->localTransaction( 0, &tmp, f, 1, NO_DIRECTION, INSIDE );
- }
- }
- }
- return 1;
- }
- void BasicShapedCrafter::addCraftingResult( ItemStack* stack )
- {
- zInventory->addItems( stack, NO_DIRECTION );
- }
|