mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-12-11 20:15:10 +01:00
the horror and misery of including game libraries in a folder (and further transport implementation)
This commit is contained in:
parent
85bf9be226
commit
4ebf9ea5ae
@ -1,12 +1,11 @@
|
||||
using Mirror;
|
||||
using HarmonyLib;
|
||||
using Mirror;
|
||||
using Steamworks;
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using IDisposable = Delaunay.Utils.IDisposable;
|
||||
|
||||
namespace SteamTransport;
|
||||
|
||||
public class Client : IDisposable
|
||||
public class Client
|
||||
{
|
||||
private SteamTransport _transport;
|
||||
private Steamworks.Callback<SteamNetConnectionStatusChangedCallback_t> _onStatusChanged;
|
||||
@ -34,6 +33,8 @@ public class Client : IDisposable
|
||||
case ESteamNetworkingConnectionState.k_ESteamNetworkingConnectionState_ClosedByPeer:
|
||||
case ESteamNetworkingConnectionState.k_ESteamNetworkingConnectionState_ProblemDetectedLocally:
|
||||
_transport.OnClientError(TransportError.ConnectionClosed, $"end = {(ESteamNetConnectionEnd)t.m_info.m_eEndReason} {t.m_info.m_szEndDebug}");
|
||||
IsConnecting = false;
|
||||
IsConnected = false;
|
||||
break;
|
||||
}
|
||||
});
|
||||
@ -47,8 +48,9 @@ public class Client : IDisposable
|
||||
|
||||
public void Connect(string address)
|
||||
{
|
||||
var ipAddr = new SteamNetworkingIPAddr();
|
||||
var parsed = ipAddr.ParseString(address);
|
||||
address = "127.0.0.1:1234";
|
||||
var steamAddr = new SteamNetworkingIPAddr();
|
||||
var parsed = steamAddr.ParseString(address);
|
||||
if (!parsed)
|
||||
{
|
||||
_transport.OnClientError(TransportError.DnsResolve, $"couldnt parse address {address} when connect");
|
||||
@ -56,24 +58,31 @@ public class Client : IDisposable
|
||||
}
|
||||
|
||||
_transport.Log($"connecting to {address}");
|
||||
_conn = SteamNetworkingSockets.ConnectByIPAddress(ref ipAddr, 0, new SteamNetworkingConfigValue_t[0]);
|
||||
_conn = SteamNetworkingSockets.ConnectByIPAddress(ref steamAddr, 0, new SteamNetworkingConfigValue_t[0]);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
public void Send(ArraySegment<byte> segment, int channelId)
|
||||
{
|
||||
_onStatusChanged.Dispose();
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void RecieveData()
|
||||
{
|
||||
var ppOutMessages = new IntPtr[10];
|
||||
SteamNetworkingSockets.ReceiveMessagesOnConnection(_conn, ppOutMessages, 10);
|
||||
|
||||
foreach (var ppOutMessage in ppOutMessages)
|
||||
const int maxMessages = 10;
|
||||
var ppOutMessages = new IntPtr[maxMessages];
|
||||
var numMessages = SteamNetworkingSockets.ReceiveMessagesOnConnection(_conn, ppOutMessages, maxMessages);
|
||||
for (var i = 0; i < numMessages; i++)
|
||||
{
|
||||
var msg = Marshal.PtrToStructure<SteamNetworkingMessage_t>(ppOutMessage);
|
||||
// do joe
|
||||
msg.Release();
|
||||
var ppOutMessage = ppOutMessages[i];
|
||||
unsafe
|
||||
{
|
||||
var msg = *(SteamNetworkingMessage_t*)ppOutMessage; // probably not gonna work
|
||||
var data = new ArraySegment<byte>(new Span<byte>((byte*)msg.m_pData, msg.m_cbSize).ToArray());
|
||||
var channel = Util.SendFlag2MirrorChannel(msg.m_nFlags);
|
||||
_transport.Log($"received data {data.Join()}");
|
||||
_transport.OnClientDataReceived(data, channel);
|
||||
msg.Release();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -82,8 +91,10 @@ public class Client : IDisposable
|
||||
SteamNetworkingSockets.FlushMessagesOnConnection(_conn);
|
||||
}
|
||||
|
||||
public void Send(ArraySegment<byte> segment, int channelId)
|
||||
public void Close()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
// SteamNetworkingSockets.CloseConnection(_conn, )
|
||||
|
||||
_onStatusChanged.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
using Steamworks;
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Threading;
|
||||
|
||||
namespace SteamTransport;
|
||||
@ -66,59 +67,47 @@ public static class Program
|
||||
|
||||
private static void DoServer()
|
||||
{
|
||||
using var cb = Steamworks.Callback<SteamNetConnectionStatusChangedCallback_t>.Create(t =>
|
||||
{
|
||||
Console.WriteLine($"{t.m_info.m_szConnectionDescription} | state = {t.m_info.m_eState} | {(ESteamNetConnectionEnd)t.m_info.m_eEndReason} {t.m_info.m_szEndDebug}");
|
||||
var transport = new SteamTransport();
|
||||
transport.Log = Console.WriteLine;
|
||||
transport.UseLocalhost = true;
|
||||
|
||||
// requesting connection, automatically allow
|
||||
if (t.m_info.m_eState == ESteamNetworkingConnectionState.k_ESteamNetworkingConnectionState_Connecting)
|
||||
transport.ServerStart();
|
||||
|
||||
try
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
SteamNetworkingSockets.AcceptConnection(t.m_hConn);
|
||||
transport.ServerEarlyUpdate();
|
||||
transport.ServerLateUpdate();
|
||||
Thread.Sleep(10);
|
||||
}
|
||||
});
|
||||
|
||||
var address = new SteamNetworkingIPAddr();
|
||||
address.ParseString("0.0.0.0:1234");
|
||||
address.ToString(out var addressStr, true);
|
||||
var socket = SteamNetworkingSockets.CreateListenSocketIP(ref address, 0, new SteamNetworkingConfigValue_t[0]);
|
||||
Console.WriteLine($"listening on {addressStr}...");
|
||||
|
||||
while (true)
|
||||
}
|
||||
finally
|
||||
{
|
||||
SteamAPI.RunCallbacks();
|
||||
Thread.Sleep(10);
|
||||
transport.ServerStop();
|
||||
}
|
||||
}
|
||||
|
||||
private static void DoClient()
|
||||
{
|
||||
using var cb = Steamworks.Callback<SteamNetConnectionStatusChangedCallback_t>.Create(t =>
|
||||
{
|
||||
Console.WriteLine($"{t.m_info.m_szConnectionDescription} | state = {t.m_info.m_eState} | {(ESteamNetConnectionEnd)t.m_info.m_eEndReason} {t.m_info.m_szEndDebug}");
|
||||
});
|
||||
var transport = new SteamTransport();
|
||||
transport.Log = Console.WriteLine;
|
||||
transport.UseLocalhost = true;
|
||||
|
||||
var address = new SteamNetworkingIPAddr();
|
||||
address.ParseString("127.0.0.1:1234");
|
||||
address.ToString(out var addressStr, true);
|
||||
Console.WriteLine($"is localhost = {address.IsLocalHost()}");
|
||||
var conn = SteamNetworkingSockets.ConnectByIPAddress(ref address, 1, new SteamNetworkingConfigValue_t[]
|
||||
transport.ClientConnect("unused");
|
||||
|
||||
try
|
||||
{
|
||||
new SteamNetworkingConfigValue_t
|
||||
while (true)
|
||||
{
|
||||
m_eValue = ESteamNetworkingConfigValue.k_ESteamNetworkingConfig_IP_AllowWithoutAuth,
|
||||
m_eDataType = ESteamNetworkingConfigDataType.k_ESteamNetworkingConfig_Int32,
|
||||
m_val = new SteamNetworkingConfigValue_t.OptionValue
|
||||
{
|
||||
m_int32 = 1,
|
||||
}
|
||||
transport.ClientEarlyUpdate();
|
||||
transport.ClientLateUpdate();
|
||||
Thread.Sleep(10);
|
||||
}
|
||||
});
|
||||
Console.WriteLine($"connecting to {addressStr}...");
|
||||
|
||||
while (true)
|
||||
}
|
||||
finally
|
||||
{
|
||||
SteamAPI.RunCallbacks();
|
||||
Thread.Sleep(10);
|
||||
transport.ClientDisconnect();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,10 +1,9 @@
|
||||
using Steamworks;
|
||||
using System;
|
||||
using IDisposable = Delaunay.Utils.IDisposable;
|
||||
|
||||
namespace SteamTransport;
|
||||
|
||||
public class Server : IDisposable
|
||||
public class Server
|
||||
{
|
||||
private SteamTransport _transport;
|
||||
private Steamworks.Callback<SteamNetConnectionStatusChangedCallback_t> _onStatusChanged;
|
||||
@ -23,8 +22,8 @@ public class Server : IDisposable
|
||||
{
|
||||
case ESteamNetworkingConnectionState.k_ESteamNetworkingConnectionState_Connecting:
|
||||
SteamNetworkingSockets.GetConnectionInfo(t.m_hConn, out var pInfo);
|
||||
pInfo.m_addrRemote.ToString(out var addr, true);
|
||||
_transport.Log($"accepting conn from {addr}");
|
||||
pInfo.m_addrRemote.ToString(out var address, true);
|
||||
_transport.Log($"accepting conn from {address}");
|
||||
|
||||
// ignore max connections for now
|
||||
SteamNetworkingSockets.AcceptConnection(t.m_hConn);
|
||||
@ -33,32 +32,38 @@ public class Server : IDisposable
|
||||
});
|
||||
}
|
||||
|
||||
public bool Listening { get; set; }
|
||||
public bool IsListening;
|
||||
private HSteamListenSocket _listenSocket;
|
||||
|
||||
public void Dispose()
|
||||
public void StartListening()
|
||||
{
|
||||
_onStatusChanged.Dispose();
|
||||
}
|
||||
|
||||
public void RecieveData()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void Flush()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
var address = "0.0.0.0:1234";
|
||||
var steamAddr = new SteamNetworkingIPAddr();
|
||||
steamAddr.ParseString(address);
|
||||
_listenSocket = SteamNetworkingSockets.CreateListenSocketIP(ref steamAddr, 0, new SteamNetworkingConfigValue_t[0]);
|
||||
_transport.Log($"listening on {address}");
|
||||
IsListening = true;
|
||||
}
|
||||
|
||||
public void Send(int connectionId, ArraySegment<byte> segment, int channelId) { }
|
||||
|
||||
public void Disconnect(int connectionId)
|
||||
public void RecieveData()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void StartListening()
|
||||
public void Flush()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void Disconnect(int connectionId)
|
||||
{
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
SteamNetworkingSockets.CloseListenSocket(_listenSocket);
|
||||
_transport.Log("stop server");
|
||||
|
||||
_onStatusChanged.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,4 +1,8 @@
|
||||
using Mirror;
|
||||
// https://github.com/MirrorNetworking/Mirror/blob/master/Assets/Mirror/Core/Transport.cs
|
||||
// https://partner.steamgames.com/doc/api/ISteamNetworkingSockets
|
||||
// https://partner.steamgames.com/doc/api/steamnetworkingtypes
|
||||
|
||||
using Mirror;
|
||||
using Steamworks;
|
||||
using System;
|
||||
|
||||
@ -10,6 +14,10 @@ public class SteamTransport : Transport
|
||||
private Client _client;
|
||||
|
||||
public Action<string> Log;
|
||||
/// <summary>
|
||||
/// use localhost port 1234 instead of steam p2p
|
||||
/// </summary>
|
||||
public bool UseLocalhost;
|
||||
|
||||
public override bool Available() => true;
|
||||
|
||||
@ -33,7 +41,7 @@ public class SteamTransport : Transport
|
||||
|
||||
public override Uri ServerUri() => throw new NotImplementedException("shouldnt be used");
|
||||
|
||||
public override bool ServerActive() => _server != null && _server.Listening;
|
||||
public override bool ServerActive() => _server != null && _server.IsListening;
|
||||
|
||||
public override void ServerStart()
|
||||
{
|
||||
@ -64,12 +72,12 @@ public class SteamTransport : Transport
|
||||
{
|
||||
if (_client != null)
|
||||
{
|
||||
_client.Dispose();
|
||||
_client.Close();
|
||||
_client = null;
|
||||
}
|
||||
if (_server != null)
|
||||
{
|
||||
_server.Dispose();
|
||||
_server.Close();
|
||||
_server = null;
|
||||
}
|
||||
}
|
||||
|
||||
@ -11,17 +11,16 @@
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="OuterWildsGameLibs" Version="1.1.14.768" IncludeAssets="compile" />
|
||||
<PackageReference Include="OWML" Version="2.11.1" IncludeAssets="compile" />
|
||||
<Reference Include="..\Lib\*.dll" />
|
||||
<Reference Include="..\standaloneLibs\*.dll" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\Lib\*.dll">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="steam_api64.dll">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\QSB\QSB.csproj" />
|
||||
</ItemGroup>
|
||||
<Target Name="copy standalone dlls to unity" AfterTargets="PostBuildEvent">
|
||||
<ItemGroup>
|
||||
<_Files Remove="@(_Files)" />
|
||||
<_Files Include="..\Lib\*.dll" />
|
||||
<_Files Include="..\standaloneLibs\*.dll" />
|
||||
</ItemGroup>
|
||||
<Copy SourceFiles="@(_Files)" DestinationFolder="$(OutputPath)" />
|
||||
</Target>
|
||||
</Project>
|
||||
|
||||
22
SteamTransport/Util.cs
Normal file
22
SteamTransport/Util.cs
Normal file
@ -0,0 +1,22 @@
|
||||
using Mirror;
|
||||
using Steamworks;
|
||||
using System;
|
||||
|
||||
namespace SteamTransport;
|
||||
|
||||
public static class Util
|
||||
{
|
||||
public static int SendFlag2MirrorChannel(int sendFlag) => sendFlag switch
|
||||
{
|
||||
Constants.k_nSteamNetworkingSend_Reliable => Channels.Reliable,
|
||||
Constants.k_nSteamNetworkingSend_Unreliable => Channels.Unreliable,
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(sendFlag), sendFlag, null)
|
||||
};
|
||||
|
||||
public static int MirrorChannel2SendFlag(int mirrorChannel) => mirrorChannel switch
|
||||
{
|
||||
Channels.Reliable => Constants.k_nSteamNetworkingSend_Reliable,
|
||||
Channels.Unreliable => Constants.k_nSteamNetworkingSend_Unreliable,
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(mirrorChannel), mirrorChannel, null)
|
||||
};
|
||||
}
|
||||
BIN
SteamTransport/standaloneLibs/UnityEngine.CoreModule.dll
Normal file
BIN
SteamTransport/standaloneLibs/UnityEngine.CoreModule.dll
Normal file
Binary file not shown.
BIN
SteamTransport/standaloneLibs/mscorlib.dll
Normal file
BIN
SteamTransport/standaloneLibs/mscorlib.dll
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user