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.
  • V-SNES V-SNES:
    Happy Friday!
    +1
  • The Helper The Helper:
    News portal has been retired. Main page of site goes to Headline News forum now
  • The Helper The Helper:
    I am working on getting access to the old news portal under a different URL for those that would rather use that for news before we get a different news view.
  • Ghan Ghan:
    Easily done
    +1
  • The Helper The Helper:
    https://www.thehelper.net/pages/news/ is a link to the old news portal - i will integrate it into the interface somewhere when i figure it out
  • Ghan Ghan:
    Need to try something
  • Ghan Ghan:
    Hopefully this won't cause problems.
  • Ghan Ghan:
    Hmm
  • Ghan Ghan:
    I have converted the Headline News forum to an Article type forum. It will now show the top 20 threads with more detail of each thread.
  • Ghan Ghan:
    See how we like that.
  • The Helper The Helper:
    I do not see a way to go past the 1st page of posts on the forum though
  • The Helper The Helper:
    It is OK though for the main page to open up on the forum in the view it was before. As long as the portal has its own URL so it can be viewed that way I do want to try it as a regular forum view for a while
  • Ghan Ghan:
    Yeah I'm not sure what the deal is with the pagination.
  • Ghan Ghan:
    It SHOULD be there so I think it might just be an artifact of having an older style.
  • Ghan Ghan:
    I switched it to a "Standard" article forum. This will show the thread list like normal, but the threads themselves will have the first post set up above the rest of the "comments"
  • The Helper The Helper:
    I don't really get that article forum but I think it is because I have never really seen it used on a multi post thread
  • Ghan Ghan:
    RpNation makes more use of it right now as an example: https://www.rpnation.com/news/
  • The Helper The Helper:
  • The Helper The Helper:
    What do you think Tom?
  • tom_mai78101 tom_mai78101:
    I will have to get used to this.
  • tom_mai78101 tom_mai78101:
    The latest news feed looks good

      The Helper Discord

      Staff online

      • Ghan
        Administrator - Servers are fun

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top