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

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

Закрытая тема
 
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
Проблемы с молнией
Помогите с кодом! Создаю спелл "замедление"(стандартное замедление волшебниц), но добавляю 6 лучей(молнии), которые как бы привязаны к цели. Создаю то я их создаю, но их же нужна двигать к цели постоянно(ибо она же двигаеться). Так вот у меня не срабатывает MoveLightningEx.

Я так понял что у мя по какойто причине созданные молнии не записываються в переменную!(EffectM[]).

К томуже почемуто не работает цикл:

Цитата:
loop
exitwhen GetUnitAbilityLevel( UnitTarget, bff ) == 0
if (not(UnitHasBuffBJ( UnitTarget , bff) == true )) then
\\--->Действия
else
endif
endloop


Код:
function Trig_Spell1_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A000' ) ) then
        return false
    endif
    return true
endfunction

function Trig_Spell1_Actions takes nothing returns nothing
local unit UnitTarget = GetSpellTargetUnit()
local real X1 = GetLocationX(GetUnitLoc(UnitTarget))
local real Y1 = GetLocationY(GetUnitLoc(UnitTarget))
local real X2 = GetLocationX(GetUnitLoc(UnitTarget))
local real Y2 = GetLocationY(GetUnitLoc(UnitTarget))
local real Z1 = 0.00
local lightning array EffectM
local effect array SEffect
local integer bff = 'B000'
    call TriggerSleepAction( 0.05 )
   if (not(UnitHasBuffBJ( UnitTarget , bff) == true )) then
    call AddLightningEx ( "CLSB", true, (X1 + -200.00), (Y1 + 50.00) , Z1, X2 , Y2 , (Z1 + 60.00) )
    set EffectM[1] = GetLastCreatedLightningBJ()
    call AddSpecialEffectLocBJ( Location((X1 + -200.00), (Y1 + 50.00)), "Abilities\\Spells\\Human\\ManaFlare\\ManaFlareTarget.mdl" )
    set SEffect[1] = GetLastCreatedEffectBJ()
    call AddLightningEx ( "CLSB", true, (X1 + -50.00), (Y1 + 150.00) , Z1, X2 , Y2 , (Z1 + 60.00) )
    set EffectM[2] = GetLastCreatedLightningBJ()
    call AddSpecialEffectLocBJ( Location((X1 + -50.00), (Y1 + 150.00)), "Abilities\\Spells\\Human\\ManaFlare\\ManaFlareTarget.mdl" )
    set SEffect[2] = GetLastCreatedEffectBJ()
    call AddLightningEx ( "CLSB", true, (X1 + 60.00), (Y1 + 110.00) , Z1, X2 , Y2 , (Z1 + 60.00) )
    set EffectM[3] = GetLastCreatedLightningBJ()
    call AddSpecialEffectLocBJ( Location((X1 + 60.00), (Y1 + 110.00)), "Abilities\\Spells\\Human\\ManaFlare\\ManaFlareTarget.mdl" )
    set SEffect[3] = GetLastCreatedEffectBJ()
    call AddLightningEx ( "CLSB", true, (X1 + 150.00), (Y1 + -50.00) , Z1, X2 , Y2 , (Z1 + 60.00) )
    set EffectM[4] = GetLastCreatedLightningBJ()    
    call AddSpecialEffectLocBJ( Location((X1 + 150.00), (Y1 + -50.00)), "Abilities\\Spells\\Human\\ManaFlare\\ManaFlareTarget.mdl" )
    set SEffect[4] = GetLastCreatedEffectBJ()
    call AddLightningEx ( "CLSB", true, (X1 + 20.00), (Y1 + -140.00) , Z1, X2 , Y2 , (Z1 + 60.00) )
    set EffectM[5] = GetLastCreatedLightningBJ()
    call AddSpecialEffectLocBJ( Location((X1 + 20.00), (Y1 + -140.00)), "Abilities\\Spells\\Human\\ManaFlare\\ManaFlareTarget.mdl" )
    set SEffect[5] = GetLastCreatedEffectBJ()
    call AddLightningEx ( "CLSB", true, (X1 + -60.00), (Y1 + -130.00) , Z1, X2 , Y2 , (Z1 + 60.00) )
    set EffectM[6] = GetLastCreatedLightningBJ()
    call AddSpecialEffectLocBJ( Location((X1 + -60.00), (Y1 + -130.00)), "Abilities\\Spells\\Human\\ManaFlare\\ManaFlareTarget.mdl" )
    set SEffect[6] = GetLastCreatedEffectBJ()
   else
    return
   endif
    loop
     exitwhen GetUnitAbilityLevel( UnitTarget, bff ) == 0
     if (not(UnitHasBuffBJ( UnitTarget , bff) == true )) then
      set X2 = GetLocationX(GetUnitLoc(UnitTarget))
      set Y2 = GetLocationY(GetUnitLoc(UnitTarget))

    call DisplayTextToForce( GetPlayersAll(), GetUnitName(UnitTarget) )
    call DisplayTextToForce( GetPlayersAll(), ( "X=" + R2S(X2) ) )
    call DisplayTextToForce( GetPlayersAll(), ( "Y=" + R2S(Y2) ) )

      call MoveLightningEx ( EffectM[1], true, (X1 + -200.00), (Y1 + 50.00)   , Z1, X2 , Y2 , (Z1 + 60.00) )
      call MoveLightningEx ( EffectM[2], true, (X1 + -50.00),  (Y1 + 150.00)  , Z1, X2 , Y2 , (Z1 + 60.00) )
      call MoveLightningEx ( EffectM[3], true, (X1 + 60.00),   (Y1 + 110.00)  , Z1, X2 , Y2 , (Z1 + 60.00) )
      call MoveLightningEx ( EffectM[4], true, (X1 + 150.00),  (Y1 + -50.00)  , Z1, X2 , Y2 , (Z1 + 60.00) )
      call MoveLightningEx ( EffectM[5], true, (X1 + 20.00),   (Y1 + -140.00) , Z1, X2 , Y2 , (Z1 + 60.00) )
      call MoveLightningEx ( EffectM[6], true, (X1 + -60.00),  (Y1 + -130.00) , Z1, X2 , Y2 , (Z1 + 60.00) )
      call TriggerSleepAction(RMaxBJ(bj_WAIT_FOR_COND_MIN_INTERVAL, 0.50))
     else
     endif
    endloop
    call DestroyLightningBJ( EffectM[1] )
    call DestroyEffectBJ( SEffect[1] )
    call DestroyLightningBJ( EffectM[2] )
    call DestroyEffectBJ( SEffect[2] )
    call DestroyLightningBJ( EffectM[3] )
    call DestroyEffectBJ( SEffect[3] )
    call DestroyLightningBJ( EffectM[4] )
    call DestroyEffectBJ( SEffect[4] )
    call DestroyLightningBJ( EffectM[5] )
    call DestroyEffectBJ( SEffect[5] )
    call DestroyLightningBJ( EffectM[6] )
    call DestroyEffectBJ( SEffect[6] )
endfunction

//===========================================================================
function InitTrig_Spell1 takes nothing returns nothing
    set gg_trg_Spell1 = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Spell1, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_Spell1, Condition( function Trig_Spell1_Conditions ) )
    call TriggerAddAction( gg_trg_Spell1, function Trig_Spell1_Actions )
endfunction
Старый 22.09.2008, 07:03
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
AddLightningEx - это нативка, соответственно:
Код:
// . . .
  call AddLightningEx("CLSB", true, (X1 + -200.00), (Y1 + 50.00) , Z1, X2 , Y2 , (Z1 + 60.00) )
  set EffectM[1] = GetLastCreatedLightningBJ()
// . . .

не имеет смысла, так как молния была создана не БЖ функцией. Нужно писать:
Код:
// . . .
  set EffectM[1] = AddLightningEx("CLSB", true, (X1 + -200.00), (Y1 + 50.00) , Z1, X2 , Y2 , (Z1 + 60.00) )
// . . .

Код не оптимизирован, советую почитать вот это - http://xgm.guru/forum/showthread.php?t=18742

По циклу:
Условие поставлено неверно.
Код:
if (not(UnitHasBuffBJ(UnitTarget, bff) == true)) then
// эквивалентно
if not (GetUnitAbilityLevel(UnitTarget, bff) > 0) then
// эквивалентно
if GetUnitAbilityLevel(UnitTarget, bff) <= 0 then

То есть, если бафф отсутствует, то выполнять какие-то действия. Но это же условие является условием выхода из цикла, что является вполне обоснованным идиотизмом.
Старый 22.09.2008, 11:02
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
Спос за Нативку!
а по поводу цикла:
Цитата:
exitwhen GetUnitAbilityLevel( UnitTarget, bff ) == 0

это условие выхода так? значит получаеться так: если Уровень бафа равен 0, то тогда выходим! Че не правильно то?
Старый 22.09.2008, 12:34
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Код:
loop
  exitwhen GetUnitAbilityLevel( UnitTarget, bff ) == 0 // уровень абилы равен 0, выход из цикла
  if (not(UnitHasBuffBJ( UnitTarget , bff) == true )) then // если юнит не имеет бафа, совершать действия
    \\--->Действия
  else
  endif

// уровень абилы == 0 - тоже самое что и юнит не имеет бафа
endloop
Старый 22.09.2008, 12:37
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
ха... а может перед циклом подождать нада немного! бафф мож не успевает накинуться?

GresAHT добавил:
Цитата:
if (not(UnitHasBuffBJ(UnitTarget, bff) == true)) then
// эквивалентно
if not (GetUnitAbilityLevel(UnitTarget, bff) > 0) then
// эквивалентно
if GetUnitAbilityLevel(UnitTarget, bff) <= 0 then

мне Not убрать чтоли или че? у мя If не работает?

GresAHT добавил:
Кстате! А дистрою я ее правильно! И двигаю?
Старый 22.09.2008, 14:08
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
GresAHT
Тут сам принцип абсурдный.
Код:
loop
  exitwhen GetUnitAbilityLevel( UnitTarget, bff ) == 0
  if (not(UnitHasBuffBJ( UnitTarget , bff) == true )) then
    \\--->Действия
  else
  endif
endloop

Повторять какие-то действия, если есть баф. В то же время, выйти из цикла, если опять же, есть этот же самый баф.
Старый 22.09.2008, 14:45
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
Аверно я чета не могу догнать...
Но ведь выход из цикла у меня проверка что уровень баффа равен 0!
ну а внутри проверка что есть бафф или нет(это я согласен лишнее)
напиши пример как должно быть чтобы цикл работал...
Старый 22.09.2008, 16:05
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Читаем внимательней:
Цитата:
Сообщение от swdn
если бафф отсутствует, то выполнять какие-то действия. Но это же условие является условием выхода из цикла, что является вполне обоснованным идиотизмом.

GresAHT, имхо, здесь if-then конструкция не нужна вообще. То есть пишем:
Код:
loop
  exitwhen GetUnitAbilityLevel(UnitTarget, bff) == 0
  // >>--- actions
  call MoveLightningEx(. . .)
  // . . .
endloop

То есть, пока на целевом юните есть бафф, то делаем действия.
Также следует учитывать, что цикл может достигнуть лимита выполнения. Для долговременных действий лучше (и правильней) использовать таймер:
Код:
globals
  unit UnitTarget = null
  integer bff = '0MFG'
  // . . .
endglobals

function OnTimer takes nothing returns nothing
  if GetUnitAbilityLevel(UnitTarget, bff) > 0 then
    // >>--- actions
  else
    call DestroyTimer(GetExpiredTimer())
  endif
endfunction

function Trig_Spell1_Actions takes nothing returns nothing
  // . . .
  call TimerStart(CreateTimer(), 0.025, true, function OnTimer)
  // . . .
endfunction
Старый 22.09.2008, 16:33
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
Все! Вот спасибо! Подмогли... :D:
Все щас зделаю!
Старый 22.09.2008, 16:48
Закрытая тема

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

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

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

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



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