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

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

Аватар пользователя
10 лет назад
serovoy, когда создаешь нового героя, ему нужно присвоить уникальное системное имя, по которому потом к нему и обращаешься из скриптов.
10 лет назад
Совсем недавно начал осваивать скрипты, даже самые простейшие которые расписанны по 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");
Аватар пользователя
10 лет назад
В ShowFlyingSign есть еще параметры: имя объекта, от которого будет отлетать сообщение; номер игрока, которому будет сообщение видно (-1, если всем); длительность полета сообщения в секундах. Порядок лучше проверить в мануале по скриптовым функциям.
10 лет назад
в общем нашел я синтаксис

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. скрипт работает до части где в нужном регионе герой останавливаеться)
Аватар пользователя
10 лет назад
Регион не есть объект, объект это герой, замок или скажем куст с именем. В функцию триггера передается имя героя, ступившего в регион, проще всего его и использовать. Player_1 вероятно не сработает, поскольку это совсем не то же самое, что PLAYER_1.
Я бы рекомендовал скачать любую сюжетную карту, достаточно насыщенную скриптами, и по любой непонятной функции просто искать пример использования в ней.
10 лет назад
Спасибо за ответы)
Думаю поищу карту со скриптами , но в данной ситуации решил не мучаться а воспользоваться шаблоном из руководства "OGO" через "тоуч обьект"
Аватар пользователя
10 лет назад
Подскажите,а возможно ли сделать так чтобы один герой компьютера каждый ход отслеживал кординаты другого героя компьютера)

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

Городов и гарнизонов нет,MoveHero работает отлично. Заранее огромное спасибо.
Аватар пользователя
10 лет назад
Вот сокращенный вариант из моей карты, только комп за игроком гонится, поэтому может будет не совсем так выглядеть, как вам хотелось. 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
Аватар пользователя
10 лет назад
Есть ли скрипт, который определяет, выполняется ли данная функция или уже нет? (без использования флага в самой функции)
Например, есть:

for i=1,100 do
startThread(Func);
end
Получается так, что могут запуститься несколько функций Func, даже не смотря на то, что могла бы не завершиться предыдущая.
В ответ пользователю Dyrman
Аватар пользователя
10 лет назад
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 проверяет запущена ли функция в данный момент.
Аватар пользователя
10 лет назад
Извините за банальный вопрос но всёже:

Итак,напишите пожалуста кому не трудно 100% рабочий пример скрипта StartCombat . Всего 1 строчку. Ато сколько мануалов не перелистал - везде разное описание этого скрипта,и почемуто ни одно не работает.Заранее спасибо.
Аватар пользователя
10 лет назад
Бой Рутгера с 15 крестьянами и 6 лучниками:
StartCombat('Brem', nil, 2, CREATURE_PEASANT, 15, CREATURE_ARCHER, 6)
В ответ пользователю Jack_of_shadows
10 лет назад
Jack_of_shadows
serovoy, когда создаешь нового героя, ему нужно присвоить уникальное системное имя, по которому потом к нему и обращаешься из скриптов.
А если я играю в чужую авторскую карту с созданным на ней героем, как узнать его системное имя? Есть консольная команда какая-то или что-то в этом роде?
Аватар пользователя
10 лет назад
serovoy, быстрее всего наверное открыть карту архиватором и глянуть в файле описания героя.

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

Статистика

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

Сейчас на сайте 9 пользователей 1329 гостей