aboutsummaryrefslogtreecommitdiff
path: root/src/server.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server.cpp')
-rw-r--r--src/server.cpp206
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){