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

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

Закрытая тема
 
DeaDoK

offline
Опыт: 5,783
Активность:
Ошибка в рассчётах порта
вот вообщем спелл.
Герою даётся 2 абилы. 1я создаёт юнита-базу. 2я позволяет в любое время портнуться на этого юнита.
но спелл имеет наведение как на цель-юнит так и цель-точка. Это для того что бы можно было юзать спелл как шмотовскую абилу телепорта т.е. нацелить на точку и портнуться к ближайшему юниту возле неё. вот и в коде у меня проверка (проверка цели-точки в радиусе 700):
Код:
function Shadowmove_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A02C' 
endfunction

function SHMove_Filter takes nothing returns boolean
    return GetZero(GetFilterUnit())==false and GetOwningPlayer(GetFilterUnit())==GetOwningPlayer(GetTriggerUnit()) and GetFilterUnit()!=GetTriggerUnit() and GetUnitTypeId(GetFilterUnit())=='e01B'
endfunction

function Shadowmove_Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local unit u2 = GetSpellTargetUnit()
    local unit f
    local location loc = GetSpellTargetLoc()
    local boolexpr boo = Condition(function SHMove_Filter)
    local group g = CreateGroup()
    local integer i = 1
    if u2!=null and GetUnitTypeId(u2)=='e01B' then
       call SetUnitPosition(u,GetUnitX(f),GetUnitY(f))
    else
       call IssueImmediateOrder(u,"stop")
       call SimError(GetOwningPlayer(u),"The target can be a shadowcore only")
    endif   
    if u2==null then
       call GroupEnumUnitsInRangeOfLoc(g,loc,700,boo)
       loop
       set f = FirstOfGroup(g)
       exitwhen f==null or GetZero(u) or i==0
       if f!=null and GetUnitTypeId(f)=='e01B' then
         call SetUnitPosition(u,GetUnitX(f),GetUnitY(f))
       else
         call IssueImmediateOrder(u,"stop")
         call SimError(GetOwningPlayer(u),"The target can be a shadowcore only")
       endif
       set i = i-1
       call GroupRemoveUnit(g,f)
       endloop
       call GroupClear(g)
       call DestroyGroup(g)
    endif  
endfunction

//===========================================================================
function InitTrig_Shadowmove takes nothing returns nothing
    set gg_trg_Shadowmove = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Shadowmove, EVENT_PLAYER_UNIT_SPELL_CHANNEL )
    call TriggerAddCondition( gg_trg_Shadowmove, Condition( function Shadowmove_Conditions ) )
    call TriggerAddAction( gg_trg_Shadowmove, function Shadowmove_Actions )
endfunction


но при касте порта получается парадокс:
цель-юнит - портает
цель-точка (радиус от дамми не больше 700) - пишет ерор
цель-точка (радиус больше 700) - портает но хз куда

где-то жестокая ошибка, или я туплю неимоверно?)

Отредактировано DeaDoK, 28.12.2008 в 16:15.
Старый 28.12.2008, 15:56
adic3x

offline
Опыт: 108,439
Активность:
неправильно ифы раставил имхо
Код:
if u2!=null then
 if GetUnitTypeId(u2)!='e01B' then
  // move unit
 else
  // error msg
 endif
else
  // ...
endif


+ в юнит f надо хоть что то да поместить
Старый 28.12.2008, 16:05
J
expert
offline
Опыт: 48,447
Активность:
а 'e01B' это то что ты раставляеш для позиции пелепорта?

Jon добавил:
пробни таг
Код:
globals
    group GG = CreateGroup()
    filterfunc filter_func = null
endglobals

function Shadowmove_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A02C'
endfunction

function SHMove_Filter takes nothing returns boolean
    local unit f = GetFilterUnit()
    return (not GetZero(f)) and (GetOwningPlayer(f) == GetOwningPlayer(GetTriggerUnit())) and (f != GetTriggerUnit()) and (GetUnitTypeId(f) == 'e01B')
endfunction

function Shadowmove_Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local unit u2 = GetSpellTargetUnit()
    local unit f
    local boolean b = true
    local location loc = GetSpellTargetLoc()
    if u2 == null then
        call GroupEnumUnitsInRangeOfLoc(GG, loc, 700, filter_func)
        loop
            set f = FirstOfGroup(GG)
            exitwhen f==null or GetZero(u)
            if GetUnitTypeId(f) == 'e01B' then
                call SetUnitPosition(u,GetUnitX(f),GetUnitY(f))
                set b = false
                exitwhen true
            endif
            call GroupRemoveUnit(GG,f)
        endloop
        if b then
            call IssueImmediateOrder(u, "stop")
            call SimError(GetOwningPlayer(u), "The target can be a shadowcore only")
        endif
    elseif (GetUnitTypeId(u2) == 'e01B') and (GetOwningPlayer(u) == GetOwningPlayer(u2)) then
        call SetUnitPosition(u,GetUnitX(u2),GetUnitY(u2))
    else
        call IssueImmediateOrder(u, "stop")
        call SimError(GetOwningPlayer(u), "The target can be a shadowcore only")
    endif
    call RemoveLocation(loc)
    set u = null
    set loc = null
endfunction

function InitTrig_Shadowmove takes nothing returns nothing
    set gg_trg_Shadowmove = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(gg_trg_Shadowmove, EVENT_PLAYER_UNIT_SPELL_CHANNEL)
    call TriggerAddCondition(gg_trg_Shadowmove, Condition(function Shadowmove_Conditions))
    call TriggerAddAction(gg_trg_Shadowmove, function Shadowmove_Actions)
    set filter_func = Filter(function SHMove_Filter)
endfunction

Отредактировано Jon, 28.12.2008 в 17:35.
Старый 28.12.2008, 16:15
DeaDoK

offline
Опыт: 5,783
Активность:
поправил в своём коде пару ошибок. работает, но надо перевести 2 ифа в 1 с элсифами (тока пока не пойму как)
Jon, ты не дописал 1 элсиф, + я в вДжассе неоч, + твой код работает на 60% т.е. при касте в точку радиусом большим в 700 (от дамми) то он о5 портается хз куда
Старый 28.12.2008, 16:22
Закрытая тема

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

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

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

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



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