X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fserver.h;h=f14a861fd0f9d3682f3f30780cb61881fc91d81e;hb=5a6618cc57097e1e7205ad6b1d967a3ad79d016e;hp=e2445f8338ff266db37ab1a69c8bacc5cc62b088;hpb=34d32ce55ae4f3f29d7b645075dc8efacb2c96d2;p=minetest.git diff --git a/src/server.h b/src/server.h index e2445f833..f14a861fd 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,25 +28,29 @@ 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 IWritableCraftDefManager; class BanManager; class EventManager; class Inventory; +class RemotePlayer; class PlayerSAO; class IRollbackManager; struct RollbackAction; @@ -64,31 +66,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; @@ -104,27 +81,19 @@ struct MediaInfo struct ServerSoundParams { - float gain; - std::string to_player; - enum Type{ - SSP_LOCAL=0, - SSP_POSITIONAL=1, - SSP_OBJECT=2 - } type; + 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; - 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) - {} + u16 object = 0; + std::string to_player = ""; v3f getPos(ServerEnvironment *env, bool *pos_exists) const; }; @@ -132,7 +101,8 @@ struct ServerSoundParams struct ServerPlayingSound { ServerSoundParams params; - UNORDERED_SET clients; // peer ids + SimpleSoundSpec spec; + std::unordered_set clients; // peer ids }; class Server : public con::PeerHandler, public MapEventReceiver, @@ -149,9 +119,11 @@ class Server : public con::PeerHandler, public MapEventReceiver, bool simple_singleplayer_mode, bool ipv6, bool dedicated, - ChatInterface *iface = NULL + ChatInterface *iface = nullptr ); ~Server(); + DISABLE_CLASS_COPY(Server); + void start(Address bind_addr); void stop(); // This is mainly a way to pass the time to the server. @@ -174,7 +146,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); @@ -232,6 +203,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, // 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); @@ -307,31 +279,34 @@ 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(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(); } + 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 - { - return player->getHotbarSelectedImage(); - } + const std::string &hudGetHotbarSelectedImage(RemotePlayer *player) const; - inline Address getPeerAddress(u16 peer_id) - { return m_con.GetPeerAddress(peer_id); } + Address getPeerAddress(u16 peer_id); bool setLocalPlayerAnimations(RemotePlayer *player, v2s32 animation_frames[4], f32 frame_speed); bool setPlayerEyeOffset(RemotePlayer *player, v3f first, v3f third); bool setSky(RemotePlayer *player, const video::SColor &bgcolor, - const std::string &type, const std::vector ¶ms); + 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(RemotePlayer *player, bool do_override, float brightness); @@ -345,7 +320,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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 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); @@ -364,7 +339,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, Address m_bind_addr; // Environment mutex (envlock) - Mutex m_env_mutex; + std::mutex m_env_mutex; private: @@ -385,7 +360,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, void SetBlocksNotSent(std::map& block); - void SendChatMessage(u16 peer_id, const std::wstring &message); + void SendChatMessage(u16 peer_id, const ChatMessage &message); void SendTimeOfDay(u16 peer_id, u16 time, f32 time_speed); void SendPlayerHP(u16 peer_id); @@ -400,7 +375,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); /* @@ -423,7 +405,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, void SendBlocks(float dtime); void fillMediaCache(); - void sendMediaAnnouncement(u16 peer_id); + void sendMediaAnnouncement(u16 peer_id, const std::string &lang_code); void sendRequestedMedia(u16 peer_id, const std::vector &tosend); @@ -455,6 +437,8 @@ class Server : public con::PeerHandler, public MapEventReceiver, 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); + /* Something random */ @@ -468,13 +452,11 @@ class Server : public con::PeerHandler, public MapEventReceiver, // 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, + 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); @@ -513,32 +495,32 @@ class Server : public con::PeerHandler, public MapEventReceiver, MutexedVariable m_async_fatal_error; // Some timers - float m_liquid_transform_timer; - float m_liquid_transform_every; - float m_masterserver_timer; - float m_emergethread_trigger_timer; - float m_savemap_timer; + float m_liquid_transform_timer = 0.0f; + float m_liquid_transform_every = 1.0f; + float m_masterserver_timer = 0.0f; + float m_emergethread_trigger_timer = 0.0f; + float m_savemap_timer = 0.0f; IntervalLimiter m_map_timer_and_unload_interval; // Environment - ServerEnvironment *m_env; + ServerEnvironment *m_env = nullptr; // server connection - con::Connection m_con; + std::shared_ptr m_con; // Ban checking - BanManager *m_banmanager; + BanManager *m_banmanager = nullptr; // Rollback manager (behind m_env_mutex) - IRollbackManager *m_rollback; - bool m_enable_rollback_recording; // Updated once in a while + IRollbackManager *m_rollback = nullptr; + bool m_enable_rollback_recording = false; // Updated once in a while // Emerge manager - EmergeManager *m_emerge; + EmergeManager *m_emerge = nullptr; // Scripting // Envlock and conlock should be locked when using Lua - ServerScripting *m_script; + ServerScripting *m_script = nullptr; // Item definition manager IWritableItemDefManager *m_itemdef; @@ -561,21 +543,21 @@ 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; + float m_step_dtime = 0.0f; + std::mutex m_step_dtime_mutex; // current server step lag counter float m_lag; // The server mainly operates in this thread - ServerThread *m_thread; + ServerThread *m_thread = nullptr; /* Time related stuff */ // Timer for sending time of day over network - float m_time_of_day_send_timer; + float m_time_of_day_send_timer = 0.0f; // Uptime of server in seconds MutexedVariable m_uptime; /* @@ -594,10 +576,10 @@ class Server : public con::PeerHandler, public MapEventReceiver, Random stuff */ - bool m_shutdown_requested; + bool m_shutdown_requested = false; std::string m_shutdown_msg; - bool m_shutdown_ask_reconnect; - float m_shutdown_timer; + bool m_shutdown_ask_reconnect = false; + float m_shutdown_timer = 0.0f; ChatInterface *m_admin_chat; std::string m_admin_nick; @@ -621,7 +603,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, all sending of information by itself. This is behind m_env_mutex */ - bool m_ignore_map_edit_events; + bool m_ignore_map_edit_events = false; /* If a non-empty area, map edit events contained within are left unsent. Done at map generation time to speed up editing of the @@ -634,16 +616,16 @@ 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; + u16 m_ignore_map_edit_events_peer_id = 0; // media files known to server - UNORDERED_MAP m_media; + std::unordered_map m_media; /* Sounds */ - UNORDERED_MAP m_playing_sounds; - s32 m_next_sound_id; + std::unordered_map m_playing_sounds; + s32 m_next_sound_id = 0; /* Detached inventories (behind m_env_mutex) @@ -653,10 +635,12 @@ class Server : public con::PeerHandler, public MapEventReceiver, // value = "" (visible to all players) or player name std::map m_detached_inventories_player; - UNORDERED_MAP m_mod_storages; - float m_mod_storage_save_timer; + std::unordered_map m_mod_storages; + float m_mod_storage_save_timer = 10.0f; - DISABLE_CLASS_COPY(Server); + // CSM flavour limits byteflag + u64 m_csm_flavour_limits = CSMFlavourLimit::CSM_FL_NONE; + u32 m_csm_noderange_limit = 8; }; /* @@ -665,6 +649,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 -