Add Lua on_mapgen_init callback, and minetest.set_mapgen_params API
[oweals/minetest.git] / src / environment.h
index bb1da2461e7baa2c55b28dbe2cce78efd5b24b0e..ac479999cf748d29a09f5a18e72b74afd64dc7be 100644 (file)
@@ -1,6 +1,6 @@
 /*
-Minetest-c55
-Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
+Minetest
+Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -31,6 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 */
 
 #include <set>
+#include <list>
 #include "irrlichttypes_extrabloated.h"
 #include "player.h"
 #include <ostream>
@@ -40,7 +41,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mapnode.h"
 #include "mapblock.h"
 
-class Server;
 class ServerEnvironment;
 class ActiveBlockModifier;
 class ServerActiveObject;
@@ -50,6 +50,7 @@ class IGameDef;
 class Map;
 class ServerMap;
 class ClientMap;
+class ScriptApi;
 
 class Environment
 {
@@ -74,8 +75,8 @@ public:
        Player * getPlayer(const char *name);
        Player * getRandomConnectedPlayer();
        Player * getNearestConnectedPlayer(v3f pos);
-       core::list<Player*> getPlayers();
-       core::list<Player*> getPlayers(bool ignore_disconnected);
+       std::list<Player*> getPlayers();
+       std::list<Player*> getPlayers(bool ignore_disconnected);
        void printPlayers(std::ostream &o);
        
        u32 getDayNightRatio();
@@ -103,7 +104,7 @@ public:
 
 protected:
        // peer_ids in here should be unique, except that there may be many 0s
-       core::list<Player*> m_players;
+       std::list<Player*> m_players;
        // Time of day in milli-hours (0-23999); determines day and night
        u32 m_time_of_day;
        // Time of day in 0...1
@@ -157,20 +158,20 @@ struct ABMWithState
 class ActiveBlockList
 {
 public:
-       void update(core::list<v3s16> &active_positions,
+       void update(std::list<v3s16> &active_positions,
                        s16 radius,
-                       core::map<v3s16, bool> &blocks_removed,
-                       core::map<v3s16, bool> &blocks_added);
+                       std::set<v3s16> &blocks_removed,
+                       std::set<v3s16> &blocks_added);
 
        bool contains(v3s16 p){
-               return (m_list.find(p) != NULL);
+               return (m_list.find(p) != m_list.end());
        }
 
        void clear(){
                m_list.clear();
        }
 
-       core::map<v3s16, bool> m_list;
+       std::set<v3s16> m_list;
 
 private:
 };
@@ -190,7 +191,7 @@ public:
 class ServerEnvironment : public Environment
 {
 public:
-       ServerEnvironment(ServerMap *map, lua_State *L, IGameDef *gamedef,
+       ServerEnvironment(ServerMap *map, ScriptApi *iface, IGameDef *gamedef,
                        IBackgroundBlockEmerger *emerger);
        ~ServerEnvironment();
 
@@ -198,16 +199,15 @@ public:
 
        ServerMap & getServerMap();
 
-       lua_State* getLua()
-               { return m_lua; }
+       //TODO find way to remove this fct!
+       ScriptApi* getScriptIface()
+               { return m_script; }
 
        IGameDef *getGameDef()
                { return m_gamedef; }
 
        float getSendRecommendedInterval()
-       {
-               return 0.10;
-       }
+               { return m_recommended_send_interval; }
 
        /*
                Save players
@@ -243,24 +243,25 @@ public:
                MapBlock.
                Caller allocates memory, ServerEnvironment frees memory.
                Return value: true if succeeded, false if failed.
+               (note:  not used, pending removal from engine)
        */
-       bool addActiveObjectAsStatic(ServerActiveObject *object);
+       //bool addActiveObjectAsStatic(ServerActiveObject *object);
        
        /*
                Find out what new objects have been added to
                inside a radius around a position
        */
        void getAddedActiveObjects(v3s16 pos, s16 radius,
-                       core::map<u16, bool> &current_objects,
-                       core::map<u16, bool> &added_objects);
+                       std::set<u16> &current_objects,
+                       std::set<u16> &added_objects);
 
        /*
                Find out what new objects have been removed from
                inside a radius around a position
        */
        void getRemovedActiveObjects(v3s16 pos, s16 radius,
-                       core::map<u16, bool> &current_objects,
-                       core::map<u16, bool> &removed_objects);
+                       std::set<u16> &current_objects,
+                       std::set<u16> &removed_objects);
        
        /*
                Get the next message emitted by some active object.
@@ -285,6 +286,10 @@ public:
                Other stuff
                -------------------------------------------
        */
+
+       // Script-aware node setters
+       bool setNode(v3s16 p, const MapNode &n);
+       bool removeNode(v3s16 p);
        
        // Find all active objects inside a radius around a point
        std::set<u16> getObjectsInsideRadius(v3f pos, float radius);
@@ -295,6 +300,9 @@ public:
        // This makes stuff happen
        void step(f32 dtime);
        
+       //check if there's a line of sight between two positions
+       bool line_of_sight(v3f pos1, v3f pos2, float stepsize=1.0);
+
 private:
 
        /*
@@ -312,7 +320,7 @@ private:
                Returns the id of the object.
                Returns 0 if not added and thus deleted.
        */
-       u16 addActiveObjectRaw(ServerActiveObject *object, bool set_changed);
+       u16 addActiveObjectRaw(ServerActiveObject *object, bool set_changed, u32 dtime_s);
        
        /*
                Remove all objects that satisfy (m_removed && m_known_by_count==0)
@@ -322,7 +330,7 @@ private:
        /*
                Convert stored objects from block to active
        */
-       void activateObjects(MapBlock *block);
+       void activateObjects(MapBlock *block, u32 dtime_s);
        
        /*
                Convert objects that are not in active blocks to static.
@@ -342,13 +350,13 @@ private:
        // The map
        ServerMap *m_map;
        // Lua state
-       lua_State *m_lua;
+       ScriptApi* m_script;
        // Game definition
        IGameDef *m_gamedef;
        // Background block emerger (the server, in practice)
        IBackgroundBlockEmerger *m_emerger;
        // Active object list
-       core::map<u16, ServerActiveObject*> m_active_objects;
+       std::map<u16, ServerActiveObject*> m_active_objects;
        // Outgoing network message buffer for active objects
        Queue<ActiveObjectMessage> m_active_object_messages;
        // Some timers
@@ -366,7 +374,9 @@ private:
        u32 m_game_time;
        // A helper variable for incrementing the latter
        float m_game_time_fraction_counter;
-       core::list<ABMWithState> m_abms;
+       std::list<ABMWithState> m_abms;
+       // An interval for generally sending object positions and stuff
+       float m_recommended_send_interval;
 };
 
 #ifndef SERVER
@@ -459,10 +469,19 @@ public:
        
        // Get all nearby objects
        void getActiveObjects(v3f origin, f32 max_d,
-                       core::array<DistanceSortedActiveObject> &dest);
+                       std::vector<DistanceSortedActiveObject> &dest);
        
        // Get event from queue. CEE_NONE is returned if queue is empty.
        ClientEnvEvent getClientEvent();
+
+       std::vector<core::vector2d<int> > attachment_list; // X is child ID, Y is parent ID
+
+       std::list<std::string> getPlayerNames()
+       { return m_player_names; }
+       void addPlayerName(std::string name)
+       { m_player_names.push_back(name); }
+       void removePlayerName(std::string name)
+       { m_player_names.remove(name); }
        
 private:
        ClientMap *m_map;
@@ -470,11 +489,14 @@ private:
        ITextureSource *m_texturesource;
        IGameDef *m_gamedef;
        IrrlichtDevice *m_irr;
-       core::map<u16, ClientActiveObject*> m_active_objects;
-       core::list<ClientSimpleObject*> m_simple_objects;
+       std::map<u16, ClientActiveObject*> m_active_objects;
+       std::list<ClientSimpleObject*> m_simple_objects;
        Queue<ClientEnvEvent> m_client_event_queue;
        IntervalLimiter m_active_object_light_update_interval;
        IntervalLimiter m_lava_hurt_interval;
+       IntervalLimiter m_drowning_interval;
+       IntervalLimiter m_breathing_interval;
+       std::list<std::string> m_player_names;
 };
 
 #endif