]> git.lizzy.rs Git - minetest.git/blob - src/environment.h
Don't include cmake_config_githash.h into files that don't need it
[minetest.git] / src / environment.h
1 /*
2 Minetest
3 Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
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.
9
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.
14
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.
18 */
19
20 #ifndef ENVIRONMENT_HEADER
21 #define ENVIRONMENT_HEADER
22
23 /*
24         This class is the game's environment.
25         It contains:
26         - The map
27         - Players
28         - Other objects
29         - The current time in the game
30         - etc.
31 */
32
33 #include <set>
34 #include <list>
35 #include <map>
36 #include "irr_v3d.h"
37 #include "activeobject.h"
38 #include "util/numeric.h"
39 #include "mapnode.h"
40 #include "mapblock.h"
41 #include "jthread/jmutex.h"
42
43 class ServerEnvironment;
44 class ActiveBlockModifier;
45 class ServerActiveObject;
46 class ITextureSource;
47 class IGameDef;
48 class Map;
49 class ServerMap;
50 class ClientMap;
51 class GameScripting;
52 class Player;
53
54 class Environment
55 {
56 public:
57         // Environment will delete the map passed to the constructor
58         Environment();
59         virtual ~Environment();
60
61         /*
62                 Step everything in environment.
63                 - Move players
64                 - Step mobs
65                 - Run timers of map
66         */
67         virtual void step(f32 dtime) = 0;
68
69         virtual Map & getMap() = 0;
70
71         virtual void addPlayer(Player *player);
72         void removePlayer(u16 peer_id);
73         void removePlayer(const char *name);
74         Player * getPlayer(u16 peer_id);
75         Player * getPlayer(const char *name);
76         Player * getRandomConnectedPlayer();
77         Player * getNearestConnectedPlayer(v3f pos);
78         std::list<Player*> getPlayers();
79         std::list<Player*> getPlayers(bool ignore_disconnected);
80         
81         u32 getDayNightRatio();
82
83         // 0-23999
84         virtual void setTimeOfDay(u32 time)
85         {
86                 m_time_of_day = time;
87                 m_time_of_day_f = (float)time / 24000.0;
88         }
89
90         u32 getTimeOfDay()
91         { return m_time_of_day; }
92
93         float getTimeOfDayF()
94         { return m_time_of_day_f; }
95
96         void stepTimeOfDay(float dtime);
97
98         void setTimeOfDaySpeed(float speed);
99         
100         float getTimeOfDaySpeed();
101
102         void setDayNightRatioOverride(bool enable, u32 value)
103         {
104                 m_enable_day_night_ratio_override = enable;
105                 m_day_night_ratio_override = value;
106         }
107
108         // counter used internally when triggering ABMs
109         u32 m_added_objects;
110
111 protected:
112         // peer_ids in here should be unique, except that there may be many 0s
113         std::list<Player*> m_players;
114         // Time of day in milli-hours (0-23999); determines day and night
115         u32 m_time_of_day;
116         // Time of day in 0...1
117         float m_time_of_day_f;
118         float m_time_of_day_speed;
119         // Used to buffer dtime for adding to m_time_of_day
120         float m_time_counter;
121         // Overriding the day-night ratio is useful for custom sky visuals
122         bool m_enable_day_night_ratio_override;
123         u32 m_day_night_ratio_override;
124         
125 private:
126         JMutex m_lock;
127
128 };
129
130 /*
131         Active block modifier interface.
132
133         These are fed into ServerEnvironment at initialization time;
134         ServerEnvironment handles deleting them.
135 */
136
137 class ActiveBlockModifier
138 {
139 public:
140         ActiveBlockModifier(){};
141         virtual ~ActiveBlockModifier(){};
142         
143         // Set of contents to trigger on
144         virtual std::set<std::string> getTriggerContents()=0;
145         // Set of required neighbors (trigger doesn't happen if none are found)
146         // Empty = do not check neighbors
147         virtual std::set<std::string> getRequiredNeighbors()
148         { return std::set<std::string>(); }
149         // Trigger interval in seconds
150         virtual float getTriggerInterval() = 0;
151         // Random chance of (1 / return value), 0 is disallowed
152         virtual u32 getTriggerChance() = 0;
153         // This is called usually at interval for 1/chance of the nodes
154         virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n){};
155         virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n,
156                         u32 active_object_count, u32 active_object_count_wider){};
157 };
158
159 struct ABMWithState
160 {
161         ActiveBlockModifier *abm;
162         float timer;
163
164         ABMWithState(ActiveBlockModifier *abm_);
165 };
166
167 /*
168         List of active blocks, used by ServerEnvironment
169 */
170
171 class ActiveBlockList
172 {
173 public:
174         void update(std::list<v3s16> &active_positions,
175                         s16 radius,
176                         std::set<v3s16> &blocks_removed,
177                         std::set<v3s16> &blocks_added);
178
179         bool contains(v3s16 p){
180                 return (m_list.find(p) != m_list.end());
181         }
182
183         void clear(){
184                 m_list.clear();
185         }
186
187         std::set<v3s16> m_list;
188         std::set<v3s16> m_forceloaded_list;
189
190 private:
191 };
192
193 /*
194         The server-side environment.
195
196         This is not thread-safe. Server uses an environment mutex.
197 */
198
199 class ServerEnvironment : public Environment
200 {
201 public:
202         ServerEnvironment(ServerMap *map, GameScripting *scriptIface,
203                         IGameDef *gamedef, const std::string &path_world);
204         ~ServerEnvironment();
205
206         Map & getMap();
207
208         ServerMap & getServerMap();
209
210         //TODO find way to remove this fct!
211         GameScripting* getScriptIface()
212                 { return m_script; }
213
214         IGameDef *getGameDef()
215                 { return m_gamedef; }
216
217         float getSendRecommendedInterval()
218                 { return m_recommended_send_interval; }
219
220         // Save players
221         void saveLoadedPlayers();
222         void savePlayer(const std::string &playername);
223         Player *loadPlayer(const std::string &playername);
224
225         /*
226                 Save and load time of day and game timer
227         */
228         void saveMeta();
229         void loadMeta();
230
231         /*
232                 External ActiveObject interface
233                 -------------------------------------------
234         */
235
236         ServerActiveObject* getActiveObject(u16 id);
237
238         /*
239                 Add an active object to the environment.
240                 Environment handles deletion of object.
241                 Object may be deleted by environment immediately.
242                 If id of object is 0, assigns a free id to it.
243                 Returns the id of the object.
244                 Returns 0 if not added and thus deleted.
245         */
246         u16 addActiveObject(ServerActiveObject *object);
247         
248         /*
249                 Add an active object as a static object to the corresponding
250                 MapBlock.
251                 Caller allocates memory, ServerEnvironment frees memory.
252                 Return value: true if succeeded, false if failed.
253                 (note:  not used, pending removal from engine)
254         */
255         //bool addActiveObjectAsStatic(ServerActiveObject *object);
256         
257         /*
258                 Find out what new objects have been added to
259                 inside a radius around a position
260         */
261         void getAddedActiveObjects(v3s16 pos, s16 radius,
262                         std::set<u16> &current_objects,
263                         std::set<u16> &added_objects);
264
265         /*
266                 Find out what new objects have been removed from
267                 inside a radius around a position
268         */
269         void getRemovedActiveObjects(v3s16 pos, s16 radius,
270                         std::set<u16> &current_objects,
271                         std::set<u16> &removed_objects);
272         
273         /*
274                 Get the next message emitted by some active object.
275                 Returns a message with id=0 if no messages are available.
276         */
277         ActiveObjectMessage getActiveObjectMessage();
278
279         /*
280                 Activate objects and dynamically modify for the dtime determined
281                 from timestamp and additional_dtime
282         */
283         void activateBlock(MapBlock *block, u32 additional_dtime=0);
284
285         /*
286                 ActiveBlockModifiers
287                 -------------------------------------------
288         */
289
290         void addActiveBlockModifier(ActiveBlockModifier *abm);
291
292         /*
293                 Other stuff
294                 -------------------------------------------
295         */
296
297         // Script-aware node setters
298         bool setNode(v3s16 p, const MapNode &n);
299         bool removeNode(v3s16 p);
300         bool swapNode(v3s16 p, const MapNode &n);
301         
302         // Find all active objects inside a radius around a point
303         std::set<u16> getObjectsInsideRadius(v3f pos, float radius);
304         
305         // Clear all objects, loading and going through every MapBlock
306         void clearAllObjects();
307         
308         // This makes stuff happen
309         void step(f32 dtime);
310         
311         //check if there's a line of sight between two positions
312         bool line_of_sight(v3f pos1, v3f pos2, float stepsize=1.0, v3s16 *p=NULL);
313
314         u32 getGameTime() { return m_game_time; }
315
316         void reportMaxLagEstimate(float f) { m_max_lag_estimate = f; }
317         float getMaxLagEstimate() { return m_max_lag_estimate; }
318         
319         std::set<v3s16>* getForceloadedBlocks() { return &m_active_blocks.m_forceloaded_list; };
320         
321 private:
322
323         /*
324                 Internal ActiveObject interface
325                 -------------------------------------------
326         */
327
328         /*
329                 Add an active object to the environment.
330
331                 Called by addActiveObject.
332
333                 Object may be deleted by environment immediately.
334                 If id of object is 0, assigns a free id to it.
335                 Returns the id of the object.
336                 Returns 0 if not added and thus deleted.
337         */
338         u16 addActiveObjectRaw(ServerActiveObject *object, bool set_changed, u32 dtime_s);
339         
340         /*
341                 Remove all objects that satisfy (m_removed && m_known_by_count==0)
342         */
343         void removeRemovedObjects();
344         
345         /*
346                 Convert stored objects from block to active
347         */
348         void activateObjects(MapBlock *block, u32 dtime_s);
349         
350         /*
351                 Convert objects that are not in active blocks to static.
352
353                 If m_known_by_count != 0, active object is not deleted, but static
354                 data is still updated.
355
356                 If force_delete is set, active object is deleted nevertheless. It
357                 shall only be set so in the destructor of the environment.
358         */
359         void deactivateFarObjects(bool force_delete);
360
361         /*
362                 Member variables
363         */
364         
365         // The map
366         ServerMap *m_map;
367         // Lua state
368         GameScripting* m_script;
369         // Game definition
370         IGameDef *m_gamedef;
371         // World path
372         const std::string m_path_world;
373         // Active object list
374         std::map<u16, ServerActiveObject*> m_active_objects;
375         // Outgoing network message buffer for active objects
376         std::list<ActiveObjectMessage> m_active_object_messages;
377         // Some timers
378         float m_send_recommended_timer;
379         IntervalLimiter m_object_management_interval;
380         // List of active blocks
381         ActiveBlockList m_active_blocks;
382         IntervalLimiter m_active_blocks_management_interval;
383         IntervalLimiter m_active_block_modifier_interval;
384         IntervalLimiter m_active_blocks_nodemetadata_interval;
385         int m_active_block_interval_overload_skip;
386         // Time from the beginning of the game in seconds.
387         // Incremented in step().
388         u32 m_game_time;
389         // A helper variable for incrementing the latter
390         float m_game_time_fraction_counter;
391         std::list<ABMWithState> m_abms;
392         // An interval for generally sending object positions and stuff
393         float m_recommended_send_interval;
394         // Estimate for general maximum lag as determined by server.
395         // Can raise to high values like 15s with eg. map generation mods.
396         float m_max_lag_estimate;
397 };
398
399 #ifndef SERVER
400
401 #include "clientobject.h"
402 class ClientSimpleObject;
403
404 /*
405         The client-side environment.
406
407         This is not thread-safe.
408         Must be called from main (irrlicht) thread (uses the SceneManager)
409         Client uses an environment mutex.
410 */
411
412 enum ClientEnvEventType
413 {
414         CEE_NONE,
415         CEE_PLAYER_DAMAGE,
416         CEE_PLAYER_BREATH
417 };
418
419 struct ClientEnvEvent
420 {
421         ClientEnvEventType type;
422         union {
423                 struct{
424                 } none;
425                 struct{
426                         u8 amount;
427                         bool send_to_server;
428                 } player_damage;
429                 struct{
430                         u16 amount;
431                 } player_breath;
432         };
433 };
434
435 class ClientEnvironment : public Environment
436 {
437 public:
438         ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr,
439                         ITextureSource *texturesource, IGameDef *gamedef,
440                         IrrlichtDevice *device);
441         ~ClientEnvironment();
442
443         Map & getMap();
444         ClientMap & getClientMap();
445
446         IGameDef *getGameDef()
447         { return m_gamedef; }
448
449         void step(f32 dtime);
450
451         virtual void addPlayer(Player *player);
452         LocalPlayer * getLocalPlayer();
453         
454         /*
455                 ClientSimpleObjects
456         */
457
458         void addSimpleObject(ClientSimpleObject *simple);
459
460         /*
461                 ActiveObjects
462         */
463         
464         ClientActiveObject* getActiveObject(u16 id);
465
466         /*
467                 Adds an active object to the environment.
468                 Environment handles deletion of object.
469                 Object may be deleted by environment immediately.
470                 If id of object is 0, assigns a free id to it.
471                 Returns the id of the object.
472                 Returns 0 if not added and thus deleted.
473         */
474         u16 addActiveObject(ClientActiveObject *object);
475
476         void addActiveObject(u16 id, u8 type, const std::string &init_data);
477         void removeActiveObject(u16 id);
478
479         void processActiveObjectMessage(u16 id, const std::string &data);
480
481         /*
482                 Callbacks for activeobjects
483         */
484
485         void damageLocalPlayer(u8 damage, bool handle_hp=true);
486         void updateLocalPlayerBreath(u16 breath);
487
488         /*
489                 Client likes to call these
490         */
491         
492         // Get all nearby objects
493         void getActiveObjects(v3f origin, f32 max_d,
494                         std::vector<DistanceSortedActiveObject> &dest);
495         
496         // Get event from queue. CEE_NONE is returned if queue is empty.
497         ClientEnvEvent getClientEvent();
498
499         u16 m_attachements[USHRT_MAX];
500
501         std::list<std::string> getPlayerNames()
502         { return m_player_names; }
503         void addPlayerName(std::string name)
504         { m_player_names.push_back(name); }
505         void removePlayerName(std::string name)
506         { m_player_names.remove(name); }
507         void updateCameraOffset(v3s16 camera_offset)
508         { m_camera_offset = camera_offset; }
509         v3s16 getCameraOffset()
510         { return m_camera_offset; }
511         
512 private:
513         ClientMap *m_map;
514         scene::ISceneManager *m_smgr;
515         ITextureSource *m_texturesource;
516         IGameDef *m_gamedef;
517         IrrlichtDevice *m_irr;
518         std::map<u16, ClientActiveObject*> m_active_objects;
519         std::list<ClientSimpleObject*> m_simple_objects;
520         std::list<ClientEnvEvent> m_client_event_queue;
521         IntervalLimiter m_active_object_light_update_interval;
522         IntervalLimiter m_lava_hurt_interval;
523         IntervalLimiter m_drowning_interval;
524         IntervalLimiter m_breathing_interval;
525         std::list<std::string> m_player_names;
526         v3s16 m_camera_offset;
527 };
528
529 #endif
530
531 #endif
532