X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fserver.h;h=813dc9828dc6fc4d67e9427dde21e9b6a8e166eb;hb=0e07a7157f4865c26b4d7d0ba6fb12f1de59373c;hp=29d47337db4eb8e9c724273d065714b83f59ad8a;hpb=df3c925b3ccae3bdba125e6dc3ecc740739baeab;p=dragonfireclient.git diff --git a/src/server.h b/src/server.h index 29d47337d..813dc9828 100644 --- a/src/server.h +++ b/src/server.h @@ -1,6 +1,6 @@ /* -Minetest-c55 -Copyright (C) 2010-2011 celeron55, Perttu Ahola +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -38,6 +38,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/string.h" #include "rollback_interface.h" // Needed for rollbackRevertActions() #include // Needed for rollbackRevertActions() +#include + +#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" struct LuaState; typedef struct lua_State lua_State; @@ -47,6 +50,7 @@ class IWritableCraftDefManager; class EventManager; class PlayerSAO; class IRollbackManager; +class EmergeManager; class ServerError : public std::exception { @@ -70,117 +74,55 @@ class ServerError : public std::exception */ v3f findSpawnPos(ServerMap &map); -/* - A structure containing the data needed for queueing the fetching - of blocks. -*/ -struct QueuedBlockEmerge -{ - v3s16 pos; - // key = peer_id, value = flags - core::map peer_ids; -}; -/* - This is a thread-safe class. -*/ -class BlockEmergeQueue +class MapEditEventIgnorer { public: - BlockEmergeQueue() + MapEditEventIgnorer(bool *flag): + m_flag(flag) { - m_mutex.Init(); + if(*m_flag == false) + *m_flag = true; + else + m_flag = NULL; } - ~BlockEmergeQueue() + ~MapEditEventIgnorer() { - JMutexAutoLock lock(m_mutex); - - core::list::Iterator i; - for(i=m_queue.begin(); i!=m_queue.end(); i++) + if(m_flag) { - QueuedBlockEmerge *q = *i; - delete q; + assert(*m_flag); + *m_flag = false; } } - /* - peer_id=0 adds with nobody to send to - */ - void addBlock(u16 peer_id, v3s16 pos, u8 flags) - { - DSTACK(__FUNCTION_NAME); - - JMutexAutoLock lock(m_mutex); - - if(peer_id != 0) - { - /* - Find if block is already in queue. - If it is, update the peer to it and quit. - */ - core::list::Iterator i; - for(i=m_queue.begin(); i!=m_queue.end(); i++) - { - QueuedBlockEmerge *q = *i; - if(q->pos == pos) - { - q->peer_ids[peer_id] = flags; - return; - } - } - } - - /* - Add the block - */ - QueuedBlockEmerge *q = new QueuedBlockEmerge; - q->pos = pos; - if(peer_id != 0) - q->peer_ids[peer_id] = flags; - m_queue.push_back(q); - } - - // Returned pointer must be deleted - // Returns NULL if queue is empty - QueuedBlockEmerge * pop() - { - JMutexAutoLock lock(m_mutex); - - core::list::Iterator i = m_queue.begin(); - if(i == m_queue.end()) - return NULL; - QueuedBlockEmerge *q = *i; - m_queue.erase(i); - return q; - } +private: + bool *m_flag; +}; - u32 size() +class MapEditEventAreaIgnorer +{ +public: + MapEditEventAreaIgnorer(VoxelArea *ignorevariable, const VoxelArea &a): + m_ignorevariable(ignorevariable) { - JMutexAutoLock lock(m_mutex); - return m_queue.size(); + if(m_ignorevariable->getVolume() == 0) + *m_ignorevariable = a; + else + m_ignorevariable = NULL; } - u32 peerItemCount(u16 peer_id) + ~MapEditEventAreaIgnorer() { - JMutexAutoLock lock(m_mutex); - - u32 count = 0; - - core::list::Iterator i; - for(i=m_queue.begin(); i!=m_queue.end(); i++) + if(m_ignorevariable) { - QueuedBlockEmerge *q = *i; - if(q->peer_ids.find(peer_id) != NULL) - count++; + assert(m_ignorevariable->getVolume() != 0); + *m_ignorevariable = VoxelArea(); } - - return count; } private: - core::list m_queue; - JMutex m_mutex; + VoxelArea *m_ignorevariable; }; class Server; @@ -200,30 +142,6 @@ class ServerThread : public SimpleThread void * Thread(); }; -class EmergeThread : public SimpleThread -{ - Server *m_server; - -public: - - EmergeThread(Server *server): - SimpleThread(), - m_server(server) - { - } - - void * Thread(); - - void trigger() - { - setRun(true); - if(IsRunning() == false) - { - Start(); - } - } -}; - struct PlayerInfo { u16 id; @@ -249,7 +167,7 @@ struct PrioritySortedBlockTransfer pos = a_pos; peer_id = a_peer_id; } - bool operator < (PrioritySortedBlockTransfer &other) + bool operator < (const PrioritySortedBlockTransfer &other) const { return priority < other.priority; } @@ -354,14 +272,14 @@ class RemoteClient dtime is used for resetting send radius at slow interval */ void GetNextBlocks(Server *server, float dtime, - core::array &dest); + std::vector &dest); void GotBlock(v3s16 p); void SentBlock(v3s16 p); void SetBlockNotSent(v3s16 p); - void SetBlocksNotSent(core::map &blocks); + void SetBlocksNotSent(std::map &blocks); s32 SendingCount() { @@ -397,7 +315,7 @@ class RemoteClient List of active objects that the client knows of. Value is dummy. */ - core::map m_known_objects; + std::set m_known_objects; private: /* @@ -409,7 +327,7 @@ class RemoteClient Key is position, value is dummy. No MapBlock* is stored here because the blocks can get deleted. */ - core::map m_blocks_sent; + std::set m_blocks_sent; s16 m_nearest_unsent_d; v3s16 m_last_center; float m_nearest_unsent_reset_timer; @@ -422,7 +340,7 @@ class RemoteClient Block is removed when GOTBLOCKS is received. Value is time from sending. (not used at the moment) */ - core::map m_blocks_sending; + std::map m_blocks_sending; /* Count of excess GotBlocks(). @@ -464,7 +382,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, void Receive(); void ProcessData(u8 *data, u32 datasize, u16 peer_id); - core::list getPlayerInfo(); + std::list getPlayerInfo(); // Environment must be locked when called void setTimeOfDay(u32 time) @@ -538,6 +456,35 @@ class Server : public con::PeerHandler, public MapEventReceiver, // Envlock and conlock should be locked when calling this void notifyPlayer(const char *name, const std::wstring msg); void notifyPlayers(const std::wstring msg); + void spawnParticle(const char *playername, + v3f pos, v3f velocity, v3f acceleration, + float expirationtime, float size, + bool collisiondetection, std::string texture); + + void spawnParticleAll(v3f pos, v3f velocity, v3f acceleration, + float expirationtime, float size, + bool collisiondetection, std::string texture); + + u32 addParticleSpawner(const char *playername, + u16 amount, float spawntime, + v3f minpos, v3f maxpos, + v3f minvel, v3f maxvel, + v3f minacc, v3f maxacc, + float minexptime, float maxexptime, + float minsize, float maxsize, + bool collisiondetection, std::string texture); + + u32 addParticleSpawnerAll(u16 amount, float spawntime, + v3f minpos, v3f maxpos, + v3f minvel, v3f maxvel, + v3f minacc, v3f maxacc, + float minexptime, float maxexptime, + float minsize, float maxsize, + bool collisiondetection, std::string texture); + + void deleteParticleSpawner(const char *playername, u32 id); + void deleteParticleSpawnerAll(u32 id); + void queueBlockEmerge(v3s16 blockpos, bool allow_generate); @@ -577,7 +524,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, IWritableCraftDefManager* getWritableCraftDefManager(); const ModSpec* getModSpec(const std::string &modname); - void getModNames(core::list &modlist); + void getModNames(std::list &modlist); std::string getBuiltinLuaPath(); std::string getWorldPath(){ return m_path_world; } @@ -636,9 +583,9 @@ class Server : public con::PeerHandler, public MapEventReceiver, */ // Envlock and conlock should be locked when calling these void sendRemoveNode(v3s16 p, u16 ignore_id=0, - core::list *far_players=NULL, float far_d_nodes=100); + std::list *far_players=NULL, float far_d_nodes=100); void sendAddNode(v3s16 p, MapNode n, u16 ignore_id=0, - core::list *far_players=NULL, float far_d_nodes=100); + std::list *far_players=NULL, float far_d_nodes=100); void setBlockNotSent(v3s16 p); // Environment and Connection must be locked when called @@ -650,12 +597,47 @@ class Server : public con::PeerHandler, public MapEventReceiver, void fillMediaCache(); void sendMediaAnnouncement(u16 peer_id); void sendRequestedMedia(u16 peer_id, - const core::list &tosend); + const std::list &tosend); void sendDetachedInventory(const std::string &name, u16 peer_id); void sendDetachedInventoryToAll(const std::string &name); void sendDetachedInventories(u16 peer_id); + // Adds a ParticleSpawner on peer with peer_id + void SendAddParticleSpawner(u16 peer_id, u16 amount, float spawntime, + v3f minpos, v3f maxpos, + v3f minvel, v3f maxvel, + v3f minacc, v3f maxacc, + float minexptime, float maxexptime, + float minsize, float maxsize, + bool collisiondetection, std::string texture, u32 id); + + // Adds a ParticleSpawner on all peers + void SendAddParticleSpawnerAll(u16 amount, float spawntime, + v3f minpos, v3f maxpos, + v3f minvel, v3f maxvel, + v3f minacc, v3f maxacc, + float minexptime, float maxexptime, + float minsize, float maxsize, + bool collisiondetection, std::string texture, u32 id); + + // Deletes ParticleSpawner on a single client + void SendDeleteParticleSpawner(u16 peer_id, u32 id); + + // Deletes ParticleSpawner on all clients + void SendDeleteParticleSpawnerAll(u32 id); + + // Spawns particle on single client + void SendSpawnParticle(u16 peer_id, + v3f pos, v3f velocity, v3f acceleration, + float expirationtime, float size, + bool collisiondetection, std::string texture); + + // Spawns particle on all clients + void SendSpawnParticleAll(v3f pos, v3f velocity, v3f acceleration, + float expirationtime, float size, + bool collisiondetection, std::string texture); + /* Something random */ @@ -719,7 +701,9 @@ class Server : public con::PeerHandler, public MapEventReceiver, // Some timers float m_liquid_transform_timer; + float m_liquid_transform_every; float m_print_info_timer; + float m_masterserver_timer; float m_objectdata_timer; float m_emergethread_trigger_timer; float m_savemap_timer; @@ -736,7 +720,8 @@ class Server : public con::PeerHandler, public MapEventReceiver, con::Connection m_con; JMutex m_con_mutex; // Connected clients (behind the con mutex) - core::map m_clients; + std::map m_clients; + u16 m_clients_number; //for announcing masterserver // Bann checking BanManager m_banmanager; @@ -782,10 +767,6 @@ class Server : public con::PeerHandler, public MapEventReceiver, // The server mainly operates in this thread ServerThread m_thread; - // This thread fetches and generates map - EmergeThread m_emergethread; - // Queue of block coordinates to be processed by the emerge thread - BlockEmergeQueue m_emerge_queue; /* Time related stuff @@ -819,7 +800,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, */ // Mod parent directory paths - core::list m_modspaths; + std::list m_modspaths; bool m_shutdown_requested; @@ -873,6 +854,11 @@ class Server : public con::PeerHandler, public MapEventReceiver, */ // key = name std::map m_detached_inventories; + + /* + Particles + */ + std::vector m_particlespawner_ids; }; /*