вопрос к опытным скриптерам: как лучше всего (минимальным кол-вом кода) сделать обработчик посещенности строения по типу склепа например, мои идеи ограничиваются способом - через включение/выключение проверочной константы в триггере нового дня с нужными мне условиями. Но может есть способ по эффективнее?)
Jack_of_shadows
9 лет назад
KioM, опишите лучше подробнее что нужно, а то я так понимаю, что "обработчик посещенности строения" это функция, которая срабатывает при посещении строения. В таком случае непонятно в чем загвоздка, если есть триггер касания объекта.
KioM, опишите лучше подробнее что нужно, а то я так понимаю, что "обработчик посещенности строения" это функция, которая срабатывает при посещении строения. В таком случае непонятно в чем загвоздка, если есть триггер касания объекта.
почти) нужно: есть храм (свой собственный) при активации идет скрипт, бой и т.д. затем хочу сделать так, чтобы при посещении его скажем последующие несколько дней, до начала новой недели выдавало сообщение и отказ (это тоже все понятно) но проверку на то посещено оно уже каким-то игроком или несколькими или нет как лучше сделать? идея была через указатель состояния в функции нового дня через триггер, но может есть более простая и универсальная фича для подобных дел? для подобных строений, которая передавала бы информацию, что его уже разграбили
Jack_of_shadows
9 лет назад
Чуть проще во время активации сохранять в переменную текущую дату, и при касании объекта сверять дату с этой переменной. Если поведение одинаково для всех игроков, переменная одна, если разная для каждого игрока - таблица переменных. Если же нужно как-то внешне показывать на объекте, разграблен он или уже обновился, тогда конечно только через триггер нового дня, иных способов нет.
Чуть проще во время активации сохранять в переменную текущую дату, и при касании объекта сверять дату с этой переменной.
Спасибо, то что нужно
Dyrman
9 лет назад
Имеется код:
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;
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?
С какими параметрами был вызван переопределенный Trigger?
Тип: OBJECT_TOUCH_TRIGGER Проверка на существование героя и монстра стоит.
function __HANDLER(trigtype, param) print("T4:"..trigtype); print("T5:"..param);
С вызовами каждого триггера в отдельном потоке и нужными слипами в зависимости, мультиплеер карта или нет, можно заставить работать и в мульте. По крайней мере, часть триггеров хоть как-то работает.
Тип: 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
в обоих случаях.
Dyrman
9 лет назад
Ошибка исчезла. Надо проверять на карте, где несколько триггеров теперь.
Dyrman
9 лет назад
К сожалению, триггер из карты не отрабатывается при наличии более позднего триггера.
RedHeavenHero
9 лет назад
Обозначен ли отправитель триггера, как другой? То есть в моде все триггеры должны иметь дополнительный первый параметр - отправителя. Например, Trigger("NHF", OBJECT_TOUCH_TRIGGER, "mob", "handler_function")
Добавлено через 2 минуты Каждый уникальный отправитель может иметь свой триггер на данный тип события и параметр (объект, игрока, ...)
Обозначен ли отправитель триггера, как другой? То есть в моде все триггеры должны иметь дополнительный первый параметр - отправителя. Например, Trigger("NHF", OBJECT_TOUCH_TRIGGER, "mob", "handler_function")
Добавлено через 2 минуты Каждый уникальный отправитель может иметь свой триггер на данный тип события и параметр (объект, игрока, ...)
Да, и так, и так пробовал. Результат - одинаков. Если в самой карте переопределяешь триггер - то всё работает. С другим параметром отправителя. Но скрипты же готовых карт не будешь переделывать...
Ещё вопрос стоит обнуления триггера, чтобы обнулялся только нужный, так будет правильно: Trigger("NHF", OBJECT_TOUCH_TRIGGER, mob, nil);? А если в самой карте обнуляется Trigger( OBJECT_TOUCH_TRIGGER, mob, nil); , то не на все ли подействует?
Как понимаю, если первый параметр = nil, это тоже является уникальным параметром отправителя.
Выясняю задержки и потоки, может, они влияют, потому что в коде все правильно.
Да, и так, и так пробовал. Результат - одинаков. Если в самой карте переопределяешь триггер - то всё работает. С другим параметром отправителя. Но скрипты же готовых карт не будешь переделывать...
Важно, чтобы переопределение 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 (не индексируется в таблицах, так как не равен самому себе). Это потребует небольшой переделки кода.