• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

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

Status
Not open for further replies.
Level 5
Joined
Feb 13, 2019
Messages
128
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)
JASS:
//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:

Dr Super Good

Spell Reviewer
Level 63
Joined
Jan 18, 2005
Messages
27,188
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.
 
Level 5
Joined
Feb 13, 2019
Messages
128
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.


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!
 
Status
Not open for further replies.
Top