iw4x-client/src/Components/Modules/UIScript.cpp

137 lines
2.5 KiB
C++
Raw Normal View History

#include "STDInclude.hpp"
2015-12-28 08:08:46 -05:00
namespace Components
{
std::map<std::string, wink::slot<UIScript::Callback>> UIScript::UIScripts;
std::map<int, wink::slot<UIScript::CallbackRaw>> UIScript::UIOwnerDraws;
2015-12-28 08:08:46 -05:00
template<> int UIScript::Token::Get()
{
if (this->IsValid())
{
return atoi(this->token);
}
return 0;
}
template<> char* UIScript::Token::Get()
{
if (this->IsValid())
{
return this->token;
}
return "";
}
template<> const char* UIScript::Token::Get()
{
return this->Get<char*>();
}
template<> std::string UIScript::Token::Get()
{
return this->Get<const char*>();
}
bool UIScript::Token::IsValid()
{
return (token && token[0]);
}
void UIScript::Token::Parse(const char** args)
{
if (args)
{
this->token = Game::Com_ParseExt(args);
}
}
void UIScript::Add(std::string name, UIScript::Callback* callback)
2015-12-28 08:08:46 -05:00
{
UIScript::UIScripts[name] = callback;
}
void UIScript::Add(std::string name, UIScript::CallbackRaw* callback)
2015-12-28 08:08:46 -05:00
{
UIScript::Add(name, reinterpret_cast<UIScript::Callback*>(callback));
2015-12-28 08:08:46 -05:00
}
void UIScript::AddOwnerDraw(int ownerdraw, UIScript::CallbackRaw* callback)
2016-01-03 19:30:15 -05:00
{
UIScript::UIOwnerDraws[ownerdraw] = callback;
}
2015-12-28 08:08:46 -05:00
bool UIScript::RunMenuScript(const char* name, const char** args)
{
if (UIScript::UIScripts.find(name) != UIScript::UIScripts.end())
{
UIScript::UIScripts[name](UIScript::Token(args));
return true;
}
return false;
}
2016-01-03 19:30:15 -05:00
void UIScript::OwnerDrawHandleKeyStub(int ownerDraw, int flags, float *special, int key)
{
if (key == 200 || key == 201) //mouse buttons
{
2016-01-24 13:58:13 -05:00
for (auto i = UIScript::UIOwnerDraws.begin(); i != UIScript::UIOwnerDraws.end(); ++i)
2016-01-03 19:30:15 -05:00
{
if (i->first == ownerDraw)
{
i->second();
}
}
}
Utils::Hook::Call<void(int, int, float*, int)>(0x4F58A0)(ownerDraw, flags, special, key);
}
2015-12-28 08:08:46 -05:00
void __declspec(naked) UIScript::RunMenuScriptStub()
{
__asm
{
mov eax, esp
add eax, 8h
mov edx, eax // UIScript name
mov eax, [esp + 0C10h] // UIScript args
push eax
push edx
call UIScript::RunMenuScript
add esp, 8h
2015-12-28 11:52:13 -05:00
test al, al
2015-12-28 08:08:46 -05:00
jz continue
// if returned
pop edi
pop esi
add esp, 0C00h
retn
continue:
mov eax, 45ED00h
jmp eax
}
}
UIScript::UIScript()
{
// Install handler
Utils::Hook::Set<int>(0x45EC5B, (DWORD)UIScript::RunMenuScriptStub - 0x45EC59 - 6);
2016-01-03 19:30:15 -05:00
// Install ownerdraw handler
Utils::Hook(0x63D233, UIScript::OwnerDrawHandleKeyStub, HOOK_CALL).Install()->Quick();
2015-12-28 08:08:46 -05:00
}
UIScript::~UIScript()
{
UIScript::UIScripts.clear();
2016-01-03 19:30:15 -05:00
UIScript::UIOwnerDraws.clear();
2015-12-28 08:08:46 -05:00
}
}