Minetest 5.9.0-dev
 
Loading...
Searching...
No Matches
l_env.h
Go to the documentation of this file.
1/*
2Minetest
3Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5This program is free software; you can redistribute it and/or modify
6it under the terms of the GNU Lesser General Public License as published by
7the Free Software Foundation; either version 2.1 of the License, or
8(at your option) any later version.
9
10This program is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13GNU Lesser General Public License for more details.
14
15You should have received a copy of the GNU Lesser General Public License along
16with this program; if not, write to the Free Software Foundation, Inc.,
1751 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// base class containing helpers
27class ModApiEnvBase : public ModApiBase {
28protected:
29
30 static void collectNodeIds(lua_State *L, int idx,
31 const NodeDefManager *ndef, std::vector<content_t> &filter);
32
33 static void checkArea(v3s16 &minp, v3s16 &maxp);
34
35 // F must be (v3s16 pos) -> MapNode
36 template <typename F>
37 static int findNodeNear(lua_State *L, v3s16 pos, int radius,
38 const std::vector<content_t> &filter, int start_radius, F &&getNode);
39
40 // F must be (G callback) -> void
41 // with G being (v3s16 p, MapNode n) -> bool
42 // and behave like Map::forEachNodeInArea
43 template <typename F>
44 static int findNodesInArea(lua_State *L, const NodeDefManager *ndef,
45 const std::vector<content_t> &filter, bool grouped, F &&iterate);
46
47 // F must be (v3s16 pos) -> MapNode
48 template <typename F>
49 static int findNodesInAreaUnderAir(lua_State *L, v3s16 minp, v3s16 maxp,
50 const std::vector<content_t> &filter, F &&getNode);
51
54
55};
56
57class ModApiEnv : public ModApiEnvBase {
58private:
59 // set_node(pos, node)
60 // pos = {x=num, y=num, z=num}
61 static int l_set_node(lua_State *L);
62
63 // bulk_set_node([pos1, pos2, ...], node)
64 // pos = {x=num, y=num, z=num}
65 static int l_bulk_set_node(lua_State *L);
66
67 static int l_add_node(lua_State *L);
68
69 // remove_node(pos)
70 // pos = {x=num, y=num, z=num}
71 static int l_remove_node(lua_State *L);
72
73 // swap_node(pos, node)
74 // pos = {x=num, y=num, z=num}
75 static int l_swap_node(lua_State *L);
76
77 // get_node_raw(x, y, z) -> content, param1, param2, pos_ok
78 // Used to implement get_node and get_node_or_nil in lua.
79 // This is still faster than doing it from C++ even with optimized pushnode.
80 static int l_get_node_raw(lua_State *L);
81
82 // get_node_light(pos, timeofday)
83 // pos = {x=num, y=num, z=num}
84 // timeofday: nil = current time, 0 = night, 0.5 = day
85 static int l_get_node_light(lua_State *L);
86
87 // get_natural_light(pos, timeofday)
88 // pos = {x=num, y=num, z=num}
89 // timeofday: nil = current time, 0 = night, 0.5 = day
90 static int l_get_natural_light(lua_State *L);
91
92 // place_node(pos, node, [placer])
93 // pos = {x=num, y=num, z=num}
94 static int l_place_node(lua_State *L);
95
96 // dig_node(pos, [digger])
97 // pos = {x=num, y=num, z=num}
98 static int l_dig_node(lua_State *L);
99
100 // punch_node(pos, [puncher])
101 // pos = {x=num, y=num, z=num}
102 static int l_punch_node(lua_State *L);
103
104 // get_node_max_level(pos)
105 // pos = {x=num, y=num, z=num}
106 static int l_get_node_max_level(lua_State *L);
107
108 // get_node_level(pos)
109 // pos = {x=num, y=num, z=num}
110 static int l_get_node_level(lua_State *L);
111
112 // set_node_level(pos)
113 // pos = {x=num, y=num, z=num}
114 static int l_set_node_level(lua_State *L);
115
116 // add_node_level(pos)
117 // pos = {x=num, y=num, z=num}
118 static int l_add_node_level(lua_State *L);
119
120 // get_node_boxes(box_type, pos, [node]) -> table
121 // box_type = string
122 // pos = {x=num, y=num, z=num}
123 // node = {name=string, param1=num, param2=num} or nil
124 static int l_get_node_boxes(lua_State *L);
125
126 // find_nodes_with_meta(pos1, pos2)
127 static int l_find_nodes_with_meta(lua_State *L);
128
129 // get_meta(pos)
130 static int l_get_meta(lua_State *L);
131
132 // get_node_timer(pos)
133 static int l_get_node_timer(lua_State *L);
134
135 // add_entity(pos, entityname) -> ObjectRef or nil
136 // pos = {x=num, y=num, z=num}
137 static int l_add_entity(lua_State *L);
138
139 // add_item(pos, itemstack or itemstring or table) -> ObjectRef or nil
140 // pos = {x=num, y=num, z=num}
141 static int l_add_item(lua_State *L);
142
143 // get_connected_players()
144 static int l_get_connected_players(lua_State *L);
145
146 // get_player_by_name(name)
147 static int l_get_player_by_name(lua_State *L);
148
149 // get_objects_inside_radius(pos, radius)
150 static int l_get_objects_inside_radius(lua_State *L);
151
152 // get_objects_in_area(pos, minp, maxp)
153 static int l_get_objects_in_area(lua_State *L);
154
155 // set_timeofday(val)
156 // val = 0...1
157 static int l_set_timeofday(lua_State *L);
158
159 // get_timeofday() -> 0...1
160 static int l_get_timeofday(lua_State *L);
161
162 // get_gametime()
163 static int l_get_gametime(lua_State *L);
164
165 // get_day_count() -> int
166 static int l_get_day_count(lua_State *L);
167
168 // find_node_near(pos, radius, nodenames, search_center) -> pos or nil
169 // nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
170 static int l_find_node_near(lua_State *L);
171
172 // find_nodes_in_area(minp, maxp, nodenames) -> list of positions
173 // nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
174 static int l_find_nodes_in_area(lua_State *L);
175
176 // find_surface_nodes_in_area(minp, maxp, nodenames) -> list of positions
177 // nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
178 static int l_find_nodes_in_area_under_air(lua_State *L);
179
180 // fix_light(p1, p2) -> true/false
181 static int l_fix_light(lua_State *L);
182
183 // load_area(p1)
184 static int l_load_area(lua_State *L);
185
186 // emerge_area(p1, p2)
187 static int l_emerge_area(lua_State *L);
188
189 // delete_area(p1, p2) -> true/false
190 static int l_delete_area(lua_State *L);
191
192 // get_perlin(seeddiff, octaves, persistence, scale)
193 // returns world-specific PerlinNoise
194 static int l_get_perlin(lua_State *L);
195
196 // get_perlin_map(noiseparams, size)
197 // returns world-specific PerlinNoiseMap
198 static int l_get_perlin_map(lua_State *L);
199
200 // get_voxel_manip()
201 // returns world-specific voxel manipulator
202 static int l_get_voxel_manip(lua_State *L);
203
204 // clear_objects()
205 // clear all objects in the environment
206 static int l_clear_objects(lua_State *L);
207
208 // spawn_tree(pos, treedef)
209 static int l_spawn_tree(lua_State *L);
210
211 // line_of_sight(pos1, pos2) -> true/false
212 static int l_line_of_sight(lua_State *L);
213
214 // raycast(pos1, pos2, objects, liquids) -> Raycast
215 static int l_raycast(lua_State *L);
216
217 // find_path(pos1, pos2, searchdistance,
218 // max_jump, max_drop, algorithm) -> table containing path
219 static int l_find_path(lua_State *L);
220
221 // transforming_liquid_add(pos)
222 static int l_transforming_liquid_add(lua_State *L);
223
224 // forceload_block(blockpos)
225 // forceloads a block
226 static int l_forceload_block(lua_State *L);
227
228 // forceload_free_block(blockpos)
229 // stops forceloading a position
230 static int l_forceload_free_block(lua_State *L);
231
232 // compare_block_status(nodepos)
233 static int l_compare_block_status(lua_State *L);
234
235 // get_translated_string(lang_code, string)
236 static int l_get_translated_string(lua_State * L);
237
238public:
239 static void Initialize(lua_State *L, int top);
240 static void InitializeClient(lua_State *L, int top);
241};
242
243/*
244 * Duplicates of certain env APIs that operate not on the global
245 * map but on a VoxelManipulator. This is for emerge scripting.
246 */
248private:
249
250 // get_node_or_nil(pos)
251 static int l_get_node_or_nil(lua_State *L);
252
253 // get_node_max_level(pos)
254 static int l_get_node_max_level(lua_State *L);
255
256 // get_node_level(pos)
257 static int l_get_node_level(lua_State *L);
258
259 // set_node_level(pos)
260 static int l_set_node_level(lua_State *L);
261
262 // add_node_level(pos)
263 static int l_add_node_level(lua_State *L);
264
265 // find_node_near(pos, radius, nodenames, [search_center])
266 static int l_find_node_near(lua_State *L);
267
268 // find_nodes_in_area(minp, maxp, nodenames, [grouped])
269 static int l_find_nodes_in_area(lua_State *L);
270
271 // find_surface_nodes_in_area(minp, maxp, nodenames)
272 static int l_find_nodes_in_area_under_air(lua_State *L);
273
274 // spawn_tree(pos, treedef)
275 static int l_spawn_tree(lua_State *L);
276
277 // Helper: get the vmanip we're operating on
278 static MMVManip *getVManip(lua_State *L);
279
280public:
281 static void InitializeEmerge(lua_State *L, int top);
282};
283
285private:
286 int m_id;
287
288 std::vector<std::string> m_trigger_contents;
289 std::vector<std::string> m_required_neighbors;
295public:
296 LuaABM(lua_State *L, int id,
297 const std::vector<std::string> &trigger_contents,
298 const std::vector<std::string> &required_neighbors,
299 float trigger_interval, u32 trigger_chance, bool simple_catch_up, s16 min_y, s16 max_y):
300 m_id(id),
301 m_trigger_contents(trigger_contents),
302 m_required_neighbors(required_neighbors),
303 m_trigger_interval(trigger_interval),
304 m_trigger_chance(trigger_chance),
305 m_simple_catch_up(simple_catch_up),
306 m_min_y(min_y),
307 m_max_y(max_y)
308 {
309 }
310 virtual const std::vector<std::string> &getTriggerContents() const
311 {
312 return m_trigger_contents;
313 }
314 virtual const std::vector<std::string> &getRequiredNeighbors() const
315 {
317 }
318 virtual float getTriggerInterval()
319 {
320 return m_trigger_interval;
321 }
322 virtual u32 getTriggerChance()
323 {
324 return m_trigger_chance;
325 }
326 virtual bool getSimpleCatchUp()
327 {
328 return m_simple_catch_up;
329 }
330 virtual s16 getMinY()
331 {
332 return m_min_y;
333 }
334 virtual s16 getMaxY()
335 {
336 return m_max_y;
337 }
338 virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n,
339 u32 active_object_count, u32 active_object_count_wider);
340};
341
343{
344private:
345 int m_id;
346public:
347 LuaLBM(lua_State *L, int id,
348 const std::set<std::string> &trigger_contents,
349 const std::string &name,
350 bool run_at_every_load):
351 m_id(id)
352 {
353 this->run_at_every_load = run_at_every_load;
354 this->trigger_contents = trigger_contents;
355 this->name = name;
356 }
357 virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n, float dtime_s);
358};
359
361class LuaRaycast : public ModApiBase
362{
363private:
364 static const luaL_Reg methods[];
367
368 // Exported functions
369
370 // garbage collector
371 static int gc_object(lua_State *L);
372
377 static int l_next(lua_State *L);
378public:
381 const core::line3d<f32> &shootline,
382 bool objects_pointable,
383 bool liquids_pointable,
384 const std::optional<Pointabilities> &pointabilities) :
385 state(shootline, objects_pointable, liquids_pointable, pointabilities)
386 {}
387
389 static int create_object(lua_State *L);
390
392 static void Register(lua_State *L);
393
394 static const char className[];
395};
396
401 unsigned int refcount;
402 std::string origin;
403};
Definition: serverenvironment.h:56
Definition: l_env.h:284
u32 m_trigger_chance
Definition: l_env.h:291
s16 m_min_y
Definition: l_env.h:293
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, s16 min_y, s16 max_y)
Definition: l_env.h:296
virtual float getTriggerInterval()
Definition: l_env.h:318
float m_trigger_interval
Definition: l_env.h:290
virtual bool getSimpleCatchUp()
Definition: l_env.h:326
virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n, u32 active_object_count, u32 active_object_count_wider)
Definition: l_env.cpp:69
int m_id
Definition: l_env.h:286
virtual const std::vector< std::string > & getTriggerContents() const
Definition: l_env.h:310
virtual u32 getTriggerChance()
Definition: l_env.h:322
virtual const std::vector< std::string > & getRequiredNeighbors() const
Definition: l_env.h:314
std::vector< std::string > m_required_neighbors
Definition: l_env.h:289
virtual s16 getMinY()
Definition: l_env.h:330
std::vector< std::string > m_trigger_contents
Definition: l_env.h:288
virtual s16 getMaxY()
Definition: l_env.h:334
bool m_simple_catch_up
Definition: l_env.h:292
s16 m_max_y
Definition: l_env.h:294
Definition: l_env.h:343
virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n, float dtime_s)
Definition: l_env.cpp:113
LuaLBM(lua_State *L, int id, const std::set< std::string > &trigger_contents, const std::string &name, bool run_at_every_load)
Definition: l_env.h:347
int m_id
Definition: l_env.h:345
Lua wrapper for RaycastState objects.
Definition: l_env.h:362
LuaRaycast(const core::line3d< f32 > &shootline, bool objects_pointable, bool liquids_pointable, const std::optional< Pointabilities > &pointabilities)
Constructor with the same arguments as RaycastState.
Definition: l_env.h:380
static int l_next(lua_State *L)
Definition: l_env.cpp:155
static const char className[]
Definition: l_env.h:394
static const luaL_Reg methods[]
Definition: l_env.h:364
static int gc_object(lua_State *L)
Definition: l_env.cpp:204
RaycastState state
Inner state.
Definition: l_env.h:366
static int create_object(lua_State *L)
Creates a LuaRaycast and leaves it on top of the stack.
Definition: l_env.cpp:175
Definition: map.h:320
Definition: l_base.h:43
Definition: l_env.h:27
static int findNodesInArea(lua_State *L, const NodeDefManager *ndef, const std::vector< content_t > &filter, bool grouped, F &&iterate)
Definition: l_env.cpp:933
static const EnumString es_ClearObjectsMode[]
Definition: l_env.h:52
static void collectNodeIds(lua_State *L, int idx, const NodeDefManager *ndef, std::vector< content_t > &filter)
Definition: l_env.cpp:854
static void checkArea(v3s16 &minp, v3s16 &maxp)
Definition: l_env.cpp:917
static int findNodeNear(lua_State *L, v3s16 pos, int radius, const std::vector< content_t > &filter, int start_radius, F &&getNode)
Definition: l_env.cpp:872
static int findNodesInAreaUnderAir(lua_State *L, v3s16 minp, v3s16 maxp, const std::vector< content_t > &filter, F &&getNode)
Definition: l_env.cpp:1038
static const EnumString es_BlockStatusType[]
Definition: l_env.h:53
Definition: l_env.h:247
static int l_get_node_or_nil(lua_State *L)
Definition: l_env.cpp:1527
static int l_spawn_tree(lua_State *L)
Definition: l_env.cpp:1672
static void InitializeEmerge(lua_State *L, int top)
Definition: l_env.cpp:1705
static int l_add_node_level(lua_State *L)
Definition: l_env.cpp:1577
static int l_find_node_near(lua_State *L)
Definition: l_env.cpp:1592
static int l_find_nodes_in_area(lua_State *L)
Definition: l_env.cpp:1611
static int l_get_node_max_level(lua_State *L)
Definition: l_env.cpp:1540
static int l_set_node_level(lua_State *L)
Definition: l_env.cpp:1562
static int l_find_nodes_in_area_under_air(lua_State *L)
Definition: l_env.cpp:1651
static MMVManip * getVManip(lua_State *L)
Definition: l_env.cpp:1697
static int l_get_node_level(lua_State *L)
Definition: l_env.cpp:1551
Definition: l_env.h:57
static int l_bulk_set_node(lua_State *L)
Definition: l_env.cpp:268
static int l_forceload_block(lua_State *L)
Definition: l_env.cpp:1403
static int l_find_nodes_in_area_under_air(lua_State *L)
Definition: l_env.cpp:1064
static int l_fix_light(lua_State *L)
Definition: l_env.cpp:1188
static int l_raycast(lua_State *L)
Definition: l_env.cpp:1215
static int l_set_timeofday(lua_State *L)
Definition: l_env.cpp:806
static int l_get_translated_string(lua_State *L)
Definition: l_env.cpp:1442
static int l_swap_node(lua_State *L)
Definition: l_env.cpp:319
static int l_add_node(lua_State *L)
Definition: l_env.cpp:298
static int l_get_voxel_manip(lua_State *L)
Definition: l_env.cpp:1144
static int l_find_nodes_with_meta(lua_State *L)
Definition: l_env.cpp:621
static int l_get_node_max_level(lua_State *L)
Definition: l_env.cpp:530
static int l_spawn_tree(lua_State *L)
Definition: l_env.cpp:1365
static int l_get_node_level(lua_State *L)
Definition: l_env.cpp:542
static int l_emerge_area(lua_State *L)
Definition: l_env.cpp:1246
static int l_get_objects_inside_radius(lua_State *L)
Definition: l_env.cpp:756
static int l_get_node_light(lua_State *L)
Definition: l_env.cpp:357
static int l_get_connected_players(lua_State *L)
Definition: l_env.cpp:715
static int l_forceload_free_block(lua_State *L)
Definition: l_env.cpp:1432
static int l_set_node(lua_State *L)
Definition: l_env.cpp:253
static int l_get_player_by_name(lua_State *L)
Definition: l_env.cpp:738
static int l_load_area(lua_State *L)
Definition: l_env.cpp:1222
static int l_get_timeofday(lua_State *L)
Definition: l_env.cpp:824
static int l_get_gametime(lua_State *L)
Definition: l_env.cpp:845
static int l_find_nodes_in_area(lua_State *L)
Definition: l_env.cpp:1006
static int l_set_node_level(lua_State *L)
Definition: l_env.cpp:555
static int l_get_node_raw(lua_State *L)
Definition: l_env.cpp:333
static int l_line_of_sight(lua_State *L)
Definition: l_env.cpp:1167
static int l_find_node_near(lua_State *L)
Definition: l_env.cpp:891
static void Initialize(lua_State *L, int top)
Definition: l_env.cpp:1454
static int l_get_perlin(lua_State *L)
Definition: l_env.cpp:1099
static int l_add_entity(lua_State *L)
Definition: l_env.cpp:661
static int l_get_meta(lua_State *L)
Definition: l_env.cpp:638
static int l_get_node_timer(lua_State *L)
Definition: l_env.cpp:649
static int l_clear_objects(lua_State *L)
Definition: l_env.cpp:1152
static int l_add_node_level(lua_State *L)
Definition: l_env.cpp:572
static int l_get_day_count(lua_State *L)
Definition: l_env.cpp:836
static int l_punch_node(lua_State *L)
Definition: l_env.cpp:497
static int l_add_item(lua_State *L)
Definition: l_env.cpp:686
static int l_get_natural_light(lua_State *L)
Definition: l_env.cpp:384
static int l_get_node_boxes(lua_State *L)
Definition: l_env.cpp:590
static int l_dig_node(lua_State *L)
Definition: l_env.cpp:465
static int l_transforming_liquid_add(lua_State *L)
Definition: l_env.cpp:1392
static int l_get_objects_in_area(lua_State *L)
Definition: l_env.cpp:780
static void InitializeClient(lua_State *L, int top)
Definition: l_env.cpp:1507
static int l_find_path(lua_State *L)
Definition: l_env.cpp:1325
static int l_compare_block_status(lua_State *L)
Definition: l_env.cpp:1413
static int l_delete_area(lua_State *L)
Definition: l_env.cpp:1292
static int l_place_node(lua_State *L)
Definition: l_env.cpp:422
static int l_remove_node(lua_State *L)
Definition: l_env.cpp:305
static int l_get_perlin_map(lua_State *L)
Definition: l_env.cpp:1125
This class is for getting the actual properties of nodes from their content ID.
Definition: nodedef.h:556
Describes the state of a raycast.
Definition: raycast.h:33
Definition: serverenvironment.h:220
Definition: scripting_server.h:48
core::vector3d< s16 > v3s16
Definition: irr_v3d.h:28
#define idx(x, y)
Definition: noise.cpp:552
Definition: c_types.h:31
Definition: serverenvironment.h:91
std::string name
Definition: serverenvironment.h:94
std::set< std::string > trigger_contents
Definition: serverenvironment.h:93
bool run_at_every_load
Definition: serverenvironment.h:95
Definition: mapnode.h:139
Definition: l_env.h:397
int args_ref
Definition: l_env.h:400
std::string origin
Definition: l_env.h:402
ServerScripting * script
Definition: l_env.h:398
int callback_ref
Definition: l_env.h:399
unsigned int refcount
Definition: l_env.h:401
static std::string p(std::string path)
Definition: test_filesys.cpp:64