mirror of
https://github.com/ineedbots/cod2m.git
synced 2025-04-19 16:02:53 +00:00
Completed custom script loading
This commit is contained in:
parent
90a4325857
commit
9a3b953478
@ -35,16 +35,6 @@ namespace Components
|
|||||||
return got->second.call;
|
return got->second.call;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Script::GScr_LoadGameTypeScript_Hook()
|
|
||||||
{
|
|
||||||
Game::GScr_LoadGameTypeScript();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Script::G_LoadStructs_Hook()
|
|
||||||
{
|
|
||||||
Game::G_LoadStructs();
|
|
||||||
}
|
|
||||||
|
|
||||||
Game::xfunction_t Script::Scr_GetFunction_Hook(const char** name, int* isDev)
|
Game::xfunction_t Script::Scr_GetFunction_Hook(const char** name, int* isDev)
|
||||||
{
|
{
|
||||||
auto got = CustomScrFunctions.find(*name);
|
auto got = CustomScrFunctions.find(*name);
|
||||||
@ -56,6 +46,55 @@ namespace Components
|
|||||||
return got->second.call;
|
return got->second.call;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Script::GScr_LoadGameTypeScript_Hook()
|
||||||
|
{
|
||||||
|
CustomScrHandles.clear();
|
||||||
|
|
||||||
|
Game::FS_ForEachFile("scripts", "gsc", [](char* filename)
|
||||||
|
{
|
||||||
|
std::string file = filename;
|
||||||
|
std::string label = "init";
|
||||||
|
|
||||||
|
file = "scripts/" + file;
|
||||||
|
|
||||||
|
if (Utils::String::EndsWith(file, ".gsc"))
|
||||||
|
file = file.substr(0, file.size() - 4);
|
||||||
|
|
||||||
|
Game::Com_Printf("Loading script %s.gsc...\n", file.data());
|
||||||
|
|
||||||
|
if (!Game::Scr_LoadScript(file.data()))
|
||||||
|
{
|
||||||
|
Game::Com_Printf("Script %s encountered an error while loading. (doesn't exist?)", file.data());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Game::Com_Printf("Script %s.gsc loaded successfully.\n", file.data());
|
||||||
|
Game::Com_Printf("Finding script handle %s::%s...\n", file.data(), label.data());
|
||||||
|
|
||||||
|
unsigned int handle = Game::Scr_GetFunctionHandle(file.data(), label.data());
|
||||||
|
if (!handle)
|
||||||
|
{
|
||||||
|
Game::Com_Printf("Script handle %s::%s couldn't be loaded. (file with no entry point?)\n", file.data(), label.data());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CustomScrHandles.push_back(handle);
|
||||||
|
Game::Com_Printf("Script handle %s::%s loaded successfully.\n", file.data(), label.data());
|
||||||
|
});
|
||||||
|
|
||||||
|
Game::GScr_LoadGameTypeScript();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Script::G_LoadStructs_Hook()
|
||||||
|
{
|
||||||
|
for (auto handle : CustomScrHandles)
|
||||||
|
{
|
||||||
|
Game::RemoveRefToObject(Game::Scr_ExecThread(handle, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
Game::G_LoadStructs();
|
||||||
|
}
|
||||||
|
|
||||||
Script::Script()
|
Script::Script()
|
||||||
{
|
{
|
||||||
// custom gsc calls
|
// custom gsc calls
|
||||||
|
@ -92,7 +92,7 @@ namespace Game
|
|||||||
bgs_ptr = ASSIGN(bgs_s**, 0x19A1C78);
|
bgs_ptr = ASSIGN(bgs_s**, 0x19A1C78);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int Scr_GetFunctionHandle(char* filename, const char* funcHandle)
|
unsigned int Scr_GetFunctionHandle(const char* filename, const char* funcHandle)
|
||||||
{
|
{
|
||||||
int func_loc = 0x474950;
|
int func_loc = 0x474950;
|
||||||
unsigned int answer;
|
unsigned int answer;
|
||||||
@ -109,15 +109,17 @@ namespace Game
|
|||||||
return answer;
|
return answer;
|
||||||
}
|
}
|
||||||
|
|
||||||
__int16 Scr_ExecThread(int handle)
|
__int16 Scr_ExecThread(int handle, int numParam)
|
||||||
{
|
{
|
||||||
int func_loc = 0x482080;
|
int func_loc = 0x482080;
|
||||||
__int16 answer;
|
__int16 answer;
|
||||||
|
|
||||||
__asm
|
__asm
|
||||||
{
|
{
|
||||||
|
push numParam;
|
||||||
mov eax, handle;
|
mov eax, handle;
|
||||||
call func_loc;
|
call func_loc;
|
||||||
|
add esp, 4;
|
||||||
mov answer, ax;
|
mov answer, ax;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,6 +137,42 @@ namespace Game
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int FS_ForEachFile(const char* folder, const char* extention, void(callback)(char*))
|
||||||
|
{
|
||||||
|
char buff[0x4000];
|
||||||
|
int numberFiles = FS_GetFileList(folder, extention, 1, buff, 0x4000);
|
||||||
|
int cursor = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < numberFiles; i++)
|
||||||
|
{
|
||||||
|
callback(buff + cursor);
|
||||||
|
|
||||||
|
cursor += strlen(buff + cursor) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return numberFiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
int FS_GetFileList(const char* folder, const char* ext, int flags, char* buff, size_t _size)
|
||||||
|
{
|
||||||
|
int func_loc = 0x424230;
|
||||||
|
int answer;
|
||||||
|
|
||||||
|
__asm
|
||||||
|
{
|
||||||
|
push _size;
|
||||||
|
push buff;
|
||||||
|
push flags;
|
||||||
|
push ext;
|
||||||
|
mov eax, folder;
|
||||||
|
call func_loc;
|
||||||
|
add esp, 0x10;
|
||||||
|
mov answer, eax;
|
||||||
|
}
|
||||||
|
|
||||||
|
return answer;
|
||||||
|
}
|
||||||
|
|
||||||
const char* Scr_GetString(unsigned int slot)
|
const char* Scr_GetString(unsigned int slot)
|
||||||
{
|
{
|
||||||
int func_loc = 0x482FF0;
|
int func_loc = 0x482FF0;
|
||||||
|
@ -58,7 +58,7 @@ namespace Game
|
|||||||
extern Dvar_RegisterBool_t* Dvar_RegisterBool;
|
extern Dvar_RegisterBool_t* Dvar_RegisterBool;
|
||||||
|
|
||||||
extern unsigned int Scr_GetFunctionHandle(const char*, const char*);
|
extern unsigned int Scr_GetFunctionHandle(const char*, const char*);
|
||||||
extern __int16 Scr_ExecThread(int);
|
extern __int16 Scr_ExecThread(int, int);
|
||||||
extern void RemoveRefToObject(int);
|
extern void RemoveRefToObject(int);
|
||||||
|
|
||||||
typedef Game::xmethod_t (Player_GetMethod_t)(const char**);
|
typedef Game::xmethod_t (Player_GetMethod_t)(const char**);
|
||||||
@ -81,6 +81,9 @@ namespace Game
|
|||||||
//double __usercall sub_482DB0@<st0>(unsigned int a1@<eax>) getfloat
|
//double __usercall sub_482DB0@<st0>(unsigned int a1@<eax>) getfloat
|
||||||
//char __usercall sub_483160@<al>(unsigned int a1@<eax>, _DWORD *a2@<edx>) get vector
|
//char __usercall sub_483160@<al>(unsigned int a1@<eax>, _DWORD *a2@<edx>) get vector
|
||||||
|
|
||||||
|
extern int FS_GetFileList(const char*, const char*, int, char*, size_t);
|
||||||
|
extern int FS_ForEachFile(const char*, const char*, void(char*));
|
||||||
|
|
||||||
extern const char* Scr_GetString(unsigned int);
|
extern const char* Scr_GetString(unsigned int);
|
||||||
extern int Scr_GetInt(unsigned int);
|
extern int Scr_GetInt(unsigned int);
|
||||||
extern void G_SelectWeaponIndex(int, int);
|
extern void G_SelectWeaponIndex(int, int);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user