Luanti 5.15.0-dev
 
Loading...
Searching...
No Matches
l_env.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5#pragma once
6
7#include "lua_api/l_base.h"
8#include "raycast.h"
9#include "util/enum_string.h"
10
11class ServerScripting;
12
13// base class containing helpers
14class ModApiEnvBase : public ModApiBase {
15protected:
16
17 static void collectNodeIds(lua_State *L, int idx,
18 const NodeDefManager *ndef, std::vector<content_t> &filter);
19
20 static void checkArea(v3s16 &minp, v3s16 &maxp);
21
22 // F must be (v3s16 pos) -> MapNode
23 template <typename F>
24 static int findNodeNear(lua_State *L, v3s16 pos, int radius,
25 const std::vector<content_t> &filter, int start_radius, F &&getNode);
26
27 // F must be (G callback) -> void
28 // with G being (v3s16 p, MapNode n) -> bool
29 // and behave like Map::forEachNodeInArea
30 template <typename F>
31 static int findNodesInArea(lua_State *L, const NodeDefManager *ndef,
32 const std::vector<content_t> &filter, bool grouped, F &&iterate);
33
34 // F must be (v3s16 pos) -> MapNode
35 template <typename F>
36 static int findNodesInAreaUnderAir(lua_State *L, v3s16 minp, v3s16 maxp,
37 const std::vector<content_t> &filter, F &&getNode);
38
39 static const EnumString es_ClearObjectsMode[];
40 static const EnumString es_BlockStatusType[];
41
42};
44class ModApiEnv : public ModApiEnvBase {
45private:
46 // set_node(pos, node)
47 // pos = {x=num, y=num, z=num}
48 static int l_set_node(lua_State *L);
49
50 // bulk_set_node([pos1, pos2, ...], node)
51 // pos = {x=num, y=num, z=num}
52 static int l_bulk_set_node(lua_State *L);
53
54 // bulk_swap_node([pos1, pos2, ...], node)
55 // pos = {x=num, y=num, z=num}
56 static int l_bulk_swap_node(lua_State *L);
57
58 static int l_add_node(lua_State *L);
59
60 // remove_node(pos)
61 // pos = {x=num, y=num, z=num}
62 static int l_remove_node(lua_State *L);
63
64 // swap_node(pos, node)
65 // pos = {x=num, y=num, z=num}
66 static int l_swap_node(lua_State *L);
67
68 // get_node_raw(x, y, z) -> content, param1, param2, pos_ok
69 // Used to implement get_node and get_node_or_nil in lua.
70 // This is still faster than doing it from C++ even with optimized pushnode.
71 static int l_get_node_raw(lua_State *L);
72
73 // get_node_light(pos, timeofday)
74 // pos = {x=num, y=num, z=num}
75 // timeofday: nil = current time, 0 = night, 0.5 = day
76 static int l_get_node_light(lua_State *L);
77
78 // get_natural_light(pos, timeofday)
79 // pos = {x=num, y=num, z=num}
80 // timeofday: nil = current time, 0 = night, 0.5 = day
81 static int l_get_natural_light(lua_State *L);
82
83 // place_node(pos, node, [placer])
84 // pos = {x=num, y=num, z=num}
85 static int l_place_node(lua_State *L);
86
87 // dig_node(pos, [digger])
88 // pos = {x=num, y=num, z=num}
89 static int l_dig_node(lua_State *L);
90
91 // punch_node(pos, [puncher])
92 // pos = {x=num, y=num, z=num}
93 static int l_punch_node(lua_State *L);
94
95 // get_node_max_level(pos)
96 // pos = {x=num, y=num, z=num}
97 static int l_get_node_max_level(lua_State *L);
98
99 // get_node_level(pos)
100 // pos = {x=num, y=num, z=num}
101 static int l_get_node_level(lua_State *L);
102
103 // set_node_level(pos)
104 // pos = {x=num, y=num, z=num}
105 static int l_set_node_level(lua_State *L);
106
107 // add_node_level(pos)
108 // pos = {x=num, y=num, z=num}
109 static int l_add_node_level(lua_State *L);
110
111 // get_node_boxes(box_type, pos, [node]) -> table
112 // box_type = string
113 // pos = {x=num, y=num, z=num}
114 // node = {name=string, param1=num, param2=num} or nil
115 static int l_get_node_boxes(lua_State *L);
116
117 // find_nodes_with_meta(pos1, pos2)
118 static int l_find_nodes_with_meta(lua_State *L);
119
120 // get_meta(pos)
121 static int l_get_meta(lua_State *L);
122
123 // get_node_timer(pos)
124 static int l_get_node_timer(lua_State *L);
125
126 // add_entity(pos, entityname) -> ObjectRef or nil
127 // pos = {x=num, y=num, z=num}
128 static int l_add_entity(lua_State *L);
129
130 // add_item(pos, itemstack or itemstring or table) -> ObjectRef or nil
131 // pos = {x=num, y=num, z=num}
132 static int l_add_item(lua_State *L);
133
134 // get_connected_players()
135 static int l_get_connected_players(lua_State *L);
136
137 // get_player_by_name(name)
138 static int l_get_player_by_name(lua_State *L);
139
140 // get_objects_inside_radius(pos, radius)
141 static int l_get_objects_inside_radius(lua_State *L);
142
143 // get_objects_in_area(pos, minp, maxp)
144 static int l_get_objects_in_area(lua_State *L);
145
146 // set_timeofday(val)
147 // val = 0...1
148 static int l_set_timeofday(lua_State *L);
149
150 // get_timeofday() -> 0...1
151 static int l_get_timeofday(lua_State *L);
152
153 // get_gametime()
154 static int l_get_gametime(lua_State *L);
155
156 // get_day_count() -> int
157 static int l_get_day_count(lua_State *L);
158
159 // find_node_near(pos, radius, nodenames, search_center) -> pos or nil
160 // nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
161 static int l_find_node_near(lua_State *L);
162
163 // find_nodes_in_area(minp, maxp, nodenames) -> list of positions
164 // nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
165 static int l_find_nodes_in_area(lua_State *L);
166
167 // find_surface_nodes_in_area(minp, maxp, nodenames) -> list of positions
168 // nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
169 static int l_find_nodes_in_area_under_air(lua_State *L);
170
171 // fix_light(p1, p2) -> true/false
172 static int l_fix_light(lua_State *L);
173
174 // load_area(p1)
175 static int l_load_area(lua_State *L);
176
177 // emerge_area(p1, p2)
178 static int l_emerge_area(lua_State *L);
179
180 // delete_area(p1, p2) -> true/false
181 static int l_delete_area(lua_State *L);
182
183 // get_value_noise(seeddiff, octaves, persistence, scale)
184 // returns world-specific ValueNoise
185 static int l_get_value_noise(lua_State *L);
186
187 // get_value_noise_map(noiseparams, size)
188 // returns world-specific ValueNoiseMap
189 static int l_get_value_noise_map(lua_State *L);
190
191 // get_voxel_manip()
192 // returns world-specific voxel manipulator
193 static int l_get_voxel_manip(lua_State *L);
194
195 // clear_objects()
196 // clear all objects in the environment
197 static int l_clear_objects(lua_State *L);
198
199 // spawn_tree(pos, treedef)
200 static int l_spawn_tree(lua_State *L);
201
202 // line_of_sight(pos1, pos2) -> true/false
203 static int l_line_of_sight(lua_State *L);
204
205 // raycast(pos1, pos2, objects, liquids) -> Raycast
206 static int l_raycast(lua_State *L);
207
208 // find_path(pos1, pos2, searchdistance,
209 // max_jump, max_drop, algorithm) -> table containing path
210 static int l_find_path(lua_State *L);
211
212 // transforming_liquid_add(pos)
213 static int l_transforming_liquid_add(lua_State *L);
214
215 // forceload_block(blockpos)
216 // forceloads a block
217 static int l_forceload_block(lua_State *L);
218
219 // forceload_free_block(blockpos)
220 // stops forceloading a position
221 static int l_forceload_free_block(lua_State *L);
222
223 // compare_block_status(nodepos)
224 static int l_compare_block_status(lua_State *L);
225
226 // get_translated_string(lang_code, string)
227 static int l_get_translated_string(lua_State * L);
228
229public:
230 static void Initialize(lua_State *L, int top);
231 static void InitializeClient(lua_State *L, int top);
232};
233
234/*
235 * Duplicates of certain env APIs that operate not on the global
236 * map but on a VoxelManipulator. This is for emerge scripting.
237 */
239private:
240
241 // get_node_or_nil(pos)
242 static int l_get_node_or_nil(lua_State *L);
243
244 // get_node_max_level(pos)
245 static int l_get_node_max_level(lua_State *L);
246
247 // get_node_level(pos)
248 static int l_get_node_level(lua_State *L);
249
250 // set_node_level(pos)
251 static int l_set_node_level(lua_State *L);
252
253 // add_node_level(pos)
254 static int l_add_node_level(lua_State *L);
255
256 // find_node_near(pos, radius, nodenames, [search_center])
257 static int l_find_node_near(lua_State *L);
258
259 // find_nodes_in_area(minp, maxp, nodenames, [grouped])
260 static int l_find_nodes_in_area(lua_State *L);
261
262 // find_surface_nodes_in_area(minp, maxp, nodenames)
263 static int l_find_nodes_in_area_under_air(lua_State *L);
264
265 // spawn_tree(pos, treedef)
266 static int l_spawn_tree(lua_State *L);
267
268 // Helper: get the vmanip we're operating on
269 static MMVManip *getVManip(lua_State *L);
270
271public:
272 static void InitializeEmerge(lua_State *L, int top);
273};
274
276class LuaRaycast : public ModApiBase
277{
278private:
279 static const luaL_Reg methods[];
282
283 // Exported functions
284
285 // garbage collector
286 static int gc_object(lua_State *L);
287
292 static int l_next(lua_State *L);
293public:
296 const core::line3d<f32> &shootline,
297 bool objects_pointable,
298 bool liquids_pointable,
299 const std::optional<Pointabilities> &pointabilities) :
300 state(shootline, objects_pointable, liquids_pointable, pointabilities)
301 {}
302
304 static int create_object(lua_State *L);
305
307 static void Register(lua_State *L);
308
309 static const char className[];
310};
311
Lua wrapper for RaycastState objects.
Definition l_env.h:277
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:295
static int l_next(lua_State *L)
Definition l_env.cpp:54
static const char className[]
Definition l_env.h:309
static const luaL_Reg methods[]
Definition l_env.h:134
static int gc_object(lua_State *L)
Definition l_env.cpp:114
RaycastState state
Inner state.
Definition l_env.h:281
static int create_object(lua_State *L)
Creates a LuaRaycast and leaves it on top of the stack.
Definition l_env.cpp:85
Definition map.h:301
Definition l_base.h:27
Definition l_env.h:14
static int findNodesInArea(lua_State *L, const NodeDefManager *ndef, const std::vector< content_t > &filter, bool grouped, F &&iterate)
Definition l_env.cpp:870
static const EnumString es_ClearObjectsMode[]
Definition l_env.h:36
static void collectNodeIds(lua_State *L, int idx, const NodeDefManager *ndef, std::vector< content_t > &filter)
Definition l_env.cpp:792
static void checkArea(v3s16 &minp, v3s16 &maxp)
Definition l_env.cpp:855
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:810
static int findNodesInAreaUnderAir(lua_State *L, v3s16 minp, v3s16 maxp, const std::vector< content_t > &filter, F &&getNode)
Definition l_env.cpp:975
static const EnumString es_BlockStatusType[]
Definition l_env.h:43
Definition l_env.h:238
static int l_get_node_or_nil(lua_State *L)
Definition l_env.cpp:1461
static int l_spawn_tree(lua_State *L)
Definition l_env.cpp:1606
static void InitializeEmerge(lua_State *L, int top)
Definition l_env.cpp:1635
static int l_add_node_level(lua_State *L)
Definition l_env.cpp:1511
static int l_find_node_near(lua_State *L)
Definition l_env.cpp:1526
static int l_find_nodes_in_area(lua_State *L)
Definition l_env.cpp:1545
static int l_get_node_max_level(lua_State *L)
Definition l_env.cpp:1474
static int l_set_node_level(lua_State *L)
Definition l_env.cpp:1496
static int l_find_nodes_in_area_under_air(lua_State *L)
Definition l_env.cpp:1585
static MMVManip * getVManip(lua_State *L)
Definition l_env.cpp:1627
static int l_get_node_level(lua_State *L)
Definition l_env.cpp:1485
Definition l_env.h:44
static int l_bulk_set_node(lua_State *L)
Definition l_env.cpp:178
static int l_forceload_block(lua_State *L)
Definition l_env.cpp:1335
static int l_get_value_noise(lua_State *L)
Definition l_env.cpp:1036
static int l_find_nodes_in_area_under_air(lua_State *L)
Definition l_env.cpp:1001
static int l_fix_light(lua_State *L)
Definition l_env.cpp:1125
static int l_raycast(lua_State *L)
Definition l_env.cpp:1152
static int l_set_timeofday(lua_State *L)
Definition l_env.cpp:748
static int l_get_translated_string(lua_State *L)
Definition l_env.cpp:1374
static int l_swap_node(lua_State *L)
Definition l_env.cpp:229
static int l_add_node(lua_State *L)
Definition l_env.cpp:208
static int l_get_voxel_manip(lua_State *L)
Definition l_env.cpp:1081
static int l_find_nodes_with_meta(lua_State *L)
Definition l_env.cpp:563
static int l_get_node_max_level(lua_State *L)
Definition l_env.cpp:472
static int l_spawn_tree(lua_State *L)
Definition l_env.cpp:1301
static int l_bulk_swap_node(lua_State *L)
Definition l_env.cpp:244
static int l_get_node_level(lua_State *L)
Definition l_env.cpp:484
static int l_get_value_noise_map(lua_State *L)
Definition l_env.cpp:1062
static int l_emerge_area(lua_State *L)
Definition l_env.cpp:1182
static int l_get_objects_inside_radius(lua_State *L)
Definition l_env.cpp:698
static int l_get_node_light(lua_State *L)
Definition l_env.cpp:299
static int l_get_connected_players(lua_State *L)
Definition l_env.cpp:657
static int l_forceload_free_block(lua_State *L)
Definition l_env.cpp:1364
static int l_set_node(lua_State *L)
Definition l_env.cpp:163
static int l_get_player_by_name(lua_State *L)
Definition l_env.cpp:680
static int l_load_area(lua_State *L)
Definition l_env.cpp:1159
static int l_get_timeofday(lua_State *L)
Definition l_env.cpp:766
static int l_get_gametime(lua_State *L)
Definition l_env.cpp:784
static int l_find_nodes_in_area(lua_State *L)
Definition l_env.cpp:943
static int l_set_node_level(lua_State *L)
Definition l_env.cpp:497
static int l_get_node_raw(lua_State *L)
Definition l_env.cpp:268
static int l_line_of_sight(lua_State *L)
Definition l_env.cpp:1104
static int l_find_node_near(lua_State *L)
Definition l_env.cpp:829
static void Initialize(lua_State *L, int top)
Definition l_env.cpp:1387
static int l_add_entity(lua_State *L)
Definition l_env.cpp:603
static int l_get_meta(lua_State *L)
Definition l_env.cpp:580
static int l_get_node_timer(lua_State *L)
Definition l_env.cpp:591
static int l_clear_objects(lua_State *L)
Definition l_env.cpp:1089
static int l_add_node_level(lua_State *L)
Definition l_env.cpp:514
static int l_get_day_count(lua_State *L)
Definition l_env.cpp:775
static int l_punch_node(lua_State *L)
Definition l_env.cpp:439
static int l_add_item(lua_State *L)
Definition l_env.cpp:628
static int l_get_natural_light(lua_State *L)
Definition l_env.cpp:326
static int l_get_node_boxes(lua_State *L)
Definition l_env.cpp:532
static int l_dig_node(lua_State *L)
Definition l_env.cpp:407
static int l_transforming_liquid_add(lua_State *L)
Definition l_env.cpp:1324
static int l_get_objects_in_area(lua_State *L)
Definition l_env.cpp:722
static void InitializeClient(lua_State *L, int top)
Definition l_env.cpp:1441
static int l_find_path(lua_State *L)
Definition l_env.cpp:1261
static int l_compare_block_status(lua_State *L)
Definition l_env.cpp:1345
static int l_delete_area(lua_State *L)
Definition l_env.cpp:1228
static int l_place_node(lua_State *L)
Definition l_env.cpp:364
static int l_remove_node(lua_State *L)
Definition l_env.cpp:215
This class is for getting the actual properties of nodes from their content ID.
Definition nodedef.h:509
Describes the state of a raycast.
Definition raycast.h:19
Definition scripting_server.h:34
core::vector3d< s16 > v3s16
Definition irr_v3d.h:13
#define idx(x, y)
Definition noise.cpp:495
Definition enum_string.h:11
Definition l_env.h:312
int args_ref
Definition l_env.h:315
std::string origin
Definition l_env.h:317
ServerScripting * script
Definition l_env.h:313
int callback_ref
Definition l_env.h:314
unsigned int refcount
Definition l_env.h:316