mirror of
https://github.com/JezuzLizard/T4SP-Server-Plugin.git
synced 2025-04-20 05:25:44 +00:00
Add base detour for G_ClientDoPerFrameNotifies.
This commit is contained in:
parent
5d4f84e570
commit
2416967be7
93
src/component/player.cpp
Normal file
93
src/component/player.cpp
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
#include <stdinc.hpp>
|
||||||
|
#include "loader/component_loader.hpp"
|
||||||
|
|
||||||
|
#include <utils/hook.hpp>
|
||||||
|
#include <utils/io.hpp>
|
||||||
|
#include <utils/string.hpp>
|
||||||
|
#include <utils/thread.hpp>
|
||||||
|
#include <utils/compression.hpp>
|
||||||
|
|
||||||
|
#include <exception/minidump.hpp>
|
||||||
|
|
||||||
|
namespace player
|
||||||
|
{
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
utils::hook::detour g_clientdoperframenotifies_hook;
|
||||||
|
|
||||||
|
void G_ClientDoPerFrameNotifies_custom(game::gentity_s* ent)
|
||||||
|
{
|
||||||
|
game::gclient_s* client; // esi
|
||||||
|
unsigned int weapon; // eax
|
||||||
|
bool clientIsFiring; // bl
|
||||||
|
|
||||||
|
client = ent->client;
|
||||||
|
weapon = client->ps.weapon;
|
||||||
|
if (weapon != client->lastWeapon)
|
||||||
|
{
|
||||||
|
game::Scr_AddString(game::SCRIPTINSTANCE_SERVER, game::BG_WeaponNames[weapon]->szInternalName);
|
||||||
|
game::Scr_NotifyNum(game::SCRIPTINSTANCE_SERVER, ent->s.number, 0, game::scr_const->weapon_change, 1);
|
||||||
|
weapon = client->ps.weapon;
|
||||||
|
client->lastWeapon = weapon;
|
||||||
|
}
|
||||||
|
if (!client->previouslyChangingWeapon || client->ps.weaponstate == game::WEAPON_RAISING || client->ps.weaponstate == game::WEAPON_RAISING_ALTSWITCH)
|
||||||
|
{
|
||||||
|
if (client->ps.weaponstate == game::WEAPON_RAISING || client->ps.weaponstate == game::WEAPON_RAISING_ALTSWITCH)
|
||||||
|
client->previouslyChangingWeapon = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
game::Scr_AddString(game::SCRIPTINSTANCE_SERVER, game::BG_WeaponNames[weapon]->szInternalName);
|
||||||
|
game::Scr_NotifyNum(game::SCRIPTINSTANCE_SERVER, ent->s.number, 0, game::scr_const->weapon_change_complete, 1);
|
||||||
|
client->previouslyChangingWeapon = 0;
|
||||||
|
}
|
||||||
|
clientIsFiring = client->ps.weaponstate == game::WEAPON_FIRING && client->ps.pm_type < game::PM_LASTSTAND_TRANSITION;
|
||||||
|
if (clientIsFiring != client->previouslyFiring)
|
||||||
|
{
|
||||||
|
if (clientIsFiring)
|
||||||
|
game::Scr_NotifyNum(game::SCRIPTINSTANCE_SERVER, ent->s.number, 0, game::scr_const->begin_firing, 0);
|
||||||
|
else
|
||||||
|
game::Scr_NotifyNum(game::SCRIPTINSTANCE_SERVER, ent->s.number, 0, game::scr_const->end_firing, 0);
|
||||||
|
client->previouslyFiring = clientIsFiring;
|
||||||
|
}
|
||||||
|
if ((client->ps.weapFlags & 0x40) != 0)
|
||||||
|
{
|
||||||
|
if (!client->previouslyUsingNightVision)
|
||||||
|
{
|
||||||
|
client->previouslyUsingNightVision = 1;
|
||||||
|
game::Scr_NotifyNum(game::SCRIPTINSTANCE_SERVER, ent->s.number, 0, game::scr_const->night_vision_on, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (client->previouslyUsingNightVision)
|
||||||
|
{
|
||||||
|
client->previouslyUsingNightVision = 0;
|
||||||
|
game::Scr_NotifyNum(game::SCRIPTINSTANCE_SERVER, ent->s.number, 0, game::scr_const->night_vision_off, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void __declspec(naked) G_ClientDoPerFrameNotifies_stub()
|
||||||
|
{
|
||||||
|
__asm
|
||||||
|
{
|
||||||
|
push edi;
|
||||||
|
|
||||||
|
call G_ClientDoPerFrameNotifies_custom;
|
||||||
|
add esp, 0x4;
|
||||||
|
ret;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class component final : public component_interface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void post_unpack() override
|
||||||
|
{
|
||||||
|
// test usercall detour!
|
||||||
|
g_clientdoperframenotifies_hook.create(game::G_ClientDoPerFrameNotifies(), G_ClientDoPerFrameNotifies_stub);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
REGISTER_COMPONENT(player::component)
|
@ -32,6 +32,15 @@ namespace game
|
|||||||
{ "dead", TEAM_DEAD }
|
{ "dead", TEAM_DEAD }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void G_ClientDoPerFrameNotifies(gentity_s* ent, void* call_addr)
|
||||||
|
{
|
||||||
|
__asm
|
||||||
|
{
|
||||||
|
mov edi, ent;
|
||||||
|
call call_addr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Scr_PrintPrevCodePos(const char* codepos, int scriptInstance, con_channel_e channel, int index)
|
void Scr_PrintPrevCodePos(const char* codepos, int scriptInstance, con_channel_e channel, int index)
|
||||||
{
|
{
|
||||||
static const auto call_addr = SELECT(0x0, 0x68B340);
|
static const auto call_addr = SELECT(0x0, 0x68B340);
|
||||||
@ -437,6 +446,20 @@ namespace game
|
|||||||
return answer;
|
return answer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scr_NotifyNum(scriptInstance_t inst, int entNum, int entClass, unsigned int notifStr, int numParams, void* call_addr)
|
||||||
|
{
|
||||||
|
__asm
|
||||||
|
{
|
||||||
|
push numParams;
|
||||||
|
push notifStr;
|
||||||
|
push entClass;
|
||||||
|
push entNum;
|
||||||
|
mov eax, inst;
|
||||||
|
call call_addr;
|
||||||
|
add esp, 0x10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int Scr_GetNumParam(scriptInstance_t inst)
|
unsigned int Scr_GetNumParam(scriptInstance_t inst)
|
||||||
{
|
{
|
||||||
return gScrVmPub[inst].outparamcount;
|
return gScrVmPub[inst].outparamcount;
|
||||||
|
@ -24,6 +24,9 @@ namespace game
|
|||||||
|
|
||||||
extern std::map<std::string, team_t> team_map;
|
extern std::map<std::string, team_t> team_map;
|
||||||
|
|
||||||
|
__inline void* G_ClientDoPerFrameNotifies() { return CALL_ADDR(0x0, 0x503540); }
|
||||||
|
void G_ClientDoPerFrameNotifies(gentity_s* ent, void* call_addr = G_ClientDoPerFrameNotifies());
|
||||||
|
|
||||||
void Scr_PrintPrevCodePos(const char* codepos, int scriptInstance, con_channel_e channel, int index);
|
void Scr_PrintPrevCodePos(const char* codepos, int scriptInstance, con_channel_e channel, int index);
|
||||||
void RemoveRefToObject(scriptInstance_t inst, unsigned int id);
|
void RemoveRefToObject(scriptInstance_t inst, unsigned int id);
|
||||||
int Scr_LoadScript(const char* file, scriptInstance_t inst);
|
int Scr_LoadScript(const char* file, scriptInstance_t inst);
|
||||||
@ -62,6 +65,9 @@ namespace game
|
|||||||
void Scr_AddArrayStringIndexed(scriptInstance_t inst, unsigned short id);
|
void Scr_AddArrayStringIndexed(scriptInstance_t inst, unsigned short id);
|
||||||
unsigned short Scr_ExecThread(scriptInstance_t inst, int handle, int paramCount);
|
unsigned short Scr_ExecThread(scriptInstance_t inst, int handle, int paramCount);
|
||||||
unsigned short Scr_ExecEntThread(scriptInstance_t inst, int entNum, int handle, int numParams, int entClass);
|
unsigned short Scr_ExecEntThread(scriptInstance_t inst, int entNum, int handle, int numParams, int entClass);
|
||||||
|
__inline void* Scr_NotifyNum() { return CALL_ADDR(0x0, 0x698CC0); }
|
||||||
|
void Scr_NotifyNum(scriptInstance_t inst, int entNum, int entClass, unsigned int notifStr, int numParams, void* call_addr = Scr_NotifyNum());
|
||||||
|
|
||||||
unsigned int Scr_GetNumParam(scriptInstance_t inst);
|
unsigned int Scr_GetNumParam(scriptInstance_t inst);
|
||||||
VariableType Scr_GetType(scriptInstance_t inst, unsigned int index);
|
VariableType Scr_GetType(scriptInstance_t inst, unsigned int index);
|
||||||
void Scr_Error(const char* err, scriptInstance_t inst, bool is_terminal);
|
void Scr_Error(const char* err, scriptInstance_t inst, bool is_terminal);
|
||||||
|
1682
src/game/structs.hpp
1682
src/game/structs.hpp
File diff suppressed because it is too large
Load Diff
@ -32,6 +32,8 @@ namespace game
|
|||||||
WEAK symbol<function_stack_t> function_stack{ 0x0, 0x3BDDDD0 };
|
WEAK symbol<function_stack_t> function_stack{ 0x0, 0x3BDDDD0 };
|
||||||
WEAK symbol<scr_const_t> scr_const{0x0, 0x1F33B90};
|
WEAK symbol<scr_const_t> scr_const{0x0, 0x1F33B90};
|
||||||
|
|
||||||
|
WEAK symbol<WeaponDef*> BG_WeaponNames{ 0x0, 0x8F6770 };
|
||||||
|
|
||||||
// Dvars
|
// Dvars
|
||||||
|
|
||||||
WEAK symbol<dvar_s*> com_developer{ 0x0, 0x1F55288 };
|
WEAK symbol<dvar_s*> com_developer{ 0x0, 0x1F55288 };
|
||||||
|
Loading…
x
Reference in New Issue
Block a user