aboutsummaryrefslogtreecommitdiff
path: root/src
Commit message (Expand)AuthorAge
* Fix connected nodes' selection boxes.Auke Kok2016-03-21
* Mgv7/flat/fractal: Stop tunnel-floor biome nodes being placed everywhereparamat2016-03-21
* Clean up StrfndShadowNinja2016-03-19
* Mgv7: Limit pseudorandom caves to surface mapchunk or belowparamat2016-03-19
* Allow NodeTimer, ABM and block mgmt interval changes.Auke Kok2016-03-19
* Remove chat escape sequences from chat messages, for future colored chat.Ekdohibs2016-03-15
* Add option to not send pre v25 init packetest312016-03-15
* Fix two reconnect bugsest312016-03-15
* Much better API for auth.{cpp, h}est312016-03-15
* Mapgen: Fix light in tunnels at mapchunk bordersparamat2016-03-14
* Fix player teleportation bug whilst sneakingHybridDog2016-03-14
* Connected nodes: fix 2 minor bugsAuke Kok2016-03-14
* Resend blocks when modified while sending to clientJeija2016-03-12
* Add options for screenshot format and qualityDiego Martinez2016-03-12
* Allow nodes to specify which sides to connect to.Auke Kok2016-03-12
* Nodebox: Allow nodeboxes to "connect"Auke Kok2016-03-12
* Fix chat console not opening after formspec opened over itShadowNinja2016-03-12
* Documentation: Auto-update conf.example and settings_translation_file.cppparamat2016-03-12
* Fix ask_reconnect_on_crash option being ignoredorwell962016-03-11
* Avoid try/catch for settings.Auke Kok2016-03-09
* Add consistent monotonic day counter - get_day_count()Auke Kok2016-03-09
* Add AreaStore custom ID APIShadowNinja2016-03-07
* Implement AreaStore serializationShadowNinja2016-03-07
* Fix SpatialAreaStore not freeing removed areasShadowNinja2016-03-07
* Add basic AreaStore method documentationShadowNinja2016-03-07
* Sort AreaStore headerShadowNinja2016-03-07
* Clean up VectorAreaStoreShadowNinja2016-03-07
* Move AreaStore container selection logic into getOptimalImplementationShadowNinja2016-03-07
* Move AreaStore to utilShadowNinja2016-03-07
* Make AreaStore cache setting privateShadowNinja2016-03-07
* Simplify AreaStore ID managementShadowNinja2016-03-07
* s_env.{cpp, h} cleanupsest312016-03-07
* Add minetest.register_lbm() to run code on block load onlyest312016-03-07
* Use LuaErrors in security check macrosShadowNinja2016-03-07
* Mgvalleys: Correct spawn problemsDuane Robertson2016-03-04
* Decoration API: Allow force_placement of simple decorationsparamat2016-03-04
* Require minetest.request_http_api to be called from the mod's main scopeJeija2016-03-03
* Fix main menu being unable to set secure settingsShadowNinja2016-03-03
* Remove debug.getupvalue from the Lua sandbox whitelistShadowNinja2016-03-03
* Add support for non-ASCII characters to chat consoleShadowNinja2016-03-02
* Add Android chat formShadowNinja2016-03-02
* Add text selection and copying to consoleShadowNinja2016-03-02
* Unlock cursor when opening consoleShadowNinja2016-03-02
* Use the console instead of a dedicated window when pressing keymap_chat/cmdEsteban I. Ruiz Moreno2016-03-02
* Revert "Fix jumping at node edge"nerzhul2016-03-01
* Nodedef: Restore smooth lighting to waterparamat2016-02-27
* Mgvalleys: Add Dry RiverbedsDuane Robertson2016-02-27
* Update po files, minetest.conf.example and settings_translation_file.cppest312016-02-27
* Fix minetest.request_insecure_environment() always returning nilJeija2016-02-26
* Mapblock mesh: Allow to use VBORealBadAngel2016-02-26
lass="hl com"> This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef ENVIRONMENT_HEADER #define ENVIRONMENT_HEADER /* This class is the game's environment. It contains: - The map - Players - Other objects - The current time in the game (actually it only contains the brightness) - etc. */ #include <list> #include "common_irrlicht.h" #include "player.h" #include "map.h" #include <ostream> #include "utility.h" class Environment { public: // Environment will delete the map passed to the constructor Environment(); virtual ~Environment(); /* Step everything in environment. - Move players - Step mobs - Run timers of map */ virtual void step(f32 dtime) = 0; virtual Map & getMap() = 0; virtual void addPlayer(Player *player); void removePlayer(u16 peer_id); Player * getPlayer(u16 peer_id); Player * getPlayer(const char *name); Player * getRandomConnectedPlayer(); Player * getNearestConnectedPlayer(v3f pos); core::list<Player*> getPlayers(); core::list<Player*> getPlayers(bool ignore_disconnected); void printPlayers(std::ostream &o); //void setDayNightRatio(u32 r); u32 getDayNightRatio(); // 0-23999 virtual void setTimeOfDay(u32 time) { m_time_of_day = time; } u32 getTimeOfDay() { return m_time_of_day; } protected: // peer_ids in here should be unique, except that there may be many 0s core::list<Player*> m_players; // Brightness //u32 m_daynight_ratio; // Time of day in milli-hours (0-23999); determines day and night u32 m_time_of_day; }; /* List of active blocks, used by ServerEnvironment */ class ActiveBlockList { public: void update(core::list<v3s16> &active_positions, s16 radius, core::map<v3s16, bool> &blocks_removed, core::map<v3s16, bool> &blocks_added); bool contains(v3s16 p){ return (m_list.find(p) != NULL); } void clear(){ m_list.clear(); } core::map<v3s16, bool> m_list; private: }; /* The server-side environment. This is not thread-safe. Server uses an environment mutex. */ #include "serverobject.h" class Server; class ActiveBlockModifier; class ServerEnvironment : public Environment { public: ServerEnvironment(ServerMap *map, Server *server); ~ServerEnvironment(); Map & getMap() { return *m_map; } ServerMap & getServerMap() { return *m_map; } Server * getServer() { return m_server; } void step(f32 dtime); /* Save players */ void serializePlayers(const std::string &savedir); void deSerializePlayers(const std::string &savedir); /* Save and load time of day and game timer */ void saveMeta(const std::string &savedir); void loadMeta(const std::string &savedir); /* ActiveObjects ------------------------------------------- */ ServerActiveObject* getActiveObject(u16 id); /* Add an active object to the environment. Environment handles deletion of object. Object may be deleted by environment immediately. If id of object is 0, assigns a free id to it. Returns the id of the object. Returns 0 if not added and thus deleted. */ u16 addActiveObject(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); /* 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); /* Get the next message emitted by some active object. Returns a message with id=0 if no messages are available. */ ActiveObjectMessage getActiveObjectMessage(); /* ActiveBlockModifiers ------------------------------------------- */ void addActiveBlockModifier(ActiveBlockModifier *abm); private: /* Remove all objects that satisfy (m_removed && m_known_by_count==0) */ void removeRemovedObjects(); /* Convert stored objects from block to active */ void activateObjects(MapBlock *block); /* Convert objects that are not in active blocks to static. If m_known_by_count != 0, active object is not deleted, but static data is still updated. If force_delete is set, active object is deleted nevertheless. It shall only be set so in the destructor of the environment. */ void deactivateFarObjects(bool force_delete); /* Member variables */ // The map ServerMap *m_map; // Pointer to server (which is handling this environment) Server *m_server; // Active object list core::map<u16, ServerActiveObject*> m_active_objects; // Outgoing network message buffer for active objects Queue<ActiveObjectMessage> m_active_object_messages; // Some timers float m_random_spawn_timer; // used for experimental code float m_send_recommended_timer; IntervalLimiter m_object_management_interval; // List of active blocks ActiveBlockList m_active_blocks; IntervalLimiter m_active_blocks_management_interval; IntervalLimiter m_active_blocks_test_interval; IntervalLimiter m_active_blocks_nodemetadata_interval; // Time from the beginning of the game in seconds. // Incremented in step(). u32 m_game_time; // A helper variable for incrementing the latter float m_game_time_fraction_counter; }; /* Active block modifier interface. These are fed into ServerEnvironment at initialization time; ServerEnvironment handles deleting them. */ class ActiveBlockModifier { public: ActiveBlockModifier(){}; virtual ~ActiveBlockModifier(){}; //virtual core::list<u8> update(ServerEnvironment *env) = 0; virtual u32 getTriggerContentCount(){ return 1;} virtual u8 getTriggerContent(u32 i) = 0; virtual float getActiveInterval() = 0; // chance of (1 / return value), 0 is disallowed virtual u32 getActiveChance() = 0; // This is called usually at interval for 1/chance of the nodes virtual void triggerEvent(ServerEnvironment *env, v3s16 p) = 0; }; #ifndef SERVER #include "clientobject.h" /* The client-side environment. This is not thread-safe. Must be called from main (irrlicht) thread (uses the SceneManager) Client uses an environment mutex. */ enum ClientEnvEventType { CEE_NONE, CEE_PLAYER_DAMAGE }; struct ClientEnvEvent { ClientEnvEventType type; union { struct{ } none; struct{ u8 amount; } player_damage; }; }; class ClientEnvironment : public Environment { public: ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr); ~ClientEnvironment(); Map & getMap() { return *m_map; } ClientMap & getClientMap() { return *m_map; } void step(f32 dtime); virtual void addPlayer(Player *player); LocalPlayer * getLocalPlayer(); void updateMeshes(v3s16 blockpos); void expireMeshes(bool only_daynight_diffed); void setTimeOfDay(u32 time) { u32 old_dr = getDayNightRatio(); Environment::setTimeOfDay(time); if(getDayNightRatio() != old_dr) { dout_client<<DTIME<<"ClientEnvironment: DayNightRatio changed" <<" -> expiring meshes"<<std::endl; expireMeshes(true); } } /* ActiveObjects */ ClientActiveObject* getActiveObject(u16 id); /* Adds an active object to the environment. Environment handles deletion of object. Object may be deleted by environment immediately. If id of object is 0, assigns a free id to it. Returns the id of the object. Returns 0 if not added and thus deleted. */ u16 addActiveObject(ClientActiveObject *object); void addActiveObject(u16 id, u8 type, const std::string &init_data); void removeActiveObject(u16 id); void processActiveObjectMessage(u16 id, const std::string &data); /* Callbacks for activeobjects */ void damageLocalPlayer(u8 damage); /* Client likes to call these */ // Get all nearby objects void getActiveObjects(v3f origin, f32 max_d, core::array<DistanceSortedActiveObject> &dest); // Get event from queue. CEE_NONE is returned if queue is empty. ClientEnvEvent getClientEvent(); private: ClientMap *m_map; scene::ISceneManager *m_smgr; core::map<u16, ClientActiveObject*> m_active_objects; Queue<ClientEnvEvent> m_client_event_queue; }; #endif #endif