Merge branch 'master' into sci

This commit is contained in:
Andrey Akhmichin 2024-01-15 16:30:34 +05:00
commit 845cdcdf96
86 changed files with 1354 additions and 2013 deletions

View File

@ -52,13 +52,13 @@ jobs:
- name: Build on Linux - name: Build on Linux
if: startsWith(matrix.os, 'ubuntu') if: startsWith(matrix.os, 'ubuntu')
run: | run: |
schroot --chroot steamrt_scout_i386 -- cmake -B build -S . -DCMAKE_EXE_LINKER_FLAGS="-Wl,--no-undefined" -DCMAKE_INSTALL_PREFIX="$PWD/dist" schroot --chroot steamrt_scout_i386 -- cmake -DCMAKE_BUILD_TYPE=Release -DPOLLY=ON -B build -S . -DCMAKE_EXE_LINKER_FLAGS="-Wl,--no-undefined" -DCMAKE_INSTALL_PREFIX="$PWD/dist"
schroot --chroot steamrt_scout_i386 -- cmake --build build --target all schroot --chroot steamrt_scout_i386 -- cmake --build build --target all
schroot --chroot steamrt_scout_i386 -- cmake --build build --target install schroot --chroot steamrt_scout_i386 -- cmake --build build --target install
- name: Build on Linux with vgui - name: Build on Linux with vgui
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.cc, 'gcc') if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.cc, 'gcc')
run: | run: |
schroot --chroot steamrt_scout_i386 -- cmake -B build-vgui -S . -DCMAKE_EXE_LINKER_FLAGS="-Wl,--no-undefined" -DUSE_VGUI=ON -DCMAKE_INSTALL_PREFIX="$PWD/dist-vgui" schroot --chroot steamrt_scout_i386 -- cmake -DCMAKE_BUILD_TYPE=Release -DPOLLY=ON -B build-vgui -S . -DCMAKE_EXE_LINKER_FLAGS="-Wl,--no-undefined" -DUSE_VGUI=ON -DCMAKE_INSTALL_PREFIX="$PWD/dist-vgui"
cp vgui_support/vgui-dev/lib/vgui.so build-vgui/cl_dll cp vgui_support/vgui-dev/lib/vgui.so build-vgui/cl_dll
schroot --chroot steamrt_scout_i386 -- cmake --build build-vgui --target all schroot --chroot steamrt_scout_i386 -- cmake --build build-vgui --target all
schroot --chroot steamrt_scout_i386 -- cmake --build build-vgui --target install schroot --chroot steamrt_scout_i386 -- cmake --build build-vgui --target install

10
.gitignore vendored
View File

@ -29,3 +29,13 @@ CMakeSettings.json
CMakeFiles CMakeFiles
CMakeCache.txt CMakeCache.txt
Makefile Makefile
# Android Studio/Gradle
.gradle/
.externalNativeBuild
.cxx/
.idea/
local.properties
.project
.classpath
.settings

View File

@ -20,7 +20,8 @@
# SOFTWARE. # SOFTWARE.
# #
cmake_minimum_required(VERSION 2.8.12) # 3.9 added captures in if(MATCHES)
cmake_minimum_required(VERSION 3.9)
if(NOT ${CMAKE_VERSION} VERSION_LESS "3.15.0") if(NOT ${CMAKE_VERSION} VERSION_LESS "3.15.0")
cmake_policy(SET CMP0091 NEW) cmake_policy(SET CMP0091 NEW)
@ -32,6 +33,7 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/")
include(CheckIncludeFile) include(CheckIncludeFile)
include(CheckCSourceCompiles) include(CheckCSourceCompiles)
include(VSForceXPToolchain) # Force XP toolchain for Visual Studio include(VSForceXPToolchain) # Force XP toolchain for Visual Studio
include(CheckIPOSupported)
project (HLSDK-PORTABLE) project (HLSDK-PORTABLE)
@ -45,41 +47,67 @@ option(USE_NOVGUI_SCOREBOARD "Prefer non-VGUI Scoreboard when USE_VGUI is enable
option(USE_VOICEMGR "Enable VOICE MANAGER." OFF) option(USE_VOICEMGR "Enable VOICE MANAGER." OFF)
option(BUILD_CLIENT "Build client dll" ON) option(BUILD_CLIENT "Build client dll" ON)
option(BUILD_SERVER "Build server dll" ON) option(BUILD_SERVER "Build server dll" ON)
option(POLLY "Enable pollyhedral optimization" OFF)
if (CMAKE_SIZEOF_VOID_P EQUAL 4 OR if(CMAKE_SIZEOF_VOID_P EQUAL 4 OR
((WIN32 OR ${CMAKE_SYSTEM_NAME} STREQUAL "Linux") ((WIN32 OR ${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
AND (CMAKE_SYSTEM_PROCESSOR STREQUAL "x64" AND (CMAKE_SYSTEM_PROCESSOR STREQUAL "x64"
OR CMAKE_SYSTEM_PROCESSOR STREQUAL "X64"
OR CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64"
OR CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64"))) OR CMAKE_SYSTEM_PROCESSOR STREQUAL "X86_64"
OR CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64"
OR CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64"
OR CMAKE_SYSTEM_PROCESSOR STREQUAL "EM64T")))
option(64BIT "Disable auto -m32 appending to compiler flags" OFF) option(64BIT "Disable auto -m32 appending to compiler flags" OFF)
option(GOLDSOURCE_SUPPORT "Build goldsource compatible client library" ON)
else() else()
option(64BIT "Disable auto -m32 appending to compiler flags" ON) option(64BIT "Disable auto -m32 appending to compiler flags" ON)
option(GOLDSOURCE_SUPPORT "Build goldsource compatible client library" OFF)
endif() endif()
option(BARNACLE_FIX_VISIBILITY "Enable barnacle tongue length fix" ON) # It seems CMAKE_SYSTEM_PROCESSOR parameter completely useless for APPLE platform,
option(CLIENT_WEAPONS "Enable client local weapons prediction" ON) # so may need to set options here manually.
option(CROWBAR_IDLE_ANIM "Enable crowbar idle animation" ON) if((WIN32 OR ${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
option(CROWBAR_DELAY_FIX "Enable crowbar attack delay fix" ON) AND (((CMAKE_SYSTEM_PROCESSOR STREQUAL "x64"
option(CROWBAR_FIX_RAPID_CROWBAR "Enable rapid crowbar fix" ON) OR CMAKE_SYSTEM_PROCESSOR STREQUAL "X64"
option(GAUSS_OVERCHARGE_FIX "Enable gauss overcharge fix" OFF) OR CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64"
option(TRIPMINE_BEAM_DUPLICATION_FIX "Enable fix of tripmine beam duplication on level transition" OFF) OR CMAKE_SYSTEM_PROCESSOR STREQUAL "X86_64"
option(HANDGRENADE_DEPLOY_FIX "Enable handgrenade deploy animation fix after finishing a throw" OFF) OR CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64"
option(WEAPONS_ANIMATION_TIMES_FIX "Enable animation times fix for some weapons" OFF) OR CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64"
option(OEM_BUILD "Enable OEM Build" OFF) OR CMAKE_SYSTEM_PROCESSOR STREQUAL "EM64T") AND NOT 64BIT)
option(HLDEMO_BUILD "Enable Demo Build" OFF) OR CMAKE_SYSTEM_PROCESSOR STREQUAL "x86"
OR CMAKE_SYSTEM_PROCESSOR STREQUAL "X86"
set(GAMEDIR "sci" CACHE STRING "Gamedir path") OR CMAKE_SYSTEM_PROCESSOR STREQUAL "i386"))
set(SERVER_INSTALL_DIR "dlls" CACHE STRING "Where put server dll") option(GOLDSOURCE_SUPPORT "Build goldsource compatible client library" ON)
set(CLIENT_INSTALL_DIR "cl_dlls" CACHE STRING "Where put client dll") else()
set(SERVER_LIBRARY_NAME "game" CACHE STRING "Library name for PC platforms") option(GOLDSOURCE_SUPPORT "Build goldsource compatible client library" OFF)
message(STATUS "Half-Life: Quest Mode") endif()
#----------------- #-----------------
# MAIN BUILD CODE \ # MAIN BUILD CODE \
###################\ ###################\
file(STRINGS "mod_options.txt" MOD_OPTIONS_STRINGS REGEX "^([A-Za-z0-9_]+)=([A-Za-z0-9_]+)\ \#\ (.*)$")
foreach(LINE IN LISTS MOD_OPTIONS_STRINGS)
# file() itself doesn't populate CMAKE_MATCH_<n>, so
# reparse the string
if(${LINE} MATCHES "^([A-Za-z0-9_]+)=([A-Za-z0-9_]+)\ \#\ (.*)$")
# detect boolean options
if(${CMAKE_MATCH_2} STREQUAL "ON" OR ${CMAKE_MATCH_2} STREQUAL "OFF")
option(${CMAKE_MATCH_1} "${CMAKE_MATCH_3}" ${CMAKE_MATCH_2})
# let's check it here as well
if(${CMAKE_MATCH_1})
message(STATUS ${CMAKE_MATCH_3} " is enabled")
add_definitions(-D${CMAKE_MATCH_1})
else()
message(STATUS ${CMAKE_MATCH_3} " is disabled")
endif()
else()
set(${CMAKE_MATCH_1} "${CMAKE_MATCH_2}" CACHE STRING "${CMAKE_MATCH_3}")
endif()
endif()
endforeach()
if(HLDEMO_BUILD AND OEM_BUILD) if(HLDEMO_BUILD AND OEM_BUILD)
message(FATAL_ERROR "Don't mix Demo and OEM builds!") message(FATAL_ERROR "Don't mix Demo and OEM builds!")
endif() endif()
@ -109,76 +137,11 @@ else()
message(STATUS "Building for 32 Bit") message(STATUS "Building for 32 Bit")
endif() endif()
if(CLIENT_WEAPONS)
message(STATUS "Client weapons enabled.")
add_definitions(-DCLIENT_WEAPONS)
endif()
if(BARNACLE_FIX_VISIBILITY)
message(STATUS "Barnacle tongue fix enabled")
add_definitions(-DBARNACLE_FIX_VISIBILITY)
endif()
if(CROWBAR_IDLE_ANIM)
message(STATUS "Crowbar idle animation enabled")
add_definitions(-DCROWBAR_IDLE_ANIM)
endif()
if(CROWBAR_DELAY_FIX)
message(STATUS "Crowbar attack delay fix enabled")
add_definitions(-DCROWBAR_DELAY_FIX)
endif()
if(CROWBAR_FIX_RAPID_CROWBAR)
message(STATUS "Rapid crowbar fix enabled")
add_definitions(-DCROWBAR_FIX_RAPID_CROWBAR)
endif()
if(GAUSS_OVERCHARGE_FIX)
message(STATUS "Gauss overcharge fix enabled")
add_definitions(-DGAUSS_OVERCHARGE_FIX)
endif()
if(TRIPMINE_BEAM_DUPLICATION_FIX)
message(STATUS "Tripmine beam duplication fix enabled")
add_definitions(-DTRIPMINE_BEAM_DUPLICATION_FIX)
endif()
if(HANDGRENADE_DEPLOY_FIX)
message(STATUS "Handgrenade deploy animation fix enabled")
add_definitions(-DHANDGRENADE_DEPLOY_FIX)
endif()
if(WEAPONS_ANIMATION_TIMES_FIX)
message(STATUS "Weapons animation times fix enabled")
add_definitions(-DWEAPONS_ANIMATION_TIMES_FIX)
endif()
if(OEM_BUILD)
message(STATUS "OEM build enabled")
add_definitions(-DOEM_BUILD)
endif()
if(HLDEMO_BUILD)
message(STATUS "Demo build enabled")
add_definitions(-DHLDEMO_BUILD)
endif()
if (MINGW) if (MINGW)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--add-stdcall-alias") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--add-stdcall-alias")
endif() endif()
# add_compile_options for older cmake versions
if(${CMAKE_VERSION} VERSION_LESS "3.0.2")
macro(add_compile_options)
set(list_var "${ARGV}")
foreach(arg IN LISTS list_var)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${arg}")
endforeach()
endmacro()
endif()
if(NOT MSVC) if(NOT MSVC)
#add_compile_options(-Wempty-body) # GCC/Clang flag #add_compile_options(-Wempty-body) # GCC/Clang flag
add_compile_options(-Wreturn-type) # GCC/Clang flag add_compile_options(-Wreturn-type) # GCC/Clang flag
@ -190,6 +153,13 @@ if(VITA)
add_compile_options(-fno-use-cxa-atexit) add_compile_options(-fno-use-cxa-atexit)
endif() endif()
check_ipo_supported(RESULT HAVE_LTO OUTPUT LTO_ERROR)
if(HAVE_LTO)
message(STATUS "IPO / LTO enabled")
else()
message(STATUS "IPO / LTO not supported: <${LTO_ERROR}>")
endif()
check_include_file("tgmath.h" HAVE_TGMATH_H) check_include_file("tgmath.h" HAVE_TGMATH_H)
if(HAVE_TGMATH_H) if(HAVE_TGMATH_H)
if(NOT MSVC) if(NOT MSVC)
@ -216,3 +186,11 @@ endif()
if(NOT BUILD_SERVER AND NOT BUILD_CLIENT) if(NOT BUILD_SERVER AND NOT BUILD_CLIENT)
message(FATAL_ERROR "Nothing to build") message(FATAL_ERROR "Nothing to build")
endif() endif()
if(POLLY)
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
add_compile_options(-mllvm -polly)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
add_compile_options(-fgraphite-identity -floop-interchange -floop-block)
endif()
endif()

View File

@ -80,7 +80,7 @@ git clone --recursive https://github.com/FWGS/hlsdk-portable
### Prerequisites ### 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` 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...*. 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 ### Opening command prompt
@ -164,7 +164,7 @@ sudo ./setup_chroot.sh --i386 --tarball ./com.valvesoftware.SteamRuntime.Sdk-i38
Now you can use cmake and make prepending the commands with `schroot --chroot steamrt_scout_i386 --`: Now you can use cmake and make prepending the commands with `schroot --chroot steamrt_scout_i386 --`:
``` ```
schroot --chroot steamrt_scout_i386 -- cmake -B build-in-steamrt -S . 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 schroot --chroot steamrt_scout_i386 -- cmake --build build-in-steamrt
``` ```
@ -180,13 +180,20 @@ sudo apt install cmake build-essential gcc-multilib g++-multilib libsdl2-dev:i38
### Building ### Building
``` ```
cmake -B build -S . cmake -DCMAKE_BUILD_TYPE=Release -B build -S .
cmake --build build 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: 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_C_FLAGS="-static-libstdc++ -static-libgcc" 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. To ensure portability it's still better to build using Steam Runtime or another chroot of some older distro.
@ -229,13 +236,36 @@ Insert your actual user name in place of `yourusername`.
Prepend any make or cmake call with `schroot -c jessie --`: Prepend any make or cmake call with `schroot -c jessie --`:
``` ```
schroot --chroot jessie -- cmake -B build-in-chroot -S . schroot --chroot jessie -- cmake -DCMAKE_BUILD_TYPE=Release -B build-in-chroot -S .
schroot --chroot jessie -- cmake --build build-in-chroot schroot --chroot jessie -- cmake --build build-in-chroot
``` ```
## Android ## Android
1. Set up [Android Studio/Android SDK](https://developer.android.com/studio).
TODO ### 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 ## Nintendo Switch
@ -307,7 +337,13 @@ Install C and C++ compilers (like gcc or clang), cmake and make.
### Building ### Building
``` ```
cmake -B build -S . 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 cmake --build build
``` ```
@ -316,15 +352,22 @@ cmake --build build
To use waf, you need to install python (2.7 minimum) To use waf, you need to install python (2.7 minimum)
``` ```
(./waf configure -T release) ./waf configure -T release
(./waf) ./waf
```
Force 64-bit build:
```
./waf configure -T release -8
./waf
``` ```
## Build options ## Build options
Some useful build options that can be set during the cmake step. 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 Windows and Linux, **OFF** on other platforms. * **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. * **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. This list is incomplete. Look at `CMakeLists.txt` to see all available options.

73
android/app/build.gradle Normal file
View File

@ -0,0 +1,73 @@
import java.time.LocalDateTime
import java.time.Month
import java.time.temporal.ChronoUnit
apply plugin: 'com.android.application'
android {
ndkVersion '26.1.10909125'
namespace 'com.example.hlsdk'
defaultConfig {
applicationId 'com.example.hlsdk'
versionName '1.0'
versionCode getBuildNum()
minSdkVersion 3
targetSdk 34
compileSdk 34
externalNativeBuild {
cmake {
arguments '-DPOLLY=ON'
}
}
}
externalNativeBuild {
cmake {
version '3.22.1'
path file('../../CMakeLists.txt')
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
buildTypes {
debug {
minifyEnabled false
shrinkResources false
debuggable true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
release {
minifyEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
lint {
abortOnError false
}
androidResources {
noCompress += ''
}
packagingOptions {
jniLibs {
useLegacyPackaging = true
}
}
}
static def getBuildNum() {
LocalDateTime now = LocalDateTime.now()
LocalDateTime releaseDate = LocalDateTime.of(2023, Month.DECEMBER, 28, 0, 0, 0)
int qBuildNum = releaseDate.until(now, ChronoUnit.DAYS)
int minuteOfDay = now.getHour() * 60 + now.getMinute()
return qBuildNum * 10000 + minuteOfDay
}

View File

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:forceQueryable="true"
android:icon="@android:mipmap/sym_def_app_icon"
android:label="hlsdk-portable"
tools:targetApi="r">
<meta-data
android:name="su.xash.engine.gamedir"
android:value="valve" />
<activity
android:name="su.xash.hlsdk.MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="su.xash.engine.MOD" />
</intent-filter>
</activity>
</application>
<queries>
<package android:name="su.xash.engine" />
<package android:name="su.xash.engine.test" />
</queries>
</manifest>

View File

@ -0,0 +1,37 @@
package su.xash.hlsdk;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String pkg = "su.xash.engine.test";
try {
getPackageManager().getPackageInfo(pkg, 0);
} catch (PackageManager.NameNotFoundException e) {
try {
pkg = "su.xash.engine";
getPackageManager().getPackageInfo(pkg, 0);
} catch (PackageManager.NameNotFoundException ex) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=su.xash.engine")).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK));
finish();
return;
}
}
startActivity(new Intent().setComponent(new ComponentName(pkg, "su.xash.engine.XashActivity"))
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
.putExtra("gamedir", "valve")
.putExtra("gamelibdir", getApplicationInfo().nativeLibraryDir)
.putExtra("package", getPackageName()));
finish();
}
}

17
android/build.gradle Normal file
View File

@ -0,0 +1,17 @@
buildscript {
repositories {
mavenCentral()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.2.0'
}
}
allprojects {
repositories {
mavenCentral()
google()
}
}

21
android/gradle.properties Normal file
View File

@ -0,0 +1,21 @@
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=384m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# android.useDeprecatedNdk=true
android.enableJetifier=true
android.useAndroidX=true

Binary file not shown.

View File

@ -0,0 +1,6 @@
#Thu Dec 28 14:36:02 EET 2023
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

160
android/gradlew vendored Executable file
View File

@ -0,0 +1,160 @@
#!/usr/bin/env bash
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

90
android/gradlew.bat vendored Normal file
View File

@ -0,0 +1,90 @@
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windowz variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

3
android/settings.gradle Normal file
View File

@ -0,0 +1,3 @@
include ':app'
rootProject.name = 'hlsdk-portable'

View File

@ -20,7 +20,7 @@
# SOFTWARE. # SOFTWARE.
# #
cmake_minimum_required(VERSION 2.8.12) cmake_minimum_required(VERSION 3.9)
project (CLDLL) project (CLDLL)
set (CLDLL_LIBRARY client) set (CLDLL_LIBRARY client)
@ -29,13 +29,25 @@ add_definitions(-DCLIENT_DLL)
if(NOT MSVC) if(NOT MSVC)
add_compile_options(-fno-exceptions) # GCC/Clang flag add_compile_options(-fno-exceptions) # GCC/Clang flag
add_compile_options(-Wno-write-strings) # GCC/Clang flag add_compile_options(-fno-rtti) # GCC/Clang flag
add_compile_options(-fvisibility=hidden) # GCC/Clang flag add_compile_options(-fvisibility=hidden) # GCC/Clang flag
add_definitions(-D_LINUX -DLINUX) # It seems enough for all non-Win32 systems add_definitions(-D_LINUX -DLINUX) # It seems enough for all non-Win32 systems
add_definitions(-Dstricmp=strcasecmp -Dstrnicmp=strncasecmp) add_definitions(-Dstricmp=strcasecmp -Dstrnicmp=strncasecmp)
if(NOT MINGW) if(NOT MINGW)
add_definitions(-D_snprintf=snprintf -D_vsnprintf=vsnprintf) add_definitions(-D_snprintf=snprintf -D_vsnprintf=vsnprintf)
endif() endif()
if(CMAKE_BUILD_TYPE MATCHES "Release"
OR (CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo"
AND CMAKE_SYSTEM_NAME STREQUAL "Android"))
add_compile_options(-fno-unwind-tables -fno-asynchronous-unwind-tables) # GCC/Clang flag
add_compile_options(-fomit-frame-pointer) # GCC/Clang flag
add_compile_options(-ftree-vectorize) # GCC/Clang flag
add_compile_options(-funsafe-math-optimizations) # GCC/Clang flag
if(CMAKE_SYSTEM_NAME STREQUAL "Android")
add_compile_options(-O3 -DNDEBUG) # gradle compiles release builds with RelWithDebInfo(-O2 -g) and strips debug symbols.
target_link_options(${CLDLL_LIBRARY} PUBLIC "LINKER:-O3")
endif()
endif()
else() else()
add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE) add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE)
endif() endif()
@ -208,8 +220,16 @@ if(MSVC)
set_property(TARGET ${CLDLL_LIBRARY} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") set_property(TARGET ${CLDLL_LIBRARY} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
endif() endif()
if(HAVE_LTO)
set_property(TARGET ${CLDLL_LIBRARY} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
endif()
install( TARGETS ${CLDLL_LIBRARY} install( TARGETS ${CLDLL_LIBRARY}
DESTINATION "${GAMEDIR}/${CLIENT_INSTALL_DIR}/" DESTINATION "${GAMEDIR}/${CLIENT_INSTALL_DIR}/"
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
GROUP_READ GROUP_EXECUTE GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE ) WORLD_READ WORLD_EXECUTE )
add_custom_command(TARGET ${CLDLL_LIBRARY}
POST_BUILD DEPENDS ${CLDLL_LIBRARY}
COMMAND $<$<CONFIG:release>:${CMAKE_STRIP}> -s $<TARGET_FILE:${CLDLL_LIBRARY}>)

View File

@ -73,7 +73,7 @@ int CHudMOTD::Draw( float fTime )
//bool bScroll; //bool bScroll;
// find the top of where the MOTD should be drawn, so the whole thing is centered in the screen // find the top of where the MOTD should be drawn, so the whole thing is centered in the screen
int ypos = ( ScreenHeight - LINE_HEIGHT * m_iLines ) / 2; // shift it up slightly int ypos = ( ScreenHeight - LINE_HEIGHT * m_iLines ) / 2; // shift it up slightly
char *ch = m_szMOTD; unsigned char *ch = (unsigned char*)m_szMOTD;
int xpos = ( ScreenWidth - gHUD.m_scrinfo.charWidths['M'] * m_iMaxLength ) / 2; int xpos = ( ScreenWidth - gHUD.m_scrinfo.charWidths['M'] * m_iMaxLength ) / 2;
if( xpos < 30 ) if( xpos < 30 )
xpos = 30; xpos = 30;
@ -95,11 +95,13 @@ int CHudMOTD::Draw( float fTime )
gHUD.DrawDarkRectangle( xpos - 5, ypos_r - 5, xmax - xpos + 10, height + 10 ); gHUD.DrawDarkRectangle( xpos - 5, ypos_r - 5, xmax - xpos + 10, height + 10 );
while( *ch ) while( *ch )
{ {
char *next_line; unsigned char *next_line;
int line_length = 0; // count the length of the current line
for( next_line = ch; *next_line != '\n' && *next_line != 0; next_line++ ) for( next_line = ch; *next_line != '\n' && *next_line != 0; next_line++ )
line_length += gHUD.m_scrinfo.charWidths[*next_line]; ;
char *top = next_line; // int line_length = 0; // count the length of the current line
// for( next_line = ch; *next_line != '\n' && *next_line != 0; next_line++ )
// line_length += gHUD.m_scrinfo.charWidths[*next_line];
unsigned char *top = next_line;
if( *top == '\n' ) if( *top == '\n' )
*top = 0; *top = 0;
else else
@ -107,7 +109,7 @@ int CHudMOTD::Draw( float fTime )
// find where to start drawing the line // find where to start drawing the line
if( ( ypos > ROW_RANGE_MIN ) && ( ypos + LINE_HEIGHT <= ypos_r + height ) ) if( ( ypos > ROW_RANGE_MIN ) && ( ypos + LINE_HEIGHT <= ypos_r + height ) )
DrawUtfString( xpos, ypos, xmax, ch, 255, 180, 0 ); DrawUtfString( xpos, ypos, xmax, (const char*)ch, 255, 180, 0 );
ypos += LINE_HEIGHT; ypos += LINE_HEIGHT;

View File

@ -28,7 +28,7 @@
#include "vgui_TeamFortressViewport.h" #include "vgui_TeamFortressViewport.h"
#endif #endif
#if GOLDSOURCE_SUPPORT && (_WIN32 || __linux__ || __APPLE__) && (__i386 || _M_IX86) #if GOLDSOURCE_SUPPORT && (XASH_WIN32 || XASH_LINUX || XASH_APPLE) && XASH_X86
#define USE_FAKE_VGUI !USE_VGUI #define USE_FAKE_VGUI !USE_VGUI
#if USE_FAKE_VGUI #if USE_FAKE_VGUI
#include "VGUI_Panel.h" #include "VGUI_Panel.h"
@ -50,20 +50,10 @@ TeamFortressViewport *gViewPort = NULL;
#endif #endif
mobile_engfuncs_t *gMobileEngfuncs = NULL; mobile_engfuncs_t *gMobileEngfuncs = NULL;
extern "C" int g_bhopcap;
void InitInput( void ); void InitInput( void );
void EV_HookEvents( void ); void EV_HookEvents( void );
void IN_Commands( void ); void IN_Commands( void );
int __MsgFunc_Bhopcap( const char *pszName, int iSize, void *pbuf )
{
BEGIN_READ( pbuf, iSize );
g_bhopcap = READ_BYTE();
return 1;
}
/* /*
========================== ==========================
Initialize Initialize
@ -299,8 +289,6 @@ void DLLEXPORT HUD_Init( void )
#if USE_VGUI #if USE_VGUI
Scheme_Init(); Scheme_Init();
#endif #endif
gEngfuncs.pfnHookUserMsg( "Bhopcap", __MsgFunc_Bhopcap );
} }
/* /*

View File

@ -28,6 +28,7 @@
#pragma once #pragma once
#if !defined(CL_DLL_H) #if !defined(CL_DLL_H)
#define CL_DLL_H #define CL_DLL_H
#include "build.h"
typedef unsigned char byte; typedef unsigned char byte;
typedef unsigned short word; typedef unsigned short word;
typedef float vec_t; typedef float vec_t;
@ -39,7 +40,7 @@ typedef float vec_t;
#include "../engine/cdll_int.h" #include "../engine/cdll_int.h"
#include "../dlls/cdll_dll.h" #include "../dlls/cdll_dll.h"
#if !_WIN32 #if !XASH_WIN32
#define _cdecl #define _cdecl
#endif #endif
#include "exportdef.h" #include "exportdef.h"
@ -49,9 +50,6 @@ typedef float vec_t;
#else #else
#include <math.h> #include <math.h>
#endif #endif
#if __LP64__ || __LLP64__ || _WIN64 || (__x86_64__ && !__ILP32__) || _M_X64 || __ia64 || _M_IA64 || __aarch64__ || __powerpc64__
#define XASH_64BIT 1
#endif
extern cl_enginefunc_t gEngfuncs; extern cl_enginefunc_t gEngfuncs;
#include "../engine/mobility_int.h" #include "../engine/mobility_int.h"

View File

@ -166,7 +166,8 @@ void VectorScale( const float *in, float scale, float *out );
float VectorNormalize( float *v ); float VectorNormalize( float *v );
void VectorInverse( float *v ); void VectorInverse( float *v );
extern vec3_t vec3_origin; // extern vec3_t vec3_origin;
extern float vec3_origin[3];
// disable 'possible loss of data converting float to int' warning message // disable 'possible loss of data converting float to int' warning message
#pragma warning( disable: 4244 ) #pragma warning( disable: 4244 )

View File

@ -420,7 +420,7 @@ void EV_HLDM_FireBullets( int idx, float *forward, float *right, float *up, int
gEngfuncs.pEventAPI->EV_SetSolidPlayers( idx - 1 ); gEngfuncs.pEventAPI->EV_SetSolidPlayers( idx - 1 );
gEngfuncs.pEventAPI->EV_SetTraceHull( 2 ); gEngfuncs.pEventAPI->EV_SetTraceHull( 2 );
gEngfuncs.pEventAPI->EV_PlayerTrace( vecSrc, vecEnd, PM_STUDIO_BOX, -1, &tr ); gEngfuncs.pEventAPI->EV_PlayerTrace( vecSrc, vecEnd, PM_NORMAL, -1, &tr );
tracer = EV_HLDM_CheckTracer( idx, vecSrc, tr.endpos, forward, right, iBulletType, iTracerFreq, tracerCount ); tracer = EV_HLDM_CheckTracer( idx, vecSrc, tr.endpos, forward, right, iBulletType, iTracerFreq, tracerCount );
@ -883,7 +883,7 @@ void EV_FireGauss( event_args_t *args )
gEngfuncs.pEventAPI->EV_SetSolidPlayers( idx - 1 ); gEngfuncs.pEventAPI->EV_SetSolidPlayers( idx - 1 );
gEngfuncs.pEventAPI->EV_SetTraceHull( 2 ); gEngfuncs.pEventAPI->EV_SetTraceHull( 2 );
gEngfuncs.pEventAPI->EV_PlayerTrace( vecSrc, vecDest, PM_STUDIO_BOX, -1, &tr ); gEngfuncs.pEventAPI->EV_PlayerTrace( vecSrc, vecDest, PM_NORMAL, -1, &tr );
gEngfuncs.pEventAPI->EV_PopPMStates(); gEngfuncs.pEventAPI->EV_PopPMStates();
@ -1004,14 +1004,14 @@ void EV_FireGauss( event_args_t *args )
gEngfuncs.pEventAPI->EV_SetSolidPlayers ( idx - 1 ); gEngfuncs.pEventAPI->EV_SetSolidPlayers ( idx - 1 );
gEngfuncs.pEventAPI->EV_SetTraceHull( 2 ); gEngfuncs.pEventAPI->EV_SetTraceHull( 2 );
gEngfuncs.pEventAPI->EV_PlayerTrace( start, vecDest, PM_STUDIO_BOX, -1, &beam_tr ); gEngfuncs.pEventAPI->EV_PlayerTrace( start, vecDest, PM_NORMAL, -1, &beam_tr );
if( !beam_tr.allsolid ) if( !beam_tr.allsolid )
{ {
vec3_t delta; vec3_t delta;
// trace backwards to find exit point // trace backwards to find exit point
gEngfuncs.pEventAPI->EV_PlayerTrace( beam_tr.endpos, tr.endpos, PM_STUDIO_BOX, -1, &beam_tr ); gEngfuncs.pEventAPI->EV_PlayerTrace( beam_tr.endpos, tr.endpos, PM_NORMAL, -1, &beam_tr );
VectorSubtract( beam_tr.endpos, tr.endpos, delta ); VectorSubtract( beam_tr.endpos, tr.endpos, delta );
@ -1214,7 +1214,7 @@ void EV_FireCrossbow2( event_args_t *args )
// Now add in all of the players. // Now add in all of the players.
gEngfuncs.pEventAPI->EV_SetSolidPlayers ( idx - 1 ); gEngfuncs.pEventAPI->EV_SetSolidPlayers ( idx - 1 );
gEngfuncs.pEventAPI->EV_SetTraceHull( 2 ); gEngfuncs.pEventAPI->EV_SetTraceHull( 2 );
gEngfuncs.pEventAPI->EV_PlayerTrace( vecSrc, vecEnd, PM_STUDIO_BOX, -1, &tr ); gEngfuncs.pEventAPI->EV_PlayerTrace( vecSrc, vecEnd, PM_NORMAL, -1, &tr );
//We hit something //We hit something
if( tr.fraction < 1.0f ) if( tr.fraction < 1.0f )
@ -1450,7 +1450,7 @@ void EV_EgonFire( event_args_t *args )
gEngfuncs.pEventAPI->EV_SetSolidPlayers( idx - 1 ); gEngfuncs.pEventAPI->EV_SetSolidPlayers( idx - 1 );
gEngfuncs.pEventAPI->EV_SetTraceHull( 2 ); gEngfuncs.pEventAPI->EV_SetTraceHull( 2 );
gEngfuncs.pEventAPI->EV_PlayerTrace( vecSrc, vecEnd, PM_STUDIO_BOX, -1, &tr ); gEngfuncs.pEventAPI->EV_PlayerTrace( vecSrc, vecEnd, PM_NORMAL, -1, &tr );
gEngfuncs.pEventAPI->EV_PopPMStates(); gEngfuncs.pEventAPI->EV_PopPMStates();

View File

@ -15,7 +15,7 @@
#include "camera.h" #include "camera.h"
#include "in_defs.h" #include "in_defs.h"
#if _WIN32 #if XASH_WIN32
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#define WIN32_EXTRA_LEAN #define WIN32_EXTRA_LEAN
#define HSPRITE WINDOWS_HSPRITE #define HSPRITE WINDOWS_HSPRITE

View File

@ -23,7 +23,7 @@
#include "keydefs.h" #include "keydefs.h"
#include "view.h" #include "view.h"
#if !_WIN32 #if !XASH_WIN32
#define USE_SDL2 1 #define USE_SDL2 1
#endif #endif
@ -114,7 +114,7 @@ static SDLFunction sdlFunctions[] = {
}; };
#endif #endif
#if _WIN32 #if XASH_WIN32
#include <process.h> #include <process.h>
#else #else
typedef unsigned int DWORD; typedef unsigned int DWORD;
@ -149,7 +149,7 @@ extern cvar_t *cl_forwardspeed;
extern cvar_t *cl_pitchspeed; extern cvar_t *cl_pitchspeed;
extern cvar_t *cl_movespeedkey; extern cvar_t *cl_movespeedkey;
#if _WIN32 #if XASH_WIN32
static cvar_t* m_rawinput = NULL; static cvar_t* m_rawinput = NULL;
static double s_flRawInputUpdateTime = 0.0f; static double s_flRawInputUpdateTime = 0.0f;
static bool m_bRawInput = false; static bool m_bRawInput = false;
@ -157,7 +157,7 @@ static bool m_bMouseThread = false;
bool isMouseRelative = false; bool isMouseRelative = false;
#endif #endif
#if _WIN32 #if XASH_WIN32
#include "progdefs.h" #include "progdefs.h"
#endif #endif
@ -184,7 +184,7 @@ static cvar_t *m_customaccel_max;
//Mouse move is raised to this power before being scaled by scale factor //Mouse move is raised to this power before being scaled by scale factor
static cvar_t *m_customaccel_exponent; static cvar_t *m_customaccel_exponent;
#if _WIN32 #if XASH_WIN32
// if threaded mouse is enabled then the time to sleep between polls // if threaded mouse is enabled then the time to sleep between polls
static cvar_t *m_mousethread_sleep; static cvar_t *m_mousethread_sleep;
#endif #endif
@ -218,7 +218,7 @@ enum _ControlList
AxisTurn AxisTurn
}; };
#if !USE_SDL2 && _WIN32 #if !USE_SDL2 && XASH_WIN32
DWORD dwAxisFlags[JOY_MAX_AXES] = DWORD dwAxisFlags[JOY_MAX_AXES] =
{ {
JOY_RETURNX, JOY_RETURNX,
@ -234,7 +234,7 @@ DWORD dwAxisMap[ JOY_MAX_AXES ];
DWORD dwControlMap[ JOY_MAX_AXES ]; DWORD dwControlMap[ JOY_MAX_AXES ];
#if USE_SDL2 #if USE_SDL2
int pdwRawValue[ JOY_MAX_AXES ]; int pdwRawValue[ JOY_MAX_AXES ];
#elif _WIN32 #elif XASH_WIN32
PDWORD pdwRawValue[ JOY_MAX_AXES ]; PDWORD pdwRawValue[ JOY_MAX_AXES ];
#endif #endif
DWORD joy_oldbuttonstate, joy_oldpovstate; DWORD joy_oldbuttonstate, joy_oldpovstate;
@ -244,7 +244,7 @@ DWORD joy_numbuttons;
#if USE_SDL2 #if USE_SDL2
SDL_GameController *s_pJoystick = NULL; SDL_GameController *s_pJoystick = NULL;
#elif _WIN32 #elif XASH_WIN32
DWORD joy_flags; DWORD joy_flags;
static JOYINFOEX ji; static JOYINFOEX ji;
#endif #endif
@ -276,7 +276,7 @@ cvar_t *joy_wwhack2;
int joy_avail, joy_advancedinit, joy_haspov; int joy_avail, joy_advancedinit, joy_haspov;
#if _WIN32 #if XASH_WIN32
unsigned int s_hMouseThreadId = 0; unsigned int s_hMouseThreadId = 0;
HANDLE s_hMouseThread = 0; HANDLE s_hMouseThread = 0;
HANDLE s_hMouseQuitEvent = 0; HANDLE s_hMouseQuitEvent = 0;
@ -300,7 +300,7 @@ void Force_CenterView_f (void)
} }
} }
#if _WIN32 #if XASH_WIN32
LONG mouseThreadActive = 0; LONG mouseThreadActive = 0;
LONG mouseThreadCenterX = 0; LONG mouseThreadCenterX = 0;
@ -382,7 +382,7 @@ void IN_SetMouseMode(bool enable)
if(enable) if(enable)
{ {
#if _WIN32 #if XASH_WIN32
if (mouseparmsvalid) if (mouseparmsvalid)
restore_spi = SystemParametersInfo (SPI_SETMOUSE, 0, newmouseparms, 0); restore_spi = SystemParametersInfo (SPI_SETMOUSE, 0, newmouseparms, 0);
@ -402,7 +402,7 @@ void IN_SetMouseMode(bool enable)
} }
else else
{ {
#if _WIN32 #if XASH_WIN32
if(isMouseRelative) if(isMouseRelative)
{ {
#if USE_SDL2 #if USE_SDL2
@ -423,7 +423,7 @@ void IN_SetMouseMode(bool enable)
void IN_SetVisibleMouse(bool visible) void IN_SetVisibleMouse(bool visible)
{ {
#if _WIN32 #if XASH_WIN32
bool lockEntered = MouseThread_ActiveLock_Enter(); bool lockEntered = MouseThread_ActiveLock_Enter();
#endif #endif
@ -431,7 +431,7 @@ void IN_SetVisibleMouse(bool visible)
IN_SetMouseMode(!visible); IN_SetMouseMode(!visible);
#if _WIN32 #if XASH_WIN32
UpdateMouseThreadActive(); UpdateMouseThreadActive();
if(lockEntered) MouseThread_ActiveLock_Exit(); if(lockEntered) MouseThread_ActiveLock_Exit();
#endif #endif
@ -448,7 +448,7 @@ void GoldSourceInput::IN_ActivateMouse (void)
{ {
if (mouseinitialized) if (mouseinitialized)
{ {
#if _WIN32 #if XASH_WIN32
bool lockEntered = MouseThread_ActiveLock_Enter(); bool lockEntered = MouseThread_ActiveLock_Enter();
#endif #endif
@ -456,7 +456,7 @@ void GoldSourceInput::IN_ActivateMouse (void)
mouseactive = 1; mouseactive = 1;
#if _WIN32 #if XASH_WIN32
UpdateMouseThreadActive(); UpdateMouseThreadActive();
if(lockEntered) MouseThread_ActiveLock_Exit(); if(lockEntered) MouseThread_ActiveLock_Exit();
#endif #endif
@ -476,7 +476,7 @@ void GoldSourceInput::IN_DeactivateMouse (void)
{ {
if (mouseinitialized) if (mouseinitialized)
{ {
#if _WIN32 #if XASH_WIN32
bool lockEntered = MouseThread_ActiveLock_Enter(); bool lockEntered = MouseThread_ActiveLock_Enter();
#endif #endif
@ -484,7 +484,7 @@ void GoldSourceInput::IN_DeactivateMouse (void)
mouseactive = 0; mouseactive = 0;
#if _WIN32 #if XASH_WIN32
UpdateMouseThreadActive(); UpdateMouseThreadActive();
if(lockEntered) MouseThread_ActiveLock_Exit(); if(lockEntered) MouseThread_ActiveLock_Exit();
#endif #endif
@ -502,7 +502,7 @@ void GoldSourceInput::IN_StartupMouse (void)
return; return;
mouseinitialized = 1; mouseinitialized = 1;
#if _WIN32 #if XASH_WIN32
mouseparmsvalid = SystemParametersInfo (SPI_GETMOUSE, 0, originalmouseparms, 0); mouseparmsvalid = SystemParametersInfo (SPI_GETMOUSE, 0, originalmouseparms, 0);
if (mouseparmsvalid) if (mouseparmsvalid)
@ -537,7 +537,7 @@ void GoldSourceInput::IN_Shutdown (void)
{ {
IN_DeactivateMouse (); IN_DeactivateMouse ();
#if _WIN32 #if XASH_WIN32
if ( s_hMouseQuitEvent ) if ( s_hMouseQuitEvent )
{ {
SetEvent( s_hMouseQuitEvent ); SetEvent( s_hMouseQuitEvent );
@ -597,7 +597,7 @@ FIXME: Call through to engine?
void IN_ResetMouse( void ) void IN_ResetMouse( void )
{ {
// no work to do in SDL // no work to do in SDL
#if _WIN32 #if XASH_WIN32
// reset only if mouse is active and not in visible mode: // reset only if mouse is active and not in visible mode:
if(mouseactive && !iVisibleMouse && gEngfuncs.GetWindowCenterX && gEngfuncs.GetWindowCenterY) if(mouseactive && !iVisibleMouse && gEngfuncs.GetWindowCenterX && gEngfuncs.GetWindowCenterY)
{ {
@ -712,7 +712,7 @@ void GoldSourceInput::IN_GetMouseDelta( int *pOutX, int *pOutY)
if(active) if(active)
{ {
int deltaX, deltaY; int deltaX, deltaY;
#if _WIN32 #if XASH_WIN32
if ( !m_bRawInput ) if ( !m_bRawInput )
{ {
if ( m_bMouseThread ) if ( m_bMouseThread )
@ -746,7 +746,7 @@ void GoldSourceInput::IN_GetMouseDelta( int *pOutX, int *pOutY)
#endif #endif
} }
#if _WIN32 #if XASH_WIN32
if ( !m_bRawInput ) if ( !m_bRawInput )
{ {
if ( m_bMouseThread ) if ( m_bMouseThread )
@ -771,7 +771,7 @@ void GoldSourceInput::IN_GetMouseDelta( int *pOutX, int *pOutY)
my_accum = 0; my_accum = 0;
// reset mouse position if required, so there is room to move: // reset mouse position if required, so there is room to move:
#if _WIN32 #if XASH_WIN32
// do not reset if mousethread would do it: // do not reset if mousethread would do it:
if ( m_bRawInput || !m_bMouseThread ) if ( m_bRawInput || !m_bMouseThread )
#else #else
@ -779,7 +779,7 @@ void GoldSourceInput::IN_GetMouseDelta( int *pOutX, int *pOutY)
#endif #endif
IN_ResetMouse(); IN_ResetMouse();
#if _WIN32 #if XASH_WIN32
// update m_bRawInput occasionally: // update m_bRawInput occasionally:
const float currentTime = gEngfuncs.GetClientTime(); const float currentTime = gEngfuncs.GetClientTime();
if ( currentTime - s_flRawInputUpdateTime > 1.0f || s_flRawInputUpdateTime == 0.0f ) if ( currentTime - s_flRawInputUpdateTime > 1.0f || s_flRawInputUpdateTime == 0.0f )
@ -929,7 +929,7 @@ void GoldSourceInput::IN_Accumulate (void)
{ {
if (mouseactive) if (mouseactive)
{ {
#if _WIN32 #if XASH_WIN32
if ( !m_bRawInput ) if ( !m_bRawInput )
{ {
if ( !m_bMouseThread ) if ( !m_bMouseThread )
@ -957,7 +957,7 @@ void GoldSourceInput::IN_Accumulate (void)
} }
// force the mouse to the center, so there's room to move // force the mouse to the center, so there's room to move
#if _WIN32 #if XASH_WIN32
// do not reset if mousethread would do it: // do not reset if mousethread would do it:
if ( m_bRawInput || !m_bMouseThread ) if ( m_bRawInput || !m_bMouseThread )
#else #else
@ -1030,7 +1030,7 @@ void IN_StartupJoystick (void)
{ {
gEngfuncs.Con_DPrintf ("joystick not found -- driver not present\n\n"); gEngfuncs.Con_DPrintf ("joystick not found -- driver not present\n\n");
} }
#elif _WIN32 #elif XASH_WIN32
int numdevs; int numdevs;
JOYCAPS jc; JOYCAPS jc;
MMRESULT mmr; MMRESULT mmr;
@ -1102,7 +1102,7 @@ int RawValuePointer (int axis)
} }
} }
#elif _WIN32 #elif XASH_WIN32
PDWORD RawValuePointer (int axis) PDWORD RawValuePointer (int axis)
{ {
switch (axis) switch (axis)
@ -1185,7 +1185,7 @@ void Joy_AdvancedUpdate_f (void)
dwControlMap[JOY_AXIS_V] = dwTemp & JOY_RELATIVE_AXIS; dwControlMap[JOY_AXIS_V] = dwTemp & JOY_RELATIVE_AXIS;
} }
#if !USE_SDL2 && _WIN32 #if !USE_SDL2 && XASH_WIN32
// compute the axes to collect from DirectInput // compute the axes to collect from DirectInput
joy_flags = JOY_RETURNCENTERED | JOY_RETURNBUTTONS | JOY_RETURNPOV; joy_flags = JOY_RETURNCENTERED | JOY_RETURNBUTTONS | JOY_RETURNPOV;
for (i = 0; i < JOY_MAX_AXES; i++) for (i = 0; i < JOY_MAX_AXES; i++)
@ -1231,7 +1231,7 @@ void GoldSourceInput::IN_Commands (void)
{ {
pdwRawValue[i] = RawValuePointer(i); pdwRawValue[i] = RawValuePointer(i);
} }
#elif _WIN32 #elif XASH_WIN32
buttonstate = ji.dwButtons; buttonstate = ji.dwButtons;
#endif #endif
@ -1257,7 +1257,7 @@ void GoldSourceInput::IN_Commands (void)
// this avoids any potential problems related to moving from one // this avoids any potential problems related to moving from one
// direction to another without going through the center position // direction to another without going through the center position
povstate = 0; povstate = 0;
#if !USE_SDL2 && _WIN32 #if !USE_SDL2 && XASH_WIN32
if(ji.dwPOV != JOY_POVCENTERED) if(ji.dwPOV != JOY_POVCENTERED)
{ {
if (ji.dwPOV == JOY_POVFORWARD) if (ji.dwPOV == JOY_POVFORWARD)
@ -1298,7 +1298,7 @@ int IN_ReadJoystick (void)
#if USE_SDL2 #if USE_SDL2
safe_pfnSDL_JoystickUpdate(); safe_pfnSDL_JoystickUpdate();
return 1; return 1;
#elif _WIN32 #elif XASH_WIN32
memset (&ji, 0, sizeof(ji)); memset (&ji, 0, sizeof(ji));
ji.dwSize = sizeof(ji); ji.dwSize = sizeof(ji);
ji.dwFlags = joy_flags; ji.dwFlags = joy_flags;
@ -1377,7 +1377,7 @@ void IN_JoyMove ( float frametime, usercmd_t *cmd )
// get the floating point zero-centered, potentially-inverted data for the current axis // get the floating point zero-centered, potentially-inverted data for the current axis
#if USE_SDL2 #if USE_SDL2
fAxisValue = (float)pdwRawValue[i]; fAxisValue = (float)pdwRawValue[i];
#elif _WIN32 #elif XASH_WIN32
fAxisValue = (float) *pdwRawValue[i]; fAxisValue = (float) *pdwRawValue[i];
fAxisValue -= 32768.0; fAxisValue -= 32768.0;
#endif #endif
@ -1571,7 +1571,7 @@ void GoldSourceInput::IN_Init (void)
m_customaccel_max = gEngfuncs.pfnRegisterVariable ( "m_customaccel_max", "0", FCVAR_ARCHIVE ); m_customaccel_max = gEngfuncs.pfnRegisterVariable ( "m_customaccel_max", "0", FCVAR_ARCHIVE );
m_customaccel_exponent = gEngfuncs.pfnRegisterVariable ( "m_customaccel_exponent", "1", FCVAR_ARCHIVE ); m_customaccel_exponent = gEngfuncs.pfnRegisterVariable ( "m_customaccel_exponent", "1", FCVAR_ARCHIVE );
#if _WIN32 #if XASH_WIN32
m_rawinput = gEngfuncs.pfnGetCvarPointer("m_rawinput"); m_rawinput = gEngfuncs.pfnGetCvarPointer("m_rawinput");
m_bRawInput = m_rawinput && m_rawinput->value != 0; m_bRawInput = m_rawinput && m_rawinput->value != 0;
m_bMouseThread = gEngfuncs.CheckParm ("-mousethread", NULL ) != NULL; m_bMouseThread = gEngfuncs.CheckParm ("-mousethread", NULL ) != NULL;
@ -1603,7 +1603,7 @@ void GoldSourceInput::IN_Init (void)
#endif #endif
#if USE_SDL2 #if USE_SDL2
#if __APPLE__ #if XASH_APPLE
#define SDL2_FULL_LIBNAME "libsdl2-2.0.0.dylib" #define SDL2_FULL_LIBNAME "libsdl2-2.0.0.dylib"
#else #else
#define SDL2_FULL_LIBNAME "libSDL2-2.0.so.0" #define SDL2_FULL_LIBNAME "libSDL2-2.0.so.0"

View File

@ -1,7 +1,4 @@
#pragma once #pragma once
#include "build.h"
#if !defined(INPUT_MOUSE_H) #if !defined(INPUT_MOUSE_H)
#define INPUT_MOUSE_H #define INPUT_MOUSE_H
#include "cl_dll.h" #include "cl_dll.h"
@ -51,7 +48,7 @@ protected:
#if GOLDSOURCE_SUPPORT && ( XASH_WIN32 || ( XASH_LINUX && !XASH_ANDROID ) || XASH_APPLE ) && XASH_X86 #if GOLDSOURCE_SUPPORT && ( XASH_WIN32 || ( XASH_LINUX && !XASH_ANDROID ) || XASH_APPLE ) && XASH_X86
#define SUPPORT_GOLDSOURCE_INPUT 1 #define SUPPORT_GOLDSOURCE_INPUT 1
#if _WIN32 #if XASH_WIN32
#define HSPRITE WINDOWS_HSPRITE #define HSPRITE WINDOWS_HSPRITE
#include <windows.h> #include <windows.h>
#undef HSPRITE #undef HSPRITE

View File

@ -100,10 +100,11 @@ int CHudSayText::Draw( float flTime )
int y = Y_START; int y = Y_START;
#if USE_VGUI #if USE_VGUI
if( ( gViewPort && gViewPort->AllowedToPrintText() == FALSE ) || !m_HUD_saytext->value ) if( ( gViewPort && gViewPort->AllowedToPrintText() == FALSE ) )
return 1; return 1;
#endif #endif
if ( !m_HUD_saytext->value )
return 1;
// make sure the scrolltime is within reasonable bounds, to guard against the clock being reset // make sure the scrolltime is within reasonable bounds, to guard against the clock being reset
flScrollTime = Q_min( flScrollTime, flTime + m_HUD_saytext_time->value ); flScrollTime = Q_min( flScrollTime, flTime + m_HUD_saytext_time->value );
@ -173,8 +174,6 @@ void CHudSayText::SayTextPrint( const char *pszBuf, int iBufSize, int clientInde
ConsolePrint( pszBuf ); ConsolePrint( pszBuf );
return; return;
} }
#else
ConsolePrint( pszBuf );
#endif #endif
int i; int i;

View File

@ -33,11 +33,11 @@
#if !defined(M_PI_F) #if !defined(M_PI_F)
#define M_PI_F (float)M_PI #define M_PI_F (float)M_PI
#endif #endif
extern vec3_t vec3_origin; // extern vec3_t vec3_origin;
// if C++ mangling differs from C symbol name // if C++ mangling differs from C symbol name
#if _MSC_VER || __WATCOMC__ #if _MSC_VER || __WATCOMC__
vec3_t vec3_origin; float vec3_origin[3];
#endif #endif
float Length( const float *v ) float Length( const float *v )

View File

@ -673,7 +673,7 @@ int TeamFortressViewport::CreateCommandMenu( const char *menuFile, int direction
return newIndex; return newIndex;
} }
#ifdef _WIN32 #if XASH_WIN32
try try
{ {
#endif #endif
@ -841,7 +841,7 @@ int TeamFortressViewport::CreateCommandMenu( const char *menuFile, int direction
{ {
gEngfuncs.Con_Printf( "Too many menus in %s past '%s'\n", menuFile, szLastButtonText ); gEngfuncs.Con_Printf( "Too many menus in %s past '%s'\n", menuFile, szLastButtonText );
} }
else else if( pButton )
{ {
// Create the menu // Create the menu
m_pCommandMenus[m_iNumMenus] = CreateSubMenu( pButton, m_pCurrentCommandMenu, iButtonY ); m_pCommandMenus[m_iNumMenus] = CreateSubMenu( pButton, m_pCurrentCommandMenu, iButtonY );
@ -873,7 +873,7 @@ int TeamFortressViewport::CreateCommandMenu( const char *menuFile, int direction
pfile = gEngfuncs.COM_ParseFile( pfile, token ); pfile = gEngfuncs.COM_ParseFile( pfile, token );
} }
#ifdef _WIN32 #if XASH_WIN32
} }
catch( CException *e ) catch( CException *e )
{ {

View File

@ -6,27 +6,70 @@ from waflib import Utils
import os import os
def options(opt): def options(opt):
# stub grp = opt.add_option_group('Client options')
return
grp.add_option('--enable-vgui', action = 'store_true', dest = 'USE_VGUI', default = False,
help = 'Enable VGUI1')
grp.add_option('--enable-vgui2', action = 'store_true', dest = 'USE_VGUI2', default = False,
help = 'Enable VGUI2. UNDONE')
grp.add_option('--enable-novgui-motd', action = 'store_true', dest = 'USE_NOVGUI_MOTD', default = False,
help = 'Prefer non-VGUI MOTD when USE_VGUI is enabled')
grp.add_option('--enable-novgui-scoreboard', action = 'store_true', dest = 'USE_NOVGUI_SCOREBOARD', default = False,
help = 'Prefer non-VGUI Scoreboard when USE_VGUI is enabled')
grp.add_option('--disable-goldsrc-support', action = 'store_false', dest = 'GOLDSOURCE_SUPPORT',
default=True, help = 'disable GoldSource compatibility')
opt.load('vgui')
def configure(conf): def configure(conf):
if conf.env.DEST_OS == 'win32': conf.env.USE_VGUI = conf.options.USE_VGUI
conf.check_cxx(lib='user32') conf.env.USE_NOVGUI_MOTD = conf.options.USE_NOVGUI_MOTD
conf.env.USE_NOVGUI_SCOREBOARD = conf.options.USE_NOVGUI_SCOREBOARD
if conf.env.GOLDSRC: conf.env.USE_VOICEMGR = conf.options.USE_VOICEMGR
if conf.env.DEST_OS == 'win32': conf.env.GOLDSOURCE_SUPPORT = conf.options.GOLDSOURCE_SUPPORT
conf.check_cxx(lib='winmm') if conf.env.USE_VGUI:
else: conf.load('vgui')
conf.check_cc(lib='dl') if not conf.check_vgui():
conf.fatal('VGUI was enabled but VGUI cannot be used')
def build(bld): def build(bld):
source = bld.path.parent.ant_glob([ libs = []
'pm_shared/*.c' defines = ['CLIENT_DLL']
]) includes = ['.',
source += bld.path.ant_glob([ '../dlls',
'hl/*.cpp' '../common',
]) '../engine',
'../pm_shared',
'../game_shared',
'../public']
excluded_files = ['GameStudioModelRenderer_Sample.cpp',
'game_shared/voice_vgui_tweakdlg.cpp',
'game_shared/voice_gamemgr.cpp',
'game_shared/voice_status.cpp']
if bld.env.USE_VGUI:
defines += ['USE_VGUI']
libs += ['VGUI']
if bld.env.USE_NOVGUI_MOTD:
defines += ['USE_NOVGUI_MOTD']
else:
excluded_files += ['MOTD.cpp']
if bld.env.USE_NOVGUI_SCOREBOARD:
defines += ['USE_NOVGUI_SCOREBOARD']
else:
excluded_files += ['scoreboard.cpp']
else:
includes += ['../utils/fake_vgui/include']
excluded_files += ['voice_status.cpp',
'vgui_*.cpp',
'game_shared/vgui_*.cpp',
'game_shared/voice_banmgr.cpp']
source = bld.path.ant_glob('**/*.cpp', excl=excluded_files)
source += bld.path.parent.ant_glob('game_shared/*.cpp', excl=excluded_files)
source += bld.path.parent.ant_glob([ source += bld.path.parent.ant_glob([
'pm_shared/*.c',
'dlls/crossbow.cpp', 'dlls/crossbow.cpp',
'dlls/crowbar.cpp', 'dlls/crowbar.cpp',
'dlls/egon.cpp', 'dlls/egon.cpp',
@ -42,78 +85,21 @@ def build(bld):
'dlls/squeakgrenade.cpp', 'dlls/squeakgrenade.cpp',
'dlls/tripmine.cpp' 'dlls/tripmine.cpp'
]) ])
source += [
'GameStudioModelRenderer.cpp',
'MOTD.cpp',
'StudioModelRenderer.cpp',
'ammo.cpp',
'ammo_secondary.cpp',
'ammohistory.cpp',
'battery.cpp',
'cdll_int.cpp',
'com_weapons.cpp',
'death.cpp',
'demo.cpp',
'entity.cpp',
'ev_hldm.cpp',
'ev_common.cpp',
'events.cpp',
'flashlight.cpp',
'geiger.cpp',
'health.cpp',
'hud.cpp',
'hud_msg.cpp',
'hud_redraw.cpp',
'hud_spectator.cpp',
'hud_update.cpp',
'in_camera.cpp',
'input.cpp',
'input_goldsource.cpp',
'input_mouse.cpp',
'input_xash3d.cpp',
'menu.cpp',
'message.cpp',
'parsemsg.cpp',
'saytext.cpp',
'scoreboard.cpp',
'status_icons.cpp',
'statusbar.cpp',
'studio_util.cpp',
'text_message.cpp',
'train.cpp',
'tri.cpp',
'util.cpp',
'view.cpp'
]
includes = [
'.',
'hl/',
'../dlls',
'../common',
'../engine',
'../pm_shared',
'../game_shared',
'../public',
'../utils/fake_vgui/include'
]
defines = ['CLIENT_DLL'] if bld.env.DEST_OS == 'win32':
if bld.env.GOLDSRC: libs += ['USER32']
if bld.env.GOLDSOURCE_SUPPORT:
defines += ['GOLDSOURCE_SUPPORT'] defines += ['GOLDSOURCE_SUPPORT']
libs = []
if bld.env.DEST_OS == 'win32':
libs += ["USER32"]
if bld.env.GOLDSRC:
if bld.env.DEST_OS == 'win32': if bld.env.DEST_OS == 'win32':
libs += ["WINMM"] libs += ["WINMM"]
else: else:
libs += ['DL'] libs += ['DL']
if bld.env.DEST_OS not in ['android', 'dos']: if bld.env.DEST_OS not in ['android', 'dos']:
install_path = os.path.join(bld.env.GAMEDIR, bld.env.CLIENT_DIR) install_path = os.path.join(bld.env.GAMEDIR, bld.env.CLIENT_INSTALL_DIR)
else: else:
install_path = bld.env.PREFIX install_path = bld.env.PREFIX
@ -127,6 +113,6 @@ def build(bld):
use = libs, use = libs,
install_path = install_path, install_path = install_path,
subsystem = bld.env.MSVC_SUBSYSTEM, subsystem = bld.env.MSVC_SUBSYSTEM,
idx = bld.get_taskgen_count() idx = bld.get_taskgen_count()
) )

View File

@ -1,54 +1,91 @@
include(CheckSymbolExists) include(CheckSymbolExists)
# generated(see comments in public/build.h) macro(check_build_target symbol)
# cat build.h | grep '^#undef XASH' | awk '{ print "check_symbol_exists(" $2 " \"build.h\" " $2 ")" }' check_symbol_exists(${symbol} "build.h" ${symbol})
endmacro()
macro(check_group_build_target symbol group)
if(NOT ${group})
check_build_target(${symbol})
if(${symbol})
set(${group} TRUE)
endif()
else()
set(${symbol} FALSE)
endif()
endmacro()
# So there is a problem:
# 1. Number of these symbols only grows, as we support more and more ports
# 2. CMake was written by morons and can't check these symbols in parallel
# 3. MSVC is very slow at everything (startup, parsing, generating error)
# Solution: group these symbols and set variable if one of them was found
# this way we can reorder to reorder them by most common configurations
# but we can't generate this list anymore! ... OR IS IT ???
# Well, after reordering positions in engine's buildenums.h, we can partially autogenerate this list!
# echo "check_build_target(XASH_64BIT)"
# grep "#define PLATFORM" buildenums.h | cut -d' ' -f 2 | cut -d_ -f 2- | awk '{ print "check_group_build_target(XASH_" $1 " XASH_PLATFORM)" }'
# grep "#define ARCHITECTURE" buildenums.h | cut -d' ' -f 2 | cut -d_ -f 2- | awk '{ print "check_group_build_target(XASH_" $1 " XASH_ARCHITECTURE)"
# grep "#define ENDIAN" buildenums.h | cut -d' ' -f 2 | cut -d_ -f 2- | awk '{ print "check_group_build_target(XASH_" $1 "_ENDIAN XASH_ENDIANNESS)"}'
# echo "if(XASH_ARM)"
# grep '^#undef XASH' build.h | grep "XASH_ARM[v_]" | awk '{ print "check_build_target(" $2 ")"}'
# echo "endif()"
# echo "if(XASH_RISCV)"
# grep '^#undef XASH' build.h | grep "XASH_RISCV_" | awk '{ print "check_build_target(" $2 ")"}'
# echo "endif()"
# NOTE: Android must have priority over Linux to work correctly!
set(CMAKE_REQUIRED_INCLUDES "${PROJECT_SOURCE_DIR}/public/") set(CMAKE_REQUIRED_INCLUDES "${PROJECT_SOURCE_DIR}/public/")
check_symbol_exists(XASH_64BIT "build.h" XASH_64BIT) check_build_target(XASH_64BIT)
check_symbol_exists(XASH_AMD64 "build.h" XASH_AMD64) check_group_build_target(XASH_WIN32 XASH_PLATFORM)
check_symbol_exists(XASH_ANDROID "build.h" XASH_ANDROID) check_group_build_target(XASH_ANDROID XASH_PLATFORM)
check_symbol_exists(XASH_APPLE "build.h" XASH_APPLE) check_group_build_target(XASH_LINUX XASH_PLATFORM)
check_symbol_exists(XASH_ARM "build.h" XASH_ARM) check_group_build_target(XASH_FREEBSD XASH_PLATFORM)
check_symbol_exists(XASH_ARM_HARDFP "build.h" XASH_ARM_HARDFP) check_group_build_target(XASH_APPLE XASH_PLATFORM)
check_symbol_exists(XASH_ARM_SOFTFP "build.h" XASH_ARM_SOFTFP) check_group_build_target(XASH_NETBSD XASH_PLATFORM)
check_symbol_exists(XASH_ARMv4 "build.h" XASH_ARMv4) check_group_build_target(XASH_OPENBSD XASH_PLATFORM)
check_symbol_exists(XASH_ARMv5 "build.h" XASH_ARMv5) check_group_build_target(XASH_EMSCRIPTEN XASH_PLATFORM)
check_symbol_exists(XASH_ARMv6 "build.h" XASH_ARMv6) check_group_build_target(XASH_DOS4GW XASH_PLATFORM)
check_symbol_exists(XASH_ARMv7 "build.h" XASH_ARMv7) check_group_build_target(XASH_HAIKU XASH_PLATFORM)
check_symbol_exists(XASH_ARMv8 "build.h" XASH_ARMv8) check_group_build_target(XASH_SERENITY XASH_PLATFORM)
check_symbol_exists(XASH_BIG_ENDIAN "build.h" XASH_BIG_ENDIAN) check_group_build_target(XASH_IRIX XASH_PLATFORM)
check_symbol_exists(XASH_BSD "build.h" XASH_BSD) check_group_build_target(XASH_NSWITCH XASH_PLATFORM)
check_symbol_exists(XASH_DOS4GW "build.h" XASH_DOS4GW) check_group_build_target(XASH_PSVITA XASH_PLATFORM)
check_symbol_exists(XASH_E2K "build.h" XASH_E2K) check_group_build_target(XASH_LINUX_UNKNOWN XASH_PLATFORM)
check_symbol_exists(XASH_EMSCRIPTEN "build.h" XASH_EMSCRIPTEN) check_group_build_target(XASH_X86 XASH_ARCHITECTURE)
check_symbol_exists(XASH_FREEBSD "build.h" XASH_FREEBSD) check_group_build_target(XASH_AMD64 XASH_ARCHITECTURE)
check_symbol_exists(XASH_HAIKU "build.h" XASH_HAIKU) check_group_build_target(XASH_ARM XASH_ARCHITECTURE)
check_symbol_exists(XASH_IOS "build.h" XASH_IOS) check_group_build_target(XASH_MIPS XASH_ARCHITECTURE)
check_symbol_exists(XASH_JS "build.h" XASH_JS) check_group_build_target(XASH_PPC XASH_ARCHITECTURE)
check_symbol_exists(XASH_LINUX "build.h" XASH_LINUX) check_group_build_target(XASH_JS XASH_ARCHITECTURE)
check_symbol_exists(XASH_LITTLE_ENDIAN "build.h" XASH_LITTLE_ENDIAN) check_group_build_target(XASH_E2K XASH_ARCHITECTURE)
check_symbol_exists(XASH_MINGW "build.h" XASH_MINGW) check_group_build_target(XASH_RISCV XASH_ARCHITECTURE)
check_symbol_exists(XASH_MIPS "build.h" XASH_MIPS) check_group_build_target(XASH_LITTLE_ENDIAN XASH_ENDIANNESS)
check_symbol_exists(XASH_PPC "build.h" XASH_PPC) check_group_build_target(XASH_BIG_ENDIAN XASH_ENDIANNESS)
check_symbol_exists(XASH_MOBILE_PLATFORM "build.h" XASH_MOBILE_PLATFORM) if(XASH_ARM)
check_symbol_exists(XASH_MSVC "build.h" XASH_MSVC) check_build_target(XASH_ARM_HARDFP)
check_symbol_exists(XASH_NETBSD "build.h" XASH_NETBSD) check_build_target(XASH_ARM_SOFTFP)
check_symbol_exists(XASH_OPENBSD "build.h" XASH_OPENBSD) check_build_target(XASH_ARMv4)
check_symbol_exists(XASH_POSIX "build.h" XASH_POSIX) check_build_target(XASH_ARMv5)
check_symbol_exists(XASH_RISCV "build.h" XASH_RISCV) check_build_target(XASH_ARMv6)
check_symbol_exists(XASH_RISCV_DOUBLEFP "build.h" XASH_RISCV_DOUBLEFP) check_build_target(XASH_ARMv7)
check_symbol_exists(XASH_RISCV_SINGLEFP "build.h" XASH_RISCV_SINGLEFP) check_build_target(XASH_ARMv8)
check_symbol_exists(XASH_RISCV_SOFTFP "build.h" XASH_RISCV_SOFTFP) endif()
check_symbol_exists(XASH_SERENITY "build.h" XASH_SERENITY) if(XASH_RISCV)
check_symbol_exists(XASH_WIN32 "build.h" XASH_WIN32) check_build_target(XASH_RISCV_DOUBLEFP)
check_symbol_exists(XASH_WIN64 "build.h" XASH_WIN64) check_build_target(XASH_RISCV_SINGLEFP)
check_symbol_exists(XASH_X86 "build.h" XASH_X86) check_build_target(XASH_RISCV_SOFTFP)
check_symbol_exists(XASH_NSWITCH "build.h" XASH_NSWITCH) endif()
check_symbol_exists(XASH_PSVITA "build.h" XASH_PSVITA)
unset(CMAKE_REQUIRED_INCLUDES) unset(CMAKE_REQUIRED_INCLUDES)
# engine/common/build.c # engine/common/build.c
if(XASH_ANDROID) if(XASH_ANDROID)
set(BUILDOS "android") set(BUILDOS "android")
elseif(XASH_LINUX_UNKNOWN)
set(BUILDOS "linuxunkabi")
elseif(XASH_WIN32 OR XASH_LINUX OR XASH_APPLE) elseif(XASH_WIN32 OR XASH_LINUX OR XASH_APPLE)
set(BUILDOS "") # no prefix for default OS set(BUILDOS "") # no prefix for default OS
elseif(XASH_FREEBSD) elseif(XASH_FREEBSD)
@ -69,6 +106,8 @@ elseif(XASH_NSWITCH)
set(BUILDOS "nswitch") set(BUILDOS "nswitch")
elseif(XASH_PSVITA) elseif(XASH_PSVITA)
set(BUILDOS "psvita") set(BUILDOS "psvita")
elseif(XASH_IRIX)
set(BUILDOS "irix")
else() else()
message(SEND_ERROR "Place your operating system name here! If this is a mistake, try to fix conditions above and report a bug") message(SEND_ERROR "Place your operating system name here! If this is a mistake, try to fix conditions above and report a bug")
endif() endif()
@ -113,15 +152,6 @@ elseif(XASH_MIPS)
if(XASH_LITTLE_ENDIAN) if(XASH_LITTLE_ENDIAN)
set(BUILDARCH "${BUILDARCH}el") set(BUILDARCH "${BUILDARCH}el")
endif() endif()
elseif(XASH_PPC)
set(BUILDARCH "powerpc")
if(XASH_64BIT)
set(BUILDARCH "${BUILDARCH}64")
endif()
if(XASH_LITTLE_ENDIAN)
set(BUILDARCH "${BUILDARCH}le")
endif()
elseif(XASH_RISCV) elseif(XASH_RISCV)
set(BUILDARCH "riscv") set(BUILDARCH "riscv")
if(XASH_64BIT) if(XASH_64BIT)
@ -139,6 +169,15 @@ elseif(XASH_JS)
set(BUILDARCH "javascript") set(BUILDARCH "javascript")
elseif(XASH_E2K) elseif(XASH_E2K)
set(BUILDARCH "e2k") set(BUILDARCH "e2k")
elseif(XASH_PPC)
set(BUILDARCH "ppc")
if(XASH_64BIT)
set(BUILDARCH "${BUILDARCH}64")
endif()
if(XASH_LITTLE_ENDIAN)
set(BUILDARCH "${BUILDARCH}el")
endif()
else() else()
message(SEND_ERROR "Place your architecture name here! If this is a mistake, try to fix conditions above and report a bug") message(SEND_ERROR "Place your architecture name here! If this is a mistake, try to fix conditions above and report a bug")
endif() endif()

View File

@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -20,17 +20,30 @@
# SOFTWARE. # SOFTWARE.
# #
cmake_minimum_required(VERSION 2.8.12) cmake_minimum_required(VERSION 3.9)
project (SVDLL) project (SVDLL)
set (SVDLL_LIBRARY server) set (SVDLL_LIBRARY server)
if(NOT MSVC) if(NOT MSVC)
add_compile_options(-fno-exceptions) # GCC/Clang flag add_compile_options(-fno-exceptions) # GCC/Clang flag
add_compile_options(-fno-rtti) # GCC/Clang flag
add_compile_options(-Wno-invalid-offsetof) # GCC/Clang flag add_compile_options(-Wno-invalid-offsetof) # GCC/Clang flag
add_compile_options(-fvisibility=hidden) # GCC/Clang flag add_compile_options(-fvisibility=hidden) # GCC/Clang flag
add_definitions(-D_LINUX) # It seems enough for all non-Win32 systems add_definitions(-D_LINUX) # It seems enough for all non-Win32 systems
add_definitions(-Dstricmp=strcasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf ) add_definitions(-Dstricmp=strcasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf )
if(CMAKE_BUILD_TYPE MATCHES "Release"
OR (CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo"
AND CMAKE_SYSTEM_NAME STREQUAL "Android"))
add_compile_options(-fno-unwind-tables -fno-asynchronous-unwind-tables) # GCC/Clang flag
add_compile_options(-fomit-frame-pointer) # GCC/Clang flag
add_compile_options(-ftree-vectorize) # GCC/Clang flag
add_compile_options(-funsafe-math-optimizations) # GCC/Clang flag
if(CMAKE_SYSTEM_NAME STREQUAL "Android")
add_compile_options(-O3 -DNDEBUG) # gradle compiles release builds with RelWithDebInfo(-O2 -g) and strips debug symbols.
target_link_options(${SVDLL_LIBRARY} PUBLIC "LINKER:-O3")
endif()
endif()
else() else()
add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE) add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE)
endif() endif()
@ -173,8 +186,16 @@ if(MSVC)
set_property(TARGET ${SVDLL_LIBRARY} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") set_property(TARGET ${SVDLL_LIBRARY} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
endif() endif()
if(HAVE_LTO)
set_property(TARGET ${SVDLL_LIBRARY} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
endif()
install( TARGETS ${SVDLL_LIBRARY} install( TARGETS ${SVDLL_LIBRARY}
DESTINATION "${GAMEDIR}/${SERVER_INSTALL_DIR}/" DESTINATION "${GAMEDIR}/${SERVER_INSTALL_DIR}/"
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
GROUP_READ GROUP_EXECUTE GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE) WORLD_READ WORLD_EXECUTE)
add_custom_command(TARGET ${SVDLL_LIBRARY}
POST_BUILD DEPENDS ${SVDLL_LIBRARY}
COMMAND $<$<CONFIG:release>:${CMAKE_STRIP}> -s $<TARGET_FILE:${SVDLL_LIBRARY}>)

View File

@ -931,7 +931,7 @@ void CBigMomma::StartTask( Task_t *pTask )
TaskComplete(); TaskComplete();
break; break;
case TASK_WAIT_NODE: case TASK_WAIT_NODE:
m_flWaitFinished = gpGlobals->time + GetNodeDelay(); m_flWait = gpGlobals->time + GetNodeDelay();
if( m_hTargetEnt->pev->spawnflags & SF_INFOBM_WAIT ) if( m_hTargetEnt->pev->spawnflags & SF_INFOBM_WAIT )
ALERT( at_aiconsole, "BM: Wait at node %s forever\n", STRING( pev->netname ) ); ALERT( at_aiconsole, "BM: Wait at node %s forever\n", STRING( pev->netname ) );
else else

View File

@ -98,7 +98,7 @@ static DLL_FUNCTIONS gFunctionTable =
static void SetObjectCollisionBox( entvars_t *pev ); static void SetObjectCollisionBox( entvars_t *pev );
#if !_WIN32 #if !XASH_WIN32
extern "C" { extern "C" {
#endif #endif
int GetEntityAPI( DLL_FUNCTIONS *pFunctionTable, int interfaceVersion ) int GetEntityAPI( DLL_FUNCTIONS *pFunctionTable, int interfaceVersion )
@ -125,7 +125,7 @@ int GetEntityAPI2( DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion )
return TRUE; return TRUE;
} }
#if !_WIN32 #if !XASH_WIN32
} }
#endif #endif

View File

@ -48,16 +48,12 @@ extern DLL_GLOBAL ULONG g_ulFrameCount;
extern void CopyToBodyQue( entvars_t* pev ); extern void CopyToBodyQue( entvars_t* pev );
extern int giPrecacheGrunt; extern int giPrecacheGrunt;
extern int gmsgSayText; extern int gmsgSayText;
extern int gmsgBhopcap;
extern cvar_t allow_spectators; extern cvar_t allow_spectators;
extern cvar_t multibyte_only; extern cvar_t multibyte_only;
extern int g_teamplay; extern int g_teamplay;
extern cvar_t bhopcap;
extern "C" int g_bhopcap;
void LinkUserMessages( void ); void LinkUserMessages( void );
/* /*
@ -130,6 +126,7 @@ void ClientDisconnect( edict_t *pEntity )
pEntity->v.takedamage = DAMAGE_NO;// don't attract autoaim pEntity->v.takedamage = DAMAGE_NO;// don't attract autoaim
pEntity->v.solid = SOLID_NOT;// nonsolid pEntity->v.solid = SOLID_NOT;// nonsolid
pEntity->v.effects = 0;// clear any effects pEntity->v.effects = 0;// clear any effects
pEntity->v.flags = 0;// clear any flags
UTIL_SetOrigin( &pEntity->v, pEntity->v.origin ); UTIL_SetOrigin( &pEntity->v, pEntity->v.origin );
g_pGameRules->ClientDisconnected( pEntity ); g_pGameRules->ClientDisconnected( pEntity );
@ -822,15 +819,6 @@ void StartFrame( void )
gpGlobals->teamplay = teamplay.value; gpGlobals->teamplay = teamplay.value;
g_ulFrameCount++; g_ulFrameCount++;
int oldBhopcap = g_bhopcap;
g_bhopcap = ( g_pGameRules && g_pGameRules->IsMultiplayer() && bhopcap.value != 0.0f ) ? 1 : 0;
if( g_bhopcap != oldBhopcap )
{
MESSAGE_BEGIN( MSG_ALL, gmsgBhopcap, NULL );
WRITE_BYTE( g_bhopcap );
MESSAGE_END();
}
} }
void ClientPrecache( void ) void ClientPrecache( void )

View File

@ -324,7 +324,7 @@ void CCrossbow::Holster( int skiplocal /* = 0 */ )
{ {
m_fInReload = FALSE;// cancel any reload in progress. m_fInReload = FALSE;// cancel any reload in progress.
if( m_fInZoom ) if( m_pPlayer->pev->fov != 0 )
{ {
SecondaryAttack(); SecondaryAttack();
} }

View File

@ -1,7 +1,7 @@
#pragma once #pragma once
#if !defined(EXPORTDEF_H) #if !defined(EXPORTDEF_H)
#define EXPORTDEF_H #define EXPORTDEF_H
#if _WIN32 || __CYGWIN__ #if XASH_WIN32 || __CYGWIN__
#if __GNUC__ #if __GNUC__
#define EXPORT __attribute__ ((dllexport)) #define EXPORT __attribute__ ((dllexport))
#else #else

View File

@ -15,7 +15,7 @@
#pragma once #pragma once
#if !defined(EXTDLL_H) #if !defined(EXTDLL_H)
#define EXTDLL_H #define EXTDLL_H
#include "build.h"
// //
// Global header file for extension DLLs // Global header file for extension DLLs
// //
@ -35,7 +35,7 @@
#endif #endif
// Prevent tons of unused windows definitions // Prevent tons of unused windows definitions
#if _WIN32 #if XASH_WIN32
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#define NOWINRES #define NOWINRES
#define NOSERVICE #define NOSERVICE
@ -76,10 +76,6 @@ typedef int BOOL;
#define M_PI_F (float)M_PI #define M_PI_F (float)M_PI
#endif #endif
#if __LP64__ || __LLP64__ || _WIN64 || (__x86_64__ && !__ILP32__) || _M_X64 || __ia64 || _M_IA64 || __aarch64__ || __powerpc64__
#define XASH_64BIT 1
#endif
// Header file containing definition of globalvars_t and entvars_t // Header file containing definition of globalvars_t and entvars_t
typedef unsigned int func_t; typedef unsigned int func_t;
typedef int string_t; // from engine's pr_comp.h; typedef int string_t; // from engine's pr_comp.h;

View File

@ -462,7 +462,7 @@ cvar_t sk_player_leg3 = { "sk_player_leg3","1" };
void GameDLLInit( void ) void GameDLLInit( void )
{ {
// Register cvars here: // Register cvars here:
if( CVAR_GET_POINTER( "build" ) ) if( !CVAR_GET_POINTER( "sv_language" ) )
g_fIsXash3D = TRUE; g_fIsXash3D = TRUE;
g_psv_gravity = CVAR_GET_POINTER( "sv_gravity" ); g_psv_gravity = CVAR_GET_POINTER( "sv_gravity" );

View File

@ -42,6 +42,7 @@ extern cvar_t teamlist;
extern cvar_t teamoverride; extern cvar_t teamoverride;
extern cvar_t defaultteam; extern cvar_t defaultteam;
extern cvar_t allowmonsters; extern cvar_t allowmonsters;
extern cvar_t bhopcap;
// Engine Cvars // Engine Cvars
extern cvar_t *g_psv_gravity; extern cvar_t *g_psv_gravity;

View File

@ -29,7 +29,7 @@
enginefuncs_t g_engfuncs; enginefuncs_t g_engfuncs;
globalvars_t *gpGlobals; globalvars_t *gpGlobals;
#if _WIN32 #if XASH_WIN32
// Required DLL entry point // Required DLL entry point
BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )

View File

@ -278,7 +278,7 @@ void CHGrunt::GibMonster( void )
Vector vecGunPos; Vector vecGunPos;
Vector vecGunAngles; Vector vecGunAngles;
if( GetBodygroup( 2 ) != 2 ) if( GetBodygroup( GUN_GROUP ) != GUN_NONE )
{ {
// throw a gun if the grunt has one // throw a gun if the grunt has one
GetAttachment( 0, vecGunPos, vecGunAngles ); GetAttachment( 0, vecGunPos, vecGunAngles );
@ -604,7 +604,7 @@ void CHGrunt::TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir
if( ptr->iHitgroup == 11 ) if( ptr->iHitgroup == 11 )
{ {
// make sure we're wearing one // make sure we're wearing one
if( GetBodygroup( 1 ) == HEAD_GRUNT && ( bitsDamageType & (DMG_BULLET | DMG_SLASH | DMG_BLAST | DMG_CLUB ) ) ) if( GetBodygroup( HEAD_GROUP ) == HEAD_GRUNT && ( bitsDamageType & (DMG_BULLET | DMG_SLASH | DMG_BLAST | DMG_CLUB ) ) )
{ {
// absorb damage // absorb damage
flDamage -= 20; flDamage -= 20;
@ -849,27 +849,30 @@ void CHGrunt::HandleAnimEvent( MonsterEvent_t *pEvent )
{ {
case HGRUNT_AE_DROP_GUN: case HGRUNT_AE_DROP_GUN:
{ {
Vector vecGunPos; if ( GetBodygroup( GUN_GROUP ) != GUN_NONE )
Vector vecGunAngles;
GetAttachment( 0, vecGunPos, vecGunAngles );
// switch to body group with no gun.
SetBodygroup( GUN_GROUP, GUN_NONE );
// now spawn a gun.
if( FBitSet( pev->weapons, HGRUNT_SHOTGUN ) )
{ {
DropItem( "weapon_shotgun", vecGunPos, vecGunAngles ); Vector vecGunPos;
} Vector vecGunAngles;
else
{
DropItem( "weapon_9mmAR", vecGunPos, vecGunAngles );
}
if( FBitSet( pev->weapons, HGRUNT_GRENADELAUNCHER ) ) GetAttachment( 0, vecGunPos, vecGunAngles );
{
DropItem( "ammo_ARgrenades", BodyTarget( pev->origin ), vecGunAngles ); // switch to body group with no gun.
SetBodygroup( GUN_GROUP, GUN_NONE );
// now spawn a gun.
if( FBitSet( pev->weapons, HGRUNT_SHOTGUN ) )
{
DropItem( "weapon_shotgun", vecGunPos, vecGunAngles );
}
else
{
DropItem( "weapon_9mmAR", vecGunPos, vecGunAngles );
}
if( FBitSet( pev->weapons, HGRUNT_GRENADELAUNCHER ) )
{
DropItem( "ammo_ARgrenades", BodyTarget( pev->origin ), vecGunAngles );
}
} }
} }
break; break;

View File

@ -137,7 +137,12 @@ void CHgun::PrimaryAttack()
CBaseEntity *pHornet = CBaseEntity::Create( "hornet", m_pPlayer->GetGunPosition() + gpGlobals->v_forward * 16.0f + gpGlobals->v_right * 8.0f + gpGlobals->v_up * -12.0f, m_pPlayer->pev->v_angle, m_pPlayer->edict() ); CBaseEntity *pHornet = CBaseEntity::Create( "hornet", m_pPlayer->GetGunPosition() + gpGlobals->v_forward * 16.0f + gpGlobals->v_right * 8.0f + gpGlobals->v_up * -12.0f, m_pPlayer->pev->v_angle, m_pPlayer->edict() );
pHornet->pev->velocity = gpGlobals->v_forward * 300.0f; pHornet->pev->velocity = gpGlobals->v_forward * 300.0f;
m_flRechargeTime = gpGlobals->time + 0.5f; float flRechargeTimePause = 0.5f;
if( g_pGameRules->IsMultiplayer() )
flRechargeTimePause = 0.3f;
m_flRechargeTime = gpGlobals->time + flRechargeTimePause;
#endif #endif
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--; m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--;
@ -223,8 +228,14 @@ void CHgun::SecondaryAttack( void )
pHornet->SetThink( &CHornet::StartDart ); pHornet->SetThink( &CHornet::StartDart );
m_flRechargeTime = gpGlobals->time + 0.5f; float flRechargeTimePause = 0.5f;
if( g_pGameRules->IsMultiplayer() )
flRechargeTimePause = 0.3f;
m_flRechargeTime = gpGlobals->time + flRechargeTimePause;
#endif #endif
int flags; int flags;
#if CLIENT_WEAPONS #if CLIENT_WEAPONS
flags = FEV_NOTHOST; flags = FEV_NOTHOST;
@ -251,8 +262,16 @@ void CHgun::Reload( void )
while( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] < HORNET_MAX_CARRY && m_flRechargeTime < gpGlobals->time ) while( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] < HORNET_MAX_CARRY && m_flRechargeTime < gpGlobals->time )
{ {
float flRechargeTimePause = 0.5f;
#if CLIENT_DLL
if( bIsMultiplayer() )
#else
if( g_pGameRules->IsMultiplayer() )
#endif
flRechargeTimePause = 0.3f;
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]++; m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]++;
m_flRechargeTime += 0.5f; m_flRechargeTime += flRechargeTimePause;
} }
} }

View File

@ -54,6 +54,13 @@ void CMP5::Spawn()
m_iDefaultAmmo = MP5_DEFAULT_GIVE; m_iDefaultAmmo = MP5_DEFAULT_GIVE;
#if CLIENT_DLL
if( bIsMultiplayer() )
#else
if( g_pGameRules->IsMultiplayer() )
#endif
m_iDefaultAmmo = MP5_DEFAULT_GIVE_MP;
FallInit();// get ready to fall down. FallInit();// get ready to fall down.
} }

View File

@ -149,7 +149,7 @@ void CHalfLifeMultiplay::RefreshSkillData( void )
gSkillData.plrDmg9MM = 12; gSkillData.plrDmg9MM = 12;
// 357 Round // 357 Round
gSkillData.plrDmg357 = 40; gSkillData.plrDmg357 = 50;
// MP5 Round // MP5 Round
gSkillData.plrDmgMP5 = 12; gSkillData.plrDmgMP5 = 12;
@ -458,12 +458,13 @@ void CHalfLifeMultiplay::InitHUD( CBasePlayer *pl )
// sending just one score makes the hud scoreboard active; otherwise // sending just one score makes the hud scoreboard active; otherwise
// it is just disabled for single play // it is just disabled for single play
MESSAGE_BEGIN( MSG_ONE, gmsgScoreInfo, NULL, pl->edict() ); //fix a bug in the information about the player's score when he left the server, so that his score would not be transferred to another player(seems to work)
MESSAGE_BEGIN( MSG_ALL, gmsgScoreInfo );
WRITE_BYTE( ENTINDEX(pl->edict()) ); WRITE_BYTE( ENTINDEX(pl->edict()) );
WRITE_SHORT( (int)pl->pev->frags );
WRITE_SHORT( pl->m_iDeaths );
WRITE_SHORT( 0 ); WRITE_SHORT( 0 );
WRITE_SHORT( 0 ); WRITE_SHORT( GetTeamIndex( pl->m_szTeamName ) + 1 );
WRITE_SHORT( 0 );
WRITE_SHORT( 0 );
MESSAGE_END(); MESSAGE_END();
SendMOTDToClient( pl->edict() ); SendMOTDToClient( pl->edict() );

View File

@ -45,8 +45,6 @@ extern DLL_GLOBAL BOOL g_fDrawLines;
int gEvilImpulse101; int gEvilImpulse101;
extern DLL_GLOBAL int g_iSkillLevel, gDisplayTitle; extern DLL_GLOBAL int g_iSkillLevel, gDisplayTitle;
extern "C" int g_bhopcap;
BOOL gInitHUD = TRUE; BOOL gInitHUD = TRUE;
extern void CopyToBodyQue( entvars_t *pev); extern void CopyToBodyQue( entvars_t *pev);
@ -183,7 +181,6 @@ int gmsgSetFOV = 0;
int gmsgShowMenu = 0; int gmsgShowMenu = 0;
int gmsgGeigerRange = 0; int gmsgGeigerRange = 0;
int gmsgTeamNames = 0; int gmsgTeamNames = 0;
int gmsgBhopcap = 0;
int gmsgStatusText = 0; int gmsgStatusText = 0;
int gmsgStatusValue = 0; int gmsgStatusValue = 0;
@ -230,7 +227,6 @@ void LinkUserMessages( void )
gmsgFade = REG_USER_MSG( "ScreenFade", sizeof(ScreenFade) ); gmsgFade = REG_USER_MSG( "ScreenFade", sizeof(ScreenFade) );
gmsgAmmoX = REG_USER_MSG( "AmmoX", 2 ); gmsgAmmoX = REG_USER_MSG( "AmmoX", 2 );
gmsgTeamNames = REG_USER_MSG( "TeamNames", -1 ); gmsgTeamNames = REG_USER_MSG( "TeamNames", -1 );
gmsgBhopcap = REG_USER_MSG( "Bhopcap", 1 );
gmsgStatusText = REG_USER_MSG( "StatusText", -1 ); gmsgStatusText = REG_USER_MSG( "StatusText", -1 );
gmsgStatusValue = REG_USER_MSG( "StatusValue", 3 ); gmsgStatusValue = REG_USER_MSG( "StatusValue", 3 );
@ -2818,6 +2814,8 @@ void CBasePlayer::Spawn( void )
g_engfuncs.pfnSetPhysicsKeyValue( edict(), "slj", "0" ); g_engfuncs.pfnSetPhysicsKeyValue( edict(), "slj", "0" );
g_engfuncs.pfnSetPhysicsKeyValue( edict(), "hl", "1" ); g_engfuncs.pfnSetPhysicsKeyValue( edict(), "hl", "1" );
g_engfuncs.pfnSetPhysicsKeyValue( edict(), "fr", "1" );
g_engfuncs.pfnSetPhysicsKeyValue( edict(), "bj", bhopcap.value ? "0" : "1" );
pev->fov = m_iFOV = 0;// init field of view. pev->fov = m_iFOV = 0;// init field of view.
m_iClientFOV = -1; // make sure fov reset is sent m_iClientFOV = -1; // make sure fov reset is sent
@ -3351,7 +3349,6 @@ void CBasePlayer::ForceClientDllUpdate( void )
m_fWeapon = FALSE; // Force weapon send m_fWeapon = FALSE; // Force weapon send
m_fKnownItem = FALSE; // Force weaponinit messages. m_fKnownItem = FALSE; // Force weaponinit messages.
m_fInitHUD = TRUE; // Force HUD gmsgResetHUD message m_fInitHUD = TRUE; // Force HUD gmsgResetHUD message
m_bSentBhopcap = true; // a1ba: Update bhopcap state
memset( m_rgAmmoLast, 0, sizeof( m_rgAmmoLast )); // a1ba: Force update AmmoX memset( m_rgAmmoLast, 0, sizeof( m_rgAmmoLast )); // a1ba: Force update AmmoX
@ -4118,15 +4115,6 @@ void CBasePlayer::UpdateClientData( void )
UpdateStatusBar(); UpdateStatusBar();
m_flNextSBarUpdateTime = gpGlobals->time + 0.2f; m_flNextSBarUpdateTime = gpGlobals->time + 0.2f;
} }
// Send the current bhopcap state.
if( !m_bSentBhopcap )
{
m_bSentBhopcap = true;
MESSAGE_BEGIN( MSG_ONE, gmsgBhopcap, NULL, pev );
WRITE_BYTE( g_bhopcap );
MESSAGE_END();
}
} }
//========================================================= //=========================================================

View File

@ -328,8 +328,6 @@ public:
int m_iAutoWepSwitch; int m_iAutoWepSwitch;
Vector m_vecLastViewAngles; Vector m_vecLastViewAngles;
bool m_bSentBhopcap; // If false, the player just joined and needs a bhopcap message.
}; };
#define AUTOAIM_2DEGREES 0.0348994967025 #define AUTOAIM_2DEGREES 0.0348994967025

File diff suppressed because it is too large Load Diff

View File

@ -791,7 +791,7 @@ CBaseEntity *CTalkMonster::FindNearestFriend( BOOL fPlayer )
// for each friend in this bsp... // for each friend in this bsp...
while( ( pFriend = UTIL_FindEntityByClassname( pFriend, pszFriend ) ) ) while( ( pFriend = UTIL_FindEntityByClassname( pFriend, pszFriend ) ) )
{ {
if( pFriend == this || !pFriend->IsAlive() ) if( pFriend == this || !pFriend->IsAlive() || pFriend->pev->deadflag != DEAD_NO )
// don't talk to self or dead people // don't talk to self or dead people
continue; continue;
@ -1344,7 +1344,7 @@ void CTalkMonster::StartFollowing( CBaseEntity *pLeader )
BOOL CTalkMonster::CanFollow( void ) BOOL CTalkMonster::CanFollow( void )
{ {
if( m_MonsterState == MONSTERSTATE_SCRIPT ) if( m_MonsterState == MONSTERSTATE_SCRIPT || m_IdealMonsterState == MONSTERSTATE_SCRIPT )
{ {
if( !m_pCine ) if( !m_pCine )
return FALSE; return FALSE;

View File

@ -1729,26 +1729,11 @@ void CSaveRestoreBuffer::BufferRewind( int size )
m_pdata->size -= size; m_pdata->size -= size;
} }
#if !_WIN32 && !__WATCOMC__ #if !XASH_WIN32 && !__WATCOMC__
extern "C" { static unsigned _rotr( unsigned val, int shift )
unsigned _rotr( unsigned val, int shift )
{ {
unsigned lobit; /* non-zero means lo bit set */ // Any modern compiler will generate one single ror instruction for x86, arm and mips here.
unsigned num = val; /* number to rotate */ return ( val >> shift ) | ( val << ( 32 - shift ));
shift &= 0x1f; /* modulo 32 -- this will also make
negative shifts work */
while( shift-- )
{
lobit = num & 1; /* get high bit */
num >>= 1; /* shift right one bit */
if( lobit )
num |= 0x80000000; /* set hi bit if lo bit was set */
}
return num;
}
} }
#endif #endif

View File

@ -498,7 +498,7 @@ extern DLL_GLOBAL int g_Language;
// sentence groups // sentence groups
#define CBSENTENCENAME_MAX 16 #define CBSENTENCENAME_MAX 16
#define CVOXFILESENTENCEMAX 1536 // max number of sentences in game. NOTE: this must match #define CVOXFILESENTENCEMAX 2048 // max number of sentences in game. NOTE: this must match
// CVOXFILESENTENCEMAX in engine\sound.h!!! // CVOXFILESENTENCEMAX in engine\sound.h!!!
extern char gszallsentencenames[CVOXFILESENTENCEMAX][CBSENTENCENAME_MAX]; extern char gszallsentencenames[CVOXFILESENTENCEMAX][CBSENTENCENAME_MAX];

View File

@ -137,6 +137,7 @@ public:
#define GLOCK_DEFAULT_GIVE 17 #define GLOCK_DEFAULT_GIVE 17
#define PYTHON_DEFAULT_GIVE 6 #define PYTHON_DEFAULT_GIVE 6
#define MP5_DEFAULT_GIVE 25 #define MP5_DEFAULT_GIVE 25
#define MP5_DEFAULT_GIVE_MP MP5_MAX_CLIP
#define MP5_M203_DEFAULT_GIVE 0 #define MP5_M203_DEFAULT_GIVE 0
#define SHOTGUN_DEFAULT_GIVE 12 #define SHOTGUN_DEFAULT_GIVE 12
#define CROSSBOW_DEFAULT_GIVE 5 #define CROSSBOW_DEFAULT_GIVE 5

View File

@ -6,7 +6,6 @@ from waflib import Utils
import os import os
def options(opt): def options(opt):
# stub
return return
def configure(conf): def configure(conf):
@ -16,116 +15,21 @@ def configure(conf):
hlDefNode = conf.path.find_resource("./hl.def") hlDefNode = conf.path.find_resource("./hl.def")
if hlDefNode is not None: if hlDefNode is not None:
conf.env.append_unique('LINKFLAGS', '/def:%s' % hlDefNode.abspath()) conf.env.append_value('LINKFLAGS', '/def:%s' % hlDefNode.abspath())
else: else:
conf.fatal("Could not find hl.def") conf.fatal("Could not find hl.def")
def build(bld): def build(bld):
source = bld.path.parent.ant_glob([ excluded_files = ['mpstubb.cpp', 'stats.cpp', 'Wxdebug.cpp']
'pm_shared/*.c',
])
source += [ source = bld.path.ant_glob('**/*.cpp', excl=excluded_files)
'agrunt.cpp', source += bld.path.parent.ant_glob('pm_shared/*.c')
'airtank.cpp',
'aflock.cpp', defines = []
'animating.cpp', if bld.env.USE_VOICEMGR:
'animation.cpp', source += bld.path.parent.ant_glob('game_shared/voice_gamemgr.cpp')
'apache.cpp', else:
'barnacle.cpp', defines += ['NO_VOICEGAMEMGR']
'barney.cpp',
'bigmomma.cpp',
'bloater.cpp',
'bmodels.cpp',
'bullsquid.cpp',
'buttons.cpp',
'cbase.cpp',
'client.cpp',
'combat.cpp',
'controller.cpp',
'crossbow.cpp',
'crowbar.cpp',
'defaultai.cpp',
'doors.cpp',
'effects.cpp',
'egon.cpp',
'explode.cpp',
'flyingmonster.cpp',
'func_break.cpp',
'func_tank.cpp',
'game.cpp',
'gamerules.cpp',
'gargantua.cpp',
'gauss.cpp',
'genericmonster.cpp',
'ggrenade.cpp',
'globals.cpp',
'glock.cpp',
'gman.cpp',
'h_ai.cpp',
'h_battery.cpp',
'h_cine.cpp',
'h_cycler.cpp',
'h_export.cpp',
'handgrenade.cpp',
'hassassin.cpp',
'headcrab.cpp',
'healthkit.cpp',
'hgrunt.cpp',
'hornet.cpp',
'hornetgun.cpp',
'houndeye.cpp',
'ichthyosaur.cpp',
'islave.cpp',
'items.cpp',
'leech.cpp',
'lights.cpp',
'maprules.cpp',
'monstermaker.cpp',
'monsters.cpp',
'monsterstate.cpp',
'mortar.cpp',
'mp5.cpp',
'multiplay_gamerules.cpp',
'nihilanth.cpp',
'nodes.cpp',
'observer.cpp',
'osprey.cpp',
'pathcorner.cpp',
'plane.cpp',
'plats.cpp',
'player.cpp',
'playermonster.cpp',
'python.cpp',
'rat.cpp',
'roach.cpp',
'rpg.cpp',
'satchel.cpp',
'schedule.cpp',
'scientist.cpp',
'scripted.cpp',
'shotgun.cpp',
'singleplay_gamerules.cpp',
'skill.cpp',
'sound.cpp',
'soundent.cpp',
'spectator.cpp',
'squadmonster.cpp',
'squeakgrenade.cpp',
'subs.cpp',
'talkmonster.cpp',
'teamplay_gamerules.cpp',
'tempmonster.cpp',
'tentacle.cpp',
'triggers.cpp',
'tripmine.cpp',
'turret.cpp',
'util.cpp',
'weapons.cpp',
'world.cpp',
'xen.cpp',
'zombie.cpp'
]
includes = [ includes = [
'.', '.',
@ -136,32 +40,20 @@ def build(bld):
'../public' '../public'
] ]
defines = []
if bld.env.VOICEMGR:
source += bld.path.parent.ant_glob([
'game_shared/voice_gamemgr.cpp',
])
else:
defines += ['NO_VOICEGAMEMGR']
libs = []
if bld.env.DEST_OS not in ['android', 'dos']: if bld.env.DEST_OS not in ['android', 'dos']:
install_path = os.path.join(bld.env.GAMEDIR, bld.env.SERVER_DIR) install_path = os.path.join(bld.env.GAMEDIR, bld.env.SERVER_INSTALL_DIR)
else: else:
install_path = bld.env.PREFIX install_path = bld.env.PREFIX
bld.shlib( bld.shlib(
source = source, source = source,
target = bld.env.SERVER_NAME + bld.env.POSTFIX, target = bld.env.SERVER_LIBRARY_NAME + bld.env.POSTFIX,
name = 'server', name = 'server',
features = 'c cxx', features = 'c cxx',
includes = includes, includes = includes,
defines = defines, defines = defines,
use = libs,
install_path = install_path, install_path = install_path,
subsystem = bld.env.MSVC_SUBSYSTEM, subsystem = bld.env.MSVC_SUBSYSTEM,
idx = bld.get_taskgen_count() idx = bld.get_taskgen_count()
) )

View File

@ -28,11 +28,14 @@ SPRITE MODELS
#define IDSPRITEHEADER (('P'<<24)+('S'<<16)+('D'<<8)+'I') // little-endian "IDSP" #define IDSPRITEHEADER (('P'<<24)+('S'<<16)+('D'<<8)+'I') // little-endian "IDSP"
#define SPRITE_VERSION 2 // Half-Life sprites #define SPRITE_VERSION 2 // Half-Life sprites
#if !defined(SYNCTYPE_T)
#define SYNCTYPE_T
typedef enum typedef enum
{ {
ST_SYNC = 0, ST_SYNC = 0,
ST_RAND ST_RAND
} synctype_t; } synctype_t;
#endif
typedef enum typedef enum
{ {

View File

@ -1,4 +1,4 @@
//========= Copyright <EFBFBD> 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright <EFBFBD> 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright <EFBFBD> 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright <EFBFBD> 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: New version of the slider bar // Purpose: New version of the slider bar
// //

View File

@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright <EFBFBD> 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

View File

@ -1,4 +1,4 @@
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============ //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
// //
// Purpose: // Purpose:
// //

16
mod_options.txt Normal file
View File

@ -0,0 +1,16 @@
BARNACLE_FIX_VISIBILITY=OFF # Barnacle tongue length fix
CLIENT_WEAPONS=ON # Client local weapons prediction
CROWBAR_IDLE_ANIM=ON # Crowbar idle animation
CROWBAR_DELAY_FIX=ON # Crowbar attack delay fix
CROWBAR_FIX_RAPID_CROWBAR=ON # Rapid crowbar fix
GAUSS_OVERCHARGE_FIX=ON # Gauss overcharge fix
TRIPMINE_BEAM_DUPLICATION_FIX=ON # Fix of tripmine beam duplication on level transition
HANDGRENADE_DEPLOY_FIX=ON # Handgrenade deploy animation fix after finishing a throw
WEAPONS_ANIMATION_TIMES_FIX=ON # Animation times fix for some weapons
OEM_BUILD=OFF # OEM Build
HLDEMO_BUILD=OFF # Demo Build
GAMEDIR=sci # Gamedir path
SERVER_INSTALL_DIR=dlls # Where put server dll
CLIENT_INSTALL_DIR=cl_dlls # Where put client dll
SERVER_LIBRARY_NAME=game # Library name for PC platforms

View File

@ -31,8 +31,6 @@
#include "pm_movevars.h" #include "pm_movevars.h"
#include "pm_debug.h" #include "pm_debug.h"
int g_bhopcap = 1;
#if CLIENT_DLL #if CLIENT_DLL
// Spectator Mode // Spectator Mode
int iJumpSpectator; int iJumpSpectator;
@ -2481,6 +2479,8 @@ PM_Jump
void PM_Jump( void ) void PM_Jump( void )
{ {
int i; int i;
qboolean bunnyjump = false;
qboolean tfc = false; qboolean tfc = false;
qboolean cansuperjump = false; qboolean cansuperjump = false;
@ -2564,7 +2564,10 @@ void PM_Jump( void )
// In the air now. // In the air now.
pmove->onground = -1; pmove->onground = -1;
if( g_bhopcap ) if( pmove->multiplayer )
bunnyjump = atoi( pmove->PM_Info_ValueForKey( pmove->physinfo, "bj" ) ) ? true : false;
if( !bunnyjump )
PM_PreventMegaBunnyJumping(); PM_PreventMegaBunnyJumping();
if( tfc ) if( tfc )
@ -3319,7 +3322,8 @@ void PM_Move( struct playermove_s *ppmove, int server )
} }
// Reset friction after each movement to FrictionModifier Triggers work still. // Reset friction after each movement to FrictionModifier Triggers work still.
if( pmove->movetype == MOVETYPE_WALK ) // Use movevar to avoid lags with different clients and servers.
if( !( pmove->multiplayer && atoi( pmove->PM_Info_ValueForKey( pmove->physinfo, "fr" )) == 0 ) && pmove->movetype == MOVETYPE_WALK )
{ {
pmove->friction = 1.0f; pmove->friction = 1.0f;
} }

View File

@ -30,15 +30,22 @@ For more information, please refer to <http://unlicense.org/>
#ifndef BUILD_H #ifndef BUILD_H
#define BUILD_H #define BUILD_H
// All XASH_* macros set by this header are guaranteed to have positive value otherwise not defined /*
All XASH_* macros set by this header are guaranteed to have positive value
otherwise not defined.
// Any new define must be undefined at first Every macro is intended to be the unified interface for buildsystems that lack
// You can generate #undef list below with this oneliner: platform & CPU detection, and a neat quick way for checks in platform code
// $ cat build.h | sed 's/\t//g' | grep '^#define XASH' | awk '{ print $2 }' | sort | uniq | awk '{ print "#undef " $1 }' For Q_build* macros, refer to buildenums.h
//
// So in various buildscripts you can grep for ^#undef XASH and select only second word Any new define must be undefined at first
// or in another oneliner: You can generate #undef list below with this oneliner:
// $ cat build.h | grep '^#undef XASH' | awk '{ print $2 }' $ sed 's/\t//g' build.h | grep '^#define XASH' | awk '{ print $2 }' | \
sort | uniq | awk '{ print "#undef " $1 }'
Then you can use another oneliner to query all variables:
$ grep '^#undef XASH' build.h | awk '{ print $2 }'
*/
#undef XASH_64BIT #undef XASH_64BIT
#undef XASH_AMD64 #undef XASH_AMD64
@ -53,98 +60,91 @@ For more information, please refer to <http://unlicense.org/>
#undef XASH_ARMv7 #undef XASH_ARMv7
#undef XASH_ARMv8 #undef XASH_ARMv8
#undef XASH_BIG_ENDIAN #undef XASH_BIG_ENDIAN
#undef XASH_BSD
#undef XASH_DOS4GW #undef XASH_DOS4GW
#undef XASH_E2K #undef XASH_E2K
#undef XASH_EMSCRIPTEN #undef XASH_EMSCRIPTEN
#undef XASH_FREEBSD #undef XASH_FREEBSD
#undef XASH_HAIKU #undef XASH_HAIKU
#undef XASH_IOS #undef XASH_IOS
#undef XASH_IRIX
#undef XASH_JS #undef XASH_JS
#undef XASH_LINUX #undef XASH_LINUX
#undef XASH_LINUX_UNKNOWN
#undef XASH_LITTLE_ENDIAN #undef XASH_LITTLE_ENDIAN
#undef XASH_MINGW
#undef XASH_MIPS #undef XASH_MIPS
#undef XASH_PPC
#undef XASH_MOBILE_PLATFORM #undef XASH_MOBILE_PLATFORM
#undef XASH_MSVC
#undef XASH_NETBSD #undef XASH_NETBSD
#undef XASH_OPENBSD #undef XASH_OPENBSD
#undef XASH_POSIX #undef XASH_POSIX
#undef XASH_PPC
#undef XASH_RISCV #undef XASH_RISCV
#undef XASH_RISCV_DOUBLEFP #undef XASH_RISCV_DOUBLEFP
#undef XASH_RISCV_SINGLEFP #undef XASH_RISCV_SINGLEFP
#undef XASH_RISCV_SOFTFP #undef XASH_RISCV_SOFTFP
#undef XASH_SERENITY #undef XASH_SERENITY
#undef XASH_WIN32 #undef XASH_WIN32
#undef XASH_WIN64
#undef XASH_X86 #undef XASH_X86
#undef XASH_NSWITCH #undef XASH_NSWITCH
#undef XASH_PSVITA #undef XASH_PSVITA
//================================================================ //================================================================
// //
// OPERATING SYSTEM DEFINES // PLATFORM DETECTION CODE
// //
//================================================================ //================================================================
#if defined(_WIN32) #if defined _WIN32
#define XASH_WIN32 1 #define XASH_WIN32 1
#if defined(__MINGW32__)
#define XASH_MINGW 1
#elif defined(_MSC_VER)
#define XASH_MSVC 1
#endif
#if defined(_WIN64)
#define XASH_WIN64 1
#endif
#elif defined __SWITCH__
#define XASH_NSWITCH 1
#define XASH_LITTLE_ENDIAN 1
#define XASH_POSIX 1
#elif defined __vita__
#define XASH_PSVITA 1
#define XASH_LITTLE_ENDIAN 1
#define XASH_POSIX 1
#elif defined(__linux__)
#define XASH_LINUX 1
#if defined(__ANDROID__)
#define XASH_ANDROID 1
#endif // defined(__ANDROID__)
#define XASH_POSIX 1
#elif defined(__APPLE__)
#include <TargetConditionals.h>
#define XASH_APPLE 1
#if TARGET_OS_IOS
#define XASH_IOS 1
#endif // TARGET_OS_IOS
#define XASH_POSIX 1
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
#define XASH_BSD 1
#if defined(__FreeBSD__)
#define XASH_FREEBSD 1
#elif defined(__NetBSD__)
#define XASH_NETBSD 1
#elif defined(__OpenBSD__)
#define XASH_OPENBSD 1
#endif
#define XASH_POSIX 1
#elif defined __EMSCRIPTEN__ #elif defined __EMSCRIPTEN__
#define XASH_EMSCRIPTEN 1 #define XASH_EMSCRIPTEN 1
#elif defined __WATCOMC__ && defined __DOS__ #elif defined __WATCOMC__ && defined __DOS__
#define XASH_DOS4GW 1 #define XASH_DOS4GW 1
#define XASH_LITTLE_ENDIAN 1 #else // POSIX compatible
#elif defined __HAIKU__
#define XASH_HAIKU 1
#define XASH_POSIX 1 #define XASH_POSIX 1
#elif defined __serenity__ #if defined __linux__
#define XASH_SERENITY 1 #if defined __ANDROID__
#define XASH_POSIX 1 #define XASH_ANDROID 1
#else #else
#error "Place your operating system name here! If this is a mistake, try to fix conditions above and report a bug" #include <features.h>
// if our system libc has features.h header
// try to detect it to not confuse other libcs with built with glibc game libraries
#if !defined __GLIBC__
#define XASH_LINUX_UNKNOWN 1
#endif
#endif
#define XASH_LINUX 1
#elif defined __FreeBSD__
#define XASH_FREEBSD 1
#elif defined __NetBSD__
#define XASH_NETBSD 1
#elif defined __OpenBSD__
#define XASH_OPENBSD 1
#elif defined __HAIKU__
#define XASH_HAIKU 1
#elif defined __serenity__
#define XASH_SERENITY 1
#elif defined __sgi
#define XASH_IRIX 1
#elif defined __APPLE__
#include <TargetConditionals.h>
#define XASH_APPLE 1
#if TARGET_OS_IOS
#define XASH_IOS 1
#endif // TARGET_OS_IOS
#elif defined __SWITCH__
#define XASH_NSWITCH 1
#elif defined __vita__
#define XASH_PSVITA 1
#else
#error
#endif
#endif #endif
#if defined XASH_ANDROID || defined XASH_IOS || defined XASH_NSWITCH || defined XASH_PSVITA // XASH_SAILFISH is special: SailfishOS by itself is a normal GNU/Linux platform
// It doesn't make sense to split it to separate platform
// but we still need XASH_MOBILE_PLATFORM for the engine.
// So this macro is defined entirely in build-system: see main wscript
// HLSDK/PrimeXT/other SDKs users note: you may ignore this macro
#if XASH_ANDROID || XASH_IOS || XASH_NSWITCH || XASH_PSVITA || XASH_SAILFISH
#define XASH_MOBILE_PLATFORM 1 #define XASH_MOBILE_PLATFORM 1
#endif #endif
@ -154,27 +154,17 @@ For more information, please refer to <http://unlicense.org/>
// //
//================================================================ //================================================================
#if defined(XASH_FORCE_LITTLE_ENDIAN) && defined(XASH_FORCE_BIG_ENDIAN) #if !defined XASH_ENDIANNESS
#error "Both XASH_FORCE_LITTLE_ENDIAN and XASH_FORCE_BIG_ENDIAN are defined" #if defined XASH_WIN32 || __LITTLE_ENDIAN__
#elif defined(XASH_FORCE_LITTLE_ENDIAN)
#define XASH_LITTLE_ENDIAN 1
#elif defined(XASH_FORCE_BIG_ENDIAN)
#define XASH_BIG_ENDIAN 1
#endif
#if !defined(XASH_LITTLE_ENDIAN) && !defined(XASH_BIG_ENDIAN)
#if defined XASH_MSVC || __LITTLE_ENDIAN__
//!!! Probably all WinNT installations runs in little endian //!!! Probably all WinNT installations runs in little endian
#define XASH_LITTLE_ENDIAN 1 #define XASH_LITTLE_ENDIAN 1
#elif __BIG_ENDIAN__ #elif __BIG_ENDIAN__
#define XASH_BIG_ENDIAN 1 #define XASH_BIG_ENDIAN 1
#elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && defined(__ORDER_LITTLE_ENDIAN__) // some compilers define this #elif defined __BYTE_ORDER__ && defined __ORDER_BIG_ENDIAN__ && defined __ORDER_LITTLE_ENDIAN__ // some compilers define this
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
#define XASH_BIG_ENDIAN 1 #define XASH_BIG_ENDIAN 1
#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
#define XASH_LITTLE_ENDIAN 1 #define XASH_LITTLE_ENDIAN 1
#else
#error "Unknown endianness!"
#endif #endif
#else #else
#include <sys/param.h> #include <sys/param.h>
@ -182,8 +172,6 @@ For more information, please refer to <http://unlicense.org/>
#define XASH_BIG_ENDIAN 1 #define XASH_BIG_ENDIAN 1
#elif __BYTE_ORDER == __LITTLE_ENDIAN #elif __BYTE_ORDER == __LITTLE_ENDIAN
#define XASH_LITTLE_ENDIAN 1 #define XASH_LITTLE_ENDIAN 1
#else
#error "Unknown endianness!"
#endif #endif
#endif // !XASH_WIN32 #endif // !XASH_WIN32
#endif #endif
@ -193,18 +181,33 @@ For more information, please refer to <http://unlicense.org/>
// CPU ARCHITECTURE DEFINES // CPU ARCHITECTURE DEFINES
// //
//================================================================ //================================================================
#if defined(__x86_64__) || defined(_M_X64) #if defined __x86_64__ || defined _M_X64
#define XASH_64BIT 1 #define XASH_64BIT 1
#define XASH_AMD64 1 #define XASH_AMD64 1
#elif defined(__i386__) || defined(_X86_) || defined(_M_IX86) #elif defined __i386__ || defined _X86_ || defined _M_IX86
#define XASH_X86 1 #define XASH_X86 1
#elif defined __aarch64__ || defined _M_ARM64 #elif defined __aarch64__ || defined _M_ARM64
#define XASH_64BIT 1 #define XASH_64BIT 1
#define XASH_ARM 8 #define XASH_ARM 8
#elif defined __arm__ || defined _M_ARM #elif defined __mips__
#define XASH_MIPS 1
#elif defined __EMSCRIPTEN__
#define XASH_JS 1
#elif defined __e2k__
#define XASH_64BIT 1
#define XASH_E2K 1
#elif defined __PPC__ || defined __powerpc__
#define XASH_PPC 1
#if defined __PPC64__ || defined __powerpc64__
#define XASH_64BIT 1
#endif
#elif defined _M_ARM // msvc
#define XASH_ARM 7
#define XASH_ARM_HARDFP 1
#elif defined __arm__
#if __ARM_ARCH == 8 || __ARM_ARCH_8__ #if __ARM_ARCH == 8 || __ARM_ARCH_8__
#define XASH_ARM 8 #define XASH_ARM 8
#elif __ARM_ARCH == 7 || __ARM_ARCH_7__ || defined _M_ARM // msvc can only armv7 in 32 bit #elif __ARM_ARCH == 7 || __ARM_ARCH_7__
#define XASH_ARM 7 #define XASH_ARM 7
#elif __ARM_ARCH == 6 || __ARM_ARCH_6__ || __ARM_ARCH_6J__ #elif __ARM_ARCH == 6 || __ARM_ARCH_6__ || __ARM_ARCH_6J__
#define XASH_ARM 6 #define XASH_ARM 6
@ -216,34 +219,17 @@ For more information, please refer to <http://unlicense.org/>
#error "Unknown ARM" #error "Unknown ARM"
#endif #endif
#if defined _M_ARM
#error "No WinMobile port yet! Need to determine which ARM float ABI msvc uses if applicable"
#endif
#if defined __SOFTFP__ || __ARM_PCS_VFP == 0 #if defined __SOFTFP__ || __ARM_PCS_VFP == 0
#define XASH_ARM_SOFTFP 1 #define XASH_ARM_SOFTFP 1
#else // __SOFTFP__ #else // __SOFTFP__
#define XASH_ARM_HARDFP 1 #define XASH_ARM_HARDFP 1
#endif // __SOFTFP__ #endif // __SOFTFP__
#elif defined __mips__
#define XASH_MIPS 1
#elif defined __powerpc__
#define XASH_PPC 1
#if defined __powerpc64__
#define XASH_64BIT 1
#endif
#elif defined __EMSCRIPTEN__
#define XASH_JS 1
#elif defined __e2k__
#define XASH_64BIT 1
#define XASH_E2K 1
#elif defined __riscv #elif defined __riscv
#define XASH_RISCV 1 #define XASH_RISCV 1
#if __riscv_xlen == 64 #if __riscv_xlen == 64
#define XASH_64BIT 1 #define XASH_64BIT 1
#elif __riscv_xlen == 32 #elif __riscv_xlen != 32
// ...
#else
#error "Unknown RISC-V ABI" #error "Unknown RISC-V ABI"
#endif #endif
@ -260,10 +246,6 @@ For more information, please refer to <http://unlicense.org/>
#error "Place your architecture name here! If this is a mistake, try to fix conditions above and report a bug" #error "Place your architecture name here! If this is a mistake, try to fix conditions above and report a bug"
#endif #endif
#if defined(XASH_WAF_DETECTED_64BIT) && !defined(XASH_64BIT)
#define XASH_64BIT 1
#endif
#if XASH_ARM == 8 #if XASH_ARM == 8
#define XASH_ARMv8 1 #define XASH_ARMv8 1
#elif XASH_ARM == 7 #elif XASH_ARM == 7

View File

@ -118,7 +118,7 @@ POLLY_CFLAGS = {
def options(opt): def options(opt):
grp = opt.add_option_group('Compiler optimization options') grp = opt.add_option_group('Compiler optimization options')
grp.add_option('-T', '--build-type', action='store', dest='BUILD_TYPE', default=None, grp.add_option('-T', '--build-type', action='store', dest='BUILD_TYPE', default='release',
help = 'build type: debug, release or none(custom flags)') help = 'build type: debug, release or none(custom flags)')
grp.add_option('--enable-lto', action = 'store_true', dest = 'LTO', default = False, grp.add_option('--enable-lto', action = 'store_true', dest = 'LTO', default = False,
@ -129,12 +129,11 @@ def options(opt):
def configure(conf): def configure(conf):
conf.start_msg('Build type') conf.start_msg('Build type')
if conf.options.BUILD_TYPE == None:
conf.end_msg('not set', color='RED') if not conf.options.BUILD_TYPE in VALID_BUILD_TYPES:
conf.fatal('Set a build type, for example "-T release"')
elif not conf.options.BUILD_TYPE in VALID_BUILD_TYPES:
conf.end_msg(conf.options.BUILD_TYPE, color='RED') conf.end_msg(conf.options.BUILD_TYPE, color='RED')
conf.fatal('Invalid build type. Valid are: %s' % ', '.join(VALID_BUILD_TYPES)) conf.fatal('Invalid build type. Valid are: %s' % ', '.join(VALID_BUILD_TYPES))
conf.end_msg(conf.options.BUILD_TYPE) conf.end_msg(conf.options.BUILD_TYPE)
conf.msg('LTO build', 'yes' if conf.options.LTO else 'no') conf.msg('LTO build', 'yes' if conf.options.LTO else 'no')
@ -175,5 +174,7 @@ def get_optimization_flags(conf):
elif conf.env.DEST_OS == 'psvita': elif conf.env.DEST_OS == 'psvita':
# this optimization is broken in vitasdk # this optimization is broken in vitasdk
cflags.append('-fno-optimize-sibling-calls') cflags.append('-fno-optimize-sibling-calls')
# remove fvisibility to allow everything to be exported by default
cflags.remove('-fvisibility=hidden')
return cflags, linkflags return cflags, linkflags

View File

@ -35,31 +35,29 @@ DEFINES = [
'XASH_ARMv7', 'XASH_ARMv7',
'XASH_ARMv8', 'XASH_ARMv8',
'XASH_BIG_ENDIAN', 'XASH_BIG_ENDIAN',
'XASH_BSD',
'XASH_DOS4GW', 'XASH_DOS4GW',
'XASH_E2K', 'XASH_E2K',
'XASH_EMSCRIPTEN', 'XASH_EMSCRIPTEN',
'XASH_FREEBSD', 'XASH_FREEBSD',
'XASH_HAIKU', 'XASH_HAIKU',
'XASH_IOS', 'XASH_IOS',
'XASH_IRIX',
'XASH_JS', 'XASH_JS',
'XASH_LINUX', 'XASH_LINUX',
'XASH_LINUX_UNKNOWN',
'XASH_LITTLE_ENDIAN', 'XASH_LITTLE_ENDIAN',
'XASH_MINGW',
'XASH_MIPS', 'XASH_MIPS',
'XASH_PPC',
'XASH_MOBILE_PLATFORM', 'XASH_MOBILE_PLATFORM',
'XASH_MSVC',
'XASH_NETBSD', 'XASH_NETBSD',
'XASH_OPENBSD', 'XASH_OPENBSD',
'XASH_POSIX', 'XASH_POSIX',
'XASH_PPC',
'XASH_RISCV', 'XASH_RISCV',
'XASH_RISCV_DOUBLEFP', 'XASH_RISCV_DOUBLEFP',
'XASH_RISCV_SINGLEFP', 'XASH_RISCV_SINGLEFP',
'XASH_RISCV_SOFTFP', 'XASH_RISCV_SOFTFP',
'XASH_SERENITY', 'XASH_SERENITY',
'XASH_WIN32', 'XASH_WIN32',
'XASH_WIN64',
'XASH_X86', 'XASH_X86',
'XASH_NSWITCH', 'XASH_NSWITCH',
'XASH_PSVITA', 'XASH_PSVITA',
@ -78,6 +76,8 @@ def configure(conf):
# engine/common/build.c # engine/common/build.c
if conf.env.XASH_ANDROID: if conf.env.XASH_ANDROID:
buildos = "android" buildos = "android"
elif conf.env.XASH_LINUX_UNKNOWN:
buildos = "linuxunkabi"
elif conf.env.XASH_WIN32 or conf.env.XASH_LINUX or conf.env.XASH_APPLE: elif conf.env.XASH_WIN32 or conf.env.XASH_LINUX or conf.env.XASH_APPLE:
buildos = "" # no prefix for default OS buildos = "" # no prefix for default OS
elif conf.env.XASH_FREEBSD: elif conf.env.XASH_FREEBSD:
@ -98,6 +98,8 @@ def configure(conf):
buildos = "nswitch" buildos = "nswitch"
elif conf.env.XASH_PSVITA: elif conf.env.XASH_PSVITA:
buildos = "psvita" buildos = "psvita"
elif conf.env.XASH_IRIX:
buildos = "irix"
else: else:
conf.fatal("Place your operating system name in build.h and library_naming.py!\n" conf.fatal("Place your operating system name in build.h and library_naming.py!\n"
"If this is a mistake, try to fix conditions above and report a bug") "If this is a mistake, try to fix conditions above and report a bug")
@ -125,7 +127,7 @@ def configure(conf):
buildarch += "4" buildarch += "4"
else: else:
raise conf.fatal('Unknown ARM') raise conf.fatal('Unknown ARM')
if conf.env.XASH_ARM_HARDFP: if conf.env.XASH_ARM_HARDFP:
buildarch += "hf" buildarch += "hf"
else: else:
@ -136,19 +138,13 @@ def configure(conf):
buildarch += "64" buildarch += "64"
if conf.env.XASH_LITTLE_ENDIAN: if conf.env.XASH_LITTLE_ENDIAN:
buildarch += "el" buildarch += "el"
elif conf.env.XASH_PPC:
buildarch = "powerpc"
if conf.env.XASH_64BIT:
buildarch += "64"
if conf.env.XASH_LITTLE_ENDIAN:
buildarch += "le"
elif conf.env.XASH_RISCV: elif conf.env.XASH_RISCV:
buildarch = "riscv" buildarch = "riscv"
if conf.env.XASH_64BIT: if conf.env.XASH_64BIT:
buildarch += "64" buildarch += "64"
else: else:
buildarch += "32" buildarch += "32"
if conf.env.XASH_RISCV_DOUBLEFP: if conf.env.XASH_RISCV_DOUBLEFP:
buildarch += "d" buildarch += "d"
elif conf.env.XASH_RISCV_SINGLEFP: elif conf.env.XASH_RISCV_SINGLEFP:
@ -157,12 +153,18 @@ def configure(conf):
buildarch = "javascript" buildarch = "javascript"
elif conf.env.XASH_E2K: elif conf.env.XASH_E2K:
buildarch = "e2k" buildarch = "e2k"
elif conf.env.XASH_PPC:
buildarch = "ppc"
if conf.env.XASH_64BIT:
buildarch += "64"
if conf.env.XASH_LITTLE_ENDIAN:
buildarch += "el"
else: else:
raise conf.fatal("Place your architecture name in build.h and library_naming.py!\n" raise conf.fatal("Place your architecture name in build.h and library_naming.py!\n"
"If this is a mistake, try to fix conditions above and report a bug") "If this is a mistake, try to fix conditions above and report a bug")
conf.env.revert() conf.env.revert()
if buildos == 'android': if buildos == 'android':
# force disable for Android, as Android ports aren't distributed in normal way and doesn't follow library naming # force disable for Android, as Android ports aren't distributed in normal way and doesn't follow library naming
conf.env.POSTFIX = '' conf.env.POSTFIX = ''
@ -172,5 +174,5 @@ def configure(conf):
conf.env.POSTFIX = '_%s' % buildarch conf.env.POSTFIX = '_%s' % buildarch
else: else:
conf.env.POSTFIX = '' conf.env.POSTFIX = ''
conf.end_msg(conf.env.POSTFIX) conf.end_msg(conf.env.POSTFIX)

79
scripts/waifulib/vgui.py Normal file
View File

@ -0,0 +1,79 @@
#! /usr/bin/env python
# encoding: utf-8
# mittorn, 2018
from waflib.Configure import conf
import os
VGUI_SUPPORTED_OS = ['win32', 'darwin', 'linux']
VGUI_FRAGMENT = '''#include <VGUI.h>
int main() { return 0; }'''
def options(opt):
grp = opt.add_option_group('VGUI options')
vgui_dev_path = os.path.join(opt.path.path_from(opt.path), 'vgui_support', 'vgui-dev')
grp.add_option('--vgui', action = 'store', dest = 'VGUI_DEV', default=vgui_dev_path,
help = 'path to vgui-dev repo [default: %default]')
grp.add_option('--skip-vgui-sanity-check', action = 'store_false', dest = 'VGUI_SANITY_CHECK', default=True,
help = 'skip checking VGUI sanity [default: %default]' )
return
@conf
def check_vgui(conf):
conf.start_msg('Does this architecture support VGUI?')
if conf.env.DEST_CPU != 'x86' and not (conf.env.DEST_CPU == 'x86_64' and not conf.options.ALLOW64):
conf.end_msg('no')
Logs.warn('vgui is not supported on this CPU: ' + str(conf.env.DEST_CPU))
return False
else: conf.end_msg('yes')
conf.start_msg('Does this OS support VGUI?')
if conf.env.DEST_OS not in VGUI_SUPPORTED_OS:
conf.end_msg('no')
Logs.warn('vgui is not supported on this OS: ' + str(conf.env.DEST_OS))
return False
else: conf.end_msg('yes')
conf.start_msg('Does this toolchain able to link VGUI?')
if conf.env.DEST_OS == 'win32' and conf.env.COMPILER_CXX == 'g++':
conf.end_msg('no')
# we have ABI incompatibility ONLY on MinGW
Logs.warn('vgui can\'t be linked with MinGW')
return False
else: conf.end_msg('yes')
conf.start_msg('Configuring VGUI by provided path')
vgui_dev = conf.options.VGUI_DEV
if conf.env.DEST_OS == 'win32':
conf.env.LIB_VGUI = ['vgui']
conf.env.LIBPATH_VGUI = [os.path.abspath(os.path.join(vgui_dev, 'lib/win32_vc6/'))]
else:
libpath = os.path.abspath(os.path.join(vgui_dev, 'lib'))
if conf.env.DEST_OS == 'linux':
conf.env.LIB_VGUI = [':vgui.so']
conf.env.LIBPATH_VGUI = [libpath]
elif conf.env.DEST_OS == 'darwin':
conf.env.LDFLAGS_VGUI = [os.path.join(libpath, 'vgui.dylib')]
else:
conf.fatal('vgui is not supported on this OS: ' + conf.env.DEST_OS)
conf.env.INCLUDES_VGUI = [os.path.abspath(os.path.join(vgui_dev, 'include'))]
conf.env.HAVE_VGUI = 1
conf.end_msg('yes: {0}, {1}, {2}'.format(conf.env.LIB_VGUI, conf.env.LIBPATH_VGUI, conf.env.INCLUDES_VGUI))
if conf.env.HAVE_VGUI and conf.options.VGUI_SANITY_CHECK:
try:
conf.check_cxx(fragment=VGUI_FRAGMENT,
msg = 'Checking for library VGUI sanity',
use = 'VGUI',
execute = False)
except conf.errors.ConfigurationError:
conf.fatal("Can't compile simple program. Check your path to vgui-dev repository.")
return True

View File

@ -77,7 +77,7 @@
// then App can come along later and fire all the signals // then App can come along later and fire all the signals
//TODO: Change all method naming to starting with a capital letter. //TODO: Change all method naming to starting with a capital letter.
#ifdef _WIN32 #if XASH_WIN32
# define VGUIAPI __declspec( dllexport ) # define VGUIAPI __declspec( dllexport )
#else #else
# define VGUIAPI __attribute__ ((visibility("default"))) # define VGUIAPI __attribute__ ((visibility("default")))

View File

@ -166,7 +166,7 @@ protected:
ELEMTYPE* _data; ELEMTYPE* _data;
}; };
#ifdef _WIN32 #if XASH_WIN32
//forward referencing all the template types used so they get exported //forward referencing all the template types used so they get exported
template class VGUIAPI Dar<char>; template class VGUIAPI Dar<char>;
template class VGUIAPI Dar<char*>; template class VGUIAPI Dar<char*>;
@ -191,4 +191,4 @@ template class VGUIAPI Dar<class RepaintSignal*>;
} }
#endif #endif

14
waf vendored

File diff suppressed because one or more lines are too long

12
waf.bat
View File

@ -1,24 +1,20 @@
@echo off @echo off
rem try fix py2 build rem try fix py2 build
chcp 1252 chcp 65001
set PYTHONIOENCODING=UTF-8 set PYTHONIOENCODING=UTF-8
rem from issue #964 rem from issue #964
Setlocal EnableDelayedExpansion Setlocal EnableDelayedExpansion
rem Check Windows Version rem Check Windows Version
set TOKEN=tokens=3* set TOKEN=tokens=2*
ver | findstr /i "5\.0\." > nul ver | findstr /i "5\.0\." > nul
if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=3* if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=3*
ver | findstr /i "5\.1\." > nul ver | findstr /i "5\.1\." > nul
if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=3* if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=3*
ver | findstr /i "5\.2\." > nul ver | findstr /i "5\.2\." > nul
if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=3* if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=3*
ver | findstr /i "6\.0\." > nul
if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=2*
ver | findstr /i "6\.1\." > nul
if %ERRORLEVEL% EQU 0 SET TOKEN=tokens=2*
rem Start calculating PYTHON and PYTHON_DIR rem Start calculating PYTHON and PYTHON_DIR
set PYTHON= set PYTHON=
@ -29,7 +25,7 @@ Setlocal EnableDelayedExpansion
set PYTHON_DIR_OK=FALSE set PYTHON_DIR_OK=FALSE
set REGPATH= set REGPATH=
for %%i in (3.9 3.8 3.7 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.7 2.6 2.5) do ( for %%i in (3.10 3.9 3.8 3.7 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.7 2.6 2.5) do (
for %%j in (HKCU HKLM) do ( for %%j in (HKCU HKLM) do (
for %%k in (SOFTWARE\Wow6432Node SOFTWARE) do ( for %%k in (SOFTWARE\Wow6432Node SOFTWARE) do (
for %%l in (Python\PythonCore IronPython) do ( for %%l in (Python\PythonCore IronPython) do (
@ -88,7 +84,7 @@ rem @echo %PYTHON_DIR%
if "%PYTHON%" == "" ( if "%PYTHON%" == "" (
rem @echo No Python rem @echo No Python
set PYTHON=python set PYTHON=py
goto running goto running
) )

295
wscript
View File

@ -2,16 +2,17 @@
# encoding: utf-8 # encoding: utf-8
# a1batross, mittorn, 2018 # a1batross, mittorn, 2018
from __future__ import print_function from waflib import Build, Configure, Context, Logs
from waflib import Logs, Context, Configure
import sys import sys
import os import os
import re
VERSION = '2.4' VERSION = '2.4'
APPNAME = 'hlsdk-xash3d' APPNAME = 'hlsdk-portable'
top = '.' top = '.'
default_prefix = '/'
Context.Context.line_just = 55 # should fit for everything on 80x26 Context.Context.line_just = 60 # should fit for everything on 80x26
@Configure.conf @Configure.conf
def get_taskgen_count(self): def get_taskgen_count(self):
@ -20,47 +21,30 @@ def get_taskgen_count(self):
return idx return idx
def options(opt): def options(opt):
opt.load('reconfigure compiler_optimizations xcompile compiler_cxx compiler_c clang_compilation_database strip_on_install msdev msvs msvc subproject')
grp = opt.add_option_group('Common options') grp = opt.add_option_group('Common options')
grp.add_option('-8', '--64bits', action = 'store_true', dest = 'ALLOW64', default = False, grp.add_option('-8', '--64bits', action = 'store_true', dest = 'ALLOW64', default = False,
help = 'allow targetting 64-bit engine(Linux/Windows/OSX x86 only) [default: %default]') help = 'allow targetting 64-bit engine(Linux/Windows/OSX x86 only) [default: %default]')
grp.add_option('--disable-werror', action = 'store_true', dest = 'DISABLE_WERROR', default = False,
help = 'disable compilation abort on warning')
grp.add_option('--enable-voicemgr', action = 'store_true', dest = 'USE_VOICEMGR', default = False,
help = 'Enable VOICE MANAGER')
grp.add_option('--enable-voicemgr', action = 'store_true', dest = 'VOICEMGR', default = False, opt.add_subproject('dlls')
help = 'enable voice manager [default: %default]') opt.add_subproject('cl_dll')
grp.add_option('--disable-goldsrc-support', action = 'store_false', dest = 'GOLDSRC', default = True,
help = 'disable GoldSource engine support [default: %default]')
opt.load('compiler_optimizations subproject')
opt.add_subproject(['cl_dll', 'dlls'])
opt.load('xcompile compiler_cxx compiler_c clang_compilation_database strip_on_install msdev msvs')
if sys.platform == 'win32':
opt.load('msvc')
opt.load('reconfigure')
def configure(conf): def configure(conf):
# Configuration conf.load('fwgslib reconfigure compiler_optimizations')
conf.env.GAMEDIR = 'valve'
conf.env.CLIENT_DIR = 'cl_dlls'
conf.env.SERVER_DIR = 'dlls'
conf.env.SERVER_NAME = 'hl'
conf.env.PREFIX = ''
conf.load('fwgslib reconfigure compiler_optimizations enforce_pic')
enforce_pic = True # modern defaults
conf.env.VOICEMGR = conf.options.VOICEMGR
conf.env.GOLDSRC = conf.options.GOLDSRC
# Force XP compability, all build targets should add
# subsystem=bld.env.MSVC_SUBSYSTEM
# TODO: wrapper around bld.stlib, bld.shlib and so on?
conf.env.MSVC_SUBSYSTEM = 'WINDOWS,5.01'
conf.env.MSVC_TARGETS = ['x86' if not conf.options.ALLOW64 else 'x64'] conf.env.MSVC_TARGETS = ['x86' if not conf.options.ALLOW64 else 'x64']
# Force XP compatibility, all build targets should add subsystem=bld.env.MSVC_SUBSYSTEM
if conf.env.MSVC_TARGETS[0] == 'x86':
conf.env.MSVC_SUBSYSTEM = 'WINDOWS,5.01'
else:
conf.env.MSVC_SUBSYSTEM = 'WINDOWS'
# Load compilers early # Load compilers early
conf.load('xcompile compiler_c compiler_cxx') conf.load('xcompile compiler_c compiler_cxx')
@ -71,108 +55,138 @@ def configure(conf):
if conf.env.COMPILER_CC == 'msvc': if conf.env.COMPILER_CC == 'msvc':
conf.load('msvc_pdb') conf.load('msvc_pdb')
conf.load('msvs msdev strip_on_install') conf.load('msvs msdev subproject clang_compilation_database strip_on_install enforce_pic')
if conf.env.DEST_OS == 'android':
conf.options.GOLDSRC = conf.env.GOLDSRC = False
conf.env.SERVER_NAME = 'server' # can't be any other name, until specified
elif conf.env.DEST_OS in ['nswitch', 'psvita']:
conf.options.GOLDSRC = conf.env.GOLDSRC = False
if conf.env.MAGX:
enforce_pic = False
enforce_pic = True # modern defaults
conf.check_pic(enforce_pic) conf.check_pic(enforce_pic)
# We restrict 64-bit builds ONLY for Win/Linux/OSX running on Intel architecture # We restrict 64-bit builds ONLY for Win/Linux/OSX running on Intel architecture
# Because compatibility with original GoldSrc # Because compatibility with original GoldSrc
if conf.env.DEST_OS in ['win32', 'linux', 'darwin'] and conf.env.DEST_CPU in ['x86_64']: if conf.env.DEST_OS in ['win32', 'linux', 'darwin'] and conf.env.DEST_CPU == 'x86_64':
conf.env.BIT32_ALLOW64 = conf.options.ALLOW64 conf.env.BIT32_MANDATORY = not conf.options.ALLOW64
if not conf.env.BIT32_ALLOW64: if conf.env.BIT32_MANDATORY:
Logs.info('WARNING: will build engine for 32-bit target') Logs.info('WARNING: will build game for 32-bit target')
else: else:
conf.env.BIT32_ALLOW64 = True conf.env.BIT32_MANDATORY = False
conf.env.BIT32_MANDATORY = not conf.env.BIT32_ALLOW64
conf.load('force_32bit library_naming')
compiler_optional_flags = [ conf.load('force_32bit')
'-fdiagnostics-color=always',
'-Werror=return-type',
'-Werror=parentheses',
'-Werror=vla',
'-Werror=tautological-compare',
'-Werror=duplicated-cond',
'-Werror=bool-compare',
'-Werror=bool-operation',
'-Wstrict-aliasing',
]
c_compiler_optional_flags = [
'-Werror=implicit-function-declaration',
'-Werror=int-conversion',
'-Werror=implicit-int',
'-Werror=declaration-after-statement'
]
cflags, linkflags = conf.get_optimization_flags() cflags, linkflags = conf.get_optimization_flags()
cxxflags = list(cflags) # optimization flags are common between C and C++ but we need a copy
# Here we don't differentiate C or C++ flags # on the Switch, allow undefined symbols by default, which is needed for libsolder to work
if conf.options.LTO: # we'll specifically disallow them for the engine executable
lto_cflags = { # additionally, shared libs are linked without standard libs, we'll add those back in the engine wscript
'msvc': ['/GL'],
'gcc': ['-flto'],
'clang': ['-flto']
}
lto_linkflags = {
'msvc': ['/LTCG'],
'gcc': ['-flto'],
'clang': ['-flto']
}
cflags += conf.get_flags_by_compiler(lto_cflags, conf.env.COMPILER_CC)
linkflags += conf.get_flags_by_compiler(lto_linkflags, conf.env.COMPILER_CC)
if conf.options.POLLY:
polly_cflags = {
'gcc': ['-fgraphite-identity'],
'clang': ['-mllvm', '-polly']
# msvc sosat :(
}
cflags += conf.get_flags_by_compiler(polly_cflags, conf.env.COMPILER_CC)
# And here C++ flags starts to be treated separately
cxxflags = list(cflags)
if conf.env.COMPILER_CC != 'msvc':
conf.check_cc(cflags=cflags, msg= 'Checking for required C flags')
conf.check_cxx(cxxflags=cflags, msg= 'Checking for required C++ flags')
cflags += conf.filter_cflags(compiler_optional_flags + c_compiler_optional_flags, cflags)
cxxflags += conf.filter_cxxflags(compiler_optional_flags, cflags)
# on the Switch and the PSVita, allow undefined symbols by default,
# which is needed for the dynamic loaders to work
# additionally, shared libs are linked without libc
if conf.env.DEST_OS == 'nswitch': if conf.env.DEST_OS == 'nswitch':
linkflags.remove('-Wl,--no-undefined') linkflags.remove('-Wl,--no-undefined')
conf.env.append_unique('LINKFLAGS_cshlib', ['-nostdlib', '-nostartfiles']) conf.env.append_unique('LINKFLAGS_cshlib', ['-nostdlib', '-nostartfiles'])
conf.env.append_unique('LINKFLAGS_cxxshlib', ['-nostdlib', '-nostartfiles']) conf.env.append_unique('LINKFLAGS_cxxshlib', ['-nostdlib', '-nostartfiles'])
# same on the vita
elif conf.env.DEST_OS == 'psvita': elif conf.env.DEST_OS == 'psvita':
linkflags.remove('-Wl,--no-undefined')
conf.env.append_unique('CFLAGS_cshlib', ['-fPIC']) conf.env.append_unique('CFLAGS_cshlib', ['-fPIC'])
conf.env.append_unique('CXXFLAGS_cxxshlib', ['-fPIC', '-fno-use-cxa-atexit']) conf.env.append_unique('CXXFLAGS_cxxshlib', ['-fPIC', '-fno-use-cxa-atexit'])
conf.env.append_unique('LINKFLAGS_cshlib', ['-nostdlib', '-Wl,--unresolved-symbols=ignore-all']) conf.env.append_unique('LINKFLAGS_cshlib', ['-nostdlib', '-Wl,--unresolved-symbols=ignore-all'])
conf.env.append_unique('LINKFLAGS_cxxshlib', ['-nostdlib', '-Wl,--unresolved-symbols=ignore-all']) conf.env.append_unique('LINKFLAGS_cxxshlib', ['-nostdlib', '-Wl,--unresolved-symbols=ignore-all'])
# check if we need to use irix linkflags
elif conf.env.DEST_OS == 'irix' and conf.env.COMPILER_CC == 'gcc':
linkflags.remove('-Wl,--no-undefined')
linkflags.append('-Wl,--unresolved-symbols=ignore-all')
# check if we're in a sgug environment
if 'sgug' in os.environ['LD_LIBRARYN32_PATH']:
linkflags.append('-lc')
conf.check_cc(cflags=cflags, linkflags=linkflags, msg='Checking for required C flags')
conf.check_cxx(cxxflags=cxxflags, linkflags=linkflags, msg='Checking for required C++ flags')
conf.env.append_unique('CFLAGS', cflags) conf.env.append_unique('CFLAGS', cflags)
conf.env.append_unique('CXXFLAGS', cxxflags) conf.env.append_unique('CXXFLAGS', cxxflags)
conf.env.append_unique('LINKFLAGS', linkflags) conf.env.append_unique('LINKFLAGS', linkflags)
if conf.env.COMPILER_CC != 'msvc' and not conf.options.DISABLE_WERROR:
opt_flags = [
# '-Wall', '-Wextra', '-Wpedantic',
'-fdiagnostics-color=always',
# stable diagnostics, forced to error, sorted
'-Werror=bool-compare',
'-Werror=bool-operation',
'-Werror=cast-align=strict',
'-Werror=duplicated-cond',
# '-Werror=format=2',
'-Werror=implicit-fallthrough=2',
# '-Werror=logical-op',
'-Werror=packed',
'-Werror=packed-not-aligned',
'-Werror=parentheses',
'-Werror=return-type',
'-Werror=sequence-point',
'-Werror=sizeof-pointer-memaccess',
'-Werror=sizeof-array-div',
'-Werror=sizeof-pointer-div',
# '-Werror=strict-aliasing',
'-Werror=string-compare',
'-Werror=tautological-compare',
'-Werror=use-after-free=3',
'-Werror=vla',
'-Werror=write-strings',
# unstable diagnostics, may cause false positives
'-Winit-self',
'-Wmisleading-indentation',
'-Wunintialized',
# disabled, flood
# '-Wdouble-promotion',
]
opt_cflags = [
'-Werror=declaration-after-statement',
'-Werror=enum-conversion',
'-Werror=implicit-int',
'-Werror=implicit-function-declaration',
'-Werror=incompatible-pointer-types',
'-Werror=int-conversion',
'-Werror=jump-misses-init',
# '-Werror=old-style-declaration',
# '-Werror=old-style-definition',
# '-Werror=strict-prototypes',
'-fnonconst-initializers' # owcc
]
opt_cxxflags = [] # TODO:
cflags = conf.filter_cflags(opt_flags + opt_cflags, cflags)
cxxflags = conf.filter_cxxflags(opt_flags + opt_cxxflags, cxxflags)
conf.env.append_unique('CFLAGS', cflags)
conf.env.append_unique('CXXFLAGS', cxxflags)
if conf.env.DEST_OS == 'android':
# LIB_M added in xcompile!
pass
elif conf.env.DEST_OS == 'win32':
a = [ 'user32', 'winmm' ]
if conf.env.COMPILER_CC == 'msvc':
for i in a:
conf.start_msg('Checking for MSVC library')
conf.check_lib_msvc(i)
conf.end_msg(i)
else:
for i in a:
conf.check_cc(lib = i)
else:
if conf.env.GOLDSOURCE_SUPPORT:
conf.check_cc(lib='dl')
conf.check_cc(lib='m')
# check if we can use C99 tgmath # check if we can use C99 tgmath
if conf.check_cc(header_name='tgmath.h', mandatory=False): if conf.check_cc(header_name='tgmath.h', mandatory=False):
if conf.env.COMPILER_CC == 'msvc':
conf.define('_CRT_SILENCE_NONCONFORMING_TGMATH_H', 1)
tgmath_usable = conf.check_cc(fragment='''#include<tgmath.h> tgmath_usable = conf.check_cc(fragment='''#include<tgmath.h>
int main(void){ return (int)sin(2.0f); }''', const float val = 2, val2 = 3;
msg='Checking if tgmath.h is usable', mandatory=False) int main(void){ return (int)(-asin(val) + cos(val2)); }''',
msg='Checking if tgmath.h is usable', mandatory=False, use='M')
conf.define_cond('HAVE_TGMATH_H', tgmath_usable) conf.define_cond('HAVE_TGMATH_H', tgmath_usable)
else: else:
conf.undefine('HAVE_TGMATH_H') conf.undefine('HAVE_TGMATH_H')
@ -187,29 +201,56 @@ def configure(conf):
elif conf.env.COMPILER_CC == 'owcc': elif conf.env.COMPILER_CC == 'owcc':
pass pass
else: else:
conf.env.append_unique('DEFINES', ['stricmp=strcasecmp', 'strnicmp=strncasecmp', '_snprintf=snprintf', '_vsnprintf=vsnprintf', '_LINUX', 'LINUX']) conf.env.append_unique('CXXFLAGS', ['-Wno-invalid-offsetof', '-fno-exceptions'])
conf.env.append_unique('CXXFLAGS', ['-Wno-invalid-offsetof', '-fno-rtti', '-fno-exceptions']) conf.define('stricmp', 'strcasecmp', quote=False)
conf.define('strnicmp', 'strncasecmp', quote=False)
conf.define('_snprintf', 'snprintf', quote=False)
conf.define('_vsnprintf', 'vsnprintf', quote=False)
conf.define('_LINUX', True)
conf.define('LINUX', True)
conf.msg(msg='-> processing mod options', result='...', color='BLUE')
regex = re.compile('^([A-Za-z0-9_]+)=([A-Za-z0-9_]+)\ \#\ (.*)$')
with open(str(conf.path.make_node('mod_options.txt'))) as fd:
lines = fd.readlines()
for line in lines:
m = regex.match(line.strip())
if m:
p = m.groups()
conf.start_msg("* " + p[2])
if p[1] == 'ON':
conf.env[p[0]] = True
conf.define(p[0], 1)
elif p[1] == 'OFF':
conf.env[p[0]] = False
conf.undefine(p[0])
else:
conf.env[p[0]] = p[1]
conf.end_msg(p[1])
if conf.env.HLDEMO_BUILD and conf.env.OEM_BUILD:
conf.fatal('Don\'t mix Demo and OEM builds!')
# force to use server library name
if conf.env.DEST_OS == 'android':
conf.env.SERVER_LIBRARY_NAME = 'server' # can't be any other name, until specified
# strip lib from pattern # strip lib from pattern
if conf.env.DEST_OS not in ['android']: if conf.env.DEST_OS not in ['android']:
if conf.env.cshlib_PATTERN.startswith('lib'):
conf.env.cshlib_PATTERN = conf.env.cshlib_PATTERN[3:]
if conf.env.cxxshlib_PATTERN.startswith('lib'): if conf.env.cxxshlib_PATTERN.startswith('lib'):
conf.env.cxxshlib_PATTERN = conf.env.cxxshlib_PATTERN[3:] conf.env.cxxshlib_PATTERN = conf.env.cxxshlib_PATTERN[3:]
conf.define('BARNACLE_FIX_VISIBILITY', False) conf.load('library_naming')
conf.define('CLIENT_WEAPONS', True) conf.add_subproject('dlls')
conf.define('CROWBAR_IDLE_ANIM', False) conf.add_subproject('cl_dll')
conf.define('CROWBAR_DELAY_FIX', False)
conf.define('CROWBAR_FIX_RAPID_CROWBAR', False)
conf.define('GAUSS_OVERCHARGE_FIX', False)
conf.define('OEM_BUILD', False)
conf.define('HLDEMO_BUILD', False)
conf.add_subproject(["cl_dll", "dlls"])
def build(bld): def build(bld):
bld.add_subproject(["cl_dll", "dlls"]) if bld.is_install and not bld.options.destdir:
bld.fatal('Set the install destination directory using --destdir option')
# don't clean QtCreator files and reconfigure saved options
bld.clean_files = bld.bldnode.ant_glob('**',
excl='*.user configuration.py .lock* *conf_check_*/** config.log %s/*' % Build.CACHE_DIR,
quiet=True, generator=True)
bld.add_subproject('dlls')
bld.add_subproject('cl_dll')