Skip to content

Commit 821d002

Browse files
committedApr 17, 2015
Biomes: Remove referenced biomes from Decorations on clear
1 parent 4abb96f commit 821d002

File tree

6 files changed

+36
-17
lines changed

6 files changed

+36
-17
lines changed
 

Diff for: ‎src/gamedef.h

+17-12
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class ISoundManager;
3131
class IShaderSource;
3232
class MtEventManager;
3333
class IRollbackManager;
34+
class EmergeManager;
3435
namespace irr { namespace scene {
3536
class IAnimatedMesh;
3637
class ISceneManager;
@@ -55,10 +56,10 @@ class IGameDef
5556
virtual ITextureSource* getTextureSource()=0;
5657

5758
virtual IShaderSource* getShaderSource()=0;
58-
59+
5960
// Used for keeping track of names/ids of unknown nodes
6061
virtual u16 allocateUnknownNodeId(const std::string &name)=0;
61-
62+
6263
// Only usable on the client
6364
virtual ISoundManager* getSoundManager()=0;
6465
virtual MtEventManager* getEventManager()=0;
@@ -69,20 +70,24 @@ class IGameDef
6970
// Only usable on the server, and NOT thread-safe. It is usable from the
7071
// environment thread.
7172
virtual IRollbackManager* getRollbackManager(){return NULL;}
72-
73+
74+
// Only usable on the server. Thread safe if not written while running threads.
75+
virtual EmergeManager *getEmergeManager() { return NULL; }
76+
7377
// Used on the client
7478
virtual bool checkLocalPrivilege(const std::string &priv)
7579
{ return false; }
76-
80+
7781
// Shorthands
78-
IItemDefManager* idef(){return getItemDefManager();}
79-
INodeDefManager* ndef(){return getNodeDefManager();}
80-
ICraftDefManager* cdef(){return getCraftDefManager();}
81-
ITextureSource* tsrc(){return getTextureSource();}
82-
ISoundManager* sound(){return getSoundManager();}
83-
IShaderSource* shsrc(){return getShaderSource();}
84-
MtEventManager* event(){return getEventManager();}
85-
IRollbackManager* rollback(){return getRollbackManager();}
82+
IItemDefManager *idef() { return getItemDefManager(); }
83+
INodeDefManager *ndef() { return getNodeDefManager(); }
84+
ICraftDefManager *cdef() { return getCraftDefManager(); }
85+
ITextureSource *tsrc() { return getTextureSource(); }
86+
ISoundManager *sound() { return getSoundManager(); }
87+
IShaderSource *shsrc() { return getShaderSource(); }
88+
MtEventManager *event() { return getEventManager(); }
89+
IRollbackManager *rollback() { return getRollbackManager();}
90+
EmergeManager *emerge() { return getEmergeManager(); }
8691
};
8792

8893
#endif

Diff for: ‎src/mapgen.h

+2
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,8 @@ class ObjDefManager {
229229
virtual ObjDef *getRaw(u32 index) const;
230230
virtual ObjDef *setRaw(u32 index, ObjDef *obj);
231231

232+
size_t getNumObjects() const { return m_objects.size(); }
233+
ObjDefType getType() const { return m_objtype; }
232234
INodeDefManager *getNodeDef() const { return m_ndef; }
233235

234236
u32 validateHandle(ObjDefHandle handle) const;

Diff for: ‎src/mg_biome.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
1818
*/
1919

2020
#include "mg_biome.h"
21+
#include "mg_decoration.h"
22+
#include "emerge.h"
2123
#include "gamedef.h"
2224
#include "nodedef.h"
2325
#include "map.h" //for MMVManip
@@ -33,6 +35,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
3335
BiomeManager::BiomeManager(IGameDef *gamedef) :
3436
ObjDefManager(gamedef, OBJDEF_BIOME)
3537
{
38+
m_gamedef = gamedef;
39+
3640
// Create default biome to be used in case none exist
3741
Biome *b = new Biome;
3842

@@ -103,7 +107,16 @@ Biome *BiomeManager::getBiome(float heat, float humidity, s16 y)
103107

104108
void BiomeManager::clear()
105109
{
110+
EmergeManager *emerge = m_gamedef->getEmergeManager();
111+
112+
// Remove all dangling references in Decorations
113+
DecorationManager *decomgr = emerge->decomgr;
114+
for (size_t i = 0; i != decomgr->getNumObjects(); i++) {
115+
Decoration *deco = (Decoration *)decomgr->getRaw(i);
116+
deco->biomes.clear();
117+
}
106118

119+
// Don't delete the first biome
107120
for (size_t i = 1; i < m_objects.size(); i++) {
108121
Biome *b = (Biome *)m_objects[i];
109122
delete b;

Diff for: ‎src/mg_biome.h

+3
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ class BiomeManager : public ObjDefManager {
7878
void calcBiomes(s16 sx, s16 sy, float *heat_map, float *humidity_map,
7979
s16 *height_map, u8 *biomeid_map);
8080
Biome *getBiome(float heat, float humidity, s16 y);
81+
82+
private:
83+
IGameDef *m_gamedef;
8184
};
8285

8386
#endif

Diff for: ‎src/script/lua_api/l_mapgen.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -1039,7 +1039,6 @@ int ModApiMapgen::l_create_schematic(lua_State *L)
10391039
Schematic schem;
10401040

10411041
Map *map = &(getEnv(L)->getMap());
1042-
INodeDefManager *ndef = getServer(L)->getNodeDefManager();
10431042

10441043
v3s16 p1 = read_v3s16(L, 1);
10451044
v3s16 p2 = read_v3s16(L, 2);

Diff for: ‎src/server.h

+1-4
Original file line numberDiff line numberDiff line change
@@ -297,9 +297,6 @@ class Server : public con::PeerHandler, public MapEventReceiver,
297297
// Envlock and conlock should be locked when using scriptapi
298298
GameScripting *getScriptIface(){ return m_script; }
299299

300-
//TODO: determine what (if anything) should be locked to access EmergeManager
301-
EmergeManager *getEmergeManager(){ return m_emerge; }
302-
303300
// actions: time-reversed list
304301
// Return value: success/failure
305302
bool rollbackRevertActions(const std::list<RollbackAction> &actions,
@@ -317,7 +314,7 @@ class Server : public con::PeerHandler, public MapEventReceiver,
317314
virtual MtEventManager* getEventManager();
318315
virtual scene::ISceneManager* getSceneManager();
319316
virtual IRollbackManager *getRollbackManager() { return m_rollback; }
320-
317+
virtual EmergeManager *getEmergeManager() { return m_emerge; }
321318

322319
IWritableItemDefManager* getWritableItemDefManager();
323320
IWritableNodeDefManager* getWritableNodeDefManager();

0 commit comments

Comments
 (0)
Please sign in to comment.