SA-MP/saco/main.cpp

362 lines
7.4 KiB
C++
Raw Normal View History

2023-10-20 06:46:57 +08:00
#include "main.h"
2023-12-01 18:31:52 +08:00
#include "game/util.h"
2023-10-20 06:46:57 +08:00
2023-11-15 18:46:57 +08:00
int iGtaVersion=0;
GAME_SETTINGS tSettings;
2023-12-01 18:31:52 +08:00
CHAR szArtworkProxy[MAX_PATH+1];
CHAR szConfigFile[MAX_PATH+1];
CHAR byte_1026E710[256]; // unused
CHAR szChatLogFile[MAX_PATH+1];
2023-12-01 18:31:52 +08:00
CHAR szSAMPDir[MAX_PATH+1];
CHAR szCacheDir[MAX_PATH+1];
CConfig *pConfig=0;
CChatWindow *pChatWindow=0;
CCmdWindow *pCmdWindow=0;
CDeathWindow *pDeathWindow=0;
CAudioStream *pAudioStream=0;
//DWORD dword_1026EB90=0;
CNetGame *pNetGame=0;
//DWORD dword_1026EB98=0;
CFontRender *pDefaultFont=0;
//DWORD dword_1026EBA0=0;
//DWORD dword_1026EBA4=0;
//DWORD dword_1026EBA8=0;
BOOL bGameInited=FALSE;
IDirect3D9 *pD3D;
IDirect3DDevice9 *pD3DDevice = NULL;
2023-10-20 06:46:57 +08:00
HANDLE hInstance=0;
2023-10-19 08:02:18 +08:00
2024-02-16 22:23:35 +08:00
bool bShowDebugLabels = false;
2023-11-23 23:41:28 +08:00
CGame *pGame=0;
DWORD dwGraphicsLoop=0;
2023-10-23 23:04:28 +08:00
2023-11-08 20:29:53 +08:00
CFileSystem *pFileSystem=NULL;
// forwards
BOOL SubclassGameWindow();
2023-11-24 23:30:07 +08:00
void TheGraphicsLoop();
LONG WINAPI exc_handler(_EXCEPTION_POINTERS* exc_inf);
void sub_1009DD50();
// polls the game until it's able to run.
void LaunchMonitor(PVOID v)
{
if(pGame)
pGame->InitGame();
while(1) {
if(*(PDWORD)ADDR_ENTRY == 7) {
sub_1009DD50();
pGame->StartGame();
break;
}
else {
Sleep(5);
}
}
ExitThread(0);
}
2023-11-22 23:40:22 +08:00
//----------------------------------------------------
#define ARCHIVE_FILE "samp.saa"
2023-10-19 08:02:18 +08:00
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
2023-10-20 06:46:57 +08:00
if(DLL_PROCESS_ATTACH==fdwReason)
{
hInstance = hinstDLL;
InitSettings();
if(tSettings.bDebug || tSettings.bPlayOnline)
{
SetUnhandledExceptionFilter(exc_handler);
2023-11-24 23:30:07 +08:00
dwGraphicsLoop = (DWORD)TheGraphicsLoop;
2023-11-08 20:29:53 +08:00
CHAR szArchiveFile[MAX_PATH];
GetModuleFileNameA((HMODULE)hInstance, szArchiveFile, MAX_PATH);
DWORD dwFileNameLen = strlen(szArchiveFile);
while(szArchiveFile[dwFileNameLen] != '\\')
dwFileNameLen--;
strcpy(szArchiveFile+dwFileNameLen+1, ARCHIVE_FILE);
2023-11-08 20:29:53 +08:00
pFileSystem = new CArchiveFS();
if(!pFileSystem->Load(ARCHIVE_FILE)) _asm int 3
2023-10-23 22:58:28 +08:00
2023-10-20 06:46:57 +08:00
AddFontResourceA("gtaweap3.ttf");
AddFontResourceA("sampaux3.ttf");
2023-10-23 22:58:28 +08:00
InstallFileSystemHooks();
InstallShowCursorHook();
2023-10-23 23:04:28 +08:00
pGame = new CGame();
_beginthread(LaunchMonitor,0,NULL);
2023-10-20 06:46:57 +08:00
}
}
else if(DLL_PROCESS_DETACH==fdwReason)
{
if(tSettings.bDebug || tSettings.bPlayOnline) {
UninstallFileSystemHooks();
2023-10-20 06:46:57 +08:00
}
}
2023-10-19 08:02:18 +08:00
return TRUE;
}
2023-10-20 06:46:57 +08:00
//----------------------------------------------------
2023-12-01 18:31:52 +08:00
PCHAR GetSAMPPath()
{
return szSAMPDir;
}
//----------------------------------------------------
PCHAR GetCachePath()
{
return szCacheDir;
}
//----------------------------------------------------
void SetupCacheDirectories()
{
ZeroMemory(szCacheDir, sizeof(szCacheDir));
CHAR szPath[MAX_PATH+1];
DWORD cbData = MAX_PATH;
HKEY hKey;
DWORD dwType;
ZeroMemory(szPath, sizeof(szPath));
sprintf(szCacheDir, "%s\\cache", szSAMPDir);
if(RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\SAMP", 0, KEY_READ, &hKey) == ERROR_SUCCESS &&
RegQueryValueEx(hKey, "model_cache", NULL, &dwType, (LPBYTE) szPath, &cbData) == ERROR_SUCCESS)
{
strncpy(szCacheDir, szPath, MAX_PATH+1);
}
if(!IsFileOrDirectoryExists(szCacheDir))
CreateDirectoryA(szCacheDir, NULL);
CHAR szLocalDir[MAX_PATH+1];
sprintf(szLocalDir, "%s\\local", szCacheDir);
if(!IsFileOrDirectoryExists(szLocalDir))
CreateDirectoryA(szLocalDir, NULL);
}
//----------------------------------------------------
PCHAR GetArtworkProxy()
{
ZeroMemory(szArtworkProxy, sizeof(szArtworkProxy));
DWORD cbData = MAX_PATH;
HKEY hKey;
DWORD dwType;
if(RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\SAMP", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
return NULL;
if(RegQueryValueEx(hKey, "artwork_proxy", NULL, &dwType, (LPBYTE) szArtworkProxy, &cbData) != ERROR_SUCCESS)
return NULL;
return szArtworkProxy;
}
//----------------------------------------------------
void SetupDirectories()
{
ZeroMemory(szSAMPDir, sizeof(szSAMPDir));
if(strlen((char*)0xC92368) == 0) {
GetCurrentDirectory(MAX_PATH+1, szSAMPDir);
} else {
sprintf(szSAMPDir, "%s\\SAMP", (char*)0xC92368);
if(!IsFileOrDirectoryExists(szSAMPDir))
CreateDirectoryA(szSAMPDir, NULL);
CHAR szScreensDir[MAX_PATH+1];
sprintf(szScreensDir, "%s\\screens", szSAMPDir);
if(!IsFileOrDirectoryExists(szScreensDir))
CreateDirectoryA(szScreensDir, NULL);
SetupCacheDirectories();
}
}
//----------------------------------------------------
void CallRwRenderStateSet(int state, int option)
{
_asm push option
_asm push state
_asm mov ebx, 0xC97B24
_asm mov eax, [ebx]
_asm call dword ptr [eax+32]
_asm add esp, 8
}
//----------------------------------------------------
void CallRwRenderStateGet(int state, int *option)
{
_asm push option
_asm push state
_asm mov ebx, 0xC97B24
_asm mov eax, [ebx]
_asm call dword ptr [eax+36]
_asm add esp, 8
}
//----------------------------------------------------
void DoInitStuff()
{
// GAME INIT
if(!bGameInited)
{
SetupDirectories();
sprintf(szConfigFile, "%s\\sa-mp.cfg", szSAMPDir);
sprintf(szChatLogFile, "%s\\chatlog.txt", szSAMPDir);
pConfig = new CConfig(szConfigFile);
timeBeginPeriod(1); // increases the accuracy of Sleep()
sub_1009DD50();
SubclassGameWindow();
// Grab the real IDirect3D9 * from the game.
pD3D = (IDirect3D9 *)pGame->GetD3D();
// Grab the real IDirect3DDevice9 * from the game.
pD3DDevice = (IDirect3DDevice9 *)pGame->GetD3DDevice();
// TODO: DoInitStuff
bGameInited = TRUE;
return;
}
}
//----------------------------------------------------
void DoProcessStuff()
{
DoInitStuff();
}
//----------------------------------------------------
2023-11-24 23:30:07 +08:00
void TheGraphicsLoop()
{
_asm pushad // because we're called from a hook
DoProcessStuff();
_asm popad
2023-11-24 23:30:07 +08:00
}
//----------------------------------------------------
2023-10-20 06:46:57 +08:00
void InitSettings()
{
PCHAR szCmdLine = GetCommandLineA();
memset(&tSettings,0,sizeof(GAME_SETTINGS));
while(*szCmdLine) {
if(*szCmdLine == '-' || *szCmdLine == '/') {
szCmdLine++;
switch(*szCmdLine) {
case 'd':
tSettings.bDebug = TRUE;
tSettings.bPlayOnline = FALSE;
break;
case 'c':
tSettings.bPlayOnline = TRUE;
tSettings.bDebug = FALSE;
break;
case 'z':
szCmdLine++;
SetStringFromCommandLine(szCmdLine,tSettings.szConnectPass);
break;
/*
// We'll do this using ALT+ENTER
case 'w':
tSettings.bWindowedMode = TRUE;
break;
*/
case 'h':
szCmdLine++;
SetStringFromCommandLine(szCmdLine,tSettings.szConnectHost);
break;
case 'p':
szCmdLine++;
SetStringFromCommandLine(szCmdLine,tSettings.szConnectPort);
break;
case 'n':
szCmdLine++;
SetStringFromCommandLine(szCmdLine,tSettings.szNickName);
break;
case 'l':
szCmdLine++;
SetStringFromQuotedCommandLine(szCmdLine,tSettings.szDebugScript);
break;
}
}
szCmdLine++;
}
}
//----------------------------------------------------
void SetStringFromCommandLine(char *szCmdLine, char *szString)
{
while(*szCmdLine == ' ') szCmdLine++;
while(*szCmdLine &&
*szCmdLine != ' ' &&
*szCmdLine != '-' &&
*szCmdLine != '/')
{
*szString = *szCmdLine;
szString++; szCmdLine++;
}
*szString = '\0';
}
//----------------------------------------------------
void SetStringFromQuotedCommandLine(char *szCmdLine, char *szString)
{
while(*szCmdLine != '"') szCmdLine++;
szCmdLine++;
while(*szCmdLine &&
*szCmdLine != '"')
{
*szString = *szCmdLine;
szString++; szCmdLine++;
}
*szString = '\0';
}
//----------------------------------------------------