1 /*
2 Minetest
3 Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4 
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
9 
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU Lesser General Public License for more details.
14 
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19 
20 #pragma once
21 
22 #include "lua_api/l_base.h"
23 #include "serverenvironment.h"
24 #include "raycast.h"
25 
26 class ModApiEnvMod : public ModApiBase {
27 private:
28 	// set_node(pos, node)
29 	// pos = {x=num, y=num, z=num}
30 	static int l_set_node(lua_State *L);
31 
32 	// bulk_set_node([pos1, pos2, ...], node)
33 	// pos = {x=num, y=num, z=num}
34 	static int l_bulk_set_node(lua_State *L);
35 
36 	static int l_add_node(lua_State *L);
37 
38 	// remove_node(pos)
39 	// pos = {x=num, y=num, z=num}
40 	static int l_remove_node(lua_State *L);
41 
42 	// swap_node(pos, node)
43 	// pos = {x=num, y=num, z=num}
44 	static int l_swap_node(lua_State *L);
45 
46 	// get_node(pos)
47 	// pos = {x=num, y=num, z=num}
48 	static int l_get_node(lua_State *L);
49 
50 	// get_node_or_nil(pos)
51 	// pos = {x=num, y=num, z=num}
52 	static int l_get_node_or_nil(lua_State *L);
53 
54 	// get_node_light(pos, timeofday)
55 	// pos = {x=num, y=num, z=num}
56 	// timeofday: nil = current time, 0 = night, 0.5 = day
57 	static int l_get_node_light(lua_State *L);
58 
59 	// get_natural_light(pos, timeofday)
60 	// pos = {x=num, y=num, z=num}
61 	// timeofday: nil = current time, 0 = night, 0.5 = day
62 	static int l_get_natural_light(lua_State *L);
63 
64 	// place_node(pos, node)
65 	// pos = {x=num, y=num, z=num}
66 	static int l_place_node(lua_State *L);
67 
68 	// dig_node(pos)
69 	// pos = {x=num, y=num, z=num}
70 	static int l_dig_node(lua_State *L);
71 
72 	// punch_node(pos)
73 	// pos = {x=num, y=num, z=num}
74 	static int l_punch_node(lua_State *L);
75 
76 	// get_node_max_level(pos)
77 	// pos = {x=num, y=num, z=num}
78 	static int l_get_node_max_level(lua_State *L);
79 
80 	// get_node_level(pos)
81 	// pos = {x=num, y=num, z=num}
82 	static int l_get_node_level(lua_State *L);
83 
84 	// set_node_level(pos)
85 	// pos = {x=num, y=num, z=num}
86 	static int l_set_node_level(lua_State *L);
87 
88 	// add_node_level(pos)
89 	// pos = {x=num, y=num, z=num}
90 	static int l_add_node_level(lua_State *L);
91 
92 	// find_nodes_with_meta(pos1, pos2)
93 	static int l_find_nodes_with_meta(lua_State *L);
94 
95 	// get_meta(pos)
96 	static int l_get_meta(lua_State *L);
97 
98 	// get_node_timer(pos)
99 	static int l_get_node_timer(lua_State *L);
100 
101 	// add_entity(pos, entityname) -> ObjectRef or nil
102 	// pos = {x=num, y=num, z=num}
103 	static int l_add_entity(lua_State *L);
104 
105 	// add_item(pos, itemstack or itemstring or table) -> ObjectRef or nil
106 	// pos = {x=num, y=num, z=num}
107 	static int l_add_item(lua_State *L);
108 
109 	// get_connected_players()
110 	static int l_get_connected_players(lua_State *L);
111 
112 	// get_player_by_name(name)
113 	static int l_get_player_by_name(lua_State *L);
114 
115 	// get_objects_inside_radius(pos, radius)
116 	static int l_get_objects_inside_radius(lua_State *L);
117 
118 	// get_objects_in_area(pos, minp, maxp)
119 	static int l_get_objects_in_area(lua_State *L);
120 
121 	// set_timeofday(val)
122 	// val = 0...1
123 	static int l_set_timeofday(lua_State *L);
124 
125 	// get_timeofday() -> 0...1
126 	static int l_get_timeofday(lua_State *L);
127 
128 	// get_gametime()
129 	static int l_get_gametime(lua_State *L);
130 
131 	// get_day_count() -> int
132 	static int l_get_day_count(lua_State *L);
133 
134 	// find_node_near(pos, radius, nodenames, search_center) -> pos or nil
135 	// nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
136 	static int l_find_node_near(lua_State *L);
137 
138 	// find_nodes_in_area(minp, maxp, nodenames) -> list of positions
139 	// nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
140 	static int l_find_nodes_in_area(lua_State *L);
141 
142 	// find_surface_nodes_in_area(minp, maxp, nodenames) -> list of positions
143 	// nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
144 	static int l_find_nodes_in_area_under_air(lua_State *L);
145 
146 	// fix_light(p1, p2) -> true/false
147 	static int l_fix_light(lua_State *L);
148 
149 	// load_area(p1)
150 	static int l_load_area(lua_State *L);
151 
152 	// emerge_area(p1, p2)
153 	static int l_emerge_area(lua_State *L);
154 
155 	// delete_area(p1, p2) -> true/false
156 	static int l_delete_area(lua_State *L);
157 
158 	// get_perlin(seeddiff, octaves, persistence, scale)
159 	// returns world-specific PerlinNoise
160 	static int l_get_perlin(lua_State *L);
161 
162 	// get_perlin_map(noiseparams, size)
163 	// returns world-specific PerlinNoiseMap
164 	static int l_get_perlin_map(lua_State *L);
165 
166 	// get_voxel_manip()
167 	// returns world-specific voxel manipulator
168 	static int l_get_voxel_manip(lua_State *L);
169 
170 	// clear_objects()
171 	// clear all objects in the environment
172 	static int l_clear_objects(lua_State *L);
173 
174 	// spawn_tree(pos, treedef)
175 	static int l_spawn_tree(lua_State *L);
176 
177 	// line_of_sight(pos1, pos2) -> true/false
178 	static int l_line_of_sight(lua_State *L);
179 
180 	// raycast(pos1, pos2, objects, liquids) -> Raycast
181 	static int l_raycast(lua_State *L);
182 
183 	// find_path(pos1, pos2, searchdistance,
184 	//     max_jump, max_drop, algorithm) -> table containing path
185 	static int l_find_path(lua_State *L);
186 
187 	// transforming_liquid_add(pos)
188 	static int l_transforming_liquid_add(lua_State *L);
189 
190 	// forceload_block(blockpos)
191 	// forceloads a block
192 	static int l_forceload_block(lua_State *L);
193 
194 	// forceload_free_block(blockpos)
195 	// stops forceloading a position
196 	static int l_forceload_free_block(lua_State *L);
197 
198 	// Get a string translated server side
199 	static int l_get_translated_string(lua_State * L);
200 
201 	/* Helpers */
202 
203 	static void collectNodeIds(lua_State *L, int idx,
204 		const NodeDefManager *ndef, std::vector<content_t> &filter);
205 
206 public:
207 	static void Initialize(lua_State *L, int top);
208 	static void InitializeClient(lua_State *L, int top);
209 
210 	static struct EnumString es_ClearObjectsMode[];
211 };
212 
213 class LuaABM : public ActiveBlockModifier {
214 private:
215 	int m_id;
216 
217 	std::vector<std::string> m_trigger_contents;
218 	std::vector<std::string> m_required_neighbors;
219 	float m_trigger_interval;
220 	u32 m_trigger_chance;
221 	bool m_simple_catch_up;
222 public:
LuaABM(lua_State * L,int id,const std::vector<std::string> & trigger_contents,const std::vector<std::string> & required_neighbors,float trigger_interval,u32 trigger_chance,bool simple_catch_up)223 	LuaABM(lua_State *L, int id,
224 			const std::vector<std::string> &trigger_contents,
225 			const std::vector<std::string> &required_neighbors,
226 			float trigger_interval, u32 trigger_chance, bool simple_catch_up):
227 		m_id(id),
228 		m_trigger_contents(trigger_contents),
229 		m_required_neighbors(required_neighbors),
230 		m_trigger_interval(trigger_interval),
231 		m_trigger_chance(trigger_chance),
232 		m_simple_catch_up(simple_catch_up)
233 	{
234 	}
getTriggerContents()235 	virtual const std::vector<std::string> &getTriggerContents() const
236 	{
237 		return m_trigger_contents;
238 	}
getRequiredNeighbors()239 	virtual const std::vector<std::string> &getRequiredNeighbors() const
240 	{
241 		return m_required_neighbors;
242 	}
getTriggerInterval()243 	virtual float getTriggerInterval()
244 	{
245 		return m_trigger_interval;
246 	}
getTriggerChance()247 	virtual u32 getTriggerChance()
248 	{
249 		return m_trigger_chance;
250 	}
getSimpleCatchUp()251 	virtual bool getSimpleCatchUp()
252 	{
253 		return m_simple_catch_up;
254 	}
255 	virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n,
256 			u32 active_object_count, u32 active_object_count_wider);
257 };
258 
259 class LuaLBM : public LoadingBlockModifierDef
260 {
261 private:
262 	int m_id;
263 public:
LuaLBM(lua_State * L,int id,const std::set<std::string> & trigger_contents,const std::string & name,bool run_at_every_load)264 	LuaLBM(lua_State *L, int id,
265 			const std::set<std::string> &trigger_contents,
266 			const std::string &name,
267 			bool run_at_every_load):
268 		m_id(id)
269 	{
270 		this->run_at_every_load = run_at_every_load;
271 		this->trigger_contents = trigger_contents;
272 		this->name = name;
273 	}
274 	virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n);
275 };
276 
277 //! Lua wrapper for RaycastState objects
278 class LuaRaycast : public ModApiBase
279 {
280 private:
281 	static const char className[];
282 	static const luaL_Reg methods[];
283 	//! Inner state
284 	RaycastState state;
285 
286 	// Exported functions
287 
288 	// garbage collector
289 	static int gc_object(lua_State *L);
290 
291 	/*!
292 	 * Raycast:next() -> pointed_thing
293 	 * Returns the next pointed thing on the ray.
294 	 */
295 	static int l_next(lua_State *L);
296 public:
297 	//! Constructor with the same arguments as RaycastState.
LuaRaycast(const core::line3d<f32> & shootline,bool objects_pointable,bool liquids_pointable)298 	LuaRaycast(
299 		const core::line3d<f32> &shootline,
300 		bool objects_pointable,
301 		bool liquids_pointable) :
302 		state(shootline, objects_pointable, liquids_pointable)
303 	{}
304 
305 	//! Creates a LuaRaycast and leaves it on top of the stack.
306 	static int create_object(lua_State *L);
307 
308 	/*!
309 	 * Returns the Raycast from the stack or throws an error.
310 	 * @param narg location of the RaycastState in the stack
311 	 */
312 	static LuaRaycast *checkobject(lua_State *L, int narg);
313 
314 	//! Registers Raycast as a Lua userdata type.
315 	static void Register(lua_State *L);
316 };
317 
318 struct ScriptCallbackState {
319 	ServerScripting *script;
320 	int callback_ref;
321 	int args_ref;
322 	unsigned int refcount;
323 	std::string origin;
324 };
325