# Half-Life SDK for GoldSource and Xash3D [![Build Status](https://github.com/FWGS/hlsdk-portable/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/FWGS/hlsdk-portable/actions/workflows/build.yml) [![Windows Build Status](https://ci.appveyor.com/api/projects/status/github/FWGS/hlsdk-portable?svg=true)](https://ci.appveyor.com/project/a1batross/hlsdk-portable) Half-Life SDK for GoldSource & Xash3D with some bugfixes.
Changelog

- Fixed an occasional bug when houndeyes stuck unable to do anything. Technical detail: now monster's `Activity` is set before the call to `SetYawSpeed`. [Patch](https://github.com/FWGS/hlsdk-portable/commit/467899b99aa225a95d90222137f18c141c929c86) - Monsters now play idle sounds as it's supposed by the code. Technical detail: the problem was a check for a wrong variable. [Patch](https://github.com/FWGS/hlsdk-portable/commit/9fc712da019a1ca646171e912209a993e7c43976) - Fixed a bug that caused talk monsters (scientists and security guards) to face a wrong direction during scripted sequence sometimes. [Patch](https://github.com/FWGS/hlsdk-portable/commit/3e2808de62e479e83068c075cb88b4f177f9acc7) - Fixed squad member removal. This bug affected houndeye attacks as their attack depends on percieved number of squad members. [Patch](https://github.com/FWGS/hlsdk-portable/commit/b4502f71336a08f3f2c72b7b061b2838a149a11b) - Scientists now react to smells. [Patch](https://github.com/FWGS/hlsdk-portable/commit/2de4e7ab003d5b1674d12525f5aefb1e57a49fa3) - Tau-cannon (gauss) plays idle animations. - Tau-cannon (gauss) beam color depends on the charge as it was before the prediction code was introduced in Half-Life. [Patch](https://github.com/FWGS/hlsdk-portable/commit/0a29ec49c8183ebb8da22a6d2ef395eae9c3dffe) - Brought back gluon flare in singleplayer. [Patch](https://github.com/FWGS/hlsdk-portable/commit/9d7ab6acf46a8b71ef119d9c252767865522d21d) - Hand grenades don't stay primed after holster, preventing detonation after weapon switch. [Patch](https://github.com/FWGS/hlsdk-portable/commit/6e1059026faa90c5bfe5e3b3f4f58fde398d4524) - Fixed flashlight battery appearing as depleted on restore. - Fixed a potential overflow when reading sentences.txt. [Patch](https://github.com/FWGS/hlsdk-xash3d/commit/cb51d2aa179f1eb622e08c1c07b053ccd49e40a5) - Fixed beam attachment invalidated on restore (that led to visual bugs). [Patch](https://github.com/FWGS/hlsdk-xash3d/commit/74b5543c83c5cdcb88e9254bacab08bc63c4c896) - Fixed alien controllers facing wrong direction in non-combat state. [Patch](https://github.com/FWGS/hlsdk-portable/commit/e51878c45b618f9b3920b46357545cbb47befeda) - Fixed weapon deploy animations not playing sometimes on fast switching between weapons. [Patch](https://github.com/FWGS/hlsdk-portable/commit/ed676a5413c2d26b2982e5b014e0731f0eda6a0d) [Patch2](https://github.com/FWGS/hlsdk-portable/commit/4053dca7a9cf999391cbd77224144da207e4540b) - Fixed tripmine sometimes having wrong body on pickup [Patch](https://github.com/FWGS/hlsdk-portable/commit/abf08e4520e3b6cd12a40f269f4a256cf8496227) Bugfix-related macros that can be enabled during the compilation: - **CROWBAR_DELAY_FIX** fixes a bug when crowbar has a longer delay after the first hit. - **CROWBAR_FIX_RAPID_CROWBAR** fixes a "rapid crowbar" bug when hitting corpses of killed monsters. - **GAUSS_OVERCHARGE_FIX** fixes tau-cannon (gauss) charge sound not stopping after the overcharge. - **CROWBAR_IDLE_ANIM** makes crowbar play idle animations. - **TRIPMINE_BEAM_DUPLICATION_FIX** fixes tripmine's beam duplication on level transition. - **HANDGRENADE_DEPLOY_FIX** makes handgrenade play draw animation after finishing a throw. - **WEAPONS_ANIMATION_TIMES_FIX** fixes deploy and idle animation times of some weapons. Bugfix-related server cvars: - **satchelfix**: if set to 1, doors won't get blocked by satchels. Fixes an infamous exploit on `crossfire` map. - **explosionfix**: if set to 1, explosion damage won't propagate through thin bruses. - **selfgauss**: if set to 0, players won't hurt themselves with secondary attack when shooting thick brushes. *Note*: the macros and cvars were adjusted in [hlfixed](https://github.com/FWGS/hlsdk-portable/tree/hlfixed) branch (for further information read [this](https://github.com/FWGS/hlsdk-portable/wiki/HL-Fixed)). The bugfix macros are kept turned off in `master` branch to maintain the compatibility with vanilla servers and clients. Other server cvars: - **mp_bhopcap**: if set to 1, enable bunny-hop. - **chargerfix**: if set to 1, wall-mounted health and battery chargers will play reject sounds if player has the full health or armor. - **corpsephysics**: if set to 1, corpses of killed monsters will fly a bit from an impact. It's a cut feature from Half-Life.

Support for mods

This repository contains (re-)implementations of some mods as separate branches derived from `master`. The list of supported mods can be found [here](https://github.com/FWGS/hlsdk-portable/wiki/Mods). Note that some branches are unstable and incomplete. To get the mod branch locally run the following git command: ``` git fetch origin asheep:asheep ``` This is considering that you have set **FWGS/hlsdk-portable** as an `origin` remote and want to fetch `asheep` branch.

# Obtaining source code Either clone the repository via [git](`https://git-scm.com/downloads`) or just download ZIP via **Code** button on github. The first option is more preferable as it also allows you to search through the repo history, switch between branches and clone the vgui submodule. To clone the repository with git type in Git Bash (on Windows) or in terminal (on Unix-like operating systems): ``` git clone --recursive https://github.com/FWGS/hlsdk-portable ``` # Build Instructions ## Windows x86. ### Prerequisites Install and run [Visual Studio Installer](https://visualstudio.microsoft.com/downloads/). The installer allows you to choose specific components. Select `Desktop development with C++`. You can untick everything you don't need in Installation details, but you must keep `MSVC` and corresponding Windows SDK (e.g. Windows 10 SDK or Windows 11 SDK) ticked. You may also keep `C++ CMake tools for Windows` ticked as you'll need **cmake**. Alternatively you can install **cmake** from the [cmake.org](https://cmake.org/download/) and during installation tick *Add to the PATH...*. ### Opening command prompt If **cmake** was installed with Visual Studio Installer, you'll need to run `Developer command prompt for VS` via Windows `Start` menu. If **cmake** was installed with cmake installer, you can run the regular Windows `cmd`. Inside the prompt navigate to the hlsdk directory, using `cd` command, e.g. ``` cd C:\Users\username\projects\hlsdk-portable ``` Note: if hlsdk-portable is unpacked on another disk, nagivate there first: ``` D: cd projects\hlsdk-portable ``` ### Building Сonfigure the project: ``` cmake -A Win32 -B build ``` Note that you must repeat the configuration step if you modify `CMakeLists.txt` files or want to reconfigure the project with different parameters. The next step is to compile the libraries: ``` cmake --build build --config Release ``` `hl.dll` and `client.dll` will appear in the `build/dlls/Release` and `build/cl_dll/Release` directories. If you have a mod and want to automatically install libraries to the mod directory, set **GAMEDIR** variable to the directory name and **CMAKE_INSTALL_PREFIX** to your Half-Life or Xash3D installation path: ``` cmake -A Win32 -B build -DGAMEDIR=mod -DCMAKE_INSTALL_PREFIX="C:\Program Files (x86)\Steam\steamapps\common\Half-Life" ``` Then call `cmake` with `--target install` parameter: ``` cmake --build build --config Release --target install ``` #### Choosing Visual Studio version You can explicitly choose a Visual Studio version on the configuration step by specifying cmake generator: ``` cmake -G "Visual Studio 16 2019" -A Win32 -B build ``` ### Editing code in Visual Studio After the configuration step, `HLSDK-PORTABLE.sln` should appear in the `build` directory. You can open this solution in Visual Studio and continue developing there. ## Windows x86. Using Microsoft Visual Studio 6 Microsoft Visual Studio 6 is very old, but if you still have it installed, you can use it to build this hlsdk. There are no project files, but two `.bat` files, for server and client libraries. They require variable **MSVCDir** to be set to the installation path of Visual Studio: ``` set MSVCDir=C:\Program Files\Microsoft Visual Studio cd dlls && compile.bat && cd ../cl_dll && compile.bat ``` `hl.dll` and `client.dll` will appear in `dlls/` and `cl_dll/` diretories. The libraries built with msvc6 should be compatible with Windows XP. ## Linux x86. Portable steam-compatible build using Steam Runtime in chroot ### Prerequisites The official way to build Steam compatible games for Linux is through steam-runtime. Install schroot. On Ubuntu or Debian: ``` sudo apt install schroot ``` Clone https://github.com/ValveSoftware/steam-runtime and follow instructions: [download](https://github.com/ValveSoftware/steam-runtime/blob/e014a74f60b45a861d38a867b1c81efe8484f77a/README.md#downloading-a-steam-runtime) and [setup](https://github.com/ValveSoftware/steam-runtime/blob/e014a74f60b45a861d38a867b1c81efe8484f77a/README.md#using-schroot) the chroot. ``` sudo ./setup_chroot.sh --i386 --tarball ./com.valvesoftware.SteamRuntime.Sdk-i386-scout-sysroot.tar.gz ``` ### Building Now you can use cmake and make prepending the commands with `schroot --chroot steamrt_scout_i386 --`: ``` schroot --chroot steamrt_scout_i386 -- cmake -DCMAKE_BUILD_TYPE=Release -B build-in-steamrt -S . schroot --chroot steamrt_scout_i386 -- cmake --build build-in-steamrt ``` ## Linux x86. Portable steam-compatible build without Steam Runtime ### Prerequisites Install C++ compilers, cmake and x86 development libraries for C, C++ and SDL2. On Ubuntu/Debian: ``` sudo apt install cmake build-essential gcc-multilib g++-multilib libsdl2-dev:i386 ``` ### Building ``` cmake -DCMAKE_BUILD_TYPE=Release -B build -S . cmake --build build ``` Note that the libraries built this way might be not compatible with Steam Half-Life. If you have such issue you can configure it to build statically with c++ and gcc libraries: ``` cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc" -B build -S . cmake --build build ``` Alternatively, you can avoid libstdc++/libgcc_s linking using small libsupc++ library and optimization build flags instead(Really just set Release build type and set C compiler as C++ compiler): ``` cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=cc -B build -S . cmake --build build ``` To ensure portability it's still better to build using Steam Runtime or another chroot of some older distro. ## Linux x86. Portable steam-compatible build in your own chroot ### Prerequisites Use the most suitable way for you to create an old distro 32-bit chroot. E.g. on Ubuntu/Debian you can use debootstrap. ``` sudo apt install debootstrap schroot sudo mkdir -p /var/choots sudo debootstrap --arch=i386 jessie /var/chroots/jessie-i386 # On Ubuntu type trusty instead of jessie sudo chroot /var/chroots/jessie-i386 ``` ``` # inside chroot apt install cmake build-essential gcc-multilib g++-multilib libsdl2-dev exit ``` Create and adapt the following config in /etc/schroot/chroot.d/jessie.conf (you can choose a different name): ``` [jessie] type=directory description=Debian jessie i386 directory=/var/chroots/jessie-i386/ users=yourusername groups=adm root-groups=root preserve-environment=true personality=linux32 ``` Insert your actual user name in place of `yourusername`. ### Building Prepend any make or cmake call with `schroot -c jessie --`: ``` schroot --chroot jessie -- cmake -DCMAKE_BUILD_TYPE=Release -B build-in-chroot -S . schroot --chroot jessie -- cmake --build build-in-chroot ``` ## Android 1. Set up [Android Studio/Android SDK](https://developer.android.com/studio). ### Android Studio Open the project located in the `android` folder and build. ### Command-line ``` cd android ./gradlew assembleRelease ``` ### Customizing the build settings.gradle: * **rootProject.name** - project name displayed in Android Studio (optional). app/build.gradle: * **android->namespace** and **android->defaultConfig->applicationId** - set both to desired package name. * **getBuildNum** function - set **releaseDate** variable as desired. app/java/su/xash/hlsdk/MainActivity.java: * **.putExtra("gamedir", ...)** - set desired gamedir. src/main/AndroidManifest.xml: * **application->android:label** - set desired application name. * **su.xash.engine.gamedir** value - set to same as above. ## Nintendo Switch ### Prerequisites 1. Set up [`dkp-pacman`](https://devkitpro.org/wiki/devkitPro_pacman). 2. Install dependency packages: ``` sudo dkp-pacman -S switch-dev dkp-toolchain-vars switch-mesa switch-libdrm_nouveau switch-sdl2 ``` 3. Make sure the `DEVKITPRO` environment variable is set to the devkitPro SDK root: ``` export DEVKITPRO=/opt/devkitpro ``` 4. Install libsolder: ``` source $DEVKITPRO/switchvars.sh git clone https://github.com/fgsfdsfgs/libsolder.git make -C libsolder install ``` ### Building using CMake ``` mkdir build && cd build aarch64-none-elf-cmake -G"Unix Makefiles" -DCMAKE_PROJECT_HLSDK-PORTABLE_INCLUDE="$DEVKITPRO/portlibs/switch/share/SolderShim.cmake" .. make -j ``` ### Building using waf ``` ./waf configure -T release --nswitch ./waf build ``` ## PlayStation Vita ### Prerequisites 1. Set up [VitaSDK](https://vitasdk.org/). 2. Install [vita-rtld](https://github.com/fgsfdsfgs/vita-rtld): ``` git clone https://github.com/fgsfdsfgs/vita-rtld.git && cd vita-rtld mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. make -j2 install ``` ### Building with waf: ``` ./waf configure -T release --psvita ./waf build ``` ### Building with CMake: ``` mkdir build && cd build cmake -G"Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE="$VITASDK/share/vita.toolchain.cmake" -DCMAKE_PROJECT_HLSDK-PORTABLE_INCLUDE="$VITASDK/share/vrtld_shim.cmake" .. make -j ``` ## Other platforms Building on other architectures (e.g x86_64 or arm) and POSIX-compliant OSes (e.g. FreeBSD) is supported. ### Prerequisites Install C and C++ compilers (like gcc or clang), cmake and make. ### Building ``` cmake -DCMAKE_BUILD_TYPE=Release -B build -S . cmake --build build ``` Force 64-bit build: ``` cmake -DCMAKE_BUILD_TYPE=Release -D64BIT=1 -B build -S . cmake --build build ``` ### Building with waf To use waf, you need to install python (2.7 minimum) ``` ./waf configure -T release ./waf ``` Force 64-bit build: ``` ./waf configure -T release -8 ./waf ``` ## Build options Some useful build options that can be set during the cmake step. * **GOLDSOURCE_SUPPORT** - allows to turn off/on the support for GoldSource input. Set to **ON** by default on x86 Windows and x86 Linux, **OFF** on other platforms. * **64BIT** - allows to turn off/on 64-bit build. Set to **OFF** by default on x86_64 Windows, x86_64 Linux and 32-bit platforms, **ON** on other 64-bit platforms. * **USE_VGUI** - whether to use VGUI library. **OFF** by default. You need to init `vgui_support` submodule in order to build with VGUI. This list is incomplete. Look at `CMakeLists.txt` to see all available options. Prepend option names with `-D` when passing to cmake. Boolean options can take values **OFF** and **ON**. Example: ``` cmake .. -DUSE_VGUI=ON -DGOLDSOURCE_SUPPORT=ON -DCROWBAR_IDLE_ANIM=ON -DCROWBAR_FIX_RAPID_CROWBAR=ON ```