From 297fe537b6b35ea6b8474beae37b2f2cbda9c1fa Mon Sep 17 00:00:00 2001 From: Ted John Date: Tue, 28 Apr 2020 22:02:14 +0100 Subject: [PATCH] Implement network.sendMessage(msg, players) --- src/openrct2/network/Network.cpp | 33 ++++++++++++++++++++++------ src/openrct2/network/network.h | 3 ++- src/openrct2/scripting/ScNetwork.hpp | 21 +++++++++++++++++- 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/src/openrct2/network/Network.cpp b/src/openrct2/network/Network.cpp index 017fee9b83..eaef82f509 100644 --- a/src/openrct2/network/Network.cpp +++ b/src/openrct2/network/Network.cpp @@ -177,7 +177,7 @@ public: void Server_Send_TOKEN(NetworkConnection& connection); void Server_Send_MAP(NetworkConnection* connection = nullptr); void Client_Send_CHAT(const char* text); - void Server_Send_CHAT(const char* text); + void Server_Send_CHAT(const char* text, const std::vector& playerIds = {}); void Client_Send_GAME_ACTION(const GameAction* action); void Server_Send_GAME_ACTION(const GameAction* action); void Server_Send_TICK(); @@ -1671,12 +1671,27 @@ void Network::Client_Send_CHAT(const char* text) _serverConnection->QueuePacket(std::move(packet)); } -void Network::Server_Send_CHAT(const char* text) +void Network::Server_Send_CHAT(const char* text, const std::vector& playerIds) { std::unique_ptr packet(NetworkPacket::Allocate()); *packet << static_cast(NETWORK_COMMAND_CHAT); packet->WriteString(text); - SendPacketToClients(*packet); + + if (playerIds.empty()) + { + SendPacketToClients(*packet); + } + else + { + for (auto playerId : playerIds) + { + auto conn = GetPlayerConnection(playerId); + if (conn != nullptr && !conn->IsDisconnected) + { + conn->QueuePacket(NetworkPacket::Duplicate(*packet)); + } + } + } } void Network::Client_Send_GAME_ACTION(const GameAction* action) @@ -3972,7 +3987,7 @@ void network_send_map() gNetwork.Server_Send_MAP(); } -void network_send_chat(const char* text) +void network_send_chat(const char* text, const std::vector& playerIds) { if (gNetwork.GetMode() == NETWORK_MODE_CLIENT) { @@ -3987,8 +4002,12 @@ void network_send_chat(const char* text) if (player != nullptr) { auto formatted = gNetwork.FormatChat(player, message.c_str()); - chat_history_add(formatted); - gNetwork.Server_Send_CHAT(formatted); + if (playerIds.empty() + || std::find(playerIds.begin(), playerIds.end(), gNetwork.GetPlayerID()) != playerIds.end()) + { + chat_history_add(formatted); + } + gNetwork.Server_Send_CHAT(formatted, playerIds); } } } @@ -4311,7 +4330,7 @@ int32_t network_get_pickup_peep_old_x(uint8_t playerid) { return _pickup_peep_old_x; } -void network_send_chat(const char* text) +void network_send_chat(const char* text, const std::vector& playerIds) { } void network_send_password(const std::string& password) diff --git a/src/openrct2/network/network.h b/src/openrct2/network/network.h index 02e4ad3b7c..380b01a2ed 100644 --- a/src/openrct2/network/network.h +++ b/src/openrct2/network/network.h @@ -20,6 +20,7 @@ #include #include +#include struct json_t; struct GameAction; @@ -94,7 +95,7 @@ void network_set_pickup_peep_old_x(uint8_t playerid, int32_t x); int32_t network_get_pickup_peep_old_x(uint8_t playerid); void network_send_map(); -void network_send_chat(const char* text); +void network_send_chat(const char* text, const std::vector& playerIds = {}); void network_send_game_action(const GameAction* action); void network_enqueue_game_action(const GameAction* action); void network_send_password(const std::string& password); diff --git a/src/openrct2/scripting/ScNetwork.hpp b/src/openrct2/scripting/ScNetwork.hpp index 9e99ab4450..5cb76da3f1 100644 --- a/src/openrct2/scripting/ScNetwork.hpp +++ b/src/openrct2/scripting/ScNetwork.hpp @@ -408,7 +408,26 @@ namespace OpenRCT2::Scripting # ifndef DISABLE_NETWORK if (players.is_array()) { - duk_error(players.context(), DUK_ERR_ERROR, "Not yet supported"); + if (network_get_mode() == NETWORK_MODE_SERVER) + { + std::vector playerIds; + auto playerArray = players.as_array(); + for (const auto& item : playerArray) + { + if (item.type() == DukValue::Type::NUMBER) + { + playerIds.push_back(static_cast(item.as_int())); + } + } + if (!playerArray.empty()) + { + network_send_chat(message.c_str(), playerIds); + } + } + else + { + duk_error(players.context(), DUK_ERR_ERROR, "Only servers can send private messages."); + } } else {