3 Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23 #include "network/connection.h"
24 #include "clientenvironment.h"
25 #include "irrlichttypes_extrabloated.h"
26 #include "threading/mutex.h"
31 #include "clientobject.h"
33 #include "inventorymanager.h"
34 #include "localplayer.h"
36 #include "particles.h"
38 #include "tileanimation.h"
39 #include "mesh_generator_thread.h"
43 class IWritableTextureSource;
44 class IWritableShaderSource;
45 class IWritableItemDefManager;
46 class IWritableNodeDefManager;
47 //class IWritableCraftDefManager;
48 class ClientMediaDownloader;
49 struct MapDrawControl;
54 struct MinimapMapblock;
58 enum LocalClientState {
71 CE_SHOW_LOCAL_FORMSPEC,
73 CE_ADD_PARTICLESPAWNER,
74 CE_DELETE_PARTICLESPAWNER,
79 CE_OVERRIDE_DAY_NIGHT_RATIO,
97 bool set_camera_point_target;
98 f32 camera_point_target_x;
99 f32 camera_point_target_y;
100 f32 camera_point_target_z;
103 std::string *formspec;
104 std::string *formname;
107 //} textures_updated;
114 bool collisiondetection;
115 bool collision_removal;
117 std::string *texture;
118 struct TileAnimationParams animation;
134 bool collisiondetection;
135 bool collision_removal;
138 std::string *texture;
140 struct TileAnimationParams animation;
142 } add_particlespawner;
145 } delete_particlespawner;
174 video::SColor *bgcolor;
176 std::vector<std::string> *params;
181 } override_day_night_ratio;
205 void add(u16 command)
207 std::map<u16, u16>::iterator n = m_packets.find(command);
208 if(n == m_packets.end())
210 m_packets[command] = 1;
220 for(std::map<u16, u16>::iterator
221 i = m_packets.begin();
222 i != m_packets.end(); ++i)
228 void print(std::ostream &o)
230 for(std::map<u16, u16>::iterator
231 i = m_packets.begin();
232 i != m_packets.end(); ++i)
235 <<" count "<<i->second
242 std::map<u16, u16> m_packets;
245 class ClientScripting;
248 class Client : public con::PeerHandler, public InventoryManager, public IGameDef
252 NOTE: Nothing is thread-safe here.
256 IrrlichtDevice *device,
257 const char *playername,
258 const std::string &password,
259 MapDrawControl &control,
260 IWritableTextureSource *tsrc,
261 IWritableShaderSource *shsrc,
262 IWritableItemDefManager *itemdef,
263 IWritableNodeDefManager *nodedef,
264 ISoundManager *sound,
265 MtEventManager *event,
267 GameUIFlags *game_ui_flags
275 request all threads managed by client to be stopped
283 The name of the local player should already be set when
284 calling this, as it is sent in the initialization.
286 void connect(Address address,
287 const std::string &address_name,
288 bool is_local_server);
291 Stuff that references the environment is valid only as
292 long as this is not called. (eg. Players)
293 If this throws a PeerNotFoundException, the connection has
296 void step(float dtime);
302 void handleCommand(NetworkPacket* pkt);
304 void handleCommand_Null(NetworkPacket* pkt) {};
305 void handleCommand_Deprecated(NetworkPacket* pkt);
306 void handleCommand_Hello(NetworkPacket* pkt);
307 void handleCommand_AuthAccept(NetworkPacket* pkt);
308 void handleCommand_AcceptSudoMode(NetworkPacket* pkt);
309 void handleCommand_DenySudoMode(NetworkPacket* pkt);
310 void handleCommand_InitLegacy(NetworkPacket* pkt);
311 void handleCommand_AccessDenied(NetworkPacket* pkt);
312 void handleCommand_RemoveNode(NetworkPacket* pkt);
313 void handleCommand_AddNode(NetworkPacket* pkt);
314 void handleCommand_BlockData(NetworkPacket* pkt);
315 void handleCommand_Inventory(NetworkPacket* pkt);
316 void handleCommand_TimeOfDay(NetworkPacket* pkt);
317 void handleCommand_ChatMessage(NetworkPacket* pkt);
318 void handleCommand_ActiveObjectRemoveAdd(NetworkPacket* pkt);
319 void handleCommand_ActiveObjectMessages(NetworkPacket* pkt);
320 void handleCommand_Movement(NetworkPacket* pkt);
321 void handleCommand_HP(NetworkPacket* pkt);
322 void handleCommand_Breath(NetworkPacket* pkt);
323 void handleCommand_MovePlayer(NetworkPacket* pkt);
324 void handleCommand_DeathScreen(NetworkPacket* pkt);
325 void handleCommand_AnnounceMedia(NetworkPacket* pkt);
326 void handleCommand_Media(NetworkPacket* pkt);
327 void handleCommand_NodeDef(NetworkPacket* pkt);
328 void handleCommand_ItemDef(NetworkPacket* pkt);
329 void handleCommand_PlaySound(NetworkPacket* pkt);
330 void handleCommand_StopSound(NetworkPacket* pkt);
331 void handleCommand_Privileges(NetworkPacket* pkt);
332 void handleCommand_InventoryFormSpec(NetworkPacket* pkt);
333 void handleCommand_DetachedInventory(NetworkPacket* pkt);
334 void handleCommand_ShowFormSpec(NetworkPacket* pkt);
335 void handleCommand_SpawnParticle(NetworkPacket* pkt);
336 void handleCommand_AddParticleSpawner(NetworkPacket* pkt);
337 void handleCommand_DeleteParticleSpawner(NetworkPacket* pkt);
338 void handleCommand_HudAdd(NetworkPacket* pkt);
339 void handleCommand_HudRemove(NetworkPacket* pkt);
340 void handleCommand_HudChange(NetworkPacket* pkt);
341 void handleCommand_HudSetFlags(NetworkPacket* pkt);
342 void handleCommand_HudSetParam(NetworkPacket* pkt);
343 void handleCommand_HudSetSky(NetworkPacket* pkt);
344 void handleCommand_CloudParams(NetworkPacket* pkt);
345 void handleCommand_OverrideDayNightRatio(NetworkPacket* pkt);
346 void handleCommand_LocalPlayerAnimations(NetworkPacket* pkt);
347 void handleCommand_EyeOffset(NetworkPacket* pkt);
348 void handleCommand_SrpBytesSandB(NetworkPacket* pkt);
350 void ProcessData(NetworkPacket *pkt);
352 void Send(NetworkPacket* pkt);
354 void interact(u8 action, const PointedThing& pointed);
356 void sendNodemetaFields(v3s16 p, const std::string &formname,
357 const StringMap &fields);
358 void sendInventoryFields(const std::string &formname,
359 const StringMap &fields);
360 void sendInventoryAction(InventoryAction *a);
361 void sendChatMessage(const std::wstring &message);
362 void sendChangePassword(const std::string &oldpassword,
363 const std::string &newpassword);
364 void sendDamage(u8 damage);
365 void sendBreath(u16 breath);
369 ClientEnvironment& getEnv() { return m_env; }
370 ITextureSource *tsrc() { return getTextureSource(); }
371 ISoundManager *sound() { return getSoundManager(); }
372 static const std::string &getBuiltinLuaPath();
373 static const std::string &getClientModsLuaPath();
375 virtual const std::vector<ModSpec> &getMods() const;
376 virtual const ModSpec* getModSpec(const std::string &modname) const;
378 // Causes urgent mesh updates (unlike Map::add/removeNodeWithEvent)
379 void removeNode(v3s16 p);
380 MapNode getNode(v3s16 p, bool *is_valid_position);
381 void addNode(v3s16 p, MapNode n, bool remove_metadata = true);
383 void setPlayerControl(PlayerControl &control);
385 void selectPlayerItem(u16 item);
386 u16 getPlayerItem() const
387 { return m_playeritem; }
389 // Returns true if the inventory of the local player has been
390 // updated from the server. If it is true, it is set to false.
391 bool getLocalInventoryUpdated();
392 // Copies the inventory of the local player to parameter
393 void getLocalInventory(Inventory &dst);
395 /* InventoryManager interface */
396 Inventory* getInventory(const InventoryLocation &loc);
397 void inventoryAction(InventoryAction *a);
399 const std::list<std::string> &getConnectedPlayerNames()
401 return m_env.getPlayerNames();
404 float getAnimationTime();
408 void setCrack(int level, v3s16 pos);
412 bool checkPrivilege(const std::string &priv) const
413 { return (m_privileges.count(priv) != 0); }
415 bool getChatMessage(std::wstring &message);
416 void typeChatMessage(const std::wstring& message);
418 u64 getMapSeed(){ return m_map_seed; }
420 void addUpdateMeshTask(v3s16 blockpos, bool ack_to_server=false, bool urgent=false);
421 // Including blocks at appropriate edges
422 void addUpdateMeshTaskWithEdge(v3s16 blockpos, bool ack_to_server=false, bool urgent=false);
423 void addUpdateMeshTaskForNode(v3s16 nodepos, bool ack_to_server=false, bool urgent=false);
425 void updateCameraOffset(v3s16 camera_offset)
426 { m_mesh_update_thread.m_camera_offset = camera_offset; }
428 bool hasClientEvents() const { return !m_client_event_queue.empty(); }
429 // Get event from queue. If queue is empty, it triggers an assertion failure.
430 ClientEvent getClientEvent();
432 bool accessDenied() const { return m_access_denied; }
434 bool reconnectRequested() const { return m_access_denied_reconnect; }
436 void setFatalError(const std::string &reason)
438 m_access_denied = true;
439 m_access_denied_reason = reason;
442 // Renaming accessDeniedReason to better name could be good as it's used to
443 // disconnect client when CSM failed.
444 const std::string &accessDeniedReason() const { return m_access_denied_reason; }
446 bool itemdefReceived()
447 { return m_itemdef_received; }
448 bool nodedefReceived()
449 { return m_nodedef_received; }
451 { return m_media_downloader == NULL; }
454 { return m_proto_ver; }
456 bool connectedToServer()
457 { return m_con.Connected(); }
459 float mediaReceiveProgress();
461 void afterContentReceived(IrrlichtDevice *device);
466 Minimap* getMinimap() { return m_minimap; }
467 void setCamera(Camera* camera) { m_camera = camera; }
472 bool shouldShowMinimap() const;
474 // IGameDef interface
475 virtual IItemDefManager* getItemDefManager();
476 virtual INodeDefManager* getNodeDefManager();
477 virtual ICraftDefManager* getCraftDefManager();
478 ITextureSource* getTextureSource();
479 virtual IShaderSource* getShaderSource();
480 IShaderSource *shsrc() { return getShaderSource(); }
481 scene::ISceneManager* getSceneManager();
482 virtual u16 allocateUnknownNodeId(const std::string &name);
483 virtual ISoundManager* getSoundManager();
484 virtual MtEventManager* getEventManager();
485 virtual ParticleManager* getParticleManager();
486 bool checkLocalPrivilege(const std::string &priv)
487 { return checkPrivilege(priv); }
488 virtual scene::IAnimatedMesh* getMesh(const std::string &filename);
490 virtual std::string getModStoragePath() const;
491 virtual bool registerModStorage(ModMetadata *meta);
492 virtual void unregisterModStorage(const std::string &name);
494 // The following set of functions is used by ClientMediaDownloader
495 // Insert a media file appropriately into the appropriate manager
496 bool loadMedia(const std::string &data, const std::string &filename);
497 // Send a request for conventional media transfer
498 void request_media(const std::vector<std::string> &file_requests);
500 LocalClientState getState() { return m_state; }
502 void makeScreenshot(IrrlichtDevice *device);
504 inline void pushToChatQueue(const std::wstring &input)
506 m_chat_queue.push(input);
509 ClientScripting *getScript() { return m_script; }
510 const bool moddingEnabled() const { return m_modding_enabled; }
512 inline void pushToEventQueue(const ClientEvent &event)
514 m_client_event_queue.push(event);
517 void showGameChat(const bool show = true);
518 void showGameHud(const bool show = true);
519 void showMinimap(const bool show = true);
520 void showProfiler(const bool show = true);
521 void showGameFog(const bool show = true);
522 void showGameDebug(const bool show = true);
524 IrrlichtDevice *getDevice() const { return m_device; }
528 // Virtual methods from con::PeerHandler
529 void peerAdded(con::Peer *peer);
530 void deletingPeer(con::Peer *peer, bool timeout);
532 void initLocalMapSaving(const Address &address,
533 const std::string &hostname,
534 bool is_local_server);
539 void sendPlayerPos();
540 // Send the item number 'item' as player item to the server
541 void sendPlayerItem(u16 item);
543 void deleteAuthData();
544 // helper method shared with clientpackethandler
545 static AuthMechanism choseAuthMech(const u32 mechs);
547 void sendLegacyInit(const char* playerName, const char* playerPassword);
548 void sendInit(const std::string &playerName);
549 void startAuth(AuthMechanism chosen_auth_mechanism);
550 void sendDeletedBlocks(std::vector<v3s16> &blocks);
551 void sendGotBlocks(v3s16 block);
552 void sendRemovedSounds(std::vector<s32> &soundList);
555 inline std::string getPlayerName()
556 { return m_env.getLocalPlayer()->getName(); }
558 float m_packetcounter_timer;
559 float m_connection_reinit_timer;
560 float m_avg_rtt_timer;
561 float m_playerpos_send_timer;
562 float m_ignore_damage_timer; // Used after server moves player
563 IntervalLimiter m_map_timer_and_unload_interval;
565 IWritableTextureSource *m_tsrc;
566 IWritableShaderSource *m_shsrc;
567 IWritableItemDefManager *m_itemdef;
568 IWritableNodeDefManager *m_nodedef;
569 ISoundManager *m_sound;
570 MtEventManager *m_event;
573 MeshUpdateThread m_mesh_update_thread;
574 ClientEnvironment m_env;
575 ParticleManager m_particle_manager;
576 con::Connection m_con;
577 IrrlichtDevice *m_device;
580 bool m_minimap_disabled_by_server;
581 // Server serialization version
584 // Used version of the protocol with server
585 // Values smaller than 25 only mean they are smaller than 25,
586 // and aren't accurate. We simply just don't know, because
587 // the server didn't send the version back then.
588 // If 0, server init hasn't been received yet.
592 bool m_inventory_updated;
593 Inventory *m_inventory_from_server;
594 float m_inventory_from_server_age;
595 PacketCounter m_packetcounter;
596 // Block mesh animation parameters
597 float m_animation_time;
600 // 0 <= m_daynight_i < DAYNIGHT_CACHE_COUNT
602 //u32 m_daynight_ratio;
603 std::queue<std::wstring> m_chat_queue;
605 // The authentication methods we can use to enter sudo mode (=change password)
606 u32 m_sudo_auth_methods;
608 // The seed returned by the server in TOCLIENT_INIT is stored here
612 std::string m_playername;
613 std::string m_password;
614 // If set, this will be sent (and cleared) upon a TOCLIENT_ACCEPT_SUDO_MODE
615 std::string m_new_password;
616 // Usable by auth mechanisms.
617 AuthMechanism m_chosen_auth_mech;
621 bool m_access_denied;
622 bool m_access_denied_reconnect;
623 std::string m_access_denied_reason;
624 std::queue<ClientEvent> m_client_event_queue;
625 bool m_itemdef_received;
626 bool m_nodedef_received;
627 ClientMediaDownloader *m_media_downloader;
629 // time_of_day speed approximation for old protocol
630 bool m_time_of_day_set;
631 float m_last_time_of_day_f;
632 float m_time_of_day_update_timer;
634 // An interval for generally sending object positions and stuff
635 float m_recommended_send_interval;
638 float m_removed_sounds_check_timer;
639 // Mapping from server sound ids to our sound ids
640 UNORDERED_MAP<s32, int> m_sounds_server_to_client;
641 // And the other way!
642 UNORDERED_MAP<int, s32> m_sounds_client_to_server;
643 // And relations to objects
644 UNORDERED_MAP<int, u16> m_sounds_to_objects;
647 UNORDERED_SET<std::string> m_privileges;
649 // Detached inventories
651 UNORDERED_MAP<std::string, Inventory*> m_detached_inventories;
653 // Storage for mesh data for creating multiple instances of the same mesh
654 StringMap m_mesh_data;
657 LocalClientState m_state;
659 // Used for saving server map to disk client-side
660 MapDatabase *m_localdb;
661 IntervalLimiter m_localdb_save_interval;
662 u16 m_cache_save_interval;
664 ClientScripting *m_script;
665 bool m_modding_enabled;
666 UNORDERED_MAP<std::string, ModMetadata *> m_mod_storages;
667 float m_mod_storage_save_timer;
668 GameUIFlags *m_game_ui_flags;
671 DISABLE_CLASS_COPY(Client);
674 #endif // !CLIENT_HEADER