
Ce projet est créé dans le but de remplacer le steam_api.dll origine_api.dll de Steam par celui-ci et d'émuler ainsi une connexion pour pouvoir jouer à des jeux en mode LAN. Ce n'est pas un wrapper Steamworks comme Steamworks.Net ou Facepunch . Le projet est à une étape initiale, il n'est donc pas encore fonctionnel pour certains jeux.
Il y a quelque temps, je n'ai pas pu mettre à jour le référentiel en raison de problèmes personnels, donc ceux qui souhaitent collaborer avec le développement sont les bienvenus

Lors de la compilation du projet, deux dossiers sont générés (x64 et x86) qui contiennent la DLL pour une plate-forme cible différente, dans le cas de x64, vous devez renommer le fichier vers Steam_API64.dll, pour imiter la connexion à la vapeur d'un jeu, vous devez remplacer la DLL par celle qui contient le jeu. Dans le cas où le moteur de jeu est unité, vous pouvez renommer la DLL à csteamworks.dll et la remplacer.
Pour utiliser le client, vous avez simplement besoin d'ajouter le jeu et de configurer l'apprid. Le client est actuellement en cours de développement.
? 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
Implémentation du système de rappel.
Steaminternal_contextinit dans x86 jeux
Lorsque l'option de journal des fichiers a activé dans les paramètres, un fichier journal sera créé dans le dossier "Root Game Folder / SkyNet" avec le nom suivant [SKYNET] steam_api.log
Le système de plugin est développé afin d'établir une communication entre le jeu et le coordinateur du jeu, l'exemple suivant montre un plugin de base.
Interface pour le plugin de coordinateur de jeu:
namespace SKYNET . Plugin
{
public interface IGameCoordinatorPlugin
{
uint Initialize ( ) ;
void MessageFromGame ( byte [ ] bytes ) ;
EventHandler < Dictionary < uint , byte [ ] > > IsMessageAvailable { get ; set ; }
}
}Exemple de plugin de coordinateur de jeu:
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 ) ;
}
}
}