Гайд по написанию скриптов для гомункулусов
-
Спасибо, помогло, эффективность гома реско выросла) Спамит болтами как саг под брагой ^_^
-
замучалась ==
где (и как, и можно ли) в Рампейдже прописать, чтобы гом не атаковал нового моба, если у него, скажем, меньше 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]
Этого будет вполне достаточно чтобы гомункул атаковал мобов в поле видимости, не убегал за приделы видимости, не атаковал игроков и не килстил у них (за исключением случая атаки игрока из-за области видимости).
Что касается мира, то возможно не правильно указан радиус, в приделах которого можно атаковать, т.к. я не пользуюсь миром то ничего больше конкретного сказать не могу. -
..Ошибочка вышла с кодом из мира.
-
остаётся надеяться, что кто-то увидит недочет в скрипте
-
Не даблпостим.
Какой BeAction, кстати? Что это вообще за нафиг? х_х