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

Принятый ответ

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
Надеюсь, что ты наалисишься. Если будут зулусы в коде, дай знать.
Ну в общем, я сделал всё что мог, чтобы дать вам чёткий ответ.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
6 лет назад
0
Похожие вопросы:

ответ
Есть способность "Тёмный", если дать её юниту, то он заменится на юнит указанный в способности.У такого варианта наименьшее число неудобств.
ответ
Через триггеры и способности. Дать спосбность морфа и приказать ее использовать. Предварительно создать новую альтернативную единицу с другой моделью
Для героев:
Перевоплощение - Иллидан
Превратиться в кибергоблина (Проверено - работает)
ответ
В программе War3ModelEditor можно автоматически рассчитать границы. Но перед этим нужно вывести хотя бы одну точку на необходимое расстояние.
После чего точку можно удалить.
ответ
Nelloy, если найдёт где в памяти хранится модель после чего сам создаст модель из файла и заменит модель юнита на новую то можно
Pergin, гугли memory hack war3
это сложно и требует от тебя больших знаний в джасс и понимания работы движка игры
без этого даже не пытайся
либо делай через морф
как морфить одного юнита в другого написано в статьях
ответ
  1. Хорошая модель должна иметь минимальное необходимое количество полигонов. Что будет если заспавнить много юнитов можешь проверить и сам.
  1. 8 Мб - лимит для патчей до версии 1.26. В последнем патче карта может весить 100+ Мб. О скорости скачивания ничего не могу сказать.

0
29
6 лет назад
Отредактирован Волчачка
0
Просто сделай найм даммика, при этом создай несколько версий этого юнита с разными моделями.
Забей типы в массив, и триггерно создавай случайно при помощи RandomInt в позиции дамика, сам дамик после сего - удаляй.
Или жди новый патч, в котором добавят функцию по смене моделей для объекта.
2
4
6 лет назад
Отредактирован Alexander122
2
Есть функция в гуи ReplaceUnit (мгновенно заменяет текущий тип юнита на другой). И событие, которое реагирует на то, что юнит натренился в казарме и вышел.
Кинг выше сказал про массив. По сути твой триггер прост, как Hellо, world.
Событие: юнит натренировался
Условие: Натренированный юнит = нужный тебе тип юнита
Действия:
*Рекомендую заранее заполнить массив*
Делаешь Реплейс нашего юнита на элемент массива с индексом от 0 (или 1, как больше нравится) до макс значения.
0
32
6 лет назад
0
морфить даммика. или просто спаунить триггерно юнита.
назначить одному юниту несколько моделей можно только через анимации этой модели - как это сделано у башен альянса
1
32
6 лет назад
1
Alexander122, реплейс совершенно ненужен, просто создавай случайного юнита при найме даммика. Все возможные случайные юниты нужно будет сделать в редакторе обьектов за ранее чтобы было из чего выбирать, так же есть функция которая выбирает вертен тип случайного нейтрального крипа для подходящей местности с заданым уровнем, может быть полезно.
2
12
6 лет назад
2
quq_CCCP:
Alexander122, реплейс совершенно ненужен, просто создавай случайного юнита при найме даммика. Все возможные случайные юниты нужно будет сделать в редакторе обьектов за ранее чтобы было из чего выбирать, так же есть функция которая выбирает вертен тип случайного нейтрального крипа для подходящей местности с заданым уровнем, может быть полезно.
Можешь подробнее описать триггер ?
0
26
6 лет назад
0
crusader556, а тебе, кстати, как нужно? При нажатии на кнопку найма появляется шкала тренировки со значком случайного юнита, либо конкретного, который будет, чтобы можно было отменить тренировку, за отмену тренировки можно сделать штраф, кстати. Либо вообще без шкалы тренировки, словно купил юнита в лагере наёмников?
2
12
6 лет назад
2
8gabriel8:
crusader556, а тебе, кстати, как нужно? При нажатии на кнопку найма появляется шкала тренировки со значком случайного юнита, либо конкретного, который будет, чтобы можно было отменить тренировку, за отмену тренировки можно сделать штраф, кстати. Либо вообще без шкалы тренировки, словно купил юнита в лагере наёмников?
Мне нужно чтобы было так - нанимаешь юнита в условной казарме(или любом другом здании нанимающем юнитов)(не мгновенно) и чтобы выбранный юнит имел разные модели - типо условный юнит типо воин и имеет модели бугая , пехотинца(и остальные модели юнитов ближнего боя)(не сложно найти аналогию для юнита дальника).
Проще говоря тот же пехотинец , только нанимаешь его и у него разные модели(хотя бы 5 моделек)(сойдет если делать через разных юнитов)(типо юнит даммик заменяется триггерно на одного из 5 выбранных юнитов)
0
29
6 лет назад
0
crusader556, т.е. тебе нужно заменять уже нанимающегося юнита я так понял?
Нанял, а он уже другой. Кликнул по пехотинцу, а он уже бугай или страж ночных эльфов, но нанимается.
2
12
6 лет назад
Отредактирован crusader556
2
KingMaximax:
crusader556, т.е. тебе нужно заменять уже нанимающегося юнита я так понял?
Нанял, а он уже другой. Кликнул по пехотинцу, а он уже бугай или страж ночных эльфов, но нанимается.
Ну да , нанимаю юнита и идет вот что то такое -
событие
боевая единица входит в игровой мир
условие
триггерный юнит=Тот даммик которого нанимаю в казарме
Действие
удалить даммика
заменить его на одного из 5 рандомных(специально сделанных , не из нейтралов или уже сущевствующих) юнитов.

Самое сложное для меня будет замена даммика на одного из 5 рандом юнитов. Я не знаю как это сделать.
0
29
6 лет назад
Отредактирован Волчачка
0
crusader556, это можно реализовать без даммика даже, только потребуется отменять или продолжать найм этого же.
Мы будет проверять с помощью GetTrainedUnitType(), а в самой казарме скроем 5 тех юнитов на найм, при помощи блокировки исследований, триггерно конечно же.
Для этого у нас есть реакция на событие:
TriggerRegisterPlayerUnitEvent( gg_trg_New, Player(0), EVENT_PLAYER_UNIT_TRAIN_START, null )
Далее, если нам выпал шанс, то мы временно блокируем Пехотинца, отменяем, разблокируем рандного другого и нанимаем. А если ничего не выпало на рандом, то оставляем как есть.
Однако, я с подобным вообще не возился, успех не гарантирован. Проблема возникает уже с очередью)
2
26
6 лет назад
2
crusader556, проверь срабатывание триггерного найма заблокированных юнитов. Для этого сделай карту с казармой, фермой и триггером:
Событие: Инициализация карты
Действия: (тут действие на стартовое золото)
Игрок - Заблокировать для Игрока 1 Пехотница
Ждать 2 сек.
Боевая единица - Дать приказ Твоей_Казарме тренировать Пехотинца
2
29
6 лет назад
Отредактирован Волчачка
2
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
Надеюсь, что ты наалисишься. Если будут зулусы в коде, дай знать.
Ну в общем, я сделал всё что мог, чтобы дать вам чёткий ответ.
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.