44#include < cstdint>
55#include < string_view>
66
7- #include " openvic-simulation/multiplayer/BaseMultiplayerManager .hpp"
8- #include " openvic-simulation/multiplayer/ClientManager .hpp"
7+ #include " openvic-simulation/multiplayer/Constants .hpp"
8+ #include " openvic-simulation/multiplayer/PacketType .hpp"
99#include " openvic-simulation/types/Signal.hpp"
1010#include " openvic-simulation/utility/Marshal.hpp"
1111
1212namespace OpenVic {
1313 struct GameManager ;
1414 struct ChatManager ;
1515 struct ChatMessageLog ;
16+ struct BaseMultiplayerManager ;
17+ struct ClientManager ;
1618
1719 struct ChatGroup {
18- using index_t = size_t ;
20+ using index_type = size_t ;
1921
2022 ChatGroup (ChatGroup const &) = delete ;
2123 ChatGroup& operator =(ChatGroup const &) = delete ;
2224 ChatGroup (ChatGroup&&) = default ;
2325 ChatGroup& operator =(ChatGroup&& lhs) = default ;
2426
25- std::span<const BaseMultiplayerManager:: client_id_type> get_clients () const {
27+ std::span<const client_id_type> get_clients () const {
2628 return clients;
2729 }
2830
29- operator index_t () const {
31+ operator index_type () const {
3032 return index;
3133 }
3234
3335 private:
3436 friend struct ChatManager ;
35- ChatGroup (index_t index, memory::vector<BaseMultiplayerManager:: client_id_type>&& clients);
37+ ChatGroup (index_type index, memory::vector<client_id_type>&& clients);
3638
37- memory::vector<BaseMultiplayerManager:: client_id_type> clients;
38- index_t PROPERTY (index);
39+ memory::vector<client_id_type> clients;
40+ index_type PROPERTY (index);
3941 };
4042
4143 struct ChatManager {
@@ -44,17 +46,23 @@ namespace OpenVic {
4446 struct MessageData {
4547 MessageType type = MessageType::NONE;
4648 memory::string message;
47- uint64_t from_index = BaseMultiplayerManager::HOST_ID;
49+ union {
50+ client_id_type to_client = MP_HOST_ID;
51+ ChatGroup::index_type to_group;
52+ };
4853
4954 template <std::endian Endian>
5055 size_t encode (std::span<uint8_t > span) const {
5156 size_t offset = utility::encode (type, span, utility::endian_tag<Endian>);
5257 if (type != MessageType::PUBLIC) {
53- offset += utility::encode<
54- uint16_t >(from_index, !span.empty () ? span.subspan (offset) : span, utility::endian_tag<Endian>);
58+ offset += //
59+ utility::encode<uint16_t , Endian>(
60+ to_client, //
61+ span.empty () ? span : span.subspan (offset) //
62+ );
5563 }
5664
57- return utility::encode (message, ! span.empty () ? span.subspan (offset) : span , utility::endian_tag<Endian>) +
65+ return utility::encode (message, span.empty () ? span : span .subspan (offset), utility::endian_tag<Endian>) +
5866 offset;
5967 }
6068
@@ -63,14 +71,15 @@ namespace OpenVic {
6371 MessageType type = utility::decode<MessageType, Endian>(span, r_decode_count);
6472 size_t offset = r_decode_count;
6573
66- uint64_t from_index = BaseMultiplayerManager::HOST_ID;
74+ // Depending on type, either client_id_type or ChatGroup::index_type
75+ decltype (to_client) to_index = MP_HOST_ID;
6776 if (type != MessageType::PUBLIC) {
68- from_index = utility::decode<uint16_t >(span.subspan (offset), r_decode_count);
77+ to_index = utility::decode<uint16_t , Endian >(span.subspan (offset), r_decode_count);
6978 offset += r_decode_count;
7079 }
7180
7281 MessageData data {
73- type, utility::decode<decltype (message), Endian>(span.subspan (offset), r_decode_count), from_index //
82+ type, utility::decode<decltype (message), Endian>(span.subspan (offset), r_decode_count), to_index //
7483 };
7584 r_decode_count += offset;
7685 return data;
@@ -79,32 +88,32 @@ namespace OpenVic {
7988
8089 ChatManager (ClientManager* client_manager = nullptr );
8190
82- bool send_private_message (BaseMultiplayerManager:: client_id_type to, memory::string&& message);
83- bool send_private_message (BaseMultiplayerManager:: client_id_type to, std::string_view message);
91+ bool send_private_message (client_id_type to, memory::string&& message);
92+ bool send_private_message (client_id_type to, std::string_view message);
8493 bool send_public_message (memory::string&& message);
8594 bool send_public_message (std::string_view message);
8695 bool send_group_message (ChatGroup const & group, memory::string&& message);
87- bool send_group_message (ChatGroup::index_t group_id, memory::string&& message);
96+ bool send_group_message (ChatGroup::index_type group_id, memory::string&& message);
8897 bool send_group_message (ChatGroup const & group, std::string_view message);
89- bool send_group_message (ChatGroup::index_t group_id, std::string_view message);
98+ bool send_group_message (ChatGroup::index_type group_id, std::string_view message);
9099
91100 signal_property<ChatManager, ChatMessageLog const &> message_logged;
92101
93102 ChatMessageLog const & log_message (
94- BaseMultiplayerManager:: client_id_type from, MessageData&& message,
103+ client_id_type from, MessageData&& message,
95104 std::chrono::time_point<std::chrono::system_clock> timestamp = std::chrono::system_clock::now()
96105 );
97106 memory::vector<ChatMessageLog> const & get_message_logs () const ;
98107
99108 signal_property<ChatManager, ChatGroup const &> group_created;
100- // group, old clients
101- signal_property<ChatManager, ChatGroup const &, memory::vector<BaseMultiplayerManager::client_id_type>&> group_modified;
102- signal_property<ChatManager, ChatGroup::index_t > group_deleted;
109+ signal_property<ChatManager, ChatGroup const & /* group */ , memory::vector<client_id_type>& /* old clients */ >
110+ group_modified;
111+ signal_property<ChatManager, ChatGroup::index_type > group_deleted;
103112
104- void create_group (memory::vector<BaseMultiplayerManager:: client_id_type>&& clients);
105- void set_group (ChatGroup::index_t group, memory::vector<BaseMultiplayerManager:: client_id_type>&& clients);
106- ChatGroup const & get_group (ChatGroup::index_t group_index) const ;
107- void delete_group (ChatGroup::index_t group_id);
113+ void create_group (memory::vector<client_id_type>&& clients);
114+ void set_group (ChatGroup::index_type group, memory::vector<client_id_type>&& clients);
115+ ChatGroup const & get_group (ChatGroup::index_type group_index) const ;
116+ void delete_group (ChatGroup::index_type group_id);
108117
109118 private:
110119 ClientManager* PROPERTY_PTR (client_manager);
@@ -120,26 +129,26 @@ namespace OpenVic {
120129 friend bool PacketTypes::add_chat_group_process_callback ( //
121130 BaseMultiplayerManager* multiplayer_manager, PacketSpan packet
122131 );
123- void _create_group (memory::vector<BaseMultiplayerManager:: client_id_type>&& clients);
132+ void _create_group (memory::vector<client_id_type>&& clients);
124133
125134 friend bool PacketTypes::modify_chat_group_process_callback ( //
126135 BaseMultiplayerManager* multiplayer_manager, PacketSpan packet
127136 );
128- void _set_group (ChatGroup::index_t group, memory::vector<BaseMultiplayerManager:: client_id_type>&& clients);
137+ void _set_group (ChatGroup::index_type group, memory::vector<client_id_type>&& clients);
129138
130139 friend bool PacketTypes::delete_chat_group_process_callback ( //
131140 BaseMultiplayerManager* multiplayer_manager, PacketSpan packet
132141 );
133- void _delete_group (ChatGroup::index_t group_id);
142+ void _delete_group (ChatGroup::index_type group_id);
134143 };
135144
136145 struct ChatMessageLog {
137- BaseMultiplayerManager:: client_id_type from_id = BaseMultiplayerManager::HOST_ID ;
146+ client_id_type from_id = MP_HOST_ID ;
138147 ChatManager::MessageData data;
139148 int64_t timestamp = 0 ;
140149
141150 ChatMessageLog () = default ;
142- ChatMessageLog (BaseMultiplayerManager:: client_id_type from, ChatManager::MessageData data, int64_t timestamp)
151+ ChatMessageLog (client_id_type from, ChatManager::MessageData data, int64_t timestamp)
143152 : from_id { from }, data { data }, timestamp { timestamp } {}
144153
145154 template <std::endian Endian>
0 commit comments