Доброго времени суток. Хочу для начала обрисовать ситуацию. Я дал обычному пехотинцу две способности - цепь молний и рев. Обе не требуют маны. В чистом поле дал таких пехотинцев обычному компьютеру и нейтрально-враждебному. Оба игрока использовали цепь молний, но рев использовал только нейтрально-враждебный. Провел несколько тестов, есть способности, которые используют оба ИИ, но нейтрально-враждебный использует больше способностей. Как заставить обычного компа использовать так же легко те способности, которые использует нейтральный-враждебный?

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

Триггерно, по какому-то событию, например даже по тому примитивному юнит атакован, которое реагирует на замах, отдать приказ без цели "roar"
Скажем это захардкоренный ИИ на определённые, например если знаете ИИ кастует Stomp только если больше 3-4 юнитов, не помню сколько (рошан клепает до сих пор по такому рудиментному признаку), это все прописанно в движке вара, примитивный ИИ.
Ещё примеры, "berserk" кастуется только если есть атака и цель начинает убегать, иногда даже ии кастует сам способности типа канал, которые вообще пустышки сами по себе, или те же сетки, ИИ кастует, когда уровень хп опускается определённого минимума
Так что... не стоит надеется вообще на этот примитивный автоматический ИИ, и хотя бы подбить под самый примитивный триггер и всё будет ОК
`
ОЖИДАНИЕ РЕКЛАМЫ...
4
19
5 лет назад
4
Похожие вопросы:

ответ
nvc123:
Bornikkeny, сделал специально чтобы доказать тебе что ты несёшь бред
даже 2 скрина приложил
думаю закинуть библиотеки сможешь сам (в папку *твой jngp*\AdicHelper\lib)
Хорошо группы реализуешь как альтернативу unit[array]. Я тоже самое получил.
nvc123, и всё же твой хук не тот что мне нужен.
Я решил проблему, спасибо что дал идею обрабатывать движение внутри структуры, а не в стеке.
кот
library Hook initializer Init_Hook uses LibMath

globals
    mhook   ahook[100]
    integer ihook = -1
endglobals
    
struct mhook
        unit       host = null
        unit       target = null
        real       face = 0
        real       speed = 0
        real       dis = 0
        real       dismax = 0
        integer    chaini = 0
        unit       chain[50]
        real       scale = 0
        integer    move = 1
        integer    i = 0
		
		
        static method Create takes unit host, real tx, real ty, real scale returns mhook
        local mhook h = mhook.create()
        local integer i = GetPlayerId(GetOwningPlayer(host))
        local real x = GetUnitX(host)
        local real y = GetUnitY(host)
        local real f = GetAngleXY(x,y,tx,ty)
            set h.host = host
            set h.face = f
            set h.speed = 600
            set h.dismax = 1400
            set h.scale = scale
            set h.chain[0] = CreateUnit(Player(i),'h007',GetPolarX(GetUnitX(host),f,h.scale/2),GetPolarY(GetUnitY(host),f,h.scale/2),f)
            set h.i = i
            call UnitAddAbility(h.chain[0],'Amrf')
            call UnitAddAbility(h.chain[0],'Amrf')
            call SetUnitFlyHeight(h.chain[0],50,0)
            call SetUnitPathing(h.chain[0],false)
            return h
        endmethod
        
        method Start takes nothing returns boolean
            if ihook < 1000 then  
                set ihook = ihook + 1
                set ahook[ihook] = this
                return true
            else
                return false
            endif
        endmethod
        
        method Destroy takes nothing returns nothing
        local integer i = 0
            loop
            exitwhen i > ihook
                if ahook[i] == this then
                    set ahook[i] = ahook[ihook]
                    set ahook[ihook] = 0
                    set ihook = ihook - 1
                    set i = ihook // выход из цикла
                endif
            set i = i + 1
            endloop
            set this.target = null
            set this.host = null
            call this.destroy()
        endmethod
        
        method Move takes nothing returns nothing
        local integer i1 = 0
        local integer l = 0
        local real x
        local real y
        local real xh
        local real yh
        local real f
            if move == 1
                set dis = dis + speed*0.025
                loop
                 exitwhen i1 > .chaini
                    set x = GetUnitX(.chain[i1])
                    set y = GetUnitY(.chain[i1])
                    if i1 > 0 then
                        set f = GetAngleXY(x,y,GetUnitX(.chain[i1-1]),GetUnitY(.chain[i1-1]))
                        call SetUnitX(.chain[i1],GetPolarX(x,f,.speed*0.025))
                        call SetUnitY(.chain[i1],GetPolarY(y,f,.speed*0.025))
                    else    
                        set f = face
                        call SetUnitX(chain[i1],GetPolarX(x,f,.speed*0.025))
                        call SetUnitY(chain[i1],GetPolarY(y,f,.speed*0.025))
                    endif
                    call SetUnitFacing(chain[i1],f)
                 set i1 = i1 + 1
                endloop
                set x = GetUnitX(chain[chaini])
                set y = GetUnitY(chain[chaini])
                set f = GetAngleXY(GetUnitX(.host),GetUnitY(.host),x,y)
                set xh = GetPolarX(GetUnitX(.host),f,.scale/2)
                set yh = GetPolarY(GetUnitY(.host),f,.scale/2)
                //Create==================
                
                if GetDisXY(xh,yh,x,y) >= .scale/2 then
                    set chaini = chaini + 1
                    set chain[chaini] = CreateUnit(Player(.i),'h007',xh,yh,f)
                    call UnitAddAbility(.chain[.chaini],'Amrf')
                    call UnitAddAbility(.chain[.chaini],'Amrf')
                    call SetUnitFlyHeight(.chain[.chaini],50,0)
                endif
                if dis > dismax then
                    set move = 0
                endif
            else
                //REVERSE=============
                set xh = GetUnitX(host)
                set yh = GetUnitY(host)
                set chain[chaini+1] = host
                loop
                exitwhen l > chaini
                        set x = GetUnitX(chain[l])
                        set y = GetUnitY(chain[l])
                        //if chain[chaini] == null then
                        //    set f = GetAngleXY()
                        //endif
                        set f = GetAngleXY(x,y,GetUnitX(chain[l+1]),GetUnitY(chain[l+1]))
                        call SetUnitX(chain[l],GetPolarX(x,f,speed*0.025))
                        call SetUnitY(chain[l],GetPolarY(y,f,speed*0.025))
                        call SetUnitFacing(chain[l],f-180)
                set l = l + 1
                endloop
                //Destroy==================
                set x = GetUnitX(chain[chaini])
                set y = GetUnitY(chain[chaini])
                set xh = GetUnitX(host)
                set yh = GetUnitY(host)
                if GetDisXY(GetUnitX(chain[chaini]),GetUnitY(chain[chaini]),GetUnitX(host),GetUnitY(host)) < 100 then
                    call RemoveUnit(chain[chaini])
                    set chain[chaini] = null
                    set chaini = chaini - 1
                    if chaini == -1 then
                        call .Destroy()
                    endif
                endif
            endif
        endmethod
        
endstruct

private function Engine takes nothing returns nothing
local integer i = 0
local mhook h
local group g
local unit t 
    loop
    exitwhen i > ihook
        if ahook[i] != 0 then
            set h = ahook[i]
            //--run--//
            call h.Move()
        else
            set ahook[i] = ahook[ihook]
            set ahook[ihook] = 0
            set ihook = ihook - 1
            set i = i - 1 
        endif
    set i = i + 1
    endloop
    //call DestroyGroup(g)
    set g = null
    set t = null
endfunction

function Trig_HookC_Bool takes nothing returns boolean
    if GetSpellAbilityId() == 'A01D' then //Способность Мясной хук
        return true
    else
        return false
    endif
endfunction

function Trig_HookC_Actions takes nothing returns nothing
local mhook h
    set h = mhook.Create(GetSpellAbilityUnit(),GetSpellTargetX(),GetSpellTargetY(),110)
    call h.Start()
endfunction

function Init_Hook takes nothing returns nothing
local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddAction( t, function Trig_HookC_Actions )
    call TriggerAddCondition(t,function Trig_HookC_Bool)
    call TimerStart(CreateTimer(),0.025,true,function Engine)
endfunction

endlibrary
ответ
создать дамми с временем жизни
приказать заюзать скил
что тут можно не уметь?
ответ
Satanugushka,
Generic Unit Event - Юнит завершает применение способности
И положить надо в инвентарь triggering unit
ответ
А если создать дамми-юнитов каждого типа? Попробуй как-то так:
Триггер 1
Событие - Игрок выбрал юнита
Условие - Триггерный игрок не равен игроку-владельцу триггерного юнита
Действие:
Записать триггерного юнита в переменную из массива U[номер триггерного игрока];
сменить владельца юнита-дамми (можно через базу данных сделать и вычислять по типу выбранного юнита) на триггерного игрока;
выбрать юнита-дамми для триггерного игрока;
установить юниту-дамми Custom Value = номеру триггерного игрока
Триггер 2
Событие - Юнит получил приказ без цели
Условие - Custom Value триггерного юнита больше 0
Действие - Приказать юниту U[Custom Value триггерного юнита] выполнить приказ ("полученный приказ")
Триггер 3
Событие - Игрок отменяет выбор юнита
Условие - Custom Value триггерного юнита больше 0
Действие - Установить триггерному юниту Custom Value = 0
Ещё можно сделать дамми-юнитов зданиями с набором только тех способностей, которые можно активировать.
P.S. Есть один недостаток у этой системы - кулдаун способностей. Не знаю, как его синхронизировать. Разве что делать дамми для каждого конкретного юнита или использовать мемхак. Но если автор умеет его использовать, то это он мне советы давать должен, а не наоборот =)
ответ
Drulia_san, Ну да.
Добавляешь аурку - вот тебе баф на юните. Самый простой способ как по мне.
+Можно эффекты настроить, что вполне неплохо. Пока висит фейковый баф(наша аура) - на юните есть эффект.
Через дамми касты я пробовал, но долго+муторно+подключается дамми система = +лаги и местами утечки.
Насчёт таймаута - это уже по самим спеллам, я долго мучался чтобы оно всё работало как надо и не оверлапалось
Вот такой штукой у меня удаляется баф:
public function unitRemoveAbilityandBuffBY(unit u,integer dhv,integer mLv) returns boolean
	boolean b=UnitRemoveAbility(u,dhv)
  	UnitMakeAbilityPermanent(u,false,dhv)
  	UnitRemoveAbility(u,mLv)
	return b

1
32
5 лет назад
1
Триггерно, по какому-то событию, например даже по тому примитивному юнит атакован, которое реагирует на замах, отдать приказ без цели "roar"
Скажем это захардкоренный ИИ на определённые, например если знаете ИИ кастует Stomp только если больше 3-4 юнитов, не помню сколько (рошан клепает до сих пор по такому рудиментному признаку), это все прописанно в движке вара, примитивный ИИ.
Ещё примеры, "berserk" кастуется только если есть атака и цель начинает убегать, иногда даже ии кастует сам способности типа канал, которые вообще пустышки сами по себе, или те же сетки, ИИ кастует, когда уровень хп опускается определённого минимума
Так что... не стоит надеется вообще на этот примитивный автоматический ИИ, и хотя бы подбить под самый примитивный триггер и всё будет ОК
Принятый ответ
0
9
5 лет назад
0
Bergi_Bear:
Триггерно, по какому-то событию, например даже по тому примитивному юнит атакован, которое реагирует на замах, отдать приказ без цели "roar"
Скажем это захардкоренный ИИ на определённые, например если знаете ИИ кастует Stomp только если больше 3-4 юнитов, не помню сколько (рошан клепает до сих пор по такому рудиментному признаку), это все прописанно в движке вара, примитивный ИИ.
Ещё примеры, "berserk" кастуется только если есть атака и цель начинает убегать, иногда даже ии кастует сам способности типа канал, которые вообще пустышки сами по себе, или те же сетки, ИИ кастует, когда уровень хп опускается определённого минимума
Так что... не стоит надеется вообще на этот примитивный автоматический ИИ, и хотя бы подбить под самый примитивный триггер и всё будет ОК
Я не против такого "примитивного" ИИ, пусть использует способности как хочет, так даже лучше. Вопрос остается в силе, есть возможность этот ИИ подключить обычному компьютерному игроку 0-11?
0
32
5 лет назад
0
Возможно есть нормальные способы, но я никогда не копал в этой сфере, помню что работало так, если выполнить команду, начать сценарий поведение ИИ, того ИИ, который сделал в своём редакторе, да милишный, он должен быть пустыми, без замка и рабов, и тогда бот начнёт юзать спелы, как и враждебный.
Или
Просто в редакторе, через свойство игроков поставить не пустой слот а именно слот управления компьютером, тогда "примитивный" ИИ включится
Загруженные файлы
0
9
5 лет назад
0
Bergi_Bear:
Возможно есть нормальные способы, но я никогда не копал в этой сфере, помню что работало так, если выполнить команду, начать сценарий поведение ИИ, того ИИ, который сделал в своём редакторе, да милишный, он должен быть пустыми, без замка и рабов, и тогда бот начнёт юзать спелы, как и враждебный.
Или
Просто в редакторе, через свойство игроков поставить не пустой слот а именно слот управления компьютером, тогда "примитивный" ИИ включится
Оба варианта не помогли, нейтральный-враждебный все равно использует те способности, которые обычный ИИ не использует.
0
23
5 лет назад
0
он не работает если вы не запустите триггер для сражение. и заработае ИИ скилы. Так что триггерный ии придеться писать!
0
32
5 лет назад
0
Тогда вот, мой первый пост, тригеррыный по событию юнит атаковам, ИИ на таймере будет более ресурсоемким
0
9
5 лет назад
0
pro100master:
он не работает если вы не запустите триггер для сражение. и заработае ИИ скилы. Так что триггерный ии придеться писать!
Даже если запустить триггер сражения - все равно не используют. Видимо не получится никак запустить =(
0
22
5 лет назад
0
Можно попробовать написать *.ai скрипт пустышку, как для кампаний. В конце концов должен же был компьютер уметь использовать Рёв в кампании.
0
32
5 лет назад
Отредактирован Берги
0
Gyrofighter, только что вспомнил, на моей карте про сларков, босс медведь юзал рёв не триггерно, а у него нет ИИ, он просто выставлено на карте, как на том скрине что я прописал.
Так что смело можно заявить, что способность рёв юзается не только нейтрально враждебным (следовательно у вас какая-то проблема), возможно это ещё зависит каких то параметров в РО, например я брал сразу брал медведя, его копию и у него параметры медвядя, может это связано с уровнем или с какими то приоритетами, так что попробуйте сделать рычащего пехотинца из медведя, просто заменив ему модель, такой юнит точно закричит.
Кстати возможно ещё рев включается когда параметр атаки определённый или когда число союзников определённое, проверьте одинаковые ли все условия, а вообще 3 раз пишу:
Событие - юнит атакован
Условие - у атакованного есть абила, или атакованный является тем кто умеет рычать
Действие - юнит, отдать приказ без цели рёв Issueimmediateorder (u, "roar")
Чтобы оставить комментарий, пожалуйста, войдите на сайт.