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

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

Закрытая тема
 
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
Зацените!
Вот мучился со спосой и домучил до совершенства (на мой взгляд)

Фишка в том что, ждет не определенное время, а ждет когда бафф исчезнет!(ето там где кусок подписан "Мой Wait")

Тобиш можно триггерный спэлл снимать очищением! По моему круто!

Код:
function SetAbility takes nothing returns integer 
    local integer Ability = 'A002'                                                                  >!~#*•¤•*#~!<
    return Ability
endfunction
function Trig_Ability1_Conditions takes nothing returns boolean
    local integer Ability = SetAbility()
    if ( not ( GetSpellAbilityId() == Ability )) then
        return false
    endif
    return true
endfunction
//--------------------------------------------------------------------------------------------------------------------------------------------------------------
function Trig_Ability1_Actions takes nothing returns nothing
    local integer Ability = SetAbility()
    local integer MaxLvlAbility = 4  
    local integer AbilityBonusDodge = 'A000'
    local integer AbilityBonusArmor = 'A001'
    local string EffectShow = "Abilities\\Spells\\Orc\\FeralSpirit\\feralspirittarget.mdl" 
    local real HPplus = 200.00   
    local real HPplusUp = 100.00 
    local integer bff = 'B001' 
    local effect Effect
    local unit UnitTarget = GetSpellTargetUnit() 
    local boolean Loop   
    local boolean LoopEnd 

//--------------------------------------------------------------------------------------------------------------------------------------------------------------
   call TriggerSleepAction(0.50)
   set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = MaxLvlAbility
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        if (( GetUnitAbilityLevelSwapped(Ability, GetSpellAbilityUnit()) == GetForLoopIndexA()) and (UnitHasBuffBJ( UnitTarget , bff) == true ) ) then
            call SetUnitLifeBJ( UnitTarget, ( GetUnitStateSwap(UNIT_STATE_LIFE, UnitTarget ) + ( HPplus + ( HPplusUp * ( I2R(GetForLoopIndexA()) - 1 ) ) ) ) )
            call AddSpecialEffectTargetUnitBJ( "overhead", UnitTarget, EffectShow )
            set Effect = GetLastCreatedEffectBJ()
            call UnitRemoveAbilityBJ( AbilityBonusArmor, UnitTarget )
            call UnitRemoveAbilityBJ( AbilityBonusDodge, UnitTarget )
            call UnitAddAbilityBJ( AbilityBonusArmor, UnitTarget )
            call UnitAddAbilityBJ( AbilityBonusDodge, UnitTarget )
            call SetUnitAbilityLevelSwapped( AbilityBonusArmor, UnitTarget, GetForLoopIndexA() )
            call SetUnitAbilityLevelSwapped( AbilityBonusDodge, UnitTarget, GetForLoopIndexA() )
        else
        endif
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop

//***********************Мой Wait********************************
    set Loop = true
    set LoopEnd = false 
    loop
     exitwhen Loop == LoopEnd
     if (UnitHasBuffBJ( UnitTarget , bff) == true ) then
      call TriggerSleepAction(0.50)
     else
      set Loop = false
     endif
    endloop
//***************************************************************
    call DestroyEffectBJ( Effect )
    call UnitRemoveAbilityBJ( AbilityBonusArmor, UnitTarget )
    call UnitRemoveAbilityBJ( AbilityBonusDodge, UnitTarget )

endfunction
//===========================================================================
function InitTrig_Ability1 takes nothing returns nothing
    set gg_trg_Ability1 = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Ability1, EVENT_PLAYER_UNIT_SPELL_CHANNEL )
    call TriggerAddCondition( gg_trg_Ability1, Condition( function Trig_Ability1_Conditions ) )
    call TriggerAddAction( gg_trg_Ability1, function Trig_Ability1_Actions )
endfunction
Старый 29.08.2008, 07:54
Strayiker
Warcraft Forever
offline
Опыт: 3,406
Активность:
GresAHT чем тебе не нравится это:
Код:
loop
    exitwhen GetUnitAbilityLevel( Unit, 'Bbsk' ) == 0
    call TriggerSleepAction(RMaxBJ(bj_WAIT_FOR_COND_MIN_INTERVAL, 0.50))
endloop


И ещё...GUI to Jass не рулит.

Strayiker добавил:
Этот цикл тоже будет ждать пока с юнита не исчезнет бафф
Старый 29.08.2008, 08:32
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
Цитата:
Сообщение от Strayiker
GresAHT чем тебе не нравится это:
Код:
loop
    exitwhen GetUnitAbilityLevel( Unit, 'Bbsk' ) == 0
    call TriggerSleepAction(RMaxBJ(bj_WAIT_FOR_COND_MIN_INTERVAL, 0.50))
endloop


И ещё...GUI to Jass не рулит.

Strayiker добавил:
Этот цикл тоже будет ждать пока с юнита не исчезнет бафф

А тут тода же не нада Этого:
Код:
local boolean Loop   
local boolean LoopEnd


?

GresAHT добавил:
А чем вот это отличается от моего ожидания?
Код:
call TriggerSleepAction(RMaxBJ(bj_WAIT_FOR_COND_MIN_INTERVAL, 0.50))
Старый 29.08.2008, 08:43
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
GresAHT
Действительно, думаешь не заметно, что это "gui to jass"? Вот например, оптимизация первых же двух функций:
Код:
function SetAbility takes nothing returns integer 
    return 'A002'
endfunction

function Trig_Ability1_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == Ability 
endfunction
//да и зачем вводить лишние локалки?
Старый 29.08.2008, 09:16
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
Да вы задалбали уже! Я же и не говорил что Полностью на JASS'e писал! ;(

А за это спасибо сделаю:
Код:
function SetAbility takes nothing returns integer 
 return 'A002'
endfunction
Старый 29.08.2008, 09:34
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Код:
loop
  exitwhen GetUnitAbilityLevel(Unit, 'Abil') == 0
endloop

Strayiker, в обоих случаях поток будет продолжать работу только после выхода из цикла (что, в принципе, и нужно). Однако, я думаю, что лучше будет без TriggerSleepAction.
GresAHT, это делается элементарно, либо вышеуказанным циклом, если спелл не использует таймеры, либо добавлением в условие продолжения работы примерно следующим образом:
Код:
function OnTimer takes nothing returns nothing
  // >>--- local variables declaration
  if GetWidgetLife(u) > .405 and GetUnitAbilityLevel(u, 'A000') > 0 then
    // непосредственные действия спелла
  else
    // завершение работы спелла
  endif
  // . . .
endfunction
Старый 29.08.2008, 11:27
Strayiker
Warcraft Forever
offline
Опыт: 3,406
Активность:
ShadoW DaemoN да, так будет правильнее и удобнее.
Старый 29.08.2008, 12:56
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
Повторюсь немножко...

Чем отличаеться это:
Код:
call TriggerSleepAction(RMaxBJ(bj_WAIT_FOR_COND_MIN_INTERVAL, 0.50))

от этого:
Код:
call TriggerSleepAction(0.50)


Обьясните плиз нубу!
Старый 29.08.2008, 13:07
Strayiker
Warcraft Forever
offline
Опыт: 3,406
Активность:
Не так спрашивашь:

Код:
loop
    exitwhen GetUnitAbilityLevel( UnitTarget , bff ) == 0
    call TriggerSleepAction(RMaxBJ(bj_WAIT_FOR_COND_MIN_INTERVAL, 0.50))
endloop


заменит полностью вот это:

Код:
set Loop = true
set LoopEnd = false 
loop
    exitwhen Loop == LoopEnd
    if (UnitHasBuffBJ( UnitTarget , bff) == true ) then
        call TriggerSleepAction(0.50)
    else
    set Loop = false
    endif
endloop
Старый 29.08.2008, 13:15
adic3x

offline
Опыт: 108,439
Активность:
позравляю вы выиграли приз за самое больше количество ошибок и ненужный действий на строку кода

Цитата:
Тобиш можно триггерный спэлл снимать очищением! По моему круто!


это действительно круто когда это сделанно нормально, нет ты конечно молодец что что то пытаешь делать, но... но всетаки стоит попробывать почитать статьи и посмотреть чужие сорцы

свдн правильно все говорит

Strayiker, почитай статьи...
афтору тоже это не повредит
Старый 29.08.2008, 16:01
Sebra

offline
Опыт: 5,603
Активность:
Цитата:
Сообщение от ShadoW DaemoN
Код:
loop
  exitwhen GetUnitAbilityLevel(Unit, 'Abil') == 0
endloop

Strayiker, в обоих случаях поток будет продолжать работу только после выхода из цикла (что, в принципе, и нужно). Однако, я думаю, что лучше будет без TriggerSleepAction.

Что, правда лучше?
А поток не слетит при длинном спелле, просто проверяя его наличие?
А все остальные потоки будут ждать, пока этот соизволит закончиться или свалиться?
Или цикл стал переключать потоки уже?

Отредактировано ShadoW DaemoN, 29.08.2008 в 21:49.
Старый 29.08.2008, 21:05
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Хмм, да кстати, я не учел оп лимита. И я почему-то начинаю думать, что оба варианта с лупами так или иначе дадут сбой из-за этого.
Проверять наличие баффа периодически в любом случае будет лучше, вестимо. Примерно так это делается через таймеры:
Код:
function OnTimer takes nothing returns nothing
  // local variables declaration
  if GetUnitAbilityLevel(u, 'B000') == 0 then
    // spell finishing
  endif
endfunction

Хмм, хотя возможно сделать и через периодические триггеры (condition, по идее, вычисляется быстрее). Самый оптимальный период, имхо, 0.5 сек.
Старый 29.08.2008, 22:26
Sebra

offline
Опыт: 5,603
Активность:
Цитата:
оба варианта с лупами так или иначе дадут сбой из-за этого
Не оба.
Цитата:
Код:
loop
    exitwhen GetUnitAbilityLevel( UnitTarget , bff ) == 0
    call TriggerSleepAction(0.50)
endloop
Этот не даст.
TriggerSleepAction не позволит.

Однако, надо ещё проверять, что мы колдовать не перестали.
Иначе получится глюк при использовании одной абилы разными юнитами на одном.
Эффект от каждого будет длиться, пока хоть кто-то кастует.

Я имею в виду если мы кастуем канал.

Отредактировано Sebra, 29.08.2008 в 22:47.
Старый 29.08.2008, 22:42
adic3x

offline
Опыт: 108,439
Активность:
это не надо делать циклом... в функции, повешенной на таймер проверочку на уровень бафа (да, если юнит умрет левел бафа равен 0 так что хп мона не тестить) - если ноль так таймер остановить и т.д.
Старый 30.08.2008, 00:58
Закрытая тема

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

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

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

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



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