X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fserver.h;h=4b3ac5cf78939172fea1ca9b60b8b1298e6aeb67;hb=43bc3a124541d014d7a2678d72bf3b54ff2d6e97;hp=b0f65980d670ae69e747db2299395dfb5a09a3a2;hpb=478b785bc8d8f82b69b23f22ea8a69007db10d9e;p=dragonfireclient.git diff --git a/src/server.h b/src/server.h index b0f65980d..4b3ac5cf7 100644 --- a/src/server.h +++ b/src/server.h @@ -24,18 +24,21 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "hud.h" #include "gamedef.h" #include "serialization.h" // For SER_FMT_VER_INVALID -#include "mods.h" +#include "content/mods.h" #include "inventorymanager.h" -#include "subgame.h" -#include "tileanimation.h" // struct TileAnimationParams +#include "content/subgames.h" +#include "tileanimation.h" // TileAnimationParams +#include "particles.h" // ParticleParams #include "network/peerhandler.h" #include "network/address.h" #include "util/numeric.h" #include "util/thread.h" #include "util/basic_macros.h" +#include "util/metricsbackend.h" #include "serverenvironment.h" #include "clientiface.h" #include "chatmessage.h" +#include "translation.h" #include #include #include @@ -53,6 +56,7 @@ class Inventory; class ModChannelMgr; class RemotePlayer; class PlayerSAO; +struct PlayerHPChangeReason; class IRollbackManager; struct RollbackAction; class EmergeManager; @@ -60,8 +64,13 @@ class ServerScripting; class ServerEnvironment; struct SimpleSoundSpec; struct CloudParams; +struct SkyboxParams; +struct SunParams; +struct MoonParams; +struct StarParams; class ServerThread; class ServerModManager; +class ServerInventoryManager; enum ClientDeletionReason { CDR_LEAVE, @@ -97,6 +106,7 @@ struct ServerSoundParams v3f pos; u16 object = 0; std::string to_player = ""; + std::string exclude_player = ""; v3f getPos(ServerEnvironment *env, bool *pos_exists) const; }; @@ -108,8 +118,16 @@ struct ServerPlayingSound std::unordered_set clients; // peer ids }; +struct MinimapMode { + MinimapType type = MINIMAP_TYPE_OFF; + std::string label; + u16 size = 0; + std::string texture; + u16 scale = 1; +}; + class Server : public con::PeerHandler, public MapEventReceiver, - public InventoryManager, public IGameDef + public IGameDef { public: /* @@ -122,7 +140,8 @@ class Server : public con::PeerHandler, public MapEventReceiver, bool simple_singleplayer_mode, Address bind_addr, bool dedicated, - ChatInterface *iface = nullptr + ChatInterface *iface = nullptr, + std::string *on_shutdown_errmsg = nullptr ); ~Server(); DISABLE_CLASS_COPY(Server); @@ -158,7 +177,6 @@ class Server : public con::PeerHandler, public MapEventReceiver, void handleCommand_InventoryAction(NetworkPacket* pkt); void handleCommand_ChatMessage(NetworkPacket* pkt); void handleCommand_Damage(NetworkPacket* pkt); - void handleCommand_Password(NetworkPacket* pkt); void handleCommand_PlayerItem(NetworkPacket* pkt); void handleCommand_Respawn(NetworkPacket* pkt); void handleCommand_Interact(NetworkPacket* pkt); @@ -187,27 +205,22 @@ 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); - - /* - Shall be called with the environment and the connection locked. - */ - Inventory* getInventory(const InventoryLocation &loc); - void setInventoryModified(const InventoryLocation &loc, bool playerSend = true); + void onMapEditEvent(const MapEditEvent &event); // Connection must be locked when called std::wstring getStatusString(); - inline double getUptime() const { return m_uptime.m_value; } + inline double getUptime() const { return m_uptime_counter->get(); } // 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); @@ -216,6 +229,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, bool checkPriv(const std::string &name, const std::string &priv); void reportPrivsModified(const std::string &name=""); // ""=all void reportInventoryFormspecModified(const std::string &name); + void reportFormspecPrependModified(const std::string &name); void setIpBanned(const std::string &ip, const std::string &name); void unsetIpBanned(const std::string &ip_or_name); @@ -223,29 +237,19 @@ class Server : public con::PeerHandler, public MapEventReceiver, void notifyPlayer(const char *name, const std::wstring &msg); void notifyPlayers(const std::wstring &msg); + void spawnParticle(const std::string &playername, - v3f pos, v3f velocity, v3f acceleration, - float expirationtime, float size, - bool collisiondetection, bool collision_removal, - bool vertical, const std::string &texture, - const struct TileAnimationParams &animation, u8 glow); - - u32 addParticleSpawner(u16 amount, float spawntime, - v3f minpos, v3f maxpos, - v3f minvel, v3f maxvel, - v3f minacc, v3f maxacc, - float minexptime, float maxexptime, - float minsize, float maxsize, - bool collisiondetection, bool collision_removal, - ServerActiveObject *attached, - bool vertical, const std::string &texture, - const std::string &playername, const struct TileAnimationParams &animation, - u8 glow); + const ParticleParameters &p); + + u32 addParticleSpawner(const ParticleSpawnerParameters &p, + ServerActiveObject *attached, const std::string &playername); void deleteParticleSpawner(const std::string &playername, u32 id); - // Creates or resets inventory - Inventory* createDetachedInventory(const std::string &name, const std::string &player=""); + bool dynamicAddMedia(const std::string &filepath); + + ServerInventoryManager *getInventoryMgr() const { return m_inventory_mgr.get(); } + void sendDetachedInventory(Inventory *inventory, const std::string &name, session_t peer_id); // Envlock and conlock should be locked when using scriptapi ServerScripting *getScriptIface(){ return m_script; } @@ -261,7 +265,6 @@ class Server : public con::PeerHandler, public MapEventReceiver, virtual const NodeDefManager* getNodeDefManager(); virtual ICraftDefManager* getCraftDefManager(); virtual u16 allocateUnknownNodeId(const std::string &name); - virtual MtEventManager* getEventManager(); IRollbackManager *getRollbackManager() { return m_rollback; } virtual EmergeManager *getEmergeManager() { return m_emerge; } @@ -292,8 +295,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); @@ -301,12 +304,14 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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); + void overrideDayNightRatio(RemotePlayer *player, bool do_override, float brightness); /* con::PeerHandler implementation. */ void peerAdded(con::Peer *peer); @@ -323,14 +328,22 @@ class Server : public con::PeerHandler, public MapEventReceiver, bool getClientConInfo(session_t peer_id, con::rtt_stat_type type, float *retval); bool getClientInfo(session_t peer_id, ClientState *state, u32 *uptime, u8* ser_vers, u16* prot_vers, u8* major, u8* minor, u8* patch, - std::string* vers_string); + std::string* vers_string, std::string* lang_code); void printToConsoleOnly(const std::string &text); - void SendPlayerHPOrDie(PlayerSAO *player); + 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 SendMinimapModes(session_t peer_id, + std::vector &modes, + size_t wanted_mode); + + void sendDetachedInventories(session_t peer_id, bool incremental); virtual bool registerModStorage(ModMetadata *storage); virtual void unregisterModStorage(const std::string &name); @@ -340,6 +353,12 @@ 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); + + // Get or load translations for a language + Translations *getTranslationLanguage(const std::string &lang_code); + // Bind address Address m_bind_addr; @@ -347,9 +366,27 @@ 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 init(); void SendMovement(session_t peer_id); void SendHP(session_t peer_id, u16 hp); @@ -367,7 +404,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); @@ -376,6 +413,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, void SendEyeOffset(session_t peer_id, v3f first, v3f third); void SendPlayerPrivileges(session_t peer_id); void SendPlayerInventoryFormspec(session_t peer_id); + void SendPlayerFormspecPrepend(session_t peer_id); void SendShowFormspecMessage(session_t peer_id, const std::string &formspec, const std::string &formname); void SendHUDAdd(session_t peer_id, u32 id, HudElement *form); @@ -383,9 +421,10 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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, @@ -397,11 +436,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); @@ -409,51 +451,37 @@ class Server : public con::PeerHandler, public MapEventReceiver, // Sends blocks to clients (locks env and con on its own) void SendBlocks(float dtime); + bool addMediaFile(const std::string &filename, const std::string &filepath, + std::string *filedata = nullptr, std::string *digest = nullptr); void fillMediaCache(); void sendMediaAnnouncement(session_t peer_id, const std::string &lang_code); void sendRequestedMedia(session_t peer_id, 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, - u16 amount, float spawntime, - v3f minpos, v3f maxpos, - v3f minvel, v3f maxvel, - v3f minacc, v3f maxacc, - float minexptime, float maxexptime, - float minsize, float maxsize, - bool collisiondetection, bool collision_removal, - u16 attached_id, - bool vertical, const std::string &texture, u32 id, - const struct TileAnimationParams &animation, u8 glow); + const ParticleSpawnerParameters &p, u16 attached_id, u32 id); void SendDeleteParticleSpawner(session_t peer_id, u32 id); // Spawns particle on peer with peer_id (PEER_ID_INEXISTENT == all) 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 vertical, const std::string &texture, - const struct TileAnimationParams &animation, u8 glow); + const ParticleParameters &p); - 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 */ - void DiePlayer(session_t peer_id); + void DiePlayer(session_t peer_id, const PlayerHPChangeReason &reason); 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); @@ -486,7 +514,6 @@ class Server : public con::PeerHandler, public MapEventReceiver, /* Variables */ - // World directory std::string m_path_world; // Subgame specification @@ -543,32 +570,28 @@ class Server : public con::PeerHandler, public MapEventReceiver, // Mods std::unique_ptr m_modmgr; + std::unordered_map server_translations; + /* Threads */ - // A buffer for time steps // step() increments and AsyncRunStep() run by m_thread reads it. float m_step_dtime = 0.0f; std::mutex m_step_dtime_mutex; - // current server step lag counter - float m_lag; - // The server mainly operates in this thread ServerThread *m_thread = nullptr; /* 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; /* @@ -584,14 +607,15 @@ 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; + // if a mod-error occurs in the on_shutdown callback, the error message will + // be written into this + std::string *const m_on_shutdown_errmsg; + /* Map edit event queue. Automatically receives all map edits. The constructor of this class registers us to receive them through @@ -606,12 +630,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 @@ -627,25 +645,34 @@ class Server : public con::PeerHandler, public MapEventReceiver, Sounds */ std::unordered_map m_playing_sounds; - s32 m_next_sound_id = 0; - - /* - Detached inventories (behind m_env_mutex) - */ - // key = name - std::map m_detached_inventories; - // value = "" (visible to all players) or player name - std::map m_detached_inventories_player; + s32 m_next_sound_id = 0; // positive values only + s32 nextSoundId(); 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; + + // Inventory manager + std::unique_ptr m_inventory_mgr; + + // Global server metrics backend + std::unique_ptr m_metrics_backend; + + // Server metrics + MetricCounterPtr m_uptime_counter; + MetricGaugePtr m_player_gauge; + MetricGaugePtr m_timeofday_gauge; + // current server step lag + MetricGaugePtr m_lag_gauge; + MetricCounterPtr m_aom_buffer_counter; + MetricCounterPtr m_packet_recv_counter; + MetricCounterPtr m_packet_recv_processed_counter; }; /*