Как создать над головой юнита плавающий текст, чтобы он следовал за ним до самой смерти, при условии что таких юнитов несколько с разными текстами. Может есть какие наработки?
И ещё один вопрос, можно ли очистить экран от всех плавающих текстов, на моей карте есть триггер SDMS, отображающий урон, но иногда он не удаляет текст (видимо когда урон наносится одновременно)....
код триггера SDMS
function SDMSCreateTextTag takes nothing returns nothing
    local unit u=GetTriggerUnit()
    local unit s=GetEventDamageSource()
    local location l
    local location l2
    local player pl=GetOwningPlayer(u)
    local player pl2=GetOwningPlayer(s)
    local integer i=GetConvertedPlayerId(pl)
    local texttag tt=null
    local real fontSize=10.0
    local real lifeTime=1.0
    local real lifeTime2=2.0
    local real dmg=GetEventDamage()
    local string minus="-"
    local string plus=""
    local string textColor=SDMSTextVars(i-1)
    local boolean b
    
    if ( pl2 == Player(PLAYER_NEUTRAL_AGGRESSIVE) and udg_Players > 1) then
        set dmg = dmg + dmg*(udg_Players-1)*0.25
        if ( GetUnitStateSwap(UNIT_STATE_LIFE, u) <= dmg*(udg_Players-1)*0.25 ) then
            call SetUnitLifeBJ( u, 1.00 )
        else
            call SetUnitLifeBJ( u, ( GetUnitStateSwap(UNIT_STATE_LIFE, u) - ( dmg*(udg_Players-1)*0.25 ) ) )
        endif
    endif
    if ( dmg > 1.00 ) and ( dmg < 9999.00 ) then
        call CreateTextTagUnitBJ(textColor+minus+I2S(R2I(dmg))+plus+"|r",u,0,fontSize,100.0,100.0,100.0,0.0)
    endif
    //эффекты брызг крови
    if (  dmg >= ( GetUnitStateSwap(UNIT_STATE_MAX_LIFE, u) * 1.0 )) then
        call DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Human\\HumanLargeDeathExplode\\HumanLargeDeathExplode.mdl", u, "chest"))
    else
        if (  dmg >= ( GetUnitStateSwap(UNIT_STATE_MAX_LIFE, u) * 0.33 )) then
            call DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Human\\HumanBlood\\BloodElfSpellThiefBlood.mdl", u, "chest"))
        else
            if (  dmg >= ( GetUnitStateSwap(UNIT_STATE_MAX_LIFE, u) * 0.2 )) then
                call DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Critters\\Albatross\\CritterBloodAlbatross.mdl", u, "chest"))
            endif
        endif
    endif
    //Отлов урона
    if GetUnitTypeId(s) == 'u026' then //Прорубающая Атака мастера меча
        set s = gg_unit_Nbbc_0091
        if ( GetUnitAbilityLevelSwapped('A06B', s) > 0 ) then
            if ( GetRandomInt(1, 100) <= udg_Hero_Might_Chance[GetConvertedPlayerId(GetOwningPlayer(s))] or udg_Rune2[GetConvertedPlayerId(GetOwningPlayer(s))] == 1 ) then
                if ( GetRandomInt(1, 100) <= 3 + GetUnitAbilityLevelSwapped('A06B', s) ) then
                    call DummyCastUnit( GetOwningPlayer(s), l, 0.5, 'A045', 1, "bloodlust", s )
                endif
            endif
            if ( GetRandomInt(1, 100) <= udg_Hero_Spirit_Chance[GetConvertedPlayerId(GetOwningPlayer(s))] or udg_Rune2[GetConvertedPlayerId(GetOwningPlayer(s))] == 2 ) then
                if ( (GetRandomInt(1, 100) <= udg_Hero_Might_Chance[GetConvertedPlayerId(GetOwningPlayer(s))] or udg_Rune1[GetConvertedPlayerId(GetOwningPlayer(s))] == 1) and GetRandomInt(1, 100) <= 35 ) then
                    call SetUnitLifeBJ( s, ( GetUnitStateSwap(UNIT_STATE_LIFE, s) + I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, s, true)) * ( 0.04 + ( 0.04 * I2R(GetUnitAbilityLevelSwapped('A06B', s)) ) ) ) )
                else
                    call SetUnitLifeBJ( s, ( GetUnitStateSwap(UNIT_STATE_LIFE, s) + I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, s, true)) * ( 0.02 + ( 0.02 * I2R(GetUnitAbilityLevelSwapped('A06B', s)) ) ) ) )
                endif
                call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\VampiricAura\\VampiricAuraTarget.mdl",  s, "chest"))
            endif
            if ( GetRandomInt(1, 100) <= udg_Hero_Grow_Chance[GetConvertedPlayerId(GetOwningPlayer(s))] or udg_Rune2[GetConvertedPlayerId(GetOwningPlayer(s))] == 3 ) then
                set l=GetUnitLoc(u)
                call DisableTrigger( GetTriggeringTrigger())
                if ( (GetRandomInt(1, 100) <= udg_Hero_Might_Chance[GetConvertedPlayerId(GetOwningPlayer(s))] or udg_Rune1[GetConvertedPlayerId(GetOwningPlayer(s))] == 1) and GetRandomInt(1, 100) <= 35 ) then
                    call PureDamageArea (s, l, 200, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, s, true)) * ( 0.2 + ( 0.2 * I2R(GetUnitAbilityLevelSwapped('A06B', s)) ) ))
                else
                    call PureDamageArea (s, l, 200, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, s, true)) * ( 0.1 + ( 0.1 * I2R(GetUnitAbilityLevelSwapped('A06B', s)) ) ))
                endif
                call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile.mdl",  u, "chest"))
                call EnableTrigger( GetTriggeringTrigger())
                call RemoveLocation(l)
            else
                call DisableTrigger( GetTriggeringTrigger())
                if ( (GetRandomInt(1, 100) <= udg_Hero_Might_Chance[GetConvertedPlayerId(GetOwningPlayer(s))] or udg_Rune1[GetConvertedPlayerId(GetOwningPlayer(s))] == 1) and GetRandomInt(1, 100) <= 35 ) then
                    call UnitDamageTargetBJ( s, u, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, s, true)) * ( 0.2 + ( 0.2 * I2R(GetUnitAbilityLevelSwapped('A06B', s)) ) ), ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL )
                else
                    call UnitDamageTargetBJ( s, u, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, s, true)) * ( 0.1 + ( 0.1 * I2R(GetUnitAbilityLevelSwapped('A06B', s)) ) ), ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL )
                endif
                call EnableTrigger( GetTriggeringTrigger())
            endif
        endif
        if ( (GetRandomInt(1, 100) <= udg_Hero_Might_Chance[GetConvertedPlayerId(GetOwningPlayer(s))] or udg_Rune1[GetConvertedPlayerId(GetOwningPlayer(s))] == 1) and GetRandomInt(1, 100) <= 35 ) then
            call DisableTrigger( GetTriggeringTrigger())
            call UnitDamageTargetBJ( s, u, 50 + ( 25 * I2R(GetUnitAbilityLevelSwapped('A0A9', s)) ), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC )
            call EnableTrigger( GetTriggeringTrigger())
        endif
        if ( GetRandomInt(1, 100) <= udg_Hero_Spirit_Chance[GetConvertedPlayerId(GetOwningPlayer(s))] or udg_Rune1[GetConvertedPlayerId(GetOwningPlayer(s))] == 2 ) then
            set l=GetUnitLoc(u)
            if ( GetRandomInt(1, 100) <= udg_Hero_Grow_Chance[GetConvertedPlayerId(GetOwningPlayer(s))] or udg_Rune2[GetConvertedPlayerId(GetOwningPlayer(s))] == 3 ) then
                call DummyCastUnit(GetOwningPlayer(s),l,0.5,'A0IK',2,"acidbomb",u)
            else
                call DummyCastUnit(GetOwningPlayer(s),l,0.5,'A0IK',1,"acidbomb",u)
            endif
            call RemoveLocation(l)
        endif
    endif
    //эффекты предметов
    if (UnitHasBuffBJ( u, 'B02S' ) == true) then
        call SetUnitLifeBJ( u, ( GetUnitStateSwap(UNIT_STATE_LIFE, u) + dmg * 2.00 ) )
    endif
    if (UnitHasBuffBJ( u, 'B01L' ) == true) then
        call SetUnitManaBJ( s, ( GetUnitStateSwap(UNIT_STATE_MANA, s) + 6.00 ) )
        call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIma\\AImaTarget.mdl", s, "overhead"))
    endif
    if (UnitHasBuffBJ( u, 'B01K' ) == true) then
        call SetUnitManaBJ( s, ( GetUnitStateSwap(UNIT_STATE_MANA, s) + 20.00 ) )
        call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIma\\AImaTarget.mdl", s, "overhead"))
    else
        if (UnitHasBuffBJ( u, 'B01E' ) == true) then
            call DisableTrigger( GetTriggeringTrigger() )
            call UnitDamageTargetBJ( s, u, I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, s, true)), ATTACK_TYPE_CHAOS, DAMAGE_TYPE_DIVINE )
            call EnableTrigger( GetTriggeringTrigger() )
        else
            if (UnitHasBuffBJ( u, 'B01G' ) == true) then
                set l=GetUnitLoc(u)
                set l2=GetUnitLoc(s)
                call DisableTrigger( GetTriggeringTrigger() )
                call UnitDamageTargetBJ( s, u, ( DistanceBetweenPoints(l2, l) * 0.20 ), ATTACK_TYPE_CHAOS, DAMAGE_TYPE_DIVINE )
                call EnableTrigger( GetTriggeringTrigger() )
                call RemoveLocation(l)
                call RemoveLocation(l2)
            endif
        endif
    endif
    if ( UnitHasItemOfTypeBJ(s, 'I02S') == true ) then
        if ( dmg > 50.00 ) then
            call SetUnitLifeBJ( s, ( GetUnitStateSwap(UNIT_STATE_LIFE, s) + 50.00 ) )
        else
            call SetUnitLifeBJ( s, ( GetUnitStateSwap(UNIT_STATE_LIFE, s) + dmg ) )
        endif
    endif
    if ((UnitHasBuffBJ( u, 'B02O' ) == true) or (UnitHasBuffBJ( u, 'B02N' ) == true)) then
        set l=GetUnitLoc(u)
        set udg_FireBlades_Target = u
        call CreateNUnitsAtLoc( 1, 'u00W', pl2, l, bj_UNIT_FACING )
        call RemoveLocation(l)
    endif
    //
    set tt=GetLastCreatedTextTag()
    call SetTextTagVelocityBJ(tt,96.0,90)
    call SetTextTagPermanentBJ(tt,false)
    call SetTextTagLifespanBJ(tt,lifeTime)
    call SetTextTagFadepointBJ(tt,0.0)
    call PolledWait(lifeTime2)

    set u=null
    set s=null
    set pl=null
    set pl2=null
    set l=null
    set l2=null
    set i=0
    set fontSize=0
    set lifeTime=0
    set lifeTime2=0
    set dmg=0
    set minus=""
    set plus=""
    set textColor=""
    call DestroyTextTagBJ(tt)

endfunction
function SDMSTriggerRegisterUnitDamaged takes nothing returns nothing
    call TriggerRegisterUnitEvent(SDMStheTrigger(),GetEnteringUnit(),EVENT_UNIT_DAMAGED)
endfunction
function SDMSGroupFunction takes nothing returns nothing
    local unit u=GetEnumUnit()

    call TriggerRegisterUnitEvent(SDMStheTrigger(),u,EVENT_UNIT_DAMAGED)

    set u=null
endfunction
function theSDMSTriggerActions takes nothing returns nothing
    local trigger UnitEnter=CreateTrigger()
    local trigger TextTagCreate=SDMStheTrigger()

    call TriggerRegisterEnterRectSimple(UnitEnter,GetPlayableMapRect())
    call TriggerAddAction(UnitEnter,function SDMSTriggerRegisterUnitDamaged)
    call ForGroupBJ(GetUnitsInRectAll(GetPlayableMapRect()),function SDMSGroupFunction)

    set UnitEnter=null
    set TextTagCreate=null
endfunction

function InitTrig_the_SDM_Ttrigger takes nothing returns nothing
    local trigger tr=CreateTrigger()

    set udg_SDMStrigger=CreateTrigger()//Тут также меняется название глобальной переменной типа триггер.
    call TriggerAddAction(SDMStheTrigger(),function SDMSCreateTextTag)
    call TriggerRegisterTimerEventSingle(tr,0.0)
    call TriggerAddAction(tr,function theSDMSTriggerActions)

    set tr=null
endfunction

Принятый ответ

но когда срабатывает одновременно в некоторых случаях текст остается, в чем причина не знаю
причина в бж функциях
избавься от бж и всё норм будет
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
25
9 лет назад
0
Fa1korn,
  1. можно, меняй позицию текстагу. Наработки есть, посмотри в наработках -_-
  2. Не удаляет, потому что надо на локалки переводить все. На гуи ты нормально такую систему не сделаешь.
0
9
9 лет назад
0
Ancient:
  1. Не удаляет, потому что надо на локалки переводить все. На гуи ты нормально такую систему не сделаешь.
локалки есть, у каждого тексттага время жизни 1 сек и через 2 секунды повторно удаляет, но когда срабатывает одновременно в некоторых случаях текст остается, в чем причина не знаю, могу скинуть сам код.
0
25
9 лет назад
0
могу скинуть сам код.
С этого нужно начинать. Местные экстрасенсы в отпуске.
0
29
9 лет назад
0
bj хотя бы убери
0
28
9 лет назад
0
но когда срабатывает одновременно в некоторых случаях текст остается, в чем причина не знаю
причина в бж функциях
избавься от бж и всё норм будет
Принятый ответ
0
9
9 лет назад
Отредактирован Fa1korn
0
nvc123:
избавься от бж и всё норм будет
Всем спасибо, теперь работает как часы.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.