Гайд по написанию скриптов для гомункулусов
-
Не, не много. Не больше любого другого.
У гома ж область видимости всего 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 это не совсем Мотр, хотя и должна имхо примерно совпадать в этом плане.
-
Есть у меня сильное подозрение, что пока хим сидит, хомяк не сможет скиллы использовать. И дело тут не в проверках, а в том, что команды на использование скиллов севрер обрабатывает как исходящие от хима (а по сути так оно и есть, хомяк-то у нас рулится на компе). Но надо проверять.
-
Индусы. А сразу return true прописать религия не позволяет?
-
@"Aiko-Star":
Есть у меня сильное подозрение, что пока хим сидит, хомяк не сможет скиллы использовать. И дело тут не в проверках, а в том, что команды на использование скиллов севрер обрабатывает как исходящие от хима (а по сути так оно и есть, хомяк-то у нас рулится на компе). Но надо проверять.
может я не про то но когдя я на афк каче у меня хим сидит а гом юзает скилы вовсю -
Может. Просто удобно, сел и он не тратит зря сп.