summaryrefslogtreecommitdiff
path: root/src/event.h
blob: cfc222d5d26d9b7539dbb928e1124550202ef6e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
Minetest
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

#ifndef EVENT_HEADER
#define EVENT_HEADER

class MtEvent
{
public:
	virtual ~MtEvent(){};
	//virtual MtEvent* clone(){ return new IEvent; }
	virtual const char* getType() const = 0;

	MtEvent* checkIs(const std::string &type)
	{
		if(type == getType())
			return this;
		return NULL;
	}
};

// An event with no parameters and customizable name
class SimpleTriggerEvent: public MtEvent
{
	const char *type;
public:
	SimpleTriggerEvent(const char *type):
		type(type)
	{}
	const char* getType() const
	{return type;}
};

class MtEventReceiver
{
public:
	virtual ~MtEventReceiver(){};
	virtual void onEvent(MtEvent *e) = 0;
};

typedef void (*event_receive_func)(MtEvent *e, void *data);

class MtEventManager
{
public:
	virtual ~MtEventManager(){};
	virtual void put(MtEvent *e) = 0;
	virtual void reg(const char *type, event_receive_func f, void *data) = 0;
	// If data==NULL, every occurence of f is deregistered.
	virtual void dereg(const char *type, event_receive_func f, void *data) = 0;
	virtual void reg(MtEventReceiver *r, const char *type) = 0;
	virtual void dereg(MtEventReceiver *r, const char *type) = 0;
};

#endif

odetbl.err or "" env=nodetbl.env or "" end local sel = 1 for n,_ in pairs(atlatc.envs) do envs_asvalues[#envs_asvalues+1]=n if n==env then sel=#envs_asvalues end end local form = "size[10,10]dropdown[0,0;3;env;"..table.concat(envs_asvalues, ",")..";"..sel.."]" .."button[4,0;2,1;save;Save]button[7,0;2,1;cle;Clear local env] textarea[0.2,1;10,10;code;Code;"..minetest.formspec_escape(code).."]" .."label[0,9.8;"..err.."]" return form end function ac.after_dig_node(pos, node, player) advtrains.invalidate_all_paths(pos) advtrains.ndb.clear(pos) local ph=minetest.pos_to_string(pos) ac.nodes[ph]=nil end function ac.on_receive_fields(pos, formname, fields, player) if not minetest.check_player_privs(player:get_player_name(), {atlatc=true}) then minetest.chat_send_player(player:get_player_name(), "Missing privilege: atlatc - Operation cancelled!") return end local meta=minetest.get_meta(pos) local ph=minetest.pos_to_string(pos) local nodetbl = ac.nodes[ph] or {} --if fields.quit then return end if fields.env then nodetbl.env=fields.env end if fields.code then nodetbl.code=fields.code end if fields.save then nodetbl.err=nil end if fields.cle then nodetbl.data={} end ac.nodes[ph]=nodetbl meta:set_string("formspec", ac.getform(pos, meta)) if nodetbl.env then meta:set_string("infotext", "LuaAutomation component, assigned to environment '"..nodetbl.env.."'") else meta:set_string("infotext", "LuaAutomation component, invalid enviroment set!") end end function ac.run_in_env(pos, evtdata, customfct_p) local ph=minetest.pos_to_string(pos) local nodetbl = ac.nodes[ph] if not nodetbl then atwarn("LuaAutomation component at",ph,": Data not in memory! Please visit component and click 'Save'!") return end local meta if minetest.get_node_or_nil(pos) then meta=minetest.get_meta(pos) end if not nodetbl.env or not atlatc.envs[nodetbl.env] then atwarn("LuaAutomation component at",ph,": Not an existing environment: "..(nodetbl.env or "<nil>")) return false end if not nodetbl.code or nodetbl.code=="" then atwarn("LuaAutomation component at",ph,": No code to run! (insert -- to suppress warning)") return false end local customfct=customfct_p or {} customfct.interrupt=function(t, imesg) atlatc.interrupt.add(t, pos, {type="int", int=true, message=imesg}) end local datain=nodetbl.data or {} local succ, dataout = atlatc.envs[nodetbl.env]:execute_code(datain, nodetbl.code, evtdata, customfct) if succ then atlatc.active.nodes[ph].data=atlatc.remove_invalid_data(dataout) else atlatc.active.nodes[ph].err=dataout atwarn("LuaAutomation ATC interface rail at",ph,": LUA Error:",dataout) if meta then meta:set_string("infotext", "LuaAutomation ATC interface rail, ERROR:"..dataout) end end if meta then meta:set_string("formspec", ac.getform(pos, meta)) end end atlatc.active=ac