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

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

Закрытая тема
 
Xipxop
Круче варика, только c++!
offline
Опыт: 7,646
Активность:
Как упростить скилл или как сделать его "одекватным"
Делаю один скилл, который превращает касующего, в случайную боевую еденицу udg_SantaRandDecor[GetRandomInt(1,13)].

Делая, этот спелл, и проверяя его, он нормально, работал, но в мультиплеере, он дает сбои...

» раскрыть
Код:
function Trig_AvatarDecorCast_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A02C'
endfunction

function Trig_AvatarDecorCast_Actions takes nothing returns nothing
    local unit u
    local unit u2=GetSpellAbilityUnit()
    local real x
    local real y
    
    set u=CreateUnit(GetOwningPlayer(u2), udg_SantaRandDecor[GetRandomInt(1,13)], GetUnitX(u2), GetUnitY(u2), 10.)
    call ShowUnitHide(u2)
    call UnitApplyTimedLifeBJ(6.40, 'BTLF', u)
    call SelectUnitForPlayerSingle(u, GetOwningPlayer(u2))
    call PolledWait(1.0)
    if IsUnitDeadBJ(u) then
        call KillUnit(u2)
        return
    endif
    call PolledWait(1.0)
    if IsUnitDeadBJ(u) then
        call KillUnit(u2)
        return
    endif
    call PolledWait(1.0)
    if IsUnitDeadBJ(u) then
        call KillUnit(u2)
        return
    endif
    call PolledWait(1.0)
    if IsUnitDeadBJ(u) then
        call KillUnit(u2)
        return
    endif
    call PolledWait(1.0)
    if IsUnitDeadBJ(u) then
        call KillUnit(u2)
        return
    endif
    call PolledWait(0.5)
    set x=GetUnitX(u)
    set y=GetUnitY(u)
    call RemoveUnit(u)
    call ShowUnitShow(u2)
    call ShowUnitShow(u2)
    call SetUnitX(u2, x)
    call SetUnitY(u2, y)
    call SelectUnitForPlayerSingle(u2, GetOwningPlayer(u2))
    
    set u2=null
    set u=null
endfunction

//===========================================================================
function InitTrig_AvatarDecorCast takes nothing returns nothing
    set gg_trg_AvatarDecorCast = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_AvatarDecorCast, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_AvatarDecorCast, Condition( function Trig_AvatarDecorCast_Conditions ) )
    call TriggerAddAction( gg_trg_AvatarDecorCast, function Trig_AvatarDecorCast_Actions )
endfunction


Опишу коротко действие скила:
Создать, боевую еденицу, в том же месте где и кастер.
Скрыть кастера.
Сделать боевой еденице, время жизни 6.4 секунды.
Дальше всевремя проверять, жив ли новый юнит или нет.
Потом, запомнить коорды, нового юнита.
Удалить нового юнита.
Показать старого юнита.
Выбрать старого юнита, для игрока.

Как этот скилл, сделать более правильным? Ну тоесть чтобы он правильно работал в мультиплеере.
Да, и думаю, что проблема заключается, в построянной, проверке жив ли он... (как её оптимизировать?)
Старый 21.08.2012, 16:18
adic3x

offline
Опыт: 108,439
Активность:
Ладно создам, я новый, триггер, в котором буду пихать событие, Unit u умирает.
Человек, умеет писать, правильно, ставя, запятые, везде, где, надо, учитесь неучи.
Морф актуально делать через абилки морфа, в том числе и хаос, последнее - лучше для смены типа юнита по многим причинам.
Старый 21.08.2012, 20:09
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Вообще от использования хеша+таймера руки не отсохнут,поэтому стоит его освоить по этой статье
Ну а вот примерный код,правда при смерти юнита кастер появится на его месте с теми хп которые у него были
function Trig_AvatarDecorCast_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A02C'
endfunction

function AvatarDecorCast_timer takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer id=GetHandleId(t)
local unit caster=LoadUnitHandle(udg_Hash,id,0)
local unit u=LoadUnitHandle(udg_Hash,id,1)
local real time=LoadReal(udg_Hash,id,2)-0.05
local real x=GetUnitX(u)
local real y=GetUnitY(u)
local real angle=GetUnitFacing(u)

if GetWidgetLife(u)<0.405 or time<=0. then
    call KillUnit(u)
    call DestroyTimer(t)
    call FlushChildHashtable(udg_Hash,id)
    call ShowUnit(u,false)
    call SetUnitX(caster,x)
    call SetUnitY(caster,y)
    call SetUnitFacing(caster,angle)
    call PauseUnit(caster,false)
    call ShowUnit(caster,true)
    call SetUnitPathing(caster,true)
    call SetUnitInvulnerable(caster,false)
else
    call SaveReal(udg_Hash,id,2,time)
endif

set caster=null
set u=null
set t=null
endfunction

function Trig_AvatarDecorCast_Actions takes nothing returns nothing
    local unit caster=GetTriggerUnit()
    local timer t=CreateTimer()
    local integer id=GetHandleId(t)
    local unit u
    
    call PauseUnit(caster,true)
    call ShowUnit(caster,false)
    call SetUnitPathing(caster,false)
    call SetUnitInvulnerable(caster,true)     
    set u=CreateUnit(GetOwningPlayer(caster), udg_SantaRandDecor[GetRandomInt(1,13)], GetUnitX(caster), GetUnitY(caster), GetUnitFacing(caster))
    if (GetLocalPlayer() == GetTriggerPlayer()) then
        call ClearSelection()
        call SelectUnit(u, true)
    endif
    call SaveUnitHandle(udg_Hash,id,0,caster)
    call SaveUnitHandle(udg_Hash,id,1,u)
    call SaveReal(udg_Hash,id,2,6.4)
    call TimerStart(t,0.05,true,function AvatarDecorCast_timer)
    
    set caster=null
    set t=null
    set u=null
    
endfunction

//===========================================================================
function InitTrig_AvatarDecorCast takes nothing returns nothing
    set gg_trg_AvatarDecorCast = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_AvatarDecorCast, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_AvatarDecorCast, Condition( function Trig_AvatarDecorCast_Conditions ) )
    call TriggerAddAction( gg_trg_AvatarDecorCast, function Trig_AvatarDecorCast_Actions )
endfunction

Отредактировано Nerevar, 25.08.2012 в 15:17.
Старый 25.08.2012, 14:10
Xipxop
Круче варика, только c++!
offline
Опыт: 7,646
Активность:
Спасибо.
Теперь, точно тему офф
Старый 25.08.2012, 17:53
Закрытая тема

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

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

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

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



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