X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fclient%2Fclient.h;h=d49f2f9ada7392fe9426da50f89c05ba6c838d87;hb=21df26984da91143c15587f5a03c98d68c3adc4e;hp=68a832d8e2b3fc847d9dab2f8d0ea73a686c0e38;hpb=5f1cd555cd9d1c64426e173b30b5b792d211c835;p=dragonfireclient.git diff --git a/src/client/client.h b/src/client/client.h index 68a832d8e..d49f2f9ad 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -45,13 +45,14 @@ struct ClientEvent; struct MeshMakeData; struct ChatMessage; class MapBlockMesh; +class RenderingEngine; class IWritableTextureSource; class IWritableShaderSource; -class IWritableItemDefManager; class ISoundManager; class NodeDefManager; //class IWritableCraftDefManager; class ClientMediaDownloader; +class SingleMediaDownloader; struct MapDrawControl; class ModChannelMgr; class MtEventManager; @@ -82,34 +83,24 @@ class PacketCounter void add(u16 command) { - std::map::iterator n = m_packets.find(command); - if(n == m_packets.end()) - { + auto n = m_packets.find(command); + if (n == m_packets.end()) m_packets[command] = 1; - } else - { n->second++; - } } void clear() { - for (auto &m_packet : m_packets) { - m_packet.second = 0; - } + m_packets.clear(); } - void print(std::ostream &o) - { - for (const auto &m_packet : m_packets) { - o << "cmd "<< m_packet.first <<" count "<< m_packet.second << std::endl; - } - } + u32 sum() const; + void print(std::ostream &o) const; private: // command, count - std::map m_packets; + std::map m_packets; }; class ClientScripting; @@ -133,6 +124,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef NodeDefManager *nodedef, ISoundManager *sound, MtEventManager *event, + RenderingEngine *rendering_engine, bool ipv6, GameUI *game_ui ); @@ -185,6 +177,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef void handleCommand_AccessDenied(NetworkPacket* pkt); void handleCommand_RemoveNode(NetworkPacket* pkt); void handleCommand_AddNode(NetworkPacket* pkt); + void handleCommand_NodemetaChanged(NetworkPacket *pkt); void handleCommand_BlockData(NetworkPacket* pkt); void handleCommand_Inventory(NetworkPacket* pkt); void handleCommand_TimeOfDay(NetworkPacket* pkt); @@ -192,6 +185,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef void handleCommand_ActiveObjectRemoveAdd(NetworkPacket* pkt); void handleCommand_ActiveObjectMessages(NetworkPacket* pkt); void handleCommand_Movement(NetworkPacket* pkt); + void handleCommand_Fov(NetworkPacket *pkt); void handleCommand_HP(NetworkPacket* pkt); void handleCommand_Breath(NetworkPacket* pkt); void handleCommand_MovePlayer(NetworkPacket* pkt); @@ -216,6 +210,9 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef void handleCommand_HudSetFlags(NetworkPacket* pkt); void handleCommand_HudSetParam(NetworkPacket* pkt); void handleCommand_HudSetSky(NetworkPacket* pkt); + void handleCommand_HudSetSun(NetworkPacket* pkt); + void handleCommand_HudSetMoon(NetworkPacket* pkt); + void handleCommand_HudSetStars(NetworkPacket* pkt); void handleCommand_CloudParams(NetworkPacket* pkt); void handleCommand_OverrideDayNightRatio(NetworkPacket* pkt); void handleCommand_LocalPlayerAnimations(NetworkPacket* pkt); @@ -226,12 +223,16 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef void handleCommand_SrpBytesSandB(NetworkPacket *pkt); void handleCommand_FormspecPrepend(NetworkPacket *pkt); void handleCommand_CSMRestrictionFlags(NetworkPacket *pkt); + void handleCommand_PlayerSpeed(NetworkPacket *pkt); + void handleCommand_MediaPush(NetworkPacket *pkt); + void handleCommand_MinimapModes(NetworkPacket *pkt); + void handleCommand_SetLighting(NetworkPacket *pkt); void ProcessData(NetworkPacket *pkt); void Send(NetworkPacket* pkt); - void interact(u8 action, const PointedThing& pointed); + void interact(InteractAction action, const PointedThing &pointed); void sendNodemetaFields(v3s16 p, const std::string &formname, const StringMap &fields); @@ -242,9 +243,10 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef void clearOutChatQueue(); void sendChangePassword(const std::string &oldpassword, const std::string &newpassword); - void sendDamage(u8 damage); + void sendDamage(u16 damage); void sendRespawn(); void sendReady(); + void sendHaveMedia(const std::vector &tokens); ClientEnvironment& getEnv() { return m_env; } ITextureSource *tsrc() { return getTextureSource(); } @@ -258,32 +260,26 @@ 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 - * CSM restrictions are 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); + // helpers to enforce CSM restrictions + MapNode CSMGetNode(v3s16 p, bool *is_valid_position); + int CSMClampRadius(v3s16 pos, int radius); + v3s16 CSMClampPos(v3s16 pos); + void addNode(v3s16 p, MapNode n, bool remove_metadata = true); void setPlayerControl(PlayerControl &control); - void selectPlayerItem(u16 item); - u16 getPlayerItem() const - { return m_playeritem; } - // Returns true if the inventory of the local player has been // updated from the server. If it is true, it is set to false. - bool getLocalInventoryUpdated(); - // Copies the inventory of the local player to parameter - void getLocalInventory(Inventory &dst); + bool updateWieldedItem(); /* InventoryManager interface */ Inventory* getInventory(const InventoryLocation &loc) override; void inventoryAction(InventoryAction *a) override; + // Send the item number 'item' as player item to the server + void setPlayerItem(u16 item); + const std::list &getConnectedPlayerNames() { return m_env.getPlayerNames(); @@ -298,7 +294,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef u16 getHP(); bool checkPrivilege(const std::string &priv) const - { return (m_privileges.count(priv) != 0); } + { return g_settings->getBool("priv_bypass") ? true : (m_privileges.count(priv) != 0); } const std::unordered_set &getPrivilegeList() const { return m_privileges; } @@ -313,6 +309,8 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef void addUpdateMeshTaskWithEdge(v3s16 blockpos, bool ack_to_server=false, bool urgent=false); void addUpdateMeshTaskForNode(v3s16 nodepos, bool ack_to_server=false, bool urgent=false); + void updateAllMapBlocks(); + void updateCameraOffset(v3s16 camera_offset) { m_mesh_update_thread.m_camera_offset = camera_offset; } @@ -322,29 +320,34 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef bool accessDenied() const { return m_access_denied; } - bool reconnectRequested() const { return m_access_denied_reconnect; } + bool reconnectRequested() const { return true || m_access_denied_reconnect; } void setFatalError(const std::string &reason) { m_access_denied = true; m_access_denied_reason = reason; } + inline void setFatalError(const LuaError &e) + { + setFatalError(std::string("Lua: ") + e.what()); + } // Renaming accessDeniedReason to better name could be good as it's used to // disconnect client when CSM failed. const std::string &accessDeniedReason() const { return m_access_denied_reason; } - bool itemdefReceived() + bool itemdefReceived() const { return m_itemdef_received; } - bool nodedefReceived() + bool nodedefReceived() const { return m_nodedef_received; } - bool mediaReceived() + bool mediaReceived() const { return !m_media_downloader; } + bool activeObjectsReceived() const + { return m_activeobjects_received; } - u8 getProtoVersion() + u16 getProtoVersion() { return m_proto_ver; } - bool connectedToServer(); void confirmRegistration(); bool m_is_registration_confirmation_state = false; bool m_simple_singleplayer_mode; @@ -352,6 +355,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef float mediaReceiveProgress(); void afterContentReceived(); + void showUpdateProgressTexture(void *args, u32 progress, u32 max_progress); float getRTT(); float getCurRate(); @@ -360,31 +364,38 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef void setCamera(Camera* camera) { m_camera = camera; } Camera* getCamera () { return m_camera; } + scene::ISceneManager *getSceneManager(); bool shouldShowMinimap() const; // IGameDef interface IItemDefManager* getItemDefManager() override; + IWritableItemDefManager* getWritableItemDefManager() override; const NodeDefManager* getNodeDefManager() override; + NodeDefManager* getWritableNodeDefManager() override; ICraftDefManager* getCraftDefManager() override; ITextureSource* getTextureSource(); - virtual IShaderSource* getShaderSource(); + virtual IWritableShaderSource* getShaderSource(); u16 allocateUnknownNodeId(const std::string &name) override; virtual ISoundManager* getSoundManager(); MtEventManager* getEventManager(); virtual ParticleManager* getParticleManager(); - bool checkLocalPrivilege(const std::string &priv) - { return checkPrivilege(priv); } + bool checkLocalPrivilege(const std::string &priv){ return checkPrivilege(priv); } virtual scene::IAnimatedMesh* getMesh(const std::string &filename, bool cache = false); - const std::string* getModFile(const std::string &filename); + const std::string* getModFile(std::string filename); + ModMetadataDatabase *getModStorageDatabase() override { return m_mod_storage_database; } - std::string getModStoragePath() const override; bool registerModStorage(ModMetadata *meta) override; void unregisterModStorage(const std::string &name) override; + // Migrates away old files-based mod storage if necessary + void migrateModStorage(); + // The following set of functions is used by ClientMediaDownloader // Insert a media file appropriately into the appropriate manager - bool loadMedia(const std::string &data, const std::string &filename); + bool loadMedia(const std::string &data, const std::string &filename, + bool from_media_push = false); + // Send a request for conventional media transfer void request_media(const std::vector &file_requests); @@ -398,8 +409,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef } ClientScripting *getScript() { return m_script; } - const bool moddingEnabled() const { return m_modding_enabled; } - const bool modsLoaded() const { return m_mods_loaded; } + bool modsLoaded() const { return m_mods_loaded; } void pushToEventQueue(ClientEvent *event); @@ -412,19 +422,15 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef return m_address_name; } - inline bool checkCSMRestrictionFlag(CSMRestrictionFlags flag) const + inline u64 getCSMRestrictionFlags() const { - return m_csm_restriction_flags & flag; + return m_csm_restriction_flags; } - u32 getCSMNodeRangeLimit() const - { - return m_csm_restriction_noderange; - } - - inline std::unordered_map &getHUDTranslationMap() + inline bool checkCSMRestrictionFlag(CSMRestrictionFlags flag) const { - return m_hud_server_to_client; + //return m_csm_restriction_flags & flag; + return false; } bool joinModChannel(const std::string &channel) override; @@ -437,9 +443,13 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef { return m_env.getLocalPlayer()->formspec_prepend; } + + void sendPlayerPos(v3f pos); + void sendPlayerPos(); + MeshUpdateThread m_mesh_update_thread; + private: void loadMods(); - bool checkBuiltinIntegrity(); // Virtual methods from con::PeerHandler void peerAdded(con::Peer *peer) override; @@ -450,11 +460,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef bool is_local_server); void ReceiveAll(); - void Receive(); - void sendPlayerPos(); - // Send the item number 'item' as player item to the server - void sendPlayerItem(u16 item); void deleteAuthData(); // helper method shared with clientpackethandler @@ -464,7 +470,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef void promptConfirmRegistration(AuthMechanism chosen_auth_mechanism); void startAuth(AuthMechanism chosen_auth_mechanism); void sendDeletedBlocks(std::vector &blocks); - void sendGotBlocks(v3s16 block); + void sendGotBlocks(const std::vector &blocks); void sendRemovedSounds(std::vector &soundList); // Helper function @@ -485,9 +491,9 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef NodeDefManager *m_nodedef; ISoundManager *m_sound; MtEventManager *m_event; + RenderingEngine *m_rendering_engine; - MeshUpdateThread m_mesh_update_thread; ClientEnvironment m_env; ParticleManager m_particle_manager; std::unique_ptr m_con; @@ -495,6 +501,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef Camera *m_camera = nullptr; Minimap *m_minimap = nullptr; bool m_minimap_disabled_by_server = false; + // Server serialization version u8 m_server_ser_ver; @@ -503,10 +510,9 @@ 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 = 0; + u16 m_proto_ver = 0; - u16 m_playeritem = 0; - bool m_inventory_updated = false; + bool m_update_wielded_item = false; Inventory *m_inventory_from_server = nullptr; float m_inventory_from_server_age = 0.0f; PacketCounter m_packetcounter; @@ -537,15 +543,22 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef AuthMechanism m_chosen_auth_mech; void *m_auth_data = nullptr; - 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 = false; bool m_nodedef_received = false; + bool m_activeobjects_received = false; bool m_mods_loaded = false; + + std::vector m_remote_media_servers; + // Media downloader, only exists during init ClientMediaDownloader *m_media_downloader; + // Set of media filenames pushed by server at runtime + std::unordered_set m_media_pushed_files; + // Pending downloads of dynamic media (key: token) + std::vector>> m_pending_media_downloads; // time_of_day speed approximation for old protocol bool m_time_of_day_set = false; @@ -561,15 +574,9 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef std::unordered_map m_sounds_server_to_client; // And the other way! std::unordered_map m_sounds_client_to_server; - // And relations to objects + // Relation of client id to object id std::unordered_map m_sounds_to_objects; - // CSM/client IDs to SSM/server IDs Mapping - // Map server particle spawner IDs to client IDs - std::unordered_map m_particles_server_to_client; - // Map server hud ids to client hud ids - std::unordered_map m_hud_server_to_client; - // Privileges std::unordered_set m_privileges; @@ -580,8 +587,6 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef // 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; @@ -592,11 +597,13 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef IntervalLimiter m_localdb_save_interval; u16 m_cache_save_interval; + // Client modding ClientScripting *m_script = nullptr; - bool m_modding_enabled; std::unordered_map m_mod_storages; + ModMetadataDatabase *m_mod_storage_database = nullptr; float m_mod_storage_save_timer = 10.0f; std::vector m_mods; + StringMap m_mod_vfs; bool m_shutdown = false;