LCOV - code coverage report
Current view: top level - src - server.h (source / functions) Hit Total Coverage
Test: report Lines: 0 37 0.0 %
Date: 2015-07-11 18:23:49 Functions: 0 25 0.0 %

          Line data    Source code
       1             : /*
       2             : Minetest
       3             : Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
       4             : 
       5             : This program is free software; you can redistribute it and/or modify
       6             : it under the terms of the GNU Lesser General Public License as published by
       7             : the Free Software Foundation; either version 2.1 of the License, or
       8             : (at your option) any later version.
       9             : 
      10             : This program is distributed in the hope that it will be useful,
      11             : but WITHOUT ANY WARRANTY; without even the implied warranty of
      12             : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      13             : GNU Lesser General Public License for more details.
      14             : 
      15             : You should have received a copy of the GNU Lesser General Public License along
      16             : with this program; if not, write to the Free Software Foundation, Inc.,
      17             : 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
      18             : */
      19             : 
      20             : #ifndef SERVER_HEADER
      21             : #define SERVER_HEADER
      22             : 
      23             : #include "network/connection.h"
      24             : #include "irr_v3d.h"
      25             : #include "map.h"
      26             : #include "hud.h"
      27             : #include "gamedef.h"
      28             : #include "serialization.h" // For SER_FMT_VER_INVALID
      29             : #include "mods.h"
      30             : #include "inventorymanager.h"
      31             : #include "subgame.h"
      32             : #include "util/numeric.h"
      33             : #include "util/thread.h"
      34             : #include "environment.h"
      35             : #include "clientiface.h"
      36             : #include "network/networkpacket.h"
      37             : #include <string>
      38             : #include <list>
      39             : #include <map>
      40             : #include <vector>
      41             : 
      42             : #define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")"
      43             : 
      44             : class IWritableItemDefManager;
      45             : class IWritableNodeDefManager;
      46             : class IWritableCraftDefManager;
      47             : class BanManager;
      48             : class EventManager;
      49             : class Inventory;
      50             : class Player;
      51             : class PlayerSAO;
      52             : class IRollbackManager;
      53             : struct RollbackAction;
      54             : class EmergeManager;
      55             : class GameScripting;
      56             : class ServerEnvironment;
      57             : struct SimpleSoundSpec;
      58             : class ServerThread;
      59             : 
      60             : enum ClientDeletionReason {
      61             :         CDR_LEAVE,
      62             :         CDR_TIMEOUT,
      63             :         CDR_DENY
      64             : };
      65             : 
      66             : class MapEditEventIgnorer
      67             : {
      68             : public:
      69             :         MapEditEventIgnorer(bool *flag):
      70             :                 m_flag(flag)
      71             :         {
      72             :                 if(*m_flag == false)
      73             :                         *m_flag = true;
      74             :                 else
      75             :                         m_flag = NULL;
      76             :         }
      77             : 
      78             :         ~MapEditEventIgnorer()
      79             :         {
      80             :                 if(m_flag)
      81             :                 {
      82             :                         assert(*m_flag);
      83             :                         *m_flag = false;
      84             :                 }
      85             :         }
      86             : 
      87             : private:
      88             :         bool *m_flag;
      89             : };
      90             : 
      91             : class MapEditEventAreaIgnorer
      92             : {
      93             : public:
      94           0 :         MapEditEventAreaIgnorer(VoxelArea *ignorevariable, const VoxelArea &a):
      95           0 :                 m_ignorevariable(ignorevariable)
      96             :         {
      97           0 :                 if(m_ignorevariable->getVolume() == 0)
      98           0 :                         *m_ignorevariable = a;
      99             :                 else
     100           0 :                         m_ignorevariable = NULL;
     101           0 :         }
     102             : 
     103           0 :         ~MapEditEventAreaIgnorer()
     104           0 :         {
     105           0 :                 if(m_ignorevariable)
     106             :                 {
     107             :                         assert(m_ignorevariable->getVolume() != 0);
     108           0 :                         *m_ignorevariable = VoxelArea();
     109             :                 }
     110           0 :         }
     111             : 
     112             : private:
     113             :         VoxelArea *m_ignorevariable;
     114             : };
     115             : 
     116           0 : struct MediaInfo
     117             : {
     118             :         std::string path;
     119             :         std::string sha1_digest;
     120             : 
     121           0 :         MediaInfo(const std::string &path_="",
     122             :                   const std::string &sha1_digest_=""):
     123             :                 path(path_),
     124           0 :                 sha1_digest(sha1_digest_)
     125             :         {
     126           0 :         }
     127             : };
     128             : 
     129           0 : struct ServerSoundParams
     130             : {
     131             :         float gain;
     132             :         std::string to_player;
     133             :         enum Type{
     134             :                 SSP_LOCAL=0,
     135             :                 SSP_POSITIONAL=1,
     136             :                 SSP_OBJECT=2
     137             :         } type;
     138             :         v3f pos;
     139             :         u16 object;
     140             :         float max_hear_distance;
     141             :         bool loop;
     142             : 
     143           0 :         ServerSoundParams():
     144             :                 gain(1.0),
     145             :                 to_player(""),
     146             :                 type(SSP_LOCAL),
     147             :                 pos(0,0,0),
     148             :                 object(0),
     149             :                 max_hear_distance(32*BS),
     150           0 :                 loop(false)
     151           0 :         {}
     152             : 
     153             :         v3f getPos(ServerEnvironment *env, bool *pos_exists) const;
     154             : };
     155             : 
     156           0 : struct ServerPlayingSound
     157             : {
     158             :         ServerSoundParams params;
     159             :         std::set<u16> clients; // peer ids
     160             : };
     161             : 
     162             : class Server : public con::PeerHandler, public MapEventReceiver,
     163             :                 public InventoryManager, public IGameDef
     164             : {
     165             : public:
     166             :         /*
     167             :                 NOTE: Every public method should be thread-safe
     168             :         */
     169             : 
     170             :         Server(
     171             :                 const std::string &path_world,
     172             :                 const SubgameSpec &gamespec,
     173             :                 bool simple_singleplayer_mode,
     174             :                 bool ipv6
     175             :         );
     176             :         ~Server();
     177             :         void start(Address bind_addr);
     178             :         void stop();
     179             :         // This is mainly a way to pass the time to the server.
     180             :         // Actual processing is done in an another thread.
     181             :         void step(float dtime);
     182             :         // This is run by ServerThread and does the actual processing
     183             :         void AsyncRunStep(bool initial_step=false);
     184             :         void Receive();
     185             :         PlayerSAO* StageTwoClientInit(u16 peer_id);
     186             : 
     187             :         /*
     188             :          * Command Handlers
     189             :          */
     190             : 
     191             :         void handleCommand(NetworkPacket* pkt);
     192             : 
     193           0 :         void handleCommand_Null(NetworkPacket* pkt) {};
     194             :         void handleCommand_Deprecated(NetworkPacket* pkt);
     195             :         void handleCommand_Init(NetworkPacket* pkt);
     196             :         void handleCommand_Init_Legacy(NetworkPacket* pkt);
     197             :         void handleCommand_Init2(NetworkPacket* pkt);
     198             :         void handleCommand_RequestMedia(NetworkPacket* pkt);
     199             :         void handleCommand_ReceivedMedia(NetworkPacket* pkt);
     200             :         void handleCommand_ClientReady(NetworkPacket* pkt);
     201             :         void handleCommand_GotBlocks(NetworkPacket* pkt);
     202             :         void handleCommand_PlayerPos(NetworkPacket* pkt);
     203             :         void handleCommand_DeletedBlocks(NetworkPacket* pkt);
     204             :         void handleCommand_InventoryAction(NetworkPacket* pkt);
     205             :         void handleCommand_ChatMessage(NetworkPacket* pkt);
     206             :         void handleCommand_Damage(NetworkPacket* pkt);
     207             :         void handleCommand_Breath(NetworkPacket* pkt);
     208             :         void handleCommand_Password(NetworkPacket* pkt);
     209             :         void handleCommand_PlayerItem(NetworkPacket* pkt);
     210             :         void handleCommand_Respawn(NetworkPacket* pkt);
     211             :         void handleCommand_Interact(NetworkPacket* pkt);
     212             :         void handleCommand_RemovedSounds(NetworkPacket* pkt);
     213             :         void handleCommand_NodeMetaFields(NetworkPacket* pkt);
     214             :         void handleCommand_InventoryFields(NetworkPacket* pkt);
     215             :         void handleCommand_FirstSrp(NetworkPacket* pkt);
     216             :         void handleCommand_SrpBytesA(NetworkPacket* pkt);
     217             :         void handleCommand_SrpBytesM(NetworkPacket* pkt);
     218             : 
     219             :         void ProcessData(NetworkPacket *pkt);
     220             : 
     221             :         void Send(NetworkPacket* pkt);
     222             : 
     223             :         // Environment must be locked when called
     224             :         void setTimeOfDay(u32 time);
     225             : 
     226             :         /*
     227             :                 Shall be called with the environment locked.
     228             :                 This is accessed by the map, which is inside the environment,
     229             :                 so it shouldn't be a problem.
     230             :         */
     231             :         void onMapEditEvent(MapEditEvent *event);
     232             : 
     233             :         /*
     234             :                 Shall be called with the environment and the connection locked.
     235             :         */
     236             :         Inventory* getInventory(const InventoryLocation &loc);
     237             :         void setInventoryModified(const InventoryLocation &loc, bool playerSend = true);
     238             : 
     239             :         // Connection must be locked when called
     240             :         std::wstring getStatusString();
     241             : 
     242             :         // read shutdown state
     243           0 :         inline bool getShutdownRequested()
     244           0 :                         { return m_shutdown_requested; }
     245             : 
     246             :         // request server to shutdown
     247           0 :         inline void requestShutdown(void)
     248           0 :                         { m_shutdown_requested = true; }
     249             : 
     250             :         // Returns -1 if failed, sound handle on success
     251             :         // Envlock
     252             :         s32 playSound(const SimpleSoundSpec &spec, const ServerSoundParams &params);
     253             :         void stopSound(s32 handle);
     254             : 
     255             :         // Envlock
     256             :         std::set<std::string> getPlayerEffectivePrivs(const std::string &name);
     257             :         bool checkPriv(const std::string &name, const std::string &priv);
     258             :         void reportPrivsModified(const std::string &name=""); // ""=all
     259             :         void reportInventoryFormspecModified(const std::string &name);
     260             : 
     261             :         void setIpBanned(const std::string &ip, const std::string &name);
     262             :         void unsetIpBanned(const std::string &ip_or_name);
     263             :         std::string getBanDescription(const std::string &ip_or_name);
     264             : 
     265             :         void notifyPlayer(const char *name, const std::wstring &msg);
     266             :         void notifyPlayers(const std::wstring &msg);
     267             :         void spawnParticle(const char *playername,
     268             :                 v3f pos, v3f velocity, v3f acceleration,
     269             :                 float expirationtime, float size,
     270             :                 bool collisiondetection, bool vertical, std::string texture);
     271             : 
     272             :         void spawnParticleAll(v3f pos, v3f velocity, v3f acceleration,
     273             :                 float expirationtime, float size,
     274             :                 bool collisiondetection, bool vertical, std::string texture);
     275             : 
     276             :         u32 addParticleSpawner(const char *playername,
     277             :                 u16 amount, float spawntime,
     278             :                 v3f minpos, v3f maxpos,
     279             :                 v3f minvel, v3f maxvel,
     280             :                 v3f minacc, v3f maxacc,
     281             :                 float minexptime, float maxexptime,
     282             :                 float minsize, float maxsize,
     283             :                 bool collisiondetection, bool vertical, std::string texture);
     284             : 
     285             :         u32 addParticleSpawnerAll(u16 amount, float spawntime,
     286             :                 v3f minpos, v3f maxpos,
     287             :                 v3f minvel, v3f maxvel,
     288             :                 v3f minacc, v3f maxacc,
     289             :                 float minexptime, float maxexptime,
     290             :                 float minsize, float maxsize,
     291             :                 bool collisiondetection, bool vertical, std::string texture);
     292             : 
     293             :         void deleteParticleSpawner(const char *playername, u32 id);
     294             :         void deleteParticleSpawnerAll(u32 id);
     295             : 
     296             :         // Creates or resets inventory
     297             :         Inventory* createDetachedInventory(const std::string &name);
     298             : 
     299             :         // Envlock and conlock should be locked when using scriptapi
     300           0 :         GameScripting *getScriptIface(){ return m_script; }
     301             : 
     302             :         // actions: time-reversed list
     303             :         // Return value: success/failure
     304             :         bool rollbackRevertActions(const std::list<RollbackAction> &actions,
     305             :                         std::list<std::string> *log);
     306             : 
     307             :         // IGameDef interface
     308             :         // Under envlock
     309             :         virtual IItemDefManager* getItemDefManager();
     310             :         virtual INodeDefManager* getNodeDefManager();
     311             :         virtual ICraftDefManager* getCraftDefManager();
     312             :         virtual ITextureSource* getTextureSource();
     313             :         virtual IShaderSource* getShaderSource();
     314             :         virtual u16 allocateUnknownNodeId(const std::string &name);
     315             :         virtual ISoundManager* getSoundManager();
     316             :         virtual MtEventManager* getEventManager();
     317             :         virtual scene::ISceneManager* getSceneManager();
     318           0 :         virtual IRollbackManager *getRollbackManager() { return m_rollback; }
     319           0 :         virtual EmergeManager *getEmergeManager() { return m_emerge; }
     320             : 
     321             :         IWritableItemDefManager* getWritableItemDefManager();
     322             :         IWritableNodeDefManager* getWritableNodeDefManager();
     323             :         IWritableCraftDefManager* getWritableCraftDefManager();
     324             : 
     325             :         const ModSpec* getModSpec(const std::string &modname) const;
     326             :         void getModNames(std::vector<std::string> &modlist);
     327             :         std::string getBuiltinLuaPath();
     328           0 :         inline std::string getWorldPath() const
     329           0 :                         { return m_path_world; }
     330             : 
     331           0 :         inline bool isSingleplayer()
     332           0 :                         { return m_simple_singleplayer_mode; }
     333             : 
     334           0 :         inline void setAsyncFatalError(const std::string &error)
     335           0 :                         { m_async_fatal_error.set(error); }
     336             : 
     337             :         bool showFormspec(const char *name, const std::string &formspec, const std::string &formname);
     338             :         Map & getMap() { return m_env->getMap(); }
     339             :         ServerEnvironment & getEnv() { return *m_env; }
     340             : 
     341             :         u32 hudAdd(Player *player, HudElement *element);
     342             :         bool hudRemove(Player *player, u32 id);
     343             :         bool hudChange(Player *player, u32 id, HudElementStat stat, void *value);
     344             :         bool hudSetFlags(Player *player, u32 flags, u32 mask);
     345             :         bool hudSetHotbarItemcount(Player *player, s32 hotbar_itemcount);
     346             :         s32 hudGetHotbarItemcount(Player *player);
     347             :         void hudSetHotbarImage(Player *player, std::string name);
     348             :         std::string hudGetHotbarImage(Player *player);
     349             :         void hudSetHotbarSelectedImage(Player *player, std::string name);
     350             :         std::string hudGetHotbarSelectedImage(Player *player);
     351             : 
     352           0 :         inline Address getPeerAddress(u16 peer_id)
     353           0 :                         { return m_con.GetPeerAddress(peer_id); }
     354             : 
     355             :         bool setLocalPlayerAnimations(Player *player, v2s32 animation_frames[4], f32 frame_speed);
     356             :         bool setPlayerEyeOffset(Player *player, v3f first, v3f third);
     357             : 
     358             :         bool setSky(Player *player, const video::SColor &bgcolor,
     359             :                         const std::string &type, const std::vector<std::string> &params);
     360             : 
     361             :         bool overrideDayNightRatio(Player *player, bool do_override,
     362             :                         float brightness);
     363             : 
     364             :         /* con::PeerHandler implementation. */
     365             :         void peerAdded(con::Peer *peer);
     366             :         void deletingPeer(con::Peer *peer, bool timeout);
     367             : 
     368             :         void DenySudoAccess(u16 peer_id);
     369             :         void DenyAccess(u16 peer_id, AccessDeniedCode reason, const std::string &custom_reason="");
     370             :         void acceptAuth(u16 peer_id, bool forSudoMode);
     371             :         void DenyAccess_Legacy(u16 peer_id, const std::wstring &reason);
     372             :         bool getClientConInfo(u16 peer_id, con::rtt_stat_type type,float* retval);
     373             :         bool getClientInfo(u16 peer_id,ClientState* state, u32* uptime,
     374             :                         u8* ser_vers, u16* prot_vers, u8* major, u8* minor, u8* patch,
     375             :                         std::string* vers_string);
     376             : 
     377           0 :         void SendPlayerHPOrDie(u16 peer_id, bool die) { die ? DiePlayer(peer_id) : SendPlayerHP(peer_id); }
     378             :         void SendPlayerBreath(u16 peer_id);
     379             :         void SendInventory(PlayerSAO* playerSAO);
     380             :         void SendMovePlayer(u16 peer_id);
     381             : 
     382             :         // Bind address
     383             :         Address m_bind_addr;
     384             : 
     385             : private:
     386             : 
     387             :         friend class EmergeThread;
     388             :         friend class RemoteClient;
     389             : 
     390             :         void SendMovement(u16 peer_id);
     391             :         void SendHP(u16 peer_id, u8 hp);
     392             :         void SendBreath(u16 peer_id, u16 breath);
     393             :         void SendAccessDenied(u16 peer_id, AccessDeniedCode reason, const std::string &custom_reason);
     394             :         void SendAccessDenied_Legacy(u16 peer_id, const std::wstring &reason);
     395             :         void SendDeathscreen(u16 peer_id,bool set_camera_point_target, v3f camera_point_target);
     396             :         void SendItemDef(u16 peer_id,IItemDefManager *itemdef, u16 protocol_version);
     397             :         void SendNodeDef(u16 peer_id,INodeDefManager *nodedef, u16 protocol_version);
     398             : 
     399             :         /* mark blocks not sent for all clients */
     400             :         void SetBlocksNotSent(std::map<v3s16, MapBlock *>& block);
     401             : 
     402             : 
     403             :         void SendChatMessage(u16 peer_id, const std::wstring &message);
     404             :         void SendTimeOfDay(u16 peer_id, u16 time, f32 time_speed);
     405             :         void SendPlayerHP(u16 peer_id);
     406             : 
     407             :         void SendLocalPlayerAnimations(u16 peer_id, v2s32 animation_frames[4], f32 animation_speed);
     408             :         void SendEyeOffset(u16 peer_id, v3f first, v3f third);
     409             :         void SendPlayerPrivileges(u16 peer_id);
     410             :         void SendPlayerInventoryFormspec(u16 peer_id);
     411             :         void SendShowFormspecMessage(u16 peer_id, const std::string &formspec, const std::string &formname);
     412             :         void SendHUDAdd(u16 peer_id, u32 id, HudElement *form);
     413             :         void SendHUDRemove(u16 peer_id, u32 id);
     414             :         void SendHUDChange(u16 peer_id, u32 id, HudElementStat stat, void *value);
     415             :         void SendHUDSetFlags(u16 peer_id, u32 flags, u32 mask);
     416             :         void SendHUDSetParam(u16 peer_id, u16 param, const std::string &value);
     417             :         void SendSetSky(u16 peer_id, const video::SColor &bgcolor,
     418             :                         const std::string &type, const std::vector<std::string> &params);
     419             :         void SendOverrideDayNightRatio(u16 peer_id, bool do_override, float ratio);
     420             : 
     421             :         /*
     422             :                 Send a node removal/addition event to all clients except ignore_id.
     423             :                 Additionally, if far_players!=NULL, players further away than
     424             :                 far_d_nodes are ignored and their peer_ids are added to far_players
     425             :         */
     426             :         // Envlock and conlock should be locked when calling these
     427             :         void sendRemoveNode(v3s16 p, u16 ignore_id=0,
     428             :                         std::vector<u16> *far_players=NULL, float far_d_nodes=100);
     429             :         void sendAddNode(v3s16 p, MapNode n, u16 ignore_id=0,
     430             :                         std::vector<u16> *far_players=NULL, float far_d_nodes=100,
     431             :                         bool remove_metadata=true);
     432             :         void setBlockNotSent(v3s16 p);
     433             : 
     434             :         // Environment and Connection must be locked when called
     435             :         void SendBlockNoLock(u16 peer_id, MapBlock *block, u8 ver, u16 net_proto_version);
     436             : 
     437             :         // Sends blocks to clients (locks env and con on its own)
     438             :         void SendBlocks(float dtime);
     439             : 
     440             :         void fillMediaCache();
     441             :         void sendMediaAnnouncement(u16 peer_id);
     442             :         void sendRequestedMedia(u16 peer_id,
     443             :                         const std::vector<std::string> &tosend);
     444             : 
     445             :         void sendDetachedInventory(const std::string &name, u16 peer_id);
     446             :         void sendDetachedInventories(u16 peer_id);
     447             : 
     448             :         // Adds a ParticleSpawner on peer with peer_id (PEER_ID_INEXISTENT == all)
     449             :         void SendAddParticleSpawner(u16 peer_id, u16 amount, float spawntime,
     450             :                 v3f minpos, v3f maxpos,
     451             :                 v3f minvel, v3f maxvel,
     452             :                 v3f minacc, v3f maxacc,
     453             :                 float minexptime, float maxexptime,
     454             :                 float minsize, float maxsize,
     455             :                 bool collisiondetection, bool vertical, std::string texture, u32 id);
     456             : 
     457             :         void SendDeleteParticleSpawner(u16 peer_id, u32 id);
     458             : 
     459             :         // Spawns particle on peer with peer_id (PEER_ID_INEXISTENT == all)
     460             :         void SendSpawnParticle(u16 peer_id,
     461             :                 v3f pos, v3f velocity, v3f acceleration,
     462             :                 float expirationtime, float size,
     463             :                 bool collisiondetection, bool vertical, std::string texture);
     464             : 
     465             :         u32 SendActiveObjectRemoveAdd(u16 peer_id, const std::string &datas);
     466             :         void SendActiveObjectMessages(u16 peer_id, const std::string &datas, bool reliable = true);
     467             :         /*
     468             :                 Something random
     469             :         */
     470             : 
     471             :         void DiePlayer(u16 peer_id);
     472             :         void RespawnPlayer(u16 peer_id);
     473             :         void DeleteClient(u16 peer_id, ClientDeletionReason reason);
     474             :         void UpdateCrafting(Player *player);
     475             : 
     476             :         v3f findSpawnPos();
     477             : 
     478             :         // When called, connection mutex should be locked
     479             :         RemoteClient* getClient(u16 peer_id,ClientState state_min=CS_Active);
     480             :         RemoteClient* getClientNoEx(u16 peer_id,ClientState state_min=CS_Active);
     481             : 
     482             :         // When called, environment mutex should be locked
     483             :         std::string getPlayerName(u16 peer_id);
     484             :         PlayerSAO* getPlayerSAO(u16 peer_id);
     485             : 
     486             :         /*
     487             :                 Get a player from memory or creates one.
     488             :                 If player is already connected, return NULL
     489             :                 Does not verify/modify auth info and password.
     490             : 
     491             :                 Call with env and con locked.
     492             :         */
     493             :         PlayerSAO *emergePlayer(const char *name, u16 peer_id);
     494             : 
     495             :         void handlePeerChanges();
     496             : 
     497             :         /*
     498             :                 Variables
     499             :         */
     500             : 
     501             :         // World directory
     502             :         std::string m_path_world;
     503             :         // Subgame specification
     504             :         SubgameSpec m_gamespec;
     505             :         // If true, do not allow multiple players and hide some multiplayer
     506             :         // functionality
     507             :         bool m_simple_singleplayer_mode;
     508             : 
     509             :         // Thread can set; step() will throw as ServerError
     510             :         MutexedVariable<std::string> m_async_fatal_error;
     511             : 
     512             :         // Some timers
     513             :         float m_liquid_transform_timer;
     514             :         float m_liquid_transform_every;
     515             :         float m_print_info_timer;
     516             :         float m_masterserver_timer;
     517             :         float m_objectdata_timer;
     518             :         float m_emergethread_trigger_timer;
     519             :         float m_savemap_timer;
     520             :         IntervalLimiter m_map_timer_and_unload_interval;
     521             : 
     522             :         // Environment
     523             :         ServerEnvironment *m_env;
     524             :         JMutex m_env_mutex;
     525             : 
     526             :         // server connection
     527             :         con::Connection m_con;
     528             : 
     529             :         // Ban checking
     530             :         BanManager *m_banmanager;
     531             : 
     532             :         // Rollback manager (behind m_env_mutex)
     533             :         IRollbackManager *m_rollback;
     534             :         bool m_enable_rollback_recording; // Updated once in a while
     535             : 
     536             :         // Emerge manager
     537             :         EmergeManager *m_emerge;
     538             : 
     539             :         // Scripting
     540             :         // Envlock and conlock should be locked when using Lua
     541             :         GameScripting *m_script;
     542             : 
     543             :         // Item definition manager
     544             :         IWritableItemDefManager *m_itemdef;
     545             : 
     546             :         // Node definition manager
     547             :         IWritableNodeDefManager *m_nodedef;
     548             : 
     549             :         // Craft definition manager
     550             :         IWritableCraftDefManager *m_craftdef;
     551             : 
     552             :         // Event manager
     553             :         EventManager *m_event;
     554             : 
     555             :         // Mods
     556             :         std::vector<ModSpec> m_mods;
     557             : 
     558             :         /*
     559             :                 Threads
     560             :         */
     561             : 
     562             :         // A buffer for time steps
     563             :         // step() increments and AsyncRunStep() run by m_thread reads it.
     564             :         float m_step_dtime;
     565             :         JMutex m_step_dtime_mutex;
     566             : 
     567             :         // current server step lag counter
     568             :         float m_lag;
     569             : 
     570             :         // The server mainly operates in this thread
     571             :         ServerThread *m_thread;
     572             : 
     573             :         /*
     574             :                 Time related stuff
     575             :         */
     576             : 
     577             :         // Timer for sending time of day over network
     578             :         float m_time_of_day_send_timer;
     579             :         // Uptime of server in seconds
     580             :         MutexedVariable<double> m_uptime;
     581             : 
     582             :         /*
     583             :          Client interface
     584             :          */
     585             :         ClientInterface m_clients;
     586             : 
     587             :         /*
     588             :                 Peer change queue.
     589             :                 Queues stuff from peerAdded() and deletingPeer() to
     590             :                 handlePeerChanges()
     591             :         */
     592             :         std::queue<con::PeerChange> m_peer_change_queue;
     593             : 
     594             :         /*
     595             :                 Random stuff
     596             :         */
     597             : 
     598             :         bool m_shutdown_requested;
     599             : 
     600             :         /*
     601             :                 Map edit event queue. Automatically receives all map edits.
     602             :                 The constructor of this class registers us to receive them through
     603             :                 onMapEditEvent
     604             : 
     605             :                 NOTE: Should these be moved to actually be members of
     606             :                 ServerEnvironment?
     607             :         */
     608             : 
     609             :         /*
     610             :                 Queue of map edits from the environment for sending to the clients
     611             :                 This is behind m_env_mutex
     612             :         */
     613             :         std::queue<MapEditEvent*> m_unsent_map_edit_queue;
     614             :         /*
     615             :                 Set to true when the server itself is modifying the map and does
     616             :                 all sending of information by itself.
     617             :                 This is behind m_env_mutex
     618             :         */
     619             :         bool m_ignore_map_edit_events;
     620             :         /*
     621             :                 If a non-empty area, map edit events contained within are left
     622             :                 unsent. Done at map generation time to speed up editing of the
     623             :                 generated area, as it will be sent anyway.
     624             :                 This is behind m_env_mutex
     625             :         */
     626             :         VoxelArea m_ignore_map_edit_events_area;
     627             :         /*
     628             :                 If set to !=0, the incoming MapEditEvents are modified to have
     629             :                 this peed id as the disabled recipient
     630             :                 This is behind m_env_mutex
     631             :         */
     632             :         u16 m_ignore_map_edit_events_peer_id;
     633             : 
     634             :         // media files known to server
     635             :         std::map<std::string,MediaInfo> m_media;
     636             : 
     637             :         /*
     638             :                 Sounds
     639             :         */
     640             :         std::map<s32, ServerPlayingSound> m_playing_sounds;
     641             :         s32 m_next_sound_id;
     642             : 
     643             :         /*
     644             :                 Detached inventories (behind m_env_mutex)
     645             :         */
     646             :         // key = name
     647             :         std::map<std::string, Inventory*> m_detached_inventories;
     648             : 
     649             :         /*
     650             :                 Particles
     651             :         */
     652             :         std::vector<u32> m_particlespawner_ids;
     653             : };
     654             : 
     655             : /*
     656             :         Runs a simple dedicated server loop.
     657             : 
     658             :         Shuts down when run is set to false.
     659             : */
     660             : void dedicated_server_loop(Server &server, bool &run);
     661             : 
     662             : #endif
     663             : 

Generated by: LCOV version 1.11