总结下来有2种,From@花青绿老师:
1. 使用签名然后外加代码hook
// 签名
"DropWeaponCommandHandler": {
"signatures": {
"library": "server",
"windows": "48 89 74 24 20 57 41 54 41 57 48 83 EC 40 45 0F B6 F8",
"linux": "55 48 89 E5 41 57 41 56 41 55 41 89 D5 41 54 53 48 89 FB"
}
}
代码:
private MemoryFunctionWithReturn<nint, nint, nint> DropWeaponCommandHandler_Func_Linux = new MemoryFunctionWithReturn<nint, nint, nint>(GameData.GetSignature("DropWeaponCommandHandler"));
private MemoryFunctionWithReturn<nint, nint, bool> DropWeaponCommandHandler_Func_Windows = new MemoryFunctionWithReturn<nint, nint, bool>(GameData.GetSignature("DropWeaponCommandHandler"));
public HookResult Handler(DynamicHook hook)
{
var weaponServices = new CCSPlayer_WeaponServices(hook.GetParam<nint>(0));
Console.WriteLine(weaponServices.Pawn.Value.Controller.Value.PlayerName);
return HookResult.Stop;
}
public override void Load(bool hotReload)
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
DropWeaponCommandHandler_Func_Windows.Hook(Handler, HookMode.Pre);
}
else
{
DropWeaponCommandHandler_Func_Linux.Hook(Handler, HookMode.Pre);
};
}
public override void Unload(bool hotReload)
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
DropWeaponCommandHandler_Func_Windows.Unhook(Handler, HookMode.Pre);
}
else
{
DropWeaponCommandHandler_Func_Linux.Unhook(Handler, HookMode.Pre);
};
}
2. 通过usermessage获取到(仅能获取ui信息,但无法阻止用户丢枪)
HookUserMessage(124, (msg) =>
// 124 来源:GameTracking-CS2/Protobufs/usermessages.proto at master · SteamDatabase/GameTracking-CS2
// UM_TextMsg = 124;
{
var info = msg.ReadString("param", 0);
if (info == "#SFUI_Notice_CannotDropWeapon" || info == "#SFUI_Notice_YouDroppedWeapon" || info == "#SFUI_Notice_CannotDropWeaponDuringWarmup")
{
Console.WriteLine("触发G键");
}
return HookResult.Continue;
}, HookMode.Pre);
