Перейти к содержанию

Сообщения от Скрипты

Аватар пользователя
смотри, во-первых, в xdb-файле скрипта у тебя не был указан путь к lua-файлу. Т.е, даже если бы путь был указан корректно, скрипт бы не запускался. Проблема же с указанием адекватного пути довольно каверзная, поскольку, SetHeroCombatScript, в отличие от многих других функций требует явного указания начального слеша, даже если использовать функцию GetMapDataPath(). Т.е. корректный скрипт будет такой:
path = '/'..GetMapDataPath()
main_hero = 'Raelag'
print("ГГ назван");

SetHeroCombatScript('Raelag', path.."CombatScript.xdb#xpointer(/Script)");
print("комбат скрипт запущен");
ну и кроме того, есть опечатки в названиях функций в боевом скрипте, а так же не указаны цели для кастов в функции UnitCastAimedSpell. Вот твоя карта с пофикшенными путями, но чтобы Раилаг правильно кастовал, тебе нужно определить, в кого нужно делать эти касты)
Вложения 1
1 файл • Общий размер: 16,3 KB
Нет войне.
Аватар пользователя
Марта, да, новые ссылки правильные.
Марта
Мой combat script.xdb ведёт не к combat script.lua, а к map script.lua. Интересно, как же это так вышло. Пойду править.
Загадка, почему ошибка MapScript.lua видна в бою, теперь ясна)

Gerter — отдельное спасибо.
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
Discord-сервер "Герои 5: S.T.A.L.K.E.R"
Сервер по модификации "Герои 5: S.T.A.L.K.E.R"
_________________
В ответ пользователю }{0TT@6bI4
Хоттабыч, но теперь у меня другая ошибка).

Я переписала скрипты на нетронутой версии карты, на которой раньше никаких скриптов не было.
И теперь в бою мне пишут:

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'?
я написал же выше, что опечатка в имени функции. Должно быть GetUnitManaPoints. Кроме этого, вызовы функции UnitCastAimedSpell будут вызывать ошибку, т.к. в них не указана цель каста третьим аргументом.
Нет войне.
В ответ пользователю Марта
Просто скопировала в MapScript скрипт Gerter, - ни хрена не изменилось.
Value was NIL when getting global with name 'GetUntiManaPoints', и всё тут.
Тьфу, млин, я слепая коза. сейчас поправлю.

Добавлено через 12 минут
Да, мана теперь исправно добавляется, большое спасибо.
attempt to call a nil value - это консоль пишет про отсутствие цели заклинания?
И как добавить эту цель?
Задумка была в том, чтобы повторить заклинание Эльвы из карты "Незваные гости", но не на молнию, а на холод, и мне пока не нужно так много героев, как там.
Аватар пользователя
нет, ошибка attempt to call a nil value означает, что ты пытаешься вызвать какую-то неизвестную игре функцию. Функции с именем 'GetUntiManaPoints' игра не знает, поэтому и ругается.
Хочешь сделать, чтобы в начале боя на всех врагов кастовались ледяные глыбы? Тогда скрипт надо изменить примерно так:
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
Нет войне.
В ответ пользователю Gerter
Огромное спасибо. Я передрала скрипты с присланной моей же карты, и ошибка стала как вы написали, - сейчас попробую добавить цель для заклинания.

Добавлено через 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 энда.

С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
Discord-сервер "Герои 5: S.T.A.L.K.E.R"
Сервер по модификации "Герои 5: S.T.A.L.K.E.R"
_________________
Аватар пользователя
Добавление блока кода (с автоматической подсветкой) идёт через нажатие кнопки с фигурными скобками снаружи точки с запятой.
Вложения 1
1 файл • Общий размер: 5,4 KB
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
Discord-сервер "Герои 5: S.T.A.L.K.E.R"
Сервер по модификации "Герои 5: S.T.A.L.K.E.R"
_________________
В ответ пользователю }{0TT@6bI4
Спасибо, сейчас попробую.
Разумеется, это только половина скрипта - на атакующего, - я решила не грузить форум и вас лишними неудобочитаемыми скриптами. Дефендера я сделаю по образцу аттакера.

Добавлено через 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")
Нет войне.
В ответ пользователю Gerter
Массаракш, действительно, - где были мои глаза. Спасибо.
Только он всё равно кастует глыбу, что с LevR = GetHeroLevel('Raelag'); что без, - значит, комбат скрипт не видит LevR.
Где-то тут ещё косяк.
Аватар пользователя
функцию, срабатывающую при повышении уровня можно поменять вот таким образом, т.к. GetGameVar возвращает не совсем то, что вы хотите)
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
Нет войне.
В ответ пользователю Gerter
Сейчас попробую. Что до шара, вы правы, но я его сюда поставила просто чтобы отличался от глыбы, а то выглядят глыба и улучшенная глыба одинаково и я в бою не различаю, что Раилаг кастует. Спасибо, однако, за науку, пригодится. Сейчас поменяю шар на молнию, она не площадная.

Добавлено через 7 минут
ScriptEditor ругается на строчку SetGameVar("LevR", ceil(GetHeroLevel('Raelag'));
Придётся  третью скобку рисовать, вот так?
SetGameVar("LevR", ceil(GetHeroLevel('Raelag')));
В ответ пользователю Марта
Аватар пользователя
Марта
Сейчас попробую. Что до шара, вы правы, но я его сюда поставила просто чтобы отличался от глыбы, а то выглядят глыба и улучшенная глыба одинаково и я в бою не различаю, что Раилаг кастует. Спасибо, однако, за науку, пригодится. Сейчас поменяю шар на молнию, она не площадная.

Добавлено через 7 минут
ScriptEditor ругается на строчку SetGameVar("LevR", ceil(GetHeroLevel('Raelag'));
Придётся  третью скобку рисовать, вот так?
SetGameVar("LevR", ceil(GetHeroLevel('Raelag')));
да, скобку пропустил.
Нет войне.

Статистика

Приветствуем новейшего участника: Emil