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

[JASS] Adding an item to a unit crashes the game.

Status
Not open for further replies.
Level 5
Joined
Jan 18, 2012
Messages
92
I just started fiddling around with the World Editor again and after getting used to putting 'call' keyword before functions again I ran into this problem. The function UnitAddItem works normally but in the code below it crashes the game. I don't have a clue as to why it is doing that as the pickup isn't null by the time it gets to the line where I'm calling the function. It still points to the item it should, but it crashes the game for some reason.

The code:



JASS:
function manageItems takes nothing returns nothing
    local integer i = 0
    local integer j = 0
    local boolean willTake = true
    local unit triggerer = GetTriggerUnit()
    local item pickup = GetManipulatedItem()
    
    call UnitRemoveItemSwapped(pickup, triggerer)
    set pickup = bj_lastRemovedItem
    
    if GetItemType(pickup) == ITEM_TYPE_ARTIFACT then
        loop
            if GetItemType(UnitItemInSlot(triggerer, i)) == ITEM_TYPE_ARTIFACT then
                call DisplayTextToPlayer(GetOwningPlayer(triggerer), 0.0, 0.0, GetUnitName(triggerer) + " can only carry one weapon.")
                set willTake = false
            endif
            
            set i = i + 1
            exitwhen i >= bj_MAX_INVENTORY
        endloop
    elseif GetItemType(pickup) == ITEM_TYPE_CAMPAIGN then
        loop
            if GetItemType(UnitItemInSlot(triggerer, i)) == ITEM_TYPE_CAMPAIGN then
                call DisplayTextToPlayer(GetOwningPlayer(triggerer), 0.0, 0.0, GetUnitName(triggerer) + " can only carry one shield.")
                set willTake = false
            endif
            
            set i = i + 1
            exitwhen i >= bj_MAX_INVENTORY
        endloop
    endif
    
    if willTake == true then
        call UnitAddItem(triggerer, pickup)
    endif
    
    set pickup = null
    set triggerer = null
endfunction

//===========================================================================
function InitTrig_Item_Managment takes nothing returns nothing
    local trigger itemManagment = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( itemManagment, EVENT_PLAYER_UNIT_PICKUP_ITEM )
    call TriggerAddAction( itemManagment, function manageItems )
endfunction

I've also attached the map file so you can test it yourselves.

Thanks in advance.
 

Attachments

  • TheMap.w3x
    1.6 MB · Views: 48
Level 5
Joined
Jan 18, 2012
Messages
92
Thanks a LOT Maker! Never thought about it that way.

Anyway, here's mine(now working) implementation if anyone wishes to use it:

JASS:
function manageItems takes nothing returns nothing
    local integer i = 0
    local unit triggerer = GetTriggerUnit()
    local item pickup = GetOrderTargetItem()
    if pickup != null then
        call BJDebugMsg(GetUnitName(triggerer) + " wants to pick up a " + GetItemName(pickup))
        
        if GetItemType(pickup) == ITEM_TYPE_ARTIFACT then
            loop
                if GetItemType(UnitItemInSlot(triggerer, i)) == ITEM_TYPE_ARTIFACT then
                    call DisplayTextToPlayer(GetOwningPlayer(triggerer), 0.0, 0.0, GetUnitName(triggerer) + " can only carry one weapon.")
                    call IssuePointOrder(triggerer, "move", GetUnitX(triggerer), GetUnitY(triggerer))
                endif
                
                set i = i + 1
                exitwhen i >= bj_MAX_INVENTORY
            endloop
        elseif GetItemType(pickup) == ITEM_TYPE_CAMPAIGN then
            loop
                if GetItemType(UnitItemInSlot(triggerer, i)) == ITEM_TYPE_CAMPAIGN then
                    call DisplayTextToPlayer(GetOwningPlayer(triggerer), 0.0, 0.0, GetUnitName(triggerer) + " can only carry one shield.")
                    call IssuePointOrder(triggerer, "move", GetUnitX(triggerer), GetUnitY(triggerer))
                endif
                    
                set i = i + 1
                exitwhen i >= bj_MAX_INVENTORY
            endloop
        endif
    endif
    
    set pickup = null
    set triggerer = null
endfunction
 
Status
Not open for further replies.
Top