3 Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 #include "util/string.h"
27 #include "util/container.h"
29 #define DEFAULT_MAPGEN "v6"
31 /////////////////// Mapgen flags
34 #define MG_DUNGEONS 0x04
37 #define MG_DECORATIONS 0x20
41 class INodeDefManager;
43 extern FlagDesc flagdesc_mapgen[];
44 extern FlagDesc flagdesc_gennotify[];
52 class VoxelManipulator;
71 GENNOTIFY_LARGECAVE_BEGIN,
72 GENNOTIFY_LARGECAVE_END,
77 // TODO(hmmmm/paramat): make stone type selection dynamic
84 struct GenNotifyEvent {
90 class GenerateNotifier {
93 GenerateNotifier(u32 notify_on, std::set<u32> *notify_on_deco_ids);
95 void setNotifyOn(u32 notify_on);
96 void setNotifyOnDecoIds(std::set<u32> *notify_on_deco_ids);
98 bool addEvent(GenNotifyType type, v3s16 pos, u32 id=0);
99 void getEvents(std::map<std::string, std::vector<v3s16> > &event_map,
100 bool peek_events=false);
104 std::set<u32> *m_notify_on_deco_ids;
105 std::list<GenNotifyEvent> m_notify_events;
108 struct MapgenSpecificParams {
109 virtual void readParams(const Settings *settings) = 0;
110 virtual void writeParams(Settings *settings) const = 0;
111 virtual ~MapgenSpecificParams() {}
114 struct MapgenParams {
121 BiomeParams *bparams;
122 MapgenSpecificParams *sparams;
125 mg_name(DEFAULT_MAPGEN),
129 flags(MG_CAVES | MG_LIGHT | MG_DECORATIONS),
135 virtual ~MapgenParams();
137 void load(const Settings &settings);
138 void save(Settings &settings) const;
143 Generic interface for map generators. All mapgens must inherit this class.
144 If a feature exposed by a public member pointer is not supported by a
145 certain mapgen, it must be set to NULL.
147 Apart from makeChunk, getGroundLevelAtPoint, and getSpawnLevelAtPoint, all
148 methods can be used by constructing a Mapgen base class and setting the
149 appropriate public members (e.g. vm, ndef, and so on).
160 INodeDefManager *ndef;
168 GenerateNotifier gennotify;
171 Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge);
174 static u32 getBlockSeed(v3s16 p, int seed);
175 static u32 getBlockSeed2(v3s16 p, int seed);
176 s16 findGroundLevelFull(v2s16 p2d);
177 s16 findGroundLevel(v2s16 p2d, s16 ymin, s16 ymax);
178 s16 findLiquidSurface(v2s16 p2d, s16 ymin, s16 ymax);
179 void updateHeightmap(v3s16 nmin, v3s16 nmax);
180 void updateLiquid(UniqueQueue<v3s16> *trans_liquid, v3s16 nmin, v3s16 nmax);
182 void setLighting(u8 light, v3s16 nmin, v3s16 nmax);
183 void lightSpread(VoxelArea &a, v3s16 p, u8 light);
184 void calcLighting(v3s16 nmin, v3s16 nmax, v3s16 full_nmin, v3s16 full_nmax,
185 bool propagate_shadow = true);
186 void propagateSunlight(v3s16 nmin, v3s16 nmax, bool propagate_shadow);
187 void spreadLight(v3s16 nmin, v3s16 nmax);
189 virtual void makeChunk(BlockMakeData *data) {}
190 virtual int getGroundLevelAtPoint(v2s16 p) { return 0; }
192 // getSpawnLevelAtPoint() is a function within each mapgen that returns a
193 // suitable y co-ordinate for player spawn ('suitable' usually meaning
194 // within 16 nodes of water_level). If a suitable spawn level cannot be
195 // found at the specified (X, Z) 'MAX_MAP_GENERATION_LIMIT' is returned to
196 // signify this and to cause Server::findSpawnPos() to try another (X, Z).
197 virtual int getSpawnLevelAtPoint(v2s16 p) { return 0; }
200 DISABLE_CLASS_COPY(Mapgen);
204 MapgenBasic is a Mapgen implementation that handles basic functionality
205 the majority of conventional mapgens will probably want to use, but isn't
206 generic enough to be included as part of the base Mapgen class (such as
207 generating biome terrain over terrain node skeletons, generating caves,
210 Inherit MapgenBasic instead of Mapgen to add this basic functionality to
211 your mapgen without having to reimplement it. Feel free to override any of
212 these methods if you desire different or more advanced behavior.
214 Note that you must still create your own generateTerrain implementation when
215 inheriting MapgenBasic.
217 class MapgenBasic : public Mapgen {
219 EmergeManager *m_emerge;
222 Noise *noise_filler_depth;
232 content_t c_water_source;
233 content_t c_river_water_source;
234 content_t c_desert_stone;
235 content_t c_sandstone;
241 MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emerge);
243 virtual MgStoneType generateBiomes();
244 virtual void dustTopNodes();
245 virtual void generateCaves(s16 max_stone_y, s16 large_cave_depth);
248 struct MapgenFactory {
249 virtual Mapgen *createMapgen(int mgid, MapgenParams *params,
250 EmergeManager *emerge) = 0;
251 virtual MapgenSpecificParams *createMapgenParams() = 0;
252 virtual ~MapgenFactory() {}