X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fserver.h;h=3086e87621345332def05297327ce6fc4282e342;hb=ff73c7a5da6ab8ac0bb678ebf25b83e805397029;hp=5a19677cd3f8ed4f7c2b5c31157dc1fc630ca007;hpb=63e7137e3bb3ef2531faac995e8817b2c3fedc8c;p=dragonfireclient.git diff --git a/src/server.h b/src/server.h index 5a19677cd..3086e8762 100644 --- a/src/server.h +++ b/src/server.h @@ -29,31 +29,31 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mods.h" #include "inventorymanager.h" #include "subgame.h" +#include "tileanimation.h" // struct TileAnimationParams #include "util/numeric.h" #include "util/thread.h" -#include "environment.h" +#include "util/basic_macros.h" +#include "serverenvironment.h" #include "chat_interface.h" #include "clientiface.h" +#include "remoteplayer.h" #include "network/networkpacket.h" #include #include #include #include -#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" - class IWritableItemDefManager; class IWritableNodeDefManager; class IWritableCraftDefManager; class BanManager; class EventManager; class Inventory; -class Player; class PlayerSAO; class IRollbackManager; struct RollbackAction; class EmergeManager; -class GameScripting; +class ServerScripting; class ServerEnvironment; struct SimpleSoundSpec; class ServerThread; @@ -64,31 +64,6 @@ enum ClientDeletionReason { CDR_DENY }; -class MapEditEventIgnorer -{ -public: - MapEditEventIgnorer(bool *flag): - m_flag(flag) - { - if(*m_flag == false) - *m_flag = true; - else - m_flag = NULL; - } - - ~MapEditEventIgnorer() - { - if(m_flag) - { - assert(*m_flag); - *m_flag = false; - } - } - -private: - bool *m_flag; -}; - class MapEditEventAreaIgnorer { public: @@ -129,27 +104,19 @@ struct MediaInfo struct ServerSoundParams { - float gain; - std::string to_player; - enum Type{ - SSP_LOCAL=0, - SSP_POSITIONAL=1, - SSP_OBJECT=2 - } type; - v3f pos; - u16 object; - float max_hear_distance; - bool loop; - - ServerSoundParams(): - gain(1.0), - to_player(""), - type(SSP_LOCAL), - pos(0,0,0), - object(0), - max_hear_distance(32*BS), - loop(false) - {} + enum Type { + SSP_LOCAL, + SSP_POSITIONAL, + SSP_OBJECT + } type = SSP_LOCAL; + float gain = 1.0f; + float fade = 0.0f; + float pitch = 1.0f; + bool loop = false; + float max_hear_distance = 32*BS; + v3f pos = v3f(0, 0, 0); + u16 object = 0; + std::string to_player = ""; v3f getPos(ServerEnvironment *env, bool *pos_exists) const; }; @@ -157,7 +124,8 @@ struct ServerSoundParams struct ServerPlayingSound { ServerSoundParams params; - std::set clients; // peer ids + SimpleSoundSpec spec; + std::unordered_set clients; // peer ids }; class Server : public con::PeerHandler, public MapEventReceiver, @@ -173,9 +141,12 @@ class Server : public con::PeerHandler, public MapEventReceiver, const SubgameSpec &gamespec, bool simple_singleplayer_mode, bool ipv6, + bool dedicated, ChatInterface *iface = NULL ); ~Server(); + DISABLE_CLASS_COPY(Server); + void start(Address bind_addr); void stop(); // This is mainly a way to pass the time to the server. @@ -198,7 +169,6 @@ class Server : public con::PeerHandler, public MapEventReceiver, void handleCommand_Init_Legacy(NetworkPacket* pkt); void handleCommand_Init2(NetworkPacket* pkt); void handleCommand_RequestMedia(NetworkPacket* pkt); - void handleCommand_ReceivedMedia(NetworkPacket* pkt); void handleCommand_ClientReady(NetworkPacket* pkt); void handleCommand_GotBlocks(NetworkPacket* pkt); void handleCommand_PlayerPos(NetworkPacket* pkt); @@ -206,7 +176,6 @@ class Server : public con::PeerHandler, public MapEventReceiver, void handleCommand_InventoryAction(NetworkPacket* pkt); void handleCommand_ChatMessage(NetworkPacket* pkt); void handleCommand_Damage(NetworkPacket* pkt); - void handleCommand_Breath(NetworkPacket* pkt); void handleCommand_Password(NetworkPacket* pkt); void handleCommand_PlayerItem(NetworkPacket* pkt); void handleCommand_Respawn(NetworkPacket* pkt); @@ -222,6 +191,10 @@ class Server : public con::PeerHandler, public MapEventReceiver, void Send(NetworkPacket* pkt); + // Helper for handleCommand_PlayerPos and handleCommand_Interact + void process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao, + NetworkPacket *pkt); + // Both setter and getter need no envlock, // can be called freely from threads void setTimeOfDay(u32 time); @@ -241,24 +214,19 @@ class Server : public con::PeerHandler, public MapEventReceiver, // Connection must be locked when called std::wstring getStatusString(); + inline double getUptime() const { return m_uptime.m_value; } // read shutdown state - inline bool getShutdownRequested() - { return m_shutdown_requested; } + inline bool getShutdownRequested() const { return m_shutdown_requested; } // request server to shutdown - 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; - } + void requestShutdown(const std::string &msg, bool reconnect, float delay = 0.0f); // Returns -1 if failed, sound handle on success // Envlock s32 playSound(const SimpleSoundSpec &spec, const ServerSoundParams ¶ms); void stopSound(s32 handle); + void fadeSound(s32 handle, float step, float gain); // Envlock std::set getPlayerEffectivePrivs(const std::string &name); @@ -275,7 +243,9 @@ class Server : public con::PeerHandler, public MapEventReceiver, void spawnParticle(const std::string &playername, v3f pos, v3f velocity, v3f acceleration, float expirationtime, float size, - bool collisiondetection, bool vertical, const std::string &texture); + bool collisiondetection, bool collision_removal, + bool vertical, const std::string &texture, + const struct TileAnimationParams &animation, u8 glow); u32 addParticleSpawner(u16 amount, float spawntime, v3f minpos, v3f maxpos, @@ -283,16 +253,19 @@ class Server : public con::PeerHandler, public MapEventReceiver, v3f minacc, v3f maxacc, float minexptime, float maxexptime, float minsize, float maxsize, - bool collisiondetection, bool vertical, const std::string &texture, - const std::string &playername); + bool collisiondetection, bool collision_removal, + ServerActiveObject *attached, + bool vertical, const std::string &texture, + const std::string &playername, const struct TileAnimationParams &animation, + u8 glow); void deleteParticleSpawner(const std::string &playername, u32 id); // Creates or resets inventory - Inventory* createDetachedInventory(const std::string &name); + Inventory* createDetachedInventory(const std::string &name, const std::string &player=""); // Envlock and conlock should be locked when using scriptapi - GameScripting *getScriptIface(){ return m_script; } + ServerScripting *getScriptIface(){ return m_script; } // actions: time-reversed list // Return value: success/failure @@ -304,24 +277,21 @@ class Server : public con::PeerHandler, public MapEventReceiver, virtual IItemDefManager* getItemDefManager(); virtual INodeDefManager* getNodeDefManager(); virtual ICraftDefManager* getCraftDefManager(); - virtual ITextureSource* getTextureSource(); - virtual IShaderSource* getShaderSource(); virtual u16 allocateUnknownNodeId(const std::string &name); - virtual ISoundManager* getSoundManager(); virtual MtEventManager* getEventManager(); - virtual scene::ISceneManager* getSceneManager(); - virtual IRollbackManager *getRollbackManager() { return m_rollback; } + 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; + virtual const std::vector &getMods() const { return m_mods; } + virtual const ModSpec* getModSpec(const std::string &modname) const; void getModNames(std::vector &modlist); std::string getBuiltinLuaPath(); - inline std::string getWorldPath() const - { return m_path_world; } + virtual std::string getWorldPath() const { return m_path_world; } + virtual std::string getModStoragePath() const; inline bool isSingleplayer() { return m_simple_singleplayer_mode; } @@ -332,29 +302,41 @@ class Server : public con::PeerHandler, public MapEventReceiver, bool showFormspec(const char *name, const std::string &formspec, const std::string &formname); Map & getMap() { return m_env->getMap(); } ServerEnvironment & getEnv() { return *m_env; } + v3f findSpawnPos(); - u32 hudAdd(Player *player, HudElement *element); - bool hudRemove(Player *player, u32 id); - 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); + u32 hudAdd(RemotePlayer *player, HudElement *element); + bool hudRemove(RemotePlayer *player, u32 id); + 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(); + } inline Address getPeerAddress(u16 peer_id) { return m_con.GetPeerAddress(peer_id); } - bool setLocalPlayerAnimations(Player *player, v2s32 animation_frames[4], f32 frame_speed); - bool setPlayerEyeOffset(Player *player, v3f first, v3f third); + bool setLocalPlayerAnimations(RemotePlayer *player, v2s32 animation_frames[4], + f32 frame_speed); + bool setPlayerEyeOffset(RemotePlayer *player, v3f first, v3f third); - bool setSky(Player *player, const video::SColor &bgcolor, - const std::string &type, const std::vector ¶ms); + bool setSky(RemotePlayer *player, const video::SColor &bgcolor, + const std::string &type, const std::vector ¶ms, + 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); - bool overrideDayNightRatio(Player *player, bool do_override, - float brightness); + bool overrideDayNightRatio(RemotePlayer *player, bool do_override, float brightness); /* con::PeerHandler implementation. */ void peerAdded(con::Peer *peer); @@ -374,15 +356,18 @@ class Server : public con::PeerHandler, public MapEventReceiver, void printToConsoleOnly(const std::string &text); void SendPlayerHPOrDie(PlayerSAO *player); - void SendPlayerBreath(u16 peer_id); + void SendPlayerBreath(PlayerSAO *sao); void SendInventory(PlayerSAO* playerSAO); void SendMovePlayer(u16 peer_id); + virtual bool registerModStorage(ModMetadata *storage); + virtual void unregisterModStorage(const std::string &name); + // Bind address Address m_bind_addr; // Environment mutex (envlock) - Mutex m_env_mutex; + std::mutex m_env_mutex; private: @@ -418,7 +403,14 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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, - const std::string &type, const std::vector ¶ms); + const std::string &type, const std::vector ¶ms, + 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); /* @@ -449,21 +441,27 @@ class Server : public con::PeerHandler, public MapEventReceiver, void sendDetachedInventories(u16 peer_id); // Adds a ParticleSpawner on peer with peer_id (PEER_ID_INEXISTENT == all) - void SendAddParticleSpawner(u16 peer_id, u16 amount, float spawntime, + void SendAddParticleSpawner(u16 peer_id, u16 protocol_version, + 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, u32 id); + bool collisiondetection, bool collision_removal, + u16 attached_id, + bool vertical, const std::string &texture, u32 id, + const struct TileAnimationParams &animation, u8 glow); void SendDeleteParticleSpawner(u16 peer_id, u32 id); // Spawns particle on peer with peer_id (PEER_ID_INEXISTENT == all) - void SendSpawnParticle(u16 peer_id, + void SendSpawnParticle(u16 peer_id, u16 protocol_version, 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, + 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); @@ -474,18 +472,17 @@ class Server : public con::PeerHandler, public MapEventReceiver, void DiePlayer(u16 peer_id); void RespawnPlayer(u16 peer_id); void DeleteClient(u16 peer_id, ClientDeletionReason reason); - void UpdateCrafting(Player *player); + void UpdateCrafting(RemotePlayer *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, - u16 peer_id_to_avoid_sending = PEER_ID_INEXISTENT); + std::wstring wmessage_input, + bool check_shout_priv = false, + RemotePlayer *player = NULL); 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); @@ -516,6 +513,9 @@ class Server : public con::PeerHandler, public MapEventReceiver, // If true, do not allow multiple players and hide some multiplayer // functionality bool m_simple_singleplayer_mode; + u16 m_max_chatmessage_length; + // For "dedicated" server list flag + bool m_dedicated; // Thread can set; step() will throw as ServerError MutexedVariable m_async_fatal_error; @@ -523,9 +523,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, // Some timers float m_liquid_transform_timer; float m_liquid_transform_every; - float m_print_info_timer; float m_masterserver_timer; - float m_objectdata_timer; float m_emergethread_trigger_timer; float m_savemap_timer; IntervalLimiter m_map_timer_and_unload_interval; @@ -548,7 +546,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, // Scripting // Envlock and conlock should be locked when using Lua - GameScripting *m_script; + ServerScripting *m_script; // Item definition manager IWritableItemDefManager *m_itemdef; @@ -572,7 +570,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; - Mutex m_step_dtime_mutex; + std::mutex m_step_dtime_mutex; // current server step lag counter float m_lag; @@ -588,7 +586,6 @@ class Server : public con::PeerHandler, public MapEventReceiver, float m_time_of_day_send_timer; // Uptime of server in seconds MutexedVariable m_uptime; - /* Client interface */ @@ -608,6 +605,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, bool m_shutdown_requested; std::string m_shutdown_msg; bool m_shutdown_ask_reconnect; + float m_shutdown_timer; ChatInterface *m_admin_chat; std::string m_admin_nick; @@ -647,12 +645,12 @@ class Server : public con::PeerHandler, public MapEventReceiver, u16 m_ignore_map_edit_events_peer_id; // media files known to server - std::map m_media; + std::unordered_map m_media; /* Sounds */ - std::map m_playing_sounds; + std::unordered_map m_playing_sounds; s32 m_next_sound_id; /* @@ -660,13 +658,11 @@ class Server : public con::PeerHandler, public MapEventReceiver, */ // key = name std::map m_detached_inventories; + // value = "" (visible to all players) or player name + std::map m_detached_inventories_player; - /* - Particles - */ - std::vector m_particlespawner_ids; - - DISABLE_CLASS_COPY(Server); + std::unordered_map m_mod_storages; + float m_mod_storage_save_timer; }; /*