Гайд по написанию скриптов для гомункулусов
-
Нельзя. Нужен модификация. Например, у меня существуют такие параметры как 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, кстати? Что это вообще за нафиг? х_х
-
как прописать в мираи данс атак?
-
ГеоПак,
Не забываем делать бэкап перед изменениями
Для MirAI в AI.lua замените это:
[code:2xafm5qg]elseif (Mystate == ATTACK_ST) then
OnATTACK_ST()[/code:2xafm5qg]
На это:
[code:2xafm5qg]elseif (MyState == ATTACK_ST) then
if ((GetV( V_SP, MyID) * 100) / GetV( V_MAXSP, MyID) > 80) then
OnATTACK_ST ()
local zx, zy = GetV( V_POSITION, MyEnemy )
Move(MyID,zx+1,zy)
Move(MyID,zx-1,zy)
OnATTACK_ST ()
Move(MyID,zx,zy+1)
Move(MyID,zx,zy-1)
else
OnATTACK_ST ()
end [/code:2xafm5qg]
80 это СП в процентах выше которого гомункул танцует, цифру можно заменить на ту которая устраивает (например 0).Мопед не мой, не тестил, но выглядит неплохо.
Для RampageAI:
Файл Conf/Custom.lua
найти:
[code:2xafm5qg]--[[Initialize your customizations here.
Hook or replace functions, and set some settings if you like.
--]]
-- An example to initialize the Advanced Movement Commands InitCustomAMCs()[/code:2xafm5qg]
Добавить после этого:
[code:2xafm5qg] SavedAttack = Attack
Attack = DancingAttack[/code:2xafm5qg]
Найти
[code:2xafm5qg]----------------------
-- Custom Functions ----[[
Put any extra functions here.
--]]
[/code:2xafm5qg]
Добавить после этого:
[code:2xafm5qg]-- Dancing Attack
function DancingAttack(homunID, targetID)
-- stop dancing if hp or sp lower then 0%, or 25%, or the homunculus is too far from its owner
-- this schould fix the "dance out of range bug"
-- Dancing Attack is also disabled for Monsters, which are to be kited
local t = MDBTable(actor)
if ((ActorHPPercent(HomunID) >= 0) and (ActorSPPercent(HomunID) >= 25) and (AABlocks(HomunID,OwnerID) <= 12) and (not t[11])) then
-- determine the targets position
local x, y = GetV(V_POSITION, targetID)
SavedAttack(homunID, targetID)
Move(homunID, x+1, y)
Move(homunID, x-1, y)
SavedAttack(homunID, targetID)
Move(homunID, x, y+1)
Move(homunID, x, y-1)
else SavedAttack(homunID, targetID)
end
end[/code:2xafm5qg]0 и 25 это ХП и СП гомункула в процентах выше которого активируется танцующая атака.