ну тогда OBJECT_TOUCH_TRIGGER повесить на каждый двелл и проверять, кто коснулся. Если ваш герой, то выдать нужное сообщение, если комп, то, например, скриптом добавлять ему юнитов с двеллинга.
Сообщения от Скрипты
я опять с вопросом: кто-нибудь знает как проверить изучение определённого заклинания, а то в документации я такого тригера не видел-
пример:
если герой изучил такое-то заклинание, то он получает +1 к колде
пример:
если герой изучил такое-то заклинание, то он получает +1 к колде
LetoX, триггера такого нет, но можно организовать поток, который будет постоянно проверять у героя наличие заклинания. Смотрите страницу-две назад примеры с потоками (функция startThread), только заменив условие на KnowHeroSpell(heroName, spell).
люди подскажите;) , в чём проблема: написал боевой скрипт для некроманта на каст массовых заклинаний тьмы в зависимости от уровня
function start()
lev = GetGameVar("level") + 0;
mana = GetUnitManaPoints(GetAttackerHero())
SetUnitManaPoints(GetAttackerHero(), 100);
if lev < 10 then
UnitCastGlobalSpell(GetAttackerHero(), 212)
elseif lev < 20 then
UnitCastGlobalSpell(GetAttackerHero(), 212)
UnitCastGlobalSpell(GetAttackerHero(), 215)
elseif lev < 30 then
UnitCastGlobalSpell(GetAttackerHero(), 212)
UnitCastGlobalSpell(GetAttackerHero(), 215)
UnitCastGlobalSpell(GetAttackerHero(), 210)
else
UnitCastGlobalSpell(GetAttackerHero(), 212)
UnitCastGlobalSpell(GetAttackerHero(), 215)
UnitCastGlobalSpell(GetAttackerHero(), 210)
UnitCastGlobalSpell(GetAttackerHero(), 213)
end
SetUnitManaPoints(GetAttackerHero(), mana);
end
в бою ничего не происходит(переменная задана, это проверено другим скриптом):confused:
function start()
lev = GetGameVar("level") + 0;
mana = GetUnitManaPoints(GetAttackerHero())
SetUnitManaPoints(GetAttackerHero(), 100);
if lev < 10 then
UnitCastGlobalSpell(GetAttackerHero(), 212)
elseif lev < 20 then
UnitCastGlobalSpell(GetAttackerHero(), 212)
UnitCastGlobalSpell(GetAttackerHero(), 215)
elseif lev < 30 then
UnitCastGlobalSpell(GetAttackerHero(), 212)
UnitCastGlobalSpell(GetAttackerHero(), 215)
UnitCastGlobalSpell(GetAttackerHero(), 210)
else
UnitCastGlobalSpell(GetAttackerHero(), 212)
UnitCastGlobalSpell(GetAttackerHero(), 215)
UnitCastGlobalSpell(GetAttackerHero(), 210)
UnitCastGlobalSpell(GetAttackerHero(), 213)
end
SetUnitManaPoints(GetAttackerHero(), mana);
end
в бою ничего не происходит(переменная задана, это проверено другим скриптом):confused:
банальный вариант - добавить sleep после SetUnitManaPoints(). ну и консоль ругается на что-нибудь?(думаю там должно быть что-то типа 'attacker-hero cant cast spell..')
Консоль это вообще мой самый верный друг - она тупо не включается.:D Вроде в profiles написал нужную строчку(ctrl + C , ctrl + V), в input в моём профиле тоже написал show_console....... , однако консоль не включается, с ней конечно по проще
LetoX, возможные ошибки:
1. Функция start() кажется должна идти с большой буквы - Start(). Lua чувствителен к регистру.
2. Мана возможно не сразу будет дана герою, дождаться наверняка можно с помощью такой конструкции:
1. Функция start() кажется должна идти с большой буквы - Start(). Lua чувствителен к регистру.
2. Мана возможно не сразу будет дана герою, дождаться наверняка можно с помощью такой конструкции:
SetUnitManaPoints(GetAttackerHero(), 100);
repeat sleep() until(GetUnitManaPoints(GetAttackerHero()) == 100);3. Функции каста заклинаний в некоторых случаях могут зафэйлить и скрипт вывалится в этом месте. Есть более безопасный вариант их запускать через отдельный поток:startThread(UnitCastGlobalSpell, GetAttackerHero(), 212);И ещё после функций каста и перед восстановлением прежней маны лучше поставить sleep(1), чтобы мана за каст успела отняться до её восстановления.
уже не знаю в чём проблема, пробовал простой скрипт на призыв существ числом уровень*2 - всё работает, вроде всё правильно , а ничего не происходит:(
function Start()
lev = GetGameVar("level") + 0;
mana = GetUnitManaPoints(GetAttackerHero())
SetUnitManaPoints(GetAttackerHero(), 100);
repeat sleep() until(GetUnitManaPoints(GetAttackerHero()) == 100);
if lev < 10 then
startThread(UnitCastGlobalSpell, GetAttackerHero(), 212);
elseif lev < 20 then
startThread(UnitCastGlobalSpell, GetAttackerHero(), 212);
startThread(UnitCastGlobalSpell, GetAttackerHero(), 215);
elseif lev < 30 then
startThread(UnitCastGlobalSpell, GetAttackerHero(), 212);
startThread(UnitCastGlobalSpell, GetAttackerHero(), 215);
startThread(UnitCastGlobalSpell, GetAttackerHero(), 210);
else
startThread(UnitCastGlobalSpell, GetAttackerHero(), 212);
startThread(UnitCastGlobalSpell, GetAttackerHero(), 215);
startThread(UnitCastGlobalSpell, GetAttackerHero(), 210);
startThread(UnitCastGlobalSpell, GetAttackerHero(), 213);
end
sleep(2);
SetUnitManaPoints(GetAttackerHero(), mana);
end
function Start()
lev = GetGameVar("level") + 0;
mana = GetUnitManaPoints(GetAttackerHero())
SetUnitManaPoints(GetAttackerHero(), 100);
repeat sleep() until(GetUnitManaPoints(GetAttackerHero()) == 100);
if lev < 10 then
startThread(UnitCastGlobalSpell, GetAttackerHero(), 212);
elseif lev < 20 then
startThread(UnitCastGlobalSpell, GetAttackerHero(), 212);
startThread(UnitCastGlobalSpell, GetAttackerHero(), 215);
elseif lev < 30 then
startThread(UnitCastGlobalSpell, GetAttackerHero(), 212);
startThread(UnitCastGlobalSpell, GetAttackerHero(), 215);
startThread(UnitCastGlobalSpell, GetAttackerHero(), 210);
else
startThread(UnitCastGlobalSpell, GetAttackerHero(), 212);
startThread(UnitCastGlobalSpell, GetAttackerHero(), 215);
startThread(UnitCastGlobalSpell, GetAttackerHero(), 210);
startThread(UnitCastGlobalSpell, GetAttackerHero(), 213);
end
sleep(2);
SetUnitManaPoints(GetAttackerHero(), mana);
end
LetoX может вы в другом месте боевого скрипта ошибку допустили, и весь интерпретатор падает? Если есть рабочий вариант с другим заклинанием, и нерабочий текущий, попробуйте по чуть чуть переходить от одного к другому и смотреть на каком этапе перестанет работать.
Вот кусок моего похожего скрипта, который работает нормально:
Вот кусок моего похожего скрипта, который работает нормально:
player_hero = '';
function Start()
if(IsHuman(ATTACKER)) then
player_hero = GetAttackerHero();
else
player_hero = GetDefenderHero();
end
combatSetPause(not nil);
local last_mana = GetUnitManaPoints(player_hero);
SetUnitManaPoints(player_hero, 100);
repeat sleep() until(GetUnitManaPoints(player_hero) == 100);
startThread(UnitCastGlobalSpell, player_hero, SPELL_MASS_STONESKIN);
sleep(1);
SetUnitManaPoints(player_hero, last_mana);
repeat sleep() until(GetUnitManaPoints(player_hero) == last_mana);
setATB(player_hero, 0.5);
sleep(1);
combatSetPause(nil);
end
Такой вопрос. Хочу, чтобы герой Ласло бегал поочерёдно по трём точкам. После срабатывания триггера он сразу идёт к последней, там и отдыхает. Что поправить?
function Patrul ()
MoveHero("Laszlo", 197, 184, GROUND)
MoveHero("Laszlo", 159, 196, GROUND)
MoveHero("Laszlo", 156, 158, GROUND)
Trigger(OBJECT_CAPTURE_TRIGGER, "derevo1", nil)
end;
Trigger(OBJECT_CAPTURE_TRIGGER, "derevo1", "Patrul")
OrnsteinDragonslayer, команды должны выполняться не все сразу, а сначала идти в одну точку, дождаться когда герой дойдёт (проверяя его координаты или поставив в эту точку регион с триггером), только после этого отправлять во второую точку и так далее.
Проблема такова: хочу, чтобы квест "uderzhatG" активировался, после захвата города "gorodSvyat". Так же, если этот город принадлежит игроку 2, то тогда квест проваливался и игрок проигрывал миссию. Так же, после уничтожения героя "Nemor", квест выполняется. Но после того, как я добавляю в свой код функции ниже, то всё ломается и не триггериться (хотя начальные настройки выставляются). В чём проблема?
function uderzhat ()
SetObjectiveState("uderzhatG", OBJECTIVE_ACTIVE);
Trigger(OBJECT_CAPTURE_TRIGGER, "gorodSvyat", nil );
end;
Trigger(OBJECT_CAPTURE_TRIGGER, "gorodSvyat", "uderzhat" );
function CheckSvyat ()
while (1) do
sleep(2);
if GetObjectOwner("gorodSvyat")==PLAYER_2 then
sleep (2)
SetObjectiveState("uderzhatG", OBJECTIVE_FAILED);
sleep (15)
Loose ();
break
end;
end;
end;
startThread (CheckSvyat)
function UderzhatComplete ()
SetObjectiveState("uderzhatG", OBJECTIVE_COMPLETED);
Trigger (PLAYER_REMOVE_HERO_TRIGGER, "Nemor", nil)
end
Trigger (PLAYER_REMOVE_HERO_TRIGGER, "Nemor", "UderzhatComplete")
Проблема такова: хочу, чтобы квест "uderzhatG" активировался, после захвата города "gorodSvyat". Так же, если этот город принадлежит игроку 2, то тогда квест проваливался и игрок проигрывал миссию. Так же, после уничтожения героя "Nemor", квест выполняется. Но после того, как я добавляю в свой код функции ниже, то всё ломается и не триггериться (хотя начальные настройки выставляются). В чём проблема?function uderzhat ()
SetObjectiveState("uderzhatG", OBJECTIVE_ACTIVE);
Trigger(OBJECT_CAPTURE_TRIGGER, "gorodSvyat", nil );
end;
Trigger(OBJECT_CAPTURE_TRIGGER, "gorodSvyat", "uderzhat" );
function CheckSvyat ()
while (1) do
sleep(2);
if GetObjectOwner("gorodSvyat")==PLAYER_2 then
sleep (2)
SetObjectiveState("uderzhatG", OBJECTIVE_FAILED);
sleep (15)
Loose ();
break
end;
end;
end;
startThread (CheckSvyat)
function UderzhatComplete ()
SetObjectiveState("uderzhatG", OBJECTIVE_COMPLETED);
Trigger (PLAYER_REMOVE_HERO_TRIGGER, "Nemor", nil)
end
Trigger (PLAYER_REMOVE_HERO_TRIGGER, "Nemor", "UderzhatComplete")
Может буду не прав, но возможно поставить триггер: Trigger(OBJECT_CAPTURE_TRIGGER, "gorodSvyat", "CheckSvyat" );
Может буду не прав, но возможно поставить триггер: Trigger(OBJECT_CAPTURE_TRIGGER, "gorodSvyat", "CheckSvyat" );
Вместо старттреда или куда?
Вместо старттреда или куда?
После этой строки :Trigger(OBJECT_CAPTURE_TRIGGER, "gorodSvyat", nil )
Работает?
Статистика
Приветствуем новейшего участника:
recijeb
Сейчас на сайте 10 пользователей 1218 гостей
Посетители сегодня 32
- Валера 111
- Граф Орлов
- Джек
- Драккошка
- Дугал
- Злобный Ящур
- Небо
- Нэйко
- Саргон
- ALVYDAS
- Arandor
- AstralLein
- burymm
- Dark Jack
- dotahcxun
- elizbar1967
- fktifzobr@mail.ru
- Golvek
- Happy Life
- Heroist
- Hottler
- HwKeeper
- IchGViji
- kcfgogbfalgfl
- LifeForm
- Narron
- OrnsteinDragonslayer
- PingWing
- Ple-Sen
- Sir Syddan
- Siverfale
- Valery59