X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fclient.h;h=adac83e5cbf3f190ea10a033723e1be9cbb7c51b;hb=79f19b8369a0120fbf0bd0ee3739989fbbbca50e;hp=0dd519308308d1e7b8d538da8a74a18844d94e45;hpb=ad9fcf859ec2347325830e09504ae96968b51ea8;p=minetest.git diff --git a/src/client.h b/src/client.h index 0dd519308..adac83e5c 100644 --- a/src/client.h +++ b/src/client.h @@ -23,11 +23,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "network/connection.h" #include "clientenvironment.h" #include "irrlichttypes_extrabloated.h" -#include "threading/mutex.h" #include #include #include #include +#include #include "clientobject.h" #include "gamedef.h" #include "inventorymanager.h" @@ -37,8 +37,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapnode.h" #include "tileanimation.h" #include "mesh_generator_thread.h" +#include +#include "filesys.h" + +#define CLIENT_CHAT_MESSAGE_LIMIT_PER_10S 10.0f struct MeshMakeData; +struct ChatMessage; class MapBlockMesh; class IWritableTextureSource; class IWritableShaderSource; @@ -254,9 +259,9 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef */ Client( - IrrlichtDevice *device, const char *playername, const std::string &password, + const std::string &address_name, MapDrawControl &control, IWritableTextureSource *tsrc, IWritableShaderSource *shsrc, @@ -269,7 +274,18 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef ); ~Client(); + DISABLE_CLASS_COPY(Client); + // Load local mods into memory + void loadMods(); + void scanModSubfolder(const std::string &mod_name, const std::string &mod_path, + std::string mod_subpath); + inline void scanModIntoMemory(const std::string &mod_name, const std::string &mod_path) + { + scanModSubfolder(mod_name, mod_path, ""); + } + + // Initizle the mods void initMods(); /* @@ -284,9 +300,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef The name of the local player should already be set when calling this, as it is sent in the initialization. */ - void connect(Address address, - const std::string &address_name, - bool is_local_server); + void connect(Address address, bool is_local_server); /* Stuff that references the environment is valid only as @@ -315,7 +329,8 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef void handleCommand_BlockData(NetworkPacket* pkt); void handleCommand_Inventory(NetworkPacket* pkt); void handleCommand_TimeOfDay(NetworkPacket* pkt); - void handleCommand_ChatMessage(NetworkPacket* pkt); + void handleCommand_ChatMessageOld(NetworkPacket *pkt); + void handleCommand_ChatMessage(NetworkPacket *pkt); void handleCommand_ActiveObjectRemoveAdd(NetworkPacket* pkt); void handleCommand_ActiveObjectMessages(NetworkPacket* pkt); void handleCommand_Movement(NetworkPacket* pkt); @@ -347,7 +362,9 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef void handleCommand_OverrideDayNightRatio(NetworkPacket* pkt); void handleCommand_LocalPlayerAnimations(NetworkPacket* pkt); void handleCommand_EyeOffset(NetworkPacket* pkt); + void handleCommand_UpdatePlayerList(NetworkPacket* pkt); void handleCommand_SrpBytesSandB(NetworkPacket* pkt); + void handleCommand_CSMFlavourLimits(NetworkPacket *pkt); void ProcessData(NetworkPacket *pkt); @@ -361,6 +378,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef const StringMap &fields); void sendInventoryAction(InventoryAction *a); void sendChatMessage(const std::wstring &message); + void clearOutChatQueue(); void sendChangePassword(const std::string &oldpassword, const std::string &newpassword); void sendDamage(u8 damage); @@ -379,6 +397,14 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef // Causes urgent mesh updates (unlike Map::add/removeNodeWithEvent) void removeNode(v3s16 p); + + /** + * Helper function for Client Side Modding + * Flavour is applied there, this should not be used for core engine + * @param p + * @param is_valid_position + * @return + */ MapNode getNode(v3s16 p, bool *is_valid_position); void addNode(v3s16 p, MapNode n, bool remove_metadata = true); @@ -414,6 +440,9 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef bool checkPrivilege(const std::string &priv) const { return (m_privileges.count(priv) != 0); } + const std::unordered_set &getPrivilegeList() const + { return m_privileges; } + bool getChatMessage(std::wstring &message); void typeChatMessage(const std::wstring& message); @@ -450,7 +479,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef bool nodedefReceived() { return m_nodedef_received; } bool mediaReceived() - { return m_media_downloader == NULL; } + { return !m_media_downloader; } u8 getProtoVersion() { return m_proto_ver; } @@ -460,7 +489,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef float mediaReceiveProgress(); - void afterContentReceived(IrrlichtDevice *device); + void afterContentReceived(); float getRTT(); float getCurRate(); @@ -468,8 +497,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef Minimap* getMinimap() { return m_minimap; } void setCamera(Camera* camera) { m_camera = camera; } - Camera* getCamera () - { return m_camera; } + Camera* getCamera () { return m_camera; } bool shouldShowMinimap() const; @@ -480,7 +508,6 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef ITextureSource* getTextureSource(); virtual IShaderSource* getShaderSource(); IShaderSource *shsrc() { return getShaderSource(); } - scene::ISceneManager* getSceneManager(); virtual u16 allocateUnknownNodeId(const std::string &name); virtual ISoundManager* getSoundManager(); virtual MtEventManager* getEventManager(); @@ -488,6 +515,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef bool checkLocalPrivilege(const std::string &priv) { return checkPrivilege(priv); } virtual scene::IAnimatedMesh* getMesh(const std::string &filename); + const std::string* getModFile(const std::string &filename); virtual std::string getModStoragePath() const; virtual bool registerModStorage(ModMetadata *meta); @@ -501,11 +529,11 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef LocalClientState getState() { return m_state; } - void makeScreenshot(IrrlichtDevice *device); + void makeScreenshot(); - inline void pushToChatQueue(const std::wstring &input) + inline void pushToChatQueue(ChatMessage *cec) { - m_chat_queue.push(input); + m_chat_queue.push(cec); } ClientScripting *getScript() { return m_script; } @@ -523,7 +551,25 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef void showGameFog(const bool show = true); void showGameDebug(const bool show = true); - IrrlichtDevice *getDevice() const { return m_device; } + const Address getServerAddress() + { + return m_con.GetPeerAddress(PEER_ID_SERVER); + } + + const std::string &getAddressName() const + { + return m_address_name; + } + + inline bool checkCSMFlavourLimit(CSMFlavourLimit flag) const + { + return m_csm_flavour_limits & flag; + } + + u32 getCSMNodeRangeLimit() const + { + return m_csm_noderange_limit; + } private: @@ -557,11 +603,13 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef inline std::string getPlayerName() { return m_env.getLocalPlayer()->getName(); } - float m_packetcounter_timer; - float m_connection_reinit_timer; - float m_avg_rtt_timer; - float m_playerpos_send_timer; - float m_ignore_damage_timer; // Used after server moves player + bool canSendChatMessage() const; + + float m_packetcounter_timer = 0.0f; + float m_connection_reinit_timer = 0.1f; + float m_avg_rtt_timer = 0.0f; + float m_playerpos_send_timer = 0.0f; + float m_ignore_damage_timer = 0.0f; // Used after server moves player IntervalLimiter m_map_timer_and_unload_interval; IWritableTextureSource *m_tsrc; @@ -576,10 +624,10 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef ClientEnvironment m_env; ParticleManager m_particle_manager; con::Connection m_con; - IrrlichtDevice *m_device; - Camera *m_camera; - Minimap *m_minimap; - bool m_minimap_disabled_by_server; + std::string m_address_name; + Camera *m_camera = nullptr; + Minimap *m_minimap = nullptr; + bool m_minimap_disabled_by_server = false; // Server serialization version u8 m_server_ser_ver; @@ -588,27 +636,30 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef // and aren't accurate. We simply just don't know, because // the server didn't send the version back then. // If 0, server init hasn't been received yet. - u8 m_proto_ver; + u8 m_proto_ver = 0; - u16 m_playeritem; - bool m_inventory_updated; - Inventory *m_inventory_from_server; - float m_inventory_from_server_age; + u16 m_playeritem = 0; + bool m_inventory_updated = false; + Inventory *m_inventory_from_server = nullptr; + float m_inventory_from_server_age = 0.0f; PacketCounter m_packetcounter; // Block mesh animation parameters - float m_animation_time; - int m_crack_level; + float m_animation_time = 0.0f; + int m_crack_level = -1; v3s16 m_crack_pos; // 0 <= m_daynight_i < DAYNIGHT_CACHE_COUNT //s32 m_daynight_i; //u32 m_daynight_ratio; - std::queue m_chat_queue; + std::queue m_out_chat_queue; + u32 m_last_chat_message_sent; + float m_chat_message_allowance = 5.0f; + std::queue m_chat_queue; // The authentication methods we can use to enter sudo mode (=change password) u32 m_sudo_auth_methods; // The seed returned by the server in TOCLIENT_INIT is stored here - u64 m_map_seed; + u64 m_map_seed = 0; // Auth data std::string m_playername; @@ -617,60 +668,66 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef std::string m_new_password; // Usable by auth mechanisms. AuthMechanism m_chosen_auth_mech; - void * m_auth_data; + void *m_auth_data = nullptr; - bool m_access_denied; - bool m_access_denied_reconnect; - std::string m_access_denied_reason; + bool m_access_denied = false; + bool m_access_denied_reconnect = false; + std::string m_access_denied_reason = ""; std::queue m_client_event_queue; - bool m_itemdef_received; - bool m_nodedef_received; + bool m_itemdef_received = false; + bool m_nodedef_received = false; ClientMediaDownloader *m_media_downloader; // time_of_day speed approximation for old protocol - bool m_time_of_day_set; - float m_last_time_of_day_f; - float m_time_of_day_update_timer; + bool m_time_of_day_set = false; + float m_last_time_of_day_f = -1.0f; + float m_time_of_day_update_timer = 0.0f; // An interval for generally sending object positions and stuff - float m_recommended_send_interval; + float m_recommended_send_interval = 0.1f; // Sounds - float m_removed_sounds_check_timer; + float m_removed_sounds_check_timer = 0.0f; // Mapping from server sound ids to our sound ids - UNORDERED_MAP m_sounds_server_to_client; + std::unordered_map m_sounds_server_to_client; // And the other way! - UNORDERED_MAP m_sounds_client_to_server; + std::unordered_map m_sounds_client_to_server; // And relations to objects - UNORDERED_MAP m_sounds_to_objects; + std::unordered_map m_sounds_to_objects; // Privileges - UNORDERED_SET m_privileges; + std::unordered_set m_privileges; // Detached inventories // key = name - UNORDERED_MAP m_detached_inventories; + std::unordered_map m_detached_inventories; // Storage for mesh data for creating multiple instances of the same mesh StringMap m_mesh_data; + StringMap m_mod_files; + // own state LocalClientState m_state; // Used for saving server map to disk client-side - MapDatabase *m_localdb; + MapDatabase *m_localdb = nullptr; IntervalLimiter m_localdb_save_interval; u16 m_cache_save_interval; - ClientScripting *m_script; + ClientScripting *m_script = nullptr; bool m_modding_enabled; - 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; + std::vector m_mods; GameUIFlags *m_game_ui_flags; - bool m_shutdown; - DISABLE_CLASS_COPY(Client); + bool m_shutdown = false; + + // CSM flavour limits byteflag + u64 m_csm_flavour_limits = CSMFlavourLimit::CSM_FL_NONE; + u32 m_csm_noderange_limit = 8; }; #endif // !CLIENT_HEADER