Snippet Save Inventory

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
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top