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

[JASS] Need help with inventory system (MUI inventory by the Witcher)- Please help!

Status
Not open for further replies.
Level 3
Joined
Feb 12, 2011
Messages
38
Need help with inventory system

Hey Guys,
I got following problem:
I added an esc version of The Witcher's MUI-inventory system to my map. Normally the inventory is supposed to open when pressing esc and the abilities "drop to normal inventor" and "equip" should appear. The problem is: You're inside a shop and press esc. Somehow the abilities appear inside the shop, but the inventory does not open. (I dont want the inventory to open while inside a shop nor do I want these abilities to show up) Also If possible I'd prefer to have the system without any abilities just by pressing keys. (for example to equip an item) I am a TOTAL NOOB at JASS! s please help me guys! I already contacted The Witcher about 3 times (the first time about 2 or 3 months ago and the last time one or two weeks ago) but he didn't answer. I am grateful for the system and I'd like to get it working in my map. Here is the Code:

JASS:
 [SIZE="4"] // 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 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 = 'I00E'        // 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 = 10               // the amount of different classes you have for equipable items
        private constant boolean autoadd_enabled = false     // 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 = "Esc"            // 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)
    //Templer's blades
    call RegisterItem.evaluate('I02V',"This Armor is cursed and will help you, boosting your defensive and offensive skillsPP PPType: Armor.PPAdds 3 Armor and 4 damage.","war3mapImported\\BTNCrossedSwords.blp",'A0TB','ATB2','ABTB',2)
    //Rusty Sword
    call RegisterItem.evaluate('I002',"This is only a cheap sword. Increases the damade by 10.PP PPType: Mainhand.PPAdds 10 damage.","war3mapImported\\BTNRustySword.blp",'A00N',0,0,2)
    //Rusty Iron Helmet
    call RegisterItem.evaluate('I005',"This is only a cheap helmet. Increases the HP by 100 and the armor by 1.PP PPType: Helmet.PPAdds 10 damage.","ReplaceableTextures\\CommandButtons\\BTNHelmutPurple.blp",'A00O','A00P',0,1)  
    //Leather Cap
    call RegisterItem.evaluate('I006',"This cheap leathery cap grants you 10 speed and 1 mana per second.PP PPType: Helmet.PPAdds 10 speed and 1 mana regeneration. (does not add up with others).","ReplaceableTextures\\CommandButtons\\BTNHoodOfCunning.blp",'A00U','A00Y',0,1)
    //knife
    call RegisterItem.evaluate('I007',"Fast but low damage. Increases the attack speed by 10%.PP PPType: Mainhand.PPIncreases tha attackspeed by 10%.","war3mapImported\\BTNKnife.blp",'A01C',0,0,2)
    //Disrupted shield
    call RegisterItem.evaluate('I008',"A broken and worthless shield that still grants its owner 1.5 armor and 50HP..PP PPType: Offhand.PPIncreases tha armor by 2 and the HP by 50.","war3mapImported\\BTNShield.blp",'A032','A034',0,3)
    //wooden vambrace
    call RegisterItem.evaluate('I009',"A weak vambrace that will still shield from some weak attacks. Therefore it will increase the armor by 0.5 and the attack speed by 6%.PP PPType: Offhand.PPIncreases tha armor by 1 and the attackspeed by 6%.","war3mapImported\\BTNINV_Bracer_08.blp",'A00P','A035',0,3)
    //Sharp stick
    call RegisterItem.evaluate('I00A',"Just an ordinary wooden stick that does low damage (8).PP PPType: Offhand.PPgrants 8 damage.","war3mapImported\\BTNSharpWoodenStick.blp",'A03B',0,0,3)
    //Fabric Torso
    call RegisterItem.evaluate('I00B',"A cheap piece of cloth that grants the hero 50% mana regeneration and 100 mana.PP PPType: Armor.PPgrants 50% mana reg. and 100mana.","war3mapImported\\BTNMageArmor.blp",'A04I','A039',0,5)
    //shabby leather armor
    call RegisterItem.evaluate('I00C',"A cheap piece armor that grants the hero 10 attackspeed as well as 10 speed.PP PPType: Armor.PPgrants 10 attack speed and 10 speed.","war3mapImported\\BTNWoodenArmor2.blp",'A0IC','A00Y',0,5)
    //Rusty Chainmail
    call RegisterItem.evaluate('I00H',"A cheap piece armor that grants the hero 150 hp -bonus and 1 armor.PP PPType: Armor.PPgrants 150hp and 1 armor.","war3mapImported\\BTNINV_Chest_Chain_05.blp",'A03A','A00P',0,5)
    //Copper Plates
    call RegisterItem.evaluate('I00I',"A cheap piece armor that grants the hero 1 armor.PP PPType: Plates.PPgrants 1 armor.","war3mapImported\\BTNINV_Chest_Chain_08.blp",'A00P',0,0,4)
    //Stone
    call RegisterItem.evaluate('I0QJ',"Just an ordinary stone with some magical powers. It grants 50% more mana regeneration.PP PPType: Amulet.PPgrants 25% mana regeneration.","war3mapImported\\BTNINV_Misc_Rock_01.blp",'A039',0,0,8)
    //sandals
    call RegisterItem.evaluate('I00L',"Cheep shoes that allow you to walk 10 faster.PP PPType: Boots.PPgrants 10 speed","war3mapImported\\BTNSandalZ.blp",'A00Y',0,0,6)
    //wooden ring
    call RegisterItem.evaluate('I00L',"Just a cheap wooden ring. It grants the hero +25% mana regeneration.PP PPType: Ring.PPgrants 25% mana regeneration.","war3mapImported\\BTNINV_Jewelry_Ring_13.blp",'A04J',0,0,9)
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] = "[Shoulder Plates]"
    set EquipName[5] = "[Armor]"
    set EquipName[6] = "[Boots]"
    set EquipName[7] = "[Gloves]"
    set EquipName[8] = "[Amulet]"
    set EquipName[9] = "[Ring]"
    set EquipName[10] = "[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 boolean array typebool
    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  

    function IsClassEnabled takes itemtype t returns boolean
        local integer i = 0
        loop
            exitwhen i > 8
            if ConvertItemType(i) == t then
                return typebool[i]
            endif
            set i = i + 1
        endloop
        return false
    endfunction  

    function EnableItemClass takes itemtype t, boolean flag returns nothing
        local integer i = 0
        loop
            exitwhen i > 8
            if ConvertItemType(i) == t then
                set typebool[i] = flag
            endif
            set i = i + 1
        endloop
    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)
        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,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 onEsc takes nothing returns nothing
            local group g = CreateGroup()
            local data dat
            local unit u
            local integer i = GetPlayerId(GetTriggerPlayer())
            call GroupEnumUnitsSelected(g, GetTriggerPlayer(),null)
            set u = FirstOfGroup(g)
            call DestroyGroup(g)
            set g = null
            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
    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() == 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 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

    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)) and IsClassEnabled(GetItemType(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
                    call UnitRemoveItem(dat.u,ite)
                    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

    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)) and IsClassEnabled(GetItemType(ite)) then
            call AddItem(ite, dat)
        endif
        set u = null
        set ite = null
    endfunction

    function CreateItemIntoInventory takes unit u, integer itemid returns nothing
        local data dat = LoadInteger(h,GetHandleId(u),1)
        local item ite = CreateItem(itemid,GetUnitX(u),GetUnitY(u))
        if GetItemTypeId(ite) != inventitem and IsItemRegistered(GetItemTypeId(ite)) and IsClassEnabled(GetItemType(ite)) then
            call AddItem(ite, dat)
        endif
        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))
        
        set t = CreateTrigger()
        call TriggerAddAction(t,function onEsc)
    
        loop
            exitwhen i == 12
            //! runtextmacro KEY("LEFT")
            //! runtextmacro KEY("RIGHT")
            //! runtextmacro KEY("UP")
            //! runtextmacro KEY("DOWN")
            call TriggerRegisterPlayerEvent(t,Player(i),EVENT_PLAYER_END_CINEMATIC)
            set x[i] = 3
            set y[i] = 2
            set typebool[i] = true
            set i = i + 1
        endloop
        call InitItems()
        call InitEquipment()
    endfunction

endlibrary[/SIZE]

Please help me with this! I'm counting in YOU!
 
Last edited:
Level 7
Joined
Apr 1, 2010
Messages
289
well, for preventing the inventory to open while in the shop
1create a region on the shop call it "shop1"
2add a condition that checks if the unit is in region(rect) shop1, and if it is don't
run the inventory trigger
for the other request you could use the detect arrow key being pressed(make so that it only works when the inventory is open),
and if you are doing a arrow key movement system in your map as well make so that the arrow key movement system requires that players inventory to be closed.
 
Level 3
Joined
Feb 12, 2011
Messages
38
Thanks for your reply Naroqoq.
I thought the same way. And I guess i could do it in GUI. However it is in jass and i dont understand a word of it...
It seems quite complicated.

Right now I consider using another one. But still thanks!

-this thread can be closed then-
 
Last edited:
Status
Not open for further replies.
Top