Luanti 5.15.0-dev
 
Loading...
Searching...
No Matches
servermap.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2010-2024 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5#pragma once
6
7#include <vector>
8#include <memory>
9
10#include "map.h"
11#include "util/container.h" // UniqueQueue
12#include "util/metricsbackend.h" // ptr typedefs
14
15class Settings;
16class MapDatabase;
17class EmergeManager;
19struct BlockMakeData;
20class MetricsBackend;
21
22// TODO: this could wrap all calls to MapDatabase, including locking
25 std::mutex mutex;
27 MapDatabase *dbase = nullptr;
30
33 void loadBlock(v3s16 blockpos, std::string &ret);
34};
35
36/*
37 ServerMap
38
39 This is the only map class that is able to generate map.
40*/
41
42class ServerMap : public Map
43{
44public:
45 /*
46 savedir: directory to which map data should be saved
47 */
48 ServerMap(const std::string &savedir, IGameDef *gamedef, EmergeManager *emerge, MetricsBackend *mb);
49 ~ServerMap();
50
51 /*
52 Get a sector from somewhere.
53 - Check memory
54 - Check disk (doesn't load blocks)
55 - Create blank one
56 */
58
59 /*
60 Blocks are generated by using these and makeBlock().
61 */
65 bool initBlockMake(v3s16 blockpos, BlockMakeData *data);
69 std::map<v3s16, MapBlock*> *changed_blocks, ServerEnvironment *env);
71
72 /*
73 Get a block from somewhere.
74 - Memory
75 - Create blank
76 */
78
79 /*
80 Forcefully get a block from somewhere (blocking!).
81 - Memory
82 - Load from disk
83 - Create blank filled with CONTENT_IGNORE
84
85 */
86 MapBlock *emergeBlock(v3s16 p, bool create_blank=true) override;
87
88 /*
89 Try to get a block.
90 If it does not exist in memory, add it to the emerge queue.
91 - Memory
92 - Emerge Queue (deferred disk or generate)
93 */
94 MapBlock *getBlockOrEmerge(v3s16 p3d, bool generate);
95
96 bool isBlockInQueue(v3s16 pos);
97
99 std::map<v3s16, MapBlock*> &modified_blocks,
100 bool remove_metadata) override;
101
102 /*
103 Database functions
104 */
105 static std::vector<std::string> getDatabaseBackends();
106 static MapDatabase *createDatabase(const std::string &name, const std::string &savedir, Settings &conf);
107
108 // Call these before and after saving of blocks
109 void beginSave() override;
110 void endSave() override;
111
112 void save(ModifiedState save_level) override;
113 void listAllLoadableBlocks(std::vector<v3s16> &dst);
114 void listAllLoadedBlocks(std::vector<v3s16> &dst);
115
117
118 bool saveBlock(MapBlock *block) override;
119 static bool saveBlock(MapBlock *block, MapDatabase *db, int compression_level = -1);
120
121 // Load block in a synchronous fashion
125 MapBlock *loadBlock(const std::string &blob, v3s16 p, bool save_after_load=false);
126
127 // Helper for deserializing blocks from disk
128 // @throws SerializationError
129 static void deSerializeBlock(MapBlock *block, std::istream &is);
130
131 // Blocks are removed from the map but not deleted from memory until
132 // deleteDetachedBlocks() is called, since pointers to them may still exist
133 // when deleteBlock() is called.
134 bool deleteBlock(v3s16 blockpos) override;
135
137
138 void step();
139
140 void updateVManip(v3s16 pos);
141
142 // For debug printing
143 void PrintInfo(std::ostream &out) override;
144
146
147 u64 getSeed();
148
156 bool repairBlockLight(v3s16 blockpos,
157 std::map<v3s16, MapBlock *> *modified_blocks);
158
159 void transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks,
160 ServerEnvironment *env);
161 void transformLiquidsLocal(std::map<v3s16, MapBlock*> &modified_blocks, UniqueQueue<v3s16> &liquid_queue,
162 ServerEnvironment *env, u32 liquid_loop_max);
164
166
167protected:
168
169 void reportMetrics(u64 save_time_us, u32 saved_blocks, u32 all_blocks) override;
170
171private:
172 friend class ModApiMapgen; // for m_transforming_liquid
173
174 // extra border area during mapgen (in blocks)
175 constexpr static v3s16 EMERGE_EXTRA_BORDER{1, 1, 1};
176
177 // Emerge manager
179
180 std::string m_savedir;
182
184
185 std::set<v3s16> m_chunks_in_progress;
186
187 // used by deleteBlock() and deleteDetachedBlocks()
188 std::vector<std::unique_ptr<MapBlock>> m_detached_blocks;
189
190 // Queued transforming water nodes
194 u64 m_inc_trending_up_start_time = 0; // milliseconds
196
197 /*
198 Metadata is re-written on disk only if this is true.
199 This is reset to false when written on disk.
200 */
202
204
205 // Map metrics
209};
Definition emerge.h:116
Definition gamedef.h:26
Definition mapblock.h:58
Definition database.h:28
Definition mapsector.h:23
Definition map_settings_manager.h:31
Definition map.h:100
Definition metricsbackend.h:39
Definition l_mapgen.h:18
Definition serverenvironment.h:113
Definition servermap.h:43
void updateVManip(v3s16 pos)
Definition servermap.cpp:488
MapSettingsManager settings_mgr
Definition servermap.h:165
MapBlock * emergeBlock(v3s16 p, bool create_blank=true) override
Definition servermap.cpp:425
u64 getSeed()
Definition servermap.cpp:182
void cancelBlockMake(BlockMakeData *data)
Definition servermap.cpp:266
void step()
Definition servermap.cpp:839
static std::vector< std::string > getDatabaseBackends()
Definition servermap.cpp:610
bool blockpos_over_mapgen_limit(v3s16 p)
Definition servermap.cpp:187
bool repairBlockLight(v3s16 blockpos, std::map< v3s16, MapBlock * > *modified_blocks)
Definition servermap.cpp:851
~ServerMap()
Definition servermap.cpp:142
void endSave() override
Definition servermap.cpp:678
static constexpr v3s16 EMERGE_EXTRA_BORDER
Definition servermap.h:175
MapSector * createSector(v2s16 p)
Definition servermap.cpp:362
bool saveBlock(MapBlock *block) override
Definition servermap.cpp:684
std::set< v3s16 > m_chunks_in_progress
Definition servermap.h:185
MetricGaugePtr m_loaded_blocks_gauge
Definition servermap.h:206
static void deSerializeBlock(MapBlock *block, std::istream &is)
Definition servermap.cpp:715
static MapDatabase * createDatabase(const std::string &name, const std::string &savedir, Settings &conf)
Definition servermap.cpp:627
std::string m_savedir
Definition servermap.h:180
bool m_map_saving_enabled
Definition servermap.h:181
void listAllLoadedBlocks(std::vector< v3s16 > &dst)
Definition servermap.cpp:595
void PrintInfo(std::ostream &out) override
Definition servermap.cpp:846
std::vector< std::unique_ptr< MapBlock > > m_detached_blocks
Definition servermap.h:188
UniqueQueue< v3s16 > m_transforming_liquid
Definition servermap.h:191
void deleteDetachedBlocks()
Definition servermap.cpp:829
MetricCounterPtr m_save_count_counter
Definition servermap.h:208
void transformLiquids(std::map< v3s16, MapBlock * > &modified_blocks, ServerEnvironment *env)
Definition servermap.cpp:1254
MapDatabaseAccessor m_db
Definition servermap.h:203
EmergeManager * m_emerge
Definition servermap.h:178
bool isBlockInQueue(v3s16 pos)
Definition servermap.cpp:458
void reportMetrics(u64 save_time_us, u32 saved_blocks, u32 all_blocks) override
Definition servermap.cpp:508
int m_map_compression_level
Definition servermap.h:183
bool m_map_metadata_changed
Definition servermap.h:201
bool initBlockMake(v3s16 blockpos, BlockMakeData *data)
copy data from map to prepare for mapgen
Definition servermap.cpp:200
f32 m_transforming_liquid_loop_count_multiplier
Definition servermap.h:192
MapBlock * createBlock(v3s16 p)
Definition servermap.cpp:390
void save(ModifiedState save_level) override
Definition servermap.cpp:515
void transformLiquidsLocal(std::map< v3s16, MapBlock * > &modified_blocks, UniqueQueue< v3s16 > &liquid_queue, ServerEnvironment *env, u32 liquid_loop_max)
Definition servermap.cpp:929
ServerMap(const std::string &savedir, IGameDef *gamedef, EmergeManager *emerge, MetricsBackend *mb)
Definition servermap.cpp:57
MetricCounterPtr m_save_time_counter
Definition servermap.h:207
MapBlock * getBlockOrEmerge(v3s16 p3d, bool generate)
Definition servermap.cpp:449
u32 m_unprocessed_count
Definition servermap.h:193
void beginSave() override
Definition servermap.cpp:672
void transforming_liquid_add(v3s16 p)
Definition servermap.cpp:924
MapgenParams * getMapgenParams()
Definition servermap.cpp:175
void listAllLoadableBlocks(std::vector< v3s16 > &dst)
Definition servermap.cpp:587
void addNodeAndUpdate(v3s16 p, MapNode n, std::map< v3s16, MapBlock * > &modified_blocks, bool remove_metadata) override
Definition servermap.cpp:463
bool m_queue_size_timer_started
Definition servermap.h:195
bool isSavingEnabled()
Definition servermap.h:145
MapBlock * loadBlock(v3s16 p)
Definition servermap.cpp:795
bool deleteBlock(v3s16 blockpos) override
Definition servermap.cpp:809
u64 m_inc_trending_up_start_time
Definition servermap.h:194
void finishBlockMake(BlockMakeData *data, std::map< v3s16, MapBlock * > *changed_blocks, ServerEnvironment *env)
write data back to map after mapgen
Definition servermap.cpp:281
Definition settings.h:110
Definition container.h:26
core::vector2d< s16 > v2s16
Definition irr_v2d.h:12
core::vector3d< s16 > v3s16
Definition irr_v3d.h:13
std::shared_ptr< MetricCounter > MetricCounterPtr
Definition metricsbackend.h:22
std::shared_ptr< MetricGauge > MetricGaugePtr
Definition metricsbackend.h:36
ModifiedState
Definition modifiedstate.h:10
Definition emerge.h:36
Definition servermap.h:23
void loadBlock(v3s16 blockpos, std::string &ret)
Load a block, taking dbase_ro into account.
Definition servermap.cpp:45
MapDatabase * dbase
Main database.
Definition servermap.h:27
MapDatabase * dbase_ro
Fallback database for read operations.
Definition servermap.h:29
std::mutex mutex
Lock, to be taken for any operation.
Definition servermap.h:25
Definition mapnode.h:123
Definition mapgen.h:111
static std::string p(std::string path)
Definition test_filesys.cpp:64