]> git.lizzy.rs Git - minetest.git/blob - src/server.h
676b40f9639453167875714c82c0ea2f07f44cf2
[minetest.git] / src / server.h
1 /*
2 Minetest-c55
3 Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
4
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.
9
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.
14
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.
18 */
19
20 #ifndef SERVER_HEADER
21 #define SERVER_HEADER
22
23 #include "connection.h"
24 #include "environment.h"
25 #include "common_irrlicht.h"
26 #include <string>
27 #include "porting.h"
28 #include "map.h"
29 #include "inventory.h"
30 #include "ban.h"
31 #include "gamedef.h"
32 #include "serialization.h" // For SER_FMT_VER_INVALID
33 #include "mods.h"
34 #include "inventorymanager.h"
35 #include "subgame.h"
36 #include "sound.h"
37 struct LuaState;
38 typedef struct lua_State lua_State;
39 class IWritableItemDefManager;
40 class IWritableNodeDefManager;
41 class IWritableCraftDefManager;
42 class EventManager;
43 class PlayerSAO;
44
45 class ServerError : public std::exception
46 {
47 public:
48         ServerError(const std::string &s)
49         {
50                 m_s = "ServerError: ";
51                 m_s += s;
52         }
53         virtual ~ServerError() throw()
54         {}
55         virtual const char * what() const throw()
56         {
57                 return m_s.c_str();
58         }
59         std::string m_s;
60 };
61
62 /*
63         Some random functions
64 */
65 v3f findSpawnPos(ServerMap &map);
66
67 /*
68         A structure containing the data needed for queueing the fetching
69         of blocks.
70 */
71 struct QueuedBlockEmerge
72 {
73         v3s16 pos;
74         // key = peer_id, value = flags
75         core::map<u16, u8> peer_ids;
76 };
77
78 /*
79         This is a thread-safe class.
80 */
81 class BlockEmergeQueue
82 {
83 public:
84         BlockEmergeQueue()
85         {
86                 m_mutex.Init();
87         }
88
89         ~BlockEmergeQueue()
90         {
91                 JMutexAutoLock lock(m_mutex);
92
93                 core::list<QueuedBlockEmerge*>::Iterator i;
94                 for(i=m_queue.begin(); i!=m_queue.end(); i++)
95                 {
96                         QueuedBlockEmerge *q = *i;
97                         delete q;
98                 }
99         }
100         
101         /*
102                 peer_id=0 adds with nobody to send to
103         */
104         void addBlock(u16 peer_id, v3s16 pos, u8 flags)
105         {
106                 DSTACK(__FUNCTION_NAME);
107         
108                 JMutexAutoLock lock(m_mutex);
109
110                 if(peer_id != 0)
111                 {
112                         /*
113                                 Find if block is already in queue.
114                                 If it is, update the peer to it and quit.
115                         */
116                         core::list<QueuedBlockEmerge*>::Iterator i;
117                         for(i=m_queue.begin(); i!=m_queue.end(); i++)
118                         {
119                                 QueuedBlockEmerge *q = *i;
120                                 if(q->pos == pos)
121                                 {
122                                         q->peer_ids[peer_id] = flags;
123                                         return;
124                                 }
125                         }
126                 }
127                 
128                 /*
129                         Add the block
130                 */
131                 QueuedBlockEmerge *q = new QueuedBlockEmerge;
132                 q->pos = pos;
133                 if(peer_id != 0)
134                         q->peer_ids[peer_id] = flags;
135                 m_queue.push_back(q);
136         }
137
138         // Returned pointer must be deleted
139         // Returns NULL if queue is empty
140         QueuedBlockEmerge * pop()
141         {
142                 JMutexAutoLock lock(m_mutex);
143
144                 core::list<QueuedBlockEmerge*>::Iterator i = m_queue.begin();
145                 if(i == m_queue.end())
146                         return NULL;
147                 QueuedBlockEmerge *q = *i;
148                 m_queue.erase(i);
149                 return q;
150         }
151
152         u32 size()
153         {
154                 JMutexAutoLock lock(m_mutex);
155                 return m_queue.size();
156         }
157         
158         u32 peerItemCount(u16 peer_id)
159         {
160                 JMutexAutoLock lock(m_mutex);
161
162                 u32 count = 0;
163
164                 core::list<QueuedBlockEmerge*>::Iterator i;
165                 for(i=m_queue.begin(); i!=m_queue.end(); i++)
166                 {
167                         QueuedBlockEmerge *q = *i;
168                         if(q->peer_ids.find(peer_id) != NULL)
169                                 count++;
170                 }
171
172                 return count;
173         }
174
175 private:
176         core::list<QueuedBlockEmerge*> m_queue;
177         JMutex m_mutex;
178 };
179
180 class Server;
181
182 class ServerThread : public SimpleThread
183 {
184         Server *m_server;
185
186 public:
187
188         ServerThread(Server *server):
189                 SimpleThread(),
190                 m_server(server)
191         {
192         }
193
194         void * Thread();
195 };
196
197 class EmergeThread : public SimpleThread
198 {
199         Server *m_server;
200
201 public:
202
203         EmergeThread(Server *server):
204                 SimpleThread(),
205                 m_server(server)
206         {
207         }
208
209         void * Thread();
210
211         void trigger()
212         {
213                 setRun(true);
214                 if(IsRunning() == false)
215                 {
216                         Start();
217                 }
218         }
219 };
220
221 struct PlayerInfo
222 {
223         u16 id;
224         char name[PLAYERNAME_SIZE];
225         v3f position;
226         Address address;
227         float avg_rtt;
228
229         PlayerInfo();
230         void PrintLine(std::ostream *s);
231 };
232
233 /*
234         Used for queueing and sorting block transfers in containers
235         
236         Lower priority number means higher priority.
237 */
238 struct PrioritySortedBlockTransfer
239 {
240         PrioritySortedBlockTransfer(float a_priority, v3s16 a_pos, u16 a_peer_id)
241         {
242                 priority = a_priority;
243                 pos = a_pos;
244                 peer_id = a_peer_id;
245         }
246         bool operator < (PrioritySortedBlockTransfer &other)
247         {
248                 return priority < other.priority;
249         }
250         float priority;
251         v3s16 pos;
252         u16 peer_id;
253 };
254
255 struct MediaRequest
256 {
257         std::string name;
258
259         MediaRequest(const std::string &name_=""):
260                 name(name_)
261         {}
262 };
263
264 struct MediaInfo
265 {
266         std::string path;
267         std::string sha1_digest;
268
269         MediaInfo(const std::string path_="",
270                         const std::string sha1_digest_=""):
271                 path(path_),
272                 sha1_digest(sha1_digest_)
273         {
274         }
275 };
276
277 struct ServerSoundParams
278 {
279         float gain;
280         std::string to_player;
281         enum Type{
282                 SSP_LOCAL=0,
283                 SSP_POSITIONAL=1,
284                 SSP_OBJECT=2
285         } type;
286         v3f pos;
287         u16 object;
288         float max_hear_distance;
289         bool loop;
290
291         ServerSoundParams():
292                 gain(1.0),
293                 to_player(""),
294                 type(SSP_LOCAL),
295                 pos(0,0,0),
296                 object(0),
297                 max_hear_distance(32*BS),
298                 loop(false)
299         {}
300         
301         v3f getPos(ServerEnvironment *env, bool *pos_exists) const;
302 };
303
304 struct ServerPlayingSound
305 {
306         ServerSoundParams params;
307         std::set<u16> clients; // peer ids
308 };
309
310 class RemoteClient
311 {
312 public:
313         // peer_id=0 means this client has no associated peer
314         // NOTE: If client is made allowed to exist while peer doesn't,
315         //       this has to be set to 0 when there is no peer.
316         //       Also, the client must be moved to some other container.
317         u16 peer_id;
318         // The serialization version to use with the client
319         u8 serialization_version;
320         //
321         u16 net_proto_version;
322         // Version is stored in here after INIT before INIT2
323         u8 pending_serialization_version;
324
325         bool definitions_sent;
326
327         RemoteClient():
328                 m_time_from_building(9999),
329                 m_excess_gotblocks(0)
330         {
331                 peer_id = 0;
332                 serialization_version = SER_FMT_VER_INVALID;
333                 net_proto_version = 0;
334                 pending_serialization_version = SER_FMT_VER_INVALID;
335                 definitions_sent = false;
336                 m_nearest_unsent_d = 0;
337                 m_nearest_unsent_reset_timer = 0.0;
338                 m_nothing_to_send_counter = 0;
339                 m_nothing_to_send_pause_timer = 0;
340         }
341         ~RemoteClient()
342         {
343         }
344         
345         /*
346                 Finds block that should be sent next to the client.
347                 Environment should be locked when this is called.
348                 dtime is used for resetting send radius at slow interval
349         */
350         void GetNextBlocks(Server *server, float dtime,
351                         core::array<PrioritySortedBlockTransfer> &dest);
352
353         void GotBlock(v3s16 p);
354
355         void SentBlock(v3s16 p);
356
357         void SetBlockNotSent(v3s16 p);
358         void SetBlocksNotSent(core::map<v3s16, MapBlock*> &blocks);
359
360         s32 SendingCount()
361         {
362                 return m_blocks_sending.size();
363         }
364         
365         // Increments timeouts and removes timed-out blocks from list
366         // NOTE: This doesn't fix the server-not-sending-block bug
367         //       because it is related to emerging, not sending.
368         //void RunSendingTimeouts(float dtime, float timeout);
369
370         void PrintInfo(std::ostream &o)
371         {
372                 o<<"RemoteClient "<<peer_id<<": "
373                                 <<"m_blocks_sent.size()="<<m_blocks_sent.size()
374                                 <<", m_blocks_sending.size()="<<m_blocks_sending.size()
375                                 <<", m_nearest_unsent_d="<<m_nearest_unsent_d
376                                 <<", m_excess_gotblocks="<<m_excess_gotblocks
377                                 <<std::endl;
378                 m_excess_gotblocks = 0;
379         }
380
381         // Time from last placing or removing blocks
382         float m_time_from_building;
383         
384         /*JMutex m_dig_mutex;
385         float m_dig_time_remaining;
386         // -1 = not digging
387         s16 m_dig_tool_item;
388         v3s16 m_dig_position;*/
389         
390         /*
391                 List of active objects that the client knows of.
392                 Value is dummy.
393         */
394         core::map<u16, bool> m_known_objects;
395
396 private:
397         /*
398                 Blocks that have been sent to client.
399                 - These don't have to be sent again.
400                 - A block is cleared from here when client says it has
401                   deleted it from it's memory
402                 
403                 Key is position, value is dummy.
404                 No MapBlock* is stored here because the blocks can get deleted.
405         */
406         core::map<v3s16, bool> m_blocks_sent;
407         s16 m_nearest_unsent_d;
408         v3s16 m_last_center;
409         float m_nearest_unsent_reset_timer;
410         
411         /*
412                 Blocks that are currently on the line.
413                 This is used for throttling the sending of blocks.
414                 - The size of this list is limited to some value
415                 Block is added when it is sent with BLOCKDATA.
416                 Block is removed when GOTBLOCKS is received.
417                 Value is time from sending. (not used at the moment)
418         */
419         core::map<v3s16, float> m_blocks_sending;
420
421         /*
422                 Count of excess GotBlocks().
423                 There is an excess amount because the client sometimes
424                 gets a block so late that the server sends it again,
425                 and the client then sends two GOTBLOCKs.
426                 This is resetted by PrintInfo()
427         */
428         u32 m_excess_gotblocks;
429         
430         // CPU usage optimization
431         u32 m_nothing_to_send_counter;
432         float m_nothing_to_send_pause_timer;
433 };
434
435 class Server : public con::PeerHandler, public MapEventReceiver,
436                 public InventoryManager, public IGameDef,
437                 public IBackgroundBlockEmerger
438 {
439 public:
440         /*
441                 NOTE: Every public method should be thread-safe
442         */
443         
444         Server(
445                 const std::string &path_world,
446                 const std::string &path_config,
447                 const SubgameSpec &gamespec,
448                 bool simple_singleplayer_mode
449         );
450         ~Server();
451         void start(unsigned short port);
452         void stop();
453         // This is mainly a way to pass the time to the server.
454         // Actual processing is done in an another thread.
455         void step(float dtime);
456         // This is run by ServerThread and does the actual processing
457         void AsyncRunStep();
458         void Receive();
459         void ProcessData(u8 *data, u32 datasize, u16 peer_id);
460
461         core::list<PlayerInfo> getPlayerInfo();
462
463         // Environment must be locked when called
464         void setTimeOfDay(u32 time)
465         {
466                 m_env->setTimeOfDay(time);
467                 m_time_of_day_send_timer = 0;
468         }
469
470         bool getShutdownRequested()
471         {
472                 return m_shutdown_requested;
473         }
474         
475         /*
476                 Shall be called with the environment locked.
477                 This is accessed by the map, which is inside the environment,
478                 so it shouldn't be a problem.
479         */
480         void onMapEditEvent(MapEditEvent *event);
481
482         /*
483                 Shall be called with the environment and the connection locked.
484         */
485         Inventory* getInventory(const InventoryLocation &loc);
486         void setInventoryModified(const InventoryLocation &loc);
487
488         // Connection must be locked when called
489         std::wstring getStatusString();
490
491         void requestShutdown(void)
492         {
493                 m_shutdown_requested = true;
494         }
495
496         // Returns -1 if failed, sound handle on success
497         // Envlock + conlock
498         s32 playSound(const SimpleSoundSpec &spec, const ServerSoundParams &params);
499         void stopSound(s32 handle);
500         
501         // Envlock + conlock
502         std::set<std::string> getPlayerEffectivePrivs(const std::string &name);
503         bool checkPriv(const std::string &name, const std::string &priv);
504         void reportPrivsModified(const std::string &name=""); // ""=all
505
506         // Saves g_settings to configpath given at initialization
507         void saveConfig();
508
509         void setIpBanned(const std::string &ip, const std::string &name)
510         {
511                 m_banmanager.add(ip, name);
512                 return;
513         }
514
515         void unsetIpBanned(const std::string &ip_or_name)
516         {
517                 m_banmanager.remove(ip_or_name);
518                 return;
519         }
520
521         std::string getBanDescription(const std::string &ip_or_name)
522         {
523                 return m_banmanager.getBanDescription(ip_or_name);
524         }
525
526         Address getPeerAddress(u16 peer_id)
527         {
528                 return m_con.GetPeerAddress(peer_id);
529         }
530         
531         // Envlock and conlock should be locked when calling this
532         void notifyPlayer(const char *name, const std::wstring msg);
533         void notifyPlayers(const std::wstring msg);
534
535         void queueBlockEmerge(v3s16 blockpos, bool allow_generate);
536         
537         // Envlock and conlock should be locked when using Lua
538         lua_State *getLua(){ return m_lua; }
539         
540         // IGameDef interface
541         // Under envlock
542         virtual IItemDefManager* getItemDefManager();
543         virtual INodeDefManager* getNodeDefManager();
544         virtual ICraftDefManager* getCraftDefManager();
545         virtual ITextureSource* getTextureSource();
546         virtual u16 allocateUnknownNodeId(const std::string &name);
547         virtual ISoundManager* getSoundManager();
548         virtual MtEventManager* getEventManager();
549         
550         IWritableItemDefManager* getWritableItemDefManager();
551         IWritableNodeDefManager* getWritableNodeDefManager();
552         IWritableCraftDefManager* getWritableCraftDefManager();
553
554         const ModSpec* getModSpec(const std::string &modname);
555         std::string getBuiltinLuaPath();
556         
557         std::string getWorldPath(){ return m_path_world; }
558
559         bool isSingleplayer(){ return m_simple_singleplayer_mode; }
560
561         void setAsyncFatalError(const std::string &error)
562         {
563                 m_async_fatal_error.set(error);
564         }
565
566 private:
567
568         // con::PeerHandler implementation.
569         // These queue stuff to be processed by handlePeerChanges().
570         // As of now, these create and remove clients and players.
571         void peerAdded(con::Peer *peer);
572         void deletingPeer(con::Peer *peer, bool timeout);
573         
574         /*
575                 Static send methods
576         */
577         
578         static void SendHP(con::Connection &con, u16 peer_id, u8 hp);
579         static void SendAccessDenied(con::Connection &con, u16 peer_id,
580                         const std::wstring &reason);
581         static void SendDeathscreen(con::Connection &con, u16 peer_id,
582                         bool set_camera_point_target, v3f camera_point_target);
583         static void SendItemDef(con::Connection &con, u16 peer_id,
584                         IItemDefManager *itemdef);
585         static void SendNodeDef(con::Connection &con, u16 peer_id,
586                         INodeDefManager *nodedef);
587         
588         /*
589                 Non-static send methods.
590                 Conlock should be always used.
591                 Envlock usage is documented badly but it's easy to figure out
592                 which ones access the environment.
593         */
594
595         // Envlock and conlock should be locked when calling these
596         void SendInventory(u16 peer_id);
597         void SendChatMessage(u16 peer_id, const std::wstring &message);
598         void BroadcastChatMessage(const std::wstring &message);
599         void SendPlayerHP(u16 peer_id);
600         void SendMovePlayer(u16 peer_id);
601         void SendPlayerPrivileges(u16 peer_id);
602         /*
603                 Send a node removal/addition event to all clients except ignore_id.
604                 Additionally, if far_players!=NULL, players further away than
605                 far_d_nodes are ignored and their peer_ids are added to far_players
606         */
607         // Envlock and conlock should be locked when calling these
608         void sendRemoveNode(v3s16 p, u16 ignore_id=0,
609                         core::list<u16> *far_players=NULL, float far_d_nodes=100);
610         void sendAddNode(v3s16 p, MapNode n, u16 ignore_id=0,
611                         core::list<u16> *far_players=NULL, float far_d_nodes=100);
612         void setBlockNotSent(v3s16 p);
613         
614         // Environment and Connection must be locked when called
615         void SendBlockNoLock(u16 peer_id, MapBlock *block, u8 ver);
616         
617         // Sends blocks to clients (locks env and con on its own)
618         void SendBlocks(float dtime);
619         
620         void fillMediaCache();
621         void sendMediaAnnouncement(u16 peer_id);
622         void sendRequestedMedia(u16 peer_id,
623                         const core::list<MediaRequest> &tosend);
624
625         /*
626                 Something random
627         */
628         
629         void DiePlayer(u16 peer_id);
630         void RespawnPlayer(u16 peer_id);
631         
632         void UpdateCrafting(u16 peer_id);
633         
634         // When called, connection mutex should be locked
635         RemoteClient* getClient(u16 peer_id);
636         
637         // When called, environment mutex should be locked
638         std::string getPlayerName(u16 peer_id)
639         {
640                 Player *player = m_env->getPlayer(peer_id);
641                 if(player == NULL)
642                         return "[id="+itos(peer_id)+"]";
643                 return player->getName();
644         }
645
646         // When called, environment mutex should be locked
647         PlayerSAO* getPlayerSAO(u16 peer_id)
648         {
649                 Player *player = m_env->getPlayer(peer_id);
650                 if(player == NULL)
651                         return NULL;
652                 return player->getPlayerSAO();
653         }
654
655         /*
656                 Get a player from memory or creates one.
657                 If player is already connected, return NULL
658                 Does not verify/modify auth info and password.
659
660                 Call with env and con locked.
661         */
662         PlayerSAO *emergePlayer(const char *name, u16 peer_id);
663         
664         // Locks environment and connection by its own
665         struct PeerChange;
666         void handlePeerChange(PeerChange &c);
667         void handlePeerChanges();
668
669         /*
670                 Variables
671         */
672         
673         // World directory
674         std::string m_path_world;
675         // Path to user's configuration file ("" = no configuration file)
676         std::string m_path_config;
677         // Subgame specification
678         SubgameSpec m_gamespec;
679         // If true, do not allow multiple players and hide some multiplayer
680         // functionality
681         bool m_simple_singleplayer_mode;
682
683         // Thread can set; step() will throw as ServerError
684         MutexedVariable<std::string> m_async_fatal_error;
685         
686         // Some timers
687         float m_liquid_transform_timer;
688         float m_print_info_timer;
689         float m_objectdata_timer;
690         float m_emergethread_trigger_timer;
691         float m_savemap_timer;
692         IntervalLimiter m_map_timer_and_unload_interval;
693         
694         // NOTE: If connection and environment are both to be locked,
695         // environment shall be locked first.
696
697         // Environment
698         ServerEnvironment *m_env;
699         JMutex m_env_mutex;
700         
701         // Connection
702         con::Connection m_con;
703         JMutex m_con_mutex;
704         // Connected clients (behind the con mutex)
705         core::map<u16, RemoteClient*> m_clients;
706
707         // Bann checking
708         BanManager m_banmanager;
709
710         // Scripting
711         // Envlock and conlock should be locked when using Lua
712         lua_State *m_lua;
713
714         // Item definition manager
715         IWritableItemDefManager *m_itemdef;
716         
717         // Node definition manager
718         IWritableNodeDefManager *m_nodedef;
719         
720         // Craft definition manager
721         IWritableCraftDefManager *m_craftdef;
722         
723         // Event manager
724         EventManager *m_event;
725         
726         // Mods
727         core::list<ModSpec> m_mods;
728         
729         /*
730                 Threads
731         */
732         
733         // A buffer for time steps
734         // step() increments and AsyncRunStep() run by m_thread reads it.
735         float m_step_dtime;
736         JMutex m_step_dtime_mutex;
737
738         // The server mainly operates in this thread
739         ServerThread m_thread;
740         // This thread fetches and generates map
741         EmergeThread m_emergethread;
742         // Queue of block coordinates to be processed by the emerge thread
743         BlockEmergeQueue m_emerge_queue;
744         
745         /*
746                 Time related stuff
747         */
748
749         // Timer for sending time of day over network
750         float m_time_of_day_send_timer;
751         // Uptime of server in seconds
752         MutexedVariable<double> m_uptime;
753         
754         /*
755                 Peer change queue.
756                 Queues stuff from peerAdded() and deletingPeer() to
757                 handlePeerChanges()
758         */
759         enum PeerChangeType
760         {
761                 PEER_ADDED,
762                 PEER_REMOVED
763         };
764         struct PeerChange
765         {
766                 PeerChangeType type;
767                 u16 peer_id;
768                 bool timeout;
769         };
770         Queue<PeerChange> m_peer_change_queue;
771
772         /*
773                 Random stuff
774         */
775         
776         // Mod parent directory paths
777         core::list<std::string> m_modspaths;
778
779         bool m_shutdown_requested;
780
781         /*
782                 Map edit event queue. Automatically receives all map edits.
783                 The constructor of this class registers us to receive them through
784                 onMapEditEvent
785
786                 NOTE: Should these be moved to actually be members of
787                 ServerEnvironment?
788         */
789
790         /*
791                 Queue of map edits from the environment for sending to the clients
792                 This is behind m_env_mutex
793         */
794         Queue<MapEditEvent*> m_unsent_map_edit_queue;
795         /*
796                 Set to true when the server itself is modifying the map and does
797                 all sending of information by itself.
798                 This is behind m_env_mutex
799         */
800         bool m_ignore_map_edit_events;
801         /*
802                 If a non-empty area, map edit events contained within are left
803                 unsent. Done at map generation time to speed up editing of the
804                 generated area, as it will be sent anyway.
805                 This is behind m_env_mutex
806         */
807         VoxelArea m_ignore_map_edit_events_area;
808         /*
809                 If set to !=0, the incoming MapEditEvents are modified to have
810                 this peed id as the disabled recipient
811                 This is behind m_env_mutex
812         */
813         u16 m_ignore_map_edit_events_peer_id;
814
815         friend class EmergeThread;
816         friend class RemoteClient;
817
818         std::map<std::string,MediaInfo> m_media;
819
820         /*
821                 Sounds
822         */
823         std::map<s32, ServerPlayingSound> m_playing_sounds;
824         s32 m_next_sound_id;
825 };
826
827 /*
828         Runs a simple dedicated server loop.
829
830         Shuts down when run is set to false.
831 */
832 void dedicated_server_loop(Server &server, bool &run);
833
834 #endif
835