DT2S, AT2S,WT2S конвертеры типа урона, атаки и оружия в строку
gg_unit_Hvsh_0001 это юнит вайши. Я проверяю работоспособность событий на ней со включенным мана щитом. Снижение урона во время damaging тратит меньше маны у щита, чем damaged.
В приведенном ниже коде (назовем его так)
при наличии в событиях
set trig = CreateTrigger() работает только damaging,
при отсутствии обе функции, на которые ссылается триггер (UnitWasDamaging/UnitWasDamaged) работают от события damaged (или мне так кажется).
Итак вопрос: что надо сделать, чтобы все помирить, т.е. чтобы UnitWasDamaging был от события Damaging, а UnitWasDamaged от Damaged, или какое другое решение?
function DT2S takes damagetype damagetype returns string
    local string sdt = null
    if damagetype == DAMAGE_TYPE_UNKNOWN then
        set sdt = "DAMAGE_TYPE_UNKNOWN"
    elseif damagetype == DAMAGE_TYPE_NORMAL then
        set sdt = "DAMAGE_TYPE_NORMAL"
    elseif damagetype == DAMAGE_TYPE_ENHANCED then
        set sdt = "DAMAGE_TYPE_ENHANCED"
    elseif damagetype == DAMAGE_TYPE_FIRE then
        set sdt = "DAMAGE_TYPE_FIRE"
    elseif damagetype == DAMAGE_TYPE_COLD then
        set sdt = "DAMAGE_TYPE_COLD"
    elseif damagetype == DAMAGE_TYPE_LIGHTNING then
        set sdt = "DAMAGE_TYPE_LIGHTNING"
    elseif damagetype == DAMAGE_TYPE_POISON then
        set sdt = "DAMAGE_TYPE_POISON"
    elseif damagetype == DAMAGE_TYPE_DISEASE then
        set sdt = "DAMAGE_TYPE_DISEASE"
    elseif damagetype == DAMAGE_TYPE_DIVINE then
        set sdt = "DAMAGE_TYPE_DIVINE"
    elseif damagetype == DAMAGE_TYPE_MAGIC then
        set sdt = "DAMAGE_TYPE_MAGIC"
    elseif damagetype == DAMAGE_TYPE_SONIC then
        set sdt = "DAMAGE_TYPE_SONIC"
    elseif damagetype == DAMAGE_TYPE_ACID then
        set sdt = "DAMAGE_TYPE_ACID"
    elseif damagetype == DAMAGE_TYPE_FORCE then
        set sdt = "DAMAGE_TYPE_FORCE"
    elseif damagetype == DAMAGE_TYPE_DEATH then
        set sdt = "DAMAGE_TYPE_DEATH"
    elseif damagetype == DAMAGE_TYPE_MIND then
        set sdt = "DAMAGE_TYPE_MIND"
    elseif damagetype == DAMAGE_TYPE_PLANT then
        set sdt = "DAMAGE_TYPE_PLANT"
    elseif damagetype == DAMAGE_TYPE_DEFENSIVE then
        set sdt = "DAMAGE_TYPE_DEFENSIVE"
    elseif damagetype == DAMAGE_TYPE_DEMOLITION then
        set sdt = "DAMAGE_TYPE_DEMOLITION"
    elseif damagetype == DAMAGE_TYPE_SLOW_POISON then
        set sdt = "DAMAGE_TYPE_SLOW_POISON"
    elseif damagetype == DAMAGE_TYPE_SPIRIT_LINK then
        set sdt = "DAMAGE_TYPE_SPIRIT_LINK"
    elseif damagetype == DAMAGE_TYPE_SHADOW_STRIKE then
        set sdt = "DAMAGE_TYPE_SHADOW_STRIKE"
    elseif damagetype == DAMAGE_TYPE_UNIVERSAL then
        set sdt = "DAMAGE_TYPE_UNIVERSAL"
    endif
    return sdt
endfunction

function AT2S takes attacktype attacktype returns string
    local string sat = null
    if attacktype == ATTACK_TYPE_NORMAL then
        set sat = "ATTACK_TYPE_NORMAL"
    elseif attacktype == ATTACK_TYPE_HERO then
        set sat = "ATTACK_TYPE_HERO"
    elseif attacktype == ATTACK_TYPE_MELEE then
        set sat = "ATTACK_TYPE_MELEE"
    elseif attacktype == ATTACK_TYPE_PIERCE then
        set sat = "ATTACK_TYPE_PIERCE"
    elseif attacktype == ATTACK_TYPE_MAGIC then
        set sat = "ATTACK_TYPE_MAGIC"
    elseif attacktype == ATTACK_TYPE_CHAOS then
        set sat = "ATTACK_TYPE_CHAOS"
    elseif attacktype == ATTACK_TYPE_SIEGE then
        set sat = "ATTACK_TYPE_SIEGE"
    endif
    return sat
endfunction

function WT2S takes weapontype weapontype returns string
    local string swt = null
    if weapontype == WEAPON_TYPE_WHOKNOWS then
        set swt = "WEAPON_TYPE_WHOKNOWS"
    elseif weapontype == WEAPON_TYPE_METAL_LIGHT_CHOP then
        set swt = "WEAPON_TYPE_METAL_LIGHT_CHOP"
    elseif weapontype == WEAPON_TYPE_METAL_MEDIUM_CHOP then
        set swt = "WEAPON_TYPE_METAL_MEDIUM_CHOP"
    elseif weapontype == WEAPON_TYPE_METAL_HEAVY_CHOP then
        set swt = "WEAPON_TYPE_METAL_HEAVY_CHOP"
    elseif weapontype == WEAPON_TYPE_METAL_LIGHT_SLICE then
        set swt = "WEAPON_TYPE_METAL_LIGHT_SLICE"
    elseif weapontype == WEAPON_TYPE_METAL_MEDIUM_SLICE then
        set swt = "WEAPON_TYPE_METAL_MEDIUM_SLICE"
    elseif weapontype == WEAPON_TYPE_METAL_HEAVY_SLICE then
        set swt = "WEAPON_TYPE_METAL_HEAVY_SLICE"
    elseif weapontype == WEAPON_TYPE_METAL_MEDIUM_BASH then
        set swt = "WEAPON_TYPE_METAL_MEDIUM_BASH"
    elseif weapontype == WEAPON_TYPE_METAL_HEAVY_BASH then
        set swt = "WEAPON_TYPE_METAL_HEAVY_BASH"
    elseif weapontype == WEAPON_TYPE_METAL_MEDIUM_STAB then
        set swt = "WEAPON_TYPE_METAL_MEDIUM_STAB"
    elseif weapontype == WEAPON_TYPE_METAL_HEAVY_STAB then
        set swt = "WEAPON_TYPE_METAL_HEAVY_STAB"
    elseif weapontype == WEAPON_TYPE_WOOD_LIGHT_SLICE then
        set swt = "WEAPON_TYPE_WOOD_LIGHT_SLICE"
    elseif weapontype == WEAPON_TYPE_WOOD_MEDIUM_SLICE then
        set swt = "WEAPON_TYPE_WOOD_MEDIUM_SLICE"
    elseif weapontype == WEAPON_TYPE_WOOD_HEAVY_SLICE then
        set swt = "WEAPON_TYPE_WOOD_HEAVY_SLICE"
    elseif weapontype == WEAPON_TYPE_WOOD_LIGHT_BASH then
        set swt = "WEAPON_TYPE_WOOD_LIGHT_BASH"
    elseif weapontype == WEAPON_TYPE_WOOD_MEDIUM_BASH then
        set swt = "WEAPON_TYPE_WOOD_MEDIUM_BASH"
    elseif weapontype == WEAPON_TYPE_WOOD_HEAVY_BASH then
        set swt = "WEAPON_TYPE_WOOD_HEAVY_BASH"
    elseif weapontype == WEAPON_TYPE_WOOD_LIGHT_STAB then
        set swt = "WEAPON_TYPE_WOOD_LIGHT_STAB"
    elseif weapontype == WEAPON_TYPE_WOOD_MEDIUM_STAB then
        set swt = "WEAPON_TYPE_WOOD_MEDIUM_STAB"
    elseif weapontype == WEAPON_TYPE_CLAW_LIGHT_SLICE then
        set swt = "WEAPON_TYPE_CLAW_LIGHT_SLICE"
    elseif weapontype == WEAPON_TYPE_CLAW_MEDIUM_SLICE then
        set swt = "WEAPON_TYPE_CLAW_MEDIUM_SLICE"
    elseif weapontype == WEAPON_TYPE_CLAW_HEAVY_SLICE then
        set swt = "WEAPON_TYPE_CLAW_HEAVY_SLICE"
    elseif weapontype == WEAPON_TYPE_AXE_MEDIUM_CHOP then
        set swt = "WEAPON_TYPE_AXE_MEDIUM_CHOP"
    elseif weapontype == WEAPON_TYPE_ROCK_HEAVY_BASH then
        set swt = "WEAPON_TYPE_ROCK_HEAVY_BASH"
    endif
    return swt
endfunction

function UnitWasDamaging takes nothing returns nothing
    local unit t = GetTriggerUnit()
    local unit s = GetEventDamageSource()
    if t == gg_unit_Hvsh_0001 then
        call BlzSetEventDamage( ( GetEventDamage() * 0.50 ) )
        set udg_damaging = GetEventDamage()
        call DisplayTimedTextToForce( GetPlayersAll(), 10.00, "1")
    endif
    set t = null
    set s = null
    set udg_damaging = GetEventDamage()
endfunction

function UnitWasDamaged takes nothing returns nothing
    local unit t = GetTriggerUnit()
    local unit s = GetEventDamageSource()
    local string sdt = DT2S(BlzGetEventDamageType())
    local string sat = AT2S(BlzGetEventAttackType())
    local string swt = WT2S(BlzGetEventWeaponType())
    local real dmgd = GetEventDamage()
    local real dmgng = udg_damaging
    if (t != gg_unit_Hvsh_0001) then
        call BlzSetEventDamage( ( dmgd * 0.50 ) )
        set dmgd = GetEventDamage()
        call DisplayTimedTextToForce( GetPlayersAll(), 10.00, "2")
    endif
    call DisplayTimedTextToForce( GetPlayersAll(), 10.00, ("======================================="))
    call DisplayTimedTextToForce( GetPlayersAll(), 10.00, ("source " + udg_color[GetConvertedPlayerId(GetOwningPlayer(s))] + GetUnitName(s)+"|r" + " attack " + udg_color[GetConvertedPlayerId(GetOwningPlayer(t))] + GetUnitName(t)+"|r"))
    call DisplayTimedTextToForce( GetPlayersAll(), 10.00, ("damaged " + R2S(dmgd) + " / damaging" + R2S(dmgng)))
    call DisplayTimedTextToForce( GetPlayersAll(), 10.00, ("damagetype " + sdt))
    call DisplayTimedTextToForce( GetPlayersAll(), 10.00, ("attacktype " + sat))
    call DisplayTimedTextToForce( GetPlayersAll(), 10.00, ("weapontype " + swt))
    call DisplayTimedTextToForce( GetPlayersAll(), 10.00, ("======================================="))
    set sdt = null
    set sat = null
    set swt = null
    set dmgd = 0
    set dmgng = 0
    set t = null
    set s = null
endfunction

function damage_func_con takes nothing returns boolean
    if GetEventDamage() > 0.00 then
        return true
    endif
    return false
endfunction

//===========================================================================
function InitTrig_damage takes nothing returns nothing
    local trigger trig = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(trig, EVENT_PLAYER_UNIT_DAMAGING)
    call TriggerAddAction(trig, function UnitWasDamaging)
    call TriggerAddCondition( trig, Condition(function damage_func_con))
    set trig = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(trig, EVENT_PLAYER_UNIT_DAMAGED)
    call TriggerAddAction(trig, function UnitWasDamaged)
    call TriggerAddCondition( trig, Condition(function damage_func_con))
endfunction

На самом деле никакой проблемы нет с этим вариантом, просто я ставил у другого юнита щит маны(100% резист) по умолчанию, и он не пробивал его событием EVENT_PLAYER_UNIT_DAMAGED, поэтому и не показывал.
`
ОЖИДАНИЕ РЕКЛАМЫ...
5
На самом деле никакой проблемы нет с этим вариантом, просто я ставил у другого юнита щит маны(100% резист) по умолчанию, и он не пробивал его событием EVENT_PLAYER_UNIT_DAMAGED, поэтому и не показывал.
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.