• 🏆 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!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

Damage Detection System by Anachron

Update: Version 1.01 is out!

Fixed:
  • Dummyfilter
  • Added RemoveUnitX function
  • Heroes do not longer unregister after death

Notes to fixes:

Dummyfilter

Dummys will not longer trigger the system. Useful and removes cache.


RemoveUnitX

Know you can remove a unit and trigger the system first.
If you do NOT use this function
to remove the units you leak a trigger.


Hero Register Death = off

Heroes will now stay in system even after death.

KNOWN BUGS IN 1.01 (Which I fix today:)
while dealing damage with critical strike it can also deal again
damage with critical strike (loop).

I fix this later.



JASS:
//######################################################################################################
//#
//#
//#                                         § Damage Detection System §
//#                                         by dhk_undead_lord aka Anachron
//#
//#                                         Introduction
//#
//# -> What is system thought for?
//#     - Well this system is thought to register when an unit is damaged.
//# -> What can I do with this system?
//#     - You can easily modify the way the unit take damage, deal damage, etc.
//#
//#
//#                                       How does it work?
//#     - At mapstart, the function RegisterAllStartUnits will be called, and runs 
//#       the register function for each unit on map.
//#       
//#       The function RegisterUnit will create a new temporary trigger, which
//#       detects when the unit takes damage. Additionally I've added the units death.
//#       I'll now explain why.
//#
//#       The function UnregisterUnit will remove all triggers from the unit in the 
//#       system at once.
//#
//#       
//#
//#       Function TakeDmg
//#       This function includes all actions for each unit in the system.
//#       When one of the registered units are attacked, those actions will be
//#       runned instantly while getting damaged. Each time.
//#       The Variables:
//#
//#        local unit source = GetEventDamageSource()
//#      This will store the source of the damage.
//#
//#            local unit target = GetTriggerUnit()
//#      This will store the damaged unit
//#
//#            local real damage = GetEventDamage()
//#      This will store the damage being dealt
//#
//#            local real life = GetUnitState(target,UNIT_STATE_LIFE) 
//#      This will store the current life of the target
//#
//#            local real rem_life = life - damage
//#      This will store the life after taking damage
//#
//#            local trigger t
//#      This will story the current trigger in a variable, I'll explain soon why
//#
//#            local boolean destroy = false
//#      This will store a boolean if we need to destroy this trigger.
//#
//#
//#       if source == target and damage == 0.00 then
//#           set destroy = true
//#       endif
//#       This firstly checks if we have used the Unregister function, by dealing 0
//#       damage to the unit itself.
//#
//#    if damage >= 0.00 then
//#        call float(GetUnitX(target),GetUnitY(target),I2S(R2I(damage)))
//#            if 0.405 > rem_life then
//#               set destroy = true
//#            endif
//#    else
//#            if life <= 0.405 then
//#                set destroy = true
//#            endif
//#    endif
//#
//#    This checks if the damage is higher or equal to 0. If so, the unit took damage.
//#    (Why not bigger then? Because an illusion does 0 damage, not less, not more)
//#    
//#    If the damage is higher or equal to 0 we know that the event MUST be that the 
//#    target unit is damaged (remember, we have 2 events, one : Unit is damaged, second
//#    = Unit dies). But if damage is not equal to 0, we know that the unit is not dead 
//#    yet.
//#
//#    With calling the float function we will create the damage text.
//#
//#    After that, we check if the lifes of the unit are less then 0,405. If so, we can destroy 
//#    The current trigger, because the unit is dead after getting the damage. Remember that 
//#    You can save the boolean if you want to kill the trigger or not. 
//#
//#    Else, if the damage is less then 0, the unit might got healed. But it can also be that
//#    the unit died, through the event unit dies. So we check again the current life of the unit
//#
//#    if destroy == true then
//#       //call DisplayTextToForce(GetPlayersAll(),"A " + GetUnitName(target) + " died, trigger 
//#         has been destroyed")
//#       set t = GetTriggeringTrigger()
//#       call DestroyTrigger(t)  
//#    endif
//#
//#    This function will be only runned if the target unit is death after all the actions.
//#    It will get the triggering trigger (because every unit has its own trigger) and destroy it
//#    instantly.
//#
//#                                            Hints, using of the DD_Damage function
//#
//#    I've also added a small Damage function, which is named DD_Damage.
//#    You call it with using call DD_Damage(caster,target,real,heal?).
//#    If you chosen heal = true, the value will be inverted. Please do NOT modify it yet,
//#    because I will advance my system with that soon.
//#
//#    To register a unit, simply use RegisterUnit(unit)
//#
//#    To remove an unit from game, please use the RemoveUnitX(unit)
//#    function. That function will kill each trigger which has been created for damage detection
//#    to the target unit.
//#
//#                                           The CRITICAL STRIKE ability
//#    Well, I've decided to intigrate the triggered critical strike, its basic but ok.
//#    It'll first check if the unit does an attack, if yes, we'll check the attack spells
//#
//#    if anim == "attack" or anim == "smart" then
//#        call AttackFunctions(target,source,damage)
//#    endif
//#
//#    I think the AttackFunctions are self explaining.
//#
//#
//#
//#
//#
//#                    Please give credits to dhk_undead_lord (Anachron)
//#                         Thanks for reading
//#
//#
//#
//######################################################################################################
    library DDSystemFuns
    
    function DD_Damage takes unit caster, widget target, real amount, boolean heal returns nothing
    if heal == true then
        set amount = 0 - amount
    endif
    
    call UnitDamageTarget(caster,target,amount,false,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
    endfunction
    
    endlibrary

scope DDSystem initializer Init

    globals
        integer dummy = '0000'
    endglobals
    
    private function Conditions takes nothing returns boolean
        return GetUnitTypeId(GetTriggerUnit()) != dummy
    endfunction

    private function float takes real x, real y, string s returns nothing
    local texttag t = CreateTextTag()
    
    local real speed = 45.00
    local real angle = 90.00
    local real vel = TextTagSpeed2Velocity(speed)
    local real xvel = vel * Cos(angle * bj_DEGTORAD)
    local real yvel = vel * Sin(angle * bj_DEGTORAD)
    
    call SetTextTagPermanent(t,false)
    call SetTextTagAge(t,0.00)
    call SetTextTagColor(t,95,255,50,100)
    call SetTextTagFadepoint(t,0.00)
    call SetTextTagLifespan(t,2.00)
    call SetTextTagText(t,s,10.0 * 0.023 / 10)
    call SetTextTagPos(t,x,y,90.00)
    call SetTextTagVelocity(t, xvel, yvel)
    
    set t = null
    
    endfunction
        
    private function AttackFunctions takes unit u, unit s, real dmg returns nothing
    local integer spells_critical_chance = 0
    local real spells_critical_dmg = 0.00
    
    if u != s then
        if GetUnitAbilityLevel(s,'A000') != 0 then
            set spells_critical_chance = GetRandomInt(1,100)
                if spells_critical_chance <= 15 then
                        set spells_critical_dmg = GetUnitAbilityLevel(s,'A000') * dmg
                        call SetUnitAnimation(s,"Attack slam")
                        call UnitDamageTarget(s,u,spells_critical_dmg,false,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
                endif
        endif
    endif
    
    endfunction
    
    private function TakeDmg takes nothing returns nothing
    local unit source = GetEventDamageSource()
    local unit target = GetTriggerUnit()
    local real damage = GetEventDamage()
    local real life = GetUnitState(target,UNIT_STATE_LIFE) 
    local real rem_life = life - damage
    local trigger t
    local string anim = OrderId2String(GetUnitCurrentOrder(source))
    local boolean destroy = false
    
    // Check for unit doing spells
    if anim == "attack" or anim == "smart" then
        call AttackFunctions(target,source,damage)
    endif
    
    if damage > 0 then
        call float(GetUnitX(target),GetUnitY(target),I2S(R2I(damage)))
            if 1 > rem_life then
                set destroy = true
            endif
    else
            if life <= 0.405 then
                set destroy = true
            endif
    endif
    
    // Now lets check if the unregister action has been used
    if source == target and damage == 0.00 then
        set destroy = true
    endif
    
    
    if destroy == true then
                //call DisplayTextToForce(GetPlayersAll(),"A " + GetUnitName(target) + " has been unregistered")
                set t = GetTriggeringTrigger()
                call DestroyTrigger(t)  
    endif
    
    set anim = null
    set t = null
    set source = null
    set target = null
    endfunction
    
    function RegisterUnit takes unit u returns nothing
    local trigger t =  CreateTrigger()
    
     //call DisplayTextToForce(GetPlayersAll(),"A Trigger has been created for the "+ GetUnitName(u))
    
     call TriggerRegisterUnitEvent( t, u, EVENT_UNIT_DAMAGED ) 
        if IsUnitType(u,UNIT_TYPE_HERO) == false then
            call TriggerRegisterUnitEvent( t, u, EVENT_UNIT_DEATH ) 
        endif
     call TriggerAddAction(t, function TakeDmg )
     
     set u = null
     set t = null
    endfunction
    
    function UnregisterUnit takes unit u returns nothing
        call UnitDamageTarget(u,u,0.00,false,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
    endfunction
    
    function RemoveUnitX takes unit u returns nothing
        call UnregisterUnit(u)
        call RemoveUnit(u)
    endfunction
    
    private function Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    
    call RegisterUnit(u)
    
    set u = null
    endfunction
    
    private function GroupRegistration takes nothing returns nothing
    local unit u = GetEnumUnit()
    
    call RegisterUnit(u)
    
    set u = null
    endfunction
    
    private function RegisterAllStartUnits takes nothing returns nothing
    local group g= GetUnitsInRectAll(GetPlayableMapRect())
    
    call ForGroupBJ(g,  function GroupRegistration)
    
    call DestroyGroup(g)
    endfunction


//===========================================================================
    private function Init takes nothing returns nothing
            local trigger DDSystemTrg = CreateTrigger()
            local trigger DDSystemStartTrg = CreateTrigger()
            local region rectRegion = CreateRegion()
            
            call RegionAddRect(rectRegion, GetWorldBounds())
            
            call TriggerAddAction(DDSystemTrg, function Actions )
            call TriggerAddCondition(DDSystemTrg,Condition(function Conditions))
            call TriggerRegisterEnterRegion(DDSystemTrg, rectRegion, null)
            
            call TriggerAddAction(DDSystemStartTrg, function RegisterAllStartUnits )
            call TriggerRegisterTimerEventSingle( DDSystemStartTrg, 0.01 )
            
        set DDSystemTrg = null
        set DDSystemStartTrg = null
        set rectRegion = null
    endfunction

endscope

JASS:
//######################################################################################################
//#
//#
//#                                         § Damage Detection System §
//#                                         by dhk_undead_lord aka Anachron
//#
//#                                         Introduction
//#
//# -> What is system thought for?
//#     - Well this system is thought to register when an unit is damaged.
//# -> What can I do with this system?
//#     - You can easily modify the way the unit take damage, deal damage, //#        etc.
//#
//#
//#                                       How does it work?
//#     - At mapstart, the function RegisterAllStartUnits will be called, and //#        runs the register function for each unit on map.
//#       
//#       The function RegisterUnit will create a new temporary trigger, which
//#       detects when the unit takes damage. Additionally I've added the 
//#       units death. I'll now explain why.
//#
//#       The function UnregisterUnit will remove all triggers from the unit in  
//#        the system at once.
//#
//#       
//#
//#       Function TakeDmg
//#       This function includes all actions for each unit in the system.
//#       When one of the registered units are attacked, those actions will be
//#       runned instantly while getting damaged. Each time.
//#       The Variables:
//#
//#        local unit source = GetEventDamageSource()
//#      This will store the source of the damage.
//#
//#            local unit target = GetTriggerUnit()
//#      This will store the damaged unit
//#
//#            local real damage = GetEventDamage()
//#      This will store the damage being dealt
//#
//#            local real life = GetUnitState(target,UNIT_STATE_LIFE) 
//#      This will store the current life of the target
//#
//#            local real rem_life = life - damage
//#      This will store the life after taking damage
//#
//#            local trigger t
//#      This will story the current trigger in a variable, I'll explain soon why
//#
//#            local boolean destroy = false
//#      This will store a boolean if we need to destroy this trigger.
//#
//#
//#       if source == target and damage == 0.00 then
//#           set destroy = true
//#       endif
//#       This firstly checks if we have used the Unregister function, by 
//#       dealing 0 damage to the unit itself.
//#
//#    if damage >= 0.00 then
//#        call float(GetUnitX(target),GetUnitY(target),I2S(R2I(damage)))
//#            if 0.405 > rem_life then
//#               set destroy = true
//#            endif
//#    else
//#            if life <= 0.405 then
//#                set destroy = true
//#            endif
//#    endif
//#
//#    This checks if the damage is higher or equal to 0. If so, the unit took 
//#    damage.(Why not bigger then? Because an illusion does 0 damage, not 
//#    less, not more) 
//#    If the damage is higher or equal to 0 we know that the event MUST
//#    be that thetarget unit is damaged (remember, we have 2 events, one : 
//#   Unit is damaged, second = Unit dies). But if damage is not equal to 0, 
//#   we know that the unit is not dead 
//#    yet.
//#
//#    With calling the float function we will create the damage text.
//#
//#    After that, we check if the lifes of the unit are less then 0,405. If so, 
//#    we can destroy the current trigger, because the unit is dead after 
//#    getting the damage. Remember thatYou can save the boolean if you 
//#    want to kill the trigger or not. 
//#
//#    Else, if the damage is less then 0, the unit might got healed. But it can 
//#   also be that the unit died, through the event unit dies. So we check again the current life of the unit
//#
//#    if destroy == true then
//#       //call DisplayTextToForce(GetPlayersAll(),"A " + GetUnitName(target) + " died, trigger 
//#         has been destroyed")
//#       set t = GetTriggeringTrigger()
//#       call DestroyTrigger(t)  
//#    endif
//#
//#    This function will be only runned if the target unit is death after all the actions.
//#    It will get the triggering trigger (because every unit has its own trigger) and destroy it
//#    instantly.
//#
//#                                            Hints, using of the DD_Damage function
//#
//#    I've also added a small Damage function, which is named DD_Damage.
//#    You call it with using call DD_Damage(caster,target,real,heal?).
//#    If you chosen heal = true, the value will be inverted. Please do NOT modify it yet,
//#    because I will advance my system with that soon.
//#
//#    To register a unit, simply use RegisterUnit(unit)
//#
//#    To remove an unit from game, please unregister it first using the UnregisterUnit(unit) 
//#    function. That function will kill each trigger which has been created for damage detection
//#    to the target unit.
//#
//#                                           The CRITICAL STRIKE ability
//#    Well, I've decided to intigrate the triggered critical strike, its basic but ok.
//#    It'll first check if the unit does an attack, if yes, we'll check the attack spells
//#
//#    if anim == "attack" or anim == "smart" then
//#        call AttackFunctions(target,source,damage)
//#    endif
//#
//#    I think the AttackFunctions are self explaining.
//#
//#
//#
//#
//#
//#                    Please give credits to dhk_undead_lord (Anachron)
//#                         Thanks for reading
//#
//#
//#
//######################################################################################################
    library DDSystemFuns
    
    function DD_Damage takes unit caster, widget target, real amount, boolean heal returns nothing
    if heal == true then
        set amount = 0 - amount
    endif
    
    call UnitDamageTarget(caster,target,amount,false,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
    endfunction
    
    endlibrary

scope DDSystem initializer Init

    private function float takes real x, real y, string s returns nothing
    local texttag t = CreateTextTag()
    
    local real speed = 45.00
    local real angle = 90.00
    local real vel = TextTagSpeed2Velocity(speed)
    local real xvel = vel * Cos(angle * bj_DEGTORAD)
    local real yvel = vel * Sin(angle * bj_DEGTORAD)
    
    call SetTextTagPermanent(t,false)
    call SetTextTagAge(t,0.00)
    call SetTextTagColor(t,95,255,50,100)
    call SetTextTagFadepoint(t,0.00)
    call SetTextTagLifespan(t,2.00)
    call SetTextTagText(t,s,10.0 * 0.023 / 10)
    call SetTextTagPos(t,x,y,90.00)
    call SetTextTagVelocity(t, xvel, yvel)
    
    set t = null
    
    endfunction
        
    private function AttackFunctions takes unit u, unit s, real dmg returns nothing
    local integer spells_critical_chance = 0
    local real spells_critical_dmg = 0.00
    
    if u != s then
        if GetUnitAbilityLevel(s,'A000') != 0 then
            set spells_critical_chance = GetRandomInt(1,100)
                if spells_critical_chance <= 15 then
                        set spells_critical_dmg = GetUnitAbilityLevel(s,'A000') * dmg
                        call SetUnitAnimation(s,"Attack slam")
                        call UnitDamageTarget(s,u,spells_critical_dmg,false,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
                endif
        endif
    endif
    
    endfunction
    
    private function TakeDmg takes nothing returns nothing
    local unit source = GetEventDamageSource()
    local unit target = GetTriggerUnit()
    local real damage = GetEventDamage()
    local real life = GetUnitState(target,UNIT_STATE_LIFE) 
    local real rem_life = life - damage
    local trigger t
    local string anim = OrderId2String(GetUnitCurrentOrder(source))
    local boolean destroy = false
    
    // Check for unit doing spells
    if anim == "attack" or anim == "smart" then
        call AttackFunctions(target,source,damage)
    endif
    
    if damage > 0 then
        call float(GetUnitX(target),GetUnitY(target),I2S(R2I(damage)))
            if 1 > rem_life then
                set destroy = true
            endif
    else
            if life <= 0.405 then
                set destroy = true
            endif
    endif
    
    // Now lets check if the unregister action has been used
    if source == target and damage == 0.00 then
        set destroy = true
    endif
    
    
    if destroy == true then
                //call DisplayTextToForce(GetPlayersAll(),"A " + GetUnitName(target) + " has been unregistered")
                set t = GetTriggeringTrigger()
                call DestroyTrigger(t)  
    endif
    
    set anim = null
    set t = null
    set source = null
    set target = null
    endfunction
    
    function RegisterUnit takes unit u returns nothing
    local trigger t =  CreateTrigger()
    local effect e
    local real x = GetUnitX(u)
    local real y = GetUnitY(u)
    
     //call DisplayTextToForce(GetPlayersAll(),"A Trigger has been created for the "+ GetUnitName(u))
    
     call TriggerRegisterUnitEvent( t, u, EVENT_UNIT_DAMAGED ) 
     call TriggerRegisterUnitEvent( t, u, EVENT_UNIT_DEATH ) 
     call TriggerAddAction(t, function TakeDmg )
     
     set e = AddSpecialEffect("Abilities\\Spells\\Human\\Resurrect\\ResurrectTarget.mdl",x,y)
     call DestroyEffect(e)
     
     set e = null
     set u = null
     set t = null
    endfunction
    
    function UnregisterUnit takes unit u returns nothing
        call UnitDamageTarget(u,u,0.00,false,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
    endfunction
    
    private function Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    
    call RegisterUnit(u)
    
    set u = null
    endfunction
    
    private function GroupRegistration takes nothing returns nothing
    local unit u = GetEnumUnit()
    
    call RegisterUnit(u)
    
    set u = null
    endfunction
    
    private function RegisterAllStartUnits takes nothing returns nothing
    local group g= GetUnitsInRectAll(GetPlayableMapRect())
    
    call ForGroupBJ(g,  function GroupRegistration)
    
    call DestroyGroup(g)
    endfunction


//===========================================================================
    private function Init takes nothing returns nothing
            local trigger DDSystemTrg = CreateTrigger()
            local trigger DDSystemStartTrg = CreateTrigger()
            local region rectRegion = CreateRegion()
            
            call RegionAddRect(rectRegion, GetWorldBounds())
            
            call TriggerAddAction(DDSystemTrg, function Actions )
            call TriggerRegisterEnterRegion(DDSystemTrg, rectRegion, null)
            
            call TriggerAddAction(DDSystemStartTrg, function RegisterAllStartUnits )
            call TriggerRegisterTimerEventSingle( DDSystemStartTrg, 0.01 )
            
        set DDSystemTrg = null
        set DDSystemStartTrg = null
        set rectRegion = null
    endfunction

endscope
I'll attach the example map as soon as I can.
 
Last edited:
Level 14
Joined
Nov 18, 2007
Messages
816
Okay, im getting sick of these kind of systems. There are HUNDREDS of similar systems out there. Except that they are far more stable, far more optimized and far better coded.

- This uses DestroyTrigger()
- This is inside a scope when it should be inside a library
- This uses one trigger per unit.
- This has hardcoded values in it that should be easily changeable.

I suggest you trash this one. There are better systems already out there. Why do you need another (inferior) one?
 
Level 14
Joined
Jan 15, 2007
Messages
349
Your system is ok and will work for sure, but it need optimation.

These things could be optimized:
- add a configurable filter for the function RegisterAllStartUnits
- add constants so that the users can decide if they want this register all units at the start
- maybe you add also add a unregister action per event, the event leave region should work for that (but this option should be also configurable, if it should be active or not)
- there's no need to add to the boolean a ==true in your conditions for example in the function DD_Damage you could just write "if heal then"
- in the function RegisterAllStartUnits you forgot to nullify the local group g
- how Deaod already said the system should be more configurable with no hardcoded values
- the RegisterAllStartUnits trigger could be destroyed directly after the his execution
- Replace the ForGroupBJ

That's all for now, if you optimized your system contact me please.
 
Last edited:
Level 14
Joined
Nov 20, 2005
Messages
1,156
Okay, im getting sick of these kind of systems. There are HUNDREDS of similar systems out there. Except that they are far more stable, far more optimized and far better coded.

- This uses DestroyTrigger()
- This is inside a scope when it should be inside a library
- This uses one trigger per unit.
- This has hardcoded values in it that should be easily changeable.

I suggest you trash this one. There are better systems already out there. Why do you need another (inferior) one?

QFT. Really, people, don't use this if you want to avoid crashes and doesn't suck.

We already have enough DD systems, this doesn't add anything.
 
QFT. Really, people, don't use this if you want to avoid crashes and doesn't suck.

We already have enough DD systems, this doesn't add anything.

Well basicly it doesn't add anything, but its made from scratch by me and I don't use any other scripts, except mine. And I thought I can post it here so everybody can get ideas out of it.
 
Ideas on how NOT to code, maybe. Your coding is far too shit to be used as exemplars.

Who do you think you are? I am not coding bad, maybe not good
enough for the really awesome guys, but I think that there is no reason
for saying things like that, because I did spend time in that.
 
Level 14
Joined
Nov 20, 2005
Messages
1,156
Who do you think you are? I am not coding bad, maybe not good
enough for the really awesome guys, but I think that there is no reason
for saying things like that, because I did spend time in that.

I think I'm Captain Griffen. One of the three respected Jassers that are active on the Hive at all (at least in the Jass sections). The other two are Deaod and Pooty...both of whom have also panned you. Go figure.

As for why you ARE coding bad, let me quote it again:

Okay, im getting sick of these kind of systems. There are HUNDREDS of similar systems out there. Except that they are far more stable, far more optimized and far better coded.

- This uses DestroyTrigger()
- This is inside a scope when it should be inside a library
- This uses one trigger per unit.
- This has hardcoded values in it that should be easily changeable.

I suggest you trash this one. There are better systems already out there. Why do you need another (inferior) one?
 
Level 40
Joined
Dec 14, 2005
Messages
10,532
Why is your config a separate library anyhow?

--

As has been said before, we have more than enough damage detection systems out there, and they tend to be better done. The main redeeming feature I can think of is that you didn't follow the trend of giving a lame acronym to your system (not that it influences the code quality or anything).
 
I think I'm Captain Griffen. One of the three respected Jassers that are active on the Hive at all (at least in the Jass sections). The other two are Deaod and Pooty...both of whom have also panned you. Go figure.

As for why you ARE coding bad, let me quote it again:

I don't care about YOUR opinion, but I do respect on purple and deeod.
Why? Because they respect me! ...

Well, I know that this system is currently not better as the others, but I'm sure its somehow giving jassers another point of view how to do things.

I am not saying my system is great at all, but it just does what it's done for.
 
Level 14
Joined
Nov 20, 2005
Messages
1,156
I don't care about YOUR opinion, but I do respect on purple and deeod.
Why? Because they respect me! ...

Well, I know that this system is currently not better as the others, but I'm sure its somehow giving jassers another point of view how to do things.

I am not saying my system is great at all, but it just does what it's done for.

So your system is DESIGNED to cause handle stack corruption, causing the entire map's Jass code to implode?

Right...
 

LeP

LeP

Level 13
Joined
Feb 13, 2008
Messages
539
Griffen is hard but speaks the truth.
I mean, what do you get when everybody just ignore your systems bads to not *hurt* you? Nothing.
You would never know what's the right way to do it.
 
So your system is DESIGNED to cause handle stack corruption, causing the entire map's Jass code to implode?

Right...

I did understood this, what I didn't understand is why you need to push so much conceit in your sentences just because you are maybe one of the best jassers here that I don't want to read your posts to the end.

I hope you understand what I am trying to say.
 
The fact is you're not arguing anything, you're just asserting. You need to learn to discuss before we can have a discussion.

I asserty that my system is useful somehow because indeed every system is useful. And if I would start a discussion with you about the system, you should become normal before. You are maybe better than me, but that doesn't allow you to talk in a that bad way.
 
Level 14
Joined
Nov 20, 2005
Messages
1,156
I asserty that my system is useful somehow because indeed every system is useful. And if I would start a discussion with you about the system, you should become normal before. You are maybe better than me, but that doesn't allow you to talk in a that bad way.

Any system that's liable to cause the map to crash and all Jass code to get fucked up is not what I define as 'useful'.
 
Level 8
Joined
Aug 6, 2008
Messages
451
Handle stack corruption. Go find the threads on WC3C; we did all the hard work (read: literally scores of hours of debugging), you could at least do the leg work to read up on it...

It was a great work. And so was RefreshGroup and all those cool scripts and systems in Wc3Campaigns Database. Not to mention NewGen and vJass.

I mean, where would we be without Wc3Campaigns and the harsh critique offered by its members ?
 
Level 5
Joined
Dec 20, 2008
Messages
67
Sorry, but i dont see any sense in this system being submitted ...

There are far better systems out there ...and IF people want to learn something they maybe should start directly with looking at the best code possible ...

There is no sense in looking at code, which may contain errors, first...

I think its actually nice to code his own damagedetection-system, projectile-sys, knockback-sys ...and so on ...for the sake of learning ..

But those systems should not be submitted unless you are sure its pretty much perfect ... Of course you can post such a system in another thread first and ask for suggestions (well... maybe WC3C is a better place to do this, since WC3C has more advanced Jassers than THW).
 
Top