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

[Solved] PAYING$ Set Witcher's Inventory System to not allow heros to equip items based on attributes/levels

Status
Not open for further replies.
Level 5
Joined
Feb 13, 2019
Messages
128
Helllooo, I am just having issues with the last real thing I'll hopefully have to pester you guys for but I would appreciate more than I can put into words assistance with setting this inventory system - MUI Multiboard Inventory/Equipment System v.6.0

Which has been modified thanks to you wonderful hivers to have a carry weight function - Desperately need help incorporating an item/carry weight system into Witcher's Multiboard MUI Inv.

But I was really hoping to also have it set up in a way similar to RPG's like for instance Diablo 2, or Dungeon Siege, where your hero cannot actually equip the items unless he meets the requirements of the specific item they are trying to equip.

Really if I could just have it set up to play off of WC3's attributes that would be more than enough, level isn't a huge concern really.

For instance in the second link the "Big Sword" would be an item with 4 carry weight and the hero would need say 3 Strength to actually equip it.

Thank you for your time and I hope you're having a wonderful day. <3
 
Create two new variables:
  • MIS_Item ( item )
  • MIS_AllowPickUp ( boolean )
And update the script:

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,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,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,0)
    // big sword
    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)
    // 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,0)
    // 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,0)
    // 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,0)
    // 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,0)
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()
 
    private integer array weight
    private boolean weight_drop = false
endglobals

function RegisterItem takes integer itemid, string description, string path, integer abil1, integer abil2, integer abil3, integer slott, integer w 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
 
    set weight[items] = w
endfunction

function ChangeItemDescription takes integer itemid, string newdescr returns nothing
    set text[LoadInteger(h,itemid,0)] = newdescr
endfunction


private struct data
    unit u
    integer weight
    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.weight = 0
    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
    set weight_drop = true
    call UnitRemoveItemFromSlot(u,5)
    call UnitAddItemToSlotById(u,inventitem,5)
    set dat.invent = UnitItemInSlot(u,5)
    set weight_drop = false
    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
        set weight_drop = true
        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
        set weight_drop = false
        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
    set weight_drop = true
    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
    set weight_drop = false
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
        set weight_drop = true
        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
        set weight_drop = false
        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
// DisplayTextToPlayer          takes player toPlayer, real x, real y, string message returns nothing
private function print takes string s returns nothing
    call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, s)
endfunction

private function check takes nothing returns boolean
    local unit u = GetTriggerUnit()
    local item it = GetManipulatedItem()
    local data dat = LoadInteger(h,GetHandleId(u),1)
    local integer items = LoadInteger(h, GetItemTypeId(it), 0)
 
    if not weight_drop then
 
        set udg_MIS_Item = it
        set udg_MIS_AllowPickUp = true
        set udg_MIS_Unit = u
        set udg_MIS_ItemWeight = weight[items]
        set udg_MIS_UnitWeight = dat.weight
        set udg_MIS_WeightEvent = 1.00
        set udg_MIS_WeightEvent = 0.00
 
        if ( not udg_MIS_AllowPickUp or dat.weight + weight[items] > udg_MIS_MaxWeight) then
            set weight_drop = true
            call UnitRemoveItem(u, it)
            set weight_drop = false
            return false
        else
            set dat.weight = dat.weight + weight[items]
        endif
    endif
 
    set u = null
    set it = null
 
    return dat.auto == true
endfunction

private function UnitLosesItemWeight takes unit u, item it returns nothing
    local data dat = LoadInteger(h,GetHandleId(u),1)
    local integer items = LoadInteger(h, GetItemTypeId(it), 0)
    set dat.weight = dat.weight - weight[items]
    set udg_MIS_Unit = u
    set udg_MIS_ItemWeight = weight[items]
    set udg_MIS_UnitWeight = dat.weight
    set udg_MIS_WeightEvent = 2.00
    set udg_MIS_WeightEvent = 0.00
endfunction

private function onDrop takes nothing returns nothing
    if not weight_drop then
        call UnitLosesItemWeight(GetTriggerUnit(), GetManipulatedItem())
    endif
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 UpdateWeight takes nothing returns nothing
    local item it
    local integer itemTypeId
    local integer i
    local unit u = udg_MIS_Unit
    local integer itemKey
    local data dat = LoadInteger(h,GetHandleId(u),1)
 
    set udg_MIS_WeightEvent = 0
 
    if dat.weight <= udg_MIS_MaxWeight then
        return
    endif
 
    set i = 0
    loop
        exitwhen i > 5
     
        set it = UnitItemInSlot(u, i)
        set itemTypeId = GetItemTypeId(it)
     
        if HaveSavedInteger(h, itemTypeId, 0) then
            set itemKey = LoadInteger(h, itemTypeId, 0)
            if weight[itemKey] > 0 then
                call UnitRemoveItem(u, it)
            endif
        endif
     
        if dat.weight <= udg_MIS_MaxWeight then
            return
        endif
        set i = i + 1
    endloop
 
    set i = 1
    loop
        exitwhen i >= items
        set itemTypeId = itemm[i]
     
        if weight[i] > 0 then
            loop
                exitwhen not (UnitHasItemOfId(u, itemTypeId))
                set it = DropItemById(u, itemTypeId)
                call UnitRemoveItem(u, it)
                if dat.weight <= udg_MIS_MaxWeight then
                    return
                endif
            endloop
        endif
     
        set i = i + 1
    endloop
endfunction

private function Init takes nothing returns nothing
    local trigger t = CreateTrigger()
    local trigger tt = CreateTrigger()
    local trigger ttt = CreateTrigger()
    local trigger tttt = CreateTrigger()
    local trigger ttttt = CreateTrigger()
    local integer i = 0
 
    call TriggerRegisterVariableEvent(ttttt, "udg_MIS_WeightEvent", EQUAL, 3.00 )
    call TriggerAddAction(ttttt, function UpdateWeight)
 
    call TriggerRegisterAnyUnitEventBJ( tttt, EVENT_PLAYER_UNIT_DROP_ITEM )
    call TriggerAddAction(tttt, function onDrop)
 
    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

In the already existing item pickup event Game - MIS_WeightEvent becomes Equal to 1.00 you can now also use the both new variables you created.
  • MIS_Item - helps you to make the conditions. For example you can check the item's type, to know what level you require.
  • MIS_AllowPickUp - if you set this variable to false, then the item won't be picked up.
 
Level 39
Joined
Feb 27, 2007
Messages
4,994
I changed the registration function slightly to allow you to input str, agi, int, and lvl requirements. You will need to replace the following globals block and functions as well as add 4 additional arguments to all existing RegisterItem.evaluate() calls:

JASS:
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 str
    private integer array agi
    private integer array int
    private integer array lvl

    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
JASS:
function RegisterItem takes integer itemid, string description, string path, integer abil1, integer abil2, integer abil3, integer slott, integer strReq, integer agiReq, integer intReq, integer lvlReq 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 str[items] = strReq
    set agi[items] = agiReq
    set int[items] = intReq
    set lvl[items] = lvlReq

    set slot[items] = slott + 1
endfunction
JASS:
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 GetHeroStr(dat.u, true) < str[dat.slot2index[k]] or /*
    */ GetHeroAgi(dat.u, true) < agi[dat.slot2index[k]] or /*
    */ GetHeroInt(dat.u, true) < int[dat.slot2index[k]] or /*
    */ GetHeroLevel(dat.u) < lvl[dat.slot2index[k]] then

        call DisplayTimedTextToPlayer(Player(i),0,0,3,"You do not meet this item's requirements")
        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
You can change the message text, color, position, duration, etc. by modifying the DisplayTimedTextToPlayer call.
 
Status
Not open for further replies.
Top