X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fserver.h;h=551bd27878ae9ebb43f1f6f9383caee7eda99826;hb=ee9a442ecc26f2623a1b085344d37636342973eb;hp=54078defc33d8fb9cb81be067ed1911de0e8e93a;hpb=85fe75d1cbaf372f0a98558adcd5a612a0e19602;p=dragonfireclient.git diff --git a/src/server.h b/src/server.h index 54078defc..551bd2787 100644 --- a/src/server.h +++ b/src/server.h @@ -17,10 +17,8 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef SERVER_HEADER -#define SERVER_HEADER +#pragma once -#include "connection.h" #include "irr_v3d.h" #include "map.h" #include "hud.h" @@ -29,29 +27,35 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mods.h" #include "inventorymanager.h" #include "subgame.h" -#include "rollback_interface.h" // Needed for rollbackRevertActions() +#include "tileanimation.h" // struct TileAnimationParams +#include "network/peerhandler.h" +#include "network/address.h" #include "util/numeric.h" #include "util/thread.h" -#include "environment.h" +#include "util/basic_macros.h" +#include "serverenvironment.h" #include "clientiface.h" +#include "chatmessage.h" #include #include #include #include -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" - +class ChatEvent; +struct ChatEventChat; +struct ChatInterface; class IWritableItemDefManager; class IWritableNodeDefManager; class IWritableCraftDefManager; class BanManager; class EventManager; class Inventory; -class Player; +class RemotePlayer; class PlayerSAO; class IRollbackManager; +struct RollbackAction; class EmergeManager; -class GameScripting; +class ServerScripting; class ServerEnvironment; struct SimpleSoundSpec; class ServerThread; @@ -62,68 +66,13 @@ enum ClientDeletionReason { CDR_DENY }; -/* - Some random functions -*/ -v3f findSpawnPos(ServerMap &map); - -class MapEditEventIgnorer -{ -public: - MapEditEventIgnorer(bool *flag): - m_flag(flag) - { - if(*m_flag == false) - *m_flag = true; - else - m_flag = NULL; - } - - ~MapEditEventIgnorer() - { - if(m_flag) - { - assert(*m_flag); - *m_flag = false; - } - } - -private: - bool *m_flag; -}; - -class MapEditEventAreaIgnorer -{ -public: - MapEditEventAreaIgnorer(VoxelArea *ignorevariable, const VoxelArea &a): - m_ignorevariable(ignorevariable) - { - if(m_ignorevariable->getVolume() == 0) - *m_ignorevariable = a; - else - m_ignorevariable = NULL; - } - - ~MapEditEventAreaIgnorer() - { - if(m_ignorevariable) - { - assert(m_ignorevariable->getVolume() != 0); - *m_ignorevariable = VoxelArea(); - } - } - -private: - VoxelArea *m_ignorevariable; -}; - struct MediaInfo { std::string path; std::string sha1_digest; - MediaInfo(const std::string path_="", - const std::string sha1_digest_=""): + MediaInfo(const std::string &path_="", + const std::string &sha1_digest_=""): path(path_), sha1_digest(sha1_digest_) { @@ -132,27 +81,19 @@ struct MediaInfo struct ServerSoundParams { - float gain; - std::string to_player; - enum Type{ - SSP_LOCAL=0, - SSP_POSITIONAL=1, - SSP_OBJECT=2 - } type; + enum Type { + SSP_LOCAL, + SSP_POSITIONAL, + SSP_OBJECT + } type = SSP_LOCAL; + float gain = 1.0f; + float fade = 0.0f; + float pitch = 1.0f; + bool loop = false; + float max_hear_distance = 32 * BS; v3f pos; - u16 object; - float max_hear_distance; - bool loop; - - ServerSoundParams(): - gain(1.0), - to_player(""), - type(SSP_LOCAL), - pos(0,0,0), - object(0), - max_hear_distance(32*BS), - loop(false) - {} + u16 object = 0; + std::string to_player = ""; v3f getPos(ServerEnvironment *env, bool *pos_exists) const; }; @@ -160,7 +101,8 @@ struct ServerSoundParams struct ServerPlayingSound { ServerSoundParams params; - std::set clients; // peer ids + SimpleSoundSpec spec; + std::unordered_set clients; // peer ids }; class Server : public con::PeerHandler, public MapEventReceiver, @@ -174,9 +116,14 @@ class Server : public con::PeerHandler, public MapEventReceiver, Server( const std::string &path_world, const SubgameSpec &gamespec, - bool simple_singleplayer_mode + bool simple_singleplayer_mode, + bool ipv6, + bool dedicated, + ChatInterface *iface = nullptr ); ~Server(); + DISABLE_CLASS_COPY(Server); + void start(Address bind_addr); void stop(); // This is mainly a way to pass the time to the server. @@ -185,9 +132,47 @@ class Server : public con::PeerHandler, public MapEventReceiver, // This is run by ServerThread and does the actual processing void AsyncRunStep(bool initial_step=false); void Receive(); - void ProcessData(u8 *data, u32 datasize, u16 peer_id); + PlayerSAO* StageTwoClientInit(u16 peer_id); + + /* + * Command Handlers + */ - // Environment must be locked when called + void handleCommand(NetworkPacket* pkt); + + void handleCommand_Null(NetworkPacket* pkt) {}; + void handleCommand_Deprecated(NetworkPacket* pkt); + void handleCommand_Init(NetworkPacket* pkt); + void handleCommand_Init2(NetworkPacket* pkt); + void handleCommand_RequestMedia(NetworkPacket* pkt); + void handleCommand_ClientReady(NetworkPacket* pkt); + void handleCommand_GotBlocks(NetworkPacket* pkt); + void handleCommand_PlayerPos(NetworkPacket* pkt); + void handleCommand_DeletedBlocks(NetworkPacket* pkt); + 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); + void handleCommand_RemovedSounds(NetworkPacket* pkt); + void handleCommand_NodeMetaFields(NetworkPacket* pkt); + void handleCommand_InventoryFields(NetworkPacket* pkt); + void handleCommand_FirstSrp(NetworkPacket* pkt); + void handleCommand_SrpBytesA(NetworkPacket* pkt); + void handleCommand_SrpBytesM(NetworkPacket* pkt); + + void ProcessData(NetworkPacket *pkt); + + void Send(NetworkPacket* pkt); + + // Helper for handleCommand_PlayerPos and handleCommand_Interact + void process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao, + NetworkPacket *pkt); + + // Both setter and getter need no envlock, + // can be called freely from threads void setTimeOfDay(u32 time); /* @@ -201,23 +186,23 @@ class Server : public con::PeerHandler, public MapEventReceiver, Shall be called with the environment and the connection locked. */ Inventory* getInventory(const InventoryLocation &loc); - void setInventoryModified(const InventoryLocation &loc); + void setInventoryModified(const InventoryLocation &loc, bool playerSend = true); // Connection must be locked when called std::wstring getStatusString(); + inline double getUptime() const { return m_uptime.m_value; } // read shutdown state - inline bool getShutdownRequested() - { return m_shutdown_requested; } + inline bool getShutdownRequested() const { return m_shutdown_requested; } // request server to shutdown - inline void requestShutdown(void) - { m_shutdown_requested = true; } + 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); void stopSound(s32 handle); + void fadeSound(s32 handle, float step, float gain); // Envlock std::set getPlayerEffectivePrivs(const std::string &name); @@ -229,48 +214,34 @@ class Server : public con::PeerHandler, public MapEventReceiver, void unsetIpBanned(const std::string &ip_or_name); std::string getBanDescription(const std::string &ip_or_name); - void notifyPlayer(const char *name, const std::wstring msg, const bool prepend); - void notifyPlayers(const std::wstring msg); - void spawnParticle(const char *playername, + 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 vertical, std::string texture); + bool collisiondetection, bool collision_removal, + bool vertical, const std::string &texture, + const struct TileAnimationParams &animation, u8 glow); - void spawnParticleAll(v3f pos, v3f velocity, v3f acceleration, - float expirationtime, float size, - bool collisiondetection, bool vertical, std::string texture); - - u32 addParticleSpawner(const char *playername, - u16 amount, float spawntime, + 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 vertical, std::string texture); + bool collisiondetection, bool collision_removal, + ServerActiveObject *attached, + bool vertical, const std::string &texture, + const std::string &playername, const struct TileAnimationParams &animation, + u8 glow); - u32 addParticleSpawnerAll(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 vertical, std::string texture); - - void deleteParticleSpawner(const char *playername, u32 id); - void deleteParticleSpawnerAll(u32 id); + void deleteParticleSpawner(const std::string &playername, u32 id); // Creates or resets inventory - Inventory* createDetachedInventory(const std::string &name); + Inventory* createDetachedInventory(const std::string &name, const std::string &player=""); // Envlock and conlock should be locked when using scriptapi - GameScripting *getScriptIface(){ return m_script; } - - // Envlock should be locked when using the rollback manager - IRollbackManager *getRollbackManager(){ return m_rollback; } - - //TODO: determine what (if anything) should be locked to access EmergeManager - EmergeManager *getEmergeManager(){ return m_emerge; } + ServerScripting *getScriptIface(){ return m_script; } // actions: time-reversed list // Return value: success/failure @@ -282,22 +253,21 @@ class Server : public con::PeerHandler, public MapEventReceiver, virtual IItemDefManager* getItemDefManager(); virtual INodeDefManager* getNodeDefManager(); virtual ICraftDefManager* getCraftDefManager(); - virtual ITextureSource* getTextureSource(); - virtual IShaderSource* getShaderSource(); virtual u16 allocateUnknownNodeId(const std::string &name); - virtual ISoundManager* getSoundManager(); virtual MtEventManager* getEventManager(); - virtual IRollbackReportSink* getRollbackReportSink(); + IRollbackManager *getRollbackManager() { return m_rollback; } + virtual EmergeManager *getEmergeManager() { return m_emerge; } IWritableItemDefManager* getWritableItemDefManager(); IWritableNodeDefManager* getWritableNodeDefManager(); IWritableCraftDefManager* getWritableCraftDefManager(); - const ModSpec* getModSpec(const std::string &modname); - void getModNames(std::list &modlist); + virtual const std::vector &getMods() const { return m_mods; } + virtual const ModSpec* getModSpec(const std::string &modname) const; + void getModNames(std::vector &modlist); std::string getBuiltinLuaPath(); - inline std::string getWorldPath() - { return m_path_world; } + virtual std::string getWorldPath() const { return m_path_world; } + virtual std::string getModStoragePath() const; inline bool isSingleplayer() { return m_simple_singleplayer_mode; } @@ -308,29 +278,67 @@ class Server : public con::PeerHandler, public MapEventReceiver, bool showFormspec(const char *name, const std::string &formspec, const std::string &formname); Map & getMap() { return m_env->getMap(); } ServerEnvironment & getEnv() { return *m_env; } - - u32 hudAdd(Player *player, HudElement *element); - bool hudRemove(Player *player, u32 id); - bool hudChange(Player *player, u32 id, HudElementStat stat, void *value); - bool hudSetFlags(Player *player, u32 flags, u32 mask); - bool hudSetHotbarItemcount(Player *player, s32 hotbar_itemcount); - void hudSetHotbarImage(Player *player, std::string name); - void hudSetHotbarSelectedImage(Player *player, std::string name); - - inline Address getPeerAddress(u16 peer_id) - { return m_con.GetPeerAddress(peer_id); } - - bool setSky(Player *player, const video::SColor &bgcolor, - const std::string &type, const std::vector ¶ms); - - bool overrideDayNightRatio(Player *player, bool do_override, - float brightness); + v3f findSpawnPos(); + + u32 hudAdd(RemotePlayer *player, HudElement *element); + bool hudRemove(RemotePlayer *player, u32 id); + 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); + s32 hudGetHotbarItemcount(RemotePlayer *player) const; + void hudSetHotbarImage(RemotePlayer *player, std::string name); + std::string hudGetHotbarImage(RemotePlayer *player); + void hudSetHotbarSelectedImage(RemotePlayer *player, std::string name); + const std::string &hudGetHotbarSelectedImage(RemotePlayer *player) const; + + Address getPeerAddress(u16 peer_id); + + bool setLocalPlayerAnimations(RemotePlayer *player, v2s32 animation_frames[4], + f32 frame_speed); + bool setPlayerEyeOffset(RemotePlayer *player, v3f first, v3f third); + + bool setSky(RemotePlayer *player, const video::SColor &bgcolor, + const std::string &type, const std::vector ¶ms, + bool &clouds); + bool setClouds(RemotePlayer *player, float density, + const video::SColor &color_bright, + const video::SColor &color_ambient, + float height, + float thickness, + const v2f &speed); + + bool overrideDayNightRatio(RemotePlayer *player, bool do_override, float brightness); /* con::PeerHandler implementation. */ void peerAdded(con::Peer *peer); void deletingPeer(con::Peer *peer, bool timeout); - void DenyAccess(u16 peer_id, const std::wstring &reason); + void DenySudoAccess(u16 peer_id); + void DenyAccessVerCompliant(u16 peer_id, u16 proto_ver, AccessDeniedCode reason, + const std::string &str_reason = "", bool reconnect = false); + void DenyAccess(u16 peer_id, AccessDeniedCode reason, const std::string &custom_reason=""); + void acceptAuth(u16 peer_id, bool forSudoMode); + void DenyAccess_Legacy(u16 peer_id, const std::wstring &reason); + bool getClientConInfo(u16 peer_id, con::rtt_stat_type type, float* retval); + bool getClientInfo(u16 peer_id,ClientState* state, u32* uptime, + u8* ser_vers, u16* prot_vers, u8* major, u8* minor, u8* patch, + std::string* vers_string); + + void printToConsoleOnly(const std::string &text); + + void SendPlayerHPOrDie(PlayerSAO *player); + void SendPlayerBreath(PlayerSAO *sao); + void SendInventory(PlayerSAO* playerSAO); + void SendMovePlayer(u16 peer_id); + + virtual bool registerModStorage(ModMetadata *storage); + virtual void unregisterModStorage(const std::string &name); + + // Bind address + Address m_bind_addr; + + // Environment mutex (envlock) + std::mutex m_env_mutex; private: @@ -338,9 +346,11 @@ class Server : public con::PeerHandler, public MapEventReceiver, friend class RemoteClient; void SendMovement(u16 peer_id); - void SendHP(u16 peer_id, u8 hp); + void SendHP(u16 peer_id, u16 hp); void SendBreath(u16 peer_id, u16 breath); - void SendAccessDenied(u16 peer_id,const std::wstring &reason); + void SendAccessDenied(u16 peer_id, AccessDeniedCode reason, + const std::string &custom_reason, bool reconnect = false); + void SendAccessDenied_Legacy(u16 peer_id, const std::wstring &reason); void SendDeathscreen(u16 peer_id,bool set_camera_point_target, v3f camera_point_target); void SendItemDef(u16 peer_id,IItemDefManager *itemdef, u16 protocol_version); void SendNodeDef(u16 peer_id,INodeDefManager *nodedef, u16 protocol_version); @@ -348,25 +358,32 @@ class Server : public con::PeerHandler, public MapEventReceiver, /* mark blocks not sent for all clients */ void SetBlocksNotSent(std::map& block); - // Envlock and conlock should be locked when calling these - void SendInventory(u16 peer_id); - void SendChatMessage(u16 peer_id, const std::wstring &message); + + void SendChatMessage(u16 peer_id, const ChatMessage &message); void SendTimeOfDay(u16 peer_id, u16 time, f32 time_speed); void SendPlayerHP(u16 peer_id); - void SendPlayerBreath(u16 peer_id); - void SendMovePlayer(u16 peer_id); + + void SendLocalPlayerAnimations(u16 peer_id, v2s32 animation_frames[4], f32 animation_speed); + void SendEyeOffset(u16 peer_id, v3f first, v3f third); void SendPlayerPrivileges(u16 peer_id); void SendPlayerInventoryFormspec(u16 peer_id); - void SendShowFormspecMessage(u16 peer_id, const std::string formspec, const std::string formname); + void SendShowFormspecMessage(u16 peer_id, const std::string &formspec, const std::string &formname); void SendHUDAdd(u16 peer_id, u32 id, HudElement *form); void SendHUDRemove(u16 peer_id, u32 id); void SendHUDChange(u16 peer_id, u32 id, HudElementStat stat, void *value); void SendHUDSetFlags(u16 peer_id, u32 flags, u32 mask); void SendHUDSetParam(u16 peer_id, u16 param, const std::string &value); void SendSetSky(u16 peer_id, const video::SColor &bgcolor, - const std::string &type, const std::vector ¶ms); + const std::string &type, const std::vector ¶ms, + bool &clouds); + void SendCloudParams(u16 peer_id, float density, + const video::SColor &color_bright, + const video::SColor &color_ambient, + float height, + float thickness, + const v2f &speed); void SendOverrideDayNightRatio(u16 peer_id, bool do_override, float ratio); - + /* Send a node removal/addition event to all clients except ignore_id. Additionally, if far_players!=NULL, players further away than @@ -374,9 +391,9 @@ class Server : public con::PeerHandler, public MapEventReceiver, */ // Envlock and conlock should be locked when calling these void sendRemoveNode(v3s16 p, u16 ignore_id=0, - std::list *far_players=NULL, float far_d_nodes=100); + std::vector *far_players=NULL, float far_d_nodes=100); void sendAddNode(v3s16 p, MapNode n, u16 ignore_id=0, - std::list *far_players=NULL, float far_d_nodes=100, + std::vector *far_players=NULL, float far_d_nodes=100, bool remove_metadata=true); void setBlockNotSent(v3s16 p); @@ -387,29 +404,39 @@ class Server : public con::PeerHandler, public MapEventReceiver, void SendBlocks(float dtime); void fillMediaCache(); - void sendMediaAnnouncement(u16 peer_id); + void sendMediaAnnouncement(u16 peer_id, const std::string &lang_code); void sendRequestedMedia(u16 peer_id, - const std::list &tosend); + const std::vector &tosend); void sendDetachedInventory(const std::string &name, u16 peer_id); void sendDetachedInventories(u16 peer_id); // Adds a ParticleSpawner on peer with peer_id (PEER_ID_INEXISTENT == all) - void SendAddParticleSpawner(u16 peer_id, u16 amount, float spawntime, + void SendAddParticleSpawner(u16 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 vertical, std::string texture, u32 id); + bool collisiondetection, bool collision_removal, + u16 attached_id, + bool vertical, const std::string &texture, u32 id, + const struct TileAnimationParams &animation, u8 glow); void SendDeleteParticleSpawner(u16 peer_id, u32 id); // Spawns particle on peer with peer_id (PEER_ID_INEXISTENT == all) - void SendSpawnParticle(u16 peer_id, + void SendSpawnParticle(u16 peer_id, u16 protocol_version, v3f pos, v3f velocity, v3f acceleration, float expirationtime, float size, - bool collisiondetection, bool vertical, std::string texture); + bool collisiondetection, bool collision_removal, + bool vertical, const std::string &texture, + const struct TileAnimationParams &animation, u8 glow); + + u32 SendActiveObjectRemoveAdd(u16 peer_id, const std::string &datas); + void SendActiveObjectMessages(u16 peer_id, const std::string &datas, bool reliable = true); + void SendCSMFlavourLimits(u16 peer_id); /* Something random @@ -418,11 +445,20 @@ class Server : public con::PeerHandler, public MapEventReceiver, void DiePlayer(u16 peer_id); void RespawnPlayer(u16 peer_id); void DeleteClient(u16 peer_id, ClientDeletionReason reason); - void UpdateCrafting(u16 peer_id); + void UpdateCrafting(RemotePlayer *player); + + void handleChatInterfaceEvent(ChatEvent *evt); + + // This returns the answer to the sender of wmessage, or "" if there is none + std::wstring handleChat(const std::string &name, const std::wstring &wname, + std::wstring wmessage_input, + bool check_shout_priv = false, + RemotePlayer *player = NULL); + void handleAdminChat(const ChatEventChat *evt); // When called, connection mutex should be locked - RemoteClient* getClient(u16 peer_id,ClientState state_min=Active); - RemoteClient* getClientNoEx(u16 peer_id,ClientState state_min=Active); + RemoteClient* getClient(u16 peer_id,ClientState state_min=CS_Active); + RemoteClient* getClientNoEx(u16 peer_id,ClientState state_min=CS_Active); // When called, environment mutex should be locked std::string getPlayerName(u16 peer_id); @@ -435,7 +471,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, Call with env and con locked. */ - PlayerSAO *emergePlayer(const char *name, u16 peer_id); + PlayerSAO *emergePlayer(const char *name, u16 peer_id, u16 proto_version); void handlePeerChanges(); @@ -450,41 +486,40 @@ class Server : public con::PeerHandler, public MapEventReceiver, // If true, do not allow multiple players and hide some multiplayer // functionality bool m_simple_singleplayer_mode; + u16 m_max_chatmessage_length; + // For "dedicated" server list flag + bool m_dedicated; // Thread can set; step() will throw as ServerError MutexedVariable m_async_fatal_error; // Some timers - float m_liquid_transform_timer; - float m_liquid_transform_every; - float m_print_info_timer; - float m_masterserver_timer; - float m_objectdata_timer; - float m_emergethread_trigger_timer; - float m_savemap_timer; + float m_liquid_transform_timer = 0.0f; + float m_liquid_transform_every = 1.0f; + float m_masterserver_timer = 0.0f; + float m_emergethread_trigger_timer = 0.0f; + float m_savemap_timer = 0.0f; IntervalLimiter m_map_timer_and_unload_interval; // Environment - ServerEnvironment *m_env; - JMutex m_env_mutex; + ServerEnvironment *m_env = nullptr; // server connection - con::Connection m_con; + std::shared_ptr m_con; // Ban checking - BanManager *m_banmanager; + BanManager *m_banmanager = nullptr; // Rollback manager (behind m_env_mutex) - IRollbackManager *m_rollback; - bool m_rollback_sink_enabled; - bool m_enable_rollback_recording; // Updated once in a while + IRollbackManager *m_rollback = nullptr; + bool m_enable_rollback_recording = false; // Updated once in a while // Emerge manager - EmergeManager *m_emerge; + EmergeManager *m_emerge = nullptr; // Scripting // Envlock and conlock should be locked when using Lua - GameScripting *m_script; + ServerScripting *m_script = nullptr; // Item definition manager IWritableItemDefManager *m_itemdef; @@ -507,24 +542,23 @@ class Server : public con::PeerHandler, public MapEventReceiver, // A buffer for time steps // step() increments and AsyncRunStep() run by m_thread reads it. - float m_step_dtime; - JMutex m_step_dtime_mutex; + 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; + ServerThread *m_thread = nullptr; /* Time related stuff */ // Timer for sending time of day over network - float m_time_of_day_send_timer; + float m_time_of_day_send_timer = 0.0f; // Uptime of server in seconds MutexedVariable m_uptime; - /* Client interface */ @@ -535,16 +569,19 @@ class Server : public con::PeerHandler, public MapEventReceiver, Queues stuff from peerAdded() and deletingPeer() to handlePeerChanges() */ - Queue m_peer_change_queue; + std::queue m_peer_change_queue; /* Random stuff */ - // Mod parent directory paths - std::list m_modspaths; + bool m_shutdown_requested = false; + std::string m_shutdown_msg; + bool m_shutdown_ask_reconnect = false; + float m_shutdown_timer = 0.0f; - bool m_shutdown_requested; + ChatInterface *m_admin_chat; + std::string m_admin_nick; /* Map edit event queue. Automatically receives all map edits. @@ -559,13 +596,13 @@ class Server : public con::PeerHandler, public MapEventReceiver, Queue of map edits from the environment for sending to the clients This is behind m_env_mutex */ - Queue m_unsent_map_edit_queue; + 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; + 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 @@ -578,35 +615,36 @@ class Server : public con::PeerHandler, public MapEventReceiver, this peed id as the disabled recipient This is behind m_env_mutex */ - u16 m_ignore_map_edit_events_peer_id; + u16 m_ignore_map_edit_events_peer_id = 0; // media files known to server - std::map m_media; + std::unordered_map m_media; /* Sounds */ - std::map m_playing_sounds; - s32 m_next_sound_id; + 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; - /* - Particles - */ - std::vector m_particlespawner_ids; + 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; }; /* Runs a simple dedicated server loop. - Shuts down when run is set to false. + Shuts down when kill is set to true. */ -void dedicated_server_loop(Server &server, bool &run); - -#endif - +void dedicated_server_loop(Server &server, bool &kill);