[Script] Allow adding custom script functions
This commit is contained in:
parent
221e550180
commit
309e2d2987
@ -4,6 +4,7 @@ namespace Components
|
|||||||
{
|
{
|
||||||
std::string Script::ScriptName;
|
std::string Script::ScriptName;
|
||||||
std::vector<int> Script::ScriptHandles;
|
std::vector<int> Script::ScriptHandles;
|
||||||
|
std::vector<Script::Function> Script::ScriptFunctions;
|
||||||
std::vector<std::string> Script::ScriptNameStack;
|
std::vector<std::string> Script::ScriptNameStack;
|
||||||
unsigned short Script::FunctionName;
|
unsigned short Script::FunctionName;
|
||||||
|
|
||||||
@ -217,16 +218,78 @@ namespace Components
|
|||||||
}
|
}
|
||||||
|
|
||||||
int handle = Script::LoadScriptAndLabel(file, "init");
|
int handle = Script::LoadScriptAndLabel(file, "init");
|
||||||
|
if (handle) Script::ScriptHandles.push_back(handle);
|
||||||
if (handle)
|
else
|
||||||
{
|
{
|
||||||
Script::ScriptHandles.push_back(handle);
|
handle = Script::LoadScriptAndLabel(file, "main");
|
||||||
|
if (handle) Script::ScriptHandles.push_back(handle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Game::GScr_LoadGameTypeScript();
|
Game::GScr_LoadGameTypeScript();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Script::AddFunction(std::string name, Game::scr_function_t function, bool isDev)
|
||||||
|
{
|
||||||
|
for(auto i = Script::ScriptFunctions.begin(); i != Script::ScriptFunctions.end();)
|
||||||
|
{
|
||||||
|
if(i->getName() == name)
|
||||||
|
{
|
||||||
|
i = Script::ScriptFunctions.erase(i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
|
||||||
|
Script::ScriptFunctions.push_back({ name, function, isDev });
|
||||||
|
}
|
||||||
|
|
||||||
|
Game::scr_function_t Script::GetFunction(const char** name, int* isDev)
|
||||||
|
{
|
||||||
|
if (name && *name) OutputDebugStringA(*name);
|
||||||
|
|
||||||
|
for (auto& function : Script::ScriptFunctions)
|
||||||
|
{
|
||||||
|
if (name)
|
||||||
|
{
|
||||||
|
if(std::string(*name) == function.getName())
|
||||||
|
{
|
||||||
|
*name = function.getName();
|
||||||
|
*isDev = function.isDev();
|
||||||
|
return function.getFunction();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Game::Scr_RegisterFunction(function.getFunction());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
__declspec(naked) void Script::GetFunctionStub()
|
||||||
|
{
|
||||||
|
__asm
|
||||||
|
{
|
||||||
|
push [esp + 8h]
|
||||||
|
push [esp + 8h]
|
||||||
|
|
||||||
|
mov eax, 5FA2B0h
|
||||||
|
call eax
|
||||||
|
|
||||||
|
test eax, eax
|
||||||
|
jnz returnSafe
|
||||||
|
|
||||||
|
call Script::GetFunction
|
||||||
|
|
||||||
|
returnSafe:
|
||||||
|
add esp, 8h
|
||||||
|
retn
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int Script::SetExpFogStub()
|
int Script::SetExpFogStub()
|
||||||
{
|
{
|
||||||
if(Game::Scr_GetNumParam() == 6)
|
if(Game::Scr_GetNumParam() == 6)
|
||||||
@ -259,6 +322,8 @@ namespace Components
|
|||||||
Utils::Hook(0x48EFFE, Script::LoadGameType, HOOK_CALL).install()->quick();
|
Utils::Hook(0x48EFFE, Script::LoadGameType, HOOK_CALL).install()->quick();
|
||||||
Utils::Hook(0x45D44A, Script::LoadGameTypeScript, HOOK_CALL).install()->quick();
|
Utils::Hook(0x45D44A, Script::LoadGameTypeScript, HOOK_CALL).install()->quick();
|
||||||
|
|
||||||
|
Utils::Hook(0x44E72E, Script::GetFunctionStub, HOOK_CALL).install()->quick();
|
||||||
|
|
||||||
Utils::Hook(0x5F41A3, Script::SetExpFogStub, HOOK_CALL).install()->quick();
|
Utils::Hook(0x5F41A3, Script::SetExpFogStub, HOOK_CALL).install()->quick();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -267,5 +332,6 @@ namespace Components
|
|||||||
Script::ScriptName.clear();
|
Script::ScriptName.clear();
|
||||||
Script::ScriptHandles.clear();
|
Script::ScriptHandles.clear();
|
||||||
Script::ScriptNameStack.clear();
|
Script::ScriptNameStack.clear();
|
||||||
|
Script::ScriptFunctions.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,26 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include "Game/Structs.hpp"
|
||||||
|
|
||||||
namespace Components
|
namespace Components
|
||||||
{
|
{
|
||||||
class Script : public Component
|
class Script : public Component
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
class Function
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Function(std::string _name, Game::scr_function_t _callback, bool _dev) : name(_name), callback(_callback), dev(_dev) {}
|
||||||
|
|
||||||
|
const char* getName() const { return this->name.data(); }
|
||||||
|
bool isDev() const { return this->dev; }
|
||||||
|
Game::scr_function_t getFunction() const { return this->callback; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string name;
|
||||||
|
Game::scr_function_t callback;
|
||||||
|
bool dev;
|
||||||
|
};
|
||||||
|
|
||||||
Script();
|
Script();
|
||||||
~Script();
|
~Script();
|
||||||
|
|
||||||
@ -13,10 +29,12 @@ namespace Components
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int LoadScriptAndLabel(std::string script, std::string label);
|
static int LoadScriptAndLabel(std::string script, std::string label);
|
||||||
|
static void AddFunction(std::string name, Game::scr_function_t function, bool isDev = false);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static std::string ScriptName;
|
static std::string ScriptName;
|
||||||
static std::vector<int> ScriptHandles;
|
static std::vector<int> ScriptHandles;
|
||||||
|
static std::vector<Function> ScriptFunctions;
|
||||||
static std::vector<std::string> ScriptNameStack;
|
static std::vector<std::string> ScriptNameStack;
|
||||||
static unsigned short FunctionName;
|
static unsigned short FunctionName;
|
||||||
|
|
||||||
@ -35,6 +53,9 @@ namespace Components
|
|||||||
static void LoadGameType();
|
static void LoadGameType();
|
||||||
static void LoadGameTypeScript();
|
static void LoadGameTypeScript();
|
||||||
|
|
||||||
|
static Game::scr_function_t GetFunction(const char** name, int* isDev);
|
||||||
|
static void GetFunctionStub();
|
||||||
|
|
||||||
static int SetExpFogStub();
|
static int SetExpFogStub();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -216,6 +216,7 @@ namespace Game
|
|||||||
Scr_AddFloat_t Scr_AddFloat = Scr_AddFloat_t(0x61E860);
|
Scr_AddFloat_t Scr_AddFloat = Scr_AddFloat_t(0x61E860);
|
||||||
Scr_Notify_t Scr_Notify = Scr_Notify_t(0x4A4750);
|
Scr_Notify_t Scr_Notify = Scr_Notify_t(0x4A4750);
|
||||||
|
|
||||||
|
Scr_RegisterFunction_t Scr_RegisterFunction = Scr_RegisterFunction_t(0x492D50);
|
||||||
Scr_ShutdownAllocNode_t Scr_ShutdownAllocNode = Scr_ShutdownAllocNode_t(0x441650);
|
Scr_ShutdownAllocNode_t Scr_ShutdownAllocNode = Scr_ShutdownAllocNode_t(0x441650);
|
||||||
|
|
||||||
Script_Alloc_t Script_Alloc = Script_Alloc_t(0x422E70);
|
Script_Alloc_t Script_Alloc = Script_Alloc_t(0x422E70);
|
||||||
|
@ -541,6 +541,9 @@ namespace Game
|
|||||||
typedef void(__cdecl * Scr_Notify_t)(gentity_t *ent, unsigned __int16 stringValue, unsigned int paramcount);
|
typedef void(__cdecl * Scr_Notify_t)(gentity_t *ent, unsigned __int16 stringValue, unsigned int paramcount);
|
||||||
extern Scr_Notify_t Scr_Notify;
|
extern Scr_Notify_t Scr_Notify;
|
||||||
|
|
||||||
|
typedef void(__cdecl * Scr_RegisterFunction_t)(scr_function_t function);
|
||||||
|
extern Scr_RegisterFunction_t Scr_RegisterFunction;
|
||||||
|
|
||||||
typedef script_t* (__cdecl * Script_Alloc_t)(int length);
|
typedef script_t* (__cdecl * Script_Alloc_t)(int length);
|
||||||
extern Script_Alloc_t Script_Alloc;
|
extern Script_Alloc_t Script_Alloc;
|
||||||
|
|
||||||
|
@ -18,6 +18,9 @@ namespace Game
|
|||||||
typedef vec_t vec3_t[3];
|
typedef vec_t vec3_t[3];
|
||||||
typedef vec_t vec4_t[4];
|
typedef vec_t vec4_t[4];
|
||||||
|
|
||||||
|
typedef int scr_entref_t;
|
||||||
|
typedef void(__cdecl * scr_function_t)(scr_entref_t);
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
ASSET_TYPE_PHYSPRESET = 0,
|
ASSET_TYPE_PHYSPRESET = 0,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user