Skip to content

Commit 5cc06e4

Browse files
authoredApr 11, 2020
Reduce ServerEnvironment propagation (#9642)
ServerEnvironment is a huge class with many accessors. In various places it's not needed Remove it to reduce the ServerEnvironment view. Idea here is to reduce size of some of our objects to transport lightweight managers and permit easier testing Pathfinder is now tied to a generic map, not a ServerMap, it can be ported to client
1 parent 5146086 commit 5cc06e4

File tree

7 files changed

+71
-118
lines changed

7 files changed

+71
-118
lines changed
 

‎src/mapgen/treegen.cpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2525
#include "util/numeric.h"
2626
#include "map.h"
2727
#include "mapblock.h"
28-
#include "serverenvironment.h"
2928
#include "nodedef.h"
3029
#include "treegen.h"
3130
#include "voxelalgorithms.h"
@@ -120,10 +119,9 @@ void make_tree(MMVManip &vmanip, v3s16 p0, bool is_apple_tree,
120119

121120

122121
// L-System tree LUA spawner
123-
treegen::error spawn_ltree(ServerEnvironment *env, v3s16 p0,
122+
treegen::error spawn_ltree(ServerMap *map, v3s16 p0,
124123
const NodeDefManager *ndef, const TreeDef &tree_definition)
125124
{
126-
ServerMap *map = &env->getServerMap();
127125
std::map<v3s16, MapBlock*> modified_blocks;
128126
MMVManip vmanip(map);
129127
v3s16 tree_blockp = getNodeBlockPos(p0);

‎src/mapgen/treegen.h

+2-3
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2626

2727
class MMVManip;
2828
class NodeDefManager;
29-
class ServerEnvironment;
30-
29+
class ServerMap;
3130

3231
namespace treegen {
3332

@@ -73,7 +72,7 @@ namespace treegen {
7372
treegen::error make_ltree(MMVManip &vmanip, v3s16 p0,
7473
const NodeDefManager *ndef, TreeDef tree_definition);
7574
// Spawn L-systems tree from LUA
76-
treegen::error spawn_ltree (ServerEnvironment *env, v3s16 p0,
75+
treegen::error spawn_ltree (ServerMap *map, v3s16 p0,
7776
const NodeDefManager *ndef, const TreeDef &tree_definition);
7877

7978
// L-System tree gen helper functions

‎src/pathfinder.cpp

+43-59
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2323
/******************************************************************************/
2424

2525
#include "pathfinder.h"
26-
#include "serverenvironment.h"
27-
#include "server.h"
26+
#include "map.h"
2827
#include "nodedef.h"
2928

3029
//#define PATHFINDER_DEBUG
@@ -180,10 +179,8 @@ class MapGridNodeContainer : public GridNodeContainer {
180179
class Pathfinder {
181180

182181
public:
183-
/**
184-
* default constructor
185-
*/
186-
Pathfinder() = default;
182+
Pathfinder() = delete;
183+
Pathfinder(Map *map, const NodeDefManager *ndef) : m_map(map), m_ndef(ndef) {}
187184

188185
~Pathfinder();
189186

@@ -197,8 +194,7 @@ class Pathfinder {
197194
* @param max_drop maximum number of blocks a path may drop
198195
* @param algo Algorithm to use for finding a path
199196
*/
200-
std::vector<v3s16> getPath(ServerEnvironment *env,
201-
v3s16 source,
197+
std::vector<v3s16> getPath(v3s16 source,
202198
v3s16 destination,
203199
unsigned int searchdistance,
204200
unsigned int max_jump,
@@ -328,7 +324,9 @@ class Pathfinder {
328324
friend class GridNodeContainer;
329325
GridNodeContainer *m_nodes_container = nullptr;
330326

331-
ServerEnvironment *m_env = 0; /**< minetest environment pointer */
327+
Map *m_map = nullptr;
328+
329+
const NodeDefManager *m_ndef = nullptr;
332330

333331
friend class PathfinderCompareHeuristic;
334332

@@ -410,18 +408,15 @@ class PathfinderCompareHeuristic
410408
/* implementation */
411409
/******************************************************************************/
412410

413-
std::vector<v3s16> get_path(ServerEnvironment* env,
414-
v3s16 source,
415-
v3s16 destination,
416-
unsigned int searchdistance,
417-
unsigned int max_jump,
418-
unsigned int max_drop,
419-
PathAlgorithm algo)
411+
std::vector<v3s16> get_path(Map* map, const NodeDefManager *ndef,
412+
v3s16 source,
413+
v3s16 destination,
414+
unsigned int searchdistance,
415+
unsigned int max_jump,
416+
unsigned int max_drop,
417+
PathAlgorithm algo)
420418
{
421-
Pathfinder searchclass;
422-
423-
return searchclass.getPath(env,
424-
source, destination,
419+
return Pathfinder(map, ndef).getPath(source, destination,
425420
searchdistance, max_jump, max_drop, algo);
426421
}
427422

@@ -521,13 +516,13 @@ void PathGridnode::setCost(v3s16 dir, const PathCost &cost)
521516

522517
void GridNodeContainer::initNode(v3s16 ipos, PathGridnode *p_node)
523518
{
524-
const NodeDefManager *ndef = m_pathf->m_env->getGameDef()->ndef();
519+
const NodeDefManager *ndef = m_pathf->m_ndef;
525520
PathGridnode &elem = *p_node;
526521

527522
v3s16 realpos = m_pathf->getRealPos(ipos);
528523

529-
MapNode current = m_pathf->m_env->getMap().getNode(realpos);
530-
MapNode below = m_pathf->m_env->getMap().getNode(realpos + v3s16(0, -1, 0));
524+
MapNode current = m_pathf->m_map->getNode(realpos);
525+
MapNode below = m_pathf->m_map->getNode(realpos + v3s16(0, -1, 0));
531526

532527

533528
if ((current.param0 == CONTENT_IGNORE) ||
@@ -610,8 +605,7 @@ PathGridnode &MapGridNodeContainer::access(v3s16 p)
610605

611606

612607
/******************************************************************************/
613-
std::vector<v3s16> Pathfinder::getPath(ServerEnvironment *env,
614-
v3s16 source,
608+
std::vector<v3s16> Pathfinder::getPath(v3s16 source,
615609
v3s16 destination,
616610
unsigned int searchdistance,
617611
unsigned int max_jump,
@@ -624,15 +618,8 @@ std::vector<v3s16> Pathfinder::getPath(ServerEnvironment *env,
624618
#endif
625619
std::vector<v3s16> retval;
626620

627-
//check parameters
628-
if (env == 0) {
629-
ERROR_TARGET << "Missing environment pointer" << std::endl;
630-
return retval;
631-
}
632-
633621
//initialization
634622
m_searchdistance = searchdistance;
635-
m_env = env;
636623
m_maxjump = max_jump;
637624
m_maxdrop = max_drop;
638625
m_start = source;
@@ -681,15 +668,14 @@ std::vector<v3s16> Pathfinder::getPath(ServerEnvironment *env,
681668
#endif
682669

683670
//fail if source or destination is walkable
684-
const NodeDefManager *ndef = m_env->getGameDef()->ndef();
685-
MapNode node_at_pos = m_env->getMap().getNode(destination);
686-
if (ndef->get(node_at_pos).walkable) {
671+
MapNode node_at_pos = m_map->getNode(destination);
672+
if (m_ndef->get(node_at_pos).walkable) {
687673
VERBOSE_TARGET << "Destination is walkable. " <<
688674
"Pos: " << PP(destination) << std::endl;
689675
return retval;
690676
}
691-
node_at_pos = m_env->getMap().getNode(source);
692-
if (ndef->get(node_at_pos).walkable) {
677+
node_at_pos = m_map->getNode(source);
678+
if (m_ndef->get(node_at_pos).walkable) {
693679
VERBOSE_TARGET << "Source is walkable. " <<
694680
"Pos: " << PP(source) << std::endl;
695681
return retval;
@@ -843,7 +829,6 @@ v3s16 Pathfinder::getRealPos(v3s16 ipos)
843829
/******************************************************************************/
844830
PathCost Pathfinder::calcCost(v3s16 pos, v3s16 dir)
845831
{
846-
const NodeDefManager *ndef = m_env->getGameDef()->ndef();
847832
PathCost retval;
848833

849834
retval.updated = true;
@@ -857,7 +842,7 @@ PathCost Pathfinder::calcCost(v3s16 pos, v3s16 dir)
857842
return retval;
858843
}
859844

860-
MapNode node_at_pos2 = m_env->getMap().getNode(pos2);
845+
MapNode node_at_pos2 = m_map->getNode(pos2);
861846

862847
//did we get information about node?
863848
if (node_at_pos2.param0 == CONTENT_IGNORE ) {
@@ -866,9 +851,9 @@ PathCost Pathfinder::calcCost(v3s16 pos, v3s16 dir)
866851
return retval;
867852
}
868853

869-
if (!ndef->get(node_at_pos2).walkable) {
854+
if (!m_ndef->get(node_at_pos2).walkable) {
870855
MapNode node_below_pos2 =
871-
m_env->getMap().getNode(pos2 + v3s16(0, -1, 0));
856+
m_map->getNode(pos2 + v3s16(0, -1, 0));
872857

873858
//did we get information about node?
874859
if (node_below_pos2.param0 == CONTENT_IGNORE ) {
@@ -878,7 +863,7 @@ PathCost Pathfinder::calcCost(v3s16 pos, v3s16 dir)
878863
}
879864

880865
//test if the same-height neighbor is suitable
881-
if (ndef->get(node_below_pos2).walkable) {
866+
if (m_ndef->get(node_below_pos2).walkable) {
882867
//SUCCESS!
883868
retval.valid = true;
884869
retval.value = 1;
@@ -889,19 +874,19 @@ PathCost Pathfinder::calcCost(v3s16 pos, v3s16 dir)
889874
else {
890875
//test if we can fall a couple of nodes (m_maxdrop)
891876
v3s16 testpos = pos2 + v3s16(0, -1, 0);
892-
MapNode node_at_pos = m_env->getMap().getNode(testpos);
877+
MapNode node_at_pos = m_map->getNode(testpos);
893878

894879
while ((node_at_pos.param0 != CONTENT_IGNORE) &&
895-
(!ndef->get(node_at_pos).walkable) &&
880+
(!m_ndef->get(node_at_pos).walkable) &&
896881
(testpos.Y > m_limits.MinEdge.Y)) {
897882
testpos += v3s16(0, -1, 0);
898-
node_at_pos = m_env->getMap().getNode(testpos);
883+
node_at_pos = m_map->getNode(testpos);
899884
}
900885

901886
//did we find surface?
902887
if ((testpos.Y >= m_limits.MinEdge.Y) &&
903888
(node_at_pos.param0 != CONTENT_IGNORE) &&
904-
(ndef->get(node_at_pos).walkable)) {
889+
(m_ndef->get(node_at_pos).walkable)) {
905890
if ((pos2.Y - testpos.Y - 1) <= m_maxdrop) {
906891
//SUCCESS!
907892
retval.valid = true;
@@ -927,34 +912,34 @@ PathCost Pathfinder::calcCost(v3s16 pos, v3s16 dir)
927912

928913
v3s16 targetpos = pos2; // position for jump target
929914
v3s16 jumppos = pos; // position for checking if jumping space is free
930-
MapNode node_target = m_env->getMap().getNode(targetpos);
931-
MapNode node_jump = m_env->getMap().getNode(jumppos);
915+
MapNode node_target = m_map->getNode(targetpos);
916+
MapNode node_jump = m_map->getNode(jumppos);
932917
bool headbanger = false; // true if anything blocks jumppath
933918

934919
while ((node_target.param0 != CONTENT_IGNORE) &&
935-
(ndef->get(node_target).walkable) &&
920+
(m_ndef->get(node_target).walkable) &&
936921
(targetpos.Y < m_limits.MaxEdge.Y)) {
937922
//if the jump would hit any solid node, discard
938923
if ((node_jump.param0 == CONTENT_IGNORE) ||
939-
(ndef->get(node_jump).walkable)) {
924+
(m_ndef->get(node_jump).walkable)) {
940925
headbanger = true;
941926
break;
942927
}
943928
targetpos += v3s16(0, 1, 0);
944929
jumppos += v3s16(0, 1, 0);
945-
node_target = m_env->getMap().getNode(targetpos);
946-
node_jump = m_env->getMap().getNode(jumppos);
930+
node_target = m_map->getNode(targetpos);
931+
node_jump = m_map->getNode(jumppos);
947932

948933
}
949934
//check headbanger one last time
950935
if ((node_jump.param0 == CONTENT_IGNORE) ||
951-
(ndef->get(node_jump).walkable)) {
936+
(m_ndef->get(node_jump).walkable)) {
952937
headbanger = true;
953938
}
954939

955940
//did we find surface without banging our head?
956941
if ((!headbanger) && (targetpos.Y <= m_limits.MaxEdge.Y) &&
957-
(!ndef->get(node_target).walkable)) {
942+
(!m_ndef->get(node_target).walkable)) {
958943

959944
if (targetpos.Y - pos2.Y <= m_maxjump) {
960945
//SUCCESS!
@@ -1254,21 +1239,20 @@ v3s16 Pathfinder::walkDownwards(v3s16 pos, unsigned int max_down) {
12541239
if (max_down == 0)
12551240
return pos;
12561241
v3s16 testpos = v3s16(pos);
1257-
MapNode node_at_pos = m_env->getMap().getNode(testpos);
1258-
const NodeDefManager *ndef = m_env->getGameDef()->ndef();
1242+
MapNode node_at_pos = m_map->getNode(testpos);
12591243
unsigned int down = 0;
12601244
while ((node_at_pos.param0 != CONTENT_IGNORE) &&
1261-
(!ndef->get(node_at_pos).walkable) &&
1245+
(!m_ndef->get(node_at_pos).walkable) &&
12621246
(testpos.Y > m_limits.MinEdge.Y) &&
12631247
(down <= max_down)) {
12641248
testpos += v3s16(0, -1, 0);
12651249
down++;
1266-
node_at_pos = m_env->getMap().getNode(testpos);
1250+
node_at_pos = m_map->getNode(testpos);
12671251
}
12681252
//did we find surface?
12691253
if ((testpos.Y >= m_limits.MinEdge.Y) &&
12701254
(node_at_pos.param0 != CONTENT_IGNORE) &&
1271-
(ndef->get(node_at_pos).walkable)) {
1255+
(m_ndef->get(node_at_pos).walkable)) {
12721256
if (down == 0) {
12731257
pos = testpos;
12741258
} else if ((down - 1) <= max_down) {

‎src/pathfinder.h

+9-8
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2929
/* Forward declarations */
3030
/******************************************************************************/
3131

32-
class ServerEnvironment;
32+
class NodeDefManager;
33+
class Map;
3334

3435
/******************************************************************************/
3536
/* Typedefs and macros */
@@ -54,10 +55,10 @@ typedef enum {
5455
/******************************************************************************/
5556

5657
/** c wrapper function to use from scriptapi */
57-
std::vector<v3s16> get_path(ServerEnvironment *env,
58-
v3s16 source,
59-
v3s16 destination,
60-
unsigned int searchdistance,
61-
unsigned int max_jump,
62-
unsigned int max_drop,
63-
PathAlgorithm algo);
58+
std::vector<v3s16> get_path(Map *map, const NodeDefManager *ndef,
59+
v3s16 source,
60+
v3s16 destination,
61+
unsigned int searchdistance,
62+
unsigned int max_jump,
63+
unsigned int max_drop,
64+
PathAlgorithm algo);

‎src/script/lua_api/l_env.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,7 @@ int ModApiEnvMod::l_get_node_timer(lua_State *L)
577577

578578
// Do it
579579
v3s16 p = read_v3s16(L, 1);
580-
NodeTimerRef::create(L, p, env);
580+
NodeTimerRef::create(L, p, &env->getServerMap());
581581
return 1;
582582
}
583583

@@ -1193,7 +1193,7 @@ int ModApiEnvMod::l_find_path(lua_State *L)
11931193
algo = PA_DIJKSTRA;
11941194
}
11951195

1196-
std::vector<v3s16> path = get_path(env, pos1, pos2,
1196+
std::vector<v3s16> path = get_path(&env->getServerMap(), env->getGameDef()->ndef(), pos1, pos2,
11971197
searchdistance, max_jump, max_drop, algo);
11981198

11991199
if (!path.empty()) {
@@ -1257,8 +1257,9 @@ int ModApiEnvMod::l_spawn_tree(lua_State *L)
12571257
else
12581258
return 0;
12591259

1260+
ServerMap *map = &env->getServerMap();
12601261
treegen::error e;
1261-
if ((e = treegen::spawn_ltree (env, p0, ndef, tree_def)) != treegen::SUCCESS) {
1262+
if ((e = treegen::spawn_ltree (map, p0, ndef, tree_def)) != treegen::SUCCESS) {
12621263
if (e == treegen::UNBALANCED_BRACKETS) {
12631264
luaL_error(L, "spawn_tree(): closing ']' has no matching opening bracket");
12641265
} else {

‎src/script/lua_api/l_nodetimer.cpp

+8-36
Original file line numberDiff line numberDiff line change
@@ -41,43 +41,34 @@ int NodeTimerRef::l_set(lua_State *L)
4141
{
4242
MAP_LOCK_REQUIRED;
4343
NodeTimerRef *o = checkobject(L, 1);
44-
ServerEnvironment *env = o->m_env;
45-
if(env == NULL) return 0;
4644
f32 t = readParam<float>(L,2);
4745
f32 e = readParam<float>(L,3);
48-
env->getMap().setNodeTimer(NodeTimer(t, e, o->m_p));
46+
o->m_map->setNodeTimer(NodeTimer(t, e, o->m_p));
4947
return 0;
5048
}
5149

5250
int NodeTimerRef::l_start(lua_State *L)
5351
{
5452
MAP_LOCK_REQUIRED;
5553
NodeTimerRef *o = checkobject(L, 1);
56-
ServerEnvironment *env = o->m_env;
57-
if(env == NULL) return 0;
5854
f32 t = readParam<float>(L,2);
59-
env->getMap().setNodeTimer(NodeTimer(t, 0, o->m_p));
55+
o->m_map->setNodeTimer(NodeTimer(t, 0, o->m_p));
6056
return 0;
6157
}
6258

6359
int NodeTimerRef::l_stop(lua_State *L)
6460
{
6561
MAP_LOCK_REQUIRED;
6662
NodeTimerRef *o = checkobject(L, 1);
67-
ServerEnvironment *env = o->m_env;
68-
if(env == NULL) return 0;
69-
env->getMap().removeNodeTimer(o->m_p);
63+
o->m_map->removeNodeTimer(o->m_p);
7064
return 0;
7165
}
7266

7367
int NodeTimerRef::l_is_started(lua_State *L)
7468
{
7569
MAP_LOCK_REQUIRED;
7670
NodeTimerRef *o = checkobject(L, 1);
77-
ServerEnvironment *env = o->m_env;
78-
if(env == NULL) return 0;
79-
80-
NodeTimer t = env->getMap().getNodeTimer(o->m_p);
71+
NodeTimer t = o->m_map->getNodeTimer(o->m_p);
8172
lua_pushboolean(L,(t.timeout != 0));
8273
return 1;
8374
}
@@ -86,10 +77,7 @@ int NodeTimerRef::l_get_timeout(lua_State *L)
8677
{
8778
MAP_LOCK_REQUIRED;
8879
NodeTimerRef *o = checkobject(L, 1);
89-
ServerEnvironment *env = o->m_env;
90-
if(env == NULL) return 0;
91-
92-
NodeTimer t = env->getMap().getNodeTimer(o->m_p);
80+
NodeTimer t = o->m_map->getNodeTimer(o->m_p);
9381
lua_pushnumber(L,t.timeout);
9482
return 1;
9583
}
@@ -98,37 +86,21 @@ int NodeTimerRef::l_get_elapsed(lua_State *L)
9886
{
9987
MAP_LOCK_REQUIRED;
10088
NodeTimerRef *o = checkobject(L, 1);
101-
ServerEnvironment *env = o->m_env;
102-
if(env == NULL) return 0;
103-
104-
NodeTimer t = env->getMap().getNodeTimer(o->m_p);
89+
NodeTimer t = o->m_map->getNodeTimer(o->m_p);
10590
lua_pushnumber(L,t.elapsed);
10691
return 1;
10792
}
10893

109-
110-
NodeTimerRef::NodeTimerRef(v3s16 p, ServerEnvironment *env):
111-
m_p(p),
112-
m_env(env)
113-
{
114-
}
115-
11694
// Creates an NodeTimerRef and leaves it on top of stack
11795
// Not callable from Lua; all references are created on the C side.
118-
void NodeTimerRef::create(lua_State *L, v3s16 p, ServerEnvironment *env)
96+
void NodeTimerRef::create(lua_State *L, v3s16 p, ServerMap *map)
11997
{
120-
NodeTimerRef *o = new NodeTimerRef(p, env);
98+
NodeTimerRef *o = new NodeTimerRef(p, map);
12199
*(void **)(lua_newuserdata(L, sizeof(void *))) = o;
122100
luaL_getmetatable(L, className);
123101
lua_setmetatable(L, -2);
124102
}
125103

126-
void NodeTimerRef::set_null(lua_State *L)
127-
{
128-
NodeTimerRef *o = checkobject(L, -1);
129-
o->m_env = NULL;
130-
}
131-
132104
void NodeTimerRef::Register(lua_State *L)
133105
{
134106
lua_newtable(L);

‎src/script/lua_api/l_nodetimer.h

+4-6
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2222
#include "irr_v3d.h"
2323
#include "lua_api/l_base.h"
2424

25-
class ServerEnvironment;
25+
class ServerMap;
2626

2727
class NodeTimerRef : public ModApiBase
2828
{
2929
private:
3030
v3s16 m_p;
31-
ServerEnvironment *m_env = nullptr;
31+
ServerMap *m_map;
3232

3333
static const char className[];
3434
static const luaL_Reg methods[];
@@ -50,14 +50,12 @@ class NodeTimerRef : public ModApiBase
5050
static int l_get_elapsed(lua_State *L);
5151

5252
public:
53-
NodeTimerRef(v3s16 p, ServerEnvironment *env);
53+
NodeTimerRef(v3s16 p, ServerMap *map) : m_p(p), m_map(map) {}
5454
~NodeTimerRef() = default;
5555

5656
// Creates an NodeTimerRef and leaves it on top of stack
5757
// Not callable from Lua; all references are created on the C side.
58-
static void create(lua_State *L, v3s16 p, ServerEnvironment *env);
59-
60-
static void set_null(lua_State *L);
58+
static void create(lua_State *L, v3s16 p, ServerMap *map);
6159

6260
static void Register(lua_State *L);
6361
};

0 commit comments

Comments
 (0)
Please sign in to comment.