mirror of
https://github.com/luanti-org/luanti.git
synced 2025-08-11 17:51:04 +00:00
Omnicleanup: header cleanup, add ModApiUtil shared between game and mainmenu
This commit is contained in:
parent
6228d634fb
commit
4e1f50035e
153 changed files with 3725 additions and 3625 deletions
206
src/server.cpp
206
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();
|
||||
|
@ -613,46 +631,23 @@ 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){
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue