
이 프로젝트는 Steam에서 Original steam_api.dll Steam으로 대체하여 LAN 모드에서 게임을 할 수 있도록 연결을 모방하기 위해 만들어졌습니다. 이것은 Steamworks.Net 또는 Facepunch 와 같은 Steamworks 래퍼가 아닙니다. 프로젝트는 초기 단계에 있으므로 일부 게임의 경우 아직 기능하지 않습니다.
얼마 전 개인적 문제로 인해 저장소를 업데이트 할 수 없었기 때문에 개발과 협력하려는 사람들은 환영합니다.

프로젝트를 컴파일 할 때 다른 대상 플랫폼에 대한 DLL을 포함하는 두 개의 폴더가 생성됩니다 (x64 및 x86). x64의 경우 파일 이름을 steam_api64.dll로 바꿔야합니다. 게임의 스팀 연결을 모방하려면 DLL을 게임을 포함하는 것과 교체해야합니다. 게임 엔진이 Unity 인 경우 DLL을 CSTEAMWORKS.DLL로 바꾸고 교체 할 수 있습니다.
클라이언트를 사용하려면 게임을 추가하고 AppID를 구성하면됩니다. 고객은 현재 개발 중입니다.
? 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
콜백 시스템 구현.
x86 게임에서 steaminternal_contextinit
설정에서 파일 로그 옵션 SI가 활성화되면 다음 이름 [SKYNET] steam_api.log 가있는 "root 게임 폴더/skynet"폴더 내부 로그 파일이 생성됩니다.
플러그인 시스템은 게임과 게임 코디네이터 간의 통신을 설정하기 위해 개발되었습니다. 다음 예제는 기본 플러그인을 보여줍니다.
게임 코디네이터 플러그인 인터페이스 :
namespace SKYNET . Plugin
{
public interface IGameCoordinatorPlugin
{
uint Initialize ( ) ;
void MessageFromGame ( byte [ ] bytes ) ;
EventHandler < Dictionary < uint , byte [ ] > > IsMessageAvailable { get ; set ; }
}
}게임 코디네이터 플러그인 예 :
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 ) ;
}
}
}