From 9daafaa7fe03f3536522b4088fb258e39863b445 Mon Sep 17 00:00:00 2001 From: rtldg <55846624+rtldg@users.noreply.github.com> Date: Mon, 17 May 2021 11:42:20 +0000 Subject: [PATCH] dumb tf2 scoreboard pb --- addons/sourcemod/gamedata/shavit.games.txt | 6 ++++ addons/sourcemod/scripting/shavit-misc.sp | 34 ++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/addons/sourcemod/gamedata/shavit.games.txt b/addons/sourcemod/gamedata/shavit.games.txt index 1ec87152..fc68581f 100644 --- a/addons/sourcemod/gamedata/shavit.games.txt +++ b/addons/sourcemod/gamedata/shavit.games.txt @@ -205,6 +205,12 @@ "windows" "\x55\x8B\xEC\x51\x56\x8B\xF1\x8B\x86\x2A\x2A\x2A\x2A\xD1\xE8\xA8\x01" "linux" "@_ZN11CBaseEntity28PhysicsCheckForEntityUntouchEv" } + // search string: "scoreboard_minigame" + "CTFGameRules::CalcPlayerScore" + { + "windows" "\x55\x8B\xEC\x56\x8B\x75\x2A\x85\xF6\x75\x2A\x33\xC0\x5E\x5D\xC3\x8B\x56" + "linux" "@_ZN12CTFGameRules15CalcPlayerScoreEP12RoundStats_tP9CTFPlayer" + } } } } diff --git a/addons/sourcemod/scripting/shavit-misc.sp b/addons/sourcemod/scripting/shavit-misc.sp index 726022e2..67a86dd3 100644 --- a/addons/sourcemod/scripting/shavit-misc.sp +++ b/addons/sourcemod/scripting/shavit-misc.sp @@ -152,6 +152,7 @@ Handle gH_Forwards_OnCheckpointMenuSelect = null; Handle gH_GetPlayerMaxSpeed = null; DynamicHook gH_UpdateStepSound = null; DynamicHook gH_IsSpawnPointValid = null; +DynamicDetour gH_CalcPlayerScore = null; // modules bool gB_Eventqueuefix = false; @@ -410,6 +411,21 @@ void LoadDHooks() SetFailState("Couldn't get the offset for \"CGameRules::IsSpawnPointValid\" - make sure your gamedata is updated!"); } + if (null != (gH_CalcPlayerScore = DHookCreateDetour(Address_Null, CallConv_CDECL, ReturnType_Int, ThisPointer_Ignore))) + { + if (DHookSetFromConf(gH_CalcPlayerScore, hGameData, SDKConf_Signature, "CTFGameRules::CalcPlayerScore")) + { + gH_CalcPlayerScore.AddParam(HookParamType_Int); + gH_CalcPlayerScore.AddParam(HookParamType_CBaseEntity); + gH_CalcPlayerScore.Enable(Hook_Pre, Detour_CalcPlayerScore); + } + else + { + LogError("Couldn't get the address for \"CTFGameRules::CalcPlayerScore\" - make sure your gamedata is updated!"); + delete gH_CalcPlayerScore; + } + } + delete hGameData; } @@ -432,6 +448,21 @@ public MRESReturn Hook_IsSpawnPointValid(Handle hReturn, Handle hParams) return MRES_Ignored; } +MRESReturn Detour_CalcPlayerScore(DHookReturn hReturn, DHookParam hParams) +{ + if (!gCV_Scoreboard.BoolValue) + { + return MRES_Ignored; + } + + int client = hParams.Get(2); + float fPB = Shavit_GetClientPB(client, 0, Track_Main); + int iScore = (fPB != 0.0 && fPB < 2000)? -RoundToFloor(fPB):-2000; + + hReturn.Value = iScore; + return MRES_Supercede; +} + public void OnClientCookiesCached(int client) { if(IsFakeClient(client)) @@ -1017,7 +1048,7 @@ public Action Timer_Advertisement(Handle timer) void UpdateScoreboard(int client) { - // this doesn't work on tf2 for some reason + // this doesn't work on tf2 probably because of CTFGameRules::CalcPlayerScore if(gEV_Type == Engine_TF2) { return; @@ -1031,7 +1062,6 @@ void UpdateScoreboard(int client) { CS_SetClientContributionScore(client, iScore); } - else { SetEntProp(client, Prop_Data, "m_iFrags", iScore);