X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;ds=sidebyside;f=src%2Fserver.h;h=7ee15a4638a5f1e75975e9ae61cf5e115eed6e5e;hb=d1df09841d0eac7a88f638676b80ec848522cca5;hp=546a44a20c1f379b9cb77a75a45be47f0b162c80;hpb=74d34da6cbb06a4d5659eb3287a87239c31da22c;p=dragonfireclient.git diff --git a/src/server.h b/src/server.h index 546a44a20..7ee15a463 100644 --- a/src/server.h +++ b/src/server.h @@ -32,6 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/numeric.h" #include "util/thread.h" #include "environment.h" +#include "chat_interface.h" #include "clientiface.h" #include "network/networkpacket.h" #include @@ -63,11 +64,6 @@ enum ClientDeletionReason { CDR_DENY }; -/* - Some random functions -*/ -v3f findSpawnPos(ServerMap &map); - class MapEditEventIgnorer { public: @@ -176,7 +172,8 @@ class Server : public con::PeerHandler, public MapEventReceiver, const std::string &path_world, const SubgameSpec &gamespec, bool simple_singleplayer_mode, - bool ipv6 + bool ipv6, + ChatInterface *iface = NULL ); ~Server(); void start(Address bind_addr); @@ -198,7 +195,6 @@ class Server : public con::PeerHandler, public MapEventReceiver, void handleCommand_Null(NetworkPacket* pkt) {}; void handleCommand_Deprecated(NetworkPacket* pkt); void handleCommand_Init(NetworkPacket* pkt); - void handleCommand_Auth(NetworkPacket* pkt); void handleCommand_Init_Legacy(NetworkPacket* pkt); void handleCommand_Init2(NetworkPacket* pkt); void handleCommand_RequestMedia(NetworkPacket* pkt); @@ -218,12 +214,16 @@ class Server : public con::PeerHandler, public MapEventReceiver, void handleCommand_RemovedSounds(NetworkPacket* pkt); void handleCommand_NodeMetaFields(NetworkPacket* pkt); void handleCommand_InventoryFields(NetworkPacket* pkt); + void handleCommand_FirstSrp(NetworkPacket* pkt); + void handleCommand_SrpBytesA(NetworkPacket* pkt); + void handleCommand_SrpBytesM(NetworkPacket* pkt); - void ProcessData(u8 *data, u32 datasize, u16 peer_id); + void ProcessData(NetworkPacket *pkt); void Send(NetworkPacket* pkt); - // Environment must be locked when called + // Both setter and getter need no envlock, + // can be called freely from threads void setTimeOfDay(u32 time); /* @@ -237,7 +237,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, Shall be called with the environment and the connection locked. */ Inventory* getInventory(const InventoryLocation &loc); - void setInventoryModified(const InventoryLocation &loc); + void setInventoryModified(const InventoryLocation &loc, bool playerSend = true); // Connection must be locked when called std::wstring getStatusString(); @@ -247,8 +247,13 @@ class Server : public con::PeerHandler, public MapEventReceiver, { return m_shutdown_requested; } // request server to shutdown - inline void requestShutdown(void) - { m_shutdown_requested = true; } + inline void requestShutdown() { m_shutdown_requested = true; } + void requestShutdown(const std::string &msg, bool reconnect) + { + m_shutdown_requested = true; + m_shutdown_msg = msg; + m_shutdown_ask_reconnect = reconnect; + } // Returns -1 if failed, sound handle on success // Envlock @@ -267,33 +272,23 @@ class Server : public con::PeerHandler, public MapEventReceiver, void notifyPlayer(const char *name, const std::wstring &msg); void notifyPlayers(const std::wstring &msg); - void spawnParticle(const char *playername, + void spawnParticle(const std::string &playername, v3f pos, v3f velocity, v3f acceleration, float expirationtime, float size, - bool collisiondetection, bool vertical, std::string texture); - - void spawnParticleAll(v3f pos, v3f velocity, v3f acceleration, - float expirationtime, float size, - bool collisiondetection, bool vertical, std::string texture); + bool collisiondetection, bool collision_removal, + bool vertical, const std::string &texture); - u32 addParticleSpawner(const char *playername, - u16 amount, float spawntime, + u32 addParticleSpawner(u16 amount, float spawntime, v3f minpos, v3f maxpos, v3f minvel, v3f maxvel, v3f minacc, v3f maxacc, float minexptime, float maxexptime, float minsize, float maxsize, - bool collisiondetection, bool vertical, std::string texture); + bool collisiondetection, bool collision_removal, + bool vertical, const std::string &texture, + const std::string &playername); - u32 addParticleSpawnerAll(u16 amount, float spawntime, - v3f minpos, v3f maxpos, - v3f minvel, v3f maxvel, - v3f minacc, v3f maxacc, - float minexptime, float maxexptime, - float minsize, float maxsize, - bool collisiondetection, bool vertical, std::string texture); - - void deleteParticleSpawner(const char *playername, u32 id); + void deleteParticleSpawner(const std::string &playername, u32 id); void deleteParticleSpawnerAll(u32 id); // Creates or resets inventory @@ -302,9 +297,6 @@ class Server : public con::PeerHandler, public MapEventReceiver, // Envlock and conlock should be locked when using scriptapi GameScripting *getScriptIface(){ return m_script; } - //TODO: determine what (if anything) should be locked to access EmergeManager - EmergeManager *getEmergeManager(){ return m_emerge; } - // actions: time-reversed list // Return value: success/failure bool rollbackRevertActions(const std::list &actions, @@ -322,16 +314,16 @@ class Server : public con::PeerHandler, public MapEventReceiver, virtual MtEventManager* getEventManager(); virtual scene::ISceneManager* getSceneManager(); virtual IRollbackManager *getRollbackManager() { return m_rollback; } - + virtual EmergeManager *getEmergeManager() { return m_emerge; } IWritableItemDefManager* getWritableItemDefManager(); IWritableNodeDefManager* getWritableNodeDefManager(); IWritableCraftDefManager* getWritableCraftDefManager(); - const ModSpec* getModSpec(const std::string &modname); + const ModSpec* getModSpec(const std::string &modname) const; void getModNames(std::vector &modlist); std::string getBuiltinLuaPath(); - inline std::string getWorldPath() + inline std::string getWorldPath() const { return m_path_world; } inline bool isSingleplayer() @@ -349,8 +341,11 @@ class Server : public con::PeerHandler, public MapEventReceiver, bool hudChange(Player *player, u32 id, HudElementStat stat, void *value); bool hudSetFlags(Player *player, u32 flags, u32 mask); bool hudSetHotbarItemcount(Player *player, s32 hotbar_itemcount); + s32 hudGetHotbarItemcount(Player *player); void hudSetHotbarImage(Player *player, std::string name); + std::string hudGetHotbarImage(Player *player); void hudSetHotbarSelectedImage(Player *player, std::string name); + std::string hudGetHotbarSelectedImage(Player *player); inline Address getPeerAddress(u16 peer_id) { return m_con.GetPeerAddress(peer_id); } @@ -368,14 +363,20 @@ class Server : public con::PeerHandler, public MapEventReceiver, void peerAdded(con::Peer *peer); void deletingPeer(con::Peer *peer, bool timeout); - void DenyAccess(u16 peer_id, AccessDeniedCode reason, const std::wstring &custom_reason=NULL); + void DenySudoAccess(u16 peer_id); + void DenyAccessVerCompliant(u16 peer_id, u16 proto_ver, AccessDeniedCode reason, + const std::string &str_reason = "", bool reconnect = false); + void DenyAccess(u16 peer_id, AccessDeniedCode reason, const std::string &custom_reason=""); + void acceptAuth(u16 peer_id, bool forSudoMode); void DenyAccess_Legacy(u16 peer_id, const std::wstring &reason); bool getClientConInfo(u16 peer_id, con::rtt_stat_type type,float* retval); bool getClientInfo(u16 peer_id,ClientState* state, u32* uptime, u8* ser_vers, u16* prot_vers, u8* major, u8* minor, u8* patch, std::string* vers_string); - void SendPlayerHPOrDie(u16 peer_id, bool die) { die ? DiePlayer(peer_id) : SendPlayerHP(peer_id); } + void printToConsoleOnly(const std::string &text); + + void SendPlayerHPOrDie(PlayerSAO *player); void SendPlayerBreath(u16 peer_id); void SendInventory(PlayerSAO* playerSAO); void SendMovePlayer(u16 peer_id); @@ -383,6 +384,9 @@ class Server : public con::PeerHandler, public MapEventReceiver, // Bind address Address m_bind_addr; + // Environment mutex (envlock) + Mutex m_env_mutex; + private: friend class EmergeThread; @@ -391,7 +395,8 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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, const std::wstring &custom_reason); + void SendAccessDenied(u16 peer_id, AccessDeniedCode reason, + const std::string &custom_reason, bool reconnect = false); void SendAccessDenied_Legacy(u16 peer_id, const std::wstring &reason); void SendDeathscreen(u16 peer_id,bool set_camera_point_target, v3f camera_point_target); void SendItemDef(u16 peer_id,IItemDefManager *itemdef, u16 protocol_version); @@ -453,7 +458,8 @@ class Server : public con::PeerHandler, public MapEventReceiver, v3f minacc, v3f maxacc, float minexptime, float maxexptime, float minsize, float maxsize, - bool collisiondetection, bool vertical, std::string texture, u32 id); + bool collisiondetection, bool collision_removal, + bool vertical, const std::string &texture, u32 id); void SendDeleteParticleSpawner(u16 peer_id, u32 id); @@ -461,8 +467,11 @@ class Server : public con::PeerHandler, public MapEventReceiver, void SendSpawnParticle(u16 peer_id, v3f pos, v3f velocity, v3f acceleration, float expirationtime, float size, - bool collisiondetection, bool vertical, std::string texture); + bool collisiondetection, bool collision_removal, + bool vertical, const std::string &texture); + u32 SendActiveObjectRemoveAdd(u16 peer_id, const std::string &datas); + void SendActiveObjectMessages(u16 peer_id, const std::string &datas, bool reliable = true); /* Something random */ @@ -472,6 +481,17 @@ class Server : public con::PeerHandler, public MapEventReceiver, void DeleteClient(u16 peer_id, ClientDeletionReason reason); void UpdateCrafting(Player *player); + void handleChatInterfaceEvent(ChatEvent *evt); + + // This returns the answer to the sender of wmessage, or "" if there is none + std::wstring handleChat(const std::string &name, const std::wstring &wname, + const std::wstring &wmessage, + bool check_shout_priv = false, + u16 peer_id_to_avoid_sending = PEER_ID_INEXISTENT); + void handleAdminChat(const ChatEventChat *evt); + + v3f findSpawnPos(); + // 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); @@ -487,7 +507,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, Call with env and con locked. */ - PlayerSAO *emergePlayer(const char *name, u16 peer_id); + PlayerSAO *emergePlayer(const char *name, u16 peer_id, u16 proto_version); void handlePeerChanges(); @@ -518,7 +538,6 @@ class Server : public con::PeerHandler, public MapEventReceiver, // Environment ServerEnvironment *m_env; - JMutex m_env_mutex; // server connection con::Connection m_con; @@ -559,7 +578,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, // A buffer for time steps // step() increments and AsyncRunStep() run by m_thread reads it. float m_step_dtime; - JMutex m_step_dtime_mutex; + Mutex m_step_dtime_mutex; // current server step lag counter float m_lag; @@ -593,6 +612,11 @@ class Server : public con::PeerHandler, public MapEventReceiver, */ bool m_shutdown_requested; + std::string m_shutdown_msg; + bool m_shutdown_ask_reconnect; + + ChatInterface *m_admin_chat; + std::string m_admin_nick; /* Map edit event queue. Automatically receives all map edits. @@ -643,18 +667,15 @@ class Server : public con::PeerHandler, public MapEventReceiver, // key = name std::map m_detached_inventories; - /* - Particles - */ - std::vector m_particlespawner_ids; + DISABLE_CLASS_COPY(Server); }; /* Runs a simple dedicated server loop. - Shuts down when run is set to false. + Shuts down when kill is set to true. */ -void dedicated_server_loop(Server &server, bool &run); +void dedicated_server_loop(Server &server, bool &kill); #endif