X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fserver.h;h=d61840871b933d6afa9b1cf84f45d4be52f58909;hb=e8fd1ce62331146fae0e98ce4a94d3720f308abf;hp=39cf560274076e9f147d89c505e31958f2f19b5f;hpb=87ad4d8e7f25210cd28d9f2b372aa00aa3dab929;p=dragonfireclient.git diff --git a/src/server.h b/src/server.h index 39cf56027..d61840871 100644 --- a/src/server.h +++ b/src/server.h @@ -128,6 +128,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, ~Server(); DISABLE_CLASS_COPY(Server); + void init(); void start(); void stop(); // This is mainly a way to pass the time to the server. @@ -188,20 +189,20 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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); @@ -228,7 +229,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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 +239,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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 +248,9 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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 +296,8 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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); @@ -330,8 +333,12 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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 +348,9 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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 +358,25 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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 +394,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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); @@ -399,11 +425,14 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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 +446,6 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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 +455,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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 +466,14 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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 +483,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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 +516,6 @@ class Server : public con::PeerHandler, public MapEventReceiver, /* Variables */ - // World directory std::string m_path_world; // Subgame specification @@ -548,7 +575,6 @@ class Server : public con::PeerHandler, public MapEventReceiver, /* Threads */ - // A buffer for time steps // step() increments and AsyncRunStep() run by m_thread reads it. float m_step_dtime = 0.0f; @@ -563,14 +589,14 @@ class Server : public con::PeerHandler, public MapEventReceiver, /* 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 +612,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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 +631,6 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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 @@ -642,9 +659,9 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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;