Multiplayer: Господство, Извечное противостояние, Война за Магию, Торговая империя, Анатомия войны, Эксперимент
SingleScenario: Последний Рубеж, Трон, Элиралис, Вернуться домой!, Лабиринты разума
Campaign: Колонизация
New here? I'm Roha — want a quick tour?
KioM, please describe in more detail what you need, because as I understand it, the "building visitation handler" is a function that triggers when a building is visited. In that case, it's unclear what the problem is if there's a trigger for touching the object.
It might be slightly easier to save the current date in a variable during activation, and then compare the date with this variable when the object is touched.
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;
The following code is provided: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;
It produces an error:
Do you have any idea what might be wrong here?
What parameters were used when the overridden Trigger was called?
function __HANDLER(trigtype, param)
print("T4:"..trigtype);
print("T5:"..param);Type: OBJECT_TOUCH_TRIGGER
The check for the existence of a hero and a monster is in place.function __HANDLER(trigtype, param)
print("T4:"..trigtype);
print("T5:"..param);
With each trigger being called in a separate thread and with the necessary delays depending on whether it's a multiplayer map or not, it can be made to work in multiplayer. At least, some of the triggers will work somehow.
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
Is the trigger's sender specified as something else?
In other words, should all triggers in the mod have an additional first parameter – the sender?
For example,
Trigger("NHF", OBJECT_TOUCH_TRIGGER, "mob", "handler_function")
Added 2 minutes later
Each unique sender can have its own trigger for a given event type and parameter (object, player, etc.).
Yes, I tried both ways. The result is the same.
If you redefine the Trigger in the map itself, it works. With a different sender parameter. But you won't be rewriting the scripts of ready-made maps...
SetTrigger = Triggerto the end of that large piece of code that performs the override.Another question is about resetting the trigger, so that only the necessary one is reset. Would this be correct:
Trigger("NHF", OBJECT_TOUCH_TRIGGER, mob, nil);?
And if the Trigger(OBJECT_TOUCH_TRIGGER, mob, nil); is reset in the map itself, will it affect all of them?
As I understand it, if the first parameter = nil, this is also a unique sender parameter.