X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fenvironment.h;h=c9c3744139648d82f07bd85ae1a27d5cc7ce5635;hb=aa340fd857c151384873f2b29a9bad76e49e852a;hp=d9804e78199da863977bd49cd7f35fb1f77b15a7;hpb=d9ef072305b92b020ebe473765118cca0e23608a;p=minetest.git diff --git a/src/environment.h b/src/environment.h index d9804e781..c9c374413 100644 --- a/src/environment.h +++ b/src/environment.h @@ -38,13 +38,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/numeric.h" #include "mapnode.h" #include "mapblock.h" +#include "jthread/jmutex.h" class ServerEnvironment; class ActiveBlockModifier; class ServerActiveObject; class ITextureSource; class IGameDef; -class IBackgroundBlockEmerger; class Map; class ServerMap; class ClientMap; @@ -70,39 +70,38 @@ class Environment virtual void addPlayer(Player *player); void removePlayer(u16 peer_id); + void removePlayer(const char *name); Player * getPlayer(u16 peer_id); Player * getPlayer(const char *name); Player * getRandomConnectedPlayer(); Player * getNearestConnectedPlayer(v3f pos); - std::list getPlayers(); - std::list getPlayers(bool ignore_disconnected); - + std::vector getPlayers(); + std::vector getPlayers(bool ignore_disconnected); + u32 getDayNightRatio(); - + // 0-23999 - virtual void setTimeOfDay(u32 time) - { - m_time_of_day = time; - m_time_of_day_f = (float)time / 24000.0; - } + virtual void setTimeOfDay(u32 time); + u32 getTimeOfDay(); + float getTimeOfDayF(); - u32 getTimeOfDay() - { return m_time_of_day; } + void stepTimeOfDay(float dtime); - float getTimeOfDayF() - { return m_time_of_day_f; } + void setTimeOfDaySpeed(float speed); + float getTimeOfDaySpeed(); - void stepTimeOfDay(float dtime); + void setDayNightRatioOverride(bool enable, u32 value) + { + m_enable_day_night_ratio_override = enable; + m_day_night_ratio_override = value; + } - void setTimeOfDaySpeed(float speed) - { m_time_of_day_speed = speed; } - - float getTimeOfDaySpeed() - { return m_time_of_day_speed; } + // 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::list m_players; + std::vector 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 @@ -110,6 +109,25 @@ class Environment float m_time_of_day_speed; // Used to buffer dtime for adding to m_time_of_day float m_time_counter; + // Overriding the day-night ratio is useful for custom sky visuals + bool m_enable_day_night_ratio_override; + u32 m_day_night_ratio_override; + + /* TODO: Add a callback function so these can be updated when a setting + * changes. At this point in time it doesn't matter (e.g. /set + * is documented to change server settings only) + * + * TODO: Local caching of settings is not optimal and should at some stage + * be updated to use a global settings object for getting thse values + * (as opposed to the this local caching). This can be addressed in + * a later release. + */ + bool m_cache_enable_shaders; + +private: + JMutex m_timeofday_lock; + JMutex m_time_lock; + }; /* @@ -124,7 +142,7 @@ class ActiveBlockModifier public: ActiveBlockModifier(){}; virtual ~ActiveBlockModifier(){}; - + // Set of contents to trigger on virtual std::set getTriggerContents()=0; // Set of required neighbors (trigger doesn't happen if none are found) @@ -156,7 +174,7 @@ struct ABMWithState class ActiveBlockList { public: - void update(std::list &active_positions, + void update(std::vector &active_positions, s16 radius, std::set &blocks_removed, std::set &blocks_added); @@ -170,6 +188,7 @@ class ActiveBlockList } std::set m_list; + std::set m_forceloaded_list; private: }; @@ -184,8 +203,7 @@ class ServerEnvironment : public Environment { public: ServerEnvironment(ServerMap *map, GameScripting *scriptIface, - IGameDef *gamedef, - IBackgroundBlockEmerger *emerger); + IGameDef *gamedef, const std::string &path_world); ~ServerEnvironment(); Map & getMap(); @@ -202,17 +220,16 @@ class ServerEnvironment : public Environment float getSendRecommendedInterval() { return m_recommended_send_interval; } - /* - Save players - */ - void serializePlayers(const std::string &savedir); - void deSerializePlayers(const std::string &savedir); + // Save players + void saveLoadedPlayers(); + void savePlayer(const std::string &playername); + Player *loadPlayer(const std::string &playername); /* Save and load time of day and game timer */ - void saveMeta(const std::string &savedir); - void loadMeta(const std::string &savedir); + void saveMeta(); + void loadMeta(); /* External ActiveObject interface @@ -230,7 +247,7 @@ class ServerEnvironment : public Environment Returns 0 if not added and thus deleted. */ u16 addActiveObject(ServerActiveObject *object); - + /* Add an active object as a static object to the corresponding MapBlock. @@ -239,12 +256,13 @@ class ServerEnvironment : public Environment (note: not used, pending removal from engine) */ //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, + s16 player_radius, std::set ¤t_objects, std::set &added_objects); @@ -253,9 +271,10 @@ class ServerEnvironment : public Environment inside a radius around a position */ void getRemovedActiveObjects(v3s16 pos, s16 radius, + s16 player_radius, std::set ¤t_objects, std::set &removed_objects); - + /* Get the next message emitted by some active object. Returns a message with id=0 if no messages are available. @@ -284,16 +303,16 @@ class ServerEnvironment : public Environment bool setNode(v3s16 p, const MapNode &n); bool removeNode(v3s16 p); bool swapNode(v3s16 p, const MapNode &n); - + // Find all active objects inside a radius around a point std::set getObjectsInsideRadius(v3f pos, float radius); - + // Clear all objects, loading and going through every MapBlock void clearAllObjects(); - + // 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, v3s16 *p=NULL); @@ -301,10 +320,9 @@ class ServerEnvironment : public Environment void reportMaxLagEstimate(float f) { m_max_lag_estimate = f; } float getMaxLagEstimate() { return m_max_lag_estimate; } - - // is weather active in this environment? - bool m_use_weather; - + + std::set* getForceloadedBlocks() { return &m_active_blocks.m_forceloaded_list; }; + private: /* @@ -323,17 +341,17 @@ class ServerEnvironment : public Environment Returns 0 if not added and thus deleted. */ u16 addActiveObjectRaw(ServerActiveObject *object, bool set_changed, u32 dtime_s); - + /* 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, u32 dtime_s); - + /* Convert objects that are not in active blocks to static. @@ -348,21 +366,20 @@ class ServerEnvironment : public Environment /* Member variables */ - + // The map ServerMap *m_map; // Lua state GameScripting* m_script; // Game definition IGameDef *m_gamedef; - // Background block emerger (the EmergeManager, in practice) - IBackgroundBlockEmerger *m_emerger; + // World path + const std::string m_path_world; // Active object list std::map m_active_objects; // Outgoing network message buffer for active objects std::list 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 @@ -376,7 +393,7 @@ class ServerEnvironment : public Environment u32 m_game_time; // A helper variable for incrementing the latter float m_game_time_fraction_counter; - std::list m_abms; + std::vector m_abms; // An interval for generally sending object positions and stuff float m_recommended_send_interval; // Estimate for general maximum lag as determined by server. @@ -408,8 +425,8 @@ struct ClientEnvEvent { ClientEnvEventType type; union { - struct{ - } none; + //struct{ + //} none; struct{ u8 amount; bool send_to_server; @@ -438,7 +455,7 @@ class ClientEnvironment : public Environment virtual void addPlayer(Player *player); LocalPlayer * getLocalPlayer(); - + /* ClientSimpleObjects */ @@ -448,7 +465,7 @@ class ClientEnvironment : public Environment /* ActiveObjects */ - + ClientActiveObject* getActiveObject(u16 id); /* @@ -476,15 +493,15 @@ class ClientEnvironment : public Environment /* Client likes to call these */ - + // Get all nearby objects void getActiveObjects(v3f origin, f32 max_d, std::vector &dest); - + // Get event from queue. CEE_NONE is returned if queue is empty. ClientEnvEvent getClientEvent(); - std::vector > attachment_list; // X is child ID, Y is parent ID + u16 m_attachements[USHRT_MAX]; std::list getPlayerNames() { return m_player_names; } @@ -492,7 +509,11 @@ class ClientEnvironment : public Environment { m_player_names.push_back(name); } void removePlayerName(std::string name) { m_player_names.remove(name); } - + void updateCameraOffset(v3s16 camera_offset) + { m_camera_offset = camera_offset; } + v3s16 getCameraOffset() + { return m_camera_offset; } + private: ClientMap *m_map; scene::ISceneManager *m_smgr; @@ -500,13 +521,14 @@ class ClientEnvironment : public Environment IGameDef *m_gamedef; IrrlichtDevice *m_irr; std::map m_active_objects; - std::list m_simple_objects; + std::vector m_simple_objects; std::list 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 m_player_names; + v3s16 m_camera_offset; }; #endif