X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fserver.h;h=e493c5ea985eeedc73047102709f480b491bac77;hb=ee9a442ecc26f2623a1b085344d37636342973eb;hp=abe466b16f957e042810ff0f7d62aa03d4475f69;hpb=52122c342d335a2561ace87c9d8deaa16a136604;p=dragonfireclient.git diff --git a/src/server.h b/src/server.h index abe466b16..551bd2787 100644 --- a/src/server.h +++ b/src/server.h @@ -1,264 +1,69 @@ /* -Minetest-c55 -Copyright (C) 2010-2011 celeron55, Perttu Ahola +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. +GNU Lesser General Public License for more details. -You should have received a copy of the GNU General Public License along +You should have received a copy of the GNU Lesser General Public License along 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 "environment.h" -#include "common_irrlicht.h" -#include -#include "porting.h" +#include "irr_v3d.h" #include "map.h" -#include "inventory.h" -#include "ban.h" +#include "hud.h" #include "gamedef.h" #include "serialization.h" // For SER_FMT_VER_INVALID #include "mods.h" #include "inventorymanager.h" #include "subgame.h" -#include "sound.h" -struct LuaState; -typedef struct lua_State lua_State; +#include "tileanimation.h" // struct TileAnimationParams +#include "network/peerhandler.h" +#include "network/address.h" +#include "util/numeric.h" +#include "util/thread.h" +#include "util/basic_macros.h" +#include "serverenvironment.h" +#include "clientiface.h" +#include "chatmessage.h" +#include +#include +#include +#include + +class ChatEvent; +struct ChatEventChat; +struct ChatInterface; class IWritableItemDefManager; class IWritableNodeDefManager; class IWritableCraftDefManager; +class BanManager; class EventManager; +class Inventory; +class RemotePlayer; class PlayerSAO; - -class ServerError : public std::exception -{ -public: - ServerError(const std::string &s) - { - m_s = "ServerError: "; - m_s += s; - } - virtual ~ServerError() throw() - {} - virtual const char * what() const throw() - { - return m_s.c_str(); - } - std::string m_s; -}; - -/* - Some random functions -*/ -v3f findSpawnPos(ServerMap &map); - -/* - A structure containing the data needed for queueing the fetching - of blocks. -*/ -struct QueuedBlockEmerge -{ - v3s16 pos; - // key = peer_id, value = flags - core::map peer_ids; -}; - -/* - This is a thread-safe class. -*/ -class BlockEmergeQueue -{ -public: - BlockEmergeQueue() - { - m_mutex.Init(); - } - - ~BlockEmergeQueue() - { - JMutexAutoLock lock(m_mutex); - - core::list::Iterator i; - for(i=m_queue.begin(); i!=m_queue.end(); i++) - { - QueuedBlockEmerge *q = *i; - delete q; - } - } - - /* - peer_id=0 adds with nobody to send to - */ - void addBlock(u16 peer_id, v3s16 pos, u8 flags) - { - DSTACK(__FUNCTION_NAME); - - JMutexAutoLock lock(m_mutex); - - if(peer_id != 0) - { - /* - Find if block is already in queue. - If it is, update the peer to it and quit. - */ - core::list::Iterator i; - for(i=m_queue.begin(); i!=m_queue.end(); i++) - { - QueuedBlockEmerge *q = *i; - if(q->pos == pos) - { - q->peer_ids[peer_id] = flags; - return; - } - } - } - - /* - Add the block - */ - QueuedBlockEmerge *q = new QueuedBlockEmerge; - q->pos = pos; - if(peer_id != 0) - q->peer_ids[peer_id] = flags; - m_queue.push_back(q); - } - - // Returned pointer must be deleted - // Returns NULL if queue is empty - QueuedBlockEmerge * pop() - { - JMutexAutoLock lock(m_mutex); - - core::list::Iterator i = m_queue.begin(); - if(i == m_queue.end()) - return NULL; - QueuedBlockEmerge *q = *i; - m_queue.erase(i); - return q; - } - - u32 size() - { - JMutexAutoLock lock(m_mutex); - return m_queue.size(); - } - - u32 peerItemCount(u16 peer_id) - { - JMutexAutoLock lock(m_mutex); - - u32 count = 0; - - core::list::Iterator i; - for(i=m_queue.begin(); i!=m_queue.end(); i++) - { - QueuedBlockEmerge *q = *i; - if(q->peer_ids.find(peer_id) != NULL) - count++; - } - - return count; - } - -private: - core::list m_queue; - JMutex m_mutex; -}; - -class Server; - -class ServerThread : public SimpleThread -{ - Server *m_server; - -public: - - ServerThread(Server *server): - SimpleThread(), - m_server(server) - { - } - - void * Thread(); -}; - -class EmergeThread : public SimpleThread -{ - Server *m_server; - -public: - - EmergeThread(Server *server): - SimpleThread(), - m_server(server) - { - } - - void * Thread(); - - void trigger() - { - setRun(true); - if(IsRunning() == false) - { - Start(); - } - } -}; - -struct PlayerInfo -{ - u16 id; - char name[PLAYERNAME_SIZE]; - v3f position; - Address address; - float avg_rtt; - - PlayerInfo(); - void PrintLine(std::ostream *s); -}; - -/* - Used for queueing and sorting block transfers in containers - - Lower priority number means higher priority. -*/ -struct PrioritySortedBlockTransfer -{ - PrioritySortedBlockTransfer(float a_priority, v3s16 a_pos, u16 a_peer_id) - { - priority = a_priority; - pos = a_pos; - peer_id = a_peer_id; - } - bool operator < (PrioritySortedBlockTransfer &other) - { - return priority < other.priority; - } - float priority; - v3s16 pos; - u16 peer_id; -}; - -struct MediaRequest -{ - std::string name; - - MediaRequest(const std::string &name_=""): - name(name_) - {} +class IRollbackManager; +struct RollbackAction; +class EmergeManager; +class ServerScripting; +class ServerEnvironment; +struct SimpleSoundSpec; +class ServerThread; + +enum ClientDeletionReason { + CDR_LEAVE, + CDR_TIMEOUT, + CDR_DENY }; struct MediaInfo @@ -266,8 +71,8 @@ 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_) { @@ -276,202 +81,100 @@ 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; }; struct ServerPlayingSound { ServerSoundParams params; - std::set clients; // peer ids -}; - -class RemoteClient -{ -public: - // peer_id=0 means this client has no associated peer - // NOTE: If client is made allowed to exist while peer doesn't, - // this has to be set to 0 when there is no peer. - // Also, the client must be moved to some other container. - u16 peer_id; - // The serialization version to use with the client - u8 serialization_version; - // - u16 net_proto_version; - // Version is stored in here after INIT before INIT2 - u8 pending_serialization_version; - - bool definitions_sent; - - RemoteClient(): - m_time_from_building(9999), - m_excess_gotblocks(0) - { - peer_id = 0; - serialization_version = SER_FMT_VER_INVALID; - net_proto_version = 0; - pending_serialization_version = SER_FMT_VER_INVALID; - definitions_sent = false; - m_nearest_unsent_d = 0; - m_nearest_unsent_reset_timer = 0.0; - m_nothing_to_send_counter = 0; - m_nothing_to_send_pause_timer = 0; - } - ~RemoteClient() - { - } - - /* - Finds block that should be sent next to the client. - Environment should be locked when this is called. - dtime is used for resetting send radius at slow interval - */ - void GetNextBlocks(Server *server, float dtime, - core::array &dest); - - void GotBlock(v3s16 p); - - void SentBlock(v3s16 p); - - void SetBlockNotSent(v3s16 p); - void SetBlocksNotSent(core::map &blocks); - - s32 SendingCount() - { - return m_blocks_sending.size(); - } - - // Increments timeouts and removes timed-out blocks from list - // NOTE: This doesn't fix the server-not-sending-block bug - // because it is related to emerging, not sending. - //void RunSendingTimeouts(float dtime, float timeout); - - void PrintInfo(std::ostream &o) - { - o<<"RemoteClient "< &actions, + std::list *log); - // Saves g_settings to configpath given at initialization - void saveConfig(); - - void setIpBanned(const std::string &ip, const std::string &name) - { - m_banmanager.add(ip, name); - return; - } - - void unsetIpBanned(const std::string &ip_or_name) - { - m_banmanager.remove(ip_or_name); - return; - } - - std::string getBanDescription(const std::string &ip_or_name) - { - return m_banmanager.getBanDescription(ip_or_name); - } - - Address getPeerAddress(u16 peer_id) - { - return m_con.GetPeerAddress(peer_id); - } - - // Envlock and conlock should be locked when calling this - void notifyPlayer(const char *name, const std::wstring msg); - void notifyPlayers(const std::wstring msg); - - void queueBlockEmerge(v3s16 blockpos, bool allow_generate); - - // Envlock and conlock should be locked when using Lua - lua_State *getLua(){ return m_lua; } - // IGameDef interface // Under envlock virtual IItemDefManager* getItemDefManager(); virtual INodeDefManager* getNodeDefManager(); virtual ICraftDefManager* getCraftDefManager(); - virtual ITextureSource* getTextureSource(); virtual u16 allocateUnknownNodeId(const std::string &name); - virtual ISoundManager* getSoundManager(); virtual MtEventManager* getEventManager(); - + IRollbackManager *getRollbackManager() { return m_rollback; } + virtual EmergeManager *getEmergeManager() { return m_emerge; } + IWritableItemDefManager* getWritableItemDefManager(); IWritableNodeDefManager* getWritableNodeDefManager(); IWritableCraftDefManager* getWritableCraftDefManager(); - const ModSpec* getModSpec(const std::string &modname); - - std::string getWorldPath(){ return m_path_world; } + 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(); + virtual std::string getWorldPath() const { return m_path_world; } + virtual std::string getModStoragePath() const; + + inline bool isSingleplayer() + { return m_simple_singleplayer_mode; } + + inline void setAsyncFatalError(const std::string &error) + { m_async_fatal_error.set(error); } + + bool showFormspec(const char *name, const std::string &formspec, const std::string &formname); + Map & getMap() { return m_env->getMap(); } + ServerEnvironment & getEnv() { return *m_env; } + 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); - bool isSingleplayer(){ return m_simple_singleplayer_mode; } + 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); - void setAsyncFatalError(const std::string &error) - { - m_async_fatal_error.set(error); - } + 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: - // con::PeerHandler implementation. - // These queue stuff to be processed by handlePeerChanges(). - // As of now, these create and remove clients and players. - void peerAdded(con::Peer *peer); - void deletingPeer(con::Peer *peer, bool timeout); - - /* - Static send methods - */ - - static void SendHP(con::Connection &con, u16 peer_id, u8 hp); - static void SendAccessDenied(con::Connection &con, u16 peer_id, - const std::wstring &reason); - static void SendDeathscreen(con::Connection &con, u16 peer_id, - bool set_camera_point_target, v3f camera_point_target); - static void SendItemDef(con::Connection &con, u16 peer_id, - IItemDefManager *itemdef); - static void SendNodeDef(con::Connection &con, u16 peer_id, - INodeDefManager *nodedef); - - /* - Non-static send methods. - Conlock should be always used. - Envlock usage is documented badly but it's easy to figure out - which ones access the environment. - */ + friend class EmergeThread; + friend class RemoteClient; - // Envlock and conlock should be locked when calling these - void SendInventory(u16 peer_id); - void SendChatMessage(u16 peer_id, const std::wstring &message); - void BroadcastChatMessage(const std::wstring &message); + void SendMovement(u16 peer_id); + void SendHP(u16 peer_id, u16 hp); + void SendBreath(u16 peer_id, u16 breath); + 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); + + /* mark blocks not sent for all clients */ + void SetBlocksNotSent(std::map& block); + + + void SendChatMessage(u16 peer_id, const ChatMessage &message); + void SendTimeOfDay(u16 peer_id, u16 time, f32 time_speed); void SendPlayerHP(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 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, + 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 @@ -606,51 +391,78 @@ class Server : public con::PeerHandler, public MapEventReceiver, */ // Envlock and conlock should be locked when calling these void sendRemoveNode(v3s16 p, u16 ignore_id=0, - core::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, - core::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); - + // Environment and Connection must be locked when called - void SendBlockNoLock(u16 peer_id, MapBlock *block, u8 ver); - + void SendBlockNoLock(u16 peer_id, MapBlock *block, u8 ver, u16 net_proto_version); + // Sends blocks to clients (locks env and con on its own) 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 core::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 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); + + void SendDeleteParticleSpawner(u16 peer_id, u32 id); + + // Spawns particle on peer with peer_id (PEER_ID_INEXISTENT == all) + void SendSpawnParticle(u16 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); + + 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 */ - + void DiePlayer(u16 peer_id); void RespawnPlayer(u16 peer_id); - - void UpdateCrafting(u16 peer_id); - + void DeleteClient(u16 peer_id, ClientDeletionReason reason); + 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); - - // When called, environment mutex should be locked - std::string getPlayerName(u16 peer_id) - { - Player *player = m_env->getPlayer(peer_id); - if(player == NULL) - return "[id="+itos(peer_id)+"]"; - return player->getName(); - } + 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 - PlayerSAO* getPlayerSAO(u16 peer_id) - { - Player *player = m_env->getPlayer(peer_id); - if(player == NULL) - return NULL; - return player->getPlayerSAO(); - } + std::string getPlayerName(u16 peer_id); + PlayerSAO* getPlayerSAO(u16 peer_id); /* Get a player from memory or creates one. @@ -659,124 +471,117 @@ class Server : public con::PeerHandler, public MapEventReceiver, Call with env and con locked. */ - PlayerSAO *emergePlayer(const char *name, u16 peer_id); - - // Locks environment and connection by its own - struct PeerChange; - void handlePeerChange(PeerChange &c); + PlayerSAO *emergePlayer(const char *name, u16 peer_id, u16 proto_version); + void handlePeerChanges(); /* Variables */ - + // World directory std::string m_path_world; - // Path to user's configuration file ("" = no configuration file) - std::string m_path_config; // Subgame specification SubgameSpec m_gamespec; // 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_print_info_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; - - // NOTE: If connection and environment are both to be locked, - // environment shall be locked first. // Environment - ServerEnvironment *m_env; - JMutex m_env_mutex; - - // Connection - con::Connection m_con; - JMutex m_con_mutex; - // Connected clients (behind the con mutex) - core::map m_clients; - - // Bann checking - BanManager m_banmanager; + ServerEnvironment *m_env = nullptr; + + // server connection + std::shared_ptr m_con; + + // Ban checking + BanManager *m_banmanager = nullptr; + + // Rollback manager (behind m_env_mutex) + IRollbackManager *m_rollback = nullptr; + bool m_enable_rollback_recording = false; // Updated once in a while + + // Emerge manager + EmergeManager *m_emerge = nullptr; // Scripting // Envlock and conlock should be locked when using Lua - lua_State *m_lua; + ServerScripting *m_script = nullptr; // Item definition manager IWritableItemDefManager *m_itemdef; - + // Node definition manager IWritableNodeDefManager *m_nodedef; - + // Craft definition manager IWritableCraftDefManager *m_craftdef; - + // Event manager EventManager *m_event; - + // Mods - core::list m_mods; - + std::vector m_mods; + /* Threads */ - + // 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; - // This thread fetches and generates map - EmergeThread m_emergethread; - // Queue of block coordinates to be processed by the emerge thread - BlockEmergeQueue m_emerge_queue; - + 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 + */ + ClientInterface m_clients; + /* Peer change queue. Queues stuff from peerAdded() and deletingPeer() to handlePeerChanges() */ - enum PeerChangeType - { - PEER_ADDED, - PEER_REMOVED - }; - struct PeerChange - { - PeerChangeType type; - u16 peer_id; - bool timeout; - }; - Queue m_peer_change_queue; + std::queue m_peer_change_queue; /* Random stuff */ - - // Mod parent directory paths - core::list m_modspaths; - bool m_shutdown_requested; + bool m_shutdown_requested = false; + std::string m_shutdown_msg; + bool m_shutdown_ask_reconnect = false; + float m_shutdown_timer = 0.0f; + + ChatInterface *m_admin_chat; + std::string m_admin_nick; /* Map edit event queue. Automatically receives all map edits. @@ -791,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 @@ -810,26 +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; - - friend class EmergeThread; - friend class RemoteClient; + u16 m_ignore_map_edit_events_peer_id = 0; - std::map m_media; + // media files known to server + 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; + + 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);