Гайд по написанию скриптов для гомункулусов
-
Я тоже пишу. С программой настройки и поддержкой наемников. Взял за основу японский 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: . Если кто отважится проверить данный код прошу отписаться здесь или в личку.
-
Что-то подобное обдумывала давно-давно еще, но решила, что на поворотах хомяка будет заносить (в буквальном смысле), поэтому забила.
На глаз вроде ошибок нету Надо бы проверить в игре. -
@"Aiko-Star":
Что-то подобное обдумывала давно-давно еще, но решила, что на поворотах хомяка будет заносить (в буквальном смысле), поэтому забила....
Да на поворотах действительно будет заносить, уменьшить занос можно правильно подобрав задержку между точками (Move_Tic_Delai в моем случае), безболезненно можно снизить до 750, но ниже 500 снижать не стоит, ибо гом начнет шарахаться по сторонам.
Можно конечно поглумится со сплайнами, чтобы гомункула не заносило и контрольные точки выбирать не по времени а по расстоянию между ними. -
Проблема с Ванилькой. Бьёт мобов автокастами болтов и хиляет всех подряд(тратя на это большую часть СП) как и где можно отключить использование этого скила? Если можно поподробнее обьясните.
-
Для подобных вопросов есть прилепленный топик.
Какой AI используется? -
"Обсуждение гомункулусов, их билдов и способов кача" - этот? Просто мне кажется вопрос больше про скрипт чем о болде и способе кача.
Рампеч.
До него стоял Мир и такой проблемы не было, зато была другая: Гом бьёт моба, хим отходит на несколько клеток и гом бросает бить и бежит за хамом. Добегает до него и возвращается к мобу. Как это исправить? -
НовоХудоНосов, в папке Conf есть файл Config.lua, открываем его любым текстовым редактором и ищем следующее:
[code:3dd5de1b]--[[ Allow any automatic casting of skills
NOTE: This will disable *all* homunculus skill usage if set to false
--]]
AllowSkills = true-- Manual targetting of skills causes target to become enemy
SkillsCauseAttack = false-- Do not use skills if SP will be lower this amount/percent after skill
MinSP = 0[/code:3dd5de1b]
AllowSkills = false отключит все автокасты скилов (хотя сомневаюсь что это цель) MinSP задается в процентах и определяет при каком минимальном сп скилы перестают кастоваться
далее MinAttackSkillLevel определяет минимальный лев атаковых скилов.Далее внизу есть переменная ChaoticBlessingsHomunHP задающее ХП гома в процентах при котором он пробует лечиться и ChaoticBlessingsOwnerHP то же самое с владельцем. (где-то там я предполагаю косяк, цифры выше 100 я думаю)
Как задать индивидуальный каст болтов для каждого отдельного моба смотрим в файле Monsters.lua, ID моба можно взять у вротмесервера и во многих других базах (проблему с болтами не понял, поэтому точнее сказать сложно).
З.ы. Качать МирАИ влом но там есть 100% настройка с какого расстояния гом начинает следовать за хозяином (как и в Rampage) с ней стоит поиграться.
-
В моторовской википедии, натолкнулся на следующее:
[code:1rytx1kj]
Можно прописывать в AI:
Автокаст Potion Pitcher по гомункулу
Автокаст Cart Revolution по целям гомункула
Автокаст болтов от Fireblend/Ice Falchion по целям гомункула
Автовоскрешение гомункула
Нельзя прописать в AI:
Автокормление
Автолут
Автокаст площадных магий
Передвижение алхимика
Передвижение гомункула вне поля видимости алхимика
Любые программы, которые содержат запрещенные команды будут считаться ботами!
[/code:1rytx1kj]
Из этого получается, что можно научить гомункула быть водилкой для своего хозяина, и соответственно можно не сильно напрягаться по поводу прокачки джобы (если время не критично).
Или просто забыли исправить, после того как запретили управление любыми действиями хозяина. -
Можно прописать. Но здесь это никогда не работало, не работает и работать не будет.
-
@"Zeno":
Можно прописать. Но здесь это никогда не работало, не работает и работать не будет.
Ясненько. Просто я удивился прочитав подобное в викепедии. -
Официальным фиксом за какой-то-там эпизод была отмена возможности использовать скиллы хима через скрипты. Так что увы.
-
Aiko Star
Думаю стоит собрать все ваши гайды в первых сообщениях, а в теме продолжать обсуждения разных АИ.А можно как нибуть отслеживать нажатия клавишь на клаве? Котрл+Т как-то же переводит в разные режимы поведения.
Кстати кто-нибуть использовал RampageAI в пвп/арене? моба не глючит? "Друзья" работают?
Используя RampageAI, когда хим сидит, хома не пускает болты, с чем это связано? -
тут был чужой даблпост.
HumanZ, в смысле "все мои гайды"? Это один гайд, он просто на несколько глав разбит.
Control+t - системная команда (прописана в клиенте), поэтому и отлавливается. Никакие другие клавиши легальными способами скриптом не обнаруживаются.
-
Это связано с тем, что так написан ИИ. Вы можете поискать где проверяются состояния и пускаются болты и переписать там, чтобы сидя пускались.
-
Как добавочка для любителей покастовать сидя.
файл battle.luaДанный кусок кода отвечает за это.
[code:2qkeagz8]
-- If our owner is sitting, we can't cast //anything//
if GetV(V_MOTION,OwnerID) == MOTION_SIT then
-- Nope, no can do
return false
end[/code:2qkeagz8]Далее можно фантазировать.... Например снести данный кусок нафиг, ну или к примеру заменить на:
[code:2qkeagz8]
-- If our owner is sitting, use SittingSkill variable to determine if skill usage is allowed or not
if GetV(V_MOTION,OwnerID) == MOTION_SIT and SittingSkill == false then
-- Nope, no can do
return false
end[/code:2qkeagz8]и добавить в файл Conf/Config.lua
[code:2qkeagz8]-- Should our Homunculus use skills while its owner is sitting? true for "yes", false for "no"
SittingSkill = true[/code:2qkeagz8]Ну или придумать что-то более экзотичное.
Не забываем про бэкапы файлов перед внесением изменений, не забываем, что я не гарантирую отсутствие ошибок итд. итп.
Гома под Rampage AI на арене тестил на последней eAthena, стукал исправно, скилы использовал. В ПвП тоже хорошо стукал, пати хима трогал только если натравить шифт+двойной клик правой кнопкой вручную. Друзей и пати на арене пока не проверял. Ну и к тому же последняя eAthena это не совсем Мотр, хотя и должна имхо примерно совпадать в этом плане.
-
Есть у меня сильное подозрение, что пока хим сидит, хомяк не сможет скиллы использовать. И дело тут не в проверках, а в том, что команды на использование скиллов севрер обрабатывает как исходящие от хима (а по сути так оно и есть, хомяк-то у нас рулится на компе). Но надо проверять.