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

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

Ответ
 
Castiel

offline
Опыт: 2,093
Активность:
Динамический триггер
Помгите ! Не могу вдуплится! Как сделать так, чтобы из вот этих двух триггеров один.


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

function Trig_Attack_Healing_Actions takes nothing returns nothing
    call EnableTrigger( gg_trg_Attack_Healing_On )
    call TriggerSleepAction( 20.00 )
    call DisableTrigger( gg_trg_Attack_Healing_On )
endfunction

//===========================================================================
function InitTrig_Attack_Healing takes nothing returns nothing
    set gg_trg_Attack_Healing = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Attack_Healing, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Attack_Healing, Condition( function Trig_Attack_Healing_Conditions ) )
    call TriggerAddAction( gg_trg_Attack_Healing, function Trig_Attack_Healing_Actions )
endfunction


Код:
function Trig_Attack_Healing_On_Func001C takes nothing returns boolean
    if ( not ( UnitHasBuffBJ(GetAttacker(), 'Broa') == true ) ) then
        return false
    endif
    if ( not ( IsUnitEnemy(GetAttackedUnitBJ(), GetOwningPlayer(GetAttacker())) == true ) ) then
        return false
    endif
    return true
endfunction

function Trig_Attack_Healing_On_Conditions takes nothing returns boolean
    if ( not Trig_Attack_Healing_On_Func001C() ) then
        return false
    endif
    return true
endfunction

function Trig_Attack_Healing_On_Func003C takes nothing returns boolean
    if ( not ( udg_i_Paladin_DivineAttack >= 75 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Attack_Healing_On_Actions takes nothing returns nothing
    set udg_i_Paladin_DivineAttack = GetRandomInt(1, 100)
    if ( Trig_Attack_Healing_On_Func003C() ) then
        call SetUnitLifeBJ( GetAttacker(), ( GetUnitStateSwap(UNIT_STATE_LIFE, GetAttacker()) + I2R(( 10 + ( 10 * GetUnitAbilityLevelSwapped('Aroa', GetAttacker()) ) )) ) )
        call AddSpecialEffectTargetUnitBJ( "orign", GetAttacker(), "Abilities\\Spells\\Human\\HolyBolt\\HolyBoltSpecialArt.mdl" )
        call DestroyEffectBJ( GetLastCreatedEffectBJ() )
    else
    endif
endfunction

//===========================================================================
function InitTrig_Attack_Healing_On takes nothing returns nothing
    set gg_trg_Attack_Healing_On = CreateTrigger(  )
    call DisableTrigger( gg_trg_Attack_Healing_On )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Attack_Healing_On, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_Attack_Healing_On, Condition( function Trig_Attack_Healing_On_Conditions ) )
    call TriggerAddAction( gg_trg_Attack_Healing_On, function Trig_Attack_Healing_On_Actions )
endfunction
Старый 13.03.2009, 21:45
Артте
Open up your eyes
offline
Опыт: 23,423
Активность:
имхо никак..но вот так будет красивее:
Код:
function Trig_Attack_Healing_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'Aroa'
endfunction

function Trig_Attack_Healing_Actions takes nothing returns nothing
    call EnableTrigger( gg_trg_Attack_Healing_On )
    call TriggerSleepAction( 20.00 )
    call DisableTrigger( gg_trg_Attack_Healing_On )
endfunction

//===========================================================================
function InitTrig_Attack_Healing takes nothing returns nothing
    set gg_trg_Attack_Healing = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Attack_Healing, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Attack_Healing, Condition( function Trig_Attack_Healing_Conditions ) )
    call TriggerAddAction( gg_trg_Attack_Healing, function Trig_Attack_Healing_Actions )
endfunction


Код:
function Trig_Attack_Healing_On_Conditions takes nothing returns boolean
   return GetUnitAbilityLevel(GetAttacker(), 'Broa')>0 and IsUnitEnemy(GetTriggerUnit(), GetOwningPlayer(GetAttacker())) == true
endfunction

function Trig_Attack_Healing_On_Actions takes nothing returns nothing
local integer i
    set i = GetRandomInt(1, 100)
    if (  i >= 75  ) then
        call SetUnitState( GetAttacker(),UNIT_STATE_LIFE, ( GetUnitState(GetAttacker(), UNIT_STATE_LIFE) + I2R(( 10 + ( 10 * GetUnitAbilityLevel(GetAttacker(), 'Aroa') ) )) ) )
        call DestroyEffect( AddSpecialEffectTarget("Abilities\\Spells\\Human\\HolyBolt\\HolyBoltSpecialArt.mdl" , GetAttacker() ,"origin" ) )
     endif
endfunction

//===========================================================================
function InitTrig_Attack_Healing_On takes nothing returns nothing
    set gg_trg_Attack_Healing_On = CreateTrigger(  )
    call DisableTrigger( gg_trg_Attack_Healing_On )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Attack_Healing_On, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_Attack_Healing_On, Condition( function Trig_Attack_Healing_On_Conditions ) )
    call TriggerAddAction( gg_trg_Attack_Healing_On, function Trig_Attack_Healing_On_Actions )
endfunction

Отредактировано Артте, 13.03.2009 в 23:07.
Старый 13.03.2009, 22:50
Castiel

offline
Опыт: 2,093
Активность:
Да полюбому как можно. Я открывал пару карт с примером, только там было чуток подругому. Только не вдуплился вообще.
Старый 13.03.2009, 23:13
Артте
Open up your eyes
offline
Опыт: 23,423
Активность:
так скинь..
Старый 13.03.2009, 23:24
Igores
НИИ 4А-Во! Кафедра Джасс.
offline
Опыт: 5,325
Активность:
Чувак, это делается просто. Тебе просто надо в одном скрипте прописать два триггера, либо создавать в одном второй.
Старый 13.03.2009, 23:38
Артте
Open up your eyes
offline
Опыт: 23,423
Активность:
второй вариант создает утечки, я его поэтмоу и не предлагал
Старый 13.03.2009, 23:46
Castiel

offline
Опыт: 2,093
Активность:
Ладно че нить другое придумаю. А вот с этими отрядами я неразберусь. Как можно оптимизмровать :
Код:
function Trig_Lie_target_Conditions takes nothing returns boolean
    return GetUnitAbilityLevel( GetTriggerUnit(), 'Bprg')>0
endfunction

//
function Trig_Lie_target_Func001Func001C takes nothing returns boolean
    if ( not ( IsUnitAlly(GetEnumUnit(), GetOwningPlayer(GetAttacker())) == true ) ) then
        return false
    endif
    if ( not ( IsUnitType(GetEnumUnit(), UNIT_TYPE_HERO) == true ) ) then
        return false
    endif
    if ( not ( IsUnitAliveBJ(GetEnumUnit()) == true ) ) then
        return false
    endif
    return true
endfunction

function Trig_Lie_target_Func001A takes nothing returns nothing
    if ( Trig_Lie_target_Func001Func001C() ) then
        call SetUnitLifeBJ( GetEnumUnit(), ( GetUnitStateSwap(UNIT_STATE_LIFE, GetEnumUnit()) + I2R(GetUnitAbilityLevelSwapped('A00G', GetAttacker())) ) )
    else
    endif
endfunction

function Trig_Lie_target_Actions takes nothing returns nothing
    call ForGroupBJ( GetUnitsInRectAll(GetPlayableMapRect()), function Trig_Lie_target_Func001A )
endfunction

//===========================================================================
function InitTrig_Lie_target takes nothing returns nothing
    set gg_trg_Lie_target = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Lie_target, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_Lie_target, Condition( function Trig_Lie_target_Conditions ) )
    call TriggerAddAction( gg_trg_Lie_target, function Trig_Lie_target_Actions )
endfunction
Старый 14.03.2009, 00:37
alexkill

offline
Опыт: 18,872
Активность:
Castiel, код, указанный в первом посте, работает неверно, ибо здоровье будет восстанавливаться во время замаха, а не при ударе. Дополнительно нужно создать динамический триггер с событием получения атакованным воином урона.

Оптимизированный код №2:
Код:
globals
  group g = CreateGroup()
endglobals

function Conditions takes nothing returns boolean
    return GetUnitAbilityLevel( GetTriggerUnit(), 'Bprg')>0
endfunction

function Filt takes nothing returns boolean
    return IsUnitAlly(GetFilterUnit(), GetOwningPlayer(GetAttacker())) and IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO) and GetUnitState(GetEnumUnit(),UNIT_STATE_LIFE)>0 
endfunction

function ActionsGroup takes nothing returns nothing
    call SetUnitState(GetEnumUnit(), UNIT_STATE_LIFE, RMaxBJ(0,GetUnitState(GetEnumUnit(), UNIT_STATE_LIFE) + I2R(GetUnitAbilityLevel(GetAttacker(), 'A00G'))))
endfunction

function Actions takes nothing returns nothing
    call GroupEnumUnitsInRect(g,bj_mapInitialPlayableArea,Filter(function Filt))
    call ForGroup( g, function ActionsGroup )
    call GroupClear(g)
endfunction

function InitTrig_Lie_target takes nothing returns nothing
    local integer index = 0
    set gg_trg_Lie_target = CreateTrigger(  )
    
    loop
        call TriggerRegisterPlayerUnitEvent(gg_trg_Lie_target, Player(index), EVENT_PLAYER_UNIT_ATTACKED, null)
        set index = index + 1
        exitwhen index == bj_MAX_PLAYER_SLOTS
    endloop

    call TriggerAddCondition( gg_trg_Lie_target, Condition( function Conditions ) )
    call TriggerAddAction( gg_trg_Lie_target, function Actions )
endfunction


На будущее советую ознакомиться с содержимым статьи.

Отредактировано alexkill, 15.03.2009 в 13:09.
Старый 15.03.2009, 12:45
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
function Actions takes nothing returns nothing
local group g = CreateGroup()
call GroupEnumUnitsInRect(g,bj_mapInitialPlayableArea,Filter(function Filt))
call ForGroup( g, function ActionsGroup )
call DestroyGroup(g)
set g = null
endfunction

неправильно, т.е. это - индусский код... я же совсем недавно все вроде обьяснял? куда вы сомтрели? ща линк дам

ADOLF добавил:
http://xgm.guru/forum/showthread.php?t=23226
Старый 15.03.2009, 12:57
alexkill

offline
Опыт: 18,872
Активность:
Кстати, во втором коде та же ошибка с событиями. Castiel, тебе же нужно при ударе здоровье восстанавливать?
ADOLF, я - индус. но все-таки исправил=)
Старый 15.03.2009, 13:13
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
ADOLF А в чём разница твоего кода от индусского кода?

У тебя юзается g как глобалка, поэтому её можно не обнулять?
Помоему толку мало, разве ток что... работа с глобалкой вроде упрощает работу триггеру

И у тебя юзаются x y вместо точки=)

ну можно сделать через точки...
Старый 15.03.2009, 14:22
J
expert
offline
Опыт: 48,447
Активность:
Ranger21 g глобалка, потому ее можно не создавать, не удалять не обнулять
функции с координатами работают быстрее функций на точках
ForGroup и фильтр обьеденены, будет 2 раза меньше проходовв по всем юнитам
в принцепе я согласен, там где это все отсутствует можно назвать говнокодеством
Старый 15.03.2009, 15:07
Ответ

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

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

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

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



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