Fix Android build, but there is a remaining linking issue in guiConfirmRegistration
[oweals/minetest.git] / src / server.h
index ab1660bf2ef1aa9146990b24b7c2d52413638c79..b9097120009329d132f0d2c536adca734621711f 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,6 +59,7 @@ class EmergeManager;
 class ServerScripting;
 class ServerEnvironment;
 struct SimpleSoundSpec;
+struct CloudParams;
 class ServerThread;
 
 enum ClientDeletionReason {
@@ -102,7 +104,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 +119,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 +134,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
@@ -143,8 +145,10 @@ public:
        void handleCommand_Null(NetworkPacket* pkt) {};
        void handleCommand_Deprecated(NetworkPacket* pkt);
        void handleCommand_Init(NetworkPacket* pkt);
-       void handleCommand_Init_Legacy(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);
@@ -166,7 +170,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,
@@ -252,7 +257,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();
@@ -260,7 +265,7 @@ 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; }
@@ -286,27 +291,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);
 
@@ -314,14 +311,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);
 
@@ -330,11 +329,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;
 
@@ -346,44 +350,45 @@ private:
        friend class EmergeThread;
        friend class RemoteClient;
 
-       void SendMovement(u16 peer_id);
-       void SendHP(u16 peer_id, u8 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.
@@ -396,24 +401,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);
-       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,
@@ -425,28 +429,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);
 
@@ -458,12 +464,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.
@@ -472,7 +478,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();
 
@@ -526,7 +532,7 @@ private:
        IWritableItemDefManager *m_itemdef;
 
        // Node definition manager
-       IWritableNodeDefManager *m_nodedef;
+       NodeDefManager *m_nodedef;
 
        // Craft definition manager
        IWritableCraftDefManager *m_craftdef;
@@ -572,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
        */
@@ -611,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;
@@ -641,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;
 };
 
 /*