Need help with item trigger

Vylatin

New Member
Reaction score
32
Hey :)

Could anyone show me how to through GUI triggers; check if unit has 2 items of artifact/powerup/miscellaneous class? My trigger below failed, probably cus the hero already got the item when it runs. Thats why I need help. Or do you got a better solution? Any help is great! +rep

Pick up
Events
Unit - A unit Acquires an item
Conditions
Or - Any (Conditions) are true
Conditions
(Item-class of (Item being manipulated)) Equal to Artifact
(Item-class of (Item being manipulated)) Equal to Powerup
(Item-class of (Item being manipulated)) Equal to Miscellaneous
Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
Or - Any (Conditions) are true
Conditions
((Triggering unit) has an item of type |cffffcc00Iron Bow|r) Equal to True
((Triggering unit) has an item of type |cffffcc00Steel Bow|r) Equal to True
Then - Actions
Hero - Drop (Item being manipulated) from (Triggering unit)
Else - Actions
 

Exide

I am amazingly focused right now!
Reaction score
448
If I understood you right, you want to prevent a unit from carrying two items of the same class? (For example only letting a hero carry one sword, one shield, one armor, etc.)

I made an old trigger once (which I quickly improved slightly just now) that prevents this:

JASS:

function Trig_Special_Items_Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local player p = GetOwningPlayer(u)
    local item newitem = GetManipulatedItem()
    local integer i = 0
    
    
    if (GetItemType(newitem) == ITEM_TYPE_ARTIFACT) then
        loop
            exitwhen loopnr >= 6
            if (GetItemType(UnitItemInSlot(u, loopnr)) == ITEM_TYPE_ARTIFACT ) and (UnitItemInSlot(u, loopnr) != newitem) then
                call DisplayTextToPlayer(p, o, o, "You are already wielding a Weapon!")
                call UnitRemoveItem(u, newitem)
            endif
            set i = i + 1
        endloop
    endif

    if (GetItemType(newitem) == ITEM_TYPE_PERMANENT) then
        loop
            exitwhen loopnr >= 6
            if (GetItemType(UnitItemInSlot(u, loopnr)) == ITEM_TYPE_ARTIFACT ) and (UnitItemInSlot(u, loopnr) != newitem) then
                call DisplayTextToPlayer(p, o, o, "You are already carrying a Shield!")
                call UnitRemoveItem(u, newitem)
            endif
            set i = i + 1
        endloop
    endif

    if (GetItemType(newitem) == ITEM_TYPE_CAMPAIGN) then
        loop
            exitwhen loopnr >= 6
            if (GetItemType(UnitItemInSlot(u, loopnr)) == ITEM_TYPE_ARTIFACT ) and (UnitItemInSlot(u, loopnr) != newitem) then
                call DisplayTextToPlayer(p, o, o, "You are already wearing an Armor!")
                call UnitRemoveItem(u, newitem)
            endif
            set i = i + 1
        endloop
    endif
    

    set newitem = null
    set p = null
    set u = null
endfunction

//===========================================================================
function InitTrig_Special_Items takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_PICKUP_ITEM)
    call TriggerAddAction(t, function Trig_Special_Items_Actions)
endfunction


Not syntax-checked.

Implement:
Create a trigger, name it Special Items, convert it to custom text, replace the text with my code.

Artifact = Weapon
Permanent = Shield
Campaign = Armor
 

Vylatin

New Member
Reaction score
32
I converted and replaced the text with your code.

But it doesn't work as I get loads of errors;

9 "expected a name" and 3 "Expected endloop"

I'm probably forgetting something?

I really apreciate ur help :)
 

Exide

I am amazingly focused right now!
Reaction score
448
No, it's my bad.
Like I said, I haven't syntax-checked it after I improved the code, so I forgot a few things.
This should work better:

JASS:

function Trig_Special_Items_Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local player p = GetOwningPlayer(u)
    local item newitem = GetManipulatedItem()
    local integer i = 0
    
    
    if (GetItemType(newitem) == ITEM_TYPE_ARTIFACT) then
        loop
            exitwhen i >= 6
            if (GetItemType(UnitItemInSlot(u, i)) == ITEM_TYPE_ARTIFACT ) and (UnitItemInSlot(u, i) != newitem) then
                call DisplayTextToPlayer(p, 0, 0, "You are already wielding a Weapon!")
                call UnitRemoveItem(u, newitem)
            endif
            set i = i + 1
        endloop
    endif

    if (GetItemType(newitem) == ITEM_TYPE_PERMANENT) then
        loop
            exitwhen i >= 6
            if (GetItemType(UnitItemInSlot(u, i)) == ITEM_TYPE_PERMANENT) and (UnitItemInSlot(u, i) != newitem) then
                call DisplayTextToPlayer(p, 0, 0, "You are already carrying a Shield!")
                call UnitRemoveItem(u, newitem)
            endif
            set i = i + 1
        endloop
    endif

    if (GetItemType(newitem) == ITEM_TYPE_CAMPAIGN) then
        loop
            exitwhen i >= 6
            if (GetItemType(UnitItemInSlot(u, i)) == ITEM_TYPE_CAMPAIGN) and (UnitItemInSlot(u, i) != newitem) then
                call DisplayTextToPlayer(p, 0, 0, "You are already wearing an Armor!")
                call UnitRemoveItem(u, newitem)
            endif
            set i = i + 1
        endloop
    endif
    

    set newitem = null
    set p = null
    set u = null
endfunction

//===========================================================================
function InitTrig_Special_Items takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_PICKUP_ITEM)
    call TriggerAddAction(t, function Trig_Special_Items_Actions)
endfunction


Tell me if you get any more errors.
 

Vylatin

New Member
Reaction score
32
From 12 errors to 3 :)

call DisplayTextToPlayer(p, o, o, "You are already wielding a Weapon!")

call DisplayTextToPlayer(p, o, o, "You are already carrying a Shield!")

call DisplayTextToPlayer(p, o, o, "You are already wearing an Armor!")

Expected a name on those lines
 

Exide

I am amazingly focused right now!
Reaction score
448
Trying to write JASS from on top of your head is a bad idea. :p

It should be:
call DisplayTextToPlayer(p, 0, 0, "You are already wielding a Weapon!")
call DisplayTextToPlayer(p, 0, 0, "You are already carrying a Shield!")
call DisplayTextToPlayer(p, 0, 0, "You are already wearing an Armor!")

-change o to 0 (zero).
My fingers must've slipped. :p
 

Vylatin

New Member
Reaction score
32
Hey, it works almost perfect.

I can carry 1 artifact item, which is perfect. If I pick up a new artifact item, it is instantly dropped.

When I pick up more than 1 campaign/permanent item nothing happens.

I don't see why :X
 
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