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

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

Закрытая тема
 
truth troll
Silenced by truth troll
offline
Опыт: 7,396
Активность:
Тестирование спелла
И снова здравствуйте. Вот написал свой первый триггерный спелл.
Принцип действия: Создан на основе "стремительности" (Мастер Клинка), только при атаке герой не наносит доп. урон, а оглушает противника...

» Spell01a
Код:
function Trig_Spell01b_Actions takes nothing returns nothing // Функция создоваемого триггера на получение урона с действиями оглушения
    local integer i = 1
    local integer j = 0
    local unit attacker = GetEventDamageSource() // атакующий
    local unit attacked = GetTriggerUnit()       // атакованный
    local effect Stun_Effect
    
loop
    exitwhen i > 6
    
      if   (udg_Spell01_Array_unitatker[i] == attacker) and (udg_Spell01_Array_unitatked[i] == attacked)  then 
      set j = i
      set i = 6
      endif
        
    set i = i + 1
endloop  
      
   
  if j!= 0 then 
  
    call DisableTrigger( GetTriggeringTrigger() )
    call TriggerSleepAction( 0.1 )
    
   if GetUnitState(attacked, UNIT_STATE_LIFE) > 0 then
   
    call UnitRemoveAbility( attacker, 'B000' )  // 'B000' - бафф спелла
    call PauseUnit( attacked, true )
    call UnitAddType( attacked, UNIT_TYPE_STUNNED )
    set Stun_Effect = AddSpecialEffectTarget("Abilities\\Spells\\Human\\Thunderclap\\ThunderclapTarget.mdl", attacked, "overhead")
    
    call TriggerSleepAction( 2.00 )
    
    call UnitRemoveType( attacked, UNIT_TYPE_STUNNED )
    call PauseUnit( attacked, false )
    call DestroyEffect(Stun_Effect)
   endif 
    
    call DestroyTrigger(GetTriggeringTrigger())
    set udg_Spell01_Array_unitatker[j] = null
    set udg_Spell01_Array_unitatked[j] = null
    
  endif
  
    set Stun_Effect = null
    set attacker = null
    set attacked = null
endfunction


function Trig_Spell01a_Conditions takes nothing returns boolean
   return GetUnitAbilityLevel(GetAttacker(), 'B000') > 0
   endfunction

function Trig_Spell01a_Actions takes nothing returns nothing // действие триггера: создание триггера для атакованого юнита на получение урона
local integer i = 1
local integer j = 0
local trigger trg = CreateTrigger()

loop
    exitwhen i > 6
        
  if udg_Spell01_Array_unitatker[i] == null then 
    set j = i
    set udg_Spell01_Array_unitatker[i]= GetAttacker()
    set  udg_Spell01_Array_unitatked[i]= GetTriggerUnit()
    set i = 6
  endif
    
    set i = i + 1
endloop
    
    call TriggerRegisterUnitEvent( trg, GetTriggerUnit(), EVENT_UNIT_DAMAGED )
    call TriggerAddAction( trg, function Trig_Spell01b_Actions)
    
    call TriggerSleepAction( 3.00)
    
    if IsTriggerEnabled(trg) == true then 
    call DestroyTrigger(trg) 
    endif 
    
    set udg_Spell01_Array_unitatker[j]= null
    set  udg_Spell01_Array_unitatked[j]= null
    set trg = null
endfunction

//===========================================================================
function InitTrig_Spell01a takes nothing returns nothing
    set gg_trg_Spell01a = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ(gg_trg_Spell01a, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_Spell01a, Condition( function Trig_Spell01a_Conditions ) )
    call TriggerAddAction( gg_trg_Spell01a, function Trig_Spell01a_Actions )
endfunction


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

карта на версии 1.24
Прикрепленные файлы
Тип файла: w3x StunSpell_by Truth troll.w3x (11.5 Кбайт, 24 просмотров )

Отредактировано truth troll, 07.08.2009 в 08:59.
Старый 06.08.2009, 21:58
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
DragonSpirit, советую прочитать код =)
Hellfim добавил:
truth_troll, для начала надо нормально называть переменные.
Старый 06.08.2009, 22:43
truth troll
Silenced by truth troll
offline
Опыт: 7,396
Активность:
Hellfim, Чем тебе не нравится как я их назвал? Подозреваю ты имеешь ввиду, что код с такими названиями переменных плохо читается... А какие именно переменные не удачно названы?

а где комент DragonSpirit? О_о
Старый 07.08.2009, 08:33
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
truth_troll, ну по мне, так все переменные надо называть вразумительно, например переменные из функции Spell01b
    local integer i = 1 //Можно оставить, но когда больше чем одна переменная их все же лучше полностью называть
    local integer j = 0 //Можно оставить, но когда больше чем одна переменная их все же лучше полностью называть
    local unit attacked = GetEventDamageSource()
    local unit attacker = GetTriggerUnit()
    local effect thunderClapEffect
И да, названия функций тоже очень хромают, если у тебя 100 спеллов, то представь как ты будешь ориентироваться.
Он самоудалил свои комментарии =)
Старый 07.08.2009, 08:40
truth troll
Silenced by truth troll
offline
Опыт: 7,396
Активность:
Hellfim,

Передела, по твоему совету, первый пост... Теперь переменные все нормально названы?

Цитата:
И да, названия функций тоже очень хромают, если у тебя 100 спеллов, то представь как ты будешь ориентироваться.


Не фига себе! 100 спеллов! Я загнусь под ними! =)) Нет, 100 спеллов не будет максиму 20...

Цитата:
Он самоудалил свои комментарии =)


Жаль... надеюсь ничего интересного.

truth troll добавил:
Меня интересует замечание по самому коду, а не по его оформлению...
Старый 07.08.2009, 09:09
ZeToX2007

offline
Опыт: 7,009
Активность:
truth troll, Лучше используй GetWidgetLife чем GetWidgetLife. эээ непонял а спел срабатывает, когда юнит атакует или наносит повреждения ? и кстати TriggerSleepAction работает неточно =/ можешь проверить.
Старый 07.08.2009, 18:05
DragonSpirit
у - уходи
offline
Опыт: 22,625
Активность:
GetWidgetLife чем GetWidgetLife
мб ты чутка промахнулся? ^_^
truth_troll, твой спелл рабочий,я писал что он может работать только один раз из за действия,
call DestroyTrigger(GetTriggeringTrigger)
и наверное я был не прав,раз меня Hellfim поправил =)
Старый 07.08.2009, 18:36
truth troll
Silenced by truth troll
offline
Опыт: 7,396
Активность:
Цитата:
Лучше используй GetWidgetLife чем GetWidgetLife


ZeToX2007,я так понял ты имеешь ввиду: лучше GetWidgetLife() чем GetUnitState()...
Можешь объяснить почему?

Цитата:
эээ непонял а спел срабатывает, когда юнит атакует или наносит повреждения ?


Сам триггер Spell01a срабатыват на "Юнит - атакован", а его действие создаёт триггер Spell01b. Который срабатывает на "Юнит - получает урон"...


Цитата:
и кстати TriggerSleepAction работает неточно =/ можешь проверить.


В принципе можно использовать таймер, но будет ли это оправданное действие?


DragonSpirit, Ну да, Hellfim правильно заметил... Т.к. call DestroyTrigger(GetTriggeringTrigger) для динамически созданого триггера...
Старый 07.08.2009, 20:49
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
truth_troll, оправданно будет. Про GetWidgetLife(...) смотри соседнюю тему, там свдн дал точные цифры скорости работы этих функций.
Старый 07.08.2009, 22:06
Garret
Недоброе творится
offline
Опыт: 3,893
Активность:
Не очень понял, зачем там творится какое-то чудо со стуном - почему бы просто не использовать дамми каст?
Старый 08.08.2009, 02:22
truth troll
Silenced by truth troll
offline
Опыт: 7,396
Активность:
Цитата:
Сообщение от Garret
Не очень понял, зачем там творится какое-то чудо со стуном - почему бы просто не использовать дамми каст?


думаю ответ находится в первом посте =)

Цитата:
...Вот написал свой первый триггерный спелл.
...
Прошу оценить спелл, а также указать на возможные ошибки и помочь в его оптимизации...


А вообще учусь... =)))

Hellfim, Понятно...

Возможно ли такое: call TimerStart(Timer1, 2.00, false, function Func00 (Unit))?

Отредактировано truth troll, 09.08.2009 в 03:02.
Старый 08.08.2009, 11:15
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
truth_troll, функция, которая вызывается таймером не может принимать аргументы. Ты должен сделать переменные глобальными.
Старый 08.08.2009, 11:44
truth troll
Silenced by truth troll
offline
Опыт: 7,396
Активность:
Hellfim, Это, что опять придется использовать массивы? Ведь если я создам глобальные переменные (не массив), то они могут измениться в течении отсчёта таймера и действия проведутся не над нужными мне значениями...
Старый 08.08.2009, 23:21
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
truth_troll, не массивы, а глобальные переменные. Это не так страшно.
Старый 09.08.2009, 05:45
truth troll
Silenced by truth troll
offline
Опыт: 7,396
Активность:
Hellfim, Я понял о чём это ты, вроде... =) Ты предлагаешь использовать Scope и создавать private глобалки? Но у меня чего-то не получается =((( Вот переделал свой код спелла. Покамись заменил один Wait на таймер, создал scope и объявил приват глобалки... И с этими изменениями карта вылетает, явно я делаю что-то не так =(((

» не работает!!!
Код:
scope Spell01_Stun

globals

private trigger Trigg 
private integer J_glob 
private unit array Spell01_Array_unitatker 
private unit array Spell01_Array_unitatked 

endglobals




private function Timer_Spell01_DestroyTrg takes nothing returns nothing

    if IsTriggerEnabled(Trigg) == true then 
    call DestroyTrigger(Trigg) 
    endif 
    
    set Spell01_Array_unitatker[J_glob]= null
    set Spell01_Array_unitatked[J_glob]= null

call DestroyTimer(GetExpiredTimer())
endfunction




private function Trig_Spell01b_Actions takes nothing returns nothing // Функция создоваемого триггера на получение урона с действиями оглушения
    local integer i = 1
    local integer j = 0
    local unit attacker = GetEventDamageSource() // атакующий
    local unit attacked = GetTriggerUnit()       // атакованный
    local effect Stun_Effect
    
loop
    exitwhen i > 6
    
      if   (Spell01_Array_unitatker[i] == attacker) and (Spell01_Array_unitatked[i] == attacked)  then 
      set j = i
      set i = 6
      endif
        
    set i = i + 1
endloop  
      
   
  if j!= 0 then 
  
    call DisableTrigger( GetTriggeringTrigger() )
    call TriggerSleepAction( 0.1 )
    
   if GetWidgetLife(attacked) > 0 then
   
    call UnitRemoveAbility( attacker, 'B000' )
    call PauseUnit( attacked, true )
    call UnitAddType( attacked, UNIT_TYPE_STUNNED )
    set Stun_Effect = AddSpecialEffectTarget("Abilities\\Spells\\Human\\Thunderclap\\ThunderclapTarget.mdl", attacked, "overhead")
    
    call TriggerSleepAction( 2.00 )
    
    call UnitRemoveType( attacked, UNIT_TYPE_STUNNED )
    call PauseUnit( attacked, false )
    call DestroyEffect(Stun_Effect)
   endif 
    
    call DestroyTrigger(GetTriggeringTrigger())
    set Spell01_Array_unitatker[j] = null
    set Spell01_Array_unitatked[j] = null
    
  endif
  
    set Stun_Effect = null
    set attacker = null
    set attacked = null
endfunction


private function Trig_Spell01a_Conditions takes nothing returns boolean
   return GetUnitAbilityLevel(GetAttacker(), 'B000') > 0
   endfunction

private function Trig_Spell01a_Actions takes nothing returns nothing // действие триггера: создание триггера для атакованого юнита на получение урона
local integer i = 1
local integer j = 0
local trigger trg = CreateTrigger()
local timer Timer1 = CreateTimer()

loop
    exitwhen i > 6
        
  if Spell01_Array_unitatker[i] == null then 
    set j = i
    set Spell01_Array_unitatker[i]= GetAttacker()
    set Spell01_Array_unitatked[i]= GetTriggerUnit()
    set i = 6
  endif
    
    set i = i + 1
endloop
    
    call TriggerRegisterUnitEvent( trg, GetTriggerUnit(), EVENT_UNIT_DAMAGED )
    call TriggerAddAction( trg, function Trig_Spell01b_Actions)
    
    set Trigg = trg
    set J_glob = j
    
    call TimerStart(Timer1, 3.00, false, function Timer_Spell01_DestroyTrg)
    
    set trg = null
    set Timer1 = null
endfunction

//===========================================================================
public function InitTrig_Spell01a takes nothing returns nothing
    set gg_trg_Spell01a = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ(gg_trg_Spell01a, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_Spell01a, Condition( function Trig_Spell01a_Conditions ) )
    call TriggerAddAction( gg_trg_Spell01a, function Trig_Spell01a_Actions )
endfunction
endscope
Старый 10.08.2009, 20:28
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
» code
library MySpell initializer Init //Т.к. скопы не могут самоинитиализироваться

globals
    private unit unitAttaker
    private unit unitAttaked
endglobals

private function GetDamageActions takes nothing returns nothing // Функция создоваемого триггера на получение урона с действиями оглушения
    local unit attacker = GetEventDamageSource() // атакующий
    local unit attacked = GetTriggerUnit()       // атакованный
    local unit dummy=null
    if unitAttacked==attacked and unitAttacker==attacker then
        call DestroyTrigger(GetTriggeringTrigger())
        if GetWidgetLife(attacked) > 0 then
            set dummy=CreateUnit(<dummy rawcode>,GetOwningPlayer(attaker),GetUnitX(attacker),GetUnitY(attaker),0)
            call UnitRemoveAbility(attacker,'B000')
            call IssueTargetOrder(dummy,"thunderbolt",attacked)
        endif
    endif  
    set attacker = null
    set attacked = null
endfunction


private function MySpell_Conditions takes nothing returns boolean
    return GetUnitAbilityLevel(GetAttacker(), 'B000') > 0
endfunction

private function Actions takes nothing returns nothing // действие триггера: создание триггера для атакованого юнита на получение урона
    local trigger registerDamage=CreateTrigger()
    set unitAttacker=GetAttacker()
    set unitAttacked=GetTriggerUnit()
    call TriggerRegisterUnitEvent(registerDamage,GetTriggerUnit(),EVENT_UNIT_DAMAGED)
    call TriggerAddAction(registerDamage,function GetDamageActions)
endfunction

//===========================================================================
public function Init takes nothing returns nothing
    local trigger mySpell=CreateTrigger()
    //Мне удобнее на каждого игрока вешать.
    call TriggerRegisterPlayerUnitEvent(mySpell,Player( 0),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent(mySpell,Player( 1),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent(mySpell,Player( 2),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent(mySpell,Player( 3),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent(mySpell,Player( 4),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent(mySpell,Player( 5),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent(mySpell,Player( 6),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent(mySpell,Player( 7),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent(mySpell,Player( 8),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent(mySpell,Player( 9),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent(mySpell,Player(10),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerRegisterPlayerUnitEvent(mySpell,Player(11),EVENT_PLAYER_UNIT_ATTACKED,null)
    call TriggerAddCondition(mySpell,Condition(function MySpellConditions))
    call TriggerAddAction(mySpell,function Actions )
endfunction

endlibrary
Возможно код не работает, ибо я немного запутался =) + тебе надо создать дамми-юнита и дать ему абилку на основе молота бурь (Горного короля).
Старый 10.08.2009, 22:37
truth troll
Silenced by truth troll
offline
Опыт: 7,396
Активность:
Hellfim, Спс, твой код мне очень помог... завтра попытаюсь всё довести до ума и закрою тему...
Старый 10.08.2009, 23:56
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
Т.к. скопы не могут самоинитиализироваться
Hellfim, уверен?
Старый 11.08.2009, 11:11
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
В мануале написано, что не могут, хз. Но да, тема закрыта.
Старый 12.08.2009, 10:05
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Hellfim, нет, сэр, вы не правы:
Hint: Scopes support initializer just like libraries...
Надо мануал читать лучше, так как инициализаторы областей были введены в JassHelper версии 0.9.9.9
Старый 12.08.2009, 11:09
Закрытая тема

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

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

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

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



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