XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Аминь
Crazy about that shit
offline
Опыт: 3,214
Активность:
Всплывающий текст наносимого урона
Помогите отладить наработку всплывающего текста. В ней есть 2 бага.

1) Некоторые сообщения об уроне пропадают практически сразу же, а не по таймеру. Почему?
2) Если тригерно наносить урон врагу и если это первый нанесённый урон (от атакера по цели) , то он, почему-то не отображается в виде всплывающего текста. Хотя вроде как юнит получил урон... Почему тригер не срабатывает?

Код:
function Trig_For_creeps_Copy_Conditions takes nothing returns boolean
    if ( not ( IsUnitAliveBJ(GetAttackedUnitBJ()) == true ) ) then
        return false
    endif
    return true
endfunction

function Trig_For_creeps_Copy_Func003001 takes nothing returns boolean
    return ( GetEventDamage() < 1.00 )
endfunction

function Trig_For_creeps_Copy_Actions takes nothing returns nothing
    local texttag flt
    call CreateTextTagUnitBJ( I2S(R2I(GetEventDamage())), GetAttackedUnitBJ(), 0, 9.00, 100, 0.00, 0.00, 0.00 )
    set flt = GetLastCreatedTextTag()
    if ( Trig_For_creeps_Copy_Func003001() ) then
        call DestroyTextTagBJ( flt )
    else
        call DoNothing(  )
    endif
    call SetTextTagVelocityBJ( flt, 120.00, 90 )
    call SetTextTagPermanentBJ( flt, false )
    call SetTextTagLifespanBJ( flt, 3.00 )
    call SetTextTagFadepointBJ( flt, 2.00 )
    call TriggerSleepAction( 10.00 )
    set flt = null
    call DestroyTextTagBJ( flt )
endfunction

//===========================================================================
function InitTrig_For_creeps_Copy takes nothing returns nothing
    set gg_trg_For_creeps_Copy = CreateTrigger(  )
    call TriggerAddAction( gg_trg_For_creeps_Copy, function Trig_For_creeps_Copy_Actions )
    call TriggerAddCondition( gg_trg_For_creeps_Copy, Condition( function Trig_For_creeps_Copy_Conditions ) )
endfunction


Это сам код. Событие добавляется сюда другим тригером.

Alex27 добавил:
Неужели этому нет логического обьяснения...
Прикрепленные файлы
Тип файла: w3x Testmap.w3x (12.9 Кбайт, 15 просмотров )

Отредактировано Alex27, 06.03.2008 в 17:19.
Старый 06.03.2008, 17:21
Hexus
Looking for a victim
offline
Опыт: 19,166
Активность:
Почему ты сперва обнуляешь локалку, а потом уничтожаешь текст? Наоборот надо.
Старый 06.03.2008, 17:26
adic3x

offline
Опыт: 108,439
Активность:
правильней не создавать текст, а не создавать и уничтожать если юнит мертв
Старый 06.03.2008, 17:31
Аминь
Crazy about that shit
offline
Опыт: 3,214
Активность:
Цитата:
Почему ты сперва обнуляешь локалку, а потом уничтожаешь текст? Наоборот надо.

Думаю ситуацию это не исправит...
Старый 06.03.2008, 17:31
GreatLosser

offline
Опыт: 5,086
Активность:
Цитата:
2) Если тригерно наносить урон врагу и если это первый нанесённый урон (от атакера по цели) , то он, почему-то не отображается в виде всплывающего текста.

Может быть, потому что нет события?
Старый 06.03.2008, 17:31
Аминь
Crazy about that shit
offline
Опыт: 3,214
Активность:
Цитата:
Сообщение от ADOLF
правильней не создавать текст, а не создавать и уничтожать если юнит мертв

Мёртвый юинт может получить урон только тригерно, но ведь в самом тригере магии можно установить проверку жив юнит или нет... Если я тебя правильно понял.

Alex27 добавил:
Цитата:
Сообщение от GreatLosser
Может быть, потому что нет события?

Возможно ты прав...
Можно ли с помощью джаса создать событие получения урона? Ведь известно, что гуишное Unit is attacked сробатывает уже при замахе на удар т.е.можно замахнуться невыстрелив и при этом событие Unit is attacked будет считаться выполненным.
Старый 06.03.2008, 17:38
DeaDoK

offline
Опыт: 5,783
Активность:
1-е Пойми одну фишку -
GetAttacker() и GetAttackedUnitBJ() c GetEventDamage() и GetDamageSource() никак не могут быть вместе
2-е Нада применять событие юнит получает урон, А не юнит атакован.
Старый 06.03.2008, 18:40
sleepw

offline
Опыт: 8,449
Активность:
попробуй юзнуть это:
Код:
///////////////////////////////////////////////////////////////////////////////
//            Display Damage System Resource Material                        //
//            Editable - Yes, suggested                                      //
///////////////////////////////////////////////////////////////////////////////
function KDDS_GetTextSize takes nothing returns real
    return 8.0 // The text size of the floating text.
endfunction

function KDDS_GetZOffset takes nothing returns real
    return 0.0 // The z offset if the floating text.
endfunction

function KDDS_GetLifeSpan takes nothing returns real
    return 1.5 // The life span of the floating text.
endfunction

function KDDS_GetFadeTime takes nothing returns real
    return 0.0 // The fade time of the floating text.
endfunction

function KDDS_GetVelocity takes nothing returns real
    return 92.0 // The velocity of the floating text.
endfunction

function KDDS_GetVelocityAngle takes nothing returns real
    return 90.0// The velocity angle of the floating text.
endfunction


function KDDS_GetPlayerColourString takes integer i returns string
    local playercolor pc = GetPlayerColor(Player(i))
    local string s
    if pc == PLAYER_COLOR_RED then
        set s = "|cffFF0000"
    elseif pc == PLAYER_COLOR_BLUE then
        set s = "|cff0000FF"
    elseif pc == PLAYER_COLOR_CYAN then
        set s = "|cff00FFFF"
    elseif pc == PLAYER_COLOR_PURPLE then
        set s = "|cff800080"
    elseif pc == PLAYER_COLOR_YELLOW then
        set s = "|cffFFFF00" 
    elseif pc == PLAYER_COLOR_ORANGE then
        set s = "|cffFF8000"
    elseif pc == PLAYER_COLOR_GREEN then
        set s = "|cff00FF00"
    elseif pc == PLAYER_COLOR_PINK then
        set s = "|cffFF80C0"
    elseif pc == PLAYER_COLOR_LIGHT_GRAY then
        set s = "|cffC0C0C0"
    elseif pc == PLAYER_COLOR_LIGHT_BLUE then
        set s = "|cff8080FF"
    elseif pc == PLAYER_COLOR_AQUA then
        set s = "|cff008040"
    elseif pc == PLAYER_COLOR_LIGHT_BLUE then
        set s = "|cff804000"
    else
        set s = "|cff808080"
    endif
    set pc = null
    return s
endfunction 

///////////////////////////////////////////////////////////////////////////////
//            Display Damage System Code                                     //
//            Editable - No, not suggested                                   //
///////////////////////////////////////////////////////////////////////////////
    
function KDDS_Display takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local real d = GetEventDamage()
    local integer p = GetPlayerId(GetOwningPlayer(GetEventDamageSource()))
    local string c = KDDS_GetPlayerColourString(p)
    local texttag t
    call CreateTextTagUnitBJ(c+I2S(R2I(d))+"|r",u, KDDS_GetZOffset(),KDDS_GetTextSize(), 100, 100, 100, 0 )
    set t = GetLastCreatedTextTag()
    call SetTextTagPermanentBJ( t, false )
    call SetTextTagLifespanBJ( t, KDDS_GetLifeSpan() )
    call SetTextTagFadepointBJ( t, KDDS_GetFadeTime() )
    call SetTextTagVelocityBJ( t, KDDS_GetVelocity(), KDDS_GetVelocityAngle() )
    set u = null
    set d  = 0
    set p = 0
    set c = ""
    set t = null
endfunction

function KDDS_RegisterUnit takes unit u returns nothing
    call TriggerRegisterUnitEvent( gg_trg_Display_Damage_System, u, EVENT_UNIT_DAMAGED )
endfunction
    
function KDDS_SetUp takes nothing returns nothing
    local group g = CreateGroup()
    local unit u
    set g = GetUnitsInRectAll(GetPlayableMapRect())
    loop
        set u = FirstOfGroup(g)
        exitwhen u == null        
        call KDDS_RegisterUnit(u)
        call GroupRemoveUnit(g, u)
    endloop
    set g = null
endfunction

///////////////////////////////////////////////////////////////////////////////
//                    End of Display Damage System Code                      //
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//                    Trigger Code                                           //
///////////////////////////////////////////////////////////////////////////////

//===========================================================================
function InitTrig_Display_Damage_System takes nothing returns nothing
    set gg_trg_Display_Damage_System = CreateTrigger(  )
    call TriggerAddAction( gg_trg_Display_Damage_System, function KDDS_Display )
    call KDDS_SetUp()
endfunction
Старый 06.03.2008, 18:45
Аминь
Crazy about that shit
offline
Опыт: 3,214
Активность:
Может кто-нибудь исправить код так, что бы он работал верно? Очень прошу...

Alex27 добавил:
Sleepw, спасиб, буду пробовать.

Alex27 добавил:
Попробовал - код отличный, спасибо за реальную помощь =)

Вылаживаю рабочий вариант и если кому-нить понадобится такая наработка - тыкайте носом сюда.

Alex27 добавил:
Код:
function KDDS_SetUp takes nothing returns nothing
    local group g = CreateGroup()
    local unit u
    set g = GetUnitsInRectAll(GetPlayableMapRect())
    loop
        set u = FirstOfGroup(g)
        exitwhen u == null        
        call KDDS_RegisterUnit(u)
        call GroupRemoveUnit(g, u)
    endloop
    set g = null
endfunction


Относительно этого куска кода у меня 2 вопроса:
1) Что именно он делает.
2) Не вызовит ли "это" торможение карты.
Прикрепленные файлы
Тип файла: w3x Testmap.w3x (13.6 Кбайт, 13 просмотров )

Отредактировано Alex27, 06.03.2008 в 19:40.
Старый 06.03.2008, 22:27
sleepw

offline
Опыт: 8,449
Активность:
я юзал,всё было отлично)
Старый 06.03.2008, 22:36
Аминь
Crazy about that shit
offline
Опыт: 3,214
Активность:
После импорта в карту случилось что-то страшное...
До смерти героя все работает отлично, но после его воскрешения текст перестаёт отображаться. Через некоторое время может снова заработать - потом опять отключиться. Вобщем ведёт себя неадекватно, вот я и подумал может именно этот кусок кода воду мутит...
Старый 06.03.2008, 22:41
sleepw

offline
Опыт: 8,449
Активность:
ненаю мож трабл у тебя в карте..
но я его импортнул на мапу думал понадобицо и всё время с этим кодом тестил,играл.
и воскрешение было и всё такое..
вопщем траблов не замечал.
Старый 06.03.2008, 22:49
Аминь
Crazy about that shit
offline
Опыт: 3,214
Активность:
Можешь сказать для чего предназначена та часть когда о которой я писал выше?
Старый 06.03.2008, 23:11
sleepw

offline
Опыт: 8,449
Активность:
нед)
я его взял кадато давно с hiveworkshop.com,скрипт был проверен модером:)
Старый 06.03.2008, 23:14
Аминь
Crazy about that shit
offline
Опыт: 3,214
Активность:
Система отображения урона категорически отказывается работать на созданных юнитах в процессе игры, а почему, ХЗ...
Помогите кто-нить разобраться со злощастным скриптом - очень буду благодарен.
Старый 07.03.2008, 00:22
sleepw

offline
Опыт: 8,449
Активность:
попробуй сдлеать просто KDDS_SetUp периодик евентом..
Старый 07.03.2008, 00:29
Аминь
Crazy about that shit
offline
Опыт: 3,214
Активность:
Как? Тут же локалки...

Alex27 добавил:
Функция из 8ого поста заносит всех юнитов на карте в группу тогда, когда создаётся тригер т.е. те которые создаютя в процессе туда не входят. Следовательно нужно отслеживать создание новых юнитов и добавлять их в группу. Но как? Без глобалок я выхода не вижу.
Старый 07.03.2008, 01:00
DeaDoK

offline
Опыт: 5,783
Активность:
Кеш те в руки
Старый 07.03.2008, 01:05
Аминь
Crazy about that shit
offline
Опыт: 3,214
Активность:
Других предложений нет?
Старый 07.03.2008, 12:34
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Кеш и Глобалки. Всё. Ещё есть некая система XAT от тоадкопа, её не смотрел. Она вроде делает что-то подобное.
Старый 07.03.2008, 12:38
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 15:22.