Есть ли способ сделать триггерно юнита рандомно нанимающегося с разными моделями(выбранным) ? Типо нанимаешь его в казарме и он появляется то с моделью пехотинца , то бугая и т.д и т.п.
Либо сделать несколько иначе - нанимать юнита(пустышку) , который при окончании наёма триггерно заменялся бы на одного из нескольких юнитов с разными моделями ? Всё упирается в то , как сделать чтобы модели выбирались рандомно.(рандомно из нескольких выбранных моделей , а не всех моделей в игре).

UPD: Вот я ступил, можно отслеживать через приказ
call TriggerRegisterPlayerUnitEvent( gg_trg_New, Player(0), EVENT_PLAYER_UNIT_ISSUED_ORDER, null )
Просто отлавливаем общий приказ, в котором айди юнита, который мы нанимаем меняем в очереди, и воля. Ну и проверяем здание отдавшее сей приказ, то ли здание, которому нужно менять.
Вот полный пример:
globals
    constant integer barrack = 'hbar'
    constant integer footman = 'hfoo'
    constant integer footman_a = 'h000'
    constant integer footman_b = 'h001'
    constant integer footman_c = 'h002'
    constant integer footman_d = 'h003'
    constant integer footman_e = 'h004'
    
    integer array   RandomTrain
    
endglobals

function AssetTrains takes nothing returns nothing
    local player p = Player(0)
    
    call DestroyTimer(GetExpiredTimer())
    
    set RandomTrain[0] = footman 
    set RandomTrain[1] = footman_a
    set RandomTrain[2] = footman_b
    set RandomTrain[3] = footman_c
    set RandomTrain[4] = footman_d
    set RandomTrain[5] = footman_e
    
    call SetPlayerTechMaxAllowed( p, footman_a, 0 )
    call SetPlayerTechMaxAllowed( p, footman_b, 0 )
    call SetPlayerTechMaxAllowed( p, footman_c, 0 )
    call SetPlayerTechMaxAllowed( p, footman_d, 0 )
    call SetPlayerTechMaxAllowed( p, footman_e, 0 )
    
    set p = null
endfunction

function Trig_New_Actions takes nothing returns nothing
     local unit u = GetTriggerUnit()
     local integer id = GetIssuedOrderId()
     local player p = GetOwningPlayer(u)
     local integer newId = 0
     if GetUnitTypeId(u) == barrack then
        set newId = RandomTrain[GetRandomInt(0,5)]
            if newId != footman then
                call SetPlayerTechMaxAllowed( p, footman, 0 )
                call SetPlayerTechMaxAllowed( p, newId, -1 )
                call IssueImmediateOrderById( u, 851976 )
                call IssueImmediateOrderById( u, newId )
                call SetPlayerTechMaxAllowed( p, footman, -1 )
                call SetPlayerTechMaxAllowed( p, newId, 0 )
            endif
     endif
     
     set u = null
     set id = 0
     set p = null
     set newId = 0
endfunction


function InitTrig_New takes nothing returns nothing
    set gg_trg_New = CreateTrigger(  )
    call TimerStart( CreateTimer(), 1., false, function AssetTrains )
    // call AssetTrains()
    call TriggerAddAction( gg_trg_New, function Trig_New_Actions )
    call TriggerRegisterPlayerUnitEvent( gg_trg_New, Player(0), EVENT_PLAYER_UNIT_ISSUED_ORDER, null ) 
endfunction
Надеюсь, что ты наалисишься. Если будут зулусы в коде, дай знать.
Ну в общем, я сделал всё что мог, чтобы дать вам чёткий ответ.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
12
8gabriel8:
crusader556, а тебе, кстати, как нужно? При нажатии на кнопку найма появляется шкала тренировки со значком случайного юнита, либо конкретного, который будет, чтобы можно было отменить тренировку, за отмену тренировки можно сделать штраф, кстати. Либо вообще без шкалы тренировки, словно купил юнита в лагере наёмников?
Мне нужно чтобы было так - нанимаешь юнита в условной казарме(или любом другом здании нанимающем юнитов)(не мгновенно) и чтобы выбранный юнит имел разные модели - типо условный юнит типо воин и имеет модели бугая , пехотинца(и остальные модели юнитов ближнего боя)(не сложно найти аналогию для юнита дальника).
Проще говоря тот же пехотинец , только нанимаешь его и у него разные модели(хотя бы 5 моделек)(сойдет если делать через разных юнитов)(типо юнит даммик заменяется триггерно на одного из 5 выбранных юнитов)
29
crusader556, т.е. тебе нужно заменять уже нанимающегося юнита я так понял?
Нанял, а он уже другой. Кликнул по пехотинцу, а он уже бугай или страж ночных эльфов, но нанимается.
12
KingMaximax:
crusader556, т.е. тебе нужно заменять уже нанимающегося юнита я так понял?
Нанял, а он уже другой. Кликнул по пехотинцу, а он уже бугай или страж ночных эльфов, но нанимается.
Ну да , нанимаю юнита и идет вот что то такое -
событие
боевая единица входит в игровой мир
условие
триггерный юнит=Тот даммик которого нанимаю в казарме
Действие
удалить даммика
заменить его на одного из 5 рандомных(специально сделанных , не из нейтралов или уже сущевствующих) юнитов.

Самое сложное для меня будет замена даммика на одного из 5 рандом юнитов. Я не знаю как это сделать.
29
crusader556, это можно реализовать без даммика даже, только потребуется отменять или продолжать найм этого же.
Мы будет проверять с помощью GetTrainedUnitType(), а в самой казарме скроем 5 тех юнитов на найм, при помощи блокировки исследований, триггерно конечно же.
Для этого у нас есть реакция на событие:
TriggerRegisterPlayerUnitEvent( gg_trg_New, Player(0), EVENT_PLAYER_UNIT_TRAIN_START, null )
Далее, если нам выпал шанс, то мы временно блокируем Пехотинца, отменяем, разблокируем рандного другого и нанимаем. А если ничего не выпало на рандом, то оставляем как есть.
Однако, я с подобным вообще не возился, успех не гарантирован. Проблема возникает уже с очередью)
26
crusader556, проверь срабатывание триггерного найма заблокированных юнитов. Для этого сделай карту с казармой, фермой и триггером:
Событие: Инициализация карты
Действия: (тут действие на стартовое золото)
Игрок - Заблокировать для Игрока 1 Пехотница
Ждать 2 сек.
Боевая единица - Дать приказ Твоей_Казарме тренировать Пехотинца
29
UPD: Вот я ступил, можно отслеживать через приказ
call TriggerRegisterPlayerUnitEvent( gg_trg_New, Player(0), EVENT_PLAYER_UNIT_ISSUED_ORDER, null )
Просто отлавливаем общий приказ, в котором айди юнита, который мы нанимаем меняем в очереди, и воля. Ну и проверяем здание отдавшее сей приказ, то ли здание, которому нужно менять.
Вот полный пример:
globals
    constant integer barrack = 'hbar'
    constant integer footman = 'hfoo'
    constant integer footman_a = 'h000'
    constant integer footman_b = 'h001'
    constant integer footman_c = 'h002'
    constant integer footman_d = 'h003'
    constant integer footman_e = 'h004'
    
    integer array   RandomTrain
    
endglobals

function AssetTrains takes nothing returns nothing
    local player p = Player(0)
    
    call DestroyTimer(GetExpiredTimer())
    
    set RandomTrain[0] = footman 
    set RandomTrain[1] = footman_a
    set RandomTrain[2] = footman_b
    set RandomTrain[3] = footman_c
    set RandomTrain[4] = footman_d
    set RandomTrain[5] = footman_e
    
    call SetPlayerTechMaxAllowed( p, footman_a, 0 )
    call SetPlayerTechMaxAllowed( p, footman_b, 0 )
    call SetPlayerTechMaxAllowed( p, footman_c, 0 )
    call SetPlayerTechMaxAllowed( p, footman_d, 0 )
    call SetPlayerTechMaxAllowed( p, footman_e, 0 )
    
    set p = null
endfunction

function Trig_New_Actions takes nothing returns nothing
     local unit u = GetTriggerUnit()
     local integer id = GetIssuedOrderId()
     local player p = GetOwningPlayer(u)
     local integer newId = 0
     if GetUnitTypeId(u) == barrack then
        set newId = RandomTrain[GetRandomInt(0,5)]
            if newId != footman then
                call SetPlayerTechMaxAllowed( p, footman, 0 )
                call SetPlayerTechMaxAllowed( p, newId, -1 )
                call IssueImmediateOrderById( u, 851976 )
                call IssueImmediateOrderById( u, newId )
                call SetPlayerTechMaxAllowed( p, footman, -1 )
                call SetPlayerTechMaxAllowed( p, newId, 0 )
            endif
     endif
     
     set u = null
     set id = 0
     set p = null
     set newId = 0
endfunction


function InitTrig_New takes nothing returns nothing
    set gg_trg_New = CreateTrigger(  )
    call TimerStart( CreateTimer(), 1., false, function AssetTrains )
    // call AssetTrains()
    call TriggerAddAction( gg_trg_New, function Trig_New_Actions )
    call TriggerRegisterPlayerUnitEvent( gg_trg_New, Player(0), EVENT_PLAYER_UNIT_ISSUED_ORDER, null ) 
endfunction
Надеюсь, что ты наалисишься. Если будут зулусы в коде, дай знать.
Ну в общем, я сделал всё что мог, чтобы дать вам чёткий ответ.
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.