Гайд по написанию скриптов для гомункулусов
-
Вообще я так понял все что можно снимать с клиента - это расстояние до цели, хп/сп гома, его статус и тип цели, ее координаты?
Из этого много не наработаешь. =/ -
Состояние цели, список действующих лиц на экране, цель цели и т.д. Простор для фантазии. Вон, Рэмпэйдж АИ чего только не вытворяет...
-
Aiko Star, на счёт каста ничего не придумалось?
Ну или хотя бы способ определить не "моб атакует хозяина", а "моб идёт к хозяину, собираясь атаковать". На данный момент не для кача это не нужно, но всё же. -
LisandreL
Вариант "моб идет бить морду хозяину" легко делается. Показала бы на рэмпейдже, но там такое количество собственных типов данных и функций... ща из мираи утащу нужный кусок.[code:1smano8l]--------------------------------------------------
function GetEnemyOf(id) -- this function is not for PvP Modslocal result = 0 local actors = GetActors() local enemies = {} local index = 1 local target for i,v in ipairs(actors) do if (v ~= OwnerID and v ~= myid) then if (IsMonster(v) == 1) then if GetV(V_MOTION, v) ~= MOTION_DEAD then target = GetV(V_TARGET, v) if (target == id) then enemies[index] = v index = index + 1 end end end end end local min_dis = 100 local dis for i,v in ipairs(enemies) do dis = GetDistance2(MyID, v) if (dis < min_dis) then result = v min_dis = dis end end return result
end
[/code:1smano8l]Проверка на движение (уже от себя):
[code:1smano8l]
local mob_motion = GetV(V_MOTION, MobID)
if GetV(V_TARGET,MobID)==OwnerID then
if mob_motion == MOTION_MOVE then
бла-бла-бла
elseif mob_motion == MOTION_STAND then
бу-бу-бу
elseif mob_motion == MOTION_HIT and MyState ~= ATTACK_ST then -- кто-то другой бьет моба
бз-бз-бз
[/code:1smano8l] -
Состояние цели - что есть? Стуатусы на цели возвращает?
-
Состояние - это V_MOTION. Стоит, бьет, идет, кастует, etc. Все ж в гайде написано х_х
-
здравствуйте. скачала RampageAI и меня очень раздражает, что когда хим стоит гомункул нарезает вокруг него круги, а не стоит рядом. где это можно отменить, подскажите, пожалуйста? (у меня проблемы с анлийским, сама не разберусь
-
Понравился RampageAI. Модифицирую. Очень нехватало возможности задавать в настройках монстров при каком HP и SP их атаковать.
uncontrol
EnableIdleMove нужно выставить в false -
Наверное это сюда.
Кто-нибудь пишет продвинутый ИИ?
Или может быть кто-то составил документацию по Rampage AI? Очень бы пригодилась. -
Какую документацию? Там половина текста - комментарии, чуть ли не к каждой строчке есть свое объяснение О.о
Продвинутый АИ писать? После Ремпейджа?
-
:roll: Ничего непонял :roll: Разложите пожалуйста по полочкам,что скачать и что куда закидывать.Мне нужен результат чтобы гом далеко не убегал,и чтобы в агресивном режиме использовал скилы.Очень надеюсь на вашу помощ,сам несправлюсь,так как дубовый в этом деле. :roll:
-
Скажите пожалуйста как сделать(прописать) локмоб гомункулу?
п.с. я ботинок в скриптах >_>
-
+1 к Эмико.
Что и где именно надо прописать или скачать какой-то мод, чтобы ваниль начинал атаку со скилла? Использую Мирку, с рампэгом не разобралась (желающие помочь - вэлком в аську :oops: )
-
@"Zeno":
Наверное это сюда.Кто-нибудь пишет продвинутый ИИ?
Или может быть кто-то составил документацию по Rampage AI? Очень бы пригодилась.Я пишу, но пока работы на работе много.
-
Я тоже пишу. С программой настройки и поддержкой наемников. Взял за основу японский SyokaiAI - очень мне у них панель управления на js и html понравилась - и основательно его переделал. Панель управления перевел на русский.
Из каких-то реальных отличий от имеющихся MirAI, Rampage и AzzyAI - имею библиотеку нахождения пути волновым методом. Позволяет гому/мерку возвращаться к хозяину "из-за угла", когда напрямую пройти невозможно (качал гома на корабле). Правда, для серверов на базе Афинки это не очень актуально - на афинке гомы и без того отлично ходят. Но на корабле все-таки есть такие места, где гом может "заблудиться" без возможности возврата к хозяину, даже когда сервер Афинка, а не Aegis.
Сейчас пытаюсь, но никак не могу выкроить время, чтобы сделать поддержку умений для всех наемников. Пока только для мечника 1-2 лвл сделал.
Кстати, по поводу Rampage - в оригинальной RC6 были баги, включая приводящие к kill-steal'у. По ссылке <!-- m --><a class="postlink" href="http://code.google.com/p/rampageai/downloads/list">http://code.google.com/p/rampageai/downloads/list</a><!-- m --> можно скачать исправленную мной версию. Надо бы эту ссылку куда-нибуль закрепить.
А еще, раз уж тут такая тема открылась, хочу упомянуть библиотеку H.A.I.C.K. - Homunculus Artificial Intelligence Creation Kit ~by Sanctus of AsgardRO~.
Ссылка <!-- m --><a class="postlink" href="http://www.asgardro.com/forum/showthread.php?t=17543">http://www.asgardro.com/forum/showthread.php?t=17543</a><!-- m --> -
Euthanasia M_D_, ежели оно будет работать - памятник тебе при жизни. Вообще интересно было бы посмотреть (с волновым методом не знакома)
Честно - отлов багов в Rampage "на глаз" проводить довольно сложно, особенно не зная о них (а я вот не знала). Надо будет глянуть что ли на досуге, поинтересоваться.Что касается ХАЙКа... пролистала - в принципе, удобно, но ничего особо выдающегося. Плюс несколько стремно ето использовать, т.к. могут быть баги. Вообще мне как-то боязно чужими функциями пользоваться, не зная алгоритма. А сидеть, вычитывать и вникать в это... долго
В любом случае, спасибо за информацию, весьма интересно было узнать
-
Из начальной точки распространяем в 4 направлениях волну с шагом в одну клетку. Дальше из каждой точки фронта волны распространяем волну, и т.п. Путь всегда имеет одинаковую (уж не помню, минимальную ли) длину, жрет много памяти
-
Не, не много. Не больше любого другого.
У гома ж область видимости всего 29x29 клеток. Отойдет от хозяина на 15, и пропал.
А карту помнить при любом способе нужно - действительно, много памяти сожрет.
Я, правда, с картами заморачиваться не стал. У меня карт нет.
Я просто запоминаю только те клетки, по которым хоть однажды проходил гом или хим. Этого хватает, чтобы всегда уверенно возвращаться к химу из любой точки, где бы ни находился гом.
А, если потоптаться немного вокруг, то и успешно бегать "за угол" пинать моба.Т.е. я просто встаю в какое-нибудь место и через несколько минут гом, бегая к мобу и обратно уже имеет необходиое представление об окружающем ландшафте.
А после варпа/телепорта скрипт все равно перезапускается и память при этом освобождается. -
Не помню в какой именно теме, спрашивали, как заставить гомункола бежать перед хозяином на некотором удалении. Надеюсь не кто ни будет против, того, чтобы я разместил ответ здесь.
файл AI.lua
[code:1kssvco0]
...-- global variable
...
MyID = 0 -- id гомункула
MyOwnerID = 0 -- id хозяина
...
OwnerPos1X = 0 -- позиция по x в момен времени t1
OwnerPos1Y = 0 -- позиция по y в момен времени t1
OwnerPos1Tic = 0 -- время t1
OwnerPos2X = 0 -- позиция по x в момен времени t2
OwnerPos2Y = 0 -- позиция по y в момен времени t2
OwnerPos2Tic = 0 -- время t2
Move_Tic_Delai = 1000 -- задержка во времени для координат
DistOvertake = 4 -- дистанция опережения...
function OnFOLLOW_ST ()TraceAI ("OnFOLLOW_ST") -- Говорим, что мы в этом состоянии local ownerX, ownerY, myX, myY ownerX, ownerY = GetV (V_POSITION, MyOwnerID ) -- Запрашиваем позицию хозяина и ... myX, myY = GetV (V_POSITION,MyID) -- ... гомункула if(GetV (V_POSITION,MyIDOwner)== MOTION_MOVE and ((OwnerPos1X ~= OwnerPos2X) or (OwnerPos1Y ~= OwnerPos2Y))) then -- если хозяин двигается, и можно понять в каком направлении то .... local dx=(OwnerPos2X-OwnerPos1X) -- вычисляем примерное направление local dy=(OwnerPos2Y-OwnerPos1Y) if( OwnerPos2Tic < OwnerPos1Tic ) then -- проверяем какая из позиций последняя так как они меняются местами с интервалом в половину Move_Tic_Delai dx=(OwnerPos1X-OwnerPos2X) dy=(OwnerPos1Y-OwnerPos2Y) end local Nxy= math.sqrt(dx*dx+dy*dy) -- немного математической магии с векторами и нормалями dx=dx/Nxy dy=dx/Nxy move_to_x=ownerX+math.floor(dx*DistOvertake) -- в результате мы получам точку куда нужно двигатся чтобы обогнать хозяина move_to_y=ownerY+math.floor(dy*DistOvertake) OnMOVE_CMD(move_to_x,move_to_y) return end
...
end
...
function AI(myid)if (MyID ~= myid) then -- Если мы еще не занесли ID гомункула в глобальную переменную(тоесть скрипт только что запушен, и функция AI вызывается в первый раз), то ... MyID = myid -- ... заносим ее и ... MyOwnerID = GetV (V_OWNER,myid) -- ... тоже самое делаем с ID хозяина OwnerPos1Tic = GetTick () OwnerPos2Tic = OwnerPos1Tic + (Move_Tic_Delai/2) OwnerPos1X, OwnerPos1Y = GetV (V_POSITION, MyOwnerID) -- Запрашиваем позицию хозяина OwnerPos2X = OwnerPos1X OwnerPos2Y = OwnerPos1Y end
if ((OwnerPos1Tic + Move_Tic_Delai) < GetTick) then
OwnerPos1Tic = GetTick ()
OwnerPos1X, OwnerPos1Y = GetV (V_POSITION, MyOwnerID) -- Запрашиваем позицию хозяина
endif ((OwnerPos2Tic + Move_Tic_Delai) < GetTick) then OwnerPos2Tic = GetTick () OwnerPos2X, OwnerPos2Y = GetV (V_POSITION, MyOwnerID) -- Запрашиваем позицию хозяина end
...
end
...[/code:1kssvco0]
На данный момент я не являюсь счастливым обладателем гомункула :oops: , в следствии чего приведенный выше код не прошел тестирования в боевых условиях и возможно содержит ошибки :oops: . Если кто отважится проверить данный код прошу отписаться здесь или в личку.
-
Что-то подобное обдумывала давно-давно еще, но решила, что на поворотах хомяка будет заносить (в буквальном смысле), поэтому забила.
На глаз вроде ошибок нету Надо бы проверить в игре.