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

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

Аватар пользователя
#2208
serovoy, когда создаешь нового героя, ему нужно присвоить уникальное системное имя, по которому потом к нему и обращаешься из скриптов.
#2209
Совсем недавно начал осваивать скрипты, даже самые простейшие которые расписанны по 5 раз подряд выхывают трудности, однако вроде разобрался.
Нужна помощь в данном вопросе.
Не могу понять как правильно пользоваться командой : "ShowFlyingSign"

function offlich ()
Trigger(REGION_ENTER_AND_STOP_TRIGGER, "off", nil);
ShowFlyingSign(GetMapDataPath().."offli.txt");
end;
Trigger(REGION_ENTER_AND_STOP_TRIGGER, "off", "offlich");
к тому же смогу ли я к "ShowFlyingSign" добавить "PLAYERFLT_1"??
Так как создаю мультиплеерную карту , хочу что бы сообщение выдавало первому игроку чуть выше использовал :

function mostFF ()
Trigger(REGION_ENTER_AND_STOP_TRIGGER, "most", nil);
MessageBoxForPlayers(PLAYERFLT_1, GetMapDataPath().."most11.txt");
end;
Trigger(REGION_ENTER_AND_STOP_TRIGGER, "most", "mostFF");
Аватар пользователя
#2210
В ShowFlyingSign есть еще параметры: имя объекта, от которого будет отлетать сообщение; номер игрока, которому будет сообщение видно (-1, если всем); длительность полета сообщения в секундах. Порядок лучше проверить в мануале по скриптовым функциям.
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
#2212
в общем нашел я синтаксис

ShowFlyingSign(messageName, objectName, targetPlayerID = -1, time = 1.0);
начал его прописывать и "скриптэдишн" начал ругаться
я его "изменил" и он отстал , однако мой вариант не сработал и выглядел так:

ShowFlyingSign("GetMapDataPath().."offli.txt","offlich", "targetPlayerID = -1", "time = 1.5");
Прошло немного врмени и я понял что без "шаблона" не справиться, порылся в нете и нашел

ShowFlyingSign({path.."slavescaptured.txt";totalcost=tc},hero,PLAYER_1,5);
подправил под себя и вышло

ShowFlyingSign(GetMapDataPath().."offlich.txt", off, Player_1, 5);
однако скрипт всё равно не работает.=) Подскажите что я делаю не так, возможно это изза того что я даю вместо "имени обьекта" "имя региона"??

исходный скр.

function offlich ()
Trigger(REGION_ENTER_AND_STOP_TRIGGER, "off", nil);
ShowFlyingSign(GetMapDataPath().."offlich.txt", off, Player_1, 5);
end;
Trigger(REGION_ENTER_AND_STOP_TRIGGER, "off", "offlich");

P.s. скрипт работает до части где в нужном регионе герой останавливаеться)
Аватар пользователя
#2213
Регион не есть объект, объект это герой, замок или скажем куст с именем. В функцию триггера передается имя героя, ступившего в регион, проще всего его и использовать. Player_1 вероятно не сработает, поскольку это совсем не то же самое, что PLAYER_1.
Я бы рекомендовал скачать любую сюжетную карту, достаточно насыщенную скриптами, и по любой непонятной функции просто искать пример использования в ней.
#2214
Спасибо за ответы)
Думаю поищу карту со скриптами , но в данной ситуации решил не мучаться а воспользоваться шаблоном из руководства "OGO" через "тоуч обьект"
Аватар пользователя
#2215
Подскажите,а возможно ли сделать так чтобы один герой компьютера каждый ход отслеживал кординаты другого героя компьютера)

Ну как бы заплатил герою через QuestionBox,и он с EnableHeroAl и MoveHero побежал твоего врага убивать. Как сделать чтобы первый герой в начале каждого хода запрагивал кординаты второго героя и двигался в них? . До тех пор пока сам не погибнет.

Городов и гарнизонов нет,MoveHero работает отлично. Заранее огромное спасибо.
Аватар пользователя
#2216
Вот сокращенный вариант из моей карты, только комп за игроком гонится, поэтому может будет не совсем так выглядеть, как вам хотелось. hero герой компьютера, player_hero соответственно герой игрока. Запускать как поток. Комп пытается допрыгать до игрока в начале хода, плюс если игрок за это время быстро отойдет в сторону, это тоже корректно обработается.
function MainKnightSavedHeroReturnWithPlayerThread()

local hero = quest_main_knight.AttackParam('hero');
local start_date = GetDate(ABSOLUTE_DAY);
local move_date = 0;
local curr_date;
local hx_last, hy_last, hf_last = -1, -1, -1;
local hx_curr, hy_curr, hf_curr;

while(1) do
if(IsObjectExists(hero)) then

if(IsObjectExists(player_hero)) then
hx_curr, hy_curr, hf_curr = GetObjectPosition(player_hero);
if((hx_last ~= hx_curr) or (hy_last ~= hy_curr) or (hf_last ~= hf_curr)) then
hx_last, hy_last, hf_last = hx_curr, hy_curr, hf_curr;
MoveHeroRealTime(hero, hx_curr, hy_curr, hf_curr);
end
end

-- в начале каждого хода добавляются очки передвижения
curr_date = GetDate(ABSOLUTE_DAY);
if(move_date ~= curr_date) then
move_date = curr_date;
ChangeHeroStat(hero, STAT_MOVE_POINTS, 2500);
sleep(1);
if(IsObjectExists(player_hero)) then
hx_curr, hy_curr, hf_curr = GetObjectPosition(player_hero);
MoveHeroRealTime(hero, hx_curr, hy_curr, hf_curr);
end
end

else
break
end
sleep(5);
end

end
Аватар пользователя
#2217
Есть ли скрипт, который определяет, выполняется ли данная функция или уже нет? (без использования флага в самой функции)
Например, есть:

for i=1,100 do
startThread(Func);
end
Получается так, что могут запуститься несколько функций Func, даже не смотря на то, что могла бы не завершиться предыдущая.
Моды для HeroesV:
NHF 0.90 : NHF - группа в VK

Карты для HeroesV:
Путешествие , Условие крови , Рука судьбы.Часть 1: В поход , Рука судьбы.Часть 2: Отчаянье , Рука судьбы.Часть 3: Восхождение , Стойкость
Абсолютная власть , Иду на Вы! , Корона Ургаша , На задворках
Мир надо уничтожить... Чтобы создать свой...
В ответ пользователю Dyrman
Аватар пользователя
#2218
Dyrman
Есть ли скрипт, который определяет, выполняется ли данная функция или уже нет? (без использования флага в самой функции)
Например, есть:

for i=1,100 do
startThread(Func);
end
Получается так, что могут запуститься несколько функций Func, даже не смотря на то, что могла бы не завершиться предыдущая.

local threads = {}

local startExec = function(func)
local threads = threads
errorHook(function()
%threads[%func] = nil
end)
threads[func] = 1
func()
threads[func] = nil
end

function startThreadOnce(func)
if not %threads[func] then
startThread(%startExec, func)
end
end

function isFunctionRunning(func)
return %threads[func]
end
В данном примере startThreadOnce запускает функцию только если она не запущена в данный момент. isFunctionRunning проверяет запущена ли функция в данный момент.
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
Аватар пользователя
#2219
Извините за банальный вопрос но всёже:

Итак,напишите пожалуста кому не трудно 100% рабочий пример скрипта StartCombat . Всего 1 строчку. Ато сколько мануалов не перелистал - везде разное описание этого скрипта,и почемуто ни одно не работает.Заранее спасибо.
Аватар пользователя
#2220
Бой Рутгера с 15 крестьянами и 6 лучниками:
StartCombat('Brem', nil, 2, CREATURE_PEASANT, 15, CREATURE_ARCHER, 6)
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
В ответ пользователю Jack_of_shadows
#2221
Jack_of_shadows
serovoy, когда создаешь нового героя, ему нужно присвоить уникальное системное имя, по которому потом к нему и обращаешься из скриптов.
А если я играю в чужую авторскую карту с созданным на ней героем, как узнать его системное имя? Есть консольная команда какая-то или что-то в этом роде?
Аватар пользователя
#2222
serovoy, быстрее всего наверное открыть карту архиватором и глянуть в файле описания героя.

upd: хотя чего это я, есть же GetPlayerHeroes(player_id), которая выдает массив имен героев по ID игрока.
#2223
Здорово! А в синглплеере оно работает? Просто начинаю кампанию, ввожу сие добро, а эффекта ноль. :eek:

Статистика

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

Сейчас на сайте 4 пользователей 1301 гостей