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

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

Ответ
 
Daemonik

offline
Опыт: 5,084
Активность:
Юнит-оруженосец.
От меня требуется создать юнита, который будет ходить вслед за героем и носить вещи (для РПГ)
Юнит есть. За героем по всюду следует. Но вещи корректно не может поднимать.
Вот мой триггер следования.
Код:
function Trig_stash_Conditions takes nothing returns boolean
    return IsUnitType(udg_unit1, UNIT_TYPE_HERO) == (GetUnitState(udg_unit2,UNIT_STATE_LIFE) >=0)
endfunction

function Trig_stash_Actions takes nothing returns nothing
    call IssueTargetOrder( udg_unit2, "move", udg_unit1 )
endfunction

//===========================================================================
function InitTrig_stash takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterTimerEvent( gg_trg_stash, 0.05, true )
    call TriggerAddCondition( t, Condition( function Trig_stash_Conditions ) )
    call TriggerAddAction( t, function Trig_stash_Actions )
    set t = null
endfunction

Вот этим пытаюсь заставить его поднимать вещи, и возвращаться герою
Код:
function Trig_stash2_Conditions takes nothing returns boolean
    return GetUnitTypeId(GetTriggerUnit()) == 'h000' 
endfunction

function Trig_stash2_Actions takes nothing returns nothing
    local integer i = 0
    local integer tmp = 852007
    local unit u =GetTriggerUnit()
    local item it = GetOrderTargetItem()
    local real dx = GetUnitX(u) - GetItemX(it)
    local real dy = GetUnitY(u) - GetItemY(it)
    call DisableTrigger( gg_trg_stash )
    loop
        exitwhen i > 5
        if ( UnitItemInSlot( u, i) == it) then
            set tmp = tmp + i
            set i = 6
        endif
        set i = i + 1
    endloop
    call IssueImmediateOrderById( u, tmp)
    call TriggerSleepAction( ( SquareRoot(dx * dx + dy * dy) / 522.00 ) )
    call EnableTrigger( gg_trg_stash )
endfunction

//===========================================================================
function InitTrig_stash2 takes nothing returns nothing
    local integer i = 0
    local trigger t = CreateTrigger()
    loop
        call TriggerRegisterPlayerUnitEvent( gg_trg_stash2, Player(i), EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER, null )
        set i = i + 1
        exitwhen i == bj_MAX_PLAYER_SLOTS
    endloop
    set i = 0
    call TriggerAddCondition( t, Condition( function Trig_stash2_Conditions ) )
    call TriggerAddAction( t, function Trig_stash2_Actions )
    set t = null
endfunction

Вы уж строго не судите. В JASS'e да и вообще в WE сижу чуть больше 2 недель.
Старый 30.06.2009, 16:55
SRes
1110101000
offline
Опыт: 9,997
Активность:
Daemonik,
Код:
...
function InitTrig_stash takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterTimerEvent( gg_trg_stash, 0.5, true )
    call TriggerAddCondition( t, Condition( function Trig_stash_Conditions ) )
    call TriggerAddAction( t, function Trig_stash_Actions )
    set t = null
endfunction

Попробуй изменить период, ибо за 0.05 сек врядли юнит успеет взять предмет.
Старый 30.06.2009, 17:12
ComotozNick
Активность: 666
offline
Опыт: 26,206
Активность:
Объясни плз несколько получше. Как ты хочешь чтобы юнит подбирал айтемы? - тупо видел айтем рядом и подбирал, или когда гер на него клацает, подходил подбирал? Или как вообе, я не понял прост.
К тому же попробуй, на время поднятия айтема отключать триггер следования, а потом включать.
Старый 30.06.2009, 17:14
Daemonik

offline
Опыт: 5,084
Активность:
Я ставил даже 2 секунды. И юнит довольно далеко отходит, но...
Я хочу что бы при приказе подобрать предмет юнит побирал его, и возвращался
Во втором коде у меня перед действие и после него стоят функции
Код:
call DisableTrigger( gg_trg_stash )
...
call EnableTrigger( gg_trg_stash )

Не помогает(

Вот у меня есть юнит. Он постоянно бегает за героем.
Но вот я захотел взять итем. Выбираю юнита и клацаю на итем. Юнит должен взять итем, вернуться и продолжить бегать за героем.
Старый 30.06.2009, 17:16
ComotozNick
Активность: 666
offline
Опыт: 26,206
Активность:
Не пробовал использовать вместо "move" патроль? если скомандовать юниту патрулировать указав целью дружественного юнита, то он будет за ним шлятся - отпадет надобность в переодическом таймере.
Старый 30.06.2009, 17:23
SRes
1110101000
offline
Опыт: 9,997
Активность:
Код:
local integer i = 0
    local integer tmp = 852007
    local unit u =GetTriggerUnit()
    local item it = GetOrderTargetItem()
    //local real dx = GetUnitX(u) - GetItemX(it) зачем это все?
    //local real dy = GetUnitY(u) - GetItemY(it)
    loop
        exitwhen i > 5
        if ( UnitItemInSlot( u, i) == it) then
            set tmp = tmp + i
            set i = 6
        endif
        set i = i + 1
    endloop
    if ( tmp != 852007) then
        call IssueImmediateOrderById( u, tmp)
    endif
    call IssueTargetOrder( помощник, "smart", владелец)
    //call TriggerSleepAction( ( SquareRoot(dx * dx + dy * dy) / 522.00 ) ) Зачем это ?

Попробуй так, а таймер поставь что-то около 10, в ТБР к примеру так и сделано.
Старый 30.06.2009, 17:25
Daemonik

offline
Опыт: 5,084
Активность:
call IssueTargetOrder( помощник, "smart", владелец)
Немного не понял как это владелец?
Старый 30.06.2009, 17:27
SRes
1110101000
offline
Опыт: 9,997
Активность:
Н-да, ну логично что тот за кем надо следовать твоему "оруженосцу".
Мб собьется приказ юзать предмет, если что - поставь тригерслип на 0.1 сек :)
Старый 30.06.2009, 17:28
Daemonik

offline
Опыт: 5,084
Активность:
SRes не хочет.
Может событие другое надо?
ComotozNick Спасибо так и сделал.
Действительно отпала необходимость в периоде.
Старый 30.06.2009, 17:43
SRes
1110101000
offline
Опыт: 9,997
Активность:
Дебаг + брутфорс всех возможных вариантов исполнения того что тебе надо, это тебе должно помочь.
Старый 30.06.2009, 17:45
Daemonik

offline
Опыт: 5,084
Активность:
А можно с этого места поподробней??
Старый 30.06.2009, 17:56
ComotozNick
Активность: 666
offline
Опыт: 26,206
Активность:
Как вариант. Как только герой получает оруженосца - даем оруженосцу команду следовать за героем. 1 раз. Потом допустим нам надо подобрать айтем, - игрок направляет оруженосца подобрать айтем. Как только оружносец подбирает айтем, снова приказываем ему дальше следовтаь за героем. + Еще можно сделать проверку, какой приказ получает оруженосец, дабы случайным образом он не отвязался.
Старый 30.06.2009, 18:03
Daemonik

offline
Опыт: 5,084
Активность:
Ааа мысль!!
Спасибо ComotozNick.
Я узнаю сколько было итемов у юнита. Если кол-во увеличилось то я приказываю следовать.
И в событиях период ставлю.
Как думаете пройдет такое??
Старый 30.06.2009, 18:12
Ответ

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

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

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

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



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