System Damage

Discussion in 'Systems and Snippets' started by Jesus4Lyf, Jul 6, 2009.

  1. Jesus4Lyf

    Jesus4Lyf Good Idea™

    Ratings:
    +394 / 0 / -0
    You can write a wrapper function.
    JASS:
    function Damage_BlockPercent takes real percent returns nothing
        call Damage_Block(GetEventDamage()*percent)
    endfunction

    Best approach, doesn't touch the library. I believe it will inline, too. :)
     
  2. muzk

    muzk Member

    Ratings:
    +3 / 0 / -0
  3. Jesus4Lyf

    Jesus4Lyf Good Idea™

    Ratings:
    +394 / 0 / -0
    ... Well spotted! o_O
    You insane, brilliant mind. lol :p
     
  4. muzk

    muzk Member

    Ratings:
    +3 / 0 / -0
    :D

    JASS:
    
        function UnitDamageTargetEx takes unit whichUnit, widget target, real amount, boolean attack, boolean ranged, attacktype attackType, damagetype damageType, weapontype weaponType returns boolean
            local boolean result
            set TypeStackLevel=TypeStackLevel+1
            set TypeStackValue[TypeStackLevel]=damageType
            set TypeStackAttack[TypeStackLevel]=attack
            set result=UnitDamageTarget(whichUnit,target,amount,attack,ranged,attackType,damageType,weaponType)
            set TypeStackLevel=TypeStackLevel-1
            return result
        endfunction


    I don't understand it. Why arrays and not just non-array globals?
     
  5. Bribe

    Bribe vJass errors are legion

    Ratings:
    +67 / 0 / -0
    Because of recursion. Although it would be more efficient (and more intuitive) if he did something like this:

    JASS:
    function UnitDamageTargetEx takes unit whichUnit, widget target, real amount, boolean attack, boolean ranged, attacktype attackType, damagetype damageType, weapontype weaponType returns boolean
        local boolean result
        local damagetype dt = DamageType
        local integer ia = IsAttack
        set IsAttack = attack
        set DamageType = damageType
        set result = UnitDamageTarget(whichUnit, target, amount, attack, ranged, attackType, damageType, weaponType)
        set DamageType = dt
        set IsAttack = ia
        set dt = null
        return result
    endfunction
     
  6. Jesus4Lyf

    Jesus4Lyf Good Idea™

    Ratings:
    +394 / 0 / -0
    Yep, recursion.
    What makes you think that is either more efficient or more intuitive..?

    This way it would be trivial to refer to damage that damage is in response to, if I liked..
     
  7. muzk

    muzk Member

    Ratings:
    +3 / 0 / -0
    I don't get it yet ... :( I can't see the recursion there D:
     
  8. Jesus4Lyf

    Jesus4Lyf Good Idea™

    Ratings:
    +394 / 0 / -0
    Think: What happens if a unit returns 50% of damage taken? UnitDamageTargetEx will fire again before it finishes firing... :p
     
    • Like Like x 1
  9. Bribe

    Bribe vJass errors are legion

    Ratings:
    +67 / 0 / -0
    It is not much more efficient, according to my FPS tests, what is going to matter is repeat-referencing because you are returning a scalar via GetEventDamageType instead of an array lookup, for example. It saves creation of globals and global arrays as well. It's probably easier to code it your way but it's definitely lighter on the processor by hashing it into some locals.
     
  10. muzk

    muzk Member

    Ratings:
    +3 / 0 / -0
    Finally... thx!
     
  11. Jesus4Lyf

    Jesus4Lyf Good Idea™

    Ratings:
    +394 / 0 / -0
    FPS tests... lol, back in my day it was benchmarks or don't say anything.

    If you care about that sort of efficiency, you should only have one trigger firing off Damage, and then fork through a tree structure to only fire the correct event responses based on what type of damage, if it's an attack, etc. Isn't this is the most efficient way to support that, since GetEventDamageType would only ever be called once each time?

    And if you don't care about that sort of efficiency, good on you, you might even complete a map! :D
     
  12. Bribe

    Bribe vJass errors are legion

    Ratings:
    +67 / 0 / -0
    RtC benchmarks don't work any more, so now it's pretty much FPS tests or don't say anything.
     
  13. codart

    codart New Member

    Ratings:
    +0 / 0 / -0
    Can i use this system with Abuff from Anitarf. Can't make myself use buff struct, it's fail _ _!
     
  14. kStiyl

    kStiyl New Member

    Ratings:
    +0 / 0 / -0
    I'm having a strange bug with this system

    If I add some kind of ability (ex. slow aura-based debuff) on the damage event, Damage_Block seems to bug (it won't block any damage)

    I've tested it on your demo map by just switching your demo code with this library below.

    After making an attempt to debug this, I found that adding an ability triggers the event.
    I do not understand why this would bug the system though; isn't it supposed to be recursive?

    I fixed this bug temporarily by adding GetEventDamage() > 0 on 'onDamageActions' in damage library

    JASS:
    library Test initializer onInit requires Damage
            
        private function onHit takes nothing returns boolean
        	call Damage_BlockAll()
            call UnitAddAbility(GetTriggerUnit(), 'Aasl')
            call UnitRemoveAbility(GetTriggerUnit(), 'Aasl')
            call UnitRemoveAbility(GetTriggerUnit(), 'Basl')
            return false
        endfunction
            
        private function onInit takes nothing returns nothing
            local trigger trg = CreateTrigger()
            call Damage_RegisterEvent(trg)
            call TriggerAddCondition(trg, Condition(function onHit))
            set trg = null
        endfunction
    
    endlibrary


    Would appreciate it if you give me a solution. I'm having a huge problem because this is continuously interfering with my debuff system =( (poison, stun etc.)
     
  15. Mr_Bean355

    Mr_Bean355 Member

    Ratings:
    +9 / 0 / -0
    The example code in the demo map doesn't work for me. Anyone else have this issue?
     
  16. BlackRose

    BlackRose Forum User

    Ratings:
    +239 / 0 / -0
    It works fine. What part of it 'doesn't work'?
     
  17. Mr_Bean355

    Mr_Bean355 Member

    Ratings:
    +9 / 0 / -0
    The test scope. I think it is meant to block all damage in the demo map, but when I test it, nothing happens. Unit receive damage as normal. I re-downloadede the demo map and tested it without changing anything - still didn't help.
     
  18. BlackRose

    BlackRose Forum User

    Ratings:
    +239 / 0 / -0
    Indeed it is meant to block all damage in the demo map. Strange how nothing happens upon testing. It should work without any editing. Place debug messages in the function to see if the code is actually running.
     
  19. Mr_Bean355

    Mr_Bean355 Member

    Ratings:
    +9 / 0 / -0
    JASS:
    scope NoDamageOnMap initializer StartZeroDamage
    private function BlockAllDamage takes nothing returns boolean
    call BJDebugMsg("Damaged!")
    call Damage_BlockAll()
    return false
    endfunction
     
    private function StartZeroDamage takes nothing returns nothing
    local trigger t=CreateTrigger()
    call TriggerAddCondition(t,Condition(function BlockAllDamage))
    call Damage_RegisterEvent(t)
    endfunction
    endscope


    Nothing displays :eek:

    EDIT: Turns out the issue was the JASSHelper version I have. The latest one (by Cohadar) compiles the map in a strange order, meaning Damage won't work for pre-placed units. After down-grading to an earlier version of JASSHelper, it works fine.
     
  20. Grundy

    Grundy Ultra Cool Member

    Ratings:
    +35 / 0 / -0
    So does this system discard "damagetype"s like DAMAGE_TYPE_ACID, DAMAGE_TYPE_COLD, DAMAGE_TYPE_DEATH, DAMAGE_TYPE_DEFENSIVE, etc... and instead uses only 3 damage types, physical, magical, and pure?
     

Share This Page