1. Updated Resource Submission Rules: All model & skin resource submissions must now include an in-game screenshot. This is to help speed up the moderation process and to show how the model and/or texture looks like from the in-game camera.
    Dismiss Notice
  2. DID YOU KNOW - That you can unlock new rank icons by posting on the forums or winning contests? Click here to customize your rank or read our User Rank Policy to see a list of ranks that you can unlock. Have you won a contest and still havn't received your rank award? Then please contact the administration.
    Dismiss Notice
  3. Travel to distant realms and encounter scenes unknown to the common folk. The Greatest of Adventures is upon us with the 8th Cinematic Contest. Join in on a fun ride.
    Dismiss Notice
  4. The 18th Icon Contest is ON! Choose any ingame unit and give him/her Hero abilities. Good luck to all.
    Dismiss Notice
  5. The Secrets of Warcraft 3 have revealed interesting works. The RESULTS for Abelhawk's Mini-Mapping Contest #15 have come out!
    Dismiss Notice
  6. Contestants are to create a scene set in the Stone Age. Come and see what you can come up with. We wish you the best of luck!
    Dismiss Notice
  7. Colour outside the lines! Techtree Contest #13 is a go. The contest is optionally paired.
    Dismiss Notice
  8. Night Rider gained several songs for his journey. The poll for the 12th Music Contest has started. Check it out!
    Dismiss Notice
  9. Greetings cerebrates, our Swarm needs new spawners that will have numerous children. Join the HIVE's 31st Modeling Contest - Spawners and Spawned! The contest is optionally paired.
    Dismiss Notice
  10. Check out the Staff job openings thread.
    Dismiss Notice
Dismiss Notice
60,000 passwords have been reset on July 8, 2019. If you cannot login, read this.

Add item/carry weight restriction to The_Witcher's MUI Multiboard Inventory/Equipment System v.6.0?

Discussion in 'World Editor Help Zone' started by blanabasjim, May 7, 2019.

  1. blanabasjim

    blanabasjim

    Joined:
    Feb 13, 2019
    Messages:
    83
    Resources:
    0
    Resources:
    0
    So let's say we've implemented The_Witcher's MUI Multiboard Inventory/Equipment System v.6.0, and we want to add a weight amount,(I'm assuming this would be required?) and carry weight limit, onto all our items, and player hero units.

    For instance a greatsword weighs 5 pounds, and the hero can only carry 40 pounds of total carry weight, the unit "picks it up" (add's it to the 6 slot Hero Inventory in WC3), and then puts it in the trigger's inventory, once it
    "picks up" the item (add's it to the basic WC3 6 slot Hero Inventory) it can only carry 35 more pounds worth of items, it "loses" 5 carry weight upon picking up that sword, but it can also place the item into the triggers inventory and the current weight limit of 35 and loss of 5 is retained while the items are stored in the trigger inventory.

    and eventually when it tries to even pick an item up, to simply carry in the Hero Inventory, (before the triggers inventory) if that item would put it past 40, it doesn't allow the unit to pick it up, I hate to ask, I just can't even really figure out where to start with this one. D:






    The_Witcher's Multiboard Equipment and Inventory System (JASS)
    Code (vJASS):

    //TESH.scrollpos=0
    //TESH.alwaysfold=0
    library MultiboardInventory initializer Init
    // The_Witcher's Multiboard Equipment and Inventory System
    //
    //This is a MUI inventory-in-a-multiboard-system.
    //it allows you to add an inventory to any unit
    //the inventory has a part for equipment and a part for a "normal" inventory
    //you can register items for this system (unregistered ones won't move inside the inventory),
    //check whether a unit has a item of type xy in its inventory, force dropping of an item of type,
    //directly remove a item of type xy from the iventory from the game or check whether a itemtype is already registered
    //
    // when you give a unit a inventory it will only open when you cast the open ability. you can navigate with the arrow keys.
    // items with charges will stack automatically. to add an item right click on it and the right click again on the "Inventory" item.
    // when autoadd is enabled all pickuped items which are registered will be added automatically
    //
    // here are the included functions:
    //
    // 1.to give a unit the inventory use
    //
    //  call InitInventory(ToWhichUnit)
    //                        unit  
    //
    // 2.To get rid of a inventory just use
    //   call DestroyInventory( which unit's)
    //                             unit
    //
    // 3.to register an item for this system use(if the item shouldn't be equipable enter 0 for UsedSlotWhenEquipment. the abilities can be 0 then, too.)
    //  call RegisterItem(itemid, ItemDescription, PathToIcon, ability1, ability2, ability3, UsedSlotWhenEquipment)
    //                   integer     string          string    integer   integer   integer        integer
    //
    // 4.to check whether you have an item already registered use(it will return true or false)
    //   call IsItemRegistered(itemid)
    //                        integer
    //
    // 5.to force dropping of a item use (it will drop the first found item of that type)
    //   call DropItemById(fromWhich, itemid)
    //                       unit     integer
    //
    // 6.to remove an item directly use ( it will remove the first found item of that type)
    //   call RemoveItemById(FromWhichUnit, itemid)
    //                          unit        integer
    //
    // 7.to check whether a unit has an item of type xy use
    //   call UnitHasItemOfId(WhichUnit, itemid)
    //                          unit     integer
    //
    // 8.to change the description of a registered itemtype use
    //   call ChangeItemDescription(itemid, newdescription)
    //                              integer   string
    //
    // 9.to manually enable/disable the auto add for a specific unit use
    //   call ForceAutoAdd(forwhich, flag)
    //                       unit   boolean
    //
    // to implement this system, just copy this trigger in your map
    // it requires jngp to be edited/saved
    //
    // have fun^^
    //
    //--------------------------------
    //--------The SETUP PART----------
    //--------------------------------
    globals
        private constant integer openabi = 'A000'           // the ability to open/close the inventory
        private constant integer dropabi = 'A002'           // the ability to drop the selected item to the normal inventory
        private constant integer equipabi = 'A003'          // the ability to equip the selected item
        private constant integer autoadd = 'A005'           // the ability to enable/disable autoadd
        private constant integer inventitem = 'I000'        // the rawcode of the invetory item you use to add single items
        private constant string emptyslot = "[------]"      // the text shown when a slot is not used
        private constant string NewLine = "PP"              // the text used in the description to show the parser that he should start a new line (\n will NOT work)
        private constant string name = "|cff0863B5"         // the colorcode of the Name of the selected item in the info part
        private constant string description = "|cff08B5FF"  // the colorcode of the description of the selected item in the info part
        private constant string help = "|cffE62929"         // the colorcode of the help texts
        private constant string titles = "|cffFFCC00"       // the colorcode of the names of the cathegories
        private constant integer classes = 8                // the amount of different classes you have for equipable items
        private constant boolean autoadd_enabled = true     // if this is false units won't get the autoadd ability. autoadd is only possible by functions then.
       
                            //make sure that you synch the following hotkey variables with the hotkeys of the abilities in the object editor
        private constant string HotkeyExit = "O"            // the hotkey for opening/closing the multiboard inventory
        private constant string HotkeyDrop = "D"            // the hotkey for dropping an item
        private constant string HotkeyEquip = "E"           // the hotkey for equiping/unequiping an item
        private constant string HotkeyAutoadd = "T"         // the hotkey for Enabling/Disabling the AutoAdd feature
       
        private string array EquipName             // ignore this one here
    endglobals
    private function InitItems takes nothing returns nothing  // use this function to register all the items you want to be registered from the start
        // potion
        call RegisterItem.evaluate('phea',"Heals very good, and is very healthy...","ReplaceableTextures\\CommandButtons\\BTNPotionGreenSmall.blp",0,0,0,0)
        // clear vision
        call RegisterItem.evaluate('plcl',"For clear vision.PPEnables best underwaterview ever seen.PPAlso is very userfriendly!!!","ReplaceableTextures\\CommandButtons\\BTNLesserClarityPotion.blp",0,0,0,0)
        // sword
        call RegisterItem.evaluate('I001',"This is just a normal sword!PP PPType: Mainhand.PPAdds 5 Damage.","ReplaceableTextures\\CommandButtons\\BTNDaggerOfEscape.blp",'A004',0,0,2)
        // big sword
        call RegisterItem.evaluate('I002',"This sword is very huge!PPIt deals epic damage!!PP PPType: Mainhand.PPAdds 20 Damage.","ReplaceableTextures\\CommandButtons\\BTNArcaniteMelee.blp",'A006',0,0,2)
        // big shield
        call RegisterItem.evaluate('I003',"A heavy shield. Helping even against strong blows.PP PPType: Offhand.PPAdds 10 Armor.","ReplaceableTextures\\CommandButtons\\BTNHumanArmorUpThree.blp",'A007',0,0,3)
        // shield
        call RegisterItem.evaluate('I004',"A small shield. Helps only against light blows.PP PPType: Offhand.PPAdds 3 Armor.","ReplaceableTextures\\CommandButtons\\BTNHumanArmorUpOne.blp",'A008',0,0,3)
        // cursed armor
        call RegisterItem.evaluate('I005',"This Armor is cursed and will help you, boosting your defensive and offensive skillsPP PPType: Armor.PPAdds 3 Armor and 4 damage.","ReplaceableTextures\\CommandButtons\\BTNMoonArmor.blp",'A009','A00A',0,4)
        // special box
        call RegisterItem.evaluate('I006',"Huh? A small box with a paper in it:PP PPThis System is created by The_Witcher!!","ReplaceableTextures\\CommandButtons\\BTNBox.blp",0,0,0,8)
    endfunction
    private function InitEquipment takes nothing returns nothing   // use this function to set up the names of the equipment slots
        set EquipName[1] = "[Helmet]"
        set EquipName[2] = "[Mainhand]"
        set EquipName[3] = "[Offhand]"
        set EquipName[4] = "[Armor]"
        set EquipName[5] = "[Boots]"
        set EquipName[6] = "[Gloves]"
        set EquipName[7] = "[Amulet]"
        set EquipName[8] = "[Special]"
    endfunction
    //--------------------------------
    //---------END OF SETUP-----------
    //--------------------------------
    globals
        private integer items = 1
        private integer array itemm
        private string array text
        private string array iconpath
        private integer array abi1
        private integer array abi2
        private integer array abi3
        private integer array slot
        private integer array x
        private integer array y
        private group g = CreateGroup()
        private multiboard array board
        private unit array t
        private integer maxchars = 35
        private hashtable h = InitHashtable()
        private group d =CreateGroup()
    endglobals  
    function RegisterItem takes integer itemid, string description, string path, integer abil1, integer abil2, integer abil3, integer slott returns nothing
        set items = items + 1
        call SaveInteger(h,itemid,0,items)
        set itemm[items] = itemid
        set text[items] = description
        set iconpath[items] = path
        set abi1[items] = abil1
        set abi2[items] = abil2
        set abi3[items] = abil3
        set slot[items] = slott + 1
    endfunction
    function ChangeItemDescription takes integer itemid, string newdescr returns nothing
        set text[LoadInteger(h,itemid,0)] = newdescr
    endfunction
    private struct data
        unit u
        multiboard m
        integer lu = 1
        item invent
        boolean auto = false
        integer array stack[99]
        integer array slot2index[99]
    endstruct
    private function ParseString takes string toparse, integer i returns nothing
        local integer s = 0
        local integer line = 0
        local integer linestart = 0
        local integer spacepoint = 0
        local boolean next = false
        loop
            exitwhen s > 28
            call MultiboardSetItemValueBJ( board[i], 2, 9+s, "")
            set s = s+ 1
        endloop
        set s = 0
        loop
            exitwhen linestart+s > StringLength(toparse)
            set s = s+1
            if SubString(toparse,linestart+s-1,linestart+s) == " " then
                set spacepoint = linestart+s
            endif
            if SubString(toparse,linestart+s-StringLength(NewLine),linestart+s) == NewLine then
                set spacepoint = linestart+s-StringLength(NewLine)
                set s = maxchars
                set next = true
            endif
            if s >= maxchars then
                call MultiboardSetItemValueBJ( board[i], 2, 9+line, description + SubString(toparse,linestart,spacepoint ) + "|r" )
                set linestart = spacepoint
                set spacepoint = linestart
                set s = 0
                set line = line + 1
                if next then
                    set next = false
                    set linestart = linestart + StringLength(NewLine)
                endif
            endif
        endloop
        call MultiboardSetItemValueBJ( board[i], 2, 9+line, description + SubString(toparse,linestart,StringLength(toparse) ) + "|r" )
    endfunction
    private function UpdateDescription takes integer i returns nothing
        local item ite
        local integer a = 2
        local data dat = LoadInteger(h,GetHandleId(t[i]),1)    
        if dat == 0 then
            return
        endif
        loop
            exitwhen a > 28
            if dat.slot2index[a] != 0 then
                call MultiboardSetItemColorBJ(dat.m,3,a,100,100,100,0)
                call MultiboardSetItemColorBJ(dat.m,4,a,100,100,100,0)
            else
                call MultiboardSetItemColorBJ(dat.m,3,a,50,50,50,0)
                call MultiboardSetItemColorBJ(dat.m,4,a,50,50,50,0)
            endif
            set a = a + 1
        endloop
        set a = 30
        loop
            exitwhen a > 56
            if dat.slot2index[a] != 0 then
                call MultiboardSetItemColorBJ(dat.m,1,a-28,100,100,100,0)
            else
                call MultiboardSetItemColorBJ(dat.m,1,a-28,50,50,50,0)
            endif
            set a = a + 1
        endloop
        if x[i] == 1 then
            call MultiboardSetItemColorBJ( dat.m, 1, y[i], 10, 100, 10, 0 )
        else
            call MultiboardSetItemColorBJ( dat.m, 3, y[i], 10, 100, 10, 0 )
            call MultiboardSetItemColorBJ( dat.m, 4, y[i], 10, 100, 10, 0 )
        endif
        if x[i] == 1 then
            set ite = CreateItem(itemm[dat.slot2index[y[i] + 28]],0,0)              
            call MultiboardSetItemValueBJ( dat.m, 2, 8, name + GetItemName(ite) + "|r" )
            call RemoveItem(ite)
            set ite = null
            call ParseString(text[dat.slot2index[y[i] + 28]],i)
        else
            set ite = CreateItem(itemm[dat.slot2index[y[i]]],0,0)
            call MultiboardSetItemValueBJ( dat.m, 2, 8, name + GetItemName(ite) + "|r"  )
            call RemoveItem(ite)
            set ite = null
            call ParseString(text[dat.slot2index[y[i]]],i)
        endif
    endfunction
    private function AddItem takes item which, data dat returns nothing
        local integer i = LoadInteger(h,GetItemTypeId(which),0)
        local integer a = 0
        local boolean b
        if which == null then
            return
        endif
        loop
            exitwhen a > dat.lu
            if itemm[dat.slot2index[a]] == GetItemTypeId(which) and GetItemCharges(which)!= 0 and dat.stack[a] < 99 then
                set dat.stack[a] = dat.stack[a] + GetItemCharges(which)
                call MultiboardSetItemValueBJ( dat.m, 4, a, I2S(dat.stack[a]) )
                call RemoveItem(which)
                return
            endif
            set a = a + 1
        endloop
        if dat.lu != 28 then
            set dat.lu = dat.lu + 1
            set dat.slot2index[dat.lu] = i
            set dat.stack[dat.lu] = GetItemCharges(which)
            call MultiboardSetItemStyleBJ( dat.m, 3, dat.lu, true, true )
            call MultiboardSetItemIconBJ( dat.m, 3, dat.lu, iconpath[i] )
            call MultiboardSetItemValueBJ( dat.m, 3, dat.lu, GetItemName(which) )
            if dat.stack[dat.lu]!= 0 then
                call MultiboardSetItemValueBJ( dat.m, 4, dat.lu, I2S(dat.stack[dat.lu]) )
            endif
            call RemoveItem(which)
        endif    
        call UpdateDescription(GetPlayerId(GetOwningPlayer(dat.u)))
    endfunction
    private function InventoryRemoveItem takes integer i, data dat returns nothing
        local integer k = y[i]
        local item ite
        if (x[i] == 3 and k > dat.lu) or (x[i] == 1 and dat.slot2index[k+28] == 0)then    
            return
        endif
        if x[i] == 1 then
            call UnitRemoveAbility(dat.u,abi1[dat.slot2index[k+28]])
            call UnitRemoveAbility(dat.u,abi2[dat.slot2index[k+28]])
            call UnitRemoveAbility(dat.u,abi3[dat.slot2index[k+28]])
            set dat.slot2index[k+28] = 0
            call MultiboardSetItemValueBJ( dat.m, 1, k, EquipName[k-1] )
            call MultiboardSetItemStyleBJ( dat.m, 1, k, true, false )
        else
            loop
                call MultiboardSetItemIconBJ( dat.m, 3, k, iconpath[dat.slot2index[k+1]] )
                set ite = CreateItem(itemm[dat.slot2index[k+1]],0,0)
                call MultiboardSetItemValueBJ( dat.m, 3, k, GetItemName(ite) )
                if dat.stack[k+1]!= 0 then
                    call MultiboardSetItemValueBJ( dat.m, 4, k, I2S(dat.stack[k+1]) )
                else
                    call MultiboardSetItemValueBJ( dat.m, 4, k, "" )
                endif
                set dat.stack[k] = dat.stack[k+1]
                call RemoveItem(ite)
                set dat.slot2index[k] = dat.slot2index[k+1]
                exitwhen k == dat.lu
                set k = k + 1
            endloop
            call MultiboardSetItemStyleBJ( dat.m, 3, dat.lu, true, false )
            call MultiboardSetItemValueBJ( dat.m, 3, dat.lu, emptyslot )
            call MultiboardSetItemValueBJ( dat.m, 4, dat.lu, "" )
            set dat.slot2index[dat.lu] = 0
            set dat.stack[dat.lu] = 0
            set dat.lu = dat.lu - 1
        endif
        set ite = null
        call UpdateDescription(i)
    endfunction
    private function Unequip takes integer i,integer slot, data dat returns nothing
        local integer k = slot
        local item ite
        if itemm[dat.slot2index[k+28]] == 0 then
            return
        endif
        set ite = CreateItem(itemm[dat.slot2index[k+28]],0,0)
        call AddItem(ite,dat)
        call UnitRemoveAbility(dat.u,abi1[dat.slot2index[k+28]])
        call UnitRemoveAbility(dat.u,abi2[dat.slot2index[k+28]])
        call UnitRemoveAbility(dat.u,abi3[dat.slot2index[k+28]])
        set dat.slot2index[k+28] = 0
        call MultiboardSetItemValueBJ( dat.m, 1, k, EquipName[k-1] )
        call MultiboardSetItemStyleBJ( dat.m, 1, k, true, false )
        call UpdateDescription(i)
        set ite = null
    endfunction
    private function Equip takes integer i, data dat returns nothing
        local integer k = y[i]
        local item ite
        if k > dat.lu or slot[dat.slot2index[k]] == 1 then
            return
        endif
        if dat.slot2index[slot[dat.slot2index[y[i]]]+28] != 0 then
            set k = slot[dat.slot2index[k]]
            set ite = CreateItem(itemm[dat.slot2index[k+28]],0,0)
            call AddItem(ite,dat)
            call UnitRemoveAbility(dat.u,abi1[dat.slot2index[k+28]])
            call UnitRemoveAbility(dat.u,abi2[dat.slot2index[k+28]])
            call UnitRemoveAbility(dat.u,abi3[dat.slot2index[k+28]])
            set dat.slot2index[k+28] = 0
            call MultiboardSetItemValueBJ( dat.m, 1, k, EquipName[k-1] )
            call MultiboardSetItemStyleBJ( dat.m, 1, k, true, false )
            set k = y[i]
        endif
        set dat.slot2index[slot[dat.slot2index[k]]+28] = dat.slot2index[k]
        set ite = CreateItem(itemm[dat.slot2index[k]],0,0)
        call MultiboardSetItemValueBJ( dat.m, 1, slot[dat.slot2index[k]], GetItemName(ite) )
        call MultiboardSetItemIconBJ( dat.m, 1, slot[dat.slot2index[k]], iconpath[dat.slot2index[k]] )
        call MultiboardSetItemStyleBJ( dat.m, 1, slot[dat.slot2index[k]], true, true )
        call RemoveItem(ite)
        call UnitAddAbility(dat.u,abi1[dat.slot2index[k]])
        call UnitAddAbility(dat.u,abi2[dat.slot2index[k]])
        call UnitAddAbility(dat.u,abi3[dat.slot2index[k]])
        set ite = null
        call InventoryRemoveItem(i,dat)
    endfunction
    function IsItemRegistered takes integer itemid returns boolean
         return LoadInteger(h,itemid,0) != 0
    endfunction
    function InitInventory takes unit u returns nothing
        local integer i = 2
        local data dat = data.create()
        set dat.u = u
        set dat.m = CreateMultiboardBJ(4,30,"Inventory")
        call MultiboardSetItemWidthBJ( dat.m, 1, 0, 25 )
        call MultiboardSetItemWidthBJ( dat.m, 2, 0, 22 )
        call MultiboardSetItemWidthBJ( dat.m, 3, 0, 25 )
        call MultiboardSetItemWidthBJ( dat.m, 4, 0, 8 )
        call MultiboardSetItemStyleBJ( dat.m, 0, 0, true, false )
        call MultiboardSetItemValueBJ( dat.m, 3, 0, emptyslot )
        call MultiboardSetItemValueBJ( dat.m, 3, 29, "" )
        call MultiboardSetItemValueBJ( dat.m, 3, 30, "" )
        call MultiboardSetItemValueBJ( dat.m, 3, 1, titles + "INVENTORY" + "|r")
        call MultiboardSetItemValueBJ( dat.m, 1, 1, titles + "EQUIPMENT" + "|r")
        call MultiboardSetItemValueBJ( dat.m, 2, 7, titles + "INFO" + "|r" )
        call MultiboardSetItemValueBJ( dat.m, 2, 1, titles + "HELP" + "|r" )
        call MultiboardSetItemValueBJ( dat.m, 4, 1, titles + "CHARGES" + "|r" )
        call MultiboardSetItemValueBJ( dat.m, 2, 2, help + HotkeyExit +" = Exit" + "|r")
        call MultiboardSetItemValueBJ( dat.m, 2, 3, help + HotkeyDrop +" = Drop to normal Inventory" + "|r")
        call MultiboardSetItemValueBJ( dat.m, 2, 4, help + HotkeyEquip +" = Equip/Unequip"  + "|r")
        call MultiboardSetItemValueBJ( dat.m, 2, 5, help + HotkeyAutoadd +" = AutoPickup ON/OFF  [OFF]"  + "|r")
        loop
            exitwhen i == classes+2
            call MultiboardSetItemValueBJ( dat.m, 1, i, EquipName[i-1] )
            set i = i + 1
        endloop
        call MultiboardDisplay(dat.m,false)
        call UnitAddAbility(u,openabi)
        if autoadd_enabled then
            call UnitAddAbility(u,autoadd)
        endif
        call UnitRemoveItemFromSlot(u,5)
        call UnitAddItemToSlotById(u,inventitem,5)
        set dat.invent = UnitItemInSlot(u,5)
        call GroupAddUnit(g,u)
        call SaveInteger(h,GetHandleId(u),1,dat)
    endfunction
    function DestroyInventory takes unit u returns boolean
        local data dat = LoadInteger(h,GetHandleId(u),1)
        local integer i = 0
        if dat == 0 then
            return false
        endif
        call MultiboardDisplay(dat.m,false)
        call UnitRemoveAbility(u,openabi)
        call UnitRemoveAbility(u,autoadd)
        call UnitRemoveAbility(u,dropabi)
        call UnitRemoveAbility(u,equipabi)
        call UnitRemoveItemFromSlot(u,5)
        call GroupRemoveUnit(g,u)
        call FlushChildHashtable(h,GetHandleId(u))
        call dat.destroy()
        return true
    endfunction
    private function abilities takes nothing returns nothing
        local data dat
        local unit u = GetTriggerUnit()
        local integer i = GetPlayerId(GetOwningPlayer(u))
        local boolean b
        if (GetSpellAbilityId() == openabi) then
            set dat = LoadInteger(h,GetHandleId(u),1)
            if board[i] != null then
                call MultiboardDisplay(board[i],false)
                call UnitRemoveAbility(u,dropabi)
                call UnitRemoveAbility(u,equipabi)
                set board[i] = null
                set t[i] = null
            else
                set x[i] = 3
                set y[i] = 2
                if GetLocalPlayer() == Player(i) then
                    call MultiboardDisplay(dat.m,true)
                    call MultiboardMinimize(dat.m, false)
                endif
                set board[i] = dat.m
                set t[i] = dat.u
                call UnitAddAbility(u,dropabi)
                call UnitAddAbility(u,equipabi)
                call UpdateDescription(i)
            endif
        elseif (GetSpellAbilityId() == dropabi) then
            set dat = LoadInteger(h,GetHandleId(u),1)
            set b = dat.auto
            set dat.auto = false
            if x[i] == 3 then
                if dat.stack[y[i]]!=0 then
                    call SetItemCharges(UnitAddItemById(dat.u, itemm[dat.slot2index[y[i]]]),dat.stack[y[i]])
                else
                    call UnitAddItemById(dat.u, itemm[dat.slot2index[y[i]]])
                endif
            else
                call UnitAddItemById(dat.u, itemm[dat.slot2index[y[i]+28]])
            endif
            call InventoryRemoveItem(i,dat)
            set dat.auto = b
        elseif (GetSpellAbilityId() == equipabi) then
            set dat = LoadInteger(h,GetHandleId(u),1)
            if x[i] == 1 then
                call Unequip(i,y[i], dat)
            else
                call Equip(i, dat)
            endif
        elseif (GetSpellAbilityId() == autoadd) then
            set dat = LoadInteger(h,GetHandleId(u),1)
            if dat.auto == false then
                set dat.auto = true
                call MultiboardSetItemValueBJ( dat.m, 2, 5, help + "T = AutoPickup ON/OFF  [ON]"  + "|r")
            else
                set dat.auto = false
                call MultiboardSetItemValueBJ( dat.m, 2, 5, help + "T = AutoPickup ON/OFF  [OFF]"  + "|r")
            endif
        endif
        set u = null
    endfunction
    private function AddingItemsAndMultiboardStuff takes nothing returns nothing
        local data dat
        local unit u
        local item ite
        local boolean b
        local integer i = 0
        loop
            exitwhen i > bj_MAX_PLAYER_SLOTS
            if board[i] != null then
            if IsUnitSelected(t[i],Player(i)) == false then
                set dat = LoadInteger(h,GetHandleId(t[i]),1)
                call MultiboardDisplay(dat.m,false)
                set board[i] = null
                call UnitRemoveAbility(dat.u,dropabi)
                call UnitRemoveAbility(dat.u,equipabi)
                set t[i] = null
            endif
            if IsMultiboardMinimized(board[i]) and board[i] != null then
                call MultiboardMinimize(board[i],false)
            endif
            endif
            set i = i + 1
        endloop
        call GroupAddGroup(g,d)
        loop
            set u = FirstOfGroup(d)
            exitwhen u == null
            set ite = UnitItemInSlot(u,5)
            if GetItemTypeId(ite) != inventitem then
                if IsItemRegistered(GetItemTypeId(ite)) then
                    set dat = LoadInteger(h,GetHandleId(u),1)
                    if dat.lu == 28 then
                        call UnitRemoveItem(u,ite)
                    endif
                    call AddItem(ite,dat)
                    call RemoveItem(dat.invent)
                    call UnitAddItemToSlotById(u,inventitem,5)
                    set dat.invent = UnitItemInSlot(u,5)
                    if ite != null then
                        call UnitAddItem(u,ite)
                    endif
                else
                    set dat = LoadInteger(h,GetHandleId(u),1)
                    set b = dat.auto
                    set dat.auto = false
                    set ite = UnitRemoveItemFromSlot(dat.u,5)
                    call RemoveItem(dat.invent)
                    call UnitAddItemToSlotById(u,inventitem,5)
                    set dat.invent = UnitItemInSlot(u,5)
                    call UnitAddItem(dat.u,ite)
                    set dat.auto = b
                endif
            endif
            call GroupRemoveUnit(d,u)
        endloop
        set ite = null
    endfunction
    function UnitHasItemOfId takes unit u, integer itemid returns boolean
         local data dat = LoadInteger(h,GetHandleId(u),1)
         local integer a = 0
         if dat == 0 then
            return false
         endif
         loop
            exitwhen a == 56
            if itemm[dat.slot2index[a]] == itemid then
                return true
            endif
            set a = a + 1
        endloop
        return false
    endfunction
    private function GetXOfItemOfId takes unit u, integer itemid returns integer
         local data dat = LoadInteger(h,GetHandleId(u),1)
         local integer a = 0
         loop
            exitwhen a == 56
            if itemm[dat.slot2index[a]] == itemid then
                if a > 28 then
                return 1
                endif
                return 3
            endif
            set a = a + 1
        endloop
        return 0
    endfunction
    private function GetYOfItemOfId takes unit u, integer itemid returns integer
         local data dat = LoadInteger(h,GetHandleId(u),1)
         local integer a = 0
         loop
            exitwhen a == 56
            if itemm[dat.slot2index[a]] == itemid then
                if a > 28 then
                return a-28
                endif
                return a
            endif
            set a = a + 1
        endloop
        return 0
    endfunction
    function DropItemById takes unit fromwhich, integer itemid returns item
        local data dat = LoadInteger(h,GetHandleId(fromwhich),1)
        local item ite
        local integer i = GetPlayerId(GetOwningPlayer(dat.u))
        local boolean b
        local integer xx = x[i]
        local integer yy = y[i]
        if dat == 0 then
            return null
        endif
        set b = dat.auto
        set dat.auto = false
        set x[i] = GetXOfItemOfId(dat.u,itemid)
        set y[i] = GetYOfItemOfId(dat.u,itemid)
        if x[i] != 0 and y[i] != 0 then
            if x[i] == 3 then
                if dat.stack[y[i]]!=0 then
                    set ite = UnitAddItemById(dat.u, itemm[dat.slot2index[y[i]]])
                    call SetItemCharges(ite,dat.stack[y[i]])
                else
                    set ite = UnitAddItemById(dat.u, itemm[dat.slot2index[y[i]]])
                endif
            else
                set ite = UnitAddItemById(dat.u, itemm[dat.slot2index[y[i]+28]])
            endif
            call InventoryRemoveItem(i, dat)
        endif
        set dat.auto = b
        set x[i] = xx
        set y[i] = yy
        return ite
    endfunction
    function RemoveItemById takes unit fromwhich, integer itemid returns nothing
        local data dat = LoadInteger(h,GetHandleId(fromwhich),1)
        if dat == 0 then
            return
        endif
        call RemoveItem(DropItemById( fromwhich, itemid))
    endfunction
    function ForceAutoAdd takes unit forwhich, boolean flag returns nothing
        local data dat = LoadInteger(h,GetHandleId(forwhich),1)
        if dat == 0 then
            return
        endif
        set dat.auto = flag
    endfunction
    private function autopick takes nothing returns nothing
        local unit u = GetTriggerUnit()
        local data dat = LoadInteger(h,GetHandleId(u),1)
        local item ite = GetManipulatedItem()
            if GetItemTypeId(ite) != inventitem and IsItemRegistered(GetItemTypeId(ite)) then
                call AddItem(ite, dat)
            endif
        set u = null
        set ite = null
    endfunction
    private function check takes nothing returns boolean
        local data dat = LoadInteger(h,GetHandleId(GetTriggerUnit()),1)
        return dat.auto == true
    endfunction
    private function LEFTpress takes nothing returns nothing
        local integer i = GetPlayerId(GetTriggerPlayer())
        set x[i] = x[i] - 1
        if x[i] == 0 then
            set x[i] = 3
        elseif x[i] == 2 then
            set x[i] = 1
            if y[i] > classes+1 then
                set y[i] = classes+1
            endif
        endif
        call UpdateDescription(i)
    endfunction
    private function UPpress takes nothing returns nothing
        local integer i = GetPlayerId(GetTriggerPlayer())
        set y[i] = y[i] - 1
        if y[i] == 1 then
            if x[i] == 3 then
                set y[i] = 28
            else
                set y[i] = classes+1
            endif
        endif
        call UpdateDescription(i)
    endfunction
    private function DOWNpress takes nothing returns nothing
        local integer i = GetPlayerId(GetTriggerPlayer())
        set y[i] = y[i] + 1
        if x[i] == 3 then
        if y[i] == 29 then
            set y[i] = 2
        endif
        else
        if y[i] == classes+2 then
            set y[i] = 2
        endif
        endif
        call UpdateDescription(i)
    endfunction
    private function RIGHTpress takes nothing returns nothing
        local integer i = GetPlayerId(GetTriggerPlayer())
        set x[i] = x[i] + 1
        if x[i] == 4 then
            set x[i] = 1
            if y[i] > classes+1 then
                set y[i] = classes+1
            endif
        elseif x[i] == 2 then
            set x[i] = 3
        endif
        call UpdateDescription(i)
    endfunction
    //! textmacro KEY takes KEY
    set ttt = CreateTrigger()
    call TriggerRegisterPlayerKeyEventBJ( ttt, Player(i), bj_KEYEVENTTYPE_DEPRESS, bj_KEYEVENTKEY_$KEY$ )
    call TriggerAddAction( ttt, function $KEY$press )
    //! endtextmacro
    private function Init takes nothing returns nothing
        local trigger t = CreateTrigger()
        local trigger tt = CreateTrigger()
        local trigger ttt = CreateTrigger()
        local integer i = 0
       
        call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_CAST )
        call TriggerAddAction(t, function abilities)
       
        call TriggerRegisterTimerEvent(tt,0.01,true)
        call TriggerAddAction(tt, function AddingItemsAndMultiboardStuff)
       
        call TriggerRegisterAnyUnitEventBJ( ttt, EVENT_PLAYER_UNIT_PICKUP_ITEM )
        call TriggerAddAction(ttt, function autopick)
        call TriggerAddCondition(ttt, Condition(function check))
       
        loop
            exitwhen i == 12
            //! runtextmacro KEY("LEFT")
            //! runtextmacro KEY("RIGHT")
            //! runtextmacro KEY("UP")
            //! runtextmacro KEY("DOWN")
            set x[i] = 3
            set y[i] = 2
            set i = i + 1
        endloop
       
        call InitItems()
        call InitEquipment()
    endfunction
    endlibrary
     
     
    Last edited: May 7, 2019
  2. Dr Super Good

    Dr Super Good

    Spell Reviewer

    Joined:
    Jan 18, 2005
    Messages:
    25,430
    Resources:
    3
    Maps:
    1
    Spells:
    2
    Resources:
    3
    You would need a new private integer array to represent weight, along with adding it to the RegisterItem function so as to allow weights for items to be input.

    You would need to extend the data struct so that it has an integer to track the total weight a unit can have as well as the current weight a unit is carrying. The InitInventory method might need to be changed to allow one to feed this initial weight capacity in. Additionally if the weight capacity can change one might need a setter/mutator method. If the total weight capacity is decremented and the current weight is larger than it then you will need to automatically drop items until the current weight is less than the weight capacity.

    Then with the autopick method you will want to check if there is enough free weight to allow the item to be added. If not then you immediately drop the item. To prevent an infinite loop this may require pausing the unit after the drop order or something like that, I forget the details.

    Then the AddItem method is modified so that it adds the weight of the item to the current weight of the inventory. No check is needed.

    Then in the methods responsible for removing/dropping items you will want to decrement the current weight of the inventory by the weight of the item.
     
  3. blanabasjim

    blanabasjim

    Joined:
    Feb 13, 2019
    Messages:
    83
    Resources:
    0
    Resources:
    0

    Okay so I'll be honest a good portion of that is lost on me but practice makes perfect, lol! I can put in a resource request as well and hope for the best, thank you so much for your time!