Гайд по написанию скриптов для гомункулусов
-
может вопрос и странный, но в каком "смысле" в скрипте использовано слово "local"? в языках я ничего не смыслю, но пытался чтото воткнуть:
[code:22mah0ev]local msg = GetMsg (myid)[/code:22mah0ev] - здесь мы присваиваем переменной local msg значение выдаваемое функцией GetMsg (myid)
[code:22mah0ev]if msg[1] == NONE_CMD[/code:22mah0ev] а здесь мы спрашиваем какое же значение выдала нам ф-я GetMsg (myid), но никакого слова "local" нету, хотя в строчке выше мы (как мне показалось по тексту) обозначили её (GetMsg (myid)) переменной "local msg" , а не просто "msg" ?
может просто надо быть внимательнее,и я пишу бред ночью сонный но всетаки. -
Оператор local используется при объявлении переменной для указания того факта, что эта переменная является локальной. То есть обратиться к ней "снаружи" от данной функции нельзя (из других вызываемых функций можно). Условный пример:
[code:3vha93hm]function DancingAttack(homunID, targetID)
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:3vha93hm]
Объявленная локальная переменная t должна быть вида в вызываемых функциях ActorHPPercent(), ActorSPPercent, AABlocks.
Но если где-то в другом месте кода у нас есть строка
[code:3vha93hm]if ляляля then
DancingAttack(MyID, MyEnemy)
end[/code:3vha93hm]
В "ляляля" обратиться к переменной t уже нельзя. И после энда тоже нельзя.
Объяснение корявое, я понимаю. Подробнее можно нагуглить по запросу "область видимости переменных"
PS На сколько я помню спецификацию Луы, именовать переменные через пробел нельзя. -
Оператор local используется при объявлении переменной для указания того факта, что эта переменная является локальной. То есть обратиться к ней "снаружи" от данной функции нельзя (из других вызываемых функций можно). Условный пример:
[code:3vha93hm]function DancingAttack(homunID, targetID)
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:3vha93hm]
Объявленная локальная переменная t должна быть вида в вызываемых функциях ActorHPPercent(), ActorSPPercent, AABlocks.
Но если где-то в другом месте кода у нас есть строка
[code:3vha93hm]if ляляля then
DancingAttack(MyID, MyEnemy)
end[/code:3vha93hm]
В "ляляля" обратиться к переменной t уже нельзя. И после энда тоже нельзя.
Объяснение корявое, я понимаю. Подробнее можно нагуглить по запросу "область видимости переменных"
PS На сколько я помню спецификацию Луы, именовать переменные через пробел нельзя. -
удивилась
из других вызываемых функций можно
Очень нетривиально как-то >< Действительно можно?..
-
удивилась
из других вызываемых функций можно
Очень нетривиально как-то >< Действительно можно?..
-
Должно быть можно. Вложенные функции наследуют локальные переменные от родителя. Ну либо я старею и уже нихрена не помню (что тоже вполне вероятно).
-
Должно быть можно. Вложенные функции наследуют локальные переменные от родителя. Ну либо я старею и уже нихрена не помню (что тоже вполне вероятно).
-
Возможно уже обсуждалось, но еще раз спрошу.
-
язык lua позволяет подключать функции на C++ этот прием возможно использовать при написании Ai?
-
я так понимаю сспомощью V_ констант и функции GetV можно получать данные не доступные через клиент(хп\сп игроков и мобов, определять местонахождение игрока\моба даже если он в хайде\клокинге)?
-
возможен ли вывод инфы в чат\приват?
-
конкретика по RampageAi(его взял за основу своего скрипта) где лучше осуществить проверку "можно ли атаковать моба при определенном хп\сп" ну например <!-- l --><a class="postlink-local" href="http://forum.motronline.com/viewtopic.php?p=1968165#p1968165">viewtopic.php?p=1968165#p1968165</a><!-- l --> тут Зено описал как это реализвать, но непонятно какая именно функция модифицировалась и какой именно рампейдж использован(у меня версия 1.0 rc7 by Nakayama), как я понял из контекста модифицировалась AI_MSkillsAllowed(actor) при внесении изменений гомункуль все арвно атакует даже если значение его хп ниже указанных.
или я туплю где-то?
[code:3l7wjo9p]
-- добавляем параметры которые берутся из "базы мобов" (~\Conf\Monsters.lua)
function VerifyMonSettings(t,defaultTable,id)
-- ....
local argNames = { nil, "prio", "atk", "skLvl", "skDly", "skMax", "aSkLv", "aSkDl","aSkMx", "defOnly", "kite", "ffa", "hlBm", "mammo", "aTer", "aBmb", "atkHP", "atkSP" }
-- .............................................
-- добавляем проверку текущего хп и сп перед атакой(Скиллом?)
function AI_MSkillsAllowed(actor)
-- Check if we're pausing skills for the moment if PauseAttackSkill then -- They're paused return false end -- 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 -- If the value isn't greater than 0, disable skill usage return false
end
-- .............................................................
в файле Monsters.lua меняем
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=30, atkSP=0 }
-- не атаковать при хп < 30%
[/code:3l7wjo9p]
В результате у меня получилось, что гом все равно бьет все живое и скиллами в том числе. Куда копать? -
-
Возможно уже обсуждалось, но еще раз спрошу.
-
язык lua позволяет подключать функции на C++ этот прием возможно использовать при написании Ai?
-
я так понимаю сспомощью V_ констант и функции GetV можно получать данные не доступные через клиент(хп\сп игроков и мобов, определять местонахождение игрока\моба даже если он в хайде\клокинге)?
-
возможен ли вывод инфы в чат\приват?
-
конкретика по RampageAi(его взял за основу своего скрипта) где лучше осуществить проверку "можно ли атаковать моба при определенном хп\сп" ну например <!-- l --><a class="postlink-local" href="http://forum.motronline.com/viewtopic.php?p=1968165#p1968165">viewtopic.php?p=1968165#p1968165</a><!-- l --> тут Зено описал как это реализвать, но непонятно какая именно функция модифицировалась и какой именно рампейдж использован(у меня версия 1.0 rc7 by Nakayama), как я понял из контекста модифицировалась AI_MSkillsAllowed(actor) при внесении изменений гомункуль все арвно атакует даже если значение его хп ниже указанных.
или я туплю где-то?
[code:3l7wjo9p]
-- добавляем параметры которые берутся из "базы мобов" (~\Conf\Monsters.lua)
function VerifyMonSettings(t,defaultTable,id)
-- ....
local argNames = { nil, "prio", "atk", "skLvl", "skDly", "skMax", "aSkLv", "aSkDl","aSkMx", "defOnly", "kite", "ffa", "hlBm", "mammo", "aTer", "aBmb", "atkHP", "atkSP" }
-- .............................................
-- добавляем проверку текущего хп и сп перед атакой(Скиллом?)
function AI_MSkillsAllowed(actor)
-- Check if we're pausing skills for the moment if PauseAttackSkill then -- They're paused return false end -- 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 -- If the value isn't greater than 0, disable skill usage return false
end
-- .............................................................
в файле Monsters.lua меняем
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=30, atkSP=0 }
-- не атаковать при хп < 30%
[/code:3l7wjo9p]
В результате у меня получилось, что гом все равно бьет все живое и скиллами в том числе. Куда копать? -
-
- нет, не работает
- хп-сп мобов нельзя получать, координаты в клоке-хайде через GetActors
- нет
- по указанной ссылке подробно написано, в каком файле с какой строчки (номер после имени файла) что менять (собственно, код). Замечу, что файл ..\AI\USER_AI\MonSupport.lua редактируется три раза. У меня после данной модификации никаких ошибок не возникало.
-
- нет, не работает
- хп-сп мобов нельзя получать, координаты в клоке-хайде через GetActors
- нет
- по указанной ссылке подробно написано, в каком файле с какой строчки (номер после имени файла) что менять (собственно, код). Замечу, что файл ..\AI\USER_AI\MonSupport.lua редактируется три раза. У меня после данной модификации никаких ошибок не возникало.
-
Номер строки не даст абсолютно ничего, ибо версия разная и соответственно строки могут отличаться(если дам свои адреса они попадут у вас на комментарии). Интересует именно функция, да и теперь не особо то интересует, ибо сделал по-другому
-
Номер строки не даст абсолютно ничего, ибо версия разная и соответственно строки могут отличаться(если дам свои адреса они попадут у вас на комментарии). Интересует именно функция, да и теперь не особо то интересует, ибо сделал по-другому
-
Повторюсь - у меня проблем с корректировкой не возникло. Версия RampageAI v1[1].0 rc6 fixed by Nakayama. Если не совпадают номера строк, можно тупо по названию функций смотреть, тоже помогает.
-
Повторюсь - у меня проблем с корректировкой не возникло. Версия RampageAI v1[1].0 rc6 fixed by Nakayama. Если не совпадают номера строк, можно тупо по названию функций смотреть, тоже помогает.
-
Ух.. я и просил функцию >__<. Третий фрагмент кода в посте зено не включает описания функции, тупо номер строки
..\AI\USER_AI\MonSupport.lua 377
, который в свою очередь попадает в rc7 рампаге от накаямы на функцию function AI_MSkillsAllowed(actor).итого:
3 изменения MonSupport.lua
function VerifyMonSettings(t,defaultTable,id)
function MAttackAllowed(actor)
function AI_MSkillsAllowed(actor) ?! вот это я хотел увидеть
и в Monsters.lua
добавляются описанные параметры к нужным мобам и дефолтному мобу.
Должно работать, проверять лень. -
Ух.. я и просил функцию >__<. Третий фрагмент кода в посте зено не включает описания функции, тупо номер строки
..\AI\USER_AI\MonSupport.lua 377
, который в свою очередь попадает в rc7 рампаге от накаямы на функцию function AI_MSkillsAllowed(actor).итого:
3 изменения MonSupport.lua
function VerifyMonSettings(t,defaultTable,id)
function MAttackAllowed(actor)
function AI_MSkillsAllowed(actor) ?! вот это я хотел увидеть
и в Monsters.lua
добавляются описанные параметры к нужным мобам и дефолтному мобу.
Должно работать, проверять лень. -
Ну хоть чуточку смекалки и сообразительности можно же проявить, зачем же строго по инструкции...
В функциях добавляются только проверки на текущие значения хп-сп хомяка, значит, бОльшая часть функций остается нетронутой. Тупо берем самый первый комментарий из этого таинственного куска кода, задаем поиск и... обнаруживаем, что функцию function MAttackAllowed(actor) только что меняли, а функцию function AI_MSkillsAllowed(actor) не трогали (а в ней упомянутый кусок есть как раз). И номер строки примерно в тот же район ссылается.
Вообще, чтобы разрешить ваши терзания, скажу, что эту часть кода действительно надо вставлять в function AI_MSkillsAllowed(actor) -
Ну хоть чуточку смекалки и сообразительности можно же проявить, зачем же строго по инструкции...
В функциях добавляются только проверки на текущие значения хп-сп хомяка, значит, бОльшая часть функций остается нетронутой. Тупо берем самый первый комментарий из этого таинственного куска кода, задаем поиск и... обнаруживаем, что функцию function MAttackAllowed(actor) только что меняли, а функцию function AI_MSkillsAllowed(actor) не трогали (а в ней упомянутый кусок есть как раз). И номер строки примерно в тот же район ссылается.
Вообще, чтобы разрешить ваши терзания, скажу, что эту часть кода действительно надо вставлять в function AI_MSkillsAllowed(actor) -
@sepulka:
Что я нашла :oops:<!-- m --><a class="postlink" href="http://code.google.com/p/ro-rail/">http://code.google.com/p/ro-rail/</a><!-- m --> никто не пробовал?
Я недавно попробовал, впечатления неоднозначные: очень шустрый скрипт (при телепорте, когда экран только проявляется, хом уже на полпути к дальным монстрам, а иногда уже и труп валяется, а хом ко второму мчиться), настройка, по задумке, должна быть очень легкой, но как сохранить сделанные мною изменения в конфигурационном файле я не понял. :oops: