Skip to content

Commit a117dff

Browse files
Pouch v2.0.0 (#6)
- Adding byte[] support - Only send events to clients that have the same pipe available
1 parent 2312e3c commit a117dff

16 files changed

+281
-31
lines changed

Event/Event.cs

+5
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ public class baseEventData
4848
/// Corresponding EventData
4949
/// </summary>
5050
public string EventData = "";
51+
52+
/// <summary>
53+
/// Extra Bytes sent with the event
54+
/// </summary>
55+
public byte[] ExtraBytes = new byte[0];
5156
}
5257

5358
/// <summary>

Event/OnAble.cs

+2
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ private void OnEvent_handler(object sender, EventContainer e)
5555
e.Event.FromPlayer = e.FromPlayer;
5656
e.Event.ToPlayer = e.ToPlayer;
5757
e.Event.SceneName = e.SceneName;
58+
e.Event.ExtraBytes = e.ExtraBytes;
5859
}
5960
thenActions.ForEach(x => x(e.Event));
6061
}
@@ -82,6 +83,7 @@ void OnEvent_do_Once_handler(object sender, EventContainer e)
8283
e.Event.FromPlayer = e.FromPlayer;
8384
e.Event.ToPlayer = e.ToPlayer;
8485
e.Event.SceneName = e.SceneName;
86+
e.Event.ExtraBytes = e.ExtraBytes;
8587
}
8688
Callback(e.Event);
8789
handler -= OnEvent_do_Once_handler;

HkmpPouch.csproj

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<!-- Change this to the path of your modded HK installation -->
4-
<HollowKnightRefs>D:\SteamLibrary\steamapps\common\Hollow Knight\hollow_knight_Data\Managed</HollowKnightRefs>
4+
<HollowKnightRefs>E:\SteamLibrary\steamapps\common\Hollow Knight\hollow_knight_Data\Managed</HollowKnightRefs>
55
<!-- Change this to the path where you want the ready-to-upload exports to be -->
66
<ExportDir>D:/__Exports/</ExportDir>
77
<!-- Uncomment this to generate a documentation file to be included with the mod -->
@@ -323,9 +323,12 @@
323323
<Reference Include="UnityEngine.XRModule">
324324
<HintPath>$(HollowKnightRefs)/UnityEngine.XRModule.dll</HintPath>
325325
</Reference>
326-
<Reference Include="Hkmp">
327-
<HintPath>$(HollowKnightRefs)/Mods/HKMP/HKMP.dll</HintPath>
328-
</Reference>
326+
<Reference Include="Hkmp">
327+
<HintPath>$(HollowKnightRefs)/Mods/HKMP/HKMP.dll</HintPath>
328+
</Reference>
329+
<Reference Include="Satchel">
330+
<HintPath>$(HollowKnightRefs)/Mods/Satchel/Satchel.dll</HintPath>
331+
</Reference>
329332
</ItemGroup>
330333
<ItemGroup>
331334
<None Include=".gIthub\worlflows\main.yml" />

Logger.cs

+25-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
namespace HkmpPouch
1+
using HkmpPouch.Networking;
2+
using System;
3+
4+
namespace HkmpPouch
25
{
36
internal interface ILogger {
47
internal void Error(string str);
@@ -13,6 +16,27 @@ public class Logger
1316
{
1417
private readonly string Name;
1518
private readonly ILogger _logger;
19+
20+
/// <summary>
21+
/// StupidError will try to log an error, it will not print what addon tried to print the error because it does not know.
22+
/// </summary>
23+
/// <param name="text">The error to log</param>
24+
[Obsolete("Ideally you shouldn't need to use this. Use your own instance of the logger from your pipe instead.")]
25+
public static void StupidError(string text)
26+
{
27+
if (Server.Instance != null)
28+
{
29+
Server.Instance.Error(text);
30+
} else if (Client.Instance != null)
31+
{
32+
Client.Instance.Error(text);
33+
} else
34+
{
35+
// we cannot log it, but ideally this will never happen because HKMP would initialise atleast one of these.
36+
}
37+
}
38+
39+
1640
internal Logger(string Name,ILogger L) {
1741
this.Name = Name;
1842
_logger = L;

Networking/Client.cs

+15
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ internal class Client : ClientAddon, ILogger
1818

1919
internal static Client Instance;
2020

21+
internal static List<PipeClient> PipeClients = new ();
22+
2123
internal IClientApi Api;
2224

2325
internal static event EventHandler<EventArgs> OnReady;
@@ -30,6 +32,7 @@ internal class Client : ClientAddon, ILogger
3032
internal IClientAddonNetworkSender<PacketsEnum> NetSender;
3133
internal bool HasServerPipeList { get; private set; } = false;
3234
private List<string> ServerPipeList = new();
35+
3336
public Client() {
3437
Instance = this;
3538
}
@@ -113,6 +116,7 @@ internal void PlayerToPlayerPacketHandler(PlayerToPlayerPacket packet)
113116
ModName = packet.mod,
114117
EventData = packet.eventData,
115118
EventName = packet.eventName,
119+
ExtraBytes = packet.extraBytes,
116120
});
117121
}
118122

@@ -126,6 +130,7 @@ internal void PlayerToPlayersPacketHandler(PlayerToPlayersPacket packet)
126130
ModName = packet.mod,
127131
EventData = packet.eventData,
128132
EventName = packet.eventName,
133+
ExtraBytes = packet.extraBytes,
129134
});
130135
}
131136

@@ -138,6 +143,7 @@ internal void ToPlayerPacketHandler(ToPlayerPacket packet)
138143
ModName = packet.mod,
139144
EventData = packet.eventData,
140145
EventName = packet.eventName,
146+
ExtraBytes = packet.extraBytes,
141147
});
142148
}
143149

@@ -150,6 +156,7 @@ internal void ToPlayersPacket(ToPlayersPacket packet)
150156
ModName = packet.mod,
151157
EventData = packet.eventData,
152158
EventName = packet.eventName,
159+
ExtraBytes = packet.extraBytes,
153160
});
154161
}
155162

@@ -188,5 +195,13 @@ void x(object _, EventArgs e)
188195
}
189196
}
190197

198+
internal void RegisterPipeWithServer(PipeClient pipe)
199+
{
200+
//pipe.ModName;
201+
Send<RegisterPipePacket>(PacketsEnum.RegisterPipePacket, new RegisterPipePacket {
202+
modName = pipe.ModName
203+
});
204+
}
205+
191206
}
192207
}

Networking/Server.cs

+74-7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System;
77
using System.Collections.Generic;
88
using System.Linq;
9+
using System.Net.Sockets;
910

1011
namespace HkmpPouch.Networking
1112
{
@@ -28,6 +29,8 @@ internal class Server : ServerAddon, ILogger
2829
internal Dictionary<string, DataStorageServerManager> ModDataStorageServerManager = new Dictionary<string, DataStorageServerManager>();
2930
private List<string> PipeList = new();
3031

32+
internal Dictionary<string, List<IServerPlayer>> PipeToPlayersMap = new();
33+
internal Dictionary<ushort,List<string>> PlayerIdToPipeMap = new();
3134
internal void AddPipe(string s)
3235
{
3336
PipeList.Add(s);
@@ -58,20 +61,68 @@ internal void RecieveData(EventContainer r)
5861
public override void Initialize(IServerApi serverApi)
5962
{
6063
Api = serverApi;
64+
Api.ServerManager.PlayerDisconnectEvent += ServerManager_PlayerDisconnectEvent;
6165
NetReceiver = Api.NetServer.GetNetworkReceiver<PacketsEnum>(Instance,PacketBoi.InstantiatePacket);
6266

6367
NetReceiver.RegisterPacketHandler<GetServerMetadataPacket>(PacketsEnum.GetServerMetadataPacket, GetServerMetadataPacketHandler);
68+
NetReceiver.RegisterPacketHandler<RegisterPipePacket>(PacketsEnum.RegisterPipePacket, RegisterPipePacketHandler);
6469

6570
NetReceiver.RegisterPacketHandler<ToServerPacket>(PacketsEnum.ToServerPacket, ToServerPacketHandler);
6671
NetReceiver.RegisterPacketHandler<PlayerToPlayerPacket>(PacketsEnum.PlayerToPlayerPacket, PlayerToPlayerPacketHandler);
6772
NetReceiver.RegisterPacketHandler<PlayerToPlayersPacket>(PacketsEnum.PlayerToPlayersPacket, PlayerToPlayersPacketHandler);
6873

6974
}
7075

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+
71123
private void GetServerMetadataPacketHandler(ushort playerId, GetServerMetadataPacket packet)
72124
{
73125

74-
Logger.Info("got get packet " + PipeList.Count);
75126
Send<ServerPipeListPacket>(PacketsEnum.ServerPipeListPacket, new ServerPipeListPacket
76127
{
77128
PipeList = PipeList
@@ -90,14 +141,25 @@ internal void ToServerPacketHandler(ushort fromPlayer, ToServerPacket packet)
90141
ModName = packet.mod,
91142
EventData = packet.eventData,
92143
EventName = packet.eventName,
144+
ExtraBytes = packet.extraBytes
93145
});
94146
}
95147

96148
internal void PlayerToPlayerPacketHandler(ushort fromPlayer, PlayerToPlayerPacket packet)
97149
{
98150
// rebroadcast
99151
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+
}
101163
}
102164

103165
internal void PlayerToPlayersPacketHandler(ushort fromPlayer, PlayerToPlayersPacket packet)
@@ -107,7 +169,10 @@ internal void PlayerToPlayersPacketHandler(ushort fromPlayer, PlayerToPlayersPac
107169
bool allScenes = packet.sceneName == Constants.AllScenes;
108170
bool sameScene = packet.sceneName == Constants.SameScenes;
109171

110-
var players = Api.ServerManager.Players;
172+
if(!PipeToPlayersMap.TryGetValue(packet.mod, out var players))
173+
{
174+
players = (List<IServerPlayer>)Api.ServerManager.Players;
175+
}
111176
var sender = Api.ServerManager.GetPlayer(fromPlayer);
112177
packet.fromPlayer = fromPlayer;
113178

@@ -123,8 +188,8 @@ internal void PlayerToPlayersPacketHandler(ushort fromPlayer, PlayerToPlayersPac
123188
sceneName = packet.sceneName,
124189
mod = packet.mod,
125190
eventData = packet.eventData,
126-
eventName = packet.eventName
127-
191+
eventName = packet.eventName,
192+
extraBytes = packet.extraBytes,
128193
}, player.Id);
129194
}
130195
}
@@ -148,8 +213,10 @@ internal void PlayerToPlayersPacketHandler(ushort fromPlayer, PlayerToPlayersPac
148213
internal void Broadcast(ToPlayersPacket packet) {
149214
bool allScenes = packet.sceneName == Constants.AllScenes;
150215

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+
}
153220
for (var i = 0; i < players.Count; i++)
154221
{
155222
var player = players.ElementAt(i);

Packets/BasePacket.cs

+45-1
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,42 @@
11
using Hkmp.Networking.Packet;
2+
using System;
23

34
namespace HkmpPouch.Packets
45
{
56
internal class BasePacket
67
{
7-
88
public bool IsReliable => _isReliable;
99
public bool DropReliableDataIfNewerExists => false; //cannot set this to true because our packets are reused between mods.
1010

1111
public bool _isReliable = false;
1212
public string mod { get; set; }
1313
public string eventName { get; set; }
1414
public string eventData { get; set; }
15+
public bool hasExtraBytes { get => extraBytes != null && extraBytes.Length > 0; }
16+
public ulong extraBytesSize { get; set; }
17+
public byte[] extraBytes { get; set; }
1518

1619
public void WriteData(IPacket packet)
1720
{
1821
//order of read should be same as order of write
1922
packet.Write(mod);
2023
packet.Write(eventName);
2124
packet.Write(eventData);
25+
26+
}
27+
28+
public void WriteExtraBytes(IPacket packet)
29+
{
30+
packet.Write(hasExtraBytes);
31+
if (hasExtraBytes)
32+
{
33+
extraBytesSize = (ulong)extraBytes.Length;
34+
packet.Write(extraBytesSize);
35+
for (ulong i = 0; i < extraBytesSize; i++)
36+
{
37+
packet.Write(extraBytes[i]);
38+
}
39+
}
2240
}
2341

2442
public void ReadData(IPacket packet)
@@ -28,5 +46,31 @@ public void ReadData(IPacket packet)
2846
eventName = packet.ReadString();
2947
eventData = packet.ReadString();
3048
}
49+
50+
public void ReadExtraBytes(IPacket packet)
51+
{
52+
extraBytesSize = 0;
53+
try
54+
{
55+
var hasExtraBytes = packet.ReadBool();
56+
if (hasExtraBytes)
57+
{
58+
extraBytesSize = packet.ReadULong();
59+
extraBytes = new byte[extraBytesSize];
60+
for (ulong i = 0; i < extraBytesSize; i++)
61+
{
62+
extraBytes[i] = packet.ReadByte();
63+
}
64+
}
65+
}
66+
catch(Exception ex){
67+
// eat the error here that will happen when ReadBool tries to read from a packet that does not have data to read
68+
// this will happen when a player with old pouch connects to new servers, i don't know if we are on the server or unity so here goes
69+
#pragma warning disable CS0618 // Type or member is obsolete but only for others
70+
Logger.StupidError(ex.ToString());
71+
#pragma warning restore CS0618 // Type or member is obsolete but only for others
72+
}
73+
}
74+
3175
}
3276
}

Packets/Packets.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ internal enum PacketsEnum
1212
ToPlayersPacket,
1313

1414
GetServerMetadataPacket,
15-
ServerPipeListPacket
15+
ServerPipeListPacket,
16+
RegisterPipePacket
1617
}
1718
internal static class PacketBoi
1819
{
@@ -34,6 +35,8 @@ internal static IPacketData InstantiatePacket(PacketsEnum packetId)
3435
return new PacketDataCollection<GetServerMetadataPacket>();
3536
case PacketsEnum.ServerPipeListPacket:
3637
return new PacketDataCollection<ServerPipeListPacket>();
38+
case PacketsEnum.RegisterPipePacket:
39+
return new PacketDataCollection<RegisterPipePacket>();
3740
}
3841
return null;
3942
}

0 commit comments

Comments
 (0)