@@ -40,24 +40,38 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="MelonLoader">
|
<Reference Include="MelonLoader">
|
||||||
<HintPath>..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Stationeers\MelonLoader\MelonLoader.dll</HintPath>
|
<HintPath>..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Stationeers\MelonLoader\MelonLoader.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Microsoft.TestPlatform.CoreUtilities, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
<Reference Include="Microsoft.TestPlatform.CoreUtilities, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\Microsoft.TestPlatform.ObjectModel.17.12.0\lib\net462\Microsoft.TestPlatform.CoreUtilities.dll</HintPath>
|
<HintPath>..\packages\Microsoft.TestPlatform.ObjectModel.17.12.0\lib\net462\Microsoft.TestPlatform.CoreUtilities.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Microsoft.TestPlatform.PlatformAbstractions, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
<Reference Include="Microsoft.TestPlatform.PlatformAbstractions, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\Microsoft.TestPlatform.ObjectModel.17.12.0\lib\net462\Microsoft.TestPlatform.PlatformAbstractions.dll</HintPath>
|
<HintPath>..\packages\Microsoft.TestPlatform.ObjectModel.17.12.0\lib\net462\Microsoft.TestPlatform.PlatformAbstractions.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Microsoft.VisualStudio.TestPlatform.ObjectModel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
<Reference Include="Microsoft.VisualStudio.TestPlatform.ObjectModel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\Microsoft.TestPlatform.ObjectModel.17.12.0\lib\net462\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll</HintPath>
|
<HintPath>..\packages\Microsoft.TestPlatform.ObjectModel.17.12.0\lib\net462\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\MSTest.TestFramework.3.8.2\lib\net462\Microsoft.VisualStudio.TestPlatform.TestFramework.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\MSTest.TestFramework.3.8.2\lib\net462\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Collections.Immutable, Version=1.2.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
<Reference Include="System.Collections.Immutable, Version=1.2.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\System.Collections.Immutable.1.5.0\lib\netstandard2.0\System.Collections.Immutable.dll</HintPath>
|
<HintPath>..\packages\System.Collections.Immutable.1.5.0\lib\netstandard2.0\System.Collections.Immutable.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System.Configuration" />
|
<Reference Include="System.Configuration" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="System.Reflection.Metadata, Version=1.4.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
<Reference Include="System.Reflection.Metadata, Version=1.4.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\System.Reflection.Metadata.1.6.0\lib\netstandard2.0\System.Reflection.Metadata.dll</HintPath>
|
<HintPath>..\packages\System.Reflection.Metadata.1.6.0\lib\netstandard2.0\System.Reflection.Metadata.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System.Runtime" />
|
<Reference Include="System.Runtime" />
|
||||||
<Reference Include="System.Runtime.Serialization" />
|
<Reference Include="System.Runtime.Serialization" />
|
||||||
@@ -67,16 +81,24 @@
|
|||||||
<Reference Include="System.Data" />
|
<Reference Include="System.Data" />
|
||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
<Reference Include="xunit.abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
|
<Reference Include="xunit.abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\xunit.abstractions.2.0.3\lib\net35\xunit.abstractions.dll</HintPath>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\..\..\.nuget\packages\xunit.abstractions\2.0.3\lib\net35\xunit.abstractions.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="xunit.assert, Version=2.9.3.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
|
<Reference Include="xunit.assert, Version=2.9.3.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\xunit.assert.2.9.3\lib\netstandard1.1\xunit.assert.dll</HintPath>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\..\..\.nuget\packages\xunit.assert\2.9.3\lib\netstandard1.1\xunit.assert.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="xunit.core, Version=2.9.3.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
|
<Reference Include="xunit.core, Version=2.9.3.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\xunit.extensibility.core.2.9.3\lib\net452\xunit.core.dll</HintPath>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\..\..\.nuget\packages\xunit.extensibility.core\2.9.3\lib\net452\xunit.core.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="xunit.execution.desktop, Version=2.9.3.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
|
<Reference Include="xunit.execution.desktop, Version=2.9.3.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\xunit.extensibility.execution.2.9.3\lib\net452\xunit.execution.desktop.dll</HintPath>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\..\..\.nuget\packages\xunit.extensibility.execution\2.9.3\lib\net452\xunit.execution.desktop.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -92,19 +114,17 @@
|
|||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="Networking\ByteEncoder.cs" />
|
<Compile Include="Networking\ByteEncoder.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup />
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="Facepunch.Steamworks\Facepunch.Steamworks.Win64.csproj">
|
<WCFMetadata Include="Connected Services\" />
|
||||||
<Project>{0289f09e-d594-46a9-96a7-b0f31f5d97b0}</Project>
|
|
||||||
<Name>Facepunch.Steamworks.Win64</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Analyzer Include="..\packages\xunit.analyzers.1.18.0\analyzers\dotnet\cs\xunit.analyzers.dll" />
|
<Analyzer Include="..\packages\MSTest.Analyzers.3.8.2\analyzers\dotnet\cs\MSTest.Analyzers.CodeFixes.dll" />
|
||||||
<Analyzer Include="..\packages\xunit.analyzers.1.18.0\analyzers\dotnet\cs\xunit.analyzers.fixes.dll" />
|
<Analyzer Include="..\packages\MSTest.Analyzers.3.8.2\analyzers\dotnet\cs\MSTest.Analyzers.dll" />
|
||||||
|
<Analyzer Include="..\packages\xunit.analyzers.1.20.0\analyzers\dotnet\cs\xunit.analyzers.dll" />
|
||||||
|
<Analyzer Include="..\packages\xunit.analyzers.1.20.0\analyzers\dotnet\cs\xunit.analyzers.fixes.dll" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
|
|||||||
@@ -25,8 +25,7 @@ namespace BoneSync
|
|||||||
SteamLobbyManager steamLobbyManager = new SteamLobbyManager();
|
SteamLobbyManager steamLobbyManager = new SteamLobbyManager();
|
||||||
|
|
||||||
lobby = steamLobbyManager;
|
lobby = steamLobbyManager;
|
||||||
transport = new SteamTransport(steamLobbyManager);
|
transport = new SteamTransport();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,15 +11,11 @@ namespace BoneSync.Networking.LobbyManager
|
|||||||
{
|
{
|
||||||
public abstract class LobbyManager
|
public abstract class LobbyManager
|
||||||
{
|
{
|
||||||
|
public abstract ulong[] GetPeers();
|
||||||
public abstract ulong GetLobbyId();
|
public abstract ulong GetLobbyId();
|
||||||
public abstract ulong GetHostId();
|
public abstract ulong GetHostId();
|
||||||
public abstract ulong GetLocalId();
|
public abstract ulong GetLocalId();
|
||||||
|
|
||||||
public virtual void CreateLobby()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual void Initialize()
|
public virtual void Initialize()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -10,36 +10,52 @@ namespace BoneSync.Networking.LobbyManager
|
|||||||
{
|
{
|
||||||
internal class SteamLobbyManager : LobbyManager
|
internal class SteamLobbyManager : LobbyManager
|
||||||
{
|
{
|
||||||
public SteamId[] Peers;
|
private Lobby _lobbyInstance;
|
||||||
private Lobby lobbyInstance;
|
public Friend[] LobbyMembers
|
||||||
|
|
||||||
public override ulong GetLocalId()
|
|
||||||
{
|
{
|
||||||
return SteamClient.SteamId.Value;
|
get;
|
||||||
|
private set;
|
||||||
}
|
}
|
||||||
public override ulong GetHostId()
|
public SteamId[] steamIds
|
||||||
{
|
{
|
||||||
return lobbyInstance.Owner.Id;
|
get;
|
||||||
}
|
private set;
|
||||||
public override ulong GetLobbyId()
|
|
||||||
{
|
|
||||||
return lobbyInstance.Id;
|
|
||||||
}
|
|
||||||
public override void CreateLobby()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public SteamId? getPeerFromId(ulong id)
|
public override ulong[] GetPeers() => steamIds.Select(x => x.Value).ToArray();
|
||||||
|
public override ulong GetLocalId() => SteamClient.SteamId.Value;
|
||||||
|
public override ulong GetHostId() => _lobbyInstance.Owner.Id.Value;
|
||||||
|
public override ulong GetLobbyId() => _lobbyInstance.Id.Value;
|
||||||
|
|
||||||
|
private void UpdateLobbyData()
|
||||||
{
|
{
|
||||||
foreach (SteamId peer in Peers)
|
LobbyMembers = _lobbyInstance.Members.ToArray();
|
||||||
{
|
steamIds = LobbyMembers.Select(x => x.Id).ToArray();
|
||||||
if (peer.Value == id)
|
|
||||||
{
|
|
||||||
return peer;
|
|
||||||
}
|
}
|
||||||
|
public override void Initialize()
|
||||||
|
{
|
||||||
|
SteamMatchmaking.OnLobbyCreated += (Result result, Lobby lobby) =>
|
||||||
|
{
|
||||||
|
_lobbyInstance = lobby;
|
||||||
|
UpdateLobbyData();
|
||||||
|
};
|
||||||
|
SteamMatchmaking.OnLobbyEntered += (Lobby lobby) =>
|
||||||
|
{
|
||||||
|
_lobbyInstance = lobby;
|
||||||
|
UpdateLobbyData();
|
||||||
|
};
|
||||||
|
SteamMatchmaking.OnLobbyMemberLeave += (Lobby lobby, Friend friend) =>
|
||||||
|
{
|
||||||
|
if (friend.Id == SteamClient.SteamId)
|
||||||
|
{
|
||||||
|
_lobbyInstance = new Lobby();
|
||||||
}
|
}
|
||||||
return null;
|
UpdateLobbyData();
|
||||||
|
};
|
||||||
|
SteamMatchmaking.OnLobbyMemberJoined += (Lobby lobby, Friend friend) =>
|
||||||
|
{
|
||||||
|
UpdateLobbyData();
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ namespace BoneSync.Networking.Messages
|
|||||||
|
|
||||||
public abstract class NetworkMessage
|
public abstract class NetworkMessage
|
||||||
{
|
{
|
||||||
private static bool _packetTypesRegistered = false;
|
private static bool PacketTypesRegistered => PacketTypeMap.Count > 0;
|
||||||
|
|
||||||
internal static Dictionary<PacketType, Type> PacketTypeMap = new Dictionary<PacketType, Type>();
|
internal static Dictionary<PacketType, Type> PacketTypeMap = new Dictionary<PacketType, Type>();
|
||||||
|
|
||||||
@@ -34,25 +34,26 @@ namespace BoneSync.Networking.Messages
|
|||||||
|
|
||||||
public PacketType GetPacketType()
|
public PacketType GetPacketType()
|
||||||
{
|
{
|
||||||
|
RegisterPacketTypes();
|
||||||
if (_packetType == PacketType.Unknown)
|
if (_packetType == PacketType.Unknown)
|
||||||
{
|
{
|
||||||
Type type = GetType();
|
string typeName = GetType().Name;
|
||||||
_packetType = PacketTypeMap.FirstOrDefault(x => x.Value == type).Key;
|
KeyValuePair<PacketType, Type> found = PacketTypeMap.FirstOrDefault(x => x.Value.Name == typeName);
|
||||||
if (_packetType == PacketType.Unknown)
|
if (found.Value == null)
|
||||||
{
|
{
|
||||||
throw new Exception("Cannot find packetType for " + type.Name);
|
throw new Exception("Cannot find packetType for " + typeName);
|
||||||
}
|
}
|
||||||
|
_packetType = found.Key;
|
||||||
}
|
}
|
||||||
return _packetType;
|
return _packetType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void RegisterPacketTypes()
|
public static void RegisterPacketTypes()
|
||||||
{
|
{
|
||||||
if (_packetTypesRegistered)
|
if (PacketTypesRegistered)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_packetTypesRegistered = true;
|
|
||||||
Assembly assembly = Assembly.GetExecutingAssembly();
|
Assembly assembly = Assembly.GetExecutingAssembly();
|
||||||
Type[] types = assembly.GetTypes();
|
Type[] types = assembly.GetTypes();
|
||||||
foreach (Type type in types)
|
foreach (Type type in types)
|
||||||
@@ -61,7 +62,7 @@ namespace BoneSync.Networking.Messages
|
|||||||
if (type.IsSubclassOf(typeof(NetworkMessage)))
|
if (type.IsSubclassOf(typeof(NetworkMessage)))
|
||||||
{
|
{
|
||||||
PacketType? packetType = type.GetCustomAttributesData().Where(x => x.AttributeType == typeof(PacketTypeAttribute)).Select(x => (PacketType)x.ConstructorArguments[0].Value).FirstOrDefault();
|
PacketType? packetType = type.GetCustomAttributesData().Where(x => x.AttributeType == typeof(PacketTypeAttribute)).Select(x => (PacketType)x.ConstructorArguments[0].Value).FirstOrDefault();
|
||||||
PacketTypeMap.Add((PacketType)packetType, type);
|
PacketTypeMap[packetType.Value] = type;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -75,12 +76,7 @@ namespace BoneSync.Networking.Messages
|
|||||||
}
|
}
|
||||||
Type type = PacketTypeMap[packet.Info.packetType];
|
Type type = PacketTypeMap[packet.Info.packetType];
|
||||||
// get the constructor that takes a Packet
|
// get the constructor that takes a Packet
|
||||||
ConstructorInfo constructor = type.GetConstructor(new Type[] { typeof(Packet) });
|
ConstructorInfo constructor = type.GetConstructor(new Type[] { typeof(Packet) }) ?? throw new Exception("No constructor found for type " + type.Name);
|
||||||
// create an instance of the class
|
|
||||||
if (constructor == null)
|
|
||||||
{
|
|
||||||
throw new Exception("No constructor found for type " + type.Name);
|
|
||||||
}
|
|
||||||
NetworkMessage networkMessage = (NetworkMessage)constructor.Invoke(new object[] { packet });
|
NetworkMessage networkMessage = (NetworkMessage)constructor.Invoke(new object[] { packet });
|
||||||
return networkMessage;
|
return networkMessage;
|
||||||
}
|
}
|
||||||
@@ -95,7 +91,7 @@ namespace BoneSync.Networking.Messages
|
|||||||
}
|
}
|
||||||
public void Broadcast()
|
public void Broadcast()
|
||||||
{
|
{
|
||||||
Send(0);
|
Send(TransportBase.BORADCAST_ID);
|
||||||
}
|
}
|
||||||
public void Send(ulong receiverId)
|
public void Send(ulong receiverId)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using BoneSync.Networking.Messages;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@@ -33,7 +34,6 @@ namespace BoneSync.Networking
|
|||||||
|
|
||||||
private PacketInfo _packetInfo;
|
private PacketInfo _packetInfo;
|
||||||
private byte[] _dataBytes;
|
private byte[] _dataBytes;
|
||||||
private PacketInfo packetInfo;
|
|
||||||
|
|
||||||
public Packet(PacketInfo packetInfo, byte[] data)
|
public Packet(PacketInfo packetInfo, byte[] data)
|
||||||
{
|
{
|
||||||
@@ -45,21 +45,34 @@ namespace BoneSync.Networking
|
|||||||
{
|
{
|
||||||
ByteEncoder byteEncoder = new ByteEncoder();
|
ByteEncoder byteEncoder = new ByteEncoder();
|
||||||
byteEncoder.WriteBytes(bytes);
|
byteEncoder.WriteBytes(bytes);
|
||||||
PacketInfo packetInfo = new PacketInfo(byteEncoder.ReadInt(), byteEncoder.ReadUlong(), byteEncoder.ReadUlong(), (PacketType)byteEncoder.ReadInt());
|
|
||||||
|
int packetType = byteEncoder.ReadInt();
|
||||||
|
int id = byteEncoder.ReadInt();
|
||||||
|
ulong senderId = byteEncoder.ReadUlong();
|
||||||
|
ulong receiverId = byteEncoder.ReadUlong();
|
||||||
|
|
||||||
|
PacketInfo packetInfo = new PacketInfo(id, senderId, receiverId, (PacketType)packetType);
|
||||||
return new Packet(packetInfo, byteEncoder.ToArray());
|
return new Packet(packetInfo, byteEncoder.ToArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] ToBytes()
|
public byte[] ToBytes()
|
||||||
{
|
{
|
||||||
ByteEncoder byteEncoder = new ByteEncoder();
|
ByteEncoder byteEncoder = new ByteEncoder();
|
||||||
byteEncoder.WriteInt(packetInfo.id);
|
byteEncoder.WriteInt((int)_packetInfo.packetType);
|
||||||
byteEncoder.WriteUlong(packetInfo.senderId);
|
byteEncoder.WriteInt(_packetInfo.id);
|
||||||
byteEncoder.WriteUlong(packetInfo.receiverId);
|
byteEncoder.WriteUlong(_packetInfo.senderId);
|
||||||
byteEncoder.WriteInt((int)packetInfo.packetType);
|
byteEncoder.WriteUlong(_packetInfo.receiverId);
|
||||||
byteEncoder.WriteBytes(_dataBytes);
|
byteEncoder.WriteBytes(_dataBytes);
|
||||||
return byteEncoder.ToArray();
|
return byteEncoder.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool OnPacketReceived(Packet packet)
|
||||||
|
{
|
||||||
|
NetworkMessage networkMessage = NetworkMessage.ParsePacket(packet);
|
||||||
|
networkMessage.Execute();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public byte[] Data => _dataBytes;
|
public byte[] Data => _dataBytes;
|
||||||
|
|
||||||
public static int GenerateId()
|
public static int GenerateId()
|
||||||
@@ -77,15 +90,21 @@ namespace BoneSync.Networking
|
|||||||
|
|
||||||
byte[] randomDataBytes = new byte[1024];
|
byte[] randomDataBytes = new byte[1024];
|
||||||
random.NextBytes(randomDataBytes);
|
random.NextBytes(randomDataBytes);
|
||||||
PacketInfo originalPacketInfo = new PacketInfo(1, 2, 3, PacketType.LobbyInfo);
|
PacketInfo originalPacketInfo = new PacketInfo(Packet.GenerateId(), 1, 2, PacketType.LobbyInfo);
|
||||||
Packet originalPacket = new Packet(originalPacketInfo, randomDataBytes);
|
Packet originalPacket = new Packet(originalPacketInfo, randomDataBytes);
|
||||||
|
|
||||||
byte[] bytes = originalPacket.ToBytes();
|
byte[] bytes = originalPacket.ToBytes();
|
||||||
|
|
||||||
Packet parsedPacket = Packet.FromBytes(bytes);
|
Packet parsedPacket = Packet.FromBytes(bytes);
|
||||||
Assert.Equal(originalPacket.Info, parsedPacket.Info);
|
|
||||||
|
Assert.Equal(originalPacket.Info.id, parsedPacket.Info.id);
|
||||||
|
Assert.Equal(originalPacket.Info.senderId, parsedPacket.Info.senderId);
|
||||||
|
Assert.Equal(originalPacket.Info.receiverId, parsedPacket.Info.receiverId);
|
||||||
|
Assert.Equal(originalPacket.Info.packetType, parsedPacket.Info.packetType);
|
||||||
|
|
||||||
Assert.Equal(originalPacket.Data, parsedPacket.Data);
|
Assert.Equal(originalPacket.Data, parsedPacket.Data);
|
||||||
|
|
||||||
|
|
||||||
Assert.Equal(randomDataBytes, parsedPacket.Data);
|
Assert.Equal(randomDataBytes, parsedPacket.Data);
|
||||||
Assert.NotEqual(bytes, randomDataBytes);
|
Assert.NotEqual(bytes, randomDataBytes);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,62 +1,82 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Net.Sockets;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using BoneSync.Networking.LobbyManager;
|
using BoneSync.Networking.LobbyManager;
|
||||||
using Facepunch.Steamworks;
|
using Facepunch.Steamworks;
|
||||||
using Facepunch.Steamworks.Data;
|
using Facepunch.Steamworks.Data;
|
||||||
|
using MelonLoader;
|
||||||
|
|
||||||
namespace BoneSync.Networking.Transport
|
namespace BoneSync.Networking.Transport
|
||||||
{
|
{
|
||||||
internal class SteamTransport : TransportBase
|
internal class SteamTransport : TransportBase
|
||||||
{
|
{
|
||||||
SteamLobbyManager _instance;
|
|
||||||
public override event Action<Packet> OnReceive;
|
|
||||||
|
|
||||||
public SteamTransport(SteamLobbyManager lobbyManager)
|
public SteamTransport()
|
||||||
{
|
{
|
||||||
SteamNetworking.OnP2PSessionRequest += OnP2PSessionRequest;
|
SteamNetworking.OnP2PSessionRequest += OnP2PSessionRequest;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnP2PSessionRequest(SteamId steamId)
|
private void OnP2PSessionRequest(SteamId steamId)
|
||||||
{
|
{
|
||||||
|
MelonLogger.Msg("P2P Request from " + steamId);
|
||||||
|
if (BoneSync.lobby.GetPeers().Contains(steamId))
|
||||||
SteamNetworking.AcceptP2PSessionWithUser(steamId);
|
SteamNetworking.AcceptP2PSessionWithUser(steamId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ProcessPacket(P2Packet steamPacket)
|
private void ProcessPacket(P2Packet steamPacket)
|
||||||
{
|
{
|
||||||
Packet packet = Packet.FromBytes(steamPacket.Data);
|
Packet packet = Packet.FromBytes(steamPacket.Data);
|
||||||
bool isTarget = packet.Info.receiverId == 0 || packet.Info.receiverId == _instance.GetLocalId();
|
bool isTarget = packet.Info.receiverId == BORADCAST_ID || packet.Info.receiverId == BoneSync.lobby.GetLocalId();
|
||||||
if (isTarget)
|
if (isTarget)
|
||||||
{
|
{
|
||||||
OnReceive?.Invoke(packet);
|
Packet.OnPacketReceived(packet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public override bool Tick()
|
public override bool Tick()
|
||||||
{
|
{
|
||||||
|
int processed = 0;
|
||||||
while (SteamNetworking.IsP2PPacketAvailable())
|
while (SteamNetworking.IsP2PPacketAvailable())
|
||||||
{
|
{
|
||||||
P2Packet packet = (P2Packet)SteamNetworking.ReadP2PPacket();
|
P2Packet? packet = SteamNetworking.ReadP2PPacket();
|
||||||
ProcessPacket(packet);
|
if (!packet.HasValue) continue;
|
||||||
|
ProcessPacket(packet.Value);
|
||||||
|
processed++;
|
||||||
}
|
}
|
||||||
return true;
|
return processed > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendP2P(SteamId peer, byte[] data)
|
||||||
|
{
|
||||||
|
if (peer == BoneSync.lobby.GetLocalId())
|
||||||
|
{
|
||||||
|
//MelonLogger.Msg("Trying to send packet to self");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SteamNetworking.SendP2PPacket(peer, data, data.Length, 0, P2PSend.Reliable);
|
||||||
}
|
}
|
||||||
public override void Send(Packet packet)
|
public override void Send(Packet packet)
|
||||||
{
|
{
|
||||||
if (packet.Info.receiverId == 0)
|
LobbyManager.LobbyManager _instance = BoneSync.lobby;
|
||||||
|
if (_instance == null)
|
||||||
{
|
{
|
||||||
foreach (SteamId peer in _instance.Peers)
|
MelonLogger.Msg("Lobby instance is null");
|
||||||
{
|
return;
|
||||||
byte[] packetBytes = packet.ToBytes();
|
|
||||||
SteamNetworking.SendP2PPacket(peer, packetBytes, packetBytes.Length, 0, P2PSend.Reliable);
|
|
||||||
}
|
}
|
||||||
|
if (packet.Info.receiverId == BORADCAST_ID)
|
||||||
|
{
|
||||||
|
foreach (SteamId peer in _instance.GetPeers())
|
||||||
|
{
|
||||||
|
SendP2P(peer, packet.ToBytes());
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SteamId peer = (SteamId)_instance.getPeerFromId(packet.Info.receiverId);
|
SendP2P(packet.Info.receiverId, packet.ToBytes());
|
||||||
SteamNetworking.SendP2PPacket(peer, packet.ToBytes(), packet.ToBytes().Length, 0, P2PSend.Reliable);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ namespace BoneSync.Networking.Transport
|
|||||||
{
|
{
|
||||||
public abstract class TransportBase
|
public abstract class TransportBase
|
||||||
{
|
{
|
||||||
|
public const int BORADCAST_ID = 0;
|
||||||
public abstract void Send(Packet packet);
|
public abstract void Send(Packet packet);
|
||||||
public abstract bool Tick();
|
public abstract bool Tick();
|
||||||
|
|
||||||
public abstract event Action<Packet> OnReceive;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="Microsoft.TestPlatform.ObjectModel" version="17.12.0" targetFramework="net472" />
|
<package id="Microsoft.TestPlatform.ObjectModel" version="17.12.0" targetFramework="net472" />
|
||||||
|
<package id="MSTest.Analyzers" version="3.8.2" targetFramework="net472" developmentDependency="true" />
|
||||||
|
<package id="MSTest.TestFramework" version="3.8.2" targetFramework="net472" />
|
||||||
<package id="System.Collections.Immutable" version="1.5.0" targetFramework="net472" />
|
<package id="System.Collections.Immutable" version="1.5.0" targetFramework="net472" />
|
||||||
<package id="System.Reflection.Metadata" version="1.6.0" targetFramework="net472" />
|
<package id="System.Reflection.Metadata" version="1.6.0" targetFramework="net472" />
|
||||||
<package id="xunit" version="2.9.3" targetFramework="net472" />
|
<package id="xunit" version="2.9.3" targetFramework="net472" />
|
||||||
<package id="xunit.abstractions" version="2.0.3" targetFramework="net472" />
|
<package id="xunit.abstractions" version="2.0.3" targetFramework="net472" />
|
||||||
<package id="xunit.analyzers" version="1.18.0" targetFramework="net472" developmentDependency="true" />
|
<package id="xunit.analyzers" version="1.20.0" targetFramework="net472" developmentDependency="true" />
|
||||||
<package id="xunit.assert" version="2.9.3" targetFramework="net472" />
|
<package id="xunit.assert" version="2.9.3" targetFramework="net472" />
|
||||||
<package id="xunit.core" version="2.9.3" targetFramework="net472" />
|
<package id="xunit.core" version="2.9.3" targetFramework="net472" />
|
||||||
<package id="xunit.extensibility.core" version="2.9.3" targetFramework="net472" />
|
<package id="xunit.extensibility.core" version="2.9.3" targetFramework="net472" />
|
||||||
|
|||||||
@@ -26,9 +26,13 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Content Include="steam_api64.dll" PackagePath="\content\" Pack="true" PackageCopyToOutput="true">
|
<None Remove="steam_api.dll" />
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
</ItemGroup>
|
||||||
</Content>
|
|
||||||
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Include="steam_api64.dll" PackagePath="\content\" Pack="true" PackageCopyToOutput="true">
|
||||||
|
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
<None Include="Facepunch.Steamworks.jpg" Pack="true" PackagePath="\" />
|
<None Include="Facepunch.Steamworks.jpg" Pack="true" PackagePath="\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
17
testEnvironments.json
Normal file
17
testEnvironments.json
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"version": "1",
|
||||||
|
"environments": [
|
||||||
|
// See https://aka.ms/remotetesting for more details
|
||||||
|
// about how to configure remote environments.
|
||||||
|
//{
|
||||||
|
// "name": "WSL Ubuntu",
|
||||||
|
// "type": "wsl",
|
||||||
|
// "wslDistribution": "Ubuntu"
|
||||||
|
//},
|
||||||
|
//{
|
||||||
|
// "name": "Docker dotnet/sdk",
|
||||||
|
// "type": "docker",
|
||||||
|
// "dockerImage": "mcr.microsoft.com/dotnet/sdk"
|
||||||
|
//}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user