diff options
Diffstat (limited to 'src/server.cpp')
-rw-r--r-- | src/server.cpp | 206 |
1 files changed, 101 insertions, 105 deletions
diff --git a/src/server.cpp b/src/server.cpp index 7926b879f..5ecdddcbc 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -22,6 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <queue> #include <algorithm> #include "clientserver.h" +#include "ban.h" +#include "environment.h" #include "map.h" #include "jmutexautolock.h" #include "main.h" @@ -34,7 +36,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "settings.h" #include "profiler.h" #include "log.h" -#include "script/cpp_api/scriptapi.h" +#include "scripting_game.h" #include "nodedef.h" #include "itemdef.h" #include "craftdef.h" @@ -58,6 +60,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/mathconstants.h" #include "rollback.h" #include "util/serialize.h" +#include "util/thread.h" #include "defaultsettings.h" class ClientNotFoundException : public BaseException @@ -68,6 +71,21 @@ public: {} }; +class ServerThread : public SimpleThread +{ + Server *m_server; + +public: + + ServerThread(Server *server): + SimpleThread(), + m_server(server) + { + } + + void * Thread(); +}; + void * ServerThread::Thread() { ThreadStarted(); @@ -614,45 +632,22 @@ void RemoteClient::SetBlocksNotSent(std::map<v3s16, MapBlock*> &blocks) } /* - PlayerInfo -*/ - -PlayerInfo::PlayerInfo() -{ - name[0] = 0; - avg_rtt = 0; -} - -void PlayerInfo::PrintLine(std::ostream *s) -{ - (*s)<<id<<": "; - (*s)<<"\""<<name<<"\" (" - <<(position.X/10)<<","<<(position.Y/10) - <<","<<(position.Z/10)<<") "; - address.print(s); - (*s)<<" avg_rtt="<<avg_rtt; - (*s)<<std::endl; -} - -/* Server */ Server::Server( const std::string &path_world, - const std::string &path_config, const SubgameSpec &gamespec, bool simple_singleplayer_mode ): m_path_world(path_world), - m_path_config(path_config), m_gamespec(gamespec), m_simple_singleplayer_mode(simple_singleplayer_mode), m_async_fatal_error(""), m_env(NULL), m_con(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, g_settings->getBool("enable_ipv6") && g_settings->getBool("ipv6_server"), this), - m_banmanager(path_world+DIR_DELIM+"ipban.txt"), + m_banmanager(NULL), m_rollback(NULL), m_rollback_sink_enabled(true), m_enable_rollback_recording(false), @@ -662,7 +657,7 @@ Server::Server( m_nodedef(createNodeDefManager()), m_craftdef(createCraftDefManager()), m_event(new EventManager()), - m_thread(this), + m_thread(NULL), m_time_of_day_send_timer(0), m_uptime(0), m_shutdown_requested(false), @@ -695,7 +690,6 @@ Server::Server( else infostream<<std::endl; infostream<<"- world: "<<m_path_world<<std::endl; - infostream<<"- config: "<<m_path_config<<std::endl; infostream<<"- game: "<<m_gamespec.path<<std::endl; // Initialize default settings and override defaults with those provided @@ -704,10 +698,17 @@ Server::Server( Settings gamedefaults; getGameMinetestConfig(gamespec.path, gamedefaults); override_default_settings(g_settings, &gamedefaults); - + + // Create server thread + m_thread = new ServerThread(this); + // Create emerge manager m_emerge = new EmergeManager(this); - + + // Create ban manager + std::string ban_path = m_path_world+DIR_DELIM+"ipban.txt"; + m_banmanager = new BanManager(ban_path); + // Create rollback manager std::string rollback_path = m_path_world+DIR_DELIM+"rollback.txt"; m_rollback = createRollbackManager(rollback_path, this); @@ -773,7 +774,7 @@ Server::Server( infostream<<"Server: Initializing Lua"<<std::endl; - m_script = new ScriptApi(this); + m_script = new GameScripting(this); // Load and run builtin.lua @@ -816,7 +817,7 @@ Server::Server( // Initialize Environment ServerMap *servermap = new ServerMap(path_world, this, m_emerge); - m_env = new ServerEnvironment(servermap, m_script, this, this); + m_env = new ServerEnvironment(servermap, m_script, this, m_emerge); // Run some callbacks after the MG params have been set up but before activation MapgenParams *mgparams = servermap->getMapgenParams(); @@ -913,6 +914,7 @@ Server::~Server() Stop threads */ stop(); + delete m_thread; //shutdown all emerge threads first! delete m_emerge; @@ -936,6 +938,7 @@ Server::~Server() // Delete things in the reverse order of creation delete m_env; delete m_rollback; + delete m_banmanager; delete m_event; delete m_itemdef; delete m_nodedef; @@ -961,15 +964,15 @@ void Server::start(unsigned short port) infostream<<"Starting server on port "<<port<<"..."<<std::endl; // Stop thread if already running - m_thread.stop(); + m_thread->stop(); // Initialize connection m_con.SetTimeoutMs(30); m_con.Serve(port); // Start thread - m_thread.setRun(true); - m_thread.Start(); + m_thread->setRun(true); + m_thread->Start(); // ASCII art for the win! actionstream @@ -991,9 +994,9 @@ void Server::stop() infostream<<"Server: Stopping and waiting threads"<<std::endl; // Stop threads (set run=false first so both start stopping) - m_thread.setRun(false); + m_thread->setRun(false); //m_emergethread.setRun(false); - m_thread.stop(); + m_thread->stop(); //m_emergethread.stop(); infostream<<"Server: Threads stopped"<<std::endl; @@ -1086,15 +1089,15 @@ void Server::AsyncRunStep() //JMutexAutoLock envlock(m_env_mutex); JMutexAutoLock conlock(m_con_mutex); + u16 time = m_env->getTimeOfDay(); + float time_speed = g_settings->getFloat("time_speed"); + for(std::map<u16, RemoteClient*>::iterator i = m_clients.begin(); i != m_clients.end(); ++i) { RemoteClient *client = i->second; - SharedBuffer<u8> data = makePacket_TOCLIENT_TIME_OF_DAY( - m_env->getTimeOfDay(), g_settings->getFloat("time_speed")); - // Send as reliable - m_con.Send(client->peer_id, 0, data, true); + SendTimeOfDay(client->peer_id, time, time_speed); } } } @@ -1680,8 +1683,7 @@ void Server::AsyncRunStep() { counter = 0.0; - for (unsigned int i = 0; i != m_emerge->emergethread.size(); i++) - m_emerge->emergethread[i]->trigger(); + m_emerge->triggerAllThreads(); // Update m_enable_rollback_recording here too m_enable_rollback_recording = @@ -1701,8 +1703,8 @@ void Server::AsyncRunStep() ScopeProfiler sp(g_profiler, "Server: saving stuff"); //Ban stuff - if(m_banmanager.isModified()) - m_banmanager.save(); + if(m_banmanager->isModified()) + m_banmanager->save(); // Save changed parts of map m_env->getMap().save(MOD_STATE_WRITE_NEEDED); @@ -1772,13 +1774,13 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) addr_s = address.serializeString(); // drop player if is ip is banned - if(m_banmanager.isIpBanned(addr_s)){ + if(m_banmanager->isIpBanned(addr_s)){ infostream<<"Server: A banned client tried to connect from " <<addr_s<<"; banned name was " - <<m_banmanager.getBanName(addr_s)<<std::endl; + <<m_banmanager->getBanName(addr_s)<<std::endl; // This actually doesn't seem to transfer to the client DenyAccess(peer_id, L"Your ip is banned. Banned name was " - +narrow_to_wide(m_banmanager.getBanName(addr_s))); + +narrow_to_wide(m_banmanager->getBanName(addr_s))); m_con.DeletePeer(peer_id); return; } @@ -2159,9 +2161,9 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) // Send time of day { - SharedBuffer<u8> data = makePacket_TOCLIENT_TIME_OF_DAY( - m_env->getTimeOfDay(), g_settings->getFloat("time_speed")); - m_con.Send(peer_id, 0, data, true); + u16 time = m_env->getTimeOfDay(); + float time_speed = g_settings->getFloat("time_speed"); + SendTimeOfDay(peer_id, time, time_speed); } // Note things in chat if not in simple singleplayer mode @@ -3203,6 +3205,12 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) } } +void Server::setTimeOfDay(u32 time) +{ + m_env->setTimeOfDay(time); + m_time_of_day_send_timer = 0; +} + void Server::onMapEditEvent(MapEditEvent *event) { //infostream<<"Server::onMapEditEvent()"<<std::endl; @@ -3293,48 +3301,6 @@ void Server::setInventoryModified(const InventoryLocation &loc) } } -//std::list<PlayerInfo> Server::getPlayerInfo() -//{ -// DSTACK(__FUNCTION_NAME); -// JMutexAutoLock envlock(m_env_mutex); -// JMutexAutoLock conlock(m_con_mutex); -// -// std::list<PlayerInfo> list; -// -// std::list<Player*> players = m_env->getPlayers(); -// -// std::list<Player*>::iterator i; -// for(i = players.begin(); -// i != players.end(); ++i) -// { -// PlayerInfo info; -// -// Player *player = *i; -// -// try{ -// // Copy info from connection to info struct -// info.id = player->peer_id; -// info.address = m_con.GetPeerAddress(player->peer_id); -// info.avg_rtt = m_con.GetPeerAvgRTT(player->peer_id); -// } -// catch(con::PeerNotFoundException &e) -// { -// // Set dummy peer info -// info.id = 0; -// info.address = Address(0,0,0,0,0); -// info.avg_rtt = 0.0; -// } -// -// snprintf(info.name, PLAYERNAME_SIZE, "%s", player->getName()); -// info.position = player->getPosition(); -// -// list.push_back(info); -// } -// -// return list; -//} - - void Server::peerAdded(con::Peer *peer) { DSTACK(__FUNCTION_NAME); @@ -3841,6 +3807,20 @@ void Server::BroadcastChatMessage(const std::wstring &message) } } +void Server::SendTimeOfDay(u16 peer_id, u16 time, f32 time_speed) +{ + DSTACK(__FUNCTION_NAME); + + // Make packet + SharedBuffer<u8> data(2+2+4); + writeU16(&data[0], TOCLIENT_TIME_OF_DAY); + writeU16(&data[2], time); + writeF1000(&data[4], time_speed); + + // Send as reliable + m_con.Send(peer_id, 0, data, true); +} + void Server::SendPlayerHP(u16 peer_id) { DSTACK(__FUNCTION_NAME); @@ -4774,9 +4754,6 @@ void Server::DeleteClient(u16 peer_id, ClientDeletionReason reason) delete m_clients[peer_id]; m_clients.erase(peer_id); - // Send player info to all remaining clients - //SendPlayerInfos(); - // Send leave chat message to all remaining clients if(message.length() != 0) BroadcastChatMessage(message); @@ -4818,6 +4795,22 @@ RemoteClient* Server::getClientNoEx(u16 peer_id) return n->second; } +std::string Server::getPlayerName(u16 peer_id) +{ + Player *player = m_env->getPlayer(peer_id); + if(player == NULL) + return "[id="+itos(peer_id)+"]"; + return player->getName(); +} + +PlayerSAO* Server::getPlayerSAO(u16 peer_id) +{ + Player *player = m_env->getPlayer(peer_id); + if(player == NULL) + return NULL; + return player->getPlayerSAO(); +} + std::wstring Server::getStatusString() { std::wostringstream os(std::ios_base::binary); @@ -4906,11 +4899,19 @@ void Server::reportInventoryFormspecModified(const std::string &name) SendPlayerInventoryFormspec(player->peer_id); } -// Saves g_settings to configpath given at initialization -void Server::saveConfig() +void Server::setIpBanned(const std::string &ip, const std::string &name) { - if(m_path_config != "") - g_settings->updateConfigFile(m_path_config.c_str()); + m_banmanager->add(ip, name); +} + +void Server::unsetIpBanned(const std::string &ip_or_name) +{ + m_banmanager->remove(ip_or_name); +} + +std::string Server::getBanDescription(const std::string &ip_or_name) +{ + return m_banmanager->getBanDescription(ip_or_name); } void Server::notifyPlayer(const char *name, const std::wstring msg, const bool prepend = true) @@ -4942,7 +4943,7 @@ u32 Server::hudAdd(Player *player, HudElement *form) { if (!player) return -1; - u32 id = hud_get_free_id(player); + u32 id = player->getFreeHudID(); if (id < player->hud.size()) player->hud[id] = form; else @@ -5101,11 +5102,6 @@ void Server::deleteParticleSpawnerAll(u32 id) SendDeleteParticleSpawnerAll(id); } -void Server::queueBlockEmerge(v3s16 blockpos, bool allow_generate) -{ - m_emerge->enqueueBlockEmerge(PEER_ID_INEXISTENT, blockpos, allow_generate); -} - Inventory* Server::createDetachedInventory(const std::string &name) { if(m_detached_inventories.count(name) > 0){ |