#include "mg_biome.h"
#include "content_mapnode.h"
#include "content_nodemeta.h"
-#include "content_abm.h"
#include "content_sao.h"
#include "mods.h"
#include "event_manager.h"
#include "util/sha1.h"
#include "util/hex.h"
#include "database.h"
+#include "chatmessage.h"
class ClientNotFoundException : public BaseException
{
m_simple_singleplayer_mode(simple_singleplayer_mode),
m_dedicated(dedicated),
m_async_fatal_error(""),
- m_env(NULL),
m_con(PROTOCOL_ID,
512,
CONNECTION_TIMEOUT,
ipv6,
this),
- m_banmanager(NULL),
- m_rollback(NULL),
- m_enable_rollback_recording(false),
- m_emerge(NULL),
- m_script(NULL),
m_itemdef(createItemDefManager()),
m_nodedef(createNodeDefManager()),
m_craftdef(createCraftDefManager()),
m_event(new EventManager()),
- m_thread(NULL),
- m_time_of_day_send_timer(0),
m_uptime(0),
m_clients(&m_con),
- m_shutdown_requested(false),
- m_shutdown_ask_reconnect(false),
- m_shutdown_timer(0.0f),
- m_admin_chat(iface),
- m_ignore_map_edit_events(false),
- m_ignore_map_edit_events_peer_id(0),
- m_next_sound_id(0),
- m_mod_storage_save_timer(10.0f)
-{
- m_liquid_transform_timer = 0.0;
- m_liquid_transform_every = 1.0;
- m_masterserver_timer = 0.0;
- m_emergethread_trigger_timer = 0.0;
- m_savemap_timer = 0.0;
-
- m_step_dtime = 0.0;
+ m_admin_chat(iface)
+{
m_lag = g_settings->getFloat("dedicated_server_step");
if(path_world == "")
m_env->loadDefaultMeta();
}
- // Add some test ActiveBlockModifiers to environment
- add_legacy_abms(m_env, m_nodedef);
-
m_liquid_transform_every = g_settings->getFloat("liquid_update");
m_max_chatmessage_length = g_settings->getU16("chat_message_max_size");
+ m_csm_flavour_limits = g_settings->getU64("csm_flavour_limits");
+ m_csm_noderange_limit = g_settings->getU32("csm_flavour_noderange_limit");
}
Server::~Server()
infostream<<"Server destructing"<<std::endl;
// Send shutdown message
- SendChatMessage(PEER_ID_INEXISTENT, L"*** Server shutting down");
+ SendChatMessage(PEER_ID_INEXISTENT, ChatMessage(CHATMESSAGE_TYPE_ANNOUNCE,
+ L"*** Server shutting down"));
{
MutexAutoLock envlock(m_env_mutex);
void Server::Receive()
{
DSTACK(FUNCTION_NAME);
- SharedBuffer<u8> data;
u16 peer_id;
try {
NetworkPacket pkt;
// Note things in chat if not in simple singleplayer mode
if (!m_simple_singleplayer_mode && g_settings->getBool("show_statusline_on_connect")) {
// Send information about server to player in chat
- SendChatMessage(peer_id, getStatusString());
+ SendChatMessage(peer_id, ChatMessage(CHATMESSAGE_TYPE_SYSTEM, getStatusString()));
}
Address addr = getPeerAddress(player->peer_id);
std::string ip_str = addr.serializeString();
Send(&pkt);
}
-void Server::SendChatMessage(u16 peer_id, const std::wstring &message)
+void Server::SendChatMessage(u16 peer_id, const ChatMessage &message)
{
DSTACK(FUNCTION_NAME);
+
+ NetworkPacket legacypkt(TOCLIENT_CHAT_MESSAGE_OLD, 0, peer_id);
+ legacypkt << message.message;
+
+ NetworkPacket pkt(TOCLIENT_CHAT_MESSAGE, 0, peer_id);
+ u8 version = 1;
+ u8 type = message.type;
+ pkt << version << type << std::wstring(L"") << message.message << message.timestamp;
+
if (peer_id != PEER_ID_INEXISTENT) {
- NetworkPacket pkt(TOCLIENT_CHAT_MESSAGE, 0, peer_id);
+ RemotePlayer *player = m_env->getPlayer(peer_id);
+ if (!player)
+ return;
- if (m_clients.getProtocolVersion(peer_id) < 27)
- pkt << unescape_enriched(message);
+ if (player->protocol_version < 35)
+ Send(&legacypkt);
else
- pkt << message;
-
- Send(&pkt);
+ Send(&pkt);
} else {
- for (u16 id : m_clients.getClientIDs())
- SendChatMessage(id, message);
+ m_clients.sendToAllCompat(&pkt, &legacypkt, 35);
}
}
m_clients.send(pkt.getPeerId(),
reliable ? clientCommandFactoryTable[pkt.getCommand()].channel : 1,
&pkt, reliable);
+}
+void Server::SendCSMFlavourLimits(u16 peer_id)
+{
+ NetworkPacket pkt(TOCLIENT_CSM_FLAVOUR_LIMITS,
+ sizeof(m_csm_flavour_limits) + sizeof(m_csm_noderange_limit), peer_id);
+ pkt << m_csm_flavour_limits << m_csm_noderange_limit;
+ Send(&pkt);
}
s32 Server::playSound(const SimpleSoundSpec &spec,
}
// Send leave chat message to all remaining clients
- if(message.length() != 0)
- SendChatMessage(PEER_ID_INEXISTENT,message);
+ if (!message.empty()) {
+ SendChatMessage(PEER_ID_INEXISTENT,
+ ChatMessage(CHATMESSAGE_TYPE_ANNOUNCE, message));
+ }
}
void Server::UpdateCrafting(RemotePlayer *player)
for (u16 i = 0; i < clients.size(); i++) {
u16 cid = clients[i];
if (cid != peer_id_to_avoid_sending)
- SendChatMessage(cid, line);
+ SendChatMessage(cid, ChatMessage(line));
}
}
return L"";
if (player->peer_id == PEER_ID_INEXISTENT)
return;
- SendChatMessage(player->peer_id, msg);
+ SendChatMessage(player->peer_id, ChatMessage(msg));
}
bool Server::showFormspec(const char *playername, const std::string &formspec,
void Server::notifyPlayers(const std::wstring &msg)
{
- SendChatMessage(PEER_ID_INEXISTENT,msg);
+ SendChatMessage(PEER_ID_INEXISTENT, ChatMessage(msg));
}
void Server::spawnParticle(const std::string &playername, v3f pos,