• 🏆 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!

Desperately need help incorporating an item/carry weight system into Witcher's Multiboard MUI Inv.

Status
Not open for further replies.
Level 5
Joined
Feb 13, 2019
Messages
128
My original thread -
Add item/carry weight restriction to The_Witcher's MUI Multiboard Inventory/Equipment System v.6.0?

The system I'd like to build off of -
The_Witcher's MUI Multiboard Inventory/Equipment System v.6.0

The information and steps to complete the system given to me by Dr Super Good-

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.



System Code:

JASS:
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:
Level 5
Joined
Feb 13, 2019
Messages
128
I am just still fairly new to what I feel like is more advanced aspects of world editor and would be absolutely ecstatic if I could get a hand with this! :cry:
 
Level 21
Joined
Dec 4, 2007
Messages
1,473
You should know that with each intricate system you incorporate the amount of fine-tuning and bug fixing becomes greater.

I would ask myself if this is really necessary for your project.
 
Level 5
Joined
Feb 13, 2019
Messages
128
I want it to be a pretty intense survival simulator type deal, this is probably one of the main systems, and mechanics I have in my vision of the map, all I really have other than this is a lightweight buff system, a DDS, a rather simple backstab trigger, save/load, and a recipe system, so I'm hoping I'm not pushing world editor too hard, and I don't personally (with my noobness) think they should conflict with one another all that much seeing how "far apart" they are from one another. :confused:2
 
EDIT: See further post for newer map.

Max weight is currently 10. You can change it here:
private constant integer MAX_WEIGHT = 10

For items, I only customized "Big Sword" with weight. It has weight "4". Have a close look to the register function, it looks a bit different now:

call RegisterItem.evaluate('I002',"This sword is very huge!PPIt deals epic damage!!PP PPType: Mainhand.PPAdds 20 Damage.PPHas 4 weight","ReplaceableTextures\\CommandButtons\\BTNArcaniteMelee.blp",'A006',0,0,2,4)
^Note the extra weight note in the description, and also one extra parameter with value 4 in the very end. All other items have value 0 and no added description, yet. You will need to adapt the weight for all other items, too.

Currently a simple message is displayed when you gain/lose item, or try to gain a item with max weight. We can change it though, if you want we can customize, or remove messages.
 

Attachments

  • MultiboardInventSystem.w3x
    41.4 KB · Views: 125
Last edited:
Level 5
Joined
Feb 13, 2019
Messages
128
and the messages are a perfect fit for what I was imagining if anything I'd like to have a way to increase or decrease the amount, for example every Strength attribute could be factored into an equation of some sort, or just a flat amount of carry weight per Strength Point is added, etc.

and you could also use it to decrease the amount if the unit was to get some sort of debuff to negatively impact the carry weight, but honestly I could just subtract Strength from the unit and it would basically have the same effect.
 
Level 5
Joined
Feb 13, 2019
Messages
128
I'm better with GUI, still learning JASS, I'm just trying to see if I can get these systems setup so I can start chipping away at the map, so idk, I'll take whatever I can get to be honest :p
 
Level 5
Joined
Feb 13, 2019
Messages
128
Oh I'm so sorry you said we can customize the messages, I didn't mean to assume you would help me with the rest of the trigger, I just got excited and misread that lmao I'm so sorry! :p
 
You should be able to manipluate the handling with max weight now to your needs.

You can set the max weight here (leave the other stuff):
  • MIS Init
    • Events
      • Map initialization
    • Conditions
    • Actions
      • Set MIS_MaxWeight = 10
      • Set MIS_Unit = No unit
      • Set MIS_WeightEvent = 0.00
      • Set MIS_ItemWeight = 0
^The max weight is a normal variable. You can increase of decrease the max weight at any time you want. Really at any time, also in the following pickup/drop triggers.
But watch out, when you decrease the max weight. When the value is decreased you should run one more action, so the system can properly react, and drop items if needed. See later for this action.

When a new item is picked up you have a GUI trigger to react on your needs:
  • MIS WeightEvent Pickup
    • Events
      • Game - MIS_WeightEvent becomes Equal to 1.00
    • Conditions
      • MIS_ItemWeight Greater than 0
    • Actions
      • Set i = (MIS_UnitWeight + MIS_ItemWeight)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • i Greater than MIS_MaxWeight
        • Then - Actions
          • Set text = (Max weight: + (String(MIS_MaxWeight)))
        • Else - Actions
          • Set text = (Weight: + ((String(i)) + (/ + (String(MIS_MaxWeight)))))
      • Game - Display to (All players) the text: text
^for example:
  • it provides the current unit
  • it provides the current unit weight
  • it provides the item weight about being picked up (not picked up, yet!)
... so you can print pickedup messages, or error messages if weight is too much. Of course you also can read or change value of MaxWeight here! So when you recongize you want to increase the max weight here, and it will be still properly picked up.

When a item is dropped:
  • MIS WeightEvent Drop
    • Events
      • Game - MIS_WeightEvent becomes Equal to 2.00
    • Conditions
      • MIS_ItemWeight Greater than 0
    • Actions
      • Set text = (Weight: + ((String(MIS_UnitWeight)) + (/ + (String(MIS_MaxWeight)))))
      • Game - Display to (All players) the text: text
^basically you can use same variables from above again. ItemWeight, UnitWeight, Unit

Now comes a demo where the player can change the max weight with typing a message. For example "-20" will set the new max weight to 20.
We only need to care to run extra stuff (set event to "3.00") when we want to update a unit to a decreased max weight. ALWAYS run the event 3.00 with your unit, if you decrease the max weight, so the system can drop items!
But in a case where we don't decrease it, we only print a mesage, without updating units, because then there's nothing critical.
  • WeightUpdate Demo
    • Events
      • Player - Player 1 (Red) types a chat message containing - as A substring
    • Conditions
    • Actions
      • Set i = (Integer((Substring((Entered chat string), 2, (Length of (Entered chat string))))))
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • i Less than MIS_MaxWeight
        • Then - Actions
          • Set MIS_MaxWeight = i
          • Unit Group - Pick every unit in (Units currently selected by Player 1 (Red)) and do (Actions)
            • Loop - Actions
              • Set MIS_Unit = (Picked unit)
              • Set MIS_WeightEvent = 3.00
        • Else - Actions
          • Set MIS_MaxWeight = i
      • Set text = (New max weight: + (String(MIS_MaxWeight)))
      • Game - Display to (All players) the text: text
... so when your hero gains ability or strength or what ever you can change the max weight.
 

Attachments

  • MultiboardInventSystem.w3x
    43.9 KB · Views: 127
Status
Not open for further replies.
Top