X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fserver.h;h=680de57b540f51027ad2fc13d66b5a8318ec329a;hb=7c43cf47c37b0204e34d12670d2e6975eb36b45a;hp=39cf560274076e9f147d89c505e31958f2f19b5f;hpb=87ad4d8e7f25210cd28d9f2b372aa00aa3dab929;p=oweals%2Fminetest.git diff --git a/src/server.h b/src/server.h index 39cf56027..680de57b5 100644 --- a/src/server.h +++ b/src/server.h @@ -61,6 +61,10 @@ class ServerScripting; class ServerEnvironment; struct SimpleSoundSpec; struct CloudParams; +struct SkyboxParams; +struct SunParams; +struct MoonParams; +struct StarParams; class ServerThread; class ServerModManager; @@ -98,6 +102,7 @@ struct ServerSoundParams v3f pos; u16 object = 0; std::string to_player = ""; + std::string exclude_player = ""; v3f getPos(ServerEnvironment *env, bool *pos_exists) const; }; @@ -128,6 +133,7 @@ public: ~Server(); DISABLE_CLASS_COPY(Server); + void init(); void start(); void stop(); // This is mainly a way to pass the time to the server. @@ -188,27 +194,28 @@ public: This is accessed by the map, which is inside the environment, so it shouldn't be a problem. */ - void onMapEditEvent(MapEditEvent *event); + void onMapEditEvent(const MapEditEvent &event); /* Shall be called with the environment and the connection locked. */ Inventory* getInventory(const InventoryLocation &loc); - void setInventoryModified(const InventoryLocation &loc, bool playerSend = true); + void setInventoryModified(const InventoryLocation &loc); // Connection must be locked when called std::wstring getStatusString(); inline double getUptime() const { return m_uptime.m_value; } // read shutdown state - inline bool getShutdownRequested() const { return m_shutdown_requested; } + inline bool isShutdownRequested() const { return m_shutdown_state.is_requested; } // request server to shutdown void requestShutdown(const std::string &msg, bool reconnect, float delay = 0.0f); // Returns -1 if failed, sound handle on success // Envlock - s32 playSound(const SimpleSoundSpec &spec, const ServerSoundParams ¶ms); + s32 playSound(const SimpleSoundSpec &spec, const ServerSoundParams ¶ms, + bool ephemeral=false); void stopSound(s32 handle); void fadeSound(s32 handle, float step, float gain); @@ -228,7 +235,7 @@ public: void spawnParticle(const std::string &playername, v3f pos, v3f velocity, v3f acceleration, float expirationtime, float size, - bool collisiondetection, bool collision_removal, + bool collisiondetection, bool collision_removal, bool object_collision, bool vertical, const std::string &texture, const struct TileAnimationParams &animation, u8 glow); @@ -238,7 +245,7 @@ public: v3f minacc, v3f maxacc, float minexptime, float maxexptime, float minsize, float maxsize, - bool collisiondetection, bool collision_removal, + bool collisiondetection, bool collision_removal, bool object_collision, ServerActiveObject *attached, bool vertical, const std::string &texture, const std::string &playername, const struct TileAnimationParams &animation, @@ -247,7 +254,9 @@ public: void deleteParticleSpawner(const std::string &playername, u32 id); // Creates or resets inventory - Inventory* createDetachedInventory(const std::string &name, const std::string &player=""); + Inventory *createDetachedInventory(const std::string &name, + const std::string &player = ""); + bool removeDetachedInventory(const std::string &name); // Envlock and conlock should be locked when using scriptapi ServerScripting *getScriptIface(){ return m_script; } @@ -293,8 +302,8 @@ public: bool hudChange(RemotePlayer *player, u32 id, HudElementStat stat, void *value); bool hudSetFlags(RemotePlayer *player, u32 flags, u32 mask); bool hudSetHotbarItemcount(RemotePlayer *player, s32 hotbar_itemcount); - void hudSetHotbarImage(RemotePlayer *player, std::string name); - void hudSetHotbarSelectedImage(RemotePlayer *player, std::string name); + void hudSetHotbarImage(RemotePlayer *player, const std::string &name); + void hudSetHotbarSelectedImage(RemotePlayer *player, const std::string &name); Address getPeerAddress(session_t peer_id); @@ -302,9 +311,11 @@ public: f32 frame_speed); void setPlayerEyeOffset(RemotePlayer *player, const v3f &first, const v3f &third); - void setSky(RemotePlayer *player, const video::SColor &bgcolor, - const std::string &type, const std::vector ¶ms, - bool &clouds); + void setSky(RemotePlayer *player, const SkyboxParams ¶ms); + void setSun(RemotePlayer *player, const SunParams ¶ms); + void setMoon(RemotePlayer *player, const MoonParams ¶ms); + void setStars(RemotePlayer *player, const StarParams ¶ms); + void setClouds(RemotePlayer *player, const CloudParams ¶ms); bool overrideDayNightRatio(RemotePlayer *player, bool do_override, float brightness); @@ -330,8 +341,12 @@ public: void SendPlayerHPOrDie(PlayerSAO *player, const PlayerHPChangeReason &reason); void SendPlayerBreath(PlayerSAO *sao); - void SendInventory(PlayerSAO* playerSAO); + void SendInventory(PlayerSAO *playerSAO, bool incremental); void SendMovePlayer(session_t peer_id); + void SendPlayerSpeed(session_t peer_id, const v3f &added_vel); + void SendPlayerFov(session_t peer_id); + + void sendDetachedInventories(session_t peer_id, bool incremental); virtual bool registerModStorage(ModMetadata *storage); virtual void unregisterModStorage(const std::string &name); @@ -341,6 +356,9 @@ public: bool sendModChannelMessage(const std::string &channel, const std::string &message); ModChannel *getModChannel(const std::string &channel); + // Send block to specific player only + bool SendBlock(session_t peer_id, const v3s16 &blockpos); + // Bind address Address m_bind_addr; @@ -348,9 +366,25 @@ public: std::mutex m_env_mutex; private: - friend class EmergeThread; friend class RemoteClient; + friend class TestServerShutdownState; + + struct ShutdownState { + friend class TestServerShutdownState; + public: + bool is_requested = false; + bool should_reconnect = false; + std::string message; + + void reset(); + void trigger(float delay, const std::string &msg, bool reconnect); + void tick(float dtime, Server *server); + std::wstring getShutdownTimerMessage() const; + bool isTimerRunning() const { return m_timer > 0.0f; } + private: + float m_timer = 0.0f; + }; void SendMovement(session_t peer_id); void SendHP(session_t peer_id, u16 hp); @@ -368,7 +402,7 @@ private: void SetBlocksNotSent(std::map& block); - void SendChatMessage(session_t peer_id, const ChatMessage &message); + virtual void SendChatMessage(session_t peer_id, const ChatMessage &message); void SendTimeOfDay(session_t peer_id, u16 time, f32 time_speed); void SendPlayerHP(session_t peer_id); @@ -385,9 +419,10 @@ private: void SendHUDChange(session_t peer_id, u32 id, HudElementStat stat, void *value); void SendHUDSetFlags(session_t peer_id, u32 flags, u32 mask); void SendHUDSetParam(session_t peer_id, u16 param, const std::string &value); - void SendSetSky(session_t peer_id, const video::SColor &bgcolor, - const std::string &type, const std::vector ¶ms, - bool &clouds); + void SendSetSky(session_t peer_id, const SkyboxParams ¶ms); + void SendSetSun(session_t peer_id, const SunParams ¶ms); + void SendSetMoon(session_t peer_id, const MoonParams ¶ms); + void SendSetStars(session_t peer_id, const StarParams ¶ms); void SendCloudParams(session_t peer_id, const CloudParams ¶ms); void SendOverrideDayNightRatio(session_t peer_id, bool do_override, float ratio); void broadcastModChannelMessage(const std::string &channel, @@ -399,11 +434,14 @@ private: far_d_nodes are ignored and their peer_ids are added to far_players */ // Envlock and conlock should be locked when calling these - void sendRemoveNode(v3s16 p, u16 ignore_id=0, - std::vector *far_players=NULL, float far_d_nodes=100); - void sendAddNode(v3s16 p, MapNode n, u16 ignore_id=0, - std::vector *far_players=NULL, float far_d_nodes=100, - bool remove_metadata=true); + void sendRemoveNode(v3s16 p, std::unordered_set *far_players = nullptr, + float far_d_nodes = 100); + void sendAddNode(v3s16 p, MapNode n, + std::unordered_set *far_players = nullptr, + float far_d_nodes = 100, bool remove_metadata = true); + + void sendMetadataChanged(const std::list &meta_updates, + float far_d_nodes = 100); // Environment and Connection must be locked when called void SendBlockNoLock(session_t peer_id, MapBlock *block, u8 ver, u16 net_proto_version); @@ -417,7 +455,6 @@ private: const std::vector &tosend); void sendDetachedInventory(const std::string &name, session_t peer_id); - void sendDetachedInventories(session_t peer_id); // Adds a ParticleSpawner on peer with peer_id (PEER_ID_INEXISTENT == all) void SendAddParticleSpawner(session_t peer_id, u16 protocol_version, @@ -427,7 +464,7 @@ private: v3f minacc, v3f maxacc, float minexptime, float maxexptime, float minsize, float maxsize, - bool collisiondetection, bool collision_removal, + bool collisiondetection, bool collision_removal, bool object_collision, u16 attached_id, bool vertical, const std::string &texture, u32 id, const struct TileAnimationParams &animation, u8 glow); @@ -438,14 +475,14 @@ private: void SendSpawnParticle(session_t peer_id, u16 protocol_version, v3f pos, v3f velocity, v3f acceleration, float expirationtime, float size, - bool collisiondetection, bool collision_removal, + bool collisiondetection, bool collision_removal, bool object_collision, bool vertical, const std::string &texture, const struct TileAnimationParams &animation, u8 glow); - u32 SendActiveObjectRemoveAdd(session_t peer_id, const std::string &datas); + void SendActiveObjectRemoveAdd(RemoteClient *client, PlayerSAO *playersao); void SendActiveObjectMessages(session_t peer_id, const std::string &datas, bool reliable = true); - void SendCSMFlavourLimits(session_t peer_id); + void SendCSMRestrictionFlags(session_t peer_id); /* Something random @@ -455,7 +492,7 @@ private: void RespawnPlayer(session_t peer_id); void DeleteClient(session_t peer_id, ClientDeletionReason reason); void UpdateCrafting(RemotePlayer *player); - bool checkInteractDistance(RemotePlayer *player, const f32 d, const std::string what); + bool checkInteractDistance(RemotePlayer *player, const f32 d, const std::string &what); void handleChatInterfaceEvent(ChatEvent *evt); @@ -488,7 +525,6 @@ private: /* Variables */ - // World directory std::string m_path_world; // Subgame specification @@ -548,7 +584,6 @@ private: /* Threads */ - // A buffer for time steps // step() increments and AsyncRunStep() run by m_thread reads it. float m_step_dtime = 0.0f; @@ -563,14 +598,14 @@ private: /* Time related stuff */ - // Timer for sending time of day over network float m_time_of_day_send_timer = 0.0f; // Uptime of server in seconds MutexedVariable m_uptime; + /* - Client interface - */ + Client interface + */ ClientInterface m_clients; /* @@ -586,10 +621,7 @@ private: Random stuff */ - bool m_shutdown_requested = false; - std::string m_shutdown_msg; - bool m_shutdown_ask_reconnect = false; - float m_shutdown_timer = 0.0f; + ShutdownState m_shutdown_state; ChatInterface *m_admin_chat; std::string m_admin_nick; @@ -608,12 +640,6 @@ private: This is behind m_env_mutex */ std::queue m_unsent_map_edit_queue; - /* - Set to true when the server itself is modifying the map and does - all sending of information by itself. - This is behind m_env_mutex - */ - bool m_ignore_map_edit_events = false; /* If a non-empty area, map edit events contained within are left unsent. Done at map generation time to speed up editing of the @@ -629,7 +655,8 @@ private: Sounds */ std::unordered_map m_playing_sounds; - s32 m_next_sound_id = 0; + s32 m_next_sound_id = 0; // positive values only + s32 nextSoundId(); /* Detached inventories (behind m_env_mutex) @@ -642,9 +669,9 @@ private: std::unordered_map m_mod_storages; float m_mod_storage_save_timer = 10.0f; - // CSM flavour limits byteflag - u64 m_csm_flavour_limits = CSMFlavourLimit::CSM_FL_NONE; - u32 m_csm_noderange_limit = 8; + // CSM restrictions byteflag + u64 m_csm_restriction_flags = CSMRestrictionFlags::CSM_RF_NONE; + u32 m_csm_restriction_noderange = 8; // ModChannel manager std::unique_ptr m_modchannel_mgr;