Nestharus
o-o
- Reaction score
- 84
Properly saves partial inventories. If a hero has only 4 out of 6 items, it will save those 4 items and then a 0, meaning 5 items are saved instead of 6.
JASS:
library SaveInventory /*
*************************************************************************************
*
* Saves hero inventory
*
*************************************************************************************
*
* */uses/*
*
* */ NumberStack /* hiveworkshop.com/forums/1993458-post521.html
* */ Catalog /* hiveworkshop.com/forums/jass-functions-413/snippet-catalog-192452/
* */ optional Buffer /* hiveworkshop.com/forums/2002936-post568.html
*
************************************************************************************
*
* function SaveInventory takes NumberStack stack, unit whichUnit, Catalog itemCatalog returns nothing
*
* -> No Buffer <-
*
* function LoadInventory takes NumberStack stack, unit whichUnit, Catalog itemCatalog returns nothing
*
* -> Buffer <-
*
* function LoadInventoryToBuffer takes NumberStack stack, unit whichUnit, Catalog itemCatalog returns nothing
* function LoadInventoryFromBuffer takes unit whichUnit returns nothing
*
* itemCatalog
*
* Must pass a catalog of items. If doing hero specific inventories, pass in the catalog specific
* to the hero. If doing more complex, go for a custom solution.
*
* Basic Demos
*
* ************************************************************************************
* *
* * local NumberStack stack = NumberStack.create(Base["0123456789abcdefghijklmnopqrstuvwxyz"])
* *
* * //save hero inventory
* * call SaveInventory(stack,someHero,someItemCatalog)
* *
* * //add hero afterwards so that you can do hero specific inventories if you want
* * call stack.push(CatalogRaw(someItemCatalog,GetUnitTypeId(someHero)),CatalogCount(someItemCatalog))
* *
* ************************************************************************************
* *
* * local NumberStack stack = DecryptNumber(...)
* *
* * //load hero
* * local integer heroId = stack.pop(CatalogCount(someItemCatalog))
* *
* * //possibly load hero specific item catalog?
* * call LoadInventory(stack, CreateUnit(heroId), someItemCatalog)
* *
* ************************************************************************************
*
************************************************************************************/
function SaveInventory takes NumberStack stack, unit whichUnit, Catalog itemCatalog returns nothing
local integer inventorySize = UnitInventorySize(whichUnit)
local integer itemSlot = 0
local integer inventoryCount = 0
local integer array items
local integer catalogCount = itemCatalog.count
//retrieve all non null items in inventory
loop
exitwhen inventorySize==itemSlot
if (null!=UnitItemInSlot(whichUnit,itemSlot)) then
set items[inventoryCount]=itemCatalog.id(GetItemTypeId(UnitItemInSlot(whichUnit,itemSlot)))
set inventoryCount=inventoryCount+1
endif
set itemSlot=itemSlot+1
endloop
//if there is an empty slot in inventory, push 0 on to stack (boolean)
if (inventoryCount<inventorySize) then
call stack.push(0,catalogCount)
endif
//push all non null items in inventory on to stack
loop
exitwhen 0==inventoryCount
set inventoryCount=inventoryCount-1
call stack.push(items[inventoryCount],catalogCount)
endloop
endfunction
static if LIBRARY_Buffer then
function LoadInventoryToBuffer takes NumberStack stack, unit whichUnit, Catalog itemCatalog returns nothing
local integer inventorySize = UnitInventorySize(whichUnit)
local integer itemSlot = 0
local integer catalogCount = itemCatalog.count
local integer loadItem
loop
exitwhen inventorySize==itemSlot
set loadItem=stack.pop(catalogCount)
exitwhen 0==loadItem
call Buffer.write(itemCatalog.raw(loadItem))
set itemSlot=itemSlot+1
endloop
if (0==loadItem) then
call Buffer.write(0)
endif
endfunction
function LoadInventoryFromBuffer takes unit whichUnit returns nothing
local integer inventorySize = UnitInventorySize(whichUnit)
local integer itemSlot = 0
local integer loadItem
loop
exitwhen inventorySize==itemSlot
set loadItem=Buffer.read()
exitwhen 0==loadItem
call UnitAddItemToSlotById(whichUnit,loadItem,itemSlot)
set itemSlot=itemSlot+1
endloop
endfunction
else
function LoadInventory takes NumberStack stack, unit whichUnit, Catalog itemCatalog returns nothing
local integer inventorySize = UnitInventorySize(whichUnit)
local integer itemSlot = 0
local integer catalogCount = itemCatalog.count
local integer loadItem
loop
exitwhen inventorySize==itemSlot
set loadItem=stack.pop(catalogCount)
exitwhen 0==loadItem
call UnitAddItemToSlotById(whichUnit,itemCatalog.raw(loadItem),itemSlot)
set itemSlot=itemSlot+1
endloop
endfunction
endif
endlibrary