2010-11-29 19:13:04 +01:00
|
|
|
/*
|
2013-02-24 18:40:43 +01:00
|
|
|
Minetest
|
2013-02-24 19:38:45 +01:00
|
|
|
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
2010-11-29 19:13:04 +01:00
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
2012-06-05 16:56:56 +02:00
|
|
|
it under the terms of the GNU Lesser General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2.1 of the License, or
|
2010-11-29 19:13:04 +01:00
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
2012-06-05 16:56:56 +02:00
|
|
|
GNU Lesser General Public License for more details.
|
2010-11-29 19:13:04 +01:00
|
|
|
|
2012-06-05 16:56:56 +02:00
|
|
|
You should have received a copy of the GNU Lesser General Public License along
|
2010-11-29 19:13:04 +01:00
|
|
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
*/
|
|
|
|
|
2010-11-27 00:02:21 +01:00
|
|
|
#include <iostream>
|
Rewrite client media download and support hash-based remote download
Move most of the media-related code in client.cpp into a new class
ClientMediaDownloader (clientmedia.cpp, clientmedia.h). Among other
things, this class does the following things:
- Download [remote_server][sha1] instead of [remote_server][name]. This
is to support servers that provide the same file name with different
contents.
- Initially fetch [remote_server]index.mth. This file should follow the
Minetest Hashset format (currently version 1) and contain a list of SHA1
hashes that exist on the server.
- The list of needed SHA1s is uploaded (via HTTP POST) when index.mth is
requested, so servers can optionally narrow down the list to the needs
of the client.
- If index.mth is missing (HTTP response code 404), we enter compat mode,
fetching [remote_server][name] as before this commit.
- remote_server can now contain multiple servers, separated by commas.
The downloader code attempts to split requests between the different
servers, as permitted by each server's index.mth. If one server claims
to have a file but actually doesn't (or something fails), we ask a
different server that also claims to have it.
- As before, when none of the remote servers provide a particular
file, we download it via the conventional method, i.e. using
the minetest protocol: TOSERVER_REQUEST_MEDIA / TOCLIENT_MEDIA.
- Bugfix: Every downloaded file's SHA1 is now verified against the SHA1
announced by the minetest server (before loading it and inserting it
into the file cache).
- Bugfix: Only send TOSERVER_RECEIVED_MEDIA when we actually have all
media. This should fix #863.
2013-08-29 05:22:18 +02:00
|
|
|
#include <algorithm>
|
2014-09-12 00:22:05 +02:00
|
|
|
#include <sstream>
|
2016-12-11 19:49:49 +01:00
|
|
|
#include <cmath>
|
2014-09-12 00:22:05 +02:00
|
|
|
#include <IFileSystem.h>
|
2017-08-16 22:11:45 +02:00
|
|
|
#include "client.h"
|
|
|
|
#include "network/clientopcodes.h"
|
2017-08-24 08:28:54 +02:00
|
|
|
#include "network/connection.h"
|
2017-08-16 22:11:45 +02:00
|
|
|
#include "network/networkpacket.h"
|
2015-04-07 12:13:12 +02:00
|
|
|
#include "threading/mutex_auto_lock.h"
|
2017-08-28 20:02:23 +02:00
|
|
|
#include "client/clientevent.h"
|
2018-01-03 14:28:55 +01:00
|
|
|
#include "client/gameui.h"
|
2017-06-26 20:11:17 +02:00
|
|
|
#include "client/renderingengine.h"
|
2018-03-24 15:45:25 +01:00
|
|
|
#include "client/sound.h"
|
2017-09-13 22:03:18 +02:00
|
|
|
#include "client/tile.h"
|
2015-04-12 04:49:13 +02:00
|
|
|
#include "util/auth.h"
|
2014-09-12 00:22:05 +02:00
|
|
|
#include "util/directiontables.h"
|
|
|
|
#include "util/pointedthing.h"
|
|
|
|
#include "util/serialize.h"
|
|
|
|
#include "util/string.h"
|
2015-04-12 04:49:13 +02:00
|
|
|
#include "util/srp.h"
|
2013-08-11 04:09:45 +02:00
|
|
|
#include "filesys.h"
|
2011-06-26 01:34:36 +02:00
|
|
|
#include "mapblock_mesh.h"
|
|
|
|
#include "mapblock.h"
|
2015-06-22 04:34:56 +02:00
|
|
|
#include "minimap.h"
|
2017-09-26 00:11:20 +02:00
|
|
|
#include "modchannels.h"
|
2018-04-17 15:54:50 +02:00
|
|
|
#include "content/mods.h"
|
2011-10-12 12:53:38 +02:00
|
|
|
#include "profiler.h"
|
2017-08-18 19:25:07 +02:00
|
|
|
#include "shader.h"
|
2013-05-11 16:02:41 +02:00
|
|
|
#include "gettext.h"
|
2012-03-15 23:25:18 +01:00
|
|
|
#include "clientmap.h"
|
Rewrite client media download and support hash-based remote download
Move most of the media-related code in client.cpp into a new class
ClientMediaDownloader (clientmedia.cpp, clientmedia.h). Among other
things, this class does the following things:
- Download [remote_server][sha1] instead of [remote_server][name]. This
is to support servers that provide the same file name with different
contents.
- Initially fetch [remote_server]index.mth. This file should follow the
Minetest Hashset format (currently version 1) and contain a list of SHA1
hashes that exist on the server.
- The list of needed SHA1s is uploaded (via HTTP POST) when index.mth is
requested, so servers can optionally narrow down the list to the needs
of the client.
- If index.mth is missing (HTTP response code 404), we enter compat mode,
fetching [remote_server][name] as before this commit.
- remote_server can now contain multiple servers, separated by commas.
The downloader code attempts to split requests between the different
servers, as permitted by each server's index.mth. If one server claims
to have a file but actually doesn't (or something fails), we ask a
different server that also claims to have it.
- As before, when none of the remote servers provide a particular
file, we download it via the conventional method, i.e. using
the minetest protocol: TOSERVER_REQUEST_MEDIA / TOCLIENT_MEDIA.
- Bugfix: Every downloaded file's SHA1 is now verified against the SHA1
announced by the minetest server (before loading it and inserting it
into the file cache).
- Bugfix: Only send TOSERVER_RECEIVED_MEDIA when we actually have all
media. This should fix #863.
2013-08-29 05:22:18 +02:00
|
|
|
#include "clientmedia.h"
|
2013-11-05 13:57:43 +01:00
|
|
|
#include "version.h"
|
2022-01-27 22:24:30 +01:00
|
|
|
#include "database/database-files.h"
|
2017-11-08 23:56:20 +01:00
|
|
|
#include "database/database-sqlite3.h"
|
2014-11-16 21:31:57 +01:00
|
|
|
#include "serialization.h"
|
2015-03-09 14:32:11 +01:00
|
|
|
#include "guiscalingfilter.h"
|
2017-04-25 19:38:08 +02:00
|
|
|
#include "script/scripting_client.h"
|
2017-03-19 13:18:52 +01:00
|
|
|
#include "game.h"
|
2017-07-16 10:47:31 +02:00
|
|
|
#include "chatmessage.h"
|
2017-01-31 18:05:03 +01:00
|
|
|
#include "translation.h"
|
2014-04-27 16:09:21 +02:00
|
|
|
|
|
|
|
extern gui::IGUIEnvironment* guienv;
|
2012-12-14 12:30:17 +01:00
|
|
|
|
2020-04-08 20:13:23 +02:00
|
|
|
/*
|
|
|
|
Utility classes
|
|
|
|
*/
|
|
|
|
|
2020-05-15 15:12:37 +02:00
|
|
|
u32 PacketCounter::sum() const
|
|
|
|
{
|
|
|
|
u32 n = 0;
|
|
|
|
for (const auto &it : m_packets)
|
|
|
|
n += it.second;
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
|
2020-04-08 20:13:23 +02:00
|
|
|
void PacketCounter::print(std::ostream &o) const
|
|
|
|
{
|
|
|
|
for (const auto &it : m_packets) {
|
|
|
|
auto name = it.first >= TOCLIENT_NUM_MSG_TYPES ? "?"
|
|
|
|
: toClientCommandTable[it.first].name;
|
|
|
|
o << "cmd " << it.first << " (" << name << ") count "
|
|
|
|
<< it.second << std::endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Rewrite client media download and support hash-based remote download
Move most of the media-related code in client.cpp into a new class
ClientMediaDownloader (clientmedia.cpp, clientmedia.h). Among other
things, this class does the following things:
- Download [remote_server][sha1] instead of [remote_server][name]. This
is to support servers that provide the same file name with different
contents.
- Initially fetch [remote_server]index.mth. This file should follow the
Minetest Hashset format (currently version 1) and contain a list of SHA1
hashes that exist on the server.
- The list of needed SHA1s is uploaded (via HTTP POST) when index.mth is
requested, so servers can optionally narrow down the list to the needs
of the client.
- If index.mth is missing (HTTP response code 404), we enter compat mode,
fetching [remote_server][name] as before this commit.
- remote_server can now contain multiple servers, separated by commas.
The downloader code attempts to split requests between the different
servers, as permitted by each server's index.mth. If one server claims
to have a file but actually doesn't (or something fails), we ask a
different server that also claims to have it.
- As before, when none of the remote servers provide a particular
file, we download it via the conventional method, i.e. using
the minetest protocol: TOSERVER_REQUEST_MEDIA / TOCLIENT_MEDIA.
- Bugfix: Every downloaded file's SHA1 is now verified against the SHA1
announced by the minetest server (before loading it and inserting it
into the file cache).
- Bugfix: Only send TOSERVER_RECEIVED_MEDIA when we actually have all
media. This should fix #863.
2013-08-29 05:22:18 +02:00
|
|
|
/*
|
|
|
|
Client
|
|
|
|
*/
|
2012-12-14 12:30:17 +01:00
|
|
|
|
2010-12-19 18:11:05 +01:00
|
|
|
Client::Client(
|
|
|
|
const char *playername,
|
2017-04-19 00:36:30 +02:00
|
|
|
const std::string &password,
|
2017-04-19 15:16:54 +02:00
|
|
|
const std::string &address_name,
|
2011-11-13 23:19:48 +01:00
|
|
|
MapDrawControl &control,
|
2011-11-14 20:41:30 +01:00
|
|
|
IWritableTextureSource *tsrc,
|
2012-03-19 02:59:12 +01:00
|
|
|
IWritableShaderSource *shsrc,
|
2012-01-12 06:10:39 +01:00
|
|
|
IWritableItemDefManager *itemdef,
|
2018-02-10 21:04:16 +01:00
|
|
|
NodeDefManager *nodedef,
|
2012-03-23 19:23:03 +01:00
|
|
|
ISoundManager *sound,
|
2013-06-23 09:31:22 +02:00
|
|
|
MtEventManager *event,
|
2021-04-28 10:22:13 +02:00
|
|
|
RenderingEngine *rendering_engine,
|
2017-03-19 13:18:52 +01:00
|
|
|
bool ipv6,
|
2022-06-05 17:47:38 +02:00
|
|
|
GameUI *game_ui,
|
|
|
|
ELoginRegister allow_login_or_register
|
2011-11-14 20:41:30 +01:00
|
|
|
):
|
2011-11-13 23:19:48 +01:00
|
|
|
m_tsrc(tsrc),
|
2012-03-19 02:59:12 +01:00
|
|
|
m_shsrc(shsrc),
|
2012-01-12 06:10:39 +01:00
|
|
|
m_itemdef(itemdef),
|
2011-11-14 20:41:30 +01:00
|
|
|
m_nodedef(nodedef),
|
2012-03-23 14:29:30 +01:00
|
|
|
m_sound(sound),
|
2012-03-23 19:23:03 +01:00
|
|
|
m_event(event),
|
2021-04-28 10:22:13 +02:00
|
|
|
m_rendering_engine(rendering_engine),
|
2017-04-15 09:55:52 +02:00
|
|
|
m_mesh_update_thread(this),
|
2011-02-20 23:45:14 +01:00
|
|
|
m_env(
|
2021-04-29 08:51:17 +02:00
|
|
|
new ClientMap(this, rendering_engine, control, 666),
|
2017-06-20 00:04:18 +02:00
|
|
|
tsrc, this
|
2011-02-20 23:45:14 +01:00
|
|
|
),
|
2015-01-05 18:34:59 +01:00
|
|
|
m_particle_manager(&m_env),
|
2017-08-24 08:28:54 +02:00
|
|
|
m_con(new con::Connection(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, ipv6, this)),
|
2017-04-19 15:16:54 +02:00
|
|
|
m_address_name(address_name),
|
2022-07-09 22:32:08 +02:00
|
|
|
m_allow_login_or_register(allow_login_or_register),
|
2010-11-27 00:02:21 +01:00
|
|
|
m_server_ser_ver(SER_FMT_VER_INVALID),
|
2017-07-15 09:28:10 +02:00
|
|
|
m_last_chat_message_sent(time(NULL)),
|
2011-05-20 21:28:03 +02:00
|
|
|
m_password(password),
|
2015-04-12 04:49:13 +02:00
|
|
|
m_chosen_auth_mech(AUTH_MECHANISM_NONE),
|
Rewrite client media download and support hash-based remote download
Move most of the media-related code in client.cpp into a new class
ClientMediaDownloader (clientmedia.cpp, clientmedia.h). Among other
things, this class does the following things:
- Download [remote_server][sha1] instead of [remote_server][name]. This
is to support servers that provide the same file name with different
contents.
- Initially fetch [remote_server]index.mth. This file should follow the
Minetest Hashset format (currently version 1) and contain a list of SHA1
hashes that exist on the server.
- The list of needed SHA1s is uploaded (via HTTP POST) when index.mth is
requested, so servers can optionally narrow down the list to the needs
of the client.
- If index.mth is missing (HTTP response code 404), we enter compat mode,
fetching [remote_server][name] as before this commit.
- remote_server can now contain multiple servers, separated by commas.
The downloader code attempts to split requests between the different
servers, as permitted by each server's index.mth. If one server claims
to have a file but actually doesn't (or something fails), we ask a
different server that also claims to have it.
- As before, when none of the remote servers provide a particular
file, we download it via the conventional method, i.e. using
the minetest protocol: TOSERVER_REQUEST_MEDIA / TOCLIENT_MEDIA.
- Bugfix: Every downloaded file's SHA1 is now verified against the SHA1
announced by the minetest server (before loading it and inserting it
into the file cache).
- Bugfix: Only send TOSERVER_RECEIVED_MEDIA when we actually have all
media. This should fix #863.
2013-08-29 05:22:18 +02:00
|
|
|
m_media_downloader(new ClientMediaDownloader()),
|
2014-11-16 21:31:57 +01:00
|
|
|
m_state(LC_Created),
|
2018-01-03 14:28:55 +01:00
|
|
|
m_game_ui(game_ui),
|
2022-07-09 22:32:08 +02:00
|
|
|
m_modchannel_mgr(new ModChannelMgr())
|
2010-11-27 00:02:21 +01:00
|
|
|
{
|
2014-11-16 21:31:57 +01:00
|
|
|
// Add local player
|
2016-10-08 23:13:38 +02:00
|
|
|
m_env.setLocalPlayer(new LocalPlayer(this, playername));
|
2010-11-27 00:02:21 +01:00
|
|
|
|
2022-01-07 19:28:49 +01:00
|
|
|
// Make the mod storage database and begin the save for later
|
|
|
|
m_mod_storage_database =
|
|
|
|
new ModMetadataDatabaseSQLite3(porting::path_user + DIR_DELIM + "client");
|
|
|
|
m_mod_storage_database->beginSave();
|
|
|
|
|
2017-05-19 07:25:27 +02:00
|
|
|
if (g_settings->getBool("enable_minimap")) {
|
2017-06-26 20:11:17 +02:00
|
|
|
m_minimap = new Minimap(this);
|
2017-05-19 07:25:27 +02:00
|
|
|
}
|
2020-10-04 15:24:29 +02:00
|
|
|
|
2014-11-16 21:31:57 +01:00
|
|
|
m_cache_save_interval = g_settings->getU16("server_map_save_interval");
|
2017-12-11 17:33:44 +01:00
|
|
|
}
|
|
|
|
|
2022-01-27 22:24:30 +01:00
|
|
|
void Client::migrateModStorage()
|
|
|
|
{
|
|
|
|
std::string mod_storage_dir = porting::path_user + DIR_DELIM + "client";
|
|
|
|
std::string old_mod_storage = mod_storage_dir + DIR_DELIM + "mod_storage";
|
|
|
|
if (fs::IsDir(old_mod_storage)) {
|
|
|
|
infostream << "Migrating client mod storage to SQLite3 database" << std::endl;
|
|
|
|
{
|
|
|
|
ModMetadataDatabaseFiles files_db(mod_storage_dir);
|
|
|
|
std::vector<std::string> mod_list;
|
|
|
|
files_db.listMods(&mod_list);
|
|
|
|
for (const std::string &modname : mod_list) {
|
|
|
|
infostream << "Migrating client mod storage for mod " << modname << std::endl;
|
|
|
|
StringMap meta;
|
|
|
|
files_db.getModEntries(modname, &meta);
|
|
|
|
for (const auto &pair : meta) {
|
|
|
|
m_mod_storage_database->setModEntry(modname, pair.first, pair.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!fs::Rename(old_mod_storage, old_mod_storage + ".bak")) {
|
|
|
|
// Execution cannot move forward if the migration does not complete.
|
|
|
|
throw BaseException("Could not finish migrating client mod storage");
|
|
|
|
}
|
|
|
|
infostream << "Finished migration of client mod storage" << std::endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-11 17:33:44 +01:00
|
|
|
void Client::loadMods()
|
|
|
|
{
|
2019-04-28 01:44:26 +02:00
|
|
|
// Don't load mods twice.
|
2019-01-03 12:10:07 +01:00
|
|
|
// If client scripting is disabled by the client, don't load builtin or
|
|
|
|
// client-provided mods.
|
2019-06-25 21:18:08 +02:00
|
|
|
if (m_mods_loaded || !g_settings->getBool("enable_client_modding"))
|
2019-01-03 12:10:07 +01:00
|
|
|
return;
|
|
|
|
|
|
|
|
// If client scripting is disabled by the server, don't load builtin or
|
|
|
|
// client-provided mods.
|
|
|
|
// TODO Delete this code block when server-sent CSM and verifying of builtin are
|
|
|
|
// complete.
|
|
|
|
if (checkCSMRestrictionFlag(CSMRestrictionFlags::CSM_RF_LOAD_CLIENT_MODS)) {
|
|
|
|
warningstream << "Client-provided mod loading is disabled by server." <<
|
|
|
|
std::endl;
|
2017-03-13 15:55:30 +01:00
|
|
|
return;
|
|
|
|
}
|
2017-12-11 17:33:44 +01:00
|
|
|
|
2019-06-25 21:18:08 +02:00
|
|
|
m_script = new ClientScripting(this);
|
|
|
|
m_env.setScript(m_script);
|
|
|
|
m_script->setEnv(&m_env);
|
|
|
|
|
2018-11-24 11:41:11 +01:00
|
|
|
// Load builtin
|
|
|
|
scanModIntoMemory(BUILTIN_MOD_NAME, getBuiltinLuaPath());
|
|
|
|
m_script->loadModFromMemory(BUILTIN_MOD_NAME);
|
|
|
|
|
2017-01-27 07:41:10 +01:00
|
|
|
ClientModConfiguration modconf(getClientModsLuaPath());
|
2017-06-30 20:14:39 +02:00
|
|
|
m_mods = modconf.getMods();
|
2017-01-27 07:41:10 +01:00
|
|
|
// complain about mods with unsatisfied dependencies
|
|
|
|
if (!modconf.isConsistent()) {
|
|
|
|
modconf.printUnsatisfiedModsError();
|
2019-11-08 20:54:25 +01:00
|
|
|
return;
|
2017-01-27 07:41:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Print mods
|
2019-01-03 12:10:07 +01:00
|
|
|
infostream << "Client loading mods: ";
|
2017-06-30 20:14:39 +02:00
|
|
|
for (const ModSpec &mod : m_mods)
|
|
|
|
infostream << mod.name << " ";
|
2017-01-27 07:41:10 +01:00
|
|
|
infostream << std::endl;
|
2017-06-30 20:14:39 +02:00
|
|
|
|
2020-04-10 21:45:07 +02:00
|
|
|
// Load "mod" scripts
|
2017-06-30 20:14:39 +02:00
|
|
|
for (const ModSpec &mod : m_mods) {
|
2021-07-31 19:54:52 +02:00
|
|
|
mod.checkAndLog();
|
2017-06-30 20:14:39 +02:00
|
|
|
scanModIntoMemory(mod.name, mod.path);
|
|
|
|
}
|
2017-12-11 17:33:44 +01:00
|
|
|
|
2020-04-10 21:45:07 +02:00
|
|
|
// Run them
|
2017-12-11 17:33:44 +01:00
|
|
|
for (const ModSpec &mod : m_mods)
|
|
|
|
m_script->loadModFromMemory(mod.name);
|
|
|
|
|
2019-06-25 21:18:08 +02:00
|
|
|
// Mods are done loading. Unlock callbacks
|
|
|
|
m_mods_loaded = true;
|
|
|
|
|
2018-06-06 12:53:59 +02:00
|
|
|
// Run a callback when mods are loaded
|
|
|
|
m_script->on_mods_loaded();
|
2020-04-10 21:45:07 +02:00
|
|
|
|
|
|
|
// Create objects if they're ready
|
2019-06-25 21:18:08 +02:00
|
|
|
if (m_state == LC_Ready)
|
|
|
|
m_script->on_client_ready(m_env.getLocalPlayer());
|
|
|
|
if (m_camera)
|
|
|
|
m_script->on_camera_ready(m_camera);
|
2020-04-10 21:45:07 +02:00
|
|
|
if (m_minimap)
|
|
|
|
m_script->on_minimap_ready(m_minimap);
|
2017-12-11 17:33:44 +01:00
|
|
|
}
|
|
|
|
|
2017-06-30 20:14:39 +02:00
|
|
|
void Client::scanModSubfolder(const std::string &mod_name, const std::string &mod_path,
|
|
|
|
std::string mod_subpath)
|
|
|
|
{
|
|
|
|
std::string full_path = mod_path + DIR_DELIM + mod_subpath;
|
|
|
|
std::vector<fs::DirListNode> mod = fs::GetDirListing(full_path);
|
2017-08-16 08:53:52 +02:00
|
|
|
for (const fs::DirListNode &j : mod) {
|
2021-07-17 16:44:06 +02:00
|
|
|
if (j.name[0] == '.')
|
|
|
|
continue;
|
|
|
|
|
2017-08-16 08:53:52 +02:00
|
|
|
if (j.dir) {
|
2019-11-08 20:01:47 +01:00
|
|
|
scanModSubfolder(mod_name, mod_path, mod_subpath + j.name + DIR_DELIM);
|
2017-06-30 20:14:39 +02:00
|
|
|
continue;
|
|
|
|
}
|
2019-11-08 20:01:47 +01:00
|
|
|
std::replace(mod_subpath.begin(), mod_subpath.end(), DIR_DELIM_CHAR, '/');
|
|
|
|
|
|
|
|
std::string real_path = full_path + j.name;
|
|
|
|
std::string vfs_path = mod_name + ":" + mod_subpath + j.name;
|
|
|
|
infostream << "Client::scanModSubfolder(): Loading \"" << real_path
|
|
|
|
<< "\" as \"" << vfs_path << "\"." << std::endl;
|
|
|
|
|
2020-09-16 15:51:11 +02:00
|
|
|
std::string contents;
|
|
|
|
if (!fs::ReadFile(real_path, contents)) {
|
2019-11-08 20:01:47 +01:00
|
|
|
errorstream << "Client::scanModSubfolder(): Can't read file \""
|
|
|
|
<< real_path << "\"." << std::endl;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_mod_vfs.emplace(vfs_path, contents);
|
2017-01-27 07:41:10 +01:00
|
|
|
}
|
|
|
|
}
|
2017-01-21 15:02:08 +01:00
|
|
|
|
2017-01-27 07:41:10 +01:00
|
|
|
const std::string &Client::getBuiltinLuaPath()
|
|
|
|
{
|
|
|
|
static const std::string builtin_dir = porting::path_share + DIR_DELIM + "builtin";
|
|
|
|
return builtin_dir;
|
2017-01-21 15:02:08 +01:00
|
|
|
}
|
|
|
|
|
2017-01-27 07:41:10 +01:00
|
|
|
const std::string &Client::getClientModsLuaPath()
|
2017-01-21 15:02:08 +01:00
|
|
|
{
|
2017-01-27 07:41:10 +01:00
|
|
|
static const std::string clientmods_dir = porting::path_share + DIR_DELIM + "clientmods";
|
|
|
|
return clientmods_dir;
|
2017-01-21 15:02:08 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
const std::vector<ModSpec>& Client::getMods() const
|
|
|
|
{
|
|
|
|
static std::vector<ModSpec> client_modspec_temp;
|
|
|
|
return client_modspec_temp;
|
|
|
|
}
|
|
|
|
|
|
|
|
const ModSpec* Client::getModSpec(const std::string &modname) const
|
|
|
|
{
|
|
|
|
return NULL;
|
2010-11-27 00:02:21 +01:00
|
|
|
}
|
|
|
|
|
2014-01-06 12:45:42 +01:00
|
|
|
void Client::Stop()
|
|
|
|
{
|
2017-04-01 13:40:56 +02:00
|
|
|
m_shutdown = true;
|
2019-06-25 21:18:08 +02:00
|
|
|
if (m_mods_loaded)
|
2018-11-24 11:41:11 +01:00
|
|
|
m_script->on_shutdown();
|
2014-01-06 12:45:42 +01:00
|
|
|
//request all client managed threads to stop
|
2015-04-07 12:13:12 +02:00
|
|
|
m_mesh_update_thread.stop();
|
2014-11-16 21:31:57 +01:00
|
|
|
// Save local server map
|
|
|
|
if (m_localdb) {
|
|
|
|
infostream << "Local map saving ended." << std::endl;
|
|
|
|
m_localdb->endSave();
|
2014-10-09 14:02:02 +02:00
|
|
|
}
|
2017-01-21 15:02:08 +01:00
|
|
|
|
2019-06-25 21:18:08 +02:00
|
|
|
if (m_mods_loaded)
|
2018-11-24 11:41:11 +01:00
|
|
|
delete m_script;
|
2014-01-06 12:45:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
bool Client::isShutdown()
|
|
|
|
{
|
2017-04-01 13:40:56 +02:00
|
|
|
return m_shutdown || !m_mesh_update_thread.isRunning();
|
2014-01-06 12:45:42 +01:00
|
|
|
}
|
|
|
|
|
2010-11-27 00:02:21 +01:00
|
|
|
Client::~Client()
|
|
|
|
{
|
2017-04-01 13:40:56 +02:00
|
|
|
m_shutdown = true;
|
2017-08-24 08:28:54 +02:00
|
|
|
m_con->Disconnect();
|
2010-12-24 16:08:50 +01:00
|
|
|
|
2018-06-27 17:06:37 +02:00
|
|
|
deleteAuthData();
|
|
|
|
|
2015-04-07 12:13:12 +02:00
|
|
|
m_mesh_update_thread.stop();
|
|
|
|
m_mesh_update_thread.wait();
|
2015-08-02 01:31:57 +02:00
|
|
|
while (!m_mesh_update_thread.m_queue_out.empty()) {
|
2014-01-06 12:45:42 +01:00
|
|
|
MeshUpdateResult r = m_mesh_update_thread.m_queue_out.pop_frontNoEx();
|
2013-05-18 01:52:18 +02:00
|
|
|
delete r.mesh;
|
|
|
|
}
|
|
|
|
|
2012-01-22 00:49:02 +01:00
|
|
|
|
|
|
|
delete m_inventory_from_server;
|
2012-07-24 19:57:17 +02:00
|
|
|
|
|
|
|
// Delete detached inventories
|
2017-08-16 08:53:52 +02:00
|
|
|
for (auto &m_detached_inventorie : m_detached_inventories) {
|
|
|
|
delete m_detached_inventorie.second;
|
2012-07-24 19:57:17 +02:00
|
|
|
}
|
2012-12-17 17:56:59 +01:00
|
|
|
|
2013-04-07 20:13:21 +02:00
|
|
|
// cleanup 3d model meshes on client shutdown
|
2021-04-28 10:53:36 +02:00
|
|
|
m_rendering_engine->cleanupMeshCache();
|
2015-08-02 01:31:57 +02:00
|
|
|
|
2022-05-04 20:55:13 +02:00
|
|
|
guiScalingCacheClear();
|
|
|
|
|
2017-03-16 10:34:54 +01:00
|
|
|
delete m_minimap;
|
2020-10-19 20:38:15 +02:00
|
|
|
m_minimap = nullptr;
|
|
|
|
|
2018-06-27 17:06:37 +02:00
|
|
|
delete m_media_downloader;
|
2022-01-07 19:28:49 +01:00
|
|
|
|
|
|
|
// Write the changes and delete
|
|
|
|
if (m_mod_storage_database)
|
|
|
|
m_mod_storage_database->endSave();
|
|
|
|
delete m_mod_storage_database;
|
2010-11-27 00:02:21 +01:00
|
|
|
}
|
|
|
|
|
2017-04-19 15:16:54 +02:00
|
|
|
void Client::connect(Address address, bool is_local_server)
|
2010-11-27 00:02:21 +01:00
|
|
|
{
|
2017-04-19 15:16:54 +02:00
|
|
|
initLocalMapSaving(address, m_address_name, is_local_server);
|
2015-01-30 15:33:23 +01:00
|
|
|
|
2019-11-19 20:23:00 +01:00
|
|
|
// Since we use TryReceive() a timeout here would be ineffective anyway
|
2017-08-24 08:28:54 +02:00
|
|
|
m_con->SetTimeoutMs(0);
|
|
|
|
m_con->Connect(address);
|
2010-11-27 00:02:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void Client::step(float dtime)
|
|
|
|
{
|
|
|
|
// Limit a bit
|
2017-08-13 09:49:29 +02:00
|
|
|
if (dtime > 2.0)
|
2010-11-27 00:02:21 +01:00
|
|
|
dtime = 2.0;
|
2014-05-02 00:18:25 +02:00
|
|
|
|
2012-03-13 18:56:12 +01:00
|
|
|
m_animation_time += dtime;
|
|
|
|
if(m_animation_time > 60.0)
|
|
|
|
m_animation_time -= 60.0;
|
|
|
|
|
2012-03-16 15:34:30 +01:00
|
|
|
m_time_of_day_update_timer += dtime;
|
2010-11-27 00:02:21 +01:00
|
|
|
|
2014-02-05 00:17:57 +01:00
|
|
|
ReceiveAll();
|
2010-11-27 00:02:21 +01:00
|
|
|
|
2010-11-27 16:18:34 +01:00
|
|
|
/*
|
|
|
|
Packet counter
|
|
|
|
*/
|
|
|
|
{
|
2010-12-19 15:51:45 +01:00
|
|
|
float &counter = m_packetcounter_timer;
|
2010-11-27 16:18:34 +01:00
|
|
|
counter -= dtime;
|
2020-04-08 20:13:23 +02:00
|
|
|
if(counter <= 0.0f)
|
2010-11-27 16:18:34 +01:00
|
|
|
{
|
2020-04-08 20:13:23 +02:00
|
|
|
counter = 30.0f;
|
2020-05-15 15:12:37 +02:00
|
|
|
u32 sum = m_packetcounter.sum();
|
|
|
|
float avg = sum / counter;
|
2015-01-04 22:32:31 +01:00
|
|
|
|
2020-05-15 15:12:37 +02:00
|
|
|
infostream << "Client packetcounter (" << counter << "s): "
|
|
|
|
<< "sum=" << sum << " avg=" << avg << "/s" << std::endl;
|
2011-10-16 13:57:53 +02:00
|
|
|
m_packetcounter.print(infostream);
|
2010-11-27 16:18:34 +01:00
|
|
|
m_packetcounter.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-05-02 00:18:25 +02:00
|
|
|
// UGLY hack to fix 2 second startup delay caused by non existent
|
|
|
|
// server client startup synchronization in local server or singleplayer mode
|
|
|
|
static bool initial_step = true;
|
|
|
|
if (initial_step) {
|
|
|
|
initial_step = false;
|
|
|
|
}
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
else if(m_state == LC_Created) {
|
2010-12-19 15:51:45 +01:00
|
|
|
float &counter = m_connection_reinit_timer;
|
2010-11-27 00:02:21 +01:00
|
|
|
counter -= dtime;
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
if(counter <= 0.0) {
|
2010-11-27 00:02:21 +01:00
|
|
|
counter = 2.0;
|
|
|
|
|
2016-10-08 16:31:22 +02:00
|
|
|
LocalPlayer *myplayer = m_env.getLocalPlayer();
|
2015-03-06 11:21:51 +01:00
|
|
|
FATAL_ERROR_IF(myplayer == NULL, "Local player not found in environment.");
|
|
|
|
|
2017-09-12 19:48:09 +02:00
|
|
|
sendInit(myplayer->getName());
|
2010-11-27 00:02:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Not connected, return
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
Do stuff if connected
|
|
|
|
*/
|
2015-01-04 22:32:31 +01:00
|
|
|
|
2011-06-26 23:27:17 +02:00
|
|
|
/*
|
|
|
|
Run Map's timers and unload unused data
|
|
|
|
*/
|
|
|
|
const float map_timer_and_unload_dtime = 5.25;
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
if(m_map_timer_and_unload_interval.step(dtime, map_timer_and_unload_dtime)) {
|
2015-02-17 15:04:08 +01:00
|
|
|
std::vector<v3s16> deleted_blocks;
|
2011-06-26 23:27:17 +02:00
|
|
|
m_env.getMap().timerUpdate(map_timer_and_unload_dtime,
|
2022-07-09 22:32:08 +02:00
|
|
|
std::max(g_settings->getFloat("client_unload_unused_data_timeout"), 0.0f),
|
2015-08-10 22:24:47 +02:00
|
|
|
g_settings->getS32("client_mapblock_limit"),
|
|
|
|
&deleted_blocks);
|
2015-01-04 22:32:31 +01:00
|
|
|
|
2011-06-26 23:27:17 +02:00
|
|
|
/*
|
|
|
|
Send info to server
|
|
|
|
NOTE: This loop is intentionally iterated the way it is.
|
|
|
|
*/
|
|
|
|
|
2015-02-17 15:04:08 +01:00
|
|
|
std::vector<v3s16>::iterator i = deleted_blocks.begin();
|
|
|
|
std::vector<v3s16> sendlist;
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
for(;;) {
|
|
|
|
if(sendlist.size() == 255 || i == deleted_blocks.end()) {
|
2014-12-12 15:55:40 +01:00
|
|
|
if(sendlist.empty())
|
2011-06-26 23:27:17 +02:00
|
|
|
break;
|
|
|
|
/*
|
|
|
|
[0] u16 command
|
|
|
|
[2] u8 count
|
|
|
|
[3] v3s16 pos_0
|
|
|
|
[3+6] v3s16 pos_1
|
|
|
|
...
|
|
|
|
*/
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2015-03-16 12:39:27 +01:00
|
|
|
sendDeletedBlocks(sendlist);
|
2011-06-26 23:27:17 +02:00
|
|
|
|
|
|
|
if(i == deleted_blocks.end())
|
|
|
|
break;
|
|
|
|
|
|
|
|
sendlist.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
sendlist.push_back(*i);
|
2012-12-20 18:19:49 +01:00
|
|
|
++i;
|
2011-06-26 23:27:17 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-07-15 09:28:10 +02:00
|
|
|
/*
|
|
|
|
Send pending messages on out chat queue
|
|
|
|
*/
|
|
|
|
if (!m_out_chat_queue.empty() && canSendChatMessage()) {
|
|
|
|
sendChatMessage(m_out_chat_queue.front());
|
|
|
|
m_out_chat_queue.pop();
|
|
|
|
}
|
|
|
|
|
2011-04-21 18:35:17 +02:00
|
|
|
/*
|
|
|
|
Handle environment
|
|
|
|
*/
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
LocalPlayer *player = m_env.getLocalPlayer();
|
2015-01-04 22:32:31 +01:00
|
|
|
|
2020-07-03 17:21:42 +02:00
|
|
|
// Step environment (also handles player controls)
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
m_env.step(dtime);
|
2016-07-10 07:08:26 +02:00
|
|
|
m_sound->step(dtime);
|
2011-04-21 18:35:17 +02:00
|
|
|
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
/*
|
|
|
|
Get events
|
|
|
|
*/
|
2017-04-29 17:25:25 +02:00
|
|
|
while (m_env.hasClientEnvEvents()) {
|
|
|
|
ClientEnvEvent envEvent = m_env.getClientEnvEvent();
|
|
|
|
|
|
|
|
if (envEvent.type == CEE_PLAYER_DAMAGE) {
|
2019-02-11 00:03:26 +01:00
|
|
|
u16 damage = envEvent.player_damage.amount;
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2017-08-13 09:49:29 +02:00
|
|
|
if (envEvent.player_damage.send_to_server)
|
|
|
|
sendDamage(damage);
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2017-08-13 09:49:29 +02:00
|
|
|
// Add to ClientEvent queue
|
|
|
|
ClientEvent *event = new ClientEvent();
|
|
|
|
event->type = CE_PLAYER_DAMAGE;
|
|
|
|
event->player_damage.amount = damage;
|
2022-06-11 20:00:40 +02:00
|
|
|
event->player_damage.effect = true;
|
2017-08-13 09:49:29 +02:00
|
|
|
m_client_event_queue.push(event);
|
2011-04-21 18:35:17 +02:00
|
|
|
}
|
|
|
|
}
|
2013-07-19 19:50:33 +02:00
|
|
|
|
2011-04-21 18:35:17 +02:00
|
|
|
/*
|
|
|
|
Print some info
|
|
|
|
*/
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
float &counter = m_avg_rtt_timer;
|
|
|
|
counter += dtime;
|
|
|
|
if(counter >= 10) {
|
|
|
|
counter = 0.0;
|
|
|
|
// connectedAndInitialized() is true, peer exists.
|
|
|
|
float avg_rtt = getRTT();
|
2019-02-16 00:39:22 +01:00
|
|
|
infostream << "Client: avg_rtt=" << avg_rtt << std::endl;
|
2010-11-27 00:02:21 +01:00
|
|
|
}
|
2011-04-21 18:35:17 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
Send player position to server
|
|
|
|
*/
|
2010-11-27 00:02:21 +01:00
|
|
|
{
|
2010-12-19 15:51:45 +01:00
|
|
|
float &counter = m_playerpos_send_timer;
|
2010-11-27 00:02:21 +01:00
|
|
|
counter += dtime;
|
2014-02-13 20:17:42 +01:00
|
|
|
if((m_state == LC_Ready) && (counter >= m_recommended_send_interval))
|
2010-11-27 00:02:21 +01:00
|
|
|
{
|
|
|
|
counter = 0.0;
|
|
|
|
sendPlayerPos();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-04 01:05:12 +02:00
|
|
|
/*
|
|
|
|
Replace updated meshes
|
|
|
|
*/
|
2010-11-27 00:02:21 +01:00
|
|
|
{
|
2012-03-21 02:33:02 +01:00
|
|
|
int num_processed_meshes = 0;
|
2019-08-07 10:31:12 +02:00
|
|
|
std::vector<v3s16> blocks_to_ack;
|
2022-05-26 22:28:34 +02:00
|
|
|
bool force_update_shadows = false;
|
2015-06-22 04:34:56 +02:00
|
|
|
while (!m_mesh_update_thread.m_queue_out.empty())
|
2011-04-04 01:05:12 +02:00
|
|
|
{
|
2012-03-21 02:33:02 +01:00
|
|
|
num_processed_meshes++;
|
2015-07-08 06:45:24 +02:00
|
|
|
|
|
|
|
MinimapMapblock *minimap_mapblock = NULL;
|
|
|
|
bool do_mapper_update = true;
|
|
|
|
|
2014-01-06 12:45:42 +01:00
|
|
|
MeshUpdateResult r = m_mesh_update_thread.m_queue_out.pop_frontNoEx();
|
2011-04-04 01:05:12 +02:00
|
|
|
MapBlock *block = m_env.getMap().getBlockNoCreateNoEx(r.p);
|
2015-06-22 04:34:56 +02:00
|
|
|
if (block) {
|
2012-03-13 18:56:12 +01:00
|
|
|
// Delete the old mesh
|
2017-06-05 01:52:55 +02:00
|
|
|
delete block->mesh;
|
2017-06-17 19:11:28 +02:00
|
|
|
block->mesh = nullptr;
|
2012-03-13 18:56:12 +01:00
|
|
|
|
2015-07-08 06:45:24 +02:00
|
|
|
if (r.mesh) {
|
2015-07-19 01:35:47 +02:00
|
|
|
minimap_mapblock = r.mesh->moveMinimapMapblock();
|
|
|
|
if (minimap_mapblock == NULL)
|
|
|
|
do_mapper_update = false;
|
2015-06-22 04:34:56 +02:00
|
|
|
|
2017-04-21 15:34:59 +02:00
|
|
|
bool is_empty = true;
|
|
|
|
for (int l = 0; l < MAX_TILE_LAYERS; l++)
|
|
|
|
if (r.mesh->getMesh(l)->getMeshBufferCount() != 0)
|
|
|
|
is_empty = false;
|
|
|
|
|
|
|
|
if (is_empty)
|
|
|
|
delete r.mesh;
|
2022-05-26 22:28:34 +02:00
|
|
|
else {
|
2017-04-21 15:34:59 +02:00
|
|
|
// Replace with the new mesh
|
|
|
|
block->mesh = r.mesh;
|
2022-05-26 22:28:34 +02:00
|
|
|
force_update_shadows = true;
|
|
|
|
}
|
2015-06-22 04:34:56 +02:00
|
|
|
}
|
2013-05-18 01:52:18 +02:00
|
|
|
} else {
|
|
|
|
delete r.mesh;
|
2011-04-04 01:05:12 +02:00
|
|
|
}
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2017-05-19 07:25:27 +02:00
|
|
|
if (m_minimap && do_mapper_update)
|
2017-03-16 10:34:54 +01:00
|
|
|
m_minimap->addBlock(r.p, minimap_mapblock);
|
2015-06-22 04:34:56 +02:00
|
|
|
|
|
|
|
if (r.ack_block_to_server) {
|
2019-08-07 10:31:12 +02:00
|
|
|
if (blocks_to_ack.size() == 255) {
|
|
|
|
sendGotBlocks(blocks_to_ack);
|
|
|
|
blocks_to_ack.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
blocks_to_ack.emplace_back(r.p);
|
2011-04-04 01:05:12 +02:00
|
|
|
}
|
|
|
|
}
|
2019-08-07 10:31:12 +02:00
|
|
|
if (blocks_to_ack.size() > 0) {
|
|
|
|
// Acknowledge block(s)
|
|
|
|
sendGotBlocks(blocks_to_ack);
|
|
|
|
}
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2015-06-22 04:34:56 +02:00
|
|
|
if (num_processed_meshes > 0)
|
2012-03-21 02:33:02 +01:00
|
|
|
g_profiler->graphAdd("num_processed_meshes", num_processed_meshes);
|
2022-05-26 22:28:34 +02:00
|
|
|
|
|
|
|
auto shadow_renderer = RenderingEngine::get_shadow_renderer();
|
|
|
|
if (shadow_renderer && force_update_shadows)
|
|
|
|
shadow_renderer->setForceUpdateShadowMap();
|
2011-04-04 01:05:12 +02:00
|
|
|
}
|
2012-01-22 00:49:02 +01:00
|
|
|
|
2012-12-14 12:30:17 +01:00
|
|
|
/*
|
|
|
|
Load fetched media
|
|
|
|
*/
|
Rewrite client media download and support hash-based remote download
Move most of the media-related code in client.cpp into a new class
ClientMediaDownloader (clientmedia.cpp, clientmedia.h). Among other
things, this class does the following things:
- Download [remote_server][sha1] instead of [remote_server][name]. This
is to support servers that provide the same file name with different
contents.
- Initially fetch [remote_server]index.mth. This file should follow the
Minetest Hashset format (currently version 1) and contain a list of SHA1
hashes that exist on the server.
- The list of needed SHA1s is uploaded (via HTTP POST) when index.mth is
requested, so servers can optionally narrow down the list to the needs
of the client.
- If index.mth is missing (HTTP response code 404), we enter compat mode,
fetching [remote_server][name] as before this commit.
- remote_server can now contain multiple servers, separated by commas.
The downloader code attempts to split requests between the different
servers, as permitted by each server's index.mth. If one server claims
to have a file but actually doesn't (or something fails), we ask a
different server that also claims to have it.
- As before, when none of the remote servers provide a particular
file, we download it via the conventional method, i.e. using
the minetest protocol: TOSERVER_REQUEST_MEDIA / TOCLIENT_MEDIA.
- Bugfix: Every downloaded file's SHA1 is now verified against the SHA1
announced by the minetest server (before loading it and inserting it
into the file cache).
- Bugfix: Only send TOSERVER_RECEIVED_MEDIA when we actually have all
media. This should fix #863.
2013-08-29 05:22:18 +02:00
|
|
|
if (m_media_downloader && m_media_downloader->isStarted()) {
|
|
|
|
m_media_downloader->step(this);
|
|
|
|
if (m_media_downloader->isDone()) {
|
|
|
|
delete m_media_downloader;
|
|
|
|
m_media_downloader = NULL;
|
2012-12-14 12:30:17 +01:00
|
|
|
}
|
|
|
|
}
|
2021-09-09 16:51:35 +02:00
|
|
|
{
|
|
|
|
// Acknowledge dynamic media downloads to server
|
|
|
|
std::vector<u32> done;
|
|
|
|
for (auto it = m_pending_media_downloads.begin();
|
|
|
|
it != m_pending_media_downloads.end();) {
|
|
|
|
assert(it->second->isStarted());
|
|
|
|
it->second->step(this);
|
|
|
|
if (it->second->isDone()) {
|
|
|
|
done.emplace_back(it->first);
|
|
|
|
|
|
|
|
it = m_pending_media_downloads.erase(it);
|
|
|
|
} else {
|
|
|
|
it++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (done.size() == 255) { // maximum in one packet
|
|
|
|
sendHaveMedia(done);
|
|
|
|
done.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!done.empty())
|
|
|
|
sendHaveMedia(done);
|
|
|
|
}
|
2012-12-14 12:30:17 +01:00
|
|
|
|
2012-01-22 00:49:02 +01:00
|
|
|
/*
|
|
|
|
If the server didn't update the inventory in a while, revert
|
|
|
|
the local inventory (so the player notices the lag problem
|
|
|
|
and knows something is wrong).
|
|
|
|
*/
|
2018-04-04 07:42:40 +02:00
|
|
|
if (m_inventory_from_server) {
|
|
|
|
float interval = 10.0f;
|
|
|
|
float count_before = std::floor(m_inventory_from_server_age / interval);
|
2012-01-22 00:49:02 +01:00
|
|
|
|
|
|
|
m_inventory_from_server_age += dtime;
|
|
|
|
|
2018-04-04 07:42:40 +02:00
|
|
|
float count_after = std::floor(m_inventory_from_server_age / interval);
|
2012-01-22 00:49:02 +01:00
|
|
|
|
2018-04-04 07:42:40 +02:00
|
|
|
if (count_after != count_before) {
|
2012-01-22 00:49:02 +01:00
|
|
|
// Do this every <interval> seconds after TOCLIENT_INVENTORY
|
|
|
|
// Reset the locally changed inventory to the authoritative inventory
|
2019-08-24 19:07:38 +02:00
|
|
|
player->inventory = *m_inventory_from_server;
|
|
|
|
m_update_wielded_item = true;
|
2012-01-22 00:49:02 +01:00
|
|
|
}
|
|
|
|
}
|
2012-03-24 18:01:26 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
Update positions of sounds attached to objects
|
|
|
|
*/
|
|
|
|
{
|
2017-08-16 08:53:52 +02:00
|
|
|
for (auto &m_sounds_to_object : m_sounds_to_objects) {
|
|
|
|
int client_id = m_sounds_to_object.first;
|
|
|
|
u16 object_id = m_sounds_to_object.second;
|
2012-03-24 18:01:26 +01:00
|
|
|
ClientActiveObject *cao = m_env.getActiveObject(object_id);
|
2017-08-16 08:53:52 +02:00
|
|
|
if (!cao)
|
2012-03-24 18:01:26 +01:00
|
|
|
continue;
|
2017-08-16 08:53:52 +02:00
|
|
|
m_sound->updateSoundPosition(client_id, cao->getPosition());
|
2012-03-24 18:01:26 +01:00
|
|
|
}
|
|
|
|
}
|
2015-01-04 22:32:31 +01:00
|
|
|
|
2012-03-24 18:01:26 +01:00
|
|
|
/*
|
|
|
|
Handle removed remotely initiated sounds
|
|
|
|
*/
|
|
|
|
m_removed_sounds_check_timer += dtime;
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
if(m_removed_sounds_check_timer >= 2.32) {
|
2012-03-24 18:01:26 +01:00
|
|
|
m_removed_sounds_check_timer = 0;
|
|
|
|
// Find removed sounds and clear references to them
|
2015-03-16 12:39:27 +01:00
|
|
|
std::vector<s32> removed_server_ids;
|
2017-06-04 21:00:04 +02:00
|
|
|
for (std::unordered_map<s32, int>::iterator i = m_sounds_server_to_client.begin();
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
i != m_sounds_server_to_client.end();) {
|
2012-03-24 18:01:26 +01:00
|
|
|
s32 server_id = i->first;
|
|
|
|
int client_id = i->second;
|
2015-08-25 22:23:05 +02:00
|
|
|
++i;
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
if(!m_sound->soundExists(client_id)) {
|
2012-03-24 18:01:26 +01:00
|
|
|
m_sounds_server_to_client.erase(server_id);
|
|
|
|
m_sounds_client_to_server.erase(client_id);
|
|
|
|
m_sounds_to_objects.erase(client_id);
|
2015-03-16 12:39:27 +01:00
|
|
|
removed_server_ids.push_back(server_id);
|
2012-03-24 18:01:26 +01:00
|
|
|
}
|
|
|
|
}
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2012-03-24 18:01:26 +01:00
|
|
|
// Sync to server
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
if(!removed_server_ids.empty()) {
|
2015-03-16 12:39:27 +01:00
|
|
|
sendRemovedSounds(removed_server_ids);
|
2012-03-24 18:01:26 +01:00
|
|
|
}
|
|
|
|
}
|
2014-11-16 21:31:57 +01:00
|
|
|
|
2022-01-07 19:28:49 +01:00
|
|
|
// Write changes to the mod storage
|
2017-03-16 07:53:39 +01:00
|
|
|
m_mod_storage_save_timer -= dtime;
|
|
|
|
if (m_mod_storage_save_timer <= 0.0f) {
|
|
|
|
m_mod_storage_save_timer = g_settings->getFloat("server_map_save_interval");
|
2022-01-07 19:28:49 +01:00
|
|
|
m_mod_storage_database->endSave();
|
|
|
|
m_mod_storage_database->beginSave();
|
2017-03-16 07:53:39 +01:00
|
|
|
}
|
|
|
|
|
2014-11-16 21:31:57 +01:00
|
|
|
// Write server map
|
|
|
|
if (m_localdb && m_localdb_save_interval.step(dtime,
|
|
|
|
m_cache_save_interval)) {
|
|
|
|
m_localdb->endSave();
|
|
|
|
m_localdb->beginSave();
|
|
|
|
}
|
2010-11-27 00:02:21 +01:00
|
|
|
}
|
|
|
|
|
2020-06-13 19:03:26 +02:00
|
|
|
bool Client::loadMedia(const std::string &data, const std::string &filename,
|
|
|
|
bool from_media_push)
|
2012-03-25 13:47:51 +02:00
|
|
|
{
|
|
|
|
std::string name;
|
|
|
|
|
|
|
|
const char *image_ext[] = {
|
|
|
|
".png", ".jpg", ".bmp", ".tga",
|
|
|
|
".pcx", ".ppm", ".psd", ".wal", ".rgb",
|
|
|
|
NULL
|
|
|
|
};
|
|
|
|
name = removeStringEnd(filename, image_ext);
|
2017-08-16 08:53:52 +02:00
|
|
|
if (!name.empty()) {
|
2020-04-08 20:13:23 +02:00
|
|
|
TRACESTREAM(<< "Client: Attempting to load image "
|
|
|
|
<< "file \"" << filename << "\"" << std::endl);
|
2012-03-25 13:47:51 +02:00
|
|
|
|
2021-04-28 10:22:13 +02:00
|
|
|
io::IFileSystem *irrfs = m_rendering_engine->get_filesystem();
|
|
|
|
video::IVideoDriver *vdrv = m_rendering_engine->get_video_driver();
|
2012-03-25 13:47:51 +02:00
|
|
|
|
2021-03-12 19:36:58 +01:00
|
|
|
io::IReadFile *rfile = irrfs->createMemoryReadFile(
|
|
|
|
data.c_str(), data.size(), "_tempreadfile");
|
2015-03-06 11:21:51 +01:00
|
|
|
|
|
|
|
FATAL_ERROR_IF(!rfile, "Could not create irrlicht memory file.");
|
|
|
|
|
2012-03-25 13:47:51 +02:00
|
|
|
// Read image
|
|
|
|
video::IImage *img = vdrv->createImageFromFile(rfile);
|
2017-08-16 08:53:52 +02:00
|
|
|
if (!img) {
|
2012-03-25 13:47:51 +02:00
|
|
|
errorstream<<"Client: Cannot create image from data of "
|
|
|
|
<<"file \""<<filename<<"\""<<std::endl;
|
|
|
|
rfile->drop();
|
|
|
|
return false;
|
|
|
|
}
|
2017-08-16 08:53:52 +02:00
|
|
|
|
|
|
|
m_tsrc->insertSourceImage(filename, img);
|
|
|
|
img->drop();
|
|
|
|
rfile->drop();
|
|
|
|
return true;
|
2012-03-25 13:47:51 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
const char *sound_ext[] = {
|
2012-03-25 15:21:34 +02:00
|
|
|
".0.ogg", ".1.ogg", ".2.ogg", ".3.ogg", ".4.ogg",
|
|
|
|
".5.ogg", ".6.ogg", ".7.ogg", ".8.ogg", ".9.ogg",
|
2012-03-25 13:47:51 +02:00
|
|
|
".ogg", NULL
|
|
|
|
};
|
|
|
|
name = removeStringEnd(filename, sound_ext);
|
2017-08-16 08:53:52 +02:00
|
|
|
if (!name.empty()) {
|
2020-04-08 20:13:23 +02:00
|
|
|
TRACESTREAM(<< "Client: Attempting to load sound "
|
|
|
|
<< "file \"" << filename << "\"" << std::endl);
|
|
|
|
return m_sound->loadSoundData(name, data);
|
2012-03-25 13:47:51 +02:00
|
|
|
}
|
|
|
|
|
2012-10-23 23:11:24 +02:00
|
|
|
const char *model_ext[] = {
|
2012-10-24 21:10:05 +02:00
|
|
|
".x", ".b3d", ".md2", ".obj",
|
2012-10-23 23:11:24 +02:00
|
|
|
NULL
|
|
|
|
};
|
|
|
|
name = removeStringEnd(filename, model_ext);
|
2017-08-16 08:53:52 +02:00
|
|
|
if (!name.empty()) {
|
2014-01-06 12:24:06 +01:00
|
|
|
verbosestream<<"Client: Storing model into memory: "
|
2012-10-24 21:10:05 +02:00
|
|
|
<<"\""<<filename<<"\""<<std::endl;
|
2014-01-06 12:24:06 +01:00
|
|
|
if(m_mesh_data.count(filename))
|
|
|
|
errorstream<<"Multiple models with name \""<<filename.c_str()
|
|
|
|
<<"\" found; replacing previous model"<<std::endl;
|
|
|
|
m_mesh_data[filename] = data;
|
2012-10-23 23:11:24 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2017-01-31 18:05:03 +01:00
|
|
|
const char *translate_ext[] = {
|
|
|
|
".tr", NULL
|
|
|
|
};
|
|
|
|
name = removeStringEnd(filename, translate_ext);
|
|
|
|
if (!name.empty()) {
|
2020-06-13 19:03:26 +02:00
|
|
|
if (from_media_push)
|
|
|
|
return false;
|
2020-04-08 20:13:23 +02:00
|
|
|
TRACESTREAM(<< "Client: Loading translation: "
|
|
|
|
<< "\"" << filename << "\"" << std::endl);
|
2020-04-25 07:20:00 +02:00
|
|
|
g_client_translations->loadTranslation(data);
|
2017-01-31 18:05:03 +01:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
errorstream << "Client: Don't know how to load file \""
|
|
|
|
<< filename << "\"" << std::endl;
|
2012-03-25 13:47:51 +02:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2010-11-27 00:02:21 +01:00
|
|
|
// Virtual methods from con::PeerHandler
|
|
|
|
void Client::peerAdded(con::Peer *peer)
|
|
|
|
{
|
2015-07-17 08:51:07 +02:00
|
|
|
infostream << "Client::peerAdded(): peer->id="
|
|
|
|
<< peer->id << std::endl;
|
2010-11-27 00:02:21 +01:00
|
|
|
}
|
2022-05-06 20:13:45 +02:00
|
|
|
|
2010-11-27 00:02:21 +01:00
|
|
|
void Client::deletingPeer(con::Peer *peer, bool timeout)
|
|
|
|
{
|
2015-07-17 08:51:07 +02:00
|
|
|
infostream << "Client::deletingPeer(): "
|
2010-11-27 00:02:21 +01:00
|
|
|
"Server Peer is getting deleted "
|
2015-07-17 08:51:07 +02:00
|
|
|
<< "(timeout=" << timeout << ")" << std::endl;
|
|
|
|
|
2022-05-06 20:13:45 +02:00
|
|
|
m_access_denied = true;
|
|
|
|
if (timeout)
|
2015-07-17 08:51:07 +02:00
|
|
|
m_access_denied_reason = gettext("Connection timed out.");
|
2022-05-26 20:47:16 +02:00
|
|
|
else if (m_access_denied_reason.empty())
|
2022-05-06 20:13:45 +02:00
|
|
|
m_access_denied_reason = gettext("Connection aborted (protocol error?).");
|
2010-11-27 00:02:21 +01:00
|
|
|
}
|
|
|
|
|
2012-12-14 12:30:17 +01:00
|
|
|
/*
|
|
|
|
u16 command
|
|
|
|
u16 number of files requested
|
|
|
|
for each file {
|
|
|
|
u16 length of name
|
|
|
|
string name
|
|
|
|
}
|
|
|
|
*/
|
2015-03-05 10:43:08 +01:00
|
|
|
void Client::request_media(const std::vector<std::string> &file_requests)
|
2012-12-14 12:30:17 +01:00
|
|
|
{
|
|
|
|
std::ostringstream os(std::ios_base::binary);
|
|
|
|
writeU16(os, TOSERVER_REQUEST_MEDIA);
|
2014-02-05 00:17:57 +01:00
|
|
|
size_t file_requests_size = file_requests.size();
|
2015-03-06 11:21:51 +01:00
|
|
|
|
|
|
|
FATAL_ERROR_IF(file_requests_size > 0xFFFF, "Unsupported number of file requests");
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
|
|
|
// Packet dynamicly resized
|
2015-03-13 22:01:49 +01:00
|
|
|
NetworkPacket pkt(TOSERVER_REQUEST_MEDIA, 2 + 0);
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2015-03-13 22:01:49 +01:00
|
|
|
pkt << (u16) (file_requests_size & 0xFFFF);
|
2012-12-14 12:30:17 +01:00
|
|
|
|
2017-08-16 08:53:52 +02:00
|
|
|
for (const std::string &file_request : file_requests) {
|
|
|
|
pkt << file_request;
|
2012-12-14 12:30:17 +01:00
|
|
|
}
|
|
|
|
|
2015-03-13 22:01:49 +01:00
|
|
|
Send(&pkt);
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2015-03-13 22:01:49 +01:00
|
|
|
infostream << "Client: Sending media request list to server ("
|
2021-09-09 16:51:35 +02:00
|
|
|
<< file_requests.size() << " files, packet size "
|
|
|
|
<< pkt.getSize() << ")" << std::endl;
|
2012-12-14 12:30:17 +01:00
|
|
|
}
|
|
|
|
|
2015-01-30 15:33:23 +01:00
|
|
|
void Client::initLocalMapSaving(const Address &address,
|
|
|
|
const std::string &hostname,
|
|
|
|
bool is_local_server)
|
|
|
|
{
|
2014-11-16 21:31:57 +01:00
|
|
|
if (!g_settings->getBool("enable_local_map_saving") || is_local_server) {
|
2015-01-30 15:33:23 +01:00
|
|
|
return;
|
2014-11-16 21:31:57 +01:00
|
|
|
}
|
2015-01-30 15:33:23 +01:00
|
|
|
|
2020-01-11 20:47:34 +01:00
|
|
|
std::string world_path;
|
|
|
|
#define set_world_path(hostname) \
|
|
|
|
world_path = porting::path_user \
|
|
|
|
+ DIR_DELIM + "worlds" \
|
|
|
|
+ DIR_DELIM + "server_" \
|
2016-08-11 19:22:40 +02:00
|
|
|
+ hostname + "_" + std::to_string(address.getPort());
|
2015-01-30 15:33:23 +01:00
|
|
|
|
2020-01-11 20:47:34 +01:00
|
|
|
set_world_path(hostname);
|
|
|
|
if (!fs::IsDir(world_path)) {
|
|
|
|
std::string hostname_escaped = hostname;
|
|
|
|
str_replace(hostname_escaped, ':', '_');
|
|
|
|
set_world_path(hostname_escaped);
|
|
|
|
}
|
|
|
|
#undef set_world_path
|
2014-11-16 21:31:57 +01:00
|
|
|
fs::CreateAllDirs(world_path);
|
2015-01-30 15:33:23 +01:00
|
|
|
|
2017-04-23 14:35:08 +02:00
|
|
|
m_localdb = new MapDatabaseSQLite3(world_path);
|
2014-11-16 21:31:57 +01:00
|
|
|
m_localdb->beginSave();
|
2015-01-30 15:33:23 +01:00
|
|
|
actionstream << "Local map saving started, map will be saved at '" << world_path << "'" << std::endl;
|
|
|
|
}
|
|
|
|
|
2010-11-27 00:02:21 +01:00
|
|
|
void Client::ReceiveAll()
|
|
|
|
{
|
2019-11-19 20:23:00 +01:00
|
|
|
NetworkPacket pkt;
|
2017-04-29 14:36:55 +02:00
|
|
|
u64 start_ms = porting::getTimeMs();
|
2019-11-19 20:23:00 +01:00
|
|
|
const u64 budget = 100;
|
|
|
|
for(;;) {
|
2011-11-15 22:58:56 +01:00
|
|
|
// Limit time even if there would be huge amounts of data to
|
|
|
|
// process
|
2019-11-19 20:23:00 +01:00
|
|
|
if (porting::getTimeMs() > start_ms + budget) {
|
|
|
|
infostream << "Client::ReceiveAll(): "
|
|
|
|
"Packet processing budget exceeded." << std::endl;
|
2011-11-15 22:58:56 +01:00
|
|
|
break;
|
2019-11-19 20:23:00 +01:00
|
|
|
}
|
2015-01-04 22:32:31 +01:00
|
|
|
|
2019-11-19 20:23:00 +01:00
|
|
|
pkt.clear();
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
try {
|
2019-11-19 20:23:00 +01:00
|
|
|
if (!m_con->TryReceive(&pkt))
|
|
|
|
break;
|
|
|
|
ProcessData(&pkt);
|
|
|
|
} catch (const con::InvalidIncomingDataException &e) {
|
|
|
|
infostream << "Client::ReceiveAll(): "
|
2010-11-27 00:02:21 +01:00
|
|
|
"InvalidIncomingDataException: what()="
|
2019-11-19 20:23:00 +01:00
|
|
|
<< e.what() << std::endl;
|
2010-11-27 00:02:21 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
inline void Client::handleCommand(NetworkPacket* pkt)
|
2015-01-12 17:01:41 +01:00
|
|
|
{
|
|
|
|
const ToClientCommandHandler& opHandle = toClientCommandTable[pkt->getCommand()];
|
|
|
|
(this->*opHandle.handler)(pkt);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
sender_peer_id given to this shall be quaranteed to be a valid peer
|
|
|
|
*/
|
2015-03-31 10:35:51 +02:00
|
|
|
void Client::ProcessData(NetworkPacket *pkt)
|
2015-01-12 17:01:41 +01:00
|
|
|
{
|
2015-03-31 10:35:51 +02:00
|
|
|
ToClientCommand command = (ToClientCommand) pkt->getCommand();
|
|
|
|
u32 sender_peer_id = pkt->getPeerId();
|
2014-01-08 13:47:53 +01:00
|
|
|
|
2015-01-12 17:01:41 +01:00
|
|
|
//infostream<<"Client: received command="<<command<<std::endl;
|
|
|
|
m_packetcounter.add((u16)command);
|
2019-11-19 20:23:00 +01:00
|
|
|
g_profiler->graphAdd("client_received_packets", 1);
|
2015-01-12 17:01:41 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
If this check is removed, be sure to change the queue
|
|
|
|
system to know the ids
|
|
|
|
*/
|
|
|
|
if(sender_peer_id != PEER_ID_SERVER) {
|
|
|
|
infostream << "Client::ProcessData(): Discarding data not "
|
2021-12-01 20:22:33 +01:00
|
|
|
"coming from server: peer_id=" << sender_peer_id << " command=" << pkt->getCommand()
|
2015-01-12 17:01:41 +01:00
|
|
|
<< std::endl;
|
|
|
|
return;
|
2014-01-08 13:47:53 +01:00
|
|
|
}
|
2014-04-11 15:32:46 +02:00
|
|
|
|
2015-01-12 17:01:41 +01:00
|
|
|
// Command must be handled into ToClientCommandHandler
|
|
|
|
if (command >= TOCLIENT_NUM_MSG_TYPES) {
|
|
|
|
infostream << "Client: Ignoring unknown command "
|
|
|
|
<< command << std::endl;
|
2015-06-24 22:45:52 +02:00
|
|
|
return;
|
2015-01-12 17:01:41 +01:00
|
|
|
}
|
2014-04-11 15:32:46 +02:00
|
|
|
|
2015-01-12 17:01:41 +01:00
|
|
|
/*
|
|
|
|
* Those packets are handled before m_server_ser_ver is set, it's normal
|
|
|
|
* But we must use the new ToClientConnectionState in the future,
|
|
|
|
* as a byte mask
|
|
|
|
*/
|
|
|
|
if(toClientCommandTable[command].state == TOCLIENT_STATE_NOT_CONNECTED) {
|
2015-03-31 10:35:51 +02:00
|
|
|
handleCommand(pkt);
|
2015-01-12 17:01:41 +01:00
|
|
|
return;
|
2014-04-11 15:32:46 +02:00
|
|
|
}
|
2015-01-12 17:01:41 +01:00
|
|
|
|
|
|
|
if(m_server_ser_ver == SER_FMT_VER_INVALID) {
|
|
|
|
infostream << "Client: Server serialization"
|
|
|
|
" format invalid or not initialized."
|
|
|
|
" Skipping incoming command=" << command << std::endl;
|
|
|
|
return;
|
2010-11-27 00:02:21 +01:00
|
|
|
}
|
2015-01-12 17:01:41 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
Handle runtime commands
|
|
|
|
*/
|
|
|
|
|
2015-03-31 10:35:51 +02:00
|
|
|
handleCommand(pkt);
|
2010-11-27 00:02:21 +01:00
|
|
|
}
|
|
|
|
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
void Client::Send(NetworkPacket* pkt)
|
2010-11-27 00:02:21 +01:00
|
|
|
{
|
2017-08-24 08:28:54 +02:00
|
|
|
m_con->Send(PEER_ID_SERVER,
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
serverCommandFactoryTable[pkt->getCommand()].channel,
|
|
|
|
pkt,
|
|
|
|
serverCommandFactoryTable[pkt->getCommand()].reliable);
|
2010-11-27 00:02:21 +01:00
|
|
|
}
|
|
|
|
|
2016-11-12 08:22:39 +01:00
|
|
|
// Will fill up 12 + 12 + 4 + 4 + 4 bytes
|
2016-11-30 09:13:14 +01:00
|
|
|
void writePlayerPos(LocalPlayer *myplayer, ClientMap *clientMap, NetworkPacket *pkt)
|
2016-11-12 08:22:39 +01:00
|
|
|
{
|
2016-11-30 09:13:14 +01:00
|
|
|
v3f pf = myplayer->getPosition() * 100;
|
|
|
|
v3f sf = myplayer->getSpeed() * 100;
|
|
|
|
s32 pitch = myplayer->getPitch() * 100;
|
|
|
|
s32 yaw = myplayer->getYaw() * 100;
|
2022-01-09 18:46:36 +01:00
|
|
|
u32 keyPressed = myplayer->control.getKeysPressed();
|
2016-11-30 09:13:14 +01:00
|
|
|
// scaled by 80, so that pi can fit into a u8
|
|
|
|
u8 fov = clientMap->getCameraFov() * 80;
|
2016-12-11 00:23:32 +01:00
|
|
|
u8 wanted_range = MYMIN(255,
|
|
|
|
std::ceil(clientMap->getControl().wanted_range / MAP_BLOCKSIZE));
|
2016-11-12 08:22:39 +01:00
|
|
|
|
|
|
|
v3s32 position(pf.X, pf.Y, pf.Z);
|
|
|
|
v3s32 speed(sf.X, sf.Y, sf.Z);
|
|
|
|
|
|
|
|
/*
|
|
|
|
Format:
|
|
|
|
[0] v3s32 position*100
|
|
|
|
[12] v3s32 speed*100
|
|
|
|
[12+12] s32 pitch*100
|
|
|
|
[12+12+4] s32 yaw*100
|
|
|
|
[12+12+4+4] u32 keyPressed
|
2016-12-01 06:42:22 +01:00
|
|
|
[12+12+4+4+4] u8 fov*80
|
2016-12-11 19:49:49 +01:00
|
|
|
[12+12+4+4+4+1] u8 ceil(wanted_range / MAP_BLOCKSIZE)
|
2016-11-12 08:22:39 +01:00
|
|
|
*/
|
|
|
|
*pkt << position << speed << pitch << yaw << keyPressed;
|
2016-11-30 09:13:14 +01:00
|
|
|
*pkt << fov << wanted_range;
|
2016-11-12 08:22:39 +01:00
|
|
|
}
|
|
|
|
|
2019-08-04 06:53:59 +02:00
|
|
|
void Client::interact(InteractAction action, const PointedThing& pointed)
|
2010-11-27 00:02:21 +01:00
|
|
|
{
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
if(m_state != LC_Ready) {
|
|
|
|
errorstream << "Client::interact() "
|
2015-03-13 22:08:41 +01:00
|
|
|
"Canceled (not connected)"
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
<< std::endl;
|
2010-11-27 00:02:21 +01:00
|
|
|
return;
|
|
|
|
}
|
2011-11-29 16:15:18 +01:00
|
|
|
|
2016-11-12 08:22:39 +01:00
|
|
|
LocalPlayer *myplayer = m_env.getLocalPlayer();
|
|
|
|
if (myplayer == NULL)
|
|
|
|
return;
|
|
|
|
|
2010-11-27 00:02:21 +01:00
|
|
|
/*
|
|
|
|
[0] u16 command
|
2010-12-18 12:10:37 +01:00
|
|
|
[2] u8 action
|
2011-11-29 16:15:18 +01:00
|
|
|
[3] u16 item
|
2016-11-12 08:22:39 +01:00
|
|
|
[5] u32 length of the next item (plen)
|
2011-11-29 16:15:18 +01:00
|
|
|
[9] serialized PointedThing
|
2016-11-12 08:22:39 +01:00
|
|
|
[9 + plen] player position information
|
2010-11-27 00:02:21 +01:00
|
|
|
*/
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2015-03-13 22:01:49 +01:00
|
|
|
NetworkPacket pkt(TOSERVER_INTERACT, 1 + 2 + 0);
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2019-08-04 06:53:59 +02:00
|
|
|
pkt << (u8)action;
|
2019-08-07 19:16:31 +02:00
|
|
|
pkt << myplayer->getWieldIndex();
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2011-11-29 16:15:18 +01:00
|
|
|
std::ostringstream tmp_os(std::ios::binary);
|
|
|
|
pointed.serialize(tmp_os);
|
2011-10-15 11:17:21 +02:00
|
|
|
|
2015-03-13 22:01:49 +01:00
|
|
|
pkt.putLongString(tmp_os.str());
|
2011-10-15 11:17:21 +02:00
|
|
|
|
2016-11-30 09:13:14 +01:00
|
|
|
writePlayerPos(myplayer, &m_env.getClientMap(), &pkt);
|
2016-11-12 08:22:39 +01:00
|
|
|
|
2015-03-13 22:01:49 +01:00
|
|
|
Send(&pkt);
|
2011-04-10 03:15:10 +02:00
|
|
|
}
|
|
|
|
|
2015-04-12 04:49:13 +02:00
|
|
|
void Client::deleteAuthData()
|
|
|
|
{
|
|
|
|
if (!m_auth_data)
|
|
|
|
return;
|
|
|
|
|
|
|
|
switch (m_chosen_auth_mech) {
|
|
|
|
case AUTH_MECHANISM_FIRST_SRP:
|
|
|
|
break;
|
|
|
|
case AUTH_MECHANISM_SRP:
|
2017-09-12 20:26:03 +02:00
|
|
|
case AUTH_MECHANISM_LEGACY_PASSWORD:
|
2015-04-12 04:49:13 +02:00
|
|
|
srp_user_delete((SRPUser *) m_auth_data);
|
|
|
|
m_auth_data = NULL;
|
|
|
|
break;
|
|
|
|
case AUTH_MECHANISM_NONE:
|
|
|
|
break;
|
|
|
|
}
|
2015-07-27 07:44:48 +02:00
|
|
|
m_chosen_auth_mech = AUTH_MECHANISM_NONE;
|
2015-04-12 04:49:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AuthMechanism Client::choseAuthMech(const u32 mechs)
|
|
|
|
{
|
|
|
|
if (mechs & AUTH_MECHANISM_SRP)
|
|
|
|
return AUTH_MECHANISM_SRP;
|
|
|
|
|
|
|
|
if (mechs & AUTH_MECHANISM_FIRST_SRP)
|
|
|
|
return AUTH_MECHANISM_FIRST_SRP;
|
|
|
|
|
2017-09-12 20:26:03 +02:00
|
|
|
if (mechs & AUTH_MECHANISM_LEGACY_PASSWORD)
|
|
|
|
return AUTH_MECHANISM_LEGACY_PASSWORD;
|
|
|
|
|
2015-04-12 04:49:13 +02:00
|
|
|
return AUTH_MECHANISM_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Client::sendInit(const std::string &playerName)
|
|
|
|
{
|
|
|
|
NetworkPacket pkt(TOSERVER_INIT, 1 + 2 + 2 + (1 + playerName.size()));
|
|
|
|
|
2015-05-16 01:19:43 +02:00
|
|
|
// we don't support network compression yet
|
|
|
|
u16 supp_comp_modes = NETPROTO_COMPRESSION_NONE;
|
2016-03-14 10:18:29 +01:00
|
|
|
|
2015-05-16 01:19:43 +02:00
|
|
|
pkt << (u8) SER_FMT_VER_HIGHEST_READ << (u16) supp_comp_modes;
|
2017-09-12 19:48:09 +02:00
|
|
|
pkt << (u16) CLIENT_PROTOCOL_VERSION_MIN << (u16) CLIENT_PROTOCOL_VERSION_MAX;
|
2015-04-12 04:49:13 +02:00
|
|
|
pkt << playerName;
|
|
|
|
|
|
|
|
Send(&pkt);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Client::startAuth(AuthMechanism chosen_auth_mechanism)
|
|
|
|
{
|
|
|
|
m_chosen_auth_mech = chosen_auth_mechanism;
|
|
|
|
|
|
|
|
switch (chosen_auth_mechanism) {
|
|
|
|
case AUTH_MECHANISM_FIRST_SRP: {
|
|
|
|
// send srp verifier to server
|
2016-03-09 03:12:22 +01:00
|
|
|
std::string verifier;
|
|
|
|
std::string salt;
|
|
|
|
generate_srp_verifier_and_salt(getPlayerName(), m_password,
|
|
|
|
&verifier, &salt);
|
|
|
|
|
2015-04-12 04:49:13 +02:00
|
|
|
NetworkPacket resp_pkt(TOSERVER_FIRST_SRP, 0);
|
2017-08-16 08:53:52 +02:00
|
|
|
resp_pkt << salt << verifier << (u8)((m_password.empty()) ? 1 : 0);
|
2016-03-09 03:12:22 +01:00
|
|
|
|
2015-04-12 04:49:13 +02:00
|
|
|
Send(&resp_pkt);
|
|
|
|
break;
|
|
|
|
}
|
2017-09-12 20:26:03 +02:00
|
|
|
case AUTH_MECHANISM_SRP:
|
|
|
|
case AUTH_MECHANISM_LEGACY_PASSWORD: {
|
|
|
|
u8 based_on = 1;
|
|
|
|
|
|
|
|
if (chosen_auth_mechanism == AUTH_MECHANISM_LEGACY_PASSWORD) {
|
|
|
|
m_password = translate_password(getPlayerName(), m_password);
|
|
|
|
based_on = 0;
|
|
|
|
}
|
2015-04-12 04:49:13 +02:00
|
|
|
|
|
|
|
std::string playername_u = lowercase(getPlayerName());
|
|
|
|
m_auth_data = srp_user_new(SRP_SHA256, SRP_NG_2048,
|
|
|
|
getPlayerName().c_str(), playername_u.c_str(),
|
|
|
|
(const unsigned char *) m_password.c_str(),
|
|
|
|
m_password.length(), NULL, NULL);
|
|
|
|
char *bytes_A = 0;
|
|
|
|
size_t len_A = 0;
|
2015-09-30 00:38:05 +02:00
|
|
|
SRP_Result res = srp_user_start_authentication(
|
|
|
|
(struct SRPUser *) m_auth_data, NULL, NULL, 0,
|
|
|
|
(unsigned char **) &bytes_A, &len_A);
|
|
|
|
FATAL_ERROR_IF(res != SRP_OK, "Creating local SRP user failed.");
|
2015-04-12 04:49:13 +02:00
|
|
|
|
|
|
|
NetworkPacket resp_pkt(TOSERVER_SRP_BYTES_A, 0);
|
2017-09-12 20:26:03 +02:00
|
|
|
resp_pkt << std::string(bytes_A, len_A) << based_on;
|
2015-04-12 04:49:13 +02:00
|
|
|
Send(&resp_pkt);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AUTH_MECHANISM_NONE:
|
|
|
|
break; // not handled in this method
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-16 12:39:27 +01:00
|
|
|
void Client::sendDeletedBlocks(std::vector<v3s16> &blocks)
|
|
|
|
{
|
|
|
|
NetworkPacket pkt(TOSERVER_DELETEDBLOCKS, 1 + sizeof(v3s16) * blocks.size());
|
|
|
|
|
|
|
|
pkt << (u8) blocks.size();
|
|
|
|
|
2017-08-16 08:53:52 +02:00
|
|
|
for (const v3s16 &block : blocks) {
|
|
|
|
pkt << block;
|
2015-03-16 12:39:27 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
Send(&pkt);
|
|
|
|
}
|
|
|
|
|
2019-08-07 10:31:12 +02:00
|
|
|
void Client::sendGotBlocks(const std::vector<v3s16> &blocks)
|
2015-03-16 12:39:27 +01:00
|
|
|
{
|
2019-08-07 10:31:12 +02:00
|
|
|
NetworkPacket pkt(TOSERVER_GOTBLOCKS, 1 + 6 * blocks.size());
|
|
|
|
pkt << (u8) blocks.size();
|
|
|
|
for (const v3s16 &block : blocks)
|
|
|
|
pkt << block;
|
|
|
|
|
2015-03-16 12:39:27 +01:00
|
|
|
Send(&pkt);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Client::sendRemovedSounds(std::vector<s32> &soundList)
|
|
|
|
{
|
|
|
|
size_t server_ids = soundList.size();
|
|
|
|
assert(server_ids <= 0xFFFF);
|
|
|
|
|
|
|
|
NetworkPacket pkt(TOSERVER_REMOVED_SOUNDS, 2 + server_ids * 4);
|
|
|
|
|
|
|
|
pkt << (u16) (server_ids & 0xFFFF);
|
|
|
|
|
2020-01-25 21:19:29 +01:00
|
|
|
for (s32 sound_id : soundList)
|
2017-08-16 08:53:52 +02:00
|
|
|
pkt << sound_id;
|
2015-03-16 12:39:27 +01:00
|
|
|
|
|
|
|
Send(&pkt);
|
|
|
|
}
|
|
|
|
|
2012-06-01 19:51:15 +02:00
|
|
|
void Client::sendNodemetaFields(v3s16 p, const std::string &formname,
|
2015-05-19 08:24:14 +02:00
|
|
|
const StringMap &fields)
|
2011-04-04 04:12:33 +02:00
|
|
|
{
|
2014-02-05 00:17:57 +01:00
|
|
|
size_t fields_size = fields.size();
|
2015-03-06 11:21:51 +01:00
|
|
|
|
|
|
|
FATAL_ERROR_IF(fields_size > 0xFFFF, "Unsupported number of nodemeta fields");
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2015-03-13 22:01:49 +01:00
|
|
|
NetworkPacket pkt(TOSERVER_NODEMETA_FIELDS, 0);
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2015-03-13 22:01:49 +01:00
|
|
|
pkt << p << formname << (u16) (fields_size & 0xFFFF);
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2015-05-19 08:24:14 +02:00
|
|
|
StringMap::const_iterator it;
|
|
|
|
for (it = fields.begin(); it != fields.end(); ++it) {
|
|
|
|
const std::string &name = it->first;
|
|
|
|
const std::string &value = it->second;
|
2015-03-13 22:01:49 +01:00
|
|
|
pkt << name;
|
|
|
|
pkt.putLongString(value);
|
2012-06-01 19:51:15 +02:00
|
|
|
}
|
2011-04-04 04:12:33 +02:00
|
|
|
|
2015-03-13 22:01:49 +01:00
|
|
|
Send(&pkt);
|
2011-04-04 04:12:33 +02:00
|
|
|
}
|
2015-01-04 22:32:31 +01:00
|
|
|
|
2013-12-01 01:52:06 +01:00
|
|
|
void Client::sendInventoryFields(const std::string &formname,
|
2015-05-19 08:24:14 +02:00
|
|
|
const StringMap &fields)
|
2012-07-22 16:10:58 +02:00
|
|
|
{
|
2014-02-05 00:17:57 +01:00
|
|
|
size_t fields_size = fields.size();
|
2015-03-06 11:21:51 +01:00
|
|
|
FATAL_ERROR_IF(fields_size > 0xFFFF, "Unsupported number of inventory fields");
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2015-03-13 22:01:49 +01:00
|
|
|
NetworkPacket pkt(TOSERVER_INVENTORY_FIELDS, 0);
|
|
|
|
pkt << formname << (u16) (fields_size & 0xFFFF);
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2015-05-19 08:24:14 +02:00
|
|
|
StringMap::const_iterator it;
|
|
|
|
for (it = fields.begin(); it != fields.end(); ++it) {
|
|
|
|
const std::string &name = it->first;
|
|
|
|
const std::string &value = it->second;
|
2015-03-13 22:01:49 +01:00
|
|
|
pkt << name;
|
|
|
|
pkt.putLongString(value);
|
2012-07-22 16:10:58 +02:00
|
|
|
}
|
|
|
|
|
2015-03-13 22:01:49 +01:00
|
|
|
Send(&pkt);
|
2012-07-22 16:10:58 +02:00
|
|
|
}
|
|
|
|
|
2010-12-22 15:30:23 +01:00
|
|
|
void Client::sendInventoryAction(InventoryAction *a)
|
|
|
|
{
|
|
|
|
std::ostringstream os(std::ios_base::binary);
|
|
|
|
|
|
|
|
a->serialize(os);
|
2015-01-04 22:32:31 +01:00
|
|
|
|
2010-12-22 15:30:23 +01:00
|
|
|
// Make data buffer
|
|
|
|
std::string s = os.str();
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2015-03-13 22:01:49 +01:00
|
|
|
NetworkPacket pkt(TOSERVER_INVENTORY_ACTION, s.size());
|
|
|
|
pkt.putRawString(s.c_str(),s.size());
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2015-03-13 22:01:49 +01:00
|
|
|
Send(&pkt);
|
2010-12-22 15:30:23 +01:00
|
|
|
}
|
2010-11-27 00:02:21 +01:00
|
|
|
|
2017-07-15 09:28:10 +02:00
|
|
|
bool Client::canSendChatMessage() const
|
|
|
|
{
|
|
|
|
u32 now = time(NULL);
|
|
|
|
float time_passed = now - m_last_chat_message_sent;
|
|
|
|
|
|
|
|
float virt_chat_message_allowance = m_chat_message_allowance + time_passed *
|
|
|
|
(CLIENT_CHAT_MESSAGE_LIMIT_PER_10S / 8.0f);
|
|
|
|
|
|
|
|
if (virt_chat_message_allowance < 1.0f)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2010-12-23 21:35:53 +01:00
|
|
|
void Client::sendChatMessage(const std::wstring &message)
|
|
|
|
{
|
2017-07-15 09:28:10 +02:00
|
|
|
const s16 max_queue_size = g_settings->getS16("max_out_chat_queue_size");
|
|
|
|
if (canSendChatMessage()) {
|
|
|
|
u32 now = time(NULL);
|
|
|
|
float time_passed = now - m_last_chat_message_sent;
|
2021-01-29 14:03:27 +01:00
|
|
|
m_last_chat_message_sent = now;
|
2015-01-04 22:32:31 +01:00
|
|
|
|
2017-07-15 09:28:10 +02:00
|
|
|
m_chat_message_allowance += time_passed * (CLIENT_CHAT_MESSAGE_LIMIT_PER_10S / 8.0f);
|
|
|
|
if (m_chat_message_allowance > CLIENT_CHAT_MESSAGE_LIMIT_PER_10S)
|
|
|
|
m_chat_message_allowance = CLIENT_CHAT_MESSAGE_LIMIT_PER_10S;
|
2015-01-04 22:32:31 +01:00
|
|
|
|
2017-07-15 09:28:10 +02:00
|
|
|
m_chat_message_allowance -= 1.0f;
|
|
|
|
|
|
|
|
NetworkPacket pkt(TOSERVER_CHAT_MESSAGE, 2 + message.size() * sizeof(u16));
|
|
|
|
|
|
|
|
pkt << message;
|
|
|
|
|
|
|
|
Send(&pkt);
|
2022-07-09 22:32:08 +02:00
|
|
|
} else if (m_out_chat_queue.size() < (u16) max_queue_size || max_queue_size < 0) {
|
2017-07-15 09:28:10 +02:00
|
|
|
m_out_chat_queue.push(message);
|
|
|
|
} else {
|
|
|
|
infostream << "Could not queue chat message because maximum out chat queue size ("
|
|
|
|
<< max_queue_size << ") is reached." << std::endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Client::clearOutChatQueue()
|
|
|
|
{
|
|
|
|
m_out_chat_queue = std::queue<std::wstring>();
|
2010-12-23 21:35:53 +01:00
|
|
|
}
|
|
|
|
|
2015-04-17 06:10:30 +02:00
|
|
|
void Client::sendChangePassword(const std::string &oldpassword,
|
2019-08-04 06:53:59 +02:00
|
|
|
const std::string &newpassword)
|
2011-05-22 22:09:12 +02:00
|
|
|
{
|
2016-10-08 16:31:22 +02:00
|
|
|
LocalPlayer *player = m_env.getLocalPlayer();
|
2015-04-12 04:49:13 +02:00
|
|
|
if (player == NULL)
|
2011-05-22 22:09:12 +02:00
|
|
|
return;
|
|
|
|
|
2017-09-12 19:48:09 +02:00
|
|
|
// get into sudo mode and then send new password to server
|
|
|
|
m_password = oldpassword;
|
|
|
|
m_new_password = newpassword;
|
|
|
|
startAuth(choseAuthMech(m_sudo_auth_methods));
|
2011-05-22 22:09:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-02-11 00:03:26 +01:00
|
|
|
void Client::sendDamage(u16 damage)
|
2011-04-21 18:35:17 +02:00
|
|
|
{
|
2019-02-11 00:03:26 +01:00
|
|
|
NetworkPacket pkt(TOSERVER_DAMAGE, sizeof(u16));
|
2015-03-13 22:01:49 +01:00
|
|
|
pkt << damage;
|
|
|
|
Send(&pkt);
|
2011-04-21 18:35:17 +02:00
|
|
|
}
|
|
|
|
|
2011-10-15 13:46:59 +02:00
|
|
|
void Client::sendRespawn()
|
|
|
|
{
|
2015-03-13 22:01:49 +01:00
|
|
|
NetworkPacket pkt(TOSERVER_RESPAWN, 0);
|
|
|
|
Send(&pkt);
|
2011-10-15 13:46:59 +02:00
|
|
|
}
|
|
|
|
|
2014-02-13 20:17:42 +01:00
|
|
|
void Client::sendReady()
|
|
|
|
{
|
2015-03-13 22:01:49 +01:00
|
|
|
NetworkPacket pkt(TOSERVER_CLIENT_READY,
|
2019-09-10 21:18:42 +02:00
|
|
|
1 + 1 + 1 + 1 + 2 + sizeof(char) * strlen(g_version_hash) + 2);
|
2014-02-13 20:17:42 +01:00
|
|
|
|
2015-02-28 00:05:29 +01:00
|
|
|
pkt << (u8) VERSION_MAJOR << (u8) VERSION_MINOR << (u8) VERSION_PATCH
|
|
|
|
<< (u8) 0 << (u16) strlen(g_version_hash);
|
2014-02-13 20:17:42 +01:00
|
|
|
|
2015-02-28 00:05:29 +01:00
|
|
|
pkt.putRawString(g_version_hash, (u16) strlen(g_version_hash));
|
2019-09-10 21:18:42 +02:00
|
|
|
pkt << (u16)FORMSPEC_API_VERSION;
|
2015-03-13 22:01:49 +01:00
|
|
|
Send(&pkt);
|
2014-02-13 20:17:42 +01:00
|
|
|
}
|
|
|
|
|
2010-11-27 00:02:21 +01:00
|
|
|
void Client::sendPlayerPos()
|
|
|
|
{
|
2019-08-21 15:08:41 +02:00
|
|
|
LocalPlayer *player = m_env.getLocalPlayer();
|
|
|
|
if (!player)
|
2010-11-27 00:02:21 +01:00
|
|
|
return;
|
2012-12-02 13:59:08 +01:00
|
|
|
|
2019-08-25 02:54:21 +02:00
|
|
|
// Save bandwidth by only updating position when
|
|
|
|
// player is not dead and something changed
|
|
|
|
|
2021-01-30 11:54:56 +01:00
|
|
|
if (m_activeobjects_received && player->isDead())
|
|
|
|
return;
|
2019-08-25 02:54:21 +02:00
|
|
|
|
2022-01-09 18:46:36 +01:00
|
|
|
ClientMap &map = m_env.getClientMap();
|
|
|
|
u8 camera_fov = map.getCameraFov();
|
|
|
|
u8 wanted_range = map.getControl().wanted_range;
|
|
|
|
|
|
|
|
u32 keyPressed = player->control.getKeysPressed();
|
|
|
|
|
2019-08-25 02:54:21 +02:00
|
|
|
if (
|
2019-08-21 15:08:41 +02:00
|
|
|
player->last_position == player->getPosition() &&
|
|
|
|
player->last_speed == player->getSpeed() &&
|
|
|
|
player->last_pitch == player->getPitch() &&
|
|
|
|
player->last_yaw == player->getYaw() &&
|
2022-01-09 18:46:36 +01:00
|
|
|
player->last_keyPressed == keyPressed &&
|
2020-06-05 15:06:35 +02:00
|
|
|
player->last_camera_fov == camera_fov &&
|
2019-08-21 15:08:41 +02:00
|
|
|
player->last_wanted_range == wanted_range)
|
2012-12-02 13:59:08 +01:00
|
|
|
return;
|
|
|
|
|
2019-08-21 15:08:41 +02:00
|
|
|
player->last_position = player->getPosition();
|
|
|
|
player->last_speed = player->getSpeed();
|
|
|
|
player->last_pitch = player->getPitch();
|
|
|
|
player->last_yaw = player->getYaw();
|
2022-01-09 18:46:36 +01:00
|
|
|
player->last_keyPressed = keyPressed;
|
2019-08-21 15:08:41 +02:00
|
|
|
player->last_camera_fov = camera_fov;
|
|
|
|
player->last_wanted_range = wanted_range;
|
2016-11-30 09:13:14 +01:00
|
|
|
|
2016-12-01 06:42:22 +01:00
|
|
|
NetworkPacket pkt(TOSERVER_PLAYERPOS, 12 + 12 + 4 + 4 + 4 + 1 + 1);
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2019-08-21 15:08:41 +02:00
|
|
|
writePlayerPos(player, &map, &pkt);
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2015-03-13 22:01:49 +01:00
|
|
|
Send(&pkt);
|
2010-11-27 00:02:21 +01:00
|
|
|
}
|
|
|
|
|
2021-09-09 16:51:35 +02:00
|
|
|
void Client::sendHaveMedia(const std::vector<u32> &tokens)
|
|
|
|
{
|
|
|
|
NetworkPacket pkt(TOSERVER_HAVE_MEDIA, 1 + tokens.size() * 4);
|
|
|
|
|
|
|
|
sanity_check(tokens.size() < 256);
|
|
|
|
|
|
|
|
pkt << static_cast<u8>(tokens.size());
|
|
|
|
for (u32 token : tokens)
|
|
|
|
pkt << token;
|
|
|
|
|
|
|
|
Send(&pkt);
|
|
|
|
}
|
|
|
|
|
2010-12-23 21:35:53 +01:00
|
|
|
void Client::removeNode(v3s16 p)
|
|
|
|
{
|
2012-12-20 18:19:49 +01:00
|
|
|
std::map<v3s16, MapBlock*> modified_blocks;
|
2010-11-27 00:02:21 +01:00
|
|
|
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
try {
|
2010-12-23 21:35:53 +01:00
|
|
|
m_env.getMap().removeNodeAndUpdate(p, modified_blocks);
|
|
|
|
}
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
catch(InvalidPositionException &e) {
|
2010-12-23 21:35:53 +01:00
|
|
|
}
|
2015-01-04 22:32:31 +01:00
|
|
|
|
2017-08-16 08:53:52 +02:00
|
|
|
for (const auto &modified_block : modified_blocks) {
|
|
|
|
addUpdateMeshTaskWithEdge(modified_block.first, false, true);
|
2010-12-23 21:35:53 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-07-18 21:39:55 +02:00
|
|
|
/**
|
|
|
|
* Helper function for Client Side Modding
|
2018-06-20 22:36:08 +02:00
|
|
|
* CSM restrictions are applied there, this should not be used for core engine
|
2017-07-18 21:39:55 +02:00
|
|
|
* @param p
|
|
|
|
* @param is_valid_position
|
|
|
|
* @return
|
|
|
|
*/
|
2019-11-08 22:57:03 +01:00
|
|
|
MapNode Client::CSMGetNode(v3s16 p, bool *is_valid_position)
|
2017-01-30 20:10:37 +01:00
|
|
|
{
|
2018-06-20 22:36:08 +02:00
|
|
|
if (checkCSMRestrictionFlag(CSMRestrictionFlags::CSM_RF_LOOKUP_NODES)) {
|
2017-07-18 21:39:55 +02:00
|
|
|
v3s16 ppos = floatToInt(m_env.getLocalPlayer()->getPosition(), BS);
|
2018-06-20 22:36:08 +02:00
|
|
|
if ((u32) ppos.getDistanceFrom(p) > m_csm_restriction_noderange) {
|
2017-07-18 21:39:55 +02:00
|
|
|
*is_valid_position = false;
|
2017-08-16 08:53:52 +02:00
|
|
|
return {};
|
2017-07-18 21:39:55 +02:00
|
|
|
}
|
|
|
|
}
|
2019-08-10 19:45:44 +02:00
|
|
|
return m_env.getMap().getNode(p, is_valid_position);
|
2017-01-30 20:10:37 +01:00
|
|
|
}
|
|
|
|
|
2019-11-08 22:57:03 +01:00
|
|
|
int Client::CSMClampRadius(v3s16 pos, int radius)
|
|
|
|
{
|
|
|
|
if (!checkCSMRestrictionFlag(CSMRestrictionFlags::CSM_RF_LOOKUP_NODES))
|
|
|
|
return radius;
|
|
|
|
// This is approximate and will cause some allowed nodes to be excluded
|
|
|
|
v3s16 ppos = floatToInt(m_env.getLocalPlayer()->getPosition(), BS);
|
|
|
|
u32 distance = ppos.getDistanceFrom(pos);
|
|
|
|
if (distance >= m_csm_restriction_noderange)
|
|
|
|
return 0;
|
|
|
|
return std::min<int>(radius, m_csm_restriction_noderange - distance);
|
|
|
|
}
|
|
|
|
|
2019-11-09 00:22:42 +01:00
|
|
|
v3s16 Client::CSMClampPos(v3s16 pos)
|
|
|
|
{
|
|
|
|
if (!checkCSMRestrictionFlag(CSMRestrictionFlags::CSM_RF_LOOKUP_NODES))
|
|
|
|
return pos;
|
|
|
|
v3s16 ppos = floatToInt(m_env.getLocalPlayer()->getPosition(), BS);
|
|
|
|
const int range = m_csm_restriction_noderange;
|
|
|
|
return v3s16(
|
|
|
|
core::clamp<int>(pos.X, (int)ppos.X - range, (int)ppos.X + range),
|
|
|
|
core::clamp<int>(pos.Y, (int)ppos.Y - range, (int)ppos.Y + range),
|
|
|
|
core::clamp<int>(pos.Z, (int)ppos.Z - range, (int)ppos.Z + range)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2013-11-23 15:35:49 +01:00
|
|
|
void Client::addNode(v3s16 p, MapNode n, bool remove_metadata)
|
2010-12-23 21:35:53 +01:00
|
|
|
{
|
2014-11-07 21:52:43 +01:00
|
|
|
//TimeTaker timer1("Client::addNode()");
|
2011-02-23 23:19:41 +01:00
|
|
|
|
2012-12-20 18:19:49 +01:00
|
|
|
std::map<v3s16, MapBlock*> modified_blocks;
|
2010-12-23 21:35:53 +01:00
|
|
|
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
try {
|
2011-06-26 01:34:36 +02:00
|
|
|
//TimeTaker timer3("Client::addNode(): addNodeAndUpdate");
|
2013-11-23 15:35:49 +01:00
|
|
|
m_env.getMap().addNodeAndUpdate(p, n, modified_blocks, remove_metadata);
|
2010-12-23 21:35:53 +01:00
|
|
|
}
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
catch(InvalidPositionException &e) {
|
|
|
|
}
|
2015-01-04 22:32:31 +01:00
|
|
|
|
2017-08-16 08:53:52 +02:00
|
|
|
for (const auto &modified_block : modified_blocks) {
|
|
|
|
addUpdateMeshTaskWithEdge(modified_block.first, false, true);
|
2010-12-23 21:35:53 +01:00
|
|
|
}
|
|
|
|
}
|
2015-01-04 22:32:31 +01:00
|
|
|
|
2010-11-27 00:02:21 +01:00
|
|
|
void Client::setPlayerControl(PlayerControl &control)
|
|
|
|
{
|
|
|
|
LocalPlayer *player = m_env.getLocalPlayer();
|
2017-06-17 19:11:28 +02:00
|
|
|
assert(player);
|
2010-11-27 00:02:21 +01:00
|
|
|
player->control = control;
|
|
|
|
}
|
|
|
|
|
2019-08-07 19:16:31 +02:00
|
|
|
void Client::setPlayerItem(u16 item)
|
2011-08-10 18:31:44 +02:00
|
|
|
{
|
2019-08-07 19:16:31 +02:00
|
|
|
m_env.getLocalPlayer()->setWieldIndex(item);
|
2019-08-24 19:07:38 +02:00
|
|
|
m_update_wielded_item = true;
|
2019-08-07 19:16:31 +02:00
|
|
|
|
|
|
|
NetworkPacket pkt(TOSERVER_PLAYERITEM, 2);
|
|
|
|
pkt << item;
|
|
|
|
Send(&pkt);
|
2011-08-10 18:31:44 +02:00
|
|
|
}
|
|
|
|
|
2019-08-24 19:07:38 +02:00
|
|
|
// Returns true once after the inventory of the local player
|
|
|
|
// has been updated from the server.
|
|
|
|
bool Client::updateWieldedItem()
|
2010-11-27 00:02:21 +01:00
|
|
|
{
|
2019-08-24 19:07:38 +02:00
|
|
|
if (!m_update_wielded_item)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
m_update_wielded_item = false;
|
2010-11-27 00:02:21 +01:00
|
|
|
|
2016-10-08 16:31:22 +02:00
|
|
|
LocalPlayer *player = m_env.getLocalPlayer();
|
2017-06-17 19:11:28 +02:00
|
|
|
assert(player);
|
2019-08-24 19:07:38 +02:00
|
|
|
if (auto *list = player->inventory.getList("main"))
|
|
|
|
list->setModified(false);
|
|
|
|
if (auto *list = player->inventory.getList("hand"))
|
|
|
|
list->setModified(false);
|
|
|
|
|
|
|
|
return true;
|
2010-11-27 00:02:21 +01:00
|
|
|
}
|
|
|
|
|
2021-05-03 10:27:00 +02:00
|
|
|
scene::ISceneManager* Client::getSceneManager()
|
2021-04-29 09:40:56 +02:00
|
|
|
{
|
|
|
|
return m_rendering_engine->get_scene_manager();
|
|
|
|
}
|
|
|
|
|
2011-12-06 14:21:56 +01:00
|
|
|
Inventory* Client::getInventory(const InventoryLocation &loc)
|
|
|
|
{
|
|
|
|
switch(loc.type){
|
|
|
|
case InventoryLocation::UNDEFINED:
|
|
|
|
{}
|
|
|
|
break;
|
2012-01-12 06:10:39 +01:00
|
|
|
case InventoryLocation::CURRENT_PLAYER:
|
|
|
|
{
|
2016-10-08 16:31:22 +02:00
|
|
|
LocalPlayer *player = m_env.getLocalPlayer();
|
2017-06-17 19:11:28 +02:00
|
|
|
assert(player);
|
2012-01-12 06:10:39 +01:00
|
|
|
return &player->inventory;
|
|
|
|
}
|
|
|
|
break;
|
2011-12-06 14:21:56 +01:00
|
|
|
case InventoryLocation::PLAYER:
|
|
|
|
{
|
2016-10-08 23:13:38 +02:00
|
|
|
// Check if we are working with local player inventory
|
|
|
|
LocalPlayer *player = m_env.getLocalPlayer();
|
|
|
|
if (!player || strcmp(player->getName(), loc.name.c_str()) != 0)
|
2011-12-06 14:21:56 +01:00
|
|
|
return NULL;
|
|
|
|
return &player->inventory;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case InventoryLocation::NODEMETA:
|
|
|
|
{
|
|
|
|
NodeMetadata *meta = m_env.getMap().getNodeMetadata(loc.p);
|
|
|
|
if(!meta)
|
|
|
|
return NULL;
|
|
|
|
return meta->getInventory();
|
|
|
|
}
|
|
|
|
break;
|
2012-07-24 19:57:17 +02:00
|
|
|
case InventoryLocation::DETACHED:
|
|
|
|
{
|
2016-10-05 09:03:55 +02:00
|
|
|
if (m_detached_inventories.count(loc.name) == 0)
|
2012-07-24 19:57:17 +02:00
|
|
|
return NULL;
|
|
|
|
return m_detached_inventories[loc.name];
|
|
|
|
}
|
|
|
|
break;
|
2011-12-06 14:21:56 +01:00
|
|
|
default:
|
2015-03-06 11:21:51 +01:00
|
|
|
FATAL_ERROR("Invalid inventory location type.");
|
2015-03-13 22:08:41 +01:00
|
|
|
break;
|
2011-12-06 14:21:56 +01:00
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
2014-02-05 00:17:57 +01:00
|
|
|
|
2011-04-04 14:13:19 +02:00
|
|
|
void Client::inventoryAction(InventoryAction *a)
|
|
|
|
{
|
2012-01-22 00:49:02 +01:00
|
|
|
/*
|
|
|
|
Send it to the server
|
|
|
|
*/
|
2011-04-04 14:13:19 +02:00
|
|
|
sendInventoryAction(a);
|
2012-01-22 00:49:02 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
Predict some local inventory changes
|
|
|
|
*/
|
|
|
|
a->clientApply(this, this);
|
2013-05-11 00:12:14 +02:00
|
|
|
|
|
|
|
// Remove it
|
|
|
|
delete a;
|
2011-04-04 14:13:19 +02:00
|
|
|
}
|
|
|
|
|
2012-03-13 18:56:12 +01:00
|
|
|
float Client::getAnimationTime()
|
2010-12-18 16:46:00 +01:00
|
|
|
{
|
2012-03-13 18:56:12 +01:00
|
|
|
return m_animation_time;
|
2010-12-18 16:46:00 +01:00
|
|
|
}
|
2010-11-27 00:02:21 +01:00
|
|
|
|
2012-03-13 18:56:12 +01:00
|
|
|
int Client::getCrackLevel()
|
2011-04-21 18:35:17 +02:00
|
|
|
{
|
2012-03-13 18:56:12 +01:00
|
|
|
return m_crack_level;
|
2011-04-21 18:35:17 +02:00
|
|
|
}
|
|
|
|
|
2017-04-15 09:55:52 +02:00
|
|
|
v3s16 Client::getCrackPos()
|
|
|
|
{
|
|
|
|
return m_crack_pos;
|
|
|
|
}
|
|
|
|
|
2012-03-13 18:56:12 +01:00
|
|
|
void Client::setCrack(int level, v3s16 pos)
|
2011-06-26 01:34:36 +02:00
|
|
|
{
|
2012-03-13 18:56:12 +01:00
|
|
|
int old_crack_level = m_crack_level;
|
|
|
|
v3s16 old_crack_pos = m_crack_pos;
|
2011-06-26 01:34:36 +02:00
|
|
|
|
2012-03-13 18:56:12 +01:00
|
|
|
m_crack_level = level;
|
|
|
|
m_crack_pos = pos;
|
2011-06-26 01:34:36 +02:00
|
|
|
|
2012-03-13 18:56:12 +01:00
|
|
|
if(old_crack_level >= 0 && (level < 0 || pos != old_crack_pos))
|
|
|
|
{
|
|
|
|
// remove old crack
|
|
|
|
addUpdateMeshTaskForNode(old_crack_pos, false, true);
|
|
|
|
}
|
|
|
|
if(level >= 0 && (old_crack_level < 0 || pos != old_crack_pos))
|
2011-06-26 01:34:36 +02:00
|
|
|
{
|
2012-03-13 18:56:12 +01:00
|
|
|
// add new crack
|
|
|
|
addUpdateMeshTaskForNode(pos, false, true);
|
2011-06-26 01:34:36 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-03-13 18:56:12 +01:00
|
|
|
u16 Client::getHP()
|
|
|
|
{
|
2016-10-08 16:31:22 +02:00
|
|
|
LocalPlayer *player = m_env.getLocalPlayer();
|
2017-06-17 19:11:28 +02:00
|
|
|
assert(player);
|
2012-03-13 18:56:12 +01:00
|
|
|
return player->hp;
|
2011-06-26 01:34:36 +02:00
|
|
|
}
|
|
|
|
|
2017-07-16 10:47:31 +02:00
|
|
|
bool Client::getChatMessage(std::wstring &res)
|
2011-12-03 09:01:14 +01:00
|
|
|
{
|
2017-07-16 10:47:31 +02:00
|
|
|
if (m_chat_queue.empty())
|
2011-12-03 09:01:14 +01:00
|
|
|
return false;
|
2017-07-16 10:47:31 +02:00
|
|
|
|
|
|
|
ChatMessage *chatMessage = m_chat_queue.front();
|
2015-03-04 17:48:07 +01:00
|
|
|
m_chat_queue.pop();
|
2017-07-16 10:47:31 +02:00
|
|
|
|
|
|
|
res = L"";
|
|
|
|
|
|
|
|
switch (chatMessage->type) {
|
|
|
|
case CHATMESSAGE_TYPE_RAW:
|
|
|
|
case CHATMESSAGE_TYPE_ANNOUNCE:
|
|
|
|
case CHATMESSAGE_TYPE_SYSTEM:
|
|
|
|
res = chatMessage->message;
|
|
|
|
break;
|
|
|
|
case CHATMESSAGE_TYPE_NORMAL: {
|
|
|
|
if (!chatMessage->sender.empty())
|
|
|
|
res = L"<" + chatMessage->sender + L"> " + chatMessage->message;
|
|
|
|
else
|
|
|
|
res = chatMessage->message;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
delete chatMessage;
|
2011-12-03 09:01:14 +01:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Client::typeChatMessage(const std::wstring &message)
|
|
|
|
{
|
|
|
|
// Discard empty line
|
2017-08-16 08:53:52 +02:00
|
|
|
if (message.empty())
|
2011-12-03 09:01:14 +01:00
|
|
|
return;
|
|
|
|
|
2018-11-24 11:41:11 +01:00
|
|
|
// If message was consumed by script API, don't send it to server
|
2019-06-25 21:18:08 +02:00
|
|
|
if (m_mods_loaded && m_script->on_sending_message(wide_to_utf8(message)))
|
2017-01-21 15:02:08 +01:00
|
|
|
return;
|
|
|
|
|
2011-12-03 09:01:14 +01:00
|
|
|
// Send to others
|
|
|
|
sendChatMessage(message);
|
|
|
|
}
|
|
|
|
|
2012-03-13 18:56:12 +01:00
|
|
|
void Client::addUpdateMeshTask(v3s16 p, bool ack_to_server, bool urgent)
|
2010-12-19 15:51:45 +01:00
|
|
|
{
|
2017-04-15 09:55:52 +02:00
|
|
|
// Check if the block exists to begin with. In the case when a non-existing
|
|
|
|
// neighbor is automatically added, it may not. In that case we don't want
|
|
|
|
// to tell the mesh update thread about it.
|
2011-04-04 01:05:12 +02:00
|
|
|
MapBlock *b = m_env.getMap().getBlockNoCreateNoEx(p);
|
2017-04-15 09:55:52 +02:00
|
|
|
if (b == NULL)
|
2011-04-04 01:05:12 +02:00
|
|
|
return;
|
2014-09-16 12:38:37 +02:00
|
|
|
|
2017-04-15 09:55:52 +02:00
|
|
|
m_mesh_update_thread.updateBlock(&m_env.getMap(), p, ack_to_server, urgent);
|
2011-04-04 01:05:12 +02:00
|
|
|
}
|
2010-12-19 15:51:45 +01:00
|
|
|
|
2012-03-13 18:56:12 +01:00
|
|
|
void Client::addUpdateMeshTaskWithEdge(v3s16 blockpos, bool ack_to_server, bool urgent)
|
2011-04-04 01:05:12 +02:00
|
|
|
{
|
2021-12-29 22:59:53 +01:00
|
|
|
m_mesh_update_thread.updateBlock(&m_env.getMap(), blockpos, ack_to_server, urgent, true);
|
2012-03-13 18:56:12 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void Client::addUpdateMeshTaskForNode(v3s16 nodepos, bool ack_to_server, bool urgent)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
v3s16 p = nodepos;
|
|
|
|
infostream<<"Client::addUpdateMeshTaskForNode(): "
|
|
|
|
<<"("<<p.X<<","<<p.Y<<","<<p.Z<<")"
|
|
|
|
<<std::endl;
|
|
|
|
}
|
|
|
|
|
2021-12-29 22:59:53 +01:00
|
|
|
v3s16 blockpos = getNodeBlockPos(nodepos);
|
2012-03-13 18:56:12 +01:00
|
|
|
v3s16 blockpos_relative = blockpos * MAP_BLOCKSIZE;
|
2021-12-29 22:59:53 +01:00
|
|
|
m_mesh_update_thread.updateBlock(&m_env.getMap(), blockpos, ack_to_server, urgent, false);
|
2012-03-13 18:56:12 +01:00
|
|
|
// Leading edge
|
2021-12-29 22:59:53 +01:00
|
|
|
if (nodepos.X == blockpos_relative.X)
|
|
|
|
addUpdateMeshTask(blockpos + v3s16(-1, 0, 0), false, urgent);
|
|
|
|
if (nodepos.Y == blockpos_relative.Y)
|
|
|
|
addUpdateMeshTask(blockpos + v3s16(0, -1, 0), false, urgent);
|
|
|
|
if (nodepos.Z == blockpos_relative.Z)
|
|
|
|
addUpdateMeshTask(blockpos + v3s16(0, 0, -1), false, urgent);
|
2011-04-04 01:05:12 +02:00
|
|
|
}
|
2010-12-19 15:51:45 +01:00
|
|
|
|
2017-08-28 20:02:23 +02:00
|
|
|
ClientEvent *Client::getClientEvent()
|
2011-04-21 18:35:17 +02:00
|
|
|
{
|
2017-04-29 17:25:25 +02:00
|
|
|
FATAL_ERROR_IF(m_client_event_queue.empty(),
|
|
|
|
"Cannot getClientEvent, queue is empty.");
|
|
|
|
|
2017-08-28 20:02:23 +02:00
|
|
|
ClientEvent *event = m_client_event_queue.front();
|
2017-04-29 17:25:25 +02:00
|
|
|
m_client_event_queue.pop();
|
2015-03-04 17:48:07 +01:00
|
|
|
return event;
|
2011-04-21 18:35:17 +02:00
|
|
|
}
|
|
|
|
|
2017-08-24 08:28:54 +02:00
|
|
|
const Address Client::getServerAddress()
|
|
|
|
{
|
|
|
|
return m_con->GetPeerAddress(PEER_ID_SERVER);
|
|
|
|
}
|
|
|
|
|
Rewrite client media download and support hash-based remote download
Move most of the media-related code in client.cpp into a new class
ClientMediaDownloader (clientmedia.cpp, clientmedia.h). Among other
things, this class does the following things:
- Download [remote_server][sha1] instead of [remote_server][name]. This
is to support servers that provide the same file name with different
contents.
- Initially fetch [remote_server]index.mth. This file should follow the
Minetest Hashset format (currently version 1) and contain a list of SHA1
hashes that exist on the server.
- The list of needed SHA1s is uploaded (via HTTP POST) when index.mth is
requested, so servers can optionally narrow down the list to the needs
of the client.
- If index.mth is missing (HTTP response code 404), we enter compat mode,
fetching [remote_server][name] as before this commit.
- remote_server can now contain multiple servers, separated by commas.
The downloader code attempts to split requests between the different
servers, as permitted by each server's index.mth. If one server claims
to have a file but actually doesn't (or something fails), we ask a
different server that also claims to have it.
- As before, when none of the remote servers provide a particular
file, we download it via the conventional method, i.e. using
the minetest protocol: TOSERVER_REQUEST_MEDIA / TOCLIENT_MEDIA.
- Bugfix: Every downloaded file's SHA1 is now verified against the SHA1
announced by the minetest server (before loading it and inserting it
into the file cache).
- Bugfix: Only send TOSERVER_RECEIVED_MEDIA when we actually have all
media. This should fix #863.
2013-08-29 05:22:18 +02:00
|
|
|
float Client::mediaReceiveProgress()
|
|
|
|
{
|
|
|
|
if (m_media_downloader)
|
|
|
|
return m_media_downloader->getProgress();
|
2017-08-16 08:53:52 +02:00
|
|
|
|
|
|
|
return 1.0; // downloader only exists when not yet done
|
Rewrite client media download and support hash-based remote download
Move most of the media-related code in client.cpp into a new class
ClientMediaDownloader (clientmedia.cpp, clientmedia.h). Among other
things, this class does the following things:
- Download [remote_server][sha1] instead of [remote_server][name]. This
is to support servers that provide the same file name with different
contents.
- Initially fetch [remote_server]index.mth. This file should follow the
Minetest Hashset format (currently version 1) and contain a list of SHA1
hashes that exist on the server.
- The list of needed SHA1s is uploaded (via HTTP POST) when index.mth is
requested, so servers can optionally narrow down the list to the needs
of the client.
- If index.mth is missing (HTTP response code 404), we enter compat mode,
fetching [remote_server][name] as before this commit.
- remote_server can now contain multiple servers, separated by commas.
The downloader code attempts to split requests between the different
servers, as permitted by each server's index.mth. If one server claims
to have a file but actually doesn't (or something fails), we ask a
different server that also claims to have it.
- As before, when none of the remote servers provide a particular
file, we download it via the conventional method, i.e. using
the minetest protocol: TOSERVER_REQUEST_MEDIA / TOCLIENT_MEDIA.
- Bugfix: Every downloaded file's SHA1 is now verified against the SHA1
announced by the minetest server (before loading it and inserting it
into the file cache).
- Bugfix: Only send TOSERVER_RECEIVED_MEDIA when we actually have all
media. This should fix #863.
2013-08-29 05:22:18 +02:00
|
|
|
}
|
|
|
|
|
2021-09-11 21:06:57 +02:00
|
|
|
struct TextureUpdateArgs {
|
2015-03-15 07:25:22 +01:00
|
|
|
gui::IGUIEnvironment *guienv;
|
2016-03-06 20:31:16 +01:00
|
|
|
u64 last_time_ms;
|
2015-03-15 07:25:22 +01:00
|
|
|
u16 last_percent;
|
|
|
|
const wchar_t* text_base;
|
2017-04-16 14:44:15 +02:00
|
|
|
ITextureSource *tsrc;
|
2021-09-11 21:06:57 +02:00
|
|
|
};
|
2015-03-15 07:25:22 +01:00
|
|
|
|
2021-04-29 20:38:35 +02:00
|
|
|
void Client::showUpdateProgressTexture(void *args, u32 progress, u32 max_progress)
|
2015-03-15 07:25:22 +01:00
|
|
|
{
|
|
|
|
TextureUpdateArgs* targs = (TextureUpdateArgs*) args;
|
|
|
|
u16 cur_percent = ceil(progress / (double) max_progress * 100.);
|
|
|
|
|
|
|
|
// update the loading menu -- if neccessary
|
|
|
|
bool do_draw = false;
|
2017-04-29 14:36:55 +02:00
|
|
|
u64 time_ms = targs->last_time_ms;
|
2015-03-15 07:25:22 +01:00
|
|
|
if (cur_percent != targs->last_percent) {
|
|
|
|
targs->last_percent = cur_percent;
|
2016-03-06 20:31:16 +01:00
|
|
|
time_ms = porting::getTimeMs();
|
2015-03-15 07:25:22 +01:00
|
|
|
// only draw when the user will notice something:
|
|
|
|
do_draw = (time_ms - targs->last_time_ms > 100);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (do_draw) {
|
|
|
|
targs->last_time_ms = time_ms;
|
2021-09-11 21:06:57 +02:00
|
|
|
std::wostringstream strm;
|
|
|
|
strm << targs->text_base << L" " << targs->last_percent << L"%...";
|
2021-04-29 20:38:35 +02:00
|
|
|
m_rendering_engine->draw_load_screen(strm.str(), targs->guienv, targs->tsrc, 0,
|
2017-04-16 14:44:15 +02:00
|
|
|
72 + (u16) ((18. / 100.) * (double) targs->last_percent), true);
|
2015-03-15 07:25:22 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-06-26 20:11:17 +02:00
|
|
|
void Client::afterContentReceived()
|
2012-01-12 06:10:39 +01:00
|
|
|
{
|
2012-11-30 15:19:19 +01:00
|
|
|
infostream<<"Client::afterContentReceived() started"<<std::endl;
|
2015-03-06 11:21:51 +01:00
|
|
|
assert(m_itemdef_received); // pre-condition
|
|
|
|
assert(m_nodedef_received); // pre-condition
|
|
|
|
assert(mediaReceived()); // pre-condition
|
2015-01-04 22:32:31 +01:00
|
|
|
|
2015-02-01 23:59:23 +01:00
|
|
|
const wchar_t* text = wgettext("Loading textures...");
|
2014-08-23 12:16:46 +02:00
|
|
|
|
2015-03-09 14:32:11 +01:00
|
|
|
// Clear cached pre-scaled 2D GUI images, as this cache
|
|
|
|
// might have images with the same name but different
|
|
|
|
// content from previous sessions.
|
2017-06-26 20:11:17 +02:00
|
|
|
guiScalingCacheClear();
|
2015-03-09 14:32:11 +01:00
|
|
|
|
2012-01-12 06:10:39 +01:00
|
|
|
// Rebuild inherited images and recreate textures
|
2012-11-30 15:19:19 +01:00
|
|
|
infostream<<"- Rebuilding images and textures"<<std::endl;
|
2021-04-29 09:45:49 +02:00
|
|
|
m_rendering_engine->draw_load_screen(text, guienv, m_tsrc, 0, 70);
|
2012-01-12 06:10:39 +01:00
|
|
|
m_tsrc->rebuildImagesAndTextures();
|
2014-08-23 12:16:46 +02:00
|
|
|
delete[] text;
|
2012-01-12 06:10:39 +01:00
|
|
|
|
2012-03-19 02:59:12 +01:00
|
|
|
// Rebuild shaders
|
2013-07-05 04:24:05 +02:00
|
|
|
infostream<<"- Rebuilding shaders"<<std::endl;
|
2014-08-23 12:16:46 +02:00
|
|
|
text = wgettext("Rebuilding shaders...");
|
2021-04-29 09:45:49 +02:00
|
|
|
m_rendering_engine->draw_load_screen(text, guienv, m_tsrc, 0, 71);
|
2012-03-19 02:59:12 +01:00
|
|
|
m_shsrc->rebuildShaders();
|
2014-08-23 12:16:46 +02:00
|
|
|
delete[] text;
|
2012-03-19 02:59:12 +01:00
|
|
|
|
2012-01-12 06:10:39 +01:00
|
|
|
// Update node aliases
|
2012-11-30 15:19:19 +01:00
|
|
|
infostream<<"- Updating node aliases"<<std::endl;
|
2014-08-23 12:16:46 +02:00
|
|
|
text = wgettext("Initializing nodes...");
|
2021-04-29 09:45:49 +02:00
|
|
|
m_rendering_engine->draw_load_screen(text, guienv, m_tsrc, 0, 72);
|
2012-01-12 06:10:39 +01:00
|
|
|
m_nodedef->updateAliases(m_itemdef);
|
2020-04-14 20:41:29 +02:00
|
|
|
for (const auto &path : getTextureDirs()) {
|
|
|
|
TextureOverrideSource override_source(path + DIR_DELIM + "override.txt");
|
|
|
|
m_nodedef->applyTextureOverrides(override_source.getNodeTileOverrides());
|
|
|
|
m_itemdef->applyTextureOverrides(override_source.getItemTextureOverrides());
|
|
|
|
}
|
2015-01-04 22:32:31 +01:00
|
|
|
m_nodedef->setNodeRegistrationStatus(true);
|
2015-04-16 10:12:26 +02:00
|
|
|
m_nodedef->runNodeResolveCallbacks();
|
2014-08-23 12:16:46 +02:00
|
|
|
delete[] text;
|
2012-01-12 06:10:39 +01:00
|
|
|
|
2014-05-14 23:19:31 +02:00
|
|
|
// Update node textures and assign shaders to each tile
|
2012-11-30 15:19:19 +01:00
|
|
|
infostream<<"- Updating node textures"<<std::endl;
|
2015-03-15 07:25:22 +01:00
|
|
|
TextureUpdateArgs tu_args;
|
|
|
|
tu_args.guienv = guienv;
|
2016-03-06 20:31:16 +01:00
|
|
|
tu_args.last_time_ms = porting::getTimeMs();
|
2015-03-15 07:25:22 +01:00
|
|
|
tu_args.last_percent = 0;
|
2021-08-19 20:13:25 +02:00
|
|
|
tu_args.text_base = wgettext("Initializing nodes");
|
2017-04-16 14:44:15 +02:00
|
|
|
tu_args.tsrc = m_tsrc;
|
2021-04-29 20:38:35 +02:00
|
|
|
m_nodedef->updateTextures(this, &tu_args);
|
2015-03-15 07:25:22 +01:00
|
|
|
delete[] tu_args.text_base;
|
2012-01-12 06:10:39 +01:00
|
|
|
|
|
|
|
// Start mesh update thread after setting up content definitions
|
2012-11-30 15:19:19 +01:00
|
|
|
infostream<<"- Starting mesh update thread"<<std::endl;
|
2015-04-07 12:13:12 +02:00
|
|
|
m_mesh_update_thread.start();
|
2015-01-04 22:32:31 +01:00
|
|
|
|
2014-02-13 20:17:42 +01:00
|
|
|
m_state = LC_Ready;
|
|
|
|
sendReady();
|
2017-04-08 08:20:30 +02:00
|
|
|
|
2019-06-25 21:18:08 +02:00
|
|
|
if (m_mods_loaded)
|
2017-04-08 12:26:45 +02:00
|
|
|
m_script->on_client_ready(m_env.getLocalPlayer());
|
2017-04-08 08:20:30 +02:00
|
|
|
|
2014-08-23 12:16:46 +02:00
|
|
|
text = wgettext("Done!");
|
2021-04-29 09:45:49 +02:00
|
|
|
m_rendering_engine->draw_load_screen(text, guienv, m_tsrc, 0, 100);
|
2012-11-30 15:19:19 +01:00
|
|
|
infostream<<"Client::afterContentReceived() done"<<std::endl;
|
2014-08-23 12:16:46 +02:00
|
|
|
delete[] text;
|
2012-01-12 06:10:39 +01:00
|
|
|
}
|
|
|
|
|
2017-03-16 10:34:54 +01:00
|
|
|
float Client::getRTT()
|
2011-10-17 16:18:50 +02:00
|
|
|
{
|
2019-02-16 00:39:22 +01:00
|
|
|
return m_con->getPeerStat(PEER_ID_SERVER,con::AVG_RTT);
|
2011-10-17 16:18:50 +02:00
|
|
|
}
|
2011-04-21 18:35:17 +02:00
|
|
|
|
2017-03-16 10:34:54 +01:00
|
|
|
float Client::getCurRate()
|
2014-04-26 01:15:46 +02:00
|
|
|
{
|
2017-08-24 08:28:54 +02:00
|
|
|
return (m_con->getLocalStat(con::CUR_INC_RATE) +
|
|
|
|
m_con->getLocalStat(con::CUR_DL_RATE));
|
2014-04-26 01:15:46 +02:00
|
|
|
}
|
|
|
|
|
2017-06-19 00:00:55 +02:00
|
|
|
void Client::makeScreenshot()
|
2014-09-21 02:23:55 +02:00
|
|
|
{
|
2021-04-29 09:45:49 +02:00
|
|
|
irr::video::IVideoDriver *driver = m_rendering_engine->get_video_driver();
|
2014-09-21 02:23:55 +02:00
|
|
|
irr::video::IImage* const raw_image = driver->createScreenShot();
|
|
|
|
|
2015-03-31 08:13:42 +02:00
|
|
|
if (!raw_image)
|
|
|
|
return;
|
2015-03-24 17:42:31 +01:00
|
|
|
|
2022-04-28 18:53:33 +02:00
|
|
|
const struct tm tm = mt_localtime();
|
2015-03-24 17:42:31 +01:00
|
|
|
|
2015-03-31 08:13:42 +02:00
|
|
|
char timetstamp_c[64];
|
2022-04-28 18:53:33 +02:00
|
|
|
strftime(timetstamp_c, sizeof(timetstamp_c), "%Y%m%d_%H%M%S", &tm);
|
2015-03-24 17:42:31 +01:00
|
|
|
|
2020-04-06 16:54:12 +02:00
|
|
|
std::string screenshot_dir;
|
|
|
|
|
|
|
|
if (fs::IsPathAbsolute(g_settings->get("screenshot_path")))
|
|
|
|
screenshot_dir = g_settings->get("screenshot_path");
|
|
|
|
else
|
|
|
|
screenshot_dir = porting::path_user + DIR_DELIM + g_settings->get("screenshot_path");
|
|
|
|
|
|
|
|
std::string filename_base = screenshot_dir
|
2015-03-31 08:13:42 +02:00
|
|
|
+ DIR_DELIM
|
|
|
|
+ std::string("screenshot_")
|
|
|
|
+ std::string(timetstamp_c);
|
2016-03-07 23:09:07 +01:00
|
|
|
std::string filename_ext = "." + g_settings->get("screenshot_format");
|
2015-03-31 08:13:42 +02:00
|
|
|
std::string filename;
|
|
|
|
|
2020-04-06 16:54:12 +02:00
|
|
|
// Create the directory if it doesn't already exist.
|
|
|
|
// Otherwise, saving the screenshot would fail.
|
|
|
|
fs::CreateDir(screenshot_dir);
|
|
|
|
|
2016-03-07 23:09:07 +01:00
|
|
|
u32 quality = (u32)g_settings->getS32("screenshot_quality");
|
|
|
|
quality = MYMIN(MYMAX(quality, 0), 100) / 100.0 * 255;
|
|
|
|
|
2015-03-31 08:13:42 +02:00
|
|
|
// Try to find a unique filename
|
|
|
|
unsigned serial = 0;
|
|
|
|
|
|
|
|
while (serial < SCREENSHOT_MAX_SERIAL_TRIES) {
|
2015-04-06 03:07:51 +02:00
|
|
|
filename = filename_base + (serial > 0 ? ("_" + itos(serial)) : "") + filename_ext;
|
2015-03-31 08:13:42 +02:00
|
|
|
std::ifstream tmp(filename.c_str());
|
|
|
|
if (!tmp.good())
|
|
|
|
break; // File did not apparently exist, we'll go with it
|
|
|
|
serial++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (serial == SCREENSHOT_MAX_SERIAL_TRIES) {
|
|
|
|
infostream << "Could not find suitable filename for screenshot" << std::endl;
|
|
|
|
} else {
|
|
|
|
irr::video::IImage* const image =
|
|
|
|
driver->createImage(video::ECF_R8G8B8, raw_image->getDimension());
|
|
|
|
|
|
|
|
if (image) {
|
|
|
|
raw_image->copyTo(image);
|
2015-03-24 17:42:31 +01:00
|
|
|
|
2014-12-12 22:31:29 +01:00
|
|
|
std::ostringstream sstr;
|
2016-03-07 23:09:07 +01:00
|
|
|
if (driver->writeImageToFile(image, filename.c_str(), quality)) {
|
2014-09-21 02:23:55 +02:00
|
|
|
sstr << "Saved screenshot to '" << filename << "'";
|
|
|
|
} else {
|
|
|
|
sstr << "Failed to save screenshot '" << filename << "'";
|
|
|
|
}
|
2017-07-16 10:47:31 +02:00
|
|
|
pushToChatQueue(new ChatMessage(CHATMESSAGE_TYPE_SYSTEM,
|
2021-01-29 14:03:27 +01:00
|
|
|
utf8_to_wide(sstr.str())));
|
2014-12-12 22:31:29 +01:00
|
|
|
infostream << sstr.str() << std::endl;
|
2014-09-21 02:23:55 +02:00
|
|
|
image->drop();
|
|
|
|
}
|
|
|
|
}
|
2015-03-31 08:13:42 +02:00
|
|
|
|
|
|
|
raw_image->drop();
|
2014-09-21 02:23:55 +02:00
|
|
|
}
|
|
|
|
|
2017-03-16 10:34:54 +01:00
|
|
|
bool Client::shouldShowMinimap() const
|
|
|
|
{
|
2017-03-17 07:54:49 +01:00
|
|
|
return !m_minimap_disabled_by_server;
|
2017-03-16 10:34:54 +01:00
|
|
|
}
|
|
|
|
|
2017-08-28 20:02:23 +02:00
|
|
|
void Client::pushToEventQueue(ClientEvent *event)
|
|
|
|
{
|
|
|
|
m_client_event_queue.push(event);
|
|
|
|
}
|
|
|
|
|
2017-03-19 13:18:52 +01:00
|
|
|
void Client::showMinimap(const bool show)
|
|
|
|
{
|
2018-01-03 14:28:55 +01:00
|
|
|
m_game_ui->showMinimap(show);
|
2017-03-19 13:18:52 +01:00
|
|
|
}
|
|
|
|
|
2011-11-14 20:41:30 +01:00
|
|
|
// IGameDef interface
|
|
|
|
// Under envlock
|
2012-01-12 06:10:39 +01:00
|
|
|
IItemDefManager* Client::getItemDefManager()
|
2011-11-14 20:41:30 +01:00
|
|
|
{
|
2012-01-12 06:10:39 +01:00
|
|
|
return m_itemdef;
|
2011-11-14 20:41:30 +01:00
|
|
|
}
|
2018-02-10 21:04:16 +01:00
|
|
|
const NodeDefManager* Client::getNodeDefManager()
|
2011-11-14 20:41:30 +01:00
|
|
|
{
|
|
|
|
return m_nodedef;
|
|
|
|
}
|
2011-11-17 01:28:46 +01:00
|
|
|
ICraftDefManager* Client::getCraftDefManager()
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
//return m_craftdef;
|
|
|
|
}
|
2011-11-14 20:41:30 +01:00
|
|
|
ITextureSource* Client::getTextureSource()
|
|
|
|
{
|
|
|
|
return m_tsrc;
|
|
|
|
}
|
2020-02-16 20:37:28 +01:00
|
|
|
IWritableShaderSource* Client::getShaderSource()
|
2012-03-19 02:59:12 +01:00
|
|
|
{
|
|
|
|
return m_shsrc;
|
|
|
|
}
|
2017-06-26 20:11:17 +02:00
|
|
|
|
2011-11-16 12:03:28 +01:00
|
|
|
u16 Client::allocateUnknownNodeId(const std::string &name)
|
|
|
|
{
|
2015-03-06 11:21:51 +01:00
|
|
|
errorstream << "Client::allocateUnknownNodeId(): "
|
|
|
|
<< "Client cannot allocate node IDs" << std::endl;
|
|
|
|
FATAL_ERROR("Client allocated unknown node");
|
|
|
|
|
2011-11-16 12:03:28 +01:00
|
|
|
return CONTENT_IGNORE;
|
|
|
|
}
|
2012-03-23 11:05:17 +01:00
|
|
|
ISoundManager* Client::getSoundManager()
|
|
|
|
{
|
2012-03-23 14:29:30 +01:00
|
|
|
return m_sound;
|
2012-03-23 11:05:17 +01:00
|
|
|
}
|
2012-03-23 19:23:03 +01:00
|
|
|
MtEventManager* Client::getEventManager()
|
|
|
|
{
|
|
|
|
return m_event;
|
|
|
|
}
|
2011-11-14 20:41:30 +01:00
|
|
|
|
2015-01-05 18:34:59 +01:00
|
|
|
ParticleManager* Client::getParticleManager()
|
|
|
|
{
|
|
|
|
return &m_particle_manager;
|
|
|
|
}
|
|
|
|
|
2017-12-05 07:25:09 +01:00
|
|
|
scene::IAnimatedMesh* Client::getMesh(const std::string &filename, bool cache)
|
2014-01-06 12:24:06 +01:00
|
|
|
{
|
2015-05-19 08:24:14 +02:00
|
|
|
StringMap::const_iterator it = m_mesh_data.find(filename);
|
|
|
|
if (it == m_mesh_data.end()) {
|
|
|
|
errorstream << "Client::getMesh(): Mesh not found: \"" << filename
|
|
|
|
<< "\"" << std::endl;
|
2014-01-06 12:24:06 +01:00
|
|
|
return NULL;
|
|
|
|
}
|
2015-05-19 08:24:14 +02:00
|
|
|
const std::string &data = it->second;
|
2014-01-06 12:24:06 +01:00
|
|
|
|
|
|
|
// Create the mesh, remove it from cache and return it
|
|
|
|
// This allows unique vertex colors and other properties for each instance
|
2021-04-28 10:22:13 +02:00
|
|
|
io::IReadFile *rfile = m_rendering_engine->get_filesystem()->createMemoryReadFile(
|
2021-03-12 19:36:58 +01:00
|
|
|
data.c_str(), data.size(), filename.c_str());
|
2015-03-06 11:21:51 +01:00
|
|
|
FATAL_ERROR_IF(!rfile, "Could not create/open RAM file");
|
2014-02-05 00:17:57 +01:00
|
|
|
|
2021-04-28 10:22:13 +02:00
|
|
|
scene::IAnimatedMesh *mesh = m_rendering_engine->get_scene_manager()->getMesh(rfile);
|
2014-01-06 12:24:06 +01:00
|
|
|
rfile->drop();
|
2021-03-12 19:30:56 +01:00
|
|
|
if (!mesh)
|
|
|
|
return nullptr;
|
2014-01-06 12:24:06 +01:00
|
|
|
mesh->grab();
|
2017-12-05 07:25:09 +01:00
|
|
|
if (!cache)
|
2021-04-28 11:07:28 +02:00
|
|
|
m_rendering_engine->removeMesh(mesh);
|
2014-01-06 12:24:06 +01:00
|
|
|
return mesh;
|
|
|
|
}
|
2017-03-16 07:53:39 +01:00
|
|
|
|
2019-11-09 15:11:21 +01:00
|
|
|
const std::string* Client::getModFile(std::string filename)
|
2017-06-30 20:14:39 +02:00
|
|
|
{
|
2019-11-09 15:11:21 +01:00
|
|
|
// strip dir delimiter from beginning of path
|
|
|
|
auto pos = filename.find_first_of(':');
|
|
|
|
if (pos == std::string::npos)
|
|
|
|
return nullptr;
|
|
|
|
pos++;
|
2019-11-09 21:22:06 +01:00
|
|
|
auto pos2 = filename.find_first_not_of('/', pos);
|
2019-11-09 15:11:21 +01:00
|
|
|
if (pos2 > pos)
|
|
|
|
filename.erase(pos, pos2 - pos);
|
|
|
|
|
2019-11-08 20:01:47 +01:00
|
|
|
StringMap::const_iterator it = m_mod_vfs.find(filename);
|
|
|
|
if (it == m_mod_vfs.end())
|
|
|
|
return nullptr;
|
2017-06-30 20:14:39 +02:00
|
|
|
return &it->second;
|
|
|
|
}
|
|
|
|
|
2017-03-16 07:53:39 +01:00
|
|
|
bool Client::registerModStorage(ModMetadata *storage)
|
|
|
|
{
|
|
|
|
if (m_mod_storages.find(storage->getModName()) != m_mod_storages.end()) {
|
|
|
|
errorstream << "Unable to register same mod storage twice. Storage name: "
|
|
|
|
<< storage->getModName() << std::endl;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_mod_storages[storage->getModName()] = storage;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Client::unregisterModStorage(const std::string &name)
|
|
|
|
{
|
2017-06-04 21:00:04 +02:00
|
|
|
std::unordered_map<std::string, ModMetadata *>::const_iterator it =
|
|
|
|
m_mod_storages.find(name);
|
2022-01-07 19:28:49 +01:00
|
|
|
if (it != m_mod_storages.end())
|
2017-03-16 07:53:39 +01:00
|
|
|
m_mod_storages.erase(name);
|
|
|
|
}
|
2017-09-26 00:11:20 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Mod channels
|
|
|
|
*/
|
|
|
|
|
|
|
|
bool Client::joinModChannel(const std::string &channel)
|
|
|
|
{
|
|
|
|
if (m_modchannel_mgr->channelRegistered(channel))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
NetworkPacket pkt(TOSERVER_MODCHANNEL_JOIN, 2 + channel.size());
|
|
|
|
pkt << channel;
|
|
|
|
Send(&pkt);
|
|
|
|
|
|
|
|
m_modchannel_mgr->joinChannel(channel, 0);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Client::leaveModChannel(const std::string &channel)
|
|
|
|
{
|
|
|
|
if (!m_modchannel_mgr->channelRegistered(channel))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
NetworkPacket pkt(TOSERVER_MODCHANNEL_LEAVE, 2 + channel.size());
|
|
|
|
pkt << channel;
|
|
|
|
Send(&pkt);
|
|
|
|
|
|
|
|
m_modchannel_mgr->leaveChannel(channel, 0);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Client::sendModChannelMessage(const std::string &channel, const std::string &message)
|
|
|
|
{
|
|
|
|
if (!m_modchannel_mgr->canWriteOnChannel(channel))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (message.size() > STRING_MAX_LEN) {
|
|
|
|
warningstream << "ModChannel message too long, dropping before sending "
|
|
|
|
<< " (" << message.size() << " > " << STRING_MAX_LEN << ", channel: "
|
|
|
|
<< channel << ")" << std::endl;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// @TODO: do some client rate limiting
|
|
|
|
NetworkPacket pkt(TOSERVER_MODCHANNEL_MSG, 2 + channel.size() + 2 + message.size());
|
|
|
|
pkt << channel << message;
|
|
|
|
Send(&pkt);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
ModChannel* Client::getModChannel(const std::string &channel)
|
|
|
|
{
|
|
|
|
return m_modchannel_mgr->getModChannel(channel);
|
|
|
|
}
|