-
Notifications
You must be signed in to change notification settings - Fork 9
/
firebulletsfix.sp
113 lines (92 loc) · 2.86 KB
/
firebulletsfix.sp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#pragma newdecls required
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <sdkhooks>
#include <dhooks>
Handle g_hWeapon_ShootPosition = INVALID_HANDLE;
// Handle g_hWeapon_ShootPosition_SDKCall = INVALID_HANDLE;
float g_vecOldWeaponShootPos[MAXPLAYERS + 1][3];
// bool g_bCallingWeapon_ShootPosition = false;
public Plugin myinfo =
{
name = "子弹位置修复",
author = "xutaxkamay",
description = "Fixes shoot position",
version = "1.0",
url = "https://forums.alliedmods.net/showthread.php?p=2646571"
};
public void OnPluginStart()
{
Handle gameData = LoadGameConfigFile("dhooks.weapon_shootposition");
if (gameData == INVALID_HANDLE)
{
SetFailState("[FireBullets Fix] No game data present");
}
/*
StartPrepSDKCall(SDKCall_Player);
if (!PrepSDKCall_SetFromConf(gameData, SDKConf_Virtual, "Weapon_ShootPosition"))
{
SetFailState("[FireBullets Fix] couldn't read config for preparing Weapon_ShootPosition SDKCall");
}
PrepSDKCall_SetReturnInfo(SDKType_Vector, SDKPass_ByValue);
// Crashes the game...
g_hWeapon_ShootPosition_SDKCall = EndPrepSDKCall();
if (g_hWeapon_ShootPosition_SDKCall == INVALID_HANDLE)
{
SetFailState("[FireBullets Fix] couldn't prepare Weapon_ShootPosition SDKCall");
}
*/
int offset = GameConfGetOffset(gameData, "Weapon_ShootPosition");
if (offset == -1)
{
SetFailState("[FireBullets Fix] failed to find offset");
}
LogMessage("Found offset for Weapon_ShootPosition %d", offset);
g_hWeapon_ShootPosition = DHookCreate(offset, HookType_Entity, ReturnType_Vector, ThisPointer_CBaseEntity);
if (g_hWeapon_ShootPosition == INVALID_HANDLE)
{
SetFailState("[FireBullets Fix] couldn't hook Weapon_ShootPosition");
}
CloseHandle(gameData);
for (int client = 1; client <= MaxClients; client++)
OnClientPutInServer(client);
}
public void OnClientPutInServer(int client)
{
if (IsClientConnected(client) && IsClientInGame(client) && !IsFakeClient(client))
{
DHookEntity(g_hWeapon_ShootPosition, true, client, _, Weapon_ShootPosition_Post);
}
}
public Action OnPlayerRunCmd(int client)
{
if (IsClientConnected(client) && IsClientInGame(client) && !IsFakeClient(client))
{
GetClientEyePosition(client, g_vecOldWeaponShootPos[client]);
/*
g_bCallingWeapon_ShootPosition = true;
SDKCall(g_hWeapon_ShootPosition_SDKCall, client, g_vecOldWeaponShootPos[client]);
g_bCallingWeapon_ShootPosition = false;
*/
}
return Plugin_Continue;
}
public MRESReturn Weapon_ShootPosition_Post(int client, Handle hReturn)
{
/*
if (!g_bCallingWeapon_ShootPosition)
{
*/
// At this point we always want to use our old origin.
DHookSetReturnVector(hReturn, g_vecOldWeaponShootPos[client]);
return MRES_Supercede;
/*
}
else
{
// Otherwhise we just let it call.
return MRES_Ignored;
}
*/
}