Roy Shapiro
2 years ago
1 changed files with 92 additions and 130 deletions
@ -1,140 +1,102 @@ |
|||||||
# Half-Life SDK for Xash3D [![Build Status](https://github.com/FWGS/hlsdk-xash3d/actions/workflows/.github.yml/badge.svg?branch=master)](https://github.com/FWGS/hlsdk-xash3d/actions/workflows/.github.yml) [![Windows Build Status](https://ci.appveyor.com/api/projects/status/github/FWGS/hlsdk-xash3d?svg=true)](https://ci.appveyor.com/project/a1batross/hlsdk-xash3d) |
# Half-life: Invasion |
||||||
|
## A French single-player mod by JujU, Yag, D.X.M., Fregman, Manu and the company. |
||||||
Half-Life SDK for Xash3D & GoldSource with some fixes. |
|
||||||
|
This is a humble attempt by Uncle Roy to update the mod's source code |
||||||
|
to be compileable for modern Xash3d FWGS builds for GNU/Linux systems. |
||||||
|
|
||||||
|
The original source code can be obtained on the mod's ModDB page, |
||||||
|
and was released by JujU in 2015: |
||||||
|
|
||||||
|
https://www.moddb.com/mods/half-life-invasion |
||||||
|
|
||||||
|
https://www.moddb.com/mods/half-life-invasion/downloads/invasion-source-code |
||||||
|
|
||||||
|
Obviously, this attempt didn't go as smoothly as originally planned, |
||||||
|
and a great lot of things needed to be updated, fixed or worked around, |
||||||
|
as the SDK has evolved and changed greatly since the mod's release |
||||||
|
circa 2001. |
||||||
|
|
||||||
|
While this version of the code compiles properly on Debian Linux 11 and |
||||||
|
allows one to play the mod from start to finish, |
||||||
|
and most of the things seem to work as they should, it is by no means |
||||||
|
ideal or polished. Many of my fixes may seem haphazard and some are perhaps |
||||||
|
not entirely necessary (although all of them work around specific issues |
||||||
|
I have encountered), so I've tried to use #define's where possible, |
||||||
|
to make it easy to undo my fixes and try different solutions. See cl_dll/crutches.h. |
||||||
|
|
||||||
|
Also, many of JujU's original comments used non-UTF8 French enconding and were sadly |
||||||
|
partially lost in file processing. Luckily, referring to the original source code is |
||||||
|
always possible. |
||||||
|
|
||||||
|
STILL NEEDS CODE CLEAN-UP!!! |
||||||
|
|
||||||
|
## Known bugs |
||||||
|
|
||||||
|
Known bugs not fixed while upgrading \ recovering code: |
||||||
|
-Sniper rifle still has no scope (black box with a transparent circle). |
||||||
|
-Water Wave still doesn't work properly. |
||||||
|
Admittedly, neither seems to work with Xash3d (at least FWGS) even with original DLLs when run with Proton. |
||||||
|
|
||||||
|
-Also, due to the nature of the tank sound fix, it's weapons produce no visible muzzle effect |
||||||
|
when the player's selected weapon is glock (see below). |
||||||
|
|
||||||
|
### Bugs fixed |
||||||
|
|
||||||
|
Things fixed while transferring code: |
||||||
|
- Reload animations, sounds, e.t.c on certain weapons (Beretta, Shotgun, Handgrenade) didn't work. Julien's original code for non-client based weapons was used with some necessary edits. |
||||||
|
- Sniper rifle zoom states didn't work, m_pPlayer->pev->fov needed to be equalized to m_pPlayer->m_iFOV. |
||||||
|
- VGUI used to hard-crash, partially fixed: CImageLables in vgui_OrdiControl that caused the crash were replaced with CommandButtons, skipTime added to keypad, OrdiMenu and OrdiControl in order to fix double mouse key presses, +1 added to radiomsg.cpp to fix the butts of the text messages, HUD health display didn't work due to Health Msg system receieving Battery-related data, fixed by manually re-coping a part of old code and paritioning it properly. |
||||||
|
- Also fixed .txt files and fonts not loading due to backslashes, VGUI folder name being written in capitals and such. |
||||||
|
- Music not playing fixed by creating a GStreamer implementation. |
||||||
|
- l2m3 has a green exploding tank, which has func_door's named tremble_1 and tremble_2, when activated they cause SegFault on any non GoldSource-compatible build. Don't know why yet. Fixed by replacing a multi-manager target with garbage names if the map name and targetname match, see triggers.cpp. |
||||||
|
- Tank used to have a weird sound (glock event playback) when primary attack is activated, fixed with m_iPlayerInTankExternal see hud_tank.cpp and hl_weapons.cpp. |
||||||
|
- IR gun didn't actually Infra-Red anything, fixed by transferring changes to StudioModelRenderer.cpp. |
||||||
|
- It was possible to fire while entering codes, e.t.c, fixed (see hlinv_isAttackSuspended). |
||||||
|
- Cameras on l3m3 (monster_camera) should not have Thinks and shouldn't have pSprite in m_SaveData, otherwise it crashes on save, on touch (trigger), e.t.c., fixed. |
||||||
|
- Trigger_gaz and IsInGaz have also been fixed by making them non-virtual, and moving IsInGaz function wholly to CBaseEntity, but making it return FALSE unless IsPlayer returns TRUE (which it never does, until it gets called from CBasePlayer instance). |
||||||
|
|
||||||
|
The mod is playable from start to finish, with the main obvious drawbacks being: |
||||||
|
- weapons may be 'clogged' on loading game (fixed by playing with whichever ones aren't clogged until they get unclogged, probably caused by DLL checksum failing after a recompile), |
||||||
|
- Water Waves are not drawn, so aren't sniper rifle scope sprites. |
||||||
|
- and the obvious < and > symbols instead of graphical arrows at the conveyor puzzle. |
||||||
|
|
||||||
|
## A word of warning about build systems besides cmake |
||||||
|
|
||||||
|
WARNING! While I've tried editing the make files for other build systems, |
||||||
|
only cmake build was actually tested. |
||||||
|
Also, the mod won't work correctly with Android (due to lack of true VGUI), |
||||||
|
MSVC6 (haven't edited true VGUI compilation in, as IDK how to do that properly) |
||||||
|
and wscript (same reason). |
||||||
|
The premake5.lua was also edited and should, in theory, compile (as it contains |
||||||
|
VGUI compilation directives), but gstreamer wasn't edited in. |
||||||
|
If you can edit the VGUI in or fix any of those other build |
||||||
|
systems - you're more than welcome to do so! |
||||||
|
|
||||||
## How to build |
## How to build |
||||||
|
|
||||||
### CMake as most universal way |
### CMake as the only tested way |
||||||
|
|
||||||
mkdir build && cd build |
mkdir build |
||||||
cmake ../ |
cd build |
||||||
|
cmake ../ -DUSE_VGUI=1 -DUSE_GSTREAMER=1 |
||||||
make |
make |
||||||
|
|
||||||
Crosscompiling using mingw: |
On Debian, the following is necessary to: |
||||||
|
|
||||||
mkdir build-mingw && cd build-mingw |
|
||||||
TOOLCHAIN_PREFIX=i686-w64-mingw32 # check up the actual mingw prefix of your mingw installation |
|
||||||
cmake ../ -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_C_COMPILER="$TOOLCHAIN_PREFIX-gcc" -DCMAKE_CXX_COMPILER="$TOOLCHAIN_PREFIX-g++" |
|
||||||
|
|
||||||
You may enable or disable some build options by -Dkey=value. All available build options are defined in CMakeLists.txt at root directory. |
|
||||||
See below if you want to build the GoldSource compatible libraries. |
|
||||||
|
|
||||||
See below, if CMake is not suitable for you: |
|
||||||
|
|
||||||
### Windows |
|
||||||
|
|
||||||
#### Using msvc |
|
||||||
|
|
||||||
We use compilers provided with Microsoft Visual Studio 6. There're `compile.bat` scripts in both `cl_dll` and `dlls` directories. |
|
||||||
Before running any of those files you must define `MSVCDir` variable which is the path to your msvc installation. |
|
||||||
|
|
||||||
set MSVCDir=C:\Program Files\Microsoft Visual Studio |
|
||||||
compile.bat |
|
||||||
|
|
||||||
These scripts also can be ran via wine: |
|
||||||
|
|
||||||
MSVCDir="z:\home\$USER\.wine\drive_c\Program Files\Microsoft Visual Studio" wine cmd /c compile.bat |
|
||||||
|
|
||||||
The libraries built this way are always GoldSource compatible. |
|
||||||
|
|
||||||
#### Using mingw |
|
||||||
|
|
||||||
TODO |
|
||||||
|
|
||||||
### Unix-like |
|
||||||
|
|
||||||
To use waf, you need to install python (2.7 minimum) |
|
||||||
|
|
||||||
(./waf configure -T release) |
|
||||||
(./waf) |
|
||||||
|
|
||||||
### Android |
|
||||||
|
|
||||||
Just typical `ndk-build`. |
|
||||||
TODO: describe what it is. |
|
||||||
|
|
||||||
### Building GoldSource-compatible libraries |
|
||||||
|
|
||||||
To enable building the goldsource compatible client library add GOLDSOURCE_SUPPORT flag when calling cmake: |
|
||||||
|
|
||||||
cmake .. -DGOLDSOURCE_SUPPORT=ON |
|
||||||
|
|
||||||
or when using waf: |
|
||||||
|
|
||||||
./waf configure -T release --enable-goldsrc-support |
|
||||||
|
|
||||||
Unlike original client by Valve the resulting client library will not depend on vgui or SDL2 just like the one that's used in FWGS Xash3d. |
|
||||||
|
|
||||||
Note for **Windows**: it's not possible to create GoldSource compatible libraries using mingw, only msvc builds will work. |
|
||||||
|
|
||||||
Note for **Linux**: GoldSource requires libraries (both client and server) to be compiled with libstdc++ bundled with g++ of major version 4 (versions from 4.6 to 4.9 should work). |
|
||||||
If your Linux distribution does not provide compatible g++ version you have several options. |
|
||||||
|
|
||||||
#### Method 1: Statically build with c++ library |
|
||||||
|
|
||||||
This one is the most simple but has a drawback. |
|
||||||
|
|
||||||
cmake ../ -DGOLDSOURCE_SUPPORT=ON -DCMAKE_C_FLAGS="-static-libstdc++ -static-libgcc" |
|
||||||
|
|
||||||
The drawback is that the compiled libraries will be larger in size. |
|
||||||
|
|
||||||
#### Method 2: Build in Steam Runtime chroot |
|
||||||
|
|
||||||
This is the official way to build Steam compatible games for Linux. |
|
||||||
|
|
||||||
Clone https://github.com/ValveSoftware/steam-runtime and follow instructions https://github.com/ValveSoftware/steam-runtime#building-in-the-runtime |
|
||||||
|
|
||||||
sudo ./setup_chroot.sh --i386 |
|
||||||
|
|
||||||
Then use cmake and make as usual, but prepend the commands with `schroot --chroot steamrt_scout_i386 --`: |
|
||||||
|
|
||||||
mkdir build-in-steamrt && cd build-in-steamrt |
|
||||||
schroot --chroot steamrt_scout_i386 -- cmake ../ -DGOLDSOURCE_SUPPORT=ON |
|
||||||
schroot --chroot steamrt_scout_i386 -- make |
|
||||||
|
|
||||||
#### Method 3: Create your own chroot with older distro that includes g++ 4. |
|
||||||
|
|
||||||
Use the most suitable way for you to create an old distro 32-bit chroot. E.g. on Debian (and similar) you can use debootstrap. |
|
||||||
|
|
||||||
sudo debootstrap --arch=i386 jessie /var/chroot/jessie-debian-i386 # On Ubuntu type trusty instead of jessie |
|
||||||
sudo chroot /var/chroot/jessie-debian-i386 |
|
||||||
|
|
||||||
Inside chroot install cmake, make, g++ and libsdl2-dev. Then exit the chroot. |
|
||||||
|
|
||||||
On the host system install schroot. Then 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/chroot/debian-jessie-i386/ |
|
||||||
users=yourusername |
|
||||||
groups=yourusername |
|
||||||
root-groups=root |
|
||||||
preserve-environment=true |
|
||||||
personality=linux32 |
|
||||||
``` |
|
||||||
|
|
||||||
Insert your actual user name in place of `yourusername`. Then prepend any make or cmake call with `schroot -c jessie --`: |
|
||||||
|
|
||||||
mkdir build-in-chroot && cd build-in-chroot |
|
||||||
schroot --chroot jessie -- cmake ../ -DGOLDSOURCE_SUPPORT=ON |
|
||||||
schroot --chroot jessie -- make |
|
||||||
|
|
||||||
#### Method 4: Install the needed g++ version yourself |
sudo apt install libgstreamer1.0:i386 #to play with music (also install plugins) |
||||||
|
sudo apt install libgstreamer1.0-dev:i386 #to compile with music (-DUSE_GSTREAMER=1) |
||||||
|
|
||||||
TODO: describe steps. |
Also added -DUSE_FMOD option for cmake and tried my best to prevent it being used in Linux (uses windows.h include). |
||||||
|
|
||||||
#### Configuring Qt Creator to use toolchain from chroot |
The following will likely be necessary to compile a gold-source compatible (old xash, e.t.c) binaries: |
||||||
|
|
||||||
Create a file with the following contents anywhere: |
sudo apt install libsdl2-dev:i386 |
||||||
|
|
||||||
```sh |
(but this wants to install a ton of i386 dev packages) |
||||||
#!/bin/sh |
|
||||||
schroot --chroot steamrt_scout_i386 -- cmake "$@" |
|
||||||
``` |
|
||||||
|
|
||||||
Make it executable. |
Must be built with -DUSE_VGUI=1 at least to work properly (thus, update the modules when clonning). |
||||||
In Qt Creator go to `Tools` -> `Options` -> `Build & Run` -> `CMake`. Add a new cmake tool and specify the path of previously created file. |
Must be built with either -DUSE_FMOD=1 (untested, on Windows and will require fmod headers v 3.6.1 if you can still get them somewhere), |
||||||
Go to `Kits` tab, clone your default configuration and choose your CMake tool there. |
or -DUSE_GSTREAMER=1 (and have appropriate architechture (i386) gstreamer-1.0 and dev packages installed) to be able to play with music. |
||||||
Choose the new kit when opening CMakeLists.txt. |
So far GStreamer should only compile on Linux, as I haven't tested it (or linking it) on any other system. |
||||||
|
Also, dlls/CMakeLists.txt must have a system-appropriate path to i386 version of GStreamer headers. |
||||||
|
See set for ```ENV{PKG_CONFIG_PATH}```. |
Loading…
Reference in new issue