1. Join other hivers in a friendly concept-art contest. The contestants have to create a genie coming out of its container. We wish you the best of luck!
    Dismiss Notice
  2. The Melee Mapping Contest #4: 2v2 - Results are out! Step by to congratulate the winners!
    Dismiss Notice
  3. We're hosting the 15th Mini-Mapping Contest with YouTuber Abelhawk! The contestants are to create a custom map that uses the hidden content within Warcraft 3 or is inspired by any of the many secrets within the game.
    Dismiss Notice
  4. The 20th iteration of the Terraining Contest is upon us! Join and create exquisite Water Structures for it.
    Dismiss Notice
  5. Check out the Staff job openings thread.
    Dismiss Notice

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

Discussion in 'Requests' started by blanabasjim, May 7, 2019.

  1. blanabasjim

    blanabasjim

    Joined:
    Feb 13, 2019
    Messages:
    74
    Resources:
    0
    Resources:
    0
    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-




    System Code:

    Code (vJASS):
    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 8, 2019
  2. blanabasjim

    blanabasjim

    Joined:
    Feb 13, 2019
    Messages:
    74
    Resources:
    0
    Resources:
    0
    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:
     
  3. A]mun

    A]mun

    Joined:
    Dec 4, 2007
    Messages:
    741
    Resources:
    0
    Resources:
    0
    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.
     
  4. blanabasjim

    blanabasjim

    Joined:
    Feb 13, 2019
    Messages:
    74
    Resources:
    0
    Resources:
    0
    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
     
  5. IcemanBo

    IcemanBo

    Joined:
    Sep 6, 2013
    Messages:
    6,104
    Resources:
    22
    Maps:
    3
    Spells:
    11
    Template:
    1
    Tutorials:
    4
    JASS:
    3
    Resources:
    22
    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.
     

    Attached Files:

    Last edited: May 12, 2019
  6. blanabasjim

    blanabasjim

    Joined:
    Feb 13, 2019
    Messages:
    74
    Resources:
    0
    Resources:
    0
    Zomg you are my favorite person in the world right now! Thank you so much, seriously man! :p
     
  7. blanabasjim

    blanabasjim

    Joined:
    Feb 13, 2019
    Messages:
    74
    Resources:
    0
    Resources:
    0
    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.
     
  8. blanabasjim

    blanabasjim

    Joined:
    Feb 13, 2019
    Messages:
    74
    Resources:
    0
    Resources:
    0
    But you are a godsend lmao

    + rep \o/
     
  9. IcemanBo

    IcemanBo

    Joined:
    Sep 6, 2013
    Messages:
    6,104
    Resources:
    22
    Maps:
    3
    Spells:
    11
    Template:
    1
    Tutorials:
    4
    JASS:
    3
    Resources:
    22
    Ok, great! Do you use GUI, or JASS/vJASS?
     
  10. blanabasjim

    blanabasjim

    Joined:
    Feb 13, 2019
    Messages:
    74
    Resources:
    0
    Resources:
    0
    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
     
  11. blanabasjim

    blanabasjim

    Joined:
    Feb 13, 2019
    Messages:
    74
    Resources:
    0
    Resources:
    0
    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
     
  12. IcemanBo

    IcemanBo

    Joined:
    Sep 6, 2013
    Messages:
    6,104
    Resources:
    22
    Maps:
    3
    Spells:
    11
    Template:
    1
    Tutorials:
    4
    JASS:
    3
    Resources:
    22
    I'll make something (probably this weekend). : )
     
  13. blanabasjim

    blanabasjim

    Joined:
    Feb 13, 2019
    Messages:
    74
    Resources:
    0
    Resources:
    0
    You're the best lmaoo! :grin: :cry:
     
  14. IcemanBo

    IcemanBo

    Joined:
    Sep 6, 2013
    Messages:
    6,104
    Resources:
    22
    Maps:
    3
    Spells:
    11
    Template:
    1
    Tutorials:
    4
    JASS:
    3
    Resources:
    22
    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.
     

    Attached Files:

  15. blanabasjim

    blanabasjim

    Joined:
    Feb 13, 2019
    Messages:
    74
    Resources:
    0
    Resources:
    0
    Oh myyyy, thank you so much man, I can't wait to put this to use and get the ball rolling, thank you so much! :cry:
     
  16. IcemanBo

    IcemanBo

    Joined:
    Sep 6, 2013
    Messages:
    6,104
    Resources:
    22
    Maps:
    3
    Spells:
    11
    Template:
    1
    Tutorials:
    4
    JASS:
    3
    Resources:
    22
    You're welcome!