Fix a crash or random memory leak when reseting saved environment variable in test_se...
[oweals/minetest.git] / src / server.h
index 551bd27878ae9ebb43f1f6f9383caee7eda99826..b0f65980d670ae69e747db2299395dfb5a09a3a2 100644 (file)
@@ -45,11 +45,12 @@ class ChatEvent;
 struct ChatEventChat;
 struct ChatInterface;
 class IWritableItemDefManager;
-class IWritableNodeDefManager;
+class NodeDefManager;
 class IWritableCraftDefManager;
 class BanManager;
 class EventManager;
 class Inventory;
+class ModChannelMgr;
 class RemotePlayer;
 class PlayerSAO;
 class IRollbackManager;
@@ -58,7 +59,9 @@ class EmergeManager;
 class ServerScripting;
 class ServerEnvironment;
 struct SimpleSoundSpec;
+struct CloudParams;
 class ServerThread;
+class ServerModManager;
 
 enum ClientDeletionReason {
        CDR_LEAVE,
@@ -102,7 +105,7 @@ struct ServerPlayingSound
 {
        ServerSoundParams params;
        SimpleSoundSpec spec;
-       std::unordered_set<u16> clients; // peer ids
+       std::unordered_set<session_t> clients; // peer ids
 };
 
 class Server : public con::PeerHandler, public MapEventReceiver,
@@ -117,14 +120,14 @@ public:
                const std::string &path_world,
                const SubgameSpec &gamespec,
                bool simple_singleplayer_mode,
-               bool ipv6,
+               Address bind_addr,
                bool dedicated,
                ChatInterface *iface = nullptr
        );
        ~Server();
        DISABLE_CLASS_COPY(Server);
 
-       void start(Address bind_addr);
+       void start();
        void stop();
        // This is mainly a way to pass the time to the server.
        // Actual processing is done in an another thread.
@@ -132,7 +135,7 @@ public:
        // This is run by ServerThread and does the actual processing
        void AsyncRunStep(bool initial_step=false);
        void Receive();
-       PlayerSAO* StageTwoClientInit(u16 peer_id);
+       PlayerSAO* StageTwoClientInit(session_t peer_id);
 
        /*
         * Command Handlers
@@ -144,6 +147,9 @@ public:
        void handleCommand_Deprecated(NetworkPacket* pkt);
        void handleCommand_Init(NetworkPacket* pkt);
        void handleCommand_Init2(NetworkPacket* pkt);
+       void handleCommand_ModChannelJoin(NetworkPacket *pkt);
+       void handleCommand_ModChannelLeave(NetworkPacket *pkt);
+       void handleCommand_ModChannelMsg(NetworkPacket *pkt);
        void handleCommand_RequestMedia(NetworkPacket* pkt);
        void handleCommand_ClientReady(NetworkPacket* pkt);
        void handleCommand_GotBlocks(NetworkPacket* pkt);
@@ -165,7 +171,8 @@ public:
 
        void ProcessData(NetworkPacket *pkt);
 
-       void Send(NetworkPacket* pkt);
+       void Send(NetworkPacket *pkt);
+       void Send(session_t peer_id, NetworkPacket *pkt);
 
        // Helper for handleCommand_PlayerPos and handleCommand_Interact
        void process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao,
@@ -251,7 +258,7 @@ public:
        // IGameDef interface
        // Under envlock
        virtual IItemDefManager* getItemDefManager();
-       virtual INodeDefManager* getNodeDefManager();
+       virtual const NodeDefManager* getNodeDefManager();
        virtual ICraftDefManager* getCraftDefManager();
        virtual u16 allocateUnknownNodeId(const std::string &name);
        virtual MtEventManager* getEventManager();
@@ -259,10 +266,10 @@ public:
        virtual EmergeManager *getEmergeManager() { return m_emerge; }
 
        IWritableItemDefManager* getWritableItemDefManager();
-       IWritableNodeDefManager* getWritableNodeDefManager();
+       NodeDefManager* getWritableNodeDefManager();
        IWritableCraftDefManager* getWritableCraftDefManager();
 
-       virtual const std::vector<ModSpec> &getMods() const { return m_mods; }
+       virtual const std::vector<ModSpec> &getMods() const;
        virtual const ModSpec* getModSpec(const std::string &modname) const;
        void getModNames(std::vector<std::string> &modlist);
        std::string getBuiltinLuaPath();
@@ -285,27 +292,19 @@ public:
        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);
+       Address getPeerAddress(session_t peer_id);
 
-       bool setLocalPlayerAnimations(RemotePlayer *player, v2s32 animation_frames[4],
+       void setLocalPlayerAnimations(RemotePlayer *player, v2s32 animation_frames[4],
                        f32 frame_speed);
-       bool setPlayerEyeOffset(RemotePlayer *player, v3f first, v3f third);
+       void setPlayerEyeOffset(RemotePlayer *player, const v3f &first, const v3f &third);
 
-       bool setSky(RemotePlayer *player, const video::SColor &bgcolor,
+       void setSky(RemotePlayer *player, const video::SColor &bgcolor,
                        const std::string &type, const std::vector<std::string> &params,
                        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);
+       void setClouds(RemotePlayer *player, const CloudParams &params);
 
        bool overrideDayNightRatio(RemotePlayer *player, bool do_override, float brightness);
 
@@ -313,14 +312,16 @@ public:
        void peerAdded(con::Peer *peer);
        void deletingPeer(con::Peer *peer, bool timeout);
 
-       void DenySudoAccess(u16 peer_id);
-       void DenyAccessVerCompliant(u16 peer_id, u16 proto_ver, AccessDeniedCode reason,
+       void DenySudoAccess(session_t peer_id);
+       void DenyAccessVerCompliant(session_t 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,
+       void DenyAccess(session_t peer_id, AccessDeniedCode reason,
+               const std::string &custom_reason = "");
+       void acceptAuth(session_t peer_id, bool forSudoMode);
+       void DenyAccess_Legacy(session_t peer_id, const std::wstring &reason);
+       void DisconnectPeer(session_t peer_id);
+       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);
 
@@ -329,11 +330,16 @@ public:
        void SendPlayerHPOrDie(PlayerSAO *player);
        void SendPlayerBreath(PlayerSAO *sao);
        void SendInventory(PlayerSAO* playerSAO);
-       void SendMovePlayer(u16 peer_id);
+       void SendMovePlayer(session_t peer_id);
 
        virtual bool registerModStorage(ModMetadata *storage);
        virtual void unregisterModStorage(const std::string &name);
 
+       bool joinModChannel(const std::string &channel);
+       bool leaveModChannel(const std::string &channel);
+       bool sendModChannelMessage(const std::string &channel, const std::string &message);
+       ModChannel *getModChannel(const std::string &channel);
+
        // Bind address
        Address m_bind_addr;
 
@@ -345,44 +351,45 @@ private:
        friend class EmergeThread;
        friend class RemoteClient;
 
-       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,
+       void SendMovement(session_t peer_id);
+       void SendHP(session_t peer_id, u16 hp);
+       void SendBreath(session_t peer_id, u16 breath);
+       void SendAccessDenied(session_t 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);
+       void SendAccessDenied_Legacy(session_t peer_id, const std::wstring &reason);
+       void SendDeathscreen(session_t peer_id, bool set_camera_point_target,
+               v3f camera_point_target);
+       void SendItemDef(session_t peer_id, IItemDefManager *itemdef, u16 protocol_version);
+       void SendNodeDef(session_t peer_id, const NodeDefManager *nodedef,
+               u16 protocol_version);
 
        /* mark blocks not sent for all clients */
        void SetBlocksNotSent(std::map<v3s16, MapBlock *>& 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 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,
+       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);
+
+       void SendLocalPlayerAnimations(session_t peer_id, v2s32 animation_frames[4],
+               f32 animation_speed);
+       void SendEyeOffset(session_t peer_id, v3f first, v3f third);
+       void SendPlayerPrivileges(session_t peer_id);
+       void SendPlayerInventoryFormspec(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);
+       void SendHUDRemove(session_t peer_id, u32 id);
+       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<std::string> &params,
                        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);
+       void SendCloudParams(session_t peer_id, const CloudParams &params);
+       void SendOverrideDayNightRatio(session_t peer_id, bool do_override, float ratio);
+       void broadcastModChannelMessage(const std::string &channel,
+                       const std::string &message, session_t from_peer);
 
        /*
                Send a node removal/addition event to all clients except ignore_id.
@@ -395,24 +402,23 @@ private:
        void sendAddNode(v3s16 p, MapNode n, u16 ignore_id=0,
                        std::vector<u16> *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, u16 net_proto_version);
+       void SendBlockNoLock(session_t 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, const std::string &lang_code);
-       void sendRequestedMedia(u16 peer_id,
+       void sendMediaAnnouncement(session_t peer_id, const std::string &lang_code);
+       void sendRequestedMedia(session_t peer_id,
                        const std::vector<std::string> &tosend);
 
-       void sendDetachedInventory(const std::string &name, u16 peer_id);
-       void sendDetachedInventories(u16 peer_id);
+       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(u16 peer_id, u16 protocol_version,
+       void SendAddParticleSpawner(session_t peer_id, u16 protocol_version,
                u16 amount, float spawntime,
                v3f minpos, v3f maxpos,
                v3f minvel, v3f maxvel,
@@ -424,28 +430,30 @@ private:
                bool vertical, const std::string &texture, u32 id,
                const struct TileAnimationParams &animation, u8 glow);
 
-       void SendDeleteParticleSpawner(u16 peer_id, u32 id);
+       void SendDeleteParticleSpawner(session_t peer_id, u32 id);
 
        // Spawns particle on peer with peer_id (PEER_ID_INEXISTENT == all)
-       void SendSpawnParticle(u16 peer_id, u16 protocol_version,
+       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);
 
-       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);
+       u32 SendActiveObjectRemoveAdd(session_t peer_id, const std::string &datas);
+       void SendActiveObjectMessages(session_t peer_id, const std::string &datas,
+               bool reliable = true);
+       void SendCSMFlavourLimits(session_t peer_id);
 
        /*
                Something random
        */
 
-       void DiePlayer(u16 peer_id);
-       void RespawnPlayer(u16 peer_id);
-       void DeleteClient(u16 peer_id, ClientDeletionReason reason);
+       void DiePlayer(session_t peer_id);
+       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);
 
        void handleChatInterfaceEvent(ChatEvent *evt);
 
@@ -457,12 +465,12 @@ private:
        void handleAdminChat(const ChatEventChat *evt);
 
        // When called, connection mutex should be locked
-       RemoteClient* getClient(u16 peer_id,ClientState state_min=CS_Active);
-       RemoteClient* getClientNoEx(u16 peer_id,ClientState state_min=CS_Active);
+       RemoteClient* getClient(session_t peer_id, ClientState state_min = CS_Active);
+       RemoteClient* getClientNoEx(session_t peer_id, ClientState state_min = CS_Active);
 
        // When called, environment mutex should be locked
-       std::string getPlayerName(u16 peer_id);
-       PlayerSAO* getPlayerSAO(u16 peer_id);
+       std::string getPlayerName(session_t peer_id);
+       PlayerSAO *getPlayerSAO(session_t peer_id);
 
        /*
                Get a player from memory or creates one.
@@ -471,7 +479,7 @@ private:
 
                Call with env and con locked.
        */
-       PlayerSAO *emergePlayer(const char *name, u16 peer_id, u16 proto_version);
+       PlayerSAO *emergePlayer(const char *name, session_t peer_id, u16 proto_version);
 
        void handlePeerChanges();
 
@@ -512,7 +520,6 @@ private:
 
        // 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;
@@ -525,7 +532,7 @@ private:
        IWritableItemDefManager *m_itemdef;
 
        // Node definition manager
-       IWritableNodeDefManager *m_nodedef;
+       NodeDefManager *m_nodedef;
 
        // Craft definition manager
        IWritableCraftDefManager *m_craftdef;
@@ -534,7 +541,7 @@ private:
        EventManager *m_event;
 
        // Mods
-       std::vector<ModSpec> m_mods;
+       std::unique_ptr<ServerModManager> m_modmgr;
 
        /*
                Threads
@@ -571,6 +578,8 @@ private:
        */
        std::queue<con::PeerChange> m_peer_change_queue;
 
+       std::unordered_map<session_t, std::string> m_formspec_state_data;
+
        /*
                Random stuff
        */
@@ -610,12 +619,6 @@ private:
                This is behind m_env_mutex
        */
        VoxelArea m_ignore_map_edit_events_area;
-       /*
-               If set to !=0, the incoming MapEditEvents are modified to have
-               this peed id as the disabled recipient
-               This is behind m_env_mutex
-       */
-       u16 m_ignore_map_edit_events_peer_id = 0;
 
        // media files known to server
        std::unordered_map<std::string, MediaInfo> m_media;
@@ -640,6 +643,9 @@ private:
        // CSM flavour limits byteflag
        u64 m_csm_flavour_limits = CSMFlavourLimit::CSM_FL_NONE;
        u32 m_csm_noderange_limit = 8;
+
+       // ModChannel manager
+       std::unique_ptr<ModChannelMgr> m_modchannel_mgr;
 };
 
 /*