Приветствую, интересует один вопрос по-поводу триггеров.
(Данный триггер был сделан в ZemliBoga, но как мы знаем, открытых исходников нету в доступе)
Ближе к делу, у меня есть способность по концепту которой при использовании на любое здание - мгновенно завершает его строительство / обновление / исследования / обучение юнитов.
Но последние два: "исследования / обучение юнитов" я не смог реализовать.
Если кто-то знает решение, можете пожалуйста мне помочь с этим.

В общем, для начала нужно создать 4-и триггера.
Abilitie P1 и Abilitie P1Unit должны быть изначально неактивными.
Также не забываем про переменные:

  1. Переходим к триггерам, зайдите в Abilitie P1WakeUp, и заполните триггер:
У вас будет своя способность, возможно не завершение как у меня.
  1. Переходим к следующему триггеру Abilitie P1Creation, здесь уже идёт Jass:
'A00B' ID вашей способности
function Trig_Abilitie_P1Creation_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A00B' ) ) then
        return false
    endif
    return true
endfunction

function Trig_Abilitie_P1Creation_Actions takes nothing returns nothing
    set udg_p1target_unit = GetSpellTargetUnit()
    set udg_p1target_player = GetOwningPlayer(GetSpellTargetUnit())
    set udg_p1gold = GetPlayerState(udg_p1target_player, PLAYER_STATE_RESOURCE_GOLD)
    set udg_p1timber = GetPlayerState(udg_p1target_player, PLAYER_STATE_RESOURCE_LUMBER)
    set udg_p1tech = GetPlayerTechCountSimple(udg_tech, GetOwningPlayer(GetSpellTargetUnit()))

    call TriggerExecute( gg_trg_Abilitie_P1WakeUp )
    call IssueImmediateOrderById(udg_p1target_unit, 851976)
    call TriggerExecute( gg_trg_Abilitie_P1WakeUp )
    call IssueImmediateOrderById(udg_p1target_unit, 851976)
    call TriggerExecute( gg_trg_Abilitie_P1WakeUp )
    call IssueImmediateOrderById(udg_p1target_unit, 851976)
    call TriggerExecute( gg_trg_Abilitie_P1WakeUp )
    call IssueImmediateOrderById(udg_p1target_unit, 851976)
    call TriggerExecute( gg_trg_Abilitie_P1WakeUp )
    call IssueImmediateOrderById(udg_p1target_unit, 851976)
    call TriggerExecute( gg_trg_Abilitie_P1WakeUp )
    call IssueImmediateOrderById(udg_p1target_unit, 851976)
    call TriggerExecute( gg_trg_Abilitie_P1WakeUp )
    call IssueImmediateOrderById(udg_p1target_unit, 851976)

    call SetPlayerStateBJ( GetTriggerPlayer(), PLAYER_STATE_RESOURCE_GOLD, udg_p1gold )
    call SetPlayerStateBJ( GetTriggerPlayer(), PLAYER_STATE_RESOURCE_LUMBER, udg_p1timber )
endfunction

//===========================================================================
function InitTrig_Abilitie_P1Creation takes nothing returns nothing
    set gg_trg_Abilitie_P1Creation = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Abilitie_P1Creation, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_Abilitie_P1Creation, Condition( function Trig_Abilitie_P1Creation_Conditions ) )
    call TriggerAddAction( gg_trg_Abilitie_P1Creation, function Trig_Abilitie_P1Creation_Actions )
endfunction
  1. Переходим к следующему триггеру Abilitie P1:
  1. И последний триггер Abilitie P1Unit, самый лёгкий:
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
26
Зданию можно выставить текущий % прогресса.
Ставишь на 100% и готово.
1
Extremator, Про это я знаю, но это не то
Требуется чтобы после использования способности по зданию, то что исследует здание: "исследования / обучение юнитов" были завершены
1
В общем, немного поразмыслив с другом, вышли на Jass. Но пока не все так радужно.

Jass:
function Cast_Proc takes nothing returns nothing
    local unit u = GetSpellTargetUnit()
    local player p = GetOwningPlayer(u)
    local integer g
    local integer w

    call UnitSetConstructionProgress( u, 100 )
    call UnitSetUpgradeProgress( u, 100 )

    set g = GetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD)
    set w = GetPlayerState(p, PLAYER_STATE_RESOURCE_LUMBER)
    set udg_activated_restore = true

    call IssueImmediateOrderById(u, 851976)

    call SetPlayerStateBJ( p, PLAYER_STATE_RESOURCE_GOLD, g )
    call SetPlayerStateBJ( p, PLAYER_STATE_RESOURCE_LUMBER, w )
endfunction

function Cast_Condition takes nothing returns boolean
    return GetSpellAbilityId() == udg_ability_restore
endfunction

//===========================================================================
function InitTrig_Cast takes nothing returns nothing
    set gg_trg_Cast = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ(gg_trg_Cast, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(gg_trg_Cast, Condition(function Cast_Condition))
    call TriggerAddAction( gg_trg_Cast, function Cast_Proc )
endfunction
function CancelOrder takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local integer uid= GetTrainedUnitType()
    local integer rid= GetResearched()
    local unit su

    if uid > 0 then
        set su=CreateUnit(GetOwningPlayer(u), uid, GetWidgetX(u), GetWidgetY(u), bj_UNIT_FACING)
        call IssuePointOrderByIdLoc(su, 851986, GetUnitRallyPoint(u))
    elseif rid > 0 then
        call SetPlayerTechResearched(GetOwningPlayer(u), rid, GetPlayerTechCount(GetOwningPlayer(u), rid, true) + 1)
    endif
    set udg_activated_restore = false
endfunction

function RestokeCheck takes nothing returns boolean
    return udg_activated_restore
endfunction

//===========================================================================
function InitTrig_CancelOrder takes nothing returns nothing
    set gg_trg_CancelOrder = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ(gg_trg_CancelOrder, EVENT_PLAYER_UNIT_UPGRADE_CANCEL)
    call TriggerRegisterAnyUnitEventBJ(gg_trg_CancelOrder, EVENT_PLAYER_UNIT_RESEARCH_CANCEL)
    call TriggerRegisterAnyUnitEventBJ(gg_trg_CancelOrder, EVENT_PLAYER_UNIT_TRAIN_CANCEL)
    call TriggerAddCondition(gg_trg_CancelOrder, Condition(function RestokeCheck))
    call TriggerAddAction( gg_trg_CancelOrder, function CancelOrder )
endfunction
1
В общем, для начала нужно создать 4-и триггера.
Abilitie P1 и Abilitie P1Unit должны быть изначально неактивными.
Также не забываем про переменные:

  1. Переходим к триггерам, зайдите в Abilitie P1WakeUp, и заполните триггер:
У вас будет своя способность, возможно не завершение как у меня.
  1. Переходим к следующему триггеру Abilitie P1Creation, здесь уже идёт Jass:
'A00B' ID вашей способности
function Trig_Abilitie_P1Creation_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A00B' ) ) then
        return false
    endif
    return true
endfunction

function Trig_Abilitie_P1Creation_Actions takes nothing returns nothing
    set udg_p1target_unit = GetSpellTargetUnit()
    set udg_p1target_player = GetOwningPlayer(GetSpellTargetUnit())
    set udg_p1gold = GetPlayerState(udg_p1target_player, PLAYER_STATE_RESOURCE_GOLD)
    set udg_p1timber = GetPlayerState(udg_p1target_player, PLAYER_STATE_RESOURCE_LUMBER)
    set udg_p1tech = GetPlayerTechCountSimple(udg_tech, GetOwningPlayer(GetSpellTargetUnit()))

    call TriggerExecute( gg_trg_Abilitie_P1WakeUp )
    call IssueImmediateOrderById(udg_p1target_unit, 851976)
    call TriggerExecute( gg_trg_Abilitie_P1WakeUp )
    call IssueImmediateOrderById(udg_p1target_unit, 851976)
    call TriggerExecute( gg_trg_Abilitie_P1WakeUp )
    call IssueImmediateOrderById(udg_p1target_unit, 851976)
    call TriggerExecute( gg_trg_Abilitie_P1WakeUp )
    call IssueImmediateOrderById(udg_p1target_unit, 851976)
    call TriggerExecute( gg_trg_Abilitie_P1WakeUp )
    call IssueImmediateOrderById(udg_p1target_unit, 851976)
    call TriggerExecute( gg_trg_Abilitie_P1WakeUp )
    call IssueImmediateOrderById(udg_p1target_unit, 851976)
    call TriggerExecute( gg_trg_Abilitie_P1WakeUp )
    call IssueImmediateOrderById(udg_p1target_unit, 851976)

    call SetPlayerStateBJ( GetTriggerPlayer(), PLAYER_STATE_RESOURCE_GOLD, udg_p1gold )
    call SetPlayerStateBJ( GetTriggerPlayer(), PLAYER_STATE_RESOURCE_LUMBER, udg_p1timber )
endfunction

//===========================================================================
function InitTrig_Abilitie_P1Creation takes nothing returns nothing
    set gg_trg_Abilitie_P1Creation = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Abilitie_P1Creation, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_Abilitie_P1Creation, Condition( function Trig_Abilitie_P1Creation_Conditions ) )
    call TriggerAddAction( gg_trg_Abilitie_P1Creation, function Trig_Abilitie_P1Creation_Actions )
endfunction
  1. Переходим к следующему триггеру Abilitie P1:
  1. И последний триггер Abilitie P1Unit, самый лёгкий:
Принятый ответ
26
Extremator, Про это я знаю, но это не то
Требуется чтобы после использования способности по зданию, то что исследует здание: "исследования / обучение юнитов" были завершены
Так а в чём проблема на основе этого действия в течении 1й секунды постоянно финишировать все процессы у здания? а лучше - завести счётчик на 7-8 срабатываний и сделать их по завершению грейда/обучения.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.