HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Флуд (https://hlfx.ru/forum/forumdisplay.php?forumid=11)
-- Как из hl.exe сделать лаунчер для своего мода. (https://hlfx.ru/forum/showthread.php?threadid=4038)
Отправлено Cybermax 02-08-2013 в 10:02:
Как из hl.exe сделать лаунчер для своего мода.
Я предполагаю что с помощью HEX редактора. Если можно по подробнее.
И как изменить иконку стандартную. Пробовал использовать "Restorator" ничего годного не вышло.
Отправлено fire64 02-08-2013 в 10:24:
Ну я же где-то выкладывал исходники лаучера, правда там интерфейсы движка кривые. Игру он запускает лишь при использовании параметра -steam ну и при выходе из игры, продолжает висеть в процессах.
C++ Source Code:
5 | virtual int UnkFunc( int t ) = 0; |
6 | virtual bool Run( void *instance, char *basedir, const char *pCommandLine, CreateInterfaceFn launcherFactory ) = 0; |
10 | #define VENGINE_LAUNCHER_API_VERSION "VENGINE_LAUNCHER_API_VERSION002" |
В методе Run аргументы неверные, поэтому он и вылетает, при выходе, какие именно должны быть хз.__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей
Отправлено Cybermax 02-08-2013 в 15:48:
Хорошо а с помощью программ типа Resource Hacker и Restorator 2009 можно взять стандартный hl.exe и впихнуть в него параметр -game %modename% Что то похожее было в HLWE но не могу найти. Если что знает скажите пожалуйста как именно это сделать. потому что я сан не могу разобраться.
Отправлено pRoxxx 02-08-2013 в 19:32:
Ну вот набросок мой небольшой, он далеко не идеален например Change Game не будет работать, параметры типа -game тожи.
C++ Source Code:
5 | typedef char* (*CreateInterfaceFn)(const char *pName, int *pReturnCode); |
7 | #pragma comment(lib, "ws2_32.lib") |
13 | virtual void *UnknowFunc(void *unknow) = 0; |
14 | virtual int Run(HINSTANCE instance, char *basedir, const char *cmdline, char *szCommand, CreateInterfaceFn launcherFactory, CreateInterfaceFn filesystemFactory) = 0; |
20 | virtual void UnknowFunc(void) = 0; |
21 | virtual void Mount(void) = 0; |
22 | virtual void Unmount(void) = 0; |
23 | virtual void RemoveAllSearchPaths(void) = 0; |
24 | virtual void AddSearchPath(const char *pPath, const char *pathID = NULL) = 0; |
31 | int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) |
34 | HANDLE hObject = CreateMutex(NULL, FALSE, "ValveHalfLifeLauncherMutex"); |
35 | DWORD dwStatus = WaitForSingleObject(hObject, 0); |
36 | if(dwStatus && dwStatus != WAIT_ABANDONED) |
38 | MessageBox(NULL, "Could not launch game.\nOnly one instance of this game can be run at a time.", "Error", MB_OK | MB_ICONERROR); |
43 | WSAStartup(2, &lpWSAData); |
47 | GetCurrentDirectory(256, szPatch); |
49 | HMODULE hFileEngine = LoadLibrary("filesystem_stdio.dll"); |
52 | MessageBox(NULL, "Failed to load File engine!", "ERROR", MB_OK | MB_ICONERROR); |
56 | CreateInterfaceFn Func = (CreateInterfaceFn)GetProcAddress(hFileEngine,"CreateInterface"); |
57 | CFileSystem* pFileSystem = (CFileSystem*)Func("VFileSystem009", NULL); |
60 | pFileSystem->AddSearchPath(szPatch, "ROOT"); |
62 | HMODULE hEngine = LoadLibrary("hw.dll"); |
66 | MessageBox(NULL, "Failed to load game engine!", "ERROR", MB_OK | MB_ICONERROR); |
71 | CreateInterfaceFn Func2 = (CreateInterfaceFn)GetProcAddress(hEngine,"CreateInterface"); |
72 | IEngineAPI *pEngineAPI = (IEngineAPI *)Func2("VENGINE_LAUNCHER_API_VERSION002", NULL); |
74 | //Либа для перехвата движковых функций. |
75 | HMODULE HookLib = LoadLibrary("mylib.dll"); |
77 | int iResult = pEngineAPI->Run(hInstance, szPatch, "-game cstrike", "", NULL, Func); |
79 | sprintf(str, "Result %d", iResult); |
80 | MessageBox(NULL, str, "Result", MB_OK); |
82 | pFileSystem->Unmount(); |
84 | FreeLibrary(hFileEngine); |
89 | ReleaseMutex(hObject); |
Отправлено fire64 02-08-2013 в 19:37:
pRoxxx, вот спасибо.
Так на всякий случай:
C++ Source Code:
1 | class IFileSystem : public IBaseInterface |
4 | virtual void Mount( ) = 0; //+4 |
5 | virtual void Unmount( ) = 0; //+8 |
6 | virtual int RemoveAllSearchPaths( ) = 0; //+12 |
7 | virtual int AddSearchPath( char *pSearchPatch, char *pTypePatch ) = 0; //+16 |
9 | virtual int Dummy2( ) = 0; //+20 |
10 | virtual int Dummy3( ) = 0; //+24 |
12 | // this isn't implementable on STEAM as is. |
13 | virtual void CreateDirHierarchy( const char *path, const char *pathID ) = 0; //28 |
16 | virtual bool IsDirectory( const char *pFileName, const char *pathID ) = 0; //32 |
18 | virtual int Dummy6( ) = 0; //+36 |
20 | // if pathID is NULL, all paths will be searched for the file |
21 | virtual FileHandle_t Open( const char *pFileName, const char *pOptions, const char *pathID = 0 ) = 0; //+40 |
22 | virtual void Close( FileHandle_t file ) = 0; //+44 |
25 | virtual int Dummy9( ) = 0; //+48 |
26 | virtual int Dummy10( ) = 0; //+52 |
27 | virtual int Dummy11( ) = 0; //+56 |
28 | virtual unsigned int Size( FileHandle_t file ) = 0; |
29 | virtual int Dummy13( char *pFileName ) = 0; //+64 |
30 | virtual int Dummy14( ) = 0; //+68 |
31 | virtual int Dummy15( ) = 0; //+72 |
32 | virtual int Dummy16( ) = 0; //+76 |
33 | virtual int Dummy17( ) = 0; //+80 |
34 | virtual int Dummy18( ) = 0; //+84 |
35 | virtual int Dummy19( ) = 0; //+88 |
36 | virtual int Dummy20( ) = 0; //+92 |
38 | virtual int FPrintf( FileHandle_t file, char *pFormat, ... ) = 0; //96 |
42 | virtual int Dummy22( ) = 0; //+100 |
43 | virtual int Dummy23( ) = 0; //+104 |
46 | virtual const char *FindFirst( const char *pWildCard, FileFindHandle_t *pHandle, int unker ) = 0; //+108 |
47 | virtual const char *FindNext( FileFindHandle_t handle ) = 0; //+112 |
48 | virtual bool FindIsDirectory( FileFindHandle_t handle ) = 0; //+116 |
49 | virtual void FindClose( FileFindHandle_t handle ) = 0; //+120 |
51 | virtual int Dummy28( ) = 0; //+124 |
52 | virtual int Dummy29( ) = 0; //+128 |
53 | virtual int Dummy30( ) = 0; //+132 |
__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей
Отправлено Дядя Миша 02-08-2013 в 19:41:
вот самый правильный вариант!
C++ Source Code:
3 | #define GAME_PATH "valve" // default dir to start from |
5 | typedef void (*pfnChangeGame)( const char *progname ); |
6 | typedef int (*pfnInit)( const char *progname, int bChangeGame, pfnChangeGame func ); |
7 | typedef void (*pfnShutdown)( void ); |
10 | pfnShutdown Host_Shutdown = NULL; |
11 | char szGameDir[128]; // safe place to keep gamedir |
14 | void Sys_Error( const char *errorstring ) |
16 | MessageBox( NULL, errorstring, "Xash Error", MB_OK|MB_SETFOREGROUND|MB_ICONSTOP ); |
20 | void Sys_LoadEngine( void ) |
22 | if(( hEngine = LoadLibrary( "xash.dll" )) == NULL ) |
24 | Sys_Error( "Unable to load the xash.dll" ); |
27 | if(( Host_Main = (pfnInit)GetProcAddress( hEngine, "Host_Main" )) == NULL ) |
29 | Sys_Error( "xash.dll missed 'Host_Main' export" ); |
32 | // this is non-fatal for us but change game will not working |
33 | Host_Shutdown = (pfnShutdown)GetProcAddress( hEngine, "Host_Shutdown" ); |
36 | void Sys_UnloadEngine( void ) |
38 | if( Host_Shutdown ) Host_Shutdown( ); |
39 | if( hEngine ) FreeLibrary( hEngine ); |
42 | void Sys_ChangeGame( const char *progname ) |
44 | if( !progname || !progname[0] ) Sys_Error( "Sys_ChangeGame: NULL gamedir" ); |
45 | if( Host_Shutdown == NULL ) Sys_Error( "Sys_ChangeGame: missed 'Host_Shutdown' export\n" ); |
46 | strncpy( szGameDir, progname, sizeof( szGameDir ) - 1 ); |
51 | Host_Main( szGameDir, TRUE, ( Host_Shutdown != NULL ) ? Sys_ChangeGame : NULL ); |
54 | int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) |
58 | return Host_Main( GAME_PATH, FALSE, ( Host_Shutdown != NULL ) ? Sys_ChangeGame : NULL ); |
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено pRoxxx 02-08-2013 в 19:51:
Цитата:
fire64 писал:
Так на всякий случай:
Я в курсе что этот класс больше чем у меня, я даже находил полностью список его функций с параметрами, но мне всё надо, так что те что идут после нужных функций я не вносил в класс, а те что перед просто пометил как UnknowFunc. И да тожи на всякий случай:
C++ Source Code:
5 | virtual ~IBaseInterface() {} //первые четыре байта они жеж virtual void UnknowFunc(void) = 0; |
Отправлено fire64 02-08-2013 в 19:57:
pRoxxx, кстати, мьютекс в общем-то и не нужен, он там лишь для защиты от многократного запуска.
У тебя случаем нет классов интерфейсов VGUI2 от GoldSRC?
__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей
Отправлено pRoxxx 02-08-2013 в 20:08:
Цитата:
fire64 писал:
мьютекс в общем-то и не нужен, он там лишь для защиты от многократного запуска.
Спасибо я в курсе, там жеж даже в Эрроре это написано, я пробывал запускать два клиента и на один сервер, выглядит жутко, тот что запущен был вторым не видит никого, а первый нормально работает. Думал потроллить школьников админов, начать гнуть маты дабы забанили одно окно а второе не вылетает жиж от бана первого, но вот забанить его уже до смены карты нельзя будет. Цитата:
fire64 писал:
У тебя случаем нет классов интерфейсов VGUI2 от GoldSRC?
Вряд ли, я в основном луркаю в исходники ворованного Source и Ксаша, еже ли там нету то... (=
Отправлено Ozzy 02-08-2013 в 20:24:
Cybermax даже свою карту сделать не смог для "своего" мода,а вы ему тут такое кидаете
__________________
удалено по соображениям цензуры
Отправлено Cybermax 03-08-2013 в 10:31:
В общем я нашел простой способ. Есть утилита с помощью которой можно создавать лаунчер для ХЛ1 и её модов. Себе сделал.
Цитата:
Ozzy писал:
Cybermax даже свою карту сделать не смог для "своего" мода,а вы ему тут такое кидаете
Ты такой вредный ужас. А мы с тобою ещё в свен кооп играл раньше. Эх ты..
Отправлено Дядя Миша 03-08-2013 в 13:28:
Цитата:
Ozzy писал:
даже свою карту сделать не смог для "своего" мода,а вы ему тут такое кидаете
Ты нам тоже годами показывал одно и то же место с разных ракурсов.
С чего ты взял, что можешь кретикавать других?__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Cybermax 04-08-2013 в 00:17:
я вот думаю оззи по айпи вычислять и покарать этого идиота.
Почему то думают что сочиоснских можно огорчать.
Отправлено nemyax 04-08-2013 в 05:50:
Цитата:
Cybermax писал:
по айпи вычислять и покарать
Дикий штоле?
Отправлено tolerance 04-08-2013 в 06:22:
Цитата:
Cybermax писал:
по айпи вычислять и покарать