X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fserver.h;h=7b3fe61e2c1277f0b966f96a8140a53255be2983;hb=4be46aeeb17c42718ecea14934e24d77772b4126;hp=fff7f9b6a551ce29996c5fd01e659de8ca0269bb;hpb=79f19b8369a0120fbf0bd0ee3739989fbbbca50e;p=dragonfireclient.git diff --git a/src/server.h b/src/server.h index fff7f9b6a..7b3fe61e2 100644 --- a/src/server.h +++ b/src/server.h @@ -17,10 +17,8 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef SERVER_HEADER -#define SERVER_HEADER +#pragma once -#include "network/connection.h" #include "irr_v3d.h" #include "map.h" #include "hud.h" @@ -30,26 +28,30 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "inventorymanager.h" #include "subgame.h" #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 "chat_interface.h" #include "clientiface.h" -#include "remoteplayer.h" -#include "network/networkpacket.h" #include "chatmessage.h" #include #include #include #include +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; struct RollbackAction; @@ -65,31 +67,6 @@ enum ClientDeletionReason { CDR_DENY }; -class MapEditEventAreaIgnorer -{ -public: - MapEditEventAreaIgnorer(VoxelArea *ignorevariable, const VoxelArea &a): - m_ignorevariable(ignorevariable) - { - if(m_ignorevariable->getVolume() == 0) - *m_ignorevariable = a; - else - m_ignorevariable = NULL; - } - - ~MapEditEventAreaIgnorer() - { - if(m_ignorevariable) - { - assert(m_ignorevariable->getVolume() != 0); - *m_ignorevariable = VoxelArea(); - } - } - -private: - VoxelArea *m_ignorevariable; -}; - struct MediaInfo { std::string path; @@ -126,7 +103,7 @@ struct ServerPlayingSound { ServerSoundParams params; SimpleSoundSpec spec; - std::unordered_set clients; // peer ids + std::unordered_set clients; // peer ids }; class Server : public con::PeerHandler, public MapEventReceiver, @@ -141,14 +118,14 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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. @@ -156,7 +133,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, // This is run by ServerThread and does the actual processing void AsyncRunStep(bool initial_step=false); void Receive(); - PlayerSAO* StageTwoClientInit(u16 peer_id); + PlayerSAO* StageTwoClientInit(session_t peer_id); /* * Command Handlers @@ -167,8 +144,10 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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); @@ -190,7 +169,8 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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, @@ -276,7 +256,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, // 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(); @@ -284,7 +264,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, virtual EmergeManager *getEmergeManager() { return m_emerge; } IWritableItemDefManager* getWritableItemDefManager(); - IWritableNodeDefManager* getWritableNodeDefManager(); + NodeDefManager* getWritableNodeDefManager(); IWritableCraftDefManager* getWritableCraftDefManager(); virtual const std::vector &getMods() const { return m_mods; } @@ -310,18 +290,11 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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 - { return player->getHotbarItemcount(); } 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 - { - return player->getHotbarSelectedImage(); - } + const std::string &hudGetHotbarSelectedImage(RemotePlayer *player) const; - inline Address getPeerAddress(u16 peer_id) - { return m_con.GetPeerAddress(peer_id); } + Address getPeerAddress(session_t peer_id); bool setLocalPlayerAnimations(RemotePlayer *player, v2s32 animation_frames[4], f32 frame_speed); @@ -343,14 +316,16 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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); @@ -359,11 +334,16 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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; @@ -375,44 +355,50 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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& 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 ¶ms, bool &clouds); - void SendCloudParams(u16 peer_id, float density, + void SendCloudParams(session_t 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 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. @@ -428,21 +414,21 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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 &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, @@ -454,28 +440,30 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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); @@ -487,12 +475,12 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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. @@ -501,7 +489,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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(); @@ -535,7 +523,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, ServerEnvironment *m_env = nullptr; // server connection - con::Connection m_con; + std::shared_ptr m_con; // Ban checking BanManager *m_banmanager = nullptr; @@ -555,7 +543,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, IWritableItemDefManager *m_itemdef; // Node definition manager - IWritableNodeDefManager *m_nodedef; + NodeDefManager *m_nodedef; // Craft definition manager IWritableCraftDefManager *m_craftdef; @@ -601,6 +589,8 @@ class Server : public con::PeerHandler, public MapEventReceiver, */ std::queue m_peer_change_queue; + std::unordered_map m_formspec_state_data; + /* Random stuff */ @@ -645,7 +635,7 @@ 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 = 0; + session_t m_ignore_map_edit_events_peer_id = 0; // media files known to server std::unordered_map m_media; @@ -670,6 +660,9 @@ class Server : public con::PeerHandler, public MapEventReceiver, // CSM flavour limits byteflag u64 m_csm_flavour_limits = CSMFlavourLimit::CSM_FL_NONE; u32 m_csm_noderange_limit = 8; + + // ModChannel manager + std::unique_ptr m_modchannel_mgr; }; /* @@ -678,5 +671,3 @@ class Server : public con::PeerHandler, public MapEventReceiver, Shuts down when kill is set to true. */ void dedicated_server_loop(Server &server, bool &kill); - -#endif