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

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

Аватар пользователя
вопрос к опытным скриптерам:
как лучше всего (минимальным кол-вом кода) сделать обработчик посещенности строения по типу склепа например, мои идеи ограничиваются способом - через включение/выключение проверочной константы в триггере нового дня с нужными мне условиями. Но может есть способ по эффективнее?)
Карты для Heroes V: Повелители орды:
Multiplayer: Господство, Извечное противостояние, Война за Магию, Торговая империя, Анатомия войны, Эксперимент
SingleScenario: Последний Рубеж, Трон, Элиралис, Вернуться домой!, Лабиринты разума
Campaign: Колонизация
Аватар пользователя
KioM, опишите лучше подробнее что нужно, а то я так понимаю, что "обработчик посещенности строения" это функция, которая срабатывает при посещении строения. В таком случае непонятно в чем загвоздка, если есть триггер касания объекта.
В ответ пользователю Jack_of_shadows
Аватар пользователя
Jack_of_shadows
KioM, опишите лучше подробнее что нужно, а то я так понимаю, что "обработчик посещенности строения" это функция, которая срабатывает при посещении строения. В таком случае непонятно в чем загвоздка, если есть триггер касания объекта.

почти) нужно: есть храм (свой собственный) при активации идет скрипт, бой и т.д. затем хочу сделать так, чтобы при посещении его скажем последующие несколько дней, до начала новой недели выдавало сообщение и отказ (это тоже все понятно) но проверку на то посещено оно уже каким-то игроком или несколькими или нет как лучше сделать? идея была через указатель состояния в функции нового дня через триггер, но может есть более простая и универсальная фича для подобных дел? для подобных строений, которая передавала бы информацию, что его уже разграбили
Карты для Heroes V: Повелители орды:
Multiplayer: Господство, Извечное противостояние, Война за Магию, Торговая империя, Анатомия войны, Эксперимент
SingleScenario: Последний Рубеж, Трон, Элиралис, Вернуться домой!, Лабиринты разума
Campaign: Колонизация
Аватар пользователя
Чуть проще во время активации сохранять в переменную текущую дату, и при касании объекта сверять дату с этой переменной. Если поведение одинаково для всех игроков, переменная одна, если разная для каждого игрока - таблица переменных.
Если же нужно как-то внешне показывать на объекте, разграблен он или уже обновился, тогда конечно только через триггер нового дня, иных способов нет.
В ответ пользователю Jack_of_shadows
Аватар пользователя
Jack_of_shadows
Чуть проще во время активации сохранять в переменную текущую дату, и при касании объекта сверять дату с этой переменной.
Спасибо, то что нужно
Карты для Heroes V: Повелители орды:
Multiplayer: Господство, Извечное противостояние, Война за Магию, Торговая империя, Анатомия войны, Эксперимент
SingleScenario: Последний Рубеж, Трон, Элиралис, Вернуться домой!, Лабиринты разума
Campaign: Колонизация
Аватар пользователя
Имеется код:
local NHF_Trigger_env = {trig = {}}
print("T1:");
NHF_Trigger_env.Trigger = Trigger
function NHF_Trigger_env.tostring(a)
return a and (a.."" ~= a and a or '"'..a..'"') or "nil"
end;
function NHF_Trigger_env.emptytable(t)
print("T2:");
for k,v in t do
if v then return nil end
end
return 1
end;
function NHF_Trigger_env.hasparam(i)
print("T3:");
return i ~= 0 and i ~= 10 and i ~= 11
end;
function __HANDLER(trigtype, param)
print("T4:");
print("T5:");
local h = %NHF_Trigger_env.trig[trigtype]
if not h then return end
local NHF_Trigger_env = %NHF_Trigger_env
return function(a, b, c, d)
a = %NHF_Trigger_env.tostring(a)
b = %NHF_Trigger_env.tostring(b)
c = %NHF_Trigger_env.tostring(c)
d = %NHF_Trigger_env.tostring(d)
local args = "(" .. a .. "," .. b .. "," .. c .. "," .. d .. ")"
print("T6:");
for sender, tab in %h do
if sender ~= 0 then
local handler = %NHF_Trigger_env.hasparam(%trigtype) and tab and tab[%param] or tab
if handler then
startThread(parse(handler .. args))
end
end
end
local tab = %h[0]
print("T7:");
if tab then
local handler = %NHF_Trigger_env.hasparam(%trigtype) and tab and tab[%param] or tab
if handler then
print("T8:");
startThread(parse(handler .. args))
end
end
end
end;
function Trigger(sender, trig, par, handler)
print("T9:");
if sender .. "" ~= sender then
print("T10:");
sender, trig, par, handler = 0, sender, trig, par
end
if not %NHF_Trigger_env.hasparam(trig) then
print("T11:");
par, handler = nil, par
end
local need_disable = handler ~= nil
if handler then
print("T12:");
%NHF_Trigger_env.trig[trig] = %NHF_Trigger_env.trig[trig] or {}
if par then
print("T13:");
%NHF_Trigger_env.trig[trig][sender] = %NHF_Trigger_env.trig[trig][sender] or {}
%NHF_Trigger_env.trig[trig][sender][par] = handler
else
print("T14:");
%NHF_Trigger_env.trig[trig][sender] = handler
end
else
print("T15:");
if %NHF_Trigger_env.trig[trig] then
if %NHF_Trigger_env.trig[trig][sender] then
if par then
print("T16:");
%NHF_Trigger_env.trig[trig][sender][par] = nil
need_disable = %NHF_Trigger_env.emptytable(%NHF_Trigger_env.trig[trig][sender])
if need_disable then %NHF_Trigger_env.trig[trig][sender] = nil end
else
%NHF_Trigger_env.trig[trig][sender] = nil
end
need_disable = %NHF_Trigger_env.emptytable(%NHF_Trigger_env.trig[trig])
if need_disable then %NHF_Trigger_env.trig[trig] = nil end
end
end
end
if not need_disable then return end
if par then
print("T17:");
%NHF_Trigger_env.Trigger(trig, par, handler and "__HANDLER(" .. trig .. "," .. %NHF_Trigger_env.tostring(par) .. ")")
else
%NHF_Trigger_env.Trigger(trig, handler and "__HANDLER(" .. trig .. ")")
end
print("T18:end");
end;

Выдаёт ошибку:


Есть ли предположения, что тут не так?
Вложения 1
1 файл • Общий размер: 21,3 KB
Моды для HeroesV:
NHF 0.90 : NHF - группа в VK

Карты для HeroesV:
Путешествие , Условие крови , Рука судьбы.Часть 1: В поход , Рука судьбы.Часть 2: Отчаянье , Рука судьбы.Часть 3: Восхождение , Стойкость
Абсолютная власть , Иду на Вы! , Корона Ургаша , На задворках
Мир надо уничтожить... Чтобы создать свой...
В ответ пользователю Dyrman
Аватар пользователя
Dyrman
Имеется код:
local NHF_Trigger_env = {trig = {}}
print("T1:");
NHF_Trigger_env.Trigger = Trigger
function NHF_Trigger_env.tostring(a)
return a and (a.."" ~= a and a or '"'..a..'"') or "nil"
end;
function NHF_Trigger_env.emptytable(t)
print("T2:");
for k,v in t do
if v then return nil end
end
return 1
end;
function NHF_Trigger_env.hasparam(i)
print("T3:");
return i ~= 0 and i ~= 10 and i ~= 11
end;
function __HANDLER(trigtype, param)
print("T4:");
print("T5:");
local h = %NHF_Trigger_env.trig[trigtype]
if not h then return end
local NHF_Trigger_env = %NHF_Trigger_env
return function(a, b, c, d)
a = %NHF_Trigger_env.tostring(a)
b = %NHF_Trigger_env.tostring(b)
c = %NHF_Trigger_env.tostring(c)
d = %NHF_Trigger_env.tostring(d)
local args = "(" .. a .. "," .. b .. "," .. c .. "," .. d .. ")"
print("T6:");
for sender, tab in %h do
if sender ~= 0 then
local handler = %NHF_Trigger_env.hasparam(%trigtype) and tab and tab[%param] or tab
if handler then
startThread(parse(handler .. args))
end
end
end
local tab = %h[0]
print("T7:");
if tab then
local handler = %NHF_Trigger_env.hasparam(%trigtype) and tab and tab[%param] or tab
if handler then
print("T8:");
startThread(parse(handler .. args))
end
end
end
end;
function Trigger(sender, trig, par, handler)
print("T9:");
if sender .. "" ~= sender then
print("T10:");
sender, trig, par, handler = 0, sender, trig, par
end
if not %NHF_Trigger_env.hasparam(trig) then
print("T11:");
par, handler = nil, par
end
local need_disable = handler ~= nil
if handler then
print("T12:");
%NHF_Trigger_env.trig[trig] = %NHF_Trigger_env.trig[trig] or {}
if par then
print("T13:");
%NHF_Trigger_env.trig[trig][sender] = %NHF_Trigger_env.trig[trig][sender] or {}
%NHF_Trigger_env.trig[trig][sender][par] = handler
else
print("T14:");
%NHF_Trigger_env.trig[trig][sender] = handler
end
else
print("T15:");
if %NHF_Trigger_env.trig[trig] then
if %NHF_Trigger_env.trig[trig][sender] then
if par then
print("T16:");
%NHF_Trigger_env.trig[trig][sender][par] = nil
need_disable = %NHF_Trigger_env.emptytable(%NHF_Trigger_env.trig[trig][sender])
if need_disable then %NHF_Trigger_env.trig[trig][sender] = nil end
else
%NHF_Trigger_env.trig[trig][sender] = nil
end
need_disable = %NHF_Trigger_env.emptytable(%NHF_Trigger_env.trig[trig])
if need_disable then %NHF_Trigger_env.trig[trig] = nil end
end
end
end
if not need_disable then return end
if par then
print("T17:");
%NHF_Trigger_env.Trigger(trig, par, handler and "__HANDLER(" .. trig .. "," .. %NHF_Trigger_env.tostring(par) .. ")")
else
%NHF_Trigger_env.Trigger(trig, handler and "__HANDLER(" .. trig .. ")")
end
print("T18:end");
end;

Выдаёт ошибку:


Есть ли предположения, что тут не так?
С какими параметрами был вызван переопределенный Trigger?
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
В ответ пользователю RedHeavenHero
Аватар пользователя
RedHeavenHero
С какими параметрами был вызван переопределенный Trigger?

Тип: OBJECT_TOUCH_TRIGGER
Проверка на существование героя и монстра стоит.
function __HANDLER(trigtype, param)
print("T4:"..trigtype);
print("T5:"..param);


С вызовами каждого триггера в отдельном потоке и нужными слипами в зависимости, мультиплеер карта или нет, можно заставить работать и в мульте. По крайней мере, часть триггеров хоть как-то работает.
Вложения 1
1 файл • Общий размер: 111,7 KB
Моды для HeroesV:
NHF 0.90 : NHF - группа в VK

Карты для HeroesV:
Путешествие , Условие крови , Рука судьбы.Часть 1: В поход , Рука судьбы.Часть 2: Отчаянье , Рука судьбы.Часть 3: Восхождение , Стойкость
Абсолютная власть , Иду на Вы! , Корона Ургаша , На задворках
Мир надо уничтожить... Чтобы создать свой...
В ответ пользователю Dyrman
Аватар пользователя
Dyrman
Тип: OBJECT_TOUCH_TRIGGER
Проверка на существование героя и монстра стоит.
function __HANDLER(trigtype, param)
print("T4:"..trigtype);
print("T5:"..param);


С вызовами каждого триггера в отдельном потоке и нужными слипами в зависимости, мультиплеер карта или нет, можно заставить работать и в мульте. По крайней мере, часть триггеров хоть как-то работает.
Прямо сейчас не могу проверить, но на первый взгляд можно попробовать заменить

local handler = %NHF_Trigger_env.hasparam(%trigtype) and tab and tab[%param] or tab

на

local handler
if %NHF_Trigger_env.hasparam(%trigtype) then
handler = tab and tab[%param]
else
handler = tab
end

в обоих случаях.
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
Аватар пользователя
Ошибка исчезла.
Надо проверять на карте, где несколько триггеров теперь.
Моды для HeroesV:
NHF 0.90 : NHF - группа в VK

Карты для HeroesV:
Путешествие , Условие крови , Рука судьбы.Часть 1: В поход , Рука судьбы.Часть 2: Отчаянье , Рука судьбы.Часть 3: Восхождение , Стойкость
Абсолютная власть , Иду на Вы! , Корона Ургаша , На задворках
Мир надо уничтожить... Чтобы создать свой...
Аватар пользователя
К сожалению, триггер из карты не отрабатывается при наличии более позднего триггера.
Моды для HeroesV:
NHF 0.90 : NHF - группа в VK

Карты для HeroesV:
Путешествие , Условие крови , Рука судьбы.Часть 1: В поход , Рука судьбы.Часть 2: Отчаянье , Рука судьбы.Часть 3: Восхождение , Стойкость
Абсолютная власть , Иду на Вы! , Корона Ургаша , На задворках
Мир надо уничтожить... Чтобы создать свой...
Аватар пользователя
Обозначен ли отправитель триггера, как другой?
То есть в моде все триггеры должны иметь дополнительный первый параметр - отправителя.
Например,
Trigger("NHF", OBJECT_TOUCH_TRIGGER, "mob", "handler_function")

Добавлено через 2 минуты
Каждый уникальный отправитель может иметь свой триггер на данный тип события и параметр (объект, игрока, ...)
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
В ответ пользователю RedHeavenHero
Аватар пользователя
RedHeavenHero
Обозначен ли отправитель триггера, как другой?
То есть в моде все триггеры должны иметь дополнительный первый параметр - отправителя.
Например,
Trigger("NHF", OBJECT_TOUCH_TRIGGER, "mob", "handler_function")

Добавлено через 2 минуты
Каждый уникальный отправитель может иметь свой триггер на данный тип события и параметр (объект, игрока, ...)
Да, и так, и так пробовал. Результат - одинаков.
Если в самой карте переопределяешь триггер - то всё работает. С другим параметром отправителя. Но скрипты же готовых карт не будешь переделывать...

Ещё вопрос стоит обнуления триггера, чтобы обнулялся только нужный, так будет правильно:
Trigger("NHF", OBJECT_TOUCH_TRIGGER, mob, nil);?
А если в самой карте обнуляется Trigger( OBJECT_TOUCH_TRIGGER, mob, nil); , то не на все ли подействует?

Как понимаю, если первый параметр = nil, это тоже является уникальным параметром отправителя.

Выясняю задержки и потоки, может, они влияют, потому что в коде все правильно.
Моды для HeroesV:
NHF 0.90 : NHF - группа в VK

Карты для HeroesV:
Путешествие , Условие крови , Рука судьбы.Часть 1: В поход , Рука судьбы.Часть 2: Отчаянье , Рука судьбы.Часть 3: Восхождение , Стойкость
Абсолютная власть , Иду на Вы! , Корона Ургаша , На задворках
Мир надо уничтожить... Чтобы создать свой...
В ответ пользователю Dyrman
Аватар пользователя
Dyrman
Да, и так, и так пробовал. Результат - одинаков.
Если в самой карте переопределяешь триггер - то всё работает. С другим параметром отправителя. Но скрипты же готовых карт не будешь переделывать...
Важно, чтобы переопределение Trigger происходило до выполнения скрипта карты и скрипта мода.
Также желательно добавить стандартный алиас функции Trigger:
SetTrigger = Trigger
в конец того большого куска кода переопределения.
Он, скорее всего, используется редко или вообще не используется, однако его тоже надо учитывать.
Ещё вопрос стоит обнуления триггера, чтобы обнулялся только нужный, так будет правильно:
Trigger("NHF", OBJECT_TOUCH_TRIGGER, mob, nil);?
Да, так верно.
А если в самой карте обнуляется Trigger( OBJECT_TOUCH_TRIGGER, mob, nil); , то не на все ли подействует?
Нет, по-умолчанию вызов триггера со стандартными параметрами (из руководства) будет интерпретирован как вызов от отправителя 0 (как число, не строка). То есть в данном случае обнулится только триггер, поставленный обычным способом, а все "специальные" останутся. Тем не менее, имитация через Trigger(0, ...) невозможна, т. к. это равносильно Trigger(NEW_DAY_TRIGGER, ...).
Как понимаю, если первый параметр = nil, это тоже является уникальным параметром отправителя.
Нет, первый параметр должен быть или числом (стандартный вызов), тогда оно будет принято как тип события, или строкой, тогда она будет принята как отправитель. Передача первым параметром nil вызовет ошибку attempt to concat a nil value.
При желании параметр отправителя можно поместить в конец как необязательный, тогда в качестве отправителя можно будет посылать любое значение, кроме nil (будет равнозначен незадаче параметра) и NaN (не индексируется в таблицах, так как не равен самому себе). Это потребует небольшой переделки кода.
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

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

Статистика

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