Luanti 5.18.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
123 static std::pair<std::unique_ptr<std::istream>, u8> createBlockIStream(const std::string *from_db);
124
125 // Load block in a synchronous fashion
130 MapBlock *loadBlock(std::istream &is, v3s16 p, u8 version);
131
132 // Blocks are removed from the map but not deleted from memory until
133 // deleteDetachedBlocks() is called, since pointers to them may still exist
134 // when deleteBlock() is called.
135 bool deleteBlock(v3s16 blockpos) override;
136
138
139 void step();
140
141 void updateVManip(v3s16 pos);
142
143 // For debug printing
144 void PrintInfo(std::ostream &out) override;
145
147
148 u64 getSeed();
149
157 bool repairBlockLight(v3s16 blockpos,
158 std::map<v3s16, MapBlock *> *modified_blocks);
159
160 void transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks,
161 ServerEnvironment *env);
162 void transformLiquidsLocal(std::map<v3s16, MapBlock*> &modified_blocks, UniqueQueue<v3s16> &liquid_queue,
163 ServerEnvironment *env, u32 liquid_loop_max);
165
167
168protected:
169
170 void reportMetrics(u64 save_time_us, u32 saved_blocks, u32 all_blocks) override;
171
172private:
173 friend class ModApiMapgen; // for m_transforming_liquid
174
175 // extra border area during mapgen (in blocks)
176 constexpr static v3s16 EMERGE_EXTRA_BORDER{1, 1, 1};
177
178 // Emerge manager
180
181 std::string m_savedir;
183
185
186 std::set<v3s16> m_chunks_in_progress;
187
188 // used by deleteBlock() and deleteDetachedBlocks()
189 std::vector<std::unique_ptr<MapBlock>> m_detached_blocks;
190
191 // Queued transforming water nodes
195 u64 m_inc_trending_up_start_time = 0; // milliseconds
197
198 /*
199 Metadata is re-written on disk only if this is true.
200 This is reset to false when written on disk.
201 */
203
205
206 // Map metrics
210};
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
Map(IGameDef *gamedef)
Definition map.cpp:24
Definition metricsbackend.h:39
Definition serverenvironment.h:113
void updateVManip(v3s16 pos)
Definition servermap.cpp:482
MapSettingsManager settings_mgr
Definition servermap.h:166
MapBlock * emergeBlock(v3s16 p, bool create_blank=true) override
Definition servermap.cpp:419
u64 getSeed()
Definition servermap.cpp:182
void cancelBlockMake(BlockMakeData *data)
Definition servermap.cpp:260
void step()
Definition servermap.cpp:850
static std::vector< std::string > getDatabaseBackends()
Definition servermap.cpp:604
bool blockpos_over_mapgen_limit(v3s16 p)
Definition servermap.cpp:187
bool repairBlockLight(v3s16 blockpos, std::map< v3s16, MapBlock * > *modified_blocks)
Definition servermap.cpp:862
~ServerMap()
Definition servermap.cpp:142
void endSave() override
Definition servermap.cpp:672
static constexpr v3s16 EMERGE_EXTRA_BORDER
Definition servermap.h:176
MapSector * createSector(v2s16 p)
Definition servermap.cpp:356
bool saveBlock(MapBlock *block) override
Definition servermap.cpp:678
static std::pair< std::unique_ptr< std::istream >, u8 > createBlockIStream(const std::string *from_db)
Splits the version off a serialized block and decompresses it early (if possible).
Definition servermap.cpp:709
std::set< v3s16 > m_chunks_in_progress
Definition servermap.h:186
MetricGaugePtr m_loaded_blocks_gauge
Definition servermap.h:207
static MapDatabase * createDatabase(const std::string &name, const std::string &savedir, Settings &conf)
Definition servermap.cpp:621
std::string m_savedir
Definition servermap.h:181
bool m_map_saving_enabled
Definition servermap.h:182
void listAllLoadedBlocks(std::vector< v3s16 > &dst)
Definition servermap.cpp:589
void PrintInfo(std::ostream &out) override
Definition servermap.cpp:857
std::vector< std::unique_ptr< MapBlock > > m_detached_blocks
Definition servermap.h:189
UniqueQueue< v3s16 > m_transforming_liquid
Definition servermap.h:192
void deleteDetachedBlocks()
Definition servermap.cpp:840
MetricCounterPtr m_save_count_counter
Definition servermap.h:209
void transformLiquids(std::map< v3s16, MapBlock * > &modified_blocks, ServerEnvironment *env)
Definition servermap.cpp:1265
MapDatabaseAccessor m_db
Definition servermap.h:204
EmergeManager * m_emerge
Definition servermap.h:179
bool isBlockInQueue(v3s16 pos)
Definition servermap.cpp:452
void reportMetrics(u64 save_time_us, u32 saved_blocks, u32 all_blocks) override
Definition servermap.cpp:502
int m_map_compression_level
Definition servermap.h:184
bool m_map_metadata_changed
Definition servermap.h:202
friend class ModApiMapgen
Definition servermap.h:173
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:193
MapBlock * createBlock(v3s16 p)
Definition servermap.cpp:384
void save(ModifiedState save_level) override
Definition servermap.cpp:509
void transformLiquidsLocal(std::map< v3s16, MapBlock * > &modified_blocks, UniqueQueue< v3s16 > &liquid_queue, ServerEnvironment *env, u32 liquid_loop_max)
Definition servermap.cpp:940
ServerMap(const std::string &savedir, IGameDef *gamedef, EmergeManager *emerge, MetricsBackend *mb)
Definition servermap.cpp:57
MetricCounterPtr m_save_time_counter
Definition servermap.h:208
MapBlock * getBlockOrEmerge(v3s16 p3d, bool generate)
Definition servermap.cpp:443
u32 m_unprocessed_count
Definition servermap.h:194
void beginSave() override
Definition servermap.cpp:666
void transforming_liquid_add(v3s16 p)
Definition servermap.cpp:935
MapgenParams * getMapgenParams()
Definition servermap.cpp:175
void listAllLoadableBlocks(std::vector< v3s16 > &dst)
Definition servermap.cpp:581
void addNodeAndUpdate(v3s16 p, MapNode n, std::map< v3s16, MapBlock * > &modified_blocks, bool remove_metadata) override
Definition servermap.cpp:457
bool m_queue_size_timer_started
Definition servermap.h:196
bool isSavingEnabled()
Definition servermap.h:146
MapBlock * loadBlock(v3s16 p)
Definition servermap.cpp:804
bool deleteBlock(v3s16 blockpos) override
Definition servermap.cpp:820
u64 m_inc_trending_up_start_time
Definition servermap.h:195
void finishBlockMake(BlockMakeData *data, std::map< v3s16, MapBlock * > *changed_blocks, ServerEnvironment *env)
write data back to map after mapgen
Definition servermap.cpp:275
Definition settings.h:121
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:115
Definition mapgen.h:111
static std::string p(std::string path)
Definition test_filesys.cpp:73