Snippet GUI-Friendly Damage Detection

If all spells in your map deal damage by triggers, you can temporarily set a boolean variable to true when dealing spell damage. Therefore, if the boolean is false when a unit takes damage, it must have come from an attack.

Otherwise, if you are comfortable triggering all buff-on-attack abilities, every unit can be given a hidden buff-on-attack ability which will let you determine whether the damage came from an attack by checking whether the damaged unit has that buff.

As far as I'm aware, these are the only reliable methods for discerning attack damage apart from spell damage in WC3.

This methods arent good...
And i tried once, i set the damage of cripple to 0
But the unit get knockback which is another trigger when it is casted
 
I've been using the GDD damage detection in my spell, and referencing the GDD_DamageSource as "triggering unit" in my hashtable Key Handle. I didn't think it would work because the custom variable cannot be referenced in a Handle, but it seems to being working just fine.

Is this a bug, or was I misinformed, or what?
Well, not being able to use a variable in a hashtable seems to be a World Editor shortcoming.

It's not a bug that you can use Event Response - Triggering Unit in place of GDD_DamagedUnit (though unless you want it for a hashtable or after a wait, using the variable might be marginally faster :rolleyes:); I just haven't documented it. Also, FYI, Event Response - Damaged Unit doesn't work with GDD.
 
Updated to 1.2.1, with two user-configuration functions, minor code cleanup, and expanded documentation. Happy users of 1.2.0 don't really need to update.
 
I just have to copy + paste it in trigger editor?

that jass code box?
just it?

how to enable my locusts to DEAL damage.
 
question(s) (more learning purposes.)
JASS:
function GDD_LeaveMap takes nothing returns boolean
    local boolean cached = bj_slotControlUsed[5063]
    if(udg_GDD__Integers[2] < 64) then
        set udg_GDD__Integers[2] = udg_GDD__Integers[2]+1
    else
        set bj_slotControlUsed[5063] = true
        call ForGroup(udg_GDD__LeftMapGroup, function GDD_GroupRefresh)
        set udg_GDD__Integers[2] = 0
    endif
    call GroupAddUnit(udg_GDD__LeftMapGroup, GetFilterUnit())
    set bj_slotControlUsed[5063] = cached
    return false
endfunction


why set cached as bj_slotControlUsed instead of using bj_slotControlUsed directly, ie
JASS:

function GDD_GroupRefresh takes nothing returns nothing
    if (bj_slotControlUsed[5063] == true) then
        call GroupClear(udg_GDD__LeftMapGroup)
        set bj_slotControlUsed[5063] = false
    endif
    call GroupAddUnit(udg_GDD__LeftMapGroup, GetEnumUnit())
endfunction
// . .
function GDD_LeaveMap takes nothing returns boolean
    //local boolean cached = bj_slotControlUsed[5063]
    if(udg_GDD__Integers[2] < 64) then
        set udg_GDD__Integers[2] = udg_GDD__Integers[2]+1
    else
        set bj_slotControlUsed[5063] = true
        call ForGroup(udg_GDD__LeftMapGroup, function GDD_GroupRefresh)
        set udg_GDD__Integers[2] = 0
    endif
    call GroupAddUnit(udg_GDD__LeftMapGroup, GetFilterUnit())
    //set bj_slotControlUsed[5063] = cached  //why set it to original bj_slotControlUsed?
    return false
endfunction



ty:)
 
It's because I'm co-opting a Blizzard global array instead of having to create my own global variable (it only matters without vJASS, which gives the freedom to declare globals in the code), and because I don't know whether some other system or spell might happen to use that exact same array variable (unlikely, but you never know ;)), I make sure to save its original value and put it back when I'm done.
 
Setting a (surely empty) array's 5063rd member should allocate at least 5062 (surely empty) booleans in the game's memory from what I understand? Since arrays are consecutive in memory and blahblahblahboringtalk, my point is: you reset it anyway, so simply use the 0 index of the array. It is highly improbable that someone could use a 'variable changed value' event on this array member, so why waste these few bytes of memory creating 5k useless booleans! =D


It's a pointless optimization.. but hey, it is something!
 
Setting a (surely empty) array's 5063rd member should allocate at least 5062 (surely empty) booleans in the game's memory from what I understand?
As far as I've read other people mention, WC3 allocates the entire array when declared, so this shouldn't make any difference. [edit] I guess it does...
 
100% leakless because this allow to add the event just one time, not 14923849273984 times for the same unit
 
There is no leakless.

But as far as you're concerned (and any users of this system) you'll be fine.
 
Would this system have a problem is the damage source and damaged unit are owned by the same player?
 
Are there any conditions I can use to determine whether the damage taken by GDD_DamagedUnit is caused by a spell?
The problem is that I want certain triggers to fire only when a unit takes damage from a regular attack. I already have direct damage spells covered with

Trigger:
  • Or - Any (Conditions) are true
    • Conditions
      • (Current order of GDD_DamageSource) Equal to (Order(<Empty String>))
      • (Current order of GDD_DamageSource) Equal to (Order(smart))


but said triggers still fire when a unit takes periodic damage from Acid Bomb and similar spells.
I have this feeling that I'm overlooking something really obvious here but I just can't figure it out.
 
Are there any conditions I can use to determine whether the damage taken by GDD_DamagedUnit is caused by a spell?
The problem is that I want certain triggers to fire only when a unit takes damage from a regular attack. I already have direct damage spells covered with

Trigger:
  • Or - Any (Conditions) are true
    • Conditions
      • (Current order of GDD_DamageSource) Equal to (Order(<Empty String>))
      • (Current order of GDD_DamageSource) Equal to (Order(smart))


but said triggers still fire when a unit takes periodic damage from Acid Bomb and similar spells.
I have this feeling that I'm overlooking something really obvious here but I just can't figure it out.

I believe this System is only for detecting damage, and not damage type. You'd need to make your own damage system. For example, if you trigger all your spell-based damage, you can easily differentiate a physical attack and a spell attack.
 
I believe this System is only for detecting damage, and not damage type. You'd need to make your own damage system. For example, if you trigger all your spell-based damage, you can easily differentiate a physical attack and a spell attack.

I was thinking about that as a measure of last resort but I guess I have to.
 
General chit-chat
Help Users
  • No one is chatting at the moment.
  • The Helper The Helper:
    Happy Thursday!
    +1
  • The Helper The Helper:
    Added new Crab Bisque Soup recipe - which is badass by the way - Crab Bisque - https://www.thehelper.net/threads/soup-crab-bisque.196085/
  • The Helper The Helper:
    I feel like we need to all meet up somewhere sometime. Maybe like in Vegas :)
    +2
  • The Helper The Helper:
    Would love to go to Vegas I have never been and it would be an adventure! Who is in?
  • The Helper The Helper:
    at least the full on bot attack has stopped it was getting ridiculous there for a while and we use cloudflare and everything
  • jonas jonas:
    I'm sure my wife would not be happy if I went to Vegas, but don't let that stop you guys - would be hard for me to attend anyways
    +1
  • jonas jonas:
    Do you know why the bot attack stopped?
  • The Helper The Helper:
    maybe they finally got everything lol
  • Ghan Ghan:
    There's lots of good food in Vegas.
  • Ghan Ghan:
    Everything tends to be pretty expensive though so bring your wallet.
    +1
  • The Helper The Helper:
    I have to wait longer if I am going for food because my teeth are still messed up from the work and I still cannot eat right. Going to be a couple more months before that gets better
    +1
  • The Helper The Helper:
    I would immediately hitting the dispensary though :)
    +1
  • Varine Varine:
    My Xbox account got hijacked, and apparently I have a different one from like 10 years ago that Microsoft keeps telling me is the right one
  • Varine Varine:
    Like NO, I mean for some reason that one is attached to my email, but it's not the right one
  • Varine Varine:
    I have a different one, and that one has my credit card attached to it and I would like that credit card to not be attached to it if I can't get it back
  • Varine Varine:
    Anyway Microsoft is not very helpful with this, they just keep telling me to fill out the Account Recovery form, but that just redirects me to the other account
  • The Helper The Helper:
    They should not allow you to put a credit card on a account that does not have human customer service you can call
  • Varine Varine:
    That's the only thing that got hijacked at least. I don't totally know how these integrate together, but it seems like I should be able to do this via the gamertag. Like my email is still mine, but they changed the email to that account I'm guessing.
    +1
  • Blackveiled Blackveiled:
    I went to Vegas a few weeks ago to visit my mom. I had never been either, lol! But I'm working in Salt Lake City at the moment so it's not a far trip.
    +2
  • The Helper The Helper:
    I have never been to Vegas and it is on the bucket list so...
    +1
  • tom_mai78101 tom_mai78101:
    Recently getting addicted to Shapez.
    +1
  • Ghan Ghan:
    I've heard Shapez 2 is good.
    +1
  • Ghan Ghan:
    Also Satisfactory 1.0 released on the 10th and that has been excellent as well.
    +1
  • The Helper The Helper:
    Happy Saturday! Hope everyone has a fantastic day!

      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