Гайд по написанию скриптов для гомункулусов
-
JdM,
у меня
[code:1ilft3wp]DEFAULT_WITH=WITH_full_power[/code:1ilft3wp]
спецом проставленода-да, не то скопировала,простите
LisandreL,
[code:1ilft3wp]function CanDoAtkSkillsNow()
-- is it the right time for an aggressive skill?local result = true local CurrTime = GetTick() --local TimeOutElapsed = CurrTime - AtkStartTime > SKILL_TIME_OUT --Log(string.format("AtkSkillDoneCount = %d, CurrTime - AtkStartTime = %d", AtkSkillDoneCount, CurrTime - AtkStartTime)) if (HTact.Skill == WITH_no_skill) then result = false elseif HTact.Skill == WITH_one_skill then -- Log(string.format("AtkSkillDoneCount = %d, CurrTime - AtkStartTime = %d", AtkSkillDoneCount, CurrTime - AtkStartTime)) --if (AtkSkillDoneCount > 1) or TimeOutElapsed then if (AtkSkillDoneCount > 1) then result = false end elseif HTact.Skill == WITH_two_skills then if (AtkSkillDoneCount > 2) then result = false end --[[elseif HTact.Skill == WITH_max_skills then if TimeOutElapsed then result = false end--]] elseif HTact.Skill == WITH_slow_power then if (LONG_RANGE_SHOOTER ~= true) and (CurrTime - AtkStartTime < DELAY_SLOW_POWER) then result = false end end return result
end[/code:1ilft3wp]
вызов самой функции в function OnCHASE_ST()
[code:1ilft3wp]
-- Homunculus long range attack
local CurrTime = GetTick()
if LRASID ~=0 then
if (AtkStartTime == 0) then
AtkStartTime = CurrTime
end
if CanDoAtkSkillsNow() then
if DoSkill(LRASID, MyEnemy) then -- ##### AGGRESSIVE SKILL #####
AtkSkillDoneCount = AtkSkillDoneCount + 1
LastLRAtkTime = CurrTime
LastLRAtkID = MyEnemy
end
end
end
[/code:1ilft3wp]это все куски из стандартного мираи
-
По идее, с проставленным with_full_power должен кидать болты без задержек. Попробуй вписать в function CanDoAtkSkillsNow() отдельную проверку на тактику с full_power (там должен быть result = true). Обезьянья работа, но мало ли...
-
@"sepulka":
у меня[code:3refsas7]DEFAULT_WITH=WITH_full_power[/code:3refsas7]
спецом проставлено[code:3refsas7]function GetFullTact(ID)
-- get all tact. data for this monster
T = {}
if Tact[ID] == nil then -- Return default Tactic for unlisted monsters
Log(string.format("No tact data for monster type-ID %d", ID))
T.Behav = DEFAULT_BEHA
T.Skill = DEFAULT_WITH
T.Level = -1
T.Alche = 0
else
...[/code:3refsas7]T.Level = -1 - вот такой подкол и хоть обставтесь вы WITH_full_power уровень атакующего скилла у вас -1, а значит атаки не будет. -
Aiko Star, пробовала, всячески оптимизировать эту функцию и как ты предлагаешь - пофиг
@"LisandreL":
T.Level = -1 - вот такой подкол и хоть обставтесь вы WITH_full_power уровень атакующего скилла у вас -1, а значит атаки не будет.
а причем здесь это? В этой же функции нигде не проверяется Level, только Skill из тактик. Я ж что говорю - если оставь функцию без изменения хомяк в лучшем случае кидает болт клетки за две три до моба или вообще когда его начал бить. Если же удалить вот этот кусочек кода болты начинают кидаться с намного большего расстояния (кажется как только попадает в радиус действия болта) и больше ничего в аи не меняется
[code:4xagwois]
elseif HTact.Skill == WITH_slow_power then
if (LONG_RANGE_SHOOTER ~= true) and (CurrTime - AtkStartTime < DELAY_SLOW_POWER) then
result = false
[/code:4xagwois]вот что такого особенно в данном куске кода, что он так сильно влияет? Я вот в упор не вижу, тупая проверка на использовать определенную тактику или нет. По идее должна влиять только если данная тактика для моба включена, а тормозит всех. Специально все тактики сносила из настроек, все-равно тормозят.
-
Видимо у вас всё же HTact.Skill == WITH_slow_power. Смотрите где оно заполняется.
Можете потестить, заменив всю функцию на:
[code:s5giufv9]function CanDoAtkSkillsNow()
local result = true
if HTact.Skill == WITH_slow_power then
result = false
end
return result
end[/code:s5giufv9]это все куски из стандартного мираи
У меня в 1.2.2 ничего закоментированного в тексте нету. Это так и было или вы сами добавляли? -
у меня с ировики, вариант мираи с аи для наемников.
Сейчас попробую еще раз поискать, может где-то и пропустила.Upd. Нет ничего не нашла. Попробую дома скачать чистый мираи без наемников и его покорячить вдруг что другое там. а заодно проверю изменится ли что-то при изменении DELAY_SLOW_POWER, если да, то я точно что-то не нахожу)
-
это оказался глюк этого самого мираи с наемниками, в стандартном такой проблемы нет. Хотя я так и не нашла где кроется проблема ну и фиг с ним:)
-
у меня, кстати, закомментированные куски есть. Хз какая версия, давно качала. Загадка :unknown:
-
@"Aiko-Star":
у меня, кстати, закомментированные куски есть. Хз какая версия, давно качала. Загадка :unknown:У меня они тоже есть, просто не закомментированы.
Версия обычно во второй строчке AI.lua указанна. -
вопросик вот по Лифкам.... только создала, покормила, пошла на поригов, а она бить не хочет сама=( альт+t тыкала.. много раз... ничего не происходит... если направляю её бить-бьёт, сама начинаю бить, подтягивается и добивает.. а сама не хочет...
Подскажите как с этим быть??З.Ы.
полистала странички в темке.. пыталась что-то найти.. не нашла=((( -
вопросик вот по Лифкам.... только создала, покормила, пошла на поригов, а она бить не хочет сама=( альт+t тыкала.. много раз... ничего не происходит... если направляю её бить-бьёт, сама начинаю бить, подтягивается и добивает.. а сама не хочет...
Подскажите как с этим быть??З.Ы.
полистала странички в темке.. пыталась что-то найти.. не нашла=((( -
Устанавливаем MirAI (ссылочки в гайдах), настраиваем, пробуем еще раз
-
Устанавливаем MirAI (ссылочки в гайдах), настраиваем, пробуем еще раз
-
может вопрос и странный, но в каком "смысле" в скрипте использовано слово "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: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 На сколько я помню спецификацию Луы, именовать переменные через пробел нельзя. -
удивилась
из других вызываемых функций можно
Очень нетривиально как-то >< Действительно можно?..
-
удивилась
из других вызываемых функций можно
Очень нетривиально как-то >< Действительно можно?..
-
Должно быть можно. Вложенные функции наследуют локальные переменные от родителя. Ну либо я старею и уже нихрена не помню (что тоже вполне вероятно).