├── settings.ini ├── Patterns ├── 93R.txt ├── FAMAS.txt ├── FCAR.txt ├── XP54.txt ├── AKM.txt ├── M11.txt ├── LGUN.txt └── M60.txt ├── hyde.dll ├── hyde64.dll ├── uuid_generator.py ├── README.md └── RunMe.ahk /settings.ini: -------------------------------------------------------------------------------- 1 | [settings] 2 | sensitivity="50" -------------------------------------------------------------------------------- /Patterns/93R.txt: -------------------------------------------------------------------------------- 1 | 0.00, 0.00 2 | -0.05, 0.70 3 | -0.10, 0.80 -------------------------------------------------------------------------------- /Patterns/FAMAS.txt: -------------------------------------------------------------------------------- 1 | 0.00, 0.00 2 | 0.00, 0.50 3 | 0.05, 0.55 4 | -------------------------------------------------------------------------------- /hyde.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lew29/The-Finals-Anti-Recoil/HEAD/hyde.dll -------------------------------------------------------------------------------- /hyde64.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lew29/The-Finals-Anti-Recoil/HEAD/hyde64.dll -------------------------------------------------------------------------------- /Patterns/FCAR.txt: -------------------------------------------------------------------------------- 1 | 0.00, 0.00 2 | 0.00, 0.60 3 | 0.00, 0.90 4 | 0.05, 1.35 5 | -0.40, 1.70 6 | -0.40, 1.40 7 | -0.40, 1.40 8 | -0.30, 0.90 9 | -0.20, 0.60 10 | -0.10, 0.60 11 | -0.10, 0.60 12 | -0.10, 0.50 13 | -0.05, 0.10 14 | -0.05, 0.10 15 | -0.04, 0.10 16 | -0.04, 0.10 17 | -0.04, 0.10 18 | -0.02, 0.20 19 | -0.02, 0.20 20 | -0.02, 0.20 -------------------------------------------------------------------------------- /Patterns/XP54.txt: -------------------------------------------------------------------------------- 1 | 0.00, 0.00 2 | -0.10, 1.00 3 | -0.10, 1.00 4 | -0.10, 0.80 5 | -0.10, 0.80 6 | -0.10, 0.80 7 | -0.10, 0.80 8 | -0.10, 0.80 9 | -0.10, 0.80 10 | -0.10, 0.80 11 | -0.10, 0.40 12 | -0.10, 0.30 13 | -0.10, 0.30 14 | -0.10, 0.30 15 | -0.10, 0.20 16 | -0.10, 0.10 17 | -0.10, 0.10 18 | -0.10, 0.10 19 | -0.10, 0.00 20 | -0.10, 0.00 21 | -0.10, 0.00 22 | -0.10, 0.00 23 | -0.10, 0.00 24 | -0.10, 0.00 25 | -0.10, 0.00 26 | -0.10, 0.00 27 | -0.10, 0.00 28 | -0.10, 0.00 29 | -0.10, 0.00 30 | -------------------------------------------------------------------------------- /Patterns/AKM.txt: -------------------------------------------------------------------------------- 1 | 0.00, 0.00 2 | 0.20, 0.40 3 | 0.30, 1.00 4 | 0.10, 1.20 5 | -0.20, 1.20 6 | -0.30, 1.20 7 | -0.30, 0.50 8 | -0.30, 0.50 9 | -0.30, 0.50 10 | -0.20, 0.50 11 | -0.10, 0.50 12 | -0.10, 0.50 13 | -0.10, 0.50 14 | -0.10, 0.50 15 | 0.10, 0.50 16 | 0.10, 0.30 17 | 0.10, 0.30 18 | 0.10, 0.30 19 | 0.15, 0.30 20 | 0.10, 0.30 21 | 0.15, 0.30 22 | 0.10, 0.30 23 | 0.15, 0.20 24 | 0.10, 0.20 25 | 0.10, 0.10 26 | 0.15, 0.10 27 | 0.10, 0.00 28 | 0.10, 0.00 29 | 0.10, 0.00 30 | 0.10, 0.00 31 | 0.15, 0.00 32 | 0.15, 0.00 33 | 0.15, 0.00 34 | 0.15, 0.00 35 | -------------------------------------------------------------------------------- /uuid_generator.py: -------------------------------------------------------------------------------- 1 | import uuid 2 | import re 3 | 4 | def updateUUID(filename, new_uuid): 5 | with open(filename, "r") as f: 6 | content = f.read() 7 | 8 | new_uuid_str = 'global UUID := "' + new_uuid + '"' 9 | 10 | content_new = re.sub('global UUID := ".+"', new_uuid_str, content) 11 | 12 | with open(filename, "w") as f: 13 | f.write(content_new) 14 | 15 | 16 | if __name__ == '__main__': 17 | new_uuid = uuid.uuid4().hex 18 | 19 | updateUUID('RunMe.ahk', new_uuid) 20 | input("Done! New UUID: " + new_uuid) # to let people know the script is actually done... 21 | 22 | 23 | -------------------------------------------------------------------------------- /Patterns/M11.txt: -------------------------------------------------------------------------------- 1 | 0.00. 0.00 2 | 0.10, 0.60 3 | 0.10, 0.60 4 | 0.10, 0.60 5 | 0.10, 0.60 6 | 0.10, 0.60 7 | 0.10, 0.40 8 | 0.10, 0.40 9 | -0.30, 0.20 10 | -0.30, 0.20 11 | -0.30, 0.20 12 | -0.30, 0.20 13 | -0.20, 0.20 14 | -0.20, 0.20 15 | -0.20, 0.20 16 | -0.20, 0.20 17 | 0.30, 0.20 18 | 0.30, 0.20 19 | 0.30, 0.10 20 | 0.30, 0.10 21 | 0.30, 0.10 22 | 0.30, 0.10 23 | 0.30, 0.10 24 | 0.40, 0.10 25 | -0.40, 0.10 26 | -0.40, 0.10 27 | -0.40, 0.10 28 | -0.40, 0.10 29 | -0.40, 0.10 30 | -0.40, 0.10 31 | -0.40, 0.10 32 | -0.40, 0.10 33 | 0.20, 0.10 34 | 0.20, 0.10 35 | 0.20, 0.10 36 | 0.10, 0.10 37 | 0.10, 0.10 38 | 0.10, 0.10 39 | 0.10, 0.10 40 | 0.10, 0.10 41 | -------------------------------------------------------------------------------- /Patterns/LGUN.txt: -------------------------------------------------------------------------------- 1 | 0.00, 0.00 2 | 0.00, 1.80 3 | 0.00, 1.80 4 | 0.00, 1.80 5 | 0.00, 1.30 6 | 0.00, 1.20 7 | 0.00, 1.00 8 | 0.00, 0.50 9 | 0.00, 0.50 10 | -0.40, 0.50 11 | -0.40, 0.50 12 | -0.40, 0.50 13 | -0.40, 0.50 14 | -0.40, 0.50 15 | -0.40, 0.50 16 | 0.40, 0.50 17 | 0.40, 0.50 18 | 0.40, 0.50 19 | 0.40, 0.30 20 | 0.40, 0.30 21 | 0.40, 0.30 22 | 0.40, 0.30 23 | 0.40, 0.30 24 | 0.40, 0.30 25 | 0.40, 0.30 26 | 0.40, 0.30 27 | 0.40, 0.30 28 | -0.30, 0.30 29 | -0.20, 0.10 30 | -0.20, 0.10 31 | -0.30, 0.10 32 | -0.20, 0.10 33 | -0.20, 0.10 34 | -0.30, 0.10 35 | -0.20, 0.00 36 | -0.20, 0.00 37 | -0.30, 0.00 38 | -0.20, 0.00 39 | -0.20, 0.00 40 | -0.30, 0.00 41 | -0.20, 0.00 42 | -0.20, 0.00 43 | -0.30, 0.00 44 | -0.30, 0.00 45 | -0.20, 0.00 46 | -0.20, 0.00 47 | -0.20, 0.00 48 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # The-Finals-Anti-Recoil 2 | **Maybe detected wouldn't run on main account.**\ 3 | [UnknownCheats thread](https://www.unknowncheats.me/forum/other-fps-games/616379-finals-ahk-anti-recoil.html). 4 | ## How to run 5 | Open the "settings.ini" file using Notepad and set your sensitivity.\ 6 | Run "RunMe.ahk"\ 7 | **Make sure to turn "Mouse Focal Length Sensitivity Scaling" off.**\ 8 | ![](https://i.imgur.com/Os7T18d.png) 9 | ## Hotkeys 10 | TTS should tell you what is selected 11 | - F1 - Disabled 12 | - F2 - M11 13 | - F3 - XP-54 14 | - F4 - 93R 15 | - F5 - AKM 16 | - F6 - FCAR 17 | - F7 - FAMAS 18 | - F8 - M60 19 | - F9 - Lewis Gun 20 | - End - Closes Program\ 21 | ![](https://i.imgur.com/BdLLhBL.png) 22 | > Patterns could be improved (especially for Lewis gun and M60) 23 | ## Credit 24 | Took inspiration from [mgsweet Apex-NoRecoil script](https://github.com/mgsweet/Apex-NoRecoil-2021).\ 25 | Used modification of [Tientie method of generating recoil patterns](https://github.com/vengefulcrop/AE-Recoil-Pattern-Generation/) for the patterns. 26 | -------------------------------------------------------------------------------- /Patterns/M60.txt: -------------------------------------------------------------------------------- 1 | 0.00, 0.00 2 | 0.20, 1.00 3 | 0.20, 1.00 4 | 0.20, 1.00 5 | 0.20, 1.20 6 | 0.20, 1.20 7 | 0.20, 1.20 8 | 0.20, 1.20 9 | 0.20, 0.70 10 | -0.50, 0.70 11 | -0.40, 0.60 12 | -0.50, 0.70 13 | -0.40, 0.50 14 | -0.40, 0.30 15 | -0.20, 0.30 16 | 0.30, 0.30 17 | 0.30, 0.30 18 | 0.30, 0.30 19 | 0.30, 0.30 20 | 0.30, 0.30 21 | -0.40, 0.20 22 | -0.40, 0.30 23 | -0.40, 0.30 24 | -0.30, 0.20 25 | -0.30, 0.20 26 | -0.30, 0.20 27 | -0.20, 0.20 28 | -0.20, 0.10 29 | -0.20, 0.20 30 | -0.10, 0.10 31 | -0.10, 0.10 32 | -0.20, 0.20 33 | -0.10, 0.10 34 | 0.10, 0.10 35 | 0.10, 0.10 36 | 0.10, 0.10 37 | 0.10, 0.20 38 | 0.10, 0.10 39 | 0.10, 0.10 40 | 0.10, 0.20 41 | 0.10, 0.20 42 | 0.20, 0.10 43 | 0.10, 0.10 44 | 0.10, 0.20 45 | 0.10, 0.10 46 | 0.10, 0.20 47 | 0.20, 0.10 48 | 0.10, 0.10 49 | 0.20, 0.20 50 | 0.20, 0.10 51 | 0.10, 0.10 52 | 0.10, 0.20 53 | 0.20, 0.10 54 | 0.10, 0.10 55 | 0.10, 0.20 56 | 0.20, 0.10 57 | 0.10, 0.20 58 | 0.10, 0.20 59 | 0.10, 0.10 60 | 0.20, 0.20 61 | 0.10, 0.10 62 | -0.10, 0.10 63 | -0.10, 0.20 64 | 0.00, 0.10 65 | -0.10, 0.20 66 | -0.10, 0.10 67 | 0.00, 0.20 68 | -0.10, 0.10 69 | -0.10, 0.10 70 | 0.00, 0.20 71 | -------------------------------------------------------------------------------- /RunMe.ahk: -------------------------------------------------------------------------------- 1 | #NoEnv 2 | #MaxHotkeysPerInterval 99000000 3 | #HotkeyInterval 99000000 4 | #KeyHistory 0 5 | #SingleInstance force 6 | #MaxThreadsBuffer on 7 | #Persistent 8 | Process, Priority, , A 9 | SetBatchLines, -1 10 | ListLines Off 11 | SetWorkingDir %A_ScriptDir% 12 | SetKeyDelay, -1, -1 13 | SetMouseDelay, -1 14 | SetDefaultMouseSpeed, 0 15 | SetWinDelay, -1 16 | SetControlDelay, -1 17 | SendMode Input 18 | 19 | global UUID := "fd1ba7d2558845678c20b46c5035f454" 20 | 21 | RunAsAdmin() 22 | HideProcess() 23 | GoSub, initialise 24 | 25 | initialise: 26 | { 27 | IniRead, sensitivity, settings.ini, settings, sensitivity 28 | global yaw := sensitivity * 0.00101 29 | 30 | global m11 := [LoadPattern("M11.txt"), 60] 31 | global xp54 := [LoadPattern("XP54.txt"), 68] 32 | global r93 := [LoadPattern("93R.txt"), 64] 33 | 34 | global akm := [LoadPattern("AKM.txt"), 99] 35 | global fcar := [LoadPattern("FCAR.txt"), 111] 36 | global famas := [LoadPattern("FAMAS.txt"), 52] 37 | 38 | global m60 := [LoadPattern("M60.txt"), 100] 39 | global lewisgun := [LoadPattern("LGUN.txt"), 114] 40 | 41 | global currentPattern 42 | global interval 43 | 44 | SetGun(fcar) 45 | Return 46 | } 47 | 48 | LoadPattern(filename) 49 | { 50 | FileRead, patternStr, %A_ScriptDir%\Patterns\%filename% 51 | patterns := [] 52 | 53 | Loop, Parse, patternStr, `n, `, , `" ,`r 54 | { 55 | if StrLen(A_LoopField) == 0 56 | Continue 57 | 58 | pattern := StrSplit(A_LoopField, ", ") 59 | pattern[1] := Round(pattern[1]/yaw) 60 | pattern[2] := Round(pattern[2]/yaw) 61 | 62 | patterns.Insert(pattern) 63 | } 64 | 65 | return patterns 66 | } 67 | 68 | SetGun(gun) 69 | { 70 | global currentPattern := gun[1] 71 | global interval := gun[2] 72 | return 73 | } 74 | 75 | Speak(text) 76 | { 77 | sp := ComObjCreate("SAPI.SpVoice") 78 | sp.Rate := 6 79 | sp.Speak(text) 80 | Return 81 | } 82 | 83 | ~$*LButton:: 84 | { 85 | If (!GetKeyState("RButton")) 86 | Return 87 | 88 | lMax := currentPattern.MaxIndex() 89 | 90 | Loop 91 | { 92 | If (!GetKeyState("LButton", "P") || A_Index > (lmax)) 93 | Return 94 | 95 | pattern := currentPattern[A_Index] 96 | 97 | x := pattern[1] 98 | y := pattern[2] 99 | 100 | Move(x, y) 101 | Sleep, interval 102 | } 103 | Return 104 | } 105 | 106 | Move(x, y) 107 | { 108 | DllCall("mouse_event", uint, 1, int, x, int, y) 109 | Return 110 | } 111 | 112 | ToDegrees(num) 113 | { 114 | Return num / 0.01745329252 115 | } 116 | 117 | ToRadians(num) 118 | { 119 | Return num * 0.01745329252 120 | } 121 | 122 | ~$*F1:: 123 | { 124 | SetGun(null) 125 | Speak("None") 126 | Return 127 | } 128 | 129 | ~$*F2:: 130 | { 131 | SetGun(m11) 132 | Speak("M11 selected") 133 | Return 134 | } 135 | 136 | ~$*F3:: 137 | { 138 | SetGun(xp54) 139 | Speak("XP54 selected") 140 | Return 141 | } 142 | 143 | ~$*F4:: 144 | { 145 | SetGun(r93) 146 | Speak("9 3R selected") 147 | Return 148 | } 149 | 150 | ~$*F5:: 151 | { 152 | SetGun(akm) 153 | Speak("AKM selected") 154 | Return 155 | } 156 | 157 | ~$*F6:: 158 | { 159 | SetGun(fcar) 160 | Speak("F-CAR selected") 161 | Return 162 | } 163 | 164 | ~$*F7:: 165 | { 166 | SetGun(famas) 167 | Speak("Famas selected") 168 | Return 169 | } 170 | 171 | ~$*F8:: 172 | { 173 | SetGun(m60) 174 | Speak("M60 selected") 175 | Return 176 | } 177 | 178 | ~$*F9:: 179 | { 180 | SetGun(lewisgun) 181 | Speak("Lewis gun selected") 182 | Return 183 | } 184 | 185 | ~$*End:: 186 | { 187 | Speak("Exiting") 188 | ExitApp 189 | } 190 | 191 | RunAsAdmin() 192 | { 193 | Global 0 194 | IfEqual, A_IsAdmin, 1, Return 0 195 | Loop, %0% 196 | params .= A_Space . %A_Index% 197 | DllCall("shell32\ShellExecute" (A_IsUnicode ? "":"A"),uint,0,str,"RunAs",str,(A_IsCompiled ? A_ScriptFullPath : A_AhkPath),str,(A_IsCompiled ? "": """" . A_ScriptFullPath . """" . A_Space) params,str,A_WorkingDir,int,1) 198 | ExitApp 199 | } 200 | 201 | HideProcess() 202 | { 203 | If ((A_Is64bitOS=1) && (A_PtrSize!=4)) 204 | hMod := DllCall("LoadLibrary", Str, "hyde64.dll", Ptr) 205 | Else If ((A_Is32bitOS=1) && (A_PtrSize=4)) 206 | hMod := DllCall("LoadLibrary", Str, "hyde.dll", Ptr) 207 | Else 208 | { 209 | MsgBox, Mixed Versions detected!`nOS Version and AHK Version need to be the same (x86 & AHK32 or x64 & AHK64).`n`nScript will now terminate! 210 | ExitApp 211 | } 212 | 213 | If (hMod) 214 | { 215 | hHook := DllCall("SetWindowsHookEx", Int, 5, Ptr, DllCall("GetProcAddress", Ptr, hMod, AStr, "CBProc", ptr), Ptr, hMod, Ptr, 0, Ptr) 216 | If (!hHook) 217 | { 218 | MsgBox, SetWindowsHookEx failed!`nScript will now terminate! 219 | ExitApp 220 | } 221 | } 222 | Else 223 | { 224 | MsgBox, LoadLibrary failed!`nScript will now terminate! 225 | ExitApp 226 | } 227 | Return 228 | } --------------------------------------------------------------------------------