6
6
using System ;
7
7
using System . Collections . Generic ;
8
8
using System . Linq ;
9
+ using System . Net . Sockets ;
9
10
10
11
namespace HkmpPouch . Networking
11
12
{
@@ -28,6 +29,8 @@ internal class Server : ServerAddon, ILogger
28
29
internal Dictionary < string , DataStorageServerManager > ModDataStorageServerManager = new Dictionary < string , DataStorageServerManager > ( ) ;
29
30
private List < string > PipeList = new ( ) ;
30
31
32
+ internal Dictionary < string , List < IServerPlayer > > PipeToPlayersMap = new ( ) ;
33
+ internal Dictionary < ushort , List < string > > PlayerIdToPipeMap = new ( ) ;
31
34
internal void AddPipe ( string s )
32
35
{
33
36
PipeList . Add ( s ) ;
@@ -58,20 +61,68 @@ internal void RecieveData(EventContainer r)
58
61
public override void Initialize ( IServerApi serverApi )
59
62
{
60
63
Api = serverApi ;
64
+ Api . ServerManager . PlayerDisconnectEvent += ServerManager_PlayerDisconnectEvent ;
61
65
NetReceiver = Api . NetServer . GetNetworkReceiver < PacketsEnum > ( Instance , PacketBoi . InstantiatePacket ) ;
62
66
63
67
NetReceiver . RegisterPacketHandler < GetServerMetadataPacket > ( PacketsEnum . GetServerMetadataPacket , GetServerMetadataPacketHandler ) ;
68
+ NetReceiver . RegisterPacketHandler < RegisterPipePacket > ( PacketsEnum . RegisterPipePacket , RegisterPipePacketHandler ) ;
64
69
65
70
NetReceiver . RegisterPacketHandler < ToServerPacket > ( PacketsEnum . ToServerPacket , ToServerPacketHandler ) ;
66
71
NetReceiver . RegisterPacketHandler < PlayerToPlayerPacket > ( PacketsEnum . PlayerToPlayerPacket , PlayerToPlayerPacketHandler ) ;
67
72
NetReceiver . RegisterPacketHandler < PlayerToPlayersPacket > ( PacketsEnum . PlayerToPlayersPacket , PlayerToPlayersPacketHandler ) ;
68
73
69
74
}
70
75
76
+ private void ServerManager_PlayerDisconnectEvent ( IServerPlayer player )
77
+ {
78
+ RemovePlayerPipeRegisterations ( player ) ;
79
+ }
80
+
81
+ private void RemovePlayerPipeRegisterations ( IServerPlayer player )
82
+ {
83
+ foreach ( var pipe in PipeToPlayersMap )
84
+ {
85
+ if ( pipe . Value . Contains ( player ) )
86
+ {
87
+ pipe . Value . Remove ( player ) ;
88
+ }
89
+ }
90
+ if ( PlayerIdToPipeMap . ContainsKey ( player . Id ) )
91
+ {
92
+ PlayerIdToPipeMap . Remove ( player . Id ) ;
93
+ }
94
+ }
95
+
96
+ private void RegisterPipePacketHandler ( ushort fromPlayer , RegisterPipePacket packet )
97
+ {
98
+ var player = Api . ServerManager . GetPlayer ( fromPlayer ) ;
99
+ if ( packet . modName == null )
100
+ {
101
+ Error ( $ "Recieved A packet without modname from playerid { player . Id } .") ;
102
+ return ;
103
+ }
104
+ if ( ! PipeToPlayersMap . TryGetValue ( packet . modName , out _ ) )
105
+ {
106
+ PipeToPlayersMap [ packet . modName ] = new ( ) ;
107
+ }
108
+ if ( ! PipeToPlayersMap [ packet . modName ] . Contains ( player ) )
109
+ {
110
+ PipeToPlayersMap [ packet . modName ] . Add ( player ) ;
111
+ }
112
+
113
+ if ( ! PlayerIdToPipeMap . TryGetValue ( fromPlayer , out _ ) )
114
+ {
115
+ PlayerIdToPipeMap [ fromPlayer ] = new ( ) ;
116
+ }
117
+ if ( ! PlayerIdToPipeMap [ fromPlayer ] . Contains ( packet . modName ) )
118
+ {
119
+ PlayerIdToPipeMap [ fromPlayer ] . Add ( packet . modName ) ;
120
+ }
121
+ }
122
+
71
123
private void GetServerMetadataPacketHandler ( ushort playerId , GetServerMetadataPacket packet )
72
124
{
73
125
74
- Logger . Info ( "got get packet " + PipeList . Count ) ;
75
126
Send < ServerPipeListPacket > ( PacketsEnum . ServerPipeListPacket , new ServerPipeListPacket
76
127
{
77
128
PipeList = PipeList
@@ -90,14 +141,25 @@ internal void ToServerPacketHandler(ushort fromPlayer, ToServerPacket packet)
90
141
ModName = packet . mod ,
91
142
EventData = packet . eventData ,
92
143
EventName = packet . eventName ,
144
+ ExtraBytes = packet . extraBytes
93
145
} ) ;
94
146
}
95
147
96
148
internal void PlayerToPlayerPacketHandler ( ushort fromPlayer , PlayerToPlayerPacket packet )
97
149
{
98
150
// rebroadcast
99
151
packet . fromPlayer = fromPlayer ;
100
- Send < PlayerToPlayerPacket > ( PacketsEnum . PlayerToPlayerPacket , packet , packet . toPlayer ) ;
152
+
153
+ if ( PlayerIdToPipeMap . TryGetValue ( fromPlayer , out var pipes ) )
154
+ {
155
+ if ( pipes . Contains ( packet . mod ) )
156
+ {
157
+ Send < PlayerToPlayerPacket > ( PacketsEnum . PlayerToPlayerPacket , packet , packet . toPlayer ) ;
158
+ }
159
+ } else
160
+ {
161
+ Send < PlayerToPlayerPacket > ( PacketsEnum . PlayerToPlayerPacket , packet , packet . toPlayer ) ;
162
+ }
101
163
}
102
164
103
165
internal void PlayerToPlayersPacketHandler ( ushort fromPlayer , PlayerToPlayersPacket packet )
@@ -107,7 +169,10 @@ internal void PlayerToPlayersPacketHandler(ushort fromPlayer, PlayerToPlayersPac
107
169
bool allScenes = packet . sceneName == Constants . AllScenes ;
108
170
bool sameScene = packet . sceneName == Constants . SameScenes ;
109
171
110
- var players = Api . ServerManager . Players ;
172
+ if ( ! PipeToPlayersMap . TryGetValue ( packet . mod , out var players ) )
173
+ {
174
+ players = ( List < IServerPlayer > ) Api . ServerManager . Players ;
175
+ }
111
176
var sender = Api . ServerManager . GetPlayer ( fromPlayer ) ;
112
177
packet . fromPlayer = fromPlayer ;
113
178
@@ -123,8 +188,8 @@ internal void PlayerToPlayersPacketHandler(ushort fromPlayer, PlayerToPlayersPac
123
188
sceneName = packet . sceneName ,
124
189
mod = packet . mod ,
125
190
eventData = packet . eventData ,
126
- eventName = packet . eventName
127
-
191
+ eventName = packet . eventName ,
192
+ extraBytes = packet . extraBytes ,
128
193
} , player . Id ) ;
129
194
}
130
195
}
@@ -148,8 +213,10 @@ internal void PlayerToPlayersPacketHandler(ushort fromPlayer, PlayerToPlayersPac
148
213
internal void Broadcast ( ToPlayersPacket packet ) {
149
214
bool allScenes = packet . sceneName == Constants . AllScenes ;
150
215
151
- var players = Api . ServerManager . Players ;
152
-
216
+ if ( ! PipeToPlayersMap . TryGetValue ( packet . mod , out var players ) )
217
+ {
218
+ players = ( List < IServerPlayer > ) Api . ServerManager . Players ;
219
+ }
153
220
for ( var i = 0 ; i < players . Count ; i ++ )
154
221
{
155
222
var player = players . ElementAt ( i ) ;
0 commit comments