diff --git a/Documentation/2025-03-13-213630_1600x900_scrot.png b/Documentation/2025-03-13-213630_1600x900_scrot.png
new file mode 100644
index 00000000..6600fc17
Binary files /dev/null and b/Documentation/2025-03-13-213630_1600x900_scrot.png differ
diff --git a/Documentation/2025-03-15-011749_1600x900_scrot.png b/Documentation/2025-03-15-011749_1600x900_scrot.png
new file mode 100644
index 00000000..b45cf5d3
Binary files /dev/null and b/Documentation/2025-03-15-011749_1600x900_scrot.png differ
diff --git a/Documentation/2025-03-15-072452_1600x900_scrot.png b/Documentation/2025-03-15-072452_1600x900_scrot.png
new file mode 100644
index 00000000..d14b0b7f
Binary files /dev/null and b/Documentation/2025-03-15-072452_1600x900_scrot.png differ
diff --git a/Documentation/2025-03-15-072942_1600x900_scrot.png b/Documentation/2025-03-15-072942_1600x900_scrot.png
new file mode 100644
index 00000000..99ff4e58
Binary files /dev/null and b/Documentation/2025-03-15-072942_1600x900_scrot.png differ
diff --git a/Documentation/2025-03-16-035937_1600x900_scrot.png b/Documentation/2025-03-16-035937_1600x900_scrot.png
new file mode 100644
index 00000000..bf5f53cc
Binary files /dev/null and b/Documentation/2025-03-16-035937_1600x900_scrot.png differ
diff --git a/README.md b/README.md
index e2f33af4..e43a8132 100644
--- a/README.md
+++ b/README.md
@@ -1,102 +1,92 @@
-# Xash3D FWGS Engine
-[](https://github.com/FWGS/xash3d-fwgs/actions/workflows/c-cpp.yml) [](https://cirrus-ci.com/github/FWGS/xash3d-fwgs) \
-[](http://fwgsdiscord.mentality.rip/) [](https://t.me/flyingwithgauss) \
-[](https://github.com/FWGS/xash3d-fwgs/releases/tag/continuous)
+# Xrasher
-Xash3D ([pronounced](https://ipa-reader.com/?text=ks%C9%91%CA%82) `[ksɑʂ]`) FWGS is a game engine, aimed to provide compatibility with Half-Life Engine and extend it, as well as to give game developers well known workflow.
+Xrasher is a BVFF cheating super-client for the Xash3D game engine.
+Read the [original README](README_old.md)
-Xash3D FWGS is a heavily modified fork of an original [Xash3D Engine](https://www.moddb.com/engines/xash3d-engine) by Unkle Mike.
+## Features
-## Donate
-[](Documentation/donate.md) \
-If you like Xash3D FWGS, consider supporting individual engine maintainers. By supporting us, you help to continue developing this game engine further. The sponsorship links are available in [documentation](Documentation/donate.md).
+* Complete Ban Bypass
+ * Xrasher is completely immune to bans, yes seriously, if you get jannied on
+ a server for any reason, you can literally just join back in. This is
+ because Xash uses an MD5 hash (generated in various, somewhat strange
+ ways) stored locally, Xrasher completely nullifies the persistence of
+ this "XashID" and generates a new one each time.
-## Fork features
-* Steam Half-Life (HLSDK 2.5) support.
-* Crossplatform and modern compilers support: supports Windows, Linux, BSD & Android on x86 & ARM and [many more](Documentation/ports.md).
-* Better multiplayer: multiple master servers, headless dedicated server, voice chat, [GoldSrc protocol support](Documentation/goldsrc-protocol-support.md) and IPv6 support.
-* Multiple renderers support: OpenGL, GLESv1, GLESv2 and Software.
-* Advanced virtual filesystem: `.pk3` and `.pk3dir` support, compatibility with GoldSrc FS module, fast case-insensitivity emulation for crossplatform.
-* Mobility API: better game integration on mobile devices (vibration, touch controls).
-* Different input methods: touch and gamepad in addition to mouse & keyboard.
-* TrueType font rendering, as a part of mainui_cpp.
-* External VGUI support module.
-* PNG & KTX2 image format support.
-* Ogg Vorbis (`.ogg`) & Ogg Opus (`.opus`) audio formats support.
-* [A set of small improvements](Documentation/), without broken compatibility.
+* Wallhack
+ * A perfect and natural wallhack, all relevant entities and players
+ are visible through walls. A wallhack implementation is provided
+ for both the GL renderer (recommended) and the software-renderer
+ (sometimes glitchy).
-## Installation & Running
-0) Get Xash3D FWGS binaries: you can use [testing](https://github.com/FWGS/xash3d-fwgs/releases/tag/continuous) build or you can compile engine from source code.
-1) Copy engine binaries to some directory.
-2) Copy `valve` directory from [Half-Life](https://store.steampowered.com/app/70/HalfLife/) to directory with engine binaries.
-If your CPU is NOT x86 compatible or you're running 64-bit version of the engine, you may want to compile [Half-Life SDK](https://github.com/FWGS/hlsdk-portable).
-This repository contains our fork of HLSDK and restored source code for Half-Life expansions and some mods.
-You still needed to copy `valve` directory as all game resources located there.
-3) Run the main executable (`xash3d.exe` or AppImage).
+* Silent Aimbot
+ * Very simple and effective silent-aimbot.
-For additional info, run Xash3D with `-help` command line key.
+* Random Name Shuffling
+ * Everytime you start the Xrasher client or join a server, a random name is
+ automatically selected and set for you, confusing your victims and the
+ jannies.
-## Contributing
-* Before sending an issue, check if someone already reported your issue. Make sure you're following "How To Ask Questions The Smart Way" guide by Eric Steven Raymond. Read more: http://www.catb.org/~esr/faqs/smart-questions.html.
-* Issues are accepted in both English and Russian.
-* Before sending a PR, check if you followed our contribution guide in CONTRIBUTING.md file.
+* Clientside cheats unlocked
-## Build instructions
-We are using Waf build system. If you have some Waf-related questions, I recommend you to read [Waf Book](https://waf.io/book/).
+* "Multiplayer" protected commands unlocked
-NOTE: NEVER USE GitHub's ZIP ARCHIVES. GitHub doesn't include external dependencies we're using!
+* Simple UI
+ * Turn on 'net\_graph' to enable it.
-### Prerequisites
-If your CPU is x86 compatible and you're on Windows or Linux, we are building 32-bit code by default. This was done to maintain compatibility with Steam releases of Half-Life and based on it's engine games.
-Even if Xash3D FWGS does support targetting 64-bit, you can't load games without recompiling them from source code!
+* No flashing (flashbangs), visual viewpunch, or screenshake, your eyeballs are stoic
-If your CPU is NOT x86 compatible or you decided build 64-bit version of engine, you may want to compile [Half-Life SDK](https://github.com/FWGS/hlsdk-portable).
-This repository contains our fork of HLSDK and restored source code for Half-Life expansions and some mods.
+## Screenshots
-#### Windows (Visual Studio)
-* Install Visual Studio.
-* Install latest [Python](https://python.org) **OR** run `cinst python.install` if you have Chocolatey.
-* Install latest [Git](https://git-scm.com/download/win) **OR** run `cinst git.install` if you have Chocolatey.
-* Download [SDL2](https://libsdl.org/download-2.0.php) development package for Visual Studio.
-* Clone this repository: `git clone --recursive https://github.com/FWGS/xash3d-fwgs`.
-* Make sure you have at least 12GB of free space to store all build-time dependencies: ~10GB for Visual Studio, 300 MB for Git, 100 MB for Python and other.
+Half-Life Deathmatch, demonstrating wallhack, aimbot, fullbright hack, ui, etc.
+
+
-#### GNU/Linux
-##### Debian/Ubuntu
-* Only for 32-bit engine on 64-bit x86 operating system:
- * Enable i386 on your system: `$ sudo dpkg --add-architecture i386`.
- * Install `aptitude` ([why?](https://github.com/FWGS/xash3d-fwgs/issues/1828#issuecomment-2415131759)): `$ sudo apt update && sudo apt upgrade && sudo apt install aptitude`
- * Install development tools: `$ sudo aptitude --without-recommends install git build-essential gcc-multilib g++-multilib libsdl2-dev:i386 libfreetype-dev:i386 libopus-dev:i386 libbz2-dev:i386 libvorbis-dev:i386 libopusfile-dev:i386 libogg-dev:i386`.
- * Set PKG_CONFIG_PATH environment variable to point at 32-bit libraries: `$ export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig`.
+Counter Strike 1.6, demonstrating wallhack, aimbot, fullbright hack, ui, etc.
+
+
+
-* For 64-bit engine on 64-bit x86 and other non-x86 systems:
- * Install development tools: `$ sudo apt install git build-essential python libsdl2-dev libfreetype6-dev libopus-dev libbz2-dev libvorbis-dev libopusfile-dev libogg-dev`.
+## Setup
-* Clone this repostory: `$ git clone --recursive https://github.com/FWGS/xash3d-fwgs`.
+Copy binaries or compile Xrasher to your gayme's root. Run it.
-##### RedHat/Fedora
-* Only for 32-bit engine on 64-bit x86 operating system:
- * Install development tools: `$ sudo dnf install git gcc gcc-c++ glibc-devel.i686 SDL2-devel.i686 opus-devel.i686 freetype-devel.i686 bzip2-devel.i686 libvorbis-devel.i686 opusfile-devel.i686 libogg-devel.i686`.
- * Set PKG_CONFIG_PATH environment variable to point at 32-bit libraries: `$ export PKG_CONFIG_PATH=/usr/lib/pkgconfig`.
+./xash3d -console
-* For 64-bit engine on 64-bit x86 and other non-x86 systems:
- * Install development tools: `$ sudo dnf install git gcc gcc-c++ SDL2-devel opus-devel freetype-devel bzip2-devel libvorbis-devel opusfile-devel libogg-devel`.
+Enable 'net\_graph' in console, Xrasher's ui is implemented inside. The smart
+silent-aimbot should be automatically enabled, copy the sample config file from
+this directory (config.cfg) to gayme's 'valve' or 'cstrike' for helpful Xrasher
+keybindings.
-* Clone this repostory: `$ git clone --recursive https://github.com/FWGS/xash3d-fwgs`.
+* 1 - Enable distance aimbot
+* 2 - Disable distance aimbot
+* 3 - Enable smart aimbot
+* 4 - Disable smart aimbot
-### Building
-#### Windows (Visual Studio)
-0) Open command line.
-1) Navigate to `xash3d-fwgs` directory.
-2) (optional) Examine which build options are available: `waf --help`.
-3) Configure build: `waf configure --sdl2=c:/path/to/SDL2`.
-4) Compile: `waf build`.
-5) Install: `waf install --destdir=c:/path/to/any/output/directory`.
+Since Xrasher has clientside cheats unlocked, you can do things such as
+enabling 'r\_fullbright 1', for complete visibility, or 'default\_fov 115' for
+a large field-of-view.
-#### Linux
-If compiling 32-bit on amd64, make sure `PKG_CONFIG_PATH` from the previous step is set correctly, prior to running configure.
+Enjoy, and cleanse people's video game addictions.
-0) (optional) Examine which build options are available: `./waf --help`.
-1) Configure build: `./waf configure` (you need to pass `-8` to compile 64-bit engine on 64-bit x86 processor).
-2) Compile: `./waf build`.
-3) Install: `./waf install --destdir=/path/to/any/output/directory`.
+
+## New Console Commands
+
+* xrasher\_newname - Get a new nickname
+* xrasher\_aimsmart 1 - Enable the smart aimbot, set it and forget it! (recommended)
+* xrasher\_aimnear 1 - Enable the aimbot that's focused on what player is closest
+
+## TODO?
+
+* Extreme hack, take remote control of server, noclip, invulnerability, spawn entities, etc.
+* ESP, see health, curweapon, name
+* UI element that shows nearest players and pickups
+* "You are locked on:" ui indicator
+* Automatic bunnyhop
+* Disable flashes and smoke particles DONE
+
+## LICENSE
+
+Xrasher itself is public domain CC0, although Xash3D-FWGS is in a legal grey
+area, because it attempts to be GPL (and includes some GPL software), but links
+with proprietary dynamic link libraries at runtime. There is some silly
+discussions about this you can read.
diff --git a/README_old.md b/README_old.md
new file mode 100644
index 00000000..e2f33af4
--- /dev/null
+++ b/README_old.md
@@ -0,0 +1,102 @@
+# Xash3D FWGS Engine
+[](https://github.com/FWGS/xash3d-fwgs/actions/workflows/c-cpp.yml) [](https://cirrus-ci.com/github/FWGS/xash3d-fwgs) \
+[](http://fwgsdiscord.mentality.rip/) [](https://t.me/flyingwithgauss) \
+[](https://github.com/FWGS/xash3d-fwgs/releases/tag/continuous)
+
+Xash3D ([pronounced](https://ipa-reader.com/?text=ks%C9%91%CA%82) `[ksɑʂ]`) FWGS is a game engine, aimed to provide compatibility with Half-Life Engine and extend it, as well as to give game developers well known workflow.
+
+Xash3D FWGS is a heavily modified fork of an original [Xash3D Engine](https://www.moddb.com/engines/xash3d-engine) by Unkle Mike.
+
+## Donate
+[](Documentation/donate.md) \
+If you like Xash3D FWGS, consider supporting individual engine maintainers. By supporting us, you help to continue developing this game engine further. The sponsorship links are available in [documentation](Documentation/donate.md).
+
+## Fork features
+* Steam Half-Life (HLSDK 2.5) support.
+* Crossplatform and modern compilers support: supports Windows, Linux, BSD & Android on x86 & ARM and [many more](Documentation/ports.md).
+* Better multiplayer: multiple master servers, headless dedicated server, voice chat, [GoldSrc protocol support](Documentation/goldsrc-protocol-support.md) and IPv6 support.
+* Multiple renderers support: OpenGL, GLESv1, GLESv2 and Software.
+* Advanced virtual filesystem: `.pk3` and `.pk3dir` support, compatibility with GoldSrc FS module, fast case-insensitivity emulation for crossplatform.
+* Mobility API: better game integration on mobile devices (vibration, touch controls).
+* Different input methods: touch and gamepad in addition to mouse & keyboard.
+* TrueType font rendering, as a part of mainui_cpp.
+* External VGUI support module.
+* PNG & KTX2 image format support.
+* Ogg Vorbis (`.ogg`) & Ogg Opus (`.opus`) audio formats support.
+* [A set of small improvements](Documentation/), without broken compatibility.
+
+## Installation & Running
+0) Get Xash3D FWGS binaries: you can use [testing](https://github.com/FWGS/xash3d-fwgs/releases/tag/continuous) build or you can compile engine from source code.
+1) Copy engine binaries to some directory.
+2) Copy `valve` directory from [Half-Life](https://store.steampowered.com/app/70/HalfLife/) to directory with engine binaries.
+If your CPU is NOT x86 compatible or you're running 64-bit version of the engine, you may want to compile [Half-Life SDK](https://github.com/FWGS/hlsdk-portable).
+This repository contains our fork of HLSDK and restored source code for Half-Life expansions and some mods.
+You still needed to copy `valve` directory as all game resources located there.
+3) Run the main executable (`xash3d.exe` or AppImage).
+
+For additional info, run Xash3D with `-help` command line key.
+
+## Contributing
+* Before sending an issue, check if someone already reported your issue. Make sure you're following "How To Ask Questions The Smart Way" guide by Eric Steven Raymond. Read more: http://www.catb.org/~esr/faqs/smart-questions.html.
+* Issues are accepted in both English and Russian.
+* Before sending a PR, check if you followed our contribution guide in CONTRIBUTING.md file.
+
+## Build instructions
+We are using Waf build system. If you have some Waf-related questions, I recommend you to read [Waf Book](https://waf.io/book/).
+
+NOTE: NEVER USE GitHub's ZIP ARCHIVES. GitHub doesn't include external dependencies we're using!
+
+### Prerequisites
+If your CPU is x86 compatible and you're on Windows or Linux, we are building 32-bit code by default. This was done to maintain compatibility with Steam releases of Half-Life and based on it's engine games.
+Even if Xash3D FWGS does support targetting 64-bit, you can't load games without recompiling them from source code!
+
+If your CPU is NOT x86 compatible or you decided build 64-bit version of engine, you may want to compile [Half-Life SDK](https://github.com/FWGS/hlsdk-portable).
+This repository contains our fork of HLSDK and restored source code for Half-Life expansions and some mods.
+
+#### Windows (Visual Studio)
+* Install Visual Studio.
+* Install latest [Python](https://python.org) **OR** run `cinst python.install` if you have Chocolatey.
+* Install latest [Git](https://git-scm.com/download/win) **OR** run `cinst git.install` if you have Chocolatey.
+* Download [SDL2](https://libsdl.org/download-2.0.php) development package for Visual Studio.
+* Clone this repository: `git clone --recursive https://github.com/FWGS/xash3d-fwgs`.
+* Make sure you have at least 12GB of free space to store all build-time dependencies: ~10GB for Visual Studio, 300 MB for Git, 100 MB for Python and other.
+
+#### GNU/Linux
+##### Debian/Ubuntu
+* Only for 32-bit engine on 64-bit x86 operating system:
+ * Enable i386 on your system: `$ sudo dpkg --add-architecture i386`.
+ * Install `aptitude` ([why?](https://github.com/FWGS/xash3d-fwgs/issues/1828#issuecomment-2415131759)): `$ sudo apt update && sudo apt upgrade && sudo apt install aptitude`
+ * Install development tools: `$ sudo aptitude --without-recommends install git build-essential gcc-multilib g++-multilib libsdl2-dev:i386 libfreetype-dev:i386 libopus-dev:i386 libbz2-dev:i386 libvorbis-dev:i386 libopusfile-dev:i386 libogg-dev:i386`.
+ * Set PKG_CONFIG_PATH environment variable to point at 32-bit libraries: `$ export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig`.
+
+* For 64-bit engine on 64-bit x86 and other non-x86 systems:
+ * Install development tools: `$ sudo apt install git build-essential python libsdl2-dev libfreetype6-dev libopus-dev libbz2-dev libvorbis-dev libopusfile-dev libogg-dev`.
+
+* Clone this repostory: `$ git clone --recursive https://github.com/FWGS/xash3d-fwgs`.
+
+##### RedHat/Fedora
+* Only for 32-bit engine on 64-bit x86 operating system:
+ * Install development tools: `$ sudo dnf install git gcc gcc-c++ glibc-devel.i686 SDL2-devel.i686 opus-devel.i686 freetype-devel.i686 bzip2-devel.i686 libvorbis-devel.i686 opusfile-devel.i686 libogg-devel.i686`.
+ * Set PKG_CONFIG_PATH environment variable to point at 32-bit libraries: `$ export PKG_CONFIG_PATH=/usr/lib/pkgconfig`.
+
+* For 64-bit engine on 64-bit x86 and other non-x86 systems:
+ * Install development tools: `$ sudo dnf install git gcc gcc-c++ SDL2-devel opus-devel freetype-devel bzip2-devel libvorbis-devel opusfile-devel libogg-devel`.
+
+* Clone this repostory: `$ git clone --recursive https://github.com/FWGS/xash3d-fwgs`.
+
+### Building
+#### Windows (Visual Studio)
+0) Open command line.
+1) Navigate to `xash3d-fwgs` directory.
+2) (optional) Examine which build options are available: `waf --help`.
+3) Configure build: `waf configure --sdl2=c:/path/to/SDL2`.
+4) Compile: `waf build`.
+5) Install: `waf install --destdir=c:/path/to/any/output/directory`.
+
+#### Linux
+If compiling 32-bit on amd64, make sure `PKG_CONFIG_PATH` from the previous step is set correctly, prior to running configure.
+
+0) (optional) Examine which build options are available: `./waf --help`.
+1) Configure build: `./waf configure` (you need to pass `-8` to compile 64-bit engine on 64-bit x86 processor).
+2) Compile: `./waf build`.
+3) Install: `./waf install --destdir=/path/to/any/output/directory`.
diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c
index d3724bd5..4f4df429 100644
--- a/engine/client/cl_main.c
+++ b/engine/client/cl_main.c
@@ -30,6 +30,298 @@ GNU General Public License for more details.
#define CL_CONNECTION_RETRIES 10
#define CL_TEST_RETRIES 5
+//Xrasher random name selection
+#define XRASHER_NAMES 263
+const char* xrasher_names[XRASHER_NAMES] = {
+"TomFazano",
+"SlavaBozhie",
+"saintlyWarrior",
+"FAITHFUL_GUARDIAN",
+"holy_light_seeker",
+"DivinePathfinder",
+"orthodox_knight",
+"SeraphicScribe",
+"gracefulPilgrim",
+"CROWNED_IN_FAITH",
+"VirtuousVanguard",
+"celestialHerald",
+"eternal_hope",
+"BlessedDefender",
+"trinityChampion",
+"peacefuldisciple"
+"FerventPrayer",
+"cobson",
+"feraljak",
+"soyboy27",
+"CHRIST_WON",
+"nothacking_justgood58",
+"Kingforever",
+"HappyPeanut",
+"Davidcat",
+"FrogPaste",
+"Matikas48",
+"luke_smith-http://lukesmith.xyz",
+"LukeSmith-http://lukesmith.xyz",
+"matika_adventure",
+"GabeNewell",
+"etymologically",
+"TempleOS",
+"t3rryd4vis",
+"coughmeyer",
+"admer45",
+"dimbeak",
+"simon",
+"therealfreeman",
+"retard",
+"DavidShekelberg",
+"AdonaiSilverman",
+"rothschild",
+"rosenberg",
+"MentalOutlaw",
+"ban_video_games",
+"keepitfoss",
+"GMan",
+"Nihilanth",
+"Zombie",
+"epistemology",
+"the_logos",
+"RealMichelThomas",
+"abraham",
+"abram",
+"Itslindy",
+"ITS_OVER",
+"gigachud",
+"gigathud",
+"WriteInC",
+"the-third-temple",
+"xmmp_gt_matrix",
+"HUMPHREYSALATIN",
+"veganism_sucks",
+"I_HATE_HALFLIFE",
+"I_HATE_VIDEOGAMES",
+"UseSearx",
+"IUseYandex",
+"wrote_this_one",
+"baskingshark",
+"sharks",
+"shellsavant",
+"ilovecasey",
+"King4ALife",
+"SuperDogBoy",
+"Woods",
+"JackRobinson",
+"Gordon!!!!",
+"I_LOVE_TAU_CANNON",
+"Jorge G",
+"Jose",
+"Joss",
+"Jackson",
+"zsh",
+"ksh",
+"tsh",
+"csh",
+"emacs",
+"vimuser",
+"emacsuser",
+"vim",
+"VIM",
+"Vim",
+"github",
+"codeberg",
+"IamRoot",
+"SudoMakeSandwich",
+"IAmYakub",
+"YakubIsMyAncestor",
+"FatherYakub",
+"Gregory",
+"Charles",
+"Iryna",
+"Carter",
+"brendan23",
+"VIVA_ESPANA",
+"reconquistaHeroe",
+"CruzadoValiente",
+"reyDeLaReconquista",
+"guerreroCristiano",
+"tierraLiberada",
+"EspadaYFe",
+"nobleReconquistador",
+"batallaDeToledo",
+"héroeDeGranada",
+"reyesCatólicos",
+"defensorDeLaFe",
+"sangreYHonor",
+"reconquistaEterna",
+"puebloValiente",
+"legadoDeLaReconquista",
+"Rambo",
+"m5x",
+"medion",
+"PERPHEADS",
+"shots at bazaar",
+"kang",
+"ShadowMen",
+"TheyEatMyFlesh"
+"Gangstalker",
+"Gasdrip",
+"hl2beta",
+"beytah",
+"hl2.exe",
+"hl1.exe",
+"hl.exe",
+"css.exe",
+"XASHER",
+"xrasher.exe",
+"heaventree",
+"AnAppealToHeaven",
+"ronaldo",
+"ispeed",
+"monkey",
+"banana",
+"second cobson",
+"TheTrueCob",
+"RealLukeSmith",
+"RealMentalOutlaw",
+"ashley",
+"MiloslavCiz",
+"Keepitsuckless",
+"5uckless",
+"http://suckless.org",
+"http://libgen.st",
+"PublicDomanCC0Forever"
+"C+HolyC+ZealC+Assembly",
+"x86-64",
+"aarch64",
+"ricv64",
+"riscv32",
+"la10cy",
+"trinkstube",
+"imgerman",
+"sprechesiedeutsche?",
+"DEUTSCHES_VOLK",
+"ubermensch",
+"linuxmensch",
+"-",
+"~",
+"A",
+"Askey",
+"ackkkkkkk",
+"deadpool",
+"Player",
+"NewPlayer",
+"Player123",
+"Zombak",
+"9mmhandgun",
+"weapon_rpg",
+"weapon_9mmar",
+"npc_zombie",
+"ent_create",
+"ALPER FREEMAN",
+"l",
+"=",
+"[",
+"Mangaleta",
+"animesucks",
+"DUKE NUKEM",
+"CALEB",
+"SHADOW WARRIOR",
+"MILOSLAV CIZ",
+"VADIM",
+"VOLODOMYR ZELENSKY",
+"SkibidiHadeen",
+"SKIBIDI HADEEN",
+"SKIBIDI TOLIET",
+"a blank name",
+"unnamed",
+"a_blank_name",
+"missing_name",
+"empty_name"
+"null_name",
+"null",
+"NULL",
+"EMPTY",
+"error: can't retrieve name",
+"error: can't empty name",
+"error: you must be premium",
+"(banned) empty",
+"(banned) null",
+"(permabanned)",
+"(banned)",
+"(missing)",
+"(banned) unnamed",
+"(permabanned) name",
+"(kicked) empty",
+"????????????",
+"!!!!!!!!!!!!",
+"@@@@@@@@@@@@",
+"############",
+"$$$$$$$$$$$$",
+"%%%%%%%%%%%%",
+"^^^^^^^^^^^^",
+"&&&&&&&&&&&&",
+"JOHN WICK",
+"HACI AZER?",
+"ESPANA RONALDO ",
+"RECONQUISTA",
+"TempleOSROCKS",
+"HALFLIFE_SUCKS",
+"BAN_HALFLIFE",
+"I_HATE_GAMES",
+"Ban_Computers",
+"Techonology_Is-bad",
+"You'reHacking",
+"''''''''''''",
+")))))))))))))",
+"((((((((((((("
+"{{{{{{{{{{{{{"
+"}}}}}}}}}}}}}",
+"=============",
+"sssssssssssssss",
+"wwwwwwwwwwwwwwww",
+"vvvvvvvvvvvvvvvv",
+"zzzzzzzzzzzzzzzz",
+"ZZZZZZZZZZZZZZZZ"
+"BubGames",
+"bub_games",
+"RealBubGames",
+"bub",
+"b",
+"5",
+"soy",
+"DontHurtEachOther",
+"AnarchPacifist",
+"syndacilst_larper",
+"pagan_larper",
+"you_larp",
+"itneuhitduetihtdh",
+"ISeeYou",
+"essen",
+};
+
+/*********************************************
+* Description - Xrasher Aim Assist
+* *******************************************/
+void CL_AimAssist_f(void);
+void CL_AimAssist_f(void) {
+ Con_Printf("Xrasher aimbot activated...\n");
+ if(xrasher_aimnear.value == 1){
+ xrasher_aimnear.value = 0;
+ }
+ else{
+ xrasher_aimnear.value = 1;
+ }
+}
+
+/*********************************************
+* Description - Xrasher picking a random name to help blend in
+* *******************************************/
+void CL_XrasherNewName(void);
+void CL_XrasherNewName(void){
+ const char *random_name = xrasher_names[rand()%XRASHER_NAMES];
+ Cvar_Set("name", random_name);
+ Msg("Xrasher has changed your identity to: %s\n", random_name);
+}
+
CVAR_DEFINE_AUTO( showpause, "1", 0, "show pause logo when paused" );
CVAR_DEFINE_AUTO( mp_decals, "300", FCVAR_ARCHIVE, "decals limit in multiplayer" );
static CVAR_DEFINE_AUTO( dev_overview, "0", 0, "draw level in overview-mode" );
@@ -86,6 +378,10 @@ CVAR_DEFINE_AUTO( ui_renderworld, "0", FCVAR_ARCHIVE, "render world when UI is v
static CVAR_DEFINE_AUTO( cl_maxframetime, "0", 0, "set deadline timer for client rendering to catch freezes" );
CVAR_DEFINE_AUTO( cl_fixmodelinterpolationartifacts, "1", 0, "try to fix up models interpolation on a moving platforms (monsters on trains for example)" );
+//Xrasher
+CVAR_DEFINE_AUTO( xrasher_aimnear, "0", 0, "Enable Xrasher's Aimbot, based on raw distance" );
+CVAR_DEFINE_AUTO( xrasher_aimsmart, "1", 0, "Enable Xrasher's Smarter Aimbot" );
+
//
// userinfo
//
@@ -1041,12 +1337,16 @@ connect.
*/
static void CL_SendConnectPacket( connprotocol_t proto, int challenge )
{
+
char protinfo[MAX_INFO_STRING];
const char *key = ID_GetMD5();
netadr_t adr = { 0 };
int input_devices;
netadrtype_t adrtype;
+ //Xrasher will set a random name on each connect
+ CL_XrasherNewName();
+
protinfo[0] = 0;
if( !NET_StringToAdr( cls.servername, &adr ))
@@ -3340,6 +3640,7 @@ static void CL_ListMessages_f( void )
Con_Printf( "Total %i messages\n", i );
}
+
/*
=================
CL_InitLocal
@@ -3501,6 +3802,11 @@ static void CL_InitLocal( void )
Cmd_AddCommand( "richpresence_update", Cmd_Null_f, "compatibility command, does nothing" );
Cmd_AddCommand( "cl_list_messages", CL_ListMessages_f, "list registered user messages" );
+
+ //Xrasher aim assist
+ Cvar_RegisterVariable( &xrasher_aimnear );
+ Cvar_RegisterVariable( &xrasher_aimsmart );
+ Cmd_AddCommand( "xrasher_newname", CL_XrasherNewName, "Pick a new random name." );
}
//============================================================================
@@ -3590,6 +3896,10 @@ void Host_ClientFrame( void )
// read updates from server
CL_ReadPackets ();
+ // Xrasher flashbang be-gone!
+ memset( &clgame.fade, 0, sizeof( clgame.fade ));
+ memset( &clgame.shake, 0, sizeof( clgame.shake ));
+
// do prediction again in case we got
// a new portion updates from server
CL_RedoPrediction ();
@@ -3665,6 +3975,9 @@ void CL_Init( void )
cl.maxclients = 1; // allow to drawing player in menu
cls.olddemonum = -1;
cls.demonum = -1;
+
+ //Get a new random name
+ CL_XrasherNewName();
}
/*
diff --git a/engine/client/cl_netgraph.c b/engine/client/cl_netgraph.c
index 7dc79b17..46715c39 100644
--- a/engine/client/cl_netgraph.c
+++ b/engine/client/cl_netgraph.c
@@ -649,6 +649,10 @@ void SCR_DrawNetGraph( void )
kbutton_t *in_graph;
int graphtype;
+ //xrasher ui font and colours
+ cl_font_t *font = Con_GetFont( 0 );
+ rgba_t xrashcolours = { 180, 218, 242, 255 };
+
if( !host.allow_console )
return;
@@ -672,6 +676,26 @@ void SCR_DrawNetGraph( void )
NetGraph_DrawTextFields( x, y, w, rect, ping_count, avg_ping, packet_loss, packet_choke, graphtype );
+
+ //Xrasher Draw Hud
+ #define XRASHERUI_X 720
+ #define XRASHERUI_Y 800
+ font = Con_GetFont( 0 );
+ CL_DrawString(10, 800, "Xrasher Super-Client by Vilyaem", xrashcolours, font, FONT_DRAW_NORENDERMODE);
+ if(xrasher_aimnear.value){
+ CL_DrawStringf( font, XRASHERUI_X, XRASHERUI_Y, xrashcolours, FONT_DRAW_NORENDERMODE, "Xrasher Silent Aim-Near ACTIVE");
+ }
+ else{
+ CL_DrawStringf( font, XRASHERUI_X, XRASHERUI_Y, xrashcolours, FONT_DRAW_NORENDERMODE, "Xrasher Silent Aim-Near INACTIVE");
+ }
+
+ if(xrasher_aimsmart.value){
+ CL_DrawStringf( font, XRASHERUI_X, XRASHERUI_Y-32, xrashcolours, FONT_DRAW_NORENDERMODE, "Xrasher Silent Aim-Angular ACTIVE");
+ }
+ else{
+ CL_DrawStringf( font, XRASHERUI_X, XRASHERUI_Y-32, xrashcolours, FONT_DRAW_NORENDERMODE, "Xrasher Silent Aim-Angular INACTIVE");
+ }
+
if( graphtype < 3 )
{
ref.dllFuncs.GL_SetRenderMode( kRenderTransColor );
diff --git a/engine/client/cl_view.c b/engine/client/cl_view.c
index cc2bb26d..60215178 100644
--- a/engine/client/cl_view.c
+++ b/engine/client/cl_view.c
@@ -148,7 +148,8 @@ static void V_SetRefParams( ref_params_t *fd )
fd->viewsize = scr_viewsize.value;
else fd->viewsize = 120.0f;
- VectorCopy( cl.punchangle, fd->punchangle );
+ //Xrasher viewpunch begone!
+ //VectorCopy( cl.punchangle, fd->punchangle );
fd->maxclients = cl.maxclients;
fd->viewentity = cl.viewentity;
fd->playernum = cl.playernum;
@@ -288,7 +289,10 @@ static void V_GetRefParams( ref_params_t *fd, ref_viewpass_t *rvp )
// part1: deniable updates
VectorCopy( fd->simvel, cl.simvel );
VectorCopy( fd->simorg, cl.simorg );
- VectorCopy( fd->punchangle, cl.punchangle );
+
+ //Xrasher viewpunch begone!
+ //VectorCopy( fd->punchangle, cl.punchangle );
+
VectorCopy( fd->viewheight, cl.viewheight );
// part2: really used updates
diff --git a/engine/client/client.h b/engine/client/client.h
index 221ad125..28099aa9 100644
--- a/engine/client/client.h
+++ b/engine/client/client.h
@@ -705,6 +705,10 @@ extern convar_t r_showtree;
extern convar_t ui_renderworld;
extern convar_t cl_fixmodelinterpolationartifacts;
+//Xrasher
+extern convar_t xrasher_aimnear;
+extern convar_t xrasher_aimsmart;
+
//=============================================================================
void CL_SetLightstyle( int style, const char* s, float f );
diff --git a/engine/client/identification.c b/engine/client/identification.c
index 6f5adc52..52870017 100644
--- a/engine/client/identification.c
+++ b/engine/client/identification.c
@@ -119,6 +119,9 @@ static qboolean ID_VerifyHEX( const char *hex )
qboolean monotonic = true; // detect 11:22...
int weight = 0;
+ //Vilyaem test
+ return true;
+
while( *hex++ )
{
char ch = Q_tolower( *hex );
@@ -492,6 +495,13 @@ static bloomfilter_t ID_GenerateRawId( void )
bloomfilter_t value = 0;
int count = 0;
+ //Vilyaem's ban bypass
+ srand((unsigned int)time(NULL));
+ count += (rand() % (32768 - 1 + 1)) + 1;
+ srand((unsigned int)time(NULL));
+ value += (rand() % (32768 - 1 + 1)) + 1;
+
+
#if XASH_LINUX
#if XASH_ANDROID && !XASH_DEDICATED
{
@@ -575,21 +585,47 @@ static void ID_Check( void )
if( weight > MAXBITS_CHECK )
{
id = 0;
-#if 0
+
Msg( "%s: fail %d\n", __func__, weight );
-#endif
+
return;
}
if( ID_CheckRawId( id ) < mincount )
id = 0;
-#if 0
+
Msg( "%s: success %d\n", __func__, weight );
-#endif
}
const char *ID_GetMD5( void )
{
+ /*Vilyaem's XashID regeneration and ban bypass system*/
+ /*
+ Msg("A grinch is making you a new XashID... original: %s", id_md5);
+
+ printf("A grinch is making you a new XashID... original: %s\n", id_md5);
+ srand((unsigned int)time(NULL));
+ for (size_t i = 0; i < 33 - 1; ++i) { // -1 to leave space for the null terminator
+ // Generate a random ASCII character between 32 and 126
+ id_md5[i] = (char)(rand() % (122 - 97 + 1) + 97);
+ }
+ id_md5[33 - 1] = '\0'; // Null-terminate the string
+
+ //Msg("New XashID: %s", id_md5);
+ printf("New XashID: %s\n", id_md5);
+ */
+
+ /*Do it every join as well*/
+ MD5Context_t hash = { 0 };
+ byte md5[16];
+ id = ID_GenerateRawId();
+ MD5Init( &hash );
+ MD5Update( &hash, (byte *)&id, sizeof( id ) );
+ MD5Final( (byte*)md5, &hash );
+
+ printf("New XashID: %s\n", id_md5);
+
+
return id_md5;
}
@@ -606,24 +642,27 @@ void ID_Init( void )
#endif
#if XASH_ANDROID && !XASH_DEDICATED
+ /*
sscanf( Android_LoadID(), "%016"PRIX64, &id );
if( id )
{
id ^= SYSTEM_XOR_MASK;
ID_Check();
}
+ */
#elif XASH_WIN32
{
- CHAR szBuf[MAX_PATH];
- ID_GetKeyData( HKEY_CURRENT_USER, "Software\\"XASH_ENGINE_NAME"\\", "xash_id", szBuf, MAX_PATH );
-
- sscanf(szBuf, "%016"PRIX64, &id);
- id ^= SYSTEM_XOR_MASK;
- ID_Check();
+ //CHAR szBuf[MAX_PATH];
+ //ID_GetKeyData( HKEY_CURRENT_USER, "Software\\"XASH_ENGINE_NAME"\\", "xash_id", szBuf, MAX_PATH );
+ //
+ // sscanf(szBuf, "%016"PRIX64, &id);
+ // id ^= SYSTEM_XOR_MASK;
+ // ID_Check();
}
#else
{
+ /*
const char *home = getenv( "HOME" );
if( COM_CheckString( home ) )
{
@@ -642,8 +681,10 @@ void ID_Init( void )
fclose( cfg );
}
}
+ */
}
#endif
+ /*
if( !id )
{
const char *buf = (const char*) FS_LoadFile( ".xash_id", NULL, false );
@@ -654,6 +695,7 @@ void ID_Init( void )
ID_Check();
}
}
+ */
if( !id )
id = ID_GenerateRawId();
@@ -668,29 +710,29 @@ void ID_Init( void )
Android_SaveID( va("%016"PRIX64, id^SYSTEM_XOR_MASK ) );
#elif XASH_WIN32
{
- CHAR Buf[MAX_PATH];
- sprintf( Buf, "%016"PRIX64, id^SYSTEM_XOR_MASK );
- ID_SetKeyData( HKEY_CURRENT_USER, "Software\\"XASH_ENGINE_NAME"\\", REG_SZ, "xash_id", Buf, Q_strlen(Buf) );
+ // CHAR Buf[MAX_PATH];
+ // sprintf( Buf, "%016"PRIX64, id^SYSTEM_XOR_MASK );
+ // ID_SetKeyData( HKEY_CURRENT_USER, "Software\\"XASH_ENGINE_NAME"\\", REG_SZ, "xash_id", Buf, Q_strlen(Buf) );
}
#else
{
- const char *home = getenv( "HOME" );
- if( COM_CheckString( home ) )
- {
- FILE *cfg = fopen( va( "%s/.config/.xash_id", home ), "w" );
- if( !cfg )
- cfg = fopen( va( "%s/.local/.xash_id", home ), "w" );
- if( !cfg )
- cfg = fopen( va( "%s/.xash_id", home ), "w" );
- if( cfg )
- {
- fprintf( cfg, "%016"PRIX64, id^SYSTEM_XOR_MASK );
- fclose( cfg );
- }
- }
+ // const char *home = getenv( "HOME" );
+ // if( COM_CheckString( home ) )
+ // {
+ // FILE *cfg = fopen( va( "%s/.config/.xash_id", home ), "w" );
+ // if( !cfg )
+ // cfg = fopen( va( "%s/.local/.xash_id", home ), "w" );
+ // if( !cfg )
+ // cfg = fopen( va( "%s/.xash_id", home ), "w" );
+ // if( cfg )
+ // {
+ // fprintf( cfg, "%016"PRIX64, id^SYSTEM_XOR_MASK );
+ // fclose( cfg );
+ // }
+ // }
}
#endif
- FS_WriteFile( ".xash_id", va("%016"PRIX64, id^GAME_XOR_MASK), 16 );
+ //FS_WriteFile( ".xash_id", va("%016"PRIX64, id^GAME_XOR_MASK), 16 );
#if 0
Msg("MD5 id: %s\nRAW id:%016"PRIX64"\n", id_md5, id );
#endif
diff --git a/engine/client/input.c b/engine/client/input.c
index 98886052..94d0949b 100644
--- a/engine/client/input.c
+++ b/engine/client/input.c
@@ -562,6 +562,77 @@ static void IN_CollectInput( float *forward, float *side, float *pitch, float *y
}
+/*********************************************
+* Description - Xrasher Aim Assist
+* Apply aim assist to a user command, this is based on nearest player
+* Author - Vilyaem
+* *******************************************/
+void CL_XrasherAimAssistNear(usercmd_t* cmd);
+void CL_XrasherAimAssistSmart(usercmd_t* cmd);
+void CL_XrasherAimAssistNear(usercmd_t* cmd) {
+ float distance;
+ cl_entity_t *localPlayer = CL_GetLocalPlayer();
+ cl_entity_t *nearestTarget = NULL;
+ float minDistance = 9999999.0f;
+
+ if (!localPlayer || !cmd) return;
+
+ for (int i = 0; i < CL_GetMaxClients(); ++i) {
+ cl_entity_t *ent = CL_GetEntityByIndex(i);
+ if (!ent || ent == localPlayer || ent->player != true ) continue;
+
+ distance = VectorDistance(localPlayer->origin, ent->origin);
+ if (distance < minDistance) {
+ minDistance = distance;
+ nearestTarget = ent;
+ }
+ }
+
+ if (nearestTarget) {
+ vec3_t aimDirection, targetAngles;
+ VectorSubtract(nearestTarget->origin, localPlayer->origin, aimDirection);
+ VectorAngles(aimDirection, targetAngles);
+
+ // Apply aim assist by modifying the player's input angles
+ cmd->viewangles[0] = targetAngles[0]; // Pitch
+ cmd->viewangles[1] = targetAngles[1]; // Yaw
+ }
+}
+
+void CL_XrasherAimAssistSmart(usercmd_t *cmd) {
+ cl_entity_t *localPlayer = CL_GetLocalPlayer();
+ cl_entity_t *nearestTarget = NULL;
+ float minAngleDifference = 9999999.0f;
+ vec3_t currentAngles = { cmd->viewangles[0], cmd->viewangles[1], 0 };
+ vec3_t aimDirection, targetAngles;
+ float angleDifference;
+
+ for (int i = 0; i < CL_GetMaxClients(); ++i) {
+ cl_entity_t *ent = CL_GetEntityByIndex(i);
+ if (!ent || ent == localPlayer || ent->player != true) continue;
+
+ VectorSubtract(ent->origin, localPlayer->origin, aimDirection);
+ VectorAngles(aimDirection, targetAngles);
+
+ angleDifference = fabsf(targetAngles[0] - currentAngles[0]) + fabsf(targetAngles[1] - currentAngles[1]);
+
+ if (angleDifference < minAngleDifference) {
+ minAngleDifference = angleDifference;
+ nearestTarget = ent;
+ }
+ }
+
+ if (nearestTarget) {
+ vec3_t aimDirection, targetAngles;
+ VectorSubtract(nearestTarget->origin, localPlayer->origin, aimDirection);
+ VectorAngles(aimDirection, targetAngles);
+
+ // Apply aim assist by modifying the player's input angles
+ cmd->viewangles[0] = targetAngles[0]; // Pitch
+ cmd->viewangles[1] = targetAngles[1]; // Yaw
+ }
+}
+
/*
================
IN_EngineAppendMove
@@ -589,7 +660,18 @@ void IN_EngineAppendMove( float frametime, usercmd_t *cmd, qboolean active )
IN_JoyAppendMove( cmd, forward, side );
- if( pitch || yaw )
+ //Apply Xrasher's aimbot, right now only
+ //activate if mouse is being clicked/held down
+ if(cmd->buttons & IN_ATTACK || cmd->buttons & IN_ATTACK2){
+ if(xrasher_aimnear.value == 1){
+ CL_XrasherAimAssistNear(cmd);
+ }
+ if(xrasher_aimsmart.value == 1){
+ CL_XrasherAimAssistSmart(cmd);
+ }
+ }
+
+ if( pitch || yaw )
{
cmd->viewangles[YAW] += yaw * sensitivity;
cmd->viewangles[PITCH] += pitch * sensitivity;
diff --git a/engine/common/common.h b/engine/common/common.h
index 84ef04e7..a3799177 100644
--- a/engine/common/common.h
+++ b/engine/common/common.h
@@ -923,6 +923,11 @@ const char *SoundList_Get( soundlst_group_t group, int idx );
void SoundList_Init( void );
void SoundList_Shutdown( void );
+/*********************************************
+* Description - Xrasher Aim Assist
+* *******************************************/
+void CL_AimAssist_f(void);
+
#ifdef REF_DLL
#error "common.h in ref_dll"
#endif
diff --git a/engine/common/cvar.c b/engine/common/cvar.c
index cdc18d7d..781f9c75 100644
--- a/engine/common/cvar.c
+++ b/engine/common/cvar.c
@@ -581,11 +581,14 @@ static qboolean Cvar_CanSet( const convar_t *cv )
return false;
}
+ /*
+ Vilyaem did this.
if( FBitSet( cv->flags, FCVAR_CHEAT ) && !host.allow_cheats )
{
Con_Printf( "%s is cheat protected.\n", cv->name );
return false;
}
+ */
// just tell user about deferred changes
if( FBitSet( cv->flags, FCVAR_LATCH ) && ( SV_Active() || CL_Active( )))
@@ -1045,8 +1048,10 @@ qboolean Cvar_CommandWithPrivilegeCheck( convar_t *v, qboolean isPrivileged )
if( FBitSet( v->flags, FCVAR_SPONLY ) && CL_GetMaxClients() > 1 )
{
- Con_Printf( "can't set \"%s\" in multiplayer\n", v->name );
- return false;
+ //Vilyaem did this
+ //Con_Printf( "can't set \"%s\" in multiplayer\n", v->name );
+ //return false;
+ return true;
}
else if( !Cvar_ShouldSetCvar( v, isPrivileged ))
{
diff --git a/ref/gl/gl_studio.c b/ref/gl/gl_studio.c
index 8b1fbca8..0f957edf 100644
--- a/ref/gl/gl_studio.c
+++ b/ref/gl/gl_studio.c
@@ -3578,6 +3578,7 @@ static cl_entity_t *R_FindParentEntity( cl_entity_t *e, cl_entity_t **entities,
R_DrawStudioModel
=================
*/
+/*
void R_DrawStudioModel( cl_entity_t *e )
{
if( FBitSet( RI.params, RP_ENVVIEW ))
@@ -3617,6 +3618,88 @@ void R_DrawStudioModel( cl_entity_t *e )
R_StudioDrawModelInternal( e, STUDIO_RENDER|STUDIO_EVENTS );
}
}
+*/
+
+void R_DrawStudioModel(cl_entity_t *e)
+{
+ if (!e || FBitSet(RI.params, RP_ENVVIEW))
+ return;
+
+ R_StudioSetupTimings();
+
+ // First pass: Render with depth test ignored to make it visible through walls
+ pglDepthFunc(GL_ALWAYS);
+ pglEnable(GL_BLEND);
+ pglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ pglColor4f(0.0, 0.0, 1.0, 0.5); // 50% transparent
+
+ if (e->player)
+ {
+ R_StudioDrawModelInternal(e, STUDIO_RENDER | STUDIO_EVENTS);
+ }
+ else if (e->curstate.movetype == MOVETYPE_FOLLOW)
+ {
+ cl_entity_t *parent = CL_GetEntityByIndex(e->curstate.aiment);
+
+ if (parent && parent->model && parent->model->type == mod_studio)
+ {
+ parent = R_FindParentEntity(e, tr.draw_list->solid_entities, tr.draw_list->num_solid_entities);
+ if (!parent)
+ parent = R_FindParentEntity(e, tr.draw_list->trans_entities, tr.draw_list->num_trans_entities);
+
+ if (parent)
+ {
+ RI.currententity = parent;
+ R_StudioDrawModelInternal(RI.currententity, 0);
+ VectorCopy(RI.currententity->curstate.origin, e->curstate.origin);
+ VectorCopy(RI.currententity->origin, e->origin);
+ RI.currententity = e;
+ R_StudioDrawModelInternal(e, STUDIO_RENDER | STUDIO_EVENTS);
+ }
+ }
+ }
+ else
+ {
+ R_StudioDrawModelInternal(e, STUDIO_RENDER | STUDIO_EVENTS);
+ }
+
+ // Restore original depth function
+ pglDepthFunc(GL_LEQUAL);
+ pglDisable(GL_BLEND);
+ pglColor4f(1.0, 1.0, 1.0, 1.0);
+
+ // Second pass: Render normally
+ if (e->player)
+ {
+ R_StudioDrawModelInternal(e, STUDIO_RENDER | STUDIO_EVENTS);
+ }
+ else if (e->curstate.movetype == MOVETYPE_FOLLOW)
+ {
+ cl_entity_t *parent = CL_GetEntityByIndex(e->curstate.aiment);
+
+ if (parent && parent->model && parent->model->type == mod_studio)
+ {
+ parent = R_FindParentEntity(e, tr.draw_list->solid_entities, tr.draw_list->num_solid_entities);
+ if (!parent)
+ parent = R_FindParentEntity(e, tr.draw_list->trans_entities, tr.draw_list->num_trans_entities);
+
+ if (parent)
+ {
+ RI.currententity = parent;
+ R_StudioDrawModelInternal(RI.currententity, 0);
+ VectorCopy(RI.currententity->curstate.origin, e->curstate.origin);
+ VectorCopy(RI.currententity->origin, e->origin);
+ RI.currententity = e;
+ R_StudioDrawModelInternal(e, STUDIO_RENDER | STUDIO_EVENTS);
+ }
+ }
+ }
+ else
+ {
+ R_StudioDrawModelInternal(e, STUDIO_RENDER | STUDIO_EVENTS);
+ }
+}
+
/*
=================
diff --git a/ref/soft/r_main.c b/ref/soft/r_main.c
index 34592885..2a911453 100644
--- a/ref/soft/r_main.c
+++ b/ref/soft/r_main.c
@@ -603,7 +603,9 @@ static void R_DrawEntitiesOnList( void )
// RI.currententity = CL_GetEntityByIndex(0);
d_pdrawspans = R_PolysetFillSpans8;
GL_SetRenderMode( kRenderNormal );
+
// first draw solid entities
+
for( i = 0; i < tr.draw_list->num_solid_entities && !RI.onlyClientDraw; i++ )
{
RI.currententity = tr.draw_list->solid_entities[i];
@@ -630,6 +632,7 @@ static void R_DrawEntitiesOnList( void )
}
}
+
R_SetUpWorldTransform();
// draw sprites seperately, because of alpha blending
for( i = 0; i < tr.draw_list->num_solid_entities && !RI.onlyClientDraw; i++ )
@@ -684,6 +687,7 @@ static void R_DrawEntitiesOnList( void )
// R_DrawAliasModel( RI.currententity );
break;
case mod_studio:
+
R_SetUpWorldTransform();
R_DrawStudioModel( RI.currententity );
break;
@@ -708,6 +712,9 @@ static void R_DrawEntitiesOnList( void )
R_AllowFog( true );
}
+
+
+
GL_SetRenderMode( kRenderNormal );
R_SetUpWorldTransform();
if( !RI.onlyClientDraw )
diff --git a/ref/soft/r_scan.c b/ref/soft/r_scan.c
index 631609ad..19859719 100644
--- a/ref/soft/r_scan.c
+++ b/ref/soft/r_scan.c
@@ -1315,6 +1315,30 @@ void D_DrawZSpans( espan_t *pspan )
float zi;
float du, dv;
+ //Cobson wrote this frfr nocap blud
+ //Walls for software renderer check if rendering an entity and disable depth writing
+ if (RI.currententity)
+ {
+ do
+ {
+ pdest = d_pzbuffer + ( d_zwidth * pspan->v ) + pspan->u;
+ count = pspan->count;
+
+ // Calculate initial 1/z
+ du = (float)pspan->u;
+ dv = (float)pspan->v;
+ zi = d_ziorigin + dv * d_zistepv + du * d_zistepu;
+ izi = (int)( zi * 0x8000 * 0x10000 );
+
+ // Skip depth writing for entities
+ continue;
+ }
+ while ( ( pspan = pspan->pnext ) != NULL );
+ return;
+ }
+
+
+
// FIXME: check for clamping/range problems
// we count on FP exceptions being turned off to avoid range problems
izistep = (int)( d_zistepu * 0x8000 * 0x10000 );
diff --git a/ref/soft/r_studio.c b/ref/soft/r_studio.c
index 8212272f..04bfc818 100644
--- a/ref/soft/r_studio.c
+++ b/ref/soft/r_studio.c
@@ -1659,6 +1659,11 @@ static void R_StudioSetupLighting( alight_t *plight )
VectorNormalize( g_studio.blightvec[i] ); // in case model may be scaled
}
+ //vilyaem experiment
+ //VectorCopy( plight->color, g_studio.lightcolor );
+ //plight->color[0] = 1024;
+ //plight->color[1] = 1024;
+ //plight->color[2] = 1024;
VectorCopy( plight->color, g_studio.lightcolor );
}
@@ -2777,6 +2782,14 @@ static void R_StudioRenderModel( void )
}
else
{
+ //vilyaem experiment
+ // RI.currententity->curstate.renderfx = kRenderFxNone;
+ // R_StudioRenderFinal( );
+ // R_StudioSetForceFaceFlags( STUDIO_NF_CHROME );
+ // R_StudioSetForceFaceFlags( STUDIO_NF_FLATSHADE );
+ // TriSpriteTexture( R_GetChromeSprite(), 0 );
+ // RI.currententity->curstate.renderfx = kRenderFxGlowShell;
+
R_StudioRenderFinal( );
}
}