Trouble with inventory trigger

JediPope

New Member
Reaction score
0
I am having trouble creating this trigger that allows for an extended inventory system. For a reason I do not understand it will not remove the item when I press the inventory switch button (a Hero skill).

This function requires the global variables udg_Item_Hash (hashtable), udg_Item_Real1, udg_Item_Real2 (for another trigger, which is disabled for testing this trigger), the unique hero 'H000', and a custom channel spell ('A000') for the switch inventory. At the moment this is for a single player map. I am wondering if it is leaking somehow or if I corrupted the file again.

Code:
function Trig_Inventory1_Conditions takes nothing returns boolean
    if ( GetSpellAbilityId() != 'A000' ) then
        return false
    endif
    if ( GetUnitTypeId(GetSpellAbilityUnit()) != 'H000' ) then
        return false
    endif
    if ( GetOwningPlayer(GetSpellAbilityUnit()) != Player(0) )  then
        return false
    endif
    return true
endfunction
 
function Inventory1_Actions takes nothing returns nothing
    local integer i = 6
    set udg_Item_Real2 = 0.00   
    if ( udg_Item_Real1 == 0.00 ) then
        loop
            exitwhen i == 0
                  if ( UnitItemInSlot( GetSpellAbilityUnit(), i) == null ) then
                      call RemoveSavedHandle(udg_Item_Hash, 1, i)
                  else
                      if ( LoadItemHandle( udg_Item_Hash, 1, i) != UnitItemInSlot( GetSpellAbilityUnit(), i) ) then
                        call SaveItemHandle( udg_Item_Hash, 1, i, (UnitItemInSlot( GetSpellAbilityUnit() , i)))
                        call UnitRemoveItemFromSlot( GetSpellAbilityUnit(), i )
                        call SetItemLifeBJ( GetLastRemovedItem(), 0.00 )
                      else
                        call UnitRemoveItemFromSlot( GetSpellAbilityUnit(), i )
                        call SetItemLifeBJ( GetLastRemovedItem(), 0.00 )
                      endif
                  endif
            set i = i - 1
        endloop
        set i = 6
        loop
            exitwhen i == 0
            call UnitAddItem( GetTriggerUnit(), LoadItemHandle( udg_Item_Hash, 1, (i+6)))
            set i = i - 1
        endloop
        call LeaderboardSetLabel( udg_Action, "Summon Inventory" )
    else
        set i = 6
        loop
            exitwhen i == 0
            if ( UnitItemInSlot( GetSpellAbilityUnit(), i) == null ) then
                call RemoveSavedHandle(udg_Item_Hash, 1, (i + 6))
            else
                if ( LoadItemHandle( udg_Item_Hash, 1, (i + 6)) != UnitItemInSlot( GetSpellAbilityUnit(), i) ) then
                    call SaveItemHandle( udg_Item_Hash, 1, (i + 6), (UnitItemInSlot( GetSpellAbilityUnit() , i)))
                    call UnitRemoveItemFromSlot( GetSpellAbilityUnit(), i )
                    call SetItemLifeBJ( GetLastRemovedItem(), 0.00 )
                else
                    call UnitRemoveItemFromSlot( GetSpellAbilityUnit(), i )
                    call SetItemLifeBJ( GetLastRemovedItem(), 0.00 )
                endif
            endif
            set i = i - 1
        endloop
        set i = 6
        loop
            exitwhen i == 0
            call UnitAddItem( GetSpellAbilityUnit(), LoadItemHandle( udg_Item_Hash, 1, i))
            call SetItemCharges( UnitItemInSlot( GetSpellAbilityUnit(), i), GetItemCharges(LoadItemHandle( udg_Item_Hash, 1, i)) )
            set i = i - 1
        endloop
        call LeaderboardSetLabel( udg_Action, "Item Inventory" )
    endif
    if ( udg_Item_Real1 == 1.00 ) then
        set udg_Item_Real1 = 0.00
    else
        set udg_Item_Real1 = 1.00
    endif
    set udg_Item_Real2 = 1.00
endfunction
 
//===========================================================================
function InitTrig_Inventory1 takes nothing returns nothing
    set gg_trg_Inventory1 = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Inventory1, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_Inventory1, Condition( function Trig_Inventory1_Conditions ) )
    call TriggerAddAction( gg_trg_Inventory1, function Inventory1_Actions )
endfunction
 

Imp Midna

Active Member
Reaction score
52
ot:
1: State machines usually use integer values for their state. why do you use a float?
2: why dont you set the item charges in the first loop?
btt:
3: UnitItemInSlot uses indexes from 0 - 5. I dont know its behaviour if you hand over an invalid number, and i asume you see no effect if you got an item in your first spot only either.
4: rather safe the item id and the remaining changes then the item handle itself as it might dissappear just like a dead unit (just a guess).
 

JediPope

New Member
Reaction score
0
#3 might solve my problem, I have to test it out now.
I'm still using some GUI, so i need floats for game event before i convert it all to Jass. I only set the charges in the Item inventory since the other inventory isn't going to use charged items. There's a second (in GUI) trigger that I had disabled while testing the trigger that would put the right type of item in the right inventory. Thank you.
 

JediPope

New Member
Reaction score
0
I altered the "UnitItemInSlot" fucntion with an offset to stay within the index range, though it still bugged, so I also altered "UnitRemoveItemFromSlot" function for an index of 0 -5 and now it seems to work. Do any of the other functions require an index of 0-5, it might save me some time.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top