Гайд по написанию скриптов для гомункулусов
-
поставил rc7 от Накаямы в принципе картина та же.. появляется не агрессивный моб в зоне видимости - ванилька кидает на него 1 болт (сама) и бежит в атаку и бьет обычными ударами при том что сп у нее еще 80-100% она все равно бьет обычными уларами, повторных попыток кинуться болтом ванилька не предпренимает.
Хочется чтобы было: ванилька видит отреспившегося моба - кидает на него болты пока есть сп и после кидается в бой с обычными ударами, пожже скопив СП еще на один болт - кидается опять болтом, сама, без постороннего вмешательства. На то ведь он и ИИ (искусственный интелект) чтобы самому за меня думать ^_^ -
iSe, проблема понятна, предполагаемое решение:
открываем файл:
"папка с игрой"\AI\USER_AI\Conf\Monsters.luaНаходим там (по идее в саааамом конце)
[code:38hbj47j]DefaultMonsterSettings = { многабукоф }[/code:38hbj47j]Где-то в скобках будет стоять
skMax=1 (вероятно 1, это число ограничивает количество кастов по одному стандартному мобу, -1 означает бесконечность)исправляем на
skMax=-1Сохраняем, перезапускаем гома (например чар селектом или Rest-Call) и по идее все должно быть в порядке. Если нет будем думать дальше.
Для пояснения: стандартными являются все мобы, которые не были определены отдельно (например грибочки, планты химов определены изначально отдельно). Отдельно можно определить любого другого моба, тогда поведения гомункула на нем будет отличаться от других (ну например более низкий приоритет, ограничение по количеству кастов, бить только с расстояния)
-
Спасибо, помогло, эффективность гома реско выросла) Спамит болтами как саг под брагой ^_^
-
замучалась ==
где (и как, и можно ли) в Рампейдже прописать, чтобы гом не атаковал нового моба, если у него, скажем, меньше 30% хп и 5% сп?
(та, я нупко = -
Нельзя. Нужен модификация. Например, у меня существуют такие параметры как atkHP и atkSP, для тех или иных монстров.
-
хм. а можно попросить вас выложить кусок этого скрипта?
как я понимаю, такая настройка возможна в мираи, но не для типа монстра. не очень хочется переходить снова на него =/
-
А я не помню где я это дописывал. Надо брать чистый и сравнивать, а потом из дифов вырезать нужные кусочки.
Пример:
[code:j4095g5f]{ 1881, prio=4, atkHP=50, atkSP=61 }, -- Lesavka[/code:j4095g5f] -
Зено, не жмотничай. Это идет в процедуре взятия инфы из таблицы прописанных мобов.
-
..\AI\USER_AI\MonSupport.lua 80
[code:sht2cj71]-- Verify monster settings
function VerifyMonSettings(t,defaultTable,id)
-- Parameter names
local argNames = { nil, "prio", "atk", "skLvl", "skDly", "skMax", "aSkLv", "aSkDl",
"aSkMx", "defOnly", "kite", "ffa", "hlBm", "mammo", "aTer", "aBmb", "atkHP", "atkSP" }[/code:sht2cj71]
..\AI\USER_AI\MonSupport.lua 235
[code:sht2cj71]-- Check if we are allowed to melee the monster
function MAttackAllowed(actor)
-- Get the monster's table
local t = MDBTable(actor)-- Check if it's not attaking us if (GetV(V_TARGET,actor) ~= OwnerID) and (GetV(V_TARGET,actor) ~= HomunID) then -- Check if HP or SP is higher than needed if (ActorHPPercent(HomunID) < t[17]) or (ActorSPAmount(HomunID) < t[18]) -- Check if skill is not paused or (t[4] > 0 and PauseAttackSkill) then return false end end -- Return the melee allowed value return t[3]
end[/code:sht2cj71]
..\AI\USER_AI\MonSupport.lua 377
[code:sht2cj71] -- Get the monster's table
local t = MDBTable(actor)-- Check if it's not attaking us if (GetV(V_TARGET,actor) ~= OwnerID) and (GetV(V_TARGET,actor) ~= HomunID) then -- Check if HP or SP is higher than needed if (ActorHPPercent(HomunID) < t[17]) or (ActorSPAmount(HomunID) < t[18]) then return false end end -- Check if level is greater than 0 and we haven't casted too often -- against them if t[4] > 0 and MSkillMaxCasts(actor) > ActorData[actor].Count.HomuSkill then return true end[/code:sht2cj71]
..\AI\USER_AI\Conf\Monsters.lua 97
[code:sht2cj71] - "atkHP" число HP в процентах ниже которого гомункул не будет проявлять
агрессию, если его или хозяина не бьют.- "atkSP" число SP при котором гомункул начнет атаковать.[/code:sht2cj71]
..\AI\USER_AI\Conf\Monsters.lua 211
[code:sht2cj71]DefaultMonsterSettings = { nil, prio=1, atk=true, skLvl=5, skDly=500, skMax=-1, aSkLv=5,
aSkDl=1000, aSkMx=-1, defOnly=false, kite=false, ffa=false,
hlBm=false, mammo=0, aTer=0, aBmb=0, atkHP=10, atkSP=0 }[/code:sht2cj71] -
а MirAI случайно никто не модифицировал?
не знаю как сделать, чтоб гомункул атаковал мобов другого гомункула
пример: в пати 2 хима, один гомункул танчит мобов мой их бьётсейчас мой гомункул не атакует моба, пока я бить не начну
ничейных мобов он нормально атакуетзаранее спасибо
-
М... поиграться с описанием друзей, имхо. Если оно есть в мирке.
-
Проверить есть ли сопосоставление гомункула с хозяином можно добавив хозяина в список друзей. В этом случае киллстил у гомукула этого "друга" будет разрешен, если сопоставление существует и работает. Иначе вам надо придумать и написать (или стырить) алгоритм сопоставления.
-
Откуда сопоставление? id у хозяев и покемонов разные должны быть. Надо тупо добавлять хомяка чужого в список друзей.
-
Гомункул может только то, на что способен ваш мозг, или то, на что вам удалось стырить.
-
Много букаф, не проще вместо всего написанного было выложить несколько готовых файлов?:)
-
Кто не хочет разбираться в этих букафах, тому хватит и немодифицированной мирки
-
Клиент выдаёт системное сообщение о том, что гомункул проголодался, когда показатель голода опускается до 10%. Можно ли сделать так, чтобы такое сообщение появлялось при достижении, скажем, 12%?
-
Так и не смогла разобраться в настройке AI функции агрессивности и пассивности. Мой гомункул - Амистр, который по умолчанию пассивный и атакует только тех, кто напал на него\меня. Подскажите пожалуйста где можно изменить его поведение на агрессивное? Я в мирке прописала мобов и тактику, применяемую к ним, но когда хожу по карте - амистр тормозит.. хоть и нападает первым, но почему-то, чтобы он это сделал, мне нужно подойти к мобу самой и стоять рядом... Брр.. ничего не понимаю. И не знаю как сделать так, чтоб он в радиусе видимости убивал всё живое ~_~ ... Хотелось бы наиболее точный ответ, т.к. со скриптами я не особо дружу. Какой именно файл, где конкретно и что вписывать. Заранее спасибо.
-
@"Ave":
Так и не смогла разобраться в настройке AI функции агрессивности и пассивности. ... Хотелось бы наиболее точный ответ, т.к. со скриптами я не особо дружу. Какой именно файл, где конкретно и что вписывать. Заранее спасибо.
В стандартный AI можно внести следующие изменения (изменения отмечены символом ">", их не нужно писать), в файл AI.lua.
[code:3w361xvm]
...-- global variable
...
MyID = 0 -- id гомункулаMyOwner = 0 -- id хозяина
...
...
-------------- state process --------------------
function OnIDLE_ST ()TraceAI ("OnIDLE_ST")
local cmd = List.popleft(ResCmdList)
if (cmd ~= nil) then
ProcessCommand (cmd) -- ї№ѕа ён•Йѕо Гіё
return
endlocal object = GetOwnerEnemy (MyID)
if (object ~= 0) then -- MYOWNER_ATTACKED_IN
MyState = CHASE_ST
MyEnemy = object
TraceAI ("IDLE_ST -> CHASE_ST : MYOWNER_ATTACKED_IN")
return
endobject = GetMyEnemy (MyID)
if (object ~= 0) then -- ATTACKED_IN
MyState = CHASE_ST
MyEnemy = object
TraceAI ("IDLE_ST -> CHASE_ST : ATTACKED_IN")
return
endobject = GetV (V_TARGET,MyOwner)
if (object ~= 0) then
MyState = CHASE_ST
MyEnemy = object
TraceAI ("IDLE_ST -> CHASE_ST : ATTACKED_IN")
return
end
local distance = GetDistanceFromOwner(MyID)
if ( distance > 3 or distance == -1) then -- MYOWNER_OUTSIGNT_IN
MyState = FOLLOW_ST
TraceAI ("IDLE_ST -> FOLLOW_ST")
return;
end
end
...
function OnCHASE_ST ()
TraceAI ("OnCHASE_ST")
if (true == IsOutOfSight(MyOwner,MyEnemy)) then -- ENEMY_OUTSIGHT_IN
MyState = IDLE_ST
MyEnemy = 0
MyDestX, MyDestY = 0,0
TraceAI ("CHASE_ST -> IDLE_ST : ENEMY_OUTSIGHT_IN")
return
end
if (true == IsInAttackSight(MyID,MyEnemy)) then -- ENEMY_INATTACKSIGHT_IN
MyState = ATTACK_ST
TraceAI ("CHASE_ST -> ATTACK_ST : ENEMY_INATTACKSIGHT_IN")
return
end
local x, y = GetV (V_POSITION,MyEnemy)
if (MyDestX ~= x or MyDestY ~= y) then -- DESTCHANGED_IN
MyDestX, MyDestY = GetV (V_POSITION,MyEnemy);
Move (MyID,MyDestX,MyDestY)
TraceAI ("CHASE_ST -> CHASE_ST : DESTCHANGED_IN")
return
end
end
...
function GetMyEnemy (myid)
local result = 0result = GetMyEnemyB (myid)
return result
end
...
-- ј±°шЗь GetMyEnemy
function GetMyEnemyB (myid)
local result = 0
local owner = GetV (V_OWNER,myid)
local actors = GetActors ()
local enemys = {}
local index = 1
local type
local SeePC = 0
for i,v in ipairs(actors) do
if (v ~= owner and v ~= myid) thenif (1 == IsMonster(v)) then enemys[index] = v index = index+1 else SeePC = 1 end
end
end
if (SeePC == 1) then
return GetMyEnemyA (myid)
end
local min_dis = 100
local dis
for i,v in ipairs(enemys) do
dis = GetDistance2 (myid,v)
if (dis < min_dis) then
result = v
min_dis = dis
end
end
return result
end
...
function AI(myid)
MyID = myid
MyOwner = GetV(V_OWNER, MyID)
...
end
...
[/code:3w361xvm]
Этого будет вполне достаточно чтобы гомункул атаковал мобов в поле видимости, не убегал за приделы видимости, не атаковал игроков и не килстил у них (за исключением случая атаки игрока из-за области видимости).
Что касается мира, то возможно не правильно указан радиус, в приделах которого можно атаковать, т.к. я не пользуюсь миром то ничего больше конкретного сказать не могу. -
..Ошибочка вышла с кодом из мира.