path = '/'..GetMapDataPath()
main_hero = 'Raelag'
print("ГГ назван");
SetHeroCombatScript('Raelag', path.."CombatScript.xdb#xpointer(/Script)");
print("комбат скрипт запущен");ну и кроме того, есть опечатки в названиях функций в боевом скрипте, а так же не указаны цели для кастов в функции UnitCastAimedSpell. Вот твоя карта с пофикшенными путями, но чтобы Раилаг правильно кастовал, тебе нужно определить, в кого нужно делать эти касты)
Сообщения от Скрипты
Мой combat script.xdb ведёт не к combat script.lua, а к map script.lua. Интересно, как же это так вышло. Пойду править.
Gerter — отдельное спасибо.
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
Discord-сервер "Герои 5: S.T.A.L.K.E.R"
Сервер по модификации "Герои 5: S.T.A.L.K.E.R"
_________________
Я переписала скрипты на нетронутой версии карты, на которой раньше никаких скриптов не было.
И теперь в бою мне пишут:
Value was NIL when getting global with name 'GetUntiManaPoints'
attempt to call a nil value
Что, млин, ему ещё не нравится, когда есть main_hero = 'Raelag'?
Хоттабыч, но теперь у меня другая ошибка).
Я переписала скрипты на нетронутой версии карты, на которой раньше никаких скриптов не было.
И теперь в бою мне пишут:
Value was NIL when getting global with name 'GetUntiManaPoints'
attempt to call a nil value
Что, млин, ему ещё не нравится, когда есть main_hero = 'Raelag'?
Value was NIL when getting global with name 'GetUntiManaPoints', и всё тут.
Тьфу, млин, я слепая коза. сейчас поправлю.
Добавлено через 12 минут
Да, мана теперь исправно добавляется, большое спасибо.
attempt to call a nil value - это консоль пишет про отсутствие цели заклинания?
И как добавить эту цель?
Задумка была в том, чтобы повторить заклинание Эльвы из карты "Незваные гости", но не на молнию, а на холод, и мне пока не нужно так много героев, как там.
Хочешь сделать, чтобы в начале боя на всех врагов кастовались ледяные глыбы? Тогда скрипт надо изменить примерно так:
function Start()
if GetHeroName(GetAttackerHero()) == 'Raelag' then
print("если ГГ агрессор");
local mana = GetUnitManaPoints(GetAttackerHero()) --Иначе мы ни с того ни с сего оставим 200 маны игроку!
SetUnitManaPoints(GetAttackerHero(), 200);
repeat sleep(1) until GetUnitManaPoints(GetAttackerHero())==200 --Спать до тех пор, пока не начислится мана
for i, creature in GetDefenderCreatures() do
startThread(UnitCastAimedSpell, GetAttackerHero(), 4, creature)
end
SetUnitManaPoints(GetAttackerHero(), mana); --Вернём маны, сколько было!
print("кастуем");
elseif GetHeroName(GetDefenderHero()) == 'Raelag' then
print("если ГГ агрессор");
local mana = GetUnitManaPoints(GetDefenderHero()) --Иначе мы ни с того ни с сего оставим 200 маны игроку!
SetUnitManaPoints(GetDefenderHero(), 200);
repeat sleep(1) until GetUnitManaPoints(GetDefenderHero())==200 --Спать до тех пор, пока не начислится мана
for i, creature in GetAttackerCreatures() do
startThread(UnitCastAimedSpell, GetDefenderHero(), 4, creature)
end
SetUnitManaPoints(GetDefenderHero(), mana); --Вернём маны, сколько было!
print("кастуем");
end;
end
Добавлено через 4 минуты
ЗЫ Да, всё, наконец-то, работает. Спасибо ещё раз)
Добавлено через 3 минуты
Хоттабыч, и вам тоже спасибо. Постараюсь внимательно изучить ваше руководство, но пока я мало в нём понимаю, - это что-то вроде магии).
Добавлено через 5 часов 31 минуту
Господа, у меня к вам новый вопрос, - как всегда, уже можно сказать.
Как мне передать информацию об уровне моего ГГ в боевой режим?
Вот в этой теме написано:
https://forum.heroesworld.ru/showthread. ... page=247
"Можно сохранять уровень героя в общеигровую переменную с помощью SetGameVar и получать ее значение в бою, используя GetGameVar"(c)
-------------------------------------------------------------
В MapScript я пишу:
path = '/'..GetMapDataPath()
main_hero = 'Raelag'
SetHeroCombatScript('Raelag', path.."CombatScript.xdb#xpointer(/Script)");
SetGameVar("LevR", 1);
print("Установили что LevR это Сет Гейм Вар");
LevR = GetHeroLevel('Raelag');
print("LevR установлен как определитель уровня Раилага");
function ProbaF() -- Я её пишу только затем, чтобы проверить, что LevR корректно работает, - и он работает.
if LevR < 20 then
print("уровень меньше 20");
else
print("уровень 20 или больше");
end;
end;
Trigger(OBJECT_TOUCH_TRIGGER, "Proba", "ProbaF" );
-------------------------------------------------------------
В CombatScript я пишу:
function Start()
Level_R = GetGameVar("LevR") + 0;
print("Level_R установлен как определитель уровня Раилага мать его в бою и зависит от LevR через Сет и Гет Гейм Вар");
if GetHeroName(GetAttackerHero()) == 'Raelag' then
print("если ГГ агрессор");
local mana = GetUnitManaPoints(GetAttackerHero());
SetUnitManaPoints(GetAttackerHero(), 200);
repeat sleep(1) until GetUnitManaPoints(GetAttackerHero())==200;
sleep(1);
if Level_R < 20 then
print("если уровень меньше 20и то");
for i, creature in GetDefenderCreatures() do
startThread(UnitCastAimedSpell, GetAttackerHero(), 4, creature);
print("кастуем глыбу");
SetUnitManaPoints(GetAttackerHero(), mana);
print("возвращаем ману");
end;
else
print("если уровень 20 и больше");
for i, creature in GetDefenderCreatures() do
startThread(UnitCastAimedSpell, GetAttackerHero(), 5, creature);
print("кастуем шар");
SetUnitManaPoints(GetAttackerHero(), mana);
print("возвращаем ману");
end;
end;
-------------------------------------------------------------
Но Раилаг, с упорством, достойным лучшего применения, кастует не шар, а ледяную глыбу, хотя он 20го уровня!
И консоль пишет, что он меньше 20го по уровню.
То есть, CombatScript в упор не видит GetGameVar?
Или он видит, - ведь Раилаг кастует, - но почему-то не видит if Level_R < 20 then?
Как донести до боевого режима, что ГГ уже 20й?
И дополнительный вопрос, - как это вы все вставляете сюда такие разноцветные скрипты?
В моей однотонной крокозябре хрен разберёшься, надо бы мне её по-другому оформлять.
SetGameVar("LevR", 1);
print("Установили что LevR это Сет Гейм Вар");
LevR = GetHeroLevel('Raelag');
Вы устанавливаете значение внутриигровой переменной "LevR" в единицу, а потому жаловаться вам не на что — вы ее нигде не меняете.
А следующая ниже LevR = GetHeroLevel("Raelag") разово записывает уровень героя (первый) в вообще другую переменную.
Сделать надо так:
function HeroLevelSave()
SetGameVar("LevR", GetGameVar("LevR")+1)--Увеличиваем на 1 переменную с уровнем героя
end
SetGameVar("LevR", 1)
Trigger(HERO_LEVELUP_TRIGGER, "Raelag")
В Комбат скрипте тоже немного по-другому:
function Start()
Level_R = GetGameVar("LevR") + 0;
print("Level_R установлен как определитель уровня Раилага мать его в бою и зависит от LevR через Сет и Гет Гейм Вар");
if GetHeroName(GetAttackerHero()) == 'Raelag' then
print("если ГГ агрессор");
local mana = GetUnitManaPoints(GetAttackerHero());
SetUnitManaPoints(GetAttackerHero(), 200);
repeat sleep(1) until GetUnitManaPoints(GetAttackerHero())==200;
if Level_R < 20 then
print("Если уровень меньше 20, то");
for i, creature in GetDefenderCreatures() do
startThread(UnitCastAimedSpell, GetAttackerHero(), 4, creature);
print("кастуем глыбу");
end;
SetUnitManaPoints(GetAttackerHero(), mana);
print("возвращаем ману");
else
print("Если уровень 20 и больше, то");
for i, creature in GetDefenderCreatures() do
startThread(UnitCastAimedSpell, GetAttackerHero(), 5, creature);
print("кастуем шар");
end;
SetUnitManaPoints(GetAttackerHero(), mana);
print("возвращаем ману");
end
end
end;Не хватало end'ов у вас, я поставил нужное кол-во. Кроме того, ваш скрипт (если он такой, как выше), сработает только если мы напали, а не напали на нас.
У вас не хватало 1 энда.
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
Discord-сервер "Герои 5: S.T.A.L.K.E.R"
Сервер по модификации "Герои 5: S.T.A.L.K.E.R"
_________________
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
Discord-сервер "Герои 5: S.T.A.L.K.E.R"
Сервер по модификации "Герои 5: S.T.A.L.K.E.R"
_________________
Разумеется, это только половина скрипта - на атакующего, - я решила не грузить форум и вас лишними неудобочитаемыми скриптами. Дефендера я сделаю по образцу аттакера.
Добавлено через 1 час 31 минуту
Чё-то не работает.
МепСкрипт ругается (Script) ERROR: Parameter lost: function name.
path = '/'..GetMapDataPath()
main_hero = 'Raelag'
print("ГГ назван");
SetHeroCombatScript('Raelag', path.."CombatScript.xdb#xpointer(/Script)");
print("Комбат скрипт запущен");
LevR = GetHeroLevel('Raelag');
print("LevR установлен как определитель уровня Раилага");
function HeroLevelSaveF()
SetGameVar("LevR", GetGameVar("LevR")+1); --Увеличиваем на 1 переменную с уровнем героя
print("Установили что LevR это Сет Гейм Вар");
end
SetGameVar("LevR", 1)
Trigger(HERO_LEVELUP_TRIGGER, "Raelag")Пробовала менять название функции - ничего не меняется.
Пробовала убирать LevR = GetHeroLevel('Raelag'); (мне показалось, что Trigger(HERO_LEVELUP_TRIGGER, "Raelag") вполне достаточно, и может, это так и есть. Убрать LevR = GetHeroLevel('Raelag') или не надо?) - тоже ничего не изменилось, (Script) ERROR: Parameter lost: function name.
Комбат скрипт вроде правильный, но Раилаг по-прежнему кастует глыбу, и игра не видит, что он 20го уровня. Вот скрипт, на всякий случай:
function Start()
Level_R = GetGameVar("LevR") + 0;
print("Level_R óñòàíîâëåí êàê îïðåäåëèòåëü óðîâíÿ Ðàèëàãà ìàòü åãî â áîþ è çàâèñèò îò LevR");
if GetHeroName(GetAttackerHero()) == 'Raelag' then
print("åñëè ÃÃ àãðåññîð");
local mana = GetUnitManaPoints(GetAttackerHero());
SetUnitManaPoints(GetAttackerHero(), 200);
repeat sleep(1) until GetUnitManaPoints(GetAttackerHero())==200;
sleep(1);
if Level_R < 20 then
print("åñëè óðîâåíü ìåíüøå 20, òî");
for i, creature in GetDefenderCreatures() do
startThread(UnitCastAimedSpell, GetAttackerHero(), 4, creature);
print("êàñòóåì ãëûáó");
end;
SetUnitManaPoints(GetAttackerHero(), mana);
print("âîçâðàùàåì ìàíó");
else
print("åñëè óðîâåíü 20 è áîëüøå, òî");
for i, creature in GetDefenderCreatures() do
startThread(UnitCastAimedSpell, GetAttackerHero(), 5, creature);
print("êàñòóåì øàð");
end
SetUnitManaPoints(GetAttackerHero(), mana);
print("âîçâðàùàåì ìàíó");
end
else
if GetHeroName(GetDefenderHero()) == 'Raelag' then
print("åñëè ÃÃ àãðåññîð");
local mana = GetUnitManaPoints(GetDefenderHero())
SetUnitManaPoints(GetDefenderHero(), 200);
repeat sleep(1) until GetUnitManaPoints(GetDefenderHero())==200
sleep(1);
if Level_R < 20 then
print("åñëè óðîâåíü ìåíüøå 20, òî");
for i, creature in GetAttackerCreatures() do
startThread(UnitCastAimedSpell, GetDefenderHero(), 4, creature);
print("êàñòóåì ãëûáó");
end;
SetUnitManaPoints(GetDefenderHero(), mana);
else
print("åñëè óðîâåíü 20 è áîëüøå, òî");
for i, creature in GetAttackerCreatures() do
startThread(UnitCastAimedSpell, GetDefenderHero(), 5, creature);
print("êàñòóåì øàð");
end;
SetUnitManaPoints(GetDefenderHero(), mana);
print("âîçâðàùàåì ìàíó");
end
end;
end;
end;Сорри, если русский текст не отобразится, но и так, вроде, всё понятно.Добавлено через 3 минуты
Может, в Меп скрипте вот тут косяк? И какие-то скобки лишние, или кавычки?
SetGameVar("LevR", GetGameVar("LevR")+1);
Trigger(HERO_LEVELUP_TRIGGER, "Raelag")а должно бытьTrigger(HERO_LEVELUP_TRIGGER, "Raelag", "HeroLevelSaveF")
Только он всё равно кастует глыбу, что с LevR = GetHeroLevel('Raelag'); что без, - значит, комбат скрипт не видит LevR.
Где-то тут ещё косяк.
function HeroLevelSaveF()
SetGameVar("LevR", ceil(GetHeroLevel('Raelag')); --Увеличиваем на 1 переменную с уровнем героя
print("Установили что LevR это Сет Гейм Вар");
endкроме того, огненный шар является не таргетным, а площадным спеллом, поэтому кастовать его надо по-другому:for i, creature in GetDefenderCreatures() do
local x, y = pos(creature)
startThread(UnitCastAreaSpell, GetAttackerHero(), 5, x, y);
print("Кастуем шар");
end
Добавлено через 7 минут
ScriptEditor ругается на строчку SetGameVar("LevR", ceil(GetHeroLevel('Raelag'));
Придётся третью скобку рисовать, вот так?
SetGameVar("LevR", ceil(GetHeroLevel('Raelag')));
Сейчас попробую. Что до шара, вы правы, но я его сюда поставила просто чтобы отличался от глыбы, а то выглядят глыба и улучшенная глыба одинаково и я в бою не различаю, что Раилаг кастует. Спасибо, однако, за науку, пригодится. Сейчас поменяю шар на молнию, она не площадная.
Добавлено через 7 минут
ScriptEditor ругается на строчку SetGameVar("LevR", ceil(GetHeroLevel('Raelag'));
Придётся третью скобку рисовать, вот так?
SetGameVar("LevR", ceil(GetHeroLevel('Raelag')));