|
19 | 19 | "WeaponName" |
20 | 20 | { |
21 | 21 | "windows" "6" |
| 22 | + "windows64" "10" |
22 | 23 | "linux" "6" |
23 | | - "mac" "6" |
| 24 | + "linux64" "10" |
24 | 25 | } |
| 26 | + // Find "BlackMarketTable" select the dword -> follow it the only other subroutine -> CCSGameRules::SetBlackMarketPrices is called before return |
| 27 | + // CCSGameRules::SetBlackMarketPrices sets weapon price & default price |
25 | 28 | "WeaponPrice" |
26 | 29 | { |
27 | 30 | "windows" "2308" |
28 | 31 | "linux" "2308" |
29 | | - "mac" "2308" |
30 | 32 | } |
31 | 33 | //Offset into SetClanTag to find clan tag's offset from player |
32 | 34 | "ClanTagOffset" |
33 | 35 | { |
34 | 36 | "windows" "24" |
35 | | - "linux" "29" |
36 | | - "mac" "18" |
| 37 | + "linux" "23" |
37 | 38 | } |
38 | | - //Offset into CheckWinLimit to find CT team score offset from gamerules. For mac this is an offset into CCSGameRules::Think |
| 39 | + //Offset into CheckWinLimit to find CT team score offset from gamerules. For windows this is an offset into CCSGameRules::Think |
39 | 40 | "CTTeamScoreOffset" |
40 | 41 | { |
41 | | - "windows" "18" |
| 42 | + "windows" "274" |
42 | 43 | "linux" "27" |
43 | | - "mac" "205" |
44 | 44 | } |
45 | | - //Offset into CheckWinLimit to find T team score offset from gamerules. For mac this is an offset into CCSGameRules::Think |
| 45 | + //Offset into CheckWinLimit to find T team score offset from gamerules. For windows this is an offset into CCSGameRules::Think |
46 | 46 | "TTeamScoreOffset" |
47 | 47 | { |
48 | | - "windows" "56" |
| 48 | + "windows" "395" |
49 | 49 | "linux" "38" |
50 | | - "mac" "216" |
51 | 50 | } |
52 | 51 | } |
53 | 52 | "Signatures" |
54 | 53 | { |
| 54 | + // String: "reload\n" follow the xref, there are two subroutines, pick the bigger one there's a dynamic cast in it |
| 55 | + // That subroutine is "respawn(CBaseEntity*, bool)", follow the xref, there are once again two subroutines, pick the smaller one. |
55 | 56 | "RoundRespawn" |
56 | 57 | { |
57 | 58 | "library" "server" |
58 | | - "windows" "\x55\x8B\xEC\x51\x89\x2A\x2A\x8B\x2A\x2A\x8B\x10\x8B" |
| 59 | + "windows" "\x55\x8B\xEC\x51\x89\x4D\xFC\x8B\x45\xFC\x8B\x10" |
59 | 60 | "linux" "@_ZN9CCSPlayer12RoundRespawnEv" |
60 | 61 | } |
| 62 | + // String: "CCSPlayer::SwitchTeam( %d ) - invalid team index." |
61 | 63 | "SwitchTeam" |
62 | 64 | { |
63 | 65 | "library" "server" |
64 | | - "windows" "\x55\x8B\xEC\x83\xEC\x2A\x89\x4D\x2A\x8B\x45\x2A\x50\xE8\x2A\x2A\x2A\x2A\x83\xC4\x04\x85\xC0\x74" |
| 66 | + "windows" "\x55\x8B\xEC\x83\xEC\x5C\x89\x4D\xFC" |
65 | 67 | "linux" "@_ZN9CCSPlayer10SwitchTeamEi" |
66 | 68 | } |
| 69 | + // String: "#Alias_Not_Avail" |
67 | 70 | "HandleCommand_Buy_Internal" |
68 | 71 | { |
69 | 72 | "library" "server" |
70 | | - "windows" "\x55\x8B\xEC\x83\xEC\x2A\x89\x4D\x2A\x6A\x00\x8B\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x0F\xB6\xC0\x85\xC0\x74" |
| 73 | + "windows" "\x55\x8B\xEC\x83\xEC\x28\x89\x4D\xF8\x6A\x00" |
71 | 74 | "linux" "@_ZN9CCSPlayer26HandleCommand_Buy_InternalEPKc" |
72 | 75 | } |
| 76 | + // After having located "HandleCommand_Buy_Internal" |
| 77 | + // Jump back to the string "#Alias_Not_Avail" there should be two conditional jumps before |
| 78 | + // Pick the first one, and follow it. It should take you to a block that immediately calls another subroutine with one parameter |
| 79 | + // and then test the return value to perform yet another jump. That subroutine is GetWeaponPrice |
73 | 80 | "GetWeaponPrice" |
74 | 81 | { |
75 | 82 | "library" "server" |
76 | | - "windows" "\x8B\x81\x04\x09\x00\x00\xC3" |
| 83 | + "windows" "\x8B\x81\x04\x09\x00\x00" |
77 | 84 | "linux" "@_ZNK13CCSWeaponInfo14GetWeaponPriceEv" |
78 | 85 | } |
| 86 | + // String: "ValveBiped.Bip01_R_Hand" |
79 | 87 | "CSWeaponDrop"//Wildcard first 6 bytes for CS:S DM |
80 | 88 | { |
81 | 89 | "library" "server" |
82 | | - "windows" "\x2A\x2A\x2A\x2A\x2A\x2A\x01\x00\x00\x89\x4D\xFC\xC6\x45\x2A\x2A\x8B\x4D\x2A\xE8\x2A\x2A\x2A\x2A\x0F\xB6\xC0" |
| 90 | + "windows" "\x55\x8B\xEC\x81\xEC\x80\x01\x00\x00\x89\x4D\xFC" |
83 | 91 | "linux" "@_ZN9CCSPlayer12CSWeaponDropEP17CBaseCombatWeaponbb" |
84 | 92 | } |
| 93 | + // String: "CTsWin" |
85 | 94 | "TerminateRound" |
86 | 95 | { |
87 | 96 | "library" "server" |
88 | | - "windows" "\x55\x8B\xEC\x83\xEC\x2A\x8B\x45\x0C\x53\x56\x57\x33\xF6" |
| 97 | + "windows" "\x55\x8B\xEC\x83\xEC\x28\x8B\x45\x0C" |
89 | 98 | "linux" "@_ZN12CCSGameRules14TerminateRoundEfi" |
90 | 99 | } |
| 100 | + // String: "d3au1" follow the xref to the array |
| 101 | + // Follow the xref of that array, its only used in GetTranslatedWeaponAlias |
| 102 | + // if you're in the right place, the subroutine should contain the string 'ak47' |
91 | 103 | "GetTranslatedWeaponAlias" |
92 | 104 | { |
93 | 105 | "library" "server" |
94 | | - "windows" "\x55\x8B\xEC\x56\x57\x8B\x7D\x2A\x33\xF6\x8D\x9B\x00\x00\x00\x00\x57\xFF\x34\xF5\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x83\xC4\x08\x85\xC0\x74\x2A\x46\x83\xFE\x1A\x72\x2A\x8B\xC7\x5F\x5E\x5D\xC3" |
| 106 | + "windows" "\x55\x8B\xEC\x56\x57\x8B\x7D\x08\x33\xF6\x8D\x9B\x00\x00\x00\x00\x57\xFF\x34\xF5\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x83\xC4\x08\x85\xC0\x74\x2A\x46\x83\xFE\x1A" |
95 | 107 | "linux" "@_Z24GetTranslatedWeaponAliasPKc" |
96 | 108 | } |
| 109 | + // String: "weapon_assaultsuit" follow the xref to the array, first element should be "weapon_p228" |
| 110 | + // Follow the xref o that array, it should be used in GetWeaponInfo |
97 | 111 | "GetWeaponInfo" |
98 | 112 | { |
99 | 113 | "library" "server" |
100 | | - "windows" "\x55\x8B\xEC\x8B\x4D\x08\x85\xC9\x75\x2A\x33\xC0\x5D\xC3\x83\x2A\x2A\x7C\x2A\x69\xC9" |
| 114 | + "windows" "\x55\x8B\xEC\x8B\x4D\x08\x56\x85\xC9\x74\x2A\x83\xF9\x1F" |
101 | 115 | "linux" "@_Z13GetWeaponInfo10CSWeaponID" |
102 | 116 | } |
| 117 | + // String: "ClangTagChanged" follow the xref, there should be conditional jump to a node with 4 subroutines call and one virtual function call |
| 118 | + // SetClangTag is the second subroutine called |
103 | 119 | "SetClanTag" |
104 | 120 | { |
105 | 121 | "library" "server" |
106 | | - "windows" "\x55\x8B\xEC\x51\x89\x2A\x2A\x83\x2A\x2A\x2A\x74\x2A\x6A\x2A\x8B\x2A\x2A\x50" |
| 122 | + "windows" "\x55\x8B\xEC\x51\x89\x4D\xFC\x83\x7D\x08\x00\x74\x2A\x6A\x10" |
107 | 123 | "linux" "@_ZN9CCSPlayer10SetClanTagEPKc" |
108 | 124 | } |
| 125 | + // String: "p228" the xref should you to an array that's being used in two subroutines, where the increment is * 8 |
| 126 | + // This is WeaponIDToAlias & AliasToWeaponID. To tell apart one from the other, the array will be used as return value in AliasToWeaponID |
109 | 127 | "AliasToWeaponID" |
110 | 128 | { |
111 | 129 | "library" "server" |
112 | | - "windows" "\x55\x8B\xEC\x56\x57\x8B\x7D\x08\x85\xFF\x74\x2A\x33\xF6\x8B\xFF" |
| 130 | + "windows" "\x55\x8B\xEC\x8B\x4D\x08\x33\xC0\xEB\x2A\x8D\x9B\x00\x00\x00\x00\x39\x0C\xC5\x2A\x2A\x2A\x2A\x74\x2A\x40\x83\xF8\x26" |
113 | 131 | "linux" "@_Z15AliasToWeaponIDPKc" |
114 | 132 | } |
115 | 133 | "WeaponIDToAlias" |
116 | 134 | { |
117 | 135 | "library" "server" |
118 | | - "windows" "\x55\x8B\xEC\x8B\x4D\x08\x33\xC0\xEB\x2A\x8D\x9B\x00\x00\x00\x00\x39\x0C\xC5\x2A\x2A\x2A\x2A\x74\x2A\x40\x83\xF8\x26\x72\x2A\x33\xC0\x5D" |
| 136 | + "windows" "\x55\x8B\xEC\x56\x57\x8B\x7D\x08\x85\xFF\x74\x2A\x33\xF6\x8B\xFF\x57" |
119 | 137 | "linux" "@_Z15WeaponIDToAliasi" |
120 | 138 | } |
| 139 | + // String: "Team \"CT\" triggered \"Intermission_Win_Limit\"\n" |
| 140 | + // Note: Function got inlined on windows inside CCSGameRules::Think |
121 | 141 | "CheckWinLimit" |
122 | 142 | { |
123 | 143 | "library" "server" |
124 | | - "windows" "\xA1\x2A\x2A\x2A\x2A\x56\x8B\xF1\x8B\x48\x30\x85\xC9\x74\x2A\x0F" |
| 144 | + "windows" "\x55\x8B\xEC\x83\xEC\x44\x56\x57\x8B\xF9" |
125 | 145 | "linux" "@_ZN12CCSGameRules13CheckWinLimitEv" |
126 | 146 | } |
| 147 | + // Inlined on windows |
127 | 148 | "SetModelFromClass" |
128 | 149 | { |
129 | 150 | "library" "server" |
130 | | - "windows" "\x55\x8B\xEC\x83\xEC\x34\x89\x4D\xFC\x8B\x4D\xFC\xE8\x2A\x2A\x2A\x2A\x83\xF8\x02" |
| 151 | + "windows" "" |
131 | 152 | "linux" "@_ZN9CCSPlayer17SetModelFromClassEv" |
132 | 153 | } |
133 | 154 | } |
|
142 | 163 |
|
143 | 164 | "Offsets" |
144 | 165 | { |
| 166 | + // String: "round_mvp" right above a member variable should be getting incremented |
| 167 | + // This is m_iMVPs, take the offset and subtract it by the offset of the sendprop above |
145 | 168 | "MVPs" |
146 | 169 | { |
147 | | - /* factors in 66 (size of m_bPlayerDominatingMe array (bool size * (65 maxplayers + 1))) |
148 | | - ... plus another 3 because alignment(?) lolidk */ |
149 | 170 | "windows" "69" |
150 | 171 | "linux" "69" |
151 | | - "mac" "69" |
152 | 172 | } |
153 | 173 | } |
154 | 174 | } |
|
0 commit comments