mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-02-03 18:07:53 +01:00
Fix transfer of objects in multiplayer
This commit is contained in:
@@ -1572,6 +1572,7 @@ void ParkFileExporter::Export(IStream& stream)
|
||||
map_reorganise_elements();
|
||||
|
||||
auto parkFile = std::make_unique<OpenRCT2::ParkFile>();
|
||||
parkFile->ExportObjectsList = ExportObjectsList;
|
||||
parkFile->Save(stream);
|
||||
}
|
||||
|
||||
|
||||
@@ -206,7 +206,7 @@ void chat_draw(rct_drawpixelinfo* dpi, uint8_t chatBackgroundColor)
|
||||
}
|
||||
}
|
||||
|
||||
void chat_history_add(const char* src)
|
||||
void chat_history_add(std::string_view s)
|
||||
{
|
||||
// Format a timestamp
|
||||
time_t timer{};
|
||||
@@ -216,7 +216,7 @@ void chat_history_add(const char* src)
|
||||
strcatftime(timeBuffer, sizeof(timeBuffer), "[%H:%M] ", tmInfo);
|
||||
|
||||
std::string buffer = timeBuffer;
|
||||
buffer += src;
|
||||
buffer += s;
|
||||
|
||||
// Add to history list
|
||||
int32_t index = _chatHistoryIndex % CHAT_HISTORY_SIZE;
|
||||
@@ -226,7 +226,7 @@ void chat_history_add(const char* src)
|
||||
_chatHistoryIndex++;
|
||||
|
||||
// Log to file (src only as logging does its own timestamp)
|
||||
network_append_chat_log(src);
|
||||
network_append_chat_log(s);
|
||||
|
||||
Mixer_Play_Effect(OpenRCT2::Audio::SoundId::NewsItem, 0, MIXER_VOLUME_MAX, 0.5f, 1.5f, true);
|
||||
}
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
#include <string_view>
|
||||
|
||||
#define CHAT_HISTORY_SIZE 10
|
||||
#define CHAT_INPUT_SIZE 1024
|
||||
#define CHAT_MAX_MESSAGE_LENGTH 200
|
||||
@@ -38,7 +40,7 @@ void chat_init();
|
||||
void chat_update();
|
||||
void chat_draw(rct_drawpixelinfo* dpi, uint8_t chatBackgroundColour);
|
||||
|
||||
void chat_history_add(const char* src);
|
||||
void chat_history_add(std::string_view s);
|
||||
void chat_input(ChatInput input);
|
||||
|
||||
int32_t chat_string_wrapped_get_height(void* args, int32_t width);
|
||||
|
||||
@@ -618,6 +618,7 @@ namespace OpenRCT2
|
||||
template void FormatArgument(FormatBuffer&, FormatToken, uint32_t);
|
||||
template void FormatArgument(FormatBuffer&, FormatToken, uint64_t);
|
||||
template void FormatArgument(FormatBuffer&, FormatToken, const char*);
|
||||
template void FormatArgument(FormatBuffer&, FormatToken, std::string_view);
|
||||
|
||||
bool IsRealNameStringId(rct_string_id id)
|
||||
{
|
||||
|
||||
@@ -20,7 +20,9 @@
|
||||
#include "../actions/PeepPickupAction.h"
|
||||
#include "../core/Guard.hpp"
|
||||
#include "../core/Json.hpp"
|
||||
#include "../localisation/Formatting.h"
|
||||
#include "../platform/Platform2.h"
|
||||
#include "../scenario/Scenario.h"
|
||||
#include "../scripting/ScriptEngine.h"
|
||||
#include "../ui/UiContext.h"
|
||||
#include "../ui/WindowManager.h"
|
||||
@@ -1074,7 +1076,7 @@ std::string NetworkBase::BeginLog(const std::string& directory, const std::strin
|
||||
return Path::Combine(directory, midName, filename);
|
||||
}
|
||||
|
||||
void NetworkBase::AppendLog(std::ostream& fs, const std::string& s)
|
||||
void NetworkBase::AppendLog(std::ostream& fs, std::string_view s)
|
||||
{
|
||||
if (fs.fail())
|
||||
{
|
||||
@@ -1089,7 +1091,7 @@ void NetworkBase::AppendLog(std::ostream& fs, const std::string& s)
|
||||
auto tmInfo = localtime(&timer);
|
||||
if (strftime(buffer, sizeof(buffer), "[%Y/%m/%d %H:%M:%S] ", tmInfo) != 0)
|
||||
{
|
||||
String::Append(buffer, sizeof(buffer), s.c_str());
|
||||
String::Append(buffer, sizeof(buffer), std::string(s).c_str());
|
||||
String::Append(buffer, sizeof(buffer), PLATFORM_NEWLINE);
|
||||
|
||||
fs.write(buffer, strlen(buffer));
|
||||
@@ -1114,7 +1116,7 @@ void NetworkBase::BeginChatLog()
|
||||
# endif
|
||||
}
|
||||
|
||||
void NetworkBase::AppendChatLog(const std::string& s)
|
||||
void NetworkBase::AppendChatLog(std::string_view s)
|
||||
{
|
||||
if (gConfigNetwork.log_chat && _chat_log_fs.is_open())
|
||||
{
|
||||
@@ -1224,15 +1226,25 @@ void NetworkBase::Client_Send_AUTH(
|
||||
_serverConnection->QueuePacket(std::move(packet));
|
||||
}
|
||||
|
||||
void NetworkBase::Client_Send_MAPREQUEST(const std::vector<std::string>& objects)
|
||||
void NetworkBase::Client_Send_MAPREQUEST(const std::vector<ObjectEntryDescriptor>& objects)
|
||||
{
|
||||
log_verbose("client requests %u objects", uint32_t(objects.size()));
|
||||
NetworkPacket packet(NetworkCommand::MapRequest);
|
||||
packet << static_cast<uint32_t>(objects.size());
|
||||
for (const auto& object : objects)
|
||||
{
|
||||
log_verbose("client requests object %s", object.c_str());
|
||||
packet.Write(reinterpret_cast<const uint8_t*>(object.c_str()), 8);
|
||||
std::string name(object.GetName());
|
||||
log_verbose("client requests object %s", name.c_str());
|
||||
if (object.Generation == ObjectGeneration::DAT)
|
||||
{
|
||||
packet << static_cast<uint8_t>(0);
|
||||
packet.Write(&object.Entry, sizeof(rct_object_entry));
|
||||
}
|
||||
else
|
||||
{
|
||||
packet << static_cast<uint8_t>(1);
|
||||
packet.WriteString(name);
|
||||
}
|
||||
}
|
||||
_serverConnection->QueuePacket(std::move(packet));
|
||||
}
|
||||
@@ -1266,9 +1278,20 @@ void NetworkBase::Server_Send_OBJECTS_LIST(
|
||||
NetworkPacket packet(NetworkCommand::ObjectsList);
|
||||
packet << static_cast<uint32_t>(i) << static_cast<uint32_t>(objects.size());
|
||||
|
||||
log_verbose("Object %.8s (checksum %x)", object->ObjectEntry.name, object->ObjectEntry.checksum);
|
||||
packet.Write(reinterpret_cast<const uint8_t*>(object->ObjectEntry.name), 8);
|
||||
packet << object->ObjectEntry.checksum << object->ObjectEntry.flags;
|
||||
if (object->Identifier.empty())
|
||||
{
|
||||
// DAT
|
||||
log_verbose("Object %.8s (checksum %x)", object->ObjectEntry.name, object->ObjectEntry.checksum);
|
||||
packet << static_cast<uint8_t>(0);
|
||||
packet.Write(&object->ObjectEntry, sizeof(rct_object_entry));
|
||||
}
|
||||
else
|
||||
{
|
||||
// JSON
|
||||
log_verbose("Object %s", object->Identifier.c_str());
|
||||
packet << static_cast<uint8_t>(1);
|
||||
packet.WriteString(object->Identifier);
|
||||
}
|
||||
|
||||
connection.QueuePacket(std::move(packet));
|
||||
}
|
||||
@@ -2206,8 +2229,9 @@ void NetworkBase::Client_Handle_AUTH(NetworkConnection& connection, NetworkPacke
|
||||
break;
|
||||
case NetworkAuth::BadVersion:
|
||||
{
|
||||
const char* version = packet.ReadString();
|
||||
connection.SetLastDisconnectReason(STR_MULTIPLAYER_INCORRECT_SOFTWARE_VERSION, &version);
|
||||
auto version = std::string(packet.ReadString());
|
||||
auto versionp = version.c_str();
|
||||
connection.SetLastDisconnectReason(STR_MULTIPLAYER_INCORRECT_SOFTWARE_VERSION, &versionp);
|
||||
connection.Socket->Disconnect();
|
||||
break;
|
||||
}
|
||||
@@ -2237,9 +2261,9 @@ void NetworkBase::Client_Handle_AUTH(NetworkConnection& connection, NetworkPacke
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkBase::Server_Client_Joined(const char* name, const std::string& keyhash, NetworkConnection& connection)
|
||||
void NetworkBase::Server_Client_Joined(std::string_view name, const std::string& keyhash, NetworkConnection& connection)
|
||||
{
|
||||
auto player = AddPlayer(name, keyhash);
|
||||
auto player = AddPlayer(std::string(name), keyhash);
|
||||
connection.Player = player;
|
||||
if (player != nullptr)
|
||||
{
|
||||
@@ -2311,26 +2335,45 @@ void NetworkBase::Client_Handle_OBJECTS_LIST(NetworkConnection& connection, Netw
|
||||
intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { gNetwork.Close(); });
|
||||
context_open_intent(&intent);
|
||||
|
||||
char objectName[12]{};
|
||||
std::memcpy(objectName, packet.Read(8), 8);
|
||||
uint8_t objectType{};
|
||||
packet >> objectType;
|
||||
|
||||
uint32_t checksum = 0;
|
||||
uint32_t flags = 0;
|
||||
packet >> checksum >> flags;
|
||||
|
||||
const auto* object = repo.FindObjectLegacy(objectName);
|
||||
// This could potentially request the object if checksums don't match, but since client
|
||||
// won't replace its version with server-provided one, we don't do that.
|
||||
if (object == nullptr)
|
||||
if (objectType == 0)
|
||||
{
|
||||
log_verbose("Requesting object %s with checksum %x from server", objectName, checksum);
|
||||
_missingObjects.emplace_back(objectName);
|
||||
// DAT
|
||||
auto entry = reinterpret_cast<const rct_object_entry*>(packet.Read(sizeof(rct_object_entry)));
|
||||
if (entry != nullptr)
|
||||
{
|
||||
const auto* object = repo.FindObject(entry);
|
||||
if (object == nullptr)
|
||||
{
|
||||
auto objectName = std::string(entry->GetName());
|
||||
log_verbose("Requesting object %s with checksum %x from server", objectName.c_str(), entry->checksum);
|
||||
_missingObjects.push_back(ObjectEntryDescriptor(*entry));
|
||||
}
|
||||
else if (object->ObjectEntry.checksum != entry->checksum || object->ObjectEntry.flags != entry->flags)
|
||||
{
|
||||
auto objectName = std::string(entry->GetName());
|
||||
log_warning(
|
||||
"Object %s has different checksum/flags (%x/%x) than server (%x/%x).", objectName.c_str(),
|
||||
object->ObjectEntry.checksum, object->ObjectEntry.flags, entry->checksum, entry->flags);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (object->ObjectEntry.checksum != checksum || object->ObjectEntry.flags != flags)
|
||||
else
|
||||
{
|
||||
log_warning(
|
||||
"Object %s has different checksum/flags (%x/%x) than server (%x/%x).", objectName, object->ObjectEntry.checksum,
|
||||
object->ObjectEntry.flags, checksum, flags);
|
||||
// JSON
|
||||
auto identifier = packet.ReadString();
|
||||
if (!identifier.empty())
|
||||
{
|
||||
const auto* object = repo.FindObject(identifier);
|
||||
if (object == nullptr)
|
||||
{
|
||||
auto objectName = std::string(identifier);
|
||||
log_verbose("Requesting object %s from server", objectName.c_str());
|
||||
_missingObjects.push_back(ObjectEntryDescriptor(objectName));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2456,14 +2499,28 @@ void NetworkBase::Server_Handle_MAPREQUEST(NetworkConnection& connection, Networ
|
||||
auto& repo = GetContext()->GetObjectRepository();
|
||||
for (uint32_t i = 0; i < size; i++)
|
||||
{
|
||||
const char* name = reinterpret_cast<const char*>(packet.Read(8));
|
||||
// This is required, as packet does not have null terminator
|
||||
std::string s(name, name + 8);
|
||||
log_verbose("Client requested object %s", s.c_str());
|
||||
const ObjectRepositoryItem* item = repo.FindObjectLegacy(s.c_str());
|
||||
uint8_t generation{};
|
||||
packet >> generation;
|
||||
|
||||
std::string objectName;
|
||||
const ObjectRepositoryItem* item{};
|
||||
if (generation == static_cast<uint8_t>(ObjectGeneration::DAT))
|
||||
{
|
||||
const auto* entry = reinterpret_cast<const rct_object_entry*>(packet.Read(sizeof(rct_object_entry)));
|
||||
objectName = std::string(entry->GetName());
|
||||
log_verbose("Client requested object %s", objectName.c_str());
|
||||
item = repo.FindObject(entry);
|
||||
}
|
||||
else
|
||||
{
|
||||
objectName = std::string(packet.ReadString());
|
||||
log_verbose("Client requested object %s", objectName.c_str());
|
||||
item = repo.FindObject(objectName);
|
||||
}
|
||||
|
||||
if (item == nullptr)
|
||||
{
|
||||
log_warning("Client tried getting non-existent object %s from us.", s.c_str());
|
||||
log_warning("Client tried getting non-existent object %s from us.", objectName.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2471,7 +2528,7 @@ void NetworkBase::Server_Handle_MAPREQUEST(NetworkConnection& connection, Networ
|
||||
}
|
||||
}
|
||||
|
||||
const char* player_name = static_cast<const char*>(connection.Player->Name.c_str());
|
||||
auto player_name = connection.Player->Name.c_str();
|
||||
Server_Send_MAP(&connection);
|
||||
Server_Send_EVENT_PLAYER_JOINED(player_name);
|
||||
Server_Send_GROUPLIST(connection);
|
||||
@@ -2481,13 +2538,13 @@ void NetworkBase::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacke
|
||||
{
|
||||
if (connection.AuthStatus != NetworkAuth::Ok)
|
||||
{
|
||||
const char* gameversion = packet.ReadString();
|
||||
const char* name = packet.ReadString();
|
||||
const char* password = packet.ReadString();
|
||||
const char* pubkey = packet.ReadString();
|
||||
auto gameversion = packet.ReadString();
|
||||
auto name = packet.ReadString();
|
||||
auto password = packet.ReadString();
|
||||
auto pubkey = packet.ReadString();
|
||||
uint32_t sigsize;
|
||||
packet >> sigsize;
|
||||
if (pubkey == nullptr)
|
||||
if (pubkey.empty())
|
||||
{
|
||||
connection.AuthStatus = NetworkAuth::VerificationFailure;
|
||||
}
|
||||
@@ -2506,7 +2563,7 @@ void NetworkBase::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacke
|
||||
|
||||
std::memcpy(signature.data(), signatureData, sigsize);
|
||||
|
||||
auto ms = MemoryStream(pubkey, strlen(pubkey));
|
||||
auto ms = MemoryStream(pubkey.data(), pubkey.size());
|
||||
if (!connection.Key.LoadPublic(&ms))
|
||||
{
|
||||
throw std::runtime_error("Failed to load public key.");
|
||||
@@ -2546,21 +2603,21 @@ void NetworkBase::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacke
|
||||
const NetworkGroup* group = GetGroupByID(GetGroupIDByHash(connection.Key.PublicKeyHash()));
|
||||
passwordless = group->CanPerformCommand(GameCommand::PasswordlessLogin);
|
||||
}
|
||||
if (!gameversion || network_get_version() != gameversion)
|
||||
if (gameversion != network_get_version())
|
||||
{
|
||||
connection.AuthStatus = NetworkAuth::BadVersion;
|
||||
}
|
||||
else if (!name)
|
||||
else if (name.empty())
|
||||
{
|
||||
connection.AuthStatus = NetworkAuth::BadName;
|
||||
}
|
||||
else if (!passwordless)
|
||||
{
|
||||
if ((!password || strlen(password) == 0) && !_password.empty())
|
||||
if (password.empty() && !_password.empty())
|
||||
{
|
||||
connection.AuthStatus = NetworkAuth::RequirePassword;
|
||||
}
|
||||
else if (password && _password != password)
|
||||
else if (!password.empty() && _password != password)
|
||||
{
|
||||
connection.AuthStatus = NetworkAuth::BadPassword;
|
||||
}
|
||||
@@ -2717,10 +2774,10 @@ bool NetworkBase::SaveMap(IStream* stream, const std::vector<const ObjectReposit
|
||||
|
||||
void NetworkBase::Client_Handle_CHAT([[maybe_unused]] NetworkConnection& connection, NetworkPacket& packet)
|
||||
{
|
||||
const char* text = packet.ReadString();
|
||||
if (text)
|
||||
auto text = packet.ReadString();
|
||||
if (!text.empty())
|
||||
{
|
||||
chat_history_add(text);
|
||||
chat_history_add(std::string(text));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2763,7 +2820,7 @@ static bool ProcessChatMessagePluginHooks(uint8_t playerId, std::string& text)
|
||||
void NetworkBase::Server_Handle_CHAT(NetworkConnection& connection, NetworkPacket& packet)
|
||||
{
|
||||
auto szText = packet.ReadString();
|
||||
if (szText == nullptr || szText[0] == '\0')
|
||||
if (szText.empty())
|
||||
return;
|
||||
|
||||
if (connection.Player)
|
||||
@@ -2775,7 +2832,7 @@ void NetworkBase::Server_Handle_CHAT(NetworkConnection& connection, NetworkPacke
|
||||
}
|
||||
}
|
||||
|
||||
std::string text = szText;
|
||||
std::string text(szText);
|
||||
if (connection.Player != nullptr)
|
||||
{
|
||||
if (!ProcessChatMessagePluginHooks(connection.Player->Id, text))
|
||||
@@ -2912,8 +2969,8 @@ void NetworkBase::Client_Handle_TICK([[maybe_unused]] NetworkConnection& connect
|
||||
|
||||
if (flags & NETWORK_TICK_FLAG_CHECKSUMS)
|
||||
{
|
||||
const char* text = packet.ReadString();
|
||||
if (text != nullptr)
|
||||
auto text = packet.ReadString();
|
||||
if (!text.empty())
|
||||
{
|
||||
tickData.spriteHash = text;
|
||||
}
|
||||
@@ -2997,12 +3054,10 @@ void NetworkBase::Client_Handle_PINGLIST([[maybe_unused]] NetworkConnection& con
|
||||
|
||||
void NetworkBase::Client_Handle_SETDISCONNECTMSG(NetworkConnection& connection, NetworkPacket& packet)
|
||||
{
|
||||
static std::string msg;
|
||||
const char* disconnectmsg = packet.ReadString();
|
||||
if (disconnectmsg)
|
||||
auto disconnectmsg = packet.ReadString();
|
||||
if (!disconnectmsg.empty())
|
||||
{
|
||||
msg = disconnectmsg;
|
||||
connection.SetLastDisconnectReason(msg.c_str());
|
||||
connection.SetLastDisconnectReason(disconnectmsg);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3034,32 +3089,31 @@ void NetworkBase::Client_Handle_GROUPLIST([[maybe_unused]] NetworkConnection& co
|
||||
|
||||
void NetworkBase::Client_Handle_EVENT([[maybe_unused]] NetworkConnection& connection, NetworkPacket& packet)
|
||||
{
|
||||
char text[256];
|
||||
uint16_t eventType;
|
||||
packet >> eventType;
|
||||
switch (eventType)
|
||||
{
|
||||
case SERVER_EVENT_PLAYER_JOINED:
|
||||
{
|
||||
const char* playerName = packet.ReadString();
|
||||
format_string(text, 256, STR_MULTIPLAYER_PLAYER_HAS_JOINED_THE_GAME, &playerName);
|
||||
chat_history_add(text);
|
||||
auto playerName = packet.ReadString();
|
||||
auto message = FormatStringId(STR_MULTIPLAYER_PLAYER_HAS_JOINED_THE_GAME, playerName);
|
||||
chat_history_add(message.c_str());
|
||||
break;
|
||||
}
|
||||
case SERVER_EVENT_PLAYER_DISCONNECTED:
|
||||
{
|
||||
const char* playerName = packet.ReadString();
|
||||
const char* reason = packet.ReadString();
|
||||
const char* args[] = { playerName, reason };
|
||||
if (str_is_null_or_empty(reason))
|
||||
auto playerName = packet.ReadString();
|
||||
auto reason = packet.ReadString();
|
||||
std::string message;
|
||||
if (reason.empty())
|
||||
{
|
||||
format_string(text, 256, STR_MULTIPLAYER_PLAYER_HAS_DISCONNECTED_NO_REASON, args);
|
||||
message = FormatStringId(STR_MULTIPLAYER_PLAYER_HAS_DISCONNECTED_NO_REASON, playerName);
|
||||
}
|
||||
else
|
||||
{
|
||||
format_string(text, 256, STR_MULTIPLAYER_PLAYER_HAS_DISCONNECTED_WITH_REASON, args);
|
||||
message = FormatStringId(STR_MULTIPLAYER_PLAYER_HAS_DISCONNECTED_WITH_REASON, playerName, reason);
|
||||
}
|
||||
chat_history_add(text);
|
||||
chat_history_add(message.c_str());
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -3074,7 +3128,7 @@ void NetworkBase::Client_Send_GAMEINFO()
|
||||
|
||||
void NetworkBase::Client_Handle_GAMEINFO([[maybe_unused]] NetworkConnection& connection, NetworkPacket& packet)
|
||||
{
|
||||
const char* jsonString = packet.ReadString();
|
||||
auto jsonString = packet.ReadString();
|
||||
packet >> _serverState.gamestateSnapshotsEnabled;
|
||||
|
||||
json_t jsonData = Json::FromString(jsonString);
|
||||
@@ -3788,7 +3842,7 @@ void network_set_password(const char* password)
|
||||
gNetwork.SetPassword(password);
|
||||
}
|
||||
|
||||
void network_append_chat_log(const utf8* text)
|
||||
void network_append_chat_log(std::string_view text)
|
||||
{
|
||||
gNetwork.AppendChatLog(text);
|
||||
}
|
||||
@@ -4087,7 +4141,7 @@ int32_t network_get_current_player_group_index()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
void network_append_chat_log(const utf8* text)
|
||||
void network_append_chat_log(std::string_view text)
|
||||
{
|
||||
}
|
||||
void network_append_server_log(const utf8* text)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "../actions/GameAction.h"
|
||||
#include "../object/Object.h"
|
||||
#include "NetworkConnection.h"
|
||||
#include "NetworkGroup.h"
|
||||
#include "NetworkPlayer.h"
|
||||
@@ -37,9 +38,9 @@ public: // Common
|
||||
void SetPassword(const char* password);
|
||||
uint8_t GetDefaultGroup();
|
||||
std::string BeginLog(const std::string& directory, const std::string& midName, const std::string& filenameFormat);
|
||||
void AppendLog(std::ostream& fs, const std::string& s);
|
||||
void AppendLog(std::ostream& fs, std::string_view s);
|
||||
void BeginChatLog();
|
||||
void AppendChatLog(const std::string& s);
|
||||
void AppendChatLog(std::string_view s);
|
||||
void CloseChatLog();
|
||||
NetworkStats_t GetStats() const;
|
||||
json_t GetServerInfoAsJson() const;
|
||||
@@ -96,7 +97,7 @@ public: // Server
|
||||
void Server_Handle_REQUEST_GAMESTATE(NetworkConnection& connection, NetworkPacket& packet);
|
||||
void Server_Handle_HEARTBEAT(NetworkConnection& connection, NetworkPacket& packet);
|
||||
void Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& packet);
|
||||
void Server_Client_Joined(const char* name, const std::string& keyhash, NetworkConnection& connection);
|
||||
void Server_Client_Joined(std::string_view name, const std::string& keyhash, NetworkConnection& connection);
|
||||
void Server_Handle_CHAT(NetworkConnection& connection, NetworkPacket& packet);
|
||||
void Server_Handle_GAME_ACTION(NetworkConnection& connection, NetworkPacket& packet);
|
||||
void Server_Handle_PING(NetworkConnection& connection, NetworkPacket& packet);
|
||||
@@ -132,7 +133,7 @@ public: // Client
|
||||
void Client_Send_GAME_ACTION(const GameAction* action);
|
||||
void Client_Send_PING();
|
||||
void Client_Send_GAMEINFO();
|
||||
void Client_Send_MAPREQUEST(const std::vector<std::string>& objects);
|
||||
void Client_Send_MAPREQUEST(const std::vector<ObjectEntryDescriptor>& objects);
|
||||
void Client_Send_HEARTBEAT(NetworkConnection& connection) const;
|
||||
|
||||
// Handlers.
|
||||
@@ -213,7 +214,7 @@ private: // Client Data
|
||||
std::map<uint32_t, PlayerListUpdate> _pendingPlayerLists;
|
||||
std::multimap<uint32_t, NetworkPlayer> _pendingPlayerInfo;
|
||||
std::map<uint32_t, ServerTickData_t> _serverTickData;
|
||||
std::vector<std::string> _missingObjects;
|
||||
std::vector<ObjectEntryDescriptor> _missingObjects;
|
||||
std::string _host;
|
||||
std::string _chatLogPath;
|
||||
std::string _chatLogFilenameFormat = "%Y%m%d-%H%M%S.txt";
|
||||
|
||||
@@ -27,7 +27,6 @@ NetworkConnection::NetworkConnection()
|
||||
|
||||
NetworkConnection::~NetworkConnection()
|
||||
{
|
||||
delete[] _lastDisconnectReason;
|
||||
}
|
||||
|
||||
NetworkReadPacket NetworkConnection::ReadPacket()
|
||||
@@ -181,23 +180,12 @@ bool NetworkConnection::ReceivedPacketRecently()
|
||||
|
||||
const utf8* NetworkConnection::GetLastDisconnectReason() const
|
||||
{
|
||||
return this->_lastDisconnectReason;
|
||||
return this->_lastDisconnectReason.c_str();
|
||||
}
|
||||
|
||||
void NetworkConnection::SetLastDisconnectReason(const utf8* src)
|
||||
void NetworkConnection::SetLastDisconnectReason(std::string_view src)
|
||||
{
|
||||
if (src == nullptr)
|
||||
{
|
||||
delete[] _lastDisconnectReason;
|
||||
_lastDisconnectReason = nullptr;
|
||||
return;
|
||||
}
|
||||
|
||||
if (_lastDisconnectReason == nullptr)
|
||||
{
|
||||
_lastDisconnectReason = new utf8[NETWORK_DISCONNECT_REASON_BUFFER_SIZE];
|
||||
}
|
||||
String::Set(_lastDisconnectReason, NETWORK_DISCONNECT_REASON_BUFFER_SIZE, src);
|
||||
_lastDisconnectReason = src;
|
||||
}
|
||||
|
||||
void NetworkConnection::SetLastDisconnectReason(const rct_string_id string_id, void* args)
|
||||
|
||||
@@ -53,13 +53,13 @@ public:
|
||||
bool ReceivedPacketRecently();
|
||||
|
||||
const utf8* GetLastDisconnectReason() const;
|
||||
void SetLastDisconnectReason(const utf8* src);
|
||||
void SetLastDisconnectReason(std::string_view src);
|
||||
void SetLastDisconnectReason(const rct_string_id string_id, void* args = nullptr);
|
||||
|
||||
private:
|
||||
std::deque<NetworkPacket> _outboundPackets;
|
||||
uint32_t _lastPacketTime = 0;
|
||||
utf8* _lastDisconnectReason = nullptr;
|
||||
std::string _lastDisconnectReason;
|
||||
|
||||
void RecordPacketStats(const NetworkPacket& packet, bool sending);
|
||||
bool SendPacket(NetworkPacket& packet);
|
||||
|
||||
@@ -69,7 +69,7 @@ const std::string& NetworkGroup::GetName() const
|
||||
return _name;
|
||||
}
|
||||
|
||||
void NetworkGroup::SetName(std::string name)
|
||||
void NetworkGroup::SetName(std::string_view name)
|
||||
{
|
||||
_name = name;
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ public:
|
||||
static NetworkGroup FromJson(json_t& json);
|
||||
|
||||
const std::string& GetName() const;
|
||||
void SetName(std::string name);
|
||||
void SetName(std::string_view name);
|
||||
|
||||
void Read(NetworkPacket& packet);
|
||||
void Write(NetworkPacket& packet);
|
||||
|
||||
@@ -66,9 +66,10 @@ void NetworkPacket::Write(const void* bytes, size_t size)
|
||||
Data.insert(Data.end(), src, src + size);
|
||||
}
|
||||
|
||||
void NetworkPacket::WriteString(const utf8* string)
|
||||
void NetworkPacket::WriteString(std::string_view s)
|
||||
{
|
||||
Write(reinterpret_cast<const uint8_t*>(string), strlen(string) + 1);
|
||||
Write(s.data(), s.size());
|
||||
Data.push_back(0);
|
||||
}
|
||||
|
||||
const uint8_t* NetworkPacket::Read(size_t size)
|
||||
@@ -85,7 +86,7 @@ const uint8_t* NetworkPacket::Read(size_t size)
|
||||
}
|
||||
}
|
||||
|
||||
const utf8* NetworkPacket::ReadString()
|
||||
std::string_view NetworkPacket::ReadString()
|
||||
{
|
||||
char* str = reinterpret_cast<char*>(&GetData()[BytesRead]);
|
||||
char* strend = str;
|
||||
@@ -96,7 +97,7 @@ const utf8* NetworkPacket::ReadString()
|
||||
}
|
||||
if (*strend != 0)
|
||||
{
|
||||
return nullptr;
|
||||
return {};
|
||||
}
|
||||
BytesRead++;
|
||||
return str;
|
||||
|
||||
@@ -39,10 +39,10 @@ struct NetworkPacket final
|
||||
bool CommandRequiresAuth();
|
||||
|
||||
const uint8_t* Read(size_t size);
|
||||
const utf8* ReadString();
|
||||
std::string_view ReadString();
|
||||
|
||||
void Write(const void* bytes, size_t size);
|
||||
void WriteString(const utf8* string);
|
||||
void WriteString(std::string_view s);
|
||||
|
||||
template<typename T> NetworkPacket& operator>>(T& value)
|
||||
{
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
# include "../localisation/Localisation.h"
|
||||
# include "NetworkPacket.h"
|
||||
|
||||
void NetworkPlayer::SetName(const std::string& name)
|
||||
void NetworkPlayer::SetName(std::string_view name)
|
||||
{
|
||||
// 36 == 31 + strlen(" #255");
|
||||
Name = name.substr(0, 36);
|
||||
@@ -23,7 +23,7 @@ void NetworkPlayer::SetName(const std::string& name)
|
||||
|
||||
void NetworkPlayer::Read(NetworkPacket& packet)
|
||||
{
|
||||
const utf8* name = packet.ReadString();
|
||||
auto name = packet.ReadString();
|
||||
SetName(name);
|
||||
packet >> Id >> Flags >> Group >> LastAction >> LastActionCoord.x >> LastActionCoord.y >> LastActionCoord.z >> MoneySpent
|
||||
>> CommandsRan;
|
||||
|
||||
@@ -40,7 +40,7 @@ public:
|
||||
std::unordered_map<GameCommand, int32_t> CooldownTime;
|
||||
NetworkPlayer() = default;
|
||||
|
||||
void SetName(const std::string& name);
|
||||
void SetName(std::string_view name);
|
||||
|
||||
void Read(NetworkPacket& packet);
|
||||
void Write(NetworkPacket& packet);
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <vector>
|
||||
|
||||
struct GameAction;
|
||||
@@ -108,7 +109,7 @@ void network_send_password(const std::string& password);
|
||||
void network_set_password(const char* password);
|
||||
|
||||
void network_print_error();
|
||||
void network_append_chat_log(const utf8* text);
|
||||
void network_append_chat_log(std::string_view text);
|
||||
void network_append_server_log(const utf8* text);
|
||||
const utf8* network_get_server_name();
|
||||
const utf8* network_get_server_description();
|
||||
|
||||
Reference in New Issue
Block a user