
Dieses Projekt wird mit dem Ziel erstellt, den ursprünglichen steam_api.dll aus Steam durch diesen zu ersetzen und so eine Verbindung zu emulieren, um Spiele im LAN -Modus abzuspielen. Dies ist kein Steamworks -Wrapper wie Steamworks.Net oder Facepunch . Das Projekt befindet sich in einer Anfangsphase, daher ist es für einige Spiele noch nicht funktionsfähig.
Vor einiger Zeit konnte ich das Repository aufgrund persönlicher Probleme nicht aktualisieren. Diejenigen, die mit der Entwicklung zusammenarbeiten möchten, sind willkommen

Beim Kompilieren des Projekts werden zwei Ordner erzeugt (x64 und x86), die die DLL für eine andere Zielplattform enthalten. Im Fall von x64 müssen Sie die Datei in Steam_api64.dll umbenennen, um die Verbindung zu DAMP eines Spiels zu emulieren. Sie müssen die DLL durch das Spiel ersetzen, das das Spiel enthält. Falls die Game Engine eine Einheit ist, können Sie die DLL in csteamworks.dll umbenennen und ersetzen.
Um den Client zu verwenden, müssen Sie lediglich das Spiel hinzufügen und den Appid konfigurieren. Der Kunde befindet sich derzeit in der Entwicklung.
? Root client folder
├──? x64 // The x64 version of the SteamAPI dll that will be injected
├──? x86 // The x64 version of the SteamAPI dll that will be injected
└──? Data
├──? Assemblies // Contains client libraries (Including cefsharp api or gecko)
├──? Images // Contains app cache and avatar images
├──? Injector // Contains the DLL injectors
├──? www // Contains the web files
├──? Storage // Contains stats and achievements files
| └──? Remote // Contains game files
└──? Games.bin // Stored game list
? Root server folder
└──? Data
├──? Assemblies // Contains server libraries
├──? Images // Contains app cache and avatar images
├──? MongoDB // Contains local MongoDB server
└──? Storage // Contains some server files
User Stats manager Save and Load user stats from local folder.
Achievements manager Save and Load user achievements from local folder.
CSteamworks emulation Rename the emu to CSteamworks.dll to emulate them.
Supported Game Engines Works with multiple game engines like Source 2, Unity 3D etc.
Network communication Network communication between clients through a configurable port.
Overlay External Overlay for steam and game messages.
DLC Unlock all downloaded DLCs.
Avatar support Load avatar from file (Avatar.jpg) inside SKYNET folder and share it through the network.
Plugin system Load external plugin to communicate with the emu.
In game voice Fully functional voice system
Rückrufsystem -Implementierung.
SteamInternal_Contextinit in x86 -Spielen
Wenn die Dateiprotokolloption SI in Einstellungen aktiviert ist, wird eine Protokolldatei im Ordner "Root Game Ordner/SkyNet" mit dem folgenden Namen [SKYNET] steam_api.log erstellt
Das Plugin -System wird entwickelt, um eine Kommunikation zwischen dem Spiel und dem Spielkoordinator festzulegen. Das folgende Beispiel zeigt ein grundlegendes Plugin.
Schnittstelle für Spielkoordinator -Plugin:
namespace SKYNET . Plugin
{
public interface IGameCoordinatorPlugin
{
uint Initialize ( ) ;
void MessageFromGame ( byte [ ] bytes ) ;
EventHandler < Dictionary < uint , byte [ ] > > IsMessageAvailable { get ; set ; }
}
}Spielkoordinator -Plugin Beispiel:
namespace SKYNET . Plugin
{
public class Dota2GameCoordinator : IGameCoordinatorPlugin
{
private uint AppID = 570 ;
public EventHandler < Dictionary < uint , byte [ ] > > IsMessageAvailable { get ; set ; }
public uint Initialize ( )
{
// TODO: Initialize all Game coordinator class
return AppID ;
}
public void MessageFromGame ( byte [ ] bytes )
{
// Process message from game
uint MsgType = MsgUtil . GetGCMsg ( new MemoryStream ( bytes ) . ReadUInt32L ( ) ) ;
IPacketGCMsg packetGCMsg = MsgUtil . GetPacketGcMsg ( MsgType , bytes ) ;
// TODO: Process GC message
}
public void SendPacketToGame ( uint msgType , byte [ ] packet )
{
Dictionary < uint , byte [ ] > message = new Dictionary < uint , byte [ ] > ( ) ;
message . Add ( msgType , packet ) ;
IsMessageAvailable ? . Invoke ( this , message ) ;
}
public void SendPacketToGame ( Dictionary < uint , byte [ ] > messages )
{
IsMessageAvailable ? . Invoke ( this , messages ) ;
}
}
}