Гайд по написанию скриптов для гомункулусов
-
Кто не хочет разбираться в этих букафах, тому хватит и немодифицированной мирки
-
Клиент выдаёт системное сообщение о том, что гомункул проголодался, когда показатель голода опускается до 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 это ХП и СП гомункула в процентах выше которого активируется танцующая атака.
-
@"ГеоПак":
как прописать в мираи данс атак?1) FastAttack_Mod.lua закидываем в папку с игрой.
2) запускаем gui (Config.exe), открываем закладочку Extra, в окошечке Plugin выбираем FastAttack_Mod.lua
3) Жмём Save configuration
4) ????
5) Profit! (в смысле наслаждаемся результам) -
@"Aiko-Star":
Не даблпостим.Какой BeAction, кстати? Что это вообще за нафиг? х_х
Это остатки которые я не вычистил. Удалил.
Я пытался сделать гомункула активнее, чтобы он не ждал следующего вызова AI() а сразу переходил к выполнению действия, и заканчивал работу только если была отправлена команда (на сервер) атаковать, использовать скилл или идти. Если прирост и был то он был незначительный. -
@"iSe":
Интересует такой вопрос: у меня стоит Rampage AI rc6 - ничего в нем не правил - т.к. разбиратся долго и тяжело поэтому спрашиваю мэтров - что в нем поправить чтобы хом (ванилька) при начале атаки сразу же сплавлял все СП на болты и как только у него скопится сп во время боя с мобом он сразу же бил болтом на все что есть?) ато чот он у меня постоянно с полным СП ходит, и всегда умирает)и еще вопрос - встречал на просторах сети RampageAI_v1.0_rc7_by_Nakayama стоит ли ставить его? он с какого то левого сайта... или лучше остановится на rc6 с его офа?
Не только можно, но и НУЖНО использовать именно этот вариант Rampage. В исходном есть опечатка из-за которой ГОМ КИЛСТИЛИТ чужих мобов.
-
при испотльзование Rampage AI очень часто в чате появляеться надпись Not Enought SP, что подправить и где нужно в срипте, чтобы эта надпись пореже возникала?
-
В настроках поставить минимальное сп у гомункула равным единице.
-
Расскажите пожалуйста, как заставить его патрулировать вокруг меня в поисках жертвы?
-
Смысла в "патрулировании" нет, т.к. функция, используемая для получения списка присутствующих (мобы-игроки-etc), не имеет радиуса и действует где-то на экран. Т.е. что он в одном углу экрана будет, что в другом - результат получится один и тот же, лишних мобов хомяк не поймает
-
Sanq!
-
@"Aiko-Star":
Смысла в "патрулировании" нет, т.к. функция, используемая для получения списка присутствующих (мобы-игроки-etc), не имеет радиуса и действует где-то на экран. Т.е. что он в одном углу экрана будет, что в другом - результат получится один и тот же, лишних мобов хомяк не поймаетХомяк-то больше не увидит, а вот мобы увидят хомяка с большей площади и если агресвные - нападут. Так что смысл всё же есть. -
@"LisandreL":
Хомяк-то больше не увидит, а вот мобы увидят хомяка с большей площади и если агресвные - нападут. Так что смысл всё же есть.
Ну тогда еще можно в подобные плюсы записать и то, что покемон может оказаться ближе к мобу и быстрее до него бежать будет Крайне сомнительное преимущество, если честно. -
Может оказаться и дальше, если по кругу. Но приманивание издали агрессивных монстров - несомненный плюс.