X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fenvironment.h;h=4bee40e57f223936bf81aebe8d4cd1be8064641f;hb=ad4bf2ccf966ac21b94f1778a017ac98f8957ab6;hp=448ed70e658410c1cfc5503422eec88de154f76f;hpb=d494733839e9cf6cb557462326ed21e7a58816c7;p=minetest.git diff --git a/src/environment.h b/src/environment.h index 448ed70e6..4bee40e57 100644 --- a/src/environment.h +++ b/src/environment.h @@ -54,6 +54,7 @@ class ClientMap; class GameScripting; class Player; class RemotePlayer; +class PlayerSAO; class Environment { @@ -72,15 +73,6 @@ class Environment virtual Map & getMap() = 0; - virtual void addPlayer(Player *player); - void removePlayer(Player *player); - Player * getPlayer(u16 peer_id); - Player * getPlayer(const char *name); - Player * getRandomConnectedPlayer(); - Player * getNearestConnectedPlayer(v3f pos); - std::vector getPlayers(); - std::vector getPlayers(bool ignore_disconnected); - u32 getDayNightRatio(); // 0-23999 @@ -91,17 +83,15 @@ class Environment void stepTimeOfDay(float dtime); void setTimeOfDaySpeed(float speed); - float getTimeOfDaySpeed(); void setDayNightRatioOverride(bool enable, u32 value); + u32 getDayCount(); + // counter used internally when triggering ABMs u32 m_added_objects; protected: - // peer_ids in here should be unique, except that there may be many 0s - std::vector m_players; - GenericAtomic m_time_of_day_speed; /* @@ -117,6 +107,9 @@ class Environment // Overriding the day-night ratio is useful for custom sky visuals bool m_enable_day_night_ratio_override; u32 m_day_night_ratio_override; + // Days from the server start, accounts for time shift + // in game (e.g. /time or bed usage) + Atomic m_day_count; /* * Above: values managed by m_time_lock */ @@ -131,6 +124,9 @@ class Environment * a later release. */ bool m_cache_enable_shaders; + float m_cache_active_block_mgmt_interval; + float m_cache_abm_interval; + float m_cache_nodetimer_interval; private: Mutex m_time_lock; @@ -292,6 +288,8 @@ enum ClearObjectsMode { This is not thread-safe. Server uses an environment mutex. */ +typedef UNORDERED_MAP ActiveObjectMap; + class ServerEnvironment : public Environment { public: @@ -318,7 +316,9 @@ class ServerEnvironment : public Environment // Save players void saveLoadedPlayers(); void savePlayer(RemotePlayer *player); - Player *loadPlayer(const std::string &playername); + RemotePlayer *loadPlayer(const std::string &playername, PlayerSAO *sao); + void addPlayer(RemotePlayer *player); + void removePlayer(RemotePlayer *player); /* Save and load time of day and game timer @@ -329,6 +329,10 @@ class ServerEnvironment : public Environment // env_meta.txt doesn't exist (e.g. new world) void loadDefaultMeta(); + u32 addParticleSpawner(float exptime); + u32 addParticleSpawner(float exptime, u16 attached_id); + void deleteParticleSpawner(u32 id, bool remove_from_object = true); + /* External ActiveObject interface ------------------------------------------- @@ -359,7 +363,7 @@ class ServerEnvironment : public Environment Find out what new objects have been added to inside a radius around a position */ - void getAddedActiveObjects(Player *player, s16 radius, + void getAddedActiveObjects(PlayerSAO *playersao, s16 radius, s16 player_radius, std::set ¤t_objects, std::queue &added_objects); @@ -368,7 +372,7 @@ class ServerEnvironment : public Environment Find out what new objects have been removed from inside a radius around a position */ - void getRemovedActiveObjects(Player* player, s16 radius, + void getRemovedActiveObjects(PlayerSAO *playersao, s16 radius, s16 player_radius, std::set ¤t_objects, std::queue &removed_objects); @@ -427,6 +431,8 @@ class ServerEnvironment : public Environment void setStaticForActiveObjectsInBlock(v3s16 blockpos, bool static_exists, v3s16 static_block=v3s16(0,0,0)); + RemotePlayer *getPlayer(const u16 peer_id); + RemotePlayer *getPlayer(const char* name); private: /* @@ -480,7 +486,7 @@ class ServerEnvironment : public Environment // World path const std::string m_path_world; // Active object list - std::map m_active_objects; + ActiveObjectMap m_active_objects; // Outgoing network message buffer for active objects std::queue m_active_object_messages; // Some timers @@ -508,6 +514,14 @@ class ServerEnvironment : public Environment // Estimate for general maximum lag as determined by server. // Can raise to high values like 15s with eg. map generation mods. float m_max_lag_estimate; + + // peer_ids in here should be unique, except that there may be many 0s + std::vector m_players; + + // Particles + IntervalLimiter m_particle_management_interval; + UNORDERED_MAP m_particle_spawners; + UNORDERED_MAP m_particle_spawner_attachments; }; #ifndef SERVER @@ -564,8 +578,8 @@ class ClientEnvironment : public Environment void step(f32 dtime); - virtual void addPlayer(Player *player); - LocalPlayer * getLocalPlayer(); + virtual void setLocalPlayer(LocalPlayer *player); + LocalPlayer *getLocalPlayer() { return m_local_player; } /* ClientSimpleObjects @@ -615,24 +629,20 @@ class ClientEnvironment : public Environment u16 attachement_parent_ids[USHRT_MAX + 1]; - std::list 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); } + const std::list &getPlayerNames() { return m_player_names; } + void addPlayerName(const std::string &name) { m_player_names.push_back(name); } + void removePlayerName(const std::string &name) { m_player_names.remove(name); } void updateCameraOffset(v3s16 camera_offset) { m_camera_offset = camera_offset; } - v3s16 getCameraOffset() - { return m_camera_offset; } - + v3s16 getCameraOffset() const { return m_camera_offset; } private: ClientMap *m_map; + LocalPlayer *m_local_player; scene::ISceneManager *m_smgr; ITextureSource *m_texturesource; IGameDef *m_gamedef; IrrlichtDevice *m_irr; - std::map m_active_objects; + UNORDERED_MAP m_active_objects; std::vector m_simple_objects; std::queue m_client_event_queue; IntervalLimiter m_active_object_light_update_interval;