Dirac
22710180
- Reaction score
- 147
JASS:
library DamageType /* v1.0.1
*/uses/*
*/ Damage /* thehelper.net/forums/showthread.php/168144-Damage-Struct
A useful tool for creating custom damage types.
***********************************************************************
*
* function UnitDamageTargetEx takes unit source, unit target, real amount,
* integer damageType, boolean considerArmor returns nothing
* - Deals custom type damage, will fire functions registered to
* - it.
*
***********************************************************************
*
* struct DamageType
*
* - Creates custom damage types that are evaluated only when
* - dealt through the UnitDamageTargetEx function.
*
* static method create takes nothing returns DamageType
* - Creates a new damage type.
* method register takes code func returns triggercondition
* - Registers the function to the damage type.
* method unregister takes triggercondition whichCondition returns nothing
* - Unregisters the function from the damage type.
*
***********************************************************************
This needs to be a textmacro in order to keep the encapsulation correct
and private within the Damage library. Consider this textmacro private.
**********************************************************************/
//! textmacro DAMAGE_TYPE_EX1
globals
private trigger array DamageTypeTrig
private integer DamageTypeEvent = 0
endglobals
//*********************************************************************
// This function will make damage dealt pass through the custom damage
// type's filter.
function UnitDamageTargetEx takes unit source, unit target, real amount, integer damageType, boolean considerArmor returns nothing
local integer prevType=DamageTypeEvent
set DamageTypeEvent=damageType
if considerArmor then
call UnitDamageTarget(source,target,amount,true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_NORMAL,null)
else
call UnitDamageTarget(source,target,amount,true,false,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_UNIVERSAL,null)
endif
set DamageTypeEvent=prevType
endfunction
struct DamageType extends array
private static thistype size = 0
//*********************************************************************
// Only the corresponding trigger created for the damage type will be
// evaluated once the damage is dealt.
static method create takes nothing returns thistype
set size=size+1
set DamageTypeTrig[size]=CreateTrigger()
return size
endmethod
method register takes code func returns triggercondition
return TriggerAddCondition(DamageTypeTrig[this],Filter(func))
endmethod
method unregister takes triggercondition whichCondition returns nothing
call TriggerRemoveCondition(DamageTypeTrig[this],whichCondition)
endmethod
endstruct
//! endtextmacro
//! textmacro DAMAGE_TYPE_EX2
//*********************************************************************
// Fires the trigger using the custom damage type as an array index.
call TriggerEvaluate(DamageTypeTrig[DamageTypeEvent])
//! endtextmacro
endlibrary